0

问题

我正在尝试在我的程序中实现一个系统来切换语言。我发现我可以使用 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,但它没有写入 HelloString 的值,但它没有给出任何错误,所以这绝对是资源管理器的问题,但我不知道为什么它不会崩溃说它没有找到资源。我确信在 resx 文件中有一个名为 HelloString 的值。

4

1 回答 1

0

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

这种方法有很多优点:

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

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

在此处输入图像描述

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

var val = ProjectWithResourcesNamespace.RText.HelloString;
于 2016-08-28T05:44:06.387 回答