我在解决方案中有一个Globalization
项目,还有另一个MainProject
。在全球化下,有2个资源文件Resources.resx
和Resources.ar.resx
。两个文件都有相同的密钥。我想根据模型(API)中的语言输入输出结果。
将此声明为全球:
ResourceManager rm;
然后我有这个功能,它将检查模型的语言输入,并相应地选择资源文件。
private void CheckResourceManager(string lang)
{
if (lang =="EN")
{
rm = new ResourceManager(
"Globalization.Resources",
Assembly.GetExecutingAssembly());
}
else
{
rm = new ResourceManager(
"Globalization.Resources.ar",
Assembly.GetExecutingAssembly());
}
}
在Api功能中,我首先检查CheckResourceManager(model.Language);
当需要消息时:
throw new Exception(rm.GetString("WrongUserName"));
现在问题是"Globalization.Resources.ar"
在函数中没有读取资源,就像它可以; t找到文件,我应该在这里使用什么。如果我在同一个项目中添加资源文件,那么它将起作用。请告诉我。感谢
正确的方法是从下面回答,但对我来说这种方法工作正常。
宣称:
ResourceManager rm;
CultureInfo originalCulture = CultureInfo.CurrentCulture;
Assembly localizeAssembly = Assembly.Load("Globalization");
将功能更改为:
private void CheckResourceManager(string lang)
{
if (lang =="EN")
{
System.Threading.Thread.CurrentThread.CurrentCulture = originalCulture;
rm = new ResourceManager("Globalization.Resources", localizeAssembly);
}
else
{
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("ar");
rm = new ResourceManager("Globalization.Resources", localizeAssembly);
}
}
最后当我需要获得一些价值时:
throw new Exception(rm.GetString("WrongUserName",CultureInfo.CurrentCulture));
谢谢。
答案 0 :(得分:1)
ResourceManager
的重点是根据当前线程的UI文化交换到不同的文化。您不需要单独执行此功能。它不会明确地读取本地化文化 - 它是基于约定的。要控制当前线程的UI文化,您需要在authorization filter:
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar")
此外,传递ExecutingAssembly意味着您正在传入顶级程序集,这很可能不是您的资源所在的程序集。您应该使用程序集中的类型来获取装配实例:
new ResourceManager(
"Globalization.Resources",
typeof(ClassWithinResourcesAssembly).Assembly)
有关如何使用ResourceManager的详细信息,请参阅以下文档: