4

サポートしたい言語ごとに、以下のような名前のリソース ファイルがいくつかあります。

NavigationMenu.en-US.resx
NavigationMenu.ru-RU.resx
NavigationMenu.uk-UA.resx

ファイルはMySolution/Resources/NavigationMenuフォルダにあります。

CurrentCulture以下のCurrentUICultureように設定するアクションがあります

public ActionResult SetLanguage(string lang)
{
    try
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
        Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
        return Redirect(Request.UrlReferrer.AbsoluteUri);
    }
    catch(Exception)
    {
        return RedirectToAction("Index");
    }
}

langパラメータ値はuk-UAru-RUまたはen-USビュー内のどのリンクがクリックされたかによって異なります。また、Web 構成のグローバリゼーション定義セクションがあります。

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="ru-RU" uiCulture="ru-RU" />

アプリケーションを開始すると、期待どおりにロシア語が表示されますが、SetLanguageアクションを使用して言語を英語に変更しようとすると、ビューに言語の変更がありません。NavigationMenu.SomePropertyまだロシア人です。私は何が欠けていますか?

4

2 に答える 2

5

現在のスレッドのみのカルチャを更新しています。

ほとんどのサイトは、これを URL の一部として (すべてのページで) 含めることにより、ローカライズをサポートしています。MVC では、アクション フィルターを使用してカルチャを処理することで、このアプローチを実装できます。この回答には、これに対する適切な解決策があります。

これとは別に、カルチャをセッションまたは Cookie に永続化し、アクション フィルターを実装するか、リクエスト コンテキストを含むアプリケーション イベント中に、すべてのリクエストでスレッドのカルチャを更新することにより、これを実装する必要があります。 AquireRequestState など。

于 2013-06-02T13:25:22.643 に答える
3

たとえば、言語を Cookie に永続化してSetLanguage()から、BaseControllerまたはActionFilter(推奨) で Cookie から値を取得し、それに応じてスレッドを更新します。
これが意味をなさない場合は、次の素晴らしい記事をご覧ください。
CodeProject : http://www.codeproject.com/Articles/526827/MVC-Basic-Site-Step-1-Multilingual-Site-Skeleton
そしてこれ: http://afana.me/post/aspnet-mvc-internationalization .aspx
例;

// Save culture in a cookie
        HttpCookie cookie = Request.Cookies["_culture"];
        if (cookie != null)
            cookie.Value = culture;   // update cookie value
        else
        {

            cookie = new HttpCookie("_culture");
            cookie.HttpOnly = false; // Not accessible by JS.
            cookie.Value = culture;
            cookie.Expires = DateTime.Now.AddYears(1);
        }
        Response.Cookies.Add(cookie);
于 2013-06-02T13:45:39.363 に答える