Должен ли я использовать t () в описании hook_menu?

11

Я всегда использовал t () для заголовка и описания hook_menus следующим образом:

$items['some-path'] = array(
    'title' => t('My Page Title'),
    'description' => t('This is a description about what my page is for'),
    'page callback' => 'profile_user_page',
);

Это имеет смысл для меня, поэтому пользователи могут переводить заголовок и описание на разные языки, если это необходимо.

Однако этот комментарий к обзору модуля на DO говорит:

Нет, это неправильно, не делайте этого - описания в hook_menu () никогда не должны использовать t ().

В чем причина этого и действительно ли это лучшая практика?

Кроме того, если это так, то не должны ли мы использовать t () для заголовка?

Феликс Ева
источник
Ясно, что это не должно использоваться тогда, но если вы ищете на странице справки hook_menu «description» => t («есть 6 случаев, так что очевидно, что это распространенная ошибка!
Феликс Ева
1
Обычное или нет, это не оправдание;) И эти случаи есть в комментариях - люди могут ошибаться там.
Молот
1
@ Mołot Они могут ошибаться, но многие новые пользователи будут копировать и вставлять этот код, так что это будет распространенной ошибкой. Я думаю, что кто-то с правами администратора на DO должен отредактировать эти комментарии, чтобы удалить t ().
Феликс Ева
Вы можете подать вопрос, если хотите.
Молот
1
Хорошее предложение. Готово .
Феликс Ева

Ответы:

17

См. Строки в известных местах: встроенные меню, разрешения, сообщения журнала и документация сообщества .info-файлов :

Система меню Drupal 6 и 7 хранит названия и описания пунктов меню на английском языке. Это позволяет системе кэшировать данные, но отображать их пользователям по запросу на разных языках. Чтобы это работало, вы не должны использовать t () в заголовке или описании пунктов меню в вашей реализации hook_menu (). Кроме того, вы должны попытаться использовать буквальную строку (а не динамическую строку) для этих двух ключей, чтобы экстрактор шаблона перевода мог найти использованную вами строку.

Акцент мой.

МОЛОТ
источник
Я бы добавил: Только если title callbackне установлено, потому что по умолчанию title callbackэто t()функция
milkovsky
1
@milkovsky, если установлен обратный вызов заголовка, он должен позаботиться о t()вас, и вы все равно не должны использовать его в hook menu()кешировании.
Молот
11

Если вы видите документацию по аргументам hook_menu ..

  • "название": обязательно. Непереведенный заголовок пункта меню.
  • «обратный вызов заголовка»: функция для создания заголовка; по умолчанию t (). Если вам требуется выводить только необработанную строку, установите для этого параметра значение FALSE.
  • «аргументы заголовка»: Аргументы для отправки в t () или в ваш пользовательский обратный вызов с подстановкой компонента пути, как описано выше.
  • «описание»: непереведенное описание пункта меню.

По умолчанию заголовок обратного вызова является функцией t .. Так что он всегда переводится ..

Анил Сагар
источник
7

Так как Drupal 6 больше не нужен.

Пожалуйста, прочитайте https://drupal.org/node/140311 . Цитируя это:

Начиная с 6.x, Drupal внутренне обрабатывает перевод названий и описаний меню на местный язык пользователя. Описания, если они есть, всегда переводятся с помощью t (); нет никакой возможности передать дополнительные данные для замены заполнителей (в D5 и ранее передача замен была нежелательной практикой - с этим изменением система меню непосредственно применяет это правило). По умолчанию заголовки переводятся с помощью t (), но замена строки в стиле t () возможна благодаря использованию нового свойства аргументов заголовка. Вы также можете заменить t () своим собственным обратным вызовом.

penyaskito
источник
6

Вы не должны использовать t()в hook_menu()реализациях, потому что t()позже вызывается автоматически, и это приведет к двойному переводу.

Арам Бояджян
источник
* Обратите внимание, что если вы добавляете a title callbackв hook_menu, а если нет t, обратный вызов заголовка отвечает за перевод строки.
АйешК
0

Это ясно говорит на странице документации для hook_menu () т.е.

https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_menu/7.x

"название": обязательно. Непереведенный заголовок пункта меню.

«описание»: непереведенное описание пункта меню.

Так что нет необходимости использовать функцию t () для обоих выше.

webdevfreak
источник