diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-08-19 21:53:14 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-08-24 19:19:38 +0000 |
| commit | 259dd6d60386f58fec9c519724c84db6c7d020cb (patch) | |
| tree | 93d329171f542ce06439c234aad0020e41236e93 | |
| parent | 9169de8c6284445e75897dd1abaccc150c181dcf (diff) | |
| download | mullvadvpn-259dd6d60386f58fec9c519724c84db6c7d020cb.tar.xz mullvadvpn-259dd6d60386f58fec9c519724c84db6c7d020cb.zip | |
Add support for representing gettext plural forms
| -rw-r--r-- | android/translations-converter/src/gettext.rs | 32 | ||||
| -rw-r--r-- | android/translations-converter/src/main.rs | 12 |
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, + )); + } } } |
