Ruby GetText Package は GNU gettext packageによく似たライブラリです。このライブラリを使うことであなたのRubyスクリプト中の文字列を簡単にローカライズでき、国際化されたアプリケーションを作ることができます。
基本的な考え方はGNU gettext packageと同じです。インターネット上に解説されたものが多々ありますのでそちらをご覧になってください(← 手抜き)。
ruby-gettext-package-0.2.1.tar.gz
コマンドラインで以下のようにうちこんでください。UNIX 系 OS ではおそらく root 権限が必要になります。
# ruby install.rb config # ruby install.rb setup # ruby install.rb install
インストール先を変更したりすることもできます。その場合は ruby install.rb --help を実行してみてください。
スクリプトファイルからrgettextツールを使用して生成されたテキストファイル(msgidとmsgstrの対)、および、それを翻訳したもの(言語毎に作成)。
msgidとローカライズされた文字列の対が入っているバイナリファイル。poファイルからmsgfmtツールを使用して生成します。言語毎に必要です。
domainとは要はmoファイルの名称(拡張子は.mo)です。GNOME等でPACKAGE名と呼ばれることが多いです。通常はアプリケーション・ライブラリにつき1つですが、本ライブラリではクラス単位で指定できるようにしています。ただし、rgettextとの親和性を考慮すると現実的には少なくともファイル単位より大きい単位になると思います。
GetText.bindtextdomain(domainname, path = nil, locale = nil)
GetText._(msgid)
GetText.gettext(msgid)
GetText.N_(msgid)
GetText.setlocale(locale)
rgettextツールは、Rubyスクリプトから文字列を抜き出してpoファイルを生成します。
$rgettext hoge.rb -o hoge.pot
本ライブラリを使用した開発手順を簡単に説明します。
例えば、以下のように本ライブラリを用いたスクリプトを作ります。hello.rbと言う名前で保存します。
require 'gettext' include GetText bindtextdomain("hello") print _("Hello World\n")
次にrgettextを使って文字列を抽出します。
$rgettext hello.rb -o hello.pot
hello.potファイルの先頭部分はそのプロジェクトにあったコメントを追加しておくと良いでしょう。
hello.potから他の言語ファイルを作ります(この例は日本語ファイルを作る場合です)。
$cp hello.pot ja.po
次に、ja.poを編集します。以下のような感じ。
#: ../hello.rb:7 msgid "Hello World\n" msgstr "こんにちわ、世界\n"
念のため、ヘッダ部分には翻訳した人・言語・時間などの情報を書きます。
なお、poファイルのメンテナンスにはGNU gettext package付属のツール(msgmerge等)を使うことができます。
#時間があったらこの辺も書きましょう。つーか誰か書いてください(^^;)。
一応、samplesディレクトリにいくつかサンプルを入れておきますんでそちらも参考にしてください。
GetText.N_(msgid)はAPIリファレンスでも書いたとおり、msgidをローカライズせずにそのまま返します。
これは、rgettextがソースからローカライズ対象の文字列を抜き出すために必要とされます。
以下に例を示します。
require 'gettext' include GetText bindtextdomain("hello_noop") msgs = [N_("Hello World"), N_("Hello World2")] msgs.each do |msg| print _(msg), "\n" end
poファイルにfuzzyと表示されている場合、それを取り除かないとローカライズの対象になりません。
#: hello.rb:7 #, fuzzy msgid "Hello World" msgstr "こんにちわ、世界"
この場合は内容を確認した上で、fuzzy行を削除してください。
#: hello.rb:7 msgid "Hello World" msgstr "こんにちわ、世界"
最後にmoファイルを作り、これを適切なディレクトリへ置きます。
上記例ではbindtextdomain()でmoファイルを置くディレクトリを指定していないため、/usr/share/locale/#{lang}/LC_MESSAGES/か/usr/local/share/locale/#{lang}/LC_MESSAGES/へ置く必要があります。
ここでは、/usr/local/share/locale/ja/LC_MESSAGES/へ置いてみます。
$msgfmt ja.po -o /usr/local/share/locale/ja/LC_MESSAGES/ ※ たぶん上記のままコマンドを実行する場合はroot権限が必要だと思います。 ※ msgfmtはGNU gettext付属のツールです。
$ruby hello.rb
日本語が表示されましたか? おめでとうございます、成功です。
もし表示されないようでしたら、まずは、-d付きで実行してみましょう。
$ruby -d hello.rb Search path:["/usr/share/locale", "/usr/local/share/locale"] locale:"ja_JP.eucJP" MO file is not found in /usr/share/locale/ja_JP.eucJP/LC_MESSAGES/hello.mo /usr/share/locale/ja_JP/LC_MESSAGES/hello.mo /usr/share/locale/ja/LC_MESSAGES/hello.mo /usr/local/share/locale/ja_JP.eucJP/LC_MESSAGES/hello.mo /usr/local/share/locale/ja_JP/LC_MESSAGES/hello.mo /usr/local/share/locale/ja/LC_MESSAGES/hello.mo
もう一度、上記pathのいずれかにきちんとhello.moがあることを確認してください。
#これでわかんなかった場合は....どうしましょう(^^;)
最後に、GNU gettextを使っている方へ、本ライブラリとGNU gettextと異なる点を書いておきます。
このライブラリはRubyと同じライセンスに基づいて配布されるフリーソフトウェアです。詳しくはCOPYING.jaを参照してください。
Copyright (C) 2001 Masahiro Sakai <s01397ms@sfc.keio.ac.jp>
Copyright (C) 2001,2002 Masahiro Sakai <s01397ms@sfc.keio.ac.jp>, Masao Mutoh <mutoh@highwhay.ne.jp>
Copyright (C) 2001,2002 Yasushi Shoji <yashi@yashi.com>, Masao Mutoh <mutoh@highwhay.ne.jp>
Copyright (C) 2000,2001 Minero Aoki <aamine@loveruby.net>
このファイルのみLGPLです。ライセンスについてはinstall.rbファイルの先頭部分を参照してください。
Copyright (C) 2001,2002 Masao Mutoh <mutoh@highwhay.ne.jp>
本ライブラリについてのご意見・バグレポートは武藤まで。
Masao Mutoh <mutoh@highway.ne.jp>
2002-02-22 Masao Mutoh <mutoh@highway.ne.jp>
2002-02-21 Masao Mutoh <mutoh@highway.ne.jp>
2002-02-13 Masao Mutoh <mutoh@highway.ne.jp>
2002-02-03 Masao Mutoh <mutoh@highway.ne.jp>
2002-01-06 Masao Mutoh <mutoh@highway.ne.jp>
2002-01-01 Masao Mutoh <mutoh@highway.ne.jp>
2001-12-24 Masao Mutoh <mutoh@highway.ne.jp>
$Id: ruby-gettext.rd,v 1.13 2002/02/22 14:15:37 mutoh Exp $