using System.Globalization; namespace CursorLang.Models; /// /// Раскладка клавиатуры в удобном для отображения виде. /// /// Идентификатор локали (младшее слово HKL). /// Короткое имя для подсказки у курсора, например «RU». /// Полное имя, например «RU — русский (Россия)». public sealed record KeyboardLayout(int LocaleId, string ShortName, string DisplayName) { /// /// Строит модель по идентификатору локали. Неизвестные локали не являются /// ошибкой: для них показываем сам идентификатор. /// public static KeyboardLayout FromLocaleId(int localeId) { CultureInfo? culture = TryGetCulture(localeId); if (culture is null) { string fallback = $"0x{localeId:X4}"; return new KeyboardLayout(localeId, fallback, fallback); } string shortName = culture.TwoLetterISOLanguageName.ToUpperInvariant(); return new KeyboardLayout(localeId, shortName, $"{shortName} — {culture.NativeName}"); } private static CultureInfo? TryGetCulture(int localeId) { try { return new CultureInfo(localeId); } catch (CultureNotFoundException) { return null; } } }