2016-09-30 64 views
4

我正在關注此guide以本地化我的應用。我不想獲得系統語言,所以我不使用接口和依賴服務ILocalize。我有英語,西班牙語和法語這3個RESX文件:即時刷新UI語言

  • AppResources.es.resx
  • AppResources.fr.resx
  • AppResources.resx(英文)

這是

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:t="clr-namespace:LanguageTest.Resources;assembly=LanguageTest.Resources" 
      x:Class="LanguageTest.TestPage"> 
    <Label Text="{t:Translate TestText}" VerticalOptions="Center" HorizontalOptions="Center" /> 
</ContentPage> 

有了這個代碼,我initil:使用TranslateExtension類從引導我TestPage.xaml代碼ize語言設置:

public App() 
{ 
    // I can change among "en", "es" and "fr" 
    AppResources.Culture = new CultureInfo("es"); 
    this.MainPage = new NavigationPage(new TestPage()); 
} 

我這種情況下,文本顯示爲西班牙文。但是我想在頁面顯示後更改語言(例如,使用LanguageSettingsPage用戶可以在應用程序運行時更改語言)。

public App() 
{ 
    AppResources.Culture = new CultureInfo("es"); 
    this.MainPage = new NavigationPage(new TestPage()); 
    AppResources.Culture = new CultureInfo("fr"); 
    // At this point the texts are diplayed in Spanish, not in French 
} 

我怎麼能刷新頁面去不用再次做new TestPage()顯示法文文本?

+0

你有沒有發現該解決方案?如果是的話,你可以請分享嗎? – batmaci

+0

@batmaci不,我沒找到解決方案。當選擇一種語言時,我將更改App.cs代碼中的所有文本。沒有系統允許你使用綁定或類似的東西來改變文本。 – Jon

+0

重新顯示主頁你可以做'MainPage = new NavigationPage(...);' –

回答

0

保留OnAppearing()方法的Text屬性的所有Setter,然後從設置頁面返回後,它將採用resx文件中的最新值。 OnAppearing()方法即使在你回到頁面時也會被調用。 但是,對於同一頁面來改變語言,不得不再次渲染頁面或重新加載該頁面中元素的Text屬性。

+0

但是在這種情況下,你正在編寫代碼來改變視圖,我想避免這種情況。 – Jon

+0

如果這是你正在尋找的,可以在viewmodel中完成。 VM將有一個init方法。 – TutuGeorge

+0

我認爲之前的代碼選項比VM選項更好,更乾淨。但這種解決方案並不是我所期待的。 – Jon

0

如果您只是彈出頁面,則不會再次評估資源。您只是在導航堆棧上顯示上一頁(仍在內存中)。

您需要推送一個新頁面才能加載新的資源文本。

+0

如何在不退出並重新進入應用程序的情況下爲主頁推送新頁面? – batmaci

+0

你的堆棧將維護一個主/主頁,這將是你的堆棧的第一項。對於該主/主頁,您需要在後面更改代碼中的資源,即無需綁定。 (這是一個限制。)更改語言環境的時刻,您可以彈出到根目錄。這是我在我的案例中也使用過的方法。讓我知道,如果它不清楚你。 –

+0

是的,你必須改變背後的代碼文本。在WPF中,我使用了ObjectDataProvider,但在Xamarin中沒有任何類似的東西。 – Jon

1

這不是Resx的特定解決方案,但它可以讓您根據用戶需求加載任何語言。不需要手動設置字符串,因爲綁定可以完成這項工作。看看I18NPortable和樣本。啓動並運行起來相當容易。

綁定示例:

<Button Text="{Binding Strings[key]}" /> 

要更改語言上飛(將更新所有綁定):

I18N.Current.Locale = "fr"; 
+0

謝謝,我會檢查它。 – Jon