mirror of
https://mirror.ghproxy.com/https://github.com/StarCitizenToolBox/app.git
synced 2024-12-23 05:23:44 +08:00
feat: AdvancedLocalization Init
This commit is contained in:
parent
4e506a11a0
commit
9a875fc5a5
531
assets/advanced_localization.json
Normal file
531
assets/advanced_localization.json
Normal file
@ -0,0 +1,531 @@
|
|||||||
|
{
|
||||||
|
"class_keys": [
|
||||||
|
{
|
||||||
|
"id": "location",
|
||||||
|
"class_name": "地点",
|
||||||
|
"keys": [
|
||||||
|
"ATC_.*",
|
||||||
|
"Bacchus.*",
|
||||||
|
"Cano.*",
|
||||||
|
"Castra.*",
|
||||||
|
".*_QT",
|
||||||
|
"Crus_HistMarker_.*",
|
||||||
|
"Delamar.*",
|
||||||
|
"Ellis.*",
|
||||||
|
"Enroll_.*",
|
||||||
|
".*_QuantumMarker_.*",
|
||||||
|
"Goss.*",
|
||||||
|
"Hadrian.*",
|
||||||
|
"Hurston_JumpPoint_.*",
|
||||||
|
"Jurisdictions_Name_.*",
|
||||||
|
"LandingPad_.*",
|
||||||
|
"Levski_Shop_Teach.*",
|
||||||
|
"Lorville_.*",
|
||||||
|
"Magnus.*",
|
||||||
|
"MiningClaim_.*",
|
||||||
|
"MiningClaims_Desc_.*",
|
||||||
|
"NavBeacon_.*",
|
||||||
|
"NavPoint_.*",
|
||||||
|
"Nav_.*",
|
||||||
|
"Navpoint_.*",
|
||||||
|
"Nyx.*",
|
||||||
|
"Orison_Destination_.*",
|
||||||
|
"Oso.*",
|
||||||
|
"Pyro.*",
|
||||||
|
"QT_.*",
|
||||||
|
"RR_.*",
|
||||||
|
"Shubin_.*",
|
||||||
|
"Solar_system_.*",
|
||||||
|
"Stanton.*",
|
||||||
|
"Starfarer_Wreckage_QT_.*",
|
||||||
|
"Taranis.*",
|
||||||
|
"Tarpits.*",
|
||||||
|
"Tayac.*",
|
||||||
|
"Terra.*",
|
||||||
|
"Virgil.*",
|
||||||
|
"area_.*",
|
||||||
|
"cargodeck_.*",
|
||||||
|
"dockingport_.*",
|
||||||
|
"garage_.*",
|
||||||
|
"hangar_.*",
|
||||||
|
"landing_pad_.*",
|
||||||
|
"pyro_.*",
|
||||||
|
"room_.*",
|
||||||
|
"security_.*",
|
||||||
|
"select_.*",
|
||||||
|
"shop_name_.*",
|
||||||
|
"vehicle_room_.*",
|
||||||
|
"warning_.*",
|
||||||
|
"weapon_stats.*",
|
||||||
|
"weapons_heal_.*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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_.*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"class_name": "物品",
|
||||||
|
"id": "thing",
|
||||||
|
"keys": [
|
||||||
|
"BarMenu_.*",
|
||||||
|
"FLOOR_Flair_Items.*",
|
||||||
|
"FPS_AI_.*",
|
||||||
|
"ItemPort_port_NameCooler.*",
|
||||||
|
"Item_.*",
|
||||||
|
"destoryitems_.*",
|
||||||
|
"destroyItems_.*",
|
||||||
|
"item.*",
|
||||||
|
"kopion_.*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"class_name": "载具",
|
||||||
|
"id": "vehicle",
|
||||||
|
"keys": [
|
||||||
|
"vehicle_Name.*",
|
||||||
|
"vehicle_name.*",
|
||||||
|
"vehicle_Desc.*",
|
||||||
|
"vehicl_Desc.*",
|
||||||
|
"vehicel_Desc.*",
|
||||||
|
"vehicles_.*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "mission",
|
||||||
|
"class_name": "任务/日志",
|
||||||
|
"keys": [
|
||||||
|
"BasicSalvage_.*",
|
||||||
|
"BitZeros_.*",
|
||||||
|
"BHG_.*",
|
||||||
|
"BlacJac_.*",
|
||||||
|
"BountyHuntersGuild_.*",
|
||||||
|
"BrightSky_.*",
|
||||||
|
"CThing_.*",
|
||||||
|
"ChainedDeliveryModule_.*",
|
||||||
|
"Clovis_Safe_.*",
|
||||||
|
"CommArray_.*",
|
||||||
|
"Commissary_.*",
|
||||||
|
"Community_Service.*",
|
||||||
|
"CovalexIC_.*",
|
||||||
|
"Constantine_.*",
|
||||||
|
"Covalex_.*",
|
||||||
|
"Criminal_.*",
|
||||||
|
"CrusaderSecurity_.*",
|
||||||
|
"Crusader_ReputationJournal_.*",
|
||||||
|
"Crusader_from_.*",
|
||||||
|
"DC_room_.*",
|
||||||
|
"DataHeist_.*",
|
||||||
|
"Datapad_.*",
|
||||||
|
"Delivery_.*",
|
||||||
|
"Derelict_.*",
|
||||||
|
"DestroyDebris_.*",
|
||||||
|
"DestroyEvidence_.*",
|
||||||
|
"DestroyObj_Text_.*",
|
||||||
|
"DistributionCenter_.*",
|
||||||
|
"DynamicEvent_.*",
|
||||||
|
"Eckhart_.*",
|
||||||
|
"FPSPVEVS_.*",
|
||||||
|
"FTL_.*",
|
||||||
|
"FW22_NT_Journal_Title_.*",
|
||||||
|
"ForceDepletion_.*",
|
||||||
|
"GLoc_Bartender_Conv_.*",
|
||||||
|
"GMCapture_.*",
|
||||||
|
"GarethWIP_.*",
|
||||||
|
"Gathering_.*",
|
||||||
|
"Gen_NPC_Conv_.*",
|
||||||
|
"Greeter_.*",
|
||||||
|
"HeadHunters_.*",
|
||||||
|
"HexPenetrator_.*",
|
||||||
|
"Hurston_ReputationJournal_.*",
|
||||||
|
"Hurston_bounty_.*",
|
||||||
|
"Hurston_destroystash_.*",
|
||||||
|
"Hurston_eliminateall_.*",
|
||||||
|
"Hurston_eliminatespecifc_.*",
|
||||||
|
"Hurston_killcreatureslocation_.*",
|
||||||
|
"Hurston_searchbody_.*",
|
||||||
|
"IAE2951_.*",
|
||||||
|
"IAE2952_.*",
|
||||||
|
"IAE952_.*",
|
||||||
|
"Info_Kiosks_.*",
|
||||||
|
"Infractions_.*",
|
||||||
|
"Investigation_.*",
|
||||||
|
"Invictus2951_.*",
|
||||||
|
"Invictus_.*",
|
||||||
|
"JournalEntry_.*",
|
||||||
|
"JournalText.*",
|
||||||
|
"Journal_.*",
|
||||||
|
"Jumptown2_.*",
|
||||||
|
"JurisdictionJournals_.*",
|
||||||
|
"Kill_Civ_.*",
|
||||||
|
"LingFamily_.*",
|
||||||
|
"Ling_.*",
|
||||||
|
"LocalDelivery_.*",
|
||||||
|
"Local_Delivery_.*",
|
||||||
|
"MG_.*",
|
||||||
|
"MTPS_.*",
|
||||||
|
"MTProtectiveServices_.*",
|
||||||
|
"MilesEckhart_.*",
|
||||||
|
"Mission.*",
|
||||||
|
"Missions.*",
|
||||||
|
"Mtps_killallcreatures_.*",
|
||||||
|
"NB_.*",
|
||||||
|
"NPE_.*",
|
||||||
|
"NTLockdown_.*",
|
||||||
|
"Name_.*",
|
||||||
|
"NorthRock_.*",
|
||||||
|
"Orison_CRUShowroom_.*",
|
||||||
|
"Orison_DiscoverySpot_.*",
|
||||||
|
"OutlawSweep_.*",
|
||||||
|
"Outpost_.*",
|
||||||
|
"Pacheco_.*",
|
||||||
|
"PreventData_.*",
|
||||||
|
"ProtLife_.*",
|
||||||
|
"RAIN_.*",
|
||||||
|
"RacingRep_.*",
|
||||||
|
"Racing_Ship_DisplayName.*",
|
||||||
|
"RedWind_.*",
|
||||||
|
"RepScope_.*",
|
||||||
|
"RepStanding_.*",
|
||||||
|
"RepairOxygenKiosk_.*",
|
||||||
|
"Reststop_.*",
|
||||||
|
"RetakeLocation_.*",
|
||||||
|
"RetrieveConsignment_.*",
|
||||||
|
"RetrieveDatapad_.*",
|
||||||
|
"ReturnObjective_.*",
|
||||||
|
"ReturnToLocation_.*",
|
||||||
|
"Roughready_.*",
|
||||||
|
"Ruto_.*",
|
||||||
|
"SB_.*",
|
||||||
|
"SalvageContractor_.*",
|
||||||
|
"ScanVehicleLocationModule_.*",
|
||||||
|
"ScrambleRace_.*",
|
||||||
|
"ScreamingGalsons_.*",
|
||||||
|
"ServiceBeacon_.*",
|
||||||
|
"ShipName_.*",
|
||||||
|
"ShipStrip_.*",
|
||||||
|
"Special_Event_.*",
|
||||||
|
"Station_Illegal_.*",
|
||||||
|
"Staton4_NewBab_.*",
|
||||||
|
"StealEvidence_.*",
|
||||||
|
"TarPits_.*",
|
||||||
|
"Temp_.*",
|
||||||
|
"Terminal_.*",
|
||||||
|
"Text_.*",
|
||||||
|
"TimeSensative_.*",
|
||||||
|
"TimeSensitive_.*",
|
||||||
|
"TimeTrial_.*",
|
||||||
|
"TimedSalvage_.*",
|
||||||
|
"TransportGuild_.*",
|
||||||
|
"TravelObjective_.*",
|
||||||
|
"Tut.*",
|
||||||
|
"Tutorial.*",
|
||||||
|
"UDM_.*",
|
||||||
|
"Vaughn_.*",
|
||||||
|
"VendingMachien_.*",
|
||||||
|
"VendingMachin_.*",
|
||||||
|
"VendingMachine_.*",
|
||||||
|
"WSTR_.*",
|
||||||
|
"WantedLevel5_.*",
|
||||||
|
"XenoThreat_.*",
|
||||||
|
"acquirepart_.*",
|
||||||
|
"alt_criminal_collect_reclaimer_desc.*",
|
||||||
|
"aracersurvivesrace_.*",
|
||||||
|
"assassin_.*",
|
||||||
|
"assassination_.*",
|
||||||
|
"asteroidfield_.*",
|
||||||
|
"basesweep_.*",
|
||||||
|
"bitzeros_.*",
|
||||||
|
"blacJac_.*",
|
||||||
|
"blackbox_.*",
|
||||||
|
"blackboxillegal_.*",
|
||||||
|
"blackboxlegal_.*",
|
||||||
|
"boarders_.*",
|
||||||
|
"bounty_.*",
|
||||||
|
"bountymarker_.*",
|
||||||
|
"cave_.*",
|
||||||
|
"ccdemo19_.*",
|
||||||
|
"cdf_.*",
|
||||||
|
"cfp_.*",
|
||||||
|
"civilian_.*",
|
||||||
|
"claimsweep_.*",
|
||||||
|
"collect_reclaimer_.*",
|
||||||
|
"combatassist_.*",
|
||||||
|
"commarray_hack_.*",
|
||||||
|
"commarray_repair_.*",
|
||||||
|
"confirmkill_.*",
|
||||||
|
"constantine_.*",
|
||||||
|
"criminal_.*",
|
||||||
|
"crus_.*",
|
||||||
|
"crusader_.*",
|
||||||
|
"delivery_.*",
|
||||||
|
"deliverydecoy_.*",
|
||||||
|
"deploypiggyback_.*",
|
||||||
|
"deployprobe_.*",
|
||||||
|
"destroyblade_.*",
|
||||||
|
"destroyitem_.*",
|
||||||
|
"destroyitems_.*",
|
||||||
|
"destroyitemsspace_.*",
|
||||||
|
"destroyprobe_.*",
|
||||||
|
"destroyprobeillegal_.*",
|
||||||
|
"destroyprobelegal_.*",
|
||||||
|
"destroyprove_illegal_.*",
|
||||||
|
"destroystash_.*",
|
||||||
|
"dfmcrusader_.*",
|
||||||
|
"distraction_.*",
|
||||||
|
"distractionkill_.*",
|
||||||
|
"dusters_.*",
|
||||||
|
"ecn_.*",
|
||||||
|
"eliminatespecificracer_.*",
|
||||||
|
"escort_.*",
|
||||||
|
"escortscan_.*",
|
||||||
|
"fleetweek2950_.*",
|
||||||
|
"fps_.*",
|
||||||
|
"goupbounty_.*",
|
||||||
|
"groupbounty_.*",
|
||||||
|
"hack_prevent_.*",
|
||||||
|
"hdactivist_.*",
|
||||||
|
"headhunters_.*",
|
||||||
|
"hurston_.*",
|
||||||
|
"iae2953_.*",
|
||||||
|
"kareah_.*",
|
||||||
|
"kareahsweep_.*",
|
||||||
|
"killallanimal_.*",
|
||||||
|
"killallanimals_.*",
|
||||||
|
"killallkopion_.*",
|
||||||
|
"killallmarok_.*",
|
||||||
|
"killanimalslocation_.*",
|
||||||
|
"killatlocation_.*",
|
||||||
|
"killcollect_.*",
|
||||||
|
"killcollectanimal_.*",
|
||||||
|
"killcollectkopion_.*",
|
||||||
|
"killcollectmarok_.*",
|
||||||
|
"loc_.*",
|
||||||
|
"manufacturer_.*",
|
||||||
|
"meet_miles_.*",
|
||||||
|
"mgClovus_.*",
|
||||||
|
"mg_*",
|
||||||
|
"missionManager_.*",
|
||||||
|
"mission_.*",
|
||||||
|
"mtps_.*",
|
||||||
|
"murderspree_.*",
|
||||||
|
"mustcomesecond_.*",
|
||||||
|
"ninetails_.*",
|
||||||
|
"northrock_.*",
|
||||||
|
"notification_.*",
|
||||||
|
"openbounty_.*",
|
||||||
|
"outlawsweep_.*",
|
||||||
|
"outpost_.*",
|
||||||
|
"p_protectandresupply_.*",
|
||||||
|
"p_showdown_.*",
|
||||||
|
"pickanddestroy_.*",
|
||||||
|
"planetcollect_.*",
|
||||||
|
"prisonerbreak_.*",
|
||||||
|
"prisonermanifest_.*",
|
||||||
|
"protlife_.*",
|
||||||
|
"racelastforxcheckpoints_.*",
|
||||||
|
"recoverspace_.*",
|
||||||
|
"recoverstash_.*",
|
||||||
|
"recoverstolen_.*",
|
||||||
|
"recovery_.*",
|
||||||
|
"redwind_.*",
|
||||||
|
"roughready_.*",
|
||||||
|
"sandbox_.*",
|
||||||
|
"seachbody_.*",
|
||||||
|
"searchbody_.*",
|
||||||
|
"searchcrew_.*",
|
||||||
|
"sectorsweep_.*",
|
||||||
|
"shubin_.*",
|
||||||
|
"shuttle_.*",
|
||||||
|
"spacecargo_.*",
|
||||||
|
"spacecollect_.*",
|
||||||
|
"spacesteal_.*",
|
||||||
|
"stanton.*",
|
||||||
|
"stealfromship_.*",
|
||||||
|
"stealitem_.*",
|
||||||
|
"takecheckpointsxandy_.*",
|
||||||
|
"ugf_.*",
|
||||||
|
"vaughn_.*",
|
||||||
|
"winwithoutkillingracer_.*",
|
||||||
|
"xdamagetoracersinorder_.*",
|
||||||
|
"xenothreat_.*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "subtitle",
|
||||||
|
"class_name": "字幕",
|
||||||
|
"keys": [
|
||||||
|
"DXSH_",
|
||||||
|
"Dlg_SC_.*",
|
||||||
|
"FW22_NT_Datapad_.*",
|
||||||
|
"FleetWeek2950_.*",
|
||||||
|
"GenResponse_.*",
|
||||||
|
"GenericLanding_.*",
|
||||||
|
"IT_Shared_.*",
|
||||||
|
"Imperilled_.*",
|
||||||
|
"MKTG_CUSTOMS1_CV_Access_.*",
|
||||||
|
"PH_PU_.*",
|
||||||
|
"PU_.*",
|
||||||
|
"Pacheco_.*",
|
||||||
|
"SC_ac_.*",
|
||||||
|
"SC_lz_.*",
|
||||||
|
"SM_SIMANN1_.*",
|
||||||
|
"contract_.*",
|
||||||
|
"covalex_.*",
|
||||||
|
"covalexrand_.*",
|
||||||
|
"covalexspec_.*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -28,6 +28,7 @@ import 'data/app_version_data.dart';
|
|||||||
import 'generated/no_l10n_strings.dart';
|
import 'generated/no_l10n_strings.dart';
|
||||||
import 'ui/home/downloader/home_downloader_ui.dart';
|
import 'ui/home/downloader/home_downloader_ui.dart';
|
||||||
import 'ui/home/game_doctor/game_doctor_ui.dart';
|
import 'ui/home/game_doctor/game_doctor_ui.dart';
|
||||||
|
import 'ui/home/localization/advanced_localization_ui.dart';
|
||||||
import 'ui/index_ui.dart';
|
import 'ui/index_ui.dart';
|
||||||
import 'ui/settings/upgrade_dialog.dart';
|
import 'ui/settings/upgrade_dialog.dart';
|
||||||
import 'ui/tools/unp4kc/unp4kc_ui.dart';
|
import 'ui/tools/unp4kc/unp4kc_ui.dart';
|
||||||
@ -77,6 +78,10 @@ GoRouter router(RouterRef ref) {
|
|||||||
pageBuilder: (context, state) =>
|
pageBuilder: (context, state) =>
|
||||||
myPageBuilder(context, state, const HomePerformanceUI()),
|
myPageBuilder(context, state, const HomePerformanceUI()),
|
||||||
),
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: 'advanced_localization',
|
||||||
|
pageBuilder: (context, state) =>
|
||||||
|
myPageBuilder(context, state, const AdvancedLocalizationUI()))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
GoRoute(path: '/tools', builder: (_, __) => const SizedBox(), routes: [
|
GoRoute(path: '/tools', builder: (_, __) => const SizedBox(), routes: [
|
||||||
|
@ -6,7 +6,7 @@ part of 'app.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$routerHash() => r'7ce5ef6a7a4f6f604a457dd050e04ee594c4760a';
|
String _$routerHash() => r'4fb9802d06347972b530f17ea7d66724a6ded997';
|
||||||
|
|
||||||
/// See also [router].
|
/// See also [router].
|
||||||
@ProviderFor(router)
|
@ProviderFor(router)
|
||||||
@ -20,7 +20,7 @@ final routerProvider = AutoDisposeProvider<GoRouter>.internal(
|
|||||||
);
|
);
|
||||||
|
|
||||||
typedef RouterRef = AutoDisposeProviderRef<GoRouter>;
|
typedef RouterRef = AutoDisposeProviderRef<GoRouter>;
|
||||||
String _$appGlobalModelHash() => r'11a172d5fb19ad6566f1025354c8f8d91fe85a84';
|
String _$appGlobalModelHash() => r'9dccbb898714695ef8b640a5b5dfb361783a0f45';
|
||||||
|
|
||||||
/// See also [AppGlobalModel].
|
/// See also [AppGlobalModel].
|
||||||
@ProviderFor(AppGlobalModel)
|
@ProviderFor(AppGlobalModel)
|
||||||
|
@ -11,6 +11,7 @@ File? _logFile;
|
|||||||
void dPrint(src) async {
|
void dPrint(src) async {
|
||||||
if (kDebugMode) {
|
if (kDebugMode) {
|
||||||
print(src);
|
print(src);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
await _logLock.synchronized(() async {
|
await _logLock.synchronized(() async {
|
||||||
try {
|
try {
|
||||||
|
59
lib/data/app_advanced_localization_data.dart
Normal file
59
lib/data/app_advanced_localization_data.dart
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
class AppAdvancedLocalizationData {
|
||||||
|
AppAdvancedLocalizationData({
|
||||||
|
this.classKeys,
|
||||||
|
});
|
||||||
|
|
||||||
|
AppAdvancedLocalizationData.fromJson(dynamic json) {
|
||||||
|
if (json['class_keys'] != null) {
|
||||||
|
classKeys = [];
|
||||||
|
json['class_keys'].forEach((v) {
|
||||||
|
classKeys?.add(AppAdvancedLocalizationClassKeysData.fromJson(v));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<AppAdvancedLocalizationClassKeysData>? classKeys;
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final map = <String, dynamic>{};
|
||||||
|
if (classKeys != null) {
|
||||||
|
map['class_keys'] = classKeys?.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AppAdvancedLocalizationClassKeysData {
|
||||||
|
AppAdvancedLocalizationClassKeysData({
|
||||||
|
this.id,
|
||||||
|
this.className,
|
||||||
|
this.keys,
|
||||||
|
});
|
||||||
|
|
||||||
|
AppAdvancedLocalizationClassKeysData.fromJson(dynamic json) {
|
||||||
|
id = json['id'];
|
||||||
|
className = json['class_name'];
|
||||||
|
keys = json['keys'] != null ? json['keys'].cast<String>() : [];
|
||||||
|
}
|
||||||
|
|
||||||
|
String? id;
|
||||||
|
String? className;
|
||||||
|
List<String>? keys;
|
||||||
|
Map<String, String> valuesMap = {};
|
||||||
|
AppAdvancedLocalizationClassKeysDataMode mode =
|
||||||
|
AppAdvancedLocalizationClassKeysDataMode.localization;
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final map = <String, dynamic>{};
|
||||||
|
map['id'] = id;
|
||||||
|
map['class_name'] = className;
|
||||||
|
map['keys'] = keys;
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum AppAdvancedLocalizationClassKeysDataMode {
|
||||||
|
unLocalization,
|
||||||
|
localization,
|
||||||
|
mixed,
|
||||||
|
}
|
@ -6,7 +6,7 @@ part of 'unp4kc.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$unp4kCModelHash() => r'69117c5857797683e2d080da9238bfecc5948898';
|
String _$unp4kCModelHash() => r'3b2325c72dcb47bf9207625b0a1d2a611f911b6f';
|
||||||
|
|
||||||
/// See also [Unp4kCModel].
|
/// See also [Unp4kCModel].
|
||||||
@ProviderFor(Unp4kCModel)
|
@ProviderFor(Unp4kCModel)
|
||||||
|
102
lib/ui/home/localization/advanced_localization_ui.dart
Normal file
102
lib/ui/home/localization/advanced_localization_ui.dart
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
import 'package:fluent_ui/fluent_ui.dart';
|
||||||
|
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
||||||
|
import 'package:hooks_riverpod/hooks_riverpod.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/widgets/widgets.dart';
|
||||||
|
import 'package:super_sliver_list/super_sliver_list.dart';
|
||||||
|
|
||||||
|
class AdvancedLocalizationUI extends HookConsumerWidget {
|
||||||
|
const AdvancedLocalizationUI({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
final state = ref.watch(advancedLocalizationUIModelProvider);
|
||||||
|
final homeUIState = ref.watch(homeUIModelProvider);
|
||||||
|
return makeDefaultPage(
|
||||||
|
title: "高级汉化 -> ${homeUIState.scInstalledPath}",
|
||||||
|
context,
|
||||||
|
content: state.workingText.isNotEmpty
|
||||||
|
? Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
const ProgressRing(),
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
Text(state.workingText),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: _makeBody(context, homeUIState, state, ref));
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _makeBody(BuildContext context, HomeUIModelState homeUIState,
|
||||||
|
AdvancedLocalizationUIState state, WidgetRef ref) {
|
||||||
|
return AlignedGridView.count(
|
||||||
|
crossAxisCount: 3,
|
||||||
|
crossAxisSpacing: 12,
|
||||||
|
mainAxisSpacing: 12,
|
||||||
|
padding: const EdgeInsets.all(12),
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
final item = state.classMap!.values.elementAt(index);
|
||||||
|
return Container(
|
||||||
|
padding: const EdgeInsets.only(top: 12, bottom: 12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white.withOpacity(.05),
|
||||||
|
borderRadius: BorderRadius.circular(4),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 12, right: 12),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
"${item.className}",
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 16, fontWeight: FontWeight.bold),
|
||||||
|
)),
|
||||||
|
Text(
|
||||||
|
"${item.valuesMap.length}",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
color: Colors.white.withOpacity(.6),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: const EdgeInsets.only(top: 6, bottom: 12),
|
||||||
|
width: MediaQuery.of(context).size.width,
|
||||||
|
height: 1,
|
||||||
|
color: Colors.white.withOpacity(.1),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 160,
|
||||||
|
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,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
itemCount: state.classMap?.length ?? 0,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
170
lib/ui/home/localization/advanced_localization_ui_model.dart
Normal file
170
lib/ui/home/localization/advanced_localization_ui_model.dart
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||||
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
import 'package:starcitizen_doctor/common/utils/log.dart';
|
||||||
|
import 'package:starcitizen_doctor/common/utils/provider.dart';
|
||||||
|
import 'package:starcitizen_doctor/data/app_advanced_localization_data.dart';
|
||||||
|
import 'package:starcitizen_doctor/provider/unp4kc.dart';
|
||||||
|
|
||||||
|
import '../home_ui_model.dart';
|
||||||
|
import 'localization_ui_model.dart';
|
||||||
|
|
||||||
|
part 'advanced_localization_ui_model.g.dart';
|
||||||
|
|
||||||
|
part 'advanced_localization_ui_model.freezed.dart';
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class AdvancedLocalizationUIState with _$AdvancedLocalizationUIState {
|
||||||
|
factory AdvancedLocalizationUIState({
|
||||||
|
@Default("") String workingText,
|
||||||
|
Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
|
||||||
|
String? p4kGlobalIni,
|
||||||
|
String? serverGlobalIni,
|
||||||
|
}) = _AdvancedLocalizationUIState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@riverpod
|
||||||
|
class AdvancedLocalizationUIModel extends _$AdvancedLocalizationUIModel {
|
||||||
|
@override
|
||||||
|
AdvancedLocalizationUIState build() {
|
||||||
|
final localizationUIState = ref.read(localizationUIModelProvider);
|
||||||
|
final localizationUIModel = ref.read(localizationUIModelProvider.notifier);
|
||||||
|
state = AdvancedLocalizationUIState(classMap: {});
|
||||||
|
_init(localizationUIState, localizationUIModel);
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _init(LocalizationUIState localizationUIState,
|
||||||
|
LocalizationUIModel localizationUIModel) async {
|
||||||
|
final (p4kGlobalIni, serverGlobalIni) =
|
||||||
|
await _readIni(localizationUIState, localizationUIModel);
|
||||||
|
final ald = await _readClassJson();
|
||||||
|
if (ald.classKeys == null) return;
|
||||||
|
state = state.copyWith(workingText: "正在分类 ...");
|
||||||
|
final m = await compute(_doClassIni, (ald, p4kGlobalIni, serverGlobalIni));
|
||||||
|
state = state.copyWith(
|
||||||
|
workingText: "",
|
||||||
|
p4kGlobalIni: p4kGlobalIni,
|
||||||
|
serverGlobalIni: serverGlobalIni,
|
||||||
|
classMap: m);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, AppAdvancedLocalizationClassKeysData> _doClassIni(
|
||||||
|
(
|
||||||
|
AppAdvancedLocalizationData ald,
|
||||||
|
String p4kGlobalIni,
|
||||||
|
String serverGlobalIni
|
||||||
|
) v,
|
||||||
|
) {
|
||||||
|
final (
|
||||||
|
AppAdvancedLocalizationData ald,
|
||||||
|
String p4kGlobalIni,
|
||||||
|
String serverGlobalIni,
|
||||||
|
) = v;
|
||||||
|
final unLocalization = AppAdvancedLocalizationClassKeysData(
|
||||||
|
id: "un_localization",
|
||||||
|
className: "未汉化",
|
||||||
|
keys: [],
|
||||||
|
);
|
||||||
|
final unClass = AppAdvancedLocalizationClassKeysData(
|
||||||
|
id: "un_class",
|
||||||
|
className: "未分类",
|
||||||
|
keys: [],
|
||||||
|
);
|
||||||
|
final classMap = <String, AppAdvancedLocalizationClassKeysData>{
|
||||||
|
for (final keys in ald.classKeys!) keys.id ?? "": keys,
|
||||||
|
};
|
||||||
|
|
||||||
|
final p4kIniMap = readIniAsMap(p4kGlobalIni);
|
||||||
|
final serverIniMap = readIniAsMap(serverGlobalIni);
|
||||||
|
|
||||||
|
var regexList = classMap.values
|
||||||
|
.expand((c) => c.keys!.map((k) => MapEntry(c, RegExp(k))))
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
iniKeysLoop:
|
||||||
|
for (var p4kIniKey in p4kIniMap.keys) {
|
||||||
|
final serverValue = serverIniMap[p4kIniKey];
|
||||||
|
if (serverValue == null) {
|
||||||
|
unLocalization.valuesMap[p4kIniKey] = p4kIniMap[p4kIniKey] ?? "";
|
||||||
|
continue iniKeysLoop;
|
||||||
|
} else {
|
||||||
|
for (var item in regexList) {
|
||||||
|
if (item.value.hasMatch(p4kIniKey)) {
|
||||||
|
item.key.valuesMap[p4kIniKey] = serverValue;
|
||||||
|
serverIniMap.remove(p4kIniKey);
|
||||||
|
continue iniKeysLoop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (unLocalization.valuesMap.isNotEmpty) {
|
||||||
|
classMap[unLocalization.id!] = unLocalization;
|
||||||
|
}
|
||||||
|
if (serverIniMap.isNotEmpty) {
|
||||||
|
for (var element in serverIniMap.keys) {
|
||||||
|
unClass.valuesMap[element] = serverIniMap[element] ?? "";
|
||||||
|
}
|
||||||
|
classMap[unClass.id!] = unClass;
|
||||||
|
}
|
||||||
|
return classMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, String> readIniAsMap(String iniString) {
|
||||||
|
final iniMap = <String, String>{};
|
||||||
|
for (final line in iniString.split("\n")) {
|
||||||
|
final index = line.indexOf("=");
|
||||||
|
if (index == -1) continue;
|
||||||
|
final key = line.substring(0, index).trim();
|
||||||
|
final value = line.substring(index + 1).trim();
|
||||||
|
iniMap[key] = value;
|
||||||
|
}
|
||||||
|
return iniMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<AppAdvancedLocalizationData> _readClassJson() async {
|
||||||
|
final s = await rootBundle.loadString("assets/advanced_localization.json");
|
||||||
|
return AppAdvancedLocalizationData.fromJson(json.decode(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<(String, String)> _readIni(LocalizationUIState localizationUIState,
|
||||||
|
LocalizationUIModel localizationUIModel) async {
|
||||||
|
final homeUIState = ref.read(homeUIModelProvider);
|
||||||
|
final gameDir = homeUIState.scInstalledPath;
|
||||||
|
if (gameDir == null) return ("", "");
|
||||||
|
state = state.copyWith(workingText: "读取 p4k 文件 ...");
|
||||||
|
final p4kGlobalIni = await readEnglishInI(gameDir);
|
||||||
|
dPrint("read p4kGlobalIni => ${p4kGlobalIni.length}");
|
||||||
|
state = state.copyWith(workingText: "获取汉化文本 ...");
|
||||||
|
final apiLocalizationData =
|
||||||
|
localizationUIState.apiLocalizationData?.values.firstOrNull;
|
||||||
|
if (apiLocalizationData == null) return ("", "");
|
||||||
|
final file = File(
|
||||||
|
"${localizationUIModel.getDownloadDir().absolute.path}\\${apiLocalizationData.versionName}.sclang");
|
||||||
|
if (!await file.exists()) {
|
||||||
|
await localizationUIModel.downloadLocalizationFile(
|
||||||
|
file, apiLocalizationData);
|
||||||
|
}
|
||||||
|
final serverGlobalIni =
|
||||||
|
(await compute(LocalizationUIModel.readArchive, file.absolute.path))
|
||||||
|
.toString();
|
||||||
|
dPrint("read serverGlobalIni => ${serverGlobalIni.length}");
|
||||||
|
return (p4kGlobalIni, serverGlobalIni);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> readEnglishInI(String gameDir) async {
|
||||||
|
final data = await Unp4kCModel.unp4kTools(
|
||||||
|
appGlobalState.applicationBinaryModuleDir!, [
|
||||||
|
"extract_memory",
|
||||||
|
"$gameDir\\Data.p4k",
|
||||||
|
"Data\\Localization\\english\\global.ini"
|
||||||
|
]);
|
||||||
|
final iniData = String.fromCharCodes(data);
|
||||||
|
return iniData;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,236 @@
|
|||||||
|
// coverage:ignore-file
|
||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||||
|
|
||||||
|
part of 'advanced_localization_ui_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// FreezedGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
T _$identity<T>(T value) => value;
|
||||||
|
|
||||||
|
final _privateConstructorUsedError = UnsupportedError(
|
||||||
|
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$AdvancedLocalizationUIState {
|
||||||
|
String get workingText => throw _privateConstructorUsedError;
|
||||||
|
Map<String, AppAdvancedLocalizationClassKeysData>? get classMap =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
String? get p4kGlobalIni => throw _privateConstructorUsedError;
|
||||||
|
String? get serverGlobalIni => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
@JsonKey(ignore: true)
|
||||||
|
$AdvancedLocalizationUIStateCopyWith<AdvancedLocalizationUIState>
|
||||||
|
get copyWith => throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $AdvancedLocalizationUIStateCopyWith<$Res> {
|
||||||
|
factory $AdvancedLocalizationUIStateCopyWith(
|
||||||
|
AdvancedLocalizationUIState value,
|
||||||
|
$Res Function(AdvancedLocalizationUIState) then) =
|
||||||
|
_$AdvancedLocalizationUIStateCopyWithImpl<$Res,
|
||||||
|
AdvancedLocalizationUIState>;
|
||||||
|
@useResult
|
||||||
|
$Res call(
|
||||||
|
{String workingText,
|
||||||
|
Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
|
||||||
|
String? p4kGlobalIni,
|
||||||
|
String? serverGlobalIni});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$AdvancedLocalizationUIStateCopyWithImpl<$Res,
|
||||||
|
$Val extends AdvancedLocalizationUIState>
|
||||||
|
implements $AdvancedLocalizationUIStateCopyWith<$Res> {
|
||||||
|
_$AdvancedLocalizationUIStateCopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? workingText = null,
|
||||||
|
Object? classMap = freezed,
|
||||||
|
Object? p4kGlobalIni = freezed,
|
||||||
|
Object? serverGlobalIni = freezed,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
workingText: null == workingText
|
||||||
|
? _value.workingText
|
||||||
|
: workingText // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
classMap: freezed == classMap
|
||||||
|
? _value.classMap
|
||||||
|
: classMap // ignore: cast_nullable_to_non_nullable
|
||||||
|
as Map<String, AppAdvancedLocalizationClassKeysData>?,
|
||||||
|
p4kGlobalIni: freezed == p4kGlobalIni
|
||||||
|
? _value.p4kGlobalIni
|
||||||
|
: p4kGlobalIni // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,
|
||||||
|
serverGlobalIni: freezed == serverGlobalIni
|
||||||
|
? _value.serverGlobalIni
|
||||||
|
: serverGlobalIni // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$AdvancedLocalizationUIStateImplCopyWith<$Res>
|
||||||
|
implements $AdvancedLocalizationUIStateCopyWith<$Res> {
|
||||||
|
factory _$$AdvancedLocalizationUIStateImplCopyWith(
|
||||||
|
_$AdvancedLocalizationUIStateImpl value,
|
||||||
|
$Res Function(_$AdvancedLocalizationUIStateImpl) then) =
|
||||||
|
__$$AdvancedLocalizationUIStateImplCopyWithImpl<$Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call(
|
||||||
|
{String workingText,
|
||||||
|
Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
|
||||||
|
String? p4kGlobalIni,
|
||||||
|
String? serverGlobalIni});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$AdvancedLocalizationUIStateImplCopyWithImpl<$Res>
|
||||||
|
extends _$AdvancedLocalizationUIStateCopyWithImpl<$Res,
|
||||||
|
_$AdvancedLocalizationUIStateImpl>
|
||||||
|
implements _$$AdvancedLocalizationUIStateImplCopyWith<$Res> {
|
||||||
|
__$$AdvancedLocalizationUIStateImplCopyWithImpl(
|
||||||
|
_$AdvancedLocalizationUIStateImpl _value,
|
||||||
|
$Res Function(_$AdvancedLocalizationUIStateImpl) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? workingText = null,
|
||||||
|
Object? classMap = freezed,
|
||||||
|
Object? p4kGlobalIni = freezed,
|
||||||
|
Object? serverGlobalIni = freezed,
|
||||||
|
}) {
|
||||||
|
return _then(_$AdvancedLocalizationUIStateImpl(
|
||||||
|
workingText: null == workingText
|
||||||
|
? _value.workingText
|
||||||
|
: workingText // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
classMap: freezed == classMap
|
||||||
|
? _value._classMap
|
||||||
|
: classMap // ignore: cast_nullable_to_non_nullable
|
||||||
|
as Map<String, AppAdvancedLocalizationClassKeysData>?,
|
||||||
|
p4kGlobalIni: freezed == p4kGlobalIni
|
||||||
|
? _value.p4kGlobalIni
|
||||||
|
: p4kGlobalIni // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,
|
||||||
|
serverGlobalIni: freezed == serverGlobalIni
|
||||||
|
? _value.serverGlobalIni
|
||||||
|
: serverGlobalIni // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
|
||||||
|
class _$AdvancedLocalizationUIStateImpl
|
||||||
|
with DiagnosticableTreeMixin
|
||||||
|
implements _AdvancedLocalizationUIState {
|
||||||
|
_$AdvancedLocalizationUIStateImpl(
|
||||||
|
{this.workingText = "",
|
||||||
|
final Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
|
||||||
|
this.p4kGlobalIni,
|
||||||
|
this.serverGlobalIni})
|
||||||
|
: _classMap = classMap;
|
||||||
|
|
||||||
|
@override
|
||||||
|
@JsonKey()
|
||||||
|
final String workingText;
|
||||||
|
final Map<String, AppAdvancedLocalizationClassKeysData>? _classMap;
|
||||||
|
@override
|
||||||
|
Map<String, AppAdvancedLocalizationClassKeysData>? get classMap {
|
||||||
|
final value = _classMap;
|
||||||
|
if (value == null) return null;
|
||||||
|
if (_classMap is EqualUnmodifiableMapView) return _classMap;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableMapView(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
final String? p4kGlobalIni;
|
||||||
|
@override
|
||||||
|
final String? serverGlobalIni;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
|
||||||
|
return 'AdvancedLocalizationUIState(workingText: $workingText, classMap: $classMap, p4kGlobalIni: $p4kGlobalIni, serverGlobalIni: $serverGlobalIni)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
||||||
|
super.debugFillProperties(properties);
|
||||||
|
properties
|
||||||
|
..add(DiagnosticsProperty('type', 'AdvancedLocalizationUIState'))
|
||||||
|
..add(DiagnosticsProperty('workingText', workingText))
|
||||||
|
..add(DiagnosticsProperty('classMap', classMap))
|
||||||
|
..add(DiagnosticsProperty('p4kGlobalIni', p4kGlobalIni))
|
||||||
|
..add(DiagnosticsProperty('serverGlobalIni', serverGlobalIni));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$AdvancedLocalizationUIStateImpl &&
|
||||||
|
(identical(other.workingText, workingText) ||
|
||||||
|
other.workingText == workingText) &&
|
||||||
|
const DeepCollectionEquality().equals(other._classMap, _classMap) &&
|
||||||
|
(identical(other.p4kGlobalIni, p4kGlobalIni) ||
|
||||||
|
other.p4kGlobalIni == p4kGlobalIni) &&
|
||||||
|
(identical(other.serverGlobalIni, serverGlobalIni) ||
|
||||||
|
other.serverGlobalIni == serverGlobalIni));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(
|
||||||
|
runtimeType,
|
||||||
|
workingText,
|
||||||
|
const DeepCollectionEquality().hash(_classMap),
|
||||||
|
p4kGlobalIni,
|
||||||
|
serverGlobalIni);
|
||||||
|
|
||||||
|
@JsonKey(ignore: true)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$AdvancedLocalizationUIStateImplCopyWith<_$AdvancedLocalizationUIStateImpl>
|
||||||
|
get copyWith => __$$AdvancedLocalizationUIStateImplCopyWithImpl<
|
||||||
|
_$AdvancedLocalizationUIStateImpl>(this, _$identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _AdvancedLocalizationUIState
|
||||||
|
implements AdvancedLocalizationUIState {
|
||||||
|
factory _AdvancedLocalizationUIState(
|
||||||
|
{final String workingText,
|
||||||
|
final Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
|
||||||
|
final String? p4kGlobalIni,
|
||||||
|
final String? serverGlobalIni}) = _$AdvancedLocalizationUIStateImpl;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get workingText;
|
||||||
|
@override
|
||||||
|
Map<String, AppAdvancedLocalizationClassKeysData>? get classMap;
|
||||||
|
@override
|
||||||
|
String? get p4kGlobalIni;
|
||||||
|
@override
|
||||||
|
String? get serverGlobalIni;
|
||||||
|
@override
|
||||||
|
@JsonKey(ignore: true)
|
||||||
|
_$$AdvancedLocalizationUIStateImplCopyWith<_$AdvancedLocalizationUIStateImpl>
|
||||||
|
get copyWith => throw _privateConstructorUsedError;
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'advanced_localization_ui_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// RiverpodGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
String _$advancedLocalizationUIModelHash() =>
|
||||||
|
r'2bb7dfc3cd8d45ecf5056083627136ad5cb7a285';
|
||||||
|
|
||||||
|
/// See also [AdvancedLocalizationUIModel].
|
||||||
|
@ProviderFor(AdvancedLocalizationUIModel)
|
||||||
|
final advancedLocalizationUIModelProvider = AutoDisposeNotifierProvider<
|
||||||
|
AdvancedLocalizationUIModel, AdvancedLocalizationUIState>.internal(
|
||||||
|
AdvancedLocalizationUIModel.new,
|
||||||
|
name: r'advancedLocalizationUIModelProvider',
|
||||||
|
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$advancedLocalizationUIModelHash,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef _$AdvancedLocalizationUIModel
|
||||||
|
= AutoDisposeNotifier<AdvancedLocalizationUIState>;
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
@ -2,6 +2,7 @@ import 'package:fluent_ui/fluent_ui.dart';
|
|||||||
import 'package:flutter_hooks/flutter_hooks.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:flutter_tilt/flutter_tilt.dart';
|
import 'package:flutter_tilt/flutter_tilt.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:starcitizen_doctor/data/sc_localization_data.dart';
|
import 'package:starcitizen_doctor/data/sc_localization_data.dart';
|
||||||
import 'package:starcitizen_doctor/ui/tools/tools_ui_model.dart';
|
import 'package:starcitizen_doctor/ui/tools/tools_ui_model.dart';
|
||||||
@ -145,7 +146,7 @@ class LocalizationDialogUI extends HookConsumerWidget {
|
|||||||
],
|
],
|
||||||
context,
|
context,
|
||||||
gridViewMode: true),
|
gridViewMode: true),
|
||||||
makeToolsListContainer(context, model),
|
makeToolsListContainer(context, model, state),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -445,8 +446,8 @@ class LocalizationDialogUI extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget makeToolsListContainer(
|
Widget makeToolsListContainer(BuildContext context, LocalizationUIModel model,
|
||||||
BuildContext context, LocalizationUIModel model) {
|
LocalizationUIState state) {
|
||||||
final toolsMenu = {
|
final toolsMenu = {
|
||||||
"launcher_mod": (
|
"launcher_mod": (
|
||||||
const Icon(FluentIcons.c_plus_plus, size: 24),
|
const Icon(FluentIcons.c_plus_plus, size: 24),
|
||||||
@ -462,21 +463,29 @@ class LocalizationDialogUI extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
final enableTap = state.workingVersion.isEmpty;
|
||||||
|
|
||||||
return makeListContainer(
|
return makeListContainer(
|
||||||
"汉化工具",
|
"汉化工具",
|
||||||
[
|
[
|
||||||
for (final item in toolsMenu.entries)
|
for (final item in toolsMenu.entries)
|
||||||
Tilt(
|
Tilt(
|
||||||
|
disable: !enableTap,
|
||||||
shadowConfig: const ShadowConfig(maxIntensity: .3),
|
shadowConfig: const ShadowConfig(maxIntensity: .3),
|
||||||
borderRadius: BorderRadius.circular(7),
|
borderRadius: BorderRadius.circular(7),
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onTap: () async {
|
onTap: enableTap
|
||||||
|
? () async {
|
||||||
switch (item.key) {
|
switch (item.key) {
|
||||||
case "launcher_mod":
|
case "launcher_mod":
|
||||||
ToolsUIModel.rsiEnhance(context);
|
ToolsUIModel.rsiEnhance(context);
|
||||||
break;
|
break;
|
||||||
|
case "advanced":
|
||||||
|
context.push("/index/advanced_localization");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
: null,
|
||||||
child: Container(
|
child: Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: FluentTheme.of(context).cardColor,
|
color: FluentTheme.of(context).cardColor,
|
||||||
|
@ -17,7 +17,6 @@ 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/sc_localization_data.dart';
|
import 'package:starcitizen_doctor/data/sc_localization_data.dart';
|
||||||
import 'package:starcitizen_doctor/generated/no_l10n_strings.dart';
|
import 'package:starcitizen_doctor/generated/no_l10n_strings.dart';
|
||||||
import 'package:starcitizen_doctor/provider/unp4kc.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/widgets/widgets.dart';
|
import 'package:starcitizen_doctor/widgets/widgets.dart';
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
@ -48,6 +47,8 @@ class LocalizationUIModel extends _$LocalizationUIModel {
|
|||||||
Directory get _downloadDir =>
|
Directory get _downloadDir =>
|
||||||
Directory("${appGlobalState.applicationSupportDir}\\Localizations");
|
Directory("${appGlobalState.applicationSupportDir}\\Localizations");
|
||||||
|
|
||||||
|
Directory getDownloadDir() => _downloadDir;
|
||||||
|
|
||||||
Directory get _scDataDir =>
|
Directory get _scDataDir =>
|
||||||
Directory("${ref.read(homeUIModelProvider).scInstalledPath}\\data");
|
Directory("${ref.read(homeUIModelProvider).scInstalledPath}\\data");
|
||||||
|
|
||||||
@ -79,17 +80,6 @@ class LocalizationUIModel extends _$LocalizationUIModel {
|
|||||||
await _loadData();
|
await _loadData();
|
||||||
}
|
}
|
||||||
|
|
||||||
readEnglishInI() async {
|
|
||||||
final data = await Unp4kCModel.unp4kTools(
|
|
||||||
appGlobalState.applicationBinaryModuleDir!, [
|
|
||||||
"extract_memory",
|
|
||||||
"$_scInstallPath\\Data.p4k",
|
|
||||||
"Data\\Localization\\english\\global.ini"
|
|
||||||
]);
|
|
||||||
final iniData = String.fromCharCodes(data);
|
|
||||||
dPrint("read english ini => ${iniData.length}");
|
|
||||||
}
|
|
||||||
|
|
||||||
final Map<String, Map<String, ScLocalizationData>>
|
final Map<String, Map<String, ScLocalizationData>>
|
||||||
_allVersionLocalizationData = {};
|
_allVersionLocalizationData = {};
|
||||||
|
|
||||||
@ -268,27 +258,20 @@ class LocalizationUIModel extends _$LocalizationUIModel {
|
|||||||
BuildContext context, ScLocalizationData value) {
|
BuildContext context, ScLocalizationData value) {
|
||||||
return () async {
|
return () async {
|
||||||
AnalyticsApi.touch("install_localization");
|
AnalyticsApi.touch("install_localization");
|
||||||
final downloadUrl =
|
|
||||||
"${URLConf.gitlabLocalizationUrl}/archive/${value.versionName}.tar.gz";
|
|
||||||
final savePath =
|
final savePath =
|
||||||
File("${_downloadDir.absolute.path}\\${value.versionName}.sclang");
|
File("${_downloadDir.absolute.path}\\${value.versionName}.sclang");
|
||||||
try {
|
try {
|
||||||
state = state.copyWith(workingVersion: value.versionName!);
|
state = state.copyWith(workingVersion: value.versionName!);
|
||||||
if (!await savePath.exists()) {
|
if (!await savePath.exists()) {
|
||||||
// download
|
// download
|
||||||
dPrint("downloading file to $savePath");
|
await downloadLocalizationFile(savePath, value);
|
||||||
final r = await RSHttp.get(downloadUrl);
|
|
||||||
if (r.statusCode == 200 && r.data != null) {
|
|
||||||
await savePath.writeAsBytes(r.data!);
|
|
||||||
} else {
|
|
||||||
throw "statusCode Error : ${r.statusCode}";
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
dPrint("use cache $savePath");
|
dPrint("use cache $savePath");
|
||||||
}
|
}
|
||||||
await Future.delayed(const Duration(milliseconds: 300));
|
await Future.delayed(const Duration(milliseconds: 300));
|
||||||
// check file
|
// check file
|
||||||
final globalIni = await compute(_readArchive, savePath.absolute.path);
|
final globalIni = await compute(readArchive, savePath.absolute.path);
|
||||||
if (globalIni.isEmpty) {
|
if (globalIni.isEmpty) {
|
||||||
throw S.current.localization_info_corrupted_file;
|
throw S.current.localization_info_corrupted_file;
|
||||||
}
|
}
|
||||||
@ -303,7 +286,20 @@ class LocalizationUIModel extends _$LocalizationUIModel {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static StringBuffer _readArchive(String savePath) {
|
Future<void> downloadLocalizationFile(
|
||||||
|
File savePath, ScLocalizationData value) async {
|
||||||
|
dPrint("downloading file to $savePath");
|
||||||
|
final downloadUrl =
|
||||||
|
"${URLConf.gitlabLocalizationUrl}/archive/${value.versionName}.tar.gz";
|
||||||
|
final r = await RSHttp.get(downloadUrl);
|
||||||
|
if (r.statusCode == 200 && r.data != null) {
|
||||||
|
await savePath.writeAsBytes(r.data!);
|
||||||
|
} else {
|
||||||
|
throw "statusCode Error : ${r.statusCode}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static StringBuffer readArchive(String savePath) {
|
||||||
final inputStream = InputFileStream(savePath);
|
final inputStream = InputFileStream(savePath);
|
||||||
final archive =
|
final archive =
|
||||||
TarDecoder().decodeBytes(GZipDecoder().decodeBuffer(inputStream));
|
TarDecoder().decodeBytes(GZipDecoder().decodeBuffer(inputStream));
|
||||||
|
@ -7,7 +7,7 @@ part of 'localization_ui_model.dart';
|
|||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$localizationUIModelHash() =>
|
String _$localizationUIModelHash() =>
|
||||||
r'a4e33b337db587ad3e766450d9bd8ac4aa7b4c49';
|
r'ed47da78fdc6adac904a17909f111640ac84563e';
|
||||||
|
|
||||||
/// See also [LocalizationUIModel].
|
/// See also [LocalizationUIModel].
|
||||||
@ProviderFor(LocalizationUIModel)
|
@ProviderFor(LocalizationUIModel)
|
||||||
|
@ -6,7 +6,7 @@ part of 'tools_ui_model.dart';
|
|||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$toolsUIModelHash() => r'6cf170210fa7a7c2c63bde9d0920c64a20a81263';
|
String _$toolsUIModelHash() => r'4c27a3df07cb000ac58b74b3da48d926d0b01ea8';
|
||||||
|
|
||||||
/// See also [ToolsUIModel].
|
/// See also [ToolsUIModel].
|
||||||
@ProviderFor(ToolsUIModel)
|
@ProviderFor(ToolsUIModel)
|
||||||
|
Loading…
Reference in New Issue
Block a user