助手中的文本不会翻译
Text in helper won't translate
问题来了:
比方说,我有邮件。里面的文字是完全翻译的,一切都很好。可能看起来像这样(我们在这个项目上使用 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
文件之间没有区别。
我已经用了快两天了,我真的不明白这里有什么技巧。
前阵子我这样做的方法是使用模板文件并加载它。
# 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
当你说:
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
问题来了: 比方说,我有邮件。里面的文字是完全翻译的,一切都很好。可能看起来像这样(我们在这个项目上使用 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
文件之间没有区别。
我已经用了快两天了,我真的不明白这里有什么技巧。
前阵子我这样做的方法是使用模板文件并加载它。
# 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
当你说:
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