使用XML文件存储UI翻译的文本文件,仅演示界面显示不同语言版本。
1. 将UI元素建模
假设有3个界面元素,Label,Button,Combox,依据选择的国家翻译成为不同的语言
**
public class Lang
{ public string LblText { get; set; } public string BtnText { get; set; } public string Flag { get; set; } //国旗图片 public string LangName { get; set; }//国家名称 }
2. 建立一个数据模型的集合,绑定到UI
先创建一个硬编码的方式
public class Languages
{
public List MyLangs { get; set; } =GetLangs();
public static List GetLangs()
{
var list = new List<Lang>() { new Lang() { LblText="Please Enter your Name", BtnText="Click", Flag="USA.png", LangName="English" }, new Lang() { LblText="输入你的名字", BtnText="点击", Flag="chinese.png", LangName="中文" }, new Lang() { LblText="あなたの名前を入力してください", BtnText="クリック", Flag="Japanese.png", LangName="日本語" } }; return list;
}
}
3. UI 设计数据绑定
添加静态资源
<Window.Resources>
<local:Languages x:Key=“Language”/>
</Window.Resources>
选择语言选择的不同,切换UI语言:
<ComboBox x:Name=“CBO” Grid.Row=“4” Margin=“10” Height=“50”
Grid.Column=“1” FontFamily=“30”
ItemsSource=“{Binding Source={StaticResource Language},Path=MyLangs}”
SelectedIndex=“{Binding Source={StaticResource Language},Path=SelectedInex}”
> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <Image Source="{Binding Flag}" Width="100"></Image> <TextBlock Text="{Binding LangName}"></TextBlock> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate>
创建ComboBox的数据模板,选择国家名称时,绑定国旗图片。
图片文件先从网上下载准备。
Button 文本绑定到ComboBox选择Item的BtnText属性:
Label绑定到ComboBox选择Item的LblText属性:
<Button Grid.Column=“1” Grid.Row=“1” Margin=“5” MinHeight=“20”
Content="{Binding ElementName=CBO,Path=SelectedItem.BtnText}" FontSize="30"/>
设置背景颜色
效果如下:
这种方式缺点时,增加语言,或增加其它配置都需求在代码中修改,每次都得改源码。
4. 使用XML文件来配置这些信息
<?xml version="1.0" encoding="utf-8" ?>
<Root>
<Languages actveLangld="1">
<Language id="1">
<LblText>please Enter Your Name</LblText>
<BtnText>click</BtnText>
<Flag>USA.png</Flag>
<LangName>English</LangName>
</Language>
<Language id="2">
<LblText>输入你的名字</LblText>
<BtnText>点击</BtnText>
<Flag>Chinese.png</Flag>
<LangName>中文</LangName>
</Language>
<Language id="3">
<LblText>あなたの名前を入力してください</LblText>
<BtnText>クリック</BtnText>
<Flag>Japanese.png</Flag>
<LangName>日本語</LangName>
</Language>
</Languages>>
<Colors>
<Background>LightGreen</Background>
</Colors>
</Root>
修改Languages类,增加查询XML文件的方法,增加属性字段绑定到界面
public class Languages
{
public List<Lang> MyLangs { get; set; } = GetLangesFromXml();
const string xmlFile = @"MyConfig.xml";
public static List<Lang> GetLangesFromXml()
{
var xdoc = XDocument.Load(xmlFile);
var langList = xdoc.Root.Descendants("Languages").Descendants("Language").Select(x => new Lang()
{
LblText = x.Element("LblText").Value,
BtnText = x.Element("BtnText").Value,
Flag = x.Element("Flag").Value,
LangName = x.Element("LangName").Value
}).ToList();
return langList;
}
private int _selectedIndex = GetTheActiveLanguageFromXML();
public int SelectedInex
{
get { return _selectedIndex; }
set
{
_selectedIndex = value;
SetActiveLanguage();
}
}
public void SetActiveLanguage()
{
var xdoc = XDocument.Load(xmlFile); xdoc.Root.Descendants("Languages").FirstOrDefault().Attribute("actveLangld").Value = SelectedInex.ToString();
xdoc.Save(xmlFile);
}
public static int GetTheActiveLanguageFromXML()
{
var xdoc = XDocument.Load(xmlFile);
int id = int.Parse(xdoc.Root.Descendants("Languages").FirstOrDefault().Attribute("actveLangld").Value);
return id;
}
public string BackgroundColor { get; set; } = GetBackGroundColorFromXML();
public static string GetBackGroundColorFromXML()
{
var xdoc = XDocument.Load(xmlFile);
return xdoc.Root.Descendants("Colors").FirstOrDefault().Value;
}
}
Languages类的MyLangs 数据集取值为XML文件,所以可以修改XML配置文件来动态修改,而不用每次去修改源码。