助手中的文本不会翻译

问题描述

问题来了: 假设,我有邮件。里面的文字是完全翻译的,一切都很好。可能看起来像这样(我们在这个项目中使用 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.ymlen.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...

并且 I18n.t 调用将使用默认语言环境(可能是美国英语)。

您希望 Slim 处理字符串插值,以便在呈现模板时进行 I18n.t 调用(即当语言环境设置为您想要的时)。为此,您需要将 #{...} 字符串插值转义为 \#{...}:

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'
  html = Slim::Template.new(path).render(Object.new)

  html
end