web-dev-qa-db-ja.com

ASP.NET MVCスイッチ言語、実装方法は?

簡単なWebサイトをASP.NETMVCに変換し始めましたが、それをいじくりまわしました。基本的にSession ["language"]を別の言語に設定し、ページを更新する言語切り替え機能があります。これがもっとうまくできるかどうか私を訂正してください、しかし私はこれのために2つのコントローラーを作り、そこでセッションを設定しました。問題は、最後のルーティングです。なんらかの方法でページを更新できますか、それとも現在のアクションを取得して再ルーティングできますか?それとも、これはAjaxのシナリオですか?

アドバイスありがとうございます!

21
miccet

セッション変数を使用している理由はありますか?より一般的な解決策は、ルートに言語コードを含めることです。つまり、blah.com/en/infoまたはblah.com/jp/info(英語と日本語の場合)

これを行うと、サイトのすべてのページに各言語へのリンクが含まれる可能性があります。公的にアクセス可能なサイトを作成している場合、これにより、Googleがすべてのコンテンツのインデックスを作成しやすくなります。

この記事では、ドメインに言語を含める方法について説明します。 en.blah.comまたはjp.blah.com: http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx

更新:URLルートに言語コードを含めるsimpleの例を次に示します。

言語パラメータを含めるようにデフォルトルートを変更します。

routes.MapRoute(
"Default", 
"{language}/{controller}/{action}/{id}", 
new { language = "en", controller = "Home", action = "Index", id = "" }
);

各言語のリンクをマスターページに追加します。

<li><%= Html.ActionLink(
    "Spanish", 
    ViewContext.RouteData.Values["action"].ToString(), 
    new { language = "es" })%></li>
<li><%= Html.ActionLink(
    "French", 
    ViewContext.RouteData.Values["action"].ToString(), 
    new { language = "fr" })%></li>
<li><%= Html.ActionLink(
    "English", 
    ViewContext.RouteData.Values["action"].ToString(), 
    new { language = "en" })%></li>    

これらは、言語が変更された場合にのみ、現在のページに戻るリンクとしてレンダリングされます。

20
russau

次のアプローチは私にとってうまくいきます:

私はローカリゼーションにCookieと独自のエンジンを使用しています。ページにリンクを配置して、次のようなものにリダイレクトする必要があります。

public class LanguageController : Controller
{
    //
    // GET: /Language/

    public void Change(string id)
    {
        var cuka = new HttpCookie("lang", id + "");
        cuka.Expires = DateTime.Now.AddYears(10);
        System.Web.HttpContext.Current.Response.Cookies.Add(cuka);

        if (Request.UrlReferrer.IsNotNull())
            Response.Redirect(Request.UrlReferrer.AbsoluteUri);
        else
            Response.Redirect("/");
    }

}

}

このエンジンに興味があれば、私に知らせてください。

7
omoto

ここにあります 異なるURLを選択できるようにする簡単な解決策。

1
Jakub Šturc

言語管理用のコントローラーがあります

    public class LocalesController : Controller
{

    public ActionResult Index(string lang = "en_US")
    {
        Response.Cookies["CacheLang"].Value = lang;

        if (Request.UrlReferrer != null)
            Response.Redirect(Request.UrlReferrer.ToString());

        var message = Localization.Get("changedlng");

        return Content(message);
    }

}

あなたはそれを別々に呼ぶことができます

new LocalesController().Index("fa");
0
Hamid Jolany