diff --git a/nym-vpn-android/app/build.gradle.kts b/nym-vpn-android/app/build.gradle.kts index c8851de26b..d995430d1b 100644 --- a/nym-vpn-android/app/build.gradle.kts +++ b/nym-vpn-android/app/build.gradle.kts @@ -18,6 +18,10 @@ android { namespace = "${Constants.NAMESPACE}.${Constants.APP_NAME}" compileSdk = Constants.COMPILE_SDK + androidResources { + generateLocaleConfig = true + } + defaultConfig { applicationId = "${Constants.NAMESPACE}.${Constants.APP_NAME}" minSdk = Constants.MIN_SDK diff --git a/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/RadioSurfaceButton.kt b/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/RadioSurfaceButton.kt index 6fab8d9c42..1768929029 100644 --- a/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/RadioSurfaceButton.kt +++ b/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/RadioSurfaceButton.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -37,7 +38,7 @@ fun RadioSurfaceButton(title: String, onClick: () -> Unit, selected: Boolean, le modifier = Modifier .fillMaxWidth() - .height(64.dp.scaledHeight()) + .height(IntrinsicSize.Min) .clickable(interactionSource = interactionSource, indication = null) { onClick() }, @@ -48,7 +49,8 @@ fun RadioSurfaceButton(title: String, onClick: () -> Unit, selected: Boolean, le Column( modifier = Modifier - .padding(end = 2.dp) + .padding(horizontal = 8.dp.scaledWidth(), vertical = 10.dp.scaledHeight()) + .padding(end = 16.dp.scaledWidth()).padding(start = 8.dp.scaledWidth()) .fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.Start, @@ -64,15 +66,15 @@ fun RadioSurfaceButton(title: String, onClick: () -> Unit, selected: Boolean, le Modifier .size( iconSize, - ) - .padding(start = 16.dp.scaledWidth()), + ), ) Row( - horizontalArrangement = Arrangement.spacedBy(16.dp.scaledHeight()), + horizontalArrangement = Arrangement.spacedBy(16.dp.scaledWidth()), verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(vertical = if (description == null) 10.dp.scaledHeight() else 0.dp), ) { leadingIcon?.let { - Icon(leadingIcon, leadingIcon.name, Modifier.size(iconSize)) + Icon(leadingIcon, leadingIcon.name, Modifier.size(iconSize.scaledWidth())) } Column { Text(title, style = MaterialTheme.typography.titleMedium) diff --git a/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/ScaledSwitch.kt b/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/ScaledSwitch.kt index 99475f9ab6..fc9250c354 100644 --- a/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/ScaledSwitch.kt +++ b/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/ScaledSwitch.kt @@ -1,11 +1,10 @@ package net.nymtech.nymvpn.ui.common.buttons +import androidx.compose.foundation.layout.padding import androidx.compose.material3.Switch import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.scale import androidx.compose.ui.unit.dp -import net.nymtech.nymvpn.util.scaledHeight @Composable fun ScaledSwitch(checked: Boolean, modifier: Modifier = Modifier, onClick: (checked: Boolean) -> Unit, enabled: Boolean = true) { @@ -13,7 +12,7 @@ fun ScaledSwitch(checked: Boolean, modifier: Modifier = Modifier, onClick: (chec checked, { onClick(it) }, modifier = - modifier.scale(1.2.dp.scaledHeight().value), + modifier.padding(0.dp), enabled = enabled, ) } diff --git a/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/surface/SurfaceSelectionGroupButton.kt b/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/surface/SurfaceSelectionGroupButton.kt index 12c9fef5f8..83f0a9efbb 100644 --- a/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/surface/SurfaceSelectionGroupButton.kt +++ b/nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/common/buttons/surface/SurfaceSelectionGroupButton.kt @@ -7,10 +7,8 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults @@ -47,20 +45,19 @@ fun SurfaceSelectionGroupButton(items: List) { indication = null, ) { it.onClick() - }.fillMaxWidth() - .width(360.dp.scaledWidth()) - .height(it.height.dp.scaledHeight()) - .padding(vertical = 8.dp.scaledHeight()), + } + .fillMaxWidth(), ) { Row( verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth(), + modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp.scaledHeight()), ) { Row( verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(16.dp.scaledWidth()), - modifier = Modifier.padding(start = 16.dp.scaledWidth()), + modifier = Modifier + .padding(start = 16.dp.scaledWidth()) + .weight(4f, false) + .fillMaxWidth(), ) { it.leadingIcon?.let { icon -> Icon( @@ -72,17 +69,23 @@ fun SurfaceSelectionGroupButton(items: List) { Column( horizontalAlignment = Alignment.Start, verticalArrangement = Arrangement.spacedBy(2.dp, Alignment.CenterVertically), - modifier = Modifier.width(236.dp.scaledWidth()), + modifier = Modifier + .fillMaxWidth() + .padding(start = if (it.leadingIcon != null) 16.dp.scaledWidth() else 0.dp) + .padding(vertical = if (it.description == null) 16.dp.scaledHeight() else 6.dp.scaledHeight()), ) { it.title() - it.description?.let { it() } + it.description?.let { + it() + } } } it.trailing?.let { Box( contentAlignment = Alignment.CenterEnd, modifier = Modifier - .padding(start = 16.dp.scaledWidth(), end = 24.dp.scaledWidth()), + .padding(end = 24.dp.scaledWidth(), start = 16.dp.scaledWidth()) + .weight(1f), ) { it() } @@ -90,11 +93,13 @@ fun SurfaceSelectionGroupButton(items: List) { ?: Box( contentAlignment = Alignment.CenterEnd, modifier = Modifier - .padding(start = 16.dp.scaledWidth(), end = 12.dp.scaledWidth()), + .padding(end = 12.dp.scaledWidth()) + .weight(1f), ) { + val icon = ImageVector.vectorResource(R.drawable.link_arrow_right) Icon( - ImageVector.vectorResource(R.drawable.link_arrow_right), - "arrow", + icon, + icon.name, Modifier.size( iconSize, ), diff --git a/nym-vpn-android/app/src/main/res/resources.properties b/nym-vpn-android/app/src/main/res/resources.properties new file mode 100644 index 0000000000..467b3efec9 --- /dev/null +++ b/nym-vpn-android/app/src/main/res/resources.properties @@ -0,0 +1 @@ +unqualifiedResLocale=en-US diff --git a/nym-vpn-android/app/src/main/res/values-es/strings.xml b/nym-vpn-android/app/src/main/res/values-es/strings.xml new file mode 100644 index 0000000000..c2f7ec3b0a --- /dev/null +++ b/nym-vpn-android/app/src/main/res/values-es/strings.xml @@ -0,0 +1,136 @@ + + + NymVPN + Configuración + Conectado + Desconectado + Desconectando + Conectando + 5 saltos Mixnet + Mejor para pagos, correos electrónicos, mensajes + 2 saltos Mixnet + Mejor para navegar, streaming, compartir + Primer salto + Último salto + Conectar + Desconectar + Iniciando cliente… + Estableciendo conexión + Tiempo de conexión + Seleccionar red + Conectar a + Selección del primer salto + Selección del último salto + Tema de pantalla + Tema claro + Tema oscuro + Automático + Usar tema del dispositivo + Buscar + Buscar país + Seleccionado + Más rápido + Conexión automática + Conectar automáticamente al reiniciar + Selecciona manualmente tu primer salto + Registros + Retroalimentación + Soporte + Compartir informes de errores anónimos + Sentry + vía + aplica al reiniciar + Legal + https://nymtech.net + https://nymvpn.com/en/privacy?type=apps + Términos de uso + Declaración de privacidad + Licencias + Abrir un problema en GitHub + Envíanos tus comentarios + Consulta las preguntas frecuentes + Únete a nosotros en Matrix + Únete a nosotros en Discord + https://matrix.to/#/%23NymVPN:nymtech.chat + https://discord.com/invite/nym + https://support.nymvpn.com + https://support.nymvpn.com/hc/en-us/requests/new + support@nymvpn.com + https://github.com/nymtech/nymvpn-android/issues/new/choose + Soporte de NymVPN + Enviar un correo electrónico… + Iniciar sesión + Agregar credencial + Agregar credencial para conectar + ¡Bienvenido! + Ingresa tu credencial para comenzar + Para generar una nueva credencial, utiliza el enlace proporcionado en el correo electrónico de invitación a la fase alfa. + Credencial + Credencial inválida + Ocurrió un error desconocido + Credencial + Izquierda + Recargar tu credencial + Recargar + Dispositivos + Android + Windows + macOS + Linux + iOS + Credencial agregada exitosamente + No se detectó ningún navegador + No se detectó ninguna aplicación de correo electrónico + Desconocido + URL del código fuente no encontrada + https://nymvpn.com/en/terms + 2 saltos + 5 saltos + Modo + De acuerdo + Los cambios en los informes de errores no se aplicarán completamente hasta que la aplicación se haya reiniciado. + Esta función aún está en progreso. + Registros guardados en la carpeta de descargas + https://sentry.io + Análisis anónimos + Ayúdanos a mejorar NymVPN + ¡Ayúdanos a mejorar nuestra aplicación durante la fase alfa! Tus comentarios son cruciales para identificar y resolver problemas. + Opta por la monitorización de errores anónimos + y análisis cuando quieras, puedes optar por no participar en cualquier momento. + ¡Gracias por tu apoyo! + a NymVPN alfa + Bienvenido + Continuar + Al continuar, aceptas los + y reconoces los + Compartir análisis anónimos del producto + Informes de errores anónimos + No se pudo recuperar los gateways + La credencial importada es inválida + Falta la credencial + No se pudieron cargar los países de salto + Atajos de aplicación + Habilitar atajos de aplicación + Deshabilitado mientras estás conectado a la VPN + Este es un software experimental. No confíes en él para obtener un anonimato fuerte (todavía). + Permiso requerido + No se encontró ninguna credencial importada. + No se ha concedido el permiso requerido. + La credencial es inválida o ha expirado + Para asegurarse de que la aplicación funcione correctamente en su dispositivo, permita los siguientes permisos. Estos permisos son necesarios para que la aplicación funcione. + Notificaciones + Permitir permisos + Necesario para mantener los servicios VPN en funcionamiento mientras la aplicación está cerrada. + No se pudo buscar los gateways de Nym. Por favor, comprueba tu conexión a la red e inténtalo de nuevo. + El gateway seleccionado tiene un certificado de par incorrecto. Inténtalo de nuevo para conectarte a un gateway diferente. + El gateway no tiene una dirección de nombre de host. Inténtalo de nuevo para conectarte a un gateway diferente. + La VPN se ha detenido inesperadamente. Intenta conectar de nuevo. + Interruptor de emergencia + Contactar soporte + horas + hora + días + día + Escanear QR de la credencial NymVPN + No se pudieron guardar los registros + diff --git a/nym-vpn-android/app/src/main/res/values-fr/strings.xml b/nym-vpn-android/app/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000000..d8fff125f2 --- /dev/null +++ b/nym-vpn-android/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,136 @@ + + + NymVPN + Réglages + Connecté + Déconnecté + Déconnexion + Connexion + Mixnet (via 5 nœuds) + Pour les paiements, emails et messages + Mixnet (via 2 nœuds) + Pour la navigation, le streaming et les téléchargements + Nœud d\'entrée + Nœud de sortie + Connecter + Déconnecter + Démarrage du client… + Connexion en cours + Temps de connection + Choix du réseau + Choix des nœuds + Premier nœud + Dernier nœud + Apparence d\'affichage + Apparence claire + Apparence sombre + Automatique + Apparence de l\'appareil + Recherche + Rechercher un pays + Sélectionné + Le plus rapide + Auto-connexion + Auto-connexion au redémarrage + Choix du nœud d\'entrée + Journaux + Commentaires + Service clients + Partager les rapports d\'erreurs anonymes + Sentry + via + prend effet au redémarrage + Juridique + https://nymtech.net + https://nymvpn.com/en/privacy?type=apps + C.G.U. + Politique de confidentialité + Licences + Créer un ticket GitHub + Envoyer un commentaire + Lire la F.A.Q. + Rejoignez-nous sur Matrix + Rejoignez-nous sur Discord + https://matrix.to/#/%23NymVPN:nymtech.chat + https://discord.com/invite/nym + https://support.nymvpn.com + https://support.nymvpn.com/hc/en-us/requests/new + support@nymvpn.com + https://github.com/nymtech/nymvpn-android/issues/new/choose + Service clients NymVPN + Envoyer un email… + Inscription + Ajouter un identifiant + Ajoutez un identifiant pour vous connecter + Bienvenue ! + Saisissez votre identifiant pour démarrer + Pour générer un identifiant, merci d\'utiliser le lien fourni dans l\'email d\'invitation à la phase de tests. + Identifiant + Identifiant invalide + Une erreur inconnue s\'est produite + Identifiant + restant + Ajoutez du crédit + Ajouter du crédit + Appareils + Android + Windows + macOS + Linux + iOS + Identifiant ajouté + Aucun navigateur détecté + Aucune application d\'email détectée + Inconnu + Impossible de trouver le code source de l\'URL + https://nymvpn.com/en/terms + 2 nœuds + 5 nœuds + Mode + OK + Le changement de préférence pour les rapports d\'erreur prendra effet au redémarrage de l\'application. + Cette fonctionnalité est encore en développement. + Journaux enregistrés dans le dossier Téléchargements + https://sentry.io + Rapports d\'analyse anonymes + Aider nous à améliorer NymVPN + Aidez-nous à identifier et résoudre les problèmes rencontrés pendant la phase de tests ! Vos retours sont très utiles. + Activer les rapports d\'erreur anonymes + et les rapports d\'usage que vous pouvez désactiver à tout moment. + Merci de votre soutien ! + en phase de tests alpha de NymVPN + Bienvenue + Continuer + En continuant, vous acceptez les\'s + et reconnaissez avoir pris connaissance de la\'s + Partager les rapports d\'analyses anonymes + Rapports d\'erreur anonymes + Échec du chargement des passerelles (gateways) + L\'identifiant n\'est pas valide + Identifiant manquant + Échec du chargement des pays + Raccourcis d\'application + Activer les raccourcis + Désactivé pendant la connection + Ce logiciel est expérimental. Ne vous reposez pas dessus pour protéger votre vie privée. + Permission demandée + Aucun identifiant trouvé. + La permission n\'a pas été accordée. + L\'identifiant est invalide ou a expiré + Pour assurer un fonctionnement optimal de l\'application, merci d\'accorder les permissions suivantes. + Notifications + Accorder les permissions + Requis pour fournir la connection au réseau lorsque l\'application est fermée. + Échec de la recherche des passerelles (gateways). Vérifiez votre connection et réessayez. + "La passerelle (gateway) sélectionnée a un certificat invalide. Essayez de vous connecter à une autre passerelle. " + L\'adresse du nom de domaine (hostname) de la passerelle (gateway) est manquante. Essayez de vous connecter à une autre passerelle. + L\'application s\'est arrêtée de manière inattendue. Essayez de vous reconnecter. + Arrêt d\'urgence (kill switch) + Contacter le Service clients + heures + heure + jours + jour + Scannez l\'identifiant QR de NymVPN + Les journaux n\'ont pas été enregistrés + diff --git a/nym-vpn-android/app/src/main/res/values-pt/strings.xml b/nym-vpn-android/app/src/main/res/values-pt/strings.xml new file mode 100644 index 0000000000..2aa6d1d9a2 --- /dev/null +++ b/nym-vpn-android/app/src/main/res/values-pt/strings.xml @@ -0,0 +1,136 @@ + + + NymVPN + Configurações + Conectado + Desconectado + Desconectando + Conectando + 5-saltos mixnet + Melhor para pagamentos, emails e mensagens + 2-saltos mixnet + Melhor para navegação, transmissão e compartilhamento + Primeiro salto + Último salto + Conectar + Desconectar + Inicializando cliente… + Estabelecendo conexão... + Tempo de Conexão + Selecionar rede + Conectar ao + Seleção do primeiro salto + Seleção do último salto + Tema da Tela + Tema claro + Tema escuro + Automático + Usa tema do dispositivo + Procurar + Procurar país + Selecionado + Mais rápido + Conexão Automática + Conexão Automática ao reiniciar + Selecione manualmente seu primeiro salto + Logs + Feedback + Suporte + Compartilhe o relatório de erros anonimamente + Sentry + via + aplique ao reiniciar + Legal + https://nymtech.net + https://nymvpn.com/en/privacy?type=apps + Termos de uso + Declaração de Privacidade + Licenças + Abra uma issue no GitHub + Envie-nos um feedback + Cheque o FAQ + Junte-se a nós no Matrix + Junte-se a nós no Discord + https://matrix.to/#/%23NymVPN:nymtech.chat + https://discord.com/invite/nym + https://support.nymvpn.com + https://support.nymvpn.com/hc/en-us/requests/new + support@nymvpn.com + https://github.com/nymtech/nymvpn-android/issues/new/choose + Suporte NymVPN + Envie um email… + Login + Adicione credencial + Adicione credencial para conectar + Bem Vindo! + Entre com sua credencial para começar + Para gerar uma nova credencial, por favor use o link fornecido nos emails de convite da fase alpha. + Credencial + Credencial Inválida + Um erro desconhecido ocorreu + Credencial + restando + Recarregue sua credencial + Recarregue + Dispositivos + Android + Windows + macOS + Linux + iOS + Credencial adicionada com sucesso + Nenhum navegador detectado + Nenhum app de email detectado + Desconhecido + Url do código de origem não encontrada + https://nymvpn.com/en/terms + 2-laços + 5-laços + Modo + Okay + Mudanças para o relatório de erros não terão efeito completo até o aplicativo ser reiniciado. + Esta ferramenta ainda está em progresso. + Logs salvados na pasta Download + https://sentry.io + Análises Anônimas + Ajude-nos a melhorar a NymVPN + Ajude-nos a refinar nossso aplicativo durante a fase alpha! Seu feedback é crucial para identificar e solucionar problemas. + Ative o monitoramento anônimo de erros + e análises à vontade – você pode cancelar a qualquer momento. + Obrigado pelo seu apoio! + para NymVPN alpha + Bem Vindo + Continue + Por continuar, você concorda com NymVPN\'s + e reconhece NymVPN\'s + Compartilhe análises anônimas do produto + Relatórios de erros anônimos + Falha ao recuperar Gateways + Credencial importada é inválida + Faltando credencial + Falha ao carregar os países de salto + Atalhos do app + Habilitar os atalhos do app + Desativado enquanto conectado a VPN + Este é um software experimental. Não confie nele para um anonimato forte (ainda). + Permissão requerida + Não encontrada credenciais importadas. + Permissão requerida não foi concedida. + Credencial inválida ou expirada + Para garantir que o app trabalhe corretamente no seu dispositivo, por favor siga as seguintes permissões. Estas permissões são requeridas para que o app funcione. + Notificações + Permitir permissões + Requerido para manter os serviços de VPN executando enquanto o app está fechado. + Falhou em procurar por NYM Gateways.Por favor, cheque sua conexão de rede e tente novamente. + "Gateway selecionado tem um certificado de peer inválido. Por favor, tente se conectar com um gateway diferente." + Faltando o endereço de hostname do gateway. Por favor, tente se conectar com um gateway diferente. + A VPN parou inesperadamente. Por favor, tente conectar novamente. + Desligar + Contato de Suporte + horas + hora + dias + dia + Scanear QR da Credencial NymVPN + Falhou em salvar logs +