Silverlight中 多語言

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章