2016-05-18 22 views
1

我試圖創建類似的東西:Xamarin - 使用綁定和翻譯

<Label Text="{Binding oResult.hi, StringFormat='Hallo: {0}'}" /> 

,它工作正常!但我希望字符串「Hallo」應該從resx文件中退出。

像這樣:

<Entry Placeholder="{i18n:TranslateExtension Text=password}" IsPassword="true" /> 

此外,我會做兩者的結合。

謝謝!

回答

5

您可以通過簡單的標記擴展和resx文件中的字符串來實現此目的。

的Xaml延伸:

using System; 
using Xamarin.Forms.Xaml; 
using Xamarin.Forms; 
using System.Resources; 

namespace i18n 
{ 
    [ContentProperty("Key")] 
    public class TranslateExtension :IMarkupExtension 
    { 
     public string Key{ get; set; } 

     static ResourceManager ResourceManagerInstance; 
     #region IMarkupExtension implementation 
     public static void Init(ResourceManager r){ 
      ResourceManagerInstance = r; 
     } 
     public object ProvideValue(IServiceProvider serviceProvider) 
     { 
      if (ResourceManagerInstance == null) 
      { 
       throw new InvalidOperationException("Call TranslateExtension.Init(ResourceManager) in your App.cs"); 
      } 
      return ResourceManagerInstance.GetString(this.Key); 
     } 

     #endregion 
    } 
} 

例App.cs:

using Xamarin.Forms; 
using i18n; 

namespace ResourceLocalizationMarkup 
{ 
    public class App : Application 
    { 
     public App() 
     { 
      TranslateExtension.Init(Localization.Strings.ResourceManager); 
      MainPage = new NavigationPage(new MyPage()); 
     } 
    } 
} 

實施例的Xaml:

<?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:i18n="clr-namespace:i18n" 
    x:Class="ResourceLocalizationMarkup.MyPage"> 
    <ContentPage.Content> 
    <StackLayout Orientation="Vertical"> 
    <Label Text="{i18n:TranslateExtension hello_world}"/> 
    <Label Text="{Binding Name, StringFormat={i18n:TranslateExtension thanks_user}}"/> 
    </StackLayout> 
    </ContentPage.Content> 
</ContentPage>