8

ユーザーの Accept-Language ヘッダーに適切に反応する ASP.NET Web API アプリケーションがあります。

現在、文字列は resx に格納され、Visual Studio の生成されたクラスを介してコンパイル セーフな方法でアクセスされます。私がやりたいことは、現在のアプローチを維持し、resx の翻訳されたバージョンごとにサテライト アセンブリを作成することです。次に、ユーザーの Accept-Language ヘッダーを分析して、ユーザーが受け入れる言語を確認し、要求された言語のリソースをサテライト アセンブリから読み込みます。

ResourceManagerの助けを借りて言語固有のオブジェクトのセットを作成することで、このすべての動作を自分で実装できると思いますResourceSetが、Visual Studio が resx のクラスを自動的に更新するため、コンパイル時の安全性を維持することはできません。ファイル。

ローカライズされた言語リソースを動的に選択する最良の方法は何ですか?

4

2 に答える 2

11

あなたの質問を読んでも、ASP.NET が自動的に提供しないものは何もありません。ASP.NET (WebForms または MVC) を構成して、accept-language要求ヘッダーを使用し、適切な UICulture (ResourceManager によって読み込まれるサテライト アセンブリに影響を与える) とカルチャ (日付などのロケール依存の書式設定と解析に影響を与える) を設定できます。および数字)適切に。

accept-languageリストを使用して要求ごとに UICulture と Culture の両方を設定するようにアプリを構成するには (この MSDN ページに従って)、次のように web.config を構成します。

<globalization uiCulture="auto" culture="auto" />

ページごとに同等の構成設定もあります。

次に、リソース フォールバックプロセスに従って、一致するカルチャ (または、親のニュートラル カルチャ) のサテライト アセンブリがアプリに含まれている場合は、それがリソース マネージャーによって使用されます。そうでない場合は、デフォルトのリソースが使用されます (基本言語の場合は英語)。

于 2012-06-18T08:46:56.387 に答える
4

HttpModule言語ヘッダーを検出し、現在のスレッド カルチャを設定する を記述できます。

public class LanguageModule : IHttpModule
{
    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        var application = sender as HttpApplication;
        var context = application.Context;
        var lang = context.Request.Headers["Accept-Language"];

        // eat the cookie (if any) and set the culture
        if (!string.IsNullOrEmpty(lang))
        {
            var culture = new System.Globalization.CultureInfo(lang); // you may need to interpret the value of "lang" to match what is expected by CultureInfo

            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;
        }
    }
}

ResourceManager他は、スレッド カルチャから使用する正しいローカライズされたバージョンを見つけ出します。

于 2012-06-18T07:18:46.583 に答える