예제 #1
0
 /**
  * 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;
     }
 }
예제 #2
0
  /**
   * 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);
    }
  }