Как вы, наверное, знаете, начиная с Rails 2.2, Rails поставляется с простой локализацией и интернационализацией.Rails и I18n: локализованные шаблоны против локализованной строки
По умолчанию вы можете сохранить строки, необходимые для перевода в файлы локализации в папке config
.
config/locales/en.yml
config/locales/it.yml
Но Rails предоставляет возможность локализовать шаблоны и частичные файлы. Например, действие индекса MainController # может выбирать локализованный шаблон в соответствии с именем файла шаблона и текущими настройками локали.
apps/views/main/index.it.html.erb
apps/views/main/index.en.html.erb
Первая функция полезна, когда вам нужно перевести отдельные строки или короткие абзацы. Последнее является хорошим выбором, когда одно и то же действие проявляется по-разному в соответствии с текущим значением локали.
Но как вы относитесь к справедливым простым шаблонам, которые используют одну и ту же бизнес-логику, но содержат большое количество текста? Возьмем, к примеру, следующий шаблон
<% javascript_content_for :head do %>
$(function() {
$("#choices :radio").change(function() {
$(".choice-wizard").hide();
$("#" + $(this).val()).show();
});
});
<% end %>
<h1><%= title t(".title") %></h1>
<div class="widget">
<div class="entry form">
<h2><%= title t(".header_choices") %></h1>
<% form_tag "#", :id => "choices" do %>
<p>
<%= radio_button_tag :choice, "with" %>
<%= label_tag "choice_with", "..." %>
</p>
<p>
<%= radio_button_tag :choice, "without" %>
<%= label_tag "choice_without", "..." %>
</p>
<% end %>
<div id="with" class="choice-wizard" style="display: none;">
<!-- to be localized -->
<h3>....</h3>
<p>a long paragraph</p>
<p>a long paragraph</p>
<p class="textcentered">
<%= link_to "Continue", new_path, :class => "button" %>
</p>
<!--/to be localized -->
</div>
<div id="without" class="choice-wizard" style="display: none;">
<!-- to be localized -->
<h3>....</h3>
<p>a long paragraph</p>
<p>a long paragraph</p>
<p class="textcentered">
<%= link_to "Continue", new_path, :class => "button" %>
</p>
<!--/to be localized -->
</div>
</div>
</div>
<% sidebar do %>
<%= render :partial => "sidebar/user" %>
<% end %>
Здесь у меня есть форма, содержимое JavaScript и небольшое количество текста. Мне нужно перевести текст, но:
- текст слишком длинный для создания простой строки в файле .yml, и я не хочу, чтобы в конечном итоге создание O (N) строк, по одному для каждого пункта
- шаблон содержит некоторые «функции», и я не хочу создавать 5 шаблонов, по одному для каждого языка, потому что это упростит работу приложения.
Как вы бы описали код?
Я часто использую локализованные частичные части. Недостатком этого подхода является то, что только для этого действия я получаю ((1 вид) + (5 * 2 partials = 10)) = 11 файлов. : S –
Я вижу проблему с этим, но я не придумываю решение, которое не приводит к X * L фрагментам данных (X - количество переведенных компонентов, L - количество предлагаемых языковых переводов ,) Вы могли бы использовать метод «yield: named_content» в сочетании с L частицами, каждый из которых состоит из блоков X 'content_for', но это похоже на то, что мы боимся одной проблемой в решении для другого. –