1

CodeProjectでWPFの非常に優れたグローバリゼーションチュートリアルを読んだ後、同じ手法を自分のプロジェクトに適用する予定です。

このチュートリアルでは、Strings.resxデフォルト言語を含む名前付き文字列を作成する方法を示し、ファイル全体を複製.resxし、ファイル名にローカリゼーションコードを追加し、文字列をターゲット言語に翻訳することをお勧めします。

そうすれば、値で名前がStrings.resx付けられたレジスタが含まれ、の同じ名前のレジスタには値が含まれ、追加の言語についても同様になります。name_entry_labelWrite your nameStrings.pt-BR.resxEscreva seu nome

私が見つけた問題は、リソースファイルの1つにレジスタを追加しても、他のファイルは更新されないということです。それらは、エントリを手動で制御する必要があります。これは、愚かで、反復的で、エラーが発生しやすいものです。

私の見解では、これを行う最も論理的な方法は、テーブルリソースディクショナリを用意することです。このディクショナリでは、各名前に列ごとに1つの値が含まれ、各列は特定の言語に対応します。もう1つの方法は、各resxファイルが「マスター」ファイルのビューであり、ビューの同期を維持することです。ただし、これらの動作のいずれかを取得できるかどうかはわかりません。

説明されている動作(異なる言語リソース間で常に同期されているレコード)を取得する方法についてのヘルプは、読んでいただきありがとうございます。

4

3 に答える 3

2

次のいずれかを行うことができます。

TortoiseMerge (TortoiseSVN に付属) などのマージ ツールを入手し、各言語の resx ファイルをマスター ファイル (ニュートラル言語の resx ファイルなど) と比較し、ツールを使用してローカライズされたファイルに不足しているエントリを作成します。次に、VS resx エディターでローカライズされたファイルを編集して、適切な翻訳を追加できます。

または: TortoiseMerge が機能しない場合は、XPath を使用してマスター resx 内のリソース要素を検索し、それらを異なる言語ファイル内の対応する要素にマップし、欠落している要素をコピーする小さなプログラムを作成します。そうすれば、後で編集する必要があるエントリを目立たせるために、テキストを空にすることもできます。resx ファイルの命名規則は非常に厳格であるため、おそらくこれをバッチ プログラムにして、ツール メニューの外部ツールとして VS に追加できます。

または: 各エントリの要素と各言語のサブ要素を含むマスター XML ファイルを作成して、元の用語とその翻訳がグループ化されるようにします。次に、XSLT を使用して各言語の resx ファイルを作成します。

または: データベースにキー、言語、および翻訳の列を持つテーブルを作成し、SQL を使用して、ローカライズされた言語で欠落しているキーの空のエントリを作成し、テーブルから resx ファイルを生成します。resx ファイルをまったく使用せずに、そのようなテーブルをローカライズに直接使用することもできます。

いずれにせよ、言語ごとに 1 つの列を持つ設計には強くお勧めしません。アプリケーションの 1 つでそのようにしたことがあります。おそらく、resx エントリを同期するバッチ プログラムを使用するオプションを選択するでしょう。これは、プログラミングの労力と使いやすさの間の最良の妥協点のようです。

于 2013-01-31T18:45:32.980 に答える
1

私は同じチュートリアルに従いましたが、同じ問題に直面しています... ソリューション エクスプローラーを見ると、Strings.resx のノードを開くと、Strings.Designer.cs という名前の自動生成されたクラスが見つかります。

これは、public name_entry_label を要求するときに正しい文字列をどこから取得するかを選択するためのいくつかの単純なメソッドを備えた単なる静的クラスです。

私が考えたこと: 現在の言語を設定として保存しているので、すべてのアプリで使用できます。翻訳されたすべての文字列を使用してカスタムの静的クラスを作成し、正しい文字列を取得する前に、[設定] でこれらの文字列のカルチャをチェックすることができます。何かのようなもの:

public static string WriteYourName_Label
{ 
    get
        {
          switch(currentLanguage) //currentLanguage should be the definition in the Settings (a string for me), a private field in the static class that gets the culture and returns something useful

             case en-US: return "Write your name";
             case es-ES: return "Escriba su nombre";
             default: return "Escreva seu nome"; //portuguese by default
         }
}

利点: 1 つのファイルにすべての異なる言語があり、すべての翻訳が別のファイルに並んでいます (別々のファイルではありません)。

問題: 素敵な「テーブル」エディターが失われます。それは単なるコードです。新しい言語を追加する場合は、すべての文字列に対して新しいケースを作成する必要があります (いずれにせよ新しいリソース ディクショナリを作成する必要があるため、これはそれほど問題ではありません)。

私はまだそれを実装していないので、パフォーマンスについて話すことはできません (内部にすべてが含まれる静的クラスであり、より優れているはずです) が、他に良い解決策は見つかりませんでした (すべてを 1 か所に配置するのに比べてそれほど単純ではありません)。一見すると、すべてを「手動」で行うのは悪夢のように思えますが、関連のない複数のテーブルを持つという別の方法は、私にとってさらに恐ろしいことです。

誰かが私のものよりもはるかに優れた回答を投稿してくれることを本当に願っています。私はとても幸せです. 幸運を!

于 2013-01-31T17:46:15.253 に答える
1

可視性を向上させるために、hbarck のリンクをここに投稿します。

CodePlex の resx Manager ツール

これは非常に軽量で簡単なアプリで、プロジェクトの resx ファイルを使用して XML を作成し、各言語を 1 列に並べた Excel ファイルと、各サブプロジェクトのファイルのシートに配置します。

警告: Excel でファイルを開くときは、「とにかく開く」ダイアログに対して「はい」と答えてください。保存するときは、「変換しますか?」と NO と言います。ダイアログ (Excel XML 2003 形式のままにしておくと、翻訳をプロジェクトに戻すのに苦労します)。

手順については、CodePlex のドキュメントを参照してください。問題が発生した場合は、泣かないでください。リンクを投稿しているだけです :-P

これが他の誰かにも役立つことを願っています!

于 2013-01-31T23:49:47.717 に答える