Files
cursor-lang/CursorLang/Models/KeyboardLayout.cs
T
2026-08-08 21:24:02 +05:00

42 lines
1.6 KiB
C#

using System.Globalization;
namespace CursorLang.Models;
/// <summary>
/// Раскладка клавиатуры в удобном для отображения виде.
/// </summary>
/// <param name="LocaleId">Идентификатор локали (младшее слово HKL).</param>
/// <param name="ShortName">Короткое имя для подсказки у курсора, например «RU».</param>
/// <param name="DisplayName">Полное имя, например «RU — русский (Россия)».</param>
public sealed record KeyboardLayout(int LocaleId, string ShortName, string DisplayName)
{
/// <summary>
/// Строит модель по идентификатору локали. Неизвестные локали не являются
/// ошибкой: для них показываем сам идентификатор.
/// </summary>
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;
}
}
}