XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
UTF-8
using System.Globalization;
using System.Text.Json;

namespace SpaceEngineersBlueprintEditor.Utilities.Localization;

/// <summary>
/// Loads the optional Chinese display names for blueprint members.
/// Reflection and serialization must always use the original <c>Name</c> value;
/// this class is only responsible for presentation and search aliases.
/// </summary>
public static class BlueprintPropertyNameLocalizer
{
    private static readonly Lazy<IReadOnlyDictionary<string, string>> 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<string, string> LoadChineseNames()
    {
        var path = Path.Combine(
            AppContext.BaseDirectory,
            "Assets",
            "Localization",
            "BlueprintPropertyNames.zh-CN.json");

        try
        {
            if (!File.Exists(path))
                return new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

            var values = JsonSerializer.Deserialize<Dictionary<string, string>>(
                File.ReadAllText(path));
            return values is null
                ? new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
                : new Dictionary<string, string>(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<string, string>(StringComparer.OrdinalIgnoreCase);
        }
    }
}