diff options
Diffstat (limited to 'locale/tools/src/main.rs')
-rw-r--r-- | locale/tools/src/main.rs | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/locale/tools/src/main.rs b/locale/tools/src/main.rs index de11cd35..401fbc63 100644 --- a/locale/tools/src/main.rs +++ b/locale/tools/src/main.rs @@ -24,6 +24,8 @@ enum Args { output: PathBuf, }, ExportPo { + #[arg(long)] + remap_ids: Option<PathBuf>, input: PathBuf, output: PathBuf, }, @@ -32,20 +34,41 @@ enum Args { fn main() -> Result<()> { let args = Args::parse(); match args { - Args::ExportPo { input, output } => { + Args::ExportPo { + remap_ids: id_map, + input, + output, + } => { let ini = load_ini(&input)?; + let id_map = id_map.map(|path| load_ini(&path)).transpose()?; 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(), + format!( + r#" +msgid "" +msgstr "" +"Language: {}\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +{}"#, + input.file_stem().unwrap().to_string_lossy(), + ini.into_iter() + .map(|(mut key, value)| { + if let Some(id_map) = &id_map { + if let Some(new_id) = id_map.get(&key) { + key = new_id.to_owned() + } + } + format!( + "msgid {}\nmsgstr {}\n\n", + serde_json::to_string(&key).unwrap(), + serde_json::to_string(&value).unwrap(), + ) + }) + .collect::<String>() + ) + .as_bytes(), )?; Ok(()) } |