从同一解决方案 C# 的另一个项目访问资源文件
Accessing Resource files from another project of same solution C#
我有一个 Globalization
项目正在解决,还有另一个 MainProject
。在 Globalization 下有 2 个资源文件,Resources.resx
和 Resources.ar.resx
。这两个文件具有相同的密钥。我想根据我在模型 (API).
中获得的语言输入输出结果
声明为全局:
ResourceManager rm;
然后我有这个功能,它将检查模型的语言输入,并相应地 select 资源文件。
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"
函数中没有读取资源,就像它不能找到文件一样,我应该在这里使用什么。如果我在同一个项目中添加资源文件,那么它将起作用。请指教。谢谢
正确的方法来自下面的答案,但对我来说这个方法工作正常。
声明:
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));
谢谢。
ResourceManager
的重点是根据当前线程的 UI 文化切换到不同的文化。您不需要创建单独的函数来执行此操作。它不会明确读取本地化文化 - 它是基于约定的。要控制当前线程的 UI 文化,您需要在 :
中明确设置它
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar")
此外,传递 ExecutingAssembly 意味着您传递的是 顶级 程序集,这很可能不是您的资源所在的程序集。您应该在其中使用一个类型获取 Assembly 实例的程序集:
new ResourceManager(
"Globalization.Resources",
typeof(ClassWithinResourcesAssembly).Assembly)
有关如何使用 ResourceManager 的更多信息,请参阅以下文档:
我有一个 Globalization
项目正在解决,还有另一个 MainProject
。在 Globalization 下有 2 个资源文件,Resources.resx
和 Resources.ar.resx
。这两个文件具有相同的密钥。我想根据我在模型 (API).
声明为全局:
ResourceManager rm;
然后我有这个功能,它将检查模型的语言输入,并相应地 select 资源文件。
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"
函数中没有读取资源,就像它不能找到文件一样,我应该在这里使用什么。如果我在同一个项目中添加资源文件,那么它将起作用。请指教。谢谢
正确的方法来自下面的答案,但对我来说这个方法工作正常。
声明:
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));
谢谢。
ResourceManager
的重点是根据当前线程的 UI 文化切换到不同的文化。您不需要创建单独的函数来执行此操作。它不会明确读取本地化文化 - 它是基于约定的。要控制当前线程的 UI 文化,您需要在
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar")
此外,传递 ExecutingAssembly 意味着您传递的是 顶级 程序集,这很可能不是您的资源所在的程序集。您应该在其中使用一个类型获取 Assembly 实例的程序集:
new ResourceManager(
"Globalization.Resources",
typeof(ClassWithinResourcesAssembly).Assembly)
有关如何使用 ResourceManager 的更多信息,请参阅以下文档: