文化资源经理

时间:2016-08-27 18:12:47

标签: c# cultureinfo culture uiculture

问题

我正在尝试在我的程序中实现一个系统来切换语言。我发现我可以使用CultureInfo和ResourceManager来实现这一点。我在没有找到资源的问题几个小时之后构建了这段代码,最后我在stackoverflow找到并回答了这里,我安排了以下代码:

CultureInfo culture;
culture = CultureInfo.CreateSpecificCulture("it-IT");

CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;

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

Assembly resourceAssembly = Assembly.Load("MY ASSEMBLY NAME");
ResourceManager manager = Properties.Resources.ResourceManager;
string[] manifests = resourceAssembly.GetManifestResourceNames();

string manifest = manifests[0].Replace(".resources", string.Empty);
manager = new ResourceManager(manifest, resourceAssembly);

string greeting = String.Format("The current culture is {0}.\n{1}",
                                            Thread.CurrentThread.CurrentUICulture.Name,
                                            manager.GetString("HelloString"));

MessageBox.Show(greeting);

由于这是一个包含大量页面,窗口和用户控件的非常大的程序,我需要从许多不同的文件中访问该语言。 我上面发布的代码应该查看我的解决方案的根目录,并查找名为it-IT.resx的文件。它说当前的文化是IT-IT但它没有写出HelloString的值,但它没有给出任何错误,所以它肯定是资源管理器的一个问题,但我不知道为什么它不会崩溃说它找不到资源。我确信在resx文件中有一个名为HelloString的值。

1 个答案:

答案 0 :(得分:0)

是否有理由使用Assembly.Load()动态加载类型?这是在寻找麻烦。另一种方法是添加静态程序集引用。

这种方法有许多优点:

  • 资源名称可以作为属性名称访问,很舒服
  • 调用代码始终使用现有资源
  • 调用代码中的
  • 没有对不存在的资源的引用

为了能够使用来自另一个程序集的资源,需要将资源访问修饰符设置为public:

enter image description here

如果资源文件名为RText,如上例所示,资源的值可以从另一个项目中检索:

var val = ProjectWithResourcesNamespace.RText.HelloString;