在WPF實現多語言會容易很多,只要準備兩個XAML資源文件就可以了,然後使用DynamicResource綁定就可以了。
但是SL就比較麻煩點,這裏給出兩種方法,一種是最開始我在網上找到的,一種是後來自己倒弄出來的,這裏寫出來備份一下。
方法1:通過資源文件resx實現。
1、創建一個資源文件MyStrings.resx,設置訪問修飾符爲public,打開在第一列(名稱)填入需要實現多語言的字段。
2、複製MyStrings.resx,更改名稱爲MyStrings.zh-CN.resx,打開在第二列(值)填入對應的中文名稱。
3、複製MyStrings.resx,更改名稱爲MyStrings.en-US.resx,打開在第二列(值)填入對應的英文名稱。
4、保證只有MyStrings.resx文件下會生成*.Designer.cs文件,其他兩個resx文件下若生成則刪除。
5、創建一個實現INotifyPropertyChanged接口的類,用於實現切換語言後的文字更新。
public class LangResources : INotifyPropertyChanged
{
private static MyStrings _strings = new MyStrings();
public MyStrings LocalizedStrings
{
get { return _strings; }
set
{
_strings = value;
OnPropertyChanged("LocalizedStrings");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
6、添加一個LangResources的實例在在資源文件裏,你可以新建一個xaml文件,這裏我就直接寫在App.xaml裏了。
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:functions="clr-namespace:SLLangsDemo.C1"
x:Class="SLLangsDemo.App">
<Application.Resources>
<ResourceDictionary>
<functions:LangResources x:Key="Lang"/>
</ResourceDictionary>
</Application.Resources>
</Application>
7、獲取這個實例,然後通過改變這個實例中屬性的值該實現多語言。(好像有點繞彎,不過這樣做是爲了實現頁面上的綁定)。
private static readonly LangResources Lang = Application.Current.Resources["Lang"] as LangResources;
8、頁面綁定
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<TextBlock Text="方法1:" VerticalAlignment="Center"/>
<CheckBox Width="150" Margin="5" Content="{Binding Path=LocalizedStrings.Apple,Source={StaticResource Lang}}" Foreground="OrangeRed"/>
<CheckBox Width="150" Margin="5" Content="{Binding Path=LocalizedStrings.Banana,Source={StaticResource Lang}}"/>
<CheckBox Width="150" Margin="5" Content="{Binding Path=LocalizedStrings.Orange,Source={StaticResource Lang}}"/>
</StackPanel>
9、用記事本打開*.csproj文件,找到SupportedCultures字段,然後添加支持的語言名稱。
<SupportedCultures>zh-CN;en-US</SupportedCultures>
10、爲一個按鈕添加Click事件,然後調用下面的函數去實現多語言的切換。
private void ChangLangsBtnClick_CN(object sender, RoutedEventArgs e)
{
SetLanguage.ChangLanguage(LangType.中文);
}
public enum LangType
{
中文,
英文
}
public static void ChangLanguage(LangType langType)
{
var lang = langType == LangType.中文 ? "zh-CN" : "en-US";
var culture = new CultureInfo(lang);
Thread.CurrentThread.CurrentUICulture = culture;
Thread.CurrentThread.CurrentCulture = culture;
if (Lang == null) return;
Lang.LocalizedStrings = new MyStrings();
}
方法2:通過繼承新的控件和字典來實現,這個方法無意中弄出來的,個人覺得比方法1好用,也好管理。
1、首先,我們需要來創建一個枚舉,Null用於默認用的。
public enum HeaderType
{
Null,
蘋果,
香蕉,
橘子
}
2、創建一個語言類,用於存放不同的語言值。
public class LangNode
{
/// <summary> 中文名稱
/// </summary>
public string CN_Name { get; set; }
/// <summary> 英文名稱
/// </summary>
public string EN_Name { get; set; }
}
3、創建一個預定義的類,用字典來存儲對應枚舉值的語言信息,然後供外部調用。
/// <summary> 預定義
/// </summary>
public static class LangsPredefines
{
private static readonly Dictionary<HeaderType, LangNode> LangsDict = new Dictionary<HeaderType, LangNode>();
static LangsPredefines()
{
AddToLangsDict(HeaderType.蘋果, "Apple", "蘋果");
AddToLangsDict(HeaderType.香蕉, "Banana", "香蕉");
AddToLangsDict(HeaderType.橘子, "Orange", "橘子");
}
private static void AddToLangsDict(HeaderType type, string en, string cn)
{
if (LangsDict.ContainsKey(type)) return;
LangsDict.Add(type, new LangNode { CN_Name = cn, EN_Name = en });
}
public static string GetLangsName(HeaderType headerType)
{
LangNode node;
if (LangsDict.TryGetValue(headerType, out node))
{
switch (SetLanguage.CurrentLangType)
{
case LangType.中文: return node.CN_Name;
case LangType.英文: return node.EN_Name;
}
}
return "Null";
}
}
4、創建一個控制類,用於觸發語言切換。
public enum LangType
{
中文,
英文
}
public class SetLanguage
{
/// <summary> 語言切換時
/// </summary>
public static Action ChangeLangAction;
/// <summary> 當前語言種類
/// </summary>
public static LangType CurrentLangType { get; set; }
/// <summary> 切換語言
/// </summary>
public static void ChangLanguage(LangType langType)
{
if (CurrentLangType == langType) return;
CurrentLangType = langType;
if (ChangeLangAction != null)
{
ChangeLangAction();
}
}
}
5、接下來,我們來根據需要繼承或者自己重新寫一個新的控件,這裏我們繼承DataGridTextColumn,然後爲它添加一個依賴項屬性,再添加一個對ChangeLangAction的相應處理方法。
public class LangsDataGridTextColumn : DataGridTextColumn
{
public static readonly DependencyProperty HeaderTypeProperty =
DependencyProperty.Register("HeaderType", typeof(HeaderType), typeof(LangsDataGridTextColumn), new PropertyMetadata(HeaderType.Null));
public HeaderType HeaderType
{
get { return (HeaderType)GetValue(HeaderTypeProperty); }
set
{
SetValue(HeaderTypeProperty, value);
UpdateHeader();
}
}
public LangsDataGridTextColumn()
{
SetLanguage.ChangeLangAction += UpdateHeader;
}
private void UpdateHeader()
{
Header = LangsPredefines.GetLangsName(HeaderType);
}
}
6、進行頁面上的設置,只需要給出枚舉值就可以了。
<UserControl x:Class="SLLangsDemo._2.Control2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sdk="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
xmlns:c2="clr-namespace:SLLangsDemo.C2"
mc:Ignorable="d">
<StackPanel Orientation="Horizontal">
<TextBlock Text="方法2:" Margin="0,2"/>
<sdk:DataGrid Height="200" VerticalAlignment="Top" Margin="2,0,0,0">
<sdk:DataGrid.Columns>
<c2:LangsDataGridTextColumn Width="150" HeaderType="蘋果"/>
<c2:LangsDataGridTextColumn Width="150" HeaderType="香蕉"/>
<c2:LangsDataGridTextColumn Width="150" HeaderType="橘子"/>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</StackPanel>
</UserControl>
5、最後,使用按鈕觸發。
private void ChangLangsBtnClick_EN(object sender, RoutedEventArgs e)
{
SetLanguage.ChangLanguage(LangType.英文);
}
我做了一個DEMO,可以在這裏下載http://download.csdn.net/download/wushang923/6756227