おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

r3 と stickleback を試してみる - 翻訳 (Translation)

デモのチュートリアルを引き続き試してみます。
今日のところは、翻訳(translation)あたりです。最後です。コード貼り付けがやたら多く、内容は無いけれど長文エントリになってます。

翻訳 (Translation)

Translationとは、各intl毎に用語を翻訳する仕組みです。用語に該当するのは<r3:trans>Container</r3:trans>という感じで、テンプレート上でr3:transタグで囲んでいるところになります。
全ての、翻訳済み、未翻訳の箇所を一覧表示するには、以下のように叩きます。

$ r3 translation list
cars/ca
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cars/fr
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cars/generic_intl
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cars/jp
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Japanese Header:              Japanese Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cars/us
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cookery/ca
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cookery/fr
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cookery/generic_intl
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cookery/jp
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Japanese Header:              Japanese Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cookery/us
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
generic_product/ca
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
generic_product/fr
    Cars Navigation:              Cars Navigation
    Cars Site Branding:           Cars Site Branding
    Container:                    Container
    Content:                      Content
    Cookery Navigation:           Cookery Navigation
    Cookery Site Branding:        Cookery Site Branding
    Core Branding:                Core Branding
    Header:                       Header
    Navigation:                   Navigation
    Site Branding:                Site Branding
    Wine Navigation:              Wine Navigation
generic_product/generic_intl
    Cars Navigation:              Cars Navigation
    Cars Site Branding:           Cars Site Branding
    Container:                    Container
    Content:                      Content
    Cookery Navigation:           Cookery Navigation
    Cookery Site Branding:        Cookery Site Branding
    Core Branding:                Core Branding
    Header:                       Header
    Navigation:                   Navigation
    Site Branding:                Site Branding
    Wine Navigation:              Wine Navigation
generic_product/jp
    Cars Navigation:              Cars Navigation
    Cars Site Branding:           Cars Site Branding
    Container:                    Container
    Content:                      Content
    Cookery Navigation:           Cookery Navigation
    Cookery Site Branding:        Cookery Site Branding
    Core Branding:                Core Branding
    Header:                       Header
    Japanese Header:              Japanese Header
    Navigation:                   Navigation
    Site Branding:                Site Branding
    Wine Navigation:              Wine Navigation
generic_product/us
    Cars Navigation:              Cars Navigation
    Cars Site Branding:           Cars Site Branding
    Container:                    Container
    Content:                      Content
    Cookery Navigation:           Cookery Navigation
    Cookery Site Branding:        Cookery Site Branding
    Core Branding:                Core Branding
    Header:                       Header
    Navigation:                   Navigation
    Site Branding:                Site Branding
    Wine Navigation:              Wine Navigation
wine/ca
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
wine/fr
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
wine/generic_intl
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
wine/jp
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Japanese Header:              Japanese Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
wine/us
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]

用語の後に "[i]" というのが付いているものと付いていないものがありますが、これは、genericなり、他の言語なりを継承しているということを示しています。(inheritanceの"i")
ちょっと忘れてしまったので、再度、継承関係を見てみます。productとintlの翻訳ドメインの継承ツリーを見るためには、以下のように叩きます。

$ r3 inheritance list translation
product:
   generic_product
       cars
       cookery
           wine
intl:
   jp
   us
   fr
       ca
   generic_intl

ここにある、各プロダクト(実際の3プロダクトに継承ルートとなっているgeneric_productで4個)に、各intl(同じく3intlにgeneric_intlを加えて4個)が掛け合わされて、サイトが20個作成されていき、その際に、Translationの継承関係が参照されています。
Translation側では、jp・us・fr・generic_intlがルートにあり、 fr の下に ca (フランス語圏カナダ)がぶら下がっている形です。(詳しくは、以前の記事を参照) これをふまえて、先ほどの出力を見直してみます。
プロダクトの [i] が付いていないサイトは

  • generic_product/fr
  • generic_product/generic_intl
  • generic_product/jp
  • generic_product/us

の4つです。要は、intlのルートにあるものとなっていることが分かると思います。そして、ca が fr を継承しているため、

  • generic_product/ca [i]

と、ca だけは、継承フラグが付いています。さらに、cars/jp などになると、今度はプロダクトの依存関係で、generic_product/jp が継承されるというワケです。

個々の用語に設定する訳をr3のコマンドラインで設定することも可能ですが、より一般的なアプローチとして、特定のサイトもしくは全てのサイトの訳設定をXLIFFファイルとして保存し、これを第三者に送って翻訳してもらうといったことができます。

XLIFF

XLIFFというのは、初めて聞きました。調べてみると、

XLIFF (XML Localization Interchange File Format)はソフトウェア提供者,ローカリゼーションサービス提供者,ローカリゼーションツール提供者のグループによって設計されたXMLローカリゼーション交換ファイルフォーマットです。

http://www.tradic.jp/tr/oasis/xliff/xliff-specification.html

ということで、OASISで標準化されているローカライズXMLファイルフォーマットのようです。

Sunのオープンソースの翻訳支援ツールOLT:open-language-toolsでも利用されているようです。
GUIのエディタもあるので、試しにこのXLIFFファイルを読み込んでみたのですが、開けませんでした。んー。

翻訳設定の保存

以下のように、全ての翻訳設定を保存できます。

$ r3 translation save all alltrans.xml
all dictionary data saved in file 'alltrans.xml'

そして、alltrans.xmlを開くと以下のように記述されます。

<?xml version="1.0" encoding="UTF-8"?>
<xliff version='1.1'
       xmlns='http://developer.yahoo.com/xmlns/r3/xliff'
       xmlns:sup='http://developer.yahoo.com/xmlns/r3/xliff-sup-1'>
    <file original='generic_product/fr/generic'
          source-language='en'
          target-language='fr'
          datatype='plaintext'>
        <body>
            <trans-unit id='26'>
                <source>Cars Navigation</source>
                <target>Cars Navigation</target>
            </trans-unit>
            <trans-unit id='25'>
                <source>Cars Site Branding</source>
                <target>Cars Site Branding</target>
            </trans-unit>
            <trans-unit id='1'>
                <source>Container</source>
                <target>Container</target>
            </trans-unit>
            <trans-unit id='6'>
                <source>Content</source>
                <target>Content</target>
            </trans-unit>
            <trans-unit id='35'>
                <source>Cookery Navigation</source>
                <target>Cookery Navigation</target>
            </trans-unit>
            <trans-unit id='34'>
                <source>Cookery Site Branding</source>
                <target>Cookery Site Branding</target>
            </trans-unit>
            <trans-unit id='3'>
                <source>Core Branding</source>
                <target>Core Branding</target>
            </trans-unit>
            <trans-unit id='2'>
                <source>Header</source>
                <target>Header</target>
            </trans-unit>
            <trans-unit id='5'>
                <source>Navigation</source>
                <target>Navigation</target>
            </trans-unit>
            <trans-unit id='4'>
                <source>Site Branding</source>
                <target>Site Branding</target>
            </trans-unit>
            <trans-unit id='42'>
                <source>Wine Navigation</source>
                <target>Wine Navigation</target>
            </trans-unit>
        </body>
    </file>
    <file original='generic_product/generic_intl/generic'
          source-language='en'
          target-language='generic_intl'
          datatype='plaintext'>
        <body>
            <trans-unit id='28'>
                <source>Cars Navigation</source>
                <target>Cars Navigation</target>
            </trans-unit>
            <trans-unit id='27'>
                <source>Cars Site Branding</source>
                <target>Cars Site Branding</target>
            </trans-unit>
            <trans-unit id='7'>
                <source>Container</source>
                <target>Container</target>
            </trans-unit>
            <trans-unit id='12'>
                <source>Content</source>
                <target>Content</target>
            </trans-unit>
            <trans-unit id='37'>
                <source>Cookery Navigation</source>
                <target>Cookery Navigation</target>
            </trans-unit>
            <trans-unit id='36'>
                <source>Cookery Site Branding</source>
                <target>Cookery Site Branding</target>
            </trans-unit>
            <trans-unit id='9'>
                <source>Core Branding</source>
                <target>Core Branding</target>
            </trans-unit>
            <trans-unit id='8'>
                <source>Header</source>
                <target>Header</target>
            </trans-unit>
            <trans-unit id='11'>
                <source>Navigation</source>
                <target>Navigation</target>
            </trans-unit>
            <trans-unit id='10'>
                <source>Site Branding</source>
                <target>Site Branding</target>
            </trans-unit>
            <trans-unit id='43'>
                <source>Wine Navigation</source>
                <target>Wine Navigation</target>
            </trans-unit>
        </body>
    </file>
    <file original='generic_product/jp/generic'
          source-language='en'
          target-language='jp'
          datatype='plaintext'>
        <body>
            <trans-unit id='31'>
                <source>Cars Navigation</source>
                <target>Cars Navigation</target>
            </trans-unit>
            <trans-unit id='30'>
                <source>Cars Site Branding</source>
                <target>Cars Site Branding</target>
            </trans-unit>
            <trans-unit id='13'>
                <source>Container</source>
                <target>Container</target>
            </trans-unit>
            <trans-unit id='18'>
                <source>Content</source>
                <target>Content</target>
            </trans-unit>
            <trans-unit id='39'>
                <source>Cookery Navigation</source>
                <target>Cookery Navigation</target>
            </trans-unit>
            <trans-unit id='38'>
                <source>Cookery Site Branding</source>
                <target>Cookery Site Branding</target>
            </trans-unit>
            <trans-unit id='15'>
                <source>Core Branding</source>
                <target>Core Branding</target>
            </trans-unit>
            <trans-unit id='14'>
                <source>Header</source>
                <target>Header</target>
            </trans-unit>
            <trans-unit id='29'>
                <source>Japanese Header</source>
                <target>Japanese Header</target>
            </trans-unit>
            <trans-unit id='17'>
                <source>Navigation</source>
                <target>Navigation</target>
            </trans-unit>
            <trans-unit id='16'>
                <source>Site Branding</source>
                <target>Site Branding</target>
            </trans-unit>
            <trans-unit id='44'>
                <source>Wine Navigation</source>
                <target>Wine Navigation</target>
            </trans-unit>
        </body>
    </file>
    <file original='generic_product/us/generic'
          source-language='en'
          target-language='us'
          datatype='plaintext'>
        <body>
            <trans-unit id='33'>
                <source>Cars Navigation</source>
                <target>Cars Navigation</target>
            </trans-unit>
            <trans-unit id='32'>
                <source>Cars Site Branding</source>
                <target>Cars Site Branding</target>
            </trans-unit>
            <trans-unit id='19'>
                <source>Container</source>
                <target>Container</target>
            </trans-unit>
            <trans-unit id='24'>
                <source>Content</source>
                <target>Content</target>
            </trans-unit>
            <trans-unit id='41'>
                <source>Cookery Navigation</source>
                <target>Cookery Navigation</target>
            </trans-unit>
            <trans-unit id='40'>
                <source>Cookery Site Branding</source>
                <target>Cookery Site Branding</target>
            </trans-unit>
            <trans-unit id='21'>
                <source>Core Branding</source>
                <target>Core Branding</target>
            </trans-unit>
            <trans-unit id='20'>
                <source>Header</source>
                <target>Header</target>
            </trans-unit>
            <trans-unit id='23'>
                <source>Navigation</source>
                <target>Navigation</target>
            </trans-unit>
            <trans-unit id='22'>
                <source>Site Branding</source>
                <target>Site Branding</target>
            </trans-unit>
            <trans-unit id='45'>
                <source>Wine Navigation</source>
                <target>Wine Navigation</target>
            </trans-unit>
        </body>
    </file>
</xliff>

fileタグのoriginal属性は、翻訳のlocationを示しています。fileノードは以下の4つが出てきています。

  • generic_product/fr/generic (source: en, target: fr)
  • generic_product/generic_intl/generic (source: en, target: generic_intl)
  • generic_product/jp/generic (source: en, target: jp)
  • generic/us/generic (source: en. target: us)

generic_intlへの翻訳というのも謎です。また、fr を継承しているとはいえ、ca (フランス語圏カナダ) がありません。
enからusに翻訳っていうのは不思議ではありますが、ここでのsourceは、変数名的な扱いに見てもよいし、もちろん英語中心のサービスなら、そのままen→usの翻訳には手を加えないというのもアリだと思います。

見て分かるように、たくさんの翻訳の多くが継承元のgenericのレベルにあります。 これは、このプロジェクトを作っているときに、genericなものも含めて全生成を行ったこと。そして、その生成処理で、genericレベルに翻訳をいくつか挿入しているためです。(うー。意味わかんない)
この解決策として、2つの方法があります、1つ目は、"r3 translation clear" で辞書(dictionary)を完全にクリアして、各ターゲットを、親を先に生成することを忘れないように注意しながら再生成を行うという方法。そして2つ目は、継承関係を有効にしたまま、それぞれのサイトの辞書を別々にエクスポート、そしてそれから結果を後でマージするという方法です。ここでは後者でやっていきます。

翻訳のインポート・エクスポート

まず、frに対してやってみます。

$ r3 translation save inherited generic_product/fr fr.xml
generic_product/fr and inherited dictionary data saved in file 'fr.xml'

fr.xmlを開いてみると、まだ多くの訳が、より一般的(generic)なレベルにあったとしても、全てがfrのレベルにあると見なすことができます。

<?xml version="1.0" encoding="UTF-8"?>
<xliff version='1.1'
       xmlns='http://developer.yahoo.com/xmlns/r3/xliff'
       xmlns:sup='http://developer.yahoo.com/xmlns/r3/xliff-sup-1'>
    <file original='generic_product/fr/generic'
          source-language='en'
          target-language='fr'
          datatype='plaintext'>
        <body>
            <trans-unit id='1'>
                <source>Cars Navigation</source>
                <target>Cars Navigation</target>
            </trans-unit>
            <trans-unit id='2'>
                <source>Cars Site Branding</source>
                <target>Cars Site Branding</target>
            </trans-unit>
            <trans-unit id='3'>
                <source>Container</source>
                <target>Container</target>
            </trans-unit>
            <trans-unit id='4'>
                <source>Content</source>
                <target>Content</target>
            </trans-unit>
            <trans-unit id='5'>
                <source>Cookery Navigation</source>
                <target>Cookery Navigation</target>
            </trans-unit>
            <trans-unit id='6'>
                <source>Cookery Site Branding</source>
                <target>Cookery Site Branding</target>
            </trans-unit>
            <trans-unit id='7'>
                <source>Core Branding</source>
                <target>Core Branding</target>
            </trans-unit>
            <trans-unit id='8'>
                <source>Header</source>
                <target>Header</target>
            </trans-unit>
            <trans-unit id='9'>
                <source>Navigation</source>
                <target>Navigation</target>
            </trans-unit>
            <trans-unit id='10'>
                <source>Site Branding</source>
                <target>Site Branding</target>
            </trans-unit>
            <trans-unit id='11'>
                <source>Wine Navigation</source>
                <target>Wine Navigation</target>
            </trans-unit>
        </body>
    </file>
</xliff>

このファイルを編集し、そして(偽物の)フランス語翻訳を各用語に対して行います。各用語について、角括弧で囲んで、frと付けていきます。"Wine Navigation" なら、 "[fr Wine Navigation]" といったぐあいです。

<trans-unit id='1'>
    <source>Cars Navigation</source>
    <target>[fr Cars Navigation]</target>
</trans-unit>

って感じ。

次に、辞書にこれらの訳をマージします。

$ r3 translation merge fr.xml
dictionary data merged from file 'fr.xml'

ここで行われるマージ操作は、ちょっと難解です。全てのsourceの値について、継承チェーンにその値が既に存在するかどうか探します。もし、見つかったなら、訳を比較し、元と同じであれば、そのレコードはデータベースには挿入されません。
チェーンに同じソースが見つからない場合、もしくは訳がソースとは異なっている場合は、そのレコードが定義されたロケーションの辞書に挿入されます。(ここの場合は、generic_product/fr)
もう1度translation listを見てみると、generic_product/frと、それを継承したプロダクト、cars/frcookery/frwine/fr、さらには、fr を intlで継承する caの各プロダクト、generic_product/cacars/cacookery/cawine/ca に翻訳が反映されていることが分かります。

$ r3 translation list
cars/ca
    Cars Navigation:              [fr Cars Navigation] [i]
    Cars Site Branding:           [fr Cars Site Branding] [i]
    Container:                    [fr Container] [i]
    Content:                      [fr Content] [i]
    Cookery Navigation:           [fr Cookery Navigation] [i]
    Cookery Site Branding:        [fr Cookery Site Branding] [i]
    Core Branding:                [fr Core Branding] [i]
    Header:                       [fr Header] [i]
    Navigation:                   [fr Navigation] [i]
    Site Branding:                [fr Site Branding] [i]
    Wine Navigation:              [fr Wine Navigation] [i]
cars/fr
    Cars Navigation:              [fr Cars Navigation] [i]
    Cars Site Branding:           [fr Cars Site Branding] [i]
    Container:                    [fr Container] [i]
    Content:                      [fr Content] [i]
    Cookery Navigation:           [fr Cookery Navigation] [i]
    Cookery Site Branding:        [fr Cookery Site Branding] [i]
    Core Branding:                [fr Core Branding] [i]
    Header:                       [fr Header] [i]
    Navigation:                   [fr Navigation] [i]
    Site Branding:                [fr Site Branding] [i]
    Wine Navigation:              [fr Wine Navigation] [i]
cars/generic_intl
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cars/jp
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Japanese Header:              Japanese Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cars/us
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cookery/ca
    Cars Navigation:              [fr Cars Navigation] [i]
    Cars Site Branding:           [fr Cars Site Branding] [i]
    Container:                    [fr Container] [i]
    Content:                      [fr Content] [i]
    Cookery Navigation:           [fr Cookery Navigation] [i]
    Cookery Site Branding:        [fr Cookery Site Branding] [i]
    Core Branding:                [fr Core Branding] [i]
    Header:                       [fr Header] [i]
    Navigation:                   [fr Navigation] [i]
    Site Branding:                [fr Site Branding] [i]
    Wine Navigation:              [fr Wine Navigation] [i]
cookery/fr
    Cars Navigation:              [fr Cars Navigation] [i]
    Cars Site Branding:           [fr Cars Site Branding] [i]
    Container:                    [fr Container] [i]
    Content:                      [fr Content] [i]
    Cookery Navigation:           [fr Cookery Navigation] [i]
    Cookery Site Branding:        [fr Cookery Site Branding] [i]
    Core Branding:                [fr Core Branding] [i]
    Header:                       [fr Header] [i]
    Navigation:                   [fr Navigation] [i]
    Site Branding:                [fr Site Branding] [i]
    Wine Navigation:              [fr Wine Navigation] [i]
cookery/generic_intl
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cookery/jp
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Japanese Header:              Japanese Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
cookery/us
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
generic_product/ca
    Cars Navigation:              [fr Cars Navigation] [i]
    Cars Site Branding:           [fr Cars Site Branding] [i]
    Container:                    [fr Container] [i]
    Content:                      [fr Content] [i]
    Cookery Navigation:           [fr Cookery Navigation] [i]
    Cookery Site Branding:        [fr Cookery Site Branding] [i]
    Core Branding:                [fr Core Branding] [i]
    Header:                       [fr Header] [i]
    Navigation:                   [fr Navigation] [i]
    Site Branding:                [fr Site Branding] [i]
    Wine Navigation:              [fr Wine Navigation] [i]
generic_product/fr
    Cars Navigation:              [fr Cars Navigation]
    Cars Site Branding:           [fr Cars Site Branding]
    Container:                    [fr Container]
    Content:                      [fr Content]
    Cookery Navigation:           [fr Cookery Navigation]
    Cookery Site Branding:        [fr Cookery Site Branding]
    Core Branding:                [fr Core Branding]
    Header:                       [fr Header]
    Navigation:                   [fr Navigation]
    Site Branding:                [fr Site Branding]
    Wine Navigation:              [fr Wine Navigation]
generic_product/generic_intl
    Cars Navigation:              Cars Navigation
    Cars Site Branding:           Cars Site Branding
    Container:                    Container
    Content:                      Content
    Cookery Navigation:           Cookery Navigation
    Cookery Site Branding:        Cookery Site Branding
    Core Branding:                Core Branding
    Header:                       Header
    Navigation:                   Navigation
    Site Branding:                Site Branding
    Wine Navigation:              Wine Navigation
generic_product/jp
    Cars Navigation:              Cars Navigation
    Cars Site Branding:           Cars Site Branding
    Container:                    Container
    Content:                      Content
    Cookery Navigation:           Cookery Navigation
    Cookery Site Branding:        Cookery Site Branding
    Core Branding:                Core Branding
    Header:                       Header
    Japanese Header:              Japanese Header
    Navigation:                   Navigation
    Site Branding:                Site Branding
    Wine Navigation:              Wine Navigation
generic_product/us
    Cars Navigation:              Cars Navigation
    Cars Site Branding:           Cars Site Branding
    Container:                    Container
    Content:                      Content
    Cookery Navigation:           Cookery Navigation
    Cookery Site Branding:        Cookery Site Branding
    Core Branding:                Core Branding
    Header:                       Header
    Navigation:                   Navigation
    Site Branding:                Site Branding
    Wine Navigation:              Wine Navigation
wine/ca
    Cars Navigation:              [fr Cars Navigation] [i]
    Cars Site Branding:           [fr Cars Site Branding] [i]
    Container:                    [fr Container] [i]
    Content:                      [fr Content] [i]
    Cookery Navigation:           [fr Cookery Navigation] [i]
    Cookery Site Branding:        [fr Cookery Site Branding] [i]
    Core Branding:                [fr Core Branding] [i]
    Header:                       [fr Header] [i]
    Navigation:                   [fr Navigation] [i]
    Site Branding:                [fr Site Branding] [i]
    Wine Navigation:              [fr Wine Navigation] [i]
wine/fr
    Cars Navigation:              [fr Cars Navigation] [i]
    Cars Site Branding:           [fr Cars Site Branding] [i]
    Container:                    [fr Container] [i]
    Content:                      [fr Content] [i]
    Cookery Navigation:           [fr Cookery Navigation] [i]
    Cookery Site Branding:        [fr Cookery Site Branding] [i]
    Core Branding:                [fr Core Branding] [i]
    Header:                       [fr Header] [i]
    Navigation:                   [fr Navigation] [i]
    Site Branding:                [fr Site Branding] [i]
    Wine Navigation:              [fr Wine Navigation] [i]
wine/generic_intl
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
wine/jp
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Japanese Header:              Japanese Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]
wine/us
    Cars Navigation:              Cars Navigation [i]
    Cars Site Branding:           Cars Site Branding [i]
    Container:                    Container [i]
    Content:                      Content [i]
    Cookery Navigation:           Cookery Navigation [i]
    Cookery Site Branding:        Cookery Site Branding [i]
    Core Branding:                Core Branding [i]
    Header:                       Header [i]
    Navigation:                   Navigation [i]
    Site Branding:                Site Branding [i]
    Wine Navigation:              Wine Navigation [i]

さらに他のintlについても、generic_product/$intlのlocationを $intl.xml にエクスポートし、翻訳して、マージしていきます。今回は、ca は、"Cars Site Branding" だけを翻訳しておきます。
それから、再生成を行います。

$ r3 generate -a

これでできあがり。中身を見てみます。

終結

  • $R3HOME/htdocs/cars/ca/index.html
Container: [fr Container]
Header: [fr Header]
Core Branding: [fr Core Branding] Cars Site Branding: [ca Cars Site Branding]
Cars Navigation: [fr Cars Navigation] Content: Canadian Ford Cars
  • $R3HOME/htdocs/cars/fr/index.html
Container: [fr Container]
Header: [fr Header]
Core Branding: [fr Core Branding] Cars Site Branding: [fr Cars Site Branding]
Cars Navigation: [fr Cars Navigation] Content: Peugeot
  • $R3HOME/htdocs/cars/jp/index.html
Container: [jp Container]
Japanese Header: [jp Japanese Header]
Cars Site Branding: [jp Cars Site Branding] Core Branding: [jp Core Branding]
Cars Navigation: [jp Cars Navigation] Content: Nissan Micra
  • $R3HOME/htdocs/cars/us/index.html
Container: [us Container]
Header: [us Header]
Core Branding: [us Core Branding] Cars Site Branding: [us Cars Site Branding]
Cars Navigation: [us Cars Navigation] Content: Ford Cars
  • $R3HOME/htdocs/cookery/ca/index.html
Container: [fr Container]
Header: [fr Header]
Core Branding: [fr Core Branding] Cookery Site Branding: [fr Cookery Site Branding]
cookery Navigation: [fr Cookery Navigation] Content: Cookery in CA
  • $R3HOME/htdocs/cookery/fr/index.html
Container: [fr Container]
Header: [fr Header]
Core Branding: [fr Core Branding] Cookery Site Branding: [fr Cookery Site Branding]
cookery Navigation: [fr Cookery Navigation] Content: Cookery en Francais
  • $R3HOME/htdocs/cookery/jp/index.html
Container: [jp Container]
Japanese Header: [jp Japanese Header]
Cookery Site Branding: [jp Cookery Site Branding] Core Branding: [jp Core Branding]
cookery Navigation: [jp Cookery Navigation] Content: Japanese Cookery
  • $R3HOME/htdocs/cookery/us/index.html
Container: [us Container]
Header: [us Header]
Core Branding: [us Core Branding] Cookery Site Branding: [us Cookery Site Branding]
cookery Navigation: [us Cookery Navigation] Content: Cookery in the USA
  • $R3HOME/htdocs/wine/ca/index.html
Container: [fr Container]
Header: [fr Header]
Core Branding: [fr Core Branding] Cookery Site Branding: [fr Cookery Site Branding]
Wine Navigation: [fr Wine Navigation] Content: US Wine (california is nice)
  • $R3HOME/htdocs/wine/fr/index.html
Container: [fr Container]
Header: [fr Header]
Core Branding: [fr Core Branding] Cookery Site Branding: [fr Cookery Site Branding]
Wine Navigation: [fr Wine Navigation] Content: Wine en Francais
  • $R3HOME/htdocs/wine/jp/index.html
Container: [jp Container]
Japanese Header: [jp Japanese Header]
Cookery Site Branding: [jp Cookery Site Branding] Core Branding: [jp Core Branding]
Wine Navigation: [jp Wine Navigation] Content: Japanese Wine
  • $R3HOME/htdocs/wine/us/index.html
Container: [us Container]
Header: [us Header]
Core Branding: [us Core Branding] Cookery Site Branding: [us Cookery Site Branding]
Wine Navigation: [us Wine Navigation] Content: US Wine (california is nice)

おわり

ということで、あとで、まとめを1本書きます。