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(); + } + } }