从同一解决方案C#

时间:2017-05-23 07:52:23

标签: c# asp.net-mvc globalization

我在解决方案中有一个Globalization项目,还有另一个MainProject。在全球化下,有2个资源文件Resources.resxResources.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));

谢谢。

1 个答案:

答案 0 :(得分:1)

ResourceManager的重点是根据当前线程的UI文化交换到不同的文化。您不需要单独执行此功能。它不会明确地读取本地化文化 - 它是基于约定的。要控制当前线程的UI文化,您需要在authorization filter

中明确设置它
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar")

此外,传递ExecutingAssembly意味着您正在传入顶级程序集,这很可能不是您的资源所在的程序集。您应该使用程序集中的类型来获取装配实例:

new ResourceManager(
        "Globalization.Resources", 
        typeof(ClassWithinResourcesAssembly).Assembly)

有关如何使用ResourceManager的详细信息,请参阅以下文档: