新しい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.ymlとconfig/locales/en.ymlで、そこには
rails-i18n/rails/locale at master
こちらからデフォルトのエラーなどの翻訳を入れます。
次はActionCableを使おう!
ですが、大規模になるとActionCableだとパフォーマンス的にあとあと面倒くさいことになりますので、AnyCableという選択肢も紹介しようと思います。 (なお、Rails 8ではDBベースのSolid Cableがデフォルトになったので、まずはそのままで十分です)
また次の記事で!