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