feat: 高级汉化

This commit is contained in:
xkeyC 2024-05-05 14:59:07 +08:00
parent 0bb0f7deb4
commit f392463a84
12 changed files with 649 additions and 254 deletions

View File

@ -1,48 +1,24 @@
{ {
"class_keys": [ "class_keys": [
{ {
"id": "location", "id": "location_opt",
"class_name": "地点", "class_name": "地点-其他",
"keys": [ "keys": [
"ATC_.*", "ATC_.*",
"Bacchus.*",
"Cano.*",
"Castra.*",
".*_QT",
"Crus_HistMarker_.*", "Crus_HistMarker_.*",
"Delamar.*",
"Ellis.*",
"Enroll_.*", "Enroll_.*",
".*_QuantumMarker_.*",
"Goss.*",
"Hadrian.*",
"Hurston_JumpPoint_.*", "Hurston_JumpPoint_.*",
"Jurisdictions_Name_.*", "Jurisdictions_Name_.*",
"LandingPad_.*", "LandingPad_.*",
"Levski_Shop_Teach.*",
"Lorville_.*", "Lorville_.*",
"Magnus.*",
"MiningClaim_.*", "MiningClaim_.*",
"MiningClaims_Desc_.*", "MiningClaims_Desc_.*",
"NavBeacon_.*", "NavBeacon_.*",
"NavPoint_.*", "NavPoint_.*",
"Nav_.*", "Nav_.*",
"Navpoint_.*", "Navpoint_.*",
"Nyx.*",
"Orison_Destination_.*", "Orison_Destination_.*",
"Oso.*",
"Pyro.*",
"QT_.*",
"RR_.*",
"Shubin_.*",
"Solar_system_.*",
"Stanton.*",
"Starfarer_Wreckage_QT_.*", "Starfarer_Wreckage_QT_.*",
"Taranis.*",
"Tarpits.*",
"Tayac.*",
"Terra.*",
"Virgil.*",
"area_.*", "area_.*",
"cargodeck_.*", "cargodeck_.*",
"dockingport_.*", "dockingport_.*",
@ -55,193 +31,94 @@
"select_.*", "select_.*",
"shop_name_.*", "shop_name_.*",
"vehicle_room_.*", "vehicle_room_.*",
"warning_.*", "weapons_heal_.*",
"weapon_stats.*", "QT_.*",
"weapons_heal_.*" "RR_.*",
"Shubin_.*",
"Solar_system_.*",
"Bacchus.*_Desc.*",
"Cano.*_Desc.*",
"Castra.*_Desc.*",
"Delamar.*_Desc.*",
"Ellis.*_Desc.*",
"Goss.*_Desc.*",
"Hadrian.*_Desc.*",
"Levski_Shop_Teach.*_Desc.*",
"Magnus.*_Desc.*",
"Nyx.*_Desc.*",
"Oso.*_Desc.*",
"Pyro.*_Desc.*",
"Stanton.*_Desc.*",
"Taranis.*_Desc.*",
"Tarpits.*_Desc.*",
"Tayac.*_Desc.*",
"Terra.*_Desc.*",
"Virgil.*_Desc.*"
] ]
}, },
{ {
"id": "ui", "id": "location",
"class_name": "UI/HUD", "class_name": "地点-常用",
"keys": [ "keys": [
".*_RepUI_.*", "Bacchus(?!.*_Desc).*",
"CharacterCustomizer_.*", "Cano(?!.*_Desc).*",
".*_OEM_UI_.*", "Castra(?!.*_Desc).*",
"DownloadConnectivity_.*", "Delamar(?!.*_Desc).*",
"DownloadError_.*", "Ellis(?!.*_Desc).*",
"DownloadStalled_.*", "Goss(?!.*_Desc).*",
"DownloadState_.*", "Hadrian(?!.*_Desc).*",
"Download_BrowseForFolder", "Levski_Shop_Teach(?!.*_Desc).*",
"Exit_Screen_.*", "Magnus(?!.*_Desc).*",
"FW2022_DatapadScreen_.*", "Nyx(?!.*_Desc).*",
"FW2022_IFFIscreen_.*", "Oso(?!.*_Desc).*",
"FW2022_TransferScreen_.*", "Pyro(?!.*_Desc).*",
"FW22_NT_Journal_Body_.*", "Stanton(?!.*_Desc).*",
".*_DisplayName_.*", "Taranis(?!.*_Desc).*",
"FreightElevator_.*", "Tarpits(?!.*_Desc).*",
"Frontend_.*", "Tayac(?!.*_Desc).*",
"Fines_.*", "Terra(?!.*_Desc).*",
"FireMode_.*", "Virgil(?!.*_Desc).*"
"GraceWarnings_.*",
"HUD_.*",
"Heads_Male_.*",
"Hints_.*",
"Human_Crew_.*",
"Human_First_Names_.*",
"Human_Nicknames_.*",
"Human_Security_Titles_.*",
"Human_Surnames_.*",
"HurDynDrugUGF_.*",
"HurDynMining_.*",
"HurstonSecurity_.*",
"Inner_.*",
"Kareah_.*",
"KeypadButton_.*",
"KeypadDisplay_.*",
"Map_Header_.*",
"Maps_.*",
"Marker_.*",
"Markers_.*",
"MurderSpree.*",
"NPC_Interact_Generic_.*",
"Out_of_Quantum_fuel.*",
"Oxygen_Screen_.*",
"PAUSE_OPTIONS_.*",
"PBay_.*",
"PIT_.*",
"PrisonKeypadPass_.*",
"Prison_.*",
"Prisoner.*",
"RN_.*",
"ShipSelector_.*",
"SkyLine_.*",
"Takedown.*",
"UEERanks_.*",
"UGF_.*",
"UI_.*",
"UnitedWorkersOfHurston_.*",
"Usable_CommTower_.*",
"Usable_Terminal_.*",
"Vehicle_Container_.*",
"actor_.*",
"ad_.*",
"airlock_.*",
"annun_.*",
"cargoTransfer_HUD_.*",
"cargo_.*",
"cc_.*",
"chat_.*",
"citizencon16_.*",
"cockpit_screen_.*",
"comm_.*",
"comms_.*",
"concate_.*",
"constellation_rear_tube.*",
"crate_panel_.*",
"defend_UGF_.*",
"dfm_.*",
"diff_notification_ui_.*",
"docking_.*",
"ea_popup_.*",
"ea_ui_.*",
"elevator_.*",
"engineering_.*",
"entrance_.*",
"fine_terminal_.*",
"flightHUD_.*",
"frontend_.*",
"generic_.*",
"global_terminal_.*",
"group_.*",
"hack_program_.*",
"hud_.*",
"infopanel_.*",
"innerthought_.*",
"input_.*",
"install_.*",
"interaction_.*",
"interiormap_.*",
"invictus_.*",
"journal_.*",
"kiosk_.*",
"law_.*",
"lens_.*",
"loadout_.*",
"mG_.*",
"masterMode_.*",
"me_.*",
"med_.*",
"medbed_.*",
"mfd_.*",
"mm_LobbyStatus_.*",
"mobiGlas_.*",
"mobiglas_.*",
"navitem_.*",
"net_dialog_.*",
"operatorMode_.*",
"panel_.*",
"pause_.*",
"pit_.*",
"port_Name.*",
"quantum_hud_.*",
"rc_ScanInfo_.*",
"refinery_ui_.*",
"refueling_HUD_.*",
"refueling_ui_.*",
"respawn_hud_.*",
"salvage_.*",
"scan_data_.*",
"scrambleracesubmissions_.*",
"shop_ui_.*",
"sm_ui_.*",
"spaceship_.*",
"starmap_.*",
"stomp_warning_.*",
"swapWheel_.*",
"system_.*",
"target_hud_.*",
"terminal_.*",
"text_.*",
"transit_.*",
"tutorial_.*",
"ui_.*",
"unittest_.*",
"usable_.*",
"vehicle_Type.*",
"vehicle_class_.*",
"vehicle_deck_.*",
"vehicle_focus_.*",
"vehicle_gunnery_hud_.*",
"vehicle_interactor_.*"
] ]
}, },
{ {
"class_name": "物品", "class_name": "物品-其他",
"id": "thing", "id": "thing_opt",
"keys": [ "keys": [
"BarMenu_.*", "BarMenu_.*",
"FLOOR_Flair_Items.*", "FLOOR_Flair_Items.*",
"FPS_AI_.*", "FPS_AI_.*",
"ItemPort_port_NameCooler.*", "ItemPort_.*",
"Item_.*", "itemPort_.*",
"destoryitems_.*", "destoryitems_.*",
"destroyItems_.*", "destroyItems_.*",
"item.*", "kopion_.*",
"kopion_.*" "item_desc.*"
] ]
}, },
{ {
"class_name": "载具", "class_name": "物品-常用",
"id": "vehicle", "id": "thing",
"keys": [
"item_Name.*"
]
},
{
"class_name": "载具-其他",
"id": "vehicle_name",
"keys": [ "keys": [
"vehicle_Name.*",
"vehicle_name.*",
"vehicle_Desc.*", "vehicle_Desc.*",
"vehicl_Desc.*", "vehicl_Desc.*",
"vehicel_Desc.*", "vehicel_Desc.*",
"vehicles_.*" "vehicles_.*"
] ]
}, },
{
"class_name": "载具-常用",
"id": "vehicle",
"keys": [
"vehicle_Name.*"
]
},
{ {
"id": "mission", "id": "mission",
"class_name": "任务/日志", "class_name": "任务/日志",
@ -526,6 +403,163 @@
"covalexrand_.*", "covalexrand_.*",
"covalexspec_.*" "covalexspec_.*"
] ]
},
{
"id": "ui",
"class_name": "UI/HUD/菜单",
"keys": [
".*_RepUI_.*",
"CharacterCustomizer_.*",
".*_OEM_UI_.*",
"DownloadConnectivity_.*",
"DownloadError_.*",
"DownloadStalled_.*",
"DownloadState_.*",
"Download_BrowseForFolder",
"Exit_Screen_.*",
"FW2022_DatapadScreen_.*",
"FW2022_IFFIscreen_.*",
"FW2022_TransferScreen_.*",
"FW22_NT_Journal_Body_.*",
".*_DisplayName_.*",
"FreightElevator_.*",
"Frontend_.*",
"Fines_.*",
"FireMode_.*",
"GraceWarnings_.*",
"HUD_.*",
"Heads_Male_.*",
"Hints_.*",
"Human_Crew_.*",
"Human_First_Names_.*",
"Human_Nicknames_.*",
"Human_Security_Titles_.*",
"Human_Surnames_.*",
"HurDynDrugUGF_.*",
"HurDynMining_.*",
"HurstonSecurity_.*",
"Inner_.*",
"Kareah_.*",
"KeypadButton_.*",
"KeypadDisplay_.*",
"Map_Header_.*",
"Maps_.*",
"Marker_.*",
"Markers_.*",
"MurderSpree.*",
"NPC_Interact_Generic_.*",
"Out_of_Quantum_fuel.*",
"Oxygen_Screen_.*",
"PAUSE_OPTIONS_.*",
"PBay_.*",
"PIT_.*",
"PrisonKeypadPass_.*",
"Prison_.*",
"Prisoner.*",
"RN_.*",
"ShipSelector_.*",
"SkyLine_.*",
"Takedown.*",
"UEERanks_.*",
"UGF_.*",
"UI_.*",
"UnitedWorkersOfHurston_.*",
"Usable_CommTower_.*",
"Usable_Terminal_.*",
"Vehicle_Container_.*",
"actor_.*",
"ad_.*",
"airlock_.*",
"annun_.*",
"cargoTransfer_HUD_.*",
"cargo_.*",
"cc_.*",
"chat_.*",
"citizencon16_.*",
"cockpit_screen_.*",
"comm_.*",
"comms_.*",
"concate_.*",
"constellation_rear_tube.*",
"crate_panel_.*",
"defend_UGF_.*",
"dfm_.*",
"diff_notification_ui_.*",
"docking_.*",
"ea_popup_.*",
"ea_ui_.*",
"elevator_.*",
"engineering_.*",
"entrance_.*",
"fine_terminal_.*",
"flightHUD_.*",
"frontend_.*",
"generic_.*",
"global_terminal_.*",
"group_.*",
"hack_program_.*",
"hud_.*",
"infopanel_.*",
"innerthought_.*",
"input_.*",
"install_.*",
"interaction_.*",
"interiormap_.*",
"invictus_.*",
"journal_.*",
"kiosk_.*",
"law_.*",
"lens_.*",
"loadout_.*",
"mG_.*",
"masterMode_.*",
"me_.*",
"med_.*",
"medbed_.*",
"mfd_.*",
"mm_LobbyStatus_.*",
"mobiGlas_.*",
"mobiglas_.*",
"navitem_.*",
"net_dialog_.*",
"operatorMode_.*",
"panel_.*",
"pause_.*",
"pit_.*",
"port_Name.*",
"quantum_hud_.*",
"rc_ScanInfo_.*",
"refinery_ui_.*",
"refueling_HUD_.*",
"refueling_ui_.*",
"respawn_hud_.*",
"salvage_.*",
"scan_data_.*",
"scrambleracesubmissions_.*",
"shop_ui_.*",
"sm_ui_.*",
"spaceship_.*",
"starmap_.*",
"stomp_warning_.*",
"swapWheel_.*",
"system_.*",
"target_hud_.*",
"terminal_.*",
"text_.*",
"transit_.*",
"tutorial_.*",
"ui_.*",
"unittest_.*",
"usable_.*",
"vehicle_Type.*",
"vehicle_class_.*",
"vehicle_deck_.*",
"vehicle_focus_.*",
"vehicle_gunnery_hud_.*",
"vehicle_interactor_.*",
"weapon_stats.*",
"warning_.*"
]
} }
] ]
} }

View File

@ -42,6 +42,8 @@ class AppAdvancedLocalizationClassKeysData {
Map<String, String> valuesMap = {}; Map<String, String> valuesMap = {};
AppAdvancedLocalizationClassKeysDataMode mode = AppAdvancedLocalizationClassKeysDataMode mode =
AppAdvancedLocalizationClassKeysDataMode.localization; AppAdvancedLocalizationClassKeysDataMode.localization;
bool lockMod = false;
bool isWorking = false;
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
@ -56,4 +58,5 @@ enum AppAdvancedLocalizationClassKeysDataMode {
unLocalization, unLocalization,
localization, localization,
mixed, mixed,
mixedNewline,
} }

View File

@ -1,6 +1,12 @@
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:re_editor/re_editor.dart';
import 'package:re_highlight/languages/ini.dart';
import 'package:re_highlight/styles/vs2015.dart';
import 'package:starcitizen_doctor/data/app_advanced_localization_data.dart';
import 'package:starcitizen_doctor/ui/home/home_ui_model.dart'; import 'package:starcitizen_doctor/ui/home/home_ui_model.dart';
import 'package:starcitizen_doctor/ui/home/localization/advanced_localization_ui_model.dart'; import 'package:starcitizen_doctor/ui/home/localization/advanced_localization_ui_model.dart';
import 'package:starcitizen_doctor/widgets/widgets.dart'; import 'package:starcitizen_doctor/widgets/widgets.dart';
@ -12,6 +18,7 @@ class AdvancedLocalizationUI extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(advancedLocalizationUIModelProvider); final state = ref.watch(advancedLocalizationUIModelProvider);
final model = ref.read(advancedLocalizationUIModelProvider.notifier);
final homeUIState = ref.watch(homeUIModelProvider); final homeUIState = ref.watch(homeUIModelProvider);
return makeDefaultPage( return makeDefaultPage(
title: "高级汉化 -> ${homeUIState.scInstalledPath}", title: "高级汉化 -> ${homeUIState.scInstalledPath}",
@ -27,20 +34,51 @@ class AdvancedLocalizationUI extends HookConsumerWidget {
], ],
), ),
) )
: _makeBody(context, homeUIState, state, ref)); : Column(
children: [
Row(
children: [
const SizedBox(width: 12),
Expanded(
child: Text(
'已加载汉化版本:${state.apiLocalizationData?.versionName}')),
Text('汉化文本行数:${state.serverGlobalIniLines}'
' P4K文本行数${state.p4kGlobalIniLines}'),
const SizedBox(width: 32),
Button(
child: const Padding(
padding: EdgeInsets.only(
left: 12, right: 12, top: 4, bottom: 4),
child: Text("安装汉化"),
),
onPressed: () async {
await model.doInstall().unwrap(context: context);
}),
const SizedBox(width: 12),
],
),
Expanded(
child:
_makeBody(context, homeUIState, state, ref, model)),
],
));
} }
Widget _makeBody(BuildContext context, HomeUIModelState homeUIState, Widget _makeBody(
AdvancedLocalizationUIState state, WidgetRef ref) { BuildContext context,
HomeUIModelState homeUIState,
AdvancedLocalizationUIState state,
WidgetRef ref,
AdvancedLocalizationUIModel model) {
return AlignedGridView.count( return AlignedGridView.count(
crossAxisCount: 3, crossAxisCount: 4,
crossAxisSpacing: 12, crossAxisSpacing: 12,
mainAxisSpacing: 12, mainAxisSpacing: 12,
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
final item = state.classMap!.values.elementAt(index); final item = state.classMap!.values.elementAt(index);
return Container( return Container(
padding: const EdgeInsets.only(top: 12, bottom: 12), padding: const EdgeInsets.only(top: 6, bottom: 12),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white.withOpacity(.05), color: Colors.white.withOpacity(.05),
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4),
@ -48,24 +86,35 @@ class AdvancedLocalizationUI extends HookConsumerWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Padding( IconButton(
padding: const EdgeInsets.only(left: 12, right: 12), onPressed:
child: Row( item.isWorking ? null : () => _showContent(context, item),
children: [ icon: Padding(
Expanded( padding: const EdgeInsets.only(left: 12, right: 12),
child: Text( child: Row(
"${item.className}", children: [
style: const TextStyle( Expanded(
fontSize: 16, fontWeight: FontWeight.bold), child: Text(
)), "${item.className}",
Text( style: const TextStyle(
"${item.valuesMap.length}", fontSize: 16, fontWeight: FontWeight.bold),
style: TextStyle( textAlign: TextAlign.start,
fontSize: 14, )),
color: Colors.white.withOpacity(.6), Text(
"${item.valuesMap.length}",
style: TextStyle(
fontSize: 14,
color: Colors.white.withOpacity(.6),
),
), ),
), const SizedBox(width: 6),
], Icon(
FluentIcons.chevron_right,
color: Colors.white.withOpacity(.6),
size: 16,
),
],
),
), ),
), ),
Container( Container(
@ -74,24 +123,59 @@ class AdvancedLocalizationUI extends HookConsumerWidget {
height: 1, height: 1,
color: Colors.white.withOpacity(.1), color: Colors.white.withOpacity(.1),
), ),
SizedBox( if (item.isWorking)
height: 160, Column(
child: SuperListView.builder( children: [
itemCount: item.valuesMap.length, makeLoading(context),
const SizedBox(height: 6),
const Text("正在重新生成文本..."),
],
)
else ...[
Padding(
padding: const EdgeInsets.only(left: 12, right: 12), padding: const EdgeInsets.only(left: 12, right: 12),
itemBuilder: (BuildContext context, int index) { child: Row(
final itemKey = item.valuesMap.keys.elementAt(index); children: [
return Text( const Expanded(child: Text("模式")),
"${item.valuesMap[itemKey]}", ComboBox(
maxLines: 1, value: item.mode,
style: const TextStyle( items: [
fontSize: 12, for (final type
overflow: TextOverflow.ellipsis, in AppAdvancedLocalizationClassKeysDataMode
.values)
ComboBoxItem(
value: type,
child: Text(state.typeNames[type] ?? "-"),
),
],
onChanged: item.lockMod
? null
: (v) => model.onChangeMod(item,
v as AppAdvancedLocalizationClassKeysDataMode),
), ),
); ],
}, ),
), ),
), const SizedBox(height: 6),
SizedBox(
height: 180,
child: SuperListView.builder(
itemCount: item.valuesMap.length,
padding: const EdgeInsets.only(left: 12, right: 12),
itemBuilder: (BuildContext context, int index) {
final itemKey = item.valuesMap.keys.elementAt(index);
return Text(
"${item.valuesMap[itemKey]}",
maxLines: 1,
style: const TextStyle(
fontSize: 12,
overflow: TextOverflow.ellipsis,
),
);
},
),
),
],
], ],
), ),
); );
@ -99,4 +183,73 @@ class AdvancedLocalizationUI extends HookConsumerWidget {
itemCount: state.classMap?.length ?? 0, itemCount: state.classMap?.length ?? 0,
); );
} }
_showContent(
BuildContext context, AppAdvancedLocalizationClassKeysData item) {
showDialog(
context: context,
builder: (BuildContext context) {
return HookConsumer(
builder: (BuildContext context, WidgetRef ref, Widget? child) {
final textData = useState("");
loadData() async {
final v = StringBuffer("");
for (var element in item.valuesMap.entries) {
v.write("${element.key}=${element.value}\n");
await Future.delayed(Duration.zero);
}
textData.value = v.toString();
}
useEffect(() {
loadData();
return null;
}, const []);
return ContentDialog(
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width * .8,
),
title: Row(
children: [
IconButton(
icon: const Icon(
FluentIcons.back,
size: 22,
),
onPressed: () => context.pop()),
const SizedBox(
width: 24,
),
Text("预览:${item.className}"),
],
),
content: textData.value.isEmpty
? makeLoading(context)
: Container(
decoration: BoxDecoration(
color: FluentTheme.of(context).cardColor,
borderRadius: BorderRadius.circular(7),
),
child: CodeEditor(
readOnly: true,
controller:
CodeLineEditingController.fromText(textData.value),
style: CodeEditorStyle(
codeTheme: CodeHighlightTheme(
languages: {
'ini': CodeHighlightThemeMode(mode: langIni)
},
theme: vs2015Theme,
),
),
),
),
);
},
);
},
);
}
} }

View File

@ -9,6 +9,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:starcitizen_doctor/common/utils/log.dart'; import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/common/utils/provider.dart'; import 'package:starcitizen_doctor/common/utils/provider.dart';
import 'package:starcitizen_doctor/data/app_advanced_localization_data.dart'; import 'package:starcitizen_doctor/data/app_advanced_localization_data.dart';
import 'package:starcitizen_doctor/data/sc_localization_data.dart';
import 'package:starcitizen_doctor/provider/unp4kc.dart'; import 'package:starcitizen_doctor/provider/unp4kc.dart';
import '../home_ui_model.dart'; import '../home_ui_model.dart';
@ -25,9 +26,21 @@ class AdvancedLocalizationUIState with _$AdvancedLocalizationUIState {
Map<String, AppAdvancedLocalizationClassKeysData>? classMap, Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
String? p4kGlobalIni, String? p4kGlobalIni,
String? serverGlobalIni, String? serverGlobalIni,
ScLocalizationData? apiLocalizationData,
@Default(0) int p4kGlobalIniLines,
@Default(0) int serverGlobalIniLines,
}) = _AdvancedLocalizationUIState; }) = _AdvancedLocalizationUIState;
} }
extension AdvancedLocalizationUIStateEx on AdvancedLocalizationUIState {
Map<AppAdvancedLocalizationClassKeysDataMode, String> get typeNames => {
AppAdvancedLocalizationClassKeysDataMode.localization: "汉化",
AppAdvancedLocalizationClassKeysDataMode.unLocalization: "英文原文",
AppAdvancedLocalizationClassKeysDataMode.mixed: "双语",
AppAdvancedLocalizationClassKeysDataMode.mixedNewline: "双语(换行)",
};
}
@riverpod @riverpod
class AdvancedLocalizationUIModel extends _$AdvancedLocalizationUIModel { class AdvancedLocalizationUIModel extends _$AdvancedLocalizationUIModel {
@override @override
@ -47,10 +60,14 @@ class AdvancedLocalizationUIModel extends _$AdvancedLocalizationUIModel {
if (ald.classKeys == null) return; if (ald.classKeys == null) return;
state = state.copyWith(workingText: "正在分类 ..."); state = state.copyWith(workingText: "正在分类 ...");
final m = await compute(_doClassIni, (ald, p4kGlobalIni, serverGlobalIni)); final m = await compute(_doClassIni, (ald, p4kGlobalIni, serverGlobalIni));
final p4kGlobalIniLines = p4kGlobalIni.split("\n").length;
final serverGlobalIniLines = serverGlobalIni.split("\n").length;
state = state.copyWith( state = state.copyWith(
workingText: "", workingText: "",
p4kGlobalIni: p4kGlobalIni, p4kGlobalIni: p4kGlobalIni,
serverGlobalIni: serverGlobalIni, serverGlobalIni: serverGlobalIni,
p4kGlobalIniLines: p4kGlobalIniLines,
serverGlobalIniLines: serverGlobalIniLines,
classMap: m); classMap: m);
} }
@ -70,10 +87,12 @@ class AdvancedLocalizationUIModel extends _$AdvancedLocalizationUIModel {
id: "un_localization", id: "un_localization",
className: "未汉化", className: "未汉化",
keys: [], keys: [],
); )
..mode = AppAdvancedLocalizationClassKeysDataMode.unLocalization
..lockMod = true;
final unClass = AppAdvancedLocalizationClassKeysData( final unClass = AppAdvancedLocalizationClassKeysData(
id: "un_class", id: "un_class",
className: "未分类", className: "其他",
keys: [], keys: [],
); );
final classMap = <String, AppAdvancedLocalizationClassKeysData>{ final classMap = <String, AppAdvancedLocalizationClassKeysData>{
@ -84,18 +103,22 @@ class AdvancedLocalizationUIModel extends _$AdvancedLocalizationUIModel {
final serverIniMap = readIniAsMap(serverGlobalIni); final serverIniMap = readIniAsMap(serverGlobalIni);
var regexList = classMap.values var regexList = classMap.values
.expand((c) => c.keys!.map((k) => MapEntry(c, RegExp(k)))) .expand((c) =>
c.keys!.map((k) => MapEntry(c, RegExp(k, caseSensitive: false))))
.toList(); .toList();
iniKeysLoop: iniKeysLoop:
for (var p4kIniKey in p4kIniMap.keys) { for (var p4kIniKey in p4kIniMap.keys) {
final serverValue = serverIniMap[p4kIniKey]; final serverValue = serverIniMap[p4kIniKey];
if (serverValue == null) { if (serverValue == null || serverValue.trim().isEmpty) {
unLocalization.valuesMap[p4kIniKey] = p4kIniMap[p4kIniKey] ?? ""; final p4kValue = p4kIniMap[p4kIniKey] ?? "";
if (p4kValue.trim().isNotEmpty) {
unLocalization.valuesMap[p4kIniKey] = p4kValue;
}
continue iniKeysLoop; continue iniKeysLoop;
} else { } else {
for (var item in regexList) { for (var item in regexList) {
if (item.value.hasMatch(p4kIniKey)) { if (p4kIniKey.startsWith(item.value)) {
item.key.valuesMap[p4kIniKey] = serverValue; item.key.valuesMap[p4kIniKey] = serverValue;
serverIniMap.remove(p4kIniKey); serverIniMap.remove(p4kIniKey);
continue iniKeysLoop; continue iniKeysLoop;
@ -103,15 +126,15 @@ class AdvancedLocalizationUIModel extends _$AdvancedLocalizationUIModel {
} }
} }
} }
if (unLocalization.valuesMap.isNotEmpty) {
classMap[unLocalization.id!] = unLocalization;
}
if (serverIniMap.isNotEmpty) { if (serverIniMap.isNotEmpty) {
for (var element in serverIniMap.keys) { for (var element in serverIniMap.keys) {
unClass.valuesMap[element] = serverIniMap[element] ?? ""; unClass.valuesMap[element] = serverIniMap[element] ?? "";
} }
classMap[unClass.id!] = unClass; classMap[unClass.id!] = unClass;
} }
if (unLocalization.valuesMap.isNotEmpty) {
classMap[unLocalization.id!] = unLocalization;
}
return classMap; return classMap;
} }
@ -150,6 +173,7 @@ class AdvancedLocalizationUIModel extends _$AdvancedLocalizationUIModel {
await localizationUIModel.downloadLocalizationFile( await localizationUIModel.downloadLocalizationFile(
file, apiLocalizationData); file, apiLocalizationData);
} }
state = state.copyWith(apiLocalizationData: apiLocalizationData);
final serverGlobalIni = final serverGlobalIni =
(await compute(LocalizationUIModel.readArchive, file.absolute.path)) (await compute(LocalizationUIModel.readArchive, file.absolute.path))
.toString(); .toString();
@ -158,13 +182,80 @@ class AdvancedLocalizationUIModel extends _$AdvancedLocalizationUIModel {
} }
Future<String> readEnglishInI(String gameDir) async { Future<String> readEnglishInI(String gameDir) async {
final data = await Unp4kCModel.unp4kTools( var data = await Unp4kCModel.unp4kTools(
appGlobalState.applicationBinaryModuleDir!, [ appGlobalState.applicationBinaryModuleDir!, [
"extract_memory", "extract_memory",
"$gameDir\\Data.p4k", "$gameDir\\Data.p4k",
"Data\\Localization\\english\\global.ini" "Data\\Localization\\english\\global.ini"
]); ]);
// remove bom
if (data.length > 3 &&
data[0] == 0xEF &&
data[1] == 0xBB &&
data[2] == 0xBF) {
data = data.sublist(3);
}
final iniData = String.fromCharCodes(data); final iniData = String.fromCharCodes(data);
return iniData; return iniData;
} }
onChangeMod(AppAdvancedLocalizationClassKeysData item,
AppAdvancedLocalizationClassKeysDataMode mode) async {
if (item.lockMod) return;
item.mode = mode;
item.isWorking = true;
final classMap =
Map<String, AppAdvancedLocalizationClassKeysData>.from(state.classMap!);
classMap[item.id!] = item;
state = state.copyWith(classMap: classMap);
final p4kIniMap = readIniAsMap(state.p4kGlobalIni!);
final serverIniMap = readIniAsMap(state.serverGlobalIni!);
final newValuesMap = <String, String>{};
for (var kv in item.valuesMap.entries) {
switch (mode) {
case AppAdvancedLocalizationClassKeysDataMode.localization:
newValuesMap[kv.key] = serverIniMap[kv.key] ?? "";
break;
case AppAdvancedLocalizationClassKeysDataMode.unLocalization:
newValuesMap[kv.key] = p4kIniMap[kv.key] ?? "";
break;
case AppAdvancedLocalizationClassKeysDataMode.mixed:
newValuesMap[kv.key] =
"${serverIniMap[kv.key]} [${p4kIniMap[kv.key]}]";
break;
case AppAdvancedLocalizationClassKeysDataMode.mixedNewline:
newValuesMap[kv.key] =
"${serverIniMap[kv.key]}\\n${p4kIniMap[kv.key]}";
break;
}
await Future.delayed(Duration.zero);
}
item.valuesMap = newValuesMap;
item.isWorking = false;
classMap[item.id!] = item;
state = state.copyWith(classMap: classMap);
}
Future<bool> doInstall() async {
state = state.copyWith(workingText: "生成汉化文件...");
final classMap = state.classMap!;
final globalIni = StringBuffer();
for (var item in classMap.values) {
for (var kv in item.valuesMap.entries) {
globalIni.write("${kv.key}=${kv.value}\n");
await Future.delayed(Duration.zero);
}
}
state = state.copyWith(workingText: "安装汉化文件...");
final localizationUIModel = ref.read(localizationUIModelProvider.notifier);
await localizationUIModel.installFormString(
globalIni, state.apiLocalizationData?.versionName ?? "-",
advanced: true);
state = state.copyWith(workingText: "");
return true;
}
} }

View File

@ -21,6 +21,10 @@ mixin _$AdvancedLocalizationUIState {
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
String? get p4kGlobalIni => throw _privateConstructorUsedError; String? get p4kGlobalIni => throw _privateConstructorUsedError;
String? get serverGlobalIni => throw _privateConstructorUsedError; String? get serverGlobalIni => throw _privateConstructorUsedError;
ScLocalizationData? get apiLocalizationData =>
throw _privateConstructorUsedError;
int get p4kGlobalIniLines => throw _privateConstructorUsedError;
int get serverGlobalIniLines => throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
$AdvancedLocalizationUIStateCopyWith<AdvancedLocalizationUIState> $AdvancedLocalizationUIStateCopyWith<AdvancedLocalizationUIState>
@ -39,7 +43,10 @@ abstract class $AdvancedLocalizationUIStateCopyWith<$Res> {
{String workingText, {String workingText,
Map<String, AppAdvancedLocalizationClassKeysData>? classMap, Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
String? p4kGlobalIni, String? p4kGlobalIni,
String? serverGlobalIni}); String? serverGlobalIni,
ScLocalizationData? apiLocalizationData,
int p4kGlobalIniLines,
int serverGlobalIniLines});
} }
/// @nodoc /// @nodoc
@ -60,6 +67,9 @@ class _$AdvancedLocalizationUIStateCopyWithImpl<$Res,
Object? classMap = freezed, Object? classMap = freezed,
Object? p4kGlobalIni = freezed, Object? p4kGlobalIni = freezed,
Object? serverGlobalIni = freezed, Object? serverGlobalIni = freezed,
Object? apiLocalizationData = freezed,
Object? p4kGlobalIniLines = null,
Object? serverGlobalIniLines = null,
}) { }) {
return _then(_value.copyWith( return _then(_value.copyWith(
workingText: null == workingText workingText: null == workingText
@ -78,6 +88,18 @@ class _$AdvancedLocalizationUIStateCopyWithImpl<$Res,
? _value.serverGlobalIni ? _value.serverGlobalIni
: serverGlobalIni // ignore: cast_nullable_to_non_nullable : serverGlobalIni // ignore: cast_nullable_to_non_nullable
as String?, as String?,
apiLocalizationData: freezed == apiLocalizationData
? _value.apiLocalizationData
: apiLocalizationData // ignore: cast_nullable_to_non_nullable
as ScLocalizationData?,
p4kGlobalIniLines: null == p4kGlobalIniLines
? _value.p4kGlobalIniLines
: p4kGlobalIniLines // ignore: cast_nullable_to_non_nullable
as int,
serverGlobalIniLines: null == serverGlobalIniLines
? _value.serverGlobalIniLines
: serverGlobalIniLines // ignore: cast_nullable_to_non_nullable
as int,
) as $Val); ) as $Val);
} }
} }
@ -95,7 +117,10 @@ abstract class _$$AdvancedLocalizationUIStateImplCopyWith<$Res>
{String workingText, {String workingText,
Map<String, AppAdvancedLocalizationClassKeysData>? classMap, Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
String? p4kGlobalIni, String? p4kGlobalIni,
String? serverGlobalIni}); String? serverGlobalIni,
ScLocalizationData? apiLocalizationData,
int p4kGlobalIniLines,
int serverGlobalIniLines});
} }
/// @nodoc /// @nodoc
@ -115,6 +140,9 @@ class __$$AdvancedLocalizationUIStateImplCopyWithImpl<$Res>
Object? classMap = freezed, Object? classMap = freezed,
Object? p4kGlobalIni = freezed, Object? p4kGlobalIni = freezed,
Object? serverGlobalIni = freezed, Object? serverGlobalIni = freezed,
Object? apiLocalizationData = freezed,
Object? p4kGlobalIniLines = null,
Object? serverGlobalIniLines = null,
}) { }) {
return _then(_$AdvancedLocalizationUIStateImpl( return _then(_$AdvancedLocalizationUIStateImpl(
workingText: null == workingText workingText: null == workingText
@ -133,6 +161,18 @@ class __$$AdvancedLocalizationUIStateImplCopyWithImpl<$Res>
? _value.serverGlobalIni ? _value.serverGlobalIni
: serverGlobalIni // ignore: cast_nullable_to_non_nullable : serverGlobalIni // ignore: cast_nullable_to_non_nullable
as String?, as String?,
apiLocalizationData: freezed == apiLocalizationData
? _value.apiLocalizationData
: apiLocalizationData // ignore: cast_nullable_to_non_nullable
as ScLocalizationData?,
p4kGlobalIniLines: null == p4kGlobalIniLines
? _value.p4kGlobalIniLines
: p4kGlobalIniLines // ignore: cast_nullable_to_non_nullable
as int,
serverGlobalIniLines: null == serverGlobalIniLines
? _value.serverGlobalIniLines
: serverGlobalIniLines // ignore: cast_nullable_to_non_nullable
as int,
)); ));
} }
} }
@ -146,7 +186,10 @@ class _$AdvancedLocalizationUIStateImpl
{this.workingText = "", {this.workingText = "",
final Map<String, AppAdvancedLocalizationClassKeysData>? classMap, final Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
this.p4kGlobalIni, this.p4kGlobalIni,
this.serverGlobalIni}) this.serverGlobalIni,
this.apiLocalizationData,
this.p4kGlobalIniLines = 0,
this.serverGlobalIniLines = 0})
: _classMap = classMap; : _classMap = classMap;
@override @override
@ -166,10 +209,18 @@ class _$AdvancedLocalizationUIStateImpl
final String? p4kGlobalIni; final String? p4kGlobalIni;
@override @override
final String? serverGlobalIni; final String? serverGlobalIni;
@override
final ScLocalizationData? apiLocalizationData;
@override
@JsonKey()
final int p4kGlobalIniLines;
@override
@JsonKey()
final int serverGlobalIniLines;
@override @override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return 'AdvancedLocalizationUIState(workingText: $workingText, classMap: $classMap, p4kGlobalIni: $p4kGlobalIni, serverGlobalIni: $serverGlobalIni)'; return 'AdvancedLocalizationUIState(workingText: $workingText, classMap: $classMap, p4kGlobalIni: $p4kGlobalIni, serverGlobalIni: $serverGlobalIni, apiLocalizationData: $apiLocalizationData, p4kGlobalIniLines: $p4kGlobalIniLines, serverGlobalIniLines: $serverGlobalIniLines)';
} }
@override @override
@ -180,7 +231,10 @@ class _$AdvancedLocalizationUIStateImpl
..add(DiagnosticsProperty('workingText', workingText)) ..add(DiagnosticsProperty('workingText', workingText))
..add(DiagnosticsProperty('classMap', classMap)) ..add(DiagnosticsProperty('classMap', classMap))
..add(DiagnosticsProperty('p4kGlobalIni', p4kGlobalIni)) ..add(DiagnosticsProperty('p4kGlobalIni', p4kGlobalIni))
..add(DiagnosticsProperty('serverGlobalIni', serverGlobalIni)); ..add(DiagnosticsProperty('serverGlobalIni', serverGlobalIni))
..add(DiagnosticsProperty('apiLocalizationData', apiLocalizationData))
..add(DiagnosticsProperty('p4kGlobalIniLines', p4kGlobalIniLines))
..add(DiagnosticsProperty('serverGlobalIniLines', serverGlobalIniLines));
} }
@override @override
@ -194,7 +248,13 @@ class _$AdvancedLocalizationUIStateImpl
(identical(other.p4kGlobalIni, p4kGlobalIni) || (identical(other.p4kGlobalIni, p4kGlobalIni) ||
other.p4kGlobalIni == p4kGlobalIni) && other.p4kGlobalIni == p4kGlobalIni) &&
(identical(other.serverGlobalIni, serverGlobalIni) || (identical(other.serverGlobalIni, serverGlobalIni) ||
other.serverGlobalIni == serverGlobalIni)); other.serverGlobalIni == serverGlobalIni) &&
(identical(other.apiLocalizationData, apiLocalizationData) ||
other.apiLocalizationData == apiLocalizationData) &&
(identical(other.p4kGlobalIniLines, p4kGlobalIniLines) ||
other.p4kGlobalIniLines == p4kGlobalIniLines) &&
(identical(other.serverGlobalIniLines, serverGlobalIniLines) ||
other.serverGlobalIniLines == serverGlobalIniLines));
} }
@override @override
@ -203,7 +263,10 @@ class _$AdvancedLocalizationUIStateImpl
workingText, workingText,
const DeepCollectionEquality().hash(_classMap), const DeepCollectionEquality().hash(_classMap),
p4kGlobalIni, p4kGlobalIni,
serverGlobalIni); serverGlobalIni,
apiLocalizationData,
p4kGlobalIniLines,
serverGlobalIniLines);
@JsonKey(ignore: true) @JsonKey(ignore: true)
@override @override
@ -219,7 +282,10 @@ abstract class _AdvancedLocalizationUIState
{final String workingText, {final String workingText,
final Map<String, AppAdvancedLocalizationClassKeysData>? classMap, final Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
final String? p4kGlobalIni, final String? p4kGlobalIni,
final String? serverGlobalIni}) = _$AdvancedLocalizationUIStateImpl; final String? serverGlobalIni,
final ScLocalizationData? apiLocalizationData,
final int p4kGlobalIniLines,
final int serverGlobalIniLines}) = _$AdvancedLocalizationUIStateImpl;
@override @override
String get workingText; String get workingText;
@ -230,6 +296,12 @@ abstract class _AdvancedLocalizationUIState
@override @override
String? get serverGlobalIni; String? get serverGlobalIni;
@override @override
ScLocalizationData? get apiLocalizationData;
@override
int get p4kGlobalIniLines;
@override
int get serverGlobalIniLines;
@override
@JsonKey(ignore: true) @JsonKey(ignore: true)
_$$AdvancedLocalizationUIStateImplCopyWith<_$AdvancedLocalizationUIStateImpl> _$$AdvancedLocalizationUIStateImplCopyWith<_$AdvancedLocalizationUIStateImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;

View File

@ -7,7 +7,7 @@ part of 'advanced_localization_ui_model.dart';
// ************************************************************************** // **************************************************************************
String _$advancedLocalizationUIModelHash() => String _$advancedLocalizationUIModelHash() =>
r'2bb7dfc3cd8d45ecf5056083627136ad5cb7a285'; r'55c9d02d4c78112b2772f789c2758c3ea88808cb';
/// See also [AdvancedLocalizationUIModel]. /// See also [AdvancedLocalizationUIModel].
@ProviderFor(AdvancedLocalizationUIModel) @ProviderFor(AdvancedLocalizationUIModel)

View File

@ -86,7 +86,7 @@ class LocalizationDialogUI extends HookConsumerWidget {
Row( Row(
children: [ children: [
Text(S.current.localization_info_installed_version( Text(S.current.localization_info_installed_version(
state.patchStatus?.value ?? "")), "${state.patchStatus?.value ?? ""} ${(state.isInstalledAdvanced ?? false) ? " (高级汉化)" : ""}")),
const Spacer(), const Spacer(),
if (state.patchStatus?.value != if (state.patchStatus?.value !=
S.current.home_action_info_game_built_in) S.current.home_action_info_game_built_in)

View File

@ -32,6 +32,7 @@ class LocalizationUIState with _$LocalizationUIState {
Map<String, ScLocalizationData>? apiLocalizationData, Map<String, ScLocalizationData>? apiLocalizationData,
@Default("") String workingVersion, @Default("") String workingVersion,
MapEntry<bool, String>? patchStatus, MapEntry<bool, String>? patchStatus,
bool? isInstalledAdvanced,
List<String>? customizeList, List<String>? customizeList,
@Default(false) bool enableCustomize, @Default(false) bool enableCustomize,
}) = _LocalizationUIState; }) = _LocalizationUIState;
@ -222,7 +223,7 @@ class LocalizationUIModel extends _$LocalizationUIModel {
if (!await f.exists()) return; if (!await f.exists()) return;
state = state.copyWith(workingVersion: filePath); state = state.copyWith(workingVersion: filePath);
final str = await f.readAsString(); final str = await f.readAsString();
await _installFormString( await installFormString(
StringBuffer(str), StringBuffer(str),
S.current S.current
.localization_info_custom_file(getCustomizeFileName(filePath))); .localization_info_custom_file(getCustomizeFileName(filePath)));
@ -230,14 +231,19 @@ class LocalizationUIModel extends _$LocalizationUIModel {
}; };
} }
_installFormString(StringBuffer globalIni, String versionName) async { installFormString(StringBuffer globalIni, String versionName,
{bool? advanced}) async {
final iniFile = File( final iniFile = File(
"${_scDataDir.absolute.path}\\Localization\\${state.selectedLanguage}\\global.ini"); "${_scDataDir.absolute.path}\\Localization\\${state.selectedLanguage}\\global.ini");
if (versionName.isNotEmpty) { if (versionName.isNotEmpty) {
if (!globalIni.toString().endsWith("\n")) { if (!globalIni.toString().endsWith("\n")) {
globalIni.write("\n"); globalIni.write("\n");
} }
globalIni.write("_starcitizen_doctor_localization_version=$versionName"); if (advanced ?? false) {
globalIni.write("_starcitizen_doctor_localization_advanced=true\n");
}
globalIni
.write("_starcitizen_doctor_localization_version=$versionName\n");
} }
/// write cfg /// write cfg
@ -275,7 +281,7 @@ class LocalizationUIModel extends _$LocalizationUIModel {
if (globalIni.isEmpty) { if (globalIni.isEmpty) {
throw S.current.localization_info_corrupted_file; throw S.current.localization_info_corrupted_file;
} }
await _installFormString(globalIni, value.versionName ?? ""); await installFormString(globalIni, value.versionName ?? "");
} catch (e) { } catch (e) {
if (!context.mounted) return; if (!context.mounted) return;
await showToast( await showToast(
@ -348,7 +354,19 @@ class LocalizationUIModel extends _$LocalizationUIModel {
await _getLangCfgEnableLang(lang: state.selectedLanguage!), await _getLangCfgEnableLang(lang: state.selectedLanguage!),
await _getInstalledIniVersion( await _getInstalledIniVersion(
"${_scDataDir.absolute.path}\\Localization\\${state.selectedLanguage}\\global.ini")); "${_scDataDir.absolute.path}\\Localization\\${state.selectedLanguage}\\global.ini"));
state = state.copyWith(patchStatus: patchStatus); final isInstalledAdvanced = await _checkAdvancedStatus(
"${_scDataDir.absolute.path}\\Localization\\${state.selectedLanguage}\\global.ini");
state = state.copyWith(
patchStatus: patchStatus, isInstalledAdvanced: isInstalledAdvanced);
}
Future<bool> _checkAdvancedStatus(String path) async {
final iniFile = File(path);
if (!await iniFile.exists()) {
return false;
}
final iniString = (await iniFile.readAsString());
return iniString.contains("_starcitizen_doctor_localization_advanced=true");
} }
Future<bool> _getLangCfgEnableLang({String lang = ""}) async { Future<bool> _getLangCfgEnableLang({String lang = ""}) async {

View File

@ -21,6 +21,7 @@ mixin _$LocalizationUIState {
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
String get workingVersion => throw _privateConstructorUsedError; String get workingVersion => throw _privateConstructorUsedError;
MapEntry<bool, String>? get patchStatus => throw _privateConstructorUsedError; MapEntry<bool, String>? get patchStatus => throw _privateConstructorUsedError;
bool? get isInstalledAdvanced => throw _privateConstructorUsedError;
List<String>? get customizeList => throw _privateConstructorUsedError; List<String>? get customizeList => throw _privateConstructorUsedError;
bool get enableCustomize => throw _privateConstructorUsedError; bool get enableCustomize => throw _privateConstructorUsedError;
@ -40,6 +41,7 @@ abstract class $LocalizationUIStateCopyWith<$Res> {
Map<String, ScLocalizationData>? apiLocalizationData, Map<String, ScLocalizationData>? apiLocalizationData,
String workingVersion, String workingVersion,
MapEntry<bool, String>? patchStatus, MapEntry<bool, String>? patchStatus,
bool? isInstalledAdvanced,
List<String>? customizeList, List<String>? customizeList,
bool enableCustomize}); bool enableCustomize});
} }
@ -61,6 +63,7 @@ class _$LocalizationUIStateCopyWithImpl<$Res, $Val extends LocalizationUIState>
Object? apiLocalizationData = freezed, Object? apiLocalizationData = freezed,
Object? workingVersion = null, Object? workingVersion = null,
Object? patchStatus = freezed, Object? patchStatus = freezed,
Object? isInstalledAdvanced = freezed,
Object? customizeList = freezed, Object? customizeList = freezed,
Object? enableCustomize = null, Object? enableCustomize = null,
}) { }) {
@ -81,6 +84,10 @@ class _$LocalizationUIStateCopyWithImpl<$Res, $Val extends LocalizationUIState>
? _value.patchStatus ? _value.patchStatus
: patchStatus // ignore: cast_nullable_to_non_nullable : patchStatus // ignore: cast_nullable_to_non_nullable
as MapEntry<bool, String>?, as MapEntry<bool, String>?,
isInstalledAdvanced: freezed == isInstalledAdvanced
? _value.isInstalledAdvanced
: isInstalledAdvanced // ignore: cast_nullable_to_non_nullable
as bool?,
customizeList: freezed == customizeList customizeList: freezed == customizeList
? _value.customizeList ? _value.customizeList
: customizeList // ignore: cast_nullable_to_non_nullable : customizeList // ignore: cast_nullable_to_non_nullable
@ -106,6 +113,7 @@ abstract class _$$LocalizationUIStateImplCopyWith<$Res>
Map<String, ScLocalizationData>? apiLocalizationData, Map<String, ScLocalizationData>? apiLocalizationData,
String workingVersion, String workingVersion,
MapEntry<bool, String>? patchStatus, MapEntry<bool, String>? patchStatus,
bool? isInstalledAdvanced,
List<String>? customizeList, List<String>? customizeList,
bool enableCustomize}); bool enableCustomize});
} }
@ -125,6 +133,7 @@ class __$$LocalizationUIStateImplCopyWithImpl<$Res>
Object? apiLocalizationData = freezed, Object? apiLocalizationData = freezed,
Object? workingVersion = null, Object? workingVersion = null,
Object? patchStatus = freezed, Object? patchStatus = freezed,
Object? isInstalledAdvanced = freezed,
Object? customizeList = freezed, Object? customizeList = freezed,
Object? enableCustomize = null, Object? enableCustomize = null,
}) { }) {
@ -145,6 +154,10 @@ class __$$LocalizationUIStateImplCopyWithImpl<$Res>
? _value.patchStatus ? _value.patchStatus
: patchStatus // ignore: cast_nullable_to_non_nullable : patchStatus // ignore: cast_nullable_to_non_nullable
as MapEntry<bool, String>?, as MapEntry<bool, String>?,
isInstalledAdvanced: freezed == isInstalledAdvanced
? _value.isInstalledAdvanced
: isInstalledAdvanced // ignore: cast_nullable_to_non_nullable
as bool?,
customizeList: freezed == customizeList customizeList: freezed == customizeList
? _value._customizeList ? _value._customizeList
: customizeList // ignore: cast_nullable_to_non_nullable : customizeList // ignore: cast_nullable_to_non_nullable
@ -165,6 +178,7 @@ class _$LocalizationUIStateImpl implements _LocalizationUIState {
final Map<String, ScLocalizationData>? apiLocalizationData, final Map<String, ScLocalizationData>? apiLocalizationData,
this.workingVersion = "", this.workingVersion = "",
this.patchStatus, this.patchStatus,
this.isInstalledAdvanced,
final List<String>? customizeList, final List<String>? customizeList,
this.enableCustomize = false}) this.enableCustomize = false})
: _apiLocalizationData = apiLocalizationData, : _apiLocalizationData = apiLocalizationData,
@ -188,6 +202,8 @@ class _$LocalizationUIStateImpl implements _LocalizationUIState {
final String workingVersion; final String workingVersion;
@override @override
final MapEntry<bool, String>? patchStatus; final MapEntry<bool, String>? patchStatus;
@override
final bool? isInstalledAdvanced;
final List<String>? _customizeList; final List<String>? _customizeList;
@override @override
List<String>? get customizeList { List<String>? get customizeList {
@ -204,7 +220,7 @@ class _$LocalizationUIStateImpl implements _LocalizationUIState {
@override @override
String toString() { String toString() {
return 'LocalizationUIState(selectedLanguage: $selectedLanguage, apiLocalizationData: $apiLocalizationData, workingVersion: $workingVersion, patchStatus: $patchStatus, customizeList: $customizeList, enableCustomize: $enableCustomize)'; return 'LocalizationUIState(selectedLanguage: $selectedLanguage, apiLocalizationData: $apiLocalizationData, workingVersion: $workingVersion, patchStatus: $patchStatus, isInstalledAdvanced: $isInstalledAdvanced, customizeList: $customizeList, enableCustomize: $enableCustomize)';
} }
@override @override
@ -220,6 +236,8 @@ class _$LocalizationUIStateImpl implements _LocalizationUIState {
other.workingVersion == workingVersion) && other.workingVersion == workingVersion) &&
(identical(other.patchStatus, patchStatus) || (identical(other.patchStatus, patchStatus) ||
other.patchStatus == patchStatus) && other.patchStatus == patchStatus) &&
(identical(other.isInstalledAdvanced, isInstalledAdvanced) ||
other.isInstalledAdvanced == isInstalledAdvanced) &&
const DeepCollectionEquality() const DeepCollectionEquality()
.equals(other._customizeList, _customizeList) && .equals(other._customizeList, _customizeList) &&
(identical(other.enableCustomize, enableCustomize) || (identical(other.enableCustomize, enableCustomize) ||
@ -233,6 +251,7 @@ class _$LocalizationUIStateImpl implements _LocalizationUIState {
const DeepCollectionEquality().hash(_apiLocalizationData), const DeepCollectionEquality().hash(_apiLocalizationData),
workingVersion, workingVersion,
patchStatus, patchStatus,
isInstalledAdvanced,
const DeepCollectionEquality().hash(_customizeList), const DeepCollectionEquality().hash(_customizeList),
enableCustomize); enableCustomize);
@ -250,6 +269,7 @@ abstract class _LocalizationUIState implements LocalizationUIState {
final Map<String, ScLocalizationData>? apiLocalizationData, final Map<String, ScLocalizationData>? apiLocalizationData,
final String workingVersion, final String workingVersion,
final MapEntry<bool, String>? patchStatus, final MapEntry<bool, String>? patchStatus,
final bool? isInstalledAdvanced,
final List<String>? customizeList, final List<String>? customizeList,
final bool enableCustomize}) = _$LocalizationUIStateImpl; final bool enableCustomize}) = _$LocalizationUIStateImpl;
@ -262,6 +282,8 @@ abstract class _LocalizationUIState implements LocalizationUIState {
@override @override
MapEntry<bool, String>? get patchStatus; MapEntry<bool, String>? get patchStatus;
@override @override
bool? get isInstalledAdvanced;
@override
List<String>? get customizeList; List<String>? get customizeList;
@override @override
bool get enableCustomize; bool get enableCustomize;

View File

@ -7,7 +7,7 @@ part of 'localization_ui_model.dart';
// ************************************************************************** // **************************************************************************
String _$localizationUIModelHash() => String _$localizationUIModelHash() =>
r'ed47da78fdc6adac904a17909f111640ac84563e'; r'892a302b28ce4446cab7591f54008fbcc2e5eae0';
/// See also [LocalizationUIModel]. /// See also [LocalizationUIModel].
@ProviderFor(LocalizationUIModel) @ProviderFor(LocalizationUIModel)

View File

@ -267,6 +267,7 @@ class _TextTempWidget extends HookConsumerWidget {
return CodeEditor( return CodeEditor(
controller: CodeLineEditingController.fromText('${textData.value}'), controller: CodeLineEditingController.fromText('${textData.value}'),
readOnly: true,
); );
} }
} }

View File

@ -62,6 +62,7 @@ dependencies:
super_sliver_list: ^0.4.1 super_sliver_list: ^0.4.1
file: ^7.0.0 file: ^7.0.0
re_editor: ^0.2.0 re_editor: ^0.2.0
re_highlight: ^0.0.3
dependency_overrides: dependency_overrides:
http: ^1.1.2 http: ^1.1.2