Способ создания и отображения названий полей и их переводов для разных типов материала.

Главные вкладки

Аватар пользователя univerico univerico 1 июня 2018 в 17:23

Здравствуйте! Пытаюсь разобраться, как работает перевод названий полей, так как очень неудобно переводить названия полей через UI редактирования поля в типе материала, приходится заходить сначала на страницу каждого поля, потом на страницу его перевода, чтобы добавить перевод названия поля.
Хочу настроить возможность делать перевод названий полей.
а)в идеале через drush или просто через консоль
(камень преткновения пока: создается ли отдельная переменная для перевода метки названия поля или используются какие-то дополнения для $label)
Б)если не получится с пунктом (а), то через ui, но более удобным способом, например с помощью импорта переводов строк или модуля типа tmgmt.
Этот топик является расширением для ранее созданных по поиску имени переменной и добавлению полей через drush.
Привожу свои предположения и всю найденную информацию.
Перевод названия полей в Друпал, видимо, делается с помощью i18n, а не Entity Translation, даже без изучения кода это можно предположить, так как при выключенном Entity translation для типа материала или выключении самого модуля интерфейс перевода не меняется.
По самому принципу перевода на сегодняшний день есть предположения
1)сначала создается перевод поля
2)потом при добавлении этого поля в другие типы материала используются "копии" - точнее "occurrences" этого поля на нужном языке.
Второе предположение связано с фразой ("Users may translate all occurrences of this field:" при использовании Entity translation).

Создается ли отдельная переменная для перевода названия поля или нет пока не ясно.
Но хотелось бы точнее разобраться с помощью какого кода и в каких файлах задаются или присваиваются названия полей их переводы для разных типов материала.

Привожу всю информацию из описаний на drupal.org и при использовании некоторых модулей
1) Название метки поля вероятно присваивается переменной $label
(https://drupal.stackexchange.com/questions/110503/drush-field-create-wit...)
2) при использовании feeds и Entity translation при настрйоке соответствий поля на разных языках являются разными самостоятельными пунктами (скриншот)
3)В переводе интерфейса /admin/config/regional/translate/translate при поиске названия поля как строки (по самому названию) оно (название, метка) выводится в спике строк (скриншот)

В целом везде описано что для перевода используется t()
(Например здесь PHP code: still use t() -- with caveats)
В этой же статье говорится о том, что нельзя этим способом переводить переменные "you cannot use variables inside t() calls" (кроме исключений, когда все значения уже переданы t() ранее как литералы, при использовании YML или Twig файлов, при замене текста на строки в режиме реального времени)

// NON-WORKING CODE.
t($variable);
$this->t($prefix . ' something else ' . $suffix);

Translating user-defined strings (module developers)
Старые функции tt() и ts() заменены на i18nstrings() и i18nstrings_update().
Модуль отслеживает строки источники и поджерживает их в обновленном состоянии за счет 'string key' (that is a string with these elements "textgroup:object_type:object_key:property_name".)
Пример 'string keys':
taxonomy:term:12:name
nodetype:type:story:name
Для перевода этих строк модуль сначала вызовет функцию перед отображением их

/**
 * Translate or update user defined string.
 *
 * param $name
 *   Textgroup and location glued with ':'.
 * param $string
 *   String in default language. Default language may or may not be English.
 * param $langcode
 *   Optional language code if different from current request language.
 *
 * return $string
 *   Translated string, $string if not found
 */

function i18nstrings($name, $string, $langcode = NULL) {
   .....
}

Если нужно применять какие-то фильтры, то используется i18nstrings_text()
(For strings that have an input format, you must use the function i18nstrings_text() that takes care of applying the correct filters if there is a translation.)

/**
 * Get filtered translation
 *
 * This function is intended to return translations for strings that have an input format
 *
 * param $name
 *   Full string id
 * param $default
 *   Default string to return if not found, already filtered
 * param $langcode
 *   Optional language code if different from current request language.
 */

function i18nstrings_text($name, $default, $langcode = NULL) {
  ....
}

Многие строки модуль уже отслеживает из коробки, для дополнительных модулей нужно добавить hook_locale()
а при изменении строк используют i18nstrings_update()

Также я вижу, что есть hook_nodeapi_translation_change
Подробнее о нем в описании модуля translation_helpers

Также в этой статье о переводе строк на английском.

ВложениеРазмер
Иконка изображения 2018-06-01_11-19-33.png19.9 КБ
Иконка изображения 2018-06-01_11-22-19.png57.84 КБ
Иконка изображения 2018-06-01_11-24-42.png57.06 КБ