← All posts

by Sampo Kuokkanen

User avatar
Sampo Kuokkanen
Rails
2022-01-08
新しいRails 7アプリ作成したら、国際化しよう!

国際化

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

Gemfileに以下追加しましょう

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

これでなにか便利になるかというと、 翻訳を

_('こんにちは!')

みたいにできるので、ファイルみてみてわかりやくなります。 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

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

Gemの中で定義をみてみると以下のようになっています。

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 "打刻一覧"

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

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

次はActionCableを使おう!

ですが、ActionCableだとパフォーマンス的にあとあと面倒くさいことになりますので、最初からAnyCableにしようと思います。

また次の記事で!

Ruby, Elixirの開発はご相談ください!

合同会社Sampo Development

sampo@sampo.ltd