简体   繁体   English

将Android可翻译字符串传递给ValueConverter

[英]Passing an Android translatable string to ValueConverter

I'm trying to pass a @string/something to a value converter so I can use it to format the output, so say I have a DateTime value, I want to pass something like "Signup Date: {0}" to the ValueConverter. 我正在尝试将@string/something传递给值转换器,以便我可以使用它来格式化输出,所以说我有一个DateTime值,我想将"Signup Date: {0}"传递给ValueConverter 。

The problem is, the text above is translatable, so it came from the strings.xml file of any given language. 问题是,上面的文本是可翻译的,因此它来自任何给定语言的strings.xml文件。 So far, I tried this: 到目前为止,我试过这个:

<TextView
   local:MvxBind="Text SignupDate, Converter=FriendlyDate, ConverterParameter=@string/release_date"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:ellipsize="end"
   android:maxLines="5"
   android:paddingTop="8dp"
   style="@style/WhiteParagraphText" />

Note the ConverterParameter=@string/release_date . 注意ConverterParameter=@string/release_date How can I do it? 我该怎么做?

You can do this with a value converter that takes the string resource name as parameter, looks its id up in the resources and gets the value from the resources by this id. 您可以使用将字符串资源名称作为参数的值转换器,在资源中查找其ID并通过此ID从资源获取值。

public class FriendlyDateValueConverter : MvxValueConverter<DateTime, string>
{
    protected override string Convert(DateTime value, Type targetType, object parameter, CultureInfo culture)
    {
        var param = parameter as string;
        if (string.IsNullOrEmpty(param))
        {
            return string.Empty;
        }

        var globals = MvvmCross.Platform.Mvx.Resolve<IMvxAndroidGlobals>();
        var res = globals.ApplicationContext.Resources;
        var id = res.GetIdentifier(param, "string", globals.ApplicationContext.PackageName);
        // id=0, if the resource could not be found -> add some error handling

        var format = res.GetString(id);
        return string.Format(format, value);
    }
}

Usage 用法

<TextView 
    local:MvxBind="Text SignupDate, Converter=FriendlyDate, ConverterParameter='release_date'"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:maxLines="5"
    android:paddingTop="8dp" />

Note: pass 'release_date' instead of @string/release_date as parameter. 注意:传递'release_date'而不是@string/release_date作为参数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM