Xamarin.Forms:如何使用与设备语言无关的本地化

我正在用Visual Studio 2013 CE开发Xamarin.Forms应用程序(可移植类库项目)。 首先我关注iOS版本。

现在我正在考虑如何使应用程序多语言。 我刚刚阅读了关于它的官方Xamarin文档,但我意识到,这个解决scheme只采用目标设备的系统语言。

在便携式类库中,我有一个有三种语言的资源文件夹:德语(默认),英语和法语。

Resource.resx Resource.en-US.resx Resource.fr-FR.resx Resource.Designer.cs 

现在我刚刚创build了一个静态设置类,如下所示:

 public static class Settings { public static Dictionary<String, CultureInfo> Languages = new Dictionary<String, CultureInfo> { { "German", new CultureInfo("de-DE") }, { "English", new CultureInfo("en-US") }, { "French", new CultureInfo("fr-FR") } }; public static CultureInfo CurrentCulture = Languages["German"]; public static CultureInfo CurrentUiCulture = Languages["German"]; public static void ChangeCurrentCultureInfo(CultureInfo cultureInfo) { Resource.Culture = cultureInfo; } } 

现在我的问题是,如果可以在运行时用button单击来更改应用程序中的文化。 也许类似

 Settings.CurrentCulture = Settings.Languages["English"]; Settings.ChangeCurrentCultureInfo(Settings.CurrentCulture); 

有没有人可以告诉我如何做到这一点?

问候

我不相信你可以在共​​享的PCL项目中做到这一点。 但是,您可以在平台特定的项目中设置UICulture。 为了从一个有用的位置(即,您的表单应用程序)执行此操作,我们必须将此作为依赖项从平台项目中公开。

首先,定义描述你的文化pipe理“服务”的界面。 这应该存在于您的特定于平台的项目(共享的PCL项目将执行)所引用的程序集中:

 public interface ICultureInfo { System.Globalization.CultureInfo CurrentCulture { get; set; } System.Globalization.CultureInfo CurrentUICulture { get; set; } } 

在每个平台项目中,都包含一个实现该接口的types:

 using System; using Xamarin.Forms; using System.Threading; [assembly:Dependency(typeof(YourNamespaceHere.PlatformCultureInfo))] namespace YourNamespaceHere { public class PlatformCultureInfo : ICultureInfo { #region ICultureInfo implementation public System.Globalization.CultureInfo CurrentCulture { get { return Thread.CurrentThread.CurrentCulture; } set { Thread.CurrentThread.CurrentCulture = value; } } public System.Globalization.CultureInfo CurrentUICulture { get { return Thread.CurrentThread.CurrentUICulture; } set { Thread.CurrentThread.CurrentUICulture = value; } } #endregion } } 

然后在你的表单应用程序中,从Xamarin Forms DependencyService请求一个平台实现的实例。 (注意:任何对DependencyService的调用都必须在调用Forms.Init()之后进行)

一旦你找回它,你可以设置当前的用户界面文化:

 var cultureInfo = Xamarin.Forms.DependencyService.Get<ICultureInfo>(); cultureInfo.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR"); 

Et瞧,UI文化的任何变化将反映任何后续的资源查找。 请注意使用“后续”一词 – 任何使用资源查找的表单(例如,如果您使用我的方便的本地化XAML标记扩展名 )在刷新/重新加载之前不会反映文化变化。

最后,Xamarin团队在复制原始资源查找基础架构方面做得非常出色! 只需要一点点就可以进入Xamarin Forms的世界。

最后我得到了Xamarin支持的答案。 我正在考虑解决scheme的解决scheme。 在PCL中,我只有static Settings class存储不同的CultureInfo对象。 另外我定义了一个改变当前文化和资源文件语言的方法。

 public static void ChangeCurrentCultureInfo(CultureInfo cultureInfo) { CurrentCulture = cultureInfo; Resource.Culture = CurrentCulture; } 

在初始化主页面之前,在App()构造函数中设置默认语言非常重要。 现在我得到了所有支持的语言与一个调用ChangeCurrentCultureInfo方法的tapped事件的列表视图。

不过,我要感谢安迪·霍珀提供他的解决scheme!

问候