Index: branches/5.3.x/core/install/install_toolkit.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/install/install_toolkit.php (.../install_toolkit.php) (revision 15483) +++ branches/5.3.x/core/install/install_toolkit.php (.../install_toolkit.php) (revision 15584) @@ -1,6 +1,6 @@ Application->recallObject('LanguageImportHelper'); /* @var $language_import_helper LanguageImportHelper */ - $language_import_helper->performImport($lang_file, '|0|1|2|', '', $upgrade ? LANG_SKIP_EXISTING : LANG_OVERWRITE_EXISTING); + if ( !$upgrade ) { + $language_import_helper->setOption(LanguageImportHelper::OVERWRITE_EXISTING); + } + + $language_import_helper->performImport($lang_file, '|0|1|2|', ''); } /** Index: branches/5.3.x/core/units/helpers/multilanguage_helper.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/units/helpers/multilanguage_helper.php (.../multilanguage_helper.php) (revision 15483) +++ branches/5.3.x/core/units/helpers/multilanguage_helper.php (.../multilanguage_helper.php) (revision 15584) @@ -1,6 +1,6 @@ getEditingLanguage(); + + $calculated_fields = $this->Application->getUnitOption($event->Prefix, 'CalculatedFields', Array ()); + /* @var $calculated_fields Array */ + + foreach ($calculated_fields as $special => $fields) { + foreach ($fields as $field_name => $field_expression) { + $calculated_fields[$special][$field_name] = str_replace('%5$s', $editing_language, $field_expression); + } + } + + $this->Application->setUnitOption($event->Prefix, 'CalculatedFields', $calculated_fields); + } + + /** + * Returns language, that is being edited or current language + * + * @return int + * @access public + */ + public function getEditingLanguage() + { + $language_id = $this->Application->GetVar('lang_id'); + + if ( !$language_id ) { + $language_id = $this->Application->GetVar('m_lang'); + } + + return $language_id; + } + + /** + * Determines if we're editing phrase/e-mail event on it's source language + * + * @param int $source_language + * @return bool + * @access public + */ + public function editingInSourceLanguage($source_language) + { + return $this->getSourceLanguage($source_language) == $this->getEditingLanguage(); + } + + /** + * Replaces source language in given label translation + * + * @param kDBItem $object + * @param string $label + * @return string + * @access public + */ + public function replaceSourceLanguage(kDBItem $object, $label) + { + $ret = $this->Application->Phrase($label); + $options = $object->GetFieldOption('TranslateFromLanguage', 'options'); + $source_language = $this->getSourceLanguage($object->GetDBField('TranslateFromLanguage')); + + return sprintf($ret, $options[$source_language]); + } + + /** + * Ensures, that primary language is used, when no translation is needed + * + * @param int $source_language + * @return bool + * @access public + */ + public function getSourceLanguage($source_language) + { + if ( !$source_language ) { + $source_language = $this->Application->GetDefaultLanguageId(); + } + + return $source_language; + } + + /** + * Translation synchronization state management + * + * @param kEvent $event + * @return void + * @access public + * @throws InvalidArgumentException + */ + public function updateTranslationState(kEvent $event) + { + if ( $event->Name != 'OnBeforeCopyToLive' ) { + throw new InvalidArgumentException('Unsupported "' . (string)$event . '" event'); + } + + $object = $event->getObject(Array ('skip_autoload' => true)); + /* @var $object kDBItem */ + + $object->SwitchToTemp(); + $object->Load($event->getEventParam('id')); + + $save_mode = $this->Application->GetVar('translation_save_mode'); + + if ( $save_mode === false ) { + return; + } + + $editing_language = $this->getEditingLanguage(); + + if ( $save_mode == TranslationSaveMode::SYNC_WITH_PRIMARY ) { + $object->SetDBField('l' . $editing_language . '_TranslateFrom', 0); + } + else { + $languages = $this->getLanguages(); + + foreach ($languages as $language_id) { + $object->SetDBField('l' . $language_id . '_TranslateFrom', $language_id == $editing_language ? 0 : $editing_language); + } + } + + if ( $object->GetChangedFields() ) { + $object->Update(); + } + } } Index: branches/5.3.x/core/admin_templates/regional/languages_import.tpl =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/admin_templates/regional/languages_import.tpl (.../languages_import.tpl) (revision 15483) +++ branches/5.3.x/core/admin_templates/regional/languages_import.tpl (.../languages_import.tpl) (revision 15584) @@ -36,7 +36,8 @@ - + + Index: branches/5.3.x/core/install/upgrades.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/install/upgrades.php (.../upgrades.php) (revision 15483) +++ branches/5.3.x/core/install/upgrades.php (.../upgrades.php) (revision 15584) @@ -1,6 +1,6 @@ Conn->Query('ALTER TABLE ' . $table_name . ' DROP RunInterval'); } + + /** + * Update to 5.3.0-B1 + * + * @param string $mode when called mode {before, after) + */ + public function Upgrade_5_3_0_B1($mode) + { + if ( $mode != 'before' ) { + return; + } + + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + // add new ml columns to phrases/e-mail events + $ml_helper->createFields('phrases'); + $ml_helper->createFields('emailevents'); + } } \ No newline at end of file Index: branches/5.3.x/core/units/phrases/phrases_event_handler.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/units/phrases/phrases_event_handler.php (.../phrases_event_handler.php) (revision 15483) +++ branches/5.3.x/core/units/phrases/phrases_event_handler.php (.../phrases_event_handler.php) (revision 15584) @@ -1,6 +1,6 @@ getTranslationFields(); $changed_fields = array_keys( $object->GetChangedFields() ); - $translation_fields = Array ('Translation', 'HintTranslation', 'ColumnTranslation'); foreach ($changed_fields as $changed_field) { $changed_field = preg_replace('/^l[\d]+_/', '', $changed_field); @@ -396,6 +396,42 @@ } /** + * Returns fields, that can be translated + * + * @return Array + * @access protected + */ + protected function getTranslationFields() + { + return Array ('Translation', 'HintTranslation', 'ColumnTranslation'); + } + + /** + * Put correct translation to source language fields + * + * @param kEvent $event + * @return void + * @access protected + */ + protected function OnAfterItemLoad(kEvent $event) + { + parent::OnAfterItemLoad($event); + + $object = $event->getObject(); + /* @var $object kDBItem */ + + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + $translation_fields = $this->getTranslationFields(); + $source_language = $ml_helper->getSourceLanguage($object->GetDBField('TranslateFromLanguage')); + + foreach ($translation_fields as $translation_field) { + $object->SetDBField('Source' . $translation_field, $object->GetDBField('l' . $source_language . '_' . $translation_field)); + } + } + + /** * Changes default module to custom (when available) * * @param kEvent $event @@ -406,32 +442,18 @@ { parent::OnAfterConfigRead($event); - if ($this->Application->findModule('Name', 'Custom')) { + if ( $this->Application->findModule('Name', 'Custom') ) { $fields = $this->Application->getUnitOption($event->Prefix, 'Fields'); $fields['Module']['default'] = 'Custom'; $this->Application->setUnitOption($event->Prefix, 'Fields', $fields); } - // make sure, that PrimaryTranslation column always refrers to primary language column - $language_id = $this->Application->GetVar('lang_id'); + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ - if (!$language_id) { - $language_id = $this->Application->GetVar('m_lang'); - } + $ml_helper->replaceMLCalculatedFields($event); - $primary_language_id = $this->Application->GetDefaultLanguageId(); - $calculated_fields = $this->Application->getUnitOption($event->Prefix, 'CalculatedFields'); - - foreach ($calculated_fields[''] as $field_name => $field_expression) { - $field_expression = str_replace('%5$s', $language_id, $field_expression); - $field_expression = str_replace('%4$s', $primary_language_id, $field_expression); - - $calculated_fields[''][$field_name] = $field_expression; - } - - $this->Application->setUnitOption($event->Prefix, 'CalculatedFields', $calculated_fields); - - if ($this->Application->GetVar('regional')) { + if ( $this->Application->GetVar('regional') ) { $this->Application->setUnitOption($event->Prefix, 'PopulateMlFields', true); } } @@ -517,4 +539,21 @@ ) ); } + + /** + * Updates translation state for all saved phrases + * + * @param kEvent $event + * @return void + * @access protected + */ + protected function OnBeforeCopyToLive(kEvent $event) + { + parent::OnBeforeCopyToLive($event); + + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + $ml_helper->updateTranslationState($event); + } } \ No newline at end of file Index: branches/5.3.x/core/units/helpers/language_import_helper.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/units/helpers/language_import_helper.php (.../language_import_helper.php) (revision 15483) +++ branches/5.3.x/core/units/helpers/language_import_helper.php (.../language_import_helper.php) (revision 15584) @@ -1,6 +1,6 @@ _importOptions & $option_bit) == $option_bit; + } + + /** + * Sets import option + * + * @param int $option_bit + * @param bool $enabled + * @return void + * @access public + */ + public function setOption($option_bit, $enabled = true) + { + if ( $enabled ) { + $this->_importOptions |= $option_bit; + } + else { + $this->_importOptions = $this->_importOptions & ~$option_bit; + } + } + + /** * Performs import of given language pack (former Parse method) * * @param string $filename * @param string $phrase_types * @param Array $module_ids - * @param int $import_mode * @return bool */ - function performImport($filename, $phrase_types, $module_ids, $import_mode = LANG_SKIP_EXISTING) + function performImport($filename, $phrase_types, $module_ids) { // define the XML parsing routines/functions to call based on the handler path if (!file_exists($filename) || !$phrase_types /*|| !$module_ids*/) { @@ -184,14 +220,13 @@ // $module_ids = explode('|', substr($module_ids, 1, -1) ); $this->phrase_types_allowed = array_flip($phrase_types); - $this->import_mode = $import_mode; $this->_parseXML($filename); // copy data from temp tables to live foreach ($this->_languages as $language_id) { - $this->_performUpgrade($language_id, 'phrases', 'PhraseKey', Array ('l%s_Translation', 'l%s_HintTranslation', 'l%s_ColumnTranslation', 'PhraseType')); - $this->_performUpgrade($language_id, 'emailevents', 'EventId', Array ('l%s_Subject', 'Headers', 'l%s_HtmlBody', 'l%s_PlainTextBody')); + $this->_performUpgrade($language_id, 'phrases', 'PhraseKey', Array ('l%s_Translation', 'l%s_HintTranslation', 'l%s_ColumnTranslation', 'l%s_TranslateFrom', 'PhraseType')); + $this->_performUpgrade($language_id, 'emailevents', 'EventId', Array ('l%s_Subject', 'Headers', 'l%s_HtmlBody', 'l%s_PlainTextBody', 'l%s_TranslateFrom')); $this->_performUpgrade($language_id, 'country-state', 'CountryStateId', Array ('l%s_Name')); } @@ -535,15 +570,15 @@ $live_records = $this->_getTableData($language_id, $prefix, $unique_field, $data_fields[0], false); $temp_records = $this->_getTableData($language_id, $prefix, $unique_field, $data_fields[0], true); - if (!$temp_records) { + if ( !$temp_records ) { // no data for given language - return ; + return; } // perform insert for records, that are missing in live table $to_insert = array_diff($temp_records, $live_records); - if ($to_insert) { + if ( $to_insert ) { $to_insert = $this->Conn->qstrArray($to_insert); $sql = 'INSERT INTO ' . $this->Application->getUnitOption($prefix, 'TableName') . ' @@ -559,7 +594,7 @@ // perform update for records, that are present in live table $to_update = array_diff($temp_records, $to_insert); - if ($to_update) { + if ( $to_update ) { $to_update = $this->Conn->qstrArray($to_update); $sql = 'UPDATE ' . $this->Application->getUnitOption($prefix, 'TableName') . ' live @@ -582,19 +617,19 @@ $unique_field . ' IN (' . implode(',', $to_update) . ')', ); - if ($this->import_mode == LANG_SKIP_EXISTING) { + if ( !$this->hasOption(self::OVERWRITE_EXISTING) ) { // empty OR not set $data_field = sprintf($data_fields[0], $language_id); $where_clause[] = '(' . $data_field . ' = "") OR (' . $data_field . ' IS NULL)'; } - if ($where_clause) { + if ( $where_clause ) { $sql .= "\n" . 'WHERE (' . implode(') AND (', $where_clause) . ')'; } $this->Conn->Query($sql); - if ($this->Conn->getAffectedRows() > 0) { + if ( $this->Conn->getAffectedRows() > 0 ) { // existing records were updated $this->changedPrefixes[] = $prefix; } @@ -914,6 +949,9 @@ { static $other_translations = Array (); + $primary_language = $this->Application->GetDefaultLanguageId(); + $translate_from = $this->hasOption(self::SYNC_ADDED) || $primary_language == $language_id ? 0 : $primary_language; + if ( $this->Application->isDebugMode() ) { $this->Application->Debugger->profileStart('L[' . $language_id . ']P', 'Language: ' . $language_id . '; Phrases Import'); } @@ -951,12 +989,14 @@ $other_translations[$phrase_key]['l' . $other_language_id . '_Translation'] = ''; $other_translations[$phrase_key]['l' . $other_language_id . '_HintTranslation'] = ''; $other_translations[$phrase_key]['l' . $other_language_id . '_ColumnTranslation'] = ''; + $other_translations[$phrase_key]['l' . $other_language_id . '_TranslateFrom'] = 0; } } $other_translations[$phrase_key]['l' . $language_id . '_Translation'] = $translation; $other_translations[$phrase_key]['l' . $language_id . '_HintTranslation'] = $hint_translation; $other_translations[$phrase_key]['l' . $language_id . '_ColumnTranslation'] = $column_translation; + $other_translations[$phrase_key]['l' . $language_id . '_TranslateFrom'] = $translate_from; $fields_hash = array_merge($fields_hash, $other_translations[$phrase_key]); $this->Conn->doInsert($fields_hash, $this->_tables['phrases'], 'REPLACE', false); @@ -981,6 +1021,9 @@ { static $other_translations = Array (); + $primary_language = $this->Application->GetDefaultLanguageId(); + $translate_from = $this->hasOption(self::SYNC_ADDED) || $primary_language == $language_id ? 0 : $primary_language; + if ( $this->Application->isDebugMode() ) { $this->Application->Debugger->profileStart('L[' . $language_id . ']E', 'Language: ' . $language_id . '; Events Import'); } @@ -1022,12 +1065,14 @@ $other_translations[$event_id]['l' . $other_language_id . '_Subject'] = ''; $other_translations[$event_id]['l' . $other_language_id . '_HtmlBody'] = ''; $other_translations[$event_id]['l' . $other_language_id . '_PlainTextBody'] = ''; + $other_translations[$event_id]['l' . $other_language_id . '_TranslateFrom'] = 0; } } $other_translations[$event_id]['l' . $language_id . '_Subject'] = $parsed['Subject']; $other_translations[$event_id]['l' . $language_id . '_HtmlBody'] = $parsed['HtmlBody']; $other_translations[$event_id]['l' . $language_id . '_PlainTextBody'] = $parsed['PlainTextBody']; + $other_translations[$event_id]['l' . $language_id . '_TranslateFrom'] = $translate_from; if ( $parsed['Headers'] ) { $other_translations[$event_id]['Headers'] = $parsed['Headers']; @@ -1124,11 +1169,11 @@ WHERE PackName = ' . $this->Conn->qstr($fields_hash['PackName']); $language_id = $this->Conn->GetOne($sql); - if ($language_id) { + if ( $language_id ) { // 2. language found -> update, when allowed $this->lang_object->Load($language_id); - if ($this->import_mode == LANG_OVERWRITE_EXISTING) { + if ( $this->hasOption(self::OVERWRITE_EXISTING) ) { // update live language record based on data from xml $this->lang_object->SetFieldsFromHash($fields_hash); $this->lang_object->Update(); @@ -1139,18 +1184,18 @@ $this->lang_object->SetFieldsFromHash($fields_hash); $this->lang_object->SetDBField('Enabled', STATUS_ACTIVE); - if ($this->lang_object->Create()) { + if ( $this->lang_object->Create() ) { $language_id = $this->lang_object->GetID(); - if (defined('IS_INSTALL') && IS_INSTALL) { + if ( defined('IS_INSTALL') && IS_INSTALL ) { // language created during install becomes admin interface language $this->lang_object->setPrimary(true, true); } } } // 4. collect ID of every processed language - if (!in_array($language_id, $this->_languages)) { + if ( !in_array($language_id, $this->_languages) ) { $this->_languages[kUtil::crc32($fields_hash['PackName'])] = $language_id; } Index: branches/5.3.x/core/units/languages/languages_event_handler.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/units/languages/languages_event_handler.php (.../languages_event_handler.php) (revision 15483) +++ branches/5.3.x/core/units/languages/languages_event_handler.php (.../languages_event_handler.php) (revision 15584) @@ -1,6 +1,6 @@ Application->recallObject('LanguageImportHelper'); /* @var $language_import_helper LanguageImportHelper */ - $language_import_helper->performImport( - $filename, - $object->GetDBField('PhraseType'), - $object->GetDBField('Module'), - $object->GetDBField('ImportOverwrite') ? LANG_OVERWRITE_EXISTING : LANG_SKIP_EXISTING - ); + if ( $object->GetDBField('ImportOverwrite') ) { + $language_import_helper->setOption(LanguageImportHelper::OVERWRITE_EXISTING); + } + if ( $object->GetDBField('ImportSynced') ) { + $language_import_helper->setOption(LanguageImportHelper::SYNC_ADDED); + } + + $language_import_helper->performImport($filename, $object->GetDBField('PhraseType'), $object->GetDBField('Module')); + // delete uploaded language pack after import is finished unlink($filename); Index: branches/5.3.x/core/units/phrases/phrase_tp.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/units/phrases/phrase_tp.php (.../phrase_tp.php) (revision 15483) +++ branches/5.3.x/core/units/phrases/phrase_tp.php (.../phrase_tp.php) (revision 15584) @@ -1,6 +1,6 @@ IsNewItem($params) ) { + return false; + } + + $object = $this->getObject($params); + /* @var $object kDBItem */ + + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + return !$ml_helper->editingInSourceLanguage($object->GetDBField('TranslateFromLanguage')); + } + + /** + * Shows field label with %s replaced with source translation language + * + * @param Array $params + * @return string + * @access protected + */ + protected function SourceLanguageTitle($params) + { + $object = $this->getObject($params); + /* @var $object kDBItem */ + + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + return $ml_helper->replaceSourceLanguage($object, $params['label']); + } } \ No newline at end of file Index: branches/5.3.x/core/install/install_schema.sql =================================================================== diff -u -N -r15578 -r15584 --- branches/5.3.x/core/install/install_schema.sql (.../install_schema.sql) (revision 15578) +++ branches/5.3.x/core/install/install_schema.sql (.../install_schema.sql) (revision 15584) @@ -110,6 +110,11 @@ l3_PlainTextBody longtext, l4_PlainTextBody longtext, l5_PlainTextBody longtext, + l1_TranslateFrom int(11) NOT NULL DEFAULT '0', + l2_TranslateFrom int(11) NOT NULL DEFAULT '0', + l3_TranslateFrom int(11) NOT NULL DEFAULT '0', + l4_TranslateFrom int(11) NOT NULL DEFAULT '0', + l5_TranslateFrom int(11) NOT NULL DEFAULT '0', Headers text, Enabled int(11) NOT NULL DEFAULT '1', FrontEndOnly tinyint(3) unsigned NOT NULL DEFAULT '0', @@ -137,7 +142,8 @@ KEY l2_PlainTextBody (l2_PlainTextBody(5)), KEY l3_PlainTextBody (l3_PlainTextBody(5)), KEY l4_PlainTextBody (l4_PlainTextBody(5)), - KEY l5_PlainTextBody (l5_PlainTextBody(5)) + KEY l5_PlainTextBody (l5_PlainTextBody(5)), + KEY l1_TranslateFrom (l1_TranslateFrom) ); CREATE TABLE SystemEventSubscriptions ( @@ -236,6 +242,11 @@ l3_ColumnTranslation text, l4_ColumnTranslation text, l5_ColumnTranslation text, + l1_TranslateFrom int(11) NOT NULL DEFAULT '0', + l2_TranslateFrom int(11) NOT NULL DEFAULT '0', + l3_TranslateFrom int(11) NOT NULL DEFAULT '0', + l4_TranslateFrom int(11) NOT NULL DEFAULT '0', + l5_TranslateFrom int(11) NOT NULL DEFAULT '0', PhraseType int(11) NOT NULL DEFAULT '0', LastChanged int(10) unsigned DEFAULT NULL, LastChangeIP varchar(15) NOT NULL DEFAULT '', @@ -245,7 +256,8 @@ KEY PhraseKey (PhraseKey), KEY l1_Translation (l1_Translation(5)), KEY l1_HintTranslation (l1_HintTranslation(5)), - KEY l1_ColumnTranslation (l1_ColumnTranslation(5)) + KEY l1_ColumnTranslation (l1_ColumnTranslation(5)), + KEY l1_TranslateFrom (l1_TranslateFrom) ); CREATE TABLE PhraseCache ( Index: branches/5.3.x/core/admin_templates/regional/phrases_edit.tpl =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/admin_templates/regional/phrases_edit.tpl (.../phrases_edit.tpl) (revision 15483) +++ branches/5.3.x/core/admin_templates/regional/phrases_edit.tpl (.../phrases_edit.tpl) (revision 15584) @@ -68,36 +68,28 @@ - - +
+ + - - - - - - + + + + + + - - + - - - + + + + - - - - + + + -
-
- - - -
Index: branches/5.3.x/core/units/email_events/email_events_event_handler.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/units/email_events/email_events_event_handler.php (.../email_events_event_handler.php) (revision 15483) +++ branches/5.3.x/core/units/email_events/email_events_event_handler.php (.../email_events_event_handler.php) (revision 15584) @@ -1,6 +1,6 @@ Application->getUnitOption($event->Prefix, 'Fields'); + $fields['Module']['options'] = $this->_getModules(); - foreach ($this->Application->ModuleInfo as $module_name => $module_info) { - if ( $module_name == 'In-Portal' ) { - continue; - } - - $options[$module_name] = $module_name; + if ( $this->Application->findModule('Name', 'Custom') ) { + $fields['Module']['default'] = 'Custom'; } - $fields = $this->Application->getUnitOption($event->Prefix, 'Fields'); - $fields['Module']['options'] = $options; $this->Application->setUnitOption($event->Prefix, 'Fields', $fields); + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + $ml_helper->replaceMLCalculatedFields($event); + if ( $this->Application->GetVar('regional') ) { $this->Application->setUnitOption($event->Prefix, 'PopulateMlFields', true); } } /** + * Returns modules, where e-mail event can be added to + * + * @return Array + * @access protected + */ + protected function _getModules() + { + $ret = Array (); + + foreach ($this->Application->ModuleInfo as $module_name => $module_info) { + if ( $module_name == 'In-Portal' ) { + continue; + } + + $ret[$module_name] = $module_name; + } + + return $ret; + } + + /** * Prepare temp tables and populate it * with items selected in the grid * @@ -371,6 +392,16 @@ $object->SetDBField('ReplacementTagsXML', $xml); $this->setRequired($event); + + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + $translation_fields = $this->getTranslationFields(); + $source_language = $ml_helper->getSourceLanguage($object->GetDBField('TranslateFromLanguage')); + + foreach ($translation_fields as $translation_field) { + $object->SetDBField('Source' . $translation_field, $object->GetDBField('l' . $source_language . '_' . $translation_field)); + } } /** @@ -454,8 +485,8 @@ */ function translationChanged($object) { + $translation_fields = $this->getTranslationFields(); $changed_fields = array_keys($object->GetChangedFields()); - $translation_fields = Array ('Subject', 'HtmlBody', 'PlainTextBody'); foreach ($changed_fields as $changed_field) { $changed_field = preg_replace('/^l[\d]+_/', '', $changed_field); @@ -469,6 +500,17 @@ } /** + * Returns fields, that can be translated + * + * @return Array + * @access protected + */ + protected function getTranslationFields() + { + return Array ('Subject', 'HtmlBody', 'PlainTextBody'); + } + + /** * Don't allow to enable/disable events in non-debug mode * * @param kEvent $event @@ -726,4 +768,21 @@ $temp_handler->DeleteItems('system-event-subscription', '', $ids); } + + /** + * Updates translation state for all saved phrases + * + * @param kEvent $event + * @return void + * @access protected + */ + protected function OnBeforeCopyToLive(kEvent $event) + { + parent::OnBeforeCopyToLive($event); + + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + $ml_helper->updateTranslationState($event); + } } \ No newline at end of file Index: branches/5.3.x/core/install/english.lang =================================================================== diff -u -N -r15578 -r15584 --- branches/5.3.x/core/install/english.lang (.../english.lang) (revision 15578) +++ branches/5.3.x/core/install/english.lang (.../english.lang) (revision 15584) @@ -478,6 +478,8 @@ SW1wb3J0IENvbHVtbnM= SW1wb3J0IEZpbGU= SW1wb3J0IEZpbGVuYW1l + T3ZlcndyaXRlIEV4aXN0aW5nIFBocmFzZXM= + SW1wb3J0IE5ldyBQaHJhc2VzIGFzIFN5bmNlZA== SW5jbHVkZSBmaWVsZCB0aXRsZXM= SW5jbHVkZSBTdWJsZXZlbHM= SW5wdXQgRGF0ZSBGb3JtYXQ= @@ -659,6 +661,12 @@ TmFtZQ== U2tpcCBGaXJzdCBSb3c= U29ydCBWYWx1ZXM= + U291cmNlIENvbHVtbiBQaHJhc2UgKGZyb20gJXMp + U291cmNlIEhpbnQgUGhyYXNlIChmcm9tICVzKQ== + U291cmNlIEhUTUwgVmVyc2lvbiAoZnJvbSAlcyk= + U291cmNlIFRleHQgVmVyc2lvbiAoZnJvbSAlcyk= + U291cmNlIFN1YmplY3QgKGZyb20gJXMp + U291cmNlIFBocmFzZSAoZnJvbSAlcyk= U1NMIEZ1bGwgVVJM U3RhcnQgRGF0ZQ== U3RhdGU= @@ -706,7 +714,9 @@ UHJvbW8gVHJhbnNpdGlvbiBFZmZlY3Q= UHJvbW8gVHJhbnNpdGlvbiBFZmZlY3QgKGN1c3RvbSk= VHJhbnNpdGlvbiBEZWxheSAoc2Vjb25kcyk= + VHJhbnNsYXRlIEZyb20gTGFuZ2F1Z2U= UGhyYXNl + VHJhbnNsYXRpb24gaW4gU3luYw== VHlwZQ== TWVhc3VyZXMgU3lzdGVt VXBsb2FkIEZpbGUgRnJvbSBMb2NhbCBQQw== @@ -1091,7 +1101,6 @@ TmV3ZXN0IExpbmsgRGF0ZQ== TmV3ZXN0IFVzZXIgRGF0ZQ== Q3VycmVudGx5IEFjdGl2ZSBVc2VyIFNlc3Npb25z - T3ZlcndyaXRlIEV4aXN0aW5nIFBocmFzZXM= UGVuZGluZyBTZWN0aW9ucw== UGVuZGluZyBJdGVtcw== UGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBub3c/ @@ -1650,6 +1659,7 @@ U2V0IFByaW1hcnk= U2V0IFByaW1hcnkgU2VjdGlvbg== U2V0IFByaW1hcnkgTGFuZ3VhZ2U= + VXNlIGFzIFByaW1hcnk= U2V0IFN0aWNreQ== U2V0dGluZ3M= U2hvdyBNZW51 @@ -1731,7 +1741,6 @@ U3RhdHVz SXRlbSBJcyBhIFRvcCBTZWxsZXI= VVJM - RW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCB1bmRvIGFueSBjaGFuZ2VzIHlvdSBoYXZlIG1hZGUgdG8gZXhpc3RpbmcgcGhyYXNlcw== b2Y= SW52YWxpZA== Tm90IFZhbGlkYXRlZA== Index: branches/5.3.x/core/install/upgrades.css =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/install/upgrades.css (.../upgrades.css) (revision 15483) +++ branches/5.3.x/core/install/upgrades.css (.../upgrades.css) (revision 15584) @@ -817,3 +817,29 @@ } /* Right side of bluebar */ + +# ===== v 5.3.0-B1 ===== +Index: style_template.css +=================================================================== +--- style_template.css (revision 15437) ++++ style_template.css (working copy) +@@ -498,6 +498,18 @@ + background: #fff none; + } + ++.highlight-area, .code-highlight-area { ++ border: 1px solid black; ++ padding: 8px; ++ font-family: monospace !important; ++ font-size: 12px; ++ overflow: auto; ++} ++ ++.code-highlight-area { ++ background-color: #F6F6F6; ++} ++ + .error { + color: red; + } + \ No newline at end of file Index: branches/5.3.x/core/units/email_events/email_event_tp.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/units/email_events/email_event_tp.php (.../email_event_tp.php) (revision 15483) +++ branches/5.3.x/core/units/email_events/email_event_tp.php (.../email_event_tp.php) (revision 15584) @@ -1,6 +1,6 @@ SetFieldOptions('RecipientType', $field_options); } + /** + * Determine if primary translation should be shown + * + * @param Array $params + * @return string + * @access protected + */ + protected function ShowSourceLanguage($params) + { + if ( $this->IsNewItem($params) ) { + return false; + } + + $object = $this->getObject($params); + /* @var $object kDBItem */ + + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + return !$ml_helper->editingInSourceLanguage($object->GetDBField('TranslateFromLanguage')); + } + + /** + * Shows field label with %s replaced with source translation language + * + * @param Array $params + * @return string + * @access protected + */ + protected function SourceLanguageTitle($params) + { + $object = $this->getObject($params); + /* @var $object kDBItem */ + + $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); + /* @var $ml_helper kMultiLanguageHelper */ + + return $ml_helper->replaceSourceLanguage($object, $params['label']); + } } \ No newline at end of file Index: branches/5.3.x/core/install/install_data.sql =================================================================== diff -u -N -r15578 -r15584 --- branches/5.3.x/core/install/install_data.sql (.../install_data.sql) (revision 15578) +++ branches/5.3.x/core/install/install_data.sql (.../install_data.sql) (revision 15584) @@ -737,7 +737,7 @@ INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:skins.edit', 11, 1, 1, 0); INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:skins.delete', 11, 1, 1, 0); -INSERT INTO AdminSkins VALUES(DEFAULT, 'Default', '/* General elements */\r\n\r\nhtml {\r\n height: 100%;\r\n}\r\n\r\nbody {\r\n font-family: verdana,arial,helvetica,sans-serif;\r\n color: #000000;\r\n overflow-x: auto; overflow-y: auto;\r\n margin: 0px 0px 0px 0px;\r\n text-decoration: none;\r\n}\r\n\r\nbody, td {\r\n /* fix for Firefox, when font-size was not inherited in table cells */\r\n font-size: 9pt;\r\n}\r\n\r\na {\r\n color: #006699;\r\n text-decoration: none;\r\n}\r\n\r\na:hover {\r\n color: #009ff0;\r\n text-decoration: none;\r\n}\r\n\r\nform {\r\n display: inline;\r\n}\r\n\r\nimg { border: 0px; }\r\n\r\nbody.height-100 {\r\n height: 100%;\r\n}\r\n\r\nbody.regular-body {\r\n margin: 0px 10px 5px 10px;\r\n color: #000000;\r\n background-color: @@SectionBgColor@@;\r\n}\r\n\r\nbody.edit-popup {\r\n margin: 0px 0px 0px 0px;\r\n}\r\n\r\ntable.collapsed {\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered, table.bordered, .bordered-no-bottom {\r\n border: 1px solid #000000 !important;\r\n border-top-width: 0px;\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered-no-bottom {\r\n border-top-width: 1px;\r\n border-bottom: none;\r\n}\r\n\r\n.login-table td {\r\n padding: 1px;\r\n}\r\n\r\n.disabled {\r\n background-color: #ebebeb;\r\n}\r\n\r\n/* Head frame */\r\ntable.head-table {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/right_background.png'') top right @@HeadBgColor@@ no-repeat;\r\n}\r\n\r\n.head-table tr td, .head-table tr td a {\r\n color: @@HeadColor@@\r\n}\r\n\r\ndiv#extra_toolbar td.button-active {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_button_background.gif'') bottom left repeat-x;\r\n height: 22px;\r\n}\r\n\r\ndiv#extra_toolbar td.button-active a {\r\n color: black;\r\n text-decoration: none;\r\n}\r\n\r\ntd.kx-block-header, .head-table tr td.kx-block-header{\r\n color: @@HeadBarColor@@;\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_background.gif'') repeat-x top left;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n padding-left: 7px;\r\n padding-right: 7px;\r\n}\r\n\r\na.kx-header-link {\r\n text-decoration: underline;\r\n font-weight: bold;\r\n color: #0080C8;\r\n}\r\n\r\na.kx-header-link:hover {\r\n color: #FFCB05;\r\n text-decoration: none;\r\n}\r\n\r\n.kx-secondary-foreground {\r\n color: #FFFFFF;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n}\r\n\r\n.kx-login-button {\r\n background-color: #2D79D6;\r\n color: #FFFFFF;\r\n}\r\n\r\n/* General form button (yellow) */\r\n.button {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #000000;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Disabled (grayed-out) form button */\r\n.button-disabled {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #676767;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back_disabled.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Tabs bar */\r\n\r\n.tab, .tab-active {\r\n background-color: #F0F1EB;\r\n padding: 3px 7px 2px 7px;\r\n border-top: 1px solid black;\r\n border-left: 1px solid black;\r\n border-right: 1px solid black;\r\n margin-left: 3px !important;\r\n white-space: nowrap;\r\n}\r\n\r\n.tab-active {\r\n background-color: #4487D9;\r\n}\r\n\r\n.tab a {\r\n color: #4487D9;\r\n font-weight: bold;\r\n}\r\n\r\n.tab-active a {\r\n color: #FFFFFF;\r\n font-weight: bold;\r\n}\r\n\r\na.scroll-left, a.scroll-right {\r\n cursor: pointer;\r\n display: block;\r\n float: left;\r\n height: 18px;\r\n margin: 0px 1px;\r\n width: 18px;\r\n}\r\n\r\na.scroll-left {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/left.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.scroll-right {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/right.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.disabled {\r\n visibility: hidden !important;\r\n}\r\n\r\na.scroll-left:hover, a.scroll-right:hover {\r\n background-position: 0 -18px;\r\n}\r\n\r\ntd.scroll-right-container {\r\n width: 20px;\r\n}\r\n\r\ntd.scroll-right-container.disabled, td.scroll-right-container.disabled * {\r\n width: 0px;\r\n margin: 0px;\r\n}\r\n\r\ntd.scroll-right-container.disabled br {\r\n display: none;\r\n}\r\n\r\n/* Toolbar */\r\n\r\n.toolbar {\r\n font-size: 8pt;\r\n border: 1px solid #000000;\r\n border-width: 0px 1px 1px 1px;\r\n background-color: @@ToolbarBgColor@@;\r\n border-collapse: collapse;\r\n}\r\n\r\n.toolbar td {\r\n height: 100%;\r\n}\r\n\r\n.toolbar-button, .toolbar-button-disabled, .toolbar-button-over {\r\n float: left;\r\n text-align: center;\r\n font-size: 8pt;\r\n padding: 5px 5px 5px 5px;\r\n vertical-align: middle;\r\n color: #006F99;\r\n}\r\n\r\n.toolbar-button-over {\r\n color: #000;\r\n}\r\n\r\n.toolbar-button-disabled {\r\n color: #444;\r\n}\r\n\r\n/* Scrollable Grids */\r\n\r\n\r\n.layout-only-table td {\r\n border: none !important;\r\n}\r\n\r\n/* Main Grid class */\r\n.grid-scrollable {\r\n padding: 0px;\r\n border: 1px solid black !important;\r\n border-top: none !important;\r\n}\r\n\r\n/* Div generated by js, which contains all the scrollable grid elements, affects the style of scrollable area without data (if there are too few rows) */\r\n.grid-container {\r\n background-color: #fff;\r\n}\r\n\r\n.grid-container table {\r\n border-collapse: collapse;\r\n}\r\n\r\n/* Inner div generated in each data-cell */\r\n.grid-cell-div {\r\n overflow: hidden;\r\n height: auto;\r\n}\r\n\r\n/* Main row definition */\r\n.grid-data-row td, .grid-data-row-selected td, .grid-data-row-even-selected td, .grid-data-row-mouseover td, .table-color1, .table-color2, .grid-edit-table .edit-form-odd > td, .grid-edit-table .edit-form-even > td {\r\n font-weight: normal;\r\n color: @@OddColor@@;\r\n background-color: @@OddBgColor@@;\r\n padding: 3px 5px 3px 5px;\r\n overflow: hidden;\r\n border-right: 1px solid #c9c9c9;\r\n}\r\n.grid-data-row-even td, .table-color2, .grid-edit-table .edit-form-even > td {\r\n background-color: @@EvenBgColor@@;\r\n color: @@EvenColor@@;\r\n}\r\n.grid-data-row td a, .grid-data-row-selected td a, .grid-data-row-mouseover td a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* mouse-over rows */\r\n.grid-data-row-mouseover td, table tr.grid-data-row[_row_highlighted] td {\r\n background: #FFFDF4;\r\n}\r\n\r\n/* Selected row, applies to both checkbox and data areas */\r\n.grid-data-row-selected td, table tr.grid-data-row[_row_selected] td {\r\n background: #FEF2D6;\r\n}\r\n\r\n.grid-data-row-even-selected td, .grid-data-row-even[_row_selected] td {\r\n background: #FFF7E0;\r\n}\r\n\r\n/* General header cell definition */\r\n.grid-header-row td {\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n text-decoration: none;\r\n padding: 3px 5px 3px 5px;\r\n color: @@ColumnTitlesColor@@;\r\n border-right: none;\r\n text-align: left;\r\n vertical-align: middle !important;\r\n white-space: nowrap;\r\n border-right: 1px solid #777;\r\n}\r\n\r\n/* Filters row */\r\ntr.grid-header-row-1 td {\r\n background-color: @@FiltersBgColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n/* Grid Filters */\r\ntable.range-filter {\r\n width: 100%;\r\n}\r\n\r\n.range-filter td {\r\n padding: 0px 0px 2px 2px !important;\r\n border: none !important;\r\n font-size: 8pt !important;\r\n font-weight: normal !important;\r\n text-align: left;\r\n color: #000000 !important;\r\n}\r\n\r\ninput.filter, select.filter, input.filter-active, select.filter-active {\r\n margin-bottom: 0px;\r\n border: 1px solid #aaa;\r\n}\r\n\r\ninput.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\nselect.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\ndiv.filter, div.filter-active {\r\n background-color: white;\r\n border: 1px solid #AAAAAA;\r\n color: black;\r\n font-weight: normal;\r\n padding: 3px;\r\n}\r\n\r\ndiv.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\ndiv.multioptions_filter {\r\n position: absolute;\r\n z-index: 100;\r\n color: black;\r\n background-color: white;\r\n border: 1px solid black;\r\n padding: 3px 5px;\r\n display: none;\r\n vertical-align: middle;\r\n}\r\n\r\n/* Column titles row */\r\ntr.grid-header-row-0 td {\r\n height: 25px;\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n color: @@ColumnTitlesColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\ntr.grid-header-row-0 td a {\r\n color: @@ColumnTitlesColor@@;\r\n}\r\n\r\ntr.grid-header-row-0 td a:hover {\r\n color: #FFCC00;\r\n}\r\n\r\n\r\n.grid-footer-row td {\r\n background-color: #D7D7D7;\r\n font-weight: bold;\r\n border-right: 1px solid #C9C9C9;\r\n padding: 3px 5px 3px 5px;\r\n}\r\n\r\ntd.grid-header-last-cell, td.grid-data-last-cell, td.grid-footer-last-cell {\r\n border-right: none !important;\r\n}\r\n\r\ntd.grid-data-col-0, td.grid-data-col-0 div {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 div {\r\n display: table-cell;\r\n vertical-align: middle;\r\n}\r\n\r\n.grid-status-bar {\r\n border: 1px solid black;\r\n border-top: none;\r\n padding: 0px;\r\n width: 100%;\r\n border-collapse: collapse;\r\n height: 30px;\r\n}\r\n\r\n.grid-status-bar td {\r\n background-color: @@TitleBarBgColor@@;\r\n color: @@TitleBarColor@@;\r\n font-size: 11pt;\r\n font-weight: normal;\r\n padding: 2px 8px 2px 8px;\r\n}\r\n\r\n/* /Scrollable Grids */\r\n\r\n\r\n/* Forms */\r\ntable.edit-form {\r\n border: none;\r\n border-top-width: 0px !important;\r\n border-collapse: collapse;\r\n width: 100%;\r\n}\r\n\r\n.edit-form-odd, .edit-form-even {\r\n padding: 0px;\r\n}\r\n\r\n.subsectiontitle {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #4A92CE;\r\n color: #fff;\r\n height: 25px;\r\n border-top: 1px solid black;\r\n vertical-align: middle;\r\n}\r\n\r\n/* remove top-border from first sub-section element */\r\ntable.edit-form .subsectiontitle:first-child, table.bordered .subsectiontitle:first-child {\r\n border-top-width: 0;\r\n}\r\n\r\n.subsectiontitle td {\r\n vertical-align: middle;\r\n /*padding: 3px 5px 3px 5px;*/\r\n padding: 1px 5px;\r\n}\r\n\r\n.label-cell {\r\n background: #DEE7F6 url(''@@base_url@@/core/admin_templates/img/bgr_input_name_line.gif'') no-repeat right bottom;\r\n font: 12px arial, sans-serif;\r\n padding: 4px 20px;\r\n width: 160px;\r\n}\r\n\r\n.control-mid {\r\n width: 13px;\r\n border-left: 1px solid #7A95C2;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_mid.gif'') repeat-x left bottom;\r\n}\r\n\r\n.control-cell {\r\n font: 11px arial, sans-serif;\r\n padding: 4px 10px 5px 5px;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_input_line.gif'') no-repeat left bottom;\r\n width: auto;\r\n vertical-align: middle;\r\n}\r\n\r\n.label-cell-filler {\r\n background: #DEE7F6 none;\r\n}\r\n.control-mid-filler {\r\n background: #fff none;\r\n border-left: 1px solid #7A95C2;\r\n}\r\n.control-cell-filler {\r\n background: #fff none;\r\n}\r\n\r\n.error {\r\n color: red;\r\n}\r\n.error-cell {\r\n color: red;\r\n}\r\n\r\n.field-required {\r\n color: red;\r\n}\r\n\r\n.warning-table {\r\n background-color: #F0F1EB;\r\n border: 1px solid #000000;\r\n border-collapse: collapse;\r\n border-top-width: 0px;\r\n}\r\n\r\n.form-notice, .form-warning {\r\n font-size: 11px;\r\n}\r\n\r\n.form-warning {\r\n color: red;\r\n}\r\n\r\n.form-notice {\r\n color: green;\r\n}\r\n\r\n.priority {\r\n color: red;\r\n padding-left: 1px;\r\n padding-right: 1px;\r\n font-size: 11px;\r\n}\r\n\r\n.small-statistics {\r\n font-size: 11px;\r\n color: #707070;\r\n}\r\n\r\n.req-note {\r\n font-style: italic;\r\n color: #333;\r\n}\r\n\r\n#scroll_container table.tableborder {\r\n border-collapse: separate\r\n}\r\n\r\n/* Uploader */\r\n.uploader-queue div.file {\r\n font-size: 11px;\r\n border: 1px solid #7F99C5;\r\n padding: 3px;\r\n background-color: #DEE7F6;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.uploader-queue .left {\r\n float: left;\r\n vertical-align: top;\r\n}\r\n\r\n.uploader-queue .file-label {\r\n margin-left: 5px;\r\n}\r\n\r\n.uploader-queue .preview .delete-checkbox {\r\n margin-top: -3px;\r\n}\r\n\r\n.uploader-queue .progress-container {\r\n margin: 2px 5px 0px 5px;\r\n}\r\n\r\n.uploader-queue .progress-empty {\r\n width: 150px;\r\n height: 9px;\r\n border: 1px solid black;\r\n background: url(''@@base_url@@/core/admin_templates/img/progress_left.gif'') repeat-x;\r\n}\r\n\r\n.uploader-queue .progress-full {\r\n height: 9px;\r\n background: url(''@@base_url@@/core/admin_templates/img/progress_done.gif'');\r\n}\r\n\r\n.uploader-queue .thumbnail {\r\n /*margin-bottom: 2px;*/\r\n border: 1px solid black;\r\n background-color: grey;\r\n}\r\n\r\n/* To be sorted */\r\nspan#category_path, span#category_path a {\r\n color: #FFFFFF;\r\n}\r\n\r\nspan#category_path a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* Section title, right to the big icon */\r\n.admintitle {\r\n font-size: 16pt;\r\n font-weight: bold;\r\n color: @@SectionColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Page header (bluebar) */\r\n.page-title td {\r\n background-color: @@TitleBarBgColor@@;\r\n color: @@TitleBarColor@@;\r\n font-size: 11pt;\r\n font-weight: normal;\r\n padding: 2px 8px 2px 8px;\r\n}\r\n\r\n/* Right side of bluebar */\r\n.tablenav, tablenav a {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n\r\n text-decoration: none;\r\n background-color: @@TitleBarBgColor@@;\r\n background-image: none;\r\n}\r\n\r\n/* Section title in the bluebar * -- why ''link''? :S */\r\n.tablenav_link {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Active page in top and bottom bluebars pagination */\r\n.current_page {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #fff;\r\n color: #2D79D6;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Other pages and arrows in pagination on blue */\r\n.nav_url {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n color: #fff;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Tree */\r\n.tree-body {\r\n background-color: @@TreeBgColor@@;\r\n height: 100%\r\n}\r\n\r\n.tree_head.td, .tree_head, .tree_head:hover {\r\n font-weight: bold;\r\n font-size: 10px;\r\n color: #FFFFFF;\r\n font-family: Verdana, Arial;\r\n text-decoration: none;\r\n}\r\n\r\n.tree {\r\n padding: 0px;\r\n border: none;\r\n border-collapse: collapse;\r\n}\r\n\r\n.tree tr td {\r\n padding: 0px;\r\n margin: 0px;\r\n font-family: helvetica, arial, verdana,;\r\n font-size: 11px;\r\n white-space: nowrap;\r\n}\r\n\r\n.tree tr td a {\r\n font-size: 11px;\r\n color: @@TreeColor@@;\r\n font-family: Helvetica, Arial, Verdana;\r\n text-decoration: none;\r\n padding: 2px;\r\n}\r\n\r\n.tree tr td a:hover, .tree tr td a.debug-only-item:hover {\r\n color: @@TreeHoverColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a, .tree tr.highlighted td a.debug-only-item {\r\n color: @@TreeHighColor@@;\r\n background-color: @@TreeHighBgColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a:hover {\r\n color: @@TreeHighHoverColor@@;\r\n}\r\n\r\n.tree tr td a.debug-only-item {\r\n color: grey;\r\n}\r\n\r\n/* Ajax Dropdown */\r\n.suggest-box {\r\n border: 1px solid #999;\r\n background-color: #fff;\r\n}\r\n\r\n.suggest-item, .suggest-item-over {\r\n padding: 1px 2px 0px 2px;\r\n font-family: arial,verdana;\r\n font-size: 12px;\r\n}\r\n\r\n.suggest-item-over {\r\n background-color: #3366CC;\r\n color: #fff;\r\n}\r\n\r\n/* Dashboard Summary Boxes */\r\n.summary-box {\r\n border: 1px solid black;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.summary-box .title {\r\n color: white;\r\n font-weight: bold;\r\n padding: 6px 5px;\r\n vertical-align: middle;\r\n background-color: #4A92CE;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n.summary-box .content {\r\n padding: 4px;\r\n background-color: #F6F6F6;\r\n}\r\n\r\n.summary-box .group {\r\n border-bottom: 1px solid black;\r\n margin-bottom: 10px;\r\n padding: 0 0 10px 10px;\r\n}\r\n\r\n.summary-box .group.last {\r\n border-width: 0px;\r\n margin-bottom: 0;\r\n padding-bottom: 5px;\r\n}\r\n\r\n.summary-box h4 {\r\n margin: 0;\r\n padding: 0 0 3px 0;\r\n font-size: 11px;\r\n font-weight: bold;\r\n}\r\n\r\n.summary-box .hint {\r\n font-size: 10px;\r\n color: grey;\r\n margin-bottom: 3px;\r\n}\r\n\r\n.summary-box .hint .cache-key {\r\n margin-bottom: 7px;\r\n margin-left: 3px;\r\n}\r\n\r\n.summary-box ul {\r\n margin-top: 5px;\r\n margin-bottom: 3px;\r\n padding-left: 30px;\r\n}\r\n\r\n.summary-box li {\r\n padding-bottom: 4px;\r\n}\r\n\r\nspan.cke_skin_kama {\r\n border-width: 0px !important;\r\n -moz-border-radius: 0px !important;\r\n -webkit-border-radius: 0px !important;\r\n padding: 0px !important;\r\n}\r\n\r\n.cke_wrapper{\r\n border-width: 0px !important;\r\n -moz-border-radius: 0px !important;\r\n -webkit-border-radius: 0px !important;\r\n}', 'in-portal_logo_img.jpg', 'in-portal_logo_img2.jpg', 'in-portal_logo_login.gif', 'a:22:{s:11:"HeadBgColor";a:2:{s:11:"Description";s:27:"Head frame background color";s:5:"Value";s:7:"#007BF4";}s:9:"HeadColor";a:2:{s:11:"Description";s:21:"Head frame text color";s:5:"Value";s:7:"#FFFFFF";}s:14:"SectionBgColor";a:2:{s:11:"Description";s:28:"Section bar background color";s:5:"Value";s:7:"#FFFFFF";}s:12:"SectionColor";a:2:{s:11:"Description";s:22:"Section bar text color";s:5:"Value";s:7:"#2D79D6";}s:12:"HeadBarColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"HeadBarBgColor";a:1:{s:5:"Value";s:7:"#1961B8";}s:13:"TitleBarColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TitleBarBgColor";a:1:{s:5:"Value";s:7:"#2D79D6";}s:14:"ToolbarBgColor";a:1:{s:5:"Value";s:7:"#F0F1EB";}s:14:"FiltersBgColor";a:1:{s:5:"Value";s:7:"#D7D7D7";}s:17:"ColumnTitlesColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:19:"ColumnTitlesBgColor";a:1:{s:5:"Value";s:7:"#999999";}s:8:"OddColor";a:1:{s:5:"Value";s:7:"#000000";}s:10:"OddBgColor";a:1:{s:5:"Value";s:7:"#F6F6F6";}s:9:"EvenColor";a:1:{s:5:"Value";s:7:"#000000";}s:11:"EvenBgColor";a:1:{s:5:"Value";s:7:"#EBEBEB";}s:9:"TreeColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"TreeHoverColor";a:1:{s:5:"Value";s:7:"#009FF0";}s:13:"TreeHighColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:18:"TreeHighHoverColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TreeHighBgColor";a:1:{s:5:"Value";s:7:"#4A92CE";}s:11:"TreeBgColor";a:1:{s:5:"Value";s:7:"#DCECF6";}}', 1342105805, 1, 1); +INSERT INTO AdminSkins VALUES(DEFAULT, 'Default', '/* General elements */\r\n\r\nhtml {\r\n height: 100%;\r\n}\r\n\r\nbody {\r\n font-family: verdana,arial,helvetica,sans-serif;\r\n color: #000000;\r\n overflow-x: auto; overflow-y: auto;\r\n margin: 0px 0px 0px 0px;\r\n text-decoration: none;\r\n}\r\n\r\nbody, td {\r\n /* fix for Firefox, when font-size was not inherited in table cells */\r\n font-size: 9pt;\r\n}\r\n\r\na {\r\n color: #006699;\r\n text-decoration: none;\r\n}\r\n\r\na:hover {\r\n color: #009ff0;\r\n text-decoration: none;\r\n}\r\n\r\nform {\r\n display: inline;\r\n}\r\n\r\nimg { border: 0px; }\r\n\r\nbody.height-100 {\r\n height: 100%;\r\n}\r\n\r\nbody.regular-body {\r\n margin: 0px 10px 5px 10px;\r\n color: #000000;\r\n background-color: @@SectionBgColor@@;\r\n}\r\n\r\nbody.edit-popup {\r\n margin: 0px 0px 0px 0px;\r\n}\r\n\r\ntable.collapsed {\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered, table.bordered, .bordered-no-bottom {\r\n border: 1px solid #000000 !important;\r\n border-top-width: 0px;\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered-no-bottom {\r\n border-top-width: 1px;\r\n border-bottom: none;\r\n}\r\n\r\n.login-table td {\r\n padding: 1px;\r\n}\r\n\r\n.disabled {\r\n background-color: #ebebeb;\r\n}\r\n\r\n/* Head frame */\r\ntable.head-table {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/right_background.png'') top right @@HeadBgColor@@ no-repeat;\r\n}\r\n\r\n.head-table tr td, .head-table tr td a {\r\n color: @@HeadColor@@\r\n}\r\n\r\ndiv#extra_toolbar td.button-active {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_button_background.gif'') bottom left repeat-x;\r\n height: 22px;\r\n}\r\n\r\ndiv#extra_toolbar td.button-active a {\r\n color: black;\r\n text-decoration: none;\r\n}\r\n\r\ntd.kx-block-header, .head-table tr td.kx-block-header{\r\n color: @@HeadBarColor@@;\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_background.gif'') repeat-x top left;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n padding-left: 7px;\r\n padding-right: 7px;\r\n}\r\n\r\na.kx-header-link {\r\n text-decoration: underline;\r\n font-weight: bold;\r\n color: #0080C8;\r\n}\r\n\r\na.kx-header-link:hover {\r\n color: #FFCB05;\r\n text-decoration: none;\r\n}\r\n\r\n.kx-secondary-foreground {\r\n color: #FFFFFF;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n}\r\n\r\n.kx-login-button {\r\n background-color: #2D79D6;\r\n color: #FFFFFF;\r\n}\r\n\r\n/* General form button (yellow) */\r\n.button {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #000000;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Disabled (grayed-out) form button */\r\n.button-disabled {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #676767;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back_disabled.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Tabs bar */\r\n\r\n.tab, .tab-active {\r\n background-color: #F0F1EB;\r\n padding: 3px 7px 2px 7px;\r\n border-top: 1px solid black;\r\n border-left: 1px solid black;\r\n border-right: 1px solid black;\r\n margin-left: 3px !important;\r\n white-space: nowrap;\r\n}\r\n\r\n.tab-active {\r\n background-color: #4487D9;\r\n}\r\n\r\n.tab a {\r\n color: #4487D9;\r\n font-weight: bold;\r\n}\r\n\r\n.tab-active a {\r\n color: #FFFFFF;\r\n font-weight: bold;\r\n}\r\n\r\na.scroll-left, a.scroll-right {\r\n cursor: pointer;\r\n display: block;\r\n float: left;\r\n height: 18px;\r\n margin: 0px 1px;\r\n width: 18px;\r\n}\r\n\r\na.scroll-left {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/left.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.scroll-right {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/right.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.disabled {\r\n visibility: hidden !important;\r\n}\r\n\r\na.scroll-left:hover, a.scroll-right:hover {\r\n background-position: 0 -18px;\r\n}\r\n\r\ntd.scroll-right-container {\r\n width: 20px;\r\n}\r\n\r\ntd.scroll-right-container.disabled, td.scroll-right-container.disabled * {\r\n width: 0px;\r\n margin: 0px;\r\n}\r\n\r\ntd.scroll-right-container.disabled br {\r\n display: none;\r\n}\r\n\r\n/* Toolbar */\r\n\r\n.toolbar {\r\n font-size: 8pt;\r\n border: 1px solid #000000;\r\n border-width: 0px 1px 1px 1px;\r\n background-color: @@ToolbarBgColor@@;\r\n border-collapse: collapse;\r\n}\r\n\r\n.toolbar td {\r\n height: 100%;\r\n}\r\n\r\n.toolbar-button, .toolbar-button-disabled, .toolbar-button-over {\r\n float: left;\r\n text-align: center;\r\n font-size: 8pt;\r\n padding: 5px 5px 5px 5px;\r\n vertical-align: middle;\r\n color: #006F99;\r\n}\r\n\r\n.toolbar-button-over {\r\n color: #000;\r\n}\r\n\r\n.toolbar-button-disabled {\r\n color: #444;\r\n}\r\n\r\n/* Scrollable Grids */\r\n\r\n\r\n.layout-only-table td {\r\n border: none !important;\r\n}\r\n\r\n/* Main Grid class */\r\n.grid-scrollable {\r\n padding: 0px;\r\n border: 1px solid black !important;\r\n border-top: none !important;\r\n}\r\n\r\n/* Div generated by js, which contains all the scrollable grid elements, affects the style of scrollable area without data (if there are too few rows) */\r\n.grid-container {\r\n background-color: #fff;\r\n}\r\n\r\n.grid-container table {\r\n border-collapse: collapse;\r\n}\r\n\r\n/* Inner div generated in each data-cell */\r\n.grid-cell-div {\r\n overflow: hidden;\r\n height: auto;\r\n}\r\n\r\n/* Main row definition */\r\n.grid-data-row td, .grid-data-row-selected td, .grid-data-row-even-selected td, .grid-data-row-mouseover td, .table-color1, .table-color2, .grid-edit-table .edit-form-odd > td, .grid-edit-table .edit-form-even > td {\r\n font-weight: normal;\r\n color: @@OddColor@@;\r\n background-color: @@OddBgColor@@;\r\n padding: 3px 5px 3px 5px;\r\n overflow: hidden;\r\n border-right: 1px solid #c9c9c9;\r\n}\r\n.grid-data-row-even td, .table-color2, .grid-edit-table .edit-form-even > td {\r\n background-color: @@EvenBgColor@@;\r\n color: @@EvenColor@@;\r\n}\r\n.grid-data-row td a, .grid-data-row-selected td a, .grid-data-row-mouseover td a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* mouse-over rows */\r\n.grid-data-row-mouseover td, table tr.grid-data-row[_row_highlighted] td {\r\n background: #FFFDF4;\r\n}\r\n\r\n/* Selected row, applies to both checkbox and data areas */\r\n.grid-data-row-selected td, table tr.grid-data-row[_row_selected] td {\r\n background: #FEF2D6;\r\n}\r\n\r\n.grid-data-row-even-selected td, .grid-data-row-even[_row_selected] td {\r\n background: #FFF7E0;\r\n}\r\n\r\n/* General header cell definition */\r\n.grid-header-row td {\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n text-decoration: none;\r\n padding: 3px 5px 3px 5px;\r\n color: @@ColumnTitlesColor@@;\r\n border-right: none;\r\n text-align: left;\r\n vertical-align: middle !important;\r\n white-space: nowrap;\r\n border-right: 1px solid #777;\r\n}\r\n\r\n/* Filters row */\r\ntr.grid-header-row-1 td {\r\n background-color: @@FiltersBgColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n/* Grid Filters */\r\ntable.range-filter {\r\n width: 100%;\r\n}\r\n\r\n.range-filter td {\r\n padding: 0px 0px 2px 2px !important;\r\n border: none !important;\r\n font-size: 8pt !important;\r\n font-weight: normal !important;\r\n text-align: left;\r\n color: #000000 !important;\r\n}\r\n\r\ninput.filter, select.filter, input.filter-active, select.filter-active {\r\n margin-bottom: 0px;\r\n border: 1px solid #aaa;\r\n}\r\n\r\ninput.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\nselect.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\ndiv.filter, div.filter-active {\r\n background-color: white;\r\n border: 1px solid #AAAAAA;\r\n color: black;\r\n font-weight: normal;\r\n padding: 3px;\r\n}\r\n\r\ndiv.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\ndiv.multioptions_filter {\r\n position: absolute;\r\n z-index: 100;\r\n color: black;\r\n background-color: white;\r\n border: 1px solid black;\r\n padding: 3px 5px;\r\n display: none;\r\n vertical-align: middle;\r\n}\r\n\r\n/* Column titles row */\r\ntr.grid-header-row-0 td {\r\n height: 25px;\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n color: @@ColumnTitlesColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\ntr.grid-header-row-0 td a {\r\n color: @@ColumnTitlesColor@@;\r\n}\r\n\r\ntr.grid-header-row-0 td a:hover {\r\n color: #FFCC00;\r\n}\r\n\r\n\r\n.grid-footer-row td {\r\n background-color: #D7D7D7;\r\n font-weight: bold;\r\n border-right: 1px solid #C9C9C9;\r\n padding: 3px 5px 3px 5px;\r\n}\r\n\r\ntd.grid-header-last-cell, td.grid-data-last-cell, td.grid-footer-last-cell {\r\n border-right: none !important;\r\n}\r\n\r\ntd.grid-data-col-0, td.grid-data-col-0 div {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 div {\r\n display: table-cell;\r\n vertical-align: middle;\r\n}\r\n\r\n.grid-status-bar {\r\n border: 1px solid black;\r\n border-top: none;\r\n padding: 0px;\r\n width: 100%;\r\n border-collapse: collapse;\r\n height: 30px;\r\n}\r\n\r\n.grid-status-bar td {\r\n background-color: @@TitleBarBgColor@@;\r\n color: @@TitleBarColor@@;\r\n font-size: 11pt;\r\n font-weight: normal;\r\n padding: 2px 8px 2px 8px;\r\n}\r\n\r\n/* /Scrollable Grids */\r\n\r\n\r\n/* Forms */\r\ntable.edit-form {\r\n border: none;\r\n border-top-width: 0px !important;\r\n border-collapse: collapse;\r\n width: 100%;\r\n}\r\n\r\n.edit-form-odd, .edit-form-even {\r\n padding: 0px;\r\n}\r\n\r\n.subsectiontitle {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #4A92CE;\r\n color: #fff;\r\n height: 25px;\r\n border-top: 1px solid black;\r\n vertical-align: middle;\r\n}\r\n\r\n/* remove top-border from first sub-section element */\r\ntable.edit-form .subsectiontitle:first-child, table.bordered .subsectiontitle:first-child {\r\n border-top-width: 0;\r\n}\r\n\r\n.subsectiontitle td {\r\n vertical-align: middle;\r\n /*padding: 3px 5px 3px 5px;*/\r\n padding: 1px 5px;\r\n}\r\n\r\n.label-cell {\r\n background: #DEE7F6 url(''@@base_url@@/core/admin_templates/img/bgr_input_name_line.gif'') no-repeat right bottom;\r\n font: 12px arial, sans-serif;\r\n padding: 4px 20px;\r\n width: 160px;\r\n}\r\n\r\n.control-mid {\r\n width: 13px;\r\n border-left: 1px solid #7A95C2;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_mid.gif'') repeat-x left bottom;\r\n}\r\n\r\n.control-cell {\r\n font: 11px arial, sans-serif;\r\n padding: 4px 10px 5px 5px;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_input_line.gif'') no-repeat left bottom;\r\n width: auto;\r\n vertical-align: middle;\r\n}\r\n\r\n.label-cell-filler {\r\n background: #DEE7F6 none;\r\n}\r\n.control-mid-filler {\r\n background: #fff none;\r\n border-left: 1px solid #7A95C2;\r\n}\r\n.control-cell-filler {\r\n background: #fff none;\r\n}\r\n\r\n.highlight-area, .code-highlight-area {\r\n border: 1px solid black;\r\n padding: 8px;\r\n font-family: monospace !important;\r\n font-size: 12px;\r\n overflow: auto;\r\n}\r\n\r\n.code-highlight-area {\r\n background-color: #F6F6F6;\r\n}\r\n\r\n.error {\r\n color: red;\r\n}\r\n.error-cell {\r\n color: red;\r\n}\r\n\r\n.field-required {\r\n color: red;\r\n}\r\n\r\n.warning-table {\r\n background-color: #F0F1EB;\r\n border: 1px solid #000000;\r\n border-collapse: collapse;\r\n border-top-width: 0px;\r\n}\r\n\r\n.form-notice, .form-warning {\r\n font-size: 11px;\r\n}\r\n\r\n.form-warning {\r\n color: red;\r\n}\r\n\r\n.form-notice {\r\n color: green;\r\n}\r\n\r\n.priority {\r\n color: red;\r\n padding-left: 1px;\r\n padding-right: 1px;\r\n font-size: 11px;\r\n}\r\n\r\n.small-statistics {\r\n font-size: 11px;\r\n color: #707070;\r\n}\r\n\r\n.req-note {\r\n font-style: italic;\r\n color: #333;\r\n}\r\n\r\n#scroll_container table.tableborder {\r\n border-collapse: separate\r\n}\r\n\r\n/* Uploader */\r\n.uploader-queue div.file {\r\n font-size: 11px;\r\n border: 1px solid #7F99C5;\r\n padding: 3px;\r\n background-color: #DEE7F6;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.uploader-queue .left {\r\n float: left;\r\n vertical-align: top;\r\n}\r\n\r\n.uploader-queue .file-label {\r\n margin-left: 5px;\r\n}\r\n\r\n.uploader-queue .preview .delete-checkbox {\r\n margin-top: -3px;\r\n}\r\n\r\n.uploader-queue .progress-container {\r\n margin: 2px 5px 0px 5px;\r\n}\r\n\r\n.uploader-queue .progress-empty {\r\n width: 150px;\r\n height: 9px;\r\n border: 1px solid black;\r\n background: url(''@@base_url@@/core/admin_templates/img/progress_left.gif'') repeat-x;\r\n}\r\n\r\n.uploader-queue .progress-full {\r\n height: 9px;\r\n background: url(''@@base_url@@/core/admin_templates/img/progress_done.gif'');\r\n}\r\n\r\n.uploader-queue .thumbnail {\r\n /*margin-bottom: 2px;*/\r\n border: 1px solid black;\r\n background-color: grey;\r\n}\r\n\r\n/* To be sorted */\r\nspan#category_path, span#category_path a {\r\n color: #FFFFFF;\r\n}\r\n\r\nspan#category_path a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* Section title, right to the big icon */\r\n.admintitle {\r\n font-size: 16pt;\r\n font-weight: bold;\r\n color: @@SectionColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Page header (bluebar) */\r\n.page-title td {\r\n background-color: @@TitleBarBgColor@@;\r\n color: @@TitleBarColor@@;\r\n font-size: 11pt;\r\n font-weight: normal;\r\n padding: 2px 8px 2px 8px;\r\n}\r\n\r\n/* Right side of bluebar */\r\n.tablenav, tablenav a {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n\r\n text-decoration: none;\r\n background-color: @@TitleBarBgColor@@;\r\n background-image: none;\r\n}\r\n\r\n/* Section title in the bluebar * -- why ''link''? :S */\r\n.tablenav_link {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Active page in top and bottom bluebars pagination */\r\n.current_page {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #fff;\r\n color: #2D79D6;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Other pages and arrows in pagination on blue */\r\n.nav_url {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n color: #fff;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Tree */\r\n.tree-body {\r\n background-color: @@TreeBgColor@@;\r\n height: 100%\r\n}\r\n\r\n.tree_head.td, .tree_head, .tree_head:hover {\r\n font-weight: bold;\r\n font-size: 10px;\r\n color: #FFFFFF;\r\n font-family: Verdana, Arial;\r\n text-decoration: none;\r\n}\r\n\r\n.tree {\r\n padding: 0px;\r\n border: none;\r\n border-collapse: collapse;\r\n}\r\n\r\n.tree tr td {\r\n padding: 0px;\r\n margin: 0px;\r\n font-family: helvetica, arial, verdana,;\r\n font-size: 11px;\r\n white-space: nowrap;\r\n}\r\n\r\n.tree tr td a {\r\n font-size: 11px;\r\n color: @@TreeColor@@;\r\n font-family: Helvetica, Arial, Verdana;\r\n text-decoration: none;\r\n padding: 2px;\r\n}\r\n\r\n.tree tr td a:hover, .tree tr td a.debug-only-item:hover {\r\n color: @@TreeHoverColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a, .tree tr.highlighted td a.debug-only-item {\r\n color: @@TreeHighColor@@;\r\n background-color: @@TreeHighBgColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a:hover {\r\n color: @@TreeHighHoverColor@@;\r\n}\r\n\r\n.tree tr td a.debug-only-item {\r\n color: grey;\r\n}\r\n\r\n/* Ajax Dropdown */\r\n.suggest-box {\r\n border: 1px solid #999;\r\n background-color: #fff;\r\n}\r\n\r\n.suggest-item, .suggest-item-over {\r\n padding: 1px 2px 0px 2px;\r\n font-family: arial,verdana;\r\n font-size: 12px;\r\n}\r\n\r\n.suggest-item-over {\r\n background-color: #3366CC;\r\n color: #fff;\r\n}\r\n\r\n/* Dashboard Summary Boxes */\r\n.summary-box {\r\n border: 1px solid black;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.summary-box .title {\r\n color: white;\r\n font-weight: bold;\r\n padding: 6px 5px;\r\n vertical-align: middle;\r\n background-color: #4A92CE;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n.summary-box .content {\r\n padding: 4px;\r\n background-color: #F6F6F6;\r\n}\r\n\r\n.summary-box .group {\r\n border-bottom: 1px solid black;\r\n margin-bottom: 10px;\r\n padding: 0 0 10px 10px;\r\n}\r\n\r\n.summary-box .group.last {\r\n border-width: 0px;\r\n margin-bottom: 0;\r\n padding-bottom: 5px;\r\n}\r\n\r\n.summary-box h4 {\r\n margin: 0;\r\n padding: 0 0 3px 0;\r\n font-size: 11px;\r\n font-weight: bold;\r\n}\r\n\r\n.summary-box .hint {\r\n font-size: 10px;\r\n color: grey;\r\n margin-bottom: 3px;\r\n}\r\n\r\n.summary-box .hint .cache-key {\r\n margin-bottom: 7px;\r\n margin-left: 3px;\r\n}\r\n\r\n.summary-box ul {\r\n margin-top: 5px;\r\n margin-bottom: 3px;\r\n padding-left: 30px;\r\n}\r\n\r\n.summary-box li {\r\n padding-bottom: 4px;\r\n}\r\n\r\nspan.cke_skin_kama {\r\n border-width: 0px !important;\r\n -moz-border-radius: 0px !important;\r\n -webkit-border-radius: 0px !important;\r\n padding: 0px !important;\r\n}\r\n\r\n.cke_wrapper{\r\n border-width: 0px !important;\r\n -moz-border-radius: 0px !important;\r\n -webkit-border-radius: 0px !important;\r\n}', 'in-portal_logo_img.jpg', 'in-portal_logo_img2.jpg', 'in-portal_logo_login.gif', 'a:22:{s:11:"HeadBgColor";a:2:{s:11:"Description";s:27:"Head frame background color";s:5:"Value";s:7:"#007BF4";}s:9:"HeadColor";a:2:{s:11:"Description";s:21:"Head frame text color";s:5:"Value";s:7:"#FFFFFF";}s:14:"SectionBgColor";a:2:{s:11:"Description";s:28:"Section bar background color";s:5:"Value";s:7:"#FFFFFF";}s:12:"SectionColor";a:2:{s:11:"Description";s:22:"Section bar text color";s:5:"Value";s:7:"#2D79D6";}s:12:"HeadBarColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"HeadBarBgColor";a:1:{s:5:"Value";s:7:"#1961B8";}s:13:"TitleBarColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TitleBarBgColor";a:1:{s:5:"Value";s:7:"#2D79D6";}s:14:"ToolbarBgColor";a:1:{s:5:"Value";s:7:"#F0F1EB";}s:14:"FiltersBgColor";a:1:{s:5:"Value";s:7:"#D7D7D7";}s:17:"ColumnTitlesColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:19:"ColumnTitlesBgColor";a:1:{s:5:"Value";s:7:"#999999";}s:8:"OddColor";a:1:{s:5:"Value";s:7:"#000000";}s:10:"OddBgColor";a:1:{s:5:"Value";s:7:"#F6F6F6";}s:9:"EvenColor";a:1:{s:5:"Value";s:7:"#000000";}s:11:"EvenBgColor";a:1:{s:5:"Value";s:7:"#EBEBEB";}s:9:"TreeColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"TreeHoverColor";a:1:{s:5:"Value";s:7:"#009FF0";}s:13:"TreeHighColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:18:"TreeHighHoverColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TreeHighBgColor";a:1:{s:5:"Value";s:7:"#4A92CE";}s:11:"TreeBgColor";a:1:{s:5:"Value";s:7:"#DCECF6";}}', 1350469652, 1, 1); INSERT INTO LocalesList VALUES (1, '0x0436', 'Afrikaans (South Africa)', 'af-ZA', 'Latn', '1252'), Index: branches/5.3.x/core/units/helpers/deployment_helper.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/units/helpers/deployment_helper.php (.../deployment_helper.php) (revision 15483) +++ branches/5.3.x/core/units/helpers/deployment_helper.php (.../deployment_helper.php) (revision 15584) @@ -1,6 +1,6 @@ out('Importing LanguagePack ... '); $filename = $this->getModuleFile('english.lang'); - $language_import_helper->performImport($filename, '|0|1|2|', $this->moduleName, LANG_SKIP_EXISTING); + $language_import_helper->performImport($filename, '|0|1|2|', $this->moduleName); $this->displayStatus('OK'); } Index: branches/5.3.x/core/install/upgrades.sql =================================================================== diff -u -N -r15578 -r15584 --- branches/5.3.x/core/install/upgrades.sql (.../upgrades.sql) (revision 15578) +++ branches/5.3.x/core/install/upgrades.sql (.../upgrades.sql) (revision 15584) @@ -2860,3 +2860,19 @@ # ===== v 5.3.0-B1 ===== ALTER TABLE ScheduledTasks ADD Settings TEXT NULL; ALTER TABLE Themes ADD ImageResizeRules TEXT NULL; + +DELETE FROM UserPersistentSessionData WHERE VariableName = 'emailevents[Emails]columns_.'; + +INSERT INTO <%TABLE_PREFIX%>SystemCache (VarName, Data) +SELECT 'tmp_translation' AS VarName, l<%PRIMARY_LANGUAGE%>_Translation AS Data +FROM <%TABLE_PREFIX%>LanguageLabels +WHERE PhraseKey = 'LC_IMPORTLANG_PHRASEWARNING'; + +UPDATE <%TABLE_PREFIX%>LanguageLabels +SET + Phrase = 'la_fld_ImportOverwrite', + PhraseKey = 'LA_FLD_IMPORTOVERWRITE', + l<%PRIMARY_LANGUAGE%>_HintTranslation = (SELECT Data FROM <%TABLE_PREFIX%>SystemCache WHERE VarName = 'tmp_translation' LIMIT 1) +WHERE PhraseKey = 'LA_PROMPT_OVERWRITEPHRASES'; + +DELETE FROM LanguageLabels WHERE PhraseKey = 'LC_IMPORTLANG_PHRASEWARNING'; Index: branches/5.3.x/core/admin_templates/incs/form_blocks.tpl =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/admin_templates/incs/form_blocks.tpl (.../form_blocks.tpl) (revision 15483) +++ branches/5.3.x/core/admin_templates/incs/form_blocks.tpl (.../form_blocks.tpl) (revision 15584) @@ -575,6 +575,12 @@ ', '', 'popups/translator', 1);" title="">
+ + + + - - + + + + + + + + + + + + + + + + + + Index: branches/5.3.x/core/units/email_events/email_events_config.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/units/email_events/email_events_config.php (.../email_events_config.php) (revision 15483) +++ branches/5.3.x/core/units/email_events/email_events_config.php (.../email_events_config.php) (revision 15584) @@ -1,6 +1,6 @@ Array ( 'prefixes' => Array ('emailevents'), 'format' => '#emailevents_status# - #emailevents_titlefield# - !la_section_General!', - 'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), + 'toolbar_buttons' => Array ('select', 'setprimary', 'cancel', 'reset_edit', 'prev', 'next'), ), 'email_message_edit_settings' => Array ( @@ -73,6 +73,8 @@ ), ), + 'CheckSimulatniousEdit' => true, + 'PermSection' => Array ('main' => 'in-portal:configemail'), 'Sections' => Array ( @@ -89,6 +91,21 @@ 'TableName' => TABLE_PREFIX . 'EmailEvents', + 'CalculatedFields' => Array ( + '' => Array ( + 'SourceSubject' => 'l%4$s_Subject', + 'SourceHtmlBody' => 'l%4$s_HtmlBody', + 'SourcePlainTextBody' => 'l%4$s_PlainTextBody', + + 'CurrentSubject' => 'l%5$s_Subject', + 'CurrentHtmlBody' => 'l%5$s_HtmlBody', + 'CurrentPlainTextBody' => 'l%5$s_PlainTextBody', + + 'TranslationInSync' => 'IF(l%5$s_TranslateFrom = 0, 1, 0)', + 'TranslateFromLanguage' => 'l%5$s_TranslateFrom', + ), + ), + 'ListSQLs' => Array ( '' => ' SELECT %1$s.* %2$s FROM %1$s', ), @@ -168,6 +185,12 @@ 'default' => null ), + 'TranslateFrom' => Array ( + 'type' => 'int', + 'formatter' => 'kMultiLanguage', 'db_type' => 'int', 'index_type' => 'int', + 'not_null' => 1, 'default' => 0 + ), + 'Enabled' => Array ( 'type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1, @@ -222,6 +245,25 @@ 'Tag' => Array ('type' => 'string', 'default' => ''), 'Replacement' => Array ('type' => 'string', 'default' => ''), 'ReplacementTagsXML' => Array ('type' => 'string', 'default' => ''), + + 'SourceSubject' => Array ('type' => 'string', 'default' => ''), + 'SourceHtmlBody' => Array ('type' => 'string', 'default' => ''), + 'SourcePlainTextBody' => Array ('type' => 'string', 'default' => ''), + + 'CurrentSubject' => Array ('type' => 'string', 'default' => ''), + 'CurrentHtmlBody' => Array ('type' => 'string', 'default' => ''), + 'CurrentPlainTextBody' => Array ('type' => 'string', 'default' => ''), + + 'TranslationInSync' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1, + 'default' => 0, + ), + 'TranslateFromLanguage' => Array ( + 'type' => 'int', + 'formatter' => 'kOptionsFormatter', 'options_sql' => 'SELECT %s FROM ' . TABLE_PREFIX . 'Languages ORDER BY PackName', 'option_title_field' => 'PackName', 'option_key_field' => 'LanguageId', + 'default' => 0, + ), ), 'Grids' => Array ( @@ -253,13 +295,15 @@ 'Fields' => Array ( 'EventId' => Array ('title' => 'column:la_fld_Id', 'filter_block' => 'grid_range_filter', 'width' => 60, ), 'Event' => Array ('filter_block' => 'grid_like_filter', 'width' => 250, ), - 'Subject' => Array ('filter_block' => 'grid_like_filter', 'no_special' => 0, 'width' => 300, ), + 'CurrentSubject' => Array ('title' => 'column:la_fld_Subject', 'filter_block' => 'grid_like_filter', 'no_special' => 0, 'width' => 300, ), 'Description' => Array ('filter_block' => 'grid_like_filter', 'width' => 250, ), 'Type' => Array ('filter_block' => 'grid_options_filter', 'width' => 60, ), 'Enabled' => Array ('filter_block' => 'grid_options_filter', 'width' => 70, ), 'Module' => Array ('filter_block' => 'grid_multioptions_filter', 'width' => 100, ), 'FrontEndOnly' => Array ('filter_block' => 'grid_options_filter', 'width' => 120, 'hidden' => 1), 'LastChanged' => Array ('title' => 'column:la_fld_Modified', 'filter_block' => 'grid_date_range_filter', 'width' => 150), + 'TranslationInSync' => Array ('filter_block' => 'grid_options_filter', 'width' => 100, 'hidden' => 1), + 'TranslateFromLanguage' => Array ('filter_block' => 'grid_multioptions_filter', 'width' => 100, 'hidden' => 1), ), ), ), Index: branches/5.3.x/admin/system_presets/simple/phrases_phrases.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/admin/system_presets/simple/phrases_phrases.php (.../phrases_phrases.php) (revision 15483) +++ branches/5.3.x/admin/system_presets/simple/phrases_phrases.php (.../phrases_phrases.php) (revision 15584) @@ -20,7 +20,7 @@ 'phrases_list_st' => Array (/*'new_item', 'edit', 'delete', 'view',*/ 'export', /*'dbl-click'*/), // edit phrase -// 'phrase_edit_single' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), + 'phrase_edit_single' => Array (/*'select',*/ 'setprimary', /*'cancel', 'reset_edit', 'prev', 'next'*/), ); // fields to hide @@ -31,14 +31,19 @@ // virtual fields to hide $virtual_hidden_fields = Array ( - /*'PrimaryTranslation', 'CurrentTranslation', 'CurrentHintTranslation', 'CurrentColumnTranslation', - 'LangFile', 'ImportOverwrite', 'DoNotEncode', 'ExportPhrases', 'ExportEmailEvents'*/ + /*'PrimaryTranslation', 'SourceTranslation', 'SourceHintTranslation', 'SourceColumnTranslation', + 'CurrentTranslation', 'CurrentHintTranslation', 'CurrentColumnTranslation', 'LangFile', 'ImportOverwrite', + 'ImportSynced', 'DoNotEncode', 'ExportPhrases', 'ExportEmailEvents',*/ 'TranslationInSync', 'TranslateFromLanguage' ); $debug_only_fields = Array ( 'HintTranslation', 'ColumnTranslation' ); + $debug_only_virtual_fields = Array ( + 'SourceHintTranslation', 'SourceColumnTranslation' + ); + // fields to make required $required_fields = Array ( 'Phrase', 'Translation', 'PhraseType', 'Module' @@ -55,5 +60,5 @@ // 'Default' => Array ('PhraseId', 'Phrase', 'CurrentTranslation', 'PrimaryTranslation', 'PhraseType', 'LastChanged', 'Module', 'CurrentHintTranslation', 'CurrentColumnTranslation'), // single list of phrases -// 'Phrases' => Array ('PhraseId', 'Phrase', 'CurrentTranslation', 'PhraseType', 'LastChanged', 'Module', 'CurrentHintTranslation', 'CurrentColumnTranslation'), + 'Phrases' => Array (/*'PhraseId', 'Phrase', 'CurrentTranslation', 'PhraseType', 'LastChanged', 'Module', 'CurrentHintTranslation', 'CurrentColumnTranslation',*/ 'TranslationInSync', 'TranslateFromLanguage'), ); \ No newline at end of file Index: branches/5.3.x/admin/system_presets/simple/email_events_emailevents.php =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/admin/system_presets/simple/email_events_emailevents.php (.../email_events_emailevents.php) (revision 15483) +++ branches/5.3.x/admin/system_presets/simple/email_events_emailevents.php (.../email_events_emailevents.php) (revision 15584) @@ -18,7 +18,7 @@ 'email_message_list' => Array (/*'new_item', 'edit', 'delete', 'approve', 'decline', 'frontend_mail', 'view',*/ 'export', /*'dbl-click'*/), // edit email edit - general tab -// 'email_message_edit' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), + 'email_message_edit' => Array (/*'select',*/ 'setprimary', /*'cancel', 'reset_edit', 'prev', 'next'*/), // edit email edit - settings tab // 'email_message_edit_settings' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'), @@ -35,7 +35,7 @@ // virtual fields to hide $virtual_hidden_fields = Array ( /*'RecipientType', 'RecipientName', 'RecipientAddressType', - 'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/ + 'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/ 'TranslationInSync', 'TranslateFromLanguage' ); // fields to make required @@ -52,6 +52,10 @@ 'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/ ); + $debug_only_virtual_fields = Array ( + 'SourceSubject', 'SourceHtmlBody', 'SourcePlainTextBody', + ); + // tabs during editing $hide_edit_tabs = Array ( 'Default' => Array (/*'general',*/ 'settings'), @@ -60,5 +64,5 @@ // hide columns in grids $hide_columns = Array ( // 'Default' => Array ('EventId', 'Description', 'Event', 'Module', 'Type', 'Enabled', 'LastChanged'), -// 'Emails' => Array ('EventId', 'Event', 'Subject', 'Description', 'Type', 'Enabled', 'Module', 'FrontEndOnly', 'LastChanged'), + 'Emails' => Array (/*'EventId', 'Event', 'Subject', 'Description', 'Type', 'Enabled', 'Module', 'FrontEndOnly', 'LastChanged',*/ 'TranslationInSync', 'TranslateFromLanguage'), ); \ No newline at end of file Index: branches/5.3.x/core/admin_templates/languages/email_message_edit.tpl =================================================================== diff -u -N -r15483 -r15584 --- branches/5.3.x/core/admin_templates/languages/email_message_edit.tpl (.../email_message_edit.tpl) (revision 15483) +++ branches/5.3.x/core/admin_templates/languages/email_message_edit.tpl (.../email_message_edit.tpl) (revision 15584) @@ -11,10 +11,26 @@