Перший аргумент t()
повинен бути буквальним рядком, який виключає:
- змінні, навіть параметри функції:
t($description)
- об'єднання рядків:
t('If you want to add a link, click on' . '<a href="http://example.com">this link</a>.')
- значення, повернене з функції:
t(get_menu_description())
- постійна:
t(MYMODULE_MY_WIDGET_TITLE)
,t(MyClass::WIDGET_TITLE)
Причина полягає в тому, що, крім кілька спеціальних гачків (наприклад hook_menu()
, hook_perm()
, hook_permission()
), рядки для перекладу знайдена зі сценарію , який сканує код модуля, шукає код , такі як t('This is an example.')
; коли він знаходить значення, яке залежить від часу виконання, наприклад, значення змінної, скрипт не в змозі зрозуміти, що є рядком, який потрібно перекласти, оскільки змінна може містити інше значення кожного разу, коли код виконуватиметься. Насправді, http://localize.drupal.org повідомляє про попередження, подібне до наступного, якщо аргумент t()
не є буквальним рядком:
Перший параметр, який t()
має бути буквальним рядком. Там не повинно бути змінних, конкатенацій, констант чи інших нелітеральних рядків. В t($filter['name'])
у customfilter / customfilter.module по рядку 30.
Якщо ви передаєте динамічне значення t()
, сценарій, який витягує рядки для перекладу, не вилучає жодного значення; ефект - аргумент, переданий t()
не буде перекладений, що має той самий ефект від використання t()
та використання динамічного виводу безпосередньо в інтерфейсі користувача. Єдиний випадок, для якого рядок буде переведено, це коли динамічна рядок дорівнює буквальному рядку, до якого переходить функція t()
. Припустимо, наприклад, що у вас немає бібліотеки для Drupal, яка містить функцію, що повертає назву поточного місяця. За допомогою наступного коду значення, повернене з цієї функції, буде переведено.
function mymodule_calendar_page_title() {
return t(Calendar::getCurrentMonth());
}
function mymodule_calendar_translations() {
$translations = array(
t('January'),
t('February'),
t('March'),
t('April'),
t('May'),
t('June'),
t('July'),
t('August'),
t('September'),
t('October'),
t('November'),
t('December'),
);
}
mymodule_calendar_translations()
не потрібно викликати і не повертати жодного значення. Коли код модуля буде проаналізований, виклик до t()
знайдеться з коду, який шукає буквальні рядки, передані в t()
.
Переклад опису, поданого для таблиці бази даних та її полів, тоді не є тим, що ви повинні робити, як це не робить жоден з основних модулів Drupal; наприклад, node_schema () містить такий код:
function node_schema() {
$schema['node'] = array(
'description' => 'The base table for nodes.',
'fields' => array(
'nid' => array(
'description' => 'The primary identifier for a node.',
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
),
'vid' => array(
'description' => 'The current {node_revision}.vid version identifier.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
),
// …
);
// …
);
// …
return $schema;
}
Звіт, який спричинив видалення викликів t()
з будь-яких реалізацій ядра Drupal, - hook_schema()
це Видалити t () з усіх описів схем , який був відкритий webchick (співавтор Drupal 7).
У Сегеді ми велику тривалу дискусію про t()
описи схем, і t()
з цих описів слід було вилучити консенсус усіх за столом (хто включав Дріса) . Вони псують речі, тому що t()
недоступно так рано, і люди обговорювали, що ніхто не збирається витрачати час на переклад технічних описів речей, і це не має сенсу, оскільки ми також не перекладаємо коментарі до коду, приклад.
У статті про перетворення модуля Drupal 6 в Drupal 7 є спеціальний параграф: Описи схем більше не перекладаються .