Причина, по которой вы можете выполнить подстановку "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]!'