Windows Phone 8.1 应用多语言

Windows Phone 8.1 app Multi language

我正在使用 Visual Studio 2015 在 SilverLight 中创建 windows phone 应用程序 8.1。我正在创建英语和阿拉伯语的多语言应用程序。为此,我在项目中创建了 Strings 文件夹,其中包含两个 en-US 和 ar-KW 文件夹,每个文件夹中都有 Resources.resw 文件。

我正在 x:Uid 设置属性。例如Key:- Actual.Text Value:- Actual

<TextBlock x:Uid="Actual" TextWrapping="Wrap" MaxWidth="65" HorizontalAlignment="Center" />

以上效果很好。我有带有项目 EN 和 AR 的组合框。我正在触发 SelectionChanged 事件来更改语言 但问题是当我停止应用程序并再次 运行 它而不只是更改文本和布局时。

如何做到运行时间不重启。

private void LanguageComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string selectedItem = (e.AddedItems[0] as ComboBoxItem).Content as string;
            var RootFrame = Window.Current.Content as SlideApplicationFrame;

            if (selectedItem == "EN")
                ApplicationLanguages.PrimaryLanguageOverride = "en-US";
            else if (selectedItem == "AR")
                ApplicationLanguages.PrimaryLanguageOverride = "ar-KW";

            RootFrame.Navigate(this.GetType());
    }

如果您希望应用依赖于用户选择的语言,则需要存储该选择并在应用启动时读出。 这样您就可以在应用程序启动时更改 ApplicationLanguage。

所以在 App.Xaml.cs 中寻找方法 InitializePhoneApplication() 并添加以下几行(或者您也可以在此处使用 ApplicationLanguages.PrimaryLanguageOverride 尝试您的方法)

string savedLanguage = string.Empty;
var hasSavedLanguage = AppSettings.TryGetSetting(Constants.LanguageSettingKey, out savedLanguage);
if (hasSavedLanguage)
{
  Thread.CurrentThread.CurrentUICulture = new CultureInfo(savedLanguage);
  Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture;
}

当然,当用户从组合框中选择一种语言时,您还需要保存语言

据我所知,Microsoft 不建议在运行时更改语言(通过覆盖它),但您可以通过重新加载页面来完成。最简单的方法是将带有代码的组合框放在另一个页面上,在那里您将覆盖语言,因此当您向后导航(并且页面将被重新加载)时,您将拥有您想要的东西。请记住,覆盖语言不会在运行时本地化控件(但这对您来说应该不是什么大问题)。您必须重新启动应用程序才能本地化控件。

当您使用此代码覆盖语言时:

ApplicationLanguages.PrimaryLanguageOverride = "xx-XX";

然后它被保存,你不必在开始时再次覆盖它。应用程序将以覆盖的语言加载。

此外,当您本地化应用程序时,最好覆盖文化信息,因为如果您有一些日期 - 它们会根据文化正确显示(例如 12/01/2015 或 01-12-2015)

string lang = "en-US";    //default
var culture = new CultureInfo(lang);
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = lang;
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;

还有一件重要的事情。

在您的应用程序清单或那里的内容中,您需要将 生成应用程序包 设置为 "Never"。原因是当您将打包版本上传到商店时,您的运行时本地化将不起作用。您可以使用模拟器或调试版本甚至有时使用已部署的发布版本在运行时本地化您的应用程序。但是您需要这样做,这样当您的应用程序在商店中时,本地化就没有问题,并且可以访问所有语言字符串(因为对于打包版本,如果您没有安装语言,其中一些可能不会在你的 phone).