6

有没有一种更简洁的 content_tag-ish 方式来做到这一点?(我不想在我的 YML 中使用 HTML)

en.yml:

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

布局.html.erb:

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

2 回答 2

3

不,没有更清洁的方法来处理这个问题。如果您想url从字符串中拉出,那么您将无法将句子分成四部分:

  1. "Go.
  2. <a href="{{url}}">...</a>
  3. 'here'
  4. 'for expert security advice.'

这四个部分很容易用英语重新组合在一起,但是在其他语言中顺序可能会改变,这可能会改变这里的大小写并导致其他问题。为了让它正确,你必须像这样构造一些东西:

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 问题上走捷径,它们总是会让你误入歧途并导致问题:非 DRY 代码(WET 代码?)总是比损坏的代码好。


顺便说一句,我建议您放弃标准的 Rails I18N 字符串处理工具,转而使用gettext,让所有内容与 gettext 保持同步更容易,并且代码最终更容易阅读。

于 2012-09-08T20:51:24.040 回答
3

我能想到的最好的:

en.yml:

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

布局.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
于 2012-09-08T23:16:46.620 回答