Forge
csharpdeeb25a2
1using System.Globalization;
2using System.Threading;
3using CascadeIDE.Services;
4
5namespace CascadeIDE.Lang;
6
7/// <summary>Инициализация языка UI (паттерн IncomeCascade: <c>Resources.Culture</c> + поток).</summary>
8public static class UiCulture
9{
10 /// <summary>
11 /// Если в <c>settings.toml</c> задан непустой <see cref="Models.WorkspaceSettings.Culture"/> — применить его;
12 /// иначе как <see cref="ApplyFromSystem"/>.
13 /// </summary>
14 public static void ApplyFromSettingsOrSystem()
15 {
16 try
17 {
18 var name = SettingsService.Load().Workspace.Culture?.Trim();
19 if (!string.IsNullOrEmpty(name))
20 {
21 Apply(CultureInfo.GetCultureInfo(name));
22 return;
23 }
24 }
25 catch (CultureNotFoundException)
26 {
27 // падаем на системную логику
28 }
29
30 ApplyFromSystem();
31 }
32
33 /// <summary>Выставить культуру до создания главного окна. Русская локаль Windows → ru-RU, иначе en-US (есть спутники в сборке).</summary>
34 public static void ApplyFromSystem()
35 {
36 var culture = ResolveCulture(CultureInfo.CurrentUICulture);
37 Apply(culture);
38 }
39
40 /// <summary>Явная культура (меню «Вид → Язык», настройки позже).</summary>
41 public static void Apply(CultureInfo culture)
42 {
43 if (LocViewModel.Current is { } loc)
44 loc.SetCulture(culture);
45 else
46 {
47 Resources.Culture = culture;
48 Thread.CurrentThread.CurrentUICulture = culture;
49 }
50 }
51
52 static CultureInfo ResolveCulture(CultureInfo ui)
53 {
54 try
55 {
56 if (ui.Name.StartsWith("ru", StringComparison.OrdinalIgnoreCase))
57 return CultureInfo.GetCultureInfo("ru-RU");
58 return CultureInfo.GetCultureInfo("en-US");
59 }
60 catch (CultureNotFoundException)
61 {
62 return CultureInfo.GetCultureInfo("en-US");
63 }
64 }
65}
66
View only · write via MCP/CIDE