2009-11-26 94 views
5

正如您可能知道的,從Rails 2.2開始,Rails隨附了一個簡單的本地化和國際化後端。Rails和I18n:本地化模板vs本地化字符串

默認情況下,您可以將需要翻譯的字符串存儲在config文件夾中的本地化文件中。

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

但Rails還提供了本地化模板和部分的功能。 例如,MainController#index操作可以根據模板文件名和當前區域設置選擇一個本地化模板。

apps/views/main/index.it.html.erb 
apps/views/main/index.en.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 --> 
     <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 %> 

這裏我有一個表單,一個JavaScript內容和一小段文字。我需要的文本,但翻譯:

  1. 文本是創建在.yml文件一個簡單的字符串太長,我不想落得每個段落
  2. 創建O(n)的字符串,一個
  3. 該模板包含一些「功能」,我不想創建5個模板,每種語言一個,因爲它會使應用程序難以維護。

你會如何組織代碼?

回答

7

在Rails(至少2.3.4版本)中,partials尊重視圖和模板所做的相同的國際化設置,所以你可以做的是將大量的文本放入被翻譯的部分中,同時保留你的特性在原始視圖中。對於標籤和「較小」文本,可以按照您的建議使用t(...)翻譯方法。因此,以您的具體示例運行:

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

等等。我向瑞典道歉。

另一種可能性去下面我的評論:

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

等了你支持的每種語言。正如我在啓發這一點的評論中所提到的那樣,這裏概述的方法感覺就像我們在解決一個問題時一樣,將共享標記(以站點導航,側邊欄等形式)進行乾燥,形成一個解決方案另一個問題是大量的翻譯文本。以這種方式使用content_for/yield似乎有些不合常規,但它可能是您的問題的可接受的解決方案。

+0

我經常使用局部化的部分。這種方法的不足之處在於,僅對於此操作,我將以((1 view)+(5 * 2 partials = 10))= 11個文件結束。 :S – 2009-11-27 14:24:46

+0

我可以看到這個問題,但我沒有提出一個不會產生X * L個數據的解決方案(X是翻譯的組件的數量,L是提供的語言翻譯的數量。)您可以將'yield:named_content'方法與L個部分結合使用,每個部分都由X'content_for'塊組成,但是這感覺就像我們在解決另一個問題時一樣擔心。 – 2009-11-28 21:08:13