6

これを行うためのよりクリーンで content_tag っぽい方法はありますか? (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、文を 4 つの部分に分割する必要があります。

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

これらの 4 つの部分は、英語では簡単に元に戻すことができますが、他の言語では順序が変わる可能性があり、ここの大文字と小文字が変更され、他の問題が発生する可能性があります。それを正しく行うには、次のように構造化する必要があります。

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

YAML 内の 2 つの別個の文字列:

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

また、これら 2 つのテキストが一緒に使用されることを翻訳者に伝える必要があります。

そのようなものがあなたにとってよりきれいに思えるなら、それを選んでください。しかし、翻訳が必要なテキスト内の小さな HTML については心配しません。話し合う価値のある翻訳者なら誰でもそれを処理できます。I18N/L10N の問題で近道をしようとしないでください。それらは常に道に迷い、問題を引き起こします: 非 DRY コード (WET コード?) は常に壊れたコードよりも優れています。


余談ですが、 gettext を優先して標準の Rails I18N 文字列処理ツールを削除することをお勧めします。すべてを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 に答える