ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

国際化するつもりがなくても使える国際化ライブラリ「i18n」

i18nとは「internationalization」、つまり国際化のことです。なんでこう書くかというと、iとnの間に18文字あるからです。毎回毎回正しい綴りを書いていると長ったらしいのでこういう書き方をしているんですね。

Rubyi18n

準備とか

その名もずばり「i18n」というGemがあります。Railsにも組み込まれているので、Railsでは特に用意することもなく使える状態になっています。Sinatraでは「sinatra-i18n」というGemをインストールすれば使えるようになります。ちなみにPadrinoもRailsと同じく最初から組み込まれているので特に何も用意することなく使えます。

国際化するつもりがなくても使える?

もちろんです。
Railsの場合、formヘルパーのlabelで表示される値は既定だと英語のカラム名になりますが、これを日本語に書き換えることができます。また、月や曜日の名前、日付の書式なども日本の文化に合わせて設定できます。果てはActiveRecordのエラーメッセージも日本語化ができます。

設定ファイルの場所

Railsの場合はconfig/localesにまとめてen.ymlとかja.ymlとかいったファイルがあります。この中に色々書き込んでいきます。Sinatraの場合はプロジェクトディレクトリの直下に「i18n」というディレクトリを作り、そのディレクトリの中で同じようにやっていきます。PadrinoはRailsとよく似ています。

色々書き込んでいく

で、このディレクトリの中に<言語コード>.ymlという名前のファイルを作っていきます。Railsの場合は、たぶんすでにen.ymlというファイルがあると思います。お察しの通りこれは英語用です。日本語用のファイルはja.ymlという名前で作ります。
この中に、YAMLで以下のように書いていきます。

ja: #言語コード
  message: これが表示される文です
  class:
    message: このように階層化することもできます
  array:
    - このように
    - 配列も
    - 指定できます

YAMLの文法に従っていて、すでに設定されてあるものと衝突がなければ基本的に自由です。
ちなみにRailsに限っていえば、内部的に使われているメッセージなどをまとめた設定ファイルが公開されているので、それを置いておけばだいたい日本語化できます。

コード中で使う

例えば上のように設定した場合、「これが表示される文です」を表示させたい場所には

t('message')

と書きます。Rubyのコードなのでビュー中ではそのまま書き換えても「t('message')」という文字列が表示されるだけなのでちょっと注意。

ActireRecordのカラム名を日本語化する

labelで表示されるテキストはこのようにすると設定できます。

ja:
  activerecord:
    attributes:
      model_name:
        column_name: カラム名

この調子でカラム名に対応する日本語名をどんどん書いていくと、ラベルに書きだすテキストを日本語化できます。ちなみにformヘルパーのlabelメソッドは書きだすテキストを個別に指定することもできますが、いくつかの場所にそれを書いていたとき、文言をちょっと書き換えるだけでも手間になる可能性があります。しかし、この方法だとファイルをひとつ書き換えるだけでサイト全体のラベルを書き換えることができます。