如何在运行时设置UWP语言

时间:2019-01-23 10:48:58

标签: c# xamarin.forms uwp

我目前正在使用Xamarin.Forms 3.4和Visual Studio 2017(目前为最新版本)开发跨平台应用程序。

由于App应该支持可以在运行时更改的多种语言,因此我目前正在研究完成此操作的方法。我已经添加了一些资源,并翻译了所有工作正常的界面元素。我通读了这篇文章以开始使用: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/localization/

目前,使用UWP应用时,即使默认应用语言为英语,该语言也会自动设置为我当前的系统设置,即德语。很好。

现在,我有了一种方法,该方法可以通过设置一些信息(例如默认的CultureInfo对象)来配置当前的语言。该方法如下所示:

    public void UpdateAppLanguage()
    {
      CultureInfo ci;
      Language l;

      // storage is a class containing several persistent information, like
      // the language selected by the user to be used
      // the Local attribute states if the language is actually present on
      // the current user's system
      if(Storage.GetCurrentLanguage().Local == true)
      {
        // language is present locally, so the user wants to use that one for
        // the interface
        ci = new CultureInfo(Storage.GetCurrentLanguage().Code);
        AppResources.Culture = ci;
        CultureInfo.CurrentCulture = ci;
        CultureInfo.CurrentUICulture = ci;
        CultureInfo.DefaultThreadCurrentCulture = ci;
        CultureInfo.DefaultThreadCurrentUICulture = ci;
        DependencyService.Get<ILocalize>().SetLocale(ci); // set the Thread for locale-aware methods
      }
      else
      {
        // no preferences available yet, use the system's current ci
        if (Device.RuntimePlatform != Device.UWP)
          ci = DependencyService.Get<ILocalize>().GetCurrentCultureInfo();
        else
          ci = CultureInfo.CurrentCulture;

        l = new Language{
          Name = ci.EnglishName,
          Code = ci.TwoLetterISOLanguageName
        };

        Storage.SetCurrentLanguage(l);
        CultureInfo.CurrentCulture = ci;
        CultureInfo.CurrentUICulture = ci;
        AppResources.Culture = ci; // set the RESX for resource localization
        DependencyService.Get<ILocalize>().SetLocale(ci); // set the Thread for locale-aware methods
     }
    }

我目前正在使用一种语言集进行测试,并且该语言是英语。

这是UWP子项目的依赖项服务实现:

  public class Localize : stereopoly.ILocalize
  {
    public void SetLocale (CultureInfo ci)
    {
      //Windows.Globalization.ApplicationSettings.PrimaryLanguageOverride = ci.Name;
      Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "EN-US";
      Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();
      Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();
    }

    public CultureInfo GetCurrentCultureInfo ()
    {
      return null;
    }
  }

如您所见,我还尝试通过强制将语言设置为EN-US,这也不起作用。我什至在初始Application.InitializeComponent()方法运行之前就调用UpdateAppLanguage()方法,我也尝试在OnStart()事件方法中调用它,但均无效。

我希望语言更改自执行以来甚至在实际应用程序启动之前就被应用,但是我可以随意切换应用程序的多个页面,无论我做什么,该语言始终为德语。 我为普通的UWP应用找到了这个问题的几个答案,但没有为Xamarin.UWP项目的Forms实现找到了这个问题,这似乎是这里的问题,因为关于纯UWP应用的其他提示似乎都不起作用。

您知道什么可以帮助我吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

请确保您至少要针对UWP 16299(FCU),因为在该版本之前,UWP在以调试模式正确切换语言时存在问题。但是,如果您以“发布”模式运行,它应该可以正常工作。

此外,UWP应用程序需要知道它支持给定的语言,因为它是在编译时生成的(使用<Resource Language="x-generate"/>中的Package.appxmanifest

您可以通过在UWP项目中添加一个Strings文件夹,然后添加多个子文件夹(每种受支持的语言一个)来实现。最后,在每个文件夹中添加一个Resources.resw文件(右键单击文件夹,添加>新建项...,资源文件(RESW))。结果将如下所示。

RESW folders

然后在每个RESW文件中添加一些资源。我通常会同时对AppName进行本地化:

Resource

在此之后,应用程序应了解您支持给定语言并显示本地化的事实。

答案 1 :(得分:0)

我终于找到了解决我问题的答案,就像解决此类错误一样,它通常很简单。 事实证明,无论在特定的子项目中定义了什么配置,UWP,iOS和Android子项目之类的所有引导项目(例如UWP,iOS和Android子项目)也都从父项目继承了Assembly Neutral Language(至少就是它对UWP的工作方式) 。我只是注意到,我可以在.Net主项目的设置中设置一种汇编中立语言,并且这样做后,所有警告均消失了,我的UWP应用最终显示了英文文本,而不是系统默认的德语文本。即使我仍然必须重新启动应用程序以翻译所有框架,我现在也可以切换回德语,但这并不是什么大问题,我可以稍后进行修复。这是最终使我明白的链接: Xamarin.Forms: Localization of the UWP app

仍然感谢您的惊人帮助:)。