diff --git a/lib/api/impl/privacy_idea_container_api.dart b/lib/api/impl/privacy_idea_container_api.dart index 8cd99dd21..3a7ab68b7 100644 --- a/lib/api/impl/privacy_idea_container_api.dart +++ b/lib/api/impl/privacy_idea_container_api.dart @@ -40,7 +40,6 @@ import '../../model/riverpod_states/token_state.dart'; import '../../model/token_container.dart'; import '../../model/token_template.dart'; import '../../model/tokens/token.dart'; -import '../../utils/globals.dart'; import '../../utils/identifiers.dart'; import '../../utils/logger.dart'; import '../../widgets/dialog_widgets/enter_passphrase_dialog.dart'; @@ -131,7 +130,7 @@ class PiContainerApi implements TokenContainerApi { throw LocalizedException(localizedMessage: (l) => l.errorMissingPrivateKey, unlocalizedMessage: AppLocalizationsEn().errorMissingPrivateKey); } - final passphrase = container.passphraseQuestion?.isNotEmpty == true ? await EnterPassphraseDialog.show(await globalContext) : null; + final passphrase = container.passphraseQuestion?.isNotEmpty == true ? await EnterPassphraseDialog.show(container.passphraseQuestion!) : null; final message = '${container.nonce}' '|${container.timestamp.toIso8601String().replaceFirst('Z', '+00:00')}' '|${container.serial}' diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb index 7bdf0b5b6..adb7d29df 100644 --- a/lib/l10n/app_cs.arb +++ b/lib/l10n/app_cs.arb @@ -1092,7 +1092,13 @@ "description": "Title of the screen where the user can select the token import type." }, "@selectTokensToExport": { - "description": "Title of the screen where the user can select the tokens to export." + "description": "Title of the screen where the user can select the tokens to export.", + "placeholders": { + "count": { + "example": "5", + "type": "int" + } + } }, "@selectTokensToExportHelpContent1": { "description": "Tells the user why some tokens are not exportable." @@ -1351,10 +1357,15 @@ "confirmation": "Potvrzení", "connectionFailed": "Připojení se nezdařilo.", "container": "Kontejner", + "containerAddTitle": "Přidat kontejner", "containerAlreadyExists": "Kontejner již existuje", "containerDetails": "Podrobnosti o kontejneru", + "containerRolloutSendDeviceInfoContent": "Chcete vydavateli kontejneru sdělit, jaké zařízení používáte? To může být později užitečné, pokud budete mít problémy s druhým faktorem.", + "containerRolloutSendDeviceInfoTitle": "Odeslání informací o zařízení", "containerSerial": "Sériový kontejner", "containerSyncUrl": "Url pro synchronizaci kontejnerů", + "containerTransferAborted": "Přenos kontejneru byl přerušen.", + "containerTransferDeleteTokens": "Odebrat z tohoto zařízení", "continueButton": "Pokračovat", "copyOTPToClipboard": "Zkopírovat OTP do schránky", "couldNotConnectToServer": "Nepodařilo se připojit k serveru.", @@ -1375,9 +1386,12 @@ "decryptErrorDeleteConfirmationContent": "Jste si jisti, že chcete data aplikace odstranit?", "decryptErrorTitle": "Chyba dešifrování", "delete": "Smazat", + "deleteAll": "Odstranit vše", "deleteContainerDialogContent": "Pokud tento kontejner odstraníte, smartphone se odpojí od serveru privacyIDEA a tokeny v tomto kontejneru nebudou použitelné. Před odstraněním se ujistěte, že příslušné tokeny již nejsou potřeba!", "deleteContainerDialogTitle": "Odstranění kontejneru {serial}", + "deleteCorrespondingTokenDialogContent": "Chcete odstranit i odpovídající tokeny?", "deleteLockedToken": "Prosím, autentifikujte se pro smazání uzamčeného tokenu.", + "deleteOnlyContainer": "Pouze kontejner", "details": "Podrobnosti na", "deviceCredentialsRequiredTitle": "Není nastaven zámek zařízení", "deviceCredentialsSetupDescription": "Nastave zámek zařízení v nastavení zařízení", @@ -1391,6 +1405,8 @@ "encoding": "Kódování", "enterDetailsForToken": "Vložte podrobnosti tokenu", "enterLink": "Zadejte odkaz", + "enterPassphrase": "Zadejte přístupovou frázi", + "enterPassphraseHint": "Přístupová fráze", "enterPasswordToEncrypt": "Zadejte heslo pro šifrování žetonů. Toto heslo bude vyžadováno k importu žetonů.", "errorLogCleared": "Protokol chyb vymazán.", "errorLogEmpty": "Protokol chyb je prázdný.", @@ -1463,6 +1479,7 @@ "importNTokens": "{count, plural, zero{Neimportujte žádné tokeny} one{Importovat jeden token} other{Importovat {count} tokenů}}", "importNewToken": "{count, plural, zero{Nebyl nalezen žádný nový token.} one{Byl nalezen nový token, který lze importovat.} other{Bylo nalezeno {count} nových tokenů, které lze importovat.}}", "importTokens": "Importní token", + "importantInformationTitle": "Důležité informace", "importedVia": "Dovezeno prostřednictvím", "increaseCounter": "Zvýšit počítadla", "internalServerError": "Interní chyba serveru ({code})", @@ -1490,6 +1507,7 @@ "legacySigningErrorMessage": "Token byl vytvořen v zastaralé verzi aplikace, což může vést k problémům při jeho používání.\nPokud problém přetrvává, doporučujeme vytvořit nový push token!", "legacySigningErrorTitle": "Při použití staršího tokenu došlo k chybě: {tokenLabel}", "licensesAndVersion": "Licence a verze", + "linkHomeWidget": "Propojení domovského widgetu", "linkMustOtpAuth": "Odkaz musí začínat otpauth://", "linkedContainer": "Propojený kontejner", "lock": "Zamknout", @@ -1508,7 +1526,7 @@ "noNetworkConnection": "Žádné připojení k síti.", "noPublicKey": "Není k dispozici žádný veřejný klíč.", "noResultText1": "stiskněte tlačítko ", - "noResultText2": " a začněte s používáním.", + "noResultText2": "a začněte s používáním.", "noResultTitle": "Nejsou nainstalovány žádné tokeny.", "noTokenToExport": "Pro export není k dispozici žádný token", "noTokenToImport": "Nebyl nalezen žádný token pro import", @@ -1559,6 +1577,7 @@ "pushEndpointUrl": "URL koncového bodu push", "pushRequestParseError": "Požadavek na odeslání se nepodařilo zpracovat.", "pushToken": "Push notifikace", + "pushTokensViewTitle": "Push-Tokens", "qrFileDecodeError": "Z vybraného obrázku nebylo možné dekódovat QR kód, použijte prosím místo toho skener QR kódů.", "qrInFileNotFound": "Ve vybraném obrázku nebyl nalezen žádný QR kód.", "qrInFileNotFound2": "Můžete mi ukázat, kde se QR kód nachází.", @@ -1567,6 +1586,9 @@ "rename": "Přejmenovat", "renameToken": "Přejmenovat token", "renameTokenFolder": "Přejmenování složky", + "renewSecrets": "Obnovení tajemství", + "renewSecretsDialogText": "Můžete obnovit tajemství žetonů. To je užitečné, pokud máte podezření, že tajemství byla ohrožena. Protože tokeny kontejnerů jsou přenášeny v zašifrované podobě a tajemství jsou bezpečně uložena v zařízení. Jediným známým případem, kdy by k tomu mohlo dojít, by bylo, kdyby byl token rozvinut před kontejnerem prostřednictvím QR kódu.", + "renewSecretsDialogTitle": "Obnovení tajemství žetonů", "replaceButton": "Vyměňte", "requestInfo": "Odesláno {issuer} pro váš účet: \"{account}\"", "requestPushChallengesPeriodically": "Periodicky získávat výzvy ze serveru. Povolte pokud nefunguje příjem push notifikací.", @@ -1610,6 +1632,7 @@ "showPrivacyPolicy": "Zobrazit zásady ochrany osobních údajů", "signInTitle": "Vyžadováno přihlášení", "someTokensDoNotSupportPolling": "Některé tokeny jsou zastaralé a nepodporují polling", + "startTransfer": "Spustit přenos", "statusCode": "Stavový kód: {statusCode}", "sync": "Synchronizovat", "syncContainerFailed": "Synchronizace kontejneru se nezdařila", @@ -1633,6 +1656,13 @@ "tokensAreEncrypted": "Tokeny jsou zašifrované. Please enter the password to decrypt them.", "tokensDoNotSupportSynchronization": "Následující tokeny nepodporují synchronizaci a musí být znovu zaregistrovány:", "tokensSuccessfullyDecrypted": "Tokeny byly úspěšně dešifrovány a nyní je lze importovat.", + "transferContainerDialogContent1": "Kontejner můžete přenést do jiného zařízení. Kontejner se přenáší prostřednictvím QR kódu.", + "transferContainerDialogContent2": "Pro tento proces je vyžadováno aktivní připojení k internetu.", + "transferContainerDialogTitle": "Přenos kontejneru", + "transferContainerFailed": "Nepodařilo se zahájit přenos.", + "transferContainerScanQrCode": "Naskenujte QR kód na novém zařízení a přeneste kontejner.", + "transferContainerSuccessDialogContent1": "Kontejner byl úspěšně přenesen do jiného zařízení.", + "transferContainerSuccessDialogContent2": "Chcete z tohoto zařízení smazat kontejner a odpovídající tokeny?", "type": "Typ", "unexpectedError": "Nastala neočekávaná chyba.", "unknown": "Neznámý", @@ -1645,8 +1675,5 @@ "verboseLogging": "Zevrubné protokolování", "versionTitle": "Verze", "wrongPassword": "Nesprávné heslo", - "yes": "Ano", - "renewSecretsDialogTitle" : "Obnovení tajemství žetonů", - "renewSecretsDialogText" : "Můžete obnovit tajemství žetonů. To je užitečné, pokud máte podezření, že tajemství byla ohrožena. Protože tokeny kontejnerů jsou přenášeny v zašifrované podobě a tajemství jsou bezpečně uložena v zařízení. Jediným známým případem, kdy by k tomu mohlo dojít, by bylo, kdyby byl token rozvinut před kontejnerem prostřednictvím QR kódu.", - "renewSecrets" : "Obnovení tajemství" + "yes": "Ano" } \ No newline at end of file diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 0228e685d..358f79179 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1357,10 +1357,15 @@ "confirmation": "Confirmation", "connectionFailed": "Verbindung fehlgeschlagen.", "container": "Container", + "containerAddTitle": "Container hinzufügen", "containerAlreadyExists": "Container existiert bereits", "containerDetails": "Containerdetails", + "containerRolloutSendDeviceInfoContent": "Möchten Sie dem Herausgeber des Containers mitteilen, welches Gerät Sie verwenden? Dies kann später nützlich sein, wenn Sie Probleme mit Ihrem zweiten Faktor haben.", + "containerRolloutSendDeviceInfoTitle": "Geräteinformationen senden", "containerSerial": "Containerserial", "containerSyncUrl": "Container Sync Url", + "containerTransferAborted": "Die Übertragung des Containers wurde abgebrochen.", + "containerTransferDeleteTokens": "Von diesem Gerät entfernen", "continueButton": "Weiter", "copyOTPToClipboard": "OTP in die Zwischenablage kopieren", "couldNotConnectToServer": "Konnte keine Verbindung zum Server herstellen.", @@ -1381,9 +1386,12 @@ "decryptErrorDeleteConfirmationContent": "Sind Sie sicher, dass Sie die App Daten löschen möchten?", "decryptErrorTitle": "Entschlüsselung fehlgeschlagen", "delete": "Löschen", + "deleteAll": "Alle löschen", "deleteContainerDialogContent": "Wenn Sie diesen Container löschen, wird das Smartphone vom privacyIDEA Server getrennt und die Token dieses Containers werden unbrauchbar. Stellen Sie vor dem Löschen sicher, dass die entsprechenden Token nicht mehr benötigt werden!", "deleteContainerDialogTitle": "Container {serial} löschen", + "deleteCorrespondingTokenDialogContent": "Möchten Sie auch die zugehörigen Token löschen?", "deleteLockedToken": "Bitte authentifizieren Sie sich, um den gesperrten Token zu löschen.", + "deleteOnlyContainer": "Nur Container", "details": "Details", "deviceCredentialsRequiredTitle": "Gerätepasswort ist nicht eingerichtet", "deviceCredentialsSetupDescription": "Setzen Sie bitte ein Gerätepasswort in den Einstellungen", @@ -1397,6 +1405,8 @@ "encoding": "Kodierung", "enterDetailsForToken": "Neuen Token konfigurieren", "enterLink": "Link eingeben", + "enterPassphrase": "Passphrase eingeben", + "enterPassphraseHint": "Passphrase", "enterPasswordToEncrypt": "Geben Sie ein Passwort ein, um die Tokens zu verschlüsseln. Dieses Passwort wird benötigt, um die Tokens zu importieren.", "errorLogCleared": "Fehlerprotokoll gelöscht.", "errorLogEmpty": "Das Fehlerprotokoll ist leer.", @@ -1430,7 +1440,7 @@ "feedbackHint": "Es öffnet sich eine vorgefertigte E-Mail, die Sie an uns senden können. Falls gewünscht, werden Informationen über Ihr Gerät und die Version der Anwendung hinzugefügt. Vor dem Versenden können Sie die E-Mail überprüfen und bearbeiten.", "feedbackPrivacyPolicy1": "Mit dem Senden des Feedbacks stimmen Sie unserer ", "feedbackPrivacyPolicy2": "Datenschutzerklärung", - "feedbackPrivacyPolicy3": " zu.", + "feedbackPrivacyPolicy3": "zu.", "feedbackSentDescription": "Vielen Dank für Ihre Hilfe bei der Verbesserung dieser App!", "feedbackSentTitle": "Feedback gesendet", "feedbackTitle": "Ihr Feedback ist immer willkommen!", @@ -1497,6 +1507,7 @@ "legacySigningErrorMessage": "Der Token wurde in einer veralteten Version der App erstellt, was zu Problemen bei der Verwendung führen kann. Es wird empfohlen, einen neuen Push-Token zu erstellen, wenn das Problem weiterhin besteht!", "legacySigningErrorTitle": "Bei der Verwendung des veralteten Tokens ist ein Fehler aufgetreten: {tokenLabel}", "licensesAndVersion": "Lizenzen und Version", + "linkHomeWidget": "Home-Widget verlinken", "linkMustOtpAuth": "Der Link muss mit otpauth:// beginnen", "linkedContainer": "Verknüpfter Container", "lock": "Sperren", @@ -1515,7 +1526,7 @@ "noNetworkConnection": "Keine Netzwerkverbindung.", "noPublicKey": "Kein öffentlicher Schlüssel vorhanden", "noResultText1": "Tippe auf das ", - "noResultText2": " Icon um loszulegen!", + "noResultText2": "Icon um loszulegen!", "noResultTitle": "Keine Token vorhanden.", "noTokenToExport": "Kein Token zum Exportieren verfügbar", "noTokenToImport": "Kein Token zum Importieren gefunden", @@ -1566,6 +1577,7 @@ "pushEndpointUrl": "Push-Endpunkt URL", "pushRequestParseError": "Die Push-Anfrage konnte nicht verarbeitet werden.", "pushToken": "Push Token", + "pushTokensViewTitle": "Push-Tokens", "qrFileDecodeError": "Es war nicht möglich, den QR-Code aus dem ausgewählten Bild zu dekodieren. Bitte verwenden Sie stattdessen den QR-Code-Scanner.", "qrInFileNotFound": "Es wurde kein QR-Code in dem ausgewählten Bild gefunden.", "qrInFileNotFound2": "Sie können mir zeigen, wo sich der QR-Code befindet.", @@ -1574,6 +1586,9 @@ "rename": "Umbenennen", "renameToken": "Token umbenennen", "renameTokenFolder": "Ordner umbenennen", + "renewSecrets": "Secrets erneuern", + "renewSecretsDialogText": "Sie können die Geheimnisse der Token erneuern. Dies ist nützlich, wenn Sie vermuten, dass die Geheimnisse kompromittiert wurden. Da Container-Tokens verschlüsselt übertragen werden und die Geheimnisse sicher auf dem Gerät gespeichert sind. Der einzige bekannte Fall, in dem dies geschehen sein könnte, wäre, wenn der Token vor dem Container über einen QR-Code ausgerollt wurde.", + "renewSecretsDialogTitle": "Token Secrets erneuern", "replaceButton": "Ersetzen", "requestInfo": "Gesendet von {issuer} für Ihr Konto: \"{account}\"", "requestPushChallengesPeriodically": "Fordert regelmäßig Push-Anfragen vom Server an. Aktivieren Sie diese Funktion, wenn Nachrichten ansonsten nicht erhalten werden.", @@ -1617,6 +1632,7 @@ "showPrivacyPolicy": "Datenschutzerklärung anzeigen", "signInTitle": "Authentifizierung wird benötigt", "someTokensDoNotSupportPolling": "Einige der Token sind veraltet und unterstützen keine aktiven Anfragen", + "startTransfer": "Übertragung starten", "statusCode": "Statuscode: {statusCode}", "sync": "Sync", "syncContainerFailed": "Container synchronisation fehlgeschlagen", @@ -1640,6 +1656,13 @@ "tokensAreEncrypted": "Die Token sind verschlüsselt. Bitte gib das Passwort ein, um sie zu entschlüsseln.", "tokensDoNotSupportSynchronization": "Die folgenden Token unterstützen keine Synchronisation und müssen erneut ausgerollt werden:", "tokensSuccessfullyDecrypted": "Die Token wurden erfolgreich entschlüsselt, sie können nun importiert werden.", + "transferContainerDialogContent1": "Sie können den Container auf ein anderes Gerät übertragen. Der Container wird über einen QR-Code übertragen.", + "transferContainerDialogContent2": "Für den Vorgang ist eine aktive Internetverbindung erforderlich.", + "transferContainerDialogTitle": "Container übertragen", + "transferContainerFailed": "Die Übertragung konnte nicht gestartet werden.", + "transferContainerScanQrCode": "Scannen Sie den QR-Code auf dem neuen Gerät, um den Container zu übertragen.", + "transferContainerSuccessDialogContent1": "Der Container wurde erfolgreich auf ein anderes Gerät übertragen.", + "transferContainerSuccessDialogContent2": "Möchten Sie den Container und die zugehörigen Token von diesem Gerät löschen?", "type": "Art", "unexpectedError": "Ein unerwarteter Fehler ist aufgetreten.", "unknown": "Unbekannt", @@ -1652,8 +1675,5 @@ "verboseLogging": "Ausführliche Protokollierung", "versionTitle": "Version", "wrongPassword": "Falsches Passwort", - "yes": "Ja", - "renewSecretsDialogTitle" : "Token Secrets erneuern", - "renewSecretsDialogText" : "Sie können die Geheimnisse der Token erneuern. Dies ist nützlich, wenn Sie vermuten, dass die Geheimnisse kompromittiert wurden. Da Container-Tokens verschlüsselt übertragen werden und die Geheimnisse sicher auf dem Gerät gespeichert sind. Der einzige bekannte Fall, in dem dies geschehen sein könnte, wäre, wenn der Token vor dem Container über einen QR-Code ausgerollt wurde.", - "renewSecrets" : "Secrets erneuern" + "yes": "Ja" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 827a0d172..d83c83fc0 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1092,7 +1092,13 @@ "description": "Title of the screen where the user can select the token import type." }, "@selectTokensToExport": { - "description": "Title of the screen where the user can select the tokens to export." + "description": "Title of the screen where the user can select the tokens to export.", + "placeholders": { + "count": { + "example": "5", + "type": "int" + } + } }, "@selectTokensToExportHelpContent1": { "description": "Tells the user why some tokens are not exportable." @@ -1308,7 +1314,7 @@ "a11yLicensesButton": "Licenses", "a11yPushTokensButton": "Push Tokens", "a11yScanQrCodeButton": "Scan QR-Code", - "a11yScanQrCodeViewActive": " Scan-QR-code view. Cammera is active", + "a11yScanQrCodeViewActive": "Scan-QR-code view. Cammera is active", "a11yScanQrCodeViewFlashlightOff": "Tap to turn on flashlight.", "a11yScanQrCodeViewFlashlightOn": "Tap to turn off flashlight.", "a11yScanQrCodeViewGallery": "Open gallery", @@ -1343,6 +1349,9 @@ "checkYourNetwork": "Please check your network connection and try again.", "clearErrorLog": "Clear", "clipboardEmpty": "Clipboard is empty", + "@clipboardEmpty": { + "description": "description" + }, "confirmDeletion": "Confirm deletion", "confirmDeletionOf": "Are you sure you want to delete {name}?", "confirmFolderDeletionHint": "Deleting a folder has no effect on the tokens in it.\nThe tokens are moved to the main list.", @@ -1351,10 +1360,30 @@ "confirmation": "Confirmation", "connectionFailed": "Connection failed.", "container": "Container", + "containerAddTitle": "Add container", + "@containerAddTitle": { + "description": "description" + }, "containerAlreadyExists": "Container already exists", "containerDetails": "Container details", + "containerRolloutSendDeviceInfoContent": "Would you like to tell the publisher of the container which device you are using? This may be useful later if you have problems with your second factor.", + "@containerRolloutSendDeviceInfoContent": { + "description": "description" + }, + "containerRolloutSendDeviceInfoTitle": "Send device information", + "@containerRolloutSendDeviceInfoTitle": { + "description": "description" + }, "containerSerial": "Container Serial", "containerSyncUrl": "Container Sync Url", + "containerTransferAborted": "Container transfer aborted.", + "@containerTransferAborted": { + "description": "description" + }, + "containerTransferDeleteTokens": "Remove from this device", + "@containerTransferDeleteTokens": { + "description": "description" + }, "continueButton": "Continue", "copyOTPToClipboard": "Copy OTP to clipboard", "couldNotConnectToServer": "Could not connect to server", @@ -1375,9 +1404,21 @@ "decryptErrorDeleteConfirmationContent": "Are you sure you want to delete the app data?", "decryptErrorTitle": "Decryption error", "delete": "Delete", + "deleteAll": "Delete all", + "@deleteAll": { + "description": "description" + }, "deleteContainerDialogContent": "If you delete this container, the smartphone is disconnected from the privacyIDEA server and the tokens of this container become unusable. Before deleting, make sure that the corresponding tokens are no longer required!", "deleteContainerDialogTitle": "Deleting Container {serial}", + "deleteCorrespondingTokenDialogContent": "Do you want to delete the corresponding tokens as well?", + "@deleteCorrespondingTokenDialogContent": { + "description": "description" + }, "deleteLockedToken": "Please authenticate to delete the locked token.", + "deleteOnlyContainer": "Only container", + "@deleteOnlyContainer": { + "description": "description" + }, "details": "Details", "deviceCredentialsRequiredTitle": "Device credentials not set up", "deviceCredentialsSetupDescription": "Setup device credentials in the device's settings", @@ -1391,6 +1432,14 @@ "encoding": "Encoding", "enterDetailsForToken": "Enter token details", "enterLink": "Enter link", + "enterPassphrase": "Enter passphrase", + "@enterPassphrase": { + "description": "description" + }, + "enterPassphraseHint": "Passphrase", + "@enterPassphraseHint": { + "description": "description" + }, "enterPasswordToEncrypt": "Enter a password to encrypt the tokens. This password will be required to import the tokens.", "errorLogCleared": "Error log cleared.", "errorLogEmpty": "The error log is empty.", @@ -1464,6 +1513,9 @@ "importNewToken": "{count, plural, zero{No new token was found.} one{A new token was found that can be imported.} other{{count} new tokens were found that can be imported.}}", "importTokens": "Import token", "importantInformationTitle": "Important information", + "@importantInformationTitle": { + "description": "description" + }, "importedVia": "Imported via", "increaseCounter": "Increase counter", "internalServerError": "Internal server error ({code})", @@ -1491,7 +1543,14 @@ "legacySigningErrorMessage": "The token was enrolled in a old version of this app, which may cause trouble using it.\nIt is suggested to enroll a new push token if the problem persist!", "legacySigningErrorTitle": "An error occured while using the legacy token: {tokenLabel}", "licensesAndVersion": "Licenses and version", + "linkHomeWidget": "Link home widget", + "@linkHomeWidget": { + "description": "description" + }, "linkMustOtpAuth": "The link must start with otpauth://", + "@linkMustOtpAuth": { + "description": "description" + }, "linkedContainer": "Linked container", "lock": "Lock", "lockOut": "Biometric authentication is disabled. Please lock and unlock your screen to enable it.", @@ -1509,7 +1568,7 @@ "noNetworkConnection": "No network connection.", "noPublicKey": "No public key available", "noResultText1": "Tap the ", - "noResultText2": " button to get started!", + "noResultText2": "button to get started!", "noResultTitle": "No tokens stored yet.", "noTokenToExport": "No token available for export", "noTokenToImport": "No token found to import", @@ -1560,6 +1619,10 @@ "pushEndpointUrl": "Push endpoint URL", "pushRequestParseError": "Push request could not be parsed.", "pushToken": "Push Token", + "pushTokensViewTitle": "Push-Tokens", + "@pushTokensViewTitle": { + "description": "description" + }, "qrFileDecodeError": "It was not possible to decode the QR code from the selected image, please use the QR code scanner instead.", "qrInFileNotFound": "No QR code was found in the selected image.", "qrInFileNotFound2": "You can show me where the QR code is located.", @@ -1568,6 +1631,18 @@ "rename": "Rename", "renameToken": "Rename token", "renameTokenFolder": "Rename folder", + "renewSecrets": "Renew secrets", + "@renewSecrets": { + "description": "description" + }, + "renewSecretsDialogText": "You can renew the secrets of the tokens. This is useful if you suspect that the secrets have been compromised. As container tokens are transmitted in encrypted form and the secrets are stored securely on the device. The only known case where this could have happened would be if the token was rolled out before the container via a QR code.", + "@renewSecretsDialogText": { + "description": "description" + }, + "renewSecretsDialogTitle": "Renew Token Secrets", + "@renewSecretsDialogTitle": { + "description": "description" + }, "replaceButton": "Replace", "requestInfo": "Sent by {issuer} for your account: \"{account}\"", "requestPushChallengesPeriodically": "Request push challenges from the server periodically. Enable this if push challenges are not received normally.", @@ -1611,6 +1686,10 @@ "showPrivacyPolicy": "Show privacy policy", "signInTitle": "Authentication required", "someTokensDoNotSupportPolling": "Some of the tokens are outdated and do not support polling", + "startTransfer": "Start transfer", + "@startTransfer": { + "description": "description" + }, "statusCode": "Status code: {statusCode}", "sync": "Sync", "syncContainerFailed": "Container synchronization failed", @@ -1634,6 +1713,34 @@ "tokensAreEncrypted": "The tokens are encrypted. Please enter the password to decrypt them.", "tokensDoNotSupportSynchronization": "The following tokens do not support synchronization and must be rolled out again:", "tokensSuccessfullyDecrypted": "The tokens have been successfully decrypted and can now be imported.", + "transferContainerDialogContent1": "You can transfer the container to another device. The container is transferred via a QR code.", + "@transferContainerDialogContent1": { + "description": "description" + }, + "transferContainerDialogContent2": "For the process is an active internet connection required.", + "@transferContainerDialogContent2": { + "description": "description" + }, + "transferContainerDialogTitle": "Transfer Container", + "@transferContainerDialogTitle": { + "description": "description" + }, + "transferContainerFailed": "Failed to start transfer.", + "@transferContainerFailed": { + "description": "description" + }, + "transferContainerScanQrCode": "Scan the QR code on the new device to transfer the container.", + "@transferContainerScanQrCode": { + "description": "description" + }, + "transferContainerSuccessDialogContent1": "The container has been transferred successfully to another device.", + "@transferContainerSuccessDialogContent1": { + "description": "description" + }, + "transferContainerSuccessDialogContent2": "Do you want to delete the container and its corresponding tokens from this device?", + "@transferContainerSuccessDialogContent2": { + "description": "description" + }, "type": "Type", "unexpectedError": "An unexpected error occurred.", "unknown": "Unknown", @@ -1642,12 +1749,9 @@ "useDeviceLocaleDescription": "Use device language if it is supported, otherwise default to english.", "useDeviceLocaleTitle": "Use device language", "valueNotAllowed": "Type {type} “{value}” is not a permitted value for “{parameter}”", - "valueNotAllowedIn": " Type {type} “{value}” is not a valid value for “{parameter}” in “{map}”", + "valueNotAllowedIn": "Type {type} “{value}” is not a valid value for “{parameter}” in “{map}”", "verboseLogging": "Verbose logging", "versionTitle": "Version", "wrongPassword": "Incorrect password", - "yes": "Yes", - "renewSecretsDialogTitle" : "Renew Token Secrets", - "renewSecretsDialogText" : "You can renew the secrets of the tokens. This is useful if you suspect that the secrets have been compromised. As container tokens are transmitted in encrypted form and the secrets are stored securely on the device. The only known case where this could have happened would be if the token was rolled out before the container via a QR code.", - "renewSecrets" : "Renew secrets" + "yes": "Yes" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 8e2154489..6d5688ca9 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1092,7 +1092,13 @@ "description": "Title of the screen where the user can select the token import type." }, "@selectTokensToExport": { - "description": "Title of the screen where the user can select the tokens to export." + "description": "Title of the screen where the user can select the tokens to export.", + "placeholders": { + "count": { + "example": "5", + "type": "int" + } + } }, "@selectTokensToExportHelpContent1": { "description": "Tells the user why some tokens are not exportable." @@ -1350,10 +1356,15 @@ "confirmation": "confirmación", "connectionFailed": "Conexión fallida.", "container": "Contenedor", + "containerAddTitle": "Añadir contenedor", "containerAlreadyExists": "El contenedor ya existe", "containerDetails": "Detalles del contenedor", + "containerRolloutSendDeviceInfoContent": "¿Desea indicar al editor del contenedor el dispositivo que está utilizando? Esto puede ser útil más adelante si tienes problemas con tu segundo factor.", + "containerRolloutSendDeviceInfoTitle": "Enviar información del dispositivo", "containerSerial": "Contenedor de serie", "containerSyncUrl": "Url de sincronización de contenedores", + "containerTransferAborted": "Transferencia de contenedor abortada.", + "containerTransferDeleteTokens": "Eliminar de este dispositivo", "continueButton": "Continue", "copyOTPToClipboard": "Copiar OTP al portapapeles", "couldNotConnectToServer": "No se ha podido conectar con el servidor.", @@ -1374,9 +1385,12 @@ "decryptErrorDeleteConfirmationContent": "¿Estás seguro de que quieres borrar los datos de la aplicación?", "decryptErrorTitle": "Error de descifrado", "delete": "Borrar", + "deleteAll": "Eliminar todo", "deleteContainerDialogContent": "Si elimina este contenedor, el smartphone se desconectará del servidor privacyIDEA y los tokens de este contenedor quedarán inutilizables. Antes de eliminarlo, asegúrate de que los tokens correspondientes ya no son necesarios.", "deleteContainerDialogTitle": "Borrar contenedor {serial}", + "deleteCorrespondingTokenDialogContent": "¿Desea eliminar también los tokens correspondientes?", "deleteLockedToken": "Por favor, autentíquese para eliminar el token bloqueado.", + "deleteOnlyContainer": "Sólo contenedor", "details": "Detalles", "deviceCredentialsRequiredTitle": "No se han configurado las credenciales del dispositivo.", "deviceCredentialsSetupDescription": "Configurar las credenciales del dispositivo en los ajustes del dispositivo", @@ -1390,6 +1404,8 @@ "encoding": "Codificación", "enterDetailsForToken": "Introduzca los datos de el token", "enterLink": "Introducir enlace", + "enterPassphrase": "Introduzca la contraseña", + "enterPassphraseHint": "Frase de contraseña", "enterPasswordToEncrypt": "Ingrese una contraseña para cifrar los tokens. Esta contraseña será necesaria para importar los tokens.", "errorLogCleared": "Registro de errores borrado", "errorLogEmpty": "El registro de errores está vacío", @@ -1462,6 +1478,7 @@ "importNTokens": "{count, plural, zero{No importar tokens} one{Importar un token} other{Importar {count} tokens}}", "importNewToken": "{count, plural, zero{No se ha encontrado ningún token nuevo.} one{Se ha encontrado un nuevo token que se puede importar.} other{Se han encontrado {count} nuevos tokens que se pueden importar.}}", "importTokens": "Importar token", + "importantInformationTitle": "Información importante", "importedVia": "Importado a través de", "increaseCounter": "Incrementar contador", "internalServerError": "Error interno del servidor ({code})", @@ -1489,6 +1506,7 @@ "legacySigningErrorMessage": "El token se creó en una versión obsoleta de la aplicación, lo que puede provocar problemas al utilizarlo.\nSe recomienda crear un nuevo token push si el problema persiste.", "legacySigningErrorTitle": "Se ha producido un error al utilizar el token obsoleto: {tokenLabel}", "licensesAndVersion": "Licencias y versión", + "linkHomeWidget": "Enlazar widget de inicio", "linkMustOtpAuth": "El enlace debe empezar por otpauth://", "linkedContainer": "Contenedor vinculado", "lock": "Cierre", @@ -1507,7 +1525,7 @@ "noNetworkConnection": "No hay conexión a la red.", "noPublicKey": "No hay clave pública.", "noResultText1": "Indique el ", - "noResultText2": " para empezar.", + "noResultText2": "para empezar.", "noResultTitle": "Aún no hay tokens almacenadas.", "noTokenToExport": "No hay token disponible para exportar", "noTokenToImport": "No se ha encontrado ningún token para importar", @@ -1558,6 +1576,7 @@ "pushEndpointUrl": "URL del punto final push", "pushRequestParseError": "No se ha podido procesar la solicitud push.", "pushToken": "Push Token", + "pushTokensViewTitle": "Push-Tokens", "qrFileDecodeError": "No fue posible decodificar el código QR de la imagen seleccionada, por favor utilice el escáner de código QR en su lugar.", "qrInFileNotFound": "No se ha encontrado ningún código QR en la imagen seleccionada.", "qrInFileNotFound2": "Puedes mostrarme dónde está el código QR.", @@ -1566,6 +1585,9 @@ "rename": "Renombrar", "renameToken": "Renombrar token", "renameTokenFolder": "Cambiar nombre de carpeta", + "renewSecrets": "Renovar secretos", + "renewSecretsDialogText": "Puede renovar los secretos de los tokens. Esto es útil si sospecha que los secretos han sido comprometidos. Como los tokens de los contenedores se transmiten cifrados, los secretos se almacenan de forma segura en el dispositivo. El único caso conocido en el que esto podría haber ocurrido sería si el token se hubiera desplegado antes que el contenedor a través de un código QR.", + "renewSecretsDialogTitle": "Renovar los secretos de las fichas", "replaceButton": "Sustituir", "requestInfo": "Enviado por {issuer} para su cuenta: \"{account}\"", "requestPushChallengesPeriodically": "Solicita retos push al servidor periódicamente. Habilite esta opción si los retos push no se reciben normalmente.", @@ -1594,8 +1616,8 @@ "selectTokensToExport": "{count, plural, zero{} one{Seleccionar token para exportar} other{Seleccionar tokens para exportar}}", "selectTokensToExportHelpContent1": "Si un token no aparece en la lista, no se garantiza que no sea un token privacyIDEA.", "selectTokensToExportHelpContent2": "Actualmente sólo se pueden exportar los tokens añadidos manualmente y los importados.", - "selectTokensToExportHelpContent3": " Estamos trabajando en una solución para diferenciar entre tokens privacyIDEA y tokens privados.", - "selectTokensToExportHelpContent4": " Puede obtener un nuevo código QR del servicio del que recibió el token.", + "selectTokensToExportHelpContent3": "Estamos trabajando en una solución para diferenciar entre tokens privacyIDEA y tokens privados.", + "selectTokensToExportHelpContent4": "Puede obtener un nuevo código QR del servicio del que recibió el token.", "selectTokensToExportHelpTitle": "¿Su ficha no figura en la lista?", "send": "Enviar", "sendErrorDialogBody": "Se ha producido un error inesperado en la aplicación. La siguiente información puede ser enviada a los desarrolladores por correo electrónico para ayudar a prevenir este error en el futuro.", @@ -1609,6 +1631,7 @@ "showPrivacyPolicy": "Mostrar política de privacidad", "signInTitle": "Autenticación necesaria", "someTokensDoNotSupportPolling": "Algunos tokens están obsoletos y no admiten la consulta activa para la autenticación mediante mensaje push.", + "startTransfer": "Iniciar transferencia", "statusCode": "Código de estado: {statusCode}", "sync": "Sinchronizar", "syncContainerFailed": "Error en la sincronización de contenedores", @@ -1632,6 +1655,13 @@ "tokensAreEncrypted": "Los tokens están encriptados. Por favor, introduce la contraseña para descifrarlos", "tokensDoNotSupportSynchronization": "Las siguientes tokens no admiten la sincronización y deben volver a desplegarse:", "tokensSuccessfullyDecrypted": "Los tokens se han descifrado correctamente y ya se pueden importar.", + "transferContainerDialogContent1": "Puede transferir el contenedor a otro dispositivo. El contenedor se transfiere mediante un código QR.", + "transferContainerDialogContent2": "Para el proceso se requiere una conexión activa a Internet.", + "transferContainerDialogTitle": "Transferir contenedor", + "transferContainerFailed": "No se ha podido iniciar la transferencia.", + "transferContainerScanQrCode": "Escanee el código QR en el nuevo dispositivo para transferir el contenedor.", + "transferContainerSuccessDialogContent1": "El contenedor se ha transferido correctamente a otro dispositivo.", + "transferContainerSuccessDialogContent2": "¿Desea eliminar el contenedor y sus tokens correspondientes de este dispositivo?", "type": "Tipo", "unexpectedError": "Se ha producido un error inesperado.", "unknown": "Desconocido", @@ -1644,8 +1674,5 @@ "verboseLogging": "Registro detallado", "versionTitle": "Versión", "wrongPassword": "Contraseña incorrecta", - "yes": "Sí", - "renewSecretsDialogTitle" : "Renovar los secretos de las fichas", - "renewSecretsDialogText" : "Puede renovar los secretos de los tokens. Esto es útil si sospecha que los secretos han sido comprometidos. Como los tokens de los contenedores se transmiten cifrados, los secretos se almacenan de forma segura en el dispositivo. El único caso conocido en el que esto podría haber ocurrido sería si el token se hubiera desplegado antes que el contenedor a través de un código QR.", - "renewSecrets" : "Renovar secretos" + "yes": "Sí" } \ No newline at end of file diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 2d5c9f256..71d1bf190 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1092,7 +1092,13 @@ "description": "Title of the screen where the user can select the token import type." }, "@selectTokensToExport": { - "description": "Title of the screen where the user can select the tokens to export." + "description": "Title of the screen where the user can select the tokens to export.", + "placeholders": { + "count": { + "example": "5", + "type": "int" + } + } }, "@selectTokensToExportHelpContent1": { "description": "Tells the user why some tokens are not exportable." @@ -1351,10 +1357,15 @@ "confirmation": "Confirmation", "connectionFailed": "La connexion a échoué.", "container": "Conteneur", + "containerAddTitle": "Ajouter un conteneur", "containerAlreadyExists": "Le conteneur existe déjà", "containerDetails": "Détails du conteneur", + "containerRolloutSendDeviceInfoContent": "Souhaitez-vous indiquer à l'éditeur du conteneur quel appareil vous utilisez ? Cela peut être utile plus tard si vous avez des problèmes avec votre deuxième facteur.", + "containerRolloutSendDeviceInfoTitle": "Envoyer les informations sur l'appareil", "containerSerial": "Conteneur en série", "containerSyncUrl": "Url de synchronisation du conteneur", + "containerTransferAborted": "Le transfert du conteneur a été interrompu.", + "containerTransferDeleteTokens": "Retirer de cet appareil", "continueButton": "Continue", "copyOTPToClipboard": "Copier l'OTP dans le presse-papiers", "couldNotConnectToServer": "Impossible de se connecter au serveur.", @@ -1375,9 +1386,12 @@ "decryptErrorDeleteConfirmationContent": "Êtes-vous sûr de vouloir supprimer les données de l'application ?", "decryptErrorTitle": "Erreur de décryptage", "delete": "Supprimer", + "deleteAll": "Supprimer tout", "deleteContainerDialogContent": "Si vous supprimez ce conteneur, le smartphone sera déconnecté du serveur privacyIDEA et les tokens de ce conteneur deviendront inutilisables. Avant de le supprimer, assurez-vous que les tokens correspondants ne sont plus nécessaires !", "deleteContainerDialogTitle": "Suppression du conteneur {serial}", + "deleteCorrespondingTokenDialogContent": "Souhaitez-vous également supprimer les jetons correspondants ?", "deleteLockedToken": "Veuillez vous authentifier pour supprimer le jeton verrouillé.", + "deleteOnlyContainer": "Seulement le conteneur", "details": "Détails", "deviceCredentialsRequiredTitle": "Les informations d'identification de l'appareil ne sont pas configurées", "deviceCredentialsSetupDescription": "Configurer les informations d'identification de l'appareil dans les paramètres de l'appareil", @@ -1391,6 +1405,8 @@ "encoding": "Encodage", "enterDetailsForToken": "Saisissez les détails du jeton", "enterLink": "Saisir le lien", + "enterPassphrase": "Saisir la phrase d'authentification", + "enterPassphraseHint": "Phrase de passe", "enterPasswordToEncrypt": "Entrez un mot de passe pour chiffrer les jetons. Ce mot de passe sera requis pour importer les jetons.", "errorLogCleared": "Journal d'erreur nettoyé", "errorLogEmpty": "Le journal des erreurs est vide", @@ -1463,6 +1479,7 @@ "importNTokens": "{count, plural, zero{N'importer aucun jeton} one{Importer un jeton} other{Importer {count} tokens}}", "importNewToken": "{count, plural, zero{Aucun nouveau jeton n'a été trouvé.} one{Un nouveau token a été trouvé et peut être importé.} other{{count} nouveaux tokens ont été trouvés et peuvent être importés.}}", "importTokens": "Importer un jeton", + "importantInformationTitle": "Informations importantes", "importedVia": "Importé via", "increaseCounter": "Augmenter le compteur", "internalServerError": "Erreur interne du serveur ({code})", @@ -1490,6 +1507,7 @@ "legacySigningErrorMessage": "Le token a été créé dans une version obsolète de l'application, ce qui peut entraîner des problèmes d'utilisation.\nIl est recommandé de créer un nouveau token push si le problème persiste !", "legacySigningErrorTitle": "Une erreur s'est produite lors de l'utilisation du jeton obsolète : {tokenLabel}", "licensesAndVersion": "Licences et version", + "linkHomeWidget": "Lier le widget d'accueil", "linkMustOtpAuth": "Le lien doit commencer par otpauth://.", "linkedContainer": "Conteneur lié", "lock": "Bloquer", @@ -1559,6 +1577,7 @@ "pushEndpointUrl": "URL de l'endpoint Push", "pushRequestParseError": "La demande push n'a pas pu être traitée.", "pushToken": "Jeton de type Push", + "pushTokensViewTitle": "Jetons de poussée", "qrFileDecodeError": "Il n'a pas été possible de décoder le code QR à partir de l'image sélectionnée, veuillez utiliser le scanner de code QR à la place", "qrInFileNotFound": "Aucun code QR n'a été trouvé dans l'image sélectionnée.", "qrInFileNotFound2": "Vous pouvez me montrer où se trouve le code QR.", @@ -1567,6 +1586,9 @@ "rename": "Renommer", "renameToken": "Renommer jeton", "renameTokenFolder": "Renommer le dossier", + "renewSecrets": "Renouveler les secrets", + "renewSecretsDialogText": "Vous pouvez renouveler les secrets des jetons. Cette fonction est utile si vous soupçonnez que les secrets ont été compromis. Les jetons de conteneurs sont transmis sous forme cryptée et les secrets sont stockés en toute sécurité sur l'appareil. Le seul cas connu où cela aurait pu se produire serait si le jeton avait été déployé avant le conteneur par le biais d'un code QR.", + "renewSecretsDialogTitle": "Renouveler les secrets des jetons", "replaceButton": "Remplacer", "requestInfo": "Envoyé par {issuer} pour votre compte : \"{account}\"", "requestPushChallengesPeriodically": "Demander des challenges push depuis le serveur périodiquement. Activer cette fonction si les challenges push ne sont pas reçus normalement.", @@ -1610,6 +1632,7 @@ "showPrivacyPolicy": "Afficher la déclaration de confidentialité", "signInTitle": "Authentification requise", "someTokensDoNotSupportPolling": "Certains jetons sont obsolètes et ne supportent pas l'interrogation due serveur.", + "startTransfer": "Démarrer le transfert", "statusCode": "Code d'état : {statusCode}", "sync": "Synchroniser", "syncContainerFailed": "Échec de la synchronisation des conteneurs", @@ -1633,6 +1656,13 @@ "tokensAreEncrypted": "Les jetons sont cryptés. Veuillez saisir le mot de passe pour les décrypter", "tokensDoNotSupportSynchronization": "Ces jetons ne supportent pas la synchronisation et doivent être de nouveau générés:", "tokensSuccessfullyDecrypted": "Les tokens ont été décryptés avec succès, ils peuvent maintenant être importés.", + "transferContainerDialogContent1": "Vous pouvez transférer le conteneur vers un autre appareil. Le conteneur est transféré via un code QR.", + "transferContainerDialogContent2": "Une connexion internet active est nécessaire pour ce processus.", + "transferContainerDialogTitle": "Transférer le conteneur", + "transferContainerFailed": "Échec du démarrage du transfert.", + "transferContainerScanQrCode": "Scannez le code QR sur le nouvel appareil pour transférer le conteneur.", + "transferContainerSuccessDialogContent1": "Le conteneur a été transféré avec succès vers un autre appareil.", + "transferContainerSuccessDialogContent2": "Voulez-vous supprimer le conteneur et les jetons correspondants de cet appareil ?", "type": "Type", "unexpectedError": "Une erreur inattendue s'est produite.", "unknown": "Inconnu", @@ -1645,8 +1675,5 @@ "verboseLogging": "Journalisation verbeuse", "versionTitle": "Version", "wrongPassword": "Mot de passe incorrect", - "yes": "Oui", - "renewSecretsDialogTitle" : "Renouveler les secrets des jetons", - "renewSecretsDialogText" : "Vous pouvez renouveler les secrets des jetons. Cette fonction est utile si vous soupçonnez que les secrets ont été compromis. Les jetons de conteneurs sont transmis sous forme cryptée et les secrets sont stockés en toute sécurité sur l'appareil. Le seul cas connu où cela aurait pu se produire serait si le jeton avait été déployé avant le conteneur par le biais d'un code QR.", - "renewSecrets" : "Renouveler les secrets" + "yes": "Oui" } \ No newline at end of file diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 45b731f6a..27ce97f36 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -1,4 +1,5 @@ { + "@@last_modified": "2024-09-20", "@@locale": "id", "@a11yAddFolderButton": { "description": "Buttontext to add a new folder." @@ -1091,7 +1092,13 @@ "description": "Title of the screen where the user can select the token import type." }, "@selectTokensToExport": { - "description": "Title of the screen where the user can select the tokens to export." + "description": "Title of the screen where the user can select the tokens to export.", + "placeholders": { + "count": { + "example": "5", + "type": "intint" + } + } }, "@selectTokensToExportHelpContent1": { "description": "Tells the user why some tokens are not exportable." @@ -1349,10 +1356,15 @@ "confirmation": "Konfirmasi", "connectionFailed": "Koneksi gagal.", "container": "Kontainer", + "containerAddTitle": "Tambahkan wadah", "containerAlreadyExists": "Wadah sudah ada", "containerDetails": "Detail kontainer", + "containerRolloutSendDeviceInfoContent": "Apakah Anda ingin memberi tahu penerbit kontainer perangkat mana yang Anda gunakan? Ini mungkin berguna nantinya jika Anda mengalami masalah dengan faktor kedua Anda.", + "containerRolloutSendDeviceInfoTitle": "Mengirim informasi perangkat", "containerSerial": "Serial Kontainer", "containerSyncUrl": "Url Sinkronisasi Kontainer", + "containerTransferAborted": "Transfer kontainer dibatalkan.", + "containerTransferDeleteTokens": "Hapus dari perangkat ini", "continueButton": "Lanjutkan", "copyOTPToClipboard": "Salin OTP ke papan klip", "couldNotConnectToServer": "Tidak dapat terhubung ke server", @@ -1373,9 +1385,12 @@ "decryptErrorDeleteConfirmationContent": "Apakah Anda yakin ingin menghapus data aplikasi?", "decryptErrorTitle": "Kesalahan dekripsi", "delete": "Menghapus", + "deleteAll": "Hapus semua", "deleteContainerDialogContent": "Jika Anda menghapus kontainer ini, smartphone akan terputus dari server privacyIDEA dan token dari kontainer ini menjadi tidak dapat digunakan. Sebelum menghapus, pastikan bahwa token yang bersangkutan tidak lagi diperlukan!", "deleteContainerDialogTitle": "Menghapus Kontainer {serial}", + "deleteCorrespondingTokenDialogContent": "Apakah Anda juga ingin menghapus token yang terkait?", "deleteLockedToken": "Lakukan autentikasi untuk menghapus token yang terkunci.", + "deleteOnlyContainer": "Hanya kontainer", "details": "Detail", "deviceCredentialsRequiredTitle": "Kredensial perangkat tidak diatur", "deviceCredentialsSetupDescription": "Mengatur kredensial perangkat di pengaturan perangkat", @@ -1389,6 +1404,8 @@ "encoding": "Pengkodean", "enterDetailsForToken": "Masukkan detail token", "enterLink": "Masukkan tautan", + "enterPassphrase": "Masukkan kata sandi", + "enterPassphraseHint": "Kata sandi", "enterPasswordToEncrypt": "Masukkan kata sandi untuk mengenkripsi token. Kata sandi ini akan diperlukan untuk mengimpor token.", "errorLogCleared": "Log kesalahan dihapus.", "errorLogEmpty": "Log kesalahan kosong.", @@ -1461,6 +1478,7 @@ "importNTokens": "{count, plural, zero{Impor tanpa token} one{Impor satu token} other{Impor {count} token}}", "importNewToken": "{count, plural, zero{Tidak ada token baru yang ditemukan.} one{Token baru ditemukan dan dapat diimpor.} other{{count} token baru ditemukan dan dapat diimpor.}}", "importTokens": "Impor token", + "importantInformationTitle": "Informasi penting", "importedVia": "Diimpor via", "increaseCounter": "Tingkatkan penghitung", "internalServerError": "Kesalahan server internal ({code})", @@ -1487,6 +1505,7 @@ "legacySigningErrorMessage": "Token didaftarkan di versi lama aplikasi ini, yang dapat menyebabkan masalah saat menggunakannya.\nDisarankan untuk mendaftarkan token push baru jika masalah terus berlanjut!", "legacySigningErrorTitle": "Terjadi kesalahan saat menggunakan token lama: {tokenLabel}", "licensesAndVersion": "Lisensi dan versi", + "linkHomeWidget": "Tautkan widget beranda", "linkedContainer": "Wadah yang terhubung", "lock": "Mengunci", "lockOut": "Autentikasi biometrik dinonaktifkan. Silakan kunci dan buka kunci layar Anda untuk mengaktifkannya.", @@ -1504,7 +1523,7 @@ "noNetworkConnection": "Tidak ada koneksi jaringan.", "noPublicKey": "Tidak ada kunci publik yang tersedia", "noResultText1": "Ketuk tombol ", - "noResultText2": " untuk memulai!", + "noResultText2": "untuk memulai!", "noResultTitle": "Belum ada token yang disimpan.", "noTokenToExport": "Tidak ada token yang tersedia untuk ekspor", "noTokenToImport": "Tidak ada token yang ditemukan untuk diimpor", @@ -1555,6 +1574,7 @@ "pushEndpointUrl": "URL titik akhir push", "pushRequestParseError": "Push request could not be parsed.", "pushToken": "Token Dorong", + "pushTokensViewTitle": "Token Dorong", "qrFileDecodeError": "Tidak dapat memecahkan kode QR dari gambar yang dipilih, silakan gunakan pemindai kode QR sebagai gantinya.", "qrInFileNotFound": "Tidak ada kode QR yang ditemukan pada gambar yang dipilih.", "qrInFileNotFound2": "Anda dapat menunjukkan di mana letak kode QR.", @@ -1563,6 +1583,9 @@ "rename": "Ganti nama", "renameToken": "Ganti nama token", "renameTokenFolder": "Ganti nama folder", + "renewSecrets": "Memperbarui rahasia", + "renewSecretsDialogText": "Anda dapat memperbarui rahasia token. Hal ini berguna jika Anda mencurigai bahwa rahasia tersebut telah dibobol. Karena token kontainer dikirimkan dalam bentuk terenkripsi dan rahasia disimpan dengan aman di perangkat. Satu-satunya kasus yang diketahui di mana hal ini dapat terjadi adalah jika token diluncurkan sebelum kontainer melalui kode QR.", + "renewSecretsDialogTitle": "Memperbarui Rahasia Token", "replaceButton": "Ganti", "requestInfo": "Dikirim oleh {issuer} untuk akun Anda: {account}", "requestPushChallengesPeriodically": "Meminta tantangan push dari server secara berkala. Aktifkan ini jika tantangan push tidak diterima secara normal.", @@ -1592,7 +1615,7 @@ "selectTokensToExportHelpContent1": "Jika sebuah token tidak terdaftar, tidak dijamin bahwa token tersebut bukan token privacyIDEA.", "selectTokensToExportHelpContent2": "Saat ini hanya token yang ditambahkan dan diimpor secara manual yang dapat diekspor.", "selectTokensToExportHelpContent3": "Kami sedang mengerjakan solusi untuk membedakan antara token privacyIDEA dan token pribadi.", - "selectTokensToExportHelpContent4": " Anda bisa mendapatkan kode QR baru dari layanan tempat Anda menerima token.", + "selectTokensToExportHelpContent4": "Anda bisa mendapatkan kode QR baru dari layanan tempat Anda menerima token.", "selectTokensToExportHelpTitle": "Apakah token Anda tidak terdaftar?", "send": "Kirim", "sendErrorDialogBody": "Terjadi kesalahan yang tidak terduga dalam aplikasi. Informasi di bawah ini dapat dikirimkan ke pengembang melalui email untuk membantu mencegah kesalahan ini di masa mendatang.", @@ -1606,6 +1629,7 @@ "showPrivacyPolicy": "Tampilkan kebijakan privasi", "signInTitle": "Diperlukan autentikasi", "someTokensDoNotSupportPolling": "Beberapa token sudah ketinggalan zaman dan tidak mendukung pemungutan suara", + "startTransfer": "Mulai transfer", "statusCode": "Kode status: {statusCode}", "sync": "Sinkronisasi", "syncContainerFailed": "Sinkronisasi kontainer gagal", @@ -1629,6 +1653,13 @@ "tokensAreEncrypted": "Tautan tokenToken dienkripsi. Masukkan kata sandi untuk mendekripsi token tersebut.", "tokensDoNotSupportSynchronization": "Token berikut ini tidak mendukung sinkronisasi dan harus diluncurkan kembali:", "tokensSuccessfullyDecrypted": "Token telah berhasil didekripsi dan sekarang dapat diimpor.", + "transferContainerDialogContent1": "Anda bisa mentransfer kontainer ke perangkat lain. Kontainer ditransfer melalui kode QR.", + "transferContainerDialogContent2": "Untuk proses ini, diperlukan koneksi internet yang aktif.", + "transferContainerDialogTitle": "Mentransfer Kontainer", + "transferContainerFailed": "Gagal memulai transfer.", + "transferContainerScanQrCode": "Pindai kode QR pada perangkat baru untuk mentransfer kontainer.", + "transferContainerSuccessDialogContent1": "Kontainer telah berhasil ditransfer ke perangkat lain.", + "transferContainerSuccessDialogContent2": "Apakah Anda ingin menghapus container dan token terkait dari perangkat ini?", "type": "Jenis", "unexpectedError": "Terjadi kesalahan yang tidak diharapkan.", "unknown": "Tidak diketahui", @@ -1641,8 +1672,5 @@ "verboseLogging": "Penebangan kata demi kata", "versionTitle": "Versi", "wrongPassword": "Kata sandi salah", - "yes": "Ya", - "renewSecretsDialogTitle" : "Memperbarui Rahasia Token", - "renewSecretsDialogText" : "Anda dapat memperbarui rahasia token. Hal ini berguna jika Anda mencurigai bahwa rahasia tersebut telah dibobol. Karena token kontainer dikirimkan dalam bentuk terenkripsi dan rahasia disimpan dengan aman di perangkat. Satu-satunya kasus yang diketahui di mana hal ini dapat terjadi adalah jika token diluncurkan sebelum kontainer melalui kode QR.", - "renewSecrets" : "Memperbarui rahasia" + "yes": "Ya" } \ No newline at end of file diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 02a772ba0..fb00a4190 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -1092,7 +1092,13 @@ "description": "Title of the screen where the user can select the token import type." }, "@selectTokensToExport": { - "description": "Title of the screen where the user can select the tokens to export." + "description": "Title of the screen where the user can select the tokens to export.", + "placeholders": { + "count": { + "example": "5", + "type": "int" + } + } }, "@selectTokensToExportHelpContent1": { "description": "Tells the user why some tokens are not exportable." @@ -1351,10 +1357,15 @@ "confirmation": "Bevestiging", "connectionFailed": "Verbinding mislukt.", "container": "Container", + "containerAddTitle": "Container toevoegen", "containerAlreadyExists": "Container bestaat al", "containerDetails": "Containergegevens", + "containerRolloutSendDeviceInfoContent": "Wil je de uitgever van de container vertellen welk apparaat je gebruikt? Dit kan later handig zijn als je problemen hebt met je tweede factor.", + "containerRolloutSendDeviceInfoTitle": "Apparaatinformatie verzenden", "containerSerial": "Container serie", "containerSyncUrl": "Url voor containersynchronisatie", + "containerTransferAborted": "Containeroverdracht afgebroken.", + "containerTransferDeleteTokens": "Van dit apparaat verwijderen", "continueButton": "Ga verder", "copyOTPToClipboard": "Kopieer OTP naar klembord", "couldNotConnectToServer": "Kan geen verbinding maken met de server.", @@ -1375,8 +1386,10 @@ "decryptErrorDeleteConfirmationContent": "Weet je zeker dat je de app-gegevens wilt verwijderen?", "decryptErrorTitle": "Fout bij decoderen", "delete": "Verwijderen", + "deleteAll": "Alles verwijderen", "deleteContainerDialogContent": "Als u deze container verwijdert, wordt de smartphone losgekoppeld van de privacyIDEA server en worden de tokens in deze container onbruikbaar. Controleer voor het verwijderen of de bijbehorende tokens niet meer nodig zijn!", "deleteContainerDialogTitle": "Container verwijderen {serial}", + "deleteCorrespondingTokenDialogContent": "Wilt u de bijbehorende tokens ook verwijderen?", "deleteLockedToken": "Verifieer om het vergrendelde token te verwijderen.", "details": "Details", "deviceCredentialsRequiredTitle": "Inloggevens van het apparaat zijn niet ingesteld", @@ -1391,6 +1404,8 @@ "encoding": "Codering", "enterDetailsForToken": "Voer informatie over token in", "enterLink": "Link invoeren", + "enterPassphrase": "Passphrase invoeren", + "enterPassphraseHint": "Wachtwoordzin", "enterPasswordToEncrypt": "Voer een wachtwoord in om de tokens te versleutelen. Dit wachtwoord is vereist om de tokens te importeren.", "errorLogCleared": "Foutenlogboek gewist.", "errorLogEmpty": "Het foutenlogboek is leeg.", @@ -1463,6 +1478,7 @@ "importNTokens": "{count, plural, zero{Geen tokens importeren} one{Eén token importeren} other{Importeer {count} tokens}}", "importNewToken": "{count, plural, zero{Er is geen nieuw token gevonden.} one{Er is een nieuw token gevonden dat geïmporteerd kan worden.} other{Er zijn {count} nieuwe tokens gevonden die geïmporteerd kunnen worden.}}", "importTokens": "Importer un jeton", + "importantInformationTitle": "Belangrijke informatie", "importedVia": "Geïmporteerd via", "increaseCounter": "Verhoog teller", "internalServerError": "Interne serverfout ({code})", @@ -1490,6 +1506,7 @@ "legacySigningErrorMessage": "Het token is aangemaakt in een verouderde versie van de app, wat kan leiden tot problemen bij het gebruik ervan.\nHet wordt aanbevolen om een nieuw push token aan te maken als het probleem zich blijft voordoen!", "legacySigningErrorTitle": "Er is een fout opgetreden bij het gebruik van het verouderde token: {tokenLabel}", "licensesAndVersion": "Licenties en versie", + "linkHomeWidget": "Home-widget koppelen", "linkMustOtpAuth": "De link moet beginnen met otpauth://", "linkedContainer": "Gekoppelde container", "lock": "Vergrendel", @@ -1508,7 +1525,7 @@ "noNetworkConnection": "Geen netwerkverbinding.", "noPublicKey": "Geen openbare sleutel beschikbaar", "noResultText1": "Tik op ", - "noResultText2": " de knop om te beginnen!", + "noResultText2": "de knop om te beginnen!", "noResultTitle": "Nog geen token opgeslagen.", "noTokenToExport": "Geen token beschikbaar voor export", "noTokenToImport": "Geen token gevonden om te importeren", @@ -1559,6 +1576,7 @@ "pushEndpointUrl": "Push Endpoint URL", "pushRequestParseError": "Het pushverzoek kon niet worden verwerkt.", "pushToken": "Push Token", + "pushTokensViewTitle": "Push tokens", "qrFileDecodeError": "Het was niet mogelijk om de QR code te decoderen van de geselecteerde afbeelding, gebruik in plaats daarvan de QR code scanner.", "qrInFileNotFound": "Er is geen QR code gevonden in de geselecteerde afbeelding.", "qrInFileNotFound2": "U kunt mij laten zien waar de QR code is.", @@ -1567,6 +1585,9 @@ "rename": "Wijzigen", "renameToken": "Hernoem token", "renameTokenFolder": "Map hernoemen", + "renewSecrets": "Geheimen vernieuwen", + "renewSecretsDialogText": "Je kunt de geheimen van de tokens vernieuwen. Dit is handig als je vermoedt dat de geheimen gecompromitteerd zijn. De tokens worden versleuteld verzonden en de geheimen worden veilig opgeslagen op het apparaat. Het enige bekende geval waarin dit zou kunnen gebeuren, is als de token vóór de container werd uitgerold via een QR-code.", + "renewSecretsDialogTitle": "Token geheimen vernieuwen", "replaceButton": "vervangen", "requestInfo": "Verzonden door {issuer} voor uw account: \"{account}\"", "requestPushChallengesPeriodically": "Activeer het zoeken naar berichten. Gebruik deze optie wanneer de push berichten niet worden ontvangen.", @@ -1596,7 +1617,7 @@ "selectTokensToExportHelpContent1": "Als een token niet in de lijst staat, is het niet gegarandeerd dat het geen privacyIDEA token is.", "selectTokensToExportHelpContent2": "Momenteel kunnen alleen handmatig toegevoegde en geïmporteerde tokens worden geëxporteerd.", "selectTokensToExportHelpContent3": "We werken aan een oplossing om onderscheid te maken tussen privacyIDEA tokens en privé tokens.", - "selectTokensToExportHelpContent4": " Je kunt een nieuwe QR code krijgen van de dienst waarvan je het token hebt ontvangen.", + "selectTokensToExportHelpContent4": "Je kunt een nieuwe QR code krijgen van de dienst waarvan je het token hebt ontvangen.", "selectTokensToExportHelpTitle": "Staat jouw token er niet bij?", "send": "verzenden", "sendErrorDialogBody": "Een onverwachte fout heeft plaatsgevonden in de applicatie. De onderstaande informatie kan worden verstuurd naar de ontwikkelaars via e-mail om het probleem in de toekomst te voorkomen.", @@ -1610,6 +1631,7 @@ "showPrivacyPolicy": "Privacybeleid tonen", "signInTitle": "Authenticatie vereist", "someTokensDoNotSupportPolling": "Sommige tokens zijn verouderd en ondersteunen geen actief zoeken", + "startTransfer": "Overdracht starten", "statusCode": "Statuscode: {statusCode}", "sync": "Synchroniseer", "syncContainerFailed": "Container synchronisatie mislukt", @@ -1633,6 +1655,13 @@ "tokensAreEncrypted": "De tokens zijn gecodeerd. Voer het wachtwoord in om ze te decoderen.", "tokensDoNotSupportSynchronization": "Voor de volgende tokens wordt synchroniseren niet ondersteunt, ze moeten opnieuw worden aangeleverd:", "tokensSuccessfullyDecrypted": "De tokens zijn succesvol gedecodeerd en kunnen nu worden geïmporteerd.", + "transferContainerDialogContent1": "U kunt de container overzetten naar een ander apparaat. De container wordt overgezet via een QR-code.", + "transferContainerDialogContent2": "Voor dit proces is een actieve internetverbinding vereist.", + "transferContainerDialogTitle": "Container overzetten", + "transferContainerFailed": "De overdracht is niet gestart.", + "transferContainerScanQrCode": "Scan de QR-code op het nieuwe apparaat om de container over te zetten.", + "transferContainerSuccessDialogContent1": "De container is succesvol overgezet naar een ander apparaat.", + "transferContainerSuccessDialogContent2": "Wilt u de container en de bijbehorende tokens van dit apparaat verwijderen?", "type": "Type", "unexpectedError": "Er is een onverwachte fout opgetreden.", "unknown": "Onbekend", @@ -1645,8 +1674,5 @@ "verboseLogging": "Verbose loggen", "versionTitle": "Versie", "wrongPassword": "Onjuist wachtwoord", - "yes": "Ja", - "renewSecretsDialogTitle" : "Token geheimen vernieuwen", - "renewSecretsDialogText" : "Je kunt de geheimen van de tokens vernieuwen. Dit is handig als je vermoedt dat de geheimen gecompromitteerd zijn. De tokens worden versleuteld verzonden en de geheimen worden veilig opgeslagen op het apparaat. Het enige bekende geval waarin dit zou kunnen gebeuren, is als de token vóór de container werd uitgerold via een QR-code.", - "renewSecrets" : "Geheimen vernieuwen" + "yes": "Ja" } \ No newline at end of file diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index aae6bde99..8e28d2b27 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -1092,7 +1092,13 @@ "description": "Title of the screen where the user can select the token import type." }, "@selectTokensToExport": { - "description": "Title of the screen where the user can select the tokens to export." + "description": "Title of the screen where the user can select the tokens to export.", + "placeholders": { + "count": { + "example": "5", + "type": "int" + } + } }, "@selectTokensToExportHelpContent1": { "description": "Tells the user why some tokens are not exportable." @@ -1307,8 +1313,8 @@ "a11yCloseSearchTokensButton": "Zamknij wyszukiwanie", "a11yLicensesButton": "Licencja", "a11yPushTokensButton": "Tokeny push", - "a11yScanQrCodeButton": " Skanowanie kodu QR", - "a11yScanQrCodeViewActive": " Widok skanowania kodów QR. Cammera jest aktywna", + "a11yScanQrCodeButton": "Skanowanie kodu QR", + "a11yScanQrCodeViewActive": "Widok skanowania kodów QR. Cammera jest aktywna", "a11yScanQrCodeViewFlashlightOff": "Stuknij, aby włączyć latarkę.", "a11yScanQrCodeViewFlashlightOn": "Stuknij, aby wyłączyć latarkę.", "a11yScanQrCodeViewGallery": "Otwórz galerię", @@ -1351,10 +1357,15 @@ "confirmation": "potwierdzenie", "connectionFailed": "Połączenie nie powiodło się.", "container": "Pojemnik", + "containerAddTitle": "Dodaj kontener", "containerAlreadyExists": "Kontener już istnieje", "containerDetails": "Szczegóły kontenera", + "containerRolloutSendDeviceInfoContent": "Czy chcesz poinformować wydawcę kontenera, z jakiego urządzenia korzystasz? Może to być przydatne później, jeśli wystąpią problemy z drugim czynnikiem.", + "containerRolloutSendDeviceInfoTitle": "Wyślij informacje o urządzeniu", "containerSerial": "Pojemnik szeregowy", "containerSyncUrl": "Adres URL synchronizacji kontenera", + "containerTransferAborted": "Transfer kontenera został przerwany.", + "containerTransferDeleteTokens": "Usuń z tego urządzenia", "continueButton": "Kontynuuj", "copyOTPToClipboard": "Kopiowanie OTP do schowka", "couldNotConnectToServer": "Nie można połączyć się z serwerem.", @@ -1375,9 +1386,12 @@ "decryptErrorDeleteConfirmationContent": "Czy na pewno chcesz usunąć dane aplikacji?", "decryptErrorTitle": "Decryption error", "delete": "Usuń", + "deleteAll": "Usuń wszystko", "deleteContainerDialogContent": "Jeśli usuniesz ten kontener, smartfon zostanie odłączony od serwera privacyIDEA, a tokeny w tym kontenerze staną się bezużyteczne. Przed usunięciem upewnij się, że odpowiednie tokeny nie są już potrzebne!", "deleteContainerDialogTitle": "Usuwanie kontenera {serial}", + "deleteCorrespondingTokenDialogContent": "Czy chcesz usunąć również odpowiednie tokeny?", "deleteLockedToken": "Uwierzytelnij, aby usunąć zablokowany token.", + "deleteOnlyContainer": "Tylko kontener", "details": "Szczegóły", "deviceCredentialsRequiredTitle": "Ustawienia zabezpieczeń urządzenia nie zostały skonfigurowane.", "deviceCredentialsSetupDescription": "Skonfiguruj ustawienia zabezpieczeń w ustawieniach urządzenia.", @@ -1391,6 +1405,8 @@ "encoding": "Kodowanie", "enterDetailsForToken": "Wprowadź szczegóły dla tokenu", "enterLink": "Wprowadź link", + "enterPassphrase": "Wprowadź hasło", + "enterPassphraseHint": "Hasło", "enterPasswordToEncrypt": "Wprowadź hasło, aby zaszyfrować tokeny. To hasło będzie wymagane do importu tokenów.", "errorLogCleared": "Dziennik błędów wyczyszczony.", "errorLogEmpty": "Dziennik błędów jest pusty", @@ -1463,6 +1479,7 @@ "importNTokens": "{count, plural, zero{Nie importuj tokenów} one{Importuj jeden token} other{Import {count} tokenów}}", "importNewToken": "{count, plural, zero{Nie znaleziono nowego tokena.} one{Znaleziono nowy token, który można zaimportować.} other{Znaleziono {count} nowych tokenów, które można zaimportować.}}", "importTokens": "Token importu", + "importantInformationTitle": "Ważne informacje", "importedVia": "Importowane przez", "increaseCounter": "Zwiększ licznik", "internalServerError": "Wewnętrzny błąd serwera ({code})", @@ -1481,15 +1498,16 @@ "invalidQrScan": "Zeskanowany kod QR nie jest prawidłową kopią zapasową {appName}.", "invalidUrl": "Nieprawidłowy adres URL", "invalidValue": "Typ {type} '{value}' nie jest prawidłowy dla '{parameter}'.", - "invalidValueIn": " Typ {type} '{value}' jest nieprawidłowy dla '{parameter}' w '{map}'.", + "invalidValueIn": "Typ {type} '{value}' jest nieprawidłowy dla '{parameter}' w '{map}'.", "isExpotableQuestion": "Czy można eksportować?", "isPiTokenQuestion": "To jest token privacyIDEA?", - "issuer": " Wydawca", + "issuer": "Wydawca", "issuerLabel": "Wydawca: {name}", "language": "Język", "legacySigningErrorMessage": "Token został utworzony w nieaktualnej wersji aplikacji, co może prowadzić do problemów podczas korzystania z niego.\nZaleca się utworzenie nowego tokena push, jeśli problem nadal występuje!", "legacySigningErrorTitle": "Wystąpił błąd podczas korzystania z przestarzałego tokena: {tokenLabel}", "licensesAndVersion": "Licencje i wersja", + "linkHomeWidget": "Link do widżetu głównego", "linkMustOtpAuth": "Link musi zaczynać się od otpauth://", "linkedContainer": "Połączony pojemnik", "lock": "Zablokuj", @@ -1508,7 +1526,7 @@ "noNetworkConnection": "Brak połączenia sieciowego.", "noPublicKey": "Brak dostępnego klucza publicznego", "noResultText1": "Dotknij ", - "noResultText2": " przycisku, żeby zacząć!", + "noResultText2": "przycisku, żeby zacząć!", "noResultTitle": "Nie zainstalowano jeszcze żadnego tokenu.", "noTokenToExport": "Brak tokena dostępnego do eksportu", "noTokenToImport": "Nie znaleziono tokenu do zaimportowania", @@ -1559,6 +1577,7 @@ "pushEndpointUrl": "Adres URL punktu końcowego push", "pushRequestParseError": "Żądanie push nie mogło zostać przetworzone.", "pushToken": "Push token", + "pushTokensViewTitle": "Push-Tokeny", "qrFileDecodeError": "Nie można było zdekodować kodu QR z wybranego obrazu, zamiast tego użyj skanera kodów QR.", "qrInFileNotFound": "Nie znaleziono kodu QR na wybranym obrazie.", "qrInFileNotFound2": "Możesz pokazać mi, gdzie znajduje się kod QR.", @@ -1567,6 +1586,9 @@ "rename": "Zmień nazwę", "renameToken": "Zmień nazwę tokenu", "renameTokenFolder": "Zmiana nazwy folderu", + "renewSecrets": "Odnów sekrety", + "renewSecretsDialogText": "Możesz odnowić sekrety tokenów. Jest to przydatne w przypadku podejrzenia, że sekrety zostały naruszone. Ponieważ tokeny kontenera są przesyłane w postaci zaszyfrowanej, a sekrety są bezpiecznie przechowywane na urządzeniu. Jedynym znanym przypadkiem, w którym mogłoby do tego dojść, byłoby rozwinięcie tokena przed kontenerem za pomocą kodu QR.", + "renewSecretsDialogTitle": "Odnawianie sekretów tokenów", "replaceButton": "Wymienić", "requestInfo": "Wysłane przez {issuer} dla twojego konta: \"{account}\"", "requestPushChallengesPeriodically": "Wysyłaj zapytanie o push challenge cyklicznie. Włącz, jeśli push nie przychodzi normalnie.", @@ -1610,6 +1632,7 @@ "showPrivacyPolicy": "Pokaż politykę prywatności", "signInTitle": "Wymagana autentykacja", "someTokensDoNotSupportPolling": "Część tokenów jest przestarzała i nie wspiera aktywnego zapytania dla autentykacji przez wiadomość push.", + "startTransfer": "Rozpocznij transfer", "statusCode": "Kod statusu: {statusCode}", "sync": "Synchronizuj", "syncContainerFailed": "Synchronizacja kontenera nie powiodła się", @@ -1633,6 +1656,13 @@ "tokensAreEncrypted": "Tokeny są zaszyfrowane. Wprowadź hasło, aby je odszyfrować", "tokensDoNotSupportSynchronization": "Następujące tokeny nie wspierają synchronizacji i muszą zostać wdrożone od nowa:", "tokensSuccessfullyDecrypted": "Tokeny zostały pomyślnie odszyfrowane i można je teraz zaimportować.", + "transferContainerDialogContent1": "Możesz przenieść kontener na inne urządzenie. Kontener jest przesyłany za pomocą kodu QR.", + "transferContainerDialogContent2": "Do tego procesu wymagane jest aktywne połączenie internetowe.", + "transferContainerDialogTitle": "Transfer kontenera", + "transferContainerFailed": "Nie udało się rozpocząć transferu.", + "transferContainerScanQrCode": "Zeskanuj kod QR na nowym urządzeniu, aby przesłać kontener.", + "transferContainerSuccessDialogContent1": "Kontener został pomyślnie przeniesiony na inne urządzenie.", + "transferContainerSuccessDialogContent2": "Czy chcesz usunąć kontener i odpowiadające mu tokeny z tego urządzenia?", "type": "Typ", "unexpectedError": "Wystąpił nieoczekiwany błąd.", "unknown": "Nieznany", @@ -1645,8 +1675,5 @@ "verboseLogging": "Wyczerpujące rejestrowanie", "versionTitle": "Wersja", "wrongPassword": "Nieprawidłowe hasło", - "yes": "Tak", - "renewSecretsDialogTitle" : "Odnawianie sekretów tokenów", - "renewSecretsDialogText" : "Możesz odnowić sekrety tokenów. Jest to przydatne w przypadku podejrzenia, że sekrety zostały naruszone. Ponieważ tokeny kontenera są przesyłane w postaci zaszyfrowanej, a sekrety są bezpiecznie przechowywane na urządzeniu. Jedynym znanym przypadkiem, w którym mogłoby do tego dojść, byłoby rozwinięcie tokena przed kontenerem za pomocą kodu QR.", - "renewSecrets" : "Odnów sekrety" + "yes": "Tak" } \ No newline at end of file diff --git a/lib/model/tokens/hotp_token.dart b/lib/model/tokens/hotp_token.dart index 564ac9406..f018873a1 100644 --- a/lib/model/tokens/hotp_token.dart +++ b/lib/model/tokens/hotp_token.dart @@ -143,7 +143,7 @@ class HOTPToken extends OTPToken { OTP_AUTH_ALGORITHM: stringToAlgorithmsValidatorNullable, OTP_AUTH_DIGITS: intValidatorNullable, OTP_AUTH_SECRET_BASE32: base32SecretValidatorNullable, - OTP_AUTH_COUNTER: intValidatorNullable, + OTP_AUTH_COUNTER: otpAuthCounterValidator, OTP_AUTH_IMAGE: const ObjectValidatorNullable(), OTP_AUTH_PIN: boolValidatorNullable, }, diff --git a/lib/processors/scheme_processors/token_import_scheme_processors/otp_auth_processor.dart b/lib/processors/scheme_processors/token_import_scheme_processors/otp_auth_processor.dart index e993ee9d6..87d23da08 100644 --- a/lib/processors/scheme_processors/token_import_scheme_processors/otp_auth_processor.dart +++ b/lib/processors/scheme_processors/token_import_scheme_processors/otp_auth_processor.dart @@ -241,67 +241,3 @@ String _parseTokenType(Uri uri) { name: OTP_AUTH_TYPE, ); } - - -/* - - - - validateMap(queryParameters, { - OTP_AUTH_SECRET: validator(transformer: (v) => Encodings.base32.decode(v)), - OTP_AUTH_PIN: const validator(isOptional: true), - OTP_AUTH_IMAGE: const validator(isOptional: true), - OTP_AUTH_ALGORITHM: validator(transformer: (v) => Algorithms.values.byName(v), isOptional: true), - OTP_AUTH_DIGITS: validator(transformer: (v) => int.parse(v), isOptional: true), - OTP_AUTH_COUNTER: validator(transformer: (v) => int.parse(v), isOptional: true), - OTP_AUTH_PERIOD: validator(transformer: (v) => int.parse(v), isOptional: true), - }); - - - - - - - - -Map _parsePiPushToken(Uri uri) { - // otpauth://pipush/LABELTEXT? - // url=https://privacyidea.org/enroll/this/token - // &ttl=120 - // &issuer=privacyIDEA - // &enrollment_credential=9311ee50678983c0f29d3d843f86e39405e2b427 - // &v=1 - // &serial=PIPU0006EF87 - // &sslverify=1 - - -// Validate map for Push token - validateMap(queryParameters, { - OTP_AUTH_SECRET: const validator(), - OTP_AUTH_ALGORITHM: const validator(), - OTP_AUTH_SERIEL: const validator(), - OTP_AUTH_LABEL: const validator(isOptional: true), - OTP_AUTH_ISSUER: const validator(isOptional: true), - OTP_AUTH_PIN: const validator(isOptional: true), - OTP_AUTH_VERSION: stringToIntvalidator, - OTP_AUTH_TTL: stringToIntvalidatorOptional, - OTP_AUTH_IMAGE: validator(transformer: (v) => Uri.parse(v), isOptional: true), - OTP_AUTH_URL: validator(transformer: (v) => Uri.parse(v), isOptional: false), - }); - - final pushVersion = queryParameters[OTP_AUTH_VERSION]! as int; - - if (pushVersion > maxPushTokenVersion) { - throw LocalizedArgumentError( - localizedMessage: (localizations, value, name) => localizations.unsupported(value, name), - unlocalizedMessage: 'The piauth version [$pushVersionAsString] is not supported by this version of the app.', - invalidValue: pushVersionAsString, - name: 'piauth version', - ); - } - // String ttlAsString = queryParameters[OTP_AUTH_TTL] ?? '10'; - // uriMap[URI_SSL_VERIFY] = (queryParameters[OTP_AUTH_SSL_VERIFY] ?? '1') == '1'; - - - - */ \ No newline at end of file diff --git a/lib/utils/object_validator.dart b/lib/utils/object_validator.dart index 69d15f50d..ed7536e5e 100644 --- a/lib/utils/object_validator.dart +++ b/lib/utils/object_validator.dart @@ -37,7 +37,10 @@ final otpAuthDigitsValidator = ObjectValidator( allowedValues: (p0) => p0 > 0, ); final otpAuthCounterValidator = ObjectValidator( - transformer: (v) => int.parse(v), + transformer: (v) { + if (v is int) return v; + return int.parse(v); + }, allowedValues: (v) => v >= 0, ); diff --git a/lib/utils/pi_mailer.dart b/lib/utils/pi_mailer.dart index f360d0d21..e61fa9622 100644 --- a/lib/utils/pi_mailer.dart +++ b/lib/utils/pi_mailer.dart @@ -55,16 +55,19 @@ class PiMailer { } on PlatformException catch (e, stackTrace) { if (e.code == 'UNAVAILABLE') { showAsyncDialog( - builder: (context) => DefaultDialog( - title: Text(AppLocalizations.of(context)!.noMailAppTitle), - content: Text(AppLocalizations.of(context)!.noMailAppDescription), - actions: [ - TextButton( - onPressed: () => Navigator.pop(context), - child: const Text('OK'), - ), - ], - ), + builder: (context) { + final AppLocalizations appLocalizations = AppLocalizations.of(context)!; + return DefaultDialog( + title: Text(appLocalizations.noMailAppTitle), + content: Text(appLocalizations.noMailAppDescription), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(appLocalizations.ok), + ), + ], + ); + }, ); return false; } diff --git a/lib/views/container_view/container_widgets/container_actions/delete_container_action_dialog.dart b/lib/views/container_view/container_widgets/container_actions/delete_container_action_dialog.dart index ff4e05cc5..f8403e87b 100644 --- a/lib/views/container_view/container_widgets/container_actions/delete_container_action_dialog.dart +++ b/lib/views/container_view/container_widgets/container_actions/delete_container_action_dialog.dart @@ -69,13 +69,14 @@ class DeleteCorrespondingTokenDialog extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final AppLocalizations appLocalizations = AppLocalizations.of(context)!; return DefaultDialog( title: Text(AppLocalizations.of(context)!.deleteContainerDialogTitle(container.serial)), - content: Text('Do you want to delete the corresponding tokens as well?'), // Text(AppLocalizations.of(context)!.deleteCorrespondingTokenDialogContent), + content: Text(appLocalizations.deleteCorrespondingTokenDialogContent), hasCloseButton: true, actions: [ ElevatedDeleteButton( - text: 'Only Container', + text: appLocalizations.deleteOnlyContainer, onPressed: () async { await _deleteContainer(ref); if (!context.mounted) return; @@ -90,7 +91,7 @@ class DeleteCorrespondingTokenDialog extends ConsumerWidget { if (!context.mounted) return; Navigator.of(context).pop(); }, - text: 'Delete All', + text: appLocalizations.deleteAll, ), ], ); diff --git a/lib/views/container_view/container_widgets/container_actions/transfer_container_action_dialog.dart b/lib/views/container_view/container_widgets/container_actions/transfer_container_action_dialog.dart index 5da8fa860..5e505aa9f 100644 --- a/lib/views/container_view/container_widgets/container_actions/transfer_container_action_dialog.dart +++ b/lib/views/container_view/container_widgets/container_actions/transfer_container_action_dialog.dart @@ -20,6 +20,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:privacyidea_authenticator/l10n/app_localizations.dart'; import '../../../../../../../model/token_container.dart'; import '../../../../../../../utils/view_utils.dart'; @@ -40,24 +41,25 @@ class TransferContainerDialog extends ConsumerStatefulWidget { class _TransferContainerDialogState extends ConsumerState { @override Widget build(BuildContext context) { + final AppLocalizations appLocalizations = AppLocalizations.of(context)!; return DefaultDialog( - title: Text('Transfer Container'), + title: Text(appLocalizations.transferContainerDialogTitle), content: Column( mainAxisSize: MainAxisSize.min, children: [ - Text('When the container is transferred successfully to another device, it will be removed from this device with all its tokens.'), + Text(appLocalizations.transferContainerDialogContent1), SizedBox(height: 8), - Text('For the process is an internet connection required.'), + Text(appLocalizations.transferContainerDialogContent2), ], ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: Text('Close'), + child: Text(appLocalizations.cancel), ), CooldownButton( onPressed: () => _startTransfer(widget.container), - child: Text('Start Transfer'), + child: Text(appLocalizations.startTransfer), ), ], ); @@ -68,8 +70,9 @@ class _TransferContainerDialogState extends ConsumerState DefaultDialog( - title: Text('Transfer Container'), + title: Text(appLocalizations.transferContainerDialogTitle), content: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -85,41 +87,41 @@ class _TransferDeleteContainerDialogState extends ConsumerState DefaultDialog( - title: Text('Transfer Container'), + title: Text(appLocalizations.transferContainerDialogTitle), content: Column( mainAxisSize: MainAxisSize.min, children: [ - Text('The container has been transferred successfully to another device.'), + Text(appLocalizations.transferContainerSuccessDialogContent1), SizedBox(height: 8), - Text('Do you want to delete the container and its corrosponding tokens from this device?'), + Text(appLocalizations.transferContainerSuccessDialogContent2), ], ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: Text('Cancel'), + child: Text(appLocalizations.cancel), ), ElevatedDeleteButton( - text: 'Remove from this device', + text: appLocalizations.containerTransferDeleteTokens, onPressed: () => confirmDeleteLocaly(context), ), ], ), false => DefaultDialog( - title: Text('Transfer Container'), + title: Text(appLocalizations.transferContainerDialogTitle), content: Column( mainAxisSize: MainAxisSize.min, children: [ Padding( padding: const EdgeInsets.all(8.0), - child: Text('Transfer aborted.'), + child: Text(appLocalizations.containerTransferAborted), ), ], ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: Text('Ok'), + child: Text(appLocalizations.ok), ), ], ), diff --git a/lib/views/container_view/container_widgets/container_actions/transfer_dialogs/transfer_qr_dialog.dart b/lib/views/container_view/container_widgets/container_actions/transfer_dialogs/transfer_qr_dialog.dart index f12b7f550..44de64262 100644 --- a/lib/views/container_view/container_widgets/container_actions/transfer_dialogs/transfer_qr_dialog.dart +++ b/lib/views/container_view/container_widgets/container_actions/transfer_dialogs/transfer_qr_dialog.dart @@ -20,6 +20,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import '../../../../../l10n/app_localizations.dart'; import '../../../../../model/token_container.dart'; import '../../../../../utils/utils.dart'; import '../../../../../widgets/dialog_widgets/default_dialog.dart'; @@ -33,12 +34,13 @@ class TransferQrDialog extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final appLocalizations = AppLocalizations.of(context)!; return DefaultDialog( - title: Text('Transfer Container'), + title: Text(appLocalizations.transferContainerDialogTitle), content: Column( mainAxisSize: MainAxisSize.min, children: [ - Text('Scan the QR code with the new device to transfer the container.'), + Text(appLocalizations.transferContainerScanQrCode), SizedBox(height: 8), generateQrCodeImage(data: qrData), SizedBox(height: 8), @@ -57,7 +59,7 @@ class TransferQrDialog extends ConsumerWidget { ), ); }, - child: Text('Close'), + child: Text(appLocalizations.cancel), ), ], ); diff --git a/lib/views/link_home_widget_view/link_home_widget_view.dart b/lib/views/link_home_widget_view/link_home_widget_view.dart index 11a2e9820..cf014361d 100644 --- a/lib/views/link_home_widget_view/link_home_widget_view.dart +++ b/lib/views/link_home_widget_view/link_home_widget_view.dart @@ -20,6 +20,7 @@ import 'package:app_minimizer/app_minimizer.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:privacyidea_authenticator/l10n/app_localizations.dart'; import '../../utils/customization/theme_extentions/extended_text_theme.dart'; import '../../utils/home_widget_utils.dart'; @@ -50,7 +51,7 @@ class _LinkHomeWidgetViewState extends ConsumerState { final otpTokens = ref.watch(tokenProvider).otpTokens; return Scaffold( appBar: AppBar( - title: const Text('Link Home Widget'), + title: Text(AppLocalizations.of(context)!.linkHomeWidget), ), body: ListView.builder( itemBuilder: (context, index) { diff --git a/lib/views/push_token_view/push_tokens_view.dart b/lib/views/push_token_view/push_tokens_view.dart index fb6e4da89..733889da8 100644 --- a/lib/views/push_token_view/push_tokens_view.dart +++ b/lib/views/push_token_view/push_tokens_view.dart @@ -18,6 +18,7 @@ * limitations under the License. */ import 'package:flutter/material.dart'; +import 'package:privacyidea_authenticator/l10n/app_localizations.dart'; import '../../widgets/push_request_listener.dart'; import '../view_interface.dart'; @@ -34,7 +35,7 @@ class PushTokensView extends StatelessView { return Scaffold( resizeToAvoidBottomInset: false, appBar: AppBar( - title: const Text('Push Tokens'), + title: Text(AppLocalizations.of(context)!.pushTokensViewTitle), ), body: PushRequestListener( child: Stack( diff --git a/lib/views/settings_view/settings_groups/settings_group_push_token.dart b/lib/views/settings_view/settings_groups/settings_group_push_token.dart index 773c66abb..ec0cfe719 100644 --- a/lib/views/settings_view/settings_groups/settings_group_push_token.dart +++ b/lib/views/settings_view/settings_groups/settings_group_push_token.dart @@ -164,7 +164,7 @@ class SettingsGroupPushTokenDialog extends ConsumerWidget { child: ListView.separated( shrinkWrap: true, itemCount: unsupported.length, - itemBuilder: (context, index) => Text('${unsupported[index].label}'), + itemBuilder: (context, index) => Text(unsupported[index].label.toString()), separatorBuilder: (context, index) => const Divider(), ), ), diff --git a/lib/widgets/dialog_widgets/add_container_progress_dialog.dart b/lib/widgets/dialog_widgets/add_container_progress_dialog.dart index c25f6c9d4..0ac5a5ccb 100644 --- a/lib/widgets/dialog_widgets/add_container_progress_dialog.dart +++ b/lib/widgets/dialog_widgets/add_container_progress_dialog.dart @@ -49,7 +49,7 @@ class _AddContainerProgressDialogState extends State Widget build(BuildContext context) { return DefaultDialog( hasCloseButton: true, - title: Text('Adding container'), + title: Text(AppLocalizations.of(context)!.containerAddTitle), content: SizedBox( width: double.maxFinite, child: Column( diff --git a/lib/widgets/dialog_widgets/enter_passphrase_dialog.dart b/lib/widgets/dialog_widgets/enter_passphrase_dialog.dart index f6534c7b1..075fca654 100644 --- a/lib/widgets/dialog_widgets/enter_passphrase_dialog.dart +++ b/lib/widgets/dialog_widgets/enter_passphrase_dialog.dart @@ -20,17 +20,21 @@ import 'dart:ui'; import 'package:flutter/material.dart'; +import 'package:privacyidea_authenticator/l10n/app_localizations.dart'; +import 'package:privacyidea_authenticator/utils/view_utils.dart'; +import 'package:privacyidea_authenticator/widgets/dialog_widgets/default_dialog.dart'; class EnterPassphraseDialog extends StatefulWidget { - static Future show(BuildContext context) => showDialog( - context: context, + final String question; + + static Future show(String question) => showAsyncDialog( builder: (context) => BackdropFilter( filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), - child: const EnterPassphraseDialog(), + child: EnterPassphraseDialog(question: question), ), ); - const EnterPassphraseDialog({super.key}); + const EnterPassphraseDialog({super.key, required this.question}); @override State createState() => _EnterPassphraseDialogState(); @@ -41,18 +45,30 @@ class _EnterPassphraseDialogState extends State { @override Widget build(BuildContext context) { - return AlertDialog( - title: const Text('Enter your passphrase'), - content: TextField( - decoration: const InputDecoration(hintText: 'Passphrase'), - onChanged: (value) => setState(() { - text = value; - }), + final AppLocalizations appLocalizations = AppLocalizations.of(context)!; + return DefaultDialog( + title: Text(appLocalizations.enterPassphrase), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(widget.question, style: Theme.of(context).textTheme.bodyLarge), + SizedBox(height: 8), + TextField( + style: Theme.of(context).textTheme.bodyMedium, + decoration: InputDecoration( + labelText: appLocalizations.enterPassphraseHint, + labelStyle: Theme.of(context).textTheme.bodyMedium, + ), + onChanged: (value) => setState(() { + text = value; + }), + ), + ], ), actions: [ TextButton( onPressed: text.isNotEmpty ? () => Navigator.of(context).pop(text) : null, - child: const Text('OK'), + child: Text(appLocalizations.ok), ), ], ); diff --git a/lib/widgets/dialog_widgets/push_request_dialog/AddDeviceInfosDialog.dart b/lib/widgets/dialog_widgets/push_request_dialog/AddDeviceInfosDialog.dart index 34334291e..7476d4021 100644 --- a/lib/widgets/dialog_widgets/push_request_dialog/AddDeviceInfosDialog.dart +++ b/lib/widgets/dialog_widgets/push_request_dialog/AddDeviceInfosDialog.dart @@ -18,6 +18,7 @@ * limitations under the License. */ import 'package:flutter/material.dart'; +import 'package:privacyidea_authenticator/l10n/app_localizations.dart'; import 'package:privacyidea_authenticator/widgets/dialog_widgets/default_dialog.dart'; import '../../../utils/view_utils.dart'; @@ -31,20 +32,21 @@ class SendDeviceInfosDialog extends StatelessWidget { ); @override - Widget build(BuildContext context) => DefaultDialog( - title: Text('Send Device Info'), - content: Text( - 'Would you like to tell the publisher of the container which device you are using? This may be useful later if you have problems with your second factor.', + Widget build(BuildContext context) { + final AppLocalizations appLocalizations = AppLocalizations.of(context)!; + return DefaultDialog( + title: Text(appLocalizations.containerRolloutSendDeviceInfoTitle), + content: Text(appLocalizations.containerRolloutSendDeviceInfoContent), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: Text(appLocalizations.no), ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(false), - child: Text('No'), - ), - TextButton( - onPressed: () => Navigator.of(context).pop(true), - child: Text('Yes'), - ), - ], - ); + TextButton( + onPressed: () => Navigator.of(context).pop(true), + child: Text(appLocalizations.yes), + ), + ], + ); + } }