一路改不了应用语言

Can't change application language all the way

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

资源文件属性(设置为public)

我像这样在 _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,我将始终获得正确选择的用户语言,但如果我在控制器中使用同一行并将字符串发送到我的视图,它始终为英语(忽略用户选择)

我怀疑问题是您需要在每个请求中实现它,而不仅仅是在登录控制器中。看看这里的解决方案: (you might also like to have a read of http://www.ryadel.com/en/setup-a-multi-language-website-using-asp-net-mvc/#Resource_Files_inMVC)。您需要创建一个属性并以此装饰您的 class 或操作。如果您不想像他们在这里所做的那样修改路由值,您可以在登录时将 culture-info 值写入 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);

然后在data annotation中,读取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));

    }
}

然后装饰class或动作:

[Internationalization]
public class HomeController : Controller {

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

filterContext.HttpContext.Request.UserLanguages[0]

我已经使用以下测试项目确认了这项工作,您可以从 BitBucket 克隆该项目:

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