java 本地化_本地化(Localization) 实现

本文将讨论在WPF中一种较为方便的本地化方法。

由于在项目中要实现本地化,所以我在网上查找相关的解决方案。通过一系列调研,发现实现本地化的方法主要有以下三种:

通过编译项目以设置 x:Uid 并使用 LocBaml 工具实现;

通过 DynamicResource 实现;

通过 Resx 文件实现

其中第一种是官方介绍的方法,考虑到实现步骤略为复杂,所以直接忽略;

第二种方式的实现,主要是在程序中添加 Resource Dictionary 类型的文件,并在其中放入本地化资源字符串;在 XAML 代码中,直接使用 {DynamicResource XXXX} 来实现;这种方法比较方便,不过它也有两个缺点:

在 XAML 中,引用 DynamicResource 的属性必须为依赖属性,否则会出错;

在 C# 代码中引用稍微有点麻烦,需要从 Resource Dictionary 中获取并转化为字符串

其中第一点可以说是致命缺点,我曾在项目中添加了一个第三方控件,其 Header 属性并不是依赖属性,所以不能使用这种方式;不是依赖属性,当然,也就更不能使用绑定(Binding)来设置了。

所以,之后尝试了第三种方式——使用 resx 文件,事实上,这是一种比较传统的方式,在 WinForm 中就可以这么做,当然,在 UWP 中的实现方式也与此有点类似。并且,事件证明,这种方式的确是非常合适的,并且也很好用,在 XAML 代码和 C# 代码中均可以非常方便的使用。

使用 ResX 文件实现

它的操作步骤大概如下:

1. 创建一个 WPF 项目;

2. 在主窗口中添加几个需要本地化其内容的控件,如 TextBlock、Button等;

3. 展示此项目的 Properties 文件夹,这里已经有一个默认的 Resources.resx,在其中添加本地化字符串;

4. 将其复制,并粘贴到当前位置,将新文件改名为 Resources.en-US.resx,并修改其中的本地化字符串为对应的语言值;

说明:这里我们添加了对英语语言的本地化,至于支持哪些语言的本地化,可以参考这篇文章 Supported languages,关于语言匹配可参考这篇文章 Manage language and region,尽管这两篇文章是针对 UWP 的,不过原则上,对于 WPF 也是适用的;

5. 将上述两个 resx 文件的 Access Modifier 修改为 Public,默认值是 Internal;如下图:

接下来就是如何使用了:

6. 在 Xaml 中添加命名空间引用:

xmlns:loc="clr-namespace:WpfLocalizationTest.Properties"

7. 使用 {x:Static} 标记引用资源,如下:

8. 如果需要在代码中引用,也非常简单:

var homePage = Properties.Resources.Main_Menu_Home;

经测试,这种方式也支持 IntelliSense(智能提示),如下图:

如果你没看到智能提示,可以先编译项目。

此时,有两种方式可以测试本地化效果,第一种方式是在控制面板中改变操作系统的语言,第二种方式是通过代码改变 CurrentUICulture;这里我们使用后者,在 App.xaml.cs 中添加如下代码:

protected override void OnStartup(StartupEventArgs e)

{

base.OnStartup(e);

Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

}

运行后就可以看到测试结果了。

在大型项目中使用

上面是在 Demo 中展示如何本地化应用,那么在大型项目中是如何来应用这种方式呢?以下简单介绍一下,可以供参考:

1. 在解决方案中创建一个类库项目(或在已有项目中进行后续操作),此项目的用途主要是作资源用;

2. 在其中创建 Localization 文件夹,在这个文件夹下可以再创建针对各个模块的子文件夹,然后在此创建 resx 文件、添加本地化字符串并复制。文件结构如下:

3. 要在主程序中使用,方式和我们在 Demo 中提到的是一样的。首先在主程序项目中添加对新创建项目的引用,然后在 XAML 中添加命名空间和相关代码:

xmlns:loc2="clr-namespace:App.Resources.Localization.MainModule;assembly=App.Resources"

更方便的方式

如果软件中有大量的文本需要本地化,那么在 resx 文件中的资源项将会非常多,这时,要在两个资源文件中添加、删除、对比、检查项目时,将会非常困难,有没有更方便的方法呢?这里推荐一个 VS Extension: ResX Manager

它可以非常方便地管理当前解决方案中的 Resx 文件以及其中的资源项,安装后,在 VS 中工具菜单中可以打开,界面如下:

需要注意的是,如果要添加时,必须在左则仅选择目标资源文件。通过它,可以非常方便地创建、删除、管理本地化文本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值