微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

助手中的文本不会翻译

如何解决助手中的文本不会翻译

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。