【问题标题】:Can't change application language all the way无法一直更改应用程序语言
【发布时间】:2016-03-04 07:36:26
【问题描述】:

我在应用程序中使用了三个 resx 文件。默认情况下它是英语,但是当我想更改应用程序语言时,只更改 UI。控制器似乎一直固定在英语上,是我忽略了什么吗?

资源文件属性(设置为公开)

我像这样更改 _ViewStart.cshtml 上的语言(语言是 EN 或 DE)

Culture = UICulture = language;

我也尝试在登录时更改控制器中的语言,但它没有任何效果(如果我注释掉 ViewStart 代码下面的行什么都不做,应用程序仍然是英文)

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("de-DE");

我在 web.config atm 中没有任何与语言相关的内容。但是,如果我将全球化属性放在德国应用程序语言上已更改,但我需要从应用程序内部更改它,因此我无法使用全球化属性。有什么想法吗?

例如,如果我在我的视图@Resource.Language 中使用它,我将始终正确选择用户语言,但如果我在控制器中使用同一行并将字符串发送到我的视图,它始终是英语(忽略用户选择)

【问题讨论】:

    标签: c# asp.net-mvc resx


    【解决方案1】:

    我怀疑问题是您需要在每个请求中实现它,而不仅仅是在登录控制器中。在此处查看解决方案:https://stackoverflow.com/a/1561583/201648(您可能还想阅读http://www.ryadel.com/en/setup-a-multi-language-website-using-asp-net-mvc/#Resource_Files_inMVC)。您需要创建一个属性并用它来装饰您的类或操作。如果您不想像这里那样修改路由值,您可以在登录时将文化信息值写入 cookie,然后从 DataAnnotation 中的 cookie 中获取该值,例如在登录控制器中:

    HttpCookie iln8Cookie= new HttpCookie("iln8Cookie");
    iln8Cookie["Language"] = "de"; //Replace with the user's language
    iln8Cookie["Culture"] = "DE"; //Replace with the user's culture
    iln8Cookie.Expires = DateTime.Now.AddDays(90);
    HttpContext.Response.SetCookie(iln8Cookie);
    

    然后在数据注解中,读取cookie值,例如

    public class InternationalizationAttribute : ActionFilterAttribute {
    
        public override void OnActionExecuting(ActionExecutingContext filterContext) {
    
            var cookie = filterContext.HttpContext.Request.Cookies["iln8Cookie"];
    
            string language = cookie != null ? cookie.Values["Language"] : "en";
            string culture = cookie != null ? cookie.Values["Culture"] : "AU";
    
            Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
    
        }
    }
    

    然后装饰类或动作:

    [Internationalization]
    public class HomeController : Controller {
    

    此外,根据此应用程序的登录方式,您可能已经可以从用户对象获得语言和文化信息,即

    filterContext.HttpContext.Request.UserLanguages[0]
    

    我已使用您可以从 BitBucket 克隆的以下测试项目确认此方法有效:

    https://bitbucket.org/mrblurgle/test-internationalisation

    【讨论】:

    • 感谢它帮助我找到了解决方案;)我使用我的基本控制器检查当前语言并在那里更改语言。
    • 没问题 - 很高兴我能帮上忙。
    猜你喜欢
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2011-11-28
    • 1970-01-01
    • 2023-03-26
    • 2015-06-19
    相关资源
    最近更新 更多