所以问题来了:比方说,我有邮件。里面的文字已经完全翻译好了,一切都很好。也许它看起来是这样的(我们在这个项目中使用SLIM(:
= t('foo.bar')
= t('foo.bar')
= t('foo.bar')
= thank_you_signature
所以这个thank_you_signature
是来自ApplicationMailerHelper
的辅助方法。很简单:
def thank_you_signature
SIGNATURE_TEMPLATE.render(self)
end
SIGNATURE_TEMPLATE = Slim::Template.from_heredoc <<-SLIM
p.foo.bar #{I18n.t('helpers.mailers.foo')}
foo.bar #{I18n.t('helpers.mailers.bar')}
SLIM
这就是它的样子。问题是,它没有翻译这个= thank_you_signature
。我有两个地方,RU和EN。两者都有,但在我的邮件中,即使所有的文本都是英文的(因为我选择我的地区作为用户(,这部分仍然是俄文的。
当然,我检查的第一件事是yml文件,但一切似乎都很好,ru.yml
和en.yml
文件之间没有区别。
我已经做了将近两天了,我真的不明白这里有什么诀窍。
当你说:
SIGNATURE_TEMPLATE = Slim::Template.from_heredoc <<-SLIM
p.foo.bar #{I18n.t('helpers.mailers.foo')}
foo.bar #{I18n.t('helpers.mailers.bar')}
SLIM
#{...}
字符串插值是Ruby在评估heredoc时完成的,所以Slim::Template
只看到这样的字符串:
p.foo.bar return-value-from-I18n.t...
foo.bar return-value-from-I18n.t...
并且CCD_ 8调用将使用默认语言环境(可能是美国英语(。
您希望Slim处理字符串插值,以便在渲染模板时(即,当区域设置为您希望的值时(进行I18n.t
调用。要做到这一点,您需要将#{...}
字符串插值转义为#{...}
:,使其通过heredoc
SIGNATURE_TEMPLATE = Slim::Template.from_heredoc <<-SLIM
p.foo.bar #{I18n.t('helpers.mailers.foo')}
foo.bar #{I18n.t('helpers.mailers.bar')}
SLIM
我以前做这件事的方式是使用模板文件并加载它。
# app/templates/signature_template.slim
h1
= I18n.t 'some_key'
# app/helpers/signature_helper.rb
def signature_template
path = Rails.root.join('app/templates/signature_template.slim')
Slim::Template.new(path).render(Object.new)
end