ruby-****@sourc*****
ruby-****@sourc*****
2008年 10月 28日 (火) 15:21:12 JST
------------------------- REMOTE_ADDR = 222.225.51.171 REMOTE_HOST = URL = http://ruby-gnome2.sourceforge.jp/ja/hiki.cgi?libgade2-tut-l10n ------------------------- @@ -1,50 +1,209 @@ = Localization(L10n): 文字列の地域化 -さて仕上げのL10n化です。Ruby/Libglade2を用いた場合、Glade XMLファイル、Rubyスクリプトファイルの2種類のファイル中に現れる文字列が対象になります。 +さて、仕上げにプログラムを地域化可能な構造に作り変え、地域化の一例として日本語化します。Ruby/Libglade2を用いた場合、Glade XML(.glade)ファイル、Rubyスクリプトファイルの2種類のファイル中に現れる文字列が対象になります。 == スクリプトをL10n対応させる -Rubyスクリプトの方はRuby-GetText-Packageを用いますので詳しくは((<そちら|URL:http://ponx.s5.xrea.com/hiki/ja/ruby-gettext.html>))を参照してください。簡単に説明すると、Rubyスクリプト中のL10n化したい文字列を_("foo")とかN_("bar")いう形で括り出します。 +Rubyスクリプトの方は((<Ruby-GetText-Package|URL:http://ponx.s5.xrea.com/hiki/ja/ruby-gettext.html>))(別途gemなどからインストールが必要)を用いますので詳しくは((<そちら|URL:http://ponx.s5.xrea.com/hiki/ja/ruby-gettext.html>))を参照してください。 +最も基本的なやり方としては、Rubyスクリプト中でL10n対応にしたいリテラル文字列を引用符ごと「_(」と「)」ではさんだ形に書き換えます。 + (例) - def on_save_as1_activate(widget) - ret = select_file(Gtk::FileChooser::ACTION_SAVE) - if @filename and ret == Gtk::Dialog::RESPONSE_OK - if FileTest.exist?(@filename) - dialog = Gtk::MessageDialog.new(@main_window, Gtk::Dialog::MODAL, - Gtk::MessageDialog::ERROR, - Gtk::MessageDialog::BUTTONS_OK_CANCEL, - _("The file has already existed. Do you override it?")) #ここ! - ret = dialog.run - dialog.destroy - save_file if ret == Gtk::Dialog::RESPONSE_OK - else - save_file - end + def show_opendialog + @filedialog.action = Gtk::FileChooser::ACTION_OPEN + @filedialog.title = _('Open Dialog') # <= ここ + if****@filed***** == Gtk::Dialog::RESPONSE_OK + if File.exist?(get_platform_filename(@filedialog.filename)) + @filename =****@filed***** + read_file(@filename) + update_window_title end end + @filedialog.hide + end -また、initializeにGetText.bindtextdomainを呼び出していることに注意してください。 + def overwrite_file?(filename) + dialog = Gtk::MessageDialog.new( + @filedialog, Gtk::Dialog::MODAL, + Gtk::MessageDialog::QUESTION, + Gtk::MessageDialog::BUTTONS_OK_CANCEL, + filename + _("\n already exists. Do you overwrite it?")) # <= ここ + result = dialog.run + dialog.destroy + result == Gtk::Dialog::RESPONSE_OK + end - def initialize(path_or_data, root = nil, domain = nil, localedir = nil, flag = GladeXML::FILE) - GetText.bindtextdomain(domain, localedir, nil, "UTF-8") - super(path_or_data, root = nil, domain = nil, localedir = nil, flag = GladeXML::FILE) - end +翻訳する必要のない文字列や翻訳してはいけない文字列を指定しないように注意して下さい。 +Glade XML(.glade)ファイルの方は変更の必要はありません。 -この"domain"名が、本アプリケーション用のIDであり、リソースファイル(moファイル)のファイル名となります。 -#したがって、ここでは、hwedit.moというファイル名になります。 +== rgettextによるカタログファイルのひな型(potファイル)の抽出 +スクリプトの変更が済んだら、次にカタログファイル(各地域別の文字列データを格納したファイル)のひな型を作ります。((<Ruby-GetText-Package|URL:http://ponx.s5.xrea.com/hiki/ja/ruby-gettext.html>))に付属のrgettextというコマンドを使います。 + (MS Windows) + C:\Projects\hwedit>rgettext *.glade *.rb -o .\po\hwedit.pot + + (Linux/FreeBSD) + $ rgettext *.glade *.rb -o ./po/hwedit.pot + +"po"ディレクトリは先に作成しておいて下さい。引数として対象となる全てのファイル(*.rb, *.glade)を指定します。"o"オプションで出力ファイル名を指定できます。 + +"po"ディレクトリは必ずしも作る必要はありませんが、各地域用のカタログファイルはpotファイルをコピーした上で編集して作成するため、プログラムがあるディレクトリがファイルだらけにならないように、あった方がいいと思います。 + +以下は生成されるpotファイルの例です。GladeでGUIを作成した時に表示用に埋め込んだ文字列(自動で設定されたものを含む)と、Rubyスクリプト中の地域化のために修正した箇所の文字列がリストされています。ただしGUIに埋め込んだ文字列のうち、プログラム実行時に自動で地域化(翻訳)されるものはリストされません。 + + # SOME DESCRIPTIVE TITLE. + # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER + # This file is distributed under the same license as the PACKAGE package. + # FIRST AUTHOR <EMAIL @ ADDRESS>, YEAR. + # + #, fuzzy + msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "POT-Creation-Date: 2008-10-27 20:36+0900\n" + "PO-Revision-Date: 2008-10-27 20:36+0900\n" + "Last-Translator: FULL NAME <EMAIL @ ADDRESS>\n" + "Language-Team: LANGUAGE <LL****@li*****>\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + + #: hwedit.glade:8 + msgid "Hello World Editor" + msgstr "" + + #: hwedit.glade:41 + msgid "_File" + msgstr "" + + #: hwedit.glade:105 + msgid "_Edit" + msgstr "" + + #: hwedit.glade:145 + msgid "_Help" + msgstr "" + + #: hwedit.glade:154 + msgid "_About" + msgstr "" + + #: hwedit.glade:279 + msgid "About..." + msgstr "" + + #: hwedit.glade:329 + msgid "<span color=\"red\">hwedit - Hello World Editor</span>\n<span color=\"darkgreen\">This is a sample application for Ruby/Libglade2</span>\nRuby/Glade2 is a part of Ruby-GNOME2.\nCopyright (c) 2004 Ruby-GNOME2 Project Team" + msgstr "" + + #: hwedit.rb:36 + msgid "Open Dialog" + msgstr "" + + #: hwedit.rb:100 + msgid "\n already exists. Do you overwrite it?" + msgstr "" + +hwedit.gladeからは、メインウィンドウのタイトルバーキャプション(これは結局使いませんが)、メニュー項目文字列、アバウトダイアログのタイトルバーキャプション、アバウトダイアログの内容文字列がリストされています。 + +#日本語のリソースを作る場合は、hwedit.potをja/hwedit.poとディレクトリを分けておいてその中身を修正していけばよいでしょう。 +# +#これ以降はまだ書きかけなりm(__)m。 + +== ロケール別メッセージカタログ(poファイル)の作成 +ここからは特定地域(ロケール)向けに翻訳データを作成する地域化の作業になります。 + +まず先ほど作成した"po"ディレクトリ直下に、poファイルをロケール別に分類するためのディレクトリ(ここでは"ja")を作成し、そこにpotファイルをコピーします。 + +次にコピーしたファイルをテキストエディタで開き、編集します。 + +まずはヘッダ部分(最初の空行までのデータ)。 + + "Content-Type: text/plain; charset=UTF-8\n" + + "Plural-Forms: nplurals=1; plural=0;\n" + +翻訳文字列を適切に表示させるために最低限編集が必要なのは、上の2行です。"Content-Type"はpoファイル自体の保存文字コードです。必要があれば、"UTF-8"を"Shift-JIS"など他の文字コード名に書き換えます。ただ今時UTF-8(N)を扱えないエディタも少ないでしょうから、普通は変える必要はないでしょう。"Content-Type"とファイル自体のコードが一致してさえいれば、プログラムの動作は変わりません。 + +もう一つの"Plural-Forms"は、日本語のカタログファイルを作成する場合、とりあえず上の例のように機械的に書き換えておいて下さい。詳しくは((<FFTT : ruby-gettext|URL:http://tech.feedforce.jp/ruby-gettext.html>))などを参考にしてください。 + +{{br}} + +後はプログラムで使用される文字列の翻訳作業になります。"msgid"とペアになっている"msgstr"に"ja"ロケールでプログラムが実行される時に表示したい文字列(翻訳)を書き込みます。 + + #: hwedit.glade:8 + msgid "Hello World Editor" + msgstr "" + + #: hwedit.glade:41 + msgid "_File" + msgstr "ファイル(_F)" + + #: hwedit.glade:105 + msgid "_Edit" + msgstr "編集(_E)" + + #: hwedit.glade:145 + msgid "_Help" + msgstr "ヘルプ(_H)" + + #: hwedit.glade:154 + msgid "_About" + msgstr "hweditについて(_A)" + + #: hwedit.glade:279 + msgid "About..." + msgstr "hweditについて" + + #: hwedit.glade:329 + msgid "<span color=\"red\">hwedit - Hello World Editor</span>\n<span color=\"darkgreen\">This is a sample application for Ruby/Libglade2</span>\nRuby/Glade2 is a part of Ruby-GNOME2.\nCopyright (c) 2004 Ruby-GNOME2 Project Team" + msgstr "<span color=\"red\">hwedit - Hello World Editor</span>\n<span color=\"darkgreen\">Ruby/Libglade2 サンプルアプリケーション</span>\nRuby/Glade2はRuby-GNOME2に含まれています。\nCopyright (c) 2004 Ruby-GNOME2 Project Team" + + #: hwedit.rb:36 + msgid "Open Dialog" + msgstr "ファイルを開く" + + #: hwedit.rb:100 + msgid "\n already exists. Do you overwrite it?" + msgstr "\nは既に存在しています。上書きしますか?" + +このような感じです。"msgid"と同じでかまわない場合は空のままでかまいません。 + +編集が終わったら、"Content-Type"ヘッダと同じ文字コードでファイルを保存し、ファイルの拡張子を"po"に変更します。 + +== メッセージカタログのバイナリ化(moファイルの作成)とインストール + +特定ロケール向けのpoファイルを作成したら、最後にそれをプログラムが読み込むためのバイナリ形式(moファイル)に変換し、プログラムが見つけられる場所(これから挙げるディレクトリ)に置き、地域化は終わりです。 -== rgettextによるカタログファイル(poファイルの抽出) -元ネタは揃ったので、あとはカタログファイルという翻訳ファイルを作ります。((<Ruby-GetText-Package|URL:http://ponx.s5.xrea.com/hiki/ja/ruby-gettext.html>))に付属のrgettextというコマンドを使います。 +{{br}} +moファイルへの変換には、((<Ruby-GetText-Package|URL:http://ponx.s5.xrea.com/hiki/ja/ruby-gettext.html>))付属のrmsgfmtコマンドを使います。 (MS Windows) - C:\>rgettext *.glade *.rb -o hwedit.pot + C:\Projects\hwedit\po\ja>rmsgfmt hwedit.po -o hwedit.mo + (うまくいかない場合は、rmsgfmtを絶対パスにしてみて下さい) (Linux/FreeBSD) - $ rgettext *.glade *.rb -o hwedit.pot + $ rmsgfmt hwedit.po -o hwedit.mo -ここでは、対象となる全てのファイル(*.rb, *.glade)を指定します。 -日本語のリソースを作る場合は、hwedit.potをja/hwedit.poとディレクトリを分けておいてその中身を修正していけばよいでしょう。 +{{br}} + +moファイルのインストール方法ですが、ここでは、プログラムと同じ場所に置くやり方を説明します。この場合、プログラムがある場所(例えば、"C:\Projects\hwedit\")にロケール別の分類用ディレクトリも含め、"locale\ja\LC_MESSAGES\"という構成でディレクトリを作成し、"LC_MESSAGES"にmoファイルを置きます(MS Windows、jaロケールの場合。"locale"にあたるディレクトリの名前は自由ですが、普通は"locale"にします)。 + +このやり方で注意しなければならないのは、置き場所のディレクトリ(ここでは"locale")をプログラムのスクリプト中で指定する必要があることです。具体的には以下のようにします。 + +(hwedit.rb) + # Main program + if __FILE__ == $0 + # Set values as your own application. + PROG_PATH = 'hwedit.glade' + PROG_NAME = 'hwedit' + Hwedit.new(PROG_PATH, nil, PROG_NAME, './locale') # <= ここ + Gtk.main + end + +Hweditをnewする時にmoファイルの置き場所を4番目の引数として指定します。この引数がないと、プログラムはmoファイルを見つけることができません。プログラムはここに指定したディレクトリ以下の場所から、"#{PROG_NAME}.mo"という名前のファイルを探します。 + +{{br}} -これ以降はまだ書きかけなりm(__)m。 \ No newline at end of file +moファイルのインストール方法については、上のものとは別に、Rubyのインストールディレクトリ以下に置くなどのやり方があるのですが、私のMS Windowsの環境ではうまく行かなかったので省略します。詳しくは今までに挙げたウェブサイトを参考にして下さい。