Railsアプリケーションの多言語対応 する必要性は年々高まっています。グローバル展開を目指す場合や、ユーザー体験の向上を考慮した場合、多言語対応は欠かせません。Railsにはi18n (Internationalization) 機能が組み込まれており、これを利用することで多言語対応を簡単に実現できます。本記事では、i18nの基本から応用までを解説します。
i18nの基本
i18nとは?
i18nは「Internationalization」を略した言葉で、アプリケーションを多言語対応にするための仕組みです。Railsでは、i18nを使ってテキストや日時などをローカライズできます。
ロケール設定
Railsアプリケーションでは、ロケール設定をconfig/application.rb
に記述します。
# config/application.rb
config.i18n.default_locale = :ja
config.i18n.available_locales = [:en, :ja, :es]
この設定により、利用可能なロケールが制限され、不正なロケールによるエラーを防止します。
ロケールファイル
i18nの翻訳はconfig/locales
ディレクトリ内に配置されたYAMLファイルで管理します。以下はその例です。
# config/locales/en.yml
en:
welcome:
message: "Welcome to our site!"
# config/locales/ja.yml
ja:
welcome:
message: "サイトへようこそ!"
基本的な使い方
翻訳の呼び出し
ビューやコントローラでt
メソッドを使って翻訳を呼び出します。
<%= t('welcome.message') %>
省略記法
ビュー内でスコープを設定し、キー名を簡略化することもできます。
ja:
articles:
index:
title: "記事一覧"
<%= t('.title') %>
動的なコンテンツの翻訳
プレースホルダーを利用して、動的なコンテンツを翻訳することも可能です。
ja:
greeting: "こんにちは、%{name}さん!"
t('greeting', name: '山田') # => "こんにちは、山田さん!"
日付と時刻のローカライズ
日付や時刻のフォーマットもロケールに応じてカスタマイズできます。
ja:
time:
formats:
short: "%Y/%m/%d"
long: "%Y年%m月%d日 %H:%M"
I18n.l(Time.current, format: :long) # ロケールに応じたフォーマットで表示
エラーメッセージのローカライズ
バリデーションエラーメッセージもローカライズできます。
ja:
activerecord:
errors:
models:
user:
attributes:
name:
blank: "名前を入力してください"
@user.errors.full_messages # => ["名前を入力してください"]
i18nの応用
デフォルト値の指定
翻訳キーが見つからない場合、デフォルト値を指定することで対応できます。
<%= t('non_existent_key', default: 'デフォルトメッセージ') %>
複数ファイルへの分割
ロケールファイルが大規模になる場合、用途別にファイルを分割して管理します。
config/locales/devise.ja.yml
config/locales/notifications.ja.yml
ユーザーのロケール切り替え
ブラウザの言語設定やURLのパラメータを利用して、ユーザーのロケールを切り替えることが可能です。
def set_locale
I18n.locale = params[:locale] || extract_locale_from_header || I18n.default_locale
end
def extract_locale_from_header
request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
end
また、URLパラメータを使ったロケール切り替えも簡単に実装できます。
<%= link_to "English", locale: :en %>
i18nのテスト方法
i18nを適切に設定しているかどうかを確認するために、テストを実行することは重要です。特に、大規模なアプリケーションでは誤訳や不足したキーがエラーの原因になることがあるため、i18nテストを導入することをおすすめします。
欠損キーのテスト
i18nの翻訳ファイルに欠損キーがないかを確認するテストをRspecで書く例です。
# spec/i18n_spec.rb
require 'rails_helper'
RSpec.describe 'I18n translations' do
it 'does not have missing keys' do
I18n.available_locales.each do |locale|
expect { I18n.backend.send(:init_translations) }.not_to raise_error
missing_keys = I18n.backend.send(:translations)[locale].deep_find_missing_keys
expect(missing_keys).to be_empty, "Missing keys: #{missing_keys}"
end
end
end
# deep_find_missing_keys メソッドを別途拡張するかGemを活用してください。
このようなテストは、CI/CD環境で自動化することで、運用中のエラーを未然に防ぐことが可能です。
ビューにおける翻訳テスト
ビューで使用されている翻訳キーが適切に解決されているか確認するためのテスト例を示します。
# spec/views/home/index.html.erb_spec.rb
require 'rails_helper'
RSpec.describe 'home/index.html.erb', type: :view do
it 'renders translated text' do
render
expect(rendered).to include(I18n.t('home.welcome_message'))
end
end
ビューに直接翻訳キーを含めた場合、それが正しく解決されているかをテストすることができます。
補完値のテスト
プレースホルダー(補完値)を使った翻訳が正しく動作するかをテストする例です。
# spec/lib/i18n_interpolation_spec.rb
require 'rails_helper'
RSpec.describe 'I18n interpolation' do
it 'interpolates values correctly' do
message = I18n.t('greeting', name: '山田')
expect(message).to eq('こんにちは、山田さん!')
end
end
補完値を使う翻訳では、テストで適切な値が生成されるか確認することが重要です。
未使用キーの検出
アプリケーション内で使用されていない翻訳キーを検出することも品質向上の一環です。以下のようなGemを活用すると効率的です。
i18n-tasksの使用
# Gemfile
gem 'i18n-tasks', group: :development
# ターミナルで以下を実行
$ bundle install
$ bundle exec i18n-tasks unused
このコマンドを使用することで、未使用のキーを一覧表示できます。
まとめ
i18nのテストは、翻訳の正確性と完全性を確保するために重要です。欠損キーや未使用キーのチェック、プレースホルダーの検証、ビューでの使用確認など、様々な方法があります。これらのテストを自動化することで、グローバルに対応するアプリケーションを安定して運用できます。
まとめ
Railsのi18nは、多言語対応を実現するための強力なツールです。本記事では、基本から応用までのステップを解説しました。これを活用することで、よりグローバルなアプリケーションを効率的に構築できるようになるでしょう。
コメント