2

カルチャ固有のリソース ファイルの 3 番目の「レイヤー」を使用する方法が必要です。これは、本来あるべき方法で行われる可能性があり、何らかの方法でハッキングされる可能性があります。そして、ハックが大きすぎない限り、大丈夫です! 別の解決策も可能です (問題に間違ってアプローチしている場合は、より良い解決策を教えてください)。

通常、フォールバックとして機能するデフォルトのリソース ファイルがあります。その上、言語の文化固有のリソースを持つことができます。今私が欲しいのは、「テーマ」固有のリソースです。

問題は、すべて異なるテーマ (馬、車、RC ユニットなど) のサイトがいくつかあり、リソースがまだ特定の言語に翻訳されていない場合にローカライズされたリソース ファイルの文字列を使用すると、デフォルトの言語である英語にフォールバックします。涼しい!

問題の例: "Add your horse" と "Add your car" というフレーズがあり、英語では (文法的には) 同じように見えるかもしれませんが、ポーランド語やルーマニア語では必ずしもそうではありません!

したがって、可能であれば、"Add your {0}" を含む英語のファイルと、同等の文をポーランド語で含むポーランド語のファイルを作成し、その上に「車」固有のポーランド語の翻訳を作成する必要があると考えています。は「車」という単語に適しており、文法が「馬」という単語に適している「馬」固有のポーランド語翻訳に適しています。

2 つまたは 3 つの言語で 2 つまたは 3 つのテーマがあれば、問題はそれほど悪くないかもしれません。これらのいくつかのケースを処理するコードを切り替えるだけでよいと考えるのは簡単です。つまり、6 つの異なる言語で 15 のテーマがあり、拡大中です。

巧妙なハックや、めったに使用されないエキゾチックな機能の知識を期待しています!

前もって感謝します

4

1 に答える 1

2

問題の解決策を指摘しているわけではありませんが、文字列の書式設定について懸念があります。

あなたの例の問題の1つは、翻訳で String.Format を使用することです。

「{0} を追加」部分は、言語によっては、{0} 部分に何を挿入するかによって、異なる表現が必要になります。

例:

「Add you horse」はデンマーク語に翻訳すると「Tilføj din hest」になり、「Add your donkey」は「Tilføj dit æsel」になります。ご覧のとおり、違いがあります: din/dit は、「Add your {0}」から正しく翻訳できません。ドイツ語など他の言語についても同様です。


編集:疑似回答は次のようなものになる可能性があります:テーマごとに、各 resx ファイルに文字列を追加します (AddYourItemHorse、AddYourItemRacecar、AddYourItemDonkey などの識別子を使用)。または、PageName.Racecar.da-DK.resx のようなリソース ファイルを作成し、その中に racecar-theme のリソースを含めます。次に、コードの領域、テーマ、および現在のカルチャに基づいて、次のことを行います。

Dictionary<string, string> resourceDictionary = new Dictionary<string, string>();
private void fillDictionary(string path)
{
    using (ResXResourceReader rxrr = new ResXResourceReader(path))
    {
        foreach (DictionaryEntry entry in rxrr)
        {
            //Fill the fillDictionary
        }
    }
}

次に、必要なものをテーマを表す文字列と連結して、辞書内の文字列にアクセスします。

string theme = "Racecar";
Label testLabel = new Label();
testLabel.Text = resourceDictionary[AddYourItem + theme];

別の方法として、resource-file pr を使用することもできます。エリア、言語、テーマは MainForm.Racecar.da-DK.resx のようになり、fillDictionary に渡されるパスを次のように作成します。

string languageCode = Thread.CurrentThread.CurrentCulture.Name;
string path = "MainForm." + theme + "." + llanguageCode + ".resx";

そして、fillDictionary メソッドにパスを渡します。

上記のコードはテストされていないことに注意してください。ここに、ただただ心の底から書いた。しかし、可能な (必ずしも最適ではない) 解決策の方向性を示す必要があります。

ここで ResXResourceReader の詳細を読むことができます:プログラムによる .resx ファイルの操作

于 2013-08-07T14:10:46.380 に答える