Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC 3控制器操作返回JSON格式的本地化字符串_C#_Asp.net Mvc_Asp.net Mvc 3_Localization - Fatal编程技术网

C# MVC 3控制器操作返回JSON格式的本地化字符串

C# MVC 3控制器操作返回JSON格式的本地化字符串,c#,asp.net-mvc,asp.net-mvc-3,localization,C#,Asp.net Mvc,Asp.net Mvc 3,Localization,我目前正在开发我们的产品,这是一个基于MVC3的项目。该产品最近计划在加拿大推出,加拿大有法律要求所有网站提供英文版和法文版 基本架构包括: -本地化类库 -MVC3应用程序 -木豆 -所有控制器都继承自一个可本地化的基本控制器类,该类将当前线程的CurrentCulture和CurrentUICulture设置为正确的语言。这非常有效(从Scott Hansel的代码中借用)。 -它还有一个基本的restapi,通过jQuery从UI调用 我的所有视图都按预期工作,但我在让操作返回消息的正确语

我目前正在开发我们的产品,这是一个基于MVC3的项目。该产品最近计划在加拿大推出,加拿大有法律要求所有网站提供英文版和法文版

基本架构包括: -本地化类库 -MVC3应用程序 -木豆 -所有控制器都继承自一个可本地化的基本控制器类,该类将当前线程的CurrentCulture和CurrentUICulture设置为正确的语言。这非常有效(从Scott Hansel的代码中借用)。 -它还有一个基本的restapi,通过jQuery从UI调用

我的所有视图都按预期工作,但我在让操作返回消息的正确语言方面遇到了问题。API控制器操作不返回ActionResults,而是返回JSON字符串。但我不认为这是我痛苦的罪魁祸首

我目前正试图利用ResourceManager对象,但运气不佳。这是我尝试过的最新代码

请注意,CultureName是BaseLocalizableController对象提供的属性

var rm = new ResourceManager("ProductXYZ.Localization.App_GlobalResources.Messages", Assembly.Load("ProductXYZ.Localization"));
viewModel.Message = rm.GetString("SuccessfullySaveChanges", CultureInfo.CreateSpecificCulture(user.Language ?? CultureName));
GetString函数总是返回英语,而它应该返回法语。我知道我在这里遗漏了一些基本的东西,但就是没能找到它,我现在面临着一个艰难的最后期限

如蒙协助,将不胜感激

谢谢

其他信息******


我在Visual Studio 2012中工作

如果应用程序中的体系结构正确,则使用
Thread.CurrentThread.CurrentCulture
Thread.CurrentThread.CurrentUICulture
应设置为法语(以防您在法语站点上)

如果不是这样,您应该在Global.asax中处理此问题,可以通过以下方式完成:

protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    CultureInfo ci = CultureInfo.CreateSpecificCulture(HttpContext.Current.User.Language ?? CultureName);
    Thread t = System.Threading.Thread.CurrentThread;
    t.CurrentCulture = ci;
    t.CurrentUICulture = ci;
}
在这样做之后,每一个使用全球化的功能都将根据适当的文化发挥作用。(这还包括例如:
(5.52M).ToString()
,这将根据区域性的不同导致
5.52
5,52

一个重要的步骤是改变路线:

viewModel.Message = rm.GetString("SuccessfullySaveChanges", CultureInfo.CreateSpecificCulture(user.Language ?? CultureName));
致:


user.Language返回什么?(设置断点并检查)。法语的fr CA和英语的en US是正确的。两个资源文件都已完全实现并相互配对。因此,如果手动输入字符串“fr CA”它没有返回正确的值?只有一个结论,即您的资源有问题。这是正确的。在视图而不是控制器操作内部呈现时,工作正常。这导致我不同意您的结论。在访问不可变数据的编程中,一般规则是,无论您在何处执行ame代码,结果是相同的。换句话说,代码或状态必须有所不同。我知道的唯一资源状态是
CultureInfo
。因此我建议不要每次都使用
CultureInfo
,而是在身份验证后将其分配给线程。请参阅我的答案。我不知道在应用程序\u PostAuthenticateRequest函数中粘贴区域性设置代码时看不到任何更改。还有其他想法吗?另一个有趣的问题是,基本响应对象在此测试中显示了正确的格式提供程序(fr CA)。然后,您可能需要再次检查
“SuccessfullySaveChanges”的拼写
,因为我不知道还有什么会影响这一点。第一部分与我所做的几乎相同。我删除了GetString中的CultureInfo调用。但仍然有相同的结果。这是ExecuteCore函数中的断点显示的结果。Thread.CurrentThread.CurrentCulture{fr CA}calendar:null calendar:{System.Globalization.gregoriacalendar}CompareInfo:{CompareInfo-fr CA}CompareInfo:{CompareInfo-fr CA}
viewModel.Message = rm.GetString("SuccessfullySaveChanges");