首页 > 代码库 > 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 - 使用资源字典实现多国语言切换(重启应用生效)