diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-03-29 10:18:41 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-03-29 10:18:41 -0300 |
| commit | 242bee0d8855e90eef90944efdf38538b00e6500 (patch) | |
| tree | 9706c8751f2f1c9f114c7c889ca9c5c797b70e30 | |
| parent | 307507c0cabb11daa38023f75c57fd1f100870eb (diff) | |
| parent | 2a4d0a1febd93c772f40a63ea3cf2256ab67bf94 (diff) | |
| download | mullvadvpn-242bee0d8855e90eef90944efdf38538b00e6500.tar.xz mullvadvpn-242bee0d8855e90eef90944efdf38538b00e6500.zip | |
Merge branch 'add-ci-job-for-translations'
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] "" |
