[Back] [English] [Japanese]

Ruby GetText Package

Ruby GetText Packageとは?

Ruby GetText Package は GNU gettext packageによく似たライブラリです。このライブラリを使うことであなたのRubyスクリプト中の文字列を簡単にローカライズでき、国際化されたアプリケーションを作ることができます。
基本的な考え方はGNU gettext packageと同じです。インターネット上に解説されたものが多々ありますのでそちらをご覧になってください(← 手抜き)。

提供する機能

ユーザにお願いすること

本ライブラリを用いて開発したツールを使用する場合は、事前に以下の情報を設定してもらう必要があります。

必要環境

ダウンロード

ruby-gettext-package-0.3.1.tar.gz

インストール方法

コマンドラインで以下のようにうちこんでください。UNIX 系 OS ではおそらくroot権限が必要になります。

# ruby install.rb config
# ruby install.rb setup
# ruby install.rb install

インストール先を変更したりすることもできます。その場合は ruby install.rb --help を実行してみてください。

基本用語説明

pot, poファイル

スクリプトファイルからrgettextツールを使用して生成されたテキストファイル(msgidとmsgstrの対)、および、それを翻訳したもの(言語毎に作成)。

moファイル

msgidとローカライズされた文字列の対が入っているバイナリファイル。poファイルからmsgfmtツールを使用して生成します。言語毎に必要です。

domain(TextDomain)

domainとは要はmoファイルの名称(拡張子は.mo)です。GNOME等でPACKAGE名と呼ばれることが多いです。通常はアプリケーション・ライブラリにつき1つですが、本ライブラリではクラス単位で指定できるようにしています。ただし、rgettextとの親和性を考慮すると現実的には少なくともファイル単位より大きい単位になると思います。

APIリファレンス

GetTextモジュール

GetText.bindtextdomain(domainname, path = nil, locale = nil, charset = nil)
TextDomainをバインドする。#{path}/#{locale}/LC_MESSAGES/#{domainname}.mo が対象のmoファイルとなる。
GetText._(msgid)
GetText.gettext(msgid)
msgidからローカライズされた文字列を返す。指定したmoファイルが存在しない場合はmsgidをそのまま返す。
GetText.N_(msgid)
msgidをそのまま返します。これはrgettextによってローカライズする文字列の対象とさせることに使う。開発手順の章参照
GetText.locale=(locale)
C, de, fr, it, ko, ja_JP.eucJP, zh_CN.EUCなどの文字列を指定する。
GetText.charset=(charset)
euc-jp, sjis, CP932, utf-8などの文字列を指定する。

rgettextツール

rgettextツールは、Rubyスクリプトから文字列を抜き出してpoファイルを生成します。

使い方

$rgettext hoge.rb -o hoge.pot

開発手順

本ライブラリを使用した開発手順を簡単に説明します。

まずはスクリプトを作る

例えば、以下のように本ライブラリを用いたスクリプトを作ります。hello.rbと言う名前で保存します。

require 'gettext'

include GetText

bindtextdomain("hello")
print _("Hello World\n")

文字列の抽出を行う(poファイルを作る)

次にrgettextを使って文字列を抽出します。

$rgettext hello.rb -o hello.pot

hello.potファイルの先頭部分はそのプロジェクトにあったコメントを追加しておくと良いでしょう。

ローカライズする

hello.potから他の言語ファイルを作ります(この例は日本語ファイルを作る場合です)。

$cp hello.pot ja.po

次に、ja.poを編集します。以下のような感じ。

"Content-Type: text/plain; charset=euc-jp\n"

#: ../hello.rb:7
msgid "Hello World\n"
msgstr "こんにちわ、世界\n"

それから、ヘッダ部分には翻訳した人・言語・時間などの情報を書きます。Content-Type行は必須です。ja.poファイル自体の文字コードを記述します。euc-jp,sjis,utf-8等が入ります。

なお、poファイルのメンテナンスにはGNU gettext package付属のツール(msgmerge等)を使うことができます。
#時間があったらこの辺も書きましょう。つーか誰か書いてください(^^;)。

一応、samplesディレクトリにいくつかサンプルを入れておきますんでそちらも参考にしてください。

※ GetText.N_(msgid)の使い方

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

※ fuzzy表示について

poファイルにfuzzyと表示されている場合、それを取り除かないとローカライズの対象になりません。

#: hello.rb:7
#, fuzzy
msgid "Hello World"
msgstr "こんにちわ、世界"

この場合は内容を確認した上で、fuzzy行を削除してください。

#: hello.rb:7
msgid "Hello World"
msgstr "こんにちわ、世界"

moファイルを作る

最後に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を使っている方へ、本ライブラリとGNU gettextと異なる点を書いておきます。

ライセンス

このライブラリはRubyと同じライセンスに基づいて配布されるフリーソフトウェアです。詳しくはCOPYING.jaを参照してください。

mo.rb

Copyright (C) 2001,2002 Masahiro Sakai <s01397ms@sfc.keio.ac.jp>, Masao Mutoh <mutoh@highwhay.ne.jp>

gettext.rb

Copyright (C) 2001,2002 Masahiro Sakai <s01397ms@sfc.keio.ac.jp>, Masao Mutoh <mutoh@highwhay.ne.jp>

rgettext

Copyright (C) 2001,2002 Yasushi Shoji <yashi@yashi.com>, Masao Mutoh <mutoh@highwhay.ne.jp>

install.rb

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>

ChangeLog

2002-07-06 Masao Mutoh <mutoh@highway.ne.jp>

2002-07-02 WATANABE Hirofumi <eban@os.rim.or.jp>

2002-07-01 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>

2002-06-30 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.22 2002/07/06 15:11:26 mutoh Exp $