如何本地化数据

本文关键字:数据 本地化 | 更新日期: 2023-09-27 18:05:17

例如,我有一个部门集合

ObservableCollection<Department> Departments ...

XAML

<ComboBox ItemsSource="{Binding Departments}" 
          SelectedValue="{Binding SelectedDepartmentId}"   
          SelectedValuePath="Id" 
          DisplayMemberPath="Name" />

可以看到DisplayMemberPath被设置为"Name",名称是英文的。

因为这是DATANOT 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中,并且它应该可以工作,而不需要新的发布。