diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-07-10 20:31:57 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-08-11 22:04:43 +0000 |
| commit | 5ff21d92bc25102e770547ed29f88a5521a45c26 (patch) | |
| tree | fb9d4f53dcfd17a8e34ad4c7faabc1de5fca81b7 /android | |
| parent | b0dc31066f83252a6bc8559e24549cfd6be1c97b (diff) | |
| download | mullvadvpn-5ff21d92bc25102e770547ed29f88a5521a45c26.tar.xz mullvadvpn-5ff21d92bc25102e770547ed29f88a5521a45c26.zip | |
Load gettext message files
Diffstat (limited to 'android')
| -rw-r--r-- | android/translations-converter/src/gettext.rs | 49 | ||||
| -rw-r--r-- | android/translations-converter/src/main.rs | 17 |
2 files changed, 64 insertions, 2 deletions
diff --git a/android/translations-converter/src/gettext.rs b/android/translations-converter/src/gettext.rs new file mode 100644 index 0000000000..bbec6bb798 --- /dev/null +++ b/android/translations-converter/src/gettext.rs @@ -0,0 +1,49 @@ +use std::{ + fs::File, + io::{BufRead, BufReader}, + path::Path, +}; + +/// A message entry in a gettext translation file. +#[derive(Clone, Debug)] +pub struct MsgEntry { + pub id: String, + pub value: String, +} + +/// Load message entries from a gettext translation file. +pub fn load_file(file_path: impl AsRef<Path>) -> Vec<MsgEntry> { + let mut entries = Vec::new(); + let mut current_id = None; + let file = BufReader::new(File::open(file_path).expect("Failed to open gettext file")); + + for line in file.lines() { + let line = line.expect("Failed to read from gettext file"); + let line = line.trim(); + + if let Some(msg_id) = parse_line(line, "msgid \"", "\"") { + current_id = Some(msg_id); + } else { + if let Some(value) = parse_line(line, "msgstr \"", "\"") { + if let Some(id) = current_id.take() { + entries.push(MsgEntry { id, value }); + } + } + + current_id = None; + } + } + + entries +} + +fn parse_line(line: &str, prefix: &str, suffix: &str) -> Option<String> { + if line.starts_with(prefix) && line.ends_with(suffix) { + let start = prefix.len(); + let end = line.len() - suffix.len(); + + Some(line[start..end].to_owned()) + } else { + None + } +} diff --git a/android/translations-converter/src/main.rs b/android/translations-converter/src/main.rs index 2b7741ada4..c38d903829 100644 --- a/android/translations-converter/src/main.rs +++ b/android/translations-converter/src/main.rs @@ -1,9 +1,13 @@ //! Helper tool to convert translations from gettext messages to Android string resources. mod android; +mod gettext; use regex::Regex; -use std::{collections::HashMap, fs::File}; +use std::{ + collections::HashMap, + fs::{self, File}, +}; fn main() { let strings_file = File::open("../src/main/res/values/strings.xml") @@ -23,5 +27,14 @@ fn main() { }) .collect(); - dbg!(known_strings); + let locale_files = fs::read_dir("../../gui/locales") + .expect("Failed to open root locale directory") + .filter_map(|dir_entry_result| dir_entry_result.ok().map(|dir_entry| dir_entry.path())) + .filter(|dir_entry_path| dir_entry_path.is_dir()) + .map(|dir_path| dir_path.join("messages.po")) + .filter(|file_path| file_path.exists()); + + for locale_file in locale_files { + dbg!(gettext::load_file(locale_file)); + } } |
