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