Xamarin.Forms中Label StringFormat的本地化

时间:2018-06-12 19:47:42

标签: data-binding xamarin.forms localization label string-formatting

在xamarin表单中,我可以将文本本地化为如下标签:
<Label Text="{x:Static resources:AppResources.Text}"/>

使用资源的命名空间:
<ContentView ... xmlns:resources="clr-namespace:ProjectName.Resources;assembly=ProjectName">

我还可以绑定一些值并在标签上添加字符串格式:
<Label Text="{Binding Value, StringFormat='The value is: {0}' }"/>

问题是文本值为:未本地化。

我可以同时执行这两项操作,绑定值并本地化StringFormat吗?

2 个答案:

答案 0 :(得分:4)

我在Localizing XAML

找到答案

我必须将文本值为{0} 添加到资源文件中 我需要为翻译添加一个IMarkupExtension。我将该类添加到与资源文件相同的名称空间。

[ContentProperty("Text")]
public class TranslateExtension : IMarkupExtension
{
    private readonly CultureInfo _ci;

    static readonly Lazy<ResourceManager> ResMgr = new Lazy<ResourceManager>(
        () => new ResourceManager(typeof(AppResources).FullName, typeof(TranslateExtension).GetTypeInfo().Assembly));

    public string Text { get; set; }

    public TranslateExtension()
    {
        if (Device.RuntimePlatform == Device.iOS || Device.RuntimePlatform == Device.Android)
        {
            _ci = DependencyService.Get<ILocalize>().GetCurrentCultureInfo();
        }
    }

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        if (Text == null)
            return string.Empty;

        return ResMgr.Value.GetString(Text, _ci) ?? Text;
    }
}

并使用它:

<Label Text="{Binding Value, StringFormat={resources:Translate LabelTextTheValueIs}}" />

答案 1 :(得分:0)

我能够只使用普通的本地化资源行而无需任何扩展,就像这样:

Text="{Binding WireValue, StringFormat={x:Static resources:AppResources.PaymentDetailsLine3}}"

在我的AppResources.resx中,PaymentDetailsLine3的位置为:

   <data
  name="PaymentDetailsLine3"
  xml:space="preserve">
  <value>PaymentDetailsLine3 {0}</value>