4require_once 
"./Services/Object/classes/class.ilObject.php";
 
   40    public function __construct($a_id = 0, $a_call_by_reference = 
false)
 
   46        parent::__construct($a_id, $a_call_by_reference);
 
   51        $this->lang_default = 
$lng->lang_default;
 
   52        $this->lang_user = 
$lng->lang_user;
 
   53        $this->lang_path = 
$lng->lang_path;
 
   54        $this->cust_lang_path = 
$lng->cust_lang_path;
 
   55        $this->separator = 
$lng->separator;
 
   56        $this->comment_separator = 
$lng->comment_separator;
 
   70            if ($langObj->isInstalled()) {
 
   71                $objects[] = $langObj;
 
  105        if ($this->key == $this->lang_default) {
 
  117        if ($this->key == $this->lang_user) {
 
  132        if (substr($this->
getStatus(), 0, 9) == 
"installed") {
 
  147        if (substr($this->
getStatus(), 10) == 
"local") {
 
  162        if (!empty($scope)) {
 
  163            if ($scope == 
'global') {
 
  166                $scopeExtension = 
'.' . $scope;
 
  172            if ($this->
check($scope)) {
 
  175                    $this->
flush(
'keep_local');
 
  183                    $newDesc = 
'installed';
 
  184                } elseif ($scope == 
'local') {
 
  185                    $newDesc = 
'installed_local';
 
  203        if ((substr($this->status, 0, 9) == 
"installed") && ($this->key != $this->lang_default) && ($this->key != $this->lang_user)) {
 
  223            if ($this->
check()) {
 
  224                $this->
flush(
'keep_local');
 
  230                if ($this->
isLocal() == 
true) {
 
  231                    if ($this->
check(
'local')) {
 
  250        $refreshed = array();
 
  254            if ($langObj->refresh()) {
 
  255                $refreshed[] = $langObj->getKey();
 
  271        $ilPluginAdmin = 
$DIC[
'ilPluginAdmin'];
 
  274        include_once(
"./Services/Component/classes/class.ilPluginSlot.php");
 
  276        foreach ($slots as $slot) {
 
  277            $act_plugins = $ilPluginAdmin->getActivePluginsForSlot(
 
  278                $slot[
"component_type"],
 
  279                $slot[
"component_name"],
 
  282            foreach ($act_plugins as $plugin) {
 
  283                include_once(
"./Services/Component/classes/class.ilPlugin.php");
 
  285                    $slot[
"component_type"],
 
  286                    $slot[
"component_name"],
 
  290                if (is_object($pl)) {
 
  291                    $pl->updateLanguages($a_lang_keys);
 
  308        if (!$a_keep_local_change) {
 
  309            $ilDB->manipulate(
"DELETE FROM lng_data WHERE lang_key = " .
 
  310                $ilDB->quote($a_lang_key, 
"text"));
 
  312            $ilDB->manipulate(
"DELETE FROM lng_data WHERE lang_key = " .
 
  313                $ilDB->quote($a_lang_key, 
"text") .
 
  314                " AND local_change IS NULL");
 
  322    public function flush($a_mode = 
'all')
 
  329        if ($a_mode == 
'all') {
 
  330            $ilDB->manipulate(
"DELETE FROM lng_modules WHERE lang_key = " .
 
  331                $ilDB->quote($this->key, 
"text"));
 
  347        if ($a_min_date == 
"") {
 
  348            $a_min_date = 
"1980-01-01 00:00:00";
 
  350        if ($a_max_date == 
"") {
 
  351            $a_max_date = 
"2200-01-01 00:00:00";
 
  355            "SELECT * FROM lng_data WHERE lang_key = %s " .
 
  356            "AND local_change >= %s AND local_change <= %s",
 
  357            $ilDB->quote($this->key, 
"text"),
 
  358            $ilDB->quote($a_min_date, 
"timestamp"),
 
  359            $ilDB->quote($a_max_date, 
"timestamp")
 
  365            $changes[
$row[
"module"]][
$row[
"identifier"]] = 
$row[
"value"];
 
  382            "SELECT MAX(local_change) last_change FROM lng_data " .
 
  383                    "WHERE lang_key = %s AND local_change IS NOT NULL",
 
  384            $ilDB->quote($a_key, 
"text")
 
  389            return $row[
'last_change'];
 
  409            "SELECT * FROM lng_data WHERE lang_key = %s AND module = %s AND local_change IS NOT NULL",
 
  410            array(
'text', 
'text'),
 
  411            array($a_key, $a_module)
 
  415            $changes[
$row[
'identifier']] = 
$row[
'value'];
 
  431        if (!empty($scope)) {
 
  432            if ($scope == 
'global') {
 
  435                $scopeExtension = 
'.' . $scope;
 
  440        if ($scope == 
"local") {
 
  441            $path = $this->cust_lang_path;
 
  444        $lang_file = 
$path . 
"/ilias_" . $this->key . 
".lang" . $scopeExtension;
 
  446        if (is_file($lang_file)) {
 
  448            $lang_array = array();
 
  449            $lang_array[
"common"] = array();
 
  452            if ($content = $this->
cut_header(file($lang_file))) {
 
  458                } elseif ($scope == 
'local') {
 
  462                    $change_date = date(
"Y-m-d H:i:s", time());
 
  463                    $min_date = date(
"Y-m-d H:i:s", filemtime($lang_file));
 
  467                foreach ($content as 
$key => $val) {
 
  473                    $separated = explode($this->separator, trim($val));
 
  474                    $pos = strpos($separated[2], $this->comment_separator);
 
  475                    if ($pos !== 
false) {
 
  476                        $separated[3] = substr($separated[2], $pos + strlen($this->comment_separator));
 
  477                        $separated[2] = substr($separated[2], 0, $pos);
 
  481                    $local_value = $local_changes[$separated[0]][$separated[1]];
 
  486                        if ($local_value != 
"" and $local_value != $separated[2]) {
 
  488                            $lang_array[$separated[0]][$separated[1]] = $local_value;
 
  491                            if ($double_checker[$separated[0]][$separated[1]][$this->key]) {
 
  492                                $this->
ilias->raiseError(
 
  493                                    "Duplicate Language Entry in $lang_file:\n$val",
 
  494                                    $this->
ilias->error_obj->MESSAGE
 
  497                            $double_checker[$separated[0]][$separated[1]][
$this->key] = 
true;
 
  510                            $lang_array[$separated[0]][$separated[1]] = $separated[2];
 
  512                    } elseif ($scope == 
'local') {
 
  515                        if ($local_value != 
"") {
 
  517                            $lang_array[$separated[0]][$separated[1]] = $local_value;
 
  531                            $lang_array[$separated[0]][$separated[1]] = $separated[2];
 
  539                } elseif ($scope == 
'local') {
 
  540                    $ld = 
"installed_local";
 
  543                    $query = 
"UPDATE object_data SET " .
 
  544                            "description = " . 
$ilDB->quote(
$ld, 
"text") . 
", " .
 
  545                            "last_update = " . 
$ilDB->now() . 
" " .
 
  546                            "WHERE title = " . 
$ilDB->quote($this->key, 
"text") . 
" " .
 
  552            foreach ($lang_array as 
$module => $lang_arr) {
 
  553                if ($scope == 
"local") {
 
  554                    $q = 
"SELECT * FROM lng_modules WHERE " .
 
  555                        " lang_key = " . 
$ilDB->quote($this->key, 
"text") .
 
  557                    $set = 
$ilDB->query($q);
 
  559                    $arr2 = unserialize(
$row[
"lang_array"]);
 
  560                    if (is_array($arr2)) {
 
  561                        $lang_arr = array_merge($arr2, $lang_arr);
 
  564                ilObjLanguage::replaceLangModule($this->key, 
$module, $lang_arr);
 
  572    final public static function replaceLangModule($a_key, $a_module, $a_array)
 
  580        $ilDB->manipulate(sprintf(
 
  581            "DELETE FROM lng_modules WHERE lang_key = %s AND module = %s",
 
  582            $ilDB->quote($a_key, 
"text"),
 
  583            $ilDB->quote($a_module, 
"text")
 
  590        $ilDB->insert(
"lng_modules", array(
 
  591            "lang_key" => array(
"text", $a_key),
 
  592            "module" => array(
"text", $a_module),
 
  593            "lang_array" => array(
"clob", serialize((array) $a_array))
 
  599            "SELECT lang_array FROM lng_modules WHERE lang_key = %s AND module = %s",
 
  600            array(
'text',
'text'),
 
  601            array($a_key, $a_module)
 
  605        $unserialied = unserialize(
$row[
'lang_array']);
 
  606        if (!is_array($unserialied)) {
 
  610                "Data for module '" . $a_module . 
"' of  language '" . $a_key . 
"' is not correctly saved. " .
 
  611                "Please check the collation of your database tables lng_data and lng_modules. It must be utf8_unicode_ci.",
 
  625        $a_local_change = 
null,
 
  634        if (isset($a_remarks)) {
 
  635            $a_remarks = substr($a_remarks, 0, 250);
 
  637        if ($a_remarks == 
'') {
 
  641        if (isset($a_value)) {
 
  642            $a_value = substr($a_value, 0, 4000);
 
  644        if ($a_value == 
'') {
 
  651                'module' => array(
'text',$a_module),
 
  652                'identifier' => array(
'text',$a_identifier),
 
  653                'lang_key' => array(
'text',$a_lang_key)
 
  656                'value' => array(
'text',$a_value),
 
  657                'local_change' => array(
'timestamp',$a_local_change),
 
  658                'remarks' => array(
'text', $a_remarks)
 
  687        $a_local_change = 
null,
 
  693        if (isset($a_remarks)) {
 
  694            $a_remarks = substr($a_remarks, 0, 250);
 
  696        if ($a_remarks == 
'') {
 
  700        if (isset($a_value)) {
 
  701            $a_value = substr($a_value, 0, 4000);
 
  703        if ($a_value == 
'') {
 
  707        $ilDB->manipulate(sprintf(
 
  709            "SET value = %s, local_change = %s, remarks = %s " .
 
  710            "WHERE module = %s AND identifier = %s AND lang_key = %s ",
 
  711            $ilDB->quote($a_value, 
"text"),
 
  712            $ilDB->quote($a_local_change, 
"timestamp"),
 
  713            $ilDB->quote($a_remarks, 
"text"),
 
  714            $ilDB->quote($a_module, 
"text"),
 
  715            $ilDB->quote($a_identifier, 
"text"),
 
  716            $ilDB->quote($a_lang_key, 
"text")
 
  729        $ilDB->manipulate(sprintf(
 
  730            "DELETE FROM lng_data " .
 
  731            "WHERE module = %s AND identifier = %s AND lang_key = %s ",
 
  732            $ilDB->quote($a_module, 
"text"),
 
  733            $ilDB->quote($a_identifier, 
"text"),
 
  734            $ilDB->quote($a_lang_key, 
"text")
 
  752        $query = 
"UPDATE usr_pref SET " .
 
  753                "value = " . 
$ilDB->quote($this->lang_default, 
"text") . 
" " .
 
  754                "WHERE keyword = " . 
$ilDB->quote(
'language', 
"text") . 
" " .
 
  755                "AND value = " . 
$ilDB->quote($lang_key, 
"text");
 
  769        foreach ($content as 
$key => $val) {
 
  770            if (trim($val) == 
"<!-- language file start -->") {
 
  771                return array_slice($content, 
$key + 1);
 
  801        include_once(
"./Services/Utilities/classes/class.ilStr.php");
 
  803        if (!empty($scope)) {
 
  804            if ($scope == 
'global') {
 
  807                $scopeExtension = 
'.' . $scope;
 
  812        if ($scope == 
"local") {
 
  813            $path = $this->cust_lang_path;
 
  819        if (!is_dir(
$path)) {
 
  820            $this->
ilias->raiseError(
"Directory not found: " . 
$path, $this->
ilias->error_obj->MESSAGE);
 
  826        $lang_file = 
"ilias_" . $this->key . 
".lang" . $scopeExtension;
 
  829        if (!is_file($lang_file)) {
 
  830            $this->
ilias->raiseError(
"File not found: " . $lang_file, $this->
ilias->error_obj->MESSAGE);
 
  834        $content = $this->
cut_header(file($lang_file));
 
  835        if ($content === 
false) {
 
  836            $this->
ilias->raiseError(
"Wrong Header in " . $lang_file, $this->
ilias->error_obj->MESSAGE);
 
  841        foreach ($content as 
$key => $val) {
 
  842            $separated = explode($this->separator, trim($val));
 
  843            $num = count($separated);
 
  847                $this->
ilias->raiseError(
"Wrong parameter count in " . $lang_file . 
" in line $line (Value: $val)! Please check your language file!", $this->
ilias->error_obj->MESSAGE);
 
  850                $this->
ilias->raiseError(
"Non UTF8 character found in " . $lang_file . 
" in line $line (Value: $val)! Please check your language file!", $this->
ilias->error_obj->MESSAGE);
 
  869        $set = 
$ilDB->query(
"SELECT COUNT(*) cnt FROM usr_data ud JOIN usr_pref up" .
 
  870            " ON ud.usr_id = up.usr_id " .
 
  871            " WHERE up.value = " . 
$ilDB->quote($a_lang, 
"text") .
 
  872            " AND up.keyword = " . 
$ilDB->quote(
"language", 
"text"));
 
  873        $rec = 
$ilDB->fetchAssoc($set);
 
  876        if ($a_lang == 
$lng->lang_default) {
 
  877            $set2 = 
$ilDB->query(
"SELECT COUNT(*) cnt FROM usr_data ud LEFT JOIN usr_pref up" .
 
  878                " ON (ud.usr_id = up.usr_id AND up.keyword = " . 
$ilDB->quote(
"language", 
"text") . 
")" .
 
  879                " WHERE up.value IS NULL ");
 
  880            $rec2 = 
$ilDB->fetchAssoc($set2);
 
  883        return (
int) $rec[
"cnt"] + (int) $rec2[
"cnt"];
 
An exception for terminatinating execution or to throw for unit testing.
static refreshPlugins($a_lang_keys=null)
static _deleteLangData($a_lang_key, $a_keep_local_change=false)
Delete languge data.
static _getLocalChangesByModule($a_key, $a_module)
Get the local changes of a language module.
static updateLangEntry( $a_module, $a_identifier, $a_lang_key, $a_value, $a_local_change=null, $a_remarks=null)
Replace lang entry.
static deleteLangEntry($a_module, $a_identifier, $a_lang_key)
Delete lang entry.
static refreshAll()
Refresh all installed languages.
isInstalled()
Check language object status, and return true if language is installed.
uninstall()
uninstall current language
getStatus()
get language status
isLocal()
Check language object status, and return true if a local language file is installed.
static getInstalledLanguages()
Get the language objects of the installed languages.
static countUsers($a_lang)
Count number of users that use a language.
resetUserLanguage($lang_key)
search ILIAS for users which have selected '$lang_key' as their prefered language and reset them to d...
install($scope='')
install current language
isSystemLanguage()
check if language is system language
isUserLanguage()
check if language is system language
flush($a_mode='all')
remove language data from database
insert($scope='')
insert language data from file into database
static cut_header($content)
remove lang-file haeder information from '$content' This function seeks for a special keyword where t...
static replaceLangEntry( $a_module, $a_identifier, $a_lang_key, $a_value, $a_local_change=null, $a_remarks=null)
Replace lang entry.
__construct($a_id=0, $a_call_by_reference=false)
Constructor.
refresh()
refresh current language
getLocalChanges($a_min_date="", $a_max_date="")
get locally changed language entries
optimizeData()
optimizes the db-table langdata
check($scope='')
Validate the logical structure of a lang file.
static _getLastLocalChange($a_key)
get the date of the last local change
Class ilObject Basic functions for all objects.
update()
update object in db
static _getObjectsByType($a_obj_type="", $a_owner="")
Get objects by type.
setTitle($a_title)
set object title
setDescription($a_desc)
set object description
static getAllSlots()
Get all plugin slots.
static getPluginObject(string $a_ctype, string $a_cname, string $a_slot_id, string $a_pname)
static isUtf8($a_str)
Check whether string is utf-8.
for($i=1; $i<=count($kw_cases_sel); $i+=1) $lang
if($modEnd===false) $module
redirection script todo: (a better solution should control the processing via a xml file)