OnActionExecuting
次のような取得言語プロセスを処理するために使用します。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
#region set Language
var lang = string.Empty;
if (filterContext.RouteData.Values["lang"] != null && !string.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString()))
{
// set the culture from the route data (url {lang})
lang = filterContext.RouteData.Values["lang"].ToString();
switch (lang)
{
case "es":
break;
case "en":
break;
default:
lang = "es";//default language
filterContext.RouteData.Values["lang"] = lang;
filterContext.HttpContext.Response.Redirect("/");
break;
}
}
else
{
//set default language
lang = "es";
filterContext.RouteData.Values["lang"] = lang;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
#endregion
base.OnActionExecuting(filterContext);
}
次に、コード内のどこでもThread.CurrentThread.CurrentCulture
(これがグローバル lang インジケーターになります) を読み取って、正しい言語を表示します。
更新 - 私はあなたのポイントを理解していることを知っています =)
ページが動的に作成される場合、ページActionResult
ごとに作成する必要はありません。次のような ActionResult が 1 つだけ必要です。
public ActionResult ShowPage(int id,string slug)
{
//Use the slug to check for url attacks and ensure 301 redirections to the correct url
var page = db.Webpages_local.First(p=> p.id == id
&& p.culture.name == Thread.CurrentThread.CurrentCulture);
return View(page);
}
SEO の理由から、次のようなルートを定義することをお勧めします。
routes.MapRoute(
name: "LocalizedPages",
url: "{lang}/p/{slug}/{id}",
defaults: new { controller = "Page", action = "Show", id = UrlParameter.Optional },
constraints: new { lang = @"(es|en|fr|nl)" }
);
次のような URL が得られます。
/nl/p/about/1 //the p is just an identifier for 'page', to differentiate this routes from others