2009-11-26 1 views
5

Как вы, наверное, знаете, начиная с 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 и небольшое количество текста. Мне нужно перевести текст, но:

  1. текст слишком длинный для создания простой строки в файле .yml, и я не хочу, чтобы в конечном итоге создание O (N) строк, по одному для каждого пункта
  2. шаблон содержит некоторые «функции», и я не хочу создавать 5 шаблонов, по одному для каждого языка, потому что это упростит работу приложения.

Как вы бы описали код?

ответ

7

В Rails (по крайней мере, версия 2.3.4) частично учитывают те же параметры интернационализации, что и представления и шаблоны, поэтому то, что вы можете сделать, - это перевести ваши большие тексты в частичные, сохраняя ваши функции в исходном виде. Для меток и «меньшего» текста с помощью метода перевода t (...) можно использовать, как вы предложили. Итак, чтобы выполнить ваш конкретный пример:

# app/wizards/edit.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 --> 
     <%= render :partial => 'dear_readers' %> 
... 

# app/views/wizards/_dear_readers.en.html.erb 
<h3>A Title</h3> 
... 

# app/views/wizards/_dear_readers.sv.html.erb 
<h3>Bork bork bork!</h3> 
... 

И так далее. Приношу свои извинения Швеции.

Другая возможность пойти с моим комментарием ниже:

# app/views/wizards/edit.html.erb 
<%= render :partial => 'dear_readers' %> 
<% 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 --> 
     <%= yield :paragraph_1 %> 
     <%= yield :paragraph_2 %> 
     ... 

# app/wizards/_dear_readers.en.html.erb 
<% content_for :paragraph_1 %> 
    <h3>Title ...</h3> 
    <p>Content ... </p> 
<% end %> 
<% content_for :paragraph_2 %> 
    ... 
<% end %> 
... 

И так для каждого языка поддержки. Как я уже упоминал в комментарии, который вдохновил на это, описанный здесь подход выглядит так, как будто мы боремся за решение одной проблемы, сушая общую разметку (в виде навигации по сайту, боковые панели и т. Д.), В решение для другая проблема, большие тела переведенного текста. Кажется немного нетрадиционным использовать content_for/yield таким образом, но это может быть приемлемым решением вашей проблемы.

+0

Я часто использую локализованные частичные части. Недостатком этого подхода является то, что только для этого действия я получаю ((1 вид) + (5 * 2 partials = 10)) = 11 файлов. : S –

+0

Я вижу проблему с этим, но я не придумываю решение, которое не приводит к X * L фрагментам данных (X - количество переведенных компонентов, L - количество предлагаемых языковых переводов ,) Вы могли бы использовать метод «yield: named_content» в сочетании с L частицами, каждый из которых состоит из блоков X 'content_for', но это похоже на то, что мы боимся одной проблемой в решении для другого. –

Смежные вопросы