我有 2 个资源文件,一个是英文的,另一个是外文的。当我打电话
ResourceManager.GetString("Hello")
从 .Designer.cs 文件中,它总是返回英文翻译。我检查了我的语言环境和语言等,一切都是正确的。
它从我的主程序集中返回正确翻译的字符串,但从加载的程序集中它总是返回英文。
我有 2 个资源文件,一个是英文的,另一个是外文的。当我打电话
ResourceManager.GetString("Hello")
从 .Designer.cs 文件中,它总是返回英文翻译。我检查了我的语言环境和语言等,一切都是正确的。
它从我的主程序集中返回正确翻译的字符串,但从加载的程序集中它总是返回英文。
这是发生了什么。我有一个包含几个翻译资源文件的程序集。这些都是嵌入式资源。
当我编译程序集时,它会将默认英语放入其 .dll 中。至于其他语言,它正在使用其中的语言创建文件夹,fr、da、de 等。
如果我希望它们被加载到所有其他程序集中的主应用程序拾取,我也必须移动所有这些。当我告诉程序集它们都是嵌入式资源文件时,我想它实际上会嵌入它们!
我现在有一个AssemblyLoader
加载所有必需的 .dll 的工具,当它无法从当前位置找到它们时,打包它将取决于我是要包含所有语言还是在构建项目之前选择我想要的语言。工作量超出了我的预期,但最终解决了。
大家有什么问题,欢迎提问。
GetString 的第一个重载ResourceManager.GetString(string)
使用当前线程的 CurrentUICulture ( Thread.CurrentThread.CurrentUICulture
)。
参考MSDN:-
返回的资源针对当前线程的 UI 区域性进行本地化,由 CurrentUICulture 属性定义。
在后台线程中,不要假设线程的 CurrentUICulture 与主(或 UI)线程的 CurrentUICulture 相同。
从后台线程访问资源的更好方法是使用以下内容来获取正确的本地化字符串:-
var localString = Properties.Resources.ResourceManager.GetString("ResourceKey", CultureInfo.CurrentCulture);
不确定如何实例化 ResourceManager,但是当您调用 ResourceManager.GetString() 时,您可以指定 CultureInfo,它可以帮助您在正确的语言环境中获取字符串。因此,您可以执行以下操作:
var string = ResourceManager.GetString("ResourceKey", new CUltureInfo("en-GB"));
这将确保字符串键来自 en-GB 特定的资源文件。
尝试将构建操作更改为“嵌入式资源”我最近在添加泰米尔语资源时遇到了这个问题。花了几个小时后,我发现添加资源文件后错过了这个简单的步骤。
我发现动态解决此问题的最简单快捷的方法是获取当前在运行应用程序的操作系统中使用的语言,并调用适当的资源这是完成此操作的代码。
string lg = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
return resourceManager.GetString(text, new CultureInfo(lg));
就我而言,问题出在 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>