修改:可以在github repository中找到完整的代码。
我在this post(1)和this MVC4 code(2)之后为多语种网站构建了一个ASP.NET MVC5多语言应用程序。
On(2)它使用“技巧”来解决“我想要在语言Y中呈现的完整X.cshtml”问题:它添加了一个后缀ViewName.fr.cshtml,以便视图自动重定向到正确的语言。这是代码,我认为这是与我的问题相关的代码的唯一部分:
public class LocalizedViewEngine : RazorViewEngine
{
public override ViewEngineResult FindPartialView (ControllerContext controllerContext, string partialViewName, bool useCache)
{
List<string> searched = new List<string>();
if (!string.IsNullOrEmpty(partialViewName))
{
ViewEngineResult result;
result = base.FindPartialView(controllerContext, string.Format("{0}.{1}", partialViewName, CultureInfo.CurrentUICulture.Name), useCache);
if (result.View != null)
{
return result;
}
searched.AddRange(result.SearchedLocations);
result = base.FindPartialView(controllerContext, string.Format("{0}.{1}", partialViewName, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName), useCache);
if (result.View != null)
{
return result;
}
searched.AddRange(result.SearchedLocations);
}
return new ViewEngineResult(searched.Distinct().ToList());
}
public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
List<string> searched = new List<string>();
if (!string.IsNullOrEmpty(viewName))
{
ViewEngineResult result;
result = base.FindView(controllerContext, string.Format("{0}.{1}", viewName, CultureInfo.CurrentUICulture.Name), masterName, useCache);
if (result.View != null)
{
return result;
}
searched.AddRange(result.SearchedLocations);
result = base.FindView(controllerContext, string.Format("{0}.{1}", viewName, CultureInfo.CurrentUICulture.TwoLetterISOLanguageName), masterName, useCache);
if (result.View != null)
{
return result;
}
searched.AddRange(result.SearchedLocations);
}
return new ViewEngineResult(searched.Distinct().ToList());
}
}
问题:虽然网站在localhost中工作得非常好,但在将网站部署到Azure时似乎会出现行为更改(请参阅http://educa03.org)。
默认语言设置为加泰罗尼亚语(ca-ES)。这很好。您可以在右上角将语言更改为西班牙语(“ES”),这里是它背后的剃刀代码:
<ul class="nav navbar-nav navbar-right">
<li>@Html.ActionLink("es", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { culture = "es" }, null)</li>
<li>@Html.ActionLink("cat", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { culture = "ca-ES" }, null)</li>
</ul>
此语言更改适用于除之外的所有页面索引(主页)。就像在这种情况下,由于某种原因,它不会搜索index.es.chtml
...再次:它在localhost中的行为不是这样,所以我不知道如何调试它。此外,所有其他页面都可以在Azure上运行。
这是路线配置:
// (some captcha-specific routing)
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// BotDetect requests must not be routed:
routes.IgnoreRoute("{*botdetect}",
new { botdetect = @"(.*)BotDetectCaptcha\.ashx" });
// the language route:
routes.MapRoute(
"Default",
"{culture}/{controller}/{action}/{id}",
new
{
culture = "ca",
controller = "Home",//ControllerName
action = "Index",//ActionName
id = UrlParameter.Optional
}
).RouteHandler = new LocalizedMvcRouteHandler();
答案 0 :(得分:1)
所以这就是我解决问题的方法:
public ActionResult Index()
{
// The Index is the only page that does not respond to the LocalizedViewEngine as it should...
var currentCulture = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
if (currentCulture != LocalizationAttribute.DefaultCulture)
return View(string.Format("Index.{0}", currentCulture));
else
return View();
}
也就是说:我强迫唯一没有被重新路由到{View}.{Culture}.cshtml
的情况(动作索引),并强制在控制器中的Action内部这样做。我不喜欢这个解决方案,但至少它有效。它仅在这种非常特殊的情况下进行了本地化,这是由于Azure部署以某种方式处理Index,而不是我的localhost IIS。