<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect3 id="zend.view.helpers.initial.translate">

    <title>翻訳ヘルパー</title>

    <para>
        ウェブサイトを複数言語で提供することもよくあります。
        サイト上のコンテンツを翻訳するには、
        <link linkend="zend.translate.introduction">Zend_Translate</link>
        を使用します。 <classname>Zend_Translate</classname> をビューと統合するために使用するのが
        <emphasis>Translate</emphasis> ビューヘルパーです。
    </para>

    <para>
        これ以降のすべての例では、単純は配列翻訳アダプタを使用します。
        もちろん <classname>Zend_Translate</classname> の任意のインスタンスやお好みの
        <classname>Zend_Translate_Adapter</classname> のサブクラスを使うことも可能です。
        <emphasis>Translate</emphasis> ビューヘルパーのインスタンスを作成するにはいくつかの方法があります。
    </para>

    <itemizedlist>
        <listitem>
            <para>
                事前に <classname>Zend_Registry</classname> に登録済みのインスタンスを使用する
            </para>
        </listitem>
        <listitem>
            <para>
                流れるようなインターフェイスで後から追加する
            </para>
        </listitem>
        <listitem>
            <para>
                クラスのインスタンスの作成時に直接指定する
            </para>
        </listitem>
    </itemizedlist>

    <para>
        登録済みの <classname>Zend_Translate</classname> のインスタンスを使用する方法をおすすめします。
        アダプタをレジストリに追加する際に、使用するロケールを選択できます。
    </para>

    <note>
        <para>
            ここで言語ではなくロケールと言っているのは、
            言語には地域を含む可能性があるからです。
            たとえば英語は様々な地域で話されています。
            イギリス英語やアメリカ英語など複数の翻訳が存在します。
            そこで、ここでは "言語" と言わずに "ロケール" としているのです。
        </para>
    </note>

    <example id="zend.view.helpers.initial.translate.registered">

        <title>登録済みのインスタンス</title>

        <para>
            登録済みのインスタンスを使用するには、まず <classname>Zend_Translate</classname> あるいは
            <classname>Zend_Translate_Adapter</classname> のインスタンスを作成し、
            それを <classname>Zend_Registry</classname> に登録します。登録する際のキーとして
            <classname>Zend_Translate</classname> を使用します。
        </para>

        <programlisting language="php"><![CDATA[
// サンプルアダプタ
$adapter = new Zend_Translate(
    array(
        'adapter' => 'array',
        'content' => array('simple' => 'einfach'),
        'locale'  => 'de'
    )
);
Zend_Registry::set('Zend_Translate', $adapter);

// ビューの中で
echo $this->translate('simple');
// これは 'einfach' を返します
]]></programlisting>

    </example>

    <para>
        流れるようなインターフェイスのほうがなじみがあるという場合は、
        ビューの中でインスタンスを作成し、ヘルパーのインスタンスは後で作成することもできます。
    </para>

    <example id="zend.view.helpers.initial.translate.afterwards">

        <title>ビューの中で</title>

        <para>
            流れるようなインターフェイスで <classname>Zend_Translate</classname> あるいは
            <classname>Zend_Translate_Adapter</classname> のインスタンスを作成するには、
            パラメータを指定せずにヘルパーをコールし、それから
            <methodname>setTranslator()</methodname> メソッドをコールします。
        </para>

        <programlisting language="php"><![CDATA[
// ビューの中で
$adapter = new Zend_Translate(
    array(
        'adapter' => 'array',
        'content' => array('simple' => 'einfach'),
        'locale'  => 'de'
    )
);
$this->translate()->setTranslator($adapter)->translate('simple');
// これは 'einfach' を返します
]]></programlisting>

    </example>

    <para>
        ヘルパーを <classname>Zend_View</classname> なしで使用すると、
        ヘルパーを直接使用することもできます。
    </para>

    <example id="zend.view.helpers.initial.translate.directly">

        <title>直接使用する方法</title>

        <programlisting language="php"><![CDATA[
// サンプルアダプタ
$adapter = new Zend_Translate(
    array(
        'adapter' => 'array',
        'content' => array('simple' => 'einfach'),
        'locale'  => 'de'
    )
);

// アダプタを初期化します
$translate = new Zend_View_Helper_Translate($adapter);
print $translate->translate('simple'); // これは 'einfach' を返します
]]></programlisting>

        <para>
            <classname>Zend_View</classname> は使わないけれど、
            翻訳した結果がほしいという場合にこの方式を使用します。
        </para>

    </example>

    <para>
        これまで見てきたように、<methodname>translate()</methodname> メソッドは翻訳を返します。
        翻訳アダプタのメッセージ ID を指定してこれをコールします。
        さらに、翻訳文字列の中のパラメータを置換することも可能です。
        パラメータの値を指定する方法には二通りあります。
        パラメータのリストを指定する方法か、あるいはパラメータの配列を指定する方法です。
        たとえば次のようになります。
    </para>

    <example id="zend.view.helpers.initial.translate.parameter">

        <title>単一のパラメータ</title>

        <para>
            単一のパラメータを使用するには、単にそれをメソッドに追加します。
        </para>

        <programlisting language="php"><![CDATA[
// ビューの中で
$date = "Monday";
$this->translate("Today is %1\$s", $date);
// これは 'Heute ist Monday' を返します
]]></programlisting>

    </example>

    <note>
        <para>
            パラメータの値にテキストを使用する場合は、
            このパラメータの値も翻訳しなければならないことに注意しましょう。
        </para>
    </note>

    <example id="zend.view.helpers.initial.translate.parameterlist">

        <title>パラメータのリスト</title>

        <para>
            パラメータのリストを使用して、それをメソッドに追加することもできます。
        </para>

        <programlisting language="php"><![CDATA[
// ビューの中で
$date = "Monday";
$month = "April";
$time = "11:20:55";
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s",
                 $date,
                 $month,
                 $time);
// これは 'Heute ist Monday in April. Aktuelle Zeit: 11:20:55' を返します
]]></programlisting>

    </example>

    <example id="zend.view.helpers.initial.translate.parameterarray">

        <title>パラメータの配列</title>

        <para>
            パラメータの配列を使用して、それをメソッドに追加することもできます。
        </para>

        <programlisting language="php"><![CDATA[
// ビューの中で
$date = array("Monday", "April", "11:20:55");
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
// これは 'Heute ist Monday in April. Aktuelle Zeit: 11:20:55' を返します
]]></programlisting>

    </example>

    <para>
        翻訳のロケールを変更しなければならないこともあるでしょう。
        翻訳単位で動的に変更することもできますが、
        静的に変更してそれ以降のすべての翻訳に適用させることもできます。
        そして、パラメータリスト型あるいはパラメータ配列型のどちらの形式でもそれを使用できます。
        どひらの形式の場合も、ロケールは最後のパラメータとして指定します。
    </para>

    <example id="zend.view.helpers.initial.translate.dynamic">

        <title>ロケールの動的な変更</title>

        <programlisting language="php"><![CDATA[
// ビューの中で
$date = array("Monday", "April", "11:20:55");
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date, 'it');
]]></programlisting>

    </example>

    <para>
        この例は、指定したメッセージ ID に対応するイタリア語の翻訳を返します。
        しかし、イタリア語を返すのはこのときだけです。
        次の翻訳では、アダプタに設定されているロケールを使用します。
        通常は、使用したいロケールを翻訳アダプタに設定してからレジストリに追加します。
        しかし、ロケールの設定をヘルパー内で行うこともできます。
    </para>

    <example id="zend.view.helpers.initial.translate.static">

        <title>ロケールの静的な変更</title>

        <programlisting language="php"><![CDATA[
// ビューの中で
$date = array("Monday", "April", "11:20:55");
$this->translate()->setLocale('it');
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
]]></programlisting>

    </example>

    <para>
        上の例では新しいデフォルトロケールとして <emphasis>'it'</emphasis>
        を設定しており、これ以降の翻訳ではこのロケールを使用します。
    </para>

    <para>
        もちろん、現在設定されているロケールを取得するためのメソッド
        <methodname>getLocale()</methodname> もあります。
    </para>

    <example id="zend.view.helpers.initial.translate.getlocale">

        <title>現在設定されているロケールの取得</title>

        <programlisting language="php"><![CDATA[
// ビューの中で
$date = array("Monday", "April", "11:20:55");

// これまでの例で設定されているデフォルトロケールである 'de' を返します
$this->translate()->getLocale();

$this->translate()->setLocale('it');
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);

// 新たに設定されたデフォルトロケールである 'it' を返します
$this->translate()->getLocale();
]]></programlisting>

    </example>

</sect3>
<!--
vim:se ts=4 sw=4 et:
-->
