gpt4 book ai didi

ruby-on-rails - Rails 和 I18n : localized templates vs localized string

转载 作者:数据小太阳 更新时间:2023-10-29 07:05:58 30 4
gpt4 key购买 nike

您可能知道,从 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

当您需要翻译单个字符串或短段落时,第一个功能很有用。当同一 Action 根据当前语言环境值以不同方式呈现时,后者是一个不错的选择。

但是您如何处理共享相同业务逻辑但包含大量文本的相当简单的模板呢?以下面的模板为例

<% 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 文件中创建一个简单的字符串,我不想最终创建 O(n) 个字符串,每个段落一个
  2. 模板包含一些“功能”,我不想创建 5 个模板,每种语言一个,因为这会使应用更难维护。

您将如何组织代码?

最佳答案

在 Rails(至少 2.3.4 版)中,部分内容遵循与 View 和模板相同的国际化设置,因此您可以做的是将大量文本放入经过翻译的部分内容中,同时保留您的功能原来的看法。对于标签和“较小”的文本,可以按照您的建议使用 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 似乎有点不合常规,但它可能是您问题的可接受解决方案。

关于ruby-on-rails - Rails 和 I18n : localized templates vs localized string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1804435/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com