如何本地化数据
本文关键字:数据 本地化 | 更新日期: 2023-09-27 18:05:17
例如,我有一个部门集合
ObservableCollection<Department> Departments ...
XAML
<ComboBox ItemsSource="{Binding Departments}"
SelectedValue="{Binding SelectedDepartmentId}"
SelectedValuePath="Id"
DisplayMemberPath="Name" />
可以看到DisplayMemberPath被设置为"Name",名称是英文的。
因为这是DATA和NOT UI我不认为我应该使用resx资源,因为如果添加了一个新的部门和它的翻译,那么如果使用resx,则需要重新编译和释放。
如何本地化数据?
我个人使用自定义标记扩展,这里有一篇关于它的好文章。我还给了它一个自定义命名空间它允许我这样写XAML:
<Label Content="{Translate 'First Name:'}" />
除此之外,我还编写了两个实用程序。第一个搜索我所有的XAML文件,查找"{Translate…}"标记,并保存密钥(例如:'First Name:')在CSV文件中,然后可以导入到翻译人员的电子表格或粘贴到谷歌翻译等进行测试。第二个实用程序然后从电子表格中获取值并将其转换为XML,然后将其加载到本地化管理器的适当字典中。英文字典为空,每当在字典中找不到字符串时,它就返回到键本身。这个系统意味着我可以在编写XAML时使用英语,但导出和导入密钥的过程是完全自动化的,我可以在运行时立即更改应用程序中所有字符串的语言。
所以这是我的方法:
在数据库中有一个表,其中包含本地化值
Table Departments_Localized_Names
IdDepartment -> Foreign key to the original department
culture -> Relate to the culture/language
LocalizedDisplayName -> Translated department name
使用部分实体类或更好的数据传输对象,添加"LocalizedDisplayName"属性,该属性将仅在程序加载时设置,其值将取决于当前区域性
public partial class Department
{
//Set it at runtime according to the current culture
public string LocalizedDisplayName{get;set;}
}
所以在显示数据的时候,我根据应用程序当前文化和部门id从Departments_Localized_Names中提取LocalizedDisplayName值并在对象上设置LocalizedDisplayName,这样我就可以做以下操作:
<ComboBox ItemsSource="{Binding Departments}"
SelectedValue="{Binding SelectedDepartmentId}"
SelectedValuePath="Id"
DisplayMemberPath="LocalizedDisplayName" />
插入新部门时,我只需要确保将翻译后的值添加到Departments_Localized_Names中,并且它应该可以工作,而不需要新的发布。