Como usted probablemente sabe, a partir de Rails 2.2, rieles se envía con una localización sencilla y backend de internacionalización.rieles y I18n: localizada plantillas vs cadena localizada
Por defecto, puede almacenar las cadenas que hay que traducir en los archivos de localización dentro de la carpeta config
.
config/locales/en.yml
config/locales/it.yml
Pero Rails proporciona la capacidad de localizar plantillas y parciales también. Por ejemplo, la acción de índice MainController # puede seleccionar una plantilla localizada de acuerdo con el nombre de archivo de la plantilla y la configuración de configuración regional actual.
apps/views/main/index.it.html.erb
apps/views/main/index.en.html.erb
La primera característica es útil cuando necesita traducir cadenas sueltas o párrafos cortos. Esta última es una buena opción cuando la misma acción se representa de diferentes maneras de acuerdo con el valor local actual.
Pero, ¿cómo lidiar con plantillas simples justas que comparten la misma lógica de negocio, pero contiene una gran cantidad de texto? Tomemos por ejemplo la siguiente plantilla
<% 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 %>
Aquí tengo un formulario, un contenido de JavaScript y una pequeña cantidad de texto. Necesito traducir el texto, sino:
- el texto es demasiado largo para la creación de una cadena simple en el archivo .yml y no quiere terminar la creación de O (n) las cadenas, una para cada párrafo
- la plantilla contiene algunas "características" y no quiero crear 5 plantilla, uno para cada idioma, ya que hará que la aplicación más difícil de mantener.
¿Cómo organizaría el código?
estoy usando parciales localizadas muy a menudo. La desventaja de este enfoque es que, solo para esta acción, terminaré con ((1 vista) + (5 * 2 parciales = 10)) = 11 archivos. : S –
Puedo ver el problema con eso, pero no se me ocurre una solución que no dé como resultado datos X * L (X es la cantidad de componentes traducidos, L es la cantidad de traducciones de idiomas ofrecidas .) Es posible que pueda utilizar el método 'yield: named_content' junto con los parciales L, cada uno compuesto por X bloques' content_for', pero parece que estamos preocupados por una solución para otra. –