aboutsummaryrefslogtreecommitdiff
path: root/locale
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-09-03 18:21:17 +0200
committermetamuffin <metamuffin@disroot.org>2024-09-03 18:21:17 +0200
commit5c1f99fe6c5286d9fad42fff6ae5849143c4b1e0 (patch)
tree1729935dcf7a8d2f42b49c9f497111704a328b36 /locale
parentb13b1e5e1d477cf0c125320c4553348c49c11e83 (diff)
downloadhurrycurry-5c1f99fe6c5286d9fad42fff6ae5849143c4b1e0.tar
hurrycurry-5c1f99fe6c5286d9fad42fff6ae5849143c4b1e0.tar.bz2
hurrycurry-5c1f99fe6c5286d9fad42fff6ae5849143c4b1e0.tar.zst
generate po from ini
Diffstat (limited to 'locale')
-rw-r--r--locale/tools/src/main.rs84
1 files changed, 83 insertions, 1 deletions
diff --git a/locale/tools/src/main.rs b/locale/tools/src/main.rs
index 017d9d74..de11cd35 100644
--- a/locale/tools/src/main.rs
+++ b/locale/tools/src/main.rs
@@ -5,7 +5,7 @@ use std::{
collections::BTreeMap,
fs::{read_to_string, File},
io::Write,
- path::PathBuf,
+ path::{Path, PathBuf},
};
#[derive(Parser)]
@@ -19,11 +19,82 @@ enum Args {
input: PathBuf,
output: PathBuf,
},
+ ExportGodotCsv {
+ input_dir: PathBuf,
+ output: PathBuf,
+ },
+ ExportPo {
+ input: PathBuf,
+ output: PathBuf,
+ },
}
fn main() -> Result<()> {
let args = Args::parse();
match args {
+ Args::ExportPo { input, output } => {
+ let ini = load_ini(&input)?;
+
+ File::create(output)?.write_all(
+ ini.into_iter()
+ .map(|(key, value)| {
+ format!(
+ "msgid {}\nmsgstr{}\n",
+ serde_json::to_string(&key).unwrap(),
+ serde_json::to_string(&value).unwrap(),
+ )
+ })
+ .collect::<String>()
+ .as_bytes(),
+ )?;
+ Ok(())
+ }
+ Args::ExportGodotCsv { input_dir, output } => {
+ let translations = input_dir
+ .read_dir()?
+ .flat_map(|e| {
+ e.map_err(|e| anyhow!("{e}"))
+ .and_then(|e| {
+ if e.file_name().to_string_lossy().ends_with(".ini") {
+ Ok(Some((
+ e.path().file_stem().unwrap().to_str().unwrap().to_string(),
+ load_ini(&e.path())?,
+ )))
+ } else {
+ Ok(None)
+ }
+ })
+ .transpose()
+ })
+ .try_collect::<BTreeMap<_, _>>()?;
+
+ let langs = translations.keys().cloned().collect::<Vec<String>>();
+ let mut tr_tr = BTreeMap::<String, BTreeMap<String, String>>::new();
+ for (k, v) in translations {
+ for (kk, vv) in v {
+ tr_tr.entry(kk).or_default().insert(k.clone(), vv);
+ }
+ }
+
+ File::create(output)?.write_all(
+ format!(
+ "id,{}\n{}",
+ langs.join(","),
+ tr_tr
+ .into_iter()
+ .map(|(k, v)| format!(
+ "{k},{}\n",
+ v.values()
+ .map(|s| serde_json::to_string(s).unwrap())
+ .collect::<Vec<_>>()
+ .join(",")
+ ))
+ .collect::<String>()
+ )
+ .as_bytes(),
+ )?;
+ Ok(())
+ }
Args::ImportOldPo {
reference,
input,
@@ -159,3 +230,14 @@ fn main() -> Result<()> {
}
}
}
+
+fn load_ini(path: &Path) -> Result<BTreeMap<String, String>> {
+ Ok(read_to_string(path)?
+ .lines()
+ .skip(1)
+ .map(|l| {
+ let (k, v) = l.split_once("=").ok_or(anyhow!("'=' missing"))?;
+ Ok::<_, anyhow::Error>((k.to_owned(), v.replace("\\n", "\n")))
+ })
+ .try_collect()?)
+}