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   豆浆咖啡  阅读(1667)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
< 2012年7月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4
5 6 7 8 9 10 11

统计

点击右上角即可分享
微信分享提示