Ejemplo n.º 1
0
        public string LocalisedName(INamed obj, CultureInfo cultureInfo)
        {
            if (cultureInfo == null)
            {
                cultureInfo = CultureInfo.CurrentUICulture;
            }
            var             cultureList = new[] { cultureInfo.Name, cultureInfo.Name.Split('/')[0], cultureInfo.TwoLetterISOLanguageName, "en" };
            LocalisedString str         = obj.LocalisedName;

            if (str == null)
            {
                var typeName = TypeNameConversions.TryGetValue(obj.Type, out var newType) ? newType : obj.Type;
                str = new LocalisedString {
                    Format = $"{typeName}-name.{obj.Name}"
                };
            }

            string GetString(string key)
            {
                foreach (var dict in cultureList)
                {
                    if (LocaleData.TryGetValue(dict, out var dic))
                    {
                        var val = ((JObject)dic).SelectToken(key);
                        if (val != null)
                        {
                            return(val.Value <string>());
                        }
                    }
                }

                return(null);
            }

            var fmt = GetString(str.Format);

            if (fmt == null && obj is IAltNames anames)
            {
                var altName = anames.AlternativeNames.Select(x => LocalisedName(new AltNameWrapper(x), cultureInfo)).FirstOrDefault(x => x != null);
                if (altName != null)
                {
                    return(altName);
                }
            }

            if (fmt == null)
            {
                return(str.Format);
            }
            if (str.Arguments == null)
            {
                return(fmt);
            }
            return(FormattingRegex.Replace(fmt, (m) =>
            {
                if (str.Arguments.TryGetValue((1 + int.Parse(m.Groups["num"].Value)).ToString(), out var arg))
                {
                    return GetString(((JObject)arg)["1"].Value <string>());
                }

                return m.Value;
            }));
        }