[WPF] 多語系自動(Localization)切換

用系統當下的語系自動選擇對應語系的資源檔

記錄如何在WPF中實作多語系的自動切換,廢話不多說直接上步驟(從我早先分享的文檔挖出來 XD)

1. 建立資源字典 ResourceDictionary

1.1. 在專案裡建立一個放字典檔的目錄,ex: Lang
1.2. 在這目錄下新增「資源字典(WPF)」的項目,檔名要依照CultureInfo規則命名,如:英文en-US.xaml / 繁中zh-TW.xaml / 簡中zh-CN.xaml
1.3. 要設定為預設語系要將該資源字典檔的屬性中「建置動作(BuildAction)」設定為Page
1.4. 在資源字典檔中新增字串標籤範例如下

<lang:String x:Key="OK">OK</lang:String>
             字串標籤^^  ^^在此語系下顯示的文字
<lang:String x:Key="OK">確定</lang:String>

2. 登入資源字典

2.1. 在App.xaml增加資源字典的目錄與預設檔案,如下:

<Application.Resources>
	<ResourceDictionary>
		<ResourceDictionary.MergedDictionaries>
			<ResourceDictionary Source="Lang\en-US.xaml"/>
		</ResourceDictionary.MergedDictionaries>
	</ResourceDictionary>
</Application.Resources>

2.2. 在需要用到字典字串的.xaml檔案新增字典字串,範例如下:

<Button Content="{DynamicResource OK}" Click="btnOK_Click"/>

3. 啟動時載入本地語系

3.1. 若要自動偵測系統語系並載入對應資源字典,在App.xaml.cs中增加以下內容

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
	{
	}

	if (langRd != null)
	{
		if (this.Resources.MergedDictionaries.Count > 0)
		{
			this.Resources.MergedDictionaries.Clear();
		}
		this.Resources.MergedDictionaries.Add(langRd);
	}
}

若要在code裡引用資源字典,有以下兩種引用方法

1. 靜態調用

lblTitle.Content = FindResource(“lblTitle”).ToString();

2. 動態調用

lblTitle.SetResourceReference(Label.ContentProperty, “lblTitle”);

參考:

WPF多國語系(Localization)