2016-05-18 17 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> 
関連する問題