I18n: В чем разница между использованием 't (: test_key)', 't (' test_key ')' и 't ('. Test_key ')'? - PullRequest
2 голосов
/ 07 января 2012

Я использую Ruby on Rails 3.1, и я хотел бы знать как , , когда и почему При интернационализации моего приложения я должен использовать один из следующих кодов, а не другой ( I18n gem ):

t(:test_key)
t('test_key')
t('.test_key')

То есть, в чем "тонкая" разница между использованием t(:test_key), t('test_key') и t('.test_key')? Каковы лучшие практики по этому вопросу?

Ответы [ 2 ]

4 голосов
/ 07 января 2012

Я думаю, что первые два эквивалентны, и вы просто ссылаетесь на основной ключ в своих переводах, например,

t('hello_world') 
# t(:hello_world) is an equivalent

будет означать

en:
  hello_world: "Hello world"

Однако, если вы используете точечную нотацию,это называется ленивый поиск, и он будет смотреться глубже в вашей структуре перевода, основываясь на нотации контроллера / действия

Так что, если вы используете это внутри шаблона пользователя / индекса

t('.hello_world')

, оно будет преобразовано в

pl:
  users:
    index:
      hello_world: "Witaj świecie"

Подробнее об интернализации вы найдете в Rails Guides

1 голос
/ 07 января 2012

Полагаю, вам решать, когда вы на самом деле хотите использовать разные, но я предпочел бы использовать как можно более ленивый поиск в моих представлениях, если только вам не нужно переводить какой-то общий компонент, ключи которогоне подходит для вашей области видимости.

Причина, по которой я предпочитаю ленивый поиск, заключается в том, что он делает код более чистым, и пока вы знакомы с тем, как работает гем i18n,у вас не должно возникнуть никаких проблем, зная, где искать ключи.

С другой стороны, если у вас есть такие компоненты, они действительно должны жить в частичном, ячейке или чем-то ещеАналогично.

Одна вещь, о которой стоит упомянуть, не ленивые, это то, что вы можете предоставить им область, в которой можно найти ключ, о котором идет речь.Опять же, вам решать, хотите ли вы t('foo.bar.baz.test_key') или t(:test_key, :scope => 'foo.bar.baz').

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

...