Drupal 6: Зачем использовать токены! В t ()? - PullRequest
3 голосов
/ 23 августа 2009

Я читаю Pro Drupal Development, второе издание . Это говорит о том, что необходимо следующее:

t("Your favorite color is !color", array('!color' => "$color"));

Но это также говорит о том, что! заполнитель означает, что в строке не будет выполнено преобразование. Так почему бы просто:

t("Your favorite color is $color");

Спасибо.

Ответы [ 2 ]

12 голосов
/ 23 августа 2009

t () используется для поиска перевода вложенной строки. Если у вас есть переменное содержимое непосредственно в этой строке ($ color в вашем примере), поиск перевода не удастся для любого нового содержимого, обнаруженного и еще не переведенного. Заполнители позволяют переводчикам переводить только фиксированную часть строки и по-прежнему позволяют вводить переменное содержимое.

Модификаторы '!', '%', '@' Просто дают вам больше контроля над как вставка происходит, с помощью '!' это означает, что строка будет вставлена ​​как есть.

Самый очевидный пример будет с числами:

Если у вас есть

t("Number $count");

и вы вызываете его несколько раз с разными номерами, скажем, 1,2,3, каждый раз, когда t () будет искать другой перевод для другой строки :

  1. т («Номер 1»)
  2. т ('Номер 2')
  3. т ('Номер 3')

, тогда как с

t('Number !count', array('!count' => $count);

он будет искать только один перевод , вставляя в него число "как есть"!

Дополнительным преимуществом является то, что переводчик может поместить заполнитель в другую позицию, которая соответствует использованию целевого языка, предоставив, например, '! считать все' как строку перевода. В приведенном выше примере это приведет к:

  1. '1 что угодно'
  2. '2 независимо'
  3. '3 что угодно'

Использование '%' окружит заполнитель тегами <em> для выделения, '@' пропустит его через check_plain(), чтобы избежать разметки.

0 голосов
/ 17 декабря 2009

Первый аргумент t() является литеральной строкой; вызов функции как t("Your favorite color is $color") не передает функции буквальную строку, и скрипт для извлечения строк для перевода не сможет извлечь строку для перевода. На самом деле сценарий извлечения извлекает "Your favorite color is $color" (чтобы заметить, что переменная не была заменена в строке), но это не та строка, которая во время выполнения будет передана в t().

...