CI / Go Backend (push) Canceled after 0s
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器 HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块 Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚 AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
225 lines
7.4 KiB
C#
225 lines
7.4 KiB
C#
using System.Globalization;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using PCL.Core.App;
|
|
using PCL.Core.App.Localization;
|
|
|
|
namespace PCL;
|
|
|
|
public partial class PageSetupLauncherLanguage
|
|
{
|
|
private bool _isLoaded;
|
|
|
|
public PageSetupLauncherLanguage()
|
|
{
|
|
InitializeComponent();
|
|
Loaded += PageSetupLauncherLanguage_Loaded;
|
|
}
|
|
|
|
private void PageSetupLauncherLanguage_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
// 重复加载部分
|
|
PanBack.ScrollToHome();
|
|
|
|
// 非重复加载部分
|
|
if (_isLoaded)
|
|
return;
|
|
_isLoaded = true;
|
|
|
|
ModAnimation.AniControlEnabled += 1;
|
|
Reload();
|
|
ModAnimation.AniControlEnabled -= 1;
|
|
}
|
|
|
|
public void Reload()
|
|
{
|
|
ModAnimation.AniControlEnabled += 1;
|
|
try
|
|
{
|
|
ReloadLanguageCombo();
|
|
ReloadFormatCultureCombo();
|
|
}
|
|
finally
|
|
{
|
|
ModAnimation.AniControlEnabled -= 1;
|
|
}
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
try
|
|
{
|
|
Config.Preference.Localization.LanguageConfig.SetDefaultValue();
|
|
Config.Preference.Localization.FormatCultureConfig.SetDefaultValue();
|
|
LocalizationService.ApplyFromConfig();
|
|
ModBase.Log("[Setup] 已初始化启动器-语言页设置");
|
|
HintService.Hint(Lang.Text("Setup.Language.Reset.Success"), HintType.Success, false);
|
|
Reload();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ModBase.Log(
|
|
ex,
|
|
"初始化启动器-语言页设置失败",
|
|
ModBase.LogLevel.Msgbox,
|
|
userSummary: Lang.Text("Setup.Error.OperationFailed"));
|
|
}
|
|
}
|
|
|
|
private void ReloadLanguageCombo()
|
|
{
|
|
ComboUiLanguage.Items.Clear();
|
|
var autoLanguage = LocalizationService.ResolveLanguage(LocalizationService.Auto);
|
|
ComboUiLanguage.Items.Add(CreateLanguageComboItem(
|
|
Lang.Text("Setup.Language.UiLanguage.Auto", GetLanguageDisplay(autoLanguage)),
|
|
LocalizationService.Auto,
|
|
autoLanguage));
|
|
|
|
foreach (var language in LocalizationService.SupportedLanguages)
|
|
ComboUiLanguage.Items.Add(CreateLanguageComboItem(
|
|
GetLanguageDisplay(language),
|
|
language.Code,
|
|
language));
|
|
|
|
var configValue = NormalizeConfigValue(Config.Preference.Localization.Language);
|
|
var selectedLanguageTag = LocalizationService.Auto;
|
|
if (LocalizationService.IsLanguageSupported(configValue))
|
|
selectedLanguageTag =
|
|
string.Equals(configValue, LocalizationService.Auto, StringComparison.OrdinalIgnoreCase)
|
|
? LocalizationService.Auto
|
|
: LocalizationService.ResolveLanguage(configValue).Code;
|
|
SelectComboItem(ComboUiLanguage, selectedLanguageTag);
|
|
}
|
|
|
|
private void ReloadFormatCultureCombo()
|
|
{
|
|
ComboUiFormatCulture.Items.Clear();
|
|
ComboUiFormatCulture.Items.Add(new MyComboBoxItem
|
|
{
|
|
Content = Lang.Text("Setup.Language.FormatCulture.Auto"),
|
|
Tag = LocalizationService.Auto
|
|
});
|
|
ComboUiFormatCulture.Items.Add(new MyComboBoxItem
|
|
{
|
|
Content = Lang.Text("Setup.Language.FormatCulture.FollowLanguage"),
|
|
Tag = LocalizationService.FormatCultureFollowLanguage
|
|
});
|
|
|
|
foreach (var culture in GetBuiltInFormatCultures())
|
|
ComboUiFormatCulture.Items.Add(new MyComboBoxItem
|
|
{
|
|
Content = GetCultureDisplay(culture),
|
|
Tag = culture.Name
|
|
});
|
|
|
|
var configValue = NormalizeConfigValue(Config.Preference.Localization.FormatCulture);
|
|
if (!IsFormatCultureItemExisting(configValue) && TryGetCulture(configValue, out var customCulture))
|
|
ComboUiFormatCulture.Items.Add(new MyComboBoxItem
|
|
{
|
|
Content = GetCultureDisplay(customCulture),
|
|
Tag = customCulture.Name
|
|
});
|
|
|
|
SelectComboItem(ComboUiFormatCulture,
|
|
IsFormatCultureItemExisting(configValue) ? configValue : LocalizationService.Auto);
|
|
}
|
|
|
|
private void ComboUiLanguage_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
if (ModAnimation.AniControlEnabled != 0)
|
|
return;
|
|
if (ComboUiLanguage.SelectedItem is not MyComboBoxItem item)
|
|
return;
|
|
|
|
var value = item.Tag?.ToString() ?? LocalizationService.Auto;
|
|
if (Config.Preference.Localization.Language == value)
|
|
return;
|
|
|
|
Config.Preference.Localization.Language = value;
|
|
HintService.Hint(Lang.Text("Setup.Language.Changed"), HintType.Success, false);
|
|
Reload();
|
|
}
|
|
|
|
private void ComboUiFormatCulture_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
if (ModAnimation.AniControlEnabled != 0)
|
|
return;
|
|
if (ComboUiFormatCulture.SelectedItem is not MyComboBoxItem item)
|
|
return;
|
|
|
|
var value = item.Tag?.ToString() ?? LocalizationService.Auto;
|
|
if (Config.Preference.Localization.FormatCulture == value)
|
|
return;
|
|
|
|
Config.Preference.Localization.FormatCulture = value;
|
|
HintService.Hint(Lang.Text("Setup.Language.Changed"), HintType.Success, false);
|
|
Reload();
|
|
}
|
|
|
|
private static IEnumerable<CultureInfo> GetBuiltInFormatCultures()
|
|
{
|
|
var used = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
|
foreach (var language in LocalizationService.SupportedLanguages)
|
|
{
|
|
var culture = CultureInfo.GetCultureInfo(language.CultureName);
|
|
if (used.Add(culture.Name)) yield return culture;
|
|
}
|
|
}
|
|
|
|
private static MyComboBoxItem CreateLanguageComboItem(string content, string tag, LocalizationLanguage language)
|
|
{
|
|
return new MyComboBoxItem
|
|
{
|
|
Content = content,
|
|
Tag = tag,
|
|
FontFamily = LocalizationFontService.BuildRepresentativeFontFamily(language)
|
|
};
|
|
}
|
|
|
|
private static string GetLanguageDisplay(LocalizationLanguage language)
|
|
{
|
|
return $"{language.NativeName}";
|
|
}
|
|
|
|
private static string GetCultureDisplay(CultureInfo culture)
|
|
{
|
|
return $"{culture.NativeName}";
|
|
}
|
|
|
|
private static string NormalizeConfigValue(string? value)
|
|
{
|
|
return string.IsNullOrWhiteSpace(value) ? LocalizationService.Auto : value;
|
|
}
|
|
|
|
private static bool TryGetCulture(string value, out CultureInfo culture)
|
|
{
|
|
try
|
|
{
|
|
culture = CultureInfo.GetCultureInfo(value);
|
|
return true;
|
|
}
|
|
catch (CultureNotFoundException)
|
|
{
|
|
culture = CultureInfo.InvariantCulture;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private static void SelectComboItem(MyComboBox comboBox, string tag)
|
|
{
|
|
foreach (var item in comboBox.Items.OfType<MyComboBoxItem>())
|
|
{
|
|
if (!string.Equals(item.Tag?.ToString(), tag, StringComparison.OrdinalIgnoreCase)) continue;
|
|
comboBox.SelectedItem = item;
|
|
return;
|
|
}
|
|
|
|
comboBox.SelectedIndex = comboBox.Items.Count > 0 ? 0 : -1;
|
|
}
|
|
|
|
private bool IsFormatCultureItemExisting(string tag)
|
|
{
|
|
return ComboUiFormatCulture.Items.OfType<MyComboBoxItem>()
|
|
.Any(item => string.Equals(item.Tag?.ToString(), tag, StringComparison.OrdinalIgnoreCase));
|
|
}
|
|
} |