Xamarin - 使用绑定和翻译

Xamarin - using binding and Translation

我尝试创建类似的东西:

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

而且效果很好!但我希望字符串 "Hallo" 应该从 resx 文件中取出。

像这样:

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

我也会将两者结合起来。

谢谢!

您可以使用简单的标记扩展和 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>