Rails I18n: лучший способ интерполяции ссылок?

есть ли более чистый, content_tag-ish способ сделать это? (Я не хочу HTML в моем YML)

en.в формате YML:

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

макет.формат html.Эрб:

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

2 ответов


лучшее, что я мог придумать:

en.в формате YML:

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

макет.формат html.Эрб:

<%= 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, , :href => url))
  }
end

нет, нет более чистого способа справиться с этим. Если вы хотите вытащить 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, они всегда приведут вас в заблуждение и вызовут проблемы: не сухой код (мокрый код?) всегда лучше, чем сломанный код.


в сторону, я бы рекомендовал вам отказаться от стандартных инструментов обработки строк Rails I18N в пользу gettext, сохраняя все синхронизировано с gettext намного проще, и код в конечном итоге гораздо легче читать.