首页 > 代码库 > uwp - 使用资源字典实现多国语言切换(重启应用生效)
uwp - 使用资源字典实现多国语言切换(重启应用生效)
找了好半天资料,没发现什么可以实时切换语言的好办法,没错,是没什么好办法,一些囊肿的办法倒是有,不过我试过后觉得不怎么好用,诸如:用类定义——太麻烦不易修改,绑定麻烦;试过通过自定义主题来实现,比用类来实现好太多了,切换ElementTheme属性就可以实时变更语言,不过怪怪的,而且也是比较麻烦所以不用,那么最后只能用最后这种资源字典来实现,但是却不能实时生效,╮(╯▽╰)╭悲哀,想想微软自家的APP什么msn新闻,自身os也不是得重启生效,索性不去纠结实时不实时的问题。
还是想抱怨一句,为什么在wpf中的动态资源uwp却没了,不然可方便多了,什么实时主题切换,语言切换不在话下,好了回到正题, 使用资源字典实现多国语言切换(重启应用生效)。
在APP.XAML中加入:
<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary x:Name="Language" Source="XAMLResources/Languages/Chinese.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources>
然后,根木录新建文件目录:XAMLResources/Languages/,新建两个文件:“Chinese.xaml”中文语言,“English.xaml”英文语言。
文件内容的格式都一样,不过是中文英文不一样而已。
【中文chinese.xaml】 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Udiary.XAMLResources.Languages"> <x:String x:Key="btn_login">登录</x:String> </ResourceDictionary> 【英文english.xaml】 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Udiary.XAMLResources.Languages"> <x:String x:Key="btn_login">Login</x:String> </ResourceDictionary>
在APP.Xaml.cs中的 protected override void OnLaunched(LaunchActivatedEventArgs e)方法第一行开始插入以下代码:
//清除现有语言 Application.Current.Resources.MergedDictionaries.Clear(); //切换语言 ResourceDictionary lg = new ResourceDictionary(); //其中的a就是要切换的语言文件名 lg.Source = new Uri("ms-appx:/XAMLResources/Languages/" + a + ".xaml", UriKind.RelativeOrAbsolute); //添加资源 Application.Current.Resources.MergedDictionaries.Add(lg);
在页面page中,绑定相应数据即可,比如button:
<Button Content="{StaticResource btn_login}"/>
基本搞定。当然还需要完善,比如什么时候切换语言,又怎样保存当前的语言。
很多办法,你可以把当前语言作为一个字符串保存到一个文件内,比如:lg.txt内容是cn代表中文,启动时加载chinese.xaml。我这里是用更简单的方法:“ApplicationDataContainer”来保存语言设置,然后在启动应用时读出来作相应的处理。
关于ApplicationDataContainer的用法如:
读:
ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; if (localSettings.Values.ContainsKey(name)) { return localSettings.Values[name].ToString(); } else { return ""; }
写:
localSettings.Values[name] = value;
最后附上效果图收尾:
uwp - 使用资源字典实现多国语言切换(重启应用生效)