Translations / i18n / localizations for programs/ja
│
Deutsch (de) │
English (en) │
español (es) │
français (fr) │
日本語 (ja) │
한국어 (ko) │
polski (pl) │
português (pt) │
русский (ru) │
中文(中国大陆) (zh_CN) │
概要
このページでは、プログラムで用いる文字列を英語、中国語、ドイツ語、フィンランド語、イタリア語…といった各国語にあわせて変更することができるようにする方法を紹介します。基本的には、次のようになります : 各々のキャプションに resourcestring (リソース文字列定義)を加え、コンパイルして .rst ファイルないしは .po ファイルを得ます(IDE が自動的に行います)。各国語用にそれぞれ一つの翻訳済み .po ファイルを生成し、LCL の translations ユニット内の関数を用いて、プログラムの起動時に、正しいものをロードします。
Resourcestrings
例:
resourcestring Caption1 = 'Some text'; HelloWorld1 = 'Hello World';
これらは通常の文字列定数と同様に、いかなる文字列にも代入することができます。例えば
Label1.Caption := HelloWorld1;
コンパイル時にfpc は unitname.rst を各ユニットに一つ生成します。その中にはリソース文字列のデータ(名前と中身)が含まれます。
.po ファイル
生成した .po ファイルを編集するためには、数多くのグラフィカルツールが無料で提供されています。実際 .po ファイルは .rst ファイル同様単なるテキストファイルですが、作者・文字コード・言語・日付といった要素を含んだヘッダのような付随的な要素を含んでいます。fpc をインストールすれば必ず rstconv というツールがついてきます (Windowsでは rstconv.exe)。このツールは .rst ファイルを .po ファイルに変換します。IDE を使うと、この変換操作を自動的に行うことができます。フリーなツールの例としては kbabel、poedit があります。
直接 rstconv を用いる例:
rstconv -i unit1.rst -o unit1.po
翻訳
それぞれの言語用に .po ファイルをコピーして翻訳する必要があります。LCL の translation ユニットは標準言語コード (en=英語, de=ドイツ語, it=イタリア語, ...) を用いて言語を検索します。例えば、unit1.po のドイツ語版は unit1.de.po となります。つまり、unit1.po ファイルを unit1.de.po、unit1.it.po などなどサポートしようと思っている言語用の名前でコピーして、そのファイルを各国語の翻訳者が編集すればいいわけです。
ブラジル人/ポルトガル人への註:: Lazarus IDE と LCL はブラジルのポルトガル語(拡張子 'pb.po')だけを用意しており、 'pt.po' はありません。
自動的に .po ファイルをアップデートする IDE のオプション
- リソース文字列を含むユニットをパッケージないしプロジェクトに加えます。
- .po ファイルを単独のディレクトリにいれ、そのパスを指定します。例えばパッケージ/プロジェクトのディレクトリに language という名前のサブディレクトリを作ります。プロジェクトに追加する場合は Project > Project Options に、パッケージに追加する場合は Options > IDE integration に行きます。
フォーム、データモジュール、フレームの翻訳
プロジェクトやパッケージの国際化(i18n、internationalisationの略)オプションが選択されていれば、IDE はユニットを保存する際、自動的に各フォームにつき一つの .lrt ファイルを生成します。例えば、unit1.pas を保存すると unit1.lrt ができます。ですから、最初にこのオプションを選択した後で、全てのフォームを一度は開き、少しいじって、保存してください。コンパイル時には、IDE が全ての .lrt ファイルに存在する全ての文字列を集めて国際化ディレクトリの中の単一の .po ファイルにまとめます(プロジェクト名.po ないしは パッケージ名.po)。
プログラム起動時の処理
全ての .po ファイルについてそれぞれに、LCL translations ユニットに含まれる TranslateUnitResourceStrings を呼ばなければなりません。例えば、:
<pascal>
{まず、"gettext" および "translations" ユニットを uses 節に加える} procedure TForm1.FormCreate(Sender: TObject); var PODirectory, Lang, FallbackLang: String; begin PODirectory := '/path/to/lazarus/lcl/languages/'; GetLanguageIDs(Lang, FallbackLang); // in unit gettext TranslateUnitResourceStrings('LCLStrConsts', PODirectory + 'lclstrconsts.%s.po', Lang, FallbackLang); MessageDlg('Title', 'Text', mtInformation, [mbOk, mbCancel, mbYes], 0); end;
</pascal>
Future work / ToDos
IDE Development: Translations, i18n, lrt, po files