[英]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.