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
Name![]() |
Modifiers | Type | Description | Overrides |
---|---|---|---|---|
i18n_string_textgroup_default:: |
protected | property | ||
i18n_string_textgroup_default:: |
public | property | ||
i18n_string_textgroup_default:: |
public | property | ||
i18n_string_textgroup_default:: |
public | property | ||
i18n_string_textgroup_default:: |
public | function | Build string object | |
i18n_string_textgroup_default:: |
protected | function | Get translation from cache | 1 |
i18n_string_textgroup_default:: |
public | function | Reset cache, needed for tests | 1 |
i18n_string_textgroup_default:: |
protected | function | Set string object into cache | |
i18n_string_textgroup_default:: |
public | function | Remove source and translations for user defined string. | |
i18n_string_textgroup_default:: |
public | function | Translate source string | |
i18n_string_textgroup_default:: |
public | function | Update / create translation source for user defined strings. | |
i18n_string_textgroup_default:: |
public static | function | Load string source from db | |
i18n_string_textgroup_default:: |
public | function | Load multiple strings. | |
i18n_string_textgroup_default:: |
protected | function | Get strings from multiple cache. | 1 |
i18n_string_textgroup_default:: |
protected | function | Set multiple cache. | |
i18n_string_textgroup_default:: |
protected static | function | Build combinations of an array of arrays respecting keys. | |
i18n_string_textgroup_default:: |
public | function | Translate array of source strings | |
i18n_string_textgroup_default:: |
protected | function | Get multiple translations with search conditions. | |
i18n_string_textgroup_default:: |
public | function | Search multiple translations with key combinations. | |
i18n_string_textgroup_default:: |
protected static | function | Save source string (create / update) | |
i18n_string_textgroup_default:: |
protected | function | Save / update string object | |
i18n_string_textgroup_default:: |
protected | function | Save translation to the db | |
i18n_string_textgroup_default:: |
protected | function | Add source string to the locale tables for translation. | |
i18n_string_textgroup_default:: |
protected static | function | Check if string is ok for translation | |
i18n_string_textgroup_default:: |
protected static | function | Filter array of strings | |
i18n_string_textgroup_default:: |
protected static | function | Build query for i18n_string table | |
i18n_string_textgroup_default:: |
public | function | Remove string object. | 1 |
i18n_string_textgroup_default:: |
protected | function | Translate string object | |
i18n_string_textgroup_default:: |
public | function | Update / create / remove string. | 1 |
i18n_string_textgroup_default:: |
public | function | Recheck strings after update | |
i18n_string_textgroup_default:: |
function | Update string translation, only if source exists. | ||
i18n_string_textgroup_default:: |
public | function | Class constructor. | 1 |
language_hierarchy_i18n_string_textgroup_default:: |
public static | function |
Load translation from db Overrides i18n_string_textgroup_default:: |
|
language_hierarchy_i18n_string_textgroup_default:: |
protected | function |
Load multiple translations from db Overrides i18n_string_textgroup_default:: |