C#本地化和资源文件

C#本地化和资源文件,c#,localization,resources,C#,Localization,Resources,我正在尝试在我的应用程序中实现本地化。我的解决方案中有名为“ui.resx”和“ui.de.resx”的ui资源文件。然而,我的实现中有一些不正确的地方,我被难住了 ResourceManager res_man; CultureInfo culture; string exception; private void myForm_Load(object sender, EventArgs e) { culture = CultureInfo.CreateSpecificCulture

我正在尝试在我的应用程序中实现本地化。我的解决方案中有名为“ui.resx”和“ui.de.resx”的ui资源文件。然而,我的实现中有一些不正确的地方,我被难住了

ResourceManager res_man;
CultureInfo culture;
string exception;

private void myForm_Load(object sender, EventArgs e)
{
    culture = CultureInfo.CreateSpecificCulture("de");
    res_man = new ResourceManager("MyApp.ui.resx", typeof(myForm).Assembly);
    doTheThing();
}

private void doTheThing()
{
    try
    {
        BTN_save.text = ui.SAVE;
        //Do code here
    }
    catch(Exception e)
    {
        exception = e.toString();
    }
}
当我运行程序时,它会出错,异常读取:


异常:System.Resources.MissingManifestResourceException:找不到任何适合指定区域性或非特定区域性的资源。请确保“ui.resx.Resources”在编译时正确嵌入或链接到程序集“myProgram”中,或者确保所需的所有附属程序集都可加载并完全签名

您应该使用类的全名(带命名空间)作为第一个参数,如:

var resman= new ResourceManager("Sample.Resources", typeof(Resources).Assembly);
要知道应该使用什么名称,请打开
ui.resx
节点下的
ui.cs
,查看类的名称空间和类名,并使用它们,如上所示

请注意,您不应传递
“MyApp.ui.resx”
,而应传递
“MyApp.ui”

然后,您可以简单地使用管理器获取特定区域性的资源,如下所示:

var str = resman.GetString("YourResourceKey", culture);
注意:

另一件您应该注意的事情是,有一种更简单的方法可以阅读特定于区域性的资源。您只需设置:

var culture= ...    

System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
System.Threading.Thread.CurrentThread.CurrentCulture = culture;

设置区域性后,无论在何处使用,例如
MyApp.Ui.Key
都将使用特定于该区域性的
键的值。

您应该使用类的全名(带命名空间)作为第一个参数,如:

var resman= new ResourceManager("Sample.Resources", typeof(Resources).Assembly);
要知道应该使用什么名称,请打开
ui.resx
节点下的
ui.cs
,查看类的名称空间和类名,并使用它们,如上所示

请注意,您不应传递
“MyApp.ui.resx”
,而应传递
“MyApp.ui”

然后,您可以简单地使用管理器获取特定区域性的资源,如下所示:

var str = resman.GetString("YourResourceKey", culture);
注意:

另一件您应该注意的事情是,有一种更简单的方法可以阅读特定于区域性的资源。您只需设置:

var culture= ...    

System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
System.Threading.Thread.CurrentThread.CurrentCulture = culture;

设置区域性后,无论您在哪里使用,例如
MyApp.Ui.Key
都将使用特定于该区域性的
键的值。

我更改了行,使其包含新的ResourceManager(“MyApp.Ui.resx”,typeof(myForm.Assembly);但它仍然出错。@dan从第一个参数中删除该.resx并传递
“MyApp.ui”
。@dan如果它解决了问题,请告诉我。我可以问另一个相关问题吗。。。如何生成这些文件?我已经尝试了我能想到的一切。创建新的resx文件等,但我只是不能让它正确地引用本地化的文件。是否有此方面的在线演练?@Brandon使用“添加新项目”窗口添加资源文件,然后在designer中编辑这些文件,例如添加strings.resx,然后对于您想要支持的其他区域性,添加strings.es.resx、strings.fr.resx、strings.fa.resx。你也可以看看Hope,你会发现答案很有用:)我改变了行,所以它包含了新的ResourceManager(“myApp.ui.resx”,typeof(myForm.Assembly);但它仍然出错。@dan从第一个参数中删除该.resx并传递
“MyApp.ui”
。@dan如果它解决了问题,请告诉我。我可以问另一个相关问题吗。。。如何生成这些文件?我已经尝试了我能想到的一切。创建新的resx文件等,但我只是不能让它正确地引用本地化的文件。是否有此方面的在线演练?@Brandon使用“添加新项目”窗口添加资源文件,然后在designer中编辑这些文件,例如添加strings.resx,然后对于您想要支持的其他区域性,添加strings.es.resx、strings.fr.resx、strings.fa.resx。您还可以查看“希望您能找到有用的答案:)