using System.Globalization; using System.Text.Json; namespace SpaceEngineersBlueprintEditor.Utilities.Localization; /// /// Loads the optional Chinese display names for blueprint members. /// Reflection and serialization must always use the original Name value; /// this class is only responsible for presentation and search aliases. /// public static class BlueprintPropertyNameLocalizer { private static readonly Lazy> ChineseNames = new(LoadChineseNames); public static bool IsChineseUser => CultureInfo.CurrentUICulture.TwoLetterISOLanguageName.Equals( "zh", StringComparison.OrdinalIgnoreCase); public static string GetDisplayName(string? originalName) { if (string.IsNullOrWhiteSpace(originalName)) return string.Empty; if (!IsChineseUser || !ChineseNames.Value.TryGetValue(originalName, out var chineseName)) return originalName; return $"{chineseName} [{originalName}]"; } public static string? GetChineseName(string? originalName) { if (string.IsNullOrWhiteSpace(originalName)) return null; return ChineseNames.Value.TryGetValue(originalName, out var chineseName) ? chineseName : null; } private static IReadOnlyDictionary LoadChineseNames() { var path = Path.Combine( AppContext.BaseDirectory, "Assets", "Localization", "BlueprintPropertyNames.zh-CN.json"); try { if (!File.Exists(path)) return new Dictionary(StringComparer.OrdinalIgnoreCase); var values = JsonSerializer.Deserialize>( File.ReadAllText(path)); return values is null ? new Dictionary(StringComparer.OrdinalIgnoreCase) : new Dictionary(values, StringComparer.OrdinalIgnoreCase); } catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or JsonException) { // Missing or malformed optional display data must never prevent a blueprint from opening. return new Dictionary(StringComparer.OrdinalIgnoreCase); } } }