feat: internationalization

This commit is contained in:
2025-04-22 21:34:55 +00:00
parent 58c692a879
commit ce03668252
36 changed files with 1069 additions and 563 deletions

View File

@ -65,7 +65,7 @@ pub async fn startline(app: AppHandle, refresh: bool) -> Result<(), String> {
let mut amd_dlls = Vec::new();
if let Some(p) = &appd.profile {
hash = appd.sum_packages(p);
(game_dlls, amd_dlls) = prepare_dlls(p.mod_pkgs(), &appd.pkgs).map_err(|e| e.to_string())?
(game_dlls, amd_dlls) = prepare_dlls(p.meta.game, p.mod_pkgs(), &appd.pkgs).map_err(|e| e.to_string())?
}
if let Some(p) = &appd.profile {
log::debug!("{}", hash);

View File

@ -71,10 +71,17 @@ impl Game {
pub fn has_module(&self, module: ProfileModule) -> bool {
match self {
Game::Ongeki => make_bitflags!(ProfileModule::{Segatools | Display | Network | BepInEx | Mu3Ini | Keyboard}),
Game::Ongeki => make_bitflags!(ProfileModule::{Segatools | Display | Network | BepInEx | Mu3Ini | Keyboard | Mempatcher}),
Game::Chunithm => make_bitflags!(ProfileModule::{Segatools | Display | Network | Keyboard | Mempatcher}),
}.contains(module)
}
pub fn bitness(&self) -> i32 {
match self {
Game::Ongeki => 64,
Game::Chunithm => 32,
}
}
}
impl std::fmt::Display for Game {

View File

@ -1,6 +1,7 @@
use anyhow::Result;
use std::collections::BTreeSet;
use std::path::PathBuf;
use crate::model::misc::Game;
use crate::pkg::{PkgKey, Status};
use crate::pkg_store::PackageStore;
use crate::util;
@ -60,6 +61,7 @@ pub async fn prepare_packages<'a>(p: &'a impl ProfilePaths, pkgs: &BTreeSet<PkgK
}
pub fn prepare_dlls(
game: Game,
enabled_pkgs: &BTreeSet<PkgKey>,
store: &PackageStore,
) -> Result<(Vec<PathBuf>, Vec<PathBuf>)> {
@ -72,6 +74,16 @@ pub fn prepare_dlls(
if let Some(game_dll) = &dlls.game {
res_game.push(pkg.path().join(game_dll.clone()));
}
if let Some(game32_dll) = &dlls.game32 {
if game.bitness() == 32 {
res_game.push(pkg.path().join(game32_dll.clone()));
}
}
if let Some(game64_dll) = &dlls.game64 {
if game.bitness() == 64 {
res_game.push(pkg.path().join(game64_dll.clone()));
}
}
if let Some(amd_dll) = &dlls.amd {
res_amd.push(pkg.path().join(amd_dll.clone()));
}

View File

@ -12,6 +12,7 @@ impl PatchFileVec {
std::fs::create_dir(&path)?;
}
std::fs::write(path.join("builtin-chunithm.json5"), include_bytes!("../static/standard-chunithm.json5"))?;
std::fs::write(path.join("builtin-amdaemon.json5"), include_bytes!("../static/standard-amdaemon.json5"))?;
let mut res = Vec::new();
for f in std::fs::read_dir(path)? {
let f = f?;

View File

@ -41,6 +41,8 @@ pub enum Status {
#[derive(Clone, PartialEq, Serialize, Deserialize, Debug)]
pub struct DLLs {
pub game: Option<String>,
pub game32: Option<String>,
pub game64: Option<String>,
pub amd: Option<String>
}
@ -231,10 +233,12 @@ impl Package {
if dir.as_ref().join("app").join("data").exists() {
return Status::Unsupported;
}
return Status::OK(make_bitflags!(Feature::Mod), DLLs { game: None, amd: None });
return Status::OK(make_bitflags!(Feature::Mod), DLLs { game: None, game32: None, game64: None, amd: None });
} else {
let mut flags = BitFlags::default();
let mut game_dll = None;
let mut game32_dll = None;
let mut game64_dll = None;
let mut amd_dll = None;
for installer in &mft.installers {
if let Some(serde_json::Value::String(id)) = installer.get("identifier") {
@ -262,6 +266,16 @@ impl Package {
flags |= Feature::Mod;
game_dll = Some(path.to_owned());
}
if let Some(serde_json::Value::String(path)) = installer.get("dll-game32") {
flags |= Feature::GameDLL;
flags |= Feature::Mod;
game32_dll = Some(path.to_owned());
}
if let Some(serde_json::Value::String(path)) = installer.get("dll-game64") {
flags |= Feature::GameDLL;
flags |= Feature::Mod;
game64_dll = Some(path.to_owned());
}
if let Some(serde_json::Value::String(path)) = installer.get("dll-amdaemon") {
flags |= Feature::AmdDLL;
flags |= Feature::Mod;
@ -272,8 +286,8 @@ impl Package {
}
}
}
log::debug!("{} parse result: {:?} {:?} {:?}", mft.name, flags, game_dll, amd_dll);
Status::OK(flags, DLLs { game: game_dll, amd: amd_dll })
log::debug!("{} parse result: {:?} {:?} {:?} {:?} {:?}", mft.name, flags, game_dll, game32_dll, game64_dll, amd_dll);
Status::OK(flags, DLLs { game: game_dll, game32: game32_dll, game64: game64_dll, amd: amd_dll })
}
}

View File

@ -36,7 +36,7 @@ impl Profile {
} else {
Some(Keyboard::Chunithm(ChunithmKeyboard::default()))
},
patches: if meta.game == Game::Chunithm { Some(PatchSelection(BTreeMap::new())) } else { None }
patches: Some(PatchSelection(BTreeMap::new()))
},
meta: meta.clone()
};
@ -78,6 +78,9 @@ impl Profile {
} else {
data.mu3_ini = Some(Mu3Ini::default());
}
if data.patches.is_none() {
data.patches = Some(PatchSelection(BTreeMap::new()));
}
Self::load_existing_mu3_ini(&data, &ProfileMeta { game, name: name.clone() })?;
}