Чи завжди погано передавати змінну через t ()?


13

У мене є маленька допоміжна функція для моєї куки_схеми:

function _bbcmap_schema_asr_field($description) {
  return array(
    'type' => 'int',
    'unsigned' => TRUE,
    'size' => 'small', // Up to ~66k with MySQL (equivalent up to ~660.00 adjusted)
    'not null' => FALSE,
    'description' => t($description),
  );
}

І тоді я можу використовувати це щось на кшталт:

/**
 * Implements hook_schema().
 */
function bbcmap_schema() {
  $schema['la_data'] = array(
    'fields' => array(
      ...
      'mort_asr_male' =>    _bbcmap_schema_asr_field('The age standardised mortality amongst men (fixed point with scale factor 1/100)'),
      'mort_asr_female' =>  _bbcmap_schema_asr_field('The age standardised mortality amongst women (fixed point with scale factor 1/100)'),
      'incid_asr_male' =>   _bbcmap_schema_asr_field('The age standardised incidence amongst men (fixed point with scale factor 1/100)'),
      'incid_asr_female' => _bbcmap_schema_asr_field('The age standardised incidence amongst women (fixed point with scale factor 1/100)'),
      ...
    ),
  );
}

Я знаю, що керівництво не полягає у передачі змінних, t()але це здається дуже схожим на те, як система меню передає заголовок зворотного виклику t()(за замовчуванням). Будь-які коментарі щодо хорошого чи поганого стилю?

Відповіді:


17

Перший аргумент 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 є спеціальний параграф: Описи схем більше не перекладаються .


2
Більш детальна інформація про використання т () в установці / поновлення гаків: drupal.org/node/322731
AyeshK

2

Вони є незмінними струнами, тому їх добре пропустити t(). Існує деякий капітальний ремонт системи t () для таких речей, але я не впевнений, що це станеться у D8.

Наразі це погано, якщо ви передасте щось на зразок, t($count . ' books')де $countможна взяти будь-яке значення, оскільки це створить занадто багато рядків для перекладу.


-1

Однак можливо використовувати t () навколо змінної, і вона може працювати. Я зробив це з $ title у page.tpl.php.

EDIT: Можливо, рядки не перекладаються, але їх можна використовувати для переопределення рядків.


1
Дивіться відповідь kiamlaluno, чому це погана ідея.
Енді

Відповідь kiamlaluno, здається, говорить про те, що рядок не буде перекладено. Але інше використання для t () полягає в тому, щоб увімкнути зміни строків. Я можу підтвердити, що це працює зі змінними.
naomi

1
@naomi Так, це спрацює. Але якщо у вас включені переклади, усі заголовки, передані через t (), опиняться у списку рядків перекладу. Не слід використовувати переопределення рядків для зміни назв вузлів IMO. Створіть поле та змініть заголовок вузла на значення поля в гачку_препроцес_нод або на сторінці. (Ви також можете використовувати kuk_node_load або будь-який пов'язаний гачок теж)
АйешК
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.