我们有一个有趣的要求,我们要在运行时支持多种语言,因为我们是一项服务。如果用户使用日语或英语与我们交谈,我们将希望以适当的语言回复。 FxCop 喜欢我们将我们的字符串存储在资源文件中,但我很想知道是否有一种集成方式可以在运行时选择资源字符串而无需手动执行。
结论:我们需要能够在一个二进制文件中支持多种语言。 :)
答案 0 :(得分:7)
您真的需要存储在单个二进制文件中的所有语言资源吗?默认情况下,.NET在单独的'satellite'.dlls中查找非默认语言的资源,位于以该语言命名的主.dll旁边的子目录中。
例如,如果您的.dll名为MyProject.dll,则您有一个jp-JP \ MyProject.dll,fr-BE \ MyProject.dll等。请注意,这些额外的.dll只包含资源;你的代码被编译成主.dll。您需要将这些salellite .dll与您的主.dll一起部署。
要在Visual Studio中自动创建此类卫星.dll,您需要为默认翻译创建一个Xyz.resx,并为您要翻译的每种语言创建Xyz。 lang .resx,例如,Xyz.jp-JP.resx或Xyz.de-AT.resx。 Visual Studio将负责为所使用的每种语言创建 lang \ MyProject.dll附属程序集,其中包含项目中所有*。 lang .resx文件的资源在一起。
在此设置中,您可以通过ResourceManager
访问正确的资源,就像默认资源一样,将适当的CultureInfo
作为第二个参数传递给GetString
或{{1 }}。最简单的方法是使用生成的资源类,该资源类已经正确配置了GetObject
:
ResourceManager
请注意,如果您希望更轻松地完成此过程,可以将CultureInfo culture = new CultureInfo("jp-JP");
...
string labelText = ResourceName.ResourceManager.GetString("SomeKey", culture);
的{{1}}设置为正确的文化,然后所有未指定文化的资源查找都将使用Thread
(仅在该特定线程上):
CurrentUICulture
这很容易,.NET Framework的大多数其他部分将开始使用相同的语言作为其消息和其他本地化设置的一部分。如果它们可用,那就是。 (您可能需要安装语言包。)如果它们不可用,框架将回退到另一种语言(通常是英语)。
但是,如果您只想翻译 资源,则需要采用CurrentUICulture
来电的方式。