<Button Content="{DynamicResource OK}"/>
至於是使用StaticResource 還是DynamicResource,這取決於你是否要在運行時動態切換,如果僅僅是軟件啟動的時候才切換語言StaticResource就可以了.
3,OK 實戰一下:
3.1 新建項目,並在項目中新建一個Lang文件夾用於保存我們的語言文件
3.2 在Lang文件夾中,新建"ResourceDictionary(WPF)",命名為"DefaultLanguage.xaml",並將其BuildAction設置為Page,這是一個默認語言資源文件,其將被編譯(而不是松散鏈接,這樣可以確保在軟件語言包丟失或沒有某國家或地區的對應語言包時可以有一種默認的界面語言):我們這裡采用英文作為默認語言:
<ResourceDictionary XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
XMLns:x="http://schemas.microsoft.com/winfx/2006/xaml"
XMLns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="OK">
OK
</sys:String>
<sys:String x:Key="Cancel">
Cancel
</sys:String>
</ResourceDictionary>
然後,我們添加另一國語言,比如中文,在Lang文件夾中,新建"ResourceDictionary(WPF)",命名為"zh-CN.xaml",並將其BuildAction設置為Content,將CopyToOutputDirctory設置為"if new",這樣,我們的中文語言文件為將被拷貝到應用程序目錄下的Lang目錄下,其他的非默認語言的語言文件都應該采取這種方式.
<ResourceDictionary XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
XMLns:x="http://schemas.microsoft.com/winfx/2006/xaml"
XMLns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="OK">
確定
</sys:String>
<sys:String x:Key="Cancel">
取消
</sys:String>
</ResourceDictionary>
3.3 為了讓編碼人員在設計器(比如VS,Blend)中所見即所得地看到界面文本,我們應該將默認語言資源加入到應用程序的資源列表中:
<Application x:Class="LangDemo.App"
XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
XMLns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml"
>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionarIEs>
<ResourceDictionary Source="lang\DefaultLanguage.xaml"/>
</ResourceDictionary.MergedDictionarIEs>
</ResourceDictionary>
</Application.Resources>
</Application>
這樣我們就可以在設計器中使用這些資源了:
我們可以看到由於我們加載的默認語言是英文,設計器中我們的窗口界面上顯示的是對應的英文文本.
3.4 軟件啟動時加載對應的本地化的語言:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
LoadLanguage();
}
private void LoadLanguage()
{
CultureInfo currentCultureInfo = CultureInfo.CurrentCulture;
ResourceDictionary langRd = null;
try
{
langRd =
Application.LoadComponent(
new Uri(@"Lang\" + currentCultureInfo.Name + ".xaml", UriKind.Relative))
as ResourceDictionary;
}
catch
&
nbsp;
{
}
if (langRd != null)
{
if (this.Resources.MergedDictionarIEs.Count > 0)
{
this.Resources.MergedDictionarIEs.Clear();
}
this.Resources.MergedDictionarIEs.Add(langRd);
}
}
}
當軟件啟動時,我們根據當地的CultureInfo來加載對應的語言文件(如果該語言文件存在的話),由於界面上的文本不是硬編碼進去的,而是采用DynamicResource,當後台Resource改變時,前台的引用也會動態改變,OK,當軟件啟動後,我們的界面就自動的切換了,我這台電腦上是中文: