Rails アプリケーションを多言語化する方法

Rails gem アプローチ、MySQL アプローチ、多言語 Rails 構造

世界のほとんどの人は英語を話せません。そこで国際化とローカリゼーションが登場します。Rails には優れた i18n API があります。
参照: http://guides.rubyonrails.org/i18n.html

アプリケーションを英語以外の単一のカスタム言語に翻訳したり、アプリケーションで多言語サポートを提供したりするための、使いやすく拡張可能なフレームワークを提供します。

I18n API:
I18n API の最も重要なメソッドは次のとおりです。
# ルックアップのテキスト翻訳を翻訳する
localize # 日付と時刻オブジェクトをローカル形式にローカライズする

これらには #t および #l というエイリアスがあるため、次のように使用できます。

I18n.t 'app.title' I18n.l Time.now

Rails-i18n gem:
インストール:
Gemfile に追加します。

gem 'rails-i18n'、github: 'svenfuchs/rails-i18n'、ブランチ: 'master' # 5.x の場合

構成:
デフォルトでは、rails-i18n は gem で利用可能なすべてのロケール ファイル、複数形化および音訳ルールをロードします。 I18n.available_locales オプションを介してロードする必要があるロケールを config/environments/* で指定すると、この動作を変更できます。

config.i18n.available_locales = ['es-CO', :de]

または

config.i18n.available_locales = :nl

別の gem も使用できます。

gem をグローバル化する:
Rails I18n は、ActiveRecord モデル/データ変換用の事実上の標準ライブラリです。 Globalize は、Ruby on Rails の I18n API に基づいてビルドし、ActiveRecord モデルにモデル変換を追加します。

インストール:
バンドラーを使用する場合は、これを Gemfile に入れます。

gem 'globalize', '~> 5.0.0' Rails 5 で globalize を使用するには、これを Gemfile gem 'activemodel-serializers-xml' に追加します。

2. ドキュメント: https://github.com/globalize/globalize

多言語アプリの DB 設計 (英語とアラビア語):

2 つまたは 3 つの言語をサポートするためのアプローチ:

1. カラムアプローチ:

言語列を使用して列アプローチ モデルを作成します。 `title_en` varchar(255) NOT NULL、`title_ar` varchar(255) NOT NULL、

これで、クエリの方法も非常に簡単になりました。選択した言語に応じて適切な列を自動的に選択することでこれを行うことができます。

利点:

  • シンプルさ – 実装が簡単
  • 簡単なクエリ – JOIN は必要ありません
  • 重複なし – 重複したコンテンツはありません

短所:

  • 保守が難しい – 2 ~ 3 言語の場合は簡単に機能しますが、列や言語が多い場合は非常に困難になります。
  • 新しい言語を追加するのは難しい

2. 変換テーブル アプローチ:
変換可能なテーブルごとに関連する変換テーブルを持ちます。

CREATE TABLE PRODUCT (id int, PRICE NUMBER(18, 2)) CREATE TABLE PRODUCT_tr (id int, product_id INT FK, languagecode varchar, name text, description text)

こうすることで、翻訳可能な列が複数ある場合、それを取得するために必要な結合は 1 つだけになり、アイテムを関連する翻訳とともにインポートするのが簡単になる可能性があります。

  • 新しい言語用にデータベース スキーマを変更する必要がありません (したがって、コードの変更が制限されます)。
  • 未実装の言語や特定の項目の翻訳に多くのスペースを必要としません
    最大限の柔軟性を提供します
  • まばらなテーブルになることはありません
  • null キーについて心配したり、null エントリの代わりに既存の翻訳が表示されていることを確認したりする必要はありません。

Rails-5 を使用した多言語アプリ (英語とアラビア語):
多言語の Rails アプリケーションのアプローチは、単言語の場合と非常に似ています。ここでは、必要なすべての言語の YAML 言語ファイルを定義し、Rails アプリケーションに現在使用する言語を指示する必要があります。これを行うには、 I18n.ロケール。

URL パス プレフィックスによる I18n.locale の設定
http://0.0.0.0:3000/ar にはアラビア語バージョンを表示し、http://0.0.0.0:3000/en には英語バージョンを表示します。

config/routes.rb

Myapp::Application.routes.draw doscope "(:locale)", :locale => /en|ar/ do root :to => 'page#index' get "page/index" end end

を設定します before_filter app/controllers/application_controller.rb にあります。

class ApplicationController < ActionController::Base protected_from_forgery before_filter :set_locale private def set_locale I18n.locale = params[:locale] || I18n.default_locale 終了 終了

テストするには、URL にアクセスします。

http://0.0.0.0:3000/ar

または

http://0.0.0.0:3000/ar/page/index

デフォルト言語の設定:

app/controllers/application_controller.rb: クラス ApplicationController < ActionController::Base protected_from_forgery before_filter :set_locale private def set_locale I18n.locale = params[:locale] || I18n.default_locale Rails.application.routes.default_url_options[:locale]= I18n.locale end end

その結果、他に何もする必要はありません。スキャフォールド ジェネレーターを介して生成されたすべてのリンクは、それに応じて自動的に変更されます。

ブラウザの Accept Language HTTP ヘッダーを介して I18n.locale を設定します。

app/controllers/application_controller.rbclass ApplicationController < ActionController::Base protected_from_forgery before_filter :set_locale private def extract_locale_from_accept_ language_header request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[az]{2}/).first end def set_locale I18n.locale = extract_locale_from_accept_ language_header || I18n.default_locale 終了 終了

ここで、ルート ファイルをクリーンに変更できます。

config/routes.rb: Myapp::Application.routes.draw do get "page/index" root :to => 'page#index' end

I18n.locale をセッションに保存する

app/controllers/set_mylang_controller.rb: class SetMy languageController < ApplicationController #English def en I18n.locale = :en set_session_and_redirect end #Arabic def ar I18n.locale = :ar set_session_and_redirect end private def set_session_and_redirect session[:locale] = I18n.locale redirect_to :back救助ActionController::RedirectBackError redirect_to :root end end

アプリケーションコントローラーの変更:

app/controllers/application_controller.rb: クラス ApplicationController < ActionController::Base protected_from_forgery before_filter :set_locale private def set_locale I18n.locale = session[:locale] || I18n.default_locale session[:locale] = I18n.locale end end

アラビア語を設定するには:

http://0.0.0.0:3000/set_mylanguage/ar

英語を設定する場合:

http://0.0.0.0:3000/set_mylanguage/en

YAML 形式のテキスト ブロック:

まず以下のディレクトリを作成します。

$ mkdir -p config/locales/models/item $ mkdir -p config/locales/views/item

次の行をファイル config/application.rb に挿入します。

# デフォルトのロケールは :en で、config/locales/*.rb,yml からのすべての翻訳が自動的にロードされます。

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', 'models', '*', '*.yml').to_s] config.i18n.load_path += Dir[Rails .root.join('config', 'locales', 'views', '*', '*.yml').to_s] config.i18n.default_locale = :en

ここでファイルを作成する必要があります。設定/ロケール/モデル/アイテム
アラビア語の場合は config/locales/models/item/ar.yml
英語の場合は en.yml が存在することを確認してください。

英語の YAML:
英語のシステムにはほとんどのものがすでに存在しているため、
以下を en.yml ファイルに挿入します。

# ルビーエンコーディング: utf-8
en: views: show: 表示 edit: 編集 destroy: 削除 are_you_sure: よろしいですか? back: 戻る item:index: title: すべてのアイテムのリスト new: title: 新しいアイテム flash_messages: item_was_ successly_created: 'アイテムは正常に作成されました。

アラビア語 YAML:
en.yml と同様に、アラビア語の値/テキストを ar.yml に挿入する必要があります。
Sven Fuchs による既成のデフォルト翻訳を彼の github リポジトリからコピーすることもできます。 https://github.com/svenfuchs/rails-i18n:

$ cd 構成/ロケール
$ カール -O https://raw.github.com/svenfuchs/rails-i18n/master/rails/locale/ar.yml

ビュー内での翻訳:
属性には human_attribute_name() を使用できますが、リンクは I18n.t で変換する必要があります。 number_to_currency() を使用して、金額/価格をフォーマットされた形式で表示できます。

例:

 

<% = t 'views.item.index.listing_items' %>


<% = link_to I18n.t('views.show'),@item %> <%= アイテム.人間属性名(:名前) %><%=アイテム.人間属性名(:説明) %> 

コントローラでの Flash メッセージの翻訳

if @item.save format.html { @item にリダイレクト、通知: I18n.t('views.item.flash_messages.item_was_successly_created') } format.json { レンダリング json: @item、ステータス: :created、場所: @item } else format.html { レンダリング アクション: "新しい" } format.json { レンダリング json: @item.errors、ステータス: :unprocessable_entity } end

他の既製の言語翻訳については、次のとおりです。
https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale

ルバイブ・シージェイ
シニア Ruby on Rails 開発者

最新のアップデートを購読する

関連記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

jaJapanese