代码之家  ›  专栏  ›  技术社区  ›  testing

将imarkupextension与stringformat一起使用

  •  0
  • testing  · 技术社区  · 6 年前

    我用的是 TranslateExtension 来自Xamarin。是否可以添加 StringFormat 接到电话了吗?

    目前,我有

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

    但我需要这样的东西

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

    如果我做后者,我得到

    XAMARIN .FAMS.xAML.XAMLPARSEEExt:不能赋值属性“StrugFrand”:属性不存在或不可分配,或值和属性之间不匹配类型

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

    3 回复  |  直到 6 年前
        1
  •  2
  •   Daniel    6 年前

    可以向translateextension添加参数属性。

    我的translateextension如下所示。您可以获取参数部分并将其添加到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__";
            }
        }
    }
    
        2
  •  2
  •   Daniel    6 年前

    这里我更新了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;
        }
    }
    
        3
  •  1
  •   Gerald Versluis    6 年前

    派对有点晚了,但是用标准扩展名和xaml来做,这样做:

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

    你的翻译应该像: Static text {0} 是的。在哪里? {0} 被绑定到的值替换。

    问题是 Translate 扩展只是从资源中获取字符串,而没有 StringFormat 属性等,但您可以将检索到的资源值分配给 字符串格式 Binding 是的。