/** * Imports one string into the database. * * @param PoItem $item * The item being imported. * * @return int * The string ID of the existing string modified or the new string added. */ private function importString(PoItem $item) { // Initialize overwrite options if not set. $this->_options['overwrite_options'] += array('not_customized' => FALSE, 'customized' => FALSE); $overwrite_options = $this->_options['overwrite_options']; $customized = $this->_options['customized']; $context = $item->getContext(); $source = $item->getSource(); $translation = $item->getTranslation(); $textgroup = $item->getTextgroup(); // Look up the source string and any existing translation. $strings = $this->storage->getTranslations(array('language' => $this->_langcode, 'source' => $source, 'context' => $context, 'textgroup' => $textgroup)); $string = reset($strings); if (!empty($translation)) { // Skip this string unless it passes a check for dangerous code. if (!locale_string_is_safe($translation)) { watchdog('l10n_update', 'Import of string "%string" was skipped because of disallowed or malformed HTML.', array('%string' => $translation), WATCHDOG_ERROR); $this->_report['skips']++; return 0; } elseif ($string) { $string->setString($translation); if ($string->isNew()) { // No translation in this language. $string->setValues(array('language' => $this->_langcode, 'customized' => $customized)); $string->save(); $this->_report['additions']++; } elseif ($overwrite_options[$string->customized ? 'customized' : 'not_customized']) { // Translation exists, only overwrite if instructed. $string->customized = $customized; $string->save(); $this->_report['updates']++; } $this->_report['strings'][] = $string->getId(); return $string->lid; } else { // No such source string in the database yet. $string = $this->storage->createString(array('source' => $source, 'context' => $context, 'textgroup' => $textgroup))->save(); $target = $this->storage->createTranslation(array('lid' => $string->getId(), 'language' => $this->_langcode, 'translation' => $translation, 'customized' => $customized))->save(); $this->_report['additions']++; $this->_report['strings'][] = $string->getId(); return $string->lid; } } elseif ($string && !$string->isNew() && $overwrite_options[$string->customized ? 'customized' : 'not_customized']) { // Empty translation, remove existing if instructed. $string->delete(); $this->_report['deletes']++; $this->_report['strings'][] = $string->lid; return $string->lid; } }
/** * Builds and executes a database query based on options set earlier. */ private function loadStrings() { $langcode = $this->_langcode; $options = $this->_options; $conditions = array(); if (array_sum($options) == 0) { // If user asked to not include anything in the translation files, // that would not make sense, so just fall back on providing a template. $langcode = NULL; // Force option to get both translated and untranslated strings. $options['not_translated'] = TRUE; } // Build and execute query to collect source strings and translations. if (!empty($langcode)) { $conditions['language'] = $langcode; // Translate some options into field conditions. if ($options['customized']) { if (!$options['not_customized']) { // Filter for customized strings only. $conditions['customized'] = L10N_UPDATE_CUSTOMIZED; } // Else no filtering needed in this case. } else { if ($options['not_customized']) { // Filter for non-customized strings only. $conditions['customized'] = L10N_UPDATE_NOT_CUSTOMIZED; } else { // Filter for strings without translation. $conditions['translated'] = FALSE; } } if (!$options['not_translated']) { // Filter for string with translation. $conditions['translated'] = TRUE; } return $this->storage->getTranslations($conditions); } else { // If no language, we don't need any of the target fields. return $this->storage->getStrings($conditions); } }