マイペースなRailsおじさん

Ruby、Ruby on Rails、オブジェクト指向設計を主なテーマとして扱います。だんだん大きくなっていくRuby on Rails製プロダクトのメンテナンス性を損なわない方法を考えたり考えなかったりしている人のブログです。

gemの概要を雑に把握するシリーズ② ruby-i18n/i18n

概要

Ruby用の国際化(i18n)機能を提供するgem。ymlで書かれた設定ファイルを、規定の構造で設定しておくと、I18.tメソッドで翻訳を取得できる。

github.com

仕組み

I18n.tの引数と、現在設定されているロケールを頼りにymlに書かれた対応関係に従って翻訳を返す。 I18n::BackEnd::Simpleに手を加えたい人もいるだろうから、Simpleを拡張できるようにした。オリジナルのTransformerをつくったら、こうやって読み込めば使える。

I18n::Backend::Simple.send(:include, I18n::Backend::Transformers)

gettextにも対応。.poにmsgidとmsgstrを記述する。_メソッドに元になるテキストを引数として渡す。

gettext メッセージIDとメッセージの対応ではなく、メッセージと別の言語のメッセージで対応を取る方式。ある特定の言語のメッセージをIDと捉えると言ってもいい。

気になる実装

ロケールの設定がマルチスレッド考慮している。グローバル変数として使いたくなる値はThread.current[]でスレッドローカルにする。

翻訳の機構の本体は、「backend」と呼ばれていて、configで付け替えられる。 tは配列にも対応。

transliterate(翻字)機能もある。

翻字(ほんじ、英: transliteration)とは、言語学において特定の言語を記した文字表記を別の文字による表記に移すことをいう。翻字は印刷物の発行する際などに技術的な問題や読者の便宜のために行われる。

翻字 - Wikipedia

localizeもある。 https://github.com/ruby-i18n/i18n/blob/master/lib/i18n/backend/simple.rb#L89 lookupに本体実装が有る。 ファイルの読み込みはload_fileからload_xxxを呼んだあとにstore_translations(バックエンド固有)を使う。拡張子ごとに読み込み方法を変えるというの、メタプロの使い所としてかなり美味しい。