Rails 3 i18n如何*不*逃避换行

时间:2012-06-27 20:37:23

标签: ruby-on-rails internationalization haml

我在我的.text.haml邮件程序模板中使用了i18n,我希望在en.yml中有一个带换行符的字符串但是t()总是转义它们,即使我使用html_safe或后缀为key name _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

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

顺便说一句,我检查过它是i18n逃避,而不是haml。

5 个答案:

答案 0 :(得分:9)

你可以这样做:

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

答案 1 :(得分:4)

这里有几个选项: 如上所述,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

答案 2 :(得分:1)

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

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

然后在模板中我制作.html_safe

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

答案 3 :(得分:0)

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')的相对/绝对命名调整为您应用的命名。

希望这有帮助!

答案 4 :(得分:0)

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

en.yml

long_text: |
  Lorem ipsum dolor sit amet.

  Consectetur adipisicing elit.

应用程序/视图/样品/ file.html.erb

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

请参阅:http://apidock.com/rails/ActionView/Helpers/TextHelper/simple_format