【问题标题】:Plugin-Localization in WPFWPF 中的插件本地化
【发布时间】:2020-07-26 12:04:25
【问题描述】:
目前,我正在开发一个可扩展的 WPF 应用程序。可扩展性是通过一个简单的插件系统实现的,其中每个插件都包含在它自己的项目中,还提供了一个适当的 Viewmodel 和一个 View,以 DataTemplate 的形式公开。
我现在正在考虑使用 resx 文件进行本地化(这是非常标准的)。这适用于主应用程序,但我想知道如何对插件也这样做。
考虑在插件中也包含本地化的 resx 文件并在插件视图中绑定到它们。这是一条可行的路线还是有什么最佳实践可以遵循?
【问题讨论】:
标签:
wpf
plugins
localization
【解决方案1】:
WPF 拥有自己的基础资源系统。
一种常见的 wpf 方法不是使用 resx,而是使用资源字典。
您要替换的每个字符串都是基本资源字典中的一个条目。通常是英文。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1"
xmlns:sys="clr-namespace:System;assembly=System.Runtime"
>
<sys:String x:Key="Submit">Submit</sys:String>
然后作为动态资源使用
<Button Content="{DynamicResource Submit}"
然后,您可以为具有匹配 x:Keys 的其他语言构建资源字典。
当您将其中之一合并到 application.current.resources 中时,将获取新值。
这提供了以相同方式替换几何图形、图片和颜色的选项。通常以上述方式“叠加”使用多层资源字典。然后,这种方法可以同时处理品牌推广和本地化。
还有一个优点。
资源字典不必为了合并它们而编译。您可以拥有一个可由超级用户编辑或由部门/组织替换的资源字典。
您可以使用 xamlreader.load() 将平面文件显式加载到资源字典中。这意味着您的应用程序可以使用服务来下载希腊语、法语或任何资源字典。将其保存到其用户的本地应用程序数据中。每次用户启动应用程序时,该文件都会被合并,他们会看到相应的语言文本。