10

別の簡単な質問。私は異なる言語のウェブサイトを持っています。リソースファイルから文字列にアクセスしたい場合は、次のように使用します

Resources.MyResourceFile.MyStringIdentifier

非常に簡単。そうすれば、コンパイル時にリソース文字列が存在することがわかります。

現在、これは現在のカルチャを使用したい場合にのみ機能します。特定のカルチャを指定する必要がある場合があります(現在のユーザーが言語としてドイツ語を使用しているが、彼のアクションにより、受信者の言語である他のユーザーにメッセージが送信されるとしましょう)。今、私は2つのオプションが表示されます。

Resources.MyResourceFile.ResourceManager.GetString("MyStringIdentifier", neededCulturInfo)

もう1つは、現在のスレッドのカルチャ情報を変更することです。これは、数回行う必要があります。

第三の道はありますか?コンパイル時にリソースは存在するが、スレッドのカルチャを常に変更する必要がないことを教えてくれるものはありますか?

4

7 に答える 7

1

(あなたのシナリオでは) ResourceManager の考え方は、コンパイル時ではなく実行時にカルチャ固有の情報を提供することです(別名、フォールバックとサイドバイサイド)。
したがって、答えは「いいえ」です。コンパイル時にこれらのリソースファイルの存在を判断する組み込みの方法はありません。そのためには、すべての単一言語のすべての文字列とコードに対して一種の「ハードコーディング」が必要になります。それらにアクセスします。サイドバイサイドのアイデアは、ハードコーディングの正反対です;)

あなたができることは、リソースの単体テストを作成することです。これは、言語を反復し、デフォルト値またはローカライズされた値が使用されたかどうかを確認します。さらに、チェックイン ポリシー (TFS など) を提供するソース管理システムを使用している場合は、この単体テストをチェックイン ポリシーの一部として実行できます。

于 2010-11-15T16:36:10.890 に答える
0

ResourceSet方法があります

public virtual IDictionaryEnumerator GetEnumerator()

これにより、リソースファイルのキーと値のペアにアクセスできます。
例(文字列のみを扱うと仮定します-NBキーと値のペアはオブジェクト型です):

while (set.MoveNext())
     {
         string key = (string)set.Key;
         // string value = (string)set.Value; 
         string value = ResourceManager.GetString(key, neededCulturInfo); 
     }

物事が複雑になるので、これはあなたがすべきことではありません-それを指摘するだけです。
カルチャごとに異なるリソースファイルを作成し、 asパラメータswitchを持つメソッドでコードブロックを使用できます。CultureInfo

于 2010-10-22T14:33:09.230 に答える
0

生成されResources.MyResourceFileたクラスには静的CultureプロパティがありneededCultureInfo、現在のスレッドのCurrentUICultureをオーバーライドするように設定できます。

于 2010-11-03T13:18:54.823 に答える
0

試してみましたか:

public static Object GetLocalResourceObject (
    string virtualPath,
    string resourceKey,
    CultureInfo culture)

このリンクを試してくださいここをクリック

次のことも試すことができます。

public static Object GetGlobalResourceObject (
    string classKey,
    string resourceKey,
    CultureInfo culture)

このリンクを試してくださいここをクリック

于 2010-10-15T19:47:52.300 に答える
0

WorkItemを使用して、メッセージを非同期的に送信できます。別のスレッドで実行しているため、必要に応じて CurrentUICulture を変更できるはずです。

PS: これは、静的な依存関係が良くなく、すべてがインターフェイスとインスタンスでなければならない理由の良い例です。

于 2010-11-12T12:21:21.920 に答える
0

1) 最初は UICulture をセッションに保存すると便利かもしれません。必要なときに変更するために、最初はそこから変更できます。

2) preRender で UICulture をオーバーライドし、そこから設定して、セッションに保存することができます。

Cookie に保存することもできますが、最適なソリューションではありません。

于 2010-11-10T11:53:02.783 に答える
0

リソース内を調べるクラスを作成するか、列挙子ソリューションを使用して値を探し、存在しない場合はデフォルト言語で値を使用するようにします。しかし、コンパイル時には検証できません。

最も簡単なオプションは try-catch で、catch の一般的な言語で値を返します。

それにもかかわらず、リソースを使用している場合、一般的な言語値でそれらをコピーしたとしても、すべてのキーが常にすべての関連ファイルに存在する必要があります。

私の解決策は、すべてのリソースが一貫していなければならないということです。

于 2010-10-30T21:35:19.420 に答える