function maintainExecuteObject()
 {
     if (isset($_POST["maintain"])) {
         $this->session["maintain"] = ilUtil::stripSlashes($_POST["maintain"]);
     }
     switch ($_POST["maintain"]) {
         // save the local changes to the local language file
         case "save":
             $lang_file = $this->object->getCustLangPath() . '/ilias_' . $this->object->key . '.lang.local';
             if (is_file($lang_file) and is_writable($lang_file) or !file_exists($lang_file) and is_writable($this->object->getCustLangPath())) {
                 // save a copy of the distributed language file
                 $orig_file = $this->object->getLangPath() . '/ilias_' . $this->object->key . '.lang';
                 $copy_file = $this->object->getCustLangPath() . '/ilias_' . $this->object->key . '.lang';
                 @copy($orig_file, $copy_file);
                 // save a backup of the old local language file
                 @rename($lang_file, $lang_file . ".bak");
                 // create and write the new local language file
                 $global_file_obj = $this->object->getGlobalLanguageFile();
                 $local_file_obj = new ilLanguageFile($lang_file, $this->object->key, 'local');
                 $local_file_obj->setParam('based_on', $global_file_obj->getParam('version'));
                 $local_file_obj->setAllValues($this->object->getChangedValues());
                 if ($this->langmode) {
                     $local_file_obj->setAllComments($this->object->getAllRemarks());
                 }
                 $local_file_obj->write();
                 $this->object->setLocal(true);
                 ilUtil::sendSuccess($this->lng->txt("language_saved_local"), true);
             } else {
                 ilUtil::sendFailure($this->lng->txt("language_error_write_local"), true);
             }
             break;
             // load the content of the local language file
         // load the content of the local language file
         case "load":
             $lang_file = $this->object->getCustLangPath() . '/ilias_' . $this->object->key . '.lang.local';
             if (is_file($lang_file) and is_readable($lang_file)) {
                 $this->object->importLanguageFile($lang_file, 'replace');
                 $this->object->setLocal(true);
                 ilUtil::sendSuccess($this->lng->txt("language_loaded_local"), true);
             } else {
                 ilUtil::sendFailure($this->lng->txt("language_error_read_local"), true);
             }
             break;
             // revert the database to the default language file
         // revert the database to the default language file
         case "clear":
             $lang_file = $this->object->getLangPath() . '/ilias_' . $this->object->key . '.lang';
             if (is_file($lang_file) and is_readable($lang_file)) {
                 $this->object->importLanguageFile($lang_file, 'delete');
                 $this->object->setLocal(false);
                 ilUtil::sendSuccess($this->lng->txt("language_cleared_local"), true);
             } else {
                 ilUtil::sendFailure($this->lng->txt("language_error_clear_local"), true);
             }
             break;
             // delete local additions in the datavase (langmode only)
         // delete local additions in the datavase (langmode only)
         case "delete_added":
             ilObjLanguageExt::_deleteValues($this->object->key, $this->object->getAddedValues());
             break;
             // merge local changes back to the global language file (langmode only)
         // merge local changes back to the global language file (langmode only)
         case "merge":
             $orig_file = $this->object->getLangPath() . '/ilias_' . $this->object->key . '.lang';
             $copy_file = $this->object->getCustLangPath() . '/ilias_' . $this->object->key . '.lang';
             if (is_file($orig_file) and is_writable($orig_file)) {
                 // save a copy of the global language file
                 @copy($orig_file, $copy_file);
                 // modify and write the new global file
                 $global_file_obj = $this->object->getGlobalLanguageFile();
                 $global_file_obj->setAllValues($this->object->getMergedValues());
                 $global_file_obj->setAllComments($this->object->getMergedRemarks());
                 $global_file_obj->write();
                 ilUtil::sendSuccess($this->lng->txt("language_merged_global"), true);
             } else {
                 ilUtil::sendFailure($this->lng->txt("language_error_write_global"), true);
             }
             break;
             // remove the local language file (langmode only)
         // remove the local language file (langmode only)
         case "remove_local_file":
             $lang_file = $this->object->getCustLangPath() . '/ilias_' . $this->object->key . '.lang.local';
             if (!is_file($lang_file)) {
                 $this->object->setLocal(false);
                 ilUtil::sendFailure($this->lng->txt("language_error_local_missed"), true);
             } elseif (@unlink($lang_file)) {
                 $this->object->setLocal(false);
                 ilUtil::sendSuccess($this->lng->txt("language_local_file_deleted"), true);
             } else {
                 ilUtil::sendFailure($this->lng->txt("language_error_delete_local"), true);
             }
             break;
     }
     $this->ctrl->redirect($this, "maintain");
 }
 /**
  * Save a set of translation in the database
  *
  * @access   static
  * @param    string      language key
  * @param    array       module.separator.topic => value
  * @param    array       module.separator.topic => remarks
  */
 public static function _saveValues($a_lang_key, $a_values = array(), $a_remarks = array())
 {
     global $ilDB, $lng;
     if (!is_array($a_values)) {
         return;
     }
     $save_array = array();
     $save_date = date("Y-m-d H:i:s", time());
     // read and get the global values
     require_once "./Services/Language/classes/class.ilLanguageFile.php";
     $global_file_obj = ilLanguageFile::_getGlobalLanguageFile($a_lang_key);
     $global_values = $global_file_obj->getAllValues();
     $global_comments = $global_file_obj->getAllComments();
     // save the single translations in lng_data
     foreach ($a_values as $key => $value) {
         $keys = explode($lng->separator, $key);
         if (count($keys) == 2) {
             $module = $keys[0];
             $topic = $keys[1];
             $save_array[$module][$topic] = $value;
             if ($global_values[$key] != $value or $global_comments[$key] != $a_remarks[$key]) {
                 $local_change = $save_date;
             } else {
                 $local_change = null;
             }
             ilObjLanguage::replaceLangEntry($module, $topic, $a_lang_key, $value, $local_change, $a_remarks[$key]);
         }
     }
     // save the serialized module entries in lng_modules
     foreach ($save_array as $module => $entries) {
         $set = $ilDB->query(sprintf("SELECT * FROM lng_modules " . "WHERE lang_key = %s AND module = %s", $ilDB->quote($a_lang_key, "text"), $ilDB->quote($module, "text")));
         $row = $ilDB->fetchAssoc($set);
         $arr = unserialize($row["lang_array"]);
         if (is_array($arr)) {
             $entries = array_merge($arr, $entries);
         }
         ilObjLanguage::replaceLangModule($a_lang_key, $module, $entries);
     }
 }
 /**
  * Process the language maintenance
  */
 function maintainObject()
 {
     global $ilUser;
     switch ($_POST["maintain"]) {
         // save the local changes to the local language file
         case "save":
             $lang_file = $this->object->getCustLangPath() . '/ilias_' . $this->object->key . '.lang.local';
             if (is_file($lang_file) and is_writable($lang_file) or !file_exists($lang_file) and is_writable($this->object->getCustLangPath())) {
                 // save a copy of the distributed language file
                 $orig_file = $this->object->getLangPath() . '/ilias_' . $this->object->key . '.lang';
                 $copy_file = $this->object->getCustLangPath() . '/ilias_' . $this->object->key . '.lang';
                 @copy($orig_file, $copy_file);
                 // save a backup of the old local language file
                 @rename($lang_file, $lang_file . ".bak");
                 // create and write the new local language file
                 $global_file_obj = $this->object->getGlobalLanguageFile();
                 $local_file_obj = new ilLanguageFile($lang_file, $this->object->key, 'local');
                 $local_file_obj->setParam('based_on', $global_file_obj->getParam('version'));
                 $local_file_obj->setAllValues($this->object->getChangedValues());
                 if ($this->langmode) {
                     $local_file_obj->setAllComments($this->object->getAllRemarks());
                 }
                 $local_file_obj->write();
                 $this->object->setLocal(true);
                 ilUtil::sendSuccess($this->lng->txt("language_saved_local"), false);
             } else {
                 ilUtil::sendFailure($this->lng->txt("language_error_write_local"), false);
             }
             break;
             // load the content of the local language file
         // load the content of the local language file
         case "load":
             $lang_file = $this->object->getCustLangPath() . '/ilias_' . $this->object->key . '.lang.local';
             if (is_file($lang_file) and is_readable($lang_file)) {
                 $this->object->importLanguageFile($lang_file, 'replace');
                 $this->object->setLocal(true);
                 ilUtil::sendSuccess($this->lng->txt("language_loaded_local"), false);
             } else {
                 ilUtil::sendFailure($this->lng->txt("language_error_read_local"), false);
             }
             break;
             // revert the database to the default language file
         // revert the database to the default language file
         case "clear":
             $lang_file = $this->object->getLangPath() . '/ilias_' . $this->object->key . '.lang';
             if (is_file($lang_file) and is_readable($lang_file)) {
                 $this->object->importLanguageFile($lang_file, 'delete');
                 $this->object->setLocal(false);
                 ilUtil::sendSuccess($this->lng->txt("language_cleared_local"), false);
             } else {
                 ilUtil::sendFailure($this->lng->txt("language_error_clear_local"), false);
             }
             break;
             // delete local additions in the datavase (langmode only)
         // delete local additions in the datavase (langmode only)
         case "delete_added":
             ilObjLanguageExt::_deleteValues($this->object->key, $this->object->getAddedValues());
             break;
             // merge local changes back to the global language file (langmode only)
         // merge local changes back to the global language file (langmode only)
         case "merge":
             $orig_file = $this->object->getLangPath() . '/ilias_' . $this->object->key . '.lang';
             $copy_file = $this->object->getCustLangPath() . '/ilias_' . $this->object->key . '.lang';
             if (is_file($orig_file) and is_writable($orig_file)) {
                 // save a copy of the global language file
                 @copy($orig_file, $copy_file);
                 // modify and write the new global file
                 $global_file_obj = $this->object->getGlobalLanguageFile();
                 $global_file_obj->setAllValues($this->object->getMergedValues());
                 $global_file_obj->setAllComments($this->object->getMergedRemarks());
                 $global_file_obj->write();
                 ilUtil::sendSuccess($this->lng->txt("language_merged_global"), false);
             } else {
                 ilUtil::sendFailure($this->lng->txt("language_error_write_global"), false);
             }
             break;
             // remove the local language file (langmode only)
         // remove the local language file (langmode only)
         case "remove_local_file":
             $lang_file = $this->object->getCustLangPath() . '/ilias_' . $this->object->key . '.lang.local';
             if (!is_file($lang_file)) {
                 $this->object->setLocal(false);
                 ilUtil::sendFailure($this->lng->txt("language_error_local_missed"), false);
             } elseif (@unlink($lang_file)) {
                 $this->object->setLocal(false);
                 ilUtil::sendSuccess($this->lng->txt("language_local_file_deleted"), false);
             } else {
                 ilUtil::sendFailure($this->lng->txt("language_error_delete_local"), false);
             }
             break;
     }
     $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.lang_maintenance.html", "Services/Language");
     $this->tpl->setVariable("FORMACTION", $this->ctrl->getFormAction($this));
     $this->tpl->setVariable("TXT_MAINTENANCE", $this->lng->txt("language_maintenance"));
     $this->tpl->setVariable("TXT_MAINTAIN_LOCAL", $this->lng->txt("language_maintain_local_changes"));
     $this->tpl->setVariable("TXT_SELECT", $this->lng->txt("please_select"));
     $this->tpl->setVariable("TXT_SAVE", $this->lng->txt("language_save_local_changes"));
     $this->tpl->setVariable("TXT_LOAD", $this->lng->txt("language_load_local_changes"));
     $this->tpl->setVariable("TXT_CLEAR", $this->lng->txt("language_clear_local_changes"));
     if ($this->langmode) {
         $this->tpl->setVariable("TXT_DELETE_ADDED", $this->lng->txt("language_delete_local_additions"));
         $this->tpl->setVariable("TXT_MERGE", $this->lng->txt("language_merge_local_changes"));
         $this->tpl->setVariable("TXT_REMOVE_LOCAL_FILE", $this->lng->txt("language_remove_local_file"));
     }
     $this->tpl->setVariable("TXT_NOTE_SAVE", $this->lng->txt("language_note_save_local"));
     $this->tpl->setVariable("TXT_MAINTAIN", $this->lng->txt("language_process_maintenance"));
     $this->tpl->setVariable("VAR_MAINTAIN", "maintain");
     $this->tpl->setVariable("CMD_MAINTAIN", "maintain");
     //		$this->tpl->show();
 }
 /**
  * Read and get a global language file as a singleton object
  * @param    string      language key
  * @return   object      language file object (with contents)
  */
 public static function _getGlobalLanguageFile($a_lang_key)
 {
     global $lng;
     if (!isset(self::$global_file_objects[$a_lang_key])) {
         $file_object = new ilLanguageFile($lng->lang_path . "/ilias_" . $a_lang_key . ".lang", $a_lang_key, 'global');
         $file_object->read();
         self::$global_file_objects[$a_lang_key] = $file_object;
     }
     return self::$global_file_objects[$a_lang_key];
 }