using System; using System.Collections.Generic; using AibisDream.Framework; namespace AibisDream.UI { /// /// Defines the file-name convention used by localized Obj sprites. /// Chinese uses the unsuffixed source asset; every other supported locale uses /// "{logicalName}-{localeCode}". /// internal static class LocalizedObjSpriteNaming { internal const string DefaultLocaleCode = "zh-Hans"; private static readonly string[] NonDefaultLocaleCodeValues = { "en", "ja-JP", "ru", "es", "pt-BR" }; internal static IReadOnlyList NonDefaultLocaleCodes => NonDefaultLocaleCodeValues; internal static string NormalizeLogicalName(string picName) { if (string.IsNullOrEmpty(picName)) return picName; return picName.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ? picName.Substring(0, picName.Length - 4) : picName; } internal static string GetAssetLocaleCode(string localeCode) { return LocalizationKit.GetLocaleKind(localeCode) switch { LocaleKind.En => "en", LocaleKind.Ja => "ja-JP", LocaleKind.Ru => "ru", LocaleKind.Es => "es", LocaleKind.PtBr => "pt-BR", _ => DefaultLocaleCode }; } internal static string GetPicName(string logicalName, string localeCode) { string normalizedName = NormalizeLogicalName(logicalName); string assetLocaleCode = GetAssetLocaleCode(localeCode); return string.Equals( assetLocaleCode, DefaultLocaleCode, StringComparison.Ordinal) ? normalizedName : $"{normalizedName}-{assetLocaleCode}"; } internal static IReadOnlyList GetCandidatePicNames( string logicalName, string localeCode) { string normalizedName = NormalizeLogicalName(logicalName); string localizedName = GetPicName(normalizedName, localeCode); if (string.Equals(localizedName, normalizedName, StringComparison.Ordinal)) return new[] { normalizedName }; return new[] { localizedName, normalizedName }; } internal static bool TryParseLocalizedVariant( string fileNameWithoutExtension, out string logicalName, out string localeCode) { foreach (string candidateCode in NonDefaultLocaleCodeValues) { string suffix = $"-{candidateCode}"; if (!fileNameWithoutExtension.EndsWith( suffix, StringComparison.OrdinalIgnoreCase)) { continue; } logicalName = fileNameWithoutExtension.Substring( 0, fileNameWithoutExtension.Length - suffix.Length); localeCode = candidateCode; return true; } logicalName = null; localeCode = null; return false; } } }