1

複数の言語をサポートするサイトを構築しています。en-US をデフォルトとして、fr、de、および en-US をサポートするリソースを作成しました。私が追加しました:

<system.web>
    <globalization 
        uiCulture="auto" culture="auto" 
        requestEncoding="utf-8" 
        responseEncoding="utf-8" 
        enableClientBasedCulture="true" />
    ...
</system.web>

私のweb.configファイルに。IE または Chrome で言語を fr、de、または en-US に設定すると、期待どおりの言語が表示されます。言語を ar-EG に設定すると、これも予想どおり en-US になります。

言語を fr-FR に設定しても、受け入れられる言語のリストに fr が含まれていない場合、一般化された fr (fr-FR ではなく) よりも de を受け入れるようにブラウザに指示しても、サイトは fr ページを返します。 )。これは RFC に反しているように見えますが、IE はデフォルトでフランスでは fr-FR に、ドイツでは de-DE に設定されており、カルチャを自動的に一般化しないサイトでは機能しないため、驚くことではありません。

ただし、ブラウザーに ar-EG と fr を受け入れるように指示すると、サイトはデフォルトで en-US になります。Accept-Language ヘッダーで fr を優先して受け入れるように指定されているにもかかわらずです。要求したすべての言語が適切な優先度で送信されていることを確認するために、ブラウザーで要求ヘッダーをキャプチャしました。

ASP.NET は、Accept-Language ヘッダーで指定された最初の言語のみを見ているようです。ASP.NET 言語マッチング アルゴリズムはどこかに指定されていますか? ASP.NET/MVC が Accept-Language リスト内のすべての言語をチェックして最適な言語を決定するように指定する方法はありますか? または、独自の言語一致コードを作成する必要がありますか?

4

1 に答える 1

1

ええと、まだ誰も答えていないので、私は提案します。確かに、より良い、または少なくともより美しいソリューションがありますが、私のニーズにはそれで十分でした. Application_AcquireRequestState()イベント内に文化を設定するだけです:

protected void Application_AcquireRequestState()
{
    var language = "whatever"; // default fall back
    if (request.UserLanguages.Length > 0)
    {
        var acceptedLangs = new List<string> {"de", "en"};
        var langs = request.UserLanguages.Where(l => acceptedLangs.Any(al => al.Equals(l.Substring(0, 2))));
        language = langs.FirstOrDefault();
    }

    // TODO: may be better inside a try..catch block
    var culture = new CultureInfo(language);
    Thread.CurrentThread.CurrentUICulture = culture;
    Thread.CurrentThread.CurrentCulture = culture;
}
于 2013-04-04T21:47:12.573 に答える