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

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

  1. 通过编译项目以设置 x:Uid 并使用 LocBaml 工具实现;
  2. 通过 DynamicResource 实现;
  3. 通过 Resx 文件实现

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

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

  • 在 XAML 中,引用 DynamicResource 的属性必须为依赖属性,否则会出错;
  • 在 C# 代码中引用稍微有点麻烦,需要从 Resource Dictionary 中获取并转化为字符串

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

所以,之后尝试了第三种方式——使用 resx 文件,事实上,这是一种比较传统的、且普遍的方式,说它传统,是因为在 WinForm 中就可以这么做;说它普遍,是因为在 ASP.net MVC 中也可以这么做;并且,在 UWP 中的实现方式也与此有点类似。可以说,基本上基于 .NET 的各个平台都是以这种或类似这种方式来实现本地化的。并且,事件证明,这种方式的确是非常合适的,也很好用,在 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} 标记引用资源,如下:

<TextBlock Text="{x:Static loc:Resources.Main_Menu_Home}" />

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"

<Button Margin="5" Padding="5" Content="{x:Static loc2:Resources.Main_New}" />
<Button Margin="5" Padding="5" Content="{x:Static loc2:Resources.Main_Open}" />

更方便的方式

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

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

需要注意的是,如果要添加新资源项时,必须在左侧仅选择目标资源文件。它的具体用法,不属于本文讨论的范围,如果大家有需要了解,可以搜索相关教程。总之,通过这个插件,可以非常方便地创建、删除、管理本地化文本。

总结

所以,通过本文所提出的 Resx 文件本地化方案再加 ResXManager 扩展,你就可以方便地在你的 WPF项目中实现本地化了。如果您有更好的建议或意见,请留言交流。

参考文章:

WPF Globalization and Localization Overview

How to: Localize an Application

Supported languages

Manage language and region

WPF Localization

Localizing WPF Applications using Locbaml

源码下载

转载于:https://www.cnblogs.com/wpinfo/p/wpf_localization.html

WPF: 本地化(Localization) 实现相关推荐

  1. DotNetCore 3.0 助力 WPF本地化

    概览 随着我们的应用程序越来越受欢迎,我们的下一步将要开发多语言功能.方便越来越多的国家使用我们中国的应用程序,基于 WPF 本地化,我们很多时候使用的是系统资源文件,可是动态切换本地化,就比较麻烦了 ...

  2. ASP.NET 本地化 (localization)

    简要: .NET支持Windows和Web应用程序的全球化和本地化.要使应用程序全球化,可以使用System.Globalization命名空间中的类,要使应用程序本地化,可以使用System.Res ...

  3. WPF的本地化思路提示:直接汉化BAML

    首先是看到这篇博文:<WPF四年,尤不足以替代WinForm>其中就提到了WPF本地化的问题.其中是这么说的: 编译之后XAML会被编译成二进制的BAML,而BAML的格式是非公开的.这样 ...

  4. [UWP]本地化入门

    [UWP]本地化入门 原文:[UWP]本地化入门 1. 前言 上一篇文章介绍了各种WPF本地化的入门知识,这篇文章介绍UWP本地化的入门知识. 2. 使用resw资源文件实现本地化 在以前的XAML平 ...

  5. 与众不同 windows phone (28) - Feature(特性)之手机方向, 本地化, 应用程序的试用体验, 系统主题资源, 本地数据的加密解密...

    原文:与众不同 windows phone (28) - Feature(特性)之手机方向, 本地化, 应用程序的试用体验, 系统主题资源, 本地数据的加密解密 [索引页] [源码下载] 与众不同 w ...

  6. c# 添加中文描述 给enum_理解C# 核心概念 – C# 程序集本地化

    在之前几讲中,老白给大家介绍了C#中module和Assembly的生成和使用.在这一篇中,老白将更加深入的介绍下Assembly其中的一个知识点--本地化(Localization). 什么是本地化 ...

  7. C#/.Net Core/WPF框架初建(国际化、主题色)

    English | 简体中文 作为 TerminalMACS 的一个子进程模块 - WPF管理端,目前搭建框架部分功能:本地化.国际化.主题色修改等. 导航目录 1.框架已添加功能说明 1.1. 国际 ...

  8. c# contains方法_C#/.Net Core/WPF框架初建(国际化、主题色)

    C#/.Net Core/WPF框架初建(国际化.主题色) English | 简体中文 作为 TerminalMACS 的一个子进程模块 - WPF管理端,目前搭建框架部分功能:本地化.国际化.主题 ...

  9. Swift iOS macOS 如何 Localize StoryBoard,StoryBoard 本地化,添加多语言支持,基于 String

    Swift iOS macOS 如何 Localize StoryBoard,StoryBoard 本地化,添加多语言支持,基于 String 本地化主要包含两个部分:代码中文本的本地化 和 Stor ...

最新文章

  1. [JOISC2014]バス通学
  2. poj2976(0-1分数规划)
  3. 英语语法---感叹词详解
  4. Objective-C策略模式(Strategy)
  5. 三菱a系列motion软体_三菱M70A/64SM重要功能比较
  6. hal库开启中断关中断_stm32的HAL库开发学习笔记之外部中断
  7. MySQL innodb每行数据长度的限制
  8. VS在win32平台与mysql链接_visual C++如何与MySQL在windows下建立连接
  9. Spring——jar包详解
  10. matlab考试题烟台大学,徐骞-计算机控制与工程学院
  11. Android游戏源码的分析、疑问与交流
  12. MYSQL数据库SQL语句练习实验 EXERCISES. 1 SIMPLE COMMANDS
  13. 北京云栖AI大热 驻云CloudCare揭云服务新趋势
  14. Sphinx使用方法
  15. MATLAB初探:美国人口与年份数据拟合
  16. MATLAB求解微分方程
  17. Verilog中可综合及不可综合语句概述
  18. 链接脚本之SECTIONS
  19. 学计算机要数学和英语怎么说,高中数学和英语有点恼火。但本人大学想学计算机,就是不知道英语和数学与计算机专业有什么必要联络吗?...
  20. 数学乐 --- 奇函数与偶函数(个人学习笔记)

热门文章

  1. vivo z5和z5x有什么区别
  2. 2003退休去世领了2年退休金没回本就死了能退吗?
  3. 移动互联网将向“全真互联网”升级
  4. 如何用手机NFC代替小区门禁?
  5. First of all, let’s talk about the richest man in Japan
  6. 配置docker阿里云镜像加速
  7. Linux平台安装Clion
  8. 提高sql性能的方法_三种提高T-SQL性能的方法
  9. mysql按照列构建索引_列存储索引增强功能–在线和离线(重新)构建
  10. ssas如何创建分区_Analysis Services(SSAS)多维设计技巧–创建尺寸