# ソースファイルの作成

Zend_Translate で使用できる さまざまなソース形式についての説明を以下で行います。

大半のフォーマットは、何らかのツールを用いて生成しなければならないことに注意しましょう。 そのツールについては Zend Framework には含まれていません。 ほとんどのフォーマットについてはフリーの生成ツールが存在します。

## Array ソースファイルの作成

Array ソースファイルは、単なる配列です。 しかし、専用のツールはないので自分でそれを定義しなければなりません。 とは言え、この配列は非常にシンプルです。 コードが期待通りに動作しているかを確認するのにも最も手っ取り早いでしょう。 翻訳作業を始めるにあたっては、一般的に最適なアダプタであるといえます。

    $english = array(
        'message1' => 'message1',
        'message2' => 'message2',
        'message3' => 'message3');

    $german = array(
        'message1' => 'Nachricht1',
        'message2' => 'Nachricht2',
        'message3' => 'Nachricht3');

    $translate = new Zend_Translate(
        array(
            'adapter' => 'array',
            'content' => $english,
            'locale'  => 'en'
        )
    );
    $translate->addTranslation(array('content' => $german, 'locale' => 'de'));

リリース 1.5 以降では、配列を外部のファイルに含めることもサポートしています。 ファイル名を指定すると、 Zend_Translate が自動的にそれをインクルードして配列を探します。 詳細は、次の例を参照ください。

    // myarray.php
    return array(
        'message1' => 'Nachricht1',
        'message2' => 'Nachricht2',
        'message3' => 'Nachricht3');

    // コントローラ
    $translate = new Zend_Translate(
        array(
            'adapter' => 'array',
            'content' => '/path/to/myarray.php',
            'locale'  => 'de'
        )
    );

配列を返さないファイルはインクルードできません。 また、このファイル内での出力はすべて無視されます。

## Gettext ソースファイルの作成

Gettext ソースファイルは、GNU の gettext ライブラリで作成します。 あなたのコードをパースして gettext ソースファイルを作成してくれるツールが、 フリーで公開されています。このファイルは、拡張子が *.mo のバイナリファイルとなります。 ファイルを作成するためのフリーソフトウェアのひとつに poEdit があります。これは、ファイルの作成だけでなく翻訳作業自体もサポートしています。

    // mo ファイルを作成し、翻訳を済ませているものとします
    $translate = new Zend_Translate(
        array(
            'adapter' => 'gettext',
            'content' => '/path/to/english.mo',
            'locale'  => 'en'
        )
    );
    $translate->addTranslation(
        array(
            'content' => '/path/to/german.mo',
            'locale' => 'de'
        )
    );

ご覧の通り、アダプタの使用法はまったく同じです。 違っているのはたったの一点だけ。 array が gettext になっているということです。 その他の部分は、どのアダプタを使用してもまったく同じになります。 gettext アダプタを使用する際には、 gettext の標準的なディレクトリ構造や bindtextdomain、 textdomain にこだわる必要はありません。 単にパスとファイル名をアダプタに渡せばいいのです。

ソースのエンコーディングには常に UTF-8 を使用しなければなりません。そうしないと、 複数のソースエンコーディングを使用することで問題が発生します。 たとえば、あるソースファイルは ISO-8815-11 でエンコードされており、 他のファイルは CP815 でエンコードされているとしましょう。 ソースファイルのエンコーディングはひとつしか指定できないので、 どちらか一方は正しく表示されなくなります。

UTF-8 は可搬性の高いフォーマットで、全言語をサポートしています。 すべての言語で UTF-8 を使用することで、 エンコーディングの非互換性による問題をなくすことができます。

gettext エディタの多くは、 空の翻訳文字列という形式で追加情報を記録します。 そのため、gettext アダプタは空の文字列の翻訳を行いません。 これらの情報は翻訳テーブルからは削除され、かわりに getAdapterInfo() メソッドで取得できるようになります。 このメソッドは、追加された gettext ファイルすべてから取得した情報を配列で返します。 ファイル名を配列のキーとして使用します。

    // アダプタの情報を取得する方法
    $translate = new Zend_Translate(
        array(
            'adapter' => 'gettext',
            'content' => '/path/to/english.mo',
            'locale'  => 'en'
        )
    );
    print_r($translate->getAdapterInfo());

## TMX ソースファイルの作成

TMX ソースファイルは、新しい業界標準です。 XML ファイルを使用しているので、どんなエディタでも読み込め、 かつ人間にも読める形式であるという利点があります。 TMX ファイルはテキストエディタで作成することもできますし、 ツールを用いて作成することもできます。しかし、 現在使用できる TMX ソースファイル作成ツールの多くは フリーソフトウェアではありません。

TMX ファイルの例

    <?xml version="1.0" ?>
    <!DOCTYPE tmx SYSTEM "tmx14.dtd">
    <tmx version="1.4">
       <header creationtoolversion="1.0.0" datatype="winres" segtype="sentence"
               adminlang="en-us" srclang="de-at" o-tmf="abc"
               creationtool="XYZTool" >
       </header>
       <body>
           <tu tuid='message1'>
               <tuv xml:lang="de"><seg>Nachricht1</seg></tuv>
               <tuv xml:lang="en"><seg>message1</seg></tuv>
           </tu>
           <tu tuid='message2'>
               <tuv xml:lang="de"><seg>Nachricht2</seg></tuv>
               <tuv xml:lang="en"><seg>message2</seg></tuv>
           </tu>
       </body>
    </tmx>

    $translate = new Zend_Translate(
        array(
            'adapter' => 'tmx',
            'content' => 'path/to/mytranslation.tmx',
            'locale'  => 'en'
        )
    );

TMX ファイルには、同一ファイルに複数の言語を含めることができます。 含まれている言語はすべて自動的に追加されるので、 addLanguage() をコールする必要はありません。

ソース中の特定の言語のみを翻訳対象としたい場合は、オプション defined_language を `TRUE` に設定します。このオプションを指定した場合は、 対象としたい言語を addLanguage() で明示的に指定します。このオプションのデフォルト設定は、 全言語を対象とするようになっています。

オプション useId

useId オプションを `FALSE` に設定すると、 srclang ヘッダが、メッセージを設定する言語を定義するために使われます。

私たちの例では、メッセージのキーは既定では message1 です。 このオプションが `FALSE` に設定されると、 メッセージのキー Nachricht1 が使われます。

srclang 項目に関係する tuv 項目が、 上記の例に示されたように設定される最初の tuv 項目でなければいけないことに注意してください。

## CSV ソースファイルの作成

CSV ソースファイルは、サイズが小さく可読性があります。 顧客が自分で翻訳をしたいということなら、 おそらく CSV アダプタを使用することになるでしょう。

CSV ファイルの例

    # csv ファイルの例
    message1;Nachricht1
    message2;Nachricht2

    $translate = new Zend_Translate(
        array(
            'adapter' => 'csv',
            'content' => '/path/to/mytranslation.csv',
            'locale'  => 'de'
        )
    );
    $translate->addTranslation(
        array(
            'content' => 'path/to/other.csv',
            'locale' => 'fr'
        )
    );

CSV アダプタで使用できるオプションは、 delimiter と limit そして enclosure の 3 つです。

CSV 文字列の標準の区切り文字は ';' 記号です

訳注: カンマ以外で区切ったら、もはや CSV でも何でもないのですが、 そのあたりはあまり気にしない方向で :-)

。 が、オプション delimiter を使用すると、 別の区切り文字を使用できます。

CSV ファイルのデフォルトの行長制限は '0' です。 この場合は、CSV ファイルの行末を自動的に検出します。 limit オプションに何らかの値を設定すると CSV ファイルの読み込みが高速になりますが、 その長さを超えた部分は切り捨てられます。

CSV ファイルの値を囲む文字のデフォルトは '"' です。 別の文字を使用する場合は enclosure オプションを設定します。

CSV ファイルの例 その 2

    # csv ファイルの例
    "message,1",Nachricht1
    message2,"Nachricht,2"
    "message3,",Nachricht3

    $translate = new Zend_Translate(
        array(
            'adapter' => 'csv',
            'content' => '/path/to/mytranslation.csv',
            'locale'  => 'de',
            'delimiter' => ','
        )
    );

    $translate->addTranslation(
        array(
            'content' => '/path/to/other.csv',
            'locale' => 'fr'
        )
    );

CSV ファイルで非 ASCII 文字 (ウムラウトや UTF-8 文字など) を使用する場合は、 値を囲んでおく必要があります。値を囲むのを省略すると、 翻訳で文字が失われてしまったりする可能性があります。

## INI ソースファイルの作成

INI ソースファイルは可読性がありますが、 翻訳以外のデータを含めるとサイズはそれほど小さくなりません。 直接顧客に変更させるようなデータの場合にも INI アダプタが使えるでしょう。

INI ファイルの例

    [Test]
    ;TestPage Comment
    Message_1="Nachricht 1 (de)"
    Message_2="Nachricht 2 (de)"
    Message_3="Nachricht :3 (de)"

    $translate = new Zend_Translate(
        array(
            'adapter' => 'ini',
            'content' => '/path/to/mytranslation.ini',
            'locale'  => 'de'
        )
    );
    $translate->addTranslation(
        array(
            'content' => '/path/to/other.ini',
            'locale' => 'it'
        )
    );

INI にはいくつかの制約があります。 INI ファイルの値に非英数字が含まれる場合は、値をダブルクォート (") で囲まなければなりません。また、 INI ファイルのキーとしては使えない予約語があります。 予約語には `NULL`, yes, no, `TRUE` そして `FALSE` があります。 値に `NULL`, no および `FALSE` を指定するとそれは "" と同じ扱いとなり、yes と `TRUE` を指定するとそれは '1' と同じ扱いとなります。 {}|&~![()" といった文字はキーの中では使えず、 また値の中で使用すると特別な意味を持つことになります。 予期せぬ挙動を起こすようなら、このアダプタを使わないようにしましょう。