From 0aadbf4b58bdb1cf17b68155c9273f6817825024 Mon Sep 17 00:00:00 2001 From: xavierchanth Date: Fri, 22 Nov 2024 15:42:07 -0500 Subject: [PATCH 1/5] fix: use a more aggressive handler for SIGINT and SIGCHLD --- packages/c/sshnpd/src/main.c | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/packages/c/sshnpd/src/main.c b/packages/c/sshnpd/src/main.c index 1ab9cd16b..a2baa9f2e 100644 --- a/packages/c/sshnpd/src/main.c +++ b/packages/c/sshnpd/src/main.c @@ -77,32 +77,27 @@ static bool is_child_process = false; // Signal handling static volatile sig_atomic_t should_run = 1; -// static void exit_handler(int sig) { -// atlogger_log("exit_handler", ATLOGGER_LOGGING_LEVEL_WARN, "Received signal: %d\n"); -// if (should_run == 1) { -// atlogger_log("exit_handler", ATLOGGER_LOGGING_LEVEL_WARN, "Received SIGINT, attempting a safe exit\n"); -// should_run = 0; -// } else if (should_run == 0) { -// atlogger_log("exit_handler", ATLOGGER_LOGGING_LEVEL_WARN, "Received SIGINT again, exiting forcefully\n"); -// exit(1); -// } -// } -// static void child_exit_handler(int sig) { -// atlogger_log("child_exit_handler", ATLOGGER_LOGGING_LEVEL_WARN, "Received signal: %d\n"); -// int status; -// pid_t pid = waitpid(-1, &status, WNOHANG); -// if (pid > 0 && WIFEXITED(status)) { -// atlogger_log(LOGGER_TAG, ATLOGGER_LOGGING_LEVEL_DEBUG, "pid %d exited\n", pid); -// } -// } +static void exit_handler(int sig) { + atlogger_log("exit_handler", ATLOGGER_LOGGING_LEVEL_WARN, "Received signal: %d\n", sig); + should_run = 0; + exit(1); +} +static void child_exit_handler(int sig) { + atlogger_log("child_exit_handler", ATLOGGER_LOGGING_LEVEL_WARN, "Received signal: %d\n", sig); + int status; + pid_t pid = waitpid(-1, &status, WNOHANG); + if (pid > 0 && WIFEXITED(status)) { + atlogger_log(LOGGER_TAG, ATLOGGER_LOGGING_LEVEL_DEBUG, "pid %d exited\n", pid); + } +} int main(int argc, char **argv) { int res = 0; int exit_res = 0; // Catch sigint and pass to the handler - // signal(SIGINT, exit_handler); - // signal(SIGCHLD, child_exit_handler); + signal(SIGINT, exit_handler); + signal(SIGCHLD, child_exit_handler); // 1. Load default values apply_default_values_to_sshnpd_params(¶ms); From a574e3f3100ebd59c438538260c8fd2b57c90ead Mon Sep 17 00:00:00 2001 From: xavierchanth Date: Fri, 22 Nov 2024 16:05:30 -0500 Subject: [PATCH 2/5] fix: include sys/wait.h --- packages/c/sshnpd/src/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/c/sshnpd/src/main.c b/packages/c/sshnpd/src/main.c index a2baa9f2e..93f6a6ca0 100644 --- a/packages/c/sshnpd/src/main.c +++ b/packages/c/sshnpd/src/main.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #define FILENAME_BUFFER_SIZE 500 From dc7adadb562e2e84f3e8fc68566bf7f3ac926ec3 Mon Sep 17 00:00:00 2001 From: xavierchanth Date: Mon, 25 Nov 2024 10:21:28 -0500 Subject: [PATCH 3/5] fix: disable root + macos install --- .../dart/sshnoports/bundles/shell/install.sh | 154 +++++++++--------- 1 file changed, 79 insertions(+), 75 deletions(-) diff --git a/packages/dart/sshnoports/bundles/shell/install.sh b/packages/dart/sshnoports/bundles/shell/install.sh index 8dc691bda..19209b1fa 100755 --- a/packages/dart/sshnoports/bundles/shell/install.sh +++ b/packages/dart/sshnoports/bundles/shell/install.sh @@ -5,6 +5,10 @@ is_root() { [ "$(id -u)" -eq 0 ] } +is_darwin() { + [ "$(uname)" = 'Darwin' ] +} + unset binary_dir user_home=$HOME define_env() { @@ -12,6 +16,10 @@ define_env() { bin_dir="/usr/local/bin" systemd_dir="/etc/systemd/system" if is_root; then + if is_darwin; then + echo "Installing as root is not available on MacOS" + exit 1 + fi user="$SUDO_USER" if [ -z "$user" ]; then user="root" @@ -30,10 +38,6 @@ define_env() { user_ssh_dir="$user_home/.ssh" } -is_darwin() { - [ "$(uname)" = 'Darwin' ] -} - sedi() { if is_darwin; then sed -i '' "$@" @@ -237,17 +241,17 @@ systemd() { exit 1 fi case "$1" in - --help) - usage - exit 0 - ;; - sshnpd) install_systemd_sshnpd ;; - srvd) install_systemd_srvd ;; - *) - echo "Unknown systemd unit: $1" - usage - exit 1 - ;; + --help) + usage + exit 0 + ;; + sshnpd) install_systemd_sshnpd ;; + srvd) install_systemd_srvd ;; + *) + echo "Unknown systemd unit: $1" + usage + exit 1 + ;; esac setup_authorized_keys } @@ -281,16 +285,16 @@ launchd() { exit 1 fi case "$1" in - --help) - usage - exit 0 - ;; - sshnpd) install_launchd_sshnpd ;; - *) - echo "Unknown launchd unit: $1" - usage - exit 1 - ;; + --help) + usage + exit 0 + ;; + sshnpd) install_launchd_sshnpd ;; + *) + echo "Unknown launchd unit: $1" + usage + exit 1 + ;; esac setup_authorized_keys } @@ -361,17 +365,17 @@ install_headless_srvd() { headless() { case "$1" in - --help | '') - usage - exit 0 - ;; - sshnpd) install_headless_sshnpd ;; - srvd) install_headless_srvd ;; - *) - echo "Error: Unknown headless job: $1" - usage - exit 1 - ;; + --help | '') + usage + exit 0 + ;; + sshnpd) install_headless_sshnpd ;; + srvd) install_headless_srvd ;; + *) + echo "Error: Unknown headless job: $1" + usage + exit 1 + ;; esac setup_authorized_keys } @@ -442,17 +446,17 @@ install_tmux_srvd() { tmux() { case "$1" in - --help | '') - usage - exit 0 - ;; - sshnpd) install_tmux_sshnpd ;; - srvd) install_tmux_srvd ;; - *) - echo "Unknown tmux service: $1" - usage - exit 1 - ;; + --help | '') + usage + exit 0 + ;; + sshnpd) install_tmux_sshnpd ;; + srvd) install_tmux_srvd ;; + *) + echo "Unknown tmux service: $1" + usage + exit 1 + ;; esac setup_authorized_keys } @@ -466,34 +470,34 @@ main() { while [ $# -gt 0 ]; do case "$1" in - -h) - usage - exit 0 - ;; - -b) - binary_dir="$2" - shift - ;; - -u) - user="$2" - user_home=$(sudo -u "$user" sh -c 'echo $HOME') - shift - ;; - at_activate | npt | sshnp | sshnpd | srv | srvd) install_single_binary "$1" ;; - binaries) install_base_binaries ;; - debug_srvd) install_debug_binary "${1#"debug_"}" ;; # strips debug_ prefix from the command input - debug) install_debug_binaries ;; - all) install_all_binaries ;; - systemd | launchd | headless | tmux) - command=$1 - shift 1 - $command "$@" - ;; - *) - echo "Unknown command: $1" - usage - exit 1 - ;; + -h) + usage + exit 0 + ;; + -b) + binary_dir="$2" + shift + ;; + -u) + user="$2" + user_home=$(sudo -u "$user" sh -c 'echo $HOME') + shift + ;; + at_activate | npt | sshnp | sshnpd | srv | srvd) install_single_binary "$1" ;; + binaries) install_base_binaries ;; + debug_srvd) install_debug_binary "${1#"debug_"}" ;; # strips debug_ prefix from the command input + debug) install_debug_binaries ;; + all) install_all_binaries ;; + systemd | launchd | headless | tmux) + command=$1 + shift 1 + $command "$@" + ;; + *) + echo "Unknown command: $1" + usage + exit 1 + ;; esac shift done From 9a7212d8dc5ee88c4cdbb7fc048ae7ca9196c213 Mon Sep 17 00:00:00 2001 From: Curtly Critchlow Date: Tue, 26 Nov 2024 11:16:20 -0400 Subject: [PATCH 4/5] fix: added localization for untranslated strings. --- .../widgets/activate_atsign_dialog.dart | 31 ++- .../onboarding/widgets/onboarding_button.dart | 53 ++-- .../npt_flutter/lib/localization/app_en.arb | 28 ++- .../npt_flutter/lib/localization/app_es.arb | 234 +++++++++-------- .../npt_flutter/lib/localization/app_pt.arb | 234 +++++++++-------- .../lib/localization/app_pt_BR.arb | 230 +++++++++-------- .../npt_flutter/lib/localization/app_zh.arb | 228 +++++++++-------- .../lib/localization/app_zh_Hans_CH.arb | 36 ++- .../lib/localization/app_zh_Hant_HK.arb | 238 ++++++++++-------- .../lib/widgets/custom_text_button.dart | 6 +- 10 files changed, 725 insertions(+), 593 deletions(-) diff --git a/packages/dart/npt_flutter/lib/features/onboarding/widgets/activate_atsign_dialog.dart b/packages/dart/npt_flutter/lib/features/onboarding/widgets/activate_atsign_dialog.dart index c4cfacefb..179394dcf 100644 --- a/packages/dart/npt_flutter/lib/features/onboarding/widgets/activate_atsign_dialog.dart +++ b/packages/dart/npt_flutter/lib/features/onboarding/widgets/activate_atsign_dialog.dart @@ -2,6 +2,8 @@ import 'dart:convert'; import 'package:at_onboarding_flutter/at_onboarding_flutter.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:npt_flutter/app.dart'; import 'package:npt_flutter/features/onboarding/util/activate_util.dart'; import 'package:npt_flutter/widgets/spinner.dart'; import 'package:pin_code_fields/pin_code_fields.dart'; @@ -46,15 +48,16 @@ class _ActivateAtsignDialogState extends State { _getPinCode(); } + final strings = AppLocalizations.of(App.navState.currentContext!)!; + @override Widget build(BuildContext context) { return AlertDialog( title: Center( child: switch (status) { - // TODO localize - ActivationStatus.preparing => const Text("Preparing for activation"), - ActivationStatus.otpWait => const Text("Please enter the OTP from your email"), - ActivationStatus.activating => const Text("Activating"), + ActivationStatus.preparing => Text(strings.activationStatusPreparing), + ActivationStatus.otpWait => Text(strings.activationStatusOtpWait), + ActivationStatus.activating => Text(strings.activationStatusActivating), }, ), content: SizedBox( @@ -66,7 +69,6 @@ class _ActivateAtsignDialogState extends State { height: 80, child: Column( children: [ - // TODO localize PinCodeTextField( focusNode: pinFocusNode, appContext: context, @@ -128,11 +130,10 @@ class _ActivateAtsignDialogState extends State { } else { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( + SnackBar( backgroundColor: Colors.red, - // TODO localize content: Text( - "Failed to request an OTP, try resending, or contact support if the issue persists", + strings.errorOtpRequestFailed, ), ), ); @@ -144,8 +145,7 @@ class _ActivateAtsignDialogState extends State { Widget get cancelButton => TextButton( key: const Key("NoPortsActivateCancelButton"), - // TODO localize - child: const Text("Cancel"), + child: Text(strings.cancel), onPressed: () { Navigator.of(context).pop(AtOnboardingResult.cancelled()); }, @@ -154,8 +154,7 @@ class _ActivateAtsignDialogState extends State { Widget get resendPinButton => TextButton( key: const Key("NoPortsActivateResendButton"), onPressed: _getPinCode, - // TODO localize - child: const Text("Resend Pin"), + child: Text(strings.resendPin), ); Widget get confirmPinButton => TextButton( @@ -174,11 +173,10 @@ class _ActivateAtsignDialogState extends State { if (cramkey == null) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( + SnackBar( backgroundColor: Colors.red, content: Text( - // TODO localize - "Failed to verify the OTP with the activation server, please try again. Contact support if the issue persists", + strings.errorOtpVerificationFailed, ), ), ); @@ -198,7 +196,6 @@ class _ActivateAtsignDialogState extends State { if (!mounted) return; Navigator.of(context).pop(result); }, - // TODO localize - child: const Text("Confirm"), + child: Text(strings.confirm), ); } diff --git a/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart b/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart index ef34f9081..01c8f40a1 100644 --- a/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart +++ b/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart @@ -2,7 +2,6 @@ import 'dart:developer'; import 'package:at_contacts_flutter/at_contacts_flutter.dart'; import 'package:at_onboarding_flutter/at_onboarding_flutter.dart'; -import 'package:at_onboarding_flutter/at_onboarding_screens.dart'; import 'package:at_onboarding_flutter/at_onboarding_services.dart'; // ignore: implementation_imports import 'package:at_onboarding_flutter/src/utils/at_onboarding_app_constants.dart'; @@ -10,6 +9,7 @@ import 'package:at_server_status/at_server_status.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:npt_flutter/app.dart'; import 'package:npt_flutter/constants.dart'; import 'package:npt_flutter/features/onboarding/onboarding.dart'; import 'package:npt_flutter/features/onboarding/util/atsign_manager.dart'; @@ -17,10 +17,10 @@ import 'package:npt_flutter/features/onboarding/util/onboarding_util.dart'; import 'package:npt_flutter/features/onboarding/widgets/activate_atsign_dialog.dart'; import 'package:npt_flutter/features/onboarding/widgets/onboarding_dialog.dart'; import 'package:npt_flutter/routes.dart'; - import 'package:path_provider/path_provider.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; +final strings = AppLocalizations.of(App.navState.currentContext!)!; Future loadAtClientPreference(String rootDomain) async { var dir = await getApplicationSupportDirectory(); @@ -71,10 +71,8 @@ class _OnboardingButtonState extends State { ), iconAlignment: IconAlignment.end, ), - // TODO: localize - _OnboardingButtonStatus.picking => const Text("Waiting for file to be picked"), - // TODO: localize - _OnboardingButtonStatus.processingFile => const Text("Processing file"), + _OnboardingButtonStatus.picking => Text(strings.onboardingButtonStatusPicking), + _OnboardingButtonStatus.processingFile => Text(strings.onboardingButtonStatusProcessingFile), }; } @@ -167,12 +165,12 @@ class _OnboardingButtonState extends State { Future handleAtsignByStatus(String atsign, NoPortsOnboardingUtil util) async { AtStatus status; + try { status = await util.atServerStatus(atsign); } catch (_) { return AtOnboardingResult.error( - // TODO localize - message: "Failed to retrieve the atserver status, make sure you have a stable internet connection", + message: strings.errorAtServerUnavailable, ); } AtOnboardingResult? result; @@ -185,8 +183,7 @@ class _OnboardingButtonState extends State { if (apiKey == null) { result = AtOnboardingResult.error( - // TODO localize - message: "The atSign you have requested, doesn't exist in this root domain", + message: strings.errorAtSignNotExist, ); break; } @@ -202,8 +199,7 @@ class _OnboardingButtonState extends State { var regUrl = apis[util.config.atClientPreference.rootDomain]; if (regUrl == null) { result ??= AtOnboardingResult.error( - // TODO: localize - message: "The specified root domain is not supported by automatic activation.", + message: strings.errorRootDomainNotSupported, ); break; } @@ -224,7 +220,7 @@ class _OnboardingButtonState extends State { var onboardingService = OnboardingService.getInstance(); bool res = await onboardingService.changePrimaryAtsign(atsign: result.atsign!); if (!res) { - result = AtOnboardingResult.error(message: "Failed to switch atSigns after activation"); + result = AtOnboardingResult.error(message: strings.errorSwitchAtSignFailed); } } } @@ -237,20 +233,16 @@ class _OnboardingButtonState extends State { result = await handleFileUploadStatusStream(statusStream, atsign); case AtSignStatus.notFound: result = AtOnboardingResult.error( - // TODO: localize - message: "The atSign you have requested, doesn't exist in this root domain", + message: strings.errorAtSignNotExist, ); case AtSignStatus.unavailable: result = AtOnboardingResult.error( - // TODO: localize - message: "The atSign is unavailable. Make sure you have pressed \"Activate\" from your dashboard " - "and have a stable internet connection.", + message: strings.errorAtServerUnavailable, ); case null: // This case should never happen, treat it as an error case AtSignStatus.error: result = AtOnboardingResult.error( - // TODO: localize - message: "Failed to retrieve the atserver status", + message: strings.errorAtServerUnavailable, ); } return result; @@ -265,44 +257,37 @@ class _OnboardingButtonState extends State { switch (status) { case ErrorIncorrectKeyFile(): result = AtOnboardingResult.error( - // TODO: localize - message: "Invalid atKeys file detected", + message: strings.errorAtKeysInvalid, ); break outer; case ErrorAtSignMismatch(): result = AtOnboardingResult.error( - // TODO: localize - message: "The atKeys file you uploaded did not match the atSign requested", + message: strings.errorAtKeysUploadedMismatch, ); break outer; case ErrorFailedFileProcessing(): result = AtOnboardingResult.error( - // TODO: localize - message: "Failed to process the atKeys file", + message: strings.errorAtKeysFileProcessFailed, ); break outer; case ErrorAtServerUnreachable(): result = AtOnboardingResult.error( - // TODO: localize - message: "Unable to connect to the atServer, make sure you have a stable internet connection", + message: strings.errorAtServerUnavailable, ); break outer; case ErrorAuthFailed(): result = AtOnboardingResult.error( - // TODO: localize - message: "Authentication failed", + message: strings.errorAuthenticatinFailed, ); break outer; case ErrorAuthTimeout(): result = AtOnboardingResult.error( - // TODO: localize - message: "Authentication timed out", + message: strings.errorAuthenticationTimedOut, ); break outer; case ErrorPairedAtsign _: result = AtOnboardingResult.error( - // TODO: localize - message: "The atSign ${status.atSign ?? atsign} is already paired, please contact support.", + message: strings.errorAtSignAlreadyPaired(status.atSign ?? atsign), ); break outer; case FilePickingInProgress(): diff --git a/packages/dart/npt_flutter/lib/localization/app_en.arb b/packages/dart/npt_flutter/lib/localization/app_en.arb index e5b5b834e..b0dee2030 100644 --- a/packages/dart/npt_flutter/lib/localization/app_en.arb +++ b/packages/dart/npt_flutter/lib/localization/app_en.arb @@ -34,7 +34,7 @@ "europe" : "Europe", "export" : "Export", "exportLogs" : "Export Logs", - "faq" : "faq", + "faq" : "FAQ", "feedback" : "Feedback", "fileFormatInvalid" : "The document format is invalid. Please upload a valid file.", "fileFormatInvalidDetails" : "The profiles section is missing or incorrectly formatted. Please check the document.", @@ -68,7 +68,7 @@ "profileFailedSaveMessage": "Profile failed to save", "profileFailedUnknownMessage" : "No reason provided", "profileName" : "Profile Name", - "profileNameDescription" : "This will be the name of you configurations", + "profileNameDescription" : "This will be the name of your configurations", "profileRunningActionDeniedMessage" : "Cannot perform this action while profile is running", "profileStatusFailedLoad": "Failed to load", "profileStatusFailedSave": "Failed to Save", @@ -83,7 +83,7 @@ "quit": "Quit", "refresh" : "Refresh", "relay" : "Relay", - "relayDescription" : "You can pick from our existing RV''s or create a new one", + "relayDescription" : "Choose from our existing relays or create a new one.", "remoteHost" : "Remote Host", "remoteHostDescription" : "", "remotePort" : "Remote Port", @@ -109,5 +109,27 @@ "validationErrorLongField" : "Field must be 1-36 characters long", "validationErrorRemoteHostField" : "Field must be partially or fully qualified hostname or an IP address", "validationErrorRemotePortField" : "Field must be between 1-65535", + "onboardingButtonStatusPicking" : "Waiting for file to be picked", + "onboardingButtonStatusProcessingFile" : "Processing file", + "errorAtServerUnavailable": "Failed to retrieve the atserver status, make sure you have a stable internet connection", + "errorAtSignNotExist" : "The atSign you have requested, doesn't exist in this root domain", + "errorRootDomainNotSupported" : "The specified root domain is not supported by automatic activation.", + "errorSwitchAtSignFailed" : "Failed to switch atSigns after activation", + "errorAtSignUnavailable" : "The atSign is unavailable. Make sure you have pressed \"Activate\" from your dashboard and have a stable internet connection.", + "errorAtKeysInvalid" : "Invalid atKeys file detected", + "errorAtKeysUploadedMismatch" : "The atKeys file you uploaded did not match the atSign requested", + "errorAtKeysFileProcessFailed" : "Failed to process the atKeys file", + "errorAtServerUnreachable" : "Unable to connect to the atServer, make sure you have a stable internet connection", + "errorAuthenticatinFailed" : "Authentication failed", + "errorAuthenticationTimedOut" : "Authentication timed out", + "errorAtSignAlreadyPaired" : "The atSign {atsign} is already paired, please contact support", + "errorAtKeySaveFailed" : "Failed to save the atKeys file: {error}", + "errorOtpRequestFailed" : "Failed to request an OTP, try resending, or contact support if the issue persists", + "errorOtpVerificationFailed" : "Failed to verify the OTP with the activation server, please try again. Contact support if the issue persists", + "backupKeyDialogTitle" : "Please select a file to export to:", + "activationStatusPreparing" : "Preparing for activation", + "activationStatusOtpWait" : "Please enter the OTP from your email", + "activationStatusActivating" : "Activating", + "resendPin" : "Resend Pin", "yaml" : "YAML" } diff --git a/packages/dart/npt_flutter/lib/localization/app_es.arb b/packages/dart/npt_flutter/lib/localization/app_es.arb index 34dd6a9f7..8710652f4 100644 --- a/packages/dart/npt_flutter/lib/localization/app_es.arb +++ b/packages/dart/npt_flutter/lib/localization/app_es.arb @@ -1,115 +1,137 @@ { - "addNew" : "Agregar nuevo", - "addNewProfile" : "Agregar nuevo perfil", + "activationStatusActivating": "Activándose", + "activationStatusOtpWait": "Ingrese el código OTP de su correo electrónico", + "activationStatusPreparing": "Preparando la activación", + "addNew": "Agregar nuevo", + "addNewProfile": "Agregar nuevo perfil", "advanced": "Avanzado", - "alertDialogTitle": "¿Estás seguro?", - "allRightsReserved":"@ 2024 Atsign, Todos los derechos reservados", - "americas" : "Américas", - "asiaPacific" : "Asia-Pacífico", - "atDirectory" : "AtDirectory", - "atDirectorySubtitle" : "Seleccione el dominio que desea usar", - "atsignDialogSubtitle" : "Por favor seleccione su atSign", - "atsignDialogTitle" : "AtSign", - "back" : "Atrás", - "backupYourKey" : "Respalda tu clave", - "cancel" : "Cancelar", - "confirm" : "Confirmar", - "connected" : "conectado", - "dashboard" : "Tablero", - "dashboardView" : "Vista del tablero", - "defaultRelaySelection" : "Selección de relé predeterminada", - "delete" : "Eliminar", - "deviceAtsign" : "Dispositivo atSign", - "deviceAtsignDescription" : "Este es el atSign asociado con su dispositivo", + "alertDialogTitle": "¿Seguro que desea continuar?", + "allRightsReserved": "@ 2024 Atsign, Todos los derechos reservados", + "americas": "Américas", + "asiaPacific": "Asia-Pacífico", + "atDirectory": "AtDirectory", + "atDirectorySubtitle": "Seleccione el dominio que desea usar", + "atsignDialogSubtitle": "Seleccione su atSign", + "atsignDialogTitle": "AtSign", + "back": "Atrás", + "backupKeyDialogTitle": "Seleccione un archivo para exportar:", + "backupYourKey": "Haga una copia de seguridad de su clave", + "cancel": "Cancelar", + "confirm": "Confirmar", + "connected": "Conectado", + "dashboard": "Panel de control", + "dashboardView": "Vista del panel de control", + "defaultRelaySelection": "Selección de relé predeterminada", + "delete": "Eliminar", + "deviceAtsign": "atSign del dispositivo", + "deviceAtsignDescription": "Este es el atSign asociado a su dispositivo", "deviceName": "Nombre del dispositivo", - "deviceNameDescription" : "Este es el nombre de su dispositivo remoto", - "disconnected" : "desconectado", - "discord" : "Discord", - "done": "Hecho", - "duplicate" : "Duplicar", - "edit" : "Editar", - "email" : "Correo electrónico", - "emptyProfileMessage" : "No se encontraron perfiles\nCree o importe un perfil para comenzar a usar NoPorts.", - "enableLogging" : "Habilitar registro", - "europe" : "Europa", - "export" : "Exportar", - "exportLogs" : "Exportar registros", - "failed": "Fallido", - "failedToLoad" : "falló al cargar", - "faq" : "Preguntas frecuentes", - "feedback" : "Comentarios", - "fileFormatInvalid" : "El formato del documento no es válido. Por favor, suba un archivo válido.", - "fileFormatInvalidDetails" : "La sección de perfiles falta o está mal formateada. Por favor, revise el documento.", - "getStarted" : "Empezar", - "import" : "Importar", - "json" : "JSON", - "language" : "Idioma", - "loading" : "cargando", - "localPort" : "Puerto local", - "localPortDescription" : "", - "logs" : "Registros", - "minimal" : "Simple", - "next" : "Siguiente", - "noAtsign" : "Sin Atsign", - "noEmailClientAvailable" : "No hay cliente de correo electrónico disponible", - "noName" : "Sin nombre", - "noPorts" : "NoPorts", - "onboard" : "A bordo", - "onboardingError" : "Ha ocurrido un error", - "onboardingSubTitle" : "a NoPorts Desktop", - "onboardingTitle" : "Bienvenido", - "overrideAllProfile":"Sobrescribir todos los perfiles con la selección de relé predeterminada", - "preview" : "Vista previa", - "privacyPolicy" : "Política de privacidad", - "profileDeleteMessage" : "Este perfil será eliminado permanentemente.", - "profileDeleteSelectedMessage" : "Los perfiles seleccionados serán eliminados permanentemente.", - "profileExportDialogTitle" : "Elegir tipo de archivo", - "profileExportMessage" : "¿Qué tipo de archivo le gustaría exportar?", - "profileExportSelectedMessage" : "¿Qué tipo de archivo le gustaría exportar los perfiles seleccionados?", - "profileFailedLoaded" : "Error al cargar", + "deviceNameDescription": "Este es el nombre de su dispositivo remoto", + "disconnected": "Desconectado", + "discord": "Discord", + "done": "Listo", + "duplicate": "Duplicar", + "edit": "Editar", + "email": "Correo electrónico", + "emptyProfileMessage": "No se encontraron perfiles.\nCree o importe un perfil para usar NoPorts.", + "enableLogging": "Habilitar registro", + "errorAtKeySaveFailed": "No se pudo guardar el archivo atKeys: {error}", + "errorAtKeysFileProcessFailed": "No se pudo procesar el archivo atKeys", + "errorAtKeysInvalid": "Se detectó un archivo atKeys inválido", + "errorAtKeysUploadedMismatch": "El archivo atKeys que subió no coincide con el atSign solicitado", + "errorAtServerUnavailable": "No se pudo obtener el estado del servidor at. Verifique su conexión a internet.", + "errorAtServerUnreachable": "No se puede conectar al servidor at. Verifique su conexión a internet.", + "errorAtSignAlreadyPaired": "El atSign {atsign} ya está enlazado. Contacte al soporte técnico.", + "errorAtSignNotExist": "El atSign solicitado no existe en este dominio raíz.", + "errorAtSignUnavailable": "El atSign no está disponible. Asegúrese de haber pulsado \"Activar\" en su panel de control y de tener una conexión a internet estable.", + "errorAuthenticatinFailed": "Error de autenticación", + "errorAuthenticationTimedOut": "Se agotó el tiempo de autenticación", + "errorOtpRequestFailed": "No se pudo solicitar un código OTP. Intente de nuevo o contacte al soporte si el problema persiste.", + "errorOtpVerificationFailed": "No se pudo verificar el código OTP. Intente de nuevo o contacte al soporte si el problema persiste.", + "errorRootDomainNotSupported": "El dominio raíz especificado no es compatible con la activación automática.", + "errorSwitchAtSignFailed": "No se pudo cambiar de atSign después de la activación", + "europe": "Europa", + "export": "Exportar", + "exportLogs": "Exportar registros", + "failed": "Error", + "failedToLoad": "Error al cargar", + "faq": "FAQ", + "feedback": "Comentarios", + "fileFormatInvalid": "El formato del archivo no es válido. Suba un archivo válido.", + "fileFormatInvalidDetails": "La sección de perfiles está incompleta o tiene un formato incorrecto. Revise el archivo.", + "getStarted": "Comenzar", + "import": "Importar", + "json": "JSON", + "language": "Idioma", + "loading": "Cargando", + "localPort": "Puerto local", + "localPortDescription": "", + "logs": "Registros", + "minimal": "Simple", + "next": "Siguiente", + "noAtsign": "Sin atSign", + "noEmailClientAvailable": "No hay ningún cliente de correo electrónico disponible", + "noName": "Sin nombre", + "noPorts": "NoPorts", + "onboard": "Comenzar", + "onboardingButtonStatusPicking": "Esperando a que se seleccione el archivo", + "onboardingButtonStatusProcessingFile": "Procesando archivo", + "onboardingError": "Ocurrió un error", + "onboardingSubTitle": "para NoPorts Desktop", + "onboardingTitle": "Bienvenido", + "overrideAllProfile": "Sobrescribir todos los perfiles con la selección de relé predeterminada", + "preview": "Vista previa", + "privacyPolicy": "Política de privacidad", + "profileDeleteMessage": "Este perfil se eliminará permanentemente.", + "profileDeleteSelectedMessage": "Los perfiles seleccionados se eliminarán permanentemente.", + "profileExportDialogTitle": "Elegir tipo de archivo", + "profileExportMessage": "¿Qué tipo de archivo desea exportar?", + "profileExportSelectedMessage": "¿Qué tipo de archivo desea exportar para los perfiles seleccionados?", + "profileFailedLoaded": "Error al cargar", "profileFailedSaveMessage": "Error al guardar el perfil", - "profileFailedUnknownMessage" : "No se proporcionó ninguna razón", - "profileName" : "Nombre del perfil", - "profileNameDescription" : "Este será el nombre de sus configuraciones", - "profileRunningActionDeniedMessage" : "No se puede realizar esta acción mientras el perfil está en ejecución", + "profileFailedUnknownMessage": "No se especificó ningún motivo", + "profileName": "Nombre del perfil", + "profileNameDescription": "Este será el nombre de sus configuraciones", + "profileRunningActionDeniedMessage": "No se puede realizar esta acción mientras el perfil esté en ejecución", "profileStatusFailedLoad": "Error al cargar", "profileStatusFailedSave": "Error al guardar", "profileStatusFailedStart": "Error al iniciar", - "profileStatusLoaded" : "Desconectado", + "profileStatusLoaded": "Desconectado", "profileStatusLoadedMessage": "Actualmente desconectado", - "profileStatusLoading" : "Cargando", - "profileStatusStarted" : "Conectado", - "profileStatusStartedMessage":"Conexión exitosa", - "profileStatusStarting" : "Iniciando", - "profileStatusStopping" : "Apagando", + "profileStatusLoading": "Cargando", + "profileStatusStarted": "Conectado", + "profileStatusStartedMessage": "Conexión exitosa", + "profileStatusStarting": "Iniciando", + "profileStatusStopping": "Apagando", "quit": "Salir", - "refresh" : "Actualizar", - "relay" : "Relé", - "relayDescription" : "Puede elegir entre nuestros RV existentes o crear uno nuevo", - "remoteHost" : "Host remoto", - "remoteHostDescription" : "", - "remotePort" : "Puerto remoto", - "remotePortDescription" : "", - "resetAtsign" : "Restablecer Atsign", - "rootDomainDefault" : "Predeterminado (Producción)", - "rootDomainDemo" : "Demostración (VE)", - "selectExportFile": "Por favor seleccione un archivo para exportar a:", - "selectRootDomain" : "Seleccionar dominio raíz", - "serviceMapping" : "Mapeo de servicios", - "settings" : "Configuraciones", - "showWindow" : "Mostrar ventana", - "signout" : "Cerrar sesión", - "sshStyle" : "Avanzado", - "starting" : "iniciando", - "status" : "Estado", - "stopping" : "deteniendo", - "submit" : "Enviar", - "validationErrorAtsignField" : "El campo debe ser un atsign válido que comience con @", - "validationErrorDeviceNameField" : "El campo solo puede contener letras minúsculas, dígitos, guiones bajos.", - "validationErrorEmptyField" : "El campo no puede estar vacío", - "validationErrorLocalPortField" : "El campo debe estar entre 1024-65535", - "validationErrorLongField" : "El campo debe tener entre 1 y 36 caracteres", - "validationErrorRemoteHostField" : "El campo debe ser un nombre de host parcial o completamente calificado o una dirección IP", - "validationErrorRemotePortField" : "El campo debe estar entre 1-65535", - "yaml" : "YAML" -} \ No newline at end of file + "refresh": "Actualizar", + "relay": "Relé", + "relayDescription": "Puede elegir entre nuestros relés existentes o crear uno nuevo.", + "remoteHost": "Servidor remoto", + "remoteHostDescription": "", + "remotePort": "Puerto remoto", + "remotePortDescription": "", + "resendPin": "Reenviar PIN", + "resetAtsign": "Restablecer Atsign", + "rootDomainDefault": "Predeterminado (Producción)", + "rootDomainDemo": "Demostración (VE)", + "selectExportFile": "Seleccione un archivo para exportar:", + "selectRootDomain": "Seleccionar dominio raíz", + "serviceMapping": "Mapeo de servicios", + "settings": "Ajustes", + "showWindow": "Mostrar ventana", + "signout": "Cerrar sesión", + "sshStyle": "Avanzado", + "starting": "Iniciando", + "status": "Estado", + "stopping": "Deteniendo", + "submit": "Enviar", + "validationErrorAtsignField": "El campo debe ser una dirección atSign válida que comience con @", + "validationErrorDeviceNameField": "El campo solo puede contener minúsculas, números y guiones bajos.", + "validationErrorEmptyField": "El campo no puede estar vacío", + "validationErrorLocalPortField": "El campo debe estar entre 1024 y 65535", + "validationErrorLongField": "El campo debe tener entre 1 y 36 caracteres", + "validationErrorRemoteHostField": "El campo debe ser un nombre de host parcial o completamente calificado, o una dirección IP", + "validationErrorRemotePortField": "El campo debe estar entre 1 y 65535", + "yaml": "YAML" + } \ No newline at end of file diff --git a/packages/dart/npt_flutter/lib/localization/app_pt.arb b/packages/dart/npt_flutter/lib/localization/app_pt.arb index 451a6a20e..50c28af5b 100644 --- a/packages/dart/npt_flutter/lib/localization/app_pt.arb +++ b/packages/dart/npt_flutter/lib/localization/app_pt.arb @@ -1,115 +1,137 @@ { - "addNew" : "Adicionar Novo", - "addNewProfile" : "Adicionar Novo Perfil", + "activationStatusActivating": "A ativar", + "activationStatusOtpWait": "Insira o OTP do seu email", + "activationStatusPreparing": "A preparar para ativação", + "addNew": "Adicionar Novo", + "addNewProfile": "Adicionar Novo Perfil", "advanced": "Avançado", - "alertDialogTitle": "Você tem certeza?", - "allRightsReserved":"@ 2024 Atsign, Todos os Direitos Reservados", - "americas" : "Américas", - "asiaPacific" : "Ásia-Pacífico", - "atDirectory" : "AtDirectory", - "atDirectorySubtitle" : "Selecione o domínio que você deseja usar", - "atsignDialogSubtitle" : "Por favor, selecione seu atSign", - "atsignDialogTitle" : "AtSign", - "back" : "Voltar", - "backupYourKey" : "Faça Backup da Sua Chave", - "cancel" : "Cancelar", - "confirm" : "Confirmar", - "connected" : "conectado", - "dashboard" : "Painel", - "dashboardView" : "Visualização do Painel", - "defaultRelaySelection" : "Seleção de Relay Padrão", - "delete" : "Excluir", - "deviceAtsign" : "Dispositivo atSign", - "deviceAtsignDescription" : "Este é o atSign associado ao seu dispositivo", + "alertDialogTitle": "Tem a certeza?", + "allRightsReserved": "@ 2024 Atsign, Todos os Direitos Reservados", + "americas": "Américas", + "asiaPacific": "Ásia-Pacífico", + "atDirectory": "AtDirectory", + "atDirectorySubtitle": "Selecione o domínio que pretende usar", + "atsignDialogSubtitle": "Selecione o seu atSign", + "atsignDialogTitle": "AtSign", + "back": "Voltar", + "backupKeyDialogTitle": "Selecione um ficheiro para exportar para:", + "backupYourKey": "Efectue cópia de segurança da sua chave", + "cancel": "Cancelar", + "confirm": "Confirmar", + "connected": "Conectado", + "dashboard": "Painel de controlo", + "dashboardView": "Visualização do Painel de controlo", + "defaultRelaySelection": "Seleção de Relay Predefinida", + "delete": "Eliminar", + "deviceAtsign": "atSign do dispositivo", + "deviceAtsignDescription": "Este é o atSign associado ao seu dispositivo", "deviceName": "Nome do Dispositivo", - "deviceNameDescription" : "Este é o nome do seu dispositivo remoto", - "disconnected" : "desconectado", - "discord" : "Discord", + "deviceNameDescription": "Este é o nome do seu dispositivo remoto", + "disconnected": "Desconectado", + "discord": "Discord", "done": "Concluído", - "duplicate" : "Duplicar", - "edit" : "Editar", - "email" : "Email", - "emptyProfileMessage" : "Nenhum perfil encontrado\nCrie ou Importe um perfil para começar a usar NoPorts.", - "enableLogging" : "Habilitar Registro", - "europe" : "Europa", - "export" : "Exportar", - "exportLogs" : "Exportar Registros", + "duplicate": "Duplicar", + "edit": "Editar", + "email": "Email", + "emptyProfileMessage": "Nenhum perfil encontrado.\nCrie ou importe um perfil para começar a usar o NoPorts.", + "enableLogging": "Ativar registo", + "errorAtKeySaveFailed": "Falha ao guardar o ficheiro atKeys: {error}", + "errorAtKeysFileProcessFailed": "Falha ao processar o ficheiro atKeys", + "errorAtKeysInvalid": "Ficheiro atKeys inválido detetado", + "errorAtKeysUploadedMismatch": "O ficheiro atKeys que enviou não corresponde ao atSign solicitado", + "errorAtServerUnavailable": "Falha ao obter o estado do servidor atServer. Verifique a sua ligação à internet.", + "errorAtServerUnreachable": "Não foi possível ligar ao servidor atServer. Verifique a sua ligação à internet.", + "errorAtSignAlreadyPaired": "O atSign {atsign} já está emparelhado. Contacte o suporte.", + "errorAtSignNotExist": "O atSign solicitado não existe neste domínio raiz", + "errorAtSignUnavailable": "O atSign não está disponível. Certifique-se de que clicou em \"Ativar\" no seu painel de controlo e tem uma ligação estável à internet.", + "errorAuthenticatinFailed": "Falha na autenticação", + "errorAuthenticationTimedOut": "Tempo limite de autenticação atingido", + "errorOtpRequestFailed": "Falha ao solicitar um OTP. Tente novamente ou contacte o suporte se o problema persistir.", + "errorOtpVerificationFailed": "Falha ao verificar o OTP com o servidor de ativação. Tente novamente. Contacte o suporte se o problema persistir.", + "errorRootDomainNotSupported": "O domínio raiz especificado não é suportado pela ativação automática.", + "errorSwitchAtSignFailed": "Falha ao mudar de atSign após a ativação", + "europe": "Europa", + "export": "Exportar", + "exportLogs": "Exportar Registos", "failed": "Falhou", - "failedToLoad" : "falha ao carregar", - "faq" : "faq", - "feedback" : "Feedback", - "fileFormatInvalid" : "O formato do documento é inválido. Por favor, carregue um arquivo válido.", - "fileFormatInvalidDetails" : "A seção de perfis está ausente ou formatada incorretamente. Por favor, verifique o documento.", - "getStarted" : "Começar", - "import" : "Importar", - "json" : "JSON", - "language" : "Idioma", - "loading" : "carregando", - "localPort" : "Porta Local", - "localPortDescription" : "", - "logs" : "Registros", - "minimal" : "Simples", - "next" : "Próximo", - "noAtsign" : "Sem Atsign", - "noEmailClientAvailable" : "Nenhum cliente de email disponível", - "noName" : "Sem Nome", - "noPorts" : "NoPorts", - "onboard" : "Onboard", - "onboardingError" : "Ocorreu um erro", - "onboardingSubTitle" : "para NoPorts Desktop", - "onboardingTitle" : "Bem-vindo", - "overrideAllProfile":"Substituir todos os perfis com a seleção de relay padrão", - "preview" : "Pré-visualização", - "privacyPolicy" : "Política de Privacidade", - "profileDeleteMessage" : "Este perfil será permanentemente excluído.", - "profileDeleteSelectedMessage" : "Os perfis selecionados serão permanentemente excluídos.", - "profileExportDialogTitle" : "Escolha o Tipo de Arquivo", - "profileExportMessage" : "Qual tipo de arquivo você gostaria de exportar?", - "profileExportSelectedMessage" : "Qual tipo de arquivo você gostaria de exportar os perfis selecionados?", - "profileFailedLoaded" : "Falha ao carregar", - "profileFailedSaveMessage": "Falha ao salvar o perfil", - "profileFailedUnknownMessage" : "Nenhuma razão fornecida", - "profileName" : "Nome do Perfil", - "profileNameDescription" : "Este será o nome das suas configurações", - "profileRunningActionDeniedMessage" : "Não é possível realizar esta ação enquanto o perfil está em execução", + "failedToLoad": "Falha ao carregar", + "faq": "FAQ", + "feedback": "Feedback", + "fileFormatInvalid": "O formato do ficheiro é inválido. Por favor, carregue um ficheiro válido.", + "fileFormatInvalidDetails": "A secção de perfis está ausente ou com formato incorrecto. Por favor, verifique o ficheiro.", + "getStarted": "Começar", + "import": "Importar", + "json": "JSON", + "language": "Idioma", + "loading": "A carregar", + "localPort": "Porta Local", + "localPortDescription": "", + "logs": "Registos", + "minimal": "Simples", + "next": "Seguinte", + "noAtsign": "Sem atSign", + "noEmailClientAvailable": "Nenhum cliente de email disponível", + "noName": "Sem nome", + "noPorts": "NoPorts", + "onboard": "Introdução", + "onboardingButtonStatusPicking": "A aguardar a seleção do ficheiro", + "onboardingButtonStatusProcessingFile": "A processar ficheiro", + "onboardingError": "Ocorreu um erro", + "onboardingSubTitle": "para o NoPorts Desktop", + "onboardingTitle": "Bem-vindo", + "overrideAllProfile": "Substituir todos os perfis pela seleção de relay predefinida", + "preview": "Pré-visualização", + "privacyPolicy": "Política de Privacidade", + "profileDeleteMessage": "Este perfil será eliminado permanentemente.", + "profileDeleteSelectedMessage": "Os perfis selecionados serão eliminados permanentemente.", + "profileExportDialogTitle": "Escolha o tipo de ficheiro", + "profileExportMessage": "Que tipo de ficheiro pretende exportar?", + "profileExportSelectedMessage": "Que tipo de ficheiro pretende exportar os perfis selecionados?", + "profileFailedLoaded": "Falha ao carregar", + "profileFailedSaveMessage": "Falha ao guardar o perfil", + "profileFailedUnknownMessage": "Razão não fornecida", + "profileName": "Nome do Perfil", + "profileNameDescription": "Este será o nome das suas configurações", + "profileRunningActionDeniedMessage": "Não é possível realizar esta ação enquanto o perfil estiver em execução", "profileStatusFailedLoad": "Falha ao carregar", - "profileStatusFailedSave": "Falha ao salvar", + "profileStatusFailedSave": "Falha ao guardar", "profileStatusFailedStart": "Falha ao iniciar", - "profileStatusLoaded" : "Desconectado", + "profileStatusLoaded": "Desconectado", "profileStatusLoadedMessage": "Atualmente desconectado", - "profileStatusLoading" : "Carregando", - "profileStatusStarted" : "Conectado", - "profileStatusStartedMessage":"Conexão bem-sucedida", - "profileStatusStarting" : "Iniciando", - "profileStatusStopping" : "Desligando", + "profileStatusLoading": "A carregar", + "profileStatusStarted": "Conectado", + "profileStatusStartedMessage": "Ligação bem-sucedida", + "profileStatusStarting": "A iniciar", + "profileStatusStopping": "A desligar", "quit": "Sair", - "refresh" : "Atualizar", - "relay" : "Relay", - "relayDescription" : "Você pode escolher entre nossos RVs existentes ou criar um novo", - "remoteHost" : "Host Remoto", - "remoteHostDescription" : "", - "remotePort" : "Porta Remota", - "remotePortDescription" : "", - "resetAtsign" : "Redefinir Atsign", - "rootDomainDefault" : "Padrão (Prod)", - "rootDomainDemo" : "Demo (VE)", - "selectExportFile": "Por favor, selecione um arquivo para exportar:", - "selectRootDomain" : "Selecione o Domínio Raiz", - "serviceMapping" : "Mapeamento de Serviço", - "settings" : "Configurações", - "showWindow" : "Mostrar Janela", - "signout" : "Sair", - "sshStyle" : "Avançado", - "starting" : "iniciando", - "status" : "Status", - "stopping" : "parando", - "submit" : "Enviar", - "validationErrorAtsignField" : "O campo deve ser um atsign válido que começa com @", - "validationErrorDeviceNameField" : "O campo só pode conter letras minúsculas, dígitos, sublinhados.", - "validationErrorEmptyField" : "O campo não pode ficar em branco", - "validationErrorLocalPortField" : "O campo deve estar entre 1024-65535", - "validationErrorLongField" : "O campo deve ter entre 1-36 caracteres", - "validationErrorRemoteHostField" : "O campo deve ser um nome de host parcial ou totalmente qualificado ou um endereço IP", - "validationErrorRemotePortField" : "O campo deve estar entre 1-65535", - "yaml" : "YAML" - } \ No newline at end of file + "refresh": "Atualizar", + "relay": "Relay", + "relayDescription": "Pode escolher entre os nossos relays existentes ou criar um novo.", + "remoteHost": "Servidor Remoto", + "remoteHostDescription": "", + "remotePort": "Porta Remota", + "remotePortDescription": "", + "resendPin": "Reenviar PIN", + "resetAtsign": "Redefinir Atsign", + "rootDomainDefault": "Predefinido (Produção)", + "rootDomainDemo": "Demo (VE)", + "selectExportFile": "Selecione um ficheiro para exportar:", + "selectRootDomain": "Selecione o Domínio Raiz", + "serviceMapping": "Mapeamento de Serviço", + "settings": "Definições", + "showWindow": "Mostrar Janela", + "signout": "Sair", + "sshStyle": "Avançado", + "starting": "A iniciar", + "status": "Estado", + "stopping": "A parar", + "submit": "Submeter", + "validationErrorAtsignField": "O campo tem de ser um atsign válido que começa com @", + "validationErrorDeviceNameField": "O campo só pode conter letras minúsculas, dígitos e sublinhados.", + "validationErrorEmptyField": "O campo não pode ficar em branco", + "validationErrorLocalPortField": "O campo tem de estar entre 1024 e 65535", + "validationErrorLongField": "O campo tem de ter entre 1 e 36 caracteres", + "validationErrorRemoteHostField": "O campo tem de ser um nome de anfitrião parcial ou totalmente qualificado ou um endereço IP", + "validationErrorRemotePortField": "O campo tem de estar entre 1 e 65535", + "yaml": "YAML" + } \ No newline at end of file diff --git a/packages/dart/npt_flutter/lib/localization/app_pt_BR.arb b/packages/dart/npt_flutter/lib/localization/app_pt_BR.arb index 451a6a20e..02929c5d7 100644 --- a/packages/dart/npt_flutter/lib/localization/app_pt_BR.arb +++ b/packages/dart/npt_flutter/lib/localization/app_pt_BR.arb @@ -1,115 +1,137 @@ { - "addNew" : "Adicionar Novo", - "addNewProfile" : "Adicionar Novo Perfil", + "activationStatusActivating": "Ativando", + "activationStatusOtpWait": "Insira o OTP do seu email", + "activationStatusPreparing": "Preparando para ativação", + "addNew": "Adicionar Novo", + "addNewProfile": "Adicionar Novo Perfil", "advanced": "Avançado", - "alertDialogTitle": "Você tem certeza?", - "allRightsReserved":"@ 2024 Atsign, Todos os Direitos Reservados", - "americas" : "Américas", - "asiaPacific" : "Ásia-Pacífico", - "atDirectory" : "AtDirectory", - "atDirectorySubtitle" : "Selecione o domínio que você deseja usar", - "atsignDialogSubtitle" : "Por favor, selecione seu atSign", - "atsignDialogTitle" : "AtSign", - "back" : "Voltar", - "backupYourKey" : "Faça Backup da Sua Chave", - "cancel" : "Cancelar", - "confirm" : "Confirmar", - "connected" : "conectado", - "dashboard" : "Painel", - "dashboardView" : "Visualização do Painel", - "defaultRelaySelection" : "Seleção de Relay Padrão", - "delete" : "Excluir", - "deviceAtsign" : "Dispositivo atSign", - "deviceAtsignDescription" : "Este é o atSign associado ao seu dispositivo", + "alertDialogTitle": "Tem certeza?", + "allRightsReserved": "@ 2024 Atsign, Todos os Direitos Reservados", + "americas": "Américas", + "asiaPacific": "Ásia-Pacífico", + "atDirectory": "AtDirectory", + "atDirectorySubtitle": "Selecione o domínio que deseja usar", + "atsignDialogSubtitle": "Selecione seu atSign", + "atsignDialogTitle": "AtSign", + "back": "Voltar", + "backupKeyDialogTitle": "Selecione um arquivo para exportar:", + "backupYourKey": "Faça backup da sua chave", + "cancel": "Cancelar", + "confirm": "Confirmar", + "connected": "Conectado", + "dashboard": "Painel", + "dashboardView": "Visualização do Painel", + "defaultRelaySelection": "Seleção de Relay Padrão", + "delete": "Excluir", + "deviceAtsign": "atSign do dispositivo", + "deviceAtsignDescription": "Este é o atSign associado ao seu dispositivo", "deviceName": "Nome do Dispositivo", - "deviceNameDescription" : "Este é o nome do seu dispositivo remoto", - "disconnected" : "desconectado", - "discord" : "Discord", + "deviceNameDescription": "Este é o nome do seu dispositivo remoto", + "disconnected": "Desconectado", + "discord": "Discord", "done": "Concluído", - "duplicate" : "Duplicar", - "edit" : "Editar", - "email" : "Email", - "emptyProfileMessage" : "Nenhum perfil encontrado\nCrie ou Importe um perfil para começar a usar NoPorts.", - "enableLogging" : "Habilitar Registro", - "europe" : "Europa", - "export" : "Exportar", - "exportLogs" : "Exportar Registros", + "duplicate": "Duplicar", + "edit": "Editar", + "email": "Email", + "emptyProfileMessage": "Nenhum perfil encontrado.\nCriar ou importar um perfil para usar o NoPorts.", + "enableLogging": "Habilitar Registro", + "errorAtKeySaveFailed": "Falha ao salvar o arquivo atKeys: {error}", + "errorAtKeysFileProcessFailed": "Falha ao processar o arquivo atKeys", + "errorAtKeysInvalid": "Arquivo atKeys inválido detectado", + "errorAtKeysUploadedMismatch": "O arquivo atKeys que você enviou não corresponde ao atSign solicitado", + "errorAtServerUnavailable": "Falha ao obter o status do atServer. Verifique sua conexão com a internet.", + "errorAtServerUnreachable": "Não foi possível conectar ao atServer. Verifique sua conexão com a internet.", + "errorAtSignAlreadyPaired": "O atSign {atsign} já está emparelhado. Entre em contato com o suporte.", + "errorAtSignNotExist": "O atSign solicitado não existe neste domínio raiz", + "errorAtSignUnavailable": "O atSign não está disponível. Verifique se você clicou em \"Ativar\" no seu painel e se tem uma conexão estável com a internet.", + "errorAuthenticatinFailed": "Falha na autenticação", + "errorAuthenticationTimedOut": "Tempo de autenticação esgotado", + "errorOtpRequestFailed": "Falha ao solicitar um OTP. Tente reenviar ou contate o suporte se o problema persistir.", + "errorOtpVerificationFailed": "Falha na verificação do OTP. Tente novamente ou contate o suporte se o problema persistir.", + "errorRootDomainNotSupported": "O domínio raiz especificado não é compatível com a ativação automática.", + "errorSwitchAtSignFailed": "Falha ao trocar de atSign após a ativação", + "europe": "Europa", + "export": "Exportar", + "exportLogs": "Exportar Registros", "failed": "Falhou", - "failedToLoad" : "falha ao carregar", - "faq" : "faq", - "feedback" : "Feedback", - "fileFormatInvalid" : "O formato do documento é inválido. Por favor, carregue um arquivo válido.", - "fileFormatInvalidDetails" : "A seção de perfis está ausente ou formatada incorretamente. Por favor, verifique o documento.", - "getStarted" : "Começar", - "import" : "Importar", - "json" : "JSON", - "language" : "Idioma", - "loading" : "carregando", - "localPort" : "Porta Local", - "localPortDescription" : "", - "logs" : "Registros", - "minimal" : "Simples", - "next" : "Próximo", - "noAtsign" : "Sem Atsign", - "noEmailClientAvailable" : "Nenhum cliente de email disponível", - "noName" : "Sem Nome", - "noPorts" : "NoPorts", - "onboard" : "Onboard", - "onboardingError" : "Ocorreu um erro", - "onboardingSubTitle" : "para NoPorts Desktop", - "onboardingTitle" : "Bem-vindo", - "overrideAllProfile":"Substituir todos os perfis com a seleção de relay padrão", - "preview" : "Pré-visualização", - "privacyPolicy" : "Política de Privacidade", - "profileDeleteMessage" : "Este perfil será permanentemente excluído.", - "profileDeleteSelectedMessage" : "Os perfis selecionados serão permanentemente excluídos.", - "profileExportDialogTitle" : "Escolha o Tipo de Arquivo", - "profileExportMessage" : "Qual tipo de arquivo você gostaria de exportar?", - "profileExportSelectedMessage" : "Qual tipo de arquivo você gostaria de exportar os perfis selecionados?", - "profileFailedLoaded" : "Falha ao carregar", + "failedToLoad": "Falha ao carregar", + "faq": "FAQ", + "feedback": "Feedback", + "fileFormatInvalid": "Formato de arquivo inválido. Envie um arquivo válido.", + "fileFormatInvalidDetails": "A seção de perfis está ausente ou com formato incorreto. Verifique o arquivo.", + "getStarted": "Começar", + "import": "Importar", + "json": "JSON", + "language": "Idioma", + "loading": "Carregando", + "localPort": "Porta Local", + "localPortDescription": "", + "logs": "Registros", + "minimal": "Simples", + "next": "Próximo", + "noAtsign": "Sem atSign", + "noEmailClientAvailable": "Nenhum cliente de email disponível", + "noName": "Sem nome", + "noPorts": "NoPorts", + "onboard": "Introdução", + "onboardingButtonStatusPicking": "Aguardando a seleção do arquivo", + "onboardingButtonStatusProcessingFile": "Processando arquivo", + "onboardingError": "Ocorreu um erro", + "onboardingSubTitle": "para o NoPorts Desktop", + "onboardingTitle": "Bem-vindo", + "overrideAllProfile": "Substituir todos os perfis pela seleção de relay padrão", + "preview": "Pré-visualização", + "privacyPolicy": "Política de Privacidade", + "profileDeleteMessage": "Este perfil será excluído permanentemente.", + "profileDeleteSelectedMessage": "Os perfis selecionados serão excluídos permanentemente.", + "profileExportDialogTitle": "Escolha o tipo de arquivo", + "profileExportMessage": "Qual tipo de arquivo você deseja exportar?", + "profileExportSelectedMessage": "Qual tipo de arquivo você deseja exportar os perfis selecionados?", + "profileFailedLoaded": "Falha ao carregar", "profileFailedSaveMessage": "Falha ao salvar o perfil", - "profileFailedUnknownMessage" : "Nenhuma razão fornecida", - "profileName" : "Nome do Perfil", - "profileNameDescription" : "Este será o nome das suas configurações", - "profileRunningActionDeniedMessage" : "Não é possível realizar esta ação enquanto o perfil está em execução", + "profileFailedUnknownMessage": "Motivo não informado", + "profileName": "Nome do Perfil", + "profileNameDescription": "Este será o nome das suas configurações", + "profileRunningActionDeniedMessage": "Não é possível executar essa ação enquanto o perfil estiver em execução", "profileStatusFailedLoad": "Falha ao carregar", "profileStatusFailedSave": "Falha ao salvar", "profileStatusFailedStart": "Falha ao iniciar", - "profileStatusLoaded" : "Desconectado", + "profileStatusLoaded": "Desconectado", "profileStatusLoadedMessage": "Atualmente desconectado", - "profileStatusLoading" : "Carregando", - "profileStatusStarted" : "Conectado", - "profileStatusStartedMessage":"Conexão bem-sucedida", - "profileStatusStarting" : "Iniciando", - "profileStatusStopping" : "Desligando", + "profileStatusLoading": "Carregando", + "profileStatusStarted": "Conectado", + "profileStatusStartedMessage": "Conexão bem-sucedida", + "profileStatusStarting": "Iniciando", + "profileStatusStopping": "Desligando", "quit": "Sair", - "refresh" : "Atualizar", - "relay" : "Relay", - "relayDescription" : "Você pode escolher entre nossos RVs existentes ou criar um novo", - "remoteHost" : "Host Remoto", - "remoteHostDescription" : "", - "remotePort" : "Porta Remota", - "remotePortDescription" : "", - "resetAtsign" : "Redefinir Atsign", - "rootDomainDefault" : "Padrão (Prod)", - "rootDomainDemo" : "Demo (VE)", - "selectExportFile": "Por favor, selecione um arquivo para exportar:", - "selectRootDomain" : "Selecione o Domínio Raiz", - "serviceMapping" : "Mapeamento de Serviço", - "settings" : "Configurações", - "showWindow" : "Mostrar Janela", - "signout" : "Sair", - "sshStyle" : "Avançado", - "starting" : "iniciando", - "status" : "Status", - "stopping" : "parando", - "submit" : "Enviar", - "validationErrorAtsignField" : "O campo deve ser um atsign válido que começa com @", - "validationErrorDeviceNameField" : "O campo só pode conter letras minúsculas, dígitos, sublinhados.", - "validationErrorEmptyField" : "O campo não pode ficar em branco", - "validationErrorLocalPortField" : "O campo deve estar entre 1024-65535", - "validationErrorLongField" : "O campo deve ter entre 1-36 caracteres", - "validationErrorRemoteHostField" : "O campo deve ser um nome de host parcial ou totalmente qualificado ou um endereço IP", - "validationErrorRemotePortField" : "O campo deve estar entre 1-65535", - "yaml" : "YAML" - } \ No newline at end of file + "refresh": "Atualizar", + "relay": "Relay", + "relayDescription": "Você pode escolher entre nossos relays existentes ou criar um novo.", + "remoteHost": "Host Remoto", + "remoteHostDescription": "", + "remotePort": "Porta Remota", + "remotePortDescription": "", + "resendPin": "Reenviar PIN", + "resetAtsign": "Redefinir Atsign", + "rootDomainDefault": "Padrão (Produção)", + "rootDomainDemo": "Demo (VE)", + "selectExportFile": "Selecione o arquivo para exportar:", + "selectRootDomain": "Selecione o Domínio Raiz", + "serviceMapping": "Mapeamento de Serviço", + "settings": "Configurações", + "showWindow": "Mostrar Janela", + "signout": "Sair", + "sshStyle": "Avançado", + "starting": "Iniciando", + "status": "Status", + "stopping": "Parando", + "submit": "Enviar", + "validationErrorAtsignField": "O campo deve ser um atsign válido que comece com @", + "validationErrorDeviceNameField": "O campo só pode conter letras minúsculas, números e sublinhados.", + "validationErrorEmptyField": "O campo não pode estar vazio", + "validationErrorLocalPortField": "O campo deve estar entre 1024 e 65535", + "validationErrorLongField": "O campo deve ter entre 1 e 36 caracteres", + "validationErrorRemoteHostField": "O campo deve ser um nome de host parcial ou totalmente qualificado ou um endereço IP", + "validationErrorRemotePortField": "O campo deve estar entre 1 e 65535", + "yaml": "YAML" + } \ No newline at end of file diff --git a/packages/dart/npt_flutter/lib/localization/app_zh.arb b/packages/dart/npt_flutter/lib/localization/app_zh.arb index 89831fe38..93d0853e5 100644 --- a/packages/dart/npt_flutter/lib/localization/app_zh.arb +++ b/packages/dart/npt_flutter/lib/localization/app_zh.arb @@ -1,115 +1,137 @@ { - "addNew" : "新增", - "addNewProfile" : "新增配置文件", + "activationStatusActivating": "正在激活", + "activationStatusOtpWait": "请输入您邮箱中的 OTP", + "activationStatusPreparing": "准备激活", + "addNew": "新增", + "addNewProfile": "新增配置文件", "advanced": "高级", - "alertDialogTitle": "你确定吗?", - "allRightsReserved":"@ 2024 Atsign,版权所有", - "americas" : "美洲", - "asiaPacific" : "亚太地区", - "atDirectory" : "AtDirectory", - "atDirectorySubtitle" : "选择您要使用的域", - "atsignDialogSubtitle" : "请选择您的atSign", - "atsignDialogTitle" : "AtSign", - "back" : "返回", - "backupYourKey" : "备份您的密钥", - "cancel" : "取消", - "confirm" : "确认", - "connected" : "已连接", - "dashboard" : "仪表板", - "dashboardView" : "仪表板视图", - "defaultRelaySelection" : "默认中继选择", - "delete" : "删除", - "deviceAtsign" : "设备atSign", - "deviceAtsignDescription" : "这是与您设备关联的atSign", + "alertDialogTitle": "确定要继续吗?", + "allRightsReserved": "@ 2024 Atsign,版权所有", + "americas": "美洲", + "asiaPacific": "亚太地区", + "atDirectory": "AtDirectory", + "atDirectorySubtitle": "选择您要使用的域", + "atsignDialogSubtitle": "请选择您的 atSign", + "atsignDialogTitle": "AtSign", + "back": "返回", + "backupKeyDialogTitle": "请选择要导出的文件:", + "backupYourKey": "备份密钥", + "cancel": "取消", + "confirm": "确认", + "connected": "已连接", + "dashboard": "仪表盘", + "dashboardView": "仪表盘视图", + "defaultRelaySelection": "默认中继设置", + "delete": "删除", + "deviceAtsign": "设备 atSign", + "deviceAtsignDescription": "这是与您的设备关联的 atSign", "deviceName": "设备名称", - "deviceNameDescription" : "这是您的远程设备的名称", - "disconnected" : "断开连接", - "discord" : "Discord", + "deviceNameDescription": "这是您的远程设备的名称", + "disconnected": "已断开连接", + "discord": "Discord", "done": "完成", - "duplicate" : "重复", - "edit" : "编辑", - "email" : "电子邮件", - "emptyProfileMessage" : "未找到配置文件\n创建或导入配置文件以开始使用NoPorts。", - "enableLogging" : "启用日志记录", - "europe" : "欧洲", - "export" : "导出", - "exportLogs" : "导出日志", + "duplicate": "重复", + "edit": "编辑", + "email": "电子邮件", + "emptyProfileMessage": "未找到配置文件\n请创建或导入配置文件以开始使用 NoPorts。", + "enableLogging": "启用日志记录", + "errorAtKeySaveFailed": "保存 atKeys 文件失败:{error}", + "errorAtKeysFileProcessFailed": "处理 atKeys 文件失败", + "errorAtKeysInvalid": "检测到无效的 atKeys 文件", + "errorAtKeysUploadedMismatch": "您上传的 atKeys 文件与请求的 atSign 不匹配", + "errorAtServerUnavailable": "无法检索 atserver 状态,请确保您的互联网连接稳定", + "errorAtServerUnreachable": "无法连接到 atServer,请确保您的互联网连接稳定", + "errorAtSignAlreadyPaired": "atSign {atsign} 已配对,请联系支持", + "errorAtSignNotExist": "您请求的 atSign 在此根域中不存在", + "errorAtSignUnavailable": "atSign 不可使用。请确保您已从仪表板点击“激活”并且互联网连接稳定。", + "errorAuthenticatinFailed": "身份验证失败", + "errorAuthenticationTimedOut": "身份验证超时", + "errorOtpRequestFailed": "请求 OTP 失败,请重试,或如果问题仍然存在,请联系支持", + "errorOtpVerificationFailed": "与激活服务器验证 OTP 失败,请重试。如果问题仍然存在,请联系支持", + "errorRootDomainNotSupported": "指定的根域不支持自动激活。", + "errorSwitchAtSignFailed": "激活后切换 atSign 失败", + "europe": "欧洲", + "export": "导出", + "exportLogs": "导出日志", "failed": "失败", - "failedToLoad" : "加载失败", - "faq" : "常见问题", - "feedback" : "反馈", - "fileFormatInvalid" : "文档格式无效。请上传有效文件。", - "fileFormatInvalidDetails" : "配置文件部分缺失或格式不正确。请检查文档。", - "getStarted" : "开始", - "import" : "导入", - "json" : "JSON", - "language" : "语言", - "loading" : "加载中", - "localPort" : "本地端口", - "localPortDescription" : "", - "logs" : "日志", - "minimal" : "简单", - "next" : "下一步", - "noAtsign" : "没有Atsign", - "noEmailClientAvailable" : "没有可用的电子邮件客户端", - "noName" : "无名称", - "noPorts" : "NoPorts", - "onboard" : "入职", - "onboardingError" : "发生错误", - "onboardingSubTitle" : "到NoPorts桌面", - "onboardingTitle" : "欢迎", - "overrideAllProfile":"用默认中继选择覆盖所有配置文件", - "preview" : "预览", - "privacyPolicy" : "隐私政策", - "profileDeleteMessage" : "此配置文件将被永久删除。", - "profileDeleteSelectedMessage" : "选定的配置文件将被永久删除。", - "profileExportDialogTitle" : "选择文件类型", - "profileExportMessage" : "您想导出为哪种文件类型?", - "profileExportSelectedMessage" : "您想将选定的配置文件导出为哪种文件类型?", - "profileFailedLoaded" : "加载失败", + "failedToLoad": "加载失败", + "faq": "常见问题", + "feedback": "反馈", + "fileFormatInvalid": "文件格式无效。请上传有效文件。", + "fileFormatInvalidDetails": "配置文件部分缺失或格式不正确。请检查文件。", + "getStarted": "开始", + "import": "导入", + "json": "JSON", + "language": "语言", + "loading": "加载中", + "localPort": "本地端口", + "localPortDescription": "", + "logs": "日志", + "minimal": "简单", + "next": "下一步", + "noAtsign": "没有 atSign", + "noEmailClientAvailable": "没有可用的电子邮件客户端", + "noName": "无名", + "noPorts": "NoPorts", + "onboard": "开始使用", + "onboardingButtonStatusPicking": "等待选择文件", + "onboardingButtonStatusProcessingFile": "正在处理文件", + "onboardingError": "发生错误", + "onboardingSubTitle": "开始使用 NoPorts 桌面版", + "onboardingTitle": "欢迎", + "overrideAllProfile": "使用默认中继设置覆盖所有配置文件", + "preview": "预览", + "privacyPolicy": "隐私政策", + "profileDeleteMessage": "此配置文件将被永久删除。", + "profileDeleteSelectedMessage": "选定的配置文件将被永久删除。", + "profileExportDialogTitle": "选择文件类型", + "profileExportMessage": "您想导出为哪种文件类型?", + "profileExportSelectedMessage": "您想将选定的配置文件导出为哪种文件类型?", + "profileFailedLoaded": "加载失败", "profileFailedSaveMessage": "配置文件保存失败", - "profileFailedUnknownMessage" : "未提供原因", - "profileName" : "配置文件名称", - "profileNameDescription" : "这将是您的配置名称", - "profileRunningActionDeniedMessage" : "配置文件运行时无法执行此操作", + "profileFailedUnknownMessage": "原因不明", + "profileName": "配置文件名称", + "profileNameDescription": "这将是您的配置名称", + "profileRunningActionDeniedMessage": "配置文件正在运行时无法执行此操作", "profileStatusFailedLoad": "加载失败", "profileStatusFailedSave": "保存失败", "profileStatusFailedStart": "启动失败", - "profileStatusLoaded" : "已断开连接", + "profileStatusLoaded": "已断开连接", "profileStatusLoadedMessage": "当前已断开连接", - "profileStatusLoading" : "加载中", - "profileStatusStarted" : "已连接", - "profileStatusStartedMessage":"连接成功", - "profileStatusStarting" : "启动中", - "profileStatusStopping" : "关闭中", + "profileStatusLoading": "加载中", + "profileStatusStarted": "已连接", + "profileStatusStartedMessage": "连接成功", + "profileStatusStarting": "启动中", + "profileStatusStopping": "关闭中", "quit": "退出", - "refresh" : "刷新", - "relay" : "中继", - "relayDescription" : "您可以从我们现有的RV中选择或创建一个新的", - "remoteHost" : "远程主机", - "remoteHostDescription" : "", - "remotePort" : "远程端口", - "remotePortDescription" : "", - "resetAtsign" : "重置Atsign", - "rootDomainDefault" : "默认(生产)", - "rootDomainDemo" : "演示(VE)", + "refresh": "刷新", + "relay": "中继", + "relayDescription": "您可以从我们现有的中继服务器中选择或创建一个新的。", + "remoteHost": "远程主机", + "remoteHostDescription": "", + "remotePort": "远程端口", + "remotePortDescription": "", + "resendPin": "重新发送 PIN 码", + "resetAtsign": "重置 atSign", + "rootDomainDefault": "默认(生产)", + "rootDomainDemo": "演示(VE)", "selectExportFile": "请选择要导出的文件:", - "selectRootDomain" : "选择根域", - "serviceMapping" : "服务映射", - "settings" : "设置", - "showWindow" : "显示窗口", - "signout" : "登出", - "sshStyle" : "高级", - "starting" : "启动中", - "status" : "状态", - "stopping" : "停止中", - "submit" : "提交", - "validationErrorAtsignField" : "字段必须是以@开头的有效atSign", - "validationErrorDeviceNameField" : "字段只能包含小写字母、数字、下划线。", - "validationErrorEmptyField" : "字段不能为空", - "validationErrorLocalPortField" : "字段必须在1024-65535之间", - "validationErrorLongField" : "字段长度必须为1-36个字符", - "validationErrorRemoteHostField" : "字段必须是部分或完全合格的主机名或IP地址", - "validationErrorRemotePortField" : "字段必须在1-65535之间", - "yaml" : "YAML" -} + "selectRootDomain": "选择根域", + "serviceMapping": "服务映射", + "settings": "设置", + "showWindow": "显示窗口", + "signout": "登出", + "sshStyle": "高级", + "starting": "启动中", + "status": "状态", + "stopping": "停止中", + "submit": "提交", + "validationErrorAtsignField": "字段必须是以 @ 开头的有效 atSign", + "validationErrorDeviceNameField": "字段只能包含小写字母、数字和下划线。", + "validationErrorEmptyField": "字段不能为空", + "validationErrorLocalPortField": "字段必须在 1024-65535 之间", + "validationErrorLongField": "字段长度必须为 1-36 个字符", + "validationErrorRemoteHostField": "字段必须是部分或完全合格的主机名或 IP 地址", + "validationErrorRemotePortField": "字段必须在 1-65535 之间", + "yaml": "YAML" + } diff --git a/packages/dart/npt_flutter/lib/localization/app_zh_Hans_CH.arb b/packages/dart/npt_flutter/lib/localization/app_zh_Hans_CH.arb index 478e55785..5eb31fbca 100644 --- a/packages/dart/npt_flutter/lib/localization/app_zh_Hans_CH.arb +++ b/packages/dart/npt_flutter/lib/localization/app_zh_Hans_CH.arb @@ -1,5 +1,8 @@ { + "activationStatusActivating" : "正在激活", + "activationStatusOtpWait" : "请输入您邮箱中的OTP", + "activationStatusPreparing" : "准备激活", "addNew" : "新增", "addNewProfile" : "新增配置文件", "advanced": "高级", @@ -12,6 +15,7 @@ "atsignDialogSubtitle" : "请选择您的atSign", "atsignDialogTitle" : "AtSign", "back" : "返回", + "backupKeyDialogTitle" : "请选择要导出的文件:", "backupYourKey" : "备份您的密钥", "cancel" : "取消", "confirm" : "确认", @@ -32,11 +36,24 @@ "email" : "电子邮件", "emptyProfileMessage" : "未找到配置文件\n创建或导入配置文件以开始使用NoPorts。", "enableLogging" : "启用日志记录", + "errorAtKeySaveFailed" : "保存atKeys文件失败:{error}", + "errorAtKeysFileProcessFailed" : "atKeys 文件处理失败", + "errorAtKeysInvalid" : "检测到无效的 atKeys 文件", + "errorAtKeysUploadedMismatch" : "您上传的 atKeys 文件与请求的 atSign 不匹配", + "errorAtServerUnavailable": "无法检索 atserver 状态,请确保您的网络连接稳定。", + "errorAtServerUnreachable" : "无法连接到 atServer,请确保您的网络连接稳定。", + "errorAtSignAlreadyPaired" : "atSign {atsign} 已配对,请联系支持", + "errorAtSignNotExist" : "您请求的 atSign 在此根域名中不存在。", + "errorAtSignUnavailable" : "atSign 无法使用。请确保您已在仪表板中点击“激活”,并且网络连接稳定。", + "errorAuthenticatinFailed" : "身份验证失败", + "errorAuthenticationTimedOut" : "身份验证超时", + "errorOtpRequestFailed" : "请求OTP失败,请重试或联系支持", + "errorOtpVerificationFailed" : "无法验证OTP,请重试。若问题仍然存在,请联系支持", + "errorRootDomainNotSupported" : "指定的根域不支持自动激活。", + "errorSwitchAtSignFailed" : "激活后切换atSigns失败", "europe" : "欧洲", "export" : "导出", "exportLogs" : "导出日志", - "failed": "失败", - "failedToLoad" : "加载失败", "faq" : "常见问题", "feedback" : "反馈", "fileFormatInvalid" : "文档格式无效。请上传有效文件。", @@ -56,28 +73,30 @@ "noName" : "无名称", "noPorts" : "NoPorts", "onboard" : "入职", + "onboardingButtonStatusPicking" : "等待选择文件", + "onboardingButtonStatusProcessingFile" : "正在处理文件", "onboardingError" : "发生错误", "onboardingSubTitle" : "到NoPorts桌面", "onboardingTitle" : "欢迎", "overrideAllProfile":"用默认中继选择覆盖所有配置文件", "preview" : "预览", "privacyPolicy" : "隐私政策", - "profileDeleteMessage" : "此配置文件将被永久删除。", - "profileDeleteSelectedMessage" : "选定的配置文件将被永久删除。", + "profileDeleteMessage" : "此配置文件将被永久删除", + "profileDeleteSelectedMessage" : "所选配置文件将被永久删除", "profileExportDialogTitle" : "选择文件类型", "profileExportMessage" : "您想导出为哪种文件类型?", "profileExportSelectedMessage" : "您想将选定的配置文件导出为哪种文件类型?", "profileFailedLoaded" : "加载失败", "profileFailedSaveMessage": "配置文件保存失败", - "profileFailedUnknownMessage" : "未提供原因", + "profileFailedUnknownMessage" : "原因不明", "profileName" : "配置文件名称", - "profileNameDescription" : "这将是您的配置名称", - "profileRunningActionDeniedMessage" : "配置文件运行时无法执行此操作", + "profileNameDescription" : "这将是您的配置名称。", + "profileRunningActionDeniedMessage" : "配置文件运行时无法执行此操作。", "profileStatusFailedLoad": "加载失败", "profileStatusFailedSave": "保存失败", "profileStatusFailedStart": "启动失败", "profileStatusLoaded" : "已断开", - "profileStatusLoadedMessage": "当前已断开", + "profileStatusLoadedMessage": "当前已断开连接", "profileStatusLoading" : "加载中", "profileStatusStarted" : "已连接", "profileStatusStartedMessage":"连接成功", @@ -91,6 +110,7 @@ "remoteHostDescription" : "", "remotePort" : "远程端口", "remotePortDescription" : "", + "resendPin" : "重新发送PIN", "resetAtsign" : "重置Atsign", "rootDomainDefault" : "默认(生产)", "rootDomainDemo" : "演示(VE)", diff --git a/packages/dart/npt_flutter/lib/localization/app_zh_Hant_HK.arb b/packages/dart/npt_flutter/lib/localization/app_zh_Hant_HK.arb index 3ab848b43..fa400aa3f 100644 --- a/packages/dart/npt_flutter/lib/localization/app_zh_Hant_HK.arb +++ b/packages/dart/npt_flutter/lib/localization/app_zh_Hant_HK.arb @@ -1,115 +1,137 @@ { - "addNew" : "新增", - "addNewProfile" : "新增配置文件", + "activationStatusActivating": "啟動中", + "activationStatusOtpWait": "請輸入您電郵中的 OTP", + "activationStatusPreparing": "準備啟動", + "addNew": "新增", + "addNewProfile": "新增配置文件", "advanced": "高級", "alertDialogTitle": "你確定嗎?", - "allRightsReserved":"@ 2024 Atsign,版權所有", - "americas" : "美洲", - "asiaPacific" : "亞太地區", - "atDirectory" : "AtDirectory", - "atDirectorySubtitle" : "選擇你想使用的域名", - "atsignDialogSubtitle" : "請選擇你的atSign", - "atsignDialogTitle" : "AtSign", - "back" : "返回", - "backupYourKey" : "備份你的密鑰", - "cancel" : "取消", - "confirm" : "確認", - "connected" : "已連接", - "dashboard" : "儀表板", - "dashboardView" : "儀表板視圖", - "defaultRelaySelection" : "默認中繼選擇", - "delete" : "刪除", - "deviceAtsign" : "設備atSign", - "deviceAtsignDescription" : "這是與你設備相關聯的atSign", - "deviceName": "設備名稱", - "deviceNameDescription" : "這是你的遠程設備的名稱", - "disconnected" : "已斷開", - "discord" : "Discord", + "allRightsReserved": "@ 2024 Atsign,版權所有", + "americas": "美洲", + "asiaPacific": "亞太地區", + "atDirectory": "AtDirectory", + "atDirectorySubtitle": "選擇你想使用的域名", + "atsignDialogSubtitle": "請選擇你的 atSign", + "atsignDialogTitle": "AtSign", + "back": "返回", + "backupKeyDialogTitle": "請選擇要匯出的檔案:", + "backupYourKey": "備份你的密鑰", + "cancel": "取消", + "confirm": "確認", + "connected": "已連接", + "dashboard": "儀表板", + "dashboardView": "儀表板視圖", + "defaultRelaySelection": "預設中繼設定", + "delete": "刪除", + "deviceAtsign": "裝置 atSign", + "deviceAtsignDescription": "這是與你的裝置相關聯的 atSign", + "deviceName": "裝置名稱", + "deviceNameDescription": "這是你的遠程裝置的名稱", + "disconnected": "已斷開連線", + "discord": "Discord", "done": "完成", - "duplicate" : "重複", - "edit" : "編輯", - "email" : "電子郵件", - "emptyProfileMessage" : "未找到配置文件\n創建或導入配置文件以開始使用NoPorts。", - "enableLogging" : "啟用日誌記錄", - "europe" : "歐洲", - "export" : "導出", - "exportLogs" : "導出日誌", + "duplicate": "重複", + "edit": "編輯", + "email": "電子郵件", + "emptyProfileMessage": "未找到配置文件\n請建立或導入配置文件以開始使用 NoPorts。", + "enableLogging": "啟用日誌記錄", + "errorAtKeySaveFailed": "儲存 atKeys 檔案失敗:{error}", + "errorAtKeysFileProcessFailed": "atKeys 檔案處理失敗", + "errorAtKeysInvalid": "偵測到無效的 atKeys 檔案", + "errorAtKeysUploadedMismatch": "您上傳的 atKeys 檔案與請求的 atSign 不符", + "errorAtServerUnavailable": "無法擷取 atserver 狀態,請確保您的網路連線穩定。", + "errorAtServerUnreachable": "無法連接到 atServer,請確保您的網路連線穩定。", + "errorAtSignAlreadyPaired": "atSign {atsign} 已經配對,請聯絡支援", + "errorAtSignNotExist": "您請求的 atSign 在此根域中不存在", + "errorAtSignUnavailable": "atSign 無法使用。請確保您已從儀表板點擊「啟動」並擁有穩定的網路連線。", + "errorAuthenticatinFailed": "身份驗證失敗", + "errorAuthenticationTimedOut": "身份驗證逾時", + "errorOtpRequestFailed": "請求 OTP 失敗,請重試,或如問題仍然存在,請聯絡支援", + "errorOtpVerificationFailed": "無法驗證 OTP 與啟動伺服器,請重試。如問題仍然存在,請聯絡支援", + "errorRootDomainNotSupported": "指定的根域不支持自動啟動。", + "errorSwitchAtSignFailed": "啟動後切換 atSign 失敗", + "europe": "歐洲", + "export": "匯出", + "exportLogs": "匯出日誌", "failed": "失敗", - "failedToLoad" : "加載失敗", - "faq" : "常見問題", - "feedback" : "反饋", - "fileFormatInvalid" : "文件格式無效。請上傳有效的文件。", - "fileFormatInvalidDetails" : "配置文件部分缺失或格式不正確。請檢查文件。", - "getStarted" : "開始", - "import" : "導入", - "json" : "JSON", - "language" : "語言", - "loading" : "正在加載", - "localPort" : "本地端口", - "localPortDescription" : "", - "logs" : "日誌", - "minimal" : "簡單", - "next" : "下一步", - "noAtsign" : "沒有Atsign", - "noEmailClientAvailable" : "沒有可用的電子郵件客戶端", - "noName" : "無名", - "noPorts" : "NoPorts", - "onboard" : "入門", - "onboardingError" : "發生錯誤", - "onboardingSubTitle" : "到NoPorts桌面", - "onboardingTitle" : "歡迎", - "overrideAllProfile":"用默認中繼選擇覆蓋所有配置文件", - "preview" : "預覽", - "privacyPolicy" : "隱私政策", - "profileDeleteMessage" : "此配置文件將被永久刪除。", - "profileDeleteSelectedMessage" : "選定的配置文件將被永久刪除。", - "profileExportDialogTitle" : "選擇文件類型", - "profileExportMessage" : "你想導出為什麼文件類型?", - "profileExportSelectedMessage" : "你想將選定的配置文件導出為什麼文件類型?", - "profileFailedLoaded" : "加載失敗", - "profileFailedSaveMessage": "配置文件保存失敗", - "profileFailedUnknownMessage" : "未提供原因", - "profileName" : "配置文件名稱", - "profileNameDescription" : "這將是你的配置名稱", - "profileRunningActionDeniedMessage" : "配置文件運行時無法執行此操作", - "profileStatusFailedLoad": "加載失敗", - "profileStatusFailedSave": "保存失敗", + "failedToLoad": "載入失敗", + "faq": "常見問題", + "feedback": "意見回饋", + "fileFormatInvalid": "檔案格式無效。請上傳有效的檔案。", + "fileFormatInvalidDetails": "配置文件部分遺失或格式不正確。請檢查檔案。", + "getStarted": "開始", + "import": "導入", + "json": "JSON", + "language": "語言", + "loading": "載入中", + "localPort": "本地端口", + "localPortDescription": "", + "logs": "日誌", + "minimal": "簡易", + "next": "下一步", + "noAtsign": "沒有 atSign", + "noEmailClientAvailable": "沒有可用的電子郵件用戶端", + "noName": "無名", + "noPorts": "NoPorts", + "onboard": "入門", + "onboardingButtonStatusPicking": "等待選擇檔案", + "onboardingButtonStatusProcessingFile": "正在處理檔案", + "onboardingError": "發生錯誤", + "onboardingSubTitle": "到 NoPorts 桌面", + "onboardingTitle": "歡迎", + "overrideAllProfile": "使用預設中繼設定覆蓋所有配置文件", + "preview": "預覽", + "privacyPolicy": "私隱政策", + "profileDeleteMessage": "此配置文件將被永久刪除。", + "profileDeleteSelectedMessage": "已選取的配置文件將被永久刪除。", + "profileExportDialogTitle": "選擇檔案類型", + "profileExportMessage": "你想匯出成什麼檔案類型?", + "profileExportSelectedMessage": "你想將已選取的配置文件匯出成什麼檔案類型?", + "profileFailedLoaded": "載入失敗", + "profileFailedSaveMessage": "配置文件儲存失敗", + "profileFailedUnknownMessage": "原因不明", + "profileName": "配置文件名稱", + "profileNameDescription": "這將是你的配置名稱", + "profileRunningActionDeniedMessage": "配置文件正在運行時,無法執行此操作。", + "profileStatusFailedLoad": "載入失敗", + "profileStatusFailedSave": "儲存失敗", "profileStatusFailedStart": "啟動失敗", - "profileStatusLoaded" : "已斷開", - "profileStatusLoadedMessage": "當前已斷開", - "profileStatusLoading" : "加載中", - "profileStatusStarted" : "已連接", - "profileStatusStartedMessage":"連接成功", - "profileStatusStarting" : "啟動中", - "profileStatusStopping" : "關閉中", + "profileStatusLoaded": "已斷開連線", + "profileStatusLoadedMessage": "目前已斷開連線", + "profileStatusLoading": "載入中", + "profileStatusStarted": "已連接", + "profileStatusStartedMessage": "連線成功", + "profileStatusStarting": "啟動中", + "profileStatusStopping": "關閉中", "quit": "退出", - "refresh" : "刷新", - "relay" : "中繼", - "relayDescription" : "你可以從我們現有的RV中選擇或創建一個新的", - "remoteHost" : "遠程主機", - "remoteHostDescription" : "", - "remotePort" : "遠程端口", - "remotePortDescription" : "", - "resetAtsign" : "重置Atsign", - "rootDomainDefault" : "默認(生產)", - "rootDomainDemo" : "演示(VE)", - "selectExportFile": "請選擇要導出的文件:", - "selectRootDomain" : "選擇根域", - "serviceMapping" : "服務映射", - "settings" : "設置", - "showWindow" : "顯示窗口", - "signout" : "登出", - "sshStyle" : "高級", - "starting" : "正在啟動", - "status" : "狀態", - "stopping" : "正在停止", - "submit" : "提交", - "validationErrorAtsignField" : "字段必須是以@開頭的有效atSign", - "validationErrorDeviceNameField" : "字段只能包含小寫字母、數字、下劃線。", - "validationErrorEmptyField" : "字段不能為空", - "validationErrorLocalPortField" : "字段必須在1024-65535之間", - "validationErrorLongField" : "字段必須為1-36個字符長", - "validationErrorRemoteHostField" : "字段必須是部分或完全合格的主機名或IP地址", - "validationErrorRemotePortField" : "字段必須在1-65535之間", - "yaml" : "YAML" -} + "refresh": "重新整理", + "relay": "中繼", + "relayDescription": "您可以從我們現有的中繼伺服器中選擇或建立新的。", + "remoteHost": "遠程主機", + "remoteHostDescription": "", + "remotePort": "遠程端口", + "remotePortDescription": "", + "resendPin": "重新發送 PIN 碼", + "resetAtsign": "重置 atSign", + "rootDomainDefault": "預設(生產)", + "rootDomainDemo": "示範(VE)", + "selectExportFile": "請選擇要匯出的檔案:", + "selectRootDomain": "選擇根域", + "serviceMapping": "服務映射", + "settings": "設定", + "showWindow": "顯示視窗", + "signout": "登出", + "sshStyle": "高級", + "starting": "正在啟動", + "status": "狀態", + "stopping": "正在停止", + "submit": "提交", + "validationErrorAtsignField": "欄位必須是以 @ 開頭的有效 atSign", + "validationErrorDeviceNameField": "欄位只能包含小寫字母、數字和下劃線。", + "validationErrorEmptyField": "欄位不可為空", + "validationErrorLocalPortField": "欄位必須介於 1024-65535 之間", + "validationErrorLongField": "欄位長度必須為 1-36 個字元", + "validationErrorRemoteHostField": "欄位必須是部分或完全合格的主機名稱或 IP 地址", + "validationErrorRemotePortField": "欄位必須介於 1-65535 之間", + "yaml": "YAML" + } diff --git a/packages/dart/npt_flutter/lib/widgets/custom_text_button.dart b/packages/dart/npt_flutter/lib/widgets/custom_text_button.dart index 8ada85d79..9e1e2db41 100644 --- a/packages/dart/npt_flutter/lib/widgets/custom_text_button.dart +++ b/packages/dart/npt_flutter/lib/widgets/custom_text_button.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'dart:typed_data'; import 'package:at_backupkey_flutter/services/backupkey_service.dart'; -import 'package:at_contacts_flutter/services/contact_service.dart'; import 'package:at_onboarding_flutter/at_onboarding_flutter.dart'; import 'package:at_onboarding_flutter/at_onboarding_services.dart'; import 'package:file_picker/file_picker.dart'; @@ -138,7 +137,7 @@ class CustomTextButton extends StatelessWidget { // Get file path to write to String? outputFile = await FilePicker.platform.saveFile( - dialogTitle: 'Please select a file to export to:', + dialogTitle: strings.backupKeyDialogTitle, fileName: '${atsign}_key.atKeys', ); if (outputFile == null) return; @@ -152,8 +151,7 @@ class CustomTextButton extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( backgroundColor: Colors.red, - // TODO localize - content: Text("Failed to save the atKeys file: $e"), + content: Text(strings.errorAtKeySaveFailed(e.toString())), ), ); } From 1b7774d4ae5df1fb51013c656a2f6f9969d1c3c8 Mon Sep 17 00:00:00 2001 From: Curtly Critchlow Date: Tue, 26 Nov 2024 14:56:47 -0400 Subject: [PATCH 5/5] fix: added translations for missing strings. --- .../widgets/debug_dump_logs_button.dart | 3 +- .../onboarding/widgets/onboarding_button.dart | 6 ++- .../onboarding/widgets/onboarding_dialog.dart | 6 +-- .../profile/view/profile_header_view.dart | 6 +-- .../features/profile/view/profile_view.dart | 7 +-- .../widgets/profile_refresh_button.dart | 7 ++- .../profile_list/view/profile_list_view.dart | 4 +- .../settings/widgets/settings_error_hint.dart | 3 +- .../npt_flutter/lib/localization/app_en.arb | 52 +++++++++++-------- .../npt_flutter/lib/localization/app_es.arb | 8 ++- .../npt_flutter/lib/localization/app_pt.arb | 8 ++- .../lib/localization/app_pt_BR.arb | 8 ++- .../npt_flutter/lib/localization/app_zh.arb | 8 ++- .../lib/localization/app_zh_Hans_CH.arb | 8 ++- .../lib/localization/app_zh_Hant_HK.arb | 9 +++- 15 files changed, 95 insertions(+), 48 deletions(-) diff --git a/packages/dart/npt_flutter/lib/features/logging/widgets/debug_dump_logs_button.dart b/packages/dart/npt_flutter/lib/features/logging/widgets/debug_dump_logs_button.dart index 052db8dd9..8be8d579d 100644 --- a/packages/dart/npt_flutter/lib/features/logging/widgets/debug_dump_logs_button.dart +++ b/packages/dart/npt_flutter/lib/features/logging/widgets/debug_dump_logs_button.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:npt_flutter/features/logging/logging.dart'; import 'package:npt_flutter/styles/sizes.dart'; @@ -11,7 +12,7 @@ class DebugDumpLogsButton extends StatelessWidget { Widget build(BuildContext context) { if (!kDebugMode) return gap0; return ElevatedButton( - child: const Text("Dev: Dump Logs to terminal"), + child: Text(AppLocalizations.of(context)!.debugDumpLogTitle), onPressed: () { var list = context.read().logs; for (final line in list) { diff --git a/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart b/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart index 01c8f40a1..efef3d96d 100644 --- a/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart +++ b/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart @@ -1,4 +1,5 @@ import 'dart:developer'; +import 'dart:io'; import 'package:at_contacts_flutter/at_contacts_flutter.dart'; import 'package:at_onboarding_flutter/at_onboarding_flutter.dart'; @@ -17,6 +18,7 @@ import 'package:npt_flutter/features/onboarding/util/onboarding_util.dart'; import 'package:npt_flutter/features/onboarding/widgets/activate_atsign_dialog.dart'; import 'package:npt_flutter/features/onboarding/widgets/onboarding_dialog.dart'; import 'package:npt_flutter/routes.dart'; +import 'package:npt_flutter/util/language.dart'; import 'package:path_provider/path_provider.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; @@ -189,8 +191,8 @@ class _OnboardingButtonState extends State { } AtOnboardingConstants.setApiKey(apiKey); AtOnboardingConstants.rootDomain = util.config.atClientPreference.rootDomain; - // TODO: localize locale - right now hardcoded to english - await AtOnboardingLocalizations.load(const Locale("en")); + + await AtOnboardingLocalizations.load(LanguageUtil.getLanguageFromLocale(Locale(Platform.localeName)).locale); if (!mounted) return null; Map apis = { "root.atsign.org": "my.atsign.com", diff --git a/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_dialog.dart b/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_dialog.dart index ebbfd857f..8c5059437 100644 --- a/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_dialog.dart +++ b/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_dialog.dart @@ -25,13 +25,13 @@ class OnboardingDialog extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text("Select or type the client atSign"), + Text(strings.selectorTitleAtsign), gapH16, AtsignSelector( options: options, ), gapH16, - const Text("Select or type the root domain"), + Text(strings.selectorTitleRootDomain), AtDirectorySelector( options: options, ), @@ -53,7 +53,7 @@ class OnboardingDialog extends StatelessWidget { onPressed: () { Navigator.of(context).pop(true); }, - child: const Text("Next"), + child: Text(strings.next), ), ], )) diff --git a/packages/dart/npt_flutter/lib/features/profile/view/profile_header_view.dart b/packages/dart/npt_flutter/lib/features/profile/view/profile_header_view.dart index 75efd1e6f..364e1f40e 100644 --- a/packages/dart/npt_flutter/lib/features/profile/view/profile_header_view.dart +++ b/packages/dart/npt_flutter/lib/features/profile/view/profile_header_view.dart @@ -31,11 +31,11 @@ class ProfileHeaderView extends StatelessWidget { ); case ProfileListFailedLoad _: - return const Row( + return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Text("Failed to load this profile, please refresh manually:"), - ProfileListRefreshButton(), + Text(strings.errorProfileLoadFailed), + const ProfileListRefreshButton(), ], ); diff --git a/packages/dart/npt_flutter/lib/features/profile/view/profile_view.dart b/packages/dart/npt_flutter/lib/features/profile/view/profile_view.dart index 16b47cda0..be994e1f7 100644 --- a/packages/dart/npt_flutter/lib/features/profile/view/profile_view.dart +++ b/packages/dart/npt_flutter/lib/features/profile/view/profile_view.dart @@ -1,5 +1,6 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:npt_flutter/features/profile/profile.dart'; import 'package:npt_flutter/features/settings/settings.dart'; import 'package:npt_flutter/styles/sizes.dart'; @@ -28,11 +29,11 @@ class ProfileView extends StatelessWidget { ); case ProfileFailedLoad _: - return const Row( + return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Text("Failed to load this profile, please refresh manually:"), - ProfileRefreshButton(), + Text(AppLocalizations.of(context)!.errorProfileLoadFailed), + const ProfileRefreshButton(), ], ); diff --git a/packages/dart/npt_flutter/lib/features/profile/widgets/profile_refresh_button.dart b/packages/dart/npt_flutter/lib/features/profile/widgets/profile_refresh_button.dart index 03ebbd304..6ba7c8500 100644 --- a/packages/dart/npt_flutter/lib/features/profile/widgets/profile_refresh_button.dart +++ b/packages/dart/npt_flutter/lib/features/profile/widgets/profile_refresh_button.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:npt_flutter/features/profile/profile.dart'; class ProfileRefreshButton extends StatelessWidget { @@ -10,11 +11,9 @@ class ProfileRefreshButton extends StatelessWidget { return BlocBuilder( builder: (BuildContext context, ProfileState state) => ElevatedButton( onPressed: () { - context - .read() - .add(const ProfileLoadEvent(useCache: false)); + context.read().add(const ProfileLoadEvent(useCache: false)); }, - child: const Text("Refresh"), + child: Text(AppLocalizations.of(context)!.refresh), ), ); } diff --git a/packages/dart/npt_flutter/lib/features/profile_list/view/profile_list_view.dart b/packages/dart/npt_flutter/lib/features/profile_list/view/profile_list_view.dart index 6c689682a..863c95764 100644 --- a/packages/dart/npt_flutter/lib/features/profile_list/view/profile_list_view.dart +++ b/packages/dart/npt_flutter/lib/features/profile_list/view/profile_list_view.dart @@ -27,9 +27,9 @@ class ProfileListView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ - const Text("Failed to load profiles"), + Text(strings.profilesFailedLoaded), ElevatedButton( - child: const Text("Reload"), + child: Text(strings.reload), onPressed: () { context.read().add(const ProfileListLoadEvent()); }, diff --git a/packages/dart/npt_flutter/lib/features/settings/widgets/settings_error_hint.dart b/packages/dart/npt_flutter/lib/features/settings/widgets/settings_error_hint.dart index 6816476f9..5c4312a7b 100644 --- a/packages/dart/npt_flutter/lib/features/settings/widgets/settings_error_hint.dart +++ b/packages/dart/npt_flutter/lib/features/settings/widgets/settings_error_hint.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:npt_flutter/features/settings/settings.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; class SettingsErrorHint extends StatelessWidget { const SettingsErrorHint({ @@ -19,7 +20,7 @@ class SettingsErrorHint extends StatelessWidget { return BlocSelector(selector: (state) { return state is SettingsFailedLoad; }, builder: (context, hasError) { - if (hasError) return const Text("Error loading profile"); + if (hasError) return Text(AppLocalizations.of(context)!.profileFailedLoaded); return Container(); }); } diff --git a/packages/dart/npt_flutter/lib/localization/app_en.arb b/packages/dart/npt_flutter/lib/localization/app_en.arb index b0dee2030..1416fa01a 100644 --- a/packages/dart/npt_flutter/lib/localization/app_en.arb +++ b/packages/dart/npt_flutter/lib/localization/app_en.arb @@ -1,4 +1,7 @@ { + "activationStatusActivating" : "Activating", + "activationStatusOtpWait" : "Please enter the OTP from your email", + "activationStatusPreparing" : "Preparing for activation", "addNew" : "Add New", "addNewProfile" : "Add New Profile", "advanced": "Advanced", @@ -11,12 +14,14 @@ "atsignDialogSubtitle" : "Please select your atSign", "atsignDialogTitle" : "AtSign", "back" : "Back", + "backupKeyDialogTitle" : "Please select a file to export to:", "backupYourKey" : "Backup Your Key", "cancel" : "Cancel", "confirm" : "Confirm", "connected" : "connected", "dashboard" : "Dashboard", "dashboardView" : "Dashboard View", + "debugDumpLogTitle" : "Dev: Dump Logs to terminal", "defaultRelaySelection" : "Default Relay Selection", "delete" : "Delete", "deviceAtsign" : "Device atSign", @@ -31,6 +36,22 @@ "email" : "Email", "emptyProfileMessage" : "No profiles found\nCreate or Import a profile to start using NoPorts.", "enableLogging" : "Enable Logging", + "errorAtKeySaveFailed" : "Failed to save the atKeys file: {error}", + "errorAtKeysFileProcessFailed" : "Failed to process the atKeys file", + "errorAtKeysInvalid" : "Invalid atKeys file detected", + "errorAtKeysUploadedMismatch" : "The atKeys file you uploaded did not match the atSign requested", + "errorAtServerUnavailable": "Failed to retrieve the atserver status, make sure you have a stable internet connection", + "errorAtServerUnreachable" : "Unable to connect to the atServer, make sure you have a stable internet connection", + "errorAtSignAlreadyPaired" : "The atSign {atsign} is already paired, please contact support", + "errorAtSignNotExist" : "The atSign you have requested, doesn't exist in this root domain", + "errorAtSignUnavailable" : "The atSign is unavailable. Make sure you have pressed \"Activate\" from your dashboard and have a stable internet connection.", + "errorAuthenticatinFailed" : "Authentication failed", + "errorAuthenticationTimedOut" : "Authentication timed out", + "errorOtpRequestFailed" : "Failed to request an OTP, try resending, or contact support if the issue persists", + "errorOtpVerificationFailed" : "Failed to verify the OTP with the activation server, please try again. Contact support if the issue persists", + "errorProfileLoadFailed" : "Failed to load this profile, please refresh manually:", + "errorRootDomainNotSupported" : "The specified root domain is not supported by automatic activation.", + "errorSwitchAtSignFailed" : "Failed to switch atSigns after activation", "europe" : "Europe", "export" : "Export", "exportLogs" : "Export Logs", @@ -53,6 +74,8 @@ "noName" : "No Name", "noPorts" : "NoPorts", "onboard" : "Onboard", + "onboardingButtonStatusPicking" : "Waiting for file to be picked", + "onboardingButtonStatusProcessingFile" : "Processing file", "onboardingError" : "An error has occurred", "onboardingSubTitle" : "to NoPorts Desktop", "onboardingTitle" : "Welcome", @@ -64,12 +87,13 @@ "profileExportDialogTitle" : "Choose Filetype", "profileExportMessage" : "What filetype would you like to export as?", "profileExportSelectedMessage" : "What filetype would you like to export selected profiles as?", - "profileFailedLoaded" : "Failed to load", + "profileFailedLoaded" : "Profile failed to load", "profileFailedSaveMessage": "Profile failed to save", "profileFailedUnknownMessage" : "No reason provided", "profileName" : "Profile Name", "profileNameDescription" : "This will be the name of your configurations", "profileRunningActionDeniedMessage" : "Cannot perform this action while profile is running", + "profilesFailedLoaded" : "Profiles failed to load", "profileStatusFailedLoad": "Failed to load", "profileStatusFailedSave": "Failed to Save", "profileStatusFailedStart": "Failed to start", @@ -84,14 +108,18 @@ "refresh" : "Refresh", "relay" : "Relay", "relayDescription" : "Choose from our existing relays or create a new one.", + "reload" : "Reload", "remoteHost" : "Remote Host", "remoteHostDescription" : "", "remotePort" : "Remote Port", "remotePortDescription" : "", + "resendPin" : "Resend Pin", "resetAtsign" : "Reset Atsign", "rootDomainDefault" : "Default (Prod)", "rootDomainDemo" : "Demo (VE)", "selectExportFile": "Please select a file to export to:", + "selectorTitleAtsign" : "Select or type the client atSign", + "selectorTitleRootDomain" : "Select or type the root domain", "selectRootDomain" : "Select Root Domain", "serviceMapping" : "Service Mapping", "settings" : "Settings", @@ -109,27 +137,5 @@ "validationErrorLongField" : "Field must be 1-36 characters long", "validationErrorRemoteHostField" : "Field must be partially or fully qualified hostname or an IP address", "validationErrorRemotePortField" : "Field must be between 1-65535", - "onboardingButtonStatusPicking" : "Waiting for file to be picked", - "onboardingButtonStatusProcessingFile" : "Processing file", - "errorAtServerUnavailable": "Failed to retrieve the atserver status, make sure you have a stable internet connection", - "errorAtSignNotExist" : "The atSign you have requested, doesn't exist in this root domain", - "errorRootDomainNotSupported" : "The specified root domain is not supported by automatic activation.", - "errorSwitchAtSignFailed" : "Failed to switch atSigns after activation", - "errorAtSignUnavailable" : "The atSign is unavailable. Make sure you have pressed \"Activate\" from your dashboard and have a stable internet connection.", - "errorAtKeysInvalid" : "Invalid atKeys file detected", - "errorAtKeysUploadedMismatch" : "The atKeys file you uploaded did not match the atSign requested", - "errorAtKeysFileProcessFailed" : "Failed to process the atKeys file", - "errorAtServerUnreachable" : "Unable to connect to the atServer, make sure you have a stable internet connection", - "errorAuthenticatinFailed" : "Authentication failed", - "errorAuthenticationTimedOut" : "Authentication timed out", - "errorAtSignAlreadyPaired" : "The atSign {atsign} is already paired, please contact support", - "errorAtKeySaveFailed" : "Failed to save the atKeys file: {error}", - "errorOtpRequestFailed" : "Failed to request an OTP, try resending, or contact support if the issue persists", - "errorOtpVerificationFailed" : "Failed to verify the OTP with the activation server, please try again. Contact support if the issue persists", - "backupKeyDialogTitle" : "Please select a file to export to:", - "activationStatusPreparing" : "Preparing for activation", - "activationStatusOtpWait" : "Please enter the OTP from your email", - "activationStatusActivating" : "Activating", - "resendPin" : "Resend Pin", "yaml" : "YAML" } diff --git a/packages/dart/npt_flutter/lib/localization/app_es.arb b/packages/dart/npt_flutter/lib/localization/app_es.arb index 8710652f4..069e8e82f 100644 --- a/packages/dart/npt_flutter/lib/localization/app_es.arb +++ b/packages/dart/npt_flutter/lib/localization/app_es.arb @@ -21,6 +21,7 @@ "connected": "Conectado", "dashboard": "Panel de control", "dashboardView": "Vista del panel de control", + "debugDumpLogTitle": "Desarrollo: Volcar registros a la terminal", "defaultRelaySelection": "Selección de relé predeterminada", "delete": "Eliminar", "deviceAtsign": "atSign del dispositivo", @@ -48,6 +49,7 @@ "errorAuthenticationTimedOut": "Se agotó el tiempo de autenticación", "errorOtpRequestFailed": "No se pudo solicitar un código OTP. Intente de nuevo o contacte al soporte si el problema persiste.", "errorOtpVerificationFailed": "No se pudo verificar el código OTP. Intente de nuevo o contacte al soporte si el problema persiste.", + "errorProfileLoadFailed": "No se pudo cargar este perfil, por favor recargue manualmente:", "errorRootDomainNotSupported": "El dominio raíz especificado no es compatible con la activación automática.", "errorSwitchAtSignFailed": "No se pudo cambiar de atSign después de la activación", "europe": "Europa", @@ -87,12 +89,13 @@ "profileExportDialogTitle": "Elegir tipo de archivo", "profileExportMessage": "¿Qué tipo de archivo desea exportar?", "profileExportSelectedMessage": "¿Qué tipo de archivo desea exportar para los perfiles seleccionados?", - "profileFailedLoaded": "Error al cargar", + "profileFailedLoaded": "Error al cargar el perfil", "profileFailedSaveMessage": "Error al guardar el perfil", "profileFailedUnknownMessage": "No se especificó ningún motivo", "profileName": "Nombre del perfil", "profileNameDescription": "Este será el nombre de sus configuraciones", "profileRunningActionDeniedMessage": "No se puede realizar esta acción mientras el perfil esté en ejecución", + "profilesFailedLoaded": "Error al cargar los perfiles", "profileStatusFailedLoad": "Error al cargar", "profileStatusFailedSave": "Error al guardar", "profileStatusFailedStart": "Error al iniciar", @@ -107,6 +110,7 @@ "refresh": "Actualizar", "relay": "Relé", "relayDescription": "Puede elegir entre nuestros relés existentes o crear uno nuevo.", + "reload": "Recargar", "remoteHost": "Servidor remoto", "remoteHostDescription": "", "remotePort": "Puerto remoto", @@ -116,6 +120,8 @@ "rootDomainDefault": "Predeterminado (Producción)", "rootDomainDemo": "Demostración (VE)", "selectExportFile": "Seleccione un archivo para exportar:", + "selectorTitleAtsign": "Seleccione o ingrese el atSign del cliente", + "selectorTitleRootDomain": "Seleccione o ingrese el dominio raíz", "selectRootDomain": "Seleccionar dominio raíz", "serviceMapping": "Mapeo de servicios", "settings": "Ajustes", diff --git a/packages/dart/npt_flutter/lib/localization/app_pt.arb b/packages/dart/npt_flutter/lib/localization/app_pt.arb index 50c28af5b..c0d89cc3c 100644 --- a/packages/dart/npt_flutter/lib/localization/app_pt.arb +++ b/packages/dart/npt_flutter/lib/localization/app_pt.arb @@ -21,6 +21,7 @@ "connected": "Conectado", "dashboard": "Painel de controlo", "dashboardView": "Visualização do Painel de controlo", + "debugDumpLogTitle": "Dev: Enviar registos para o terminal", "defaultRelaySelection": "Seleção de Relay Predefinida", "delete": "Eliminar", "deviceAtsign": "atSign do dispositivo", @@ -48,6 +49,7 @@ "errorAuthenticationTimedOut": "Tempo limite de autenticação atingido", "errorOtpRequestFailed": "Falha ao solicitar um OTP. Tente novamente ou contacte o suporte se o problema persistir.", "errorOtpVerificationFailed": "Falha ao verificar o OTP com o servidor de ativação. Tente novamente. Contacte o suporte se o problema persistir.", + "errorProfileLoadFailed": "Falha ao carregar este perfil, por favor, atualize manualmente:", "errorRootDomainNotSupported": "O domínio raiz especificado não é suportado pela ativação automática.", "errorSwitchAtSignFailed": "Falha ao mudar de atSign após a ativação", "europe": "Europa", @@ -87,12 +89,13 @@ "profileExportDialogTitle": "Escolha o tipo de ficheiro", "profileExportMessage": "Que tipo de ficheiro pretende exportar?", "profileExportSelectedMessage": "Que tipo de ficheiro pretende exportar os perfis selecionados?", - "profileFailedLoaded": "Falha ao carregar", + "profileFailedLoaded": "Falha ao carregar o perfil", "profileFailedSaveMessage": "Falha ao guardar o perfil", "profileFailedUnknownMessage": "Razão não fornecida", "profileName": "Nome do Perfil", "profileNameDescription": "Este será o nome das suas configurações", "profileRunningActionDeniedMessage": "Não é possível realizar esta ação enquanto o perfil estiver em execução", + "profilesFailedLoaded": "Falha ao carregar os perfis", "profileStatusFailedLoad": "Falha ao carregar", "profileStatusFailedSave": "Falha ao guardar", "profileStatusFailedStart": "Falha ao iniciar", @@ -107,6 +110,7 @@ "refresh": "Atualizar", "relay": "Relay", "relayDescription": "Pode escolher entre os nossos relays existentes ou criar um novo.", + "reload": "Recarregar", "remoteHost": "Servidor Remoto", "remoteHostDescription": "", "remotePort": "Porta Remota", @@ -116,6 +120,8 @@ "rootDomainDefault": "Predefinido (Produção)", "rootDomainDemo": "Demo (VE)", "selectExportFile": "Selecione um ficheiro para exportar:", + "selectorTitleAtsign": "Selecione ou escreva o atSign do cliente", + "selectorTitleRootDomain": "Selecione ou escreva o domínio raiz", "selectRootDomain": "Selecione o Domínio Raiz", "serviceMapping": "Mapeamento de Serviço", "settings": "Definições", diff --git a/packages/dart/npt_flutter/lib/localization/app_pt_BR.arb b/packages/dart/npt_flutter/lib/localization/app_pt_BR.arb index 02929c5d7..c1c993d30 100644 --- a/packages/dart/npt_flutter/lib/localization/app_pt_BR.arb +++ b/packages/dart/npt_flutter/lib/localization/app_pt_BR.arb @@ -21,6 +21,7 @@ "connected": "Conectado", "dashboard": "Painel", "dashboardView": "Visualização do Painel", + "debugDumpLogTitle": "Dev: Enviar logs para o terminal", "defaultRelaySelection": "Seleção de Relay Padrão", "delete": "Excluir", "deviceAtsign": "atSign do dispositivo", @@ -48,6 +49,7 @@ "errorAuthenticationTimedOut": "Tempo de autenticação esgotado", "errorOtpRequestFailed": "Falha ao solicitar um OTP. Tente reenviar ou contate o suporte se o problema persistir.", "errorOtpVerificationFailed": "Falha na verificação do OTP. Tente novamente ou contate o suporte se o problema persistir.", + "errorProfileLoadFailed": "Falha ao carregar este perfil, por favor, atualize manualmente:", "errorRootDomainNotSupported": "O domínio raiz especificado não é compatível com a ativação automática.", "errorSwitchAtSignFailed": "Falha ao trocar de atSign após a ativação", "europe": "Europa", @@ -87,12 +89,13 @@ "profileExportDialogTitle": "Escolha o tipo de arquivo", "profileExportMessage": "Qual tipo de arquivo você deseja exportar?", "profileExportSelectedMessage": "Qual tipo de arquivo você deseja exportar os perfis selecionados?", - "profileFailedLoaded": "Falha ao carregar", + "profileFailedLoaded": "Falha ao carregar o perfil", "profileFailedSaveMessage": "Falha ao salvar o perfil", "profileFailedUnknownMessage": "Motivo não informado", "profileName": "Nome do Perfil", "profileNameDescription": "Este será o nome das suas configurações", "profileRunningActionDeniedMessage": "Não é possível executar essa ação enquanto o perfil estiver em execução", + "profilesFailedLoaded": "Falha ao carregar os perfis", "profileStatusFailedLoad": "Falha ao carregar", "profileStatusFailedSave": "Falha ao salvar", "profileStatusFailedStart": "Falha ao iniciar", @@ -107,6 +110,7 @@ "refresh": "Atualizar", "relay": "Relay", "relayDescription": "Você pode escolher entre nossos relays existentes ou criar um novo.", + "reload": "Recarregar", "remoteHost": "Host Remoto", "remoteHostDescription": "", "remotePort": "Porta Remota", @@ -116,6 +120,8 @@ "rootDomainDefault": "Padrão (Produção)", "rootDomainDemo": "Demo (VE)", "selectExportFile": "Selecione o arquivo para exportar:", + "selectorTitleAtsign": "Selecione ou digite o atSign do cliente", + "selectorTitleRootDomain": "Selecione ou digite o domínio raiz", "selectRootDomain": "Selecione o Domínio Raiz", "serviceMapping": "Mapeamento de Serviço", "settings": "Configurações", diff --git a/packages/dart/npt_flutter/lib/localization/app_zh.arb b/packages/dart/npt_flutter/lib/localization/app_zh.arb index 93d0853e5..358ba68e4 100644 --- a/packages/dart/npt_flutter/lib/localization/app_zh.arb +++ b/packages/dart/npt_flutter/lib/localization/app_zh.arb @@ -21,6 +21,7 @@ "connected": "已连接", "dashboard": "仪表盘", "dashboardView": "仪表盘视图", + "debugDumpLogTitle": "开发:将日志输出到终端", "defaultRelaySelection": "默认中继设置", "delete": "删除", "deviceAtsign": "设备 atSign", @@ -48,6 +49,7 @@ "errorAuthenticationTimedOut": "身份验证超时", "errorOtpRequestFailed": "请求 OTP 失败,请重试,或如果问题仍然存在,请联系支持", "errorOtpVerificationFailed": "与激活服务器验证 OTP 失败,请重试。如果问题仍然存在,请联系支持", + "errorProfileLoadFailed": "此配置文件加载失败,请手动刷新:", "errorRootDomainNotSupported": "指定的根域不支持自动激活。", "errorSwitchAtSignFailed": "激活后切换 atSign 失败", "europe": "欧洲", @@ -87,12 +89,13 @@ "profileExportDialogTitle": "选择文件类型", "profileExportMessage": "您想导出为哪种文件类型?", "profileExportSelectedMessage": "您想将选定的配置文件导出为哪种文件类型?", - "profileFailedLoaded": "加载失败", + "profileFailedLoaded": "配置文件加载失败", "profileFailedSaveMessage": "配置文件保存失败", "profileFailedUnknownMessage": "原因不明", "profileName": "配置文件名称", "profileNameDescription": "这将是您的配置名称", "profileRunningActionDeniedMessage": "配置文件正在运行时无法执行此操作", + "profilesFailedLoaded": "配置文件加载失败", "profileStatusFailedLoad": "加载失败", "profileStatusFailedSave": "保存失败", "profileStatusFailedStart": "启动失败", @@ -107,6 +110,7 @@ "refresh": "刷新", "relay": "中继", "relayDescription": "您可以从我们现有的中继服务器中选择或创建一个新的。", + "reload": "重新加载", "remoteHost": "远程主机", "remoteHostDescription": "", "remotePort": "远程端口", @@ -116,6 +120,8 @@ "rootDomainDefault": "默认(生产)", "rootDomainDemo": "演示(VE)", "selectExportFile": "请选择要导出的文件:", + "selectorTitleAtsign": "选择 atSign 或手动输入", + "selectorTitleRootDomain": "选择根域名或手动输入", "selectRootDomain": "选择根域", "serviceMapping": "服务映射", "settings": "设置", diff --git a/packages/dart/npt_flutter/lib/localization/app_zh_Hans_CH.arb b/packages/dart/npt_flutter/lib/localization/app_zh_Hans_CH.arb index 5eb31fbca..236aae499 100644 --- a/packages/dart/npt_flutter/lib/localization/app_zh_Hans_CH.arb +++ b/packages/dart/npt_flutter/lib/localization/app_zh_Hans_CH.arb @@ -22,6 +22,7 @@ "connected" : "已连接", "dashboard" : "仪表板", "dashboardView" : "仪表板视图", + "debugDumpLogTitle": "开发:将日志转储到终端", "defaultRelaySelection" : "默认中继选择", "delete" : "删除", "deviceAtsign" : "设备atSign", @@ -49,6 +50,7 @@ "errorAuthenticationTimedOut" : "身份验证超时", "errorOtpRequestFailed" : "请求OTP失败,请重试或联系支持", "errorOtpVerificationFailed" : "无法验证OTP,请重试。若问题仍然存在,请联系支持", + "errorProfileLoadFailed": "此配置文件加载失败,请手动刷新:", "errorRootDomainNotSupported" : "指定的根域不支持自动激活。", "errorSwitchAtSignFailed" : "激活后切换atSigns失败", "europe" : "欧洲", @@ -86,12 +88,13 @@ "profileExportDialogTitle" : "选择文件类型", "profileExportMessage" : "您想导出为哪种文件类型?", "profileExportSelectedMessage" : "您想将选定的配置文件导出为哪种文件类型?", - "profileFailedLoaded" : "加载失败", + "profileFailedLoaded": "配置文件加载失败", "profileFailedSaveMessage": "配置文件保存失败", "profileFailedUnknownMessage" : "原因不明", "profileName" : "配置文件名称", "profileNameDescription" : "这将是您的配置名称。", "profileRunningActionDeniedMessage" : "配置文件运行时无法执行此操作。", + "profilesFailedLoaded": "配置文件加载失败", "profileStatusFailedLoad": "加载失败", "profileStatusFailedSave": "保存失败", "profileStatusFailedStart": "启动失败", @@ -106,6 +109,7 @@ "refresh" : "刷新", "relay" : "中继", "relayDescription" : "您可以从我们现有的RV中选择或创建一个新的", + "reload": "重新加载", "remoteHost" : "远程主机", "remoteHostDescription" : "", "remotePort" : "远程端口", @@ -115,6 +119,8 @@ "rootDomainDefault" : "默认(生产)", "rootDomainDemo" : "演示(VE)", "selectExportFile": "请选择要导出的文件:", + "selectorTitleAtsign": "选择 atSign 或手动输入", + "selectorTitleRootDomain": "选择根域名或手动输入", "selectRootDomain" : "选择根域", "serviceMapping" : "服务映射", "settings" : "设置", diff --git a/packages/dart/npt_flutter/lib/localization/app_zh_Hant_HK.arb b/packages/dart/npt_flutter/lib/localization/app_zh_Hant_HK.arb index fa400aa3f..823af90f2 100644 --- a/packages/dart/npt_flutter/lib/localization/app_zh_Hant_HK.arb +++ b/packages/dart/npt_flutter/lib/localization/app_zh_Hant_HK.arb @@ -1,4 +1,5 @@ { + "activationStatusActivating": "啟動中", "activationStatusOtpWait": "請輸入您電郵中的 OTP", "activationStatusPreparing": "準備啟動", @@ -21,6 +22,7 @@ "connected": "已連接", "dashboard": "儀表板", "dashboardView": "儀表板視圖", + "debugDumpLogTitle": "開發:將日誌輸出到終端機", "defaultRelaySelection": "預設中繼設定", "delete": "刪除", "deviceAtsign": "裝置 atSign", @@ -48,6 +50,7 @@ "errorAuthenticationTimedOut": "身份驗證逾時", "errorOtpRequestFailed": "請求 OTP 失敗,請重試,或如問題仍然存在,請聯絡支援", "errorOtpVerificationFailed": "無法驗證 OTP 與啟動伺服器,請重試。如問題仍然存在,請聯絡支援", + "errorProfileLoadFailed": "此配置文件載入失敗,請手動重新整理:", "errorRootDomainNotSupported": "指定的根域不支持自動啟動。", "errorSwitchAtSignFailed": "啟動後切換 atSign 失敗", "europe": "歐洲", @@ -87,12 +90,13 @@ "profileExportDialogTitle": "選擇檔案類型", "profileExportMessage": "你想匯出成什麼檔案類型?", "profileExportSelectedMessage": "你想將已選取的配置文件匯出成什麼檔案類型?", - "profileFailedLoaded": "載入失敗", + "profileFailedLoaded": "配置文件載入失敗", "profileFailedSaveMessage": "配置文件儲存失敗", "profileFailedUnknownMessage": "原因不明", "profileName": "配置文件名稱", "profileNameDescription": "這將是你的配置名稱", "profileRunningActionDeniedMessage": "配置文件正在運行時,無法執行此操作。", + "profilesFailedLoaded": "配置文件載入失敗", "profileStatusFailedLoad": "載入失敗", "profileStatusFailedSave": "儲存失敗", "profileStatusFailedStart": "啟動失敗", @@ -107,6 +111,7 @@ "refresh": "重新整理", "relay": "中繼", "relayDescription": "您可以從我們現有的中繼伺服器中選擇或建立新的。", + "reload": "重新載入", "remoteHost": "遠程主機", "remoteHostDescription": "", "remotePort": "遠程端口", @@ -116,6 +121,8 @@ "rootDomainDefault": "預設(生產)", "rootDomainDemo": "示範(VE)", "selectExportFile": "請選擇要匯出的檔案:", + "selectorTitleAtsign": "選擇 atSign 或自行輸入", + "selectorTitleRootDomain": "選擇根域或自行輸入", "selectRootDomain": "選擇根域", "serviceMapping": "服務映射", "settings": "設定",