How To Localize GetText

概要

GetTextはソフトウェアの国際化と地域化のための開発ライブラリ・コマンド群です。 GetTextを用いることで、開発と翻訳の役割を切り離し、効率的に作業を行うことができます。

POT, PO, MO Fileの説明

  • POT (Potable Object Template) - ソースファイルから生成される翻訳リソースの基となるファイル
  • PO (Portable Object) - POT Fileを基に各言語に翻訳したファイル
  • MO (Machine Object) - PO Fileと同じ内容が記されたバイナリ形式のファイル .potファイルや現状の.poファイルを編集し、.poファイルと.moファイルとして出力できます。

POT File と PO Fileの違い

.potファイルと.poファイルは基本的には同じですが、使用方法に違いがあります。 翻訳者は.potファイルを受け取り、各言語に.poファイルとして編集することができます。

POT File と PO Fileの無料編集エディタ

一番良く知られている編集エディタとしては PoEdit があります。

GetTextのインストール

GetTextを開発環境に合わせてインストールしてください。

  • Mac OSの場合

    brew install gettext

    または

    port install gettext

  • CentOSの場合

    yum install gettext

  • Ubuntuの場合

    こちらからダウンロードします。

基本的な処理手順

一般的なローカライズの処理手順は以下の通りです。

  1. コード中にメッセージIDを記述する
  2. メッセージIDに対応する、翻訳のためのテンプレートファイル(.potファイル)を作成する
  3. テンプレートファイルを基に各言語に翻訳し、テンプレートカタログ(.poファイル)を作成する
  4. メッセージカタログをバイナリファイル(.moファイル)に変換する

GetText関数の使い方

GetTextはC言語以外にもPHP,Pythonなどの様々な言語で実装されています。

C言語の場合

  1. 多言語化したい各ファイルの先頭または中心となるヘッダ部分に以下の行を記述します。 ここでは、hello.cに記述しているものとします。
    #include <libintl.h>
    #define _(String) gettext(String)
    #define N_(String) gettext_noop(String)
    #define gettext_noop(String) (String)
  1. 翻訳したい文字列をGetText関数へ渡すために以下のようにラップします。
    puts("Hello, World!");

    puts(_("Hello, World!"));
  1. xgettextコマンドで翻訳したい文字列を抽出し、.potファイルに変換します。
    xgettext -k"_" -o hello.pot hello.c

このコマンドの引数はそれぞれ以下のような意味を表します。

    xgettext -kキーワード -o XXYY.pot 抽出対象ファイル

生成されたhello.potファイルの対応部分は以下のようになります。

    msgid "Hello World!"
    msgstr ""
  1. msginitコマンドで翻訳したい言語のリソースファイルを生成します(.poファイル)。 ここでは、日本語に翻訳をしたいものとします。
    msginit --locale=ja --input=hello.pot
  1. 生成した.poファイルをPoEditなどのエディタを用いて翻訳する。
    msgid "Hello World!"
    msgstr "こんにちは世界"
  1. msgfmtコマンドで翻訳した.poファイルを.moファイルへとコンパイルします。
    msgfmt -o hello.mo hello.po

複数形の対応

翻訳の際における、名詞の単数・複数形の対処の方法を紹介します。 .poファイルに以下のような英文の翻訳対象があるとします。

msgidが単数時を表し、msgid_pluralが複数時を表します。

  • 英語→日本語の場合

      msgid "One file removed"
      msgid_plural "%d files removed"
      msgstr[0] "%d個のファイルを削除しました"
    

    英語には単数形と複数形で表記が違いますが、日本語では単数複数の区別がないので1種類の翻訳になります。 この際、単数複数の区別が無いことを示すために.poファイルの先頭に以下の行を記述します。

      Plural-Forms: nplurals=1; plural=0;
    
  • 日本語→英語の場合

      msgid "%d個のファイルを削除しました"
      msgstr[0] "One file removed"
      msgstr[1] "%d files removed"
    

    この際、翻訳言語の英語には2通りの表記があることを示すために.poファイルの先頭に以下の行を記述します。

      Plural-Forms: nplurals=2; plural=n != 1;
    

Need experienced translators to translate your localization files? Conyac is the perfect solution!
Reliable, Fast, and Affordable.