You are here

class language_hierarchy_i18n_string_textgroup_default in Language Hierarchy 7

Extends the default i18n string textgroup class providing language fallback.

The overridden methods contain a bit modified code of the original methods. It would be nice to not copy the code and use hook_query_alter(), but the i18n_string_textgroup_default class does not uses query tags, so hook_query_alter() is never called for its queries.

Hierarchy

Expanded class hierarchy of language_hierarchy_i18n_string_textgroup_default

1 string reference to 'language_hierarchy_i18n_string_textgroup_default'
language_hierarchy_i18n_string_info_alter in ./language_hierarchy.module
Implements hook_i18n_string_info_alter().

File

includes/language_hierarchy_i18n_string_textgroup_default.class.inc, line 11

View source
class language_hierarchy_i18n_string_textgroup_default extends i18n_string_textgroup_default {

  /**
   * {@inheritdoc}
   */
  public static function load_translation($i18nstring, $langcode) {
    $chain = language_hierarchy_get_ancestors($langcode);
    if (empty($chain)) {
      return parent::load_translation($i18nstring, $langcode);
    }
    $langcodes = array_values(array_merge(array(
      $langcode,
    ), array_keys($chain)));
    if (!empty($i18nstring->lid)) {
      $query = db_select('locales_target', 't');
      $query
        ->condition('t.lid', $i18nstring->lid);
    }
    else {
      $query = db_select('i18n_string', 's')
        ->fields('s');
      $query
        ->leftJoin('locales_target', 't', 's.lid = t.lid');
      $query
        ->condition('s.textgroup', $i18nstring->textgroup);
      $query
        ->condition('s.context', $i18nstring->context);
    }
    $query
      ->fields('t', array(
      'translation',
      'i18n_status',
    ));
    if (drupal_static('language_hierarchy_i18n_show_language')) {
      $query
        ->addField('t', 'language');
    }

    // The i18n module can save empty strings as translations. In this case, it
    // behaves as there is no translation and uses the original strings.
    // Handle this case by simple excluding of empty translations.
    $query
      ->condition('t.translation', '', '<>');

    // Pass all language chain instead of one given language.
    $query
      ->condition('t.language', $langcodes, 'IN');

    // Sort results according to the language chain order.
    $order = '(CASE ';
    foreach ($langcodes as $index => $lang) {
      $order .= "WHEN t.language = '{$lang}' THEN {$index} ";
    }
    $order .= 'END)';
    $query
      ->orderBy($order);
    $query
      ->range(0, 1);
    return $query
      ->execute()
      ->fetchObject();
  }

  /**
   * {@inheritdoc}
   */
  protected function multiple_translation_load($conditions, $langcode) {
    $conditions += array(
      'language' => $langcode,
      'textgroup' => $this->textgroup,
    );
    if (is_array($conditions['language'])) {
      if (count($conditions['language']) !== 1) {

        // This should never happen, but if it does, we don't know what to do.
        return parent::multiple_translation_load($conditions, $langcode);
      }
      $conditions['language'] = reset($conditions['language']);
    }
    $chain = language_hierarchy_get_ancestors($conditions['language']);
    if (empty($chain)) {
      return parent::multiple_translation_load($conditions, $langcode);
    }
    $conditions['language'] = array_values(array_merge(array(
      $conditions['language'],
    ), array_keys($chain)));
    $query = db_select('i18n_string', 's')
      ->fields('s');
    $query
      ->leftJoin('locales_target', 't', 's.lid = t.lid');
    $query
      ->fields('t', array(
      'translation',
      'language',
      'i18n_status',
    ));
    foreach ($conditions as $field => $value) {
      if (is_array($value) && count($value) == 1) {
        $value = reset($value);
      }
      if ($value === '*') {
        continue;
      }
      elseif ($field == 'language') {
        $query
          ->condition('t.language', $value);
      }
      else {
        $query
          ->condition('s.' . $field, $value);
      }
    }

    // The i18n module can save empty strings as translations. In this case, it
    // behaves as there is no translation and uses the original strings.
    // Handle this case by simple excluding of empty translations.
    $query
      ->condition('t.translation', '', '<>');

    // Sort results according to the language chain order.
    $order = '(CASE ';
    foreach ($conditions['language'] as $index => $lang) {
      $order .= "WHEN t.language = '{$lang}' THEN {$index} ";
    }
    $order .= 'END)';
    $query
      ->orderBy($order);

    // The query now is ordered by language, but we will need to use the GROUP
    // BY operator which is applied *before* the ORDER BY, so in the end we may
    // have wrong translations selected. To ovid this, do the trick with
    // subquery, so we have the correct grouping.
    $main_query = db_select($query, 'main')
      ->fields('main')
      ->groupBy('main.lid');
    return $this
      ->multiple_translation_build($main_query
      ->execute()
      ->fetchAll(), $langcode);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
i18n_string_textgroup_default::$cache_multiple protected property
i18n_string_textgroup_default::$debug public property
i18n_string_textgroup_default::$strings public property
i18n_string_textgroup_default::$textgroup public property
i18n_string_textgroup_default::build_string public function Build string object
i18n_string_textgroup_default::cache_get protected function Get translation from cache 1
i18n_string_textgroup_default::cache_reset public function Reset cache, needed for tests 1
i18n_string_textgroup_default::cache_set protected function Set string object into cache
i18n_string_textgroup_default::context_remove public function Remove source and translations for user defined string.
i18n_string_textgroup_default::context_translate public function Translate source string
i18n_string_textgroup_default::context_update public function Update / create translation source for user defined strings.
i18n_string_textgroup_default::load_source public static function Load string source from db
i18n_string_textgroup_default::load_strings public function Load multiple strings.
i18n_string_textgroup_default::multiple_cache_get protected function Get strings from multiple cache. 1
i18n_string_textgroup_default::multiple_cache_set protected function Set multiple cache.
i18n_string_textgroup_default::multiple_combine protected static function Build combinations of an array of arrays respecting keys.
i18n_string_textgroup_default::multiple_translate public function Translate array of source strings
i18n_string_textgroup_default::multiple_translation_build protected function Get multiple translations with search conditions.
i18n_string_textgroup_default::multiple_translation_search public function Search multiple translations with key combinations.
i18n_string_textgroup_default::save_source protected static function Save source string (create / update)
i18n_string_textgroup_default::save_string protected function Save / update string object
i18n_string_textgroup_default::save_translation protected function Save translation to the db
i18n_string_textgroup_default::string_add protected function Add source string to the locale tables for translation.
i18n_string_textgroup_default::string_check protected static function Check if string is ok for translation
i18n_string_textgroup_default::string_filter protected static function Filter array of strings
i18n_string_textgroup_default::string_query protected static function Build query for i18n_string table
i18n_string_textgroup_default::string_remove public function Remove string object. 1
i18n_string_textgroup_default::string_translate protected function Translate string object
i18n_string_textgroup_default::string_update public function Update / create / remove string. 1
i18n_string_textgroup_default::update_check public function Recheck strings after update
i18n_string_textgroup_default::update_translation function Update string translation, only if source exists.
i18n_string_textgroup_default::__construct public function Class constructor. 1
language_hierarchy_i18n_string_textgroup_default::load_translation public static function Load translation from db Overrides i18n_string_textgroup_default::load_translation
language_hierarchy_i18n_string_textgroup_default::multiple_translation_load protected function Load multiple translations from db Overrides i18n_string_textgroup_default::multiple_translation_load