42 lines
1.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|