2009-11-26 13 views
5

Come probabilmente sapete, a partire da Rails 2.2, Rails viene fornito con un semplice back-end di localizzazione e internazionalizzazione.Rails e I18n: modelli localizzati vs stringa localizzata

Per impostazione predefinita, è possibile memorizzare le stringhe che è necessario tradurre nei file di localizzazione all'interno della cartella config.

config/locales/en.yml 
config/locales/it.yml 

Ma Rails offre anche la possibilità di localizzare modelli e partial. Ad esempio, l'azione dell'indice MainController # può selezionare un modello localizzato in base al nome file del modello e alle impostazioni locali correnti.

apps/views/main/index.it.html.erb 
apps/views/main/index.en.html.erb 

La prima funzione è utile quando è necessario tradurre stringhe singole o paragrafi brevi. Quest'ultimo è una buona scelta quando la stessa azione esegue il rendering in modi diversi in base al valore della locale corrente.

Ma come si gestiscono modelli semplici e semplici che condividono la stessa logica aziendale ma contengono una grande quantità di testo? Prendiamo ad esempio il modello

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

Qui Ho una forma, un contenuto Javascript e una piccola quantità di testo che segue. Ho bisogno di tradurre il testo, ma:

  1. il testo è troppo lungo per la creazione di una semplice stringa nel file .yml e non voglio finire la creazione di O (n) stringhe, una per ogni paragrafo
  2. il modello contiene alcune "funzionalità" e non voglio creare 5 modelli, uno per ogni lingua, perché renderà l'applicazione più difficile da mantenere.

Come organizzeresti il ​​codice?

risposta

7

In Rails (almeno la versione 2.3.4), i partial rispettano le stesse impostazioni di internazionalizzazione delle viste e dei template, quindi ciò che si potrebbe fare è mettere i vostri grossi corpi di testo in partial che vengono tradotti, mantenendo le vostre caratteristiche nella visualizzazione originale. Per le etichette e il testo "più piccolo", è possibile utilizzare il metodo di traduzione t (...) come suggerito. Quindi, per eseguire il tuo esempio 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> 
... 

E così via. Mi scuso con la Svezia.

Un'altra possibilità per andare con il mio commento qui sotto:

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

E così via per ogni lingua sostenete. Come ho accennato nel commento che ha ispirato questo, l'approccio delineato qui sembra di essere una soluzione per un problema, DRY up markup condiviso (nella forma di navigazione del sito, barre laterali, ecc.) In una soluzione per un altro problema, grandi corpi di testo tradotto. Sembra un po 'non convenzionale usare content_for/yield in questo modo, ma potrebbe essere una soluzione accettabile per il tuo problema.

+0

Sto usando partials localizzati abbastanza spesso. Lo svantaggio di questo approccio è che, solo per questa azione, finirò con ((1 vista) + (5 * 2 parziali = 10)) = 11 file. : S –

+0

Riesco a vedere il problema, ma non mi viene in mente una soluzione che non porti a X * L pezzi di dati (X è il numero di componenti tradotti, L è il numero di traduzioni linguistiche offerte .) Potresti essere in grado di usare il metodo 'yield: named_content' in congiunzione con L partials, ognuno composto da blocchi X' content_for', ma sembra che stiamo risolvendo un problema con una soluzione per un'altra. –

Problemi correlati