2009-11-26 13 views
5

Muhtemelen bildiğiniz gibi, Rails 2.2'den başlayarak, Raylar basit bir yerelleştirme ve uluslararasılaşma arka uç ile gönderilir.Rails ve I18n: yerelleştirilmiş şablonlar vs localized string

Varsayılan olarak, config klasöründeki yerelleştirme dosyalarında çevirmeniz gereken dizeleri saklayabilirsiniz.

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

Ancak Rails, şablonları ve kısmi alanları da yerelleştirme becerisi sağlar. Örneğin, MainController # indeks eylemi şablon dosya adı ve geçerli yerel ayarlara göre yerelleştirilmiş bir şablon seçebilir. Eğer tek dizeleri veya kısa paragraflar çevirmek gerektiğinde

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

ilk uzun metrajlı yararlıdır. İkinci işlem, aynı eylem geçerli yerel değere göre farklı şekillerde işlendiğinde iyi bir seçimdir.

Ancak, aynı iş mantığını paylaşan ancak çok miktarda metin içeren adil ve basit şablonlarla nasıl baş edersiniz? Örneğin aşağıdaki şablonu kullanın:

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

Burada bir form, bir JavaScript içeriği ve az miktarda metin var. Ben metin ama çevirmek gerekir:

  1. metin .yml dosyasında basit bir dize oluşturmak için çok uzun ve ben her paragraf
  2. için O (n) dizeleri, bir tane oluşturmak sonunda istemiyoruz
  3. şablonu bazı "özellikler" içeriyor ve her bir dil için bir tane olmak üzere 5 şablon oluşturmak istemiyorum, çünkü uygulamanın bakımı daha da zorlaştıracak.

Kodu nasıl düzenlerdiniz?

cevap

7

Raylarda (en az sürüm 2.3.4), kısmi görünümlerin ve şablonların aynı uluslararasılaştırma ayarlarına uyar, böylece yapabildiğiniz şey büyük bir metin parçasını çevrilmiş kısmi parçalara dönüştürürken, özelliklerinizi korur orijinal görünümde. Etiketler ve 'daha küçük' metinler için, t (...) çeviri yöntemini kullanarak önerdiğiniz gibi kullanabilirsiniz. Böylece, beton örneğinizle çalıştırmak için:

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

Ve benzeri. İsveç'ten özür dilerim. desteklediğiniz her dil için böyle devam

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

Ve:

diğer olasılık

aşağıda benim yorum ile gitmek. Buna ilham veren yorumda da bahsettiğim gibi, burada özetlenen yaklaşım, bir problem için bir ayakkabı horningi, paylaşılan işaretlemeyi (site navigasyonu, kenar çubukları, vb. Şeklinde) bir çözüm haline getirmek gibi bir çözüm olarak hissediyor. Başka bir sorun, tercüme edilen metnin büyük organları. content_for/ yield'u bu şekilde kullanmak biraz alışılmamış gibi görünüyor, ancak sorununuz için kabul edilebilir bir çözüm olabilir.

+0

Lokalize kısmi kısmi kullanıyorum. Bu yaklaşımın dezavantajı, sadece bu eylem için, ((1 görünüm) + (5 * 2 kısmi = 10)) = 11 dosya ile biter. : S –

+0

Bu problemi görebiliyorum ama X * L veri parçalarıyla sonuçlanmayan bir çözüm bulmuyorum (X, tercüme edilen parçaların sayısı, L, sunulan dil çevirisi sayısıdır. .) Her bir X 'içerik_foru bloğundan oluşan L kısmi ile birlikte 'verim: named_content' yöntemini kullanabiliyor olabilirsiniz, ancak bu, bir diğeri için bir çözüme karşı bir endişe duyuyoruz. –