在axml中使用来自pcl的resx-string?

时间:2014-04-03 16:26:20

标签: c# android localization xamarin portable-class-library

我有一个resx文件,用于在MyAppResources类中的可移植类库中进行本地化。因此,在代码中,我可以使用以下内容获取本地化字符串:

 View.FindViewById<Button>(Resource.Id.btnCacheClear).Text = MyAppResources.TextClearCache;

但是还有一种方法可以在axml中设置这个字符串吗?

 <Button
     android:id="@+id/btnCacheClear"
     android:text= ??   />

Thx,Tom

2 个答案:

答案 0 :(得分:1)

我认为最简洁的方法是定义一个自定义属性,该属性将通过ResourceManager从您的PCL资源中读取。

我正在使用MvvmCross,并使用自定义语言绑定解析器:

public class CustomLanguageBindingParser : MvxBindingParser , IMvxLanguageBindingParser
{
    protected override MvxSerializableBindingDescription ParseBindingDescription()
    {
        this.SkipWhitespace();

        string resourceName = (string)this.ReadValue();

        // Pass the resource name in as the parameter on the StringResourceConverter.
        return new MvxSerializableBindingDescription
        {
            Converter = "StringResource",
            ConverterParameter = resourceName,
            Path = null,
            Mode = MvxBindingMode.OneTime
        };
    }

    public string DefaultConverterName { get; set; }

    public string DefaultTextSourceName { get; set; }
}

转换器:

public class StringResourceConverter : IMvxValueConverter
{
    private static ResourceManager manager = new ResourceManager(typeof(AppResources));

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Ignore value. We are using parameter only.
        return manager.GetString((string)parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在MvxAndroidSetup类中注册解析器:

    protected override void InitializeIoC()
    {
        base.InitializeIoC();

        Mvx.RegisterType<IMvxLanguageBindingParser, CustomLanguageBindingParser>();
    }

在.axml中,定义名称空间xmlns:local="http://schemas.android.com/apk/res-auto"

并调用资源。例如,在TextView上:local:MvxLang="Text MyResourceKey"

这会挂钩到MvvmCross绑定系统。第一部分&#34; Text&#34;确定目标属性,而第二部分则解析为资源键。语言绑定解析器将其转换为与自定义转换器的绑定,并将键转换为转换器参数。转换器根据转换器参数执行字符串查找。

答案 1 :(得分:0)

不支持在 Android Designer 中使用RESX文件中的字符串/任何资源,目前只能通过代码设置它们。