RailsとI18n:ローカライズされたテンプレートとローカライズされた文字列

internationalization ruby ruby-on-rails templates
RailsとI18n:ローカライズされたテンプレートとローカライズされた文字列

ご存知のように、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 %>

<%= title t(".title") %>




    <%= title t(".header_choices") %>

    <% form_tag "#", :id => "choices" do %>

        <%= radio_button_tag :choice, "with" %>
        <%= label_tag "choice_with", "..." %>


        <%= radio_button_tag :choice, "without" %>
        <%= label_tag "choice_without", "..." %>

    <% end %>




      ....
      a long paragraph
      a long paragraph


        <%= link_to "Continue", new_path, :class => "button" %>








      ....
      a long paragraph
      a long paragraph


        <%= link_to "Continue", new_path, :class => "button" %>








<% sidebar do %>
  <%= render :partial => "sidebar/user" %>
<% end %>

ここには、フォーム、JavaScriptコンテンツ、および少量のテキストがあります。 テキストを翻訳する必要がありますが:

  1. .ymlファイルで単純な文字列を作成するにはテキストが長すぎます
    段落ごとに1つのO(n)文字列を作成したくない

  2. テンプレートにはいくつかの「機能」が含まれており、作成したくない5
    テンプレート、各言語に1つ。これにより、アプリのメンテナンスが難しくなります。

コードをどのように整理しますか?

  6  3


ベストアンサー

Rails(少なくともバージョン2.3.4)では、パーシャルはビューとテンプレートが行うのと同じ国際化設定を尊重するため、元のビューの機能を維持しながら、大きなテキスト本文を翻訳されるパーシャルに入れることができます。 ラベルと「小さい」テキストの場合、t(…​)変換メソッドを使用すると、提案どおりに使用できます。 したがって、具体的な例を実行するには:

# app/wizards/edit.html.erb
<% javascript_content_for :head do %>
$(function() {
  $("#choices :radio").change(function() {
    $(".choice-wizard").hide();
    $("#" + $(this).val()).show();
  });
});
<% end %>

<%= title t(".title") %>


    <%= title t(".header_choices") %>
    <% form_tag "#", :id => "choices" do %>

        <%= radio_button_tag :choice, "with" %>
        <%= label_tag "choice_with", "..." %>


        <%= radio_button_tag :choice, "without" %>
        <%= label_tag "choice_without", "..." %>

    <% end %>


      <%= render :partial => 'dear_readers' %>
...

# app/views/wizards/_dear_readers.en.html.erb
A Title
...

# app/views/wizards/_dear_readers.sv.html.erb
Bork bork bork!
...

などなど。 スウェーデンに謝罪します。

以下の私のコメントに行く別の可能性:

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

<%= title t(".title") %>


    <%= title t(".header_choices") %>
    <% form_tag "#", :id => "choices" do %>

        <%= radio_button_tag :choice, "with" %>
        <%= label_tag "choice_with", "..." %>


        <%= radio_button_tag :choice, "without" %>
        <%= label_tag "choice_without", "..." %>

    <% end %>


      <%= yield :paragraph_1 %>
      <%= yield :paragraph_2 %>
      ...

# app/wizards/_dear_readers.en.html.erb
<% content_for :paragraph_1 %>
  Title ...
  Content ...
<% end %>
<% content_for :paragraph_2 %>
  ...
<% end %>
...

サポートする各言語についても同様です。 これにインスピレーションを与えたコメントで述べたように、ここで概説したアプローチは、1つの問題の解決策である(サイトナビゲーション、サイドバーなどの形式で)共有マークアップをDRYアップして、別の問題、翻訳されたテキストの大きなボディ。 このように「content_for」/「yield」を使用するのは少し慣習的ではないように見えますが、問題の解決策として受け入れられる場合があります。

7


タイトルとURLをコピーしました