Windows Phone开发经验谈(14)-动态的改变APP的语言

 

    在Windows Phone 开发中很多开发者做全球化应用的时候,都只做到在英文的系统里面显示英文在中文的系统里面显示中文..虽然这么做确实没有问题,也是官方推荐的做法.但是很多部分早期买Windows Phone的用户大部分都是英文系统..有的用户他们的英文并不好,就希望APP是中文的..如果根据官方的教程做了本地化应用那么那部分用户还是只能享受到英文的界面...今天我要说的是如何动态的改变App的语言...

    如果您还不会本地化APP的话建议看下这条链接的内容:http://msdn.microsoft.com/en-us/library/ff637522(v=vs.92).aspx  如果您已经会了,那么就可以继续往下看。首先我们在官方的示例上创建一个类叫作LangNotify用于双向绑定.代码如下

 public class LangNotify: INotifyPropertyChanged
    {
        public string this[string resourceName]
        {
            get
            {
                return AppResources.ResourceManager.GetString(resourceName);
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void UpdateBindings()
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Item[]"));
                PropertyChanged(this, new PropertyChangedEventArgs("Version"));
            }
        }

        public string Version
        {
            get
            {
                //Regex regex = new Regex("^.*, Version=(?<version>.*), Culture.*$");
                //Match match = regex.Match(Assembly.GetExecutingAssembly().FullName);
                //string text = match.Success ? match.Groups[("version")].Value : "1.0.0.0";
                return string.Format("{0}: {1}", this["Version"], "1.5");
            }
        }

    }

    这时候在页面的VIewModel里面添加入下代码:

   private LangNotify lang = new LangNotify();
     
        public LangNotify Lang
        {
            get
            {
                return lang;
            }
            private set
            {
                lang = value;
            }
        }

在Xaml页面的绑定代码改成{Binding Lang[AppTitle]}

        <TextBlock x:Name="ApplicationTitle" Text="{Binding Lang[AppTitle]}"  Style="{StaticResource PhoneTextNormalStyle}"/>
    

这里我在分享一个类用于存储应用程序配置信息的,接下来我们会借助到这个类。

    public static class AppSettingHelper
    {
        private static readonly IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
        public static void AddOrUpdateValue(string key, object value)
        {
            bool valueChanged = false;

            if (settings.Contains(key))
            {
                if (settings[key] != value)
                {
                    settings[key] = value;
                    valueChanged = true;
                }
            }
            else
            {
                settings.Add(key, value);
                valueChanged = true;
            }
            if (valueChanged)
            {
                Save();
            }
        }

        public static T GetValueOrDefault<T>(string key, T defaultValue)
        {
            T value;

            if (settings.Contains(key))
            {
                value = (T)settings[key];
            }
            else
            {
                value = defaultValue;
            }
            return value;
        }

        private static void Save()
        {
            settings.Save();
        }
        
    }

首先程序启动的时候,我们要判断下用户是否自定义了语言选项...然后在设置当前语言,代码如下:

public static void SetLang(string lang)
        {
            if (!string.IsNullOrEmpty(lang))
            {
                CultureInfo info = new CultureInfo(lang);
                Thread.CurrentThread.CurrentCulture = info;
                Thread.CurrentThread.CurrentUICulture = info;
            }

        }


        public static void GetLang()
        {
            string currentLang = AppSettingHelper.GetValueOrDefault<string>("language", "");
            if (string.IsNullOrEmpty(currentLang))
            {
                currentLang = Thread.CurrentThread.CurrentUICulture.ToString();
                AppSettingHelper.AddOrUpdateValue("language", currentLang);
                return;
            }
            if (currentLang != Thread.CurrentThread.CurrentUICulture.ToString())
                SetLang(currentLang);
        }
 

最关键的是每次修改了语言选项后一定要调用UpdateBindings()这个方法。

总结,这个示例是我最初的时候尝试的示例..其实有很多可以改进的地方..大家可以摸索摸索.下一篇我会讲解WP7如何动态改变字体大小..当然同样可以适用于语言。

posted on 2012-07-22 17:08  豆浆咖啡  阅读(1663)  评论(0编辑  收藏  举报