【问题标题】:Rails 3 i18n how to *not* escape newlinesRails 3 i18n 如何*不*转义换行符
【发布时间】:2012-06-27 20:37:23
【问题描述】:

我在我的 .text.haml 邮件模板中使用 i18n,我希望在 en.yml 中有一个带有换行符的字符串,但即使我使用 html_safe 或在键名后加上_html。

有没有办法做到这一点?

p3_html: >
    You love monkeys:
     \n- You look like one
     \n- Your smell like one
     \n- Your account has been flagged

在我的 html.haml 模板中:

!= t('emails.post.twitter_forbidden.p3_html').html_safe

无论 \n 是什么转义。我不能使用 %br 或其他任何东西,因为这些是文本模板。我知道我可以把它分成 4 个 i18n 字符串,但这真的很可悲。

顺便说一句,我检查了它是 i18n 转义,而不是 haml。

【问题讨论】:

    标签: ruby-on-rails internationalization haml


    【解决方案1】:

    你可以这样做:

    t('emails.post.twitter_forbidden.p3_html').html_safe.gsub("\n", '<br/>')

    据我所知,这是唯一的方法。

    编辑

    其实经过一番挖掘,我找到了simple_format这个助手。

    http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

    【讨论】:

    • 我实际上想要 \n,我只是得到 \\n。您的回答仍然有效。
    • 啊,好吧。我道歉——我误解了。对于可能找到它的任何其他人,我将按原样保留我的答案。
    • 稍微修正一下,应该是t('emails.post.twitter_forbidden.p3_html').gsub("\n", '<br/>').html_safe
    • 谢谢!这个答案非常有帮助,但不得不使用 @RustamA.Gasanov 的建议来撤销 gsubhtml_safe 调用。
    • 嘿,我想知道是否有人找到了一个解决方案来完全保留 \n 字符而不转义它们。我不想用<br/>\\n 标签替换它们。谢谢。
    【解决方案2】:

    这里有几个选项: 如上所述,simple_format 会有所帮助。 像这样格式化你的 yml 文件:

        p3_html: |
          Some text:
          - Point 1
          - Point 2
          - Point 3
    

    然后使用

       =simple_format t(:p3_html)
    

    这会给你类似的东西

        <p>Some text
          <br>
          - Point 1
          <br>
          - Point 2
          <br>
          - Point 3
        </p>
    

    或者,如果您希望每行一个新段落:

        p3_html: |
          Some text:
    
          - Point 1
    
          - Point 2
    
          - Point 3
    

    这应该给你这个:

        <p>Some text</p>
        <p>- Point 1</p>
        <p>- Point 2</p>
        <p>- Point 3</p>
    

    或者类似的东西更灵活

        <% t(:p3_html).each_line do |line| %>
          <li>= |line|</li>
        <% end %>
    

    使您能够输入不同的格式:

        <li>- Point 1</li>
        <li>- Point 2</li>
        <li>- Point 3</li>
    

    最后的选择是在 yaml 中使用数组:

          p3_html: 
            - Some text:
            - - Point 1
            - - Point 2
            - - Point 3
    
        <% t(:p3_html).each do |line| %>
          <p>= |line|</p>
        <% end %>
    

    可能更干净,虽然我认为它会用逗号玩得很开心,并且上述版本的优点是您可以在格式之间切换而无需修改您的 yaml

    【讨论】:

      【解决方案3】:

      我最终只在这样的语言环境文件中使用标签:

      a:
        b: "Some <br /> thing"
      

      然后在模板中我将它们设为.html_safe:

      <%= t('a.b').html_safe %>
      

      【讨论】:

        【解决方案4】:

        I18n 只使用 yaml,而 yaml 可以有数组。 :-)

        所以我会探索使用这样的选项。

        在您的 yaml 文件中,您将有一个名为 p3_html 的密钥

        # http://en.wikipedia.org/wiki/YAML#Lists_of_associative_arrays
        p3_html:
        - some text
        - some more text
        - some more more text
        

        然后在您的 haml 视图中,您将拥有以下 HAML 代码:

        = t('p3_html').each do |x| 
          %p= x
        

        如果您愿意,也可以放在一行中

        = t('p3_html').each {|x| haml_tag :p, x }
        

        还请记住,如果您将其移至帮助程序中,您可能必须在您的 ruby​​ 变量前面使用 haml_concat 帮助程序。我不确定。

        您还必须将翻译 yaml 变量 t('p3_html') 的相对/绝对命名调整为应用的命名。

        希望这会有所帮助!

        【讨论】:

          【解决方案5】:

          很简单,只需执行此操作即可将文本换行:

          en.yml

          long_text: |
            Lorem ipsum dolor sit amet.
          
            Consectetur adipisicing elit.
          

          app/views/sample/file.html.erb

          <%= simple_format t(:'long_text') %>
          

          见:http://apidock.com/rails/ActionView/Helpers/TextHelper/simple_format

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多