【发布时间】:2009-11-26 15:48:17
【问题描述】:
您可能知道,从 Rails 2.2 开始,Rails 带有一个简单的本地化和国际化后端。
默认情况下,您可以将需要翻译的字符串存储在 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 个模板,因为这会使应用程序更难维护。
你会如何组织代码?
【问题讨论】:
标签: ruby-on-rails ruby templates internationalization