summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-08-19 21:53:14 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-08-24 19:19:38 +0000
commit259dd6d60386f58fec9c519724c84db6c7d020cb (patch)
tree93d329171f542ce06439c234aad0020e41236e93
parent9169de8c6284445e75897dd1abaccc150c181dcf (diff)
downloadmullvadvpn-259dd6d60386f58fec9c519724c84db6c7d020cb.tar.xz
mullvadvpn-259dd6d60386f58fec9c519724c84db6c7d020cb.zip
Add support for representing gettext plural forms
-rw-r--r--android/translations-converter/src/gettext.rs32
-rw-r--r--android/translations-converter/src/main.rs12
2 files changed, 36 insertions, 8 deletions
diff --git a/android/translations-converter/src/gettext.rs b/android/translations-converter/src/gettext.rs
index edd5fbd538..26abdbd577 100644
--- a/android/translations-converter/src/gettext.rs
+++ b/android/translations-converter/src/gettext.rs
@@ -15,7 +15,23 @@ lazy_static! {
#[derive(Clone, Debug)]
pub struct MsgEntry {
pub id: String,
- pub value: String,
+ pub value: MsgValue,
+}
+
+/// A message string or plural set in a gettext translation file.
+#[derive(Clone, Debug)]
+pub enum MsgValue {
+ Invariant(String),
+ Plural {
+ plural_id: String,
+ values: Vec<String>,
+ },
+}
+
+impl From<String> for MsgValue {
+ fn from(string: String) -> Self {
+ MsgValue::Invariant(string)
+ }
}
/// Load message entries from a gettext translation file.
@@ -36,7 +52,7 @@ pub fn load_file(file_path: impl AsRef<Path>) -> Vec<MsgEntry> {
} else {
if let Some(translation) = parse_line(line, "msgstr \"", "\"") {
if let Some(id) = current_id.take() {
- let value = normalize(translation);
+ let value = MsgValue::from(normalize(translation));
entries.push(MsgEntry { id, value });
}
@@ -65,7 +81,17 @@ pub fn append_to_template(
for entry in entries {
writeln!(writer)?;
writeln!(writer, "msgid {:?}", entry.id)?;
- writeln!(writer, "msgstr {:?}", entry.value)?;
+
+ match entry.value {
+ MsgValue::Invariant(value) => writeln!(writer, "msgstr {:?}", value)?,
+ MsgValue::Plural { plural_id, values } => {
+ writeln!(writer, "msgid_plural {:?}", plural_id)?;
+
+ for (index, value) in values.into_iter().enumerate() {
+ writeln!(writer, "msgstr[{}] {:?}", index, value)?;
+ }
+ }
+ }
}
Ok(())
diff --git a/android/translations-converter/src/main.rs b/android/translations-converter/src/main.rs
index d0cd0e36be..5b1e3f0d66 100644
--- a/android/translations-converter/src/main.rs
+++ b/android/translations-converter/src/main.rs
@@ -153,11 +153,13 @@ fn generate_translations(
let mut localized_resource = android::StringResources::new();
for translation in translations {
- if let Some(android_key) = known_strings.remove(&translation.id) {
- localized_resource.push(android::StringResource::new(
- android_key,
- &translation.value,
- ));
+ if let gettext::MsgValue::Invariant(translation_value) = translation.value {
+ if let Some(android_key) = known_strings.remove(&translation.id) {
+ localized_resource.push(android::StringResource::new(
+ android_key,
+ &translation_value,
+ ));
+ }
}
}