ResourceManager.GetString()方法从不同的程序集返回错误的字符串

时间:2012-10-04 15:30:40

标签: c# resources resourcemanager

我有2个资源文件,一个是英文,另一个是外文。当我打电话

ResourceManager.GetString("Hello") 
<。>从.Designer.cs文件中,它总是返回英文翻译。我检查了我的语言环境和语言等,一切都正确。

它从我的主程序集中返回正确翻译的字符串,但是从加载的程序集中它总是返回英语。

6 个答案:

答案 0 :(得分:11)

以下是发生的事情。我有一个包含多个翻译资源文件的程序集。这些都是嵌入式资源。

当我编译程序集时,它将默认的英语放在其.dll中。至于其他语言,它使用。中的语言创建文件夹,fr,da,de等。

如果我希望它们被我的主要应用程序拾取,我必须移动所有这些,这些应用程序正在加载所有其他程序集。想到我告诉大会他们都是嵌入式资源文件,它实际上会嵌入它们!

我现在有一个AssemblyLoader,当它无法从当前位置找到它们时会加载所有必需的.dll,打包将决定我是否要包含所有语言或在构建之前选择我想要的语言该项目。比我希望的更多的工作,但最终解决了。

任何人都有任何疑问,请随时提出。

答案 1 :(得分:3)

不确定如何实例化ResourceManager,但是当您调用ResourceManager.GetString()时,您可以指定CultureInfo,它可以帮助您以正确的语言环境获取字符串。所以你可以这样做:

var string = ResourceManager.GetString("ResourceKey", new CUltureInfo("en-GB"));

这将确保字符串键来自en-GB特定的资源文件。

答案 2 :(得分:3)

GetString的第一个重载ResourceManager.GetString(string)使用当前线程的CurrentUICulture(Thread.CurrentThread.CurrentUICulture)。

参考MSDN: -

  

返回的资源已针对当前线程的UI文化进行了本地化,由CurrentUICulture属性定义。

在后台线程中,不要假设线程的CurrentUICulture与主(或UI)线程的CurrentUICulture相同。

从后台线程访问资源的更好方法是使用以下内容来获取正确的本地化字符串: -

var localString = Properties.Resources.ResourceManager.GetString("ResourceKey", CultureInfo.CurrentCulture);

答案 3 :(得分:1)

尝试将构建操作更改为“嵌入式资源” 我最近在添加泰米尔语资源时遇到了这个问题。花了几个小时后,我发现添加资源文件后错过了此简单步骤。

答案 4 :(得分:0)

在我的情况下问题是resx文件。无效的资源字符串在resx文件中的格式不正确:

<data name="HeaderColumnsCountGreaterThenDataColumnsCountTestData" xml:space="preserve">
  <settings>
    Month   Date    Department
    01.05.2015  01.05.2015  OIR
    01.05.2015  02.05.2015  OIR
  </settings>
</data>

格式正确:

<data name="HeaderColumnsCountGreaterThenDataColumnsCountTestData" xml:space="preserve">
  <value>
    Month   Date    Department
    01.05.2015  01.05.2015  OIR
    01.05.2015  02.05.2015  OIR
  </value>
</data>

答案 5 :(得分:0)

我发现动态地解决此问题的最简单快捷的方法是,获取运行应用程序的操作系统中当前使用的语言,并调用适当的资源。这是实现此目的的代码。

string lg = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
            return resourceManager.GetString(text, new CultureInfo(lg));