正如您可能知道的,從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內容和一小段文字。我需要的文本,但翻譯:
- 文本是創建在.yml文件一個簡單的字符串太長,我不想落得每個段落 創建O(n)的字符串,一個
- 該模板包含一些「功能」,我不想創建5個模板,每種語言一個,因爲它會使應用程序難以維護。
你會如何組織代碼?
我經常使用局部化的部分。這種方法的不足之處在於,僅對於此操作,我將以((1 view)+(5 * 2 partials = 10))= 11個文件結束。 :S – 2009-11-27 14:24:46
我可以看到這個問題,但我沒有提出一個不會產生X * L個數據的解決方案(X是翻譯的組件的數量,L是提供的語言翻譯的數量。)您可以將'yield:named_content'方法與L個部分結合使用,每個部分都由X'content_for'塊組成,但是這感覺就像我們在解決另一個問題時一樣擔心。 – 2009-11-28 21:08:13