summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-03-29 10:18:41 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-03-29 10:18:41 -0300
commit242bee0d8855e90eef90944efdf38538b00e6500 (patch)
tree9706c8751f2f1c9f114c7c889ca9c5c797b70e30
parent307507c0cabb11daa38023f75c57fd1f100870eb (diff)
parent2a4d0a1febd93c772f40a63ea3cf2256ab67bf94 (diff)
downloadmullvadvpn-242bee0d8855e90eef90944efdf38538b00e6500.tar.xz
mullvadvpn-242bee0d8855e90eef90944efdf38538b00e6500.zip
Merge branch 'add-ci-job-for-translations'
-rw-r--r--.github/workflows/daemon.yml3
-rw-r--r--.github/workflows/translations.yml50
-rw-r--r--android/src/main/res/values-da/strings.xml1
-rw-r--r--android/src/main/res/values-de/strings.xml1
-rw-r--r--android/src/main/res/values-es/strings.xml1
-rw-r--r--android/src/main/res/values-fi/strings.xml1
-rw-r--r--android/src/main/res/values-fr/strings.xml1
-rw-r--r--android/src/main/res/values-it/strings.xml1
-rw-r--r--android/src/main/res/values-ja/strings.xml1
-rw-r--r--android/src/main/res/values-ko/strings.xml1
-rw-r--r--android/src/main/res/values-nb/strings.xml3
-rw-r--r--android/src/main/res/values-nl/strings.xml1
-rw-r--r--android/src/main/res/values-pl/strings.xml1
-rw-r--r--android/src/main/res/values-pt/strings.xml1
-rw-r--r--android/src/main/res/values-ru/strings.xml1
-rw-r--r--android/src/main/res/values-sv/strings.xml1
-rw-r--r--android/src/main/res/values-th/strings.xml1
-rw-r--r--android/src/main/res/values-tr/strings.xml1
-rw-r--r--android/src/main/res/values-zh-rCN/strings.xml1
-rw-r--r--android/src/main/res/values-zh-rTW/strings.xml1
-rw-r--r--android/translations-converter/src/gettext.rs62
-rw-r--r--android/translations-converter/src/main.rs28
-rw-r--r--gui/locales/messages.pot180
23 files changed, 238 insertions, 105 deletions
diff --git a/.github/workflows/daemon.yml b/.github/workflows/daemon.yml
index e123d6e15a..49c983c259 100644
--- a/.github/workflows/daemon.yml
+++ b/.github/workflows/daemon.yml
@@ -5,7 +5,10 @@ on:
paths-ignore:
- '**/*.md'
- .github/workflows/android*.yml
+ - .github/workflows/frontend.yml
+ - .github/workflows/ios.yml
- .github/workflows/rustfmt.yml
+ - .github/workflows/translations.yml
- android/**
- audits/**
- ci/buildserver-*
diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml
new file mode 100644
index 0000000000..2b88426b0f
--- /dev/null
+++ b/.github/workflows/translations.yml
@@ -0,0 +1,50 @@
+name: Translation check CI
+on:
+ # Check whenever a file that affects Rust formatting is changed by a push
+ push:
+ paths:
+ - .github/workflows/translations.yml
+ - android/translations-converter/**
+ - android/src/**/plurals.xml
+ - android/src/**/strings.xml
+ - gui/**
+ # Check if requested manually from the Actions tab
+ workflow_dispatch:
+jobs:
+ check-translations:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ - name: Install Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: '12'
+
+ - name: Update NPM
+ run: npm i -g npm
+
+ - name: Install and cache JS dependencies
+ uses: bahmutov/npm-install@v1
+ with:
+ working-directory: gui
+ install-command: npm ci
+
+ - name: Install nightly Rust
+ uses: ATiltedTree/setup-rust@v1.0.4
+ with:
+ rust-version: stable
+
+ - name: Extract messages from desktop GUI
+ working-directory: gui/locales
+ run: npm run update-translations
+
+ - name: Convert translations into Android resources
+ working-directory: android/translations-converter
+ run: cargo run
+
+ - name: Check if repository is up to date
+ run: |
+ git diff
+ ! git status -s | grep .
diff --git a/android/src/main/res/values-da/strings.xml b/android/src/main/res/values-da/strings.xml
index 6db7260fdb..0059da65bc 100644
--- a/android/src/main/res/values-da/strings.xml
+++ b/android/src/main/res/values-da/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">OPDATERING TILGÆNGELIG</string>
<string name="update_available_footer">Opdatering tilgængelig, download den for at forblive sikker.</string>
<string name="user_email_hint">Din e-mail (valgfrit)</string>
- <string name="user_message_hint">Beskriv dit problem</string>
<string name="view_logs">Se app-logfiler</string>
<string name="virtual_adapter_problem">Fejl ved virtuel adapter</string>
<string name="voucher_already_used">Kuponkode er allerede brugt.</string>
diff --git a/android/src/main/res/values-de/strings.xml b/android/src/main/res/values-de/strings.xml
index 6015649ed6..59c81e727a 100644
--- a/android/src/main/res/values-de/strings.xml
+++ b/android/src/main/res/values-de/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">UPDATE VERFÜGBAR</string>
<string name="update_available_footer">Update verfügbar, laden Sie es herunter, um sicher zu bleiben.</string>
<string name="user_email_hint">Ihre E-Mail-Adresse (optional)</string>
- <string name="user_message_hint">Beschreiben Sie Ihr Problem</string>
<string name="view_logs">App-Protokolle anzeigen</string>
<string name="virtual_adapter_problem">Virtueller Adapterfehler</string>
<string name="voucher_already_used">Der Gutscheincode wurde bereits verwendet.</string>
diff --git a/android/src/main/res/values-es/strings.xml b/android/src/main/res/values-es/strings.xml
index 2ed781167c..2fddea62c5 100644
--- a/android/src/main/res/values-es/strings.xml
+++ b/android/src/main/res/values-es/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">ACTUALIZACIÓN DISPONIBLE</string>
<string name="update_available_footer">Actualización disponible, descárguela para garantizar su seguridad.</string>
<string name="user_email_hint">Su correo electrónico (opcional)</string>
- <string name="user_message_hint">Describa el problema</string>
<string name="view_logs">Ver registros de la aplicación</string>
<string name="virtual_adapter_problem">Error del adaptador virtual</string>
<string name="voucher_already_used">El código del cupón ya se ha usado.</string>
diff --git a/android/src/main/res/values-fi/strings.xml b/android/src/main/res/values-fi/strings.xml
index 191f4ef592..a0a89b5050 100644
--- a/android/src/main/res/values-fi/strings.xml
+++ b/android/src/main/res/values-fi/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">PÄIVITYS SAATAVILLA</string>
<string name="update_available_footer">Päivitys saatavilla. Lataa se pysyäksesi turvassa.</string>
<string name="user_email_hint">Sähköpostisi (valinnainen)</string>
- <string name="user_message_hint">Kuvaile ongelmaasi</string>
<string name="view_logs">Tarkastele sovelluslokeja</string>
<string name="virtual_adapter_problem">Virtuaalisovittimen virhe</string>
<string name="voucher_already_used">Kuponkikoodi on jo käytetty.</string>
diff --git a/android/src/main/res/values-fr/strings.xml b/android/src/main/res/values-fr/strings.xml
index 7ec7f702dd..7e7a3613b6 100644
--- a/android/src/main/res/values-fr/strings.xml
+++ b/android/src/main/res/values-fr/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">MISE À JOUR DISPONIBLE</string>
<string name="update_available_footer">Mise à jour disponible. Téléchargez-la pour rester en sécurité.</string>
<string name="user_email_hint">Votre e-mail (facultatif)</string>
- <string name="user_message_hint">Décrivez votre problème</string>
<string name="view_logs">Afficher les journaux de l\'application</string>
<string name="virtual_adapter_problem">Erreur d\'adaptateur virtuel</string>
<string name="voucher_already_used">Le code du bon a déjà été utilisé.</string>
diff --git a/android/src/main/res/values-it/strings.xml b/android/src/main/res/values-it/strings.xml
index fc866906e3..16a734ae73 100644
--- a/android/src/main/res/values-it/strings.xml
+++ b/android/src/main/res/values-it/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">AGGIORNAMENTO DISPONIBILE</string>
<string name="update_available_footer">Aggiornamento disponibile; scarica per rimanere protetto.</string>
<string name="user_email_hint">La tua e-mail (opzionale)</string>
- <string name="user_message_hint">Descrivi il tuo problema</string>
<string name="view_logs">Visualizza registri app</string>
<string name="virtual_adapter_problem">Errore scheda virtuale</string>
<string name="voucher_already_used">Il codice voucher è già stato utilizzato.</string>
diff --git a/android/src/main/res/values-ja/strings.xml b/android/src/main/res/values-ja/strings.xml
index 325f967527..e10cec9c2c 100644
--- a/android/src/main/res/values-ja/strings.xml
+++ b/android/src/main/res/values-ja/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">アップデート可</string>
<string name="update_available_footer">アップデートできます。ダウンロードしてセキュリティを維持してください。</string>
<string name="user_email_hint">あなたのメールアドレス(任意)</string>
- <string name="user_message_hint">問題の内容をご説明ください</string>
<string name="view_logs">アプリのログを表示</string>
<string name="virtual_adapter_problem">仮想アダプタエラー</string>
<string name="voucher_already_used">バウチャーコードはすでに使用されています。</string>
diff --git a/android/src/main/res/values-ko/strings.xml b/android/src/main/res/values-ko/strings.xml
index 3b763027c3..b2c3bb1cca 100644
--- a/android/src/main/res/values-ko/strings.xml
+++ b/android/src/main/res/values-ko/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">업데이트 사용 가능</string>
<string name="update_available_footer">업데이트 사용 가능, 안전을 유지하기 위해 다운로드하세요.</string>
<string name="user_email_hint">이메일(선택 사항)</string>
- <string name="user_message_hint">문제 설명</string>
<string name="view_logs">앱 로그 보기</string>
<string name="virtual_adapter_problem">가상 어댑터 오류</string>
<string name="voucher_already_used">이미 사용된 바우처 코드입니다.</string>
diff --git a/android/src/main/res/values-nb/strings.xml b/android/src/main/res/values-nb/strings.xml
index ecbf34198e..dc154a4cd0 100644
--- a/android/src/main/res/values-nb/strings.xml
+++ b/android/src/main/res/values-nb/strings.xml
@@ -54,7 +54,7 @@
<string name="failed_to_create_account">Kunne ikke opprette konto</string>
<string name="failed_to_generate_key">Generering av en nøkkel mislyktes</string>
<string name="failed_to_send">Kunne ikke sende</string>
- <string name="failed_to_send_details">Du må gå tilbake til hovedskjermen til appen og trykke på \\\"Koble fra\\\" før du kan prøve på nytt. Men det er ingen grunn til bekymring, informasjonen du har skrevet i skjemaet blir ikke borte.</string>
+ <string name="failed_to_send_details">Du må gå tilbake til hovedskjermen til appen og trykke på \"Koble fra\" før du kan prøve på nytt. Men det er ingen grunn til bekymring, informasjonen du har skrevet i skjemaet blir ikke borte.</string>
<string name="faqs_and_guides">Ofte stilte spørsmål og veiledninger</string>
<string name="faqs_and_guides_url">https://mullvad.net/nb/help/tag/mullvad-app/</string>
<string name="foreground_notification_channel_description">Viser gjeldende VPN-tunnelstatus</string>
@@ -115,7 +115,6 @@
<string name="update_available">OPPDATERING TILGJENGELIG</string>
<string name="update_available_footer">Oppdatering tilgjengelig. Last ned for å oppdatere sikkerheten.</string>
<string name="user_email_hint">E-post (valgfritt)</string>
- <string name="user_message_hint">Beskriv problemet</string>
<string name="view_logs">Se applogger</string>
<string name="virtual_adapter_problem">Virtuell adapterfeil</string>
<string name="voucher_already_used">Kupongkoden er allerede brukt.</string>
diff --git a/android/src/main/res/values-nl/strings.xml b/android/src/main/res/values-nl/strings.xml
index 6082f4fe3c..7d6979492d 100644
--- a/android/src/main/res/values-nl/strings.xml
+++ b/android/src/main/res/values-nl/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">UPDATE BESCHIKBAAR</string>
<string name="update_available_footer">Update beschikbaar, download deze voor optimale beveiliging.</string>
<string name="user_email_hint">Uw e-mailadres (optioneel)</string>
- <string name="user_message_hint">Beschrijf het probleem</string>
<string name="view_logs">Applogboeken weergeven</string>
<string name="virtual_adapter_problem">Fout virtuele adapter</string>
<string name="voucher_already_used">Vouchercode is al gebruikt.</string>
diff --git a/android/src/main/res/values-pl/strings.xml b/android/src/main/res/values-pl/strings.xml
index 90f162ddab..3e825a1e76 100644
--- a/android/src/main/res/values-pl/strings.xml
+++ b/android/src/main/res/values-pl/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">DOSTĘPNA JEST AKTUALIZACJA</string>
<string name="update_available_footer">Dostępna jest aktualizacja. Aby zachować bezpieczeństwo, pobierz ją.</string>
<string name="user_email_hint">Twój adres e-mail (opcjonalnie)</string>
- <string name="user_message_hint">Opisz problem</string>
<string name="view_logs">Wyświetl dzienniki aplikacji</string>
<string name="virtual_adapter_problem">Błąd wirtualnej karty sieciowej</string>
<string name="voucher_already_used">Kod z tego kuponu został już użyty.</string>
diff --git a/android/src/main/res/values-pt/strings.xml b/android/src/main/res/values-pt/strings.xml
index c16581d7ed..d05decf3b0 100644
--- a/android/src/main/res/values-pt/strings.xml
+++ b/android/src/main/res/values-pt/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">ESTÁ DISPONÍVEL UMA ATUALIZAÇÃO</string>
<string name="update_available_footer">Atualização disponível, transfira-a para ficar seguro.</string>
<string name="user_email_hint">O seu email (opcional)</string>
- <string name="user_message_hint">Descreva o seu problema</string>
<string name="view_logs">Ver os registos da app</string>
<string name="virtual_adapter_problem">Erro de adaptador virtual</string>
<string name="voucher_already_used">O código do voucher já foi utilizado.</string>
diff --git a/android/src/main/res/values-ru/strings.xml b/android/src/main/res/values-ru/strings.xml
index ede1419eed..1a6d884150 100644
--- a/android/src/main/res/values-ru/strings.xml
+++ b/android/src/main/res/values-ru/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">ЕСТЬ ОБНОВЛЕНИЕ</string>
<string name="update_available_footer">Есть обновление. Чтобы оставаться в безопасности, обновитесь.</string>
<string name="user_email_hint">Ваша электронная почта (необязательно)</string>
- <string name="user_message_hint">Опишите проблему</string>
<string name="view_logs">Открыть журналы</string>
<string name="virtual_adapter_problem">Ошибка виртуального адаптера</string>
<string name="voucher_already_used">Этот код ваучера уже использовался.</string>
diff --git a/android/src/main/res/values-sv/strings.xml b/android/src/main/res/values-sv/strings.xml
index 443bb5dd22..55a5110215 100644
--- a/android/src/main/res/values-sv/strings.xml
+++ b/android/src/main/res/values-sv/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">UPPDATERING TILLGÄNGLIG</string>
<string name="update_available_footer">Uppdatering tillgänglig. Ladda ned för att vara säker.</string>
<string name="user_email_hint">Din e-postadress (valfritt)</string>
- <string name="user_message_hint">Beskriv ditt problem</string>
<string name="view_logs">Visa appens loggar</string>
<string name="virtual_adapter_problem">Fel med virtuell adapter</string>
<string name="voucher_already_used">Kupongkoden har redan använts.</string>
diff --git a/android/src/main/res/values-th/strings.xml b/android/src/main/res/values-th/strings.xml
index 11f3de5cd9..e6e474296b 100644
--- a/android/src/main/res/values-th/strings.xml
+++ b/android/src/main/res/values-th/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">มีการอัปเดตให้ใช้งาน</string>
<string name="update_available_footer">มีการอัปเดตให้ใช้งาน ดาวน์โหลดเพื่อยกระดับความปลอดภัย</string>
<string name="user_email_hint">อีเมลของคุณ (ไม่บังคับ)</string>
- <string name="user_message_hint">ระบุปัญหาของคุณ</string>
<string name="view_logs">ดูบันทึกของแอป</string>
<string name="virtual_adapter_problem">ข้อผิดพลาดของอะแดปเตอร์เสมือน</string>
<string name="voucher_already_used">รหัสบัตรกำนัลถูกใช้ไปแล้ว</string>
diff --git a/android/src/main/res/values-tr/strings.xml b/android/src/main/res/values-tr/strings.xml
index c637161fab..cff14469b0 100644
--- a/android/src/main/res/values-tr/strings.xml
+++ b/android/src/main/res/values-tr/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">GÜNCELLEME MEVCUT</string>
<string name="update_available_footer">Güncelleme mevcut, güvende olmak için indirin.</string>
<string name="user_email_hint">E-posta adresiniz (isteğe bağlı)</string>
- <string name="user_message_hint">Sorununuzu açıklayın</string>
<string name="view_logs">Uygulama kayıtlarını görüntüle</string>
<string name="virtual_adapter_problem">Sanal adaptör hatası</string>
<string name="voucher_already_used">Kupon kodu zaten kullanılmış.</string>
diff --git a/android/src/main/res/values-zh-rCN/strings.xml b/android/src/main/res/values-zh-rCN/strings.xml
index f7868310d9..1054b2db6a 100644
--- a/android/src/main/res/values-zh-rCN/strings.xml
+++ b/android/src/main/res/values-zh-rCN/strings.xml
@@ -111,7 +111,6 @@
<string name="update_available">有可用更新</string>
<string name="update_available_footer">有可用更新,请下载以保持安全。</string>
<string name="user_email_hint">您的电子邮件(可选)</string>
- <string name="user_message_hint">描述您的问题</string>
<string name="view_logs">查看应用日志</string>
<string name="virtual_adapter_problem">虚拟适配器错误</string>
<string name="voucher_already_used">该优惠券码已被使用。</string>
diff --git a/android/src/main/res/values-zh-rTW/strings.xml b/android/src/main/res/values-zh-rTW/strings.xml
index a8046d5d75..2c8fd4a72d 100644
--- a/android/src/main/res/values-zh-rTW/strings.xml
+++ b/android/src/main/res/values-zh-rTW/strings.xml
@@ -115,7 +115,6 @@
<string name="update_available">可用的更新</string>
<string name="update_available_footer">更新可用,請下載以保持安全。</string>
<string name="user_email_hint">您的電子郵件 (選填)</string>
- <string name="user_message_hint">描述您的問題</string>
<string name="view_logs">檢視應用程式日誌</string>
<string name="virtual_adapter_problem">虛擬配接器錯誤</string>
<string name="voucher_already_used">此憑證兌換碼已有人用過。</string>
diff --git a/android/translations-converter/src/gettext.rs b/android/translations-converter/src/gettext.rs
index 8af2c5ca06..c496775ee2 100644
--- a/android/translations-converter/src/gettext.rs
+++ b/android/translations-converter/src/gettext.rs
@@ -2,9 +2,11 @@ use lazy_static::lazy_static;
use regex::Regex;
use std::{
collections::BTreeMap,
+ fmt::{self, Display, Formatter},
fs::{File, OpenOptions},
io::{self, BufRead, BufReader, BufWriter, Write},
mem,
+ ops::Deref,
path::Path,
};
@@ -34,20 +36,24 @@ pub enum PluralForm {
/// A message entry in a gettext translation file.
#[derive(Clone, Debug)]
pub struct MsgEntry {
- pub id: String,
+ pub id: MsgString,
pub value: MsgValue,
}
/// A message string or plural set in a gettext translation file.
#[derive(Clone, Debug)]
pub enum MsgValue {
- Invariant(String),
+ Invariant(MsgString),
Plural {
- plural_id: String,
- values: Vec<String>,
+ plural_id: MsgString,
+ values: Vec<MsgString>,
},
}
+/// A message string in a gettext translation file.
+#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
+pub struct MsgString(String);
+
/// A helper macro to match a string to various prefix and suffix combinations.
macro_rules! match_str {
(
@@ -117,7 +123,7 @@ impl Translation {
}
["msgstr \"", translation, "\""] => {
if let Some(id) = current_id.take() {
- let value = MsgValue::from(normalize(translation));
+ let value = MsgValue::Invariant(normalize(translation));
parsing_header = id.is_empty() && translation.is_empty();
@@ -217,9 +223,36 @@ impl PluralForm {
}
}
+impl From<String> for MsgString {
+ fn from(string: String) -> Self {
+ MsgString(string)
+ }
+}
+
+impl From<&str> for MsgString {
+ fn from(string: &str) -> Self {
+ string.to_owned().into()
+ }
+}
+
+impl Display for MsgString {
+ /// Write the ID message string with proper escaping.
+ fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
+ self.0.replace(r#"""#, r#"\""#).fmt(formatter)
+ }
+}
+
+impl Deref for MsgString {
+ type Target = str;
+
+ fn deref(&self) -> &Self::Target {
+ self.0.as_str()
+ }
+}
+
impl From<String> for MsgValue {
fn from(string: String) -> Self {
- MsgValue::Invariant(string)
+ MsgValue::Invariant(string.into())
}
}
@@ -234,19 +267,22 @@ pub fn append_to_template(
.write(true)
.append(true)
.open(file_path)?;
+ let mut sorted_entries: Vec<_> = entries.collect();
let mut writer = BufWriter::new(file);
- for entry in entries {
+ sorted_entries.sort_by(|first, second| first.id.cmp(&second.id));
+
+ for entry in sorted_entries {
writeln!(writer)?;
- writeln!(writer, "msgid {:?}", entry.id)?;
+ writeln!(writer, r#"msgid "{}""#, entry.id)?;
match entry.value {
- MsgValue::Invariant(value) => writeln!(writer, "msgstr {:?}", value)?,
+ MsgValue::Invariant(value) => writeln!(writer, r#"msgstr "{}""#, value)?,
MsgValue::Plural { plural_id, values } => {
- writeln!(writer, "msgid_plural {:?}", plural_id)?;
+ writeln!(writer, r#"msgid_plural "{}""#, plural_id)?;
for (index, value) in values.into_iter().enumerate() {
- writeln!(writer, "msgstr[{}] {:?}", index, value)?;
+ writeln!(writer, r#"msgstr[{}] "{}""#, index, value)?;
}
}
}
@@ -266,7 +302,7 @@ fn parse_line<'l>(line: &'l str, prefix: &str, suffix: &str) -> Option<&'l str>
}
}
-fn normalize(string: &str) -> String {
+fn normalize(string: &str) -> MsgString {
// Use a single common apostrophe character
let string = APOSTROPHE_VARIATION.replace_all(&string, "'");
// Mark where parameters are positioned, removing the parameter name
@@ -274,5 +310,5 @@ fn normalize(string: &str) -> String {
// Remove escaped double-quotes
let string = ESCAPED_DOUBLE_QUOTES.replace_all(&string, r#"""#);
- string.into_owned()
+ string.into_owned().into()
}
diff --git a/android/translations-converter/src/main.rs b/android/translations-converter/src/main.rs
index 5188a40ef2..d755913243 100644
--- a/android/translations-converter/src/main.rs
+++ b/android/translations-converter/src/main.rs
@@ -133,8 +133,8 @@ fn main() {
for message in template {
match message.value {
- gettext::MsgValue::Invariant(_) => missing_translations.remove(&message.id),
- gettext::MsgValue::Plural { .. } => missing_plurals.remove(&message.id),
+ gettext::MsgValue::Invariant(_) => missing_translations.remove(&*message.id),
+ gettext::MsgValue::Plural { .. } => missing_plurals.remove(&*message.id),
};
}
@@ -147,7 +147,7 @@ fn main() {
.into_iter()
.inspect(|(missing_translation, id)| println!(" {}: {}", id, missing_translation))
.map(|(id, _)| gettext::MsgEntry {
- id,
+ id: id.into(),
value: String::new().into(),
}),
)
@@ -179,20 +179,30 @@ fn main() {
.iter()
.position(|plural| plural.quantity == android::PluralQuantity::One)
.expect("Missing singular variant to use as msgid");
- let id = plural.items.remove(singular_position).string.to_string();
+ let id = plural
+ .items
+ .remove(singular_position)
+ .string
+ .to_string()
+ .into();
let other_position = plural
.items
.iter()
.position(|plural| plural.quantity == android::PluralQuantity::Other)
.expect("Missing other variant to use as msgid_plural");
- let plural_id = plural.items.remove(other_position).string.to_string();
+ let plural_id = plural
+ .items
+ .remove(other_position)
+ .string
+ .to_string()
+ .into();
gettext::MsgEntry {
id,
value: gettext::MsgValue::Plural {
plural_id,
- values: vec!["".to_owned(), "".to_owned()],
+ values: vec!["".into(), "".into()],
},
}
}),
@@ -253,7 +263,7 @@ fn generate_translations(
for translation in translations {
match translation.value {
gettext::MsgValue::Invariant(translation_value) => {
- if let Some(android_key) = known_strings.remove(&translation.id) {
+ if let Some(android_key) = known_strings.remove(&*translation.id) {
localized_strings.push(android::StringResource::new(
android_key,
&translation_value,
@@ -261,7 +271,9 @@ fn generate_translations(
}
}
gettext::MsgValue::Plural { values, .. } => {
- if let Some(android_key) = known_plurals.remove(&translation.id) {
+ if let Some(android_key) = known_plurals.remove(&*translation.id) {
+ let values = values.into_iter().map(|message| message.to_string());
+
localized_plurals.push(android::PluralResource::new(
android_key,
plural_quantities.clone().zip(values),
diff --git a/gui/locales/messages.pot b/gui/locales/messages.pot
index 258b9ab5cc..6cc7e2cc0b 100644
--- a/gui/locales/messages.pot
+++ b/gui/locales/messages.pot
@@ -170,6 +170,10 @@ msgid "Default"
msgstr ""
msgctxt "advanced-settings-view"
+msgid "e.g. 10.0.0.4"
+msgstr ""
+
+msgctxt "advanced-settings-view"
msgid "Enable anyway"
msgstr ""
@@ -244,6 +248,11 @@ msgctxt "advanced-settings-view"
msgid "The app’s built-in kill switch is always on. This setting will additionally block the internet if clicking Disconnect or Quit."
msgstr ""
+#. The hint displayed below the WireGuard port selector.
+msgctxt "advanced-settings-view"
+msgid "The automatic setting will randomly choose from a wide range of ports."
+msgstr ""
+
msgctxt "advanced-settings-view"
msgid "The DNS server you are trying to add might not work because it is public. Currently we only support local DNS servers."
msgstr ""
@@ -779,16 +788,16 @@ msgid "Advanced"
msgstr ""
msgctxt "settings-view"
-msgid "App version"
+msgid "App is out of sync. Please quit and restart."
msgstr ""
-#. Link to the webpage
msgctxt "settings-view"
-msgid "FAQs & Guides"
+msgid "App version"
msgstr ""
+#. Link to the webpage
msgctxt "settings-view"
-msgid "Inconsistent internal version information, please restart the app."
+msgid "FAQs & Guides"
msgstr ""
#. Navigation button to the 'Language' settings view
@@ -815,7 +824,7 @@ msgid "Report a problem"
msgstr ""
msgctxt "settings-view"
-msgid "Update available, download to remain safe."
+msgid "Update available. Install the latest app version to stay up to date."
msgstr ""
#. Title label in navigation bar
@@ -847,16 +856,30 @@ msgctxt "split-tunneling-view"
msgid "Launch application"
msgstr ""
+#. This error message is shown if the user tries to launch a Linux desktop
+#. entry file that doesn't contain the required 'Exec' value.
+msgctxt "split-tunneling-view"
+msgid "Please contact support."
+msgstr ""
+
+#. This error message is shown if the user tries to launch an app that
+#. doesn't exist.
+#. This error message is shown if an application failes during startup.
+msgctxt "split-tunneling-view"
+msgid "Please try again or contact support."
+msgstr ""
+
msgctxt "split-tunneling-view"
msgid "Split tunneling"
msgstr ""
-msgctxt "support-view"
-msgid "Continue anyway"
+#. Error message showed in a dialog when an application failes to launch.
+msgctxt "split-tunneling-view"
+msgid "Unable to launch selection. %(detailedErrorMessage)s"
msgstr ""
msgctxt "support-view"
-msgid "Describe your problem"
+msgid "Continue anyway"
msgstr ""
msgctxt "support-view"
@@ -871,7 +894,15 @@ msgstr ""
#. Available placeholders:
#. %(email)s
msgctxt "support-view"
-msgid "If needed we will contact you on %(email)s"
+msgid "If needed we will contact you at %(email)s"
+msgstr ""
+
+msgctxt "support-view"
+msgid "If you exit the form and try again later, the information you already entered will still be here."
+msgstr ""
+
+msgctxt "support-view"
+msgid "Please describe your problem in English or Swedish."
msgstr ""
#. Title label in navigation bar
@@ -928,10 +959,6 @@ msgid "You are using an old version of the app. Please upgrade and see if the pr
msgstr ""
msgctxt "support-view"
-msgid "You may need to go back to the app's main screen and click Disconnect before trying again. Don't worry, the information you entered will remain in the form."
-msgstr ""
-
-msgctxt "support-view"
msgid "Your email (optional)"
msgstr ""
@@ -996,10 +1023,6 @@ msgid "Regenerate key"
msgstr ""
msgctxt "wireguard-key-view"
-msgid "Unable to manage keys while in a blocked state"
-msgstr ""
-
-msgctxt "wireguard-key-view"
msgid "Unable to regenerate key: you already have the maximum number of keys. To generate a new key, you first need to revoke one under “Manage keys.”"
msgstr ""
@@ -1017,116 +1040,143 @@ msgctxt "wireguard-keys-nav"
msgid "WireGuard key"
msgstr ""
-msgid "The DNS server you are trying to add might not work because it is public. Currently we only support local DNS servers."
+msgid "Account authentication failed."
msgstr ""
-msgid "WireGuard error"
+msgid "Account credit expires in a few minutes"
+msgstr ""
+
+msgid "Account credit expires soon"
msgstr ""
msgid "Account time reminders"
msgstr ""
-msgid "WireGuard public key"
+msgid "Blocking all connections"
+msgstr ""
+
+msgid "Blocking internet"
+msgstr ""
+
+msgid "Copied Mullvad account number to clipboard"
msgstr ""
msgid "Copied WireGuard public key to clipboard"
msgstr ""
-msgid "Account credit expires soon"
+msgid "Copied to clipboard"
msgstr ""
-msgid "Account credit expires in a few minutes"
+msgid "Could not configure IPv6"
msgstr ""
-msgid "Thanks!"
+msgid "Critical error (your attention is required)"
msgstr ""
-msgid "We will look into this."
+msgid "Custom DNS server addresses %s are invalid"
msgstr ""
-msgid "You are running an unsupported app version. Please upgrade to %s now to ensure your security"
+msgid "Disconnecting"
msgstr ""
-msgid "e.g. 10.0.0.4"
+msgid "Enable"
msgstr ""
-msgid "Copied to clipboard"
+msgid "Exclude applications"
msgstr ""
-msgid "Too many WireGuard keys registered to account"
+msgid "Failed to apply firewall rules. The device might currently be unsecured"
msgstr ""
-msgid "Shows current VPN tunnel status"
+msgid "Failed to block all network traffic. Please troubleshoot or report the problem to us."
msgstr ""
-msgid "Copied Mullvad account number to clipboard"
+msgid "Failed to resolve the hostname of custom server"
msgstr ""
-msgid "Use custom DNS server"
+msgid "Failed to set system DNS server"
msgstr ""
-msgid "Add anyway"
+msgid "Failed to start tunnel connection"
msgstr ""
-msgid "Failed to block all network traffic. Please troubleshoot or report the problem to us."
+msgid "If needed we will contact you on %s"
msgstr ""
-msgid "Split tunneling makes it possible to select which applications should not be routed through the VPN tunnel."
+msgid "Install Mullvad VPN (%s) to stay up to date"
msgstr ""
-msgid "less than a day left"
+msgid "Mullvad account number"
msgstr ""
-msgid "Blocking all connections"
+msgid "No bridge relay server matches the current settings"
msgstr ""
-msgid "Could not configure IPv6"
+msgid "No relay server matches the current settings"
msgstr ""
-msgid "Disconnecting"
+msgid "Secured"
msgstr ""
-msgid "Enable to add at least one DNS server."
+msgid "Shows current VPN tunnel status"
msgstr ""
-msgid "Enable"
+msgid "Shows reminders when the account time is about to expire"
msgstr ""
-msgid "No relay server matches the current settings"
+msgid "Split tunneling makes it possible to select which applications should not be routed through the VPN tunnel."
msgstr ""
-msgid "VPN permission was denied when creating the tunnel. Please try connecting again."
+msgid "The local DNS server will not work unless you enable \"Local Network Sharing\" under Preferences."
msgstr ""
-msgid "No bridge relay server matches the current settings"
+msgid "This device is offline, no tunnels can be established"
msgstr ""
-msgid "Shows reminders when the account time is about to expire"
+msgid "Too many WireGuard keys registered to account"
msgstr ""
-msgid "Add a server"
+msgid "Unsecured"
msgstr ""
-msgid "Mullvad account number"
+msgid "Update available, download to remain safe."
msgstr ""
-msgid "less than a minute ago"
+msgid "VPN permission was denied when creating the tunnel. Please try connecting again."
msgstr ""
-msgid "Failed to resolve the hostname of custom server"
+msgid "VPN tunnel status"
msgstr ""
msgid "Virtual adapter error"
msgstr ""
-msgid "Exclude applications"
+msgid "WireGuard error"
msgstr ""
-msgid "VPN tunnel status"
+msgid "WireGuard public key"
msgstr ""
-msgid "1 year left"
-msgid_plural "%d years left"
+msgid "YOU MIGHT BE LEAKING NETWORK TRAFFIC"
+msgstr ""
+
+msgid "You are running an unsupported app version."
+msgstr ""
+
+msgid "You are running an unsupported app version. Please upgrade to %s now to ensure your security"
+msgstr ""
+
+msgid "You may need to go back to the app's main screen and click Disconnect before trying again. Don't worry, the information you entered will remain in the form."
+msgstr ""
+
+msgid "less than a day left"
+msgstr ""
+
+msgid "less than a minute ago"
+msgstr ""
+
+msgid "1 day left"
+msgid_plural "%d days left"
msgstr[0] ""
msgstr[1] ""
@@ -1135,18 +1185,18 @@ msgid_plural "%d months left"
msgstr[0] ""
msgstr[1] ""
-msgid "1 day left"
-msgid_plural "%d days left"
+msgid "1 year left"
+msgid_plural "%d years left"
msgstr[0] ""
msgstr[1] ""
-msgid "a minute ago"
-msgid_plural "%d minutes ago"
+msgid "Account credit expires in a day"
+msgid_plural "Account credit expires in %d days"
msgstr[0] ""
msgstr[1] ""
-msgid "an hour ago"
-msgid_plural "%d hours ago"
+msgid "Account credit expires in an hour"
+msgid_plural "Account credit expires in %d hours"
msgstr[0] ""
msgstr[1] ""
@@ -1155,6 +1205,11 @@ msgid_plural "%d days ago"
msgstr[0] ""
msgstr[1] ""
+msgid "a minute ago"
+msgid_plural "%d minutes ago"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "a month ago"
msgid_plural "%d months ago"
msgstr[0] ""
@@ -1165,12 +1220,7 @@ msgid_plural "%d years ago"
msgstr[0] ""
msgstr[1] ""
-msgid "Account credit expires in a day"
-msgid_plural "Account credit expires in %d days"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "Account credit expires in an hour"
-msgid_plural "Account credit expires in %d hours"
+msgid "an hour ago"
+msgid_plural "%d hours ago"
msgstr[0] ""
msgstr[1] ""