我正在使用Visual Studio 2013 CE开发Xamarin.Forms应用程序(便携式类库项目).首先我正在关注iOS版本.
现在我正在考虑如何使应用程序多语言.
我只是阅读官方的Xamarin文档,但我意识到这个解决方案只能使用目标设备的系统语言.
在便携式类库中,我有一个资源文件夹,包含三种语言:德语(默认),英文和法文.
Resource.resx Resource.en-US.resx Resource.fr-FR.resx Resource.Designer.cs
现在我刚刚创建了一个静态设置类,如下所示:
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; } }
现在我的问题是如果可以通过按钮单击在运行时更改应用程序中的文化.
也许有些像
Settings.CurrentCulture = Settings.Languages["English"]; Settings.ChangeCurrentCultureInfo(Settings.CurrentCulture);
有没有人可以告诉我如何做到这一点?
问候
解决方法
我不相信你可以从你共享的PCL项目中做到这一点.但是,您可以在平台特定的项目中设置UICulture.要从一个有用的位置(即您的Forms应用程序)执行此操作,我们必须将此作为依赖项从平台项目中显示为服务.
首先,定义描述您的文化管理“服务”的界面.这应该生活在由平台特定项目引用的程序集(共享PCL项目将执行)中:
public interface ICultureInfo { System.Globalization.CultureInfo CurrentCulture { get; set; } System.Globalization.CultureInfo CurrentUICulture { get; set; } }
在每个平台项目中,都包含一个实现该接口的类型:
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()之后发生)
一旦你检索它,你可以设置当前的UI文化:
var cultureInfo = Xamarin.Forms.DependencyService.Get<ICultureInfo>(); cultureInfo.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");
Et voila,UI文化的任何更改都将反映在任何后续的资源查找中.请注意使用“后续”一词 – 使用资源查找(例如,如果您使用的是my handy localization XAML markup extensions)的任何表单将不会反映文化变更,直到刷新/重新加载.
最后,Xamarin团队做了很好的工作,重复了原始资源查找基础架构!它只需要一点点推动到Xamarin表格的世界.