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;