2009-11-26 14 views
5

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:

  1. 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
  2. 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?

Respuesta

7

En Rails (al menos la versión 2.3.4), los parciales respetan las mismas configuraciones de internacionalización que las vistas y las plantillas, por lo que lo que se puede hacer es poner sus grandes cuerpos de texto en parciales que se traducen, manteniendo sus características en la vista original. Para las etiquetas y el texto 'más pequeño', se puede usar el método de traducción t (...) como sugirió. Por lo tanto, para funcionar con su ejemplo concreto:

# 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> 
... 

Y así sucesivamente. Mis disculpas a Suecia.

Otra posibilidad para ir con mi comentario a continuación:

# 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 %> 
... 

Y así sucesivamente para cada idioma que apoyas. Como mencioné en el comentario que inspiró esto, el enfoque esbozado aquí parece que estamos buscando una solución para un problema, seccionando el marcado compartido (en forma de navegación del sitio, barras laterales, etc.) en una solución para otro problema, grandes cuerpos de texto traducido. Parece un poco poco convencional usar content_for/yield de esta manera, pero puede ser una solución aceptable para su problema.

+0

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 –

+0

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. –

Cuestiones relacionadas