GetTextでLoginEngineとUserEngineを日本語化したい!

GetTextを利用して、程々に日本語で表示できるようになった。RadRailsと連携して快適な作業環境で楽しくなっていたところ、その調子に乗って、ログイン管理、ユーザー管理の部分も日本語化しようと思った時、壁にぶつかった...。


まず最初やったことは、今までと同じ方法でvender/plugins/*_engine/appフォルダ以下の日本語化したいファイルを、プロジェクト直下のappフォルダへコピーして、_()で囲ってupdatepo、makemoで日本語化してみた。ちゃんと正常に日本語化できた。しかし、このやり方では悩み事がいくつか発生した。

      • この後、新たなプロジェクトで日本語化したlogin.engineを利用しようするためには、どうすれば良いのだろう?今回、日本語化のためにコピーしたlogin_engine関連ファイルを、新たに開発するプロジェクト直下のappフォルダにコピーすれば良いのだが、日本語化とは関係ない変更が加えられていたら、コピーしてそのまま使うことはできない...。
      • 雛形として日本語化だけの変更をして保存していたとしても、毎回appフォルダ以下のファイル構成をコピーするのは面倒くさい...。

そこで、vender/plugins/*_engineフォルダ以下のファイルを直接_()で囲って処理してみたのだが...

      • .poファイルや.moファイルは、プロジェクト直下のpoフォルダやlocaleフォルダに保存される。
      • テーブル名、フィールド名が抽出されない。
      • まったく、日本語化されない...。


悩み続けて、web検索とその試行錯誤の結果、以下のページにEnginesプラグインの取り扱い方がちゃんと書いてあった。
Ruby-GetText-Package HOWTO for Rails Engines
(web検索を日本語ページに限定していたため、見つけられずにずいぶん遠回りをしてしまった。これからは日本語の限定はしない...。英語でも前向きに読む...。)

コードの理解はちゃんと出来ていないが、手順はとても良く理解できたので、さっそく作業開始。

サンプルファイルのダウンロード

ちゃんと手順書通りにやってみようと思ったが、LoginEngineをGetTextで日本語化したサンプルファイルが公開されていた。本当に日本語化されるのか、先に結果を見てみたい...。

  • Ruby-GetText-Package HOWTO for Rails Enginesから早速、ダウンロードしてみた。(ページの一番下の方にリンクがある。)
  • login_engine_v1.0.2.gettext.tar.gzを解凍すると、venderフォルダが生成される。
  • 解凍したvenderフォルダの中のlogin_engineフォルダ以下を、softwarebook2プロジェクトのlogin_engineへコピーして上書きした。
  • サーバーを再起動してログインしてみると、見事に日本語化されている!

手順書に沿ってやってみる

それではUserEngineを手順書に沿って日本語化してみる。お手本にLoginEngineのサンプルがあるので心強い。

前提条件
  • Ruby-GetText-Package1.8.0がインストールされている。(Locomotive2.0.8には左記バージョンがインストール済)
  • config/environment.rbに以下のコードが追記されている。(関連記事:GetTextで日本語化してみる。
$KCODE = 'u'
require 'jcode'
...(途中省略)...
require 'gettext/rails'
Rakefileの新規作成

vender/plugins/user_engine/Rakefileを新規作成した。以前のlib/tasks/gettext.rakeと比べてみると、オレンジ色の行が追加された部分だ。コードの意味は詳しく分からないが、EnginesプラグインでGetTextを利用するためのおまじないと考えて、このまま使わせて頂くことに。(感謝です。)

desc "Create mo-files for L10n"
task :makemo do
  require 'gettext/utils'
  GetText.create_mofiles(true, "po", "locale")
end

$: << "../../../"
desc "Update pot/po files to match new version."
task :updatepo do
  require 'gettext/utils'
  GetText::ActiveRecordParser.init(:db_yml => "../../../config/database.yml")
  GetText.update_pofiles("user_engine", 
                         Dir.glob("{app,lib}/**/*.{rb,rhtml}"),
                         "user_engine 1.0.0")
end
      • ちなみに、サンプルのLoginEngineのRakefileでは、LoginEngineプラグインのバージョンコードを自動で取得できるようになっているようだ。オレンジ色の部分でバージョンコードを取得している。しかし、このままUserEngineで使うと、バージョンコードは0.0.0になってしまう。UserEngineにはバージョンコードを返す仕組みが無いのかな...。(LoginEngineにはinit_engine.rbの中に、module LoginEngine::Versionという定義がある。UserEngineにはこの部分は無い。)
major = 0
minor = 0
release = 0
IO.foreach("init_engine.rb") do |line|
  if line =~ /Major?s+?=?s+(?d+)/
    major = $1
  elsif line =~ /Minor?s+?=?s+(?d+)/
    minor = $1
  elsif line =~ /Release?s+?=?s+(?d+)/
    release = $1
  end
end
version = "#{major}.#{minor}.#{release}"

desc "Create mo-files for L10n"
task :makemo do
  require 'gettext/utils'
  GetText.create_mofiles(true, "po", "locale")
end

$: << "../../../"
desc "Update pot/po files to match new version."
task :updatepo do
  require 'gettext/utils'
  GetText::ActiveRecordParser.init(:db_yml => "../../../config/database.yml")
  GetText.update_pofiles("login_engine", Dir.glob("{app,lib}/**/*.{rb,rhtml}"),
                         "login_engine #{version}")
end
コントローラーへの追記

vender/plugins/user_engine/app/controllersフォルダのすべてのコントローラーの定義の最初に、init_gettext "user_engine"を追記する。
user_controller.rb記入例(role_controller.rb、permission_controller.rbにも同様に追記する)

class UserController < ApplicationController
  init_gettext "user_engine"

...(途中省略)...
 
end
_()で囲む

vendor/plugins/user_engine/appフォルダの表示に関する部分をすべて_()で囲んだ。(関連記事:GetTextで実際に日本語化作業をやってみる。

updatepoの実行

ターミナルを起動して、vender/plugins/user_engineディレクトリへ移動して、updatepoを実行する。

MacBook:~ zari$ cd ~/railsapp/softwarebook_ja2/vendor/plugins/user_engine
MacBook:~/railsapp/softwarebook_ja2/vendor/plugins/user_engine zari$ rake updatepo

vender/plugins/user_engine/po/user_engine.potが生成される。

msginitの実行

poフォルダの中にjaフォルダを新規作成する。
ターミナルで、poフォルダに移動して、msginitを実行する。

MacBook:~/railsapp/softwarebook_ja2/vendor/plugins/user_engine zari$ cd po
MacBook:~/railsapp/softwarebook_ja2/vendor/plugins/user_engine/po zari$ msginit -i user_engine.pot -o ja/user_engine.po
  :
  :
Please enter your email address.
  :
  :
Created ja/user_engine.po.

メールアドレスを要求されるので、入力すると...
vender/plugins/user_engine/po/ja/user_engine.poが生成される。

makemoの実行

user_engine.poを開いて、翻訳する。(全305行)翻訳が終わったら...
ターミナルで、一つ上のuser_engineフォルダに戻り、makemoを実行する。

MacBook:~/railsapp/softwarebook_ja2/vendor/plugins/user_engine/po zari$ cd ..
MacBook:~/railsapp/softwarebook_ja2/vendor/plugins/user_engine zari$ rake makemo
(in /Users/zari/railsapp/softwarebook_ja2/vendor/plugins/user_engine)
po/ja/user_engine.po -> locale/ja/LC_MESSAGES/user_engine.mo


以上の手順で、サーバーを再起動して確認すると、UserEngineも日本語化されていた。

  • Enginesプラグインごとにpoフォルダ、localeフォルダが追加され、以下のようなファイル構成になった。

  • 日本語化されたUserEngineを再利用したい場合は、このuser_engineフォルダを、インストールしたいプロジェクトのvendor/pluginsフォルダにコピーするだけでOK。これで気楽に使える!