【问题标题】:Asp Mvc Resources Global doesn't workAsp Mvc Resources Global 不起作用
【发布时间】:2017-02-10 07:45:20
【问题描述】:

这是我的场景:我有一个多语言的 Asp.Net Mvc 应用程序。 这是我本地化的默认路由:

routes.MapRoute(
    name: "DefaultLocalized",
    url: "{lang}/{controller}/{action}/{id}",
    constraints: new { lang = @"(\w{2})|(\w{2}-\w{2})" },   // en or en-US
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

我的 ControllerActivator:

public class LocalizedControllerActivator : IControllerActivator
{
    private string _DefaultLanguage = "it";

    public IController Create(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        //Get the {language} parameter in the RouteData
        string lang = (string)requestContext.RouteData.Values["lang"] ?? _DefaultLanguage;

        if (lang != _DefaultLanguage)
        {
            try
            {
                System.Threading.Thread.CurrentThread.CurrentCulture =
                System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
            }
            catch (Exception e)
            {
                throw new NotSupportedException(String.Format("ERROR: Invalid language code '{0}'.", lang));
            }
        }
        return DependencyResolver.Current.GetService(controllerType) as IController;
    }
}

我在 Global.asax 中初始化:

ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory(new App_Start.LocalizedControllerActivator()));

这是重定向本地化路由的方法:

public ActionResult Language(string languageCode)
{
    //ViewBag.lang = languageCode;
    string basePath = string.Format("{0}://{1}{2}", Request.UrlReferrer.Scheme, Request.UrlReferrer.Authority, Url.Content("~"));
    object lang;
    if (!RouteData.Values.TryGetValue("lang", out lang))
        return Redirect(Request.UrlReferrer.ToString().Replace(basePath, string.Format("{0}{1}/", basePath, languageCode)));
    else
    {
        string basePathWithLang = string.Format("{0}{1}", basePath, lang.ToString());
        return Redirect(Request.UrlReferrer.ToString().Replace(basePathWithLang, string.Format("{0}{1}", basePath, languageCode)));
    }
}

问题:

在我的机器上工作就像一个魅力,但是当我使用我使用的外部主机时,我在全局资源文件中使用的单词不起作用。 在我的主页中,我有语言选择:

<li><a href="@Url.Action("Language","Home",new { languageCode="it" })">Italiano</a></li>
<li><a href="@Url.Action("Language","Home",new { languageCode="en" })">English</a></li>

单词包含在: @Resources.Global.contacts 如果我改变语言不翻译。也许这会有所帮助:当我在 abcxxx.it 打开我的网站时,起始语言是英语,而不是我在代码中设置为默认的意大利语。

【问题讨论】:

标签: c# asp.net-mvc translation


【解决方案1】:

你知道吗,代码没有问题。这是逻辑的问题。

您将_DefaultLanguage 设置为it

现在,当您从同样为 it 的路由值中获取 lang 时。所以它不会进入块if (lang != _DefaultLanguage),因为它们都是相同的,CurrentThread 的CurrentCultureCurrentUICulture 不会改变。它将保持不变并设置为en-US

所以您需要做的是删除if 子句并将'lang 分配给CurrentThread 的CurrentCultureCurrentUICulture 在任何情况下。

public class LocalizedControllerActivator : IControllerActivator
{
    private string _DefaultLanguage = "it";

    public IController Create(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        //Get the {language} parameter in the RouteData
        string lang = (string)requestContext.RouteData.Values["lang"] ?? _DefaultLanguage;

        try
        {
            System.Threading.Thread.CurrentThread.CurrentCulture =
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
        }
        catch (Exception e)
        {
            throw new NotSupportedException(String.Format("ERROR: Invalid language code '{0}'.", lang));
        }
        return DependencyResolver.Current.GetService(controllerType) as IController;
    }
}

这应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2016-11-15
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多