根据按钮单击ASP.NET MVC动态加载资源文件

时间:2018-04-20 10:21:30

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我正在创建一个需要翻译成法语的ASP.NET MVC应用程序。我以前从未使用资源文件实现本地化。目前我有两个资源文件,分别用于英语和法语。用户当前可以通过单击英语/法语按钮在主屏幕中选择语言。如何根据用户选择的语言在运行时动态加载资源文件?我不需要考虑浏览器的语言设置,应该仅根据应用程序中选择的语言加载资源。关于如何实现这一点的任何想法,请?我快速在线查看解决方案,找不到任何根据应用程序中的语言选择加载资源文件并忽略浏览器首选项的内容。

1 个答案:

答案 0 :(得分:0)

<强> Eidt

将资源文件命名为相同的名称,但扩展名与语言有所区别,例如

就足够了。

enter image description here

这里支持三种语言(英语,没有特殊扩展名的文件,扩展名为ar.resx的阿拉伯语,扩展名为tr.resx的土耳其语)

您还可以控制资源文件的属性,以使专用于其他语言的文件具有No Code Generated属性。您可以在打开任何资源文件时从顶部更改此属性

简答
你必须像这样更改线程的Culture

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);

长答案

您需要一些代码,每次启动新的HTTP请求时都会执行这些代码。我在我的项目中使用以下代码

public class LocalizedControllerActivator : IControllerActivator
{
    public const string _DefaultLanguage = "en";
    public const string _DefaultLanguageKey = "lang";

    public IController Create(RequestContext requestContext, Type controllerType)
    {
        string lang = GetCurrentLanguageOrDefaultFromRouteData(requestContext);

        if (lang != _DefaultLanguage)
        {
            try
            {
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
            }
            catch (Exception)
            {
                Thread.CurrentThread.CurrentUICulture = new CultureInfo(_DefaultLanguage);
            }
        }

        return DependencyResolver.Current.GetService(controllerType) as IController;
    }

    private string GetCurrentLanguageOrDefaultFromRouteData(RequestContext requestContext)
    {
        // Get the {language} parameter from the RouteData
        RouteValueDictionary routeData = requestContext.RouteData.Values;

        if (!routeData.ContainsKey(_DefaultLanguageKey))
            routeData[_DefaultLanguageKey] = _DefaultLanguage;

        return routeData[_DefaultLanguageKey].ToString();
    }
}

您必须考虑更改路线以使其接受所需的语言

routes.MapRoute(
    name: "Default",
    url: "{lang}/{controller}/{action}/{id}",
    constraints: new { lang = "en|fr" },     
    defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
);

最后你需要在Web应用程序启动时注册LocalizedContollerActivator

protected void Application_Start()
{
     ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory(new LocalizedControllerActivator()));
}

网址应该是这样的

http://yourDomainOrLocalhost/en/controllerName/actionName