diff options
| author | Oskar Nyberg <oskar@mullvad.net> | 2022-07-22 14:36:26 +0200 |
|---|---|---|
| committer | Oskar Nyberg <oskar@mullvad.net> | 2022-07-22 14:36:26 +0200 |
| commit | baa4802b2e31b55133b3e8fc4ad5058a8ffd0496 (patch) | |
| tree | 3f7cbdae6b87d28594fdf280ed963fcdfdd35105 | |
| parent | d79cb0d9744d675b1815729269862c5a44f043d4 (diff) | |
| parent | 250f169d093d3d7e39255f2527b1225668b4b04a (diff) | |
| download | mullvadvpn-baa4802b2e31b55133b3e8fc4ad5058a8ffd0496.tar.xz mullvadvpn-baa4802b2e31b55133b3e8fc4ad5058a8ffd0496.zip | |
Merge branch 'reorganize-settings'
58 files changed, 3287 insertions, 3197 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 902ce94cc8..cdad7440ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ Line wrap the file at 100 chars. Th ### Changed - Reject invalid WireGuard ports in the CLI. +- Reorganize settings into more logical categories. #### Android - Lowered default MTU to 1280 on Android. diff --git a/gui/locales/da/messages.po b/gui/locales/da/messages.po index 59a0885e7f..ce90395941 100644 --- a/gui/locales/da/messages.po +++ b/gui/locales/da/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Avanceret" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s-indstillinger" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s-indstillinger" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Tilføj en server" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Tilføj alligevel" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Bemærk: aktivering af dette medfører, at der altid kræves en Mullvad VPN-forbindelse for at oprette forbindelse til internettet." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "Aktivér IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Aktivér IPv6-kommunikation gennem tunnelen." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Aktiver multihop" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Aktiver for at tilføje mindst én DNS-server." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Indtast IP" @@ -367,7 +367,7 @@ msgstr "Hvis du afbryder forbindelsen eller lukker appen, blokerer denne indstil #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Øger anonymiteten ved at dirigere din trafik ind på én %(wireguard)s-server og ud af en anden, hvilket gør det sværere at spore." @@ -375,22 +375,22 @@ 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 "Appens indbyggede kill-switch er altid slået til. Denne indstilling blokerer desuden internettet, hvis du klikker på Afbryd forbindelse eller Afslut" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "Den DNS-server, du ønsker at tilføje, er en privat IP. Du skal sikre, at dine netværksgrænseflader er konfigureret til at bruge den." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "Den DNS-server, du vil tilføje, er offentlig og fungerer kun med %(wireguard)s. For at sikre at det altid fungerer, skal du indstille \"%(tunnelProtocol)s\" (i avancerede indstillinger) til %(wireguard)s." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Tunnelprotokol" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Brug brugerdefineret DNS-server" @@ -999,39 +999,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Indstillinger" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Giver adgang til andre enheder på det samme netværk til deling, udskrivning osv." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Auto-tilslutning" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Opret automatisk forbindelse til en server, når appen starter." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Betaprogram" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Bloker annoncer" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Bloker voksenindhold" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Bloker hasardspil" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Bloker malware" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Bloker trackere" @@ -1040,7 +1040,7 @@ msgstr "Bloker trackere" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Deaktiver **%(customDnsFeatureName)s** (under avancerede indstillinger) for at aktivere disse indstillinger." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Deaktiver alle indholdsblokkere (under %(preferencesPageName)s) for at aktivere denne indstilling." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Aktivér eller deaktiver systemmeddelelser. De kritiske meddelelser vises altid." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Aktivér for at blive underrettet, når nye betaversioner af appen frigives." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Aktiver for at flytte appen rundt som et fritstående vindue." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Kill-switch" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Start app ved opstart" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Lokal netværksdeling" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Monokromatisk bakkeikon" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Meddelelser" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Indstillinger" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Vis kun bakkeikonet, når appen starter." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Start minimeret" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "Appen har en indbygget kill-switch, der er aktiveret som standard og ikke kan deaktiveres. Dette er for at forhindre din trafik i at lække uden for VPN-tunnelen, hvis dit netværk pludselig holder op med at fungere, eller hvis tunnelen fejler af en eller anden grund. Mullvad beskytter automatisk dine data, indtil din forbindelse er genetableret." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Denne indstilling er ikke tilgængelig, når du bruger en betaversion." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Fjern app fra proceslinjen" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Brug et monokromatisk bakkeikon i stedet for et farvet." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Advarsel: Dette er ikke antivirus og bør ikke behandles som sådan. Dette er blot et ekstra lag af beskyttelse." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Advarsel: Dette kan forårsage problemer på visse websteder, tjenester og programmer." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Når den er aktiveret, forhindrer denne funktion enheden i at kontakte visse domæner, der er kendt for at indeholde malware." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Når den er aktiveret, forhindrer denne funktion enheden i at kontakte bestemte domæner, der vides at spore brugere." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Når den er aktiveret, forhindrer denne funktion enheden i at kontakte visse kendte annoncedomæner." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Når den er aktiveret, forhindrer denne funktion enheden i at kontakte bestemte websteder og tjenester, der er kendt for at være vært for voksenindhold." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Når den er aktiveret, forhindrer denne funktion enheden i at kontakte bestemte websteder og tjenester, der er kendt for at være vært for indhold med hasardspil." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "App-version" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "Ofte stillede spørgsmål og vejledninger" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Sprog" diff --git a/gui/locales/de/messages.po b/gui/locales/de/messages.po index 444916019d..5ea9fb20c7 100644 --- a/gui/locales/de/messages.po +++ b/gui/locales/de/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Erweitert" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s-Einstellungen" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s-Einstellungen" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Server hinzufügen" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Trotzdem hinzufügen" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Achtung: Wenn Sie diese Einstellung aktivieren, wird immer eine Mullvad VPN-Verbindung erfordert, um das Internet zu erreichen." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "IPv6 aktivieren" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "IPv6-Kommunikation durch Tunnel aktivieren." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Multihop aktivieren" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Aktivieren, um mindestens einen DNS-Server hinzuzufügen." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "IP eingeben" @@ -367,7 +367,7 @@ msgstr "Wenn Sie die Verbindung trennen oder die App beenden, wird diese Einstel #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Erhöht Ihre Anonymität, indem Ihr Datenverkehr in einen %(wireguard)s-Server hinein und aus einem anderen heraus geleitet wird, was eine Rückverfolgung extrem erschwert." @@ -375,22 +375,22 @@ 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 "Der integrierte Killswitch der App ist immer an. Diese Einstellung wird außerdem das Internet sperren, wenn Sie auf Trennen oder Beenden klicken." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "Der DNS-Server, den Sie hinzufügen möchten, ist eine private IP. Sie müssen sicherstellen, dass Ihre Netzwerkschnittstellen für die Verwendung dieses Servers konfiguriert sind." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "Der DNS-Server, den Sie hinzufügen möchten, ist öffentlich und wird nur mit %(wireguard)s funktionieren. Stellen Sie das „%(tunnelProtocol)s“ (in den erweiterten Einstellungen) auf %(wireguard)s, um sicherzustellen, dass er immer funktioniert." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Tunnelprotokoll" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Benutzerdefinierten DNS-Server verwenden" @@ -999,23 +999,23 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Präferenzen" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Ermöglicht den Zugriff auf andere Geräte im selben Netzwerk zum Teilen von Dateien, Drucken etc." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Automatische Verbindung" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Stellt automatisch eine Verbindung zum Server her, wenn die App startet." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Beta-Programm" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Werbung blockieren" @@ -1040,7 +1040,7 @@ msgstr "Tracker blockieren" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Deaktivieren Sie **%(customDnsFeatureName)s** (in den erweiterten Einstellungen), um diese Einstellungen zu aktivieren." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Deaktivieren Sie alle Inhaltssperren (unter %(preferencesPageName)s), um diese Einstellung zu aktivieren." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Aktivieren oder deaktivieren Sie Systembenachrichtigungen. Kritische Benachrichtigungen werden immer angezeigt." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Aktivieren, um benachrichtigt zu werden, wenn neue Beta-Versionen der App veröffentlicht werden." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Aktivieren, um die App als freistehendes Fenster herumzubewegen." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Killswitch" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "App beim Hochfahren starten" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Teilen im lokalen Netzwerk" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Monochromatisches Leistensymbol" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Benachrichtigungen" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Präferenzen" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Beim Start der App nur das Leistensymbol anzeigen." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Minimiert starten" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "Die App verfügt über einen eingebauten Killswitch, der standardmäßig aktiviert ist und nicht deaktiviert werden kann. Damit wird verhindert, dass Ihr Datenverkehr außerhalb des VPN-Tunnels durchsickert, wenn Ihr Netzwerk plötzlich nicht mehr funktioniert oder der Tunnel aus irgendeinem Grund ausfällt. Mullvad schützt Ihre Daten automatisch, bis Ihre Verbindung wiederhergestellt ist." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Diese Option ist in Beta-Versionen nicht verfügbar." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "App von der Taskleiste lösen" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Monochromatisches Leistensymbol statt Farbsymbol nutzen." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Warnung: Dies ist kein Antivirusprogramm und sollte auch nicht als solches behandelt werden. Es dient lediglich als zusätzliche Schutzschicht." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Warnung: Dies kann bei bestimmten Websites, Diensten und Programmen zu Problemen führen." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Wenn diese Funktion aktiviert ist, wird das Gerät daran gehindert, bestimmte Domänen zu kontaktieren, die bekanntermaßen Malware beherbergen." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Wenn diese Funktion aktiviert ist, wird das Gerät daran gehindert, bestimmte Domänen zu kontaktieren, die bekanntermaßen Benutzer nachverfolgen." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Wenn diese Funktion aktiviert ist, wird das Gerät daran gehindert, bestimmte Domänen zu kontaktieren, die bekanntermaßen Werbung schalten." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Wenn diese Funktion aktiviert ist, wird das Gerät daran gehindert, bestimmte Websites und Dienste zu kontaktieren, die dafür bekannt sind, dass sie Inhalte für Erwachsene enthalten." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Wenn diese Funktion aktiviert ist, wird das Gerät daran gehindert, bestimmte Websites und Dienste zu kontaktieren, die dafür bekannt sind, dass sie Glücksspielinhalte enthalten." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "App-Version" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "Häufig gestellte Fragen & Anleitungen" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Sprache" diff --git a/gui/locales/es/messages.po b/gui/locales/es/messages.po index 53ca7e3458..309a80a533 100644 --- a/gui/locales/es/messages.po +++ b/gui/locales/es/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Avanzadas" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "Configuración de %(openvpn)s" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "Configuración de %(wireguard)s" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Añadir un servidor" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Añadir de todos modos" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Atención: Si activa esta opción, se exigirá siempre el uso de una conexión de Mullvad VPN para conectarse a Internet." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "Habilitar IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Permite la comunicación IPv6 a través del túnel." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Permitir saltos múltiples" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Active esta opción para agregar como mínimo un servidor DNS." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Escriba la IP" @@ -367,7 +367,7 @@ msgstr "Si se desconecta o sale de la aplicación, esta configuración bloquear #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Mejora el anonimato al enrutar el tráfico de entrada en un servidor de %(wireguard)s y el tráfico de salida en otro, por lo que es más difícil de rastrear." @@ -375,22 +375,22 @@ 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 "La función de desconexión de seguridad integrada en la aplicación siempre está activada. Esta configuración bloqueará también el acceso a Internet si hace clic en Desconectar o Salir." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "El servidor DNS que quiere añadir es una IP privada. Asegúrese de que las interfaces de red estén configuradas para usarlo." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "El servidor DNS que quiere agregar es público y solo funcionará con %(wireguard)s. Para asegurarse de que funcione siempre, establezca el «%(tunnelProtocol)s» (en Configuración avanzada) en %(wireguard)s." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Protocolo de tunelización" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Usar servidor DNS personalizado" @@ -999,39 +999,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Preferencias" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Permite el acceso a otros dispositivos de la misma red para compartir archivos, imprimir, etc." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Conexión automática" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Al iniciarse la aplicación, se conecta automáticamente a un servidor." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Programa beta" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Bloquear anuncios" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Bloquear contenidos para adultos" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Bloquear juegos de azar" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Bloquear malware" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Bloquear rastreadores" @@ -1040,7 +1040,7 @@ msgstr "Bloquear rastreadores" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Para activar estas opciones, deshabilite **%(customDnsFeatureName)s** (en Configuración avanzada)." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Para activar esta opción, deshabilite todos los bloqueadores de contenido (en %(preferencesPageName)s)." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Activar o desactivar notificaciones del sistema. Las notificaciones críticas se mostrarán siempre." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Active esta opción para recibir notificaciones cuando se publiquen nuevas versiones beta de la aplicación." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Active esta opción para mover la aplicación como una ventana independiente." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Desconexión de seguridad" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Ejecutar la aplicación al iniciar" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Uso compartido de la red local" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Icono de la bandeja monocromático" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Notificaciones" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Preferencias" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Al iniciar la aplicación, solo se muestra el icono de la bandeja." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Iniciar minimizado" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "La aplicación tiene integrada una función de desconexión de seguridad que está habilitada de forma predeterminada y no se puede desactivar. Esto impide que se filtre el tráfico fuera del túnel VPN si la red deja de funcionar de repente o si el túnel produce errores por algún motivo. Mullvad protege automáticamente sus datos hasta que vuelva a establecerse la conexión." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Esta opción no está disponible si se usa una versión beta." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Desanclar aplicación de la barra de tareas" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Usa un icono de bandeja monocromático, en lugar de un icono en color." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Advertencia: Esta función no es un antivirus y no debe considerarse como tal, tan solo es un nivel de protección adicional." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Advertencia: Esto podría causar problemas con determinados sitios web, servicios y programas." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Al activar esta opción, el dispositivo no podrá conectarse a dominios conocidos por alojar malware." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Al activar esta opción, el dispositivo no podrá conectarse a dominios conocidos por rastrear a los usuarios." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Al habilitar esta opción, el dispositivo no podrá establecer la conexión con determinados dominios de publicidad conocidos." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Al habilitar esta opción, el dispositivo no podrá conectarse a sitios web y servicios conocidos por alojar contenidos para adultos." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Al activar esta opción, el dispositivo no podrá conectarse a sitios web y servicios conocidos por alojar contenidos de juegos de azar." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "Versión de la aplicación" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "Preguntas frecuentes y guías" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Idioma" diff --git a/gui/locales/fi/messages.po b/gui/locales/fi/messages.po index 2b10306758..520620022b 100644 --- a/gui/locales/fi/messages.po +++ b/gui/locales/fi/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Lisäasetukset" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s-asetukset" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s-asetukset" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Lisää palvelin" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Lisää silti" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Huomio: jos tämä otetaan käyttöön, verkkoon yhdistäminen vaatii aina Mullvad VPN -yhteyden." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "Salli IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Salli IPv6-yhteys tunnelin kautta." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Ota multihop käyttöön" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Ota käyttöön lisätäksesi vähintään yhden DNS-palvelimen." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Anna IP-osoite" @@ -367,7 +367,7 @@ msgstr "Jos katkaiset sovellusyhteyden tai suljet sovelluksen, tämä asetus est #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Paranna anonymiteettia reitittämällä liikenteen yhdelle %(wireguard)s-palvelimelle ja sitten toisen kautta ulos, mikä tekee jäljittämisestä vaikeampaa." @@ -375,22 +375,22 @@ 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 "Sovelluksen sisäänrakennettu tappokytkin on aina käytössä. Tämä asetus estää lisäksi verkkoyhteyden, jos katkaiset sovellusyhteyden tai suljet sovelluksen." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "DNS-palvelin, jonka haluat lisätä, on yksityinen IP-osoite. Varmista, että verkkoliittymäsi määritykset mahdollistavat palvelimen käytön." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "Lisättävä DNS-palvelin on julkinen ja toimii vain %(wireguard)sin kanssa. Varmista, että se on aina toiminnassa asettamalla \"%(tunnelProtocol)s\"-asetukseksi %(wireguard)s (lisäasetuksissa)." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Tunneliprotokolla" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Käytä mukautettua DNS-palvelinta" @@ -999,39 +999,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Asetukset" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Sallii jakamisen, tulostuksen ym. saman verkon muille laitteille." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Automaattinen yhteys" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Yhdistä palvelimeen automaattisesti, kun sovellus avataan." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Betaohjelma" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Estä mainokset" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Estä vain aikuisille suunnattu sisältö" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Estä uhkapelisisältö" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Estä haittaohjelmat" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Estä seurantapalvelimet" @@ -1040,7 +1040,7 @@ msgstr "Estä seurantapalvelimet" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Poista **%(customDnsFeatureName)s** käytöstä (lisäasetuksista) aktivoidaksesi nämä asetukset." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Ota asetus käyttöön poistamalla kaikki sisällön estotoiminnot käytöstä (kohdassa %(preferencesPageName)s)." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Salli tai estä järjestelmän ilmoitukset. Tärkeät ilmoitukset näytetään aina." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Ota käyttöön niin saat ilmoituksen uusista sovelluksen betaversioista." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Salli sovelluksen siirtäminen itsenäisenä ikkunana." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Tappokytkin" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Käynnistä sovellus, kun järjestelmä käynnistyy" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Paikallisen verkon jakaminen" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Yksivärinen ilmaisinalueen kuvake" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Ilmoitukset" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Asetukset" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Näytä vain ilmaisinalueen kuvake, kun sovellus käynnistyy." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Käynnistä pienennettynä" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "Sovelluksessa on sisäänrakennettu tappokytkin, ja se on aina poikkeuksetta käytössä; näin liikenteesi vuotaminen VPN-tunnelin ulkopuolelle estetään, jos verkkosi yhtäkkiä lakkaa toimimasta tai tunnelin yhteys jostakin syystä katkeaa. Mullvad suojaa tietojasi automaattisesti, kunnes yhteys on muodostettu uudelleen." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Tämä toiminto ei ole käytössä betaversiossa." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Poista sovelluksen kiinnitys tehtäväpalkista" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Käytä yksiväristä ilmaisinalueen kuvaketta värillisen asemesta." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Varoitus: tämä ei ole virustorjuntaohjelma, eikä sitä pidä käyttää sellaisena – kyseessä on vain ylimääräinen suojauskerros." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Varoitus: tämä voi aiheuttaa ongelmia tietyillä verkkosivustoilla, palveluissa ja ohjelmissa." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Kun ominaisuus on käytössä, se estää laitetta ottamasta yhteyttä verkkotunnuksiin, joiden tiedetään isännöivän haittaohjelmia." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Kun ominaisuus on käytössä, se estää laitetta ottamasta yhteyttä verkkotunnuksiin, joiden tiedetään jäljittävän käyttäjiä." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Kun ominaisuus on käytössä, se estää laitetta ottamasta yhteyttä tiettyihin mainosverkkotunnuksiin." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Kun ominaisuus on käytössä, se estää laitetta ottamasta yhteyttä tiettyihin verkkosivustoihin ja palveluihin, joiden tiedetään käsittävän aikuisille suunnattua sisältöä." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Kun ominaisuus on käytössä, se estää laitetta ottamasta yhteyttä tiettyihin verkkosivustoihin ja palveluihin, joiden tiedetään käsittävän uhkapelisisältöä." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "Sovelluksen versio" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "UKK:t ja oppaat" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Kieli" diff --git a/gui/locales/fr/messages.po b/gui/locales/fr/messages.po index dd13aedad9..492b5284dc 100644 --- a/gui/locales/fr/messages.po +++ b/gui/locales/fr/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Avancé" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "Paramètres d'%(openvpn)s" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "Paramètres de %(wireguard)s" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Ajouter un serveur" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Ajouter quand même" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Attention : si vous activez cette option, les connexions à Internet nécessiteront toujours une connexion Mullvad VPN." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "Activer IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Activer la communication IPv6 via le tunnel." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Activer le multihop" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Activez pour ajouter au moins un serveur DNS." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Saisir l'IP" @@ -367,7 +367,7 @@ msgstr "Si vous vous déconnectez ou quittez l'application, ce paramètre bloque #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Augmente la confidentialité en routant votre trafic d'un serveur %(wireguard)s à un autre, le rendant plus difficile à suivre." @@ -375,22 +375,22 @@ 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 "Le kill switch intégré à l'application est toujours activé. Ce paramètre bloquera en plus Internet si vous cliquez sur Déconnecter ou Quitter." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "Le serveur DNS que vous voulez ajouter est une IP privée. Vous devez vous assurer que vos interfaces réseau sont configurées pour l'utiliser." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "Le serveur DNS que vous voulez ajouter est public et ne fonctionnera qu'avec %(wireguard)s. Pour vous assurer qu'il fonctionne toujours, définissez le « %(tunnelProtocol)s » (dans les paramètres avancés) sur %(wireguard)s." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Protocole de tunnel" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Utiliser un serveur DNS personnalisé" @@ -999,39 +999,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Préférences" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Autorise l'accès aux autres appareils sur le même réseau pour partager, imprimer, etc." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Connexion automatique" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Connexion automatique à un serveur dès le démarrage de l'application." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Programme bêta" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Bloquer les pubs" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Bloquer le contenu pour adultes" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Bloquer les jeux d'argent" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Bloquer les logiciels indésirables" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Bloquer les trackers" @@ -1040,7 +1040,7 @@ msgstr "Bloquer les trackers" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Désactivez **%(customDnsFeatureName)s** (sous Paramètres avancés) pour activer ces paramètres." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Désactivez tous les bloqueurs de contenu (sous %(preferencesPageName)s) pour activer ce paramètre." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Activer ou désactiver les notifications système. Les notifications critiques seront toujours affichées." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Activez pour recevoir une notification lorsque de nouvelles versions bêta de l'application sont disponibles." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Activez pour déplacer la fenêtre comme une application indépendante." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Coupe-circuit" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Lancement de l'application au démarrage" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Partage réseau local" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Icône de zone de notification monochrome" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Notifications" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Préférences" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Afficher uniquement l'icône de la zone de notification au démarrage de l'application." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Démarrer réduit" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "L'application possède un coupe-circuit activé par défaut et ne pouvant être désactivé. Il permet d'éviter que le trafic ne fuite du tunnel VPN si votre réseau arrête de fonctionner abruptement ou si le tunnel échoue pour une raison quelconque. Mullvad protège automatiquement vos données jusqu'à ce que votre connexion soit rétablie." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Cette option est indisponible pendant l'utilisation d'une version bêta." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Détacher l'application de la barre des tâches" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Utiliser l'icône de zone de notification monochrome à la place de celle en couleur." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Avertissement : ceci n'est pas un anti-virus et ne doit pas être traité comme tel, il s'agit juste d'une couche de protection supplémentaire." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Avertissement : cela peut causer des problèmes sur certains sites Web, services et programmes." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Lorsqu'elle est activée, cette fonctionnalité empêche l'appareil de contacter certains domaines connus pour héberger des logiciels malveillants." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Lorsqu'elle est activée, cette fonctionnalité empêche l'appareil de contacter certains domaines connus pour pister les utilisateurs." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Lorsqu'elle est activée, cette fonctionnalité empêche l'appareil de contacter certains domaines de publicité connus." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Lorsqu'elle est activée, cette fonctionnalité empêche l'appareil de contacter certains sites Web et services connus pour héberger des contenus pour adultes." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Lorsqu'elle est activée, cette fonctionnalité empêche l'appareil de contacter certains sites Web et services connus pour héberger des contenus de jeu d'argent." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "Version de l'application" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "FAQ et guides" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Langue" diff --git a/gui/locales/it/messages.po b/gui/locales/it/messages.po index aa71f073db..cab060d92e 100644 --- a/gui/locales/it/messages.po +++ b/gui/locales/it/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Avanzate" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "Impostazioni %(openvpn)s" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "Impostazioni %(wireguard)s" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Aggiungi un server" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Aggiungi comunque" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Attenzione: abilitando questa opzione, si richiederà sempre una connessione Mullvad VPN per navigare in Internet." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "Attiva IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Attiva comunicazione IPv6 nel tunnel." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Abilita multihop" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Abilita per aggiungere almeno un server DNS." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Inserisci IP" @@ -367,7 +367,7 @@ msgstr "Se l'utente si scollega o esce dall'app, l'impostazione bloccherà Inter #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Aumenta l'anonimato instradando il tuo traffico in un server %(wireguard)s in entrata e in un altro in uscita, rendendo così più difficile il tracciamento." @@ -375,22 +375,22 @@ 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 "Il kill switch integrato dell'app è sempre attivo. Questa impostazione serve inoltre a bloccare Internet quando si clicca su Disconnetti o Esci." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "Il server DNS che vuoi aggiungere è un IP privato. È necessario assicurarsi che le interfacce di rete siano configurate per utilizzarlo." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "Il server DNS che desideri aggiungere è pubblico e funzionerà solo con %(wireguard)s. Per assicurarti che funzioni sempre, imposta il \"%(tunnelProtocol)s\" (in Impostazioni avanzate) su %(wireguard)s." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Protocollo di tunneling" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Usa un server DNS personalizzato" @@ -999,39 +999,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Preferenze" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Consenti l'accesso ad altri dispositivi sulla stessa rete per condividere, stampare e altro." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Connessione automatica" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Connettiti automaticamente al server all'avvio dell'app." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Programma beta" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Blocca annunci" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Blocca i contenuti per adulti" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Blocca il gioco d'azzardo" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Blocca malware" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Blocca tracker" @@ -1040,7 +1040,7 @@ msgstr "Blocca tracker" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Disabilita **%(customDnsFeatureName)s** (in Impostazioni avanzate) per attivare queste impostazioni." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Disabilita tutti i blocchi dei contenuti (sotto %(preferencesPageName)s) per attivare questa impostazione." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Attiva o disattiva le notifiche di sistema. Le notifiche critiche saranno sempre visualizzate." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Abilita per ricevere una notifica quando sono rilasciate nuove versioni beta dell'app." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Abilita per spostare l'app come una finestra indipendente." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Kill switch" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Lancia app all'avvio" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Condivisione rete locale" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Icona nell'area di notifica monocromatica" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Notifiche" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Preferenze" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Mostra solo l'icona nell'area di notifica all'avvio dell'app." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Avvia ridotta a icona" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "L'app ha un kill switch integrato che è abilitato per impostazione predefinita e non può essere disabilitato. Questo per evitare che il tuo traffico fuoriesca dal tunnel VPN se la tua rete smette improvvisamente di funzionare o se il tunnel si guasta per qualsiasi motivo. Mullvad protegge automaticamente i tuoi dati fino a quando la connessione non viene ristabilita." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Opzione non disponibile nelle versioni beta." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Sblocca l'app dalla barra delle applicazioni" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Usa un'icona nell'area di notifica monocromatica e non colorata." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Avvertenza: questo non è un antivirus e non dovrebbe essere trattato come tale, è solo un ulteriore livello di protezione." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Avvertenza: ciò potrebbe causare problemi su determinati siti Web, servizi e programmi." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Se abilitata, questa funzione impedisce al dispositivo di contattare determinati domini noti per ospitare malware." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Se abilitata, questa funzione impedisce al dispositivo di contattare determinati domini noti per tracciare gli utenti." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Se abilitata, questa funzione impedisce al dispositivo di contattare determinati domini pubblicitari noti." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Se abilitata, questa funzione impedisce al dispositivo di contattare determinati siti Web e servizi noti per ospitare contenuti per adulti." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Se abilitata, questa funzione impedisce al dispositivo di contattare determinati siti Web e servizi noti per ospitare contenuti di gioco d'azzardo." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "Versione app" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "FAQ e guide" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Lingua" diff --git a/gui/locales/ja/messages.po b/gui/locales/ja/messages.po index a354de1f49..726df584e5 100644 --- a/gui/locales/ja/messages.po +++ b/gui/locales/ja/messages.po @@ -299,20 +299,20 @@ msgid "Advanced" msgstr "詳細" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)sの設定" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)sの設定" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "サーバーを追加" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "追加を続ける" @@ -328,24 +328,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "注意:この設定を有効化すると、インターネットにアクセスするために常にMullvad VPNへの接続が必要になります。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "IPv6を有効化する" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "トンネルを通じてIPv6 通信を有効化する" #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "マルチホップを有効化する" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "1つ以上のDNSサーバーを追加できるようにします。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "IP を入力" @@ -356,7 +356,7 @@ msgstr "アプリを接続解除したり終了したりすると、この設定 #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "トラフィックをある%(wireguard)sサーバーにルーティングし、別サーバーに送出することで匿名性を高め、追跡を困難にします。" @@ -364,22 +364,22 @@ 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 "アプリに組み込まれているキルスイッチは常にオンになっています。この設定を有効にすると、「接続解除」または「終了」をクリックした場合にインターネットが補助的にブロックされます。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "追加する DNS サーバーの IP アドレスは、プライベート IP です。ネットワークインターフェイスがこのアドレスを使用するように構成されていることを確認してください。" #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "追加対象のDNSサーバーは公開されており、%(wireguard)sでのみ動作します。常に動作させるためには、(詳細設定で) \"%(tunnelProtocol)s\" に%(wireguard)sを設定してください。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "トンネルプロトコル" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "カスタムDNSサーバーを使う" @@ -988,39 +988,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "環境設定" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "共有や印刷のため、同一ネットワーク上の他のデバイスへのアクセスを許可します。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "自動接続" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "アプリ起動時に自動的にサーバーに接続します。" -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "ベータプログラム" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "広告のブロック" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "アダルトコンテンツのブロック" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "ギャンブルのブロック" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "マルウェアのブロック" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "トラッカーのブロック" @@ -1029,7 +1029,7 @@ msgstr "トラッカーのブロック" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "これらの設定を有効にするには、(詳細設定で) **%(customDnsFeatureName)s** を無効にしてください。" @@ -1042,35 +1042,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "この設定を有効にするには、(%(preferencesPageName)sで) すべてのコンテンツブロッカーを無効にしてください。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "システム通知を有効または無効にします。重要な通知は必ず表示されます。" -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "有効化すると、アプリの新しいベータ版がリリースされたとき通知が届きます。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "アプリを独立したウィンドウとして移動できるようにします。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "キルスイッチ" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "システム起動時にアプリを起動" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "ローカルネットワーク共有" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "単色のトレイアイコン" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "通知" @@ -1078,55 +1078,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "環境設定" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "アプリ開始時にトレイアイコンのみを表示します。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "最小化状態で起動" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "このアプリにはデフォルトで有効なキルスイッチが内蔵されており、無効にすることはできません。これは、ネットワークが突然停止したり、何らかの理由でトンネリングに失敗した場合にトラフィックがVPNトンネルの外に漏洩してしまうことを防止するための措置です。接続が再確立されるまでの間、Mullvadは自動的にデータを保護します。" -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "ベータ版を使用中はこのオプションを利用できません。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "タスクバーからアプリの固定を解除" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "多色ではなく単色のトレイアイコンを使います。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "警告: これはウィルス対策ではありませんので、そのような用途には使用しないでください。あくまで追加の保護レイヤーに過ぎません。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "警告: これにより、特定のWebサイト、サービス、プログラムなどで問題が発生する可能性があります。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "この機能を有効にすると、マルウェアの存在が確認されている特定ドメインへのデバイスの接続が停止されます。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "この機能を有効にすると、ユーザーのトラッキングが確認されている特定ドメインへのデバイスの接続が停止されます。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "この機能を有効にすると、確認されている特定の広告ドメインへのデバイスの接続が停止されます。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "この機能を有効にすると、アダルトコンテンツの提供が確認されている特定Webサイトまたはサービスへのデバイスの接続が停止されます。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "この機能を有効にすると、ギャンブル関連コンテンツの提供が確認されている特定Webサイトまたはサービスへのデバイスの接続が停止されます。" @@ -1237,12 +1237,12 @@ msgid "App version" msgstr "アプリのバージョン" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "よくある質問とガイド" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "言語" diff --git a/gui/locales/ko/messages.po b/gui/locales/ko/messages.po index 6ea9c3a963..d54afdd5e9 100644 --- a/gui/locales/ko/messages.po +++ b/gui/locales/ko/messages.po @@ -299,20 +299,20 @@ msgid "Advanced" msgstr "고급" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s 설정" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s 설정" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "서버 추가" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "추가" @@ -328,24 +328,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "주의: 이 기능을 사용하려면 인터넷 연결을 위해 항상 Mullvad VPN 연결이 필요합니다." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "IPv6 사용" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "터널을 통한 IPv6 통신 사용" #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "멀티홉 사용" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "하나 이상의 DNS 서버를 추가할 수 있습니다." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "IP 입력" @@ -356,7 +356,7 @@ msgstr "앱 연결을 끊거나 종료하면 이 설정으로 인해 인터넷 #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "트래픽을 하나의 %(wireguard)s 서버로 라우팅하고 다른 서버로 전달하여 익명성을 높이고 추적을 더 어렵게 만듭니다." @@ -364,22 +364,22 @@ 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 "앱에서 기본 제공되는 중단 스위치는 항상 켜져 있습니다. 연결 끊기 또는 종료를 클릭하면 이 설정으로 인해 인터넷이 추가로 차단됩니다." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "추가할 DNS 서버가 비공개 IP입니다. 이 서버를 사용하도록 네트워크 인터페이스가 구성되어 있는지 확인해야 합니다." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "추가하려는 DNS 서버는 공용이며 %(wireguard)s에서만 작동합니다. 항상 작동하는지 확인하려면 %(tunnelProtocol)s(고급 설정에서)을(를) %(wireguard)s(으)로 설정하세요." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "터널 프로토콜" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "사용자 지정 DNS 서버 사용" @@ -988,39 +988,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "환경 설정" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "공유, 인쇄 등을 위해 동일한 네트워크의 다른 장치에 액세스할 수 있습니다." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "자동 연결" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "앱이 시작되면 자동으로 서버에 연결합니다." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "베타 프로그램" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "광고 차단" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "성인 콘텐츠 차단" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "도박 차단" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "맬웨어 차단" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "블록 추적기" @@ -1029,7 +1029,7 @@ msgstr "블록 추적기" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "이러한 설정을 활성화하려면 **%(customDnsFeatureName)s**(고급 설정 아래)을(를) 비활성화하세요." @@ -1042,35 +1042,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "이 설정을 활성화하려면 모든 콘텐츠 차단기(%(preferencesPageName)s에서)를 비활성화하세요." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "시스템 알림을 활성화 또는 비활성화합니다. 중요한 알림은 항상 표시됩니다." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "베타 버전의 새로운 앱이 출시될 때 알림을 받도록 설정합니다." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "앱을 독립 실행 창으로 이동할 수 있습니다." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "킬 스위치" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "시작 시 앱 실행" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "로컬 네트워크 공유" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "단색 트레이 아이콘" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "알림" @@ -1078,55 +1078,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "환경 설정" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "앱이 시작될 때 트레이 아이콘만 표시합니다." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "최소화 상태로 시작" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "이 앱에는 기본적으로 활성화되어 비활성화할 수 없는 내장 킬 스위치가 있습니다. 이는 네트워크 작동이 갑자기 중지되거나 어떤 이유로든 터널이 실패할 경우 VPN 터널 외부로 트래픽이 유출되는 것을 방지하기 위한 것입니다. Mullvad는 연결이 다시 설정될 때까지 데이터를 자동으로 보호합니다." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "이 옵션은 베타 버전을 사용하는 동안 사용할 수 없습니다." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "작업 표시줄에서 앱 고정 해제" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "컬러 트레이 대신 단색 트레이 아이콘을 사용합니다." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "경고: 이 기능은 안티바이러스가 아니며 하나의 추가 보호 계층일 뿐입니다." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "경고: 이 기능을 사용하면 특정 웹 사이트, 서비스 및 프로그램에서 문제가 발생할 수 있습니다." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "이 기능을 활성화하면, 맬웨어를 호스팅하는 것으로 알려진 특정 도메인에 장치가 연결되지 않습니다." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "이 기능을 활성화하면, 사용자를 추적하는 것으로 알려진 특정 도메인에 장치가 연결되지 않습니다." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "이 기능을 활성화하면, 알려진 특정 광고 도메인에 장치가 연결되지 않습니다." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "이 기능을 활성화하면, 성인 콘텐츠를 호스팅하는 것으로 알려진 특정 웹 사이트 및 서비스에 장치가 연결되지 않습니다." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "이 기능을 활성화하면, 도박 콘텐츠를 호스팅하는 것으로 알려진 특정 웹 사이트 및 서비스에 장치가 연결되지 않습니다." @@ -1237,12 +1237,12 @@ msgid "App version" msgstr "앱 버전" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "FAQ 및 가이드" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "언어" diff --git a/gui/locales/messages.pot b/gui/locales/messages.pot index f787a66cb3..1451dfad12 100644 --- a/gui/locales/messages.pot +++ b/gui/locales/messages.pot @@ -294,96 +294,6 @@ msgctxt "account-view" msgid "Paid until" msgstr "" -#. Title label in navigation bar -msgctxt "advanced-settings-nav" -msgid "Advanced" -msgstr "" - -#. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" -msgid "%(openvpn)s settings" -msgstr "" - -#. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" -msgid "%(wireguard)s settings" -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Add a server" -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Add anyway" -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Advanced" -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Always require VPN" -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Enable IPv6" -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Enable IPv6 communication through the tunnel." -msgstr "" - -#. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" -msgid "Enable multihop" -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Enable to add at least one DNS server." -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Enter IP" -msgstr "" - -msgctxt "advanced-settings-view" -msgid "If you disconnect or quit the app, this setting will block your internet." -msgstr "" - -#. Description for multihop settings toggle. -#. Available placeholders: -#. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" -msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." -msgstr "" - -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 "" - -msgctxt "advanced-settings-view" -msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." -msgstr "" - -#. Available placeholders: -#. %(tunnelProtocol)s - the name of the tunnel protocol setting -#. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" -msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Tunnel protocol" -msgstr "" - -msgctxt "advanced-settings-view" -msgid "Use custom DNS server" -msgstr "" - msgctxt "auth-failure" msgid "Blocking internet: account is out of time" msgstr "" @@ -683,6 +593,48 @@ msgctxt "in-app-notifications" msgid "UPDATE AVAILABLE" msgstr "" +msgctxt "interface-settings-view" +msgid "Enable or disable system notifications. The critical notifications will always be displayed." +msgstr "" + +msgctxt "interface-settings-view" +msgid "Enable to move the app around as a free-standing window." +msgstr "" + +#. Title label in navigation bar +msgctxt "interface-settings-view" +msgid "Interface settings" +msgstr "" + +#. Navigation button to the 'Language' settings view +msgctxt "interface-settings-view" +msgid "Language" +msgstr "" + +msgctxt "interface-settings-view" +msgid "Monochromatic tray icon" +msgstr "" + +msgctxt "interface-settings-view" +msgid "Notifications" +msgstr "" + +msgctxt "interface-settings-view" +msgid "Show only the tray icon when the app starts." +msgstr "" + +msgctxt "interface-settings-view" +msgid "Start minimized" +msgstr "" + +msgctxt "interface-settings-view" +msgid "Unpin app from taskbar" +msgstr "" + +msgctxt "interface-settings-view" +msgid "Use a monochromatic tray icon instead of a colored one." +msgstr "" + msgctxt "launch-view" msgid "Connecting to Mullvad system service..." msgstr "" @@ -984,153 +936,6 @@ msgctxt "openvpn-settings-view" msgid "Transport protocol" msgstr "" -#. Title label in navigation bar -msgctxt "preferences-nav" -msgid "Preferences" -msgstr "" - -msgctxt "preferences-view" -msgid "Allows access to other devices on the same network for sharing, printing etc." -msgstr "" - -msgctxt "preferences-view" -msgid "Auto-connect" -msgstr "" - -msgctxt "preferences-view" -msgid "Automatically connect to a server when the app launches." -msgstr "" - -msgctxt "preferences-view" -msgid "Beta program" -msgstr "" - -msgctxt "preferences-view" -msgid "Block ads" -msgstr "" - -msgctxt "preferences-view" -msgid "Block adult content" -msgstr "" - -msgctxt "preferences-view" -msgid "Block gambling" -msgstr "" - -msgctxt "preferences-view" -msgid "Block malware" -msgstr "" - -msgctxt "preferences-view" -msgid "Block trackers" -msgstr "" - -#. This is displayed when the custom DNS setting is turned on which makes the block -#. ads/trackers settings disabled. The text enclosed in "**" will appear bold. -#. Advanced settings refer to the name of the page with the title "Advanced". -#. Available placeholders: -#. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" -msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." -msgstr "" - -#. This is displayed when either or both of the block ads/trackers settings are -#. turned on which makes the custom DNS setting disabled. The text enclosed in "**" -#. will appear bold. -#. Available placeholders: -#. %(preferencesPageName)s - The page title showed on top in the preferences page. -msgctxt "preferences-view" -msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." -msgstr "" - -msgctxt "preferences-view" -msgid "Enable or disable system notifications. The critical notifications will always be displayed." -msgstr "" - -msgctxt "preferences-view" -msgid "Enable to get notified when new beta versions of the app are released." -msgstr "" - -msgctxt "preferences-view" -msgid "Enable to move the app around as a free-standing window." -msgstr "" - -msgctxt "preferences-view" -msgid "Kill switch" -msgstr "" - -msgctxt "preferences-view" -msgid "Launch app on start-up" -msgstr "" - -msgctxt "preferences-view" -msgid "Local network sharing" -msgstr "" - -msgctxt "preferences-view" -msgid "Monochromatic tray icon" -msgstr "" - -msgctxt "preferences-view" -msgid "Notifications" -msgstr "" - -msgctxt "preferences-view" -msgid "Preferences" -msgstr "" - -msgctxt "preferences-view" -msgid "Show only the tray icon when the app starts." -msgstr "" - -msgctxt "preferences-view" -msgid "Start minimized" -msgstr "" - -msgctxt "preferences-view" -msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." -msgstr "" - -msgctxt "preferences-view" -msgid "This option is unavailable while using a beta version." -msgstr "" - -msgctxt "preferences-view" -msgid "Unpin app from taskbar" -msgstr "" - -msgctxt "preferences-view" -msgid "Use a monochromatic tray icon instead of a colored one." -msgstr "" - -msgctxt "preferences-view" -msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." -msgstr "" - -msgctxt "preferences-view" -msgid "Warning: This might cause issues on certain websites, services, and programs." -msgstr "" - -msgctxt "preferences-view" -msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." -msgstr "" - -msgctxt "preferences-view" -msgid "When enabled, this feature stops the device from contacting certain domains known to track users." -msgstr "" - -msgctxt "preferences-view" -msgid "When enabled, this feature stops the device from contacting certain known ad domains." -msgstr "" - -msgctxt "preferences-view" -msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." -msgstr "" - -msgctxt "preferences-view" -msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." -msgstr "" - msgctxt "redeem-voucher-alert" msgid "Cancel" msgstr "" @@ -1224,11 +1029,6 @@ msgctxt "settings-view" msgid "Account" msgstr "" -#. Navigation button to the 'Advanced' settings view -msgctxt "settings-view" -msgid "Advanced" -msgstr "" - msgctxt "settings-view" msgid "App is out of sync. Please quit and restart." msgstr "" @@ -1237,36 +1037,35 @@ msgctxt "settings-view" msgid "App version" msgstr "" -#. Link to the webpage +#. Navigation button to the 'Interface settings' view msgctxt "settings-view" -msgid "FAQs & Guides" +msgid "Interface settings" msgstr "" -#. Navigation button to the 'Language' settings view msgctxt "settings-view" -msgid "Language" +msgid "OUT OF TIME" msgstr "" msgctxt "settings-view" -msgid "OUT OF TIME" +msgid "Quit app" msgstr "" -#. Navigation button to the 'Preferences' view +#. Navigation button to the 'Split tunneling' view msgctxt "settings-view" -msgid "Preferences" +msgid "Split tunneling" msgstr "" msgctxt "settings-view" -msgid "Quit app" +msgid "Support" msgstr "" -#. Navigation button to the 'Report a problem' help view msgctxt "settings-view" -msgid "Report a problem" +msgid "Update available. Install the latest app version to stay up to date." msgstr "" +#. Navigation button to the 'VPN settings' view msgctxt "settings-view" -msgid "Update available. Install the latest app version to stay up to date." +msgid "VPN settings" msgstr "" msgctxt "split-tunneling-view" @@ -1336,6 +1135,10 @@ msgid "Unable to launch selection. %(detailedErrorMessage)s" msgstr "" msgctxt "support-view" +msgid "Beta program" +msgstr "" + +msgctxt "support-view" msgid "Continue anyway" msgstr "" @@ -1344,9 +1147,18 @@ msgid "Edit message" msgstr "" msgctxt "support-view" +msgid "Enable to get notified when new beta versions of the app are released." +msgstr "" + +msgctxt "support-view" msgid "Failed to send" msgstr "" +#. Link to the webpage +msgctxt "support-view" +msgid "FAQs & Guides" +msgstr "" + #. The message displayed to the user after submitting the problem report, given that the user left his or her email for us to reach back. #. Available placeholders: #. %(email)s @@ -1363,6 +1175,7 @@ msgid "Please describe your problem in English or Swedish." msgstr "" #. Title label in navigation bar +#. Navigation button to the 'Report a problem' help view msgctxt "support-view" msgid "Report a problem" msgstr "" @@ -1383,11 +1196,20 @@ msgctxt "support-view" msgid "Sent" msgstr "" +#. Title label in navigation bar +msgctxt "support-view" +msgid "Support" +msgstr "" + msgctxt "support-view" msgid "Thanks!" msgstr "" msgctxt "support-view" +msgid "This option is unavailable while using a beta version." +msgstr "" + +msgctxt "support-view" msgid "To help you more effectively, your app's log file will be attached to this message. Your data will remain secure and private, as it is anonymised before being sent over an encrypted channel." msgstr "" @@ -1447,6 +1269,194 @@ msgctxt "tunnel-control" msgid "Switch location" msgstr "" +#. %(openvpn)s will be replaced with the string "OpenVPN" +msgctxt "vpn-settings-view" +msgid "%(openvpn)s settings" +msgstr "" + +#. %(wireguard)s will be replaced with the string "WireGuard" +msgctxt "vpn-settings-view" +msgid "%(wireguard)s settings" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Add a server" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Add anyway" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Allows access to other devices on the same network for sharing, printing etc." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Auto-connect" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Automatically connect to a server when the app launches." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Block ads" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Block adult content" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Block gambling" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Block malware" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Block trackers" +msgstr "" + +#. This is displayed when the custom DNS setting is turned on which makes the block +#. ads/trackers settings disabled. The text enclosed in "**" will appear bold. +#. Advanced settings refer to the name of the page with the title "Advanced". +#. Available placeholders: +#. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. +msgctxt "vpn-settings-view" +msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." +msgstr "" + +#. This is displayed when either or both of the block ads/trackers settings are +#. turned on which makes the custom DNS setting disabled. The text enclosed in "**" +#. will appear bold. +#. Available placeholders: +#. %(preferencesPageName)s - The page title showed on top in the preferences page. +msgctxt "vpn-settings-view" +msgid "Disable all content blockers to activate this setting." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Enable IPv6" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Enable IPv6 communication through the tunnel." +msgstr "" + +#. The label next to the multihop settings toggle. +msgctxt "vpn-settings-view" +msgid "Enable multihop" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Enable to add at least one DNS server." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Enter IP" +msgstr "" + +#. Description for multihop settings toggle. +#. Available placeholders: +#. %(wireguard)s - Will be replaced with the string "WireGuard" +msgctxt "vpn-settings-view" +msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Kill switch" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Launch app on start-up" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Local network sharing" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Lockdown mode" +msgstr "" + +msgctxt "vpn-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 "" + +msgctxt "vpn-settings-view" +msgid "The difference between the Kill Switch and Lockdown Mode is that the Kill Switch will prevent any leaks from happening during automatic tunnel reconnects, software crashes and similar accidents." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "The difference between the Kill Switch and Lockdown Mode is that the Kill Switch will prevent any leaks from happening during automatic tunnel reconnects, software crashes and similar accidents. With Lockdown Mode enabled, you must be connected to a Mullvad VPN server to be able to reach the internet. Manually disconnecting or quitting the app will block your connection." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." +msgstr "" + +#. Available placeholders: +#. %(tunnelProtocol)s - the name of the tunnel protocol setting +#. %(wireguard)s - will be replaced with "WireGuard" +msgctxt "vpn-settings-view" +msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "This built-in feature prevents your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails, it does this by blocking your traffic until your connection is reestablished." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Tunnel protocol" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Use custom DNS server" +msgstr "" + +#. Title label in navigation bar +msgctxt "vpn-settings-view" +msgid "VPN settings" +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "Warning: This might cause issues on certain websites, services, and programs." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "When enabled, this feature stops the device from contacting certain domains known to track users." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "When enabled, this feature stops the device from contacting certain known ad domains." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." +msgstr "" + +msgctxt "vpn-settings-view" +msgid "With Lockdown Mode enabled, you must be connected to a Mullvad VPN server to be able to reach the internet. Manually disconnecting or quitting the app will block your connection." +msgstr "" + #. Title label in navigation bar #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" @@ -1505,6 +1515,9 @@ msgstr "" msgid "Account time reminders" msgstr "" +msgid "Advanced" +msgstr "" + msgid "All applications" msgstr "" @@ -1595,6 +1608,9 @@ msgstr "" msgid "No relay server matches the current settings" msgstr "" +msgid "Preferences" +msgstr "" + msgid "Public key" msgstr "" @@ -1619,9 +1635,6 @@ msgstr "" msgid "Shows reminders when the account time is about to expire" msgstr "" -msgid "Split tunneling" -msgstr "" - msgid "Split tunneling makes it possible to select which applications should not be routed through the VPN tunnel." msgstr "" diff --git a/gui/locales/my/messages.po b/gui/locales/my/messages.po index 03a4d15871..7a2c47fdd4 100644 --- a/gui/locales/my/messages.po +++ b/gui/locales/my/messages.po @@ -299,20 +299,20 @@ msgid "Advanced" msgstr "အဆင့်မြင့်" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s ဆက်တင်များ" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s ဆက်တင်များ" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "ဆာဗာ ပေါင်းထည့်ရန်" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "မည်သို့ပင်ဖြစ်စေ ပေါင်းထည့်ရန်" @@ -328,24 +328,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "သတိပြုရန်- ၎င်းကို ဖွင့်ခြင်းဖြင့် အင်တာနက် သုံးရန်အတွက် Mullvad VPN ချိတ်ဆက်မှုကို အမြဲ လိုအပ်ပါမည်။" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "IPv6 ကို ဖွင့်ရန်" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Tunnel မှတစ်ဆင့် IPv6 ဆက်သွယ်ရေးကို လုပ်ဆောင်စေနိုင်ပါသည်။" #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "မာလ်တီဟော့ပ်ကို ဖွင့်ရန်" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "အနည်းဆုံး DNS ဆာဗာတစ်ခုကို ပေါင်းထည့်ပါ။" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "IP ဖြည့်ပါ" @@ -356,7 +356,7 @@ msgstr "ဤအက်ပ်နှင့် ချိတ်ဆက်မှုပ #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "သင်၏ ကူးလူးမှုကို %(wireguard)s ဆာဗာတစ်ခုသို့ လမ်းကြောင်း ပို့ပြီး အခြားတစ်ခုမှ ထုတ်ခြင်းဖြင့် သိုသိပ်ထားမှုကို တိုးစေပြီး ခြေရာခံရန် ခက်ခဲစေပါသည်။" @@ -364,22 +364,22 @@ 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 "ဤအက်ပ်၏ မူလပါရှိသော Kill Switch ကို အမြဲဖွင့်ထားပါ။ ထို့အပြင် ချိတ်ဆက်မှုဖြုတ်ရန် သို့မဟုတ် ထွက်ရန်ကို နှိပ်ခြင်းဖြင့် ဤဆက်တင်သည် အင်တာနက်ကို ပိတ်ဆို့သွားပါလိမ့်မည်။" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "သင်ပေါင်းထည့်လိုသည့် DNS ဆာဗာသည် သီးသန့် IP ဖြစ်ပါသည်။ ၎င်းကို သုံးရန် သင့်ကွန်ရက် အင်တာဖေ့(စ်)များကို သေချာ သီးသန့်စီစဉ်ထားပါ။" #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "သင်ပေါင်းထည့်လိုသော DNS ဆာဗာသည် အများသုံးဖြစ်ပြီး %(wireguard)s ဖြင့်သာ လုပ်ဆောင်ပါမည်။ ၎င်းင်းကို အမြဲအလုပ်လုပ်စေရန် \"%(tunnelProtocol)s\" (အဆင့်မြင့် ဆက်တင်တွင်) ကို %(wireguard)s အဖြစ် သတ်မှတ်ပါ။" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Tunnel ပရိုတိုကောလ်" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "စိတ်ကြိုက် DNS ဆာဗာကို သုံးရန်" @@ -988,39 +988,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "လိုလားမှုများ" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "ဝေမျှရန်၊ ပရင့်ထုတ်ရန်စသည်တို့အတွက် တူညီသည့် ကွန်ရက်ရှိ အခြားစက်များ ရယူသုံးစွဲခွင့်ပြုပေးပါသည်။" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "အော်တို ချိတ်ဆက်မှု" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "အက်ပ် စတင်ဆောင်ရွက်ချိန်တွင် ဆာဗာနှင့် အော်တို ချိတ်ဆက်သွားပါမည်။" -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "စမ်းသပ် ပရိုဂရမ်" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "ကြော်ငြာများ ပိတ်ဆို့ရန်" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "အရွယ်ရောက်ပြီးသူများအတွက် အကြောင်းအရာကို ပိတ်ဆို့ရန်" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "လောင်းကစားကို ပိတ်ဆို့ရန်" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "မဲလ်ဝဲရ်ကို ပိတ်ဆို့ရန်" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "ခြေရာခံမှုများကို ပိတ်ဆို့ရန်" @@ -1029,7 +1029,7 @@ msgstr "ခြေရာခံမှုများကို ပိတ်ဆိ #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "ဤဆက်တင်များကို သက်ဝင်အောင် လုပ်ဆောင်ရန် **%(customDnsFeatureName)s** ကို (အဆင့်မြင့် ဆက်တင်အောက်တွင်) ပိတ်ပါ။" @@ -1042,35 +1042,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "ဤဆက်တင်ကို သက်ဝင်လုပ်ဆောင်ရန် အကြောင်းအရာ ပိတ်ဆို့မှု (%(preferencesPageName)s အောက်ရှိ) ကို ပိတ်ပါ။" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "စနစ် အသိပေးချက်များကို ဖွင့်ပါ သို့မဟုတ် ပိတ်ပါ။ အလွန်အရေးပါသည့် အသိပေးချက်များကို အမြဲပြသပါလိမ့်မည်။" -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "အက်ပ်၏ စမ်းသပ်ဗားရှင်း အသစ်ကို ဖြန့်ချိသည့်အခါ အသိပေးစေရန် ဖွင့်ထားပါ။" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "အက်ပ်အား လွတ်လပ်သည့် သီးသန့် ဝင်းဒိုးအဖြစ် ရွှေ့နိုင်စေပါသည်။" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Kill Switch" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "စက်အတွင်း စတင်ဝင်ရောက်ချိန်တွင် အက်ပ်ကို စတင်ဆောင်ရွက်မှု" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "လိုကယ် ကွန်ရက် ဝေမျှမှု" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "တစ်ရောင်တည်းပြ မီနျူးဘား အိုင်ကွန်" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "အသိပေးချက်များ" @@ -1078,55 +1078,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "လိုလားမှုများ" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "အက်ပ် စတင်ချိန်တွင် မီနျူးဘား အိုင်ကွန်ကိုသာ ပြသပါ။" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "စတင်မှု အကျဉ်းချုံ့ထားမှု" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "ဤအက်ပ်တွင် ပုံသေ ဖွင့်ထားပြီး ပိတ်မရနိုင်သည့် မူလပါရှိသော Kill Switch တစ်ခု ရှိပါသည်။ ၎င်းသည် သင့်ကွန်ရက် အလုပ်လုပ်နေသည်မှ ရုတ်တရတ် ရပ်သွားသည့်အခါ သို့မဟုတ် Tunnel သည် အကြောင်းတစ်ခုခုကြောင့် အလုပ်မလုပ်နိုင်သည့်အခါ သင်၏ ကူးလူးမှုကို VPN Tunnel ပြင်ပသို့ ပေါက်ကြားမှု မရှိစေရန် ကာကွယ်ပေးပါသည်။ Mullvad သည် သင်၏ ချိတ်ဆက်မှု ပြန်အစပြုသည်အထိ သင့်ဒေတာများကို အော်တိုကာကွယ်ပေးပါသည်။" -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "စမ်းသပ်ဗားရှင်းကို သုံးနေစဉ် ဤရွေးချယ်မှုကို မရရှိနိုင်ပါ။" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "အက်ပ်ကို လုပ်ဆောင်ချက်ဘားတွင် ပင်တွဲထားသည်မှ ဖြုတ်ရန်" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "ရောင်စုံအစား တစ်ရောင်တည်းပြ မီနျူးဘား အိုင်ကွန်ကို သုံးပါသည်။" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "သတိပေးချက်- ၎င်းသည် အပိုအကာအကွယ်လွှာ တစ်ခုသာဖြစ်ပြီး anti-virus မဟုတ်၍ ဤသို့ မလုပ်ဆောင်သင့်ပါ။" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "သတိပေးချက်- ၎င်းသည် အချို့သော ဝဘ်ဆိုက်များ၊ ဝန်ဆောင်မှုများ နှင့် ပရိုဂရမ်များတွင် ပြဿနာများကို ဖြစ်စေနိုင်သည်။" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "ဖွင့်ထားသောအခါ ဤလုပ်ဆောင်ချက်သည် စက်ကို မဲလ်ဝဲရ် လက်ခံသူဟု သိထားသည့် အချို့သော နယ်ပယ်များနှင့် ဆက်သွယ်ခြင်းမှ ရပ်တန့်စေသည်။" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "ဖွင့်ထားသောအခါ ဤလုပ်ဆောင်ချက်သည် စက်အား သုံးစွဲသူများကို ခြေရာခံရန် ဟု သိထားသည့် အချို့သော နယ်ပယ်များနှင့် ဆက်သွယ်ခြင်းမှ ရပ်တန့်စေသည်။" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "ဖွင့်ထားသောအခါ ဤလုပ်ဆောင်ချက်သည် စက်အား အချို့သော ကြော်ငြာနယ်ပယ်များကို ဆက်သွယ်ခြင်းမှ ရပ်တန့်စေသည်။" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "ဖွင့်ထားသောအခါ ဤလုပ်ဆောင်ချက်သည် စက်အား အရွယ်ရောက်ပြီးသူများအတွက် အကြောင်းအရာကို လက်ခံရန် သိထားသည့် အချို့သော ဝဘ်ဆိုက်များနှင့် ဝန်ဆောင်မှုများကို ဆက်သွယ်ခြင်းမှ ရပ်တန့်စေသည်။" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "ဖွင့်ထားသောအခါ ဤလုပ်ဆောင်ချက်သည် စက်အား လောင်းကစား အကြောင်းအရာကို လက်ခံရန် သိထားသည့် အချို့သော ဝဘ်ဆိုက်များနှင့် ဝန်ဆောင်မှုများကို ဆက်သွယ်ခြင်းမှ ရပ်တန့်စေသည်။" @@ -1237,12 +1237,12 @@ msgid "App version" msgstr "အက်ပ်ဗားရှင်း" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "မေးလေ့ရှိသည့် မေးခွန်းများနှင့် လမ်းညွှန်များ" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "ဘာသာစကား" diff --git a/gui/locales/nb/messages.po b/gui/locales/nb/messages.po index d3d210ef9e..60d1ebff4f 100644 --- a/gui/locales/nb/messages.po +++ b/gui/locales/nb/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Avansert" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s-innstillinger" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s-innstillinger" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Legg til en server" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Legg til likevel" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Advarsel: Hvis du aktiverer dette, må du alltid ha en Mullvad VPN-tilkobling for å være tilkoblet internett." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "Aktiver IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Aktiver IPv6-kommunikasjon gjennom tunnelen." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Aktiver multihop" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Aktiver for å legge til minst én DNS-server." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Angi IP" @@ -367,7 +367,7 @@ msgstr "Hvis du kobler fra eller lukker appen, vil denne innstillingen blokkere #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Øker anonymiteten ved å dirigere trafikken til én %(wireguard)s-server og ut en annen, noe som gjør det vanskeligere å spore." @@ -375,22 +375,22 @@ 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 "Appens innebygde «Kill Switch» er alltid på. Innstillingen bil også blokkere tilgangen til internettet hvis du trykker på Koble fra eller Lukk." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "DNS-serveren som du vil legge til, er en privat IP. Du må forsikre deg om at nettverksgrensesnittene er konfigurert til å kunne bruke den." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "DNS-serveren du vil legge til er offentlig og fungerer bare med %(wireguard)s. For å sikre at den alltid fungerer, se %(wireguard)s «%(tunnelProtocol)s» (i avanserte innstillinger)." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Tunnelprotokoll" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Bruk egendefinert DNS-server" @@ -999,39 +999,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Preferanser" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Gir tilgang til andre enheter på samme nettverk for deling, utskrift osv." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Automatisk tilkobling" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Kobler automatisk til en server når appen starter." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Betaprogram" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Blokker annonser" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Blokker voksent innhold" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Blokker gambling" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Blokker skadelig programvare" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Blokker sporere" @@ -1040,7 +1040,7 @@ msgstr "Blokker sporere" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Deaktiver **%(customDnsFeatureName)s** (under Avanserte innstillinger) for å aktivere disse innstillingene." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Deaktiver all innholdsblokkering (under %(preferencesPageName)s) for å aktivere denne innstillingen." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Aktiver eller deaktiver systemmeldinger. Kritiske meldinger vil alltid vises." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Aktiver for å bli varslet når betaversjoner av appen lanseres." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Aktiver for å flytte appen rundt som et frittstående vindu." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Avbruddsbryter" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Kjør app ved oppstart" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Deling over lokalt nettverk" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Ensfarget skuffeikon" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Meldinger" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Preferanser" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Vis bare skuffeikonet når appen starter." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Start i minimert tilstand" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "Appen har en innebygd avbruddsbryter som er aktivert som standard og ikke kan deaktiveres. Dette er for å forhindre at trafikken din lekker utenfor VPN-tunnelen hvis nettverket ditt plutselig slutter å fungere eller hvis tunnelen av en eller annen grunn svikter. Mullvad beskytter automatisk dataene dine til tilkoblingen er gjenopprettet." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Dette alternativet er utilgjengelig i betaversjonen." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Fjern appen fra menylinjen" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Bruk ensfarget skuffeikon i stedet for flerfarget." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Advarsel: Dette er ikke et antivirusprogram og skal ikke brukes som dette. Det er bare et ekstra lag med beskyttelse." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Advarsel: Dette kan føre til problemer på enkelte nettsteder, tjenester og programmer." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Når den er aktivert, stopper denne funksjonen enheten fra å kontakte visse domener som er kjent for å inneholde skadelig programvare." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Når den er aktivert, stopper denne funksjonen enheten fra å kontakte visse domener som er kjent for å spore brukere." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Når den er aktivert, stopper denne funksjonen enheten fra å kontakte visse annonsedomener." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Når den er aktivert, stopper denne funksjonen enheten fra å kontakte visse nettsteder og tjenester som er kjent for å inneholde voksent innhold." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Når den er aktivert, stopper denne funksjonen enheten fra å kontakte visse nettsteder og tjenester som er kjent for å inneholde gambling-innhold." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "Appversjon" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "Ofte stilte spørsmål og veiledninger" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Språk" diff --git a/gui/locales/nl/messages.po b/gui/locales/nl/messages.po index abc8ec2570..af0df009fd 100644 --- a/gui/locales/nl/messages.po +++ b/gui/locales/nl/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Geavanceerd" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s-instellingen" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s-instellingen" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Server toevoegen" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Toch toevoegen" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Opgelet: dit inschakelen vereist altijd een Mullvad VPN-verbinding om het internet te bereiken." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "IPv6 activeren" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Activeer IPv6-communicatie door de tunnel." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Multihop inschakelen" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Schakel in om minimaal één DNS-server toe te voegen." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Voer IP-adres in" @@ -367,7 +367,7 @@ msgstr "Als u de verbinding verbreekt of de app verlaat, blokkeert deze instelli #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Verhoogt de anonimiteit doordat uw verkeer in de ene %(wireguard)s-server binnenkomt en bij een andere server eruit gaat, waardoor het moeilijker te traceren is." @@ -375,22 +375,22 @@ 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 "De ingebouwde killswitch van de app staat altijd aan. Deze instelling blokkeert het internet bovendien als men op Verbinding verbreken of Afsluiten klikt." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "De DNS-server die u wilt toevoegen is een particulier IP-adres. U moet controleren of uw netwerkinterfaces zijn geconfigureerd om dit te gebruiken." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "De DNS-server die u wilt toevoegen is openbaar en werkt alleen met %(wireguard)s. Om ervoor te zorgen dat deze altijd werkt, moet u het \"%(tunnelProtocol)s\" instellen op %(wireguard)s (in Geavanceerde instellingen)." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Tunnelprotocol" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Aangepaste DNS-server gebruiken" @@ -999,39 +999,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Voorkeuren" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Biedt toegang tot andere toestellen op hetzelfde netwerk voor delen, afdrukken, en dergelijke" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Automatisch verbinden" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Automatisch verbinden met een server wanneer de app wordt opgestart." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Bètaprogramma" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Advertenties blokkeren" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Content voor volwassenen blokkeren" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Gokken blokkeren" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Malware blokkeren" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Trackers blokkeren" @@ -1040,7 +1040,7 @@ msgstr "Trackers blokkeren" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Schakel **%(customDnsFeatureName)s** uit (onder Geavanceerde instellingen) om deze instellingen te activeren." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Alle contentblokkeringen uitschakelen (bij %(preferencesPageName)s) om deze instelling te activeren." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Schakel systeemnotificaties in of uit. Kritieke notificaties worden altijd weergegeven." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Schakel dit in om meldingen te ontvangen wanneer er nieuwe bètaversies van de app worden uitgebracht." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Schakel de optie in om de app rond te bewegen als een vrijstaand scherm." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Kill switch" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Lanceren bij opstarten" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Delen op lokaal netwerk" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Monochroom taakbalkpictogram" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Notificaties" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Voorkeuren" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Toon het pictogram op de taakbalk alleen wanneer de app opstart." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Geminimaliseerd opstarten" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "De app heeft een ingebouwde kill switch die standaard in ingeschakeld en niet kan worden uitgeschakeld. Hiermee wordt voorkomen dat uw verkeer buiten de VPN-tunnel lekt als het netwerk ineens niet meer werkt of er om de een of andere reden een storing in de tunnel is. Mullvad beschermt automatisch uw gegevens tot de verbinding weer hersteld is." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Deze optie is niet beschikbaar in een bètaversie." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "App losmaken van taakbalk" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Gebruik een monochroom pictogram op de taakbalk in plaats van een gekleurd." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Waarschuwing: dit is geen antivirus en mag niet als zodanig behandeld worden. Dit is slechts een extra beschermingslaag." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Waarschuwing: dit kan problemen veroorzaken op bepaalde websites, diensten en programma's." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Als deze functie is ingeschakeld, maakt het apparaat geen contact meer met bepaalde domeinen waarvan bekend is dat ze malware hosten." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Als deze functie is ingeschakeld, maakt het apparaat geen contact meer met bepaalde domeinen waarvan bekend is dat ze gebruikers volgen." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Als deze functie is ingeschakeld, maakt het apparaat geen contact meer met bepaalde bekende advertentiedomeinen." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Als deze functie is ingeschakeld, maakt het apparaat geen contact meer met bepaalde websites en services waarvan bekend is dat ze content voor volwassenen hosten." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Als deze functie is ingeschakeld, maakt het apparaat geen contact meer met bepaalde websites en services waarvan bekend is dat ze gokspelen hosten." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "Appversie" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "Veelgestelde vragen en gidsen" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Taal" diff --git a/gui/locales/pl/messages.po b/gui/locales/pl/messages.po index 1852f33c13..3d684e35a7 100644 --- a/gui/locales/pl/messages.po +++ b/gui/locales/pl/messages.po @@ -332,20 +332,20 @@ msgid "Advanced" msgstr "Zaawansowane" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "Ustawienia %(openvpn)s" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "Ustawienia %(wireguard)s" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Dodaj serwer" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Mimo to dodaj" @@ -361,24 +361,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Uwaga: wskutek włączenia tej opcji w celu uzyskania dostępu do Internetu zawsze wymagane będzie połączenie przez Mullvad VPN." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "Włącz IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Włącz komunikację IPv6 przez tunel." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Włącz wielokrotne przeskoki" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Włącz, aby dodać co najmniej jeden serwer DNS." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Wprowadź adres IP" @@ -389,7 +389,7 @@ msgstr "Jeśli rozłączysz się lub zamkniesz aplikację, to ustawienie będzie #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Zwiększa anonimowość, kierując ruch do jednego serwera %(wireguard)s i wyprowadzając go z drugiego, co utrudnia śledzenie." @@ -397,22 +397,22 @@ 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 "Wbudowany kill switch aplikacji jest zawsze włączony. To ustawienie dodatkowo blokuje dostęp do Internetu w razie kliknięcia przycisku Rozłącz lub Zamknij." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "Serwer DNS, który chcesz dodać, ma prywatny adres IP. Upewnij się, że Twoje interfejsy sieciowe są skonfigurowane do korzystania z niego." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "Serwer DNS, który chcesz dodać, jest publiczny i będzie działał wyłącznie z %(wireguard)s. Aby zapewnić ciągłe działanie, ustaw „%(tunnelProtocol)s” (w Ustawieniach zaawansowanych) na %(wireguard)s." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Protokół tunelowania" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Użyj niestandardowego serwera DNS" @@ -1021,39 +1021,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Preferencje" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Umożliwia dostęp do innych urządzeń w tej samej sieci w celu udostępniania, drukowania itd." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Automatyczne łączenie" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Automatycznie łącz z serwerem po uruchomieniu aplikacji." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Program Beta" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Blokuj reklamy" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Blokuj treści dla dorosłych" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Blokuj treści hazardowe" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Blokuj malware" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Blokuj trackery" @@ -1062,7 +1062,7 @@ msgstr "Blokuj trackery" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Aby aktywować te ustawienia, wyłącz **%(customDnsFeatureName)s** (w Ustawieniach zaawansowanych)." @@ -1075,35 +1075,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Aby to ustawić, wyłącz wszystkie funkcje blokowania treści (w sekcji %(preferencesPageName)s)." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Włącz lub wyłącz powiadomienia systemowe. Krytyczne powiadomienia będą zawsze wyświetlane." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Włącz, aby otrzymywać powiadomienia o wydaniu nowych wersji beta aplikacji." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Włącz, aby przenosić aplikację jako swobodne okno." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Kill switch" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Uruchom aplikację na starcie" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Udostępnianie sieci lokalnej" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Monochromatyczna ikona na pasku" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Powiadomienia" @@ -1111,55 +1111,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Preferencje" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Ikonę na pasku pokazuj tylko przy uruchamianiu aplikacji." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Uruchom zminimalizowaną" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "Aplikacja ma wbudowany kill switch, który jest domyślnie włączony i nie można go wyłączyć. Ma to na celu zapobieganie wyciekom ruchu poza tunel VPN, jeśli sieć nagle przestanie działać lub tunel ulegnie awarii z jakiegokolwiek powodu. Mullvad automatycznie chroni dane do momentu ponownego nawiązania połączenia." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "W wersji beta ta opcja jest niedostępna." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Odepnij aplikację od paska zadań" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Użyj monochromatycznej ikony na pasku, zamiast kolorowej." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Ostrzeżenie: to nie jest program antywirusowy i nie należy go tak traktować. To jedynie dodatkowa warstwa zabezpieczeń." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Ostrzeżenie: może to powodować problemy z niektórymi witrynami, usługami i programami." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Po włączeniu funkcja ta uniemożliwia urządzeniu kontakt z określonymi domenami, zawierającymi złośliwe oprogramowanie." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Po włączeniu funkcja ta uniemożliwia urządzeniu kontakt z określonymi domenami, które śledzą użytkowników." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Po włączeniu funkcja ta uniemożliwia urządzeniu kontakt ze znanymi domenami reklamowymi." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Po włączeniu funkcja ta uniemożliwia urządzeniu kontakt z określonymi witrynami i usługami, które udostępniają treści dla dorosłych." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Po włączeniu funkcja ta uniemożliwia urządzeniu kontakt z określonymi witrynami i usługami, które udostępniają treści hazardowe." @@ -1270,12 +1270,12 @@ msgid "App version" msgstr "Wersja aplikacji" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "Często zadawane pytania i poradniki" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Język" diff --git a/gui/locales/pt/messages.po b/gui/locales/pt/messages.po index c58ec399c5..51b452c2ed 100644 --- a/gui/locales/pt/messages.po +++ b/gui/locales/pt/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Avançadas" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "Definições %(openvpn)s" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "Definições do %(wireguard)s" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Adicionar um servidor" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Adicionar mesmo assim" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Atenção: ativar esta opção exige sempre uma ligação através de Mullvad VPN para aceder à Internet." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "Ativar IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Ativar comunicação IPv6 através do túnel." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Ativar multihop" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Ativar para adicionar pelo menos um servidor DNS." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Introduzir IP" @@ -367,7 +367,7 @@ msgstr "Se o utilizador se desligar ou sair da aplicação, esta configuração #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Aumenta a anonimidade ao redirecionar o seu tráfego para entrar num servidor %(wireguard)s e sair noutro, tornando-o mais difícil de seguir." @@ -375,22 +375,22 @@ 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 "O kill switch integrado da aplicação está sempre ligado. Esta configuração bloqueará adicionalmente a Internet caso o utilizador se desligue ou saia da aplicação." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "O servidor DNS que deseja adicionar é um IP privado. Tem de garantir que os seus interfaces de rede estão configurados para utilizá-lo." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "O servidor DNS que pretende adicionar é público e só funcionará com %(wireguard)s. Para garantir que funciona sempre, defina o \"%(tunnelProtocol)s\" (nas Definições Avançadas) para %(wireguard)s." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Protocolo do túnel" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Usar servidor DNS personalizado" @@ -999,39 +999,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Preferências" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Permite o acesso a outros dispositivos na mesma rede para partilha, impressão, etc." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Ligação automática" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Liga-se automaticamente a um servidor quando a app inicia." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Programa beta" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Bloquear anúncios" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Bloquear conteúdos para adultos" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Bloquear jogo" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Bloquear malware" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Bloquear trackers" @@ -1040,7 +1040,7 @@ msgstr "Bloquear trackers" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Desativar **%(customDnsFeatureName)s** (em Definições Avançadas) para ativar estas definições." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Desativar todos os bloqueadores de conteúdos (em %(preferencesPageName)s) para ativar esta definição." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Habilitar ou desabilitar as notificações de sistema. As notificações críticas serão sempre exibidas." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Ative para ser notificado quando forem lançadas novas versões beta da aplicação." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Ative para movimentar a aplicação como uma janela independente." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Kill switch" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Iniciar a app no arranque" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Partilha de rede local" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Ícone de bandeja monocromático" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Notificações" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Preferências" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Mostrar apenas o ícone da bandeja quando a aplicação inicia." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Iniciar minimizado" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "A aplicação tem um kill switch integrado que está ativado por defeito e não pode ser desativado. Serve para evitar que o seu tráfego saia do túnel VPN caso a rede deixe de funcionar ou se o túnel falhar por algum motivo. O Mullvad protege automaticamente os seus dados até a ligação ser restabelecida." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Esta opção não está disponível na versão beta." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Remover a aplicação da barra de tarefas" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Utilizar um ícone de bandeja monocromático em vez de um colorido." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Aviso: isto não se trata de um antivírus e não deve ser tratado como tal, é apenas uma camada extra de proteção." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Aviso: poderá causar problemas em alguns sites, serviços e programas." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Quando ativada, esta funcionalidade impede que o dispositivo contacte determinados domínios conhecidos por alojar malware." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Quando ativada, esta funcionalidade impede que o dispositivo contacte determinados domínios conhecidos por controlar os utilizadores." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Quando ativada, esta funcionalidade impede que o dispositivo contacte determinados domínios de publicidade conhecidos." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Quando ativada, esta funcionalidade impede que o dispositivo contacte determinados sítios web e serviços conhecidos por alojar conteúdo adulto." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Quando ativada, esta funcionalidade impede que o dispositivo contacte determinados sítios web e serviços conhecidos por alojar conteúdo de apostas." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "Versão da app" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "Perguntas frequentes e guias" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Idioma" diff --git a/gui/locales/ru/messages.po b/gui/locales/ru/messages.po index 768cd375d4..2d7026a0df 100644 --- a/gui/locales/ru/messages.po +++ b/gui/locales/ru/messages.po @@ -332,20 +332,20 @@ msgid "Advanced" msgstr "Дополнительные" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "Настройки %(openvpn)s" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "Настройки %(wireguard)s" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Добавить сервер" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Всё равно добавить" @@ -361,24 +361,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Внимание: при активации этого параметра для выхода в Интернет необходимо будет обязательно подключиться через Mullvad VPN." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "Включить IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Включить передачу данных по IPv6 через туннель." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Многократные переходы" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Чтобы добавить как минимум один DNS-сервер, включите этот параметр." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Введите IP-адрес" @@ -389,7 +389,7 @@ msgstr "Если разорвать соединение или закрыть #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Повышает анонимность, направляя трафик с одного сервера %(wireguard)s на другой, что затрудняет отслеживание." @@ -397,22 +397,22 @@ 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 "Функция аварийного отключения, встроенная в приложение, всегда включена. Этот параметр дополнительно блокирует Интернет при нажатии \"Отключить\" или \"Выход\"." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "DNS-сервер, который вы хотите добавить, является частным IP-адресом. Убедитесь, что сетевые интерфейсы настроены на его использование." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "DNS-сервер, который вы хотите добавить, является общедоступным и будет работать только с %(wireguard)s. Чтобы он работал всегда, установите значение %(wireguard)s для опции «%(tunnelProtocol)s» (в дополнительных настройках)." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Протокол туннелирования" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Пользовательский DNS-сервер" @@ -1025,35 +1025,35 @@ msgctxt "preferences-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Разрешить доступ к другим устройствам в той же сети для передачи данных, печати и т. д." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Автоподключение" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Автоматически подключаться к серверу при запуске приложения." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Бета-программа" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Блокировать рекламу" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Блокировать контент для взрослых" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Блокировать азартные игры" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Блокировать вредоносное ПО" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Блокировать трекеры" @@ -1062,7 +1062,7 @@ msgstr "Блокировать трекеры" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Чтобы активировать эти параметры, отключите опцию **%(customDnsFeatureName)s** (в дополнительных настройках)." @@ -1075,35 +1075,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Чтобы активировать этот параметр, отключите все блокировщики контента (в разделе %(preferencesPageName)s)." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Включить или отключить системные уведомления. Критические уведомления будут отображаться в любом случае." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Включить оповещения о выходе новых бета-версий приложения." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Возможность передвигать приложение на экране как незакрепленное окно." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Аварийное отключение" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Автозапуск приложения при загрузке системы" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Обмен данными в локальной сети" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Черно-белый значок в области уведомлений" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Уведомления" @@ -1111,55 +1111,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Параметры" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "При запуске приложения показывать только значок в области уведомлений." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Запускать свернутым" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "Приложение имеет встроенную функцию аварийного отключения (kill switch), которая включена по умолчанию, и ее нельзя выключить. Это сделано, чтобы предотвратить утечку трафика за пределы VPN-туннеля, если сеть внезапно перестанет работать или если по какой-либо причине туннель деактивируется. Mullvad будет автоматически защищать ваши данные, пока соединение не восстановится." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Параметр недоступен в бета-версии." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Открепить приложение от панели задач" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Использовать в области уведомлений черно-белый значок вместо цветного." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Предупреждение: это просто дополнительный уровень защиты, а не антивирус." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Предупреждение: это может привести к проблемам при использовании некоторых сайтов, служб и программ." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Устройство не будет устанавливать соединение с определенными доменами, на которых размещаются вредоносные программы." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Устройство не будет устанавливать соединение с определенными доменами, которые отслеживают пользователей." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Устройство не будет устанавливать соединение с определенными рекламными доменами." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Устройство не будет устанавливать соединение с определенными сайтами и службами, которые размещают контент для взрослых." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Устройство не будет устанавливать соединение с определенными сайтами и службами, которые размещают контент, относящийся к азартным играм." @@ -1270,12 +1270,12 @@ msgid "App version" msgstr "Версия приложения" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "Ответы на вопросы и руководства" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Язык" diff --git a/gui/locales/sv/messages.po b/gui/locales/sv/messages.po index eb32a6bcce..86676b8994 100644 --- a/gui/locales/sv/messages.po +++ b/gui/locales/sv/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Avancerat" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s-inställningar" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s-inställningar" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Lägg till en server" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Lägg till ändå" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Obs! Om du aktiverar detta kommer det alltid att krävas en Mullvad VPN-anslutning för att nå internet." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "Aktivera IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Aktivera IPv6-kommunikation genom tunneln." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Aktivera multihopp" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "Aktivera för att lägga till minst en DNS-server." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "Ange IP" @@ -367,7 +367,7 @@ msgstr "Om du kopplar från eller avslutar appen kommer den här inställningen #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Förbättrar anonymiteten genom att dirigera trafiken till en %(wireguard)s-server och ut genom en annan, vilket gör det svårare att spåra." @@ -375,22 +375,22 @@ 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 "Appens inbyggda Kill Switch är alltid på. Den här inställningen kommer dessutom blockera internet när du klickar på Koppla från eller Avsluta." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "DNS-servern du vill lägga till är en privat IP. Se till att dina nätverksgränssnitt är konfigurerade för att använda den." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "DNS-servern du vill lägga till är offentlig och fungerar bara med %(wireguard)s. Ställ in \"%(tunnelProtocol)s\" (i Avancerade inställningar) som %(wireguard)s så att det alltid fungerar." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Tunnelprotokoll" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Använd anpassad DNS-server" @@ -999,39 +999,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Inställningar" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Tillåter åtkomst till andra enheter i samma nätverk för delning, utskrift etc." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Anslut automatiskt" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Anslut automatiskt till en server när appen startas." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Betaprogram" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Blockera annonser" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Blockera innehåll som är olämpligt för barn" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Blockera hasardspel" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Blockera skadlig kod" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "Blockera spårare" @@ -1040,7 +1040,7 @@ msgstr "Blockera spårare" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Inaktivera **%(customDnsFeatureName)s** (under Avancerade inställningar) för att aktivera dessa inställningar." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Inaktivera alla innehållsblockerare (under %(preferencesPageName)s) för att aktivera den här inställningen." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Aktivera eller inaktivera systemmeddelanden. De kritiska meddelandena kommer alltid att visas." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Aktivera för att få en avisering när nya betaversioner av appen släpps." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Aktivera för att flytta runt appen som ett fristående fönster." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Kill Switch" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Starta appen vid uppstart" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Lokal nätverksdelning" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Enfärgad systemfältsikon" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Meddelanden" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Inställningar" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Visa endast systemfältsikonen när appen startas." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Starta minimerat" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "Appen har en inbyggd Kill Switch som är akiverad som standard och den kan inte inaktiveras. Det är för att hindra din trafik från att läcka utanför VPN-tunneln om ditt nätverk plötsligt slutar fungera eller om tunneln av någon anledning misslyckas. Mullvad skyddar automatiskt dina data tills din anslutning återupprättas." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Det här alternativet är inte tillgängligt när du använder en betaversion." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Lossa appen från aktivitetsfältet" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Använd en enfärgad systemfältsikon i stället för en flerfärgad." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Varning! Det här är inte ett antivirusprogram och bör inte behandlas som ett. Det här är bara ett extra skyddslager." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Varning! Detta kan orsaka problem på vissa webbplatser, tjänster och program." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "När den här funktionen är aktiverad stoppas enheten från att kontakta vissa domäner som är kända för att innehålla skadlig kod." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "När den här funktionen är aktiverad stoppas enheten från att kontakta vissa domäner som är kända för att spåra användare." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "När den här funktionen är aktiverad stoppas enheten från att kontakta vissa kända annonsdomäner." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "När den här funktionen är aktiverad stoppas enheten från att kontakta vissa webbplatser och tjänster som är kända för innehåll som är olämpligt för barn." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "När den här funktionen är aktiverad stoppas enheten från att kontakta vissa webbplatser och tjänster som är kända för innehåll som rör hasardspel." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "Appversion" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "Vanliga frågor och guider" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Språk" diff --git a/gui/locales/th/messages.po b/gui/locales/th/messages.po index c0d9fcf65e..0045affff3 100644 --- a/gui/locales/th/messages.po +++ b/gui/locales/th/messages.po @@ -299,20 +299,20 @@ msgid "Advanced" msgstr "ขั้นสูง" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "การตั้งค่า %(openvpn)s" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "การตั้งค่า %(wireguard)s" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "เพิ่มเซิร์ฟเวอร์" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "เพิ่มต่อไป" @@ -328,24 +328,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "โปรดทราบ: การเปิดใช้งานสิ่งนี้จะทำให้คุณจำเป็นต้องเชื่อมต่อ Mullvad VPN ไว้ตลอดเวลา เพื่อที่จะเข้าถึงอินเทอร์เน็ต" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "เปิดใช้งาน IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "เปิดใช้งานการสื่อสาร IPv6 ผ่านช่องทางการเชื่อมต่อ" #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "เปิดใช้ Multihop" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "เปิดเพื่อเพิ่มเซิร์ฟเวอร์ DNS อย่างน้อยหนึ่งรายการ" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "ป้อน IP" @@ -356,7 +356,7 @@ msgstr "หากคุณตัดการเชื่อมต่อหรื #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "ยกระดับการไม่ระบุตัวตน ด้วยการกำหนดเส้นทางการรับส่งข้อมูลของคุณไปยังเซิร์ฟเวอร์ %(wireguard)s เดียว และออกไปยังอีกเซิร์ฟเวอร์ เพื่อทำให้ติดตามได้ยากขึ้น" @@ -364,22 +364,22 @@ 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 "คิลสวิตช์ภายในแอปจะเปิดใช้งานอยู่เสมอ การตั้งค่านี้จะบล็อกการเข้าถึงอินเทอร์เน็ต หากคุณคลิกไปที่ตัดการเชื่อมต่อ หรือออก" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "เซิร์ฟเวอร์ DNS ที่คุณต้องการเพิ่มเป็น IP ส่วนตัว คุณต้องตรวจสอบให้แน่ใจว่า อินเทอร์เฟซเครือข่ายของคุณ ได้รับการกำหนดค่าให้ใช้เซิร์ฟเวอร์นี้" #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "เซิร์ฟเวอร์ DNS ที่คุณต้องการเพิ่มเป็นแบบสาธารณะ และจะใช้งานกับ %(wireguard)s ได้เท่านั้น ทั้งนี้เพื่อให้มั่นใจว่าเซิร์ฟเวอร์จะทำงานได้ตลอด โปรดตั้งค่า \"%(tunnelProtocol)s\" (ในการตั้งค่าขั้นสูง) เป็น %(wireguard)s" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "โพรโทคอลช่องทางการเชื่อมต่อ" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "ใช้เซิร์ฟเวอร์ DNS แบบกำหนดเอง" @@ -988,39 +988,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "การกำหนดค่า" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "อนุญาตให้เข้าถึงอุปกรณ์อื่นบนเครือข่ายเดียวกันเพื่อแชร์ พิมพ์ ฯลฯ" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "เชื่อมต่ออัตโนมัติ" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "เชื่อมต่อไปยังเซิร์ฟเวอร์โดยอัตโนมัติในทันทีที่เปิดแอป" -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "โปรแกรมรุ่นเบต้า" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "บล็อกโฆษณา" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "บล็อกเนื้อหาสำหรับผู้ใหญ่" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "บล็อกการพนัน" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "บล็อกมัลแวร์" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "บล็อกตัวติดตาม" @@ -1029,7 +1029,7 @@ msgstr "บล็อกตัวติดตาม" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "ปิดใช้งาน **%(customDnsFeatureName)s** (ภายใต้การตั้งค่าขั้นสูง) เพื่อเปิดใช้งานการตั้งค่าเหล่านี้" @@ -1042,35 +1042,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "ปิดตัวบล็อกเนื้อหาทั้งหมด (ภายใต้ %(preferencesPageName)s) เพื่อเปิดใช้งานการตั้งค่านี้" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "เปิดใช้งานหรือปิดใช้งานการแจ้งเตือนระบบ การแจ้งเตือนที่สำคัญมากจะแสดงเสมอ" -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "เปิดใช้งานเพื่อรับการแจ้งเตือน เมื่อมีการแผยแพร่แอปเวอร์ชันเบต้ารุ่นใหม่" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "เปิดใช้งานเพื่อให้เคลื่อนย้ายแอปไปรอบ ๆ เหมือนเป็นหน้าต่างอิสระได้" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "คิลสวิตช์" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "เปิดใช้แอปทันทีที่เปิดเครื่อง" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "การแชร์ในเครือข่ายท้องถิ่น" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "ไอคอนถาดแบบสีโทนเดียว" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "การแจ้งเตือน" @@ -1078,55 +1078,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "การกำหนดค่า" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "แสดงเฉพาะไอคอนถาด เมื่อเริ่มใช้งานแอป" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "เริ่มใช้งานในมุมมองแบบย่อ" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "แอปมีคิลสวิตช์ในตัวที่เปิดใช้งานตามค่าเริ่มต้น และไม่สามารถปิดใช้งานได้ นี่จะเป็นการป้องกันไม่ให้การรับส่งข้อมูลของคุณรั่วไหลออกไปภายนอกช่องทาง VPN หากเครือข่ายของคุณหยุดทำงานกะทันหัน หรือหากช่องทางทำงานผิดพลาดไม่ว่าด้วยเหตุผลใดก็ตาม Mullvad จะปกป้องข้อมูลของคุณโดยอัตโนมัติ จนกว่าการเชื่อมต่อของคุณจะถูกสร้างขึ้นใหม่" -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "ตัวเลือกนี้จะไม่พร้อมใช้งาน ในขณะที่ใช้งานแอปเวอร์ชันเบต้า" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "ถอนหมุดแอปจากแถบงาน" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "ใช้งานไอคอนถาดสีเดียว แทนถาดหลายสี" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "คำเตือน: นี่ไม่ใช่แอนตี้ไวรัส และไม่ควรนำมาใช้ในรูปแบบดังกล่าว นี่เป็นเพียงชั้นการป้องกันเพิ่มเติมเท่านั้น" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "คำเตือน: นี่อาจก่อให้เกิดปัญหากับเว็บไซต์ บริการ และโปรแกรมบางรายการ" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "เมื่อเปิดใช้งาน คุณสมบัตินี้จะหยุดไม่ให้อุปกรณ์ติดต่อกับโดเมนบางรายการ ที่เป็นที่ทราบว่ามีการโฮสต์มัลแวร์เอาไว้" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "เมื่อเปิดใช้งาน คุณสมบัตินี้จะหยุดไม่ให้อุปกรณ์ติดต่อกับโดเมนบางรายการ ที่เป็นที่ทราบว่ามีการติดตามผู้ใช้" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "เมื่อเปิดใช้งาน คุณสมบัตินี้จะหยุดไม่ให้อุปกรณ์ติดต่อกับโดเมนบางรายการ ที่เป็นที่ทราบว่าเป็นโฆษณา" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "เมื่อเปิดใช้งาน คุณสมบัตินี้จะหยุดไม่ให้อุปกรณ์ติดต่อกับ เว็บไซต์หรือบริการบางรายการ ที่เป็นที่ทราบว่ามีการโฮสต์เนื้อหาสำหรับผู้ใหญ่" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "เมื่อเปิดใช้งาน คุณสมบัตินี้จะหยุดไม่ให้อุปกรณ์ติดต่อกับ เว็บไซต์หรือบริการบางรายการ ที่เป็นที่ทราบว่ามีการโฮสต์เนื้อหาการพนัน" @@ -1237,12 +1237,12 @@ msgid "App version" msgstr "เวอร์ชันแอป" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "FAQ และคำแนะนำ" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "ภาษา" diff --git a/gui/locales/tr/messages.po b/gui/locales/tr/messages.po index 271f504ab3..6ebec40a64 100644 --- a/gui/locales/tr/messages.po +++ b/gui/locales/tr/messages.po @@ -310,20 +310,20 @@ msgid "Advanced" msgstr "Gelişmiş" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s ayarları" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s ayarları" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "Sunucu ekle" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "Yine de ekle" @@ -339,24 +339,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "Dikkat: bu seçeneğin etkinleştirilmesi, internete erişim için her zaman bir Mullvad VPN bağlantısı gerektirir." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "IPv6'yı etkinleştir" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "Tünel üzerinden IPv6 iletişimini etkinleştir." #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "Çoklu geçişi etkinleştir" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "En az bir DNS sunucusu eklemek için etkinleştirin." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "IP'yi girin" @@ -367,7 +367,7 @@ msgstr "Uygulamanın bağlantısını keserseniz veya uygulamadan çıkarsanız, #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "Trafiğinizi bir %(wireguard)s sunucusundan diğerine yönlendirerek gizliliği artırır ve izlemeyi zorlaştırır." @@ -375,22 +375,22 @@ 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 "Uygulamanın dahili Kill Switch seçeneği her zaman açıktır. Bu ayar, Bağlantıyı Kes veya Çık seçeneklerini tıklamanız durumunda ayrıca İnternet'i de engeller." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "Eklemek istediğiniz DNS sunucusu özel bir IP'dir. Ağ arayüzlerinizin bu IP'yi kullanacak şekilde yapılandırıldığından emin olun." #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "Eklemek istediğiniz DNS sunucusu herkese açıktır ve sadece %(wireguard)s ile çalışır. Daima çalışması için \"%(tunnelProtocol)s\" seçeneğini (Gelişmiş ayarlardan) %(wireguard)s olarak ayarlayın." -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "Tünel protokolü" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "Özel DNS sunucusu kullanın" @@ -999,39 +999,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "Tercihler" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "Paylaşım, yazdırma vb. için aynı ağdaki diğer cihazlara erişime izin verir." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "Otomatik Bağlan" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "Uygulama başladığında bir sunucuya otomatik olarak bağlan." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "Beta program" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "Reklamları engelle" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "Yetişkinlere özel içerikleri engelle" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "Kumar ve bahis içeriklerini engelle" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "Kötü amaçlı yazılımları engelle" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "İzleyicileri engelle" @@ -1040,7 +1040,7 @@ msgstr "İzleyicileri engelle" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "Bu ayarları etkinleştirmek için **%(customDnsFeatureName)s** (Gelişmiş Ayarlar altından) seçeneğini devre dışı bırakın." @@ -1053,35 +1053,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "Bu ayarı etkinleştirmek için tüm içerik engelleyicileri (%(preferencesPageName)s altında) devre dışı bırakın." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "Sistem bildirimlerini açın veya kapatın. Önemli bildirimler her zaman gösterilir." -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "Uygulamanın yeni beta sürümleri yayınlandığında bildirim almayı etkinleştirin." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "Uygulamayı bağımsız bir pencere olarak taşımak için etkinleştirin." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "Kill Switch" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "Uygulamayı başlangıçta çalıştır" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "Yerel ağ paylaşımı" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "Monokrom sistem çubuğu simgesi" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "Bildirimler" @@ -1089,55 +1089,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "Tercihler" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "Uygulama başladığında sadece sistem çubuğu simgesini göster." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "Küçültülmüş olarak başlat" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "Uygulama, varsayılan olarak etkinleştirilen ve devre dışı bırakılamayan yerleşik bir ağ kapatma anahtarına sahiptir. Bu özellik, ağınız aniden çökerse veya tünel herhangi bir nedenle başarısız olursa, trafiğinizin VPN tünelinden sızmasını önler. Mullvad, bağlantınız yeniden kurulana kadar verilerinizi otomatik olarak korur." -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "Beta sürümde bu seçenek kullanılamaz." -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "Uygulamayı görev çubuğundan kaldır" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "Renkli yerine monokrom bir sistem çubuğu simgesi kullan." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "Uyarı: Bu özellik bir virüsten koruma yazılımı değildir, sadece ek bir koruma düzeyidir. Virüsten koruma yazılımı olarak kullanılmamalıdır." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "Uyarı: Bu özellik belirli web sitelerinde, hizmetlerde ve programlarda sorunlara neden olabilir." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "Bu özellik etkinleştirildiğinde, cihazın kötü amaçlı yazılım barındırdığı bilinen belirli alan adlarıyla iletişim kurması engellenecektir." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "Bu özellik etkinleştirildiğinde, cihazın kullanıcıları takip ettiği bilinen belirli alan adlarıyla iletişim kurması engellenecektir." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "Bu özellik etkinleştirildiğinde, cihazın bilinen belirli reklam alanlarıyla iletişim kurması engellenecektir." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "Bu özellik etkinleştirildiğinde, cihazın yetişkinlere özel içerik barındırdığı bilinen belirli web siteleri ve hizmetlerle iletişim kurması engellenecektir." -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "Bu özellik etkinleştirildiğinde, cihazın kumar ve bahis içeriği barındırdığı bilinen belirli web siteleri ve hizmetlerle iletişim kurması engellenecektir." @@ -1248,12 +1248,12 @@ msgid "App version" msgstr "Uygulama sürümü" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "SSS ve Kılavuzlar" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "Dil" diff --git a/gui/locales/zh-CN/messages.po b/gui/locales/zh-CN/messages.po index 596af7bf6e..2ea9bd62c7 100644 --- a/gui/locales/zh-CN/messages.po +++ b/gui/locales/zh-CN/messages.po @@ -299,20 +299,20 @@ msgid "Advanced" msgstr "高级" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s 设置" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s 设置" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "添加服务器" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "仍然添加" @@ -328,24 +328,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "注意:启用此选项后,将始终需要 Mullvad VPN 才能连接到网络。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "启用 IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "启用通过隧道进行 IPv6 通信。" #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "启用多跳" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "启用以添加至少一个 DNS 服务器。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "输入 IP" @@ -356,7 +356,7 @@ msgstr "如果断开连接或退出应用,此设置将阻止您的网络连接 #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "通过将您的流量路由到一个 %(wireguard)s 服务器中并从另一个服务器传出的方式增加匿名性,提高追踪难度。" @@ -364,22 +364,22 @@ 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 "应用的内置切断开关始终处于开启状态。如果点击“断开连接”或“退出”,此设置还将阻止您的网络连接。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "您要添加的 DNS 服务器是私有 IP。您必须确保将网络接口配置为使用它。" #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "您想要添加的 DNS 服务器为公共服务器,仅可以与 %(wireguard)s 搭配使用。为了确保它始终有效,请为 %(wireguard)s 设置“%(tunnelProtocol)s”(在“高级”设置中)。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "隧道协议" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "使用自定义 DNS 服务器" @@ -988,39 +988,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "偏好设置" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "允许访问同一个网络上的其他设备以进行共享和打印等。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "自动连接" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "在应用启动时自动连接到服务器。" -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "测试计划" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "屏蔽广告" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "屏蔽成人内容" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "屏蔽赌博" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "屏蔽恶意软件" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "屏蔽跟踪广告代码" @@ -1029,7 +1029,7 @@ msgstr "屏蔽跟踪广告代码" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "禁用**%(customDnsFeatureName)s**(在“高级”设置下)以激活这些设置。" @@ -1042,35 +1042,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "禁用所有内容阻止程序(在%(preferencesPageName)s下)以激活此设置。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "启用或禁用系统通知。将始终显示关键通知。" -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "启用以在新的测试版应用发布时获得通知。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "启用以将应用作为独立窗口自由移动。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "终止开关" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "设备启动时启动应用" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "本地网络共享" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "单色托盘图标" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "通知" @@ -1078,55 +1078,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "偏好设置" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "应用启动时仅显示托盘图标。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "启动时最小化" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "该应用有一个内置的终止开关,默认情况下处于启用状态且无法禁用。这是为了防止您的流量在您的网络突然停止工作或隧道因任何原因出现故障时泄漏到 VPN 隧道之外。Mullvad 会自动保护您的数据,直到您重新建立连接。" -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "使用测试版本时此选项不可用。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "将应用从任务栏中取消固定" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "使用单色托盘图标而不是彩色图标。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "警告:这并不是且不应被视为防病毒软件,它只是提供了一层额外的保护。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "警告:这可能会导致某些网站、服务和程序出现问题。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "启用后,此功能会阻止设备联系某些已知包含恶意软件的域。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "启用后,此功能会阻止设备联系某些已知会跟踪用户的域。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "启用后,此功能会阻止设备联系某些已知的广告域。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "启用后,此功能会阻止设备联系某些已知包含成人内容的网站和服务。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "启用后,此功能会阻止设备联系某些已知包含赌博内容的网站和服务。" @@ -1237,12 +1237,12 @@ msgid "App version" msgstr "应用版本" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "常见问题解答与指南" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "语言" diff --git a/gui/locales/zh-TW/messages.po b/gui/locales/zh-TW/messages.po index 129f4e26be..37e2038e4d 100644 --- a/gui/locales/zh-TW/messages.po +++ b/gui/locales/zh-TW/messages.po @@ -299,20 +299,20 @@ msgid "Advanced" msgstr "進階" #. %(openvpn)s will be replaced with the string "OpenVPN" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(openvpn)s settings" msgstr "%(openvpn)s 設定" #. %(wireguard)s will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "%(wireguard)s settings" msgstr "%(wireguard)s 設定" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add a server" msgstr "新增伺服器" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Add anyway" msgstr "仍要新增" @@ -328,24 +328,24 @@ msgctxt "advanced-settings-view" msgid "Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet." msgstr "注意:啟用此功能,皆需 Mullvad VPN 連線才能上網。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6" msgstr "啟用 IPv6" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable IPv6 communication through the tunnel." msgstr "透過通道啟用 IPv6 通訊。" #. The label next to the multihop settings toggle. -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable multihop" msgstr "啟用多點跳躍" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enable to add at least one DNS server." msgstr "啟用以新增至少一個 DNS 伺服器。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Enter IP" msgstr "輸入 IP" @@ -356,7 +356,7 @@ msgstr "如果您中斷連線或退出應用程式,此設定將會封鎖您的 #. Description for multihop settings toggle. #. Available placeholders: #. %(wireguard)s - Will be replaced with the string "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace." msgstr "藉由將您的流量路由到某個 %(wireguard)s 伺服器,再從另一個伺服器傳出,以此增加匿名性,提高追蹤難度。" @@ -364,22 +364,22 @@ 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 "應用程式內建緊停開關 (Kill Switch) 始終處於開啟狀態。如果按一下「中斷連線」或「退出」,此設定還將封鎖您的網路。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it." msgstr "您要新增的 DNS 伺服器是私人 IP。您的網路介面必須經過設定,才能使用這個 IP。" #. Available placeholders: #. %(tunnelProtocol)s - the name of the tunnel protocol setting #. %(wireguard)s - will be replaced with "WireGuard" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the \"%(tunnelProtocol)s\" (in Advanced settings) to %(wireguard)s." msgstr "您想要新增的 DNS 伺服器為公共伺服器,僅可以與 %(wireguard)s 搭配使用。為了確保它始終有效,請為 %(wireguard)s 設定「%(tunnelProtocol)s」(在「進階」設定中)。" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Tunnel protocol" msgstr "通道通訊協定" -msgctxt "advanced-settings-view" +msgctxt "vpn-settings-view" msgid "Use custom DNS server" msgstr "使用自訂 DNS 伺服器" @@ -988,39 +988,39 @@ msgctxt "preferences-nav" msgid "Preferences" msgstr "喜好設定" -msgctxt "preferences-view" +msgctxt "vpn-vpn-settings-view" msgid "Allows access to other devices on the same network for sharing, printing etc." msgstr "允許存取同一網路上的其他裝置,以進行共用、列印等。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Auto-connect" msgstr "自動連線" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Automatically connect to a server when the app launches." msgstr "啟動應用程式時,自動連線伺服器。" -msgctxt "preferences-view" +msgctxt "support-view" msgid "Beta program" msgstr "測試計劃" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block ads" msgstr "封鎖廣告" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block adult content" msgstr "封鎖成人內容" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block gambling" msgstr "封鎖賭博" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block malware" msgstr "封鎖惡意軟體" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Block trackers" msgstr "封鎖追蹤者" @@ -1029,7 +1029,7 @@ msgstr "封鎖追蹤者" #. Advanced settings refer to the name of the page with the title "Advanced". #. Available placeholders: #. %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings." msgstr "停用 **%(customDnsFeatureName)s** (在「進階」設定中),以啟用這些設定。" @@ -1042,35 +1042,35 @@ msgctxt "preferences-view" msgid "Disable all content blockers (under %(preferencesPageName)s) to activate this setting." msgstr "停用所有內容封鎖程式 (在 %(preferencesPageName)s 下),以便啟動此設定。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable or disable system notifications. The critical notifications will always be displayed." msgstr "啟用或停用系統通知。重要通知一律會顯示。" -msgctxt "preferences-view" +msgctxt "support-view" msgid "Enable to get notified when new beta versions of the app are released." msgstr "啟用後,即可在新測試版應用程式發佈時獲得通知" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Enable to move the app around as a free-standing window." msgstr "啟用以將應用程式作為獨立視窗自由移動。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Kill switch" msgstr "終止開關" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Launch app on start-up" msgstr "啟動時啟動應用程式" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Local network sharing" msgstr "本機網路分享" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Monochromatic tray icon" msgstr "單色系統匣圖示" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Notifications" msgstr "通知" @@ -1078,55 +1078,55 @@ msgctxt "preferences-view" msgid "Preferences" msgstr "喜好設定" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Show only the tray icon when the app starts." msgstr "啟動應用程式時,僅顯示系統匣圖示。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Start minimized" msgstr "啟動時永遠最小化" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished." msgstr "該應用程式有一個內建終止開關,預設情況下處於啟用狀態且無法停用。這是為了在網路突然停止運作或通道因任何原因而出現故障時,防止您的流量洩漏到 VPN 通道之外。Mullvad 會自動保護您的資料,直到您重新建立連線。" -msgctxt "preferences-view" +msgctxt "support-view" msgid "This option is unavailable while using a beta version." msgstr "測試版無法使用此選項。" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Unpin app from taskbar" msgstr "將應用程式從工作列中取消釘選" -msgctxt "preferences-view" +msgctxt "interface-settings-view" msgid "Use a monochromatic tray icon instead of a colored one." msgstr "使用單色系統匣圖示,而不是彩色的圖示。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection." msgstr "警告:這並不是且不應被視為防病毒軟體,它只是提供了一層額外保護。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "Warning: This might cause issues on certain websites, services, and programs." msgstr "警告:這可能會導致某些網站、服務和程式出現問題。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to host malware." msgstr "啟用後,此功能會禁止裝置聯繫某些已知包含惡意軟體的網域。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain domains known to track users." msgstr "啟用後,此功能會禁止裝置聯繫某些已知會追蹤使用者的網域。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain known ad domains." msgstr "啟用後,此功能會禁止裝置聯繫某些已知的廣告網域。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host adult content." msgstr "啟用後,此功能會禁止裝置聯繫某些已知包含成人內容的網站和服務。" -msgctxt "preferences-view" +msgctxt "vpn-settings-view" msgid "When enabled, this feature stops the device from contacting certain websites and services known to host gambling content." msgstr "啟用後,此功能會進止裝置聯繫某些已知包含賭博內容的網站和服務。" @@ -1237,12 +1237,12 @@ msgid "App version" msgstr "應用程式版本" #. Link to the webpage -msgctxt "settings-view" +msgctxt "support-view" msgid "FAQs & Guides" msgstr "常見問題集與指南" #. Navigation button to the 'Language' settings view -msgctxt "settings-view" +msgctxt "interface-settings-view" msgid "Language" msgstr "語言" diff --git a/gui/src/renderer/app.tsx b/gui/src/renderer/app.tsx index 78c0b58f6d..7d269b9bdd 100644 --- a/gui/src/renderer/app.tsx +++ b/gui/src/renderer/app.tsx @@ -418,23 +418,23 @@ export default class AppRenderer { void this.openUrl(`${link}?token=${token}`); }; - public async setAllowLan(allowLan: boolean) { + public setAllowLan = async (allowLan: boolean) => { const actions = this.reduxActions; await IpcRendererEventChannel.settings.setAllowLan(allowLan); actions.settings.updateAllowLan(allowLan); - } + }; - public async setShowBetaReleases(showBetaReleases: boolean) { + public setShowBetaReleases = async (showBetaReleases: boolean) => { const actions = this.reduxActions; await IpcRendererEventChannel.settings.setShowBetaReleases(showBetaReleases); actions.settings.updateShowBetaReleases(showBetaReleases); - } + }; - public async setEnableIpv6(enableIpv6: boolean) { + public setEnableIpv6 = async (enableIpv6: boolean) => { const actions = this.reduxActions; await IpcRendererEventChannel.settings.setEnableIpv6(enableIpv6); actions.settings.updateEnableIpv6(enableIpv6); - } + }; public async setBridgeState(bridgeState: BridgeState) { const actions = this.reduxActions; @@ -468,11 +468,11 @@ export default class AppRenderer { IpcRendererEventChannel.guiSettings.setEnableSystemNotifications(flag); } - public setAutoStart(autoStart: boolean): Promise<void> { + public setAutoStart = (autoStart: boolean): Promise<void> => { this.storeAutoStart(autoStart); return IpcRendererEventChannel.autoStart.set(autoStart); - } + }; public setStartMinimized(startMinimized: boolean) { IpcRendererEventChannel.guiSettings.setStartMinimized(startMinimized); @@ -573,11 +573,11 @@ export default class AppRenderer { loadTranslations(relayLocations, translations.locale, translations.relayLocations); } - public getPreferredLocaleDisplayName(localeCode: string): string { + public getPreferredLocaleDisplayName = (localeCode: string): string => { const preferredLocale = this.getPreferredLocaleList().find((item) => item.code === localeCode); return preferredLocale ? preferredLocale.name : ''; - } + }; public setDisplayedChangelog = (): void => { IpcRendererEventChannel.currentVersion.displayedChangelog(); diff --git a/gui/src/renderer/components/AdvancedSettings.tsx b/gui/src/renderer/components/AdvancedSettings.tsx deleted file mode 100644 index b00fc77f4c..0000000000 --- a/gui/src/renderer/components/AdvancedSettings.tsx +++ /dev/null @@ -1,257 +0,0 @@ -import * as React from 'react'; -import { sprintf } from 'sprintf-js'; - -import { strings } from '../../config.json'; -import { TunnelProtocol } from '../../shared/daemon-rpc-types'; -import { messages } from '../../shared/gettext'; -import { - StyledNavigationScrollbars, - StyledSelectorForFooter, - StyledTunnelProtocolContainer, -} from './AdvancedSettingsStyles'; -import * as AppButton from './AppButton'; -import { AriaDescription, AriaInput, AriaInputGroup, AriaLabel } from './AriaGroup'; -import * as Cell from './cell'; -import { ISelectorItem } from './cell/Selector'; -import CustomDnsSettings from './CustomDnsSettings'; -import { BackAction } from './KeyboardNavigation'; -import { Layout, SettingsContainer } from './Layout'; -import { ModalAlert, ModalAlertType, ModalMessage } from './Modal'; -import { NavigationBar, NavigationContainer, NavigationItems, TitleBarItem } from './NavigationBar'; -import SettingsHeader, { HeaderTitle } from './SettingsHeader'; -import Switch from './Switch'; - -type OptionalTunnelProtocol = TunnelProtocol | undefined; - -interface IProps { - enableIpv6: boolean; - blockWhenDisconnected: boolean; - tunnelProtocol?: TunnelProtocol; - setEnableIpv6: (value: boolean) => void; - setBlockWhenDisconnected: (value: boolean) => void; - setTunnelProtocol: (value: OptionalTunnelProtocol) => void; - onViewWireguardSettings: () => void; - onViewOpenVpnSettings: () => void; - onViewSplitTunneling: () => void; - onClose: () => void; -} - -interface IState { - showConfirmBlockWhenDisconnectedAlert: boolean; -} - -export default class AdvancedSettings extends React.Component<IProps, IState> { - public state = { - showConfirmBlockWhenDisconnectedAlert: false, - }; - - private blockWhenDisconnectedRef = React.createRef<Switch>(); - - private tunnelProtocolItems: Array<ISelectorItem<OptionalTunnelProtocol>>; - - public constructor(props: IProps) { - super(props); - - this.tunnelProtocolItems = [ - { - label: messages.gettext('Automatic'), - value: undefined, - }, - { - label: strings.wireguard, - value: 'wireguard', - }, - { - label: strings.openvpn, - value: 'openvpn', - }, - ]; - } - - public render() { - return ( - <BackAction action={this.props.onClose}> - <Layout> - <SettingsContainer> - <NavigationContainer> - <NavigationBar> - <NavigationItems> - <TitleBarItem> - { - // TRANSLATORS: Title label in navigation bar - messages.pgettext('advanced-settings-nav', 'Advanced') - } - </TitleBarItem> - </NavigationItems> - </NavigationBar> - - <StyledNavigationScrollbars> - <SettingsHeader> - <HeaderTitle> - {messages.pgettext('advanced-settings-view', 'Advanced')} - </HeaderTitle> - </SettingsHeader> - - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('advanced-settings-view', 'Enable IPv6')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch - isOn={this.props.enableIpv6} - onChange={this.props.setEnableIpv6} - /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {messages.pgettext( - 'advanced-settings-view', - 'Enable IPv6 communication through the tunnel.', - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('advanced-settings-view', 'Always require VPN')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch - ref={this.blockWhenDisconnectedRef} - isOn={this.props.blockWhenDisconnected} - onChange={this.setBlockWhenDisconnected} - /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {messages.pgettext( - 'advanced-settings-view', - 'If you disconnect or quit the app, this setting will block your internet.', - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - - {(window.env.platform === 'linux' || window.env.platform === 'win32') && ( - <Cell.CellButtonGroup> - <Cell.CellButton onClick={this.props.onViewSplitTunneling}> - <Cell.Label>{strings.splitTunneling}</Cell.Label> - <Cell.Icon height={12} width={7} source="icon-chevron" /> - </Cell.CellButton> - </Cell.CellButtonGroup> - )} - - <AriaInputGroup> - <StyledTunnelProtocolContainer> - <StyledSelectorForFooter - title={messages.pgettext('advanced-settings-view', 'Tunnel protocol')} - values={this.tunnelProtocolItems} - value={this.props.tunnelProtocol} - onSelect={this.onSelectTunnelProtocol} - /> - </StyledTunnelProtocolContainer> - </AriaInputGroup> - - <Cell.CellButtonGroup> - <Cell.CellButton - onClick={this.props.onViewWireguardSettings} - disabled={this.props.tunnelProtocol === 'openvpn'}> - <Cell.Label> - {sprintf( - // TRANSLATORS: %(wireguard)s will be replaced with the string "WireGuard" - messages.pgettext('advanced-settings-view', '%(wireguard)s settings'), - { wireguard: strings.wireguard }, - )} - </Cell.Label> - <Cell.Icon height={12} width={7} source="icon-chevron" /> - </Cell.CellButton> - - <Cell.CellButton - onClick={this.props.onViewOpenVpnSettings} - disabled={this.props.tunnelProtocol === 'wireguard'}> - <Cell.Label> - {sprintf( - // TRANSLATORS: %(openvpn)s will be replaced with the string "OpenVPN" - messages.pgettext('advanced-settings-view', '%(openvpn)s settings'), - { openvpn: strings.openvpn }, - )} - </Cell.Label> - <Cell.Icon height={12} width={7} source="icon-chevron" /> - </Cell.CellButton> - </Cell.CellButtonGroup> - - <CustomDnsSettings /> - </StyledNavigationScrollbars> - </NavigationContainer> - </SettingsContainer> - - {this.renderConfirmBlockWhenDisconnectedAlert()} - </Layout> - </BackAction> - ); - } - - private renderConfirmBlockWhenDisconnectedAlert = () => { - return ( - <ModalAlert - isOpen={this.state.showConfirmBlockWhenDisconnectedAlert} - type={ModalAlertType.caution} - buttons={[ - <AppButton.RedButton key="confirm" onClick={this.confirmEnableBlockWhenDisconnected}> - {messages.gettext('Enable anyway')} - </AppButton.RedButton>, - <AppButton.BlueButton key="back" onClick={this.hideConfirmBlockWhenDisconnectedAlert}> - {messages.gettext('Back')} - </AppButton.BlueButton>, - ]} - close={this.hideConfirmBlockWhenDisconnectedAlert}> - <ModalMessage> - {messages.pgettext( - 'advanced-settings-view', - 'Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet.', - )} - </ModalMessage> - <ModalMessage> - {messages.pgettext( - 'advanced-settings-view', - 'The app’s built-in kill switch is always on. This setting will additionally block the internet if clicking Disconnect or Quit.', - )} - </ModalMessage> - </ModalAlert> - ); - }; - - private setBlockWhenDisconnected = (newValue: boolean) => { - if (newValue) { - this.setState({ showConfirmBlockWhenDisconnectedAlert: true }); - } else { - this.props.setBlockWhenDisconnected(false); - } - }; - - private hideConfirmBlockWhenDisconnectedAlert = () => { - this.setState({ showConfirmBlockWhenDisconnectedAlert: false }); - }; - - private confirmEnableBlockWhenDisconnected = () => { - this.setState({ showConfirmBlockWhenDisconnectedAlert: false }); - this.props.setBlockWhenDisconnected(true); - }; - - private onSelectTunnelProtocol = (protocol?: TunnelProtocol) => { - this.props.setTunnelProtocol(protocol); - }; -} diff --git a/gui/src/renderer/components/AdvancedSettingsStyles.tsx b/gui/src/renderer/components/AdvancedSettingsStyles.tsx deleted file mode 100644 index 06a0103855..0000000000 --- a/gui/src/renderer/components/AdvancedSettingsStyles.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import styled from 'styled-components'; - -import Selector from './cell/Selector'; -import { NavigationScrollbars } from './NavigationBar'; - -export const StyledSelectorContainer = styled.div({ - flex: 0, -}); - -export const StyledSelectorForFooter = (styled(Selector)({ - marginBottom: 0, -}) as unknown) as new <T>() => Selector<T>; - -export const StyledTunnelProtocolContainer = styled(StyledSelectorContainer)({ - marginBottom: '20px', -}); - -export const StyledNavigationScrollbars = styled(NavigationScrollbars)({ - flex: 1, -}); diff --git a/gui/src/renderer/components/AppRouter.tsx b/gui/src/renderer/components/AppRouter.tsx index db69cbb80f..75892805e9 100644 --- a/gui/src/renderer/components/AppRouter.tsx +++ b/gui/src/renderer/components/AppRouter.tsx @@ -3,14 +3,11 @@ import * as React from 'react'; import { Route, Switch } from 'react-router'; import AccountPage from '../containers/AccountPage'; -import AdvancedSettingsPage from '../containers/AdvancedSettingsPage'; import LoginPage from '../containers/LoginPage'; import OpenVPNSettingsPage from '../containers/OpenVPNSettingsPage'; -import PreferencesPage from '../containers/PreferencesPage'; +import ProblemReportPage from '../containers/ProblemReportPage'; import SelectLanguagePage from '../containers/SelectLanguagePage'; import SelectLocationPage from '../containers/SelectLocationPage'; -import SettingsPage from '../containers/SettingsPage'; -import SupportPage from '../containers/SupportPage'; import WireguardSettingsPage from '../containers/WireguardSettingsPage'; import withAppContext, { IAppContext } from '../context'; import { IHistoryProps, ITransitionSpecification, transitions, withHistory } from '../lib/history'; @@ -24,11 +21,15 @@ import { } from './ExpiredAccountAddTime'; import Filter from './Filter'; import Focus, { IFocusHandle } from './Focus'; +import InterfaceSettings from './InterfaceSettings'; import Launch from './Launch'; import MainView from './MainView'; +import Settings from './Settings'; import SplitTunnelingSettings from './SplitTunnelingSettings'; +import Support from './Support'; import TooManyDevices from './TooManyDevices'; import TransitionContainer, { TransitionView } from './TransitionContainer'; +import VpnSettings from './VpnSettings'; interface IAppRoutesState { currentLocation: IHistoryProps['history']['location']; @@ -86,15 +87,16 @@ class AppRouter extends React.Component<IHistoryProps & IAppContext, IAppRoutesS <Route exact path={RoutePath.voucherSuccess} component={VoucherVerificationSuccess} /> <Route exact path={RoutePath.timeAdded} component={TimeAdded} /> <Route exact path={RoutePath.setupFinished} component={SetupFinished} /> - <Route exact path={RoutePath.settings} component={SettingsPage} /> + <Route exact path={RoutePath.settings} component={Settings} /> <Route exact path={RoutePath.selectLanguage} component={SelectLanguagePage} /> <Route exact path={RoutePath.accountSettings} component={AccountPage} /> - <Route exact path={RoutePath.preferences} component={PreferencesPage} /> - <Route exact path={RoutePath.advancedSettings} component={AdvancedSettingsPage} /> + <Route exact path={RoutePath.interfaceSettings} component={InterfaceSettings} /> + <Route exact path={RoutePath.vpnSettings} component={VpnSettings} /> <Route exact path={RoutePath.wireguardSettings} component={WireguardSettingsPage} /> <Route exact path={RoutePath.openVpnSettings} component={OpenVPNSettingsPage} /> <Route exact path={RoutePath.splitTunneling} component={SplitTunnelingSettings} /> - <Route exact path={RoutePath.support} component={SupportPage} /> + <Route exact path={RoutePath.support} component={Support} /> + <Route exact path={RoutePath.problemReport} component={ProblemReportPage} /> <Route exact path={RoutePath.selectLocation} component={SelectLocationPage} /> <Route exact path={RoutePath.filter} component={Filter} /> </Switch> diff --git a/gui/src/renderer/components/CustomDnsSettings.tsx b/gui/src/renderer/components/CustomDnsSettings.tsx index 0e9dccc79e..4fb785d686 100644 --- a/gui/src/renderer/components/CustomDnsSettings.tsx +++ b/gui/src/renderer/components/CustomDnsSettings.tsx @@ -6,7 +6,6 @@ import { messages } from '../../shared/gettext'; import { useAppContext } from '../context'; import { IpAddress } from '../lib/ip'; import { useBoolean, useMounted } from '../lib/utilityHooks'; -import { formatMarkdown } from '../markdown-formatter'; import { useSelector } from '../redux/store'; import Accordion from './Accordion'; import * as AppButton from './AppButton'; @@ -25,7 +24,6 @@ import { StyledButton, StyledContainer, StyledCustomDnsFooter, - StyledCustomDnsSwitchContainer, StyledLabel, StyledRemoveButton, StyledRemoveIcon, @@ -217,11 +215,11 @@ export default function CustomDnsSettings() { return ( <> - <StyledCustomDnsSwitchContainer disabled={!featureAvailable}> + <Cell.Container disabled={!featureAvailable}> <AriaInputGroup> <AriaLabel> <Cell.InputLabel> - {messages.pgettext('advanced-settings-view', 'Use custom DNS server')} + {messages.pgettext('vpn-settings-view', 'Use custom DNS server')} </Cell.InputLabel> </AriaLabel> <AriaInput> @@ -232,7 +230,7 @@ export default function CustomDnsSettings() { /> </AriaInput> </AriaInputGroup> - </StyledCustomDnsSwitchContainer> + </Cell.Container> <Accordion expanded={listExpanded}> <Cell.Section role="listbox"> <List @@ -254,7 +252,7 @@ export default function CustomDnsSettings() { {inputVisible && ( <div ref={inputContainerRef}> <Cell.RowInput - placeholder={messages.pgettext('advanced-settings-view', 'Enter IP')} + placeholder={messages.pgettext('vpn-settings-view', 'Enter IP')} onSubmit={onAdd} onChange={setValid} invalid={invalid} @@ -271,7 +269,7 @@ export default function CustomDnsSettings() { disabled={inputVisible} tabIndex={-1}> <StyledAddCustomDnsLabel tabIndex={-1}> - {messages.pgettext('advanced-settings-view', 'Add a server')} + {messages.pgettext('vpn-settings-view', 'Add a server')} </StyledAddCustomDnsLabel> <Cell.Icon source="icon-add" @@ -286,11 +284,18 @@ export default function CustomDnsSettings() { <StyledCustomDnsFooter> <Cell.FooterText> - {featureAvailable ? ( - messages.pgettext('advanced-settings-view', 'Enable to add at least one DNS server.') - ) : ( - <DisabledMessage /> - )} + {featureAvailable + ? messages.pgettext('vpn-settings-view', 'Enable to add at least one DNS server.') + : // This line makes sure that the next one isn't prefixed by the color. + // TRANSLATORS: This is displayed when either or both of the block ads/trackers settings are + // TRANSLATORS: turned on which makes the custom DNS setting disabled. The text enclosed in "**" + // TRANSLATORS: will appear bold. + // TRANSLATORS: Available placeholders: + // TRANSLATORS: %(preferencesPageName)s - The page title showed on top in the preferences page. + messages.pgettext( + 'vpn-settings-view', + 'Disable all content blockers to activate this setting.', + )} </Cell.FooterText> </StyledCustomDnsFooter> @@ -304,22 +309,6 @@ export default function CustomDnsSettings() { ); } -function DisabledMessage() { - const preferencesPageName = messages.pgettext('preferences-nav', 'Preferences'); - - // TRANSLATORS: This is displayed when either or both of the block ads/trackers settings are - // TRANSLATORS: turned on which makes the custom DNS setting disabled. The text enclosed in "**" - // TRANSLATORS: will appear bold. - // TRANSLATORS: Available placeholders: - // TRANSLATORS: %(preferencesPageName)s - The page title showed on top in the preferences page. - const customDnsDisabledMessage = messages.pgettext( - 'preferences-view', - 'Disable all content blockers (under %(preferencesPageName)s) to activate this setting.', - ); - - return formatMarkdown(sprintf(customDnsDisabledMessage, { preferencesPageName })); -} - interface ICellListItemProps { willShowConfirmationDialog: React.RefObject<boolean>; onRemove: (application: string) => void; @@ -372,7 +361,7 @@ function CellListItem(props: ICellListItemProps) { <div ref={inputContainerRef}> <Cell.RowInput initialValue={props.children} - placeholder={messages.pgettext('advanced-settings-view', 'Enter IP')} + placeholder={messages.pgettext('vpn-settings-view', 'Enter IP')} onSubmit={onSubmit} onChange={setValid} invalid={invalid} @@ -417,7 +406,7 @@ function ConfirmationDialog(props: IConfirmationDialogProps) { let message; if (props.isLocal.current) { message = messages.pgettext( - 'advanced-settings-view', + 'vpn-settings-view', 'The DNS server you want to add is a private IP. You must ensure that your network interfaces are configured to use it.', ); } else { @@ -426,12 +415,12 @@ function ConfirmationDialog(props: IConfirmationDialogProps) { // TRANSLATORS: %(tunnelProtocol)s - the name of the tunnel protocol setting // TRANSLATORS: %(wireguard)s - will be replaced with "WireGuard" messages.pgettext( - 'advanced-settings-view', + 'vpn-settings-view', 'The DNS server you want to add is public and will only work with %(wireguard)s. To ensure that it always works, set the "%(tunnelProtocol)s" (in Advanced settings) to %(wireguard)s.', ), { wireguard: strings.wireguard, - tunnelProtocol: messages.pgettext('advanced-settings-view', 'Tunnel protocol'), + tunnelProtocol: messages.pgettext('vpn-settings-view', 'Tunnel protocol'), }, ); } @@ -441,7 +430,7 @@ function ConfirmationDialog(props: IConfirmationDialogProps) { type={ModalAlertType.caution} buttons={[ <AppButton.RedButton key="confirm" onClick={props.confirm}> - {messages.pgettext('advanced-settings-view', 'Add anyway')} + {messages.pgettext('vpn-settings-view', 'Add anyway')} </AppButton.RedButton>, <AppButton.BlueButton key="back" onClick={props.abort}> {messages.gettext('Back')} diff --git a/gui/src/renderer/components/CustomDnsSettingsStyles.tsx b/gui/src/renderer/components/CustomDnsSettingsStyles.tsx index b8ec59ec36..9d927ba52d 100644 --- a/gui/src/renderer/components/CustomDnsSettingsStyles.tsx +++ b/gui/src/renderer/components/CustomDnsSettingsStyles.tsx @@ -4,10 +4,6 @@ import { colors } from '../../config.json'; import * as Cell from './cell'; import ImageView from './ImageView'; -export const StyledCustomDnsSwitchContainer = styled(Cell.Container)({ - marginBottom: '1px', -}); - export const StyledCustomDnsFooter = styled(Cell.Footer)({ marginBottom: '2px', }); @@ -32,7 +28,6 @@ export const StyledAddCustomDnsLabel = styled(Cell.Label)( export const StyledContainer = styled(Cell.Container)({ display: 'flex', - marginBottom: '1px', backgroundColor: colors.blue40, }); diff --git a/gui/src/renderer/components/Filter.tsx b/gui/src/renderer/components/Filter.tsx index d974fa7f6a..1798985070 100644 --- a/gui/src/renderer/components/Filter.tsx +++ b/gui/src/renderer/components/Filter.tsx @@ -288,7 +288,6 @@ const StyledRow = styled.div({ height: '44px', alignItems: 'center', padding: '0 22px', - marginBottom: '1px', backgroundColor: colors.blue, }); diff --git a/gui/src/renderer/components/InterfaceSettings.tsx b/gui/src/renderer/components/InterfaceSettings.tsx new file mode 100644 index 0000000000..bc7f823e7c --- /dev/null +++ b/gui/src/renderer/components/InterfaceSettings.tsx @@ -0,0 +1,240 @@ +import { useCallback } from 'react'; +import styled from 'styled-components'; + +import { colors } from '../../config.json'; +import { messages } from '../../shared/gettext'; +import { useAppContext } from '../context'; +import { useHistory } from '../lib/history'; +import { RoutePath } from '../lib/routes'; +import { useSelector } from '../redux/store'; +import { AriaDescription, AriaInput, AriaInputGroup, AriaLabel } from './AriaGroup'; +import * as Cell from './cell'; +import { BackAction } from './KeyboardNavigation'; +import { Container, Layout } from './Layout'; +import { + NavigationBar, + NavigationContainer, + NavigationItems, + NavigationScrollbars, + TitleBarItem, +} from './NavigationBar'; +import SettingsHeader, { HeaderTitle } from './SettingsHeader'; + +const StyledContainer = styled(Container)({ + backgroundColor: colors.darkBlue, +}); + +const StyledContent = styled.div({ + display: 'flex', + flexDirection: 'column', + flex: 1, + marginBottom: '2px', +}); + +const StyledCellIcon = styled(Cell.UntintedIcon)({ + marginRight: '8px', +}); + +export default function InterfaceSettings() { + const { pop } = useHistory(); + const unpinnedWindow = useSelector((state) => state.settings.guiSettings.unpinnedWindow); + + return ( + <BackAction action={pop}> + <Layout> + <StyledContainer> + <NavigationContainer> + <NavigationBar> + <NavigationItems> + <TitleBarItem> + { + // TRANSLATORS: Title label in navigation bar + messages.pgettext('interface-settings-view', 'Interface settings') + } + </TitleBarItem> + </NavigationItems> + </NavigationBar> + + <NavigationScrollbars> + <SettingsHeader> + <HeaderTitle> + {messages.pgettext('interface-settings-view', 'Interface settings')} + </HeaderTitle> + </SettingsHeader> + + <StyledContent> + <Cell.Group> + <NotificationsSetting /> + </Cell.Group> + <Cell.Group> + <MonochromaticTrayIconSetting /> + </Cell.Group> + + <Cell.Group> + <LanguageButton /> + </Cell.Group> + + {(window.env.platform === 'win32' || + (window.env.platform === 'darwin' && window.env.development)) && ( + <Cell.Group> + <UnpinnedWindowSetting /> + </Cell.Group> + )} + + {unpinnedWindow && ( + <Cell.Group> + <StartMinimizedSetting /> + </Cell.Group> + )} + </StyledContent> + </NavigationScrollbars> + </NavigationContainer> + </StyledContainer> + </Layout> + </BackAction> + ); +} + +function NotificationsSetting() { + const enableSystemNotifications = useSelector( + (state) => state.settings.guiSettings.enableSystemNotifications, + ); + const { setEnableSystemNotifications } = useAppContext(); + + return ( + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('interface-settings-view', 'Notifications')} + </Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.Switch isOn={enableSystemNotifications} onChange={setEnableSystemNotifications} /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {messages.pgettext( + 'interface-settings-view', + 'Enable or disable system notifications. The critical notifications will always be displayed.', + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + ); +} + +function MonochromaticTrayIconSetting() { + const monochromaticIcon = useSelector((state) => state.settings.guiSettings.monochromaticIcon); + const { setMonochromaticIcon } = useAppContext(); + + return ( + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('interface-settings-view', 'Monochromatic tray icon')} + </Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.Switch isOn={monochromaticIcon} onChange={setMonochromaticIcon} /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {messages.pgettext( + 'interface-settings-view', + 'Use a monochromatic tray icon instead of a colored one.', + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + ); +} + +function UnpinnedWindowSetting() { + const unpinnedWindow = useSelector((state) => state.settings.guiSettings.unpinnedWindow); + const { setUnpinnedWindow } = useAppContext(); + + return ( + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('interface-settings-view', 'Unpin app from taskbar')} + </Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.Switch isOn={unpinnedWindow} onChange={setUnpinnedWindow} /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {messages.pgettext( + 'interface-settings-view', + 'Enable to move the app around as a free-standing window.', + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + ); +} + +function StartMinimizedSetting() { + const startMinimized = useSelector((state) => state.settings.guiSettings.startMinimized); + const { setStartMinimized } = useAppContext(); + + return ( + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('interface-settings-view', 'Start minimized')} + </Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.Switch isOn={startMinimized} onChange={setStartMinimized} /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {messages.pgettext( + 'interface-settings-view', + 'Show only the tray icon when the app starts.', + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + ); +} + +function LanguageButton() { + const history = useHistory(); + const { getPreferredLocaleDisplayName } = useAppContext(); + const preferredLocale = useSelector((state) => state.settings.guiSettings.preferredLocale); + const localeDisplayName = getPreferredLocaleDisplayName(preferredLocale); + + const navigate = useCallback(() => history.push(RoutePath.selectLanguage), [history]); + + return ( + <Cell.CellNavigationButton onClick={navigate}> + <StyledCellIcon width={24} height={24} source="icon-language" /> + <Cell.Label> + { + // TRANSLATORS: Navigation button to the 'Language' settings view + messages.pgettext('interface-settings-view', 'Language') + } + </Cell.Label> + <Cell.SubText>{localeDisplayName}</Cell.SubText> + </Cell.CellNavigationButton> + ); +} diff --git a/gui/src/renderer/components/List.tsx b/gui/src/renderer/components/List.tsx index 2d4f73b7f1..2915a95c1b 100644 --- a/gui/src/renderer/components/List.tsx +++ b/gui/src/renderer/components/List.tsx @@ -1,10 +1,18 @@ import { useCallback, useEffect, useRef, useState } from 'react'; +import styled from 'styled-components'; import { Scheduler } from '../../shared/scheduler'; import Accordion from './Accordion'; export const stringValueAsKey = (value: string): string => value; +const StyledListItem = styled.div({ + marginBottom: '1px', + display: 'flex', + flex: 1, + flexDirection: 'column', +}); + interface ListProps<T> { items: Array<T>; getKey: (data: T) => string; @@ -112,7 +120,7 @@ function ListItem<T>(props: ListItemProps<T>) { return ( <Accordion expanded={expanded} onTransitionEnd={onTransitionEnd}> - {props.render(props.data.data)} + <StyledListItem>{props.render(props.data.data)}</StyledListItem> </Accordion> ); } diff --git a/gui/src/renderer/components/LocationList.tsx b/gui/src/renderer/components/LocationList.tsx index 50419bc838..7b2b0e9b20 100644 --- a/gui/src/renderer/components/LocationList.tsx +++ b/gui/src/renderer/components/LocationList.tsx @@ -329,7 +329,7 @@ export class RelayLocations extends React.PureComponent< public render() { return ( - <> + <Cell.Group noMarginBottom> {this.state.countries.map((relayCountry) => { const countryLocation: RelayLocation = { country: relayCountry.code }; @@ -384,7 +384,7 @@ export class RelayLocations extends React.PureComponent< </LocationRow> ); })} - </> + </Cell.Group> ); } diff --git a/gui/src/renderer/components/LocationRow.tsx b/gui/src/renderer/components/LocationRow.tsx index fd406f2487..f3d0927c6f 100644 --- a/gui/src/renderer/components/LocationRow.tsx +++ b/gui/src/renderer/components/LocationRow.tsx @@ -41,7 +41,6 @@ const buttonColor = (props: IButtonColorProps) => { const Container = styled(Cell.Container)({ display: 'flex', padding: 0, - marginBottom: '1px', background: 'none', }); @@ -154,7 +153,7 @@ function LocationRow(props: IProps, ref: React.Ref<HTMLDivElement>) { onWillExpand={onWillExpand} onTransitionEnd={props.onTransitionEnd} animationDuration={150}> - {props.children} + <Cell.Group noMarginBottom>{props.children}</Cell.Group> </Accordion> )} </> diff --git a/gui/src/renderer/components/Login.tsx b/gui/src/renderer/components/Login.tsx index 282f49d01c..c2c8b9d177 100644 --- a/gui/src/renderer/components/Login.tsx +++ b/gui/src/renderer/components/Login.tsx @@ -442,10 +442,7 @@ function BlockMessage() { } }, [blockWhenDisconnected, tunnelState, setBlockWhenDisconnected, disconnectTunnel]); - const alwaysRequireVpnSettingsName = messages.pgettext( - 'advanced-settings-view', - 'Always require VPN', - ); + const alwaysRequireVpnSettingsName = messages.pgettext('vpn-settings-view', 'Lockdown mode'); const message = formatMarkdown( blockWhenDisconnected ? sprintf( diff --git a/gui/src/renderer/components/OpenVPNSettings.tsx b/gui/src/renderer/components/OpenVPNSettings.tsx index 4aac83014f..1b82c9971a 100644 --- a/gui/src/renderer/components/OpenVPNSettings.tsx +++ b/gui/src/renderer/components/OpenVPNSettings.tsx @@ -119,120 +119,126 @@ export default class OpenVpnSettings extends React.Component<IProps, IState> { </HeaderTitle> </SettingsHeader> - <StyledSelectorContainer> - <AriaInputGroup> - <Selector - title={messages.pgettext('openvpn-settings-view', 'Transport protocol')} - values={this.protocolItems(this.props.bridgeState !== 'on')} - value={this.props.openvpn.protocol} - onSelect={this.onSelectOpenvpnProtocol} - hasFooter={this.props.bridgeState === 'on'} - /> - {this.props.bridgeState === 'on' && ( - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {formatMarkdown( - // TRANSLATORS: This is used to instruct users how to make UDP mode - // TRANSLATORS: available. - messages.pgettext( - 'openvpn-settings-view', - 'To activate UDP, change **Bridge mode** to **Automatic** or **Off**.', - ), - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - )} - </AriaInputGroup> - </StyledSelectorContainer> + <Cell.Group> + <StyledSelectorContainer> + <AriaInputGroup> + <Selector + title={messages.pgettext('openvpn-settings-view', 'Transport protocol')} + values={this.protocolItems(this.props.bridgeState !== 'on')} + value={this.props.openvpn.protocol} + onSelect={this.onSelectOpenvpnProtocol} + /> + {this.props.bridgeState === 'on' && ( + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {formatMarkdown( + // TRANSLATORS: This is used to instruct users how to make UDP mode + // TRANSLATORS: available. + messages.pgettext( + 'openvpn-settings-view', + 'To activate UDP, change **Bridge mode** to **Automatic** or **Off**.', + ), + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + )} + </AriaInputGroup> + </StyledSelectorContainer> + </Cell.Group> + + {this.props.openvpn.protocol ? ( + <Cell.Group> + <StyledSelectorContainer> + <AriaInputGroup> + <Selector + title={sprintf( + // TRANSLATORS: The title for the port selector section. + // TRANSLATORS: Available placeholders: + // TRANSLATORS: %(portType)s - a selected protocol (either TCP or UDP) + messages.pgettext('openvpn-settings-view', '%(portType)s port'), + { + portType: this.props.openvpn.protocol.toUpperCase(), + }, + )} + values={this.portItems[this.props.openvpn.protocol]} + value={this.props.openvpn.port} + onSelect={this.onSelectOpenVpnPort} + /> + </AriaInputGroup> + </StyledSelectorContainer> + </Cell.Group> + ) : undefined} - <StyledSelectorContainer> + <Cell.Group> <AriaInputGroup> - {this.props.openvpn.protocol ? ( + <StyledSelectorContainer> <Selector - title={sprintf( - // TRANSLATORS: The title for the port selector section. - // TRANSLATORS: Available placeholders: - // TRANSLATORS: %(portType)s - a selected protocol (either TCP or UDP) - messages.pgettext('openvpn-settings-view', '%(portType)s port'), - { - portType: this.props.openvpn.protocol.toUpperCase(), - }, + title={ + // TRANSLATORS: The title for the shadowsocks bridge selector section. + messages.pgettext('openvpn-settings-view', 'Bridge mode') + } + values={this.bridgeStateItems( + this.props.bridgeModeAvailablity === BridgeModeAvailability.available, )} - values={this.portItems[this.props.openvpn.protocol]} - value={this.props.openvpn.port} - onSelect={this.onSelectOpenVpnPort} + value={this.props.bridgeState} + onSelect={this.onSelectBridgeState} /> - ) : undefined} + </StyledSelectorContainer> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText>{this.bridgeModeFooterText()}</Cell.FooterText> + </AriaDescription> + </Cell.Footer> </AriaInputGroup> - </StyledSelectorContainer> + </Cell.Group> - <AriaInputGroup> - <StyledSelectorContainer> - <Selector - title={ - // TRANSLATORS: The title for the shadowsocks bridge selector section. - messages.pgettext('openvpn-settings-view', 'Bridge mode') - } - values={this.bridgeStateItems( - this.props.bridgeModeAvailablity === BridgeModeAvailability.available, - )} - value={this.props.bridgeState} - onSelect={this.onSelectBridgeState} - hasFooter - /> - </StyledSelectorContainer> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText>{this.bridgeModeFooterText()}</Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('openvpn-settings-view', 'Mssfix')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.AutoSizingTextInput - value={this.props.mssfix ? this.props.mssfix.toString() : ''} - inputMode={'numeric'} - maxLength={4} - placeholder={messages.gettext('Default')} - onSubmitValue={this.onMssfixSubmit} - validateValue={OpenVpnSettings.mssfixIsValid} - submitOnBlur={true} - modifyValue={OpenVpnSettings.removeNonNumericCharacters} - /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {sprintf( - // TRANSLATORS: The hint displayed below the Mssfix input field. - // TRANSLATORS: Available placeholders: - // TRANSLATORS: %(openvpn)s - will be replaced with "OpenVPN" - // TRANSLATORS: %(max)d - the maximum possible mssfix value - // TRANSLATORS: %(min)d - the minimum possible mssfix value - messages.pgettext( - 'openvpn-settings-view', - 'Set %(openvpn)s MSS value. Valid range: %(min)d - %(max)d.', - ), - { - openvpn: strings.openvpn, - min: MIN_MSSFIX_VALUE, - max: MAX_MSSFIX_VALUE, - }, - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> + <Cell.Group> + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('openvpn-settings-view', 'Mssfix')} + </Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.AutoSizingTextInput + value={this.props.mssfix ? this.props.mssfix.toString() : ''} + inputMode={'numeric'} + maxLength={4} + placeholder={messages.gettext('Default')} + onSubmitValue={this.onMssfixSubmit} + validateValue={OpenVpnSettings.mssfixIsValid} + submitOnBlur={true} + modifyValue={OpenVpnSettings.removeNonNumericCharacters} + /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {sprintf( + // TRANSLATORS: The hint displayed below the Mssfix input field. + // TRANSLATORS: Available placeholders: + // TRANSLATORS: %(openvpn)s - will be replaced with "OpenVPN" + // TRANSLATORS: %(max)d - the maximum possible mssfix value + // TRANSLATORS: %(min)d - the minimum possible mssfix value + messages.pgettext( + 'openvpn-settings-view', + 'Set %(openvpn)s MSS value. Valid range: %(min)d - %(max)d.', + ), + { + openvpn: strings.openvpn, + min: MIN_MSSFIX_VALUE, + max: MAX_MSSFIX_VALUE, + }, + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + </Cell.Group> </StyledNavigationScrollbars> </NavigationContainer> </SettingsContainer> @@ -321,7 +327,7 @@ export default class OpenVpnSettings extends React.Component<IProps, IState> { 'To activate Bridge mode, go back and change **%(tunnelProtocol)s** to **%(openvpn)s**.', ), { - tunnelProtocol: messages.pgettext('advanced-settings-view', 'Tunnel protocol'), + tunnelProtocol: messages.pgettext('vpn-settings-view', 'Tunnel protocol'), openvpn: strings.openvpn, }, ), diff --git a/gui/src/renderer/components/Preferences.tsx b/gui/src/renderer/components/Preferences.tsx deleted file mode 100644 index 001f367f87..0000000000 --- a/gui/src/renderer/components/Preferences.tsx +++ /dev/null @@ -1,571 +0,0 @@ -import * as React from 'react'; -import { sprintf } from 'sprintf-js'; - -import { IDnsOptions } from '../../shared/daemon-rpc-types'; -import { messages } from '../../shared/gettext'; -import { formatMarkdown } from '../markdown-formatter'; -import * as AppButton from './AppButton'; -import { AriaDescription, AriaDetails, AriaInput, AriaInputGroup, AriaLabel } from './AriaGroup'; -import * as Cell from './cell'; -import InfoButton from './InfoButton'; -import { BackAction } from './KeyboardNavigation'; -import { Layout } from './Layout'; -import { ModalAlert, ModalAlertType, ModalMessage } from './Modal'; -import { - NavigationBar, - NavigationContainer, - NavigationItems, - NavigationScrollbars, - TitleBarItem, -} from './NavigationBar'; -import { - StyledContainer, - StyledContent, - StyledInfoIcon, - StyledSeparator, -} from './PreferencesStyles'; -import SettingsHeader, { HeaderTitle } from './SettingsHeader'; - -export interface IProps { - autoStart: boolean; - autoConnect: boolean; - allowLan: boolean; - showBetaReleases: boolean; - isBeta: boolean; - enableSystemNotifications: boolean; - monochromaticIcon: boolean; - startMinimized: boolean; - unpinnedWindow: boolean; - dns: IDnsOptions; - setAutoStart: (autoStart: boolean) => void; - setEnableSystemNotifications: (flag: boolean) => void; - setAutoConnect: (autoConnect: boolean) => void; - setAllowLan: (allowLan: boolean) => void; - setShowBetaReleases: (showBetaReleases: boolean) => void; - setStartMinimized: (startMinimized: boolean) => void; - setMonochromaticIcon: (monochromaticIcon: boolean) => void; - setUnpinnedWindow: (unpinnedWindow: boolean) => void; - setDnsOptions: (dns: IDnsOptions) => Promise<void>; - onClose: () => void; -} - -interface IState { - showKillSwitchInfo: boolean; -} - -export default class Preferences extends React.Component<IProps, IState> { - public state = { showKillSwitchInfo: false }; - - public render() { - return ( - <BackAction action={this.props.onClose}> - <Layout> - <StyledContainer> - <NavigationContainer> - <NavigationBar> - <NavigationItems> - <TitleBarItem> - { - // TRANSLATORS: Title label in navigation bar - messages.pgettext('preferences-nav', 'Preferences') - } - </TitleBarItem> - </NavigationItems> - </NavigationBar> - - <NavigationScrollbars> - <SettingsHeader> - <HeaderTitle>{messages.pgettext('preferences-view', 'Preferences')}</HeaderTitle> - </SettingsHeader> - - <StyledContent> - <Cell.CellButton onClick={this.showKillSwitchInfo}> - <AriaInputGroup> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Kill switch')} - </Cell.InputLabel> - </AriaLabel> - <StyledInfoIcon /> - <AriaInput> - <Cell.Switch isOn disabled /> - </AriaInput> - </AriaInputGroup> - </Cell.CellButton> - <StyledSeparator height={20} /> - - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Launch app on start-up')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch - isOn={this.props.autoStart} - onChange={this.props.setAutoStart} - /> - </AriaInput> - </Cell.Container> - </AriaInputGroup> - <StyledSeparator /> - - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Auto-connect')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch - isOn={this.props.autoConnect} - onChange={this.props.setAutoConnect} - /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {messages.pgettext( - 'preferences-view', - 'Automatically connect to a server when the app launches.', - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - - <AriaInputGroup> - <Cell.Container disabled={this.props.dns.state === 'custom'}> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Block ads')} - </Cell.InputLabel> - </AriaLabel> - <AriaDetails> - <InfoButton> - <ModalMessage> - {messages.pgettext( - 'preferences-view', - 'When enabled, this feature stops the device from contacting certain known ad domains.', - )} - </ModalMessage> - <ModalMessage> - {messages.pgettext( - 'preferences-view', - 'Warning: This might cause issues on certain websites, services, and programs.', - )} - </ModalMessage> - </InfoButton> - </AriaDetails> - <AriaInput> - <Cell.Switch - isOn={ - this.props.dns.state === 'default' && - this.props.dns.defaultOptions.blockAds - } - onChange={this.setBlockAds} - /> - </AriaInput> - </Cell.Container> - </AriaInputGroup> - <StyledSeparator /> - <AriaInputGroup> - <Cell.Container disabled={this.props.dns.state === 'custom'}> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Block trackers')} - </Cell.InputLabel> - </AriaLabel> - <AriaDetails> - <InfoButton> - <ModalMessage> - {messages.pgettext( - 'preferences-view', - 'When enabled, this feature stops the device from contacting certain domains known to track users.', - )} - </ModalMessage> - <ModalMessage> - {messages.pgettext( - 'preferences-view', - 'Warning: This might cause issues on certain websites, services, and programs.', - )} - </ModalMessage> - </InfoButton> - </AriaDetails> - <AriaInput> - <Cell.Switch - isOn={ - this.props.dns.state === 'default' && - this.props.dns.defaultOptions.blockTrackers - } - onChange={this.setBlockTrackers} - /> - </AriaInput> - </Cell.Container> - </AriaInputGroup> - <StyledSeparator /> - <AriaInputGroup> - <Cell.Container disabled={this.props.dns.state === 'custom'}> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Block malware')} - </Cell.InputLabel> - </AriaLabel> - <AriaDetails> - <InfoButton> - <ModalMessage> - {messages.pgettext( - 'preferences-view', - 'When enabled, this feature stops the device from contacting certain domains known to host malware.', - )} - </ModalMessage> - <ModalMessage> - {messages.pgettext( - 'preferences-view', - 'Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection.', - )} - </ModalMessage> - </InfoButton> - </AriaDetails> - <AriaInput> - <Cell.Switch - isOn={ - this.props.dns.state === 'default' && - this.props.dns.defaultOptions.blockMalware - } - onChange={this.setBlockMalware} - /> - </AriaInput> - </Cell.Container> - </AriaInputGroup> - <StyledSeparator /> - <AriaInputGroup> - <Cell.Container disabled={this.props.dns.state === 'custom'}> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Block adult content')} - </Cell.InputLabel> - </AriaLabel> - <AriaDetails> - <InfoButton - message={messages.pgettext( - 'preferences-view', - 'When enabled, this feature stops the device from contacting certain websites and services known to host adult content.', - )} - /> - </AriaDetails> - <AriaInput> - <Cell.Switch - isOn={ - this.props.dns.state === 'default' && - this.props.dns.defaultOptions.blockAdultContent - } - onChange={this.setBlockAdultContent} - /> - </AriaInput> - </Cell.Container> - </AriaInputGroup> - <StyledSeparator /> - <AriaInputGroup> - <Cell.Container disabled={this.props.dns.state === 'custom'}> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Block gambling')} - </Cell.InputLabel> - </AriaLabel> - <AriaDetails> - <InfoButton - message={messages.pgettext( - 'preferences-view', - 'When enabled, this feature stops the device from contacting certain websites and services known to host gambling content.', - )} - /> - </AriaDetails> - <AriaInput> - <Cell.Switch - isOn={ - this.props.dns.state === 'default' && - this.props.dns.defaultOptions.blockGambling - } - onChange={this.setBlockGambling} - /> - </AriaInput> - </Cell.Container> - {this.props.dns.state === 'custom' && <CustomDnsEnabledFooter />} - </AriaInputGroup> - - {this.props.dns.state !== 'custom' && <StyledSeparator height={20} />} - - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Local network sharing')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch isOn={this.props.allowLan} onChange={this.props.setAllowLan} /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {messages.pgettext( - 'preferences-view', - 'Allows access to other devices on the same network for sharing, printing etc.', - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Notifications')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch - isOn={this.props.enableSystemNotifications} - onChange={this.props.setEnableSystemNotifications} - /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {messages.pgettext( - 'preferences-view', - 'Enable or disable system notifications. The critical notifications will always be displayed.', - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Monochromatic tray icon')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch - isOn={this.props.monochromaticIcon} - onChange={this.props.setMonochromaticIcon} - /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {messages.pgettext( - 'preferences-view', - 'Use a monochromatic tray icon instead of a colored one.', - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - - {(window.env.platform === 'win32' || - (window.env.platform === 'darwin' && window.env.development)) && ( - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Unpin app from taskbar')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch - isOn={this.props.unpinnedWindow} - onChange={this.props.setUnpinnedWindow} - /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {messages.pgettext( - 'preferences-view', - 'Enable to move the app around as a free-standing window.', - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - )} - - {this.props.unpinnedWindow && ( - <React.Fragment> - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Start minimized')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch - isOn={this.props.startMinimized} - onChange={this.props.setStartMinimized} - /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {messages.pgettext( - 'preferences-view', - 'Show only the tray icon when the app starts.', - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - </React.Fragment> - )} - - <AriaInputGroup> - <Cell.Container disabled={this.props.isBeta}> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('preferences-view', 'Beta program')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch - isOn={this.props.showBetaReleases} - onChange={this.props.setShowBetaReleases} - /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {this.props.isBeta - ? messages.pgettext( - 'preferences-view', - 'This option is unavailable while using a beta version.', - ) - : messages.pgettext( - 'preferences-view', - 'Enable to get notified when new beta versions of the app are released.', - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - </StyledContent> - </NavigationScrollbars> - </NavigationContainer> - </StyledContainer> - - <ModalAlert - isOpen={this.state.showKillSwitchInfo} - message={messages.pgettext( - 'preferences-view', - 'The app has a built in kill switch that is enabled by default and cannot be disabled. This is to prevent your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails for any reason. Mullvad automatically protects your data until your connection is reestablished.', - )} - type={ModalAlertType.info} - buttons={[ - <AppButton.BlueButton key="back" onClick={this.hideKillSwitchInfo}> - {messages.gettext('Got it!')} - </AppButton.BlueButton>, - ]} - close={this.hideKillSwitchInfo} - /> - </Layout> - </BackAction> - ); - } - - private setBlockAds = async (enabled: boolean) => { - await this.props.setDnsOptions({ - ...this.props.dns, - defaultOptions: { - ...this.props.dns.defaultOptions, - blockAds: enabled, - }, - }); - }; - - private setBlockTrackers = async (enabled: boolean) => { - await this.props.setDnsOptions({ - ...this.props.dns, - defaultOptions: { - ...this.props.dns.defaultOptions, - blockTrackers: enabled, - }, - }); - }; - - private setBlockMalware = async (enabled: boolean) => { - await this.props.setDnsOptions({ - ...this.props.dns, - defaultOptions: { - ...this.props.dns.defaultOptions, - blockMalware: enabled, - }, - }); - }; - - private setBlockAdultContent = async (enabled: boolean) => { - await this.props.setDnsOptions({ - ...this.props.dns, - defaultOptions: { - ...this.props.dns.defaultOptions, - blockAdultContent: enabled, - }, - }); - }; - - private setBlockGambling = async (enabled: boolean) => { - await this.props.setDnsOptions({ - ...this.props.dns, - defaultOptions: { - ...this.props.dns.defaultOptions, - blockGambling: enabled, - }, - }); - }; - - private showKillSwitchInfo = () => { - this.setState({ showKillSwitchInfo: true }); - }; - - private hideKillSwitchInfo = () => { - this.setState({ showKillSwitchInfo: false }); - }; -} - -function CustomDnsEnabledFooter() { - const customDnsFeatureName = messages.pgettext('advanced-settings-view', 'Use custom DNS server'); - - // TRANSLATORS: This is displayed when the custom DNS setting is turned on which makes the block - // TRANSLATORS: ads/trackers settings disabled. The text enclosed in "**" will appear bold. - // TRANSLATORS: Advanced settings refer to the name of the page with the title "Advanced". - // TRANSLATORS: Available placeholders: - // TRANSLATORS: %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. - const blockingDisabledText = messages.pgettext( - 'preferences-view', - 'Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings.', - ); - - return ( - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {formatMarkdown(sprintf(blockingDisabledText, { customDnsFeatureName }))} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - ); -} diff --git a/gui/src/renderer/components/PreferencesStyles.tsx b/gui/src/renderer/components/PreferencesStyles.tsx deleted file mode 100644 index 81ee5c1928..0000000000 --- a/gui/src/renderer/components/PreferencesStyles.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import styled from 'styled-components'; - -import { colors } from '../../config.json'; -import { InfoIcon } from './InfoButton'; -import { Container } from './Layout'; - -export const StyledContainer = styled(Container)({ - backgroundColor: colors.darkBlue, -}); - -export const StyledContent = styled.div({ - display: 'flex', - flexDirection: 'column', - flex: 1, - marginBottom: '2px', -}); - -export const StyledSeparator = styled.div((props: { height?: number }) => ({ - height: `${props.height ?? 1}px`, -})); - -export const StyledInfoIcon = styled(InfoIcon)({ - marginRight: '16px', -}); diff --git a/gui/src/renderer/components/ProblemReport.tsx b/gui/src/renderer/components/ProblemReport.tsx new file mode 100644 index 0000000000..d98520640a --- /dev/null +++ b/gui/src/renderer/components/ProblemReport.tsx @@ -0,0 +1,459 @@ +import * as React from 'react'; + +import { links } from '../../config.json'; +import { AccountToken } from '../../shared/daemon-rpc-types'; +import { messages } from '../../shared/gettext'; +import { IProblemReportForm } from '../redux/support/actions'; +import * as AppButton from './AppButton'; +import { AriaDescribed, AriaDescription, AriaDescriptionGroup } from './AriaGroup'; +import ImageView from './ImageView'; +import { BackAction } from './KeyboardNavigation'; +import { Layout } from './Layout'; +import { ModalAlert, ModalAlertType } from './Modal'; +import { NavigationBar, NavigationItems, TitleBarItem } from './NavigationBar'; +import { + StyledBlueButton, + StyledContainer, + StyledContent, + StyledContentContainer, + StyledEmail, + StyledEmailInput, + StyledFooter, + StyledForm, + StyledFormEmailRow, + StyledFormMessageRow, + StyledMessageInput, + StyledSendStatus, + StyledSentMessage, + StyledStatusIcon, + StyledThanks, +} from './ProblemReportStyles'; +import SettingsHeader, { HeaderSubTitle, HeaderTitle } from './SettingsHeader'; + +enum SendState { + initial, + confirm, + sending, + success, + failed, +} + +interface IProblemReportState { + email: string; + message: string; + savedReportId?: string; + sendState: SendState; + disableActions: boolean; + showOutdatedVersionWarning: boolean; +} + +interface IProblemReportProps { + defaultEmail: string; + defaultMessage: string; + accountHistory?: AccountToken; + isOffline: boolean; + onClose: () => void; + viewLog: (path: string) => void; + saveReportForm: (form: IProblemReportForm) => void; + clearReportForm: () => void; + collectProblemReport: (accountToRedact?: string) => Promise<string>; + sendProblemReport: (email: string, message: string, savedReportId: string) => Promise<void>; + outdatedVersion: boolean; + suggestedIsBeta: boolean; + onExternalLink: (url: string) => void; +} + +export default class ProblemReport extends React.Component< + IProblemReportProps, + IProblemReportState +> { + public state = { + email: '', + message: '', + savedReportId: undefined, + sendState: SendState.initial, + disableActions: false, + showOutdatedVersionWarning: false, + }; + + private collectLogPromise?: Promise<string>; + + constructor(props: IProblemReportProps) { + super(props); + + // seed initial data from props + this.state.email = props.defaultEmail; + this.state.message = props.defaultMessage; + this.state.showOutdatedVersionWarning = props.outdatedVersion; + } + + public validate() { + return this.state.message.trim().length > 0; + } + + public onChangeEmail = (event: React.ChangeEvent<HTMLInputElement>) => { + this.setState({ email: event.target.value }, () => { + this.saveFormData(); + }); + }; + + public onChangeDescription = (event: React.ChangeEvent<HTMLTextAreaElement>) => { + this.setState({ message: event.target.value }, () => { + this.saveFormData(); + }); + }; + + public onViewLog = () => { + this.performWithActionsDisabled(async () => { + try { + const reportId = await this.collectLog(); + this.props.viewLog(reportId); + } catch (error) { + // TODO: handle error + } + }); + }; + + public onSend = async (): Promise<void> => { + const sendState = this.state.sendState; + if (sendState === SendState.initial && this.state.email.length === 0) { + this.setState({ sendState: SendState.confirm }); + } else if ( + sendState === SendState.initial || + sendState === SendState.confirm || + sendState === SendState.failed + ) { + try { + await this.sendReport(); + } catch (error) { + // No-op + } + } + }; + + public onCancelNoEmailDialog = () => { + this.setState({ sendState: SendState.initial }); + }; + + public render() { + const { sendState } = this.state; + const header = ( + <SettingsHeader> + <HeaderTitle>{messages.pgettext('support-view', 'Report a problem')}</HeaderTitle> + {(sendState === SendState.initial || sendState === SendState.confirm) && ( + <HeaderSubTitle> + {messages.pgettext( + 'support-view', + "To help you more effectively, your app's log file will be attached to this message. Your data will remain secure and private, as it is anonymised before being sent over an encrypted channel.", + )} + </HeaderSubTitle> + )} + </SettingsHeader> + ); + + const content = this.renderContent(); + + return ( + <BackAction action={this.props.onClose}> + <Layout> + <StyledContainer> + <NavigationBar> + <NavigationItems> + <TitleBarItem> + { + // TRANSLATORS: Title label in navigation bar + messages.pgettext('support-view', 'Report a problem') + } + </TitleBarItem> + </NavigationItems> + </NavigationBar> + <StyledContentContainer> + {header} + {content} + </StyledContentContainer> + + {this.renderNoEmailDialog()} + {this.renderOutdateVersionWarningDialog()} + </StyledContainer> + </Layout> + </BackAction> + ); + } + + private saveFormData() { + this.props.saveReportForm({ + email: this.state.email, + message: this.state.message, + }); + } + + private async collectLog(): Promise<string> { + if (this.collectLogPromise) { + return this.collectLogPromise; + } else { + const collectPromise = this.props.collectProblemReport(this.props.accountHistory); + + // save promise to prevent subsequent requests + this.collectLogPromise = collectPromise; + + try { + const reportId = await collectPromise; + return new Promise((resolve) => { + this.setState({ savedReportId: reportId }, () => resolve(reportId)); + }); + } catch (error) { + this.collectLogPromise = undefined; + + throw error; + } + } + } + + private sendReport(): Promise<void> { + return new Promise((resolve, reject) => { + this.setState({ sendState: SendState.sending }, async () => { + try { + const { email, message } = this.state; + const reportId = await this.collectLog(); + await this.props.sendProblemReport(email, message, reportId); + this.props.clearReportForm(); + this.setState({ sendState: SendState.success }, () => { + resolve(); + }); + } catch (error) { + this.setState({ sendState: SendState.failed }, () => { + reject(error); + }); + } + }); + }); + } + + private renderContent() { + switch (this.state.sendState) { + case SendState.initial: + case SendState.confirm: + return this.renderForm(); + case SendState.sending: + return this.renderSending(); + case SendState.success: + return this.renderSent(); + case SendState.failed: + return this.renderFailed(); + default: + return null; + } + } + + private renderNoEmailDialog() { + const message = messages.pgettext( + 'support-view', + 'You are about to send the problem report without a way for us to get back to you. If you want an answer to your report you will have to enter an email address.', + ); + return ( + <ModalAlert + isOpen={this.state.sendState === SendState.confirm} + type={ModalAlertType.warning} + message={message} + buttons={[ + <AppButton.RedButton key="proceed" onClick={this.onSend}> + {messages.pgettext('support-view', 'Send anyway')} + </AppButton.RedButton>, + <AppButton.BlueButton key="cancel" onClick={this.onCancelNoEmailDialog}> + {messages.gettext('Back')} + </AppButton.BlueButton>, + ]} + close={this.onCancelNoEmailDialog} + /> + ); + } + + private acknowledgeOutdateVersion = () => { + this.setState({ showOutdatedVersionWarning: false }); + }; + + private openDownloadLink = () => + this.props.onExternalLink(this.props.suggestedIsBeta ? links.betaDownload : links.download); + + private renderOutdateVersionWarningDialog() { + const message = messages.pgettext( + 'support-view', + 'You are using an old version of the app. Please upgrade and see if the problem still exists before sending a report.', + ); + return ( + <ModalAlert + isOpen={this.state.showOutdatedVersionWarning} + type={ModalAlertType.warning} + message={message} + buttons={[ + <AriaDescriptionGroup key="upgrade"> + <AriaDescribed> + <AppButton.GreenButton + disabled={this.props.isOffline} + onClick={this.openDownloadLink}> + <AppButton.Label> + {messages.pgettext('support-view', 'Upgrade app')} + </AppButton.Label> + <AriaDescription> + <AppButton.Icon + height={16} + width={16} + source="icon-extLink" + aria-label={messages.pgettext('accessibility', 'Opens externally')} + /> + </AriaDescription> + </AppButton.GreenButton> + </AriaDescribed> + </AriaDescriptionGroup>, + <AppButton.RedButton key="proceed" onClick={this.acknowledgeOutdateVersion}> + {messages.pgettext('support-view', 'Continue anyway')} + </AppButton.RedButton>, + <AppButton.BlueButton key="cancel" onClick={this.outdatedVersionCancel}> + {messages.gettext('Cancel')} + </AppButton.BlueButton>, + ]} + close={this.props.onClose} + /> + ); + } + + private outdatedVersionCancel = () => { + this.acknowledgeOutdateVersion(); + this.props.onClose(); + }; + + private renderForm() { + return ( + <StyledContent> + <StyledForm> + <StyledFormEmailRow> + <StyledEmailInput + placeholder={messages.pgettext('support-view', 'Your email (optional)')} + defaultValue={this.state.email} + onChange={this.onChangeEmail} + /> + </StyledFormEmailRow> + <StyledFormMessageRow> + <StyledMessageInput + placeholder={messages.pgettext( + 'support-view', + 'Please describe your problem in English or Swedish.', + )} + defaultValue={this.state.message} + onChange={this.onChangeDescription} + /> + </StyledFormMessageRow> + </StyledForm> + <StyledFooter> + <AriaDescriptionGroup> + <AriaDescribed> + <StyledBlueButton onClick={this.onViewLog} disabled={this.state.disableActions}> + <AppButton.Label> + {messages.pgettext('support-view', 'View app logs')} + </AppButton.Label> + <AriaDescription> + <AppButton.Icon + source="icon-extLink" + height={16} + width={16} + aria-label={messages.pgettext('accessibility', 'Opens externally')} + /> + </AriaDescription> + </StyledBlueButton> + </AriaDescribed> + </AriaDescriptionGroup> + <AppButton.GreenButton + disabled={!this.validate() || this.state.disableActions} + onClick={this.onSend}> + {messages.pgettext('support-view', 'Send')} + </AppButton.GreenButton> + </StyledFooter> + </StyledContent> + ); + } + + private renderSending() { + return ( + <StyledContent> + <StyledForm> + <StyledStatusIcon> + <ImageView source="icon-spinner" height={60} width={60} /> + </StyledStatusIcon> + <StyledSendStatus>{messages.pgettext('support-view', 'Sending...')}</StyledSendStatus> + </StyledForm> + </StyledContent> + ); + } + + private renderSent() { + const reachBackMessage: React.ReactNodeArray = + // TRANSLATORS: The message displayed to the user after submitting the problem report, given that the user left his or her email for us to reach back. + // TRANSLATORS: Available placeholders: + // TRANSLATORS: %(email)s + messages + .pgettext('support-view', 'If needed we will contact you at %(email)s') + .split('%(email)s', 2); + reachBackMessage.splice(1, 0, <StyledEmail key="email">{this.state.email}</StyledEmail>); + + return ( + <StyledContent> + <StyledForm> + <StyledStatusIcon> + <ImageView source="icon-success" height={60} width={60} /> + </StyledStatusIcon> + <StyledSendStatus>{messages.pgettext('support-view', 'Sent')}</StyledSendStatus> + + <StyledSentMessage> + <StyledThanks>{messages.pgettext('support-view', 'Thanks!')} </StyledThanks> + {messages.pgettext('support-view', 'We will look into this.')} + </StyledSentMessage> + {this.state.email.trim().length > 0 ? ( + <StyledSentMessage>{reachBackMessage}</StyledSentMessage> + ) : null} + </StyledForm> + </StyledContent> + ); + } + + private renderFailed() { + return ( + <StyledContent> + <StyledForm> + <StyledStatusIcon> + <ImageView source="icon-fail" height={60} width={60} /> + </StyledStatusIcon> + <StyledSendStatus>{messages.pgettext('support-view', 'Failed to send')}</StyledSendStatus> + <StyledSentMessage> + {messages.pgettext( + 'support-view', + 'If you exit the form and try again later, the information you already entered will still be here.', + )} + </StyledSentMessage> + </StyledForm> + <StyledFooter> + <StyledBlueButton onClick={this.handleEditMessage}> + {messages.pgettext('support-view', 'Edit message')} + </StyledBlueButton> + <AppButton.GreenButton onClick={this.onSend}> + {messages.pgettext('support-view', 'Try again')} + </AppButton.GreenButton> + </StyledFooter> + </StyledContent> + ); + } + + private handleEditMessage = () => { + this.setState({ sendState: SendState.initial }); + }; + + private performWithActionsDisabled(work: () => Promise<void>) { + this.setState({ disableActions: true }, async () => { + try { + await work(); + } catch { + // TODO: handle error + } + this.setState({ disableActions: false }); + }); + } +} diff --git a/gui/src/renderer/components/SupportStyles.tsx b/gui/src/renderer/components/ProblemReportStyles.tsx index bc5166297c..bc5166297c 100644 --- a/gui/src/renderer/components/SupportStyles.tsx +++ b/gui/src/renderer/components/ProblemReportStyles.tsx diff --git a/gui/src/renderer/components/Settings.tsx b/gui/src/renderer/components/Settings.tsx index 2deb1ee0e7..812deef142 100644 --- a/gui/src/renderer/components/Settings.tsx +++ b/gui/src/renderer/components/Settings.tsx @@ -1,10 +1,12 @@ -import * as React from 'react'; +import { useCallback, useEffect } from 'react'; import { colors, links } from '../../config.json'; import { formatRemainingTime, hasExpired } from '../../shared/account-expiry'; import { messages } from '../../shared/gettext'; -import History from '../lib/history'; -import { LoginState } from '../redux/account/reducers'; +import { useAppContext } from '../context'; +import { useHistory } from '../lib/history'; +import { RoutePath } from '../lib/routes'; +import { useSelector } from '../redux/store'; import { AriaDescribed, AriaDescription, AriaDescriptionGroup } from './AriaGroup'; import * as Cell from './cell'; import { BackAction } from './KeyboardNavigation'; @@ -13,7 +15,6 @@ import { NavigationBar, NavigationContainer, NavigationItems, TitleBarItem } fro import SettingsHeader, { HeaderTitle } from './SettingsHeader'; import { StyledCellIcon, - StyledCellSpacer, StyledContainer, StyledContent, StyledNavigationScrollbars, @@ -22,238 +23,226 @@ import { StyledSettingsContent, } from './SettingsStyles'; -export interface IProps { - preferredLocaleDisplayName: string; - loginState: LoginState; - connectedToDaemon: boolean; - accountExpiry?: string; - appVersion: string; - consistentVersion: boolean; - upToDateVersion: boolean; - suggestedIsBeta: boolean; - isOffline: boolean; - onQuit: () => void; - onClose: () => void; - onViewSelectLanguage: () => void; - onViewAccount: () => void; - onViewSupport: () => void; - onViewPreferences: () => void; - onViewAdvancedSettings: () => void; - onExternalLink: (url: string) => void; - updateAccountData: () => void; - history: History; -} +export default function Support() { + const history = useHistory(); + const { updateAccountData } = useAppContext(); -export default class Settings extends React.Component<IProps> { - public componentDidMount() { - if (this.props.history.action === 'PUSH') { - this.props.updateAccountData(); + useEffect(() => { + if (history.action === 'PUSH') { + updateAccountData(); } - } + }, []); + + const loginState = useSelector((state) => state.account.status); + const connectedToDaemon = useSelector((state) => state.userInterface.connectedToDaemon); + + const showLargeTitle = loginState.type !== 'ok'; + const showSubSettings = loginState.type === 'ok' && connectedToDaemon; - public render() { - const showLargeTitle = this.props.loginState.type !== 'ok'; + return ( + <BackAction icon="close" action={history.dismiss}> + <Layout> + <StyledContainer> + <NavigationContainer> + <NavigationBar alwaysDisplayBarTitle={!showLargeTitle}> + <NavigationItems> + <TitleBarItem> + { + // TRANSLATORS: Title label in navigation bar + messages.pgettext('navigation-bar', 'Settings') + } + </TitleBarItem> + </NavigationItems> + </NavigationBar> - return ( - <BackAction icon="close" action={this.props.onClose}> - <Layout> - <StyledContainer> - <NavigationContainer> - <NavigationBar alwaysDisplayBarTitle={!showLargeTitle}> - <NavigationItems> - <TitleBarItem> - { - // TRANSLATORS: Title label in navigation bar - messages.pgettext('navigation-bar', 'Settings') - } - </TitleBarItem> - </NavigationItems> - </NavigationBar> + <StyledNavigationScrollbars fillContainer> + <StyledContent> + {showLargeTitle && ( + <SettingsHeader> + <HeaderTitle>{messages.pgettext('navigation-bar', 'Settings')}</HeaderTitle> + </SettingsHeader> + )} - <StyledNavigationScrollbars fillContainer> - <StyledContent> - {showLargeTitle && ( - <SettingsHeader> - <HeaderTitle>{messages.pgettext('navigation-bar', 'Settings')}</HeaderTitle> - </SettingsHeader> + <StyledSettingsContent> + {showSubSettings && ( + <> + <Cell.Group> + <AccountButton /> + <InterfaceSettingsButton /> + <VpnSettingsButton /> + </Cell.Group> + + {(window.env.platform === 'linux' || window.env.platform === 'win32') && ( + <Cell.Group> + <SplitTunnelingButton /> + </Cell.Group> + )} + </> )} - <StyledSettingsContent> - {this.renderTopButtons()} - {this.renderMiddleButtons()} - {this.renderBottomButtons()} - </StyledSettingsContent> - </StyledContent> + <Cell.Group> + <SupportButton /> + <AppVersionButton /> + </Cell.Group> + </StyledSettingsContent> + </StyledContent> - {this.renderQuitButton()} - </StyledNavigationScrollbars> - </NavigationContainer> - </StyledContainer> - </Layout> - </BackAction> - ); - } + <QuitButton /> + </StyledNavigationScrollbars> + </NavigationContainer> + </StyledContainer> + </Layout> + </BackAction> + ); +} - private openDownloadLink = () => - this.props.onExternalLink(this.props.suggestedIsBeta ? links.betaDownload : links.download); - private openFaqLink = () => this.props.onExternalLink(links.faq); +function AccountButton() { + const history = useHistory(); + const navigate = useCallback(() => history.push(RoutePath.accountSettings), [history]); - private renderQuitButton() { - return ( - <StyledQuitButton onClick={this.props.onQuit}> - {messages.pgettext('settings-view', 'Quit app')} - </StyledQuitButton> - ); - } + const accountExpiry = useSelector((state) => state.account.expiry); + const isOutOfTime = accountExpiry ? hasExpired(accountExpiry) : false; + const formattedExpiry = accountExpiry ? formatRemainingTime(accountExpiry).toUpperCase() : ''; + const outOfTimeMessage = messages.pgettext('settings-view', 'OUT OF TIME'); - private renderTopButtons() { - const isLoggedIn = this.props.loginState.type === 'ok'; - if (!isLoggedIn || !this.props.connectedToDaemon) { - return null; - } + return ( + <Cell.CellNavigationButton onClick={navigate}> + <Cell.Label> + { + // TRANSLATORS: Navigation button to the 'Account' view + messages.pgettext('settings-view', 'Account') + } + </Cell.Label> + <StyledOutOfTimeSubText isOutOfTime={isOutOfTime}> + {isOutOfTime ? outOfTimeMessage : formattedExpiry} + </StyledOutOfTimeSubText> + </Cell.CellNavigationButton> + ); +} - const isOutOfTime = this.props.accountExpiry ? hasExpired(this.props.accountExpiry) : false; - const formattedExpiry = this.props.accountExpiry - ? formatRemainingTime(this.props.accountExpiry).toUpperCase() - : ''; +function InterfaceSettingsButton() { + const history = useHistory(); + const navigate = useCallback(() => history.push(RoutePath.interfaceSettings), [history]); - const outOfTimeMessage = messages.pgettext('settings-view', 'OUT OF TIME'); + return ( + <Cell.CellNavigationButton onClick={navigate}> + <Cell.Label> + { + // TRANSLATORS: Navigation button to the 'Interface settings' view + messages.pgettext('settings-view', 'Interface settings') + } + </Cell.Label> + </Cell.CellNavigationButton> + ); +} - return ( - <> - <Cell.CellButton onClick={this.props.onViewAccount}> - <Cell.Label> - { - // TRANSLATORS: Navigation button to the 'Account' view - messages.pgettext('settings-view', 'Account') - } - </Cell.Label> - <StyledOutOfTimeSubText isOutOfTime={isOutOfTime}> - {isOutOfTime ? outOfTimeMessage : formattedExpiry} - </StyledOutOfTimeSubText> - <Cell.Icon height={12} width={7} source="icon-chevron" /> - </Cell.CellButton> +function VpnSettingsButton() { + const history = useHistory(); + const navigate = useCallback(() => history.push(RoutePath.vpnSettings), [history]); - <Cell.CellButton onClick={this.props.onViewPreferences}> - <Cell.Label> - { - // TRANSLATORS: Navigation button to the 'Preferences' view - messages.pgettext('settings-view', 'Preferences') - } - </Cell.Label> - <Cell.Icon height={12} width={7} source="icon-chevron" /> - </Cell.CellButton> + return ( + <Cell.CellNavigationButton onClick={navigate}> + <Cell.Label> + { + // TRANSLATORS: Navigation button to the 'VPN settings' view + messages.pgettext('settings-view', 'VPN settings') + } + </Cell.Label> + </Cell.CellNavigationButton> + ); +} - <Cell.CellButton onClick={this.props.onViewAdvancedSettings}> - <Cell.Label> - { - // TRANSLATORS: Navigation button to the 'Advanced' settings view - messages.pgettext('settings-view', 'Advanced') - } - </Cell.Label> - <Cell.Icon height={12} width={7} source="icon-chevron" /> - </Cell.CellButton> - <StyledCellSpacer /> - </> - ); - } +function SplitTunnelingButton() { + const history = useHistory(); + const navigate = useCallback(() => history.push(RoutePath.splitTunneling), [history]); + + return ( + <Cell.CellNavigationButton onClick={navigate}> + <Cell.Label> + { + // TRANSLATORS: Navigation button to the 'Split tunneling' view + messages.pgettext('settings-view', 'Split tunneling') + } + </Cell.Label> + </Cell.CellNavigationButton> + ); +} - private renderMiddleButtons() { - let icon; - let footer; - if (!this.props.consistentVersion || !this.props.upToDateVersion) { - const inconsistentVersionMessage = messages.pgettext( - 'settings-view', - 'App is out of sync. Please quit and restart.', - ); +function AppVersionButton() { + const appVersion = useSelector((state) => state.version.current); + const consistentVersion = useSelector((state) => state.version.consistent); + const upToDateVersion = useSelector((state) => (state.version.suggestedUpgrade ? false : true)); + const suggestedIsBeta = useSelector((state) => state.version.suggestedIsBeta ?? false); + const isOffline = useSelector((state) => state.connection.isBlocked); - const updateAvailableMessage = messages.pgettext( - 'settings-view', - 'Update available. Install the latest app version to stay up to date.', - ); + const { openUrl } = useAppContext(); + const openDownloadLink = useCallback( + () => openUrl(suggestedIsBeta ? links.betaDownload : links.download), + [openUrl, suggestedIsBeta], + ); - const message = !this.props.consistentVersion - ? inconsistentVersionMessage - : updateAvailableMessage; + let icon; + let footer; + if (!consistentVersion || !upToDateVersion) { + const inconsistentVersionMessage = messages.pgettext( + 'settings-view', + 'App is out of sync. Please quit and restart.', + ); - icon = <StyledCellIcon source="icon-alert" width={18} tintColor={colors.red} />; - footer = ( - <Cell.Footer> - <Cell.FooterText>{message}</Cell.FooterText> - </Cell.Footer> - ); - } else { - footer = <StyledCellSpacer />; - } + const updateAvailableMessage = messages.pgettext( + 'settings-view', + 'Update available. Install the latest app version to stay up to date.', + ); - return ( - <AriaDescriptionGroup> - <AriaDescribed> - <Cell.CellButton disabled={this.props.isOffline} onClick={this.openDownloadLink}> - {icon} - <Cell.Label>{messages.pgettext('settings-view', 'App version')}</Cell.Label> - <Cell.SubText>{this.props.appVersion}</Cell.SubText> - <AriaDescription> - <Cell.Icon - height={16} - width={16} - source="icon-extLink" - aria-label={messages.pgettext('accessibility', 'Opens externally')} - /> - </AriaDescription> - </Cell.CellButton> - </AriaDescribed> - {footer} - </AriaDescriptionGroup> + const message = !consistentVersion ? inconsistentVersionMessage : updateAvailableMessage; + + icon = <StyledCellIcon source="icon-alert" width={18} tintColor={colors.red} />; + footer = ( + <Cell.Footer> + <Cell.FooterText>{message}</Cell.FooterText> + </Cell.Footer> ); } - private renderBottomButtons() { - return ( - <> - <Cell.CellButton onClick={this.props.onViewSupport}> - <Cell.Label> - { - // TRANSLATORS: Navigation button to the 'Report a problem' help view - messages.pgettext('settings-view', 'Report a problem') - } - </Cell.Label> - <Cell.Icon height={12} width={7} source="icon-chevron" /> + return ( + <AriaDescriptionGroup> + <AriaDescribed> + <Cell.CellButton disabled={isOffline} onClick={openDownloadLink}> + {icon} + <Cell.Label>{messages.pgettext('settings-view', 'App version')}</Cell.Label> + <Cell.SubText>{appVersion}</Cell.SubText> + <AriaDescription> + <Cell.Icon + height={16} + width={16} + source="icon-extLink" + aria-label={messages.pgettext('accessibility', 'Opens externally')} + /> + </AriaDescription> </Cell.CellButton> + </AriaDescribed> + {footer} + </AriaDescriptionGroup> + ); +} - <AriaDescriptionGroup> - <AriaDescribed> - <Cell.CellButton disabled={this.props.isOffline} onClick={this.openFaqLink}> - <Cell.Label> - { - // TRANSLATORS: Link to the webpage - messages.pgettext('settings-view', 'FAQs & Guides') - } - </Cell.Label> - <AriaDescription> - <Cell.Icon - height={16} - width={16} - source="icon-extLink" - aria-label={messages.pgettext('accessibility', 'Opens externally')} - /> - </AriaDescription> - </Cell.CellButton> - </AriaDescribed> - </AriaDescriptionGroup> +function SupportButton() { + const history = useHistory(); + const navigate = useCallback(() => history.push(RoutePath.support), [history]); - <Cell.CellButton onClick={this.props.onViewSelectLanguage}> - <StyledCellIcon width={24} height={24} source="icon-language" /> - <Cell.Label> - { - // TRANSLATORS: Navigation button to the 'Language' settings view - messages.pgettext('settings-view', 'Language') - } - </Cell.Label> - <Cell.SubText>{this.props.preferredLocaleDisplayName}</Cell.SubText> - <Cell.Icon height={12} width={7} source="icon-chevron" /> - </Cell.CellButton> - </> - ); - } + return ( + <Cell.CellNavigationButton onClick={navigate}> + <Cell.Label>{messages.pgettext('settings-view', 'Support')}</Cell.Label> + </Cell.CellNavigationButton> + ); +} + +function QuitButton() { + const { quit } = useAppContext(); + + return ( + <StyledQuitButton onClick={quit}> + {messages.pgettext('settings-view', 'Quit app')} + </StyledQuitButton> + ); } diff --git a/gui/src/renderer/components/SettingsStyles.tsx b/gui/src/renderer/components/SettingsStyles.tsx index 88a4c8258a..687b448424 100644 --- a/gui/src/renderer/components/SettingsStyles.tsx +++ b/gui/src/renderer/components/SettingsStyles.tsx @@ -34,12 +34,6 @@ export const StyledSettingsContent = styled.div({ flexDirection: 'column', }); -export const StyledCellSpacer = styled.div({ - height: '20px', - minHeight: '20px', - flex: 0, -}); - export const StyledQuitButton = styled(AppButton.RedButton)({ margin: '20px 22px 22px', }); diff --git a/gui/src/renderer/components/Support.tsx b/gui/src/renderer/components/Support.tsx index 9b445e25c9..ef2c82dd4e 100644 --- a/gui/src/renderer/components/Support.tsx +++ b/gui/src/renderer/components/Support.tsx @@ -1,456 +1,159 @@ -import * as React from 'react'; +import { useCallback } from 'react'; +import styled from 'styled-components'; -import { links } from '../../config.json'; -import { AccountToken } from '../../shared/daemon-rpc-types'; +import { colors, links } from '../../config.json'; import { messages } from '../../shared/gettext'; -import { ISupportReportForm } from '../redux/support/actions'; -import * as AppButton from './AppButton'; -import { AriaDescribed, AriaDescription, AriaDescriptionGroup } from './AriaGroup'; -import ImageView from './ImageView'; +import { useAppContext } from '../context'; +import { useHistory } from '../lib/history'; +import { RoutePath } from '../lib/routes'; +import { useSelector } from '../redux/store'; +import { + AriaDescribed, + AriaDescription, + AriaDescriptionGroup, + AriaInput, + AriaInputGroup, + AriaLabel, +} from './AriaGroup'; +import * as Cell from './cell'; import { BackAction } from './KeyboardNavigation'; -import { Layout } from './Layout'; -import { ModalAlert, ModalAlertType } from './Modal'; -import { NavigationBar, NavigationItems, TitleBarItem } from './NavigationBar'; -import SettingsHeader, { HeaderSubTitle, HeaderTitle } from './SettingsHeader'; +import { Container, Layout } from './Layout'; import { - StyledBlueButton, - StyledContainer, - StyledContent, - StyledContentContainer, - StyledEmail, - StyledEmailInput, - StyledFooter, - StyledForm, - StyledFormEmailRow, - StyledFormMessageRow, - StyledMessageInput, - StyledSendStatus, - StyledSentMessage, - StyledStatusIcon, - StyledThanks, -} from './SupportStyles'; - -enum SendState { - initial, - confirm, - sending, - success, - failed, -} - -interface ISupportState { - email: string; - message: string; - savedReportId?: string; - sendState: SendState; - disableActions: boolean; - showOutdatedVersionWarning: boolean; -} - -interface ISupportProps { - defaultEmail: string; - defaultMessage: string; - accountHistory?: AccountToken; - isOffline: boolean; - onClose: () => void; - viewLog: (path: string) => void; - saveReportForm: (form: ISupportReportForm) => void; - clearReportForm: () => void; - collectProblemReport: (accountToRedact?: string) => Promise<string>; - sendProblemReport: (email: string, message: string, savedReportId: string) => Promise<void>; - outdatedVersion: boolean; - suggestedIsBeta: boolean; - onExternalLink: (url: string) => void; -} - -export default class Support extends React.Component<ISupportProps, ISupportState> { - public state = { - email: '', - message: '', - savedReportId: undefined, - sendState: SendState.initial, - disableActions: false, - showOutdatedVersionWarning: false, - }; - - private collectLogPromise?: Promise<string>; - - constructor(props: ISupportProps) { - super(props); - - // seed initial data from props - this.state.email = props.defaultEmail; - this.state.message = props.defaultMessage; - this.state.showOutdatedVersionWarning = props.outdatedVersion; - } - - public validate() { - return this.state.message.trim().length > 0; - } - - public onChangeEmail = (event: React.ChangeEvent<HTMLInputElement>) => { - this.setState({ email: event.target.value }, () => { - this.saveFormData(); - }); - }; - - public onChangeDescription = (event: React.ChangeEvent<HTMLTextAreaElement>) => { - this.setState({ message: event.target.value }, () => { - this.saveFormData(); - }); - }; - - public onViewLog = () => { - this.performWithActionsDisabled(async () => { - try { - const reportId = await this.collectLog(); - this.props.viewLog(reportId); - } catch (error) { - // TODO: handle error - } - }); - }; + NavigationBar, + NavigationContainer, + NavigationItems, + NavigationScrollbars, + TitleBarItem, +} from './NavigationBar'; +import SettingsHeader, { HeaderTitle } from './SettingsHeader'; - public onSend = async (): Promise<void> => { - const sendState = this.state.sendState; - if (sendState === SendState.initial && this.state.email.length === 0) { - this.setState({ sendState: SendState.confirm }); - } else if ( - sendState === SendState.initial || - sendState === SendState.confirm || - sendState === SendState.failed - ) { - try { - await this.sendReport(); - } catch (error) { - // No-op - } - } - }; +const StyledContainer = styled(Container)({ + backgroundColor: colors.darkBlue, +}); - public onCancelNoEmailDialog = () => { - this.setState({ sendState: SendState.initial }); - }; +const StyledContent = styled.div({ + display: 'flex', + flexDirection: 'column', + flex: 1, + marginBottom: '2px', +}); - public render() { - const { sendState } = this.state; - const header = ( - <SettingsHeader> - <HeaderTitle>{messages.pgettext('support-view', 'Report a problem')}</HeaderTitle> - {(sendState === SendState.initial || sendState === SendState.confirm) && ( - <HeaderSubTitle> - {messages.pgettext( - 'support-view', - "To help you more effectively, your app's log file will be attached to this message. Your data will remain secure and private, as it is anonymised before being sent over an encrypted channel.", - )} - </HeaderSubTitle> - )} - </SettingsHeader> - ); +export default function Support() { + const { pop } = useHistory(); - const content = this.renderContent(); - - return ( - <BackAction action={this.props.onClose}> - <Layout> - <StyledContainer> + return ( + <BackAction action={pop}> + <Layout> + <StyledContainer> + <NavigationContainer> <NavigationBar> <NavigationItems> <TitleBarItem> { // TRANSLATORS: Title label in navigation bar - messages.pgettext('support-view', 'Report a problem') + messages.pgettext('support-view', 'Support') } </TitleBarItem> </NavigationItems> </NavigationBar> - <StyledContentContainer> - {header} - {content} - </StyledContentContainer> - - {this.renderNoEmailDialog()} - {this.renderOutdateVersionWarningDialog()} - </StyledContainer> - </Layout> - </BackAction> - ); - } - - private saveFormData() { - this.props.saveReportForm({ - email: this.state.email, - message: this.state.message, - }); - } - - private async collectLog(): Promise<string> { - if (this.collectLogPromise) { - return this.collectLogPromise; - } else { - const collectPromise = this.props.collectProblemReport(this.props.accountHistory); - // save promise to prevent subsequent requests - this.collectLogPromise = collectPromise; + <NavigationScrollbars> + <SettingsHeader> + <HeaderTitle>{messages.pgettext('support-view', 'Support')}</HeaderTitle> + </SettingsHeader> - try { - const reportId = await collectPromise; - return new Promise((resolve) => { - this.setState({ savedReportId: reportId }, () => resolve(reportId)); - }); - } catch (error) { - this.collectLogPromise = undefined; + <StyledContent> + <Cell.Group> + <ProblemReportButton /> + <FaqButton /> + </Cell.Group> - throw error; - } - } - } - - private sendReport(): Promise<void> { - return new Promise((resolve, reject) => { - this.setState({ sendState: SendState.sending }, async () => { - try { - const { email, message } = this.state; - const reportId = await this.collectLog(); - await this.props.sendProblemReport(email, message, reportId); - this.props.clearReportForm(); - this.setState({ sendState: SendState.success }, () => { - resolve(); - }); - } catch (error) { - this.setState({ sendState: SendState.failed }, () => { - reject(error); - }); - } - }); - }); - } - - private renderContent() { - switch (this.state.sendState) { - case SendState.initial: - case SendState.confirm: - return this.renderForm(); - case SendState.sending: - return this.renderSending(); - case SendState.success: - return this.renderSent(); - case SendState.failed: - return this.renderFailed(); - default: - return null; - } - } + <Cell.Group> + <BetaProgramSetting /> + </Cell.Group> + </StyledContent> + </NavigationScrollbars> + </NavigationContainer> + </StyledContainer> + </Layout> + </BackAction> + ); +} - private renderNoEmailDialog() { - const message = messages.pgettext( - 'support-view', - 'You are about to send the problem report without a way for us to get back to you. If you want an answer to your report you will have to enter an email address.', - ); - return ( - <ModalAlert - isOpen={this.state.sendState === SendState.confirm} - type={ModalAlertType.warning} - message={message} - buttons={[ - <AppButton.RedButton key="proceed" onClick={this.onSend}> - {messages.pgettext('support-view', 'Send anyway')} - </AppButton.RedButton>, - <AppButton.BlueButton key="cancel" onClick={this.onCancelNoEmailDialog}> - {messages.gettext('Back')} - </AppButton.BlueButton>, - ]} - close={this.onCancelNoEmailDialog} - /> - ); - } +function ProblemReportButton() { + const history = useHistory(); + const clickHandler = useCallback(() => history.push(RoutePath.problemReport), [history]); - private acknowledgeOutdateVersion = () => { - this.setState({ showOutdatedVersionWarning: false }); - }; + // TRANSLATORS: Navigation button to the 'Report a problem' help view + const label = messages.pgettext('support-view', 'Report a problem'); - private openDownloadLink = () => - this.props.onExternalLink(this.props.suggestedIsBeta ? links.betaDownload : links.download); + return ( + <Cell.CellNavigationButton onClick={clickHandler}> + <Cell.Label>{label}</Cell.Label> + </Cell.CellNavigationButton> + ); +} - private renderOutdateVersionWarningDialog() { - const message = messages.pgettext( - 'support-view', - 'You are using an old version of the app. Please upgrade and see if the problem still exists before sending a report.', - ); - return ( - <ModalAlert - isOpen={this.state.showOutdatedVersionWarning} - type={ModalAlertType.warning} - message={message} - buttons={[ - <AriaDescriptionGroup key="upgrade"> - <AriaDescribed> - <AppButton.GreenButton - disabled={this.props.isOffline} - onClick={this.openDownloadLink}> - <AppButton.Label> - {messages.pgettext('support-view', 'Upgrade app')} - </AppButton.Label> - <AriaDescription> - <AppButton.Icon - height={16} - width={16} - source="icon-extLink" - aria-label={messages.pgettext('accessibility', 'Opens externally')} - /> - </AriaDescription> - </AppButton.GreenButton> - </AriaDescribed> - </AriaDescriptionGroup>, - <AppButton.RedButton key="proceed" onClick={this.acknowledgeOutdateVersion}> - {messages.pgettext('support-view', 'Continue anyway')} - </AppButton.RedButton>, - <AppButton.BlueButton key="cancel" onClick={this.outdatedVersionCancel}> - {messages.gettext('Cancel')} - </AppButton.BlueButton>, - ]} - close={this.props.onClose} - /> - ); - } +function FaqButton() { + const isOffline = useSelector((state) => state.connection.isBlocked); + const { openUrl } = useAppContext(); - private outdatedVersionCancel = () => { - this.acknowledgeOutdateVersion(); - this.props.onClose(); - }; + const openFaq = useCallback(() => openUrl(links.faq), [openUrl]); - private renderForm() { - return ( - <StyledContent> - <StyledForm> - <StyledFormEmailRow> - <StyledEmailInput - placeholder={messages.pgettext('support-view', 'Your email (optional)')} - defaultValue={this.state.email} - onChange={this.onChangeEmail} + return ( + <AriaDescriptionGroup> + <AriaDescribed> + <Cell.CellButton disabled={isOffline} onClick={openFaq}> + <Cell.Label> + { + // TRANSLATORS: Link to the webpage + messages.pgettext('support-view', 'FAQs & Guides') + } + </Cell.Label> + <AriaDescription> + <Cell.Icon + height={16} + width={16} + source="icon-extLink" + aria-label={messages.pgettext('accessibility', 'Opens externally')} /> - </StyledFormEmailRow> - <StyledFormMessageRow> - <StyledMessageInput - placeholder={messages.pgettext( - 'support-view', - 'Please describe your problem in English or Swedish.', - )} - defaultValue={this.state.message} - onChange={this.onChangeDescription} - /> - </StyledFormMessageRow> - </StyledForm> - <StyledFooter> - <AriaDescriptionGroup> - <AriaDescribed> - <StyledBlueButton onClick={this.onViewLog} disabled={this.state.disableActions}> - <AppButton.Label> - {messages.pgettext('support-view', 'View app logs')} - </AppButton.Label> - <AriaDescription> - <AppButton.Icon - source="icon-extLink" - height={16} - width={16} - aria-label={messages.pgettext('accessibility', 'Opens externally')} - /> - </AriaDescription> - </StyledBlueButton> - </AriaDescribed> - </AriaDescriptionGroup> - <AppButton.GreenButton - disabled={!this.validate() || this.state.disableActions} - onClick={this.onSend}> - {messages.pgettext('support-view', 'Send')} - </AppButton.GreenButton> - </StyledFooter> - </StyledContent> - ); - } - - private renderSending() { - return ( - <StyledContent> - <StyledForm> - <StyledStatusIcon> - <ImageView source="icon-spinner" height={60} width={60} /> - </StyledStatusIcon> - <StyledSendStatus>{messages.pgettext('support-view', 'Sending...')}</StyledSendStatus> - </StyledForm> - </StyledContent> - ); - } - - private renderSent() { - const reachBackMessage: React.ReactNodeArray = - // TRANSLATORS: The message displayed to the user after submitting the problem report, given that the user left his or her email for us to reach back. - // TRANSLATORS: Available placeholders: - // TRANSLATORS: %(email)s - messages - .pgettext('support-view', 'If needed we will contact you at %(email)s') - .split('%(email)s', 2); - reachBackMessage.splice(1, 0, <StyledEmail key="email">{this.state.email}</StyledEmail>); - - return ( - <StyledContent> - <StyledForm> - <StyledStatusIcon> - <ImageView source="icon-success" height={60} width={60} /> - </StyledStatusIcon> - <StyledSendStatus>{messages.pgettext('support-view', 'Sent')}</StyledSendStatus> - - <StyledSentMessage> - <StyledThanks>{messages.pgettext('support-view', 'Thanks!')} </StyledThanks> - {messages.pgettext('support-view', 'We will look into this.')} - </StyledSentMessage> - {this.state.email.trim().length > 0 ? ( - <StyledSentMessage>{reachBackMessage}</StyledSentMessage> - ) : null} - </StyledForm> - </StyledContent> - ); - } - - private renderFailed() { - return ( - <StyledContent> - <StyledForm> - <StyledStatusIcon> - <ImageView source="icon-fail" height={60} width={60} /> - </StyledStatusIcon> - <StyledSendStatus>{messages.pgettext('support-view', 'Failed to send')}</StyledSendStatus> - <StyledSentMessage> - {messages.pgettext( - 'support-view', - 'If you exit the form and try again later, the information you already entered will still be here.', - )} - </StyledSentMessage> - </StyledForm> - <StyledFooter> - <StyledBlueButton onClick={this.handleEditMessage}> - {messages.pgettext('support-view', 'Edit message')} - </StyledBlueButton> - <AppButton.GreenButton onClick={this.onSend}> - {messages.pgettext('support-view', 'Try again')} - </AppButton.GreenButton> - </StyledFooter> - </StyledContent> - ); - } + </AriaDescription> + </Cell.CellButton> + </AriaDescribed> + </AriaDescriptionGroup> + ); +} - private handleEditMessage = () => { - this.setState({ sendState: SendState.initial }); - }; +function BetaProgramSetting() { + const isBeta = useSelector((state) => state.version.isBeta); + const showBetaReleases = useSelector((state) => state.settings.showBetaReleases); + const { setShowBetaReleases } = useAppContext(); - private performWithActionsDisabled(work: () => Promise<void>) { - this.setState({ disableActions: true }, async () => { - try { - await work(); - } catch { - // TODO: handle error - } - this.setState({ disableActions: false }); - }); - } + return ( + <AriaInputGroup> + <Cell.Container disabled={isBeta}> + <AriaLabel> + <Cell.InputLabel>{messages.pgettext('support-view', 'Beta program')}</Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.Switch isOn={showBetaReleases} onChange={setShowBetaReleases} /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {isBeta + ? messages.pgettext( + 'support-view', + 'This option is unavailable while using a beta version.', + ) + : messages.pgettext( + 'support-view', + 'Enable to get notified when new beta versions of the app are released.', + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + ); } diff --git a/gui/src/renderer/components/TooManyDevices.tsx b/gui/src/renderer/components/TooManyDevices.tsx index 5df8da0df3..aeed50afd2 100644 --- a/gui/src/renderer/components/TooManyDevices.tsx +++ b/gui/src/renderer/components/TooManyDevices.tsx @@ -67,19 +67,10 @@ const StyledLabel = styled.span({ margin: '0 22px 18px', }); -const StyledDeviceList = styled(Cell.CellButtonGroup)({ - marginBottom: 0, - flex: '0 0', -}); - const StyledSpacer = styled.div({ flex: '1', }); -const StyledCellContainer = styled(Cell.Container)({ - marginBottom: '1px', -}); - const StyledDeviceName = styled(Cell.Label)({ textTransform: 'capitalize', }); @@ -175,11 +166,9 @@ interface IDeviceListProps { function DeviceList(props: IDeviceListProps) { return ( <StyledSpacer> - <StyledDeviceList> - <List items={props.devices} getKey={getDeviceKey}> - {(device) => <Device device={device} onRemove={props.onRemoveDevice} />} - </List> - </StyledDeviceList> + <List items={props.devices} getKey={getDeviceKey}> + {(device) => <Device device={device} onRemove={props.onRemoveDevice} />} + </List> </StyledSpacer> ); } @@ -205,7 +194,7 @@ function Device(props: IDeviceProps) { return ( <> - <StyledCellContainer> + <Cell.Container> <StyledDeviceName aria-hidden>{props.device.name}</StyledDeviceName> <StyledRemoveDeviceButton onClick={showConfirmation} @@ -223,7 +212,7 @@ function Device(props: IDeviceProps) { tintHoverColor={colors.white60} /> </StyledRemoveDeviceButton> - </StyledCellContainer> + </Cell.Container> <ModalAlert isOpen={confirmationVisible} type={ModalAlertType.warning} diff --git a/gui/src/renderer/components/VpnSettings.tsx b/gui/src/renderer/components/VpnSettings.tsx new file mode 100644 index 0000000000..03274c0b2a --- /dev/null +++ b/gui/src/renderer/components/VpnSettings.tsx @@ -0,0 +1,722 @@ +import { useCallback, useMemo } from 'react'; +import { sprintf } from 'sprintf-js'; +import styled from 'styled-components'; + +import { colors, strings } from '../../config.json'; +import { IDnsOptions, TunnelProtocol } from '../../shared/daemon-rpc-types'; +import { messages } from '../../shared/gettext'; +import log from '../../shared/logging'; +import RelaySettingsBuilder from '../../shared/relay-settings-builder'; +import { useAppContext } from '../context'; +import { useHistory } from '../lib/history'; +import { RoutePath } from '../lib/routes'; +import { useBoolean } from '../lib/utilityHooks'; +import { formatMarkdown } from '../markdown-formatter'; +import { RelaySettingsRedux } from '../redux/settings/reducers'; +import { useSelector } from '../redux/store'; +import * as AppButton from './AppButton'; +import { AriaDescription, AriaDetails, AriaInput, AriaInputGroup, AriaLabel } from './AriaGroup'; +import * as Cell from './cell'; +import Selector, { ISelectorItem } from './cell/Selector'; +import CustomDnsSettings from './CustomDnsSettings'; +import InfoButton, { InfoIcon } from './InfoButton'; +import { BackAction } from './KeyboardNavigation'; +import { Container, Layout } from './Layout'; +import { ModalAlert, ModalAlertType, ModalMessage } from './Modal'; +import { + NavigationBar, + NavigationContainer, + NavigationItems, + NavigationScrollbars, + TitleBarItem, +} from './NavigationBar'; +import SettingsHeader, { HeaderTitle } from './SettingsHeader'; + +const StyledContainer = styled(Container)({ + backgroundColor: colors.darkBlue, +}); + +const StyledContent = styled.div({ + display: 'flex', + flexDirection: 'column', + flex: 1, + marginBottom: '2px', +}); + +const StyledInfoIcon = styled(InfoIcon)({ + marginRight: '16px', +}); + +const StyledSelectorContainer = styled.div({ + flex: 0, +}); + +export default function VpnSettings() { + const { pop } = useHistory(); + + return ( + <BackAction action={pop}> + <Layout> + <StyledContainer> + <NavigationContainer> + <NavigationBar> + <NavigationItems> + <TitleBarItem> + { + // TRANSLATORS: Title label in navigation bar + messages.pgettext('vpn-settings-view', 'VPN settings') + } + </TitleBarItem> + </NavigationItems> + </NavigationBar> + + <NavigationScrollbars> + <SettingsHeader> + <HeaderTitle>{messages.pgettext('vpn-settings-view', 'VPN settings')}</HeaderTitle> + </SettingsHeader> + + <StyledContent> + <Cell.Group> + <AutoStart /> + <AutoConnect /> + </Cell.Group> + + <Cell.Group> + <AllowLan /> + </Cell.Group> + + <Cell.Group> + <BlockAds /> + <BlockTrackers /> + <BlockMalware /> + <BlockGambling /> + <BlockAdultContent /> + </Cell.Group> + + <Cell.Group> + <EnableIpv6 /> + </Cell.Group> + + <Cell.Group> + <KillSwitchInfo /> + <LockdownMode /> + </Cell.Group> + + <Cell.Group> + <TunnelProtocolSetting /> + </Cell.Group> + + <Cell.Group> + <WireguardSettingsButton /> + <OpenVpnSettingsButton /> + </Cell.Group> + + <Cell.Group> + <CustomDnsSettings /> + </Cell.Group> + </StyledContent> + </NavigationScrollbars> + </NavigationContainer> + </StyledContainer> + </Layout> + </BackAction> + ); +} + +function AutoStart() { + const autoStart = useSelector((state) => state.settings.autoStart); + const { setAutoStart: setAutoStartImpl } = useAppContext(); + + const setAutoStart = useCallback( + async (autoStart: boolean) => { + try { + await setAutoStartImpl(autoStart); + } catch (e) { + const error = e as Error; + log.error(`Cannot set auto-start: ${error.message}`); + } + }, + [setAutoStartImpl], + ); + + return ( + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('vpn-settings-view', 'Launch app on start-up')} + </Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.Switch isOn={autoStart} onChange={setAutoStart} /> + </AriaInput> + </Cell.Container> + </AriaInputGroup> + ); +} + +function AutoConnect() { + const autoConnect = useSelector((state) => state.settings.guiSettings.autoConnect); + const { setAutoConnect } = useAppContext(); + + return ( + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('vpn-settings-view', 'Auto-connect')} + </Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.Switch isOn={autoConnect} onChange={setAutoConnect} /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {messages.pgettext( + 'vpn-settings-view', + 'Automatically connect to a server when the app launches.', + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + ); +} + +function AllowLan() { + const allowLan = useSelector((state) => state.settings.allowLan); + const { setAllowLan } = useAppContext(); + + return ( + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('vpn-settings-view', 'Local network sharing')} + </Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.Switch isOn={allowLan} onChange={setAllowLan} /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {messages.pgettext( + 'vpn-settings-view', + 'Allows access to other devices on the same network for sharing, printing etc.', + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + ); +} + +function useDns(setting: keyof IDnsOptions['defaultOptions']) { + const dns = useSelector((state) => state.settings.dns); + const { setDnsOptions } = useAppContext(); + + const updateBlockSetting = useCallback( + (enabled: boolean) => + setDnsOptions({ + ...dns, + defaultOptions: { + ...dns.defaultOptions, + [setting]: enabled, + }, + }), + [dns, setDnsOptions], + ); + + return [dns, updateBlockSetting] as const; +} + +function BlockAds() { + const [dns, setBlockAds] = useDns('blockAds'); + + return ( + <AriaInputGroup> + <Cell.Container disabled={dns.state === 'custom'}> + <AriaLabel> + <Cell.InputLabel>{messages.pgettext('vpn-settings-view', 'Block ads')}</Cell.InputLabel> + </AriaLabel> + <AriaDetails> + <InfoButton> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'When enabled, this feature stops the device from contacting certain known ad domains.', + )} + </ModalMessage> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'Warning: This might cause issues on certain websites, services, and programs.', + )} + </ModalMessage> + </InfoButton> + </AriaDetails> + <AriaInput> + <Cell.Switch + isOn={dns.state === 'default' && dns.defaultOptions.blockAds} + onChange={setBlockAds} + /> + </AriaInput> + </Cell.Container> + </AriaInputGroup> + ); +} + +function BlockTrackers() { + const [dns, setBlockTrackers] = useDns('blockTrackers'); + + return ( + <AriaInputGroup> + <Cell.Container disabled={dns.state === 'custom'}> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('vpn-settings-view', 'Block trackers')} + </Cell.InputLabel> + </AriaLabel> + <AriaDetails> + <InfoButton> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'When enabled, this feature stops the device from contacting certain domains known to track users.', + )} + </ModalMessage> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'Warning: This might cause issues on certain websites, services, and programs.', + )} + </ModalMessage> + </InfoButton> + </AriaDetails> + <AriaInput> + <Cell.Switch + isOn={dns.state === 'default' && dns.defaultOptions.blockTrackers} + onChange={setBlockTrackers} + /> + </AriaInput> + </Cell.Container> + </AriaInputGroup> + ); +} + +function BlockMalware() { + const [dns, setBlockMalware] = useDns('blockMalware'); + + return ( + <AriaInputGroup> + <Cell.Container disabled={dns.state === 'custom'}> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('vpn-settings-view', 'Block malware')} + </Cell.InputLabel> + </AriaLabel> + <AriaDetails> + <InfoButton> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'When enabled, this feature stops the device from contacting certain domains known to host malware.', + )} + </ModalMessage> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'Warning: This is not an anti-virus and should not be treated as such, this is just an extra layer of protection.', + )} + </ModalMessage> + </InfoButton> + </AriaDetails> + <AriaInput> + <Cell.Switch + isOn={dns.state === 'default' && dns.defaultOptions.blockMalware} + onChange={setBlockMalware} + /> + </AriaInput> + </Cell.Container> + </AriaInputGroup> + ); +} + +function BlockGambling() { + const [dns, setBlockGambling] = useDns('blockGambling'); + + return ( + <AriaInputGroup> + <Cell.Container disabled={dns.state === 'custom'}> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('vpn-settings-view', 'Block gambling')} + </Cell.InputLabel> + </AriaLabel> + <AriaDetails> + <InfoButton + message={messages.pgettext( + 'vpn-settings-view', + 'When enabled, this feature stops the device from contacting certain websites and services known to host gambling content.', + )} + /> + </AriaDetails> + <AriaInput> + <Cell.Switch + isOn={dns.state === 'default' && dns.defaultOptions.blockGambling} + onChange={setBlockGambling} + /> + </AriaInput> + </Cell.Container> + </AriaInputGroup> + ); +} + +function BlockAdultContent() { + const [dns, setBlockAdultContent] = useDns('blockAdultContent'); + + return ( + <AriaInputGroup> + <Cell.Container disabled={dns.state === 'custom'}> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('vpn-settings-view', 'Block adult content')} + </Cell.InputLabel> + </AriaLabel> + <AriaDetails> + <InfoButton + message={messages.pgettext( + 'vpn-settings-view', + 'When enabled, this feature stops the device from contacting certain websites and services known to host adult content.', + )} + /> + </AriaDetails> + <AriaInput> + <Cell.Switch + isOn={dns.state === 'default' && dns.defaultOptions.blockAdultContent} + onChange={setBlockAdultContent} + /> + </AriaInput> + </Cell.Container> + {dns.state === 'custom' && <CustomDnsEnabledFooter />} + </AriaInputGroup> + ); +} + +function CustomDnsEnabledFooter() { + const customDnsFeatureName = messages.pgettext('vpn-settings-view', 'Use custom DNS server'); + + // TRANSLATORS: This is displayed when the custom DNS setting is turned on which makes the block + // TRANSLATORS: ads/trackers settings disabled. The text enclosed in "**" will appear bold. + // TRANSLATORS: Advanced settings refer to the name of the page with the title "Advanced". + // TRANSLATORS: Available placeholders: + // TRANSLATORS: %(customDnsFeatureName)s - The name displayed next to the custom DNS toggle. + const blockingDisabledText = messages.pgettext( + 'vpn-settings-view', + 'Disable **%(customDnsFeatureName)s** (under Advanced settings) to activate these settings.', + ); + + return ( + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {formatMarkdown(sprintf(blockingDisabledText, { customDnsFeatureName }))} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + ); +} + +function EnableIpv6() { + const enableIpv6 = useSelector((state) => state.settings.enableIpv6); + const { setEnableIpv6: setEnableIpv6Impl } = useAppContext(); + + const setEnableIpv6 = useCallback( + async (enableIpv6: boolean) => { + try { + await setEnableIpv6Impl(enableIpv6); + } catch (e) { + const error = e as Error; + log.error('Failed to update enable IPv6', error.message); + } + }, + [setEnableIpv6Impl], + ); + + return ( + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel>{messages.pgettext('vpn-settings-view', 'Enable IPv6')}</Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.Switch isOn={enableIpv6} onChange={setEnableIpv6} /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {messages.pgettext( + 'vpn-settings-view', + 'Enable IPv6 communication through the tunnel.', + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + ); +} + +function KillSwitchInfo() { + const [killSwitchInfoVisible, showKillSwitchInfo, hideKillSwitchInfo] = useBoolean(false); + + return ( + <> + <Cell.CellButton onClick={showKillSwitchInfo}> + <AriaInputGroup> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('vpn-settings-view', 'Kill switch')} + </Cell.InputLabel> + </AriaLabel> + <StyledInfoIcon /> + <AriaInput> + <Cell.Switch isOn disabled /> + </AriaInput> + </AriaInputGroup> + </Cell.CellButton> + <ModalAlert + isOpen={killSwitchInfoVisible} + type={ModalAlertType.info} + buttons={[ + <AppButton.BlueButton key="back" onClick={hideKillSwitchInfo}> + {messages.gettext('Got it!')} + </AppButton.BlueButton>, + ]} + close={hideKillSwitchInfo}> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'This built-in feature prevents your traffic from leaking outside of the VPN tunnel if your network suddenly stops working or if the tunnel fails, it does this by blocking your traffic until your connection is reestablished.', + )} + </ModalMessage> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'The difference between the Kill Switch and Lockdown Mode is that the Kill Switch will prevent any leaks from happening during automatic tunnel reconnects, software crashes and similar accidents. With Lockdown Mode enabled, you must be connected to a Mullvad VPN server to be able to reach the internet. Manually disconnecting or quitting the app will block your connection.', + )} + </ModalMessage> + </ModalAlert> + </> + ); +} + +function LockdownMode() { + const blockWhenDisconnected = useSelector((state) => state.settings.blockWhenDisconnected); + const { setBlockWhenDisconnected: setBlockWhenDisconnectedImpl } = useAppContext(); + + const [confirmationDialogVisible, showConfirmationDialog, hideConfirmationDialog] = useBoolean( + false, + ); + + const setBlockWhenDisconnected = useCallback( + async (blockWhenDisconnected: boolean) => { + try { + await setBlockWhenDisconnectedImpl(blockWhenDisconnected); + } catch (e) { + const error = e as Error; + log.error('Failed to update block when disconnected', error.message); + } + }, + [setBlockWhenDisconnectedImpl], + ); + + const setLockDownMode = useCallback( + async (newValue: boolean) => { + if (newValue) { + showConfirmationDialog(); + } else { + await setBlockWhenDisconnected(false); + } + }, + [setBlockWhenDisconnected, showConfirmationDialog], + ); + + const confirmLockdownMode = useCallback(async () => { + hideConfirmationDialog(); + await setBlockWhenDisconnected(true); + }, [hideConfirmationDialog, setBlockWhenDisconnected]); + + return ( + <> + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('vpn-settings-view', 'Lockdown mode')} + </Cell.InputLabel> + </AriaLabel> + <AriaDetails> + <InfoButton> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'The difference between the Kill Switch and Lockdown Mode is that the Kill Switch will prevent any leaks from happening during automatic tunnel reconnects, software crashes and similar accidents.', + )} + </ModalMessage> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'With Lockdown Mode enabled, you must be connected to a Mullvad VPN server to be able to reach the internet. Manually disconnecting or quitting the app will block your connection.', + )} + </ModalMessage> + </InfoButton> + </AriaDetails> + <AriaInput> + <Cell.Switch isOn={blockWhenDisconnected} onChange={setLockDownMode} /> + </AriaInput> + </Cell.Container> + </AriaInputGroup> + <ModalAlert + isOpen={confirmationDialogVisible} + type={ModalAlertType.caution} + buttons={[ + <AppButton.RedButton key="confirm" onClick={confirmLockdownMode}> + {messages.gettext('Enable anyway')} + </AppButton.RedButton>, + <AppButton.BlueButton key="back" onClick={hideConfirmationDialog}> + {messages.gettext('Back')} + </AppButton.BlueButton>, + ]} + close={hideConfirmationDialog}> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet.', + )} + </ModalMessage> + <ModalMessage> + {messages.pgettext( + 'vpn-settings-view', + 'The app’s built-in kill switch is always on. This setting will additionally block the internet if clicking Disconnect or Quit.', + )} + </ModalMessage> + </ModalAlert> + </> + ); +} + +function TunnelProtocolSetting() { + const tunnelProtocol = useSelector((state) => + mapRelaySettingsToProtocol(state.settings.relaySettings), + ); + const { updateRelaySettings } = useAppContext(); + + const setTunnelProtocol = useCallback(async (tunnelProtocol: TunnelProtocol | undefined) => { + const relayUpdate = RelaySettingsBuilder.normal() + .tunnel.tunnelProtocol((config) => { + if (tunnelProtocol) { + config.tunnelProtocol.exact(tunnelProtocol); + } else { + config.tunnelProtocol.any(); + } + }) + .build(); + try { + await updateRelaySettings(relayUpdate); + } catch (e) { + const error = e as Error; + log.error('Failed to update tunnel protocol constraints', error.message); + } + }, []); + + const tunnelProtocolItems: Array<ISelectorItem<TunnelProtocol | undefined>> = useMemo( + () => [ + { + label: messages.gettext('Automatic'), + value: undefined, + }, + { + label: strings.wireguard, + value: 'wireguard', + }, + { + label: strings.openvpn, + value: 'openvpn', + }, + ], + [], + ); + + return ( + <AriaInputGroup> + <StyledSelectorContainer> + <Selector + title={messages.pgettext('vpn-settings-view', 'Tunnel protocol')} + values={tunnelProtocolItems} + value={tunnelProtocol} + onSelect={setTunnelProtocol} + /> + </StyledSelectorContainer> + </AriaInputGroup> + ); +} + +function mapRelaySettingsToProtocol(relaySettings: RelaySettingsRedux) { + if ('normal' in relaySettings) { + const { tunnelProtocol } = relaySettings.normal; + return tunnelProtocol === 'any' ? undefined : tunnelProtocol; + // since the GUI doesn't display custom settings, just display the default ones. + // If the user sets any settings, then those will be applied. + } else if ('customTunnelEndpoint' in relaySettings) { + return undefined; + } else { + throw new Error('Unknown type of relay settings.'); + } +} + +function WireguardSettingsButton() { + const history = useHistory(); + const tunnelProtocol = useSelector((state) => + mapRelaySettingsToProtocol(state.settings.relaySettings), + ); + + const navigate = useCallback(() => history.push(RoutePath.wireguardSettings), [history]); + + return ( + <Cell.CellNavigationButton onClick={navigate} disabled={tunnelProtocol === 'openvpn'}> + <Cell.Label> + {sprintf( + // TRANSLATORS: %(wireguard)s will be replaced with the string "WireGuard" + messages.pgettext('vpn-settings-view', '%(wireguard)s settings'), + { wireguard: strings.wireguard }, + )} + </Cell.Label> + </Cell.CellNavigationButton> + ); +} + +function OpenVpnSettingsButton() { + const history = useHistory(); + const tunnelProtocol = useSelector((state) => + mapRelaySettingsToProtocol(state.settings.relaySettings), + ); + + const navigate = useCallback(() => history.push(RoutePath.openVpnSettings), [history]); + + return ( + <Cell.CellNavigationButton onClick={navigate} disabled={tunnelProtocol === 'wireguard'}> + <Cell.Label> + {sprintf( + // TRANSLATORS: %(openvpn)s will be replaced with the string "OpenVPN" + messages.pgettext('vpn-settings-view', '%(openvpn)s settings'), + { openvpn: strings.openvpn }, + )} + </Cell.Label> + </Cell.CellNavigationButton> + ); +} diff --git a/gui/src/renderer/components/WireguardSettings.tsx b/gui/src/renderer/components/WireguardSettings.tsx index 20c3009574..d0a22c7e87 100644 --- a/gui/src/renderer/components/WireguardSettings.tsx +++ b/gui/src/renderer/components/WireguardSettings.tsx @@ -128,138 +128,146 @@ export default class WireguardSettings extends React.Component<IProps, IState> { </HeaderTitle> </SettingsHeader> - <AriaInputGroup> - <StyledSelectorContainer> - <StyledSelectorForFooter - // TRANSLATORS: The title for the WireGuard port selector. - title={messages.pgettext('wireguard-settings-view', 'Port')} - values={this.wireguardPortItems} - value={this.props.wireguard.port} - onSelect={this.props.setWireguardPort} - /> - </StyledSelectorContainer> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - { - // TRANSLATORS: The hint displayed below the WireGuard port selector. - messages.pgettext( - 'wireguard-settings-view', - 'The automatic setting will randomly choose from a wide range of ports.', - ) - } - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> - - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - { - // TRANSLATORS: The label next to the multihop settings toggle. - messages.pgettext('advanced-settings-view', 'Enable multihop') - } - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.Switch - ref={this.multihopRef} - isOn={this.props.wireguardMultihop} - onChange={this.setWireguardMultihop} + <Cell.Group> + <AriaInputGroup> + <StyledSelectorContainer> + <StyledSelectorForFooter + // TRANSLATORS: The title for the WireGuard port selector. + title={messages.pgettext('wireguard-settings-view', 'Port')} + values={this.wireguardPortItems} + value={this.props.wireguard.port} + onSelect={this.props.setWireguardPort} /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {sprintf( - // TRANSLATORS: Description for multihop settings toggle. - // TRANSLATORS: Available placeholders: - // TRANSLATORS: %(wireguard)s - Will be replaced with the string "WireGuard" - messages.pgettext( - 'advanced-settings-view', - 'Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace.', - ), - { wireguard: strings.wireguard }, - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> + </StyledSelectorContainer> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + { + // TRANSLATORS: The hint displayed below the WireGuard port selector. + messages.pgettext( + 'wireguard-settings-view', + 'The automatic setting will randomly choose from a wide range of ports.', + ) + } + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + </Cell.Group> - <AriaInputGroup> - <StyledSelectorContainer> - <StyledSelectorForFooter - // TRANSLATORS: The title for the WireGuard IP version selector. - title={messages.pgettext('wireguard-settings-view', 'IP version')} - values={this.wireguardIpVersionItems} - value={this.props.wireguard.ipVersion} - onSelect={this.props.setWireguardIpVersion} - /> - </StyledSelectorContainer> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {sprintf( - // TRANSLATORS: The hint displayed below the WireGuard IP version selector. - // TRANSLATORS: Available placeholders: - // TRANSLATORS: %(wireguard)s - Will be replaced with the string "WireGuard" - messages.pgettext( - 'wireguard-settings-view', - 'This allows access to %(wireguard)s for devices that only support IPv6.', - ), - { wireguard: strings.wireguard }, - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> + <Cell.Group> + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + { + // TRANSLATORS: The label next to the multihop settings toggle. + messages.pgettext('vpn-settings-view', 'Enable multihop') + } + </Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.Switch + ref={this.multihopRef} + isOn={this.props.wireguardMultihop} + onChange={this.setWireguardMultihop} + /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {sprintf( + // TRANSLATORS: Description for multihop settings toggle. + // TRANSLATORS: Available placeholders: + // TRANSLATORS: %(wireguard)s - Will be replaced with the string "WireGuard" + messages.pgettext( + 'vpn-settings-view', + 'Increases anonymity by routing your traffic into one %(wireguard)s server and out another, making it harder to trace.', + ), + { wireguard: strings.wireguard }, + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + </Cell.Group> - <AriaInputGroup> - <Cell.Container> - <AriaLabel> - <Cell.InputLabel> - {messages.pgettext('wireguard-settings-view', 'MTU')} - </Cell.InputLabel> - </AriaLabel> - <AriaInput> - <Cell.AutoSizingTextInput - value={this.props.wireguardMtu ? this.props.wireguardMtu.toString() : ''} - inputMode={'numeric'} - maxLength={4} - placeholder={messages.gettext('Default')} - onSubmitValue={this.onWireguardMtuSubmit} - validateValue={WireguardSettings.wireguarMtuIsValid} - submitOnBlur={true} - modifyValue={WireguardSettings.removeNonNumericCharacters} + <Cell.Group> + <AriaInputGroup> + <StyledSelectorContainer> + <StyledSelectorForFooter + // TRANSLATORS: The title for the WireGuard IP version selector. + title={messages.pgettext('wireguard-settings-view', 'IP version')} + values={this.wireguardIpVersionItems} + value={this.props.wireguard.ipVersion} + onSelect={this.props.setWireguardIpVersion} /> - </AriaInput> - </Cell.Container> - <Cell.Footer> - <AriaDescription> - <Cell.FooterText> - {sprintf( - // TRANSLATORS: The hint displayed below the WireGuard MTU input field. - // TRANSLATORS: Available placeholders: - // TRANSLATORS: %(wireguard)s - Will be replaced with the string "WireGuard" - // TRANSLATORS: %(max)d - the maximum possible wireguard mtu value - // TRANSLATORS: %(min)d - the minimum possible wireguard mtu value - messages.pgettext( - 'wireguard-settings-view', - 'Set %(wireguard)s MTU value. Valid range: %(min)d - %(max)d.', - ), - { - wireguard: strings.wireguard, - min: MIN_WIREGUARD_MTU_VALUE, - max: MAX_WIREGUARD_MTU_VALUE, - }, - )} - </Cell.FooterText> - </AriaDescription> - </Cell.Footer> - </AriaInputGroup> + </StyledSelectorContainer> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {sprintf( + // TRANSLATORS: The hint displayed below the WireGuard IP version selector. + // TRANSLATORS: Available placeholders: + // TRANSLATORS: %(wireguard)s - Will be replaced with the string "WireGuard" + messages.pgettext( + 'wireguard-settings-view', + 'This allows access to %(wireguard)s for devices that only support IPv6.', + ), + { wireguard: strings.wireguard }, + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + </Cell.Group> + + <Cell.Group> + <AriaInputGroup> + <Cell.Container> + <AriaLabel> + <Cell.InputLabel> + {messages.pgettext('wireguard-settings-view', 'MTU')} + </Cell.InputLabel> + </AriaLabel> + <AriaInput> + <Cell.AutoSizingTextInput + value={this.props.wireguardMtu ? this.props.wireguardMtu.toString() : ''} + inputMode={'numeric'} + maxLength={4} + placeholder={messages.gettext('Default')} + onSubmitValue={this.onWireguardMtuSubmit} + validateValue={WireguardSettings.wireguarMtuIsValid} + submitOnBlur={true} + modifyValue={WireguardSettings.removeNonNumericCharacters} + /> + </AriaInput> + </Cell.Container> + <Cell.Footer> + <AriaDescription> + <Cell.FooterText> + {sprintf( + // TRANSLATORS: The hint displayed below the WireGuard MTU input field. + // TRANSLATORS: Available placeholders: + // TRANSLATORS: %(wireguard)s - Will be replaced with the string "WireGuard" + // TRANSLATORS: %(max)d - the maximum possible wireguard mtu value + // TRANSLATORS: %(min)d - the minimum possible wireguard mtu value + messages.pgettext( + 'wireguard-settings-view', + 'Set %(wireguard)s MTU value. Valid range: %(min)d - %(max)d.', + ), + { + wireguard: strings.wireguard, + min: MIN_WIREGUARD_MTU_VALUE, + max: MAX_WIREGUARD_MTU_VALUE, + }, + )} + </Cell.FooterText> + </AriaDescription> + </Cell.Footer> + </AriaInputGroup> + </Cell.Group> </StyledNavigationScrollbars> </NavigationContainer> </SettingsContainer> diff --git a/gui/src/renderer/components/cell/CellButton.tsx b/gui/src/renderer/components/cell/CellButton.tsx index 5a24cfe901..e8d1c1c649 100644 --- a/gui/src/renderer/components/cell/CellButton.tsx +++ b/gui/src/renderer/components/cell/CellButton.tsx @@ -3,6 +3,7 @@ import styled from 'styled-components'; import { colors } from '../../../config.json'; import { CellDisabledContext } from './Container'; +import { Icon } from './Label'; import { CellSectionContext } from './Section'; interface IStyledCellButtonProps extends React.HTMLAttributes<HTMLButtonElement> { @@ -22,7 +23,6 @@ const StyledCellButton = styled.button({}, (props: IStyledCellButtonProps) => { display: 'flex', minHeight: '44px', padding: '0 16px 0 22px', - marginBottom: '1px', flex: 1, alignItems: 'center', alignContent: 'center', @@ -50,9 +50,13 @@ export const CellButton = styled( }), )({}); -export const CellButtonGroup = styled.div({ - display: 'flex', - flexDirection: 'column', - flex: 1, - marginBottom: '20px', -}); +export function CellNavigationButton(props: ICellButtonProps) { + const { children, ...otherProps } = props; + + return ( + <CellButton {...otherProps}> + {children} + <Icon height={12} width={7} source="icon-chevron" /> + </CellButton> + ); +} diff --git a/gui/src/renderer/components/cell/Footer.tsx b/gui/src/renderer/components/cell/Footer.tsx index 2cdf8aa8fa..466ef4acca 100644 --- a/gui/src/renderer/components/cell/Footer.tsx +++ b/gui/src/renderer/components/cell/Footer.tsx @@ -4,7 +4,7 @@ import { colors } from '../../../config.json'; import { tinyText } from '../common-styles'; export const Footer = styled.div({ - padding: '6px 22px 20px', + padding: '6px 22px 0px', }); export const FooterText = styled.span(tinyText, { diff --git a/gui/src/renderer/components/cell/Group.tsx b/gui/src/renderer/components/cell/Group.tsx new file mode 100644 index 0000000000..c167b2d525 --- /dev/null +++ b/gui/src/renderer/components/cell/Group.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import styled from 'styled-components'; + +interface IStyledGroupProps { + noMarginBottom?: boolean; +} + +const StyledGroup = styled.div({}, (props: IStyledGroupProps) => ({ + display: 'flex', + flexDirection: 'column', + flex: 1, + marginBottom: props.noMarginBottom ? '0px' : '20px', +})); + +const StyledCellWrapper = styled.div({ + display: 'flex', + flexDirection: 'column', + flex: 1, + marginBottom: '1px', +}); + +interface IGroupProps extends IStyledGroupProps { + children: React.ReactNode | React.ReactNode[]; +} + +export function Group(props: IGroupProps) { + const children = React.Children.toArray(props.children); + return ( + <StyledGroup noMarginBottom={props.noMarginBottom}> + {children.map((child, index) => + index === children.length - 1 ? ( + child + ) : ( + <StyledCellWrapper key={index}>{child}</StyledCellWrapper> + ), + )} + </StyledGroup> + ); +} diff --git a/gui/src/renderer/components/cell/Section.tsx b/gui/src/renderer/components/cell/Section.tsx index 41f57ee52c..1c1779248f 100644 --- a/gui/src/renderer/components/cell/Section.tsx +++ b/gui/src/renderer/components/cell/Section.tsx @@ -15,7 +15,6 @@ export const SectionTitle = styled.span(buttonText, { alignItems: 'center', backgroundColor: colors.blue, padding: '0 16px 0 22px', - marginBottom: '1px', }); export const CellSectionContext = React.createContext<boolean>(false); diff --git a/gui/src/renderer/components/cell/Selector.tsx b/gui/src/renderer/components/cell/Selector.tsx index 5ea1687a1e..ea2abb90ef 100644 --- a/gui/src/renderer/components/cell/Selector.tsx +++ b/gui/src/renderer/components/cell/Selector.tsx @@ -19,13 +19,8 @@ interface ISelectorProps<T> { onSelect: (value: T) => void; selectedCellRef?: React.Ref<HTMLButtonElement>; className?: string; - hasFooter?: boolean; } -const Section = styled(Cell.Section)((props: { hasFooter: boolean }) => ({ - marginBottom: props.hasFooter ? 0 : '20px', -})); - export default class Selector<T> extends React.Component<ISelectorProps<T>> { public render() { const items = this.props.values.map((item, i) => { @@ -52,13 +47,10 @@ export default class Selector<T> extends React.Component<ISelectorProps<T>> { return ( <AriaInput> - <Section - role="listbox" - className={this.props.className} - hasFooter={this.props.hasFooter ?? false}> + <Cell.Section role="listbox" className={this.props.className}> {title} {items} - </Section> + </Cell.Section> </AriaInput> ); } diff --git a/gui/src/renderer/components/cell/index.ts b/gui/src/renderer/components/cell/index.ts index a16cb93097..cc510e5b22 100644 --- a/gui/src/renderer/components/cell/index.ts +++ b/gui/src/renderer/components/cell/index.ts @@ -4,3 +4,4 @@ export * from './Footer'; export * from './Input'; export * from './Label'; export * from './Section'; +export * from './Group'; diff --git a/gui/src/renderer/containers/AdvancedSettingsPage.tsx b/gui/src/renderer/containers/AdvancedSettingsPage.tsx deleted file mode 100644 index 203067f1af..0000000000 --- a/gui/src/renderer/containers/AdvancedSettingsPage.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { connect } from 'react-redux'; - -import { TunnelProtocol } from '../../shared/daemon-rpc-types'; -import log from '../../shared/logging'; -import RelaySettingsBuilder from '../../shared/relay-settings-builder'; -import AdvancedSettings from '../components/AdvancedSettings'; -import withAppContext, { IAppContext } from '../context'; -import { IHistoryProps, withHistory } from '../lib/history'; -import { RoutePath } from '../lib/routes'; -import { RelaySettingsRedux } from '../redux/settings/reducers'; -import { IReduxState, ReduxDispatch } from '../redux/store'; - -const mapStateToProps = (state: IReduxState) => { - const tunnelProtocol = mapRelaySettingsToProtocol(state.settings.relaySettings); - - return { - enableIpv6: state.settings.enableIpv6, - blockWhenDisconnected: state.settings.blockWhenDisconnected, - tunnelProtocol, - }; -}; - -const mapRelaySettingsToProtocol = (relaySettings: RelaySettingsRedux) => { - if ('normal' in relaySettings) { - const { tunnelProtocol } = relaySettings.normal; - return tunnelProtocol === 'any' ? undefined : tunnelProtocol; - // since the GUI doesn't display custom settings, just display the default ones. - // If the user sets any settings, then those will be applied. - } else if ('customTunnelEndpoint' in relaySettings) { - return undefined; - } else { - throw new Error('Unknown type of relay settings.'); - } -}; - -const mapDispatchToProps = (_dispatch: ReduxDispatch, props: IHistoryProps & IAppContext) => { - return { - onClose: () => { - props.history.pop(); - }, - - setTunnelProtocol: async (tunnelProtocol: TunnelProtocol | undefined) => { - const relayUpdate = RelaySettingsBuilder.normal() - .tunnel.tunnelProtocol((config) => { - if (tunnelProtocol) { - config.tunnelProtocol.exact(tunnelProtocol); - } else { - config.tunnelProtocol.any(); - } - }) - .build(); - try { - await props.app.updateRelaySettings(relayUpdate); - } catch (e) { - const error = e as Error; - log.error('Failed to update tunnel protocol constraints', error.message); - } - }, - - setEnableIpv6: async (enableIpv6: boolean) => { - try { - await props.app.setEnableIpv6(enableIpv6); - } catch (e) { - const error = e as Error; - log.error('Failed to update enable IPv6', error.message); - } - }, - - setBlockWhenDisconnected: async (blockWhenDisconnected: boolean) => { - try { - await props.app.setBlockWhenDisconnected(blockWhenDisconnected); - } catch (e) { - const error = e as Error; - log.error('Failed to update block when disconnected', error.message); - } - }, - - onViewWireguardSettings: () => props.history.push(RoutePath.wireguardSettings), - onViewOpenVpnSettings: () => props.history.push(RoutePath.openVpnSettings), - onViewSplitTunneling: () => props.history.push(RoutePath.splitTunneling), - }; -}; - -export default withAppContext( - withHistory(connect(mapStateToProps, mapDispatchToProps)(AdvancedSettings)), -); diff --git a/gui/src/renderer/containers/PreferencesPage.tsx b/gui/src/renderer/containers/PreferencesPage.tsx deleted file mode 100644 index be2dce9373..0000000000 --- a/gui/src/renderer/containers/PreferencesPage.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { connect } from 'react-redux'; - -import { IDnsOptions } from '../../shared/daemon-rpc-types'; -import log from '../../shared/logging'; -import Preferences from '../components/Preferences'; -import withAppContext, { IAppContext } from '../context'; -import { IHistoryProps, withHistory } from '../lib/history'; -import { IReduxState, ReduxDispatch } from '../redux/store'; - -const mapStateToProps = (state: IReduxState) => ({ - autoStart: state.settings.autoStart, - allowLan: state.settings.allowLan, - showBetaReleases: state.settings.showBetaReleases, - isBeta: state.version.isBeta, - autoConnect: state.settings.guiSettings.autoConnect, - enableSystemNotifications: state.settings.guiSettings.enableSystemNotifications, - monochromaticIcon: state.settings.guiSettings.monochromaticIcon, - startMinimized: state.settings.guiSettings.startMinimized, - unpinnedWindow: state.settings.guiSettings.unpinnedWindow, - dns: state.settings.dns, -}); - -const mapDispatchToProps = (_dispatch: ReduxDispatch, props: IHistoryProps & IAppContext) => { - return { - onClose: () => { - props.history.pop(); - }, - setEnableSystemNotifications: (flag: boolean) => { - props.app.setEnableSystemNotifications(flag); - }, - setAutoStart: async (autoStart: boolean) => { - try { - await props.app.setAutoStart(autoStart); - } catch (e) { - const error = e as Error; - log.error(`Cannot set auto-start: ${error.message}`); - } - }, - setAutoConnect: (autoConnect: boolean) => { - props.app.setAutoConnect(autoConnect); - }, - setAllowLan: (allowLan: boolean) => { - void props.app.setAllowLan(allowLan); - }, - setShowBetaReleases: (showBetaReleases: boolean) => { - void props.app.setShowBetaReleases(showBetaReleases); - }, - setStartMinimized: (startMinimized: boolean) => { - props.app.setStartMinimized(startMinimized); - }, - setMonochromaticIcon: (monochromaticIcon: boolean) => { - props.app.setMonochromaticIcon(monochromaticIcon); - }, - setUnpinnedWindow: (unpinnedWindow: boolean) => { - props.app.setUnpinnedWindow(unpinnedWindow); - }, - setDnsOptions: (dns: IDnsOptions) => { - return props.app.setDnsOptions(dns); - }, - }; -}; - -export default withAppContext( - withHistory(connect(mapStateToProps, mapDispatchToProps)(Preferences)), -); diff --git a/gui/src/renderer/containers/SupportPage.tsx b/gui/src/renderer/containers/ProblemReportPage.tsx index 37e6b86031..1c405134c8 100644 --- a/gui/src/renderer/containers/SupportPage.tsx +++ b/gui/src/renderer/containers/ProblemReportPage.tsx @@ -1,7 +1,7 @@ import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import Support from '../components/Support'; +import ProblemReport from '../components/ProblemReport'; import withAppContext, { IAppContext } from '../context'; import { IHistoryProps, withHistory } from '../lib/history'; import { IReduxState, ReduxDispatch } from '../redux/store'; @@ -34,4 +34,6 @@ const mapDispatchToProps = (dispatch: ReduxDispatch, props: IAppContext & IHisto }; }; -export default withAppContext(withHistory(connect(mapStateToProps, mapDispatchToProps)(Support))); +export default withAppContext( + withHistory(connect(mapStateToProps, mapDispatchToProps)(ProblemReport)), +); diff --git a/gui/src/renderer/containers/SettingsPage.tsx b/gui/src/renderer/containers/SettingsPage.tsx deleted file mode 100644 index 58689e31d9..0000000000 --- a/gui/src/renderer/containers/SettingsPage.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { connect } from 'react-redux'; - -import Settings from '../components/Settings'; -import withAppContext, { IAppContext } from '../context'; -import { IHistoryProps, withHistory } from '../lib/history'; -import { RoutePath } from '../lib/routes'; -import { IReduxState, ReduxDispatch } from '../redux/store'; - -const mapStateToProps = (state: IReduxState, props: IAppContext) => ({ - preferredLocaleDisplayName: props.app.getPreferredLocaleDisplayName( - state.settings.guiSettings.preferredLocale, - ), - loginState: state.account.status, - connectedToDaemon: state.userInterface.connectedToDaemon, - accountExpiry: state.account.expiry, - appVersion: state.version.current, - consistentVersion: state.version.consistent, - upToDateVersion: state.version.suggestedUpgrade ? false : true, - suggestedIsBeta: state.version.suggestedIsBeta ?? false, - isOffline: state.connection.isBlocked, -}); -const mapDispatchToProps = (_dispatch: ReduxDispatch, props: IHistoryProps & IAppContext) => { - return { - onQuit: () => props.app.quit(), - onClose: () => props.history.dismiss(), - onViewSelectLanguage: () => props.history.push(RoutePath.selectLanguage), - onViewAccount: () => props.history.push(RoutePath.accountSettings), - onViewSupport: () => props.history.push(RoutePath.support), - onViewPreferences: () => props.history.push(RoutePath.preferences), - onViewAdvancedSettings: () => props.history.push(RoutePath.advancedSettings), - onExternalLink: (url: string) => props.app.openUrl(url), - updateAccountData: () => props.app.updateAccountData(), - }; -}; - -export default withAppContext(withHistory(connect(mapStateToProps, mapDispatchToProps)(Settings))); diff --git a/gui/src/renderer/lib/routes.ts b/gui/src/renderer/lib/routes.ts index 641b48781d..9c8eb4c493 100644 --- a/gui/src/renderer/lib/routes.ts +++ b/gui/src/renderer/lib/routes.ts @@ -15,12 +15,13 @@ export enum RoutePath { settings = '/settings', selectLanguage = '/settings/language', accountSettings = '/settings/account', - preferences = '/settings/preferences', - advancedSettings = '/settings/advanced', + interfaceSettings = '/settings/interface', + vpnSettings = '/settings/vpn', wireguardSettings = '/settings/advanced/wireguard', openVpnSettings = '/settings/advanced/openvpn', - splitTunneling = '/settings/advanced/split-tunneling', + splitTunneling = '/settings/split-tunneling', support = '/settings/support', + problemReport = '/settings/support/problem-report', selectLocation = '/select-location', filter = '/select-location/filter', } diff --git a/gui/src/renderer/redux/support/actions.ts b/gui/src/renderer/redux/support/actions.ts index 23cb57daf3..de26a17908 100644 --- a/gui/src/renderer/redux/support/actions.ts +++ b/gui/src/renderer/redux/support/actions.ts @@ -1,11 +1,11 @@ -export interface ISupportReportForm { +export interface IProblemReportForm { email: string; message: string; } export interface IKeepReportFormAction { type: 'SAVE_REPORT_FORM'; - form: ISupportReportForm; + form: IProblemReportForm; } export interface IClearReportFormAction { @@ -14,7 +14,7 @@ export interface IClearReportFormAction { export type SupportAction = IKeepReportFormAction | IClearReportFormAction; -function saveReportForm(form: ISupportReportForm): IKeepReportFormAction { +function saveReportForm(form: IProblemReportForm): IKeepReportFormAction { return { type: 'SAVE_REPORT_FORM', form, diff --git a/gui/src/shared/localization-contexts.ts b/gui/src/shared/localization-contexts.ts index e03c679b61..980e79917a 100644 --- a/gui/src/shared/localization-contexts.ts +++ b/gui/src/shared/localization-contexts.ts @@ -22,10 +22,8 @@ export type LocalizationContexts = | 'account-view' | 'redeem-voucher-view' | 'redeem-voucher-alert' - | 'preferences-view' - | 'preferences-nav' - | 'advanced-settings-view' - | 'advanced-settings-nav' + | 'interface-settings-view' + | 'vpn-settings-view' | 'wireguard-settings-view' | 'wireguard-settings-nav' | 'openvpn-settings-view' diff --git a/gui/test/history.spec.ts b/gui/test/history.spec.ts index be0bb6a6a0..74f9ea2974 100644 --- a/gui/test/history.spec.ts +++ b/gui/test/history.spec.ts @@ -6,8 +6,8 @@ import { RoutePath } from '../src/renderer/lib/routes'; const BASE_PATH = RoutePath.launch; const FIRST_PATH = RoutePath.main; const SECOND_PATH = RoutePath.settings; -const THIRD_PATH = RoutePath.advancedSettings; -const FOURTH_PATH = RoutePath.preferences; +const THIRD_PATH = RoutePath.vpnSettings; +const FOURTH_PATH = RoutePath.interfaceSettings; const FIFTH_PATH = RoutePath.splitTunneling; describe('History', () => { |
