Rails I18n:更好的内插链接方式?

时间:2012-09-08 20:26:50

标签: ruby-on-rails internationalization dry

是否有更清洁,content_tag-ish方式? (我不想在我的YML中使用HTML)

en.yml:

expert_security_advice: "Go <a href='{{url}}'>here</a> for expert security advice."

layout.html.erb:

<%= t(:expert_security_advice, :url => "http://www.getsafeonline.org") %>

2 个答案:

答案 0 :(得分:3)

不,没有更简洁的方法来解决这个问题。如果你想从字符串中拉出url那么你就会把句子分成四部分:

  1. "Go
  2. <a href="{{url}}">...</a>
  3. 'here'
  4. 'for expert security advice.'
  5. 这四个部分很容易用英语重新组合,但订单可能会在其他语言中发生变化,这可能会改变此处的大写并导致其他问题。要做到正确,你必须构建这样的事情:

    here        = "<a href=\"#{url}\">#{t(:expert_security_advice_here)}</a>"
    whole_thing = t(:expert_security_advice, :here => here)
    

    和YAML中的两个单独的字符串:

    expert_security_advice_here: "here"
    expert_security_advice: "Go {{here}} for expert security advice."
    

    你还必须告诉译者这两段文字是一起的。

    如果那种东西对你来说似乎更干净,那就去吧,但我不会担心需要翻译的文本中的一小部分HTML,任何值得交谈的翻译都能够处理它。永远不要尝试使用I18N / L10N问题的快捷方式,它们总会让你误入歧途并导致问题:非干代码(WET代码?)总是比破坏代码更好。


    顺便说一句,我建议您删除标准的Rails I18N字符串处理工具,而不是gettext,保持与gettext同步的所有内容更容易,代码最终更容易阅读。< / p>

答案 1 :(得分:3)

我能想出的最好的结果:

en.yml:

expert_security_advice: "Go *[here] for expert security advice."

layout.html.erb:

<%= translate_with_link(:expert_security_advice, "http://www.getsafeonline.org") %>

application_helper.rb:

include ActionView::Helpers::TagHelper

def translate_with_link(key, *urls)
  urls.inject(I18n.t(key)) { |s, url|
    s.sub(/\*\[(.+?)\]/, content_tag(:a, $1, :href => url))
  }
end