【问题标题】:Text in helper won't translate助手中的文本不会翻译
【发布时间】:2021-03-31 00:10:15
【问题描述】:

所以问题来了: 比方说,我有邮件。里面的文字已完全翻译,一切都很好。可能看起来像这样(我们在这个项目中使用 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 文件之间没有区别。

我已经用了快两天了,我真的不明白这里有什么诀窍。

【问题讨论】:

    标签: ruby-on-rails ruby rails-i18n slim-lang


    【解决方案1】:

    当你说:

    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
    

    【讨论】:

      【解决方案2】:

      不久前我这样做的方法是使用模板文件并加载它。

      # 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
      

      【讨论】:

        猜你喜欢
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-21
        相关资源
        最近更新 更多