private LocalizedString GetTranslation(string keyName, params object[] arguments) { //Autoset gender if translation ends with "[f]" var hasLocalizedGenderF = arguments.Any(e => e is LocalizedString && e.ToString().EndsWith(GENDER_MARK)); if (hasLocalizedGenderF) { var kyHasF = keyName.EndsWith("{f}"); var args = RemoveGenderMarkOfArguments(arguments); return(GetTranslation(kyHasF ? keyName : $"{keyName}{{f}}", args)); } var hasTranslation = ResourceContent.TryGetValue(keyName, out var jToken) && (jToken.HasValues || jToken.Value <string>() != null); //If the translation key was not found if (!hasTranslation) { return(new LocalizedString(keyName, string.Empty, true, LocaleFileName)); } //Plural form translation if (jToken.HasValues) { var canBePluralForm = IsNumericType(arguments.FirstOrDefault()); var pluralQuantity = canBePluralForm ? Math.Abs(double.Parse(arguments.First().ToString())) : 1; dynamic dynToken = jToken; string val = pluralQuantity == 0 ? dynToken.Zero : (pluralQuantity == 1 ? dynToken.One : dynToken.Other); return(new LocalizedString( keyName, string.Format(val, arguments), string.IsNullOrWhiteSpace(val))); } //Single translation var value = jToken.Value <string>() ?? string.Empty; return(new LocalizedString( keyName, string.Format(value, arguments), string.IsNullOrWhiteSpace(value))); }