Rails · · Sampo Kuokkanen

新しいRails 8アプリ作成したら、国際化しよう!

国際化

今回は英語、日本語でアプリを作りたいので、国際化を考えました。

Gemfileに以下追加しましょう

gem 'gettext_i18n_rails'
gem 'gettext', '>=3.0.2', require: false
gem 'ruby_parser', require: false, group: :development

これでなにか便利になるかというと、 翻訳を ruby _('こんにちは!') みたいにできるので、ファイルみてみてわかりやすくなります。 I18n.t('syntax.with.lots.of.dots')と比べてとてもわかりやすいです。

rake gettext:add_language[ja]
rake gettext:add_language[en]

で日本語と英語を追加します。

config/initializers/fast_gettext.rb

でInitializerを作成します。このInitializerの中で翻訳ファイルを読み込みます。

# config/initializers/fast_gettext.rb
FastGettext.add_text_domain 'app', path: 'locale', type: :po
FastGettext.default_available_locales = ['en', 'ja'] # all you want to allow
FastGettext.default_text_domain = 'app'

中身をこのように書いて、日本語と英語を有効にします。

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :set_gettext_locale
end

とbefore_actionの中で言語を定義します。

Gemの中で定義をみてみると以下のようになっています。 ruby params[:locale] || session[:locale] || cookies[:locale] || request.env['HTTP_ACCEPT_LANGUAGE'] || I18n.default_locale

ですので、パラメーターとして渡して、それをまたセッションに保持したら結構うまく行けそうですね。 HTTP_ACCEPT_LANGUAGEもみてくれているので、最初のページビューもあってそうですね。

では以下のように翻訳を一個追加しましょう。

<%# app/views/time_entries/index.html.erb %>
<h1 class="font-bold text-4xl"><%= _('Time entries') %></h1>

これでTime entriesという文字が翻訳のキーになります。

次はrake gettext:findを実行して、翻訳ファイルにこのキーを追加します。

打刻一覧という翻訳にするのには、以下のようにします。

# locale/ja/app.po
msgid "Time entries"
msgstr "打刻一覧"

翻訳ファイルを編集したらrake gettext:pack.moにコンパイルするのを忘れずに。

これでアプリは国際化できました! 英語はもうデフォルトの文字列でいいので、変えなくても大丈夫です。

ちなみに、Railsの翻訳はconfig/locales/ja.ymlconfig/locales/en.ymlで、そこには rails-i18n/rails/locale at master こちらからデフォルトのエラーなどの翻訳を入れます。

次はActionCableを使おう!

ですが、大規模になるとActionCableだとパフォーマンス的にあとあと面倒くさいことになりますので、AnyCableという選択肢も紹介しようと思います。 (なお、Rails 8ではDBベースのSolid Cableがデフォルトになったので、まずはそのままで十分です)

また次の記事で!