Xamarin.Forms : 如何使用独立于设备语言的本地化

Xamarin.Forms : How to use localization independent of device language

我正在使用 Visual Studio 2013 CE 开发 Xamarin.Forms 应用程序(便携式 class 库项目)。首先,我关注 iOS 版本。

现在我正在考虑如何使该应用程序支持多语言。 我刚刚阅读了有关它的官方 Xamarin 文档,但我意识到此解决方案仅采用目标设备的系统语言。

在便携式 class 库中,我有一个包含三种语言的 Resources 文件夹:德语(默认)、英语和法语。

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

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

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。要从 有用 位置(即您的表单应用程序)执行此操作,我们必须将其作为依赖项从您的平台项目公开为服务。

首先,定义描述您的文化管理的界面"service."这应该存在于您的平台特定项目引用的程序集中(共享的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 文化的任何更改都将反映在任何后续资源查找中。请注意 "subsequent" 一词的使用 - 任何使用资源查找的表单(例如,如果您正在使用 my handy localization XAML markup extensions)在 refreshed/reloaded.[=14 之前不会反映文化变化=]

最后,Xamarin 团队在复制原始资源查找基础结构方面做得很好!它只需要一点点推动就可以进入 Xamarin Forms 的世界。

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

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

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

尽管如此,我还是要感谢 Andy Hopper 提供了他的解决方案!

此致

您可以使用接口 ILocalize 从 PCL 调用每个平台项目中可用的 setLocale 方法,如下所示:

CultureInfo ci=new CultureInfo("ar");
Xamarin.Forms.DependencyService.Get<ILocalize>().SetLocale(ci);                      

AppResources.Culture = ci;