Должен ли я использовать 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 () своим собственным обратным вызовом.


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 () для обоих выше.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.