12

たとえば、ユーザーのブラウザが fr-CA に設定されているが、私のサイトには別の利用可能な言語 (英語など) でページを表示するオプションがあります。指定した言語を使用してリロードできるように、accept-language ヘッダーをオーバーライドするにはどうすればよいですか?

Accept-Language ヘッダーを単純に変更してからページをリロードしようとしましたが、これを行う方法がわかりません。何かご意見は?

更新: わかりました。ローカリゼーションとは何かを説明してくれる人がいるので、これを適切に尋ねていなかったに違いありません。

現在、私のサイトでは web.config でグローバリゼーションが auto に設定されているため、アプリの開始時にネゴシエートされた言語にスレッド カルチャが自動的に設定されます。デフォルトでは、ユーザーのブラウザーはブラウザーの言語設定に基づいて accept-language ヘッダーを送信しますが、以下で指摘されているように、平均的なユーザーはそれらが何であるか、どこにあるのか、またはどのように変更するのかわかりません。いずれにせよ、ブラウザが最初に言語ヘッダーを処理するというデフォルトの動作を呼びましょう。ただし、機能として、ユーザーがこの受け入れ言語ヘッダーをページから変更できるようにしたいと考えています。たとえば、アプリケーションでは、言語設定は通常、Cookie またはユーザー設定 (プロファイル設定を介して) によって決定されますが、ランディング/ログイン ページでは (特に、特定のコンピューターに初めてログインする場合)、あなたが誰なのかわからないので、あなたのブラウザの設定しかありません。しかし、出張中にアメリカのコンピューターからこのサイトにアクセスすると、ページが英語で読み込まれ、読むことができず、ブラウザーの言語を変更する方法がわかりません。ドロップダウン メニューやアイコンなどから言語を選択できるオプションがあると便利だと思いませんか? そうなると思います。

そのためには、accept-language ヘッダーを変更してページをリロードできる必要があります。ここはどう進めていいかわからないところです。

試してみましnavigator.language = <selected language>xhr.setRequestHeaderが、これらはうまくいかないようです。

4

2 に答える 2

7

私は間違っているかもしれませんが、ロケール設定はコードで変更するものではありません。これは、ブラウザーのユーザー構成によって決まります。HttpClient を使用している場合は、Accept-Language ヘッダーに必要な値をサーバーに確実に送信しますが、コードからこれを変更して、ブラウザーで発生したすべての要求で有効にすることを期待しないでください。

一般的な方法は、ユーザーの言語設定でカスタム Cookie を設定することです。デフォルトでは、この Cookie に Accept-Language ヘッダーの値を設定する必要があります。ASP.NET MVC には設定があり、Thread.CurrentThread.CurrentCultureと Thread.CurrentThread.CurrentUICulture の両方がユーザーのブラウザー構成に従って設定されます。

<system.web>
    <globalization enableClientBasedCulture="true" uiCulture="auto" culture="auto" />
</system.web>

次に、カスタム言語 Cookie をチェックし、それに応じてThread.CurrentThread.CurrentUICultureを設定する ActionFilter を作成できます。

Thread.CurrentThread.CurrentUICulture は、コードが使用するリソースを決定するために使用されます。Thread.CurrentThread.CurrentCulture は、すべての数値および日付の処理に使用されます。

アクション フィルターは次のようになります。

public class LanguageActionFilter : IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var langCookie = GetOrSetLanguageCookie(filterContext.HttpContext);
        var culture = new CultureInfo(langCookie.Value);

        Thread.CurrentThread.CurrentUICulture = culture;
    }

    private HttpCookie GetOrSetLanguageCookie(HttpContextBase context)
    {
        var cookie = context.Request.Cookies[Constants.LanguageCookieName];
        if (cookie == null)
        {
            //set the cookie for first time
            cookie = new HttpCookie(Constants.LanguageCookieName, Thread.CurrentThread.CurrentUICulture.Name)
            {
                Expires = DateTime.Now.AddYears(1),
                Path = "/"
            };
            context.Response.Cookies.Add(cookie);
        }
        return cookie;
    }
}

注意してください:

  • ユーザーがインターフェイスで「es-Ar」を選択し、そのユーザーに応じて UICulture を設定した場合でも、ユーザーのブラウザーが en-US の日付で構成されている場合、そのユーザーは英語の規則を使用して解析されます。浮動小数点数になります。

IE: ブラウザーが en_US に設定されている米国のユーザーがアプリのスペイン語インターフェイスを使用することを選択した場合、このユーザーがサーバーに次のような情報を投稿すると、次のようになります。

2015 年 1 月 5 日は、サーバーでは 5 月 1 日ではなく 1 月 5 日として解析されます。

1,900 のような数値は、サーバーでは 1.900 ではなく 1900 として解析されます。

私はこれを難しい方法で学びました。ここで、答えられなかった質問があります。

ご不明な点がございましたら、お知らせください。

于 2013-08-30T00:52:52.977 に答える