【问题标题】:Use IMarkupExtension together with StringFormat将 IMarkupExtension 与 StringFormat 一起使用
【发布时间】:2018-07-03 19:42:16
【问题描述】:

我正在使用来自 Xamarin 的 TranslateExtension。是否可以在通话中添加StringFormat?

目前,我有

<Label Text="{i18n:Translate User}" />

但我需要这样的东西

<Label Text="{i18n:Translate User, StringFormat='{0}:'}" />

如果我做后者,我会得到

Xamarin.Forms.Xaml.XamlParseException:无法分配属性“StringFormat”:属性不存在,或者不可分配,或者值和属性之间的类型不匹配

我知道我可以添加另一个带有冒号的翻译,但最好有一个不同的选项。

【问题讨论】:

    标签: xaml xamarin.forms translation markup-extensions


    【解决方案1】:

    聚会有点晚了,但是使用标准扩展和 XAML 来做,像这样:

    <Label Text="{Binding YourDynamicValue, StringFormat={i18n:Translate KeyInResources}}"/>
    

    您的翻译应该类似于:Static text {0}。其中{0} 被您绑定到的值替换。

    问题是Translate 扩展只是将您的字符串从资源中取出,并且没有StringFormat 属性等。但是您可以将检索到的资源值分配给StringFormat 的@987654327 @。

    【讨论】:

      【解决方案2】:

      您可以向 TranslateExtension 添加参数属性。

      我的 TranslateExtension 看起来像这样。您可以获取 Parameter 部分并将其添加到 Xamarin 示例中的部分。

      [ContentProperty("Text")]
      public class TranslateExtension : IMarkupExtension
      {
          public string Text { get; set; }
          public string Parameter { get; set; }
      
          object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
          {
              try
              {
                  if (Text == null)
                      return null;
      
                  var culture = new CultureInfo(CultureHelper.CurrentIsoLanguage);
      
                  var result = LocalizationResources.ResourceManager.GetString(Text, culture);
      
                  if (string.IsNullOrWhiteSpace(Parameter))
                  {
                      return string.IsNullOrWhiteSpace(result) ? "__TRANSLATE__" : result;
                  }
      
                  return string.IsNullOrWhiteSpace(result) ? "__TRANSLATE__" : string.Format(result, Parameter);
              }
              catch (Exception ex)
              {
                  TinyInsights.TrackErrorAsync(ex);
                  return "__TRANSLATE__";
              }
          }
      }
      

      【讨论】:

      • 我的一些注释:添加属性似乎有效。 Xaml 语法为&lt;Label Text="{i18n:Translate User, Parameter='{0}:' }"。不应该是string.Format(Parameter, Text)吗?并且要具有相同的行为 Parameter 应该重命名为 StringFormat。
      • 是的,你说得对。我有点误解了你的问题。请注意,我还将 try 语句中的最后一行更新为正确的。
      • 关于string.Format()部分,我认为这两个参数需要交换。
      • 是的,如果你想像你想要的那样使用它 string.Format(StringFormat, translateText);
      【解决方案3】:

      这里我更新了 Xamarin 示例:

      [ContentProperty("Text")]
      public class TranslateExtension : IMarkupExtension
      {
          readonly CultureInfo ci = null;
          const string ResourceId = "UsingResxLocalization.Resx.AppResources";
      
          static readonly Lazy<ResourceManager> ResMgr = new Lazy<ResourceManager>(() => new ResourceManager(ResourceId, IntrospectionExtensions.GetTypeInfo(typeof(TranslateExtension)).Assembly));
      
          public string Text { get; set; }
          public string StringFormat {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;
      
              var translation = ResMgr.Value.GetString(Text, ci);
              if (translation == null)
              {
      #if DEBUG
                  throw new ArgumentException(
                      string.Format("Key '{0}' was not found in resources '{1}' for culture '{2}'.", Text, ResourceId, ci.Name),
                      "Text");
      #else
                  translation = Text; // HACK: returns the key, which GETS DISPLAYED TO THE USER
      #endif
              }
      
              if(!string.IsNullOrWhitespace(StringFormat)
                   return string.Format(StringFormat, translation);
      
              return translation;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 2018-09-18
        • 2010-09-16
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多