Rails I18n вложенных ключей перевода - PullRequest
5 голосов
/ 22 июля 2011

Есть ли способ вложить переводы поиска?Примерно так:

en:
  uh_oh: 'Uh Oh!'
  error1: :'uh_oh' + ' There was a big error!'
  error2: :'uh_oh' + ' There was another big error!'
I18n.t('error1') #=> 'Uh Oh! There was a big error!'
I18n.t('error2') #=> 'Uh Oh! There was another big error!'

Я пробовал несколько вариантов этого, а также пробовал использовать файл перевода Ruby вместо YAML.Обратите внимание, что работает :

en:
  uh_oh: 'Uh Oh!'
  error1: :'uh_oh'
I18n.t('error1') #=> 'Uh Oh!'

Но если я добавлю дополнительный текст к error1, uh_oh не будет переведен.

По сути, я хочу избежать необходимости всегда передавать общие термины, например:

en:
  uh_oh: 'Uh Oh!'
  error1: '%{uh_oh} There was a big error!'
I18n.t('error1', {uh_oh: I18n.t('uh_oh')})

Для общих терминов, таких как uh_oh, интерполяция одинакова для каждого вызова error1 (илюбой другой ключ, который использует uh_oh), поэтому не имеет смысла передавать строку для интерполяции.Вместо этого было бы проще сделать следующее, и перевод error1 позаботится о переводе общего ключа:

I18n.t('error1')

Ответы [ 2 ]

4 голосов
/ 23 июля 2011

Я не собираюсь отвечать на ваш вопрос (я не думаю, что это возможно с гемом i18n, но могу ошибаться). Я собираюсь сказать, что вы не должны использовать этот подход и дать вам ссылку [1] в качестве фона. Как разработчики, естественно видеть шаблоны и извлекать общий код, чтобы сохранить СУХОЕ состояние. Это слишком далеко при работе с несколькими языками, так как это мешает правильному переводу. Не все языки следуют той же структуре предложений, что и английский, и то, что вы заменяете, может измениться, чтобы соответствовать остальной части предложения.

На сайте, над которым я работаю, есть проблема с французским. У нас есть предложения, которые включают название места, и это просто на английском языке. Свойство "% {location_name}" работает независимо от имени местоположения. Однако на французском языке вам нужны разные структуры в зависимости от того, является ли это место городом, провинцией, регионом и начинается ли имя с гласной или нет.

[1] http://www.multilingual.com/articleDetail.php?id=594

0 голосов
/ 16 июня 2016

Причина, по которой вы можете выполнить подстановку "I18n.t ('error1')" самостоятельно, потому что это особый случай, когда I18n вызывает "символическую ссылку".

Это не будет делать ничего, кромеодна полная замена, к сожалению.

Я вижу два решения этой проблемы.Первый - постобработка вывода I18n, что может быть затруднительно, если у вас нет полного контроля над вызовом I18n и может быть распределено потребление переведенных сообщений (например, в Rails).Лучше всего было бы переопределить функцию I18n.t.

Другой вариант - воспользоваться возможностью хранить лямбду в бэкэнде I18n.К сожалению, это означает, что вы не можете сохранить комбинированный перевод в файле YAML, поскольку он поддерживает только базовые строки.

Например, в переводе YAML у нас может быть любое из сообщений об ошибках:

en:
  error:  "There was a big error [%{arg}]!"

И теперь мы хотим назвать это с переводом uh_oh перед ним.Нам нужно сохранить комбинированный перевод с uh_oh в бэкэнд I18n:

translam = lambda { |key,opts| "Uh Oh! #{I18n.t(opts[:for],opts)}" }
I18n.backend.store_translations(:en,:uh_oh => translam)

Теперь мы можем перевести «uh_oh» и дать ему ошибку, которую мы хотим перевести, плюс любые аргументы, которые могут понадобиться:

I18n.t(:uh_oh, for: :error, arg: 42))  #=> 'Uh Oh! There was a big error [42]!'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...