by Sampo Kuokkanen
国際化
今回は英語、日本語でアプリを作りたいので、国際化を考えました。
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.yml
とconfig/locales/en.yml
で、そこには
rails-i18n/rails/locale at master · svenfuchs/rails-i18n
こちらからデフォルトのエラーなどの翻訳を入れます。
次はActionCableを使おう!
ですが、ActionCableだとパフォーマンス的にあとあと面倒くさいことになりますので、最初からAnyCableにしようと思います。
また次の記事で!