簡體   English   中英

Xamarin.Forms:如何使用獨立於設備語言的本地化

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

我正在使用Visual Studio 2013 CE開發一個Xamarin.Forms應用程序(可移植類庫項目)。 首先我關注iOS版本。

現在我正在考慮如何使應用程序多語言。 我剛剛閱讀了關於它的官方Xamarin文檔,但我意識到這個解決方案只采用目標設備的系統語言。

在便攜式類庫中,我有一個包含三種語言的Resources文件夾:德語(默認),英語和法語。

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");

此外,對UI文化的任何更改都將反映在任何后續資源查找中。 請注意使用“后續”一詞 - 使用資源查找的任何表單(例如,如果您使用我的方便的本地化XAML標記擴展 )將不會反映文化更改,直到它們被刷新/重新加載。

最后,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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM