2008-09-11 9 views
10

私は国際化に関するいくつかの有益な助言を含んでいるW3Cの記事「Re-using Strings in Scripted Content」を読んでいましたが、DRY(あなた自身を繰り返さないでください)原則繰り返しコードを削除するあなた自身を国際化と対比しないでください

彼らの例を取るために、私たちはこのようないくつかのコードを持っているかもしれません...

print "The printer is "; 
if (printer.working) { 
    print "on.\n"; 
} else { 
    print "off.\n"; 
} 

print "The stapler is "; 
if (stapler.working) { 
    print "on.\n"; 
} else { 
    print "off.\n"; 
} 

私の本能は、次のように大まかに重複を排除するだろう...

report-state(printer, "printer"); 
report-state(stapler, "stapler"); 

function report-state(name, object) { 
    print "The "+name+" is "; 
    if (object.working) { 
     print "on\n"; 
    } else { 
     print "off\n"; 
    } 
} 

...そうすることで、スペイン語にローカライズする必要がある場合には、コードの難しさが生じます。なぜなら、これらの2つのケースでは、「on」という単語が明らかに異なるからです。

私の質問は、他の開発者がDRYの原則とコードの国際化のバランスをどのように近づけているのでしょうか?

私の一部は、国際化が極端なプログラミング「you arent gonna need it」の1つであると主張したいと考えています。ただし、DRYの原則を念頭に置いてリファクタリングすることは、必要なときに機能を実装するのを容易にすることで、これをバランスさせることになっています。

答えて

16

私は言語リソースに完全な文章を残そうとします。あなたが言ったように、異なる文脈では異なる言葉が必要かもしれません。しかし、より大きな問題は、文章の順序が言語によって異なる可能性があることです。単語から文字列を作成すると問題が発生する可能性があります。

だけで、すべての言語の言語リソースに

The printer is on 
The printer is off 
The stapler is on 
The stapler is off 

を格納します。ここでの繰り返しは、あなたのアプリケーションですべての単一の単語がポップアップする場所を把握しようとするよりもメンテナンスの難しさです。

+0

参照します例: '$ t(プリンタ)がオンです。ということで、プリンタという言葉が1ヵ所にあります。 – jamuhl

0

ローカライズをカバーするためにテキスト値をハードコードするのではなく、CMSを使用することをお勧めします。

2

私はMendelt Siebengaに言いますと、あなたの言語リソースファイルに文章やフレーズ全体を保存する必要があると言います。文法の違いは、言語間での単一単語の置換を実行できないようにします。これは、オブジェクトの種類とその状態を確認してから、言語リソースから適切なメッセージを出力するだけで済むので、最初の例よりも繰り返しコードが少なくなります。

1

私はそれがあなたが達成しようとしている言語の質のレベルに依存すると思います。

これらの実際の言語文字列を扱うコードの繰り返しを最小限にしようとすると、さまざまな言語の構文と構造で他の論理層全体に晒されているだけです。繰り返しを最小限に抑えながら、言語の元の構造を保持しているコードの作成には膨大な労力が必要です。

特定の問題に対して、どちらがより適切なアプローチであったかを判断する必要があります。何度も繰り返されるコード、またはすべての取引のジャックであり、無数の言語の規則の収容を試みるコード(間違いなくメンテナンスの悪夢)。

もちろん、真ん中を打ち、コードの反復を最小限に抑えることはできますが、満足のいく文法的雄弁をあきらめることはできます。Ultima Onlineの例を挙げる - それがローカライズされたとき、以前に「329金貨の山」と書かれた文字列は、「金貨の山:329」のようになりました。偉大ではありませんが、ローカライゼーションに簡単に対応できるかなり合理的なソリューションです。

2

プログラム操作でメッセージ文字列を作成しないようにしました。チームはそれらを見ることができません。

チームは実際には分離しているがほぼ重複したメッセージを好む。 しかし、彼らはパラメータ化されたメッセージを受け入れます。

たとえば、「%(appliance)%は%(on_or_off)%」です。

パラメータは分解される可能性がありますが、動作するときと実行されないときは、少なくともlocチームにとっては明らかです。

6

100%がメンデルトに同意します。

メンテナンスの問題だけでなく、言語上の問題でもあります。 すべてのラテン語で、対象の性別、数、および大文字小文字は、他の要素に影響します。ルーマニア

The printer is on: Imprimanta este pornită // feminine 
    The printer is off: Imprimanta este oprită 
    The stapler is on: Perforatorul este pornit // masculine 
    The stapler is off: Perforatorul este oprit 

ための実施例はまた、iは、用語集を再利用しようとする[i18next(http://i18next.com/pages/doc_features.html#nesting)のネスティング機能を使用してhttp://www.mihai-nita.net/article.php?artID=20060430a

関連する問題