summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-07-10 20:31:57 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-08-11 22:04:43 +0000
commit5ff21d92bc25102e770547ed29f88a5521a45c26 (patch)
treefb9d4f53dcfd17a8e34ad4c7faabc1de5fca81b7 /android
parentb0dc31066f83252a6bc8559e24549cfd6be1c97b (diff)
downloadmullvadvpn-5ff21d92bc25102e770547ed29f88a5521a45c26.tar.xz
mullvadvpn-5ff21d92bc25102e770547ed29f88a5521a45c26.zip
Load gettext message files
Diffstat (limited to 'android')
-rw-r--r--android/translations-converter/src/gettext.rs49
-rw-r--r--android/translations-converter/src/main.rs17
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));
+ }
}