diff --git a/src/MaaWpfGui/Res/Localizations/en-us.xaml b/src/MaaWpfGui/Res/Localizations/en-us.xaml index 2a88f119a5..19b5af7bbd 100644 --- a/src/MaaWpfGui/Res/Localizations/en-us.xaml +++ b/src/MaaWpfGui/Res/Localizations/en-us.xaml @@ -411,6 +411,7 @@ Only supports Official(CN) and Bilibili server. Login account is not supported.< Operator display language Follow MAA Follow game client + Force use of specified language Light Dark Sync with OS diff --git a/src/MaaWpfGui/Res/Localizations/ja-jp.xaml b/src/MaaWpfGui/Res/Localizations/ja-jp.xaml index d02291b974..16db094323 100644 --- a/src/MaaWpfGui/Res/Localizations/ja-jp.xaml +++ b/src/MaaWpfGui/Res/Localizations/ja-jp.xaml @@ -410,6 +410,7 @@ オペレーター名の表示言語 MAAをフォローする ゲームクライアントをフォローする + 指定された言語を強制的に使用する ライトモード ダークモード OSと同期する diff --git a/src/MaaWpfGui/Res/Localizations/ko-kr.xaml b/src/MaaWpfGui/Res/Localizations/ko-kr.xaml index 84d72eb2f5..f1c3bce440 100644 --- a/src/MaaWpfGui/Res/Localizations/ko-kr.xaml +++ b/src/MaaWpfGui/Res/Localizations/ko-kr.xaml @@ -410,6 +410,7 @@ OF-1을 해금하지 않았다면 선택하지 말아 주세요. 간부 이름 표시 언어 MAA 따라가기 게임 클라이언트 따라가기 + 지정된 언어를 강제로 사용 라이트 다크 시스템 연동 diff --git a/src/MaaWpfGui/Res/Localizations/zh-cn.xaml b/src/MaaWpfGui/Res/Localizations/zh-cn.xaml index d604c64950..67bb505444 100644 --- a/src/MaaWpfGui/Res/Localizations/zh-cn.xaml +++ b/src/MaaWpfGui/Res/Localizations/zh-cn.xaml @@ -411,6 +411,7 @@ 干员名称显示语言 跟随MAA 跟随游戏客户端 + 强制使用指定语言 亮色 暗色 与系统同步 diff --git a/src/MaaWpfGui/Res/Localizations/zh-tw.xaml b/src/MaaWpfGui/Res/Localizations/zh-tw.xaml index 2fb72d9de2..ba49f07911 100644 --- a/src/MaaWpfGui/Res/Localizations/zh-tw.xaml +++ b/src/MaaWpfGui/Res/Localizations/zh-tw.xaml @@ -401,6 +401,7 @@ 幹員名稱顯示語言 跟隨MAA 跟隨遊戲客戶端 + 強制使用指定語言 亮色 暗色 與系統同步 diff --git a/src/MaaWpfGui/ViewModels/UI/CopilotViewModel.cs b/src/MaaWpfGui/ViewModels/UI/CopilotViewModel.cs index 8c3b0c9a43..289c4b2ae4 100644 --- a/src/MaaWpfGui/ViewModels/UI/CopilotViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/CopilotViewModel.cs @@ -409,7 +409,8 @@ namespace MaaWpfGui.ViewModels.UI if (json.TryGetValue("buff", out var buffValue)) { string buffLog = LocalizationHelper.GetString("DirectiveECTerm"); - AddLog(buffLog + DataHelper.GetLocalizedCharacterName((string?)buffValue), UiLogColor.Message, showTime: false); + string? localizedBuffName = DataHelper.GetLocalizedCharacterName((string?)buffValue); + AddLog(buffLog + (string.IsNullOrEmpty(localizedBuffName) ? (string?)buffValue : localizedBuffName), UiLogColor.Message, showTime: false); } if (json.TryGetValue("tool_men", out var toolMenValue)) diff --git a/src/MaaWpfGui/ViewModels/UI/RecognizerViewModel.cs b/src/MaaWpfGui/ViewModels/UI/RecognizerViewModel.cs index 97bbfeffcb..24e1e5b6dd 100644 --- a/src/MaaWpfGui/ViewModels/UI/RecognizerViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/RecognizerViewModel.cs @@ -514,8 +514,8 @@ namespace MaaWpfGui.ViewModels.UI /// /// 未实装干员,但在battle_data中, /// - private static readonly HashSet _virtuallyOpers = new HashSet - { + private static readonly HashSet _virtuallyOpers = + [ "char_504_rguard", "char_505_rcast", "char_506_rmedic", @@ -527,8 +527,8 @@ namespace MaaWpfGui.ViewModels.UI "char_509_acast", "char_508_aguard", "char_1001_amiya2", - "char_1037_amiya3", - }; + "char_1037_amiya3" + ]; private string _operBoxInfo = LocalizationHelper.GetString("OperBoxRecognitionTip"); @@ -585,11 +585,6 @@ namespace MaaWpfGui.ViewModels.UI { get { - if (OperBoxDataArray == null) - { - return null; - } - if (_operBoxPotential != null) { return _operBoxPotential; @@ -612,39 +607,26 @@ namespace MaaWpfGui.ViewModels.UI public bool OperBoxParse(JObject details) { - var operBoxes = (JArray)details["all_opers"]; + var operBoxes = (JArray?)details["all_opers"]; + + if (operBoxes == null) + { + return false; + } List> operHave = []; List> operNotHave = []; - string localizedName = ConfigurationHelper.GetValue(ConfigurationKeys.OperNameLanguage, string.Empty) == "OperNameLanguageClient" ? - ConfigurationHelper.GetValue(ConfigurationKeys.ClientType, string.Empty) switch - { - "Official" => "name", - "Bilibili" => "name", - "YoStarJP" => "name_jp", - "YoStarKR" => "name_kr", - "txwy" => "name_tw", - _ => "name_en", - } : ConfigurationHelper.GetValue(ConfigurationKeys.Localization, string.Empty) switch - { - "zh-cn" => "name", - "ja-jp" => "name_jp", - "ko-kr" => "name_kr", - "zh-tw" => "name_tw", - _ => "name_en", - }; - foreach (JObject operBox in operBoxes.Cast()) { - var tuple = new Tuple((string)operBox[localizedName], (int)operBox["rarity"]); + var tuple = new Tuple(DataHelper.GetLocalizedCharacterName((string?)operBox["name"]) ?? "???", (int)(operBox["rarity"] ?? -1)); - if (_virtuallyOpers.Contains((string)operBox["id"])) + if (_virtuallyOpers.Contains((string?)operBox["id"])) { continue; } - if ((bool)operBox["own"]) + if ((bool)(operBox["own"] ?? false)) { /*已拥有干员*/ operHave.Add(tuple); @@ -688,13 +670,13 @@ namespace MaaWpfGui.ViewModels.UI newlineFlag = 0; } - bool done = (bool)details["done"]; + bool done = (bool)(details["done"] ?? false); if (done) { OperBoxInfo = LocalizationHelper.GetString("IdentificationCompleted") + "\n" + LocalizationHelper.GetString("OperBoxRecognitionTip"); OperBoxResult = string.Format(LocalizationHelper.GetString("OperBoxRecognitionResult"), operNotHave.Count, operNotHaveNames, operHave.Count, operHaveNames); - OperBoxExportData = details["own_opers"].ToString(); - OperBoxDataArray = (JArray)details["own_opers"]; + OperBoxExportData = details["own_opers"]?.ToString() ?? string.Empty; + OperBoxDataArray = (JArray)(details["own_opers"] ?? new JArray()); OperBoxDone = true; } else diff --git a/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs b/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs index fd073a3a8b..b49120f304 100755 --- a/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs @@ -4572,9 +4572,9 @@ namespace MaaWpfGui.ViewModels.UI public List LanguageList { get; set; } /// - /// Gets the list of operator name language settings + /// Gets or sets the list of operator name language settings /// - public List OperNameLanguageModeList { get; } = + public List OperNameLanguageModeList { get; set; } = [ new() { Display = LocalizationHelper.GetString("OperNameLanguageMAA"), Value = "OperNameLanguageMAA" }, new() { Display = LocalizationHelper.GetString("OperNameLanguageClient"), Value = "OperNameLanguageClient" } @@ -4926,15 +4926,32 @@ namespace MaaWpfGui.ViewModels.UI { "txwy", "zh-tw" }, }; + /// + /// Opername display language, can set force display when it was set as "OperNameLanguageForce.en-us" + /// private string _operNameLanguage = ConfigurationHelper.GetValue(ConfigurationKeys.OperNameLanguage, "OperNameLanguageMAA"); public string OperNameLanguage { - get => _operNameLanguage; + get + { + if (!_operNameLanguage.Contains('.')) + { + return _operNameLanguage; + } + + if (_operNameLanguage.Split('.')[0] != "OperNameLanguageForce" || !LocalizationHelper.SupportedLanguages.ContainsKey(_operNameLanguage.Split('.')[1])) + { + return _operNameLanguage; + } + + OperNameLanguageModeList.Add(new CombinedData { Display = LocalizationHelper.GetString("OperNameLanguageForce"), Value = "OperNameLanguageForce" }); + return "OperNameLanguageForce"; + } set { - if (value == _operNameLanguage) + if (value == _operNameLanguage.Split('.')[0]) { return; } @@ -4981,7 +4998,17 @@ namespace MaaWpfGui.ViewModels.UI { if (_operNameLanguage == "OperNameLanguageClient") { - return _clientLanguageMapper[ConfigurationHelper.GetValue(ConfigurationKeys.ClientType, string.Empty)]; + return _clientLanguageMapper[_clientType]; + } + + if (!_operNameLanguage.Contains('.')) + { + return _language; + } + + if (_operNameLanguage.Split('.')[0] == "OperNameLanguageForce" && LocalizationHelper.SupportedLanguages.ContainsKey(_operNameLanguage.Split('.')[1])) + { + return _operNameLanguage.Split('.')[1]; } return _language;