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
из строки, то вы застряли, разбивая предложение на четыре части:
-
"Go
. <a href="{{url}}">...</a>
'here'
'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 намного проще, и код в конечном итоге гораздо легче читать.