| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 | <?php/** * Implementation of hook_features_api(). */function features_translations_features_api() {  $translations = array();  // Legacy option - we don't write to it anymore.  $translations['translations'] = array(    'name' => t('Translations'),    'default_hook' => 'translations_defaults',    'feature_source' => TRUE,    'default_file' => FEATURES_DEFAULTS_INCLUDED,  );  foreach (language_list() as $langcode => $language) {    $machine_langcode = strtr($langcode, array('-' => '_'));    $translations["translations_{$machine_langcode}"] = array(      'name' => t('Translations: !name', array('!name' => t($language->name))),      'default_hook' => "translations_{$machine_langcode}_defaults",      'feature_source' => TRUE,      'base' => 'translations',      'default_file' => FEATURES_DEFAULTS_INCLUDED,      'supersedes' => 'translations',    );  }  return $translations;}/** * Implementation of hook_features_export_options(). */function translations_features_export_options($component) {  // Ignore legacy option.  if ($component == 'translations') return array();  $options = array();  $textgroups = module_invoke_all('locale', 'groups');  list(,$machine_langcode) = explode('_', $component, 2);  $langcode = strtr($machine_langcode, array('_' => '-'));  $languages = language_list();  $language = $languages[$langcode];  foreach ($textgroups as $textgroup => $label) {    if ($textgroup == 'default' && $langcode == 'en') continue;    if ($textgroup != 'default' && $langcode == translations_features_string_source_language()) continue;    $options[$machine_langcode . ':' . $textgroup] = t($language->name) . ': ' . $label;  }  return $options;}/** * Helper to return site's string source language. */function translations_features_string_source_language() {  if (module_exists('i18n_string')) {    return i18n_string_source_language();  }  return language_default('language');}/** * Implementation of hook_features_export(). */function translations_features_export($data, &$export, $module_name) {  foreach ($data as $component) {    list($machine_langcode,) = explode(':', $component);    $export['features']["translations_{$machine_langcode}"][$component] = $component;  }  $export['dependencies']['features'] = 'features';  $export['dependencies']['features_translations'] = 'features_translations';  return array();}/** * Implementation of hook_features_export_render(). */function translations_features_export_render($module_name, $data, $export = NULL) {  $languages = language_list();  $code = array(    '  $translations = array();',    '  $translatables = array();',  );  $machine_langcode = ''; // won't change in the loop  foreach ($data as $component) {    list($machine_langcode, $textgroup) = explode(':', $component);    $langcode = strtr($machine_langcode, array('_' => '-'));    $strings = _features_translations_locale_export_get_strings($languages[$langcode], $textgroup);    foreach ($strings as $md5 => $string) {      $code[] = "  \$translations['{$machine_langcode}:{$textgroup}']['{$md5}'] = " . features_var_export($string, '  ') . ";";      // potx compatibility      $code[] = "  \$translatables[] = t('" .                str_replace("'", "\'", $string->source) .                "', array(), array('context' => '" .                str_replace("'", "\'", $string->context) .                "'));";    }  }  $code[] = '  return $translations;';  $code = implode("\n", $code);  return array("translations_{$machine_langcode}_defaults" => $code);}/** * Implementation of hook_features_revert(). */function translations_features_revert($module_name, $component) {  include_once('includes/locale.inc');  $translations = features_get_default($component, $module_name);  if (!empty($translations)) {    $report = array('updates' => 0, 'skips' => 0, 'additions' => 0, 'deletes' => 0);    $lids = array();    foreach ($translations as $key => $strings) {      list($machine_langcode, $textgroup) = explode(':', $key);      $langcode = strtr($machine_langcode, array('_' => '-'));      foreach ($strings as $md5 => $string) {        if (!empty($string['plid'])) {          if (!isset($lids[$string['plid']])) {            watchdog('features', 'Translations: importing plid %plid not found for string %source', array(              '%plid' => $string['plid'],               '%source' => $string['source'],            ), WATCHDOG_WARNING);            $string['plid'] = 0;          }          else {            $string['plid'] = $lids[$string['plid']];          }        }        $lids[$md5] = _locale_import_one_string_db(          $report,           $langcode,           $string['context'],           $string['source'],           $string['translation'],           $textgroup,           $string['location'],           LOCALE_IMPORT_OVERWRITE,           $string['plid'],          $string['plural']        );        if (module_exists('l10n_update')) {          // Set the "string is customized" flag so featured translations can roundtrip.          db_update('locales_target')            ->fields(array(              // Use literal here as the named constant is not available globally in some versions.              'l10n_status' => 1,            ))            ->condition('language', $langcode)            ->condition('lid', $lids[$md5])            ->execute();        }      }    }    watchdog('features', 'Translations: results for importing feature %feature: %report', array(      '%feature' => $module_name . ':' . $component,      '%report' => var_export($report, TRUE),    ), WATCHDOG_INFO);  }  return TRUE;}/** * Helper to return translated strings in given language and group. */function _features_translations_locale_export_get_strings($language, $group) {  $query = db_select('locales_source', 's');  $query->join('locales_target', 't', 's.lid = t.lid');  $query->fields('s', array('lid', 'source', 'context', 'location'));  $query->fields('t', array('translation', 'plid', 'plural'));  $query->addExpression('MD5(CONCAT(s.source, s.context))', 'source_md5');  $query->condition('t.language', $language->language);  $query->condition('s.textgroup', $group);  //exclude unchanged lids  if (module_exists('l10n_update')) {    // Use literal here as the named constant is not available globally in some versions.    $query->condition('t.l10n_status', 0, '<>');  }  $query->orderBy('t.plural', 'ASC')->orderBy('source_md5', 'ASC');  $result = $query->execute()->fetchAll();  $strings = array();  $lids = array();  foreach ($result as $string) {    $md5 = $string->source_md5;    $lids[$string->lid] = $md5;    if (!empty($string->plid)) {      if (!isset($lids[$string->plid])) {        watchdog('features', 'Translations: exporting plid %plid not found for string %source.', array('%plid' => $string->plid, '%source' => $string->source));        $string->plid = 0;      }      else {        $string->plid = $lids[$string->plid];      }    }    unset($string->lid, $string->source_md5); // don't want those in the export    $strings[$md5] = $string;  }  return $strings;}
 |