You are here

public static function language_hierarchy_i18n_string_textgroup_default::load_translation in Language Hierarchy 7

Load translation from db

@todo Optimize when we've already got the source string

Overrides i18n_string_textgroup_default::load_translation

File

includes/language_hierarchy_i18n_string_textgroup_default.class.inc, line 16

Class

language_hierarchy_i18n_string_textgroup_default
Extends the default i18n string textgroup class providing language fallback.

Code

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