better language and show wg config on device save (#3065)

* better language and show wg config on device save

* chore: fix

---------

Co-authored-by: waterplea <alexander@inkin.ru>
This commit is contained in:
Matt Hill
2025-12-02 14:42:14 -07:00
committed by GitHub
parent a9c9917f1a
commit db2fab245e
7 changed files with 48 additions and 31 deletions

View File

@@ -535,6 +535,7 @@ export default {
569: 'Wählen Sie eine Zertifizierungsstelle aus, um SSL/TLS-Zertifikate für diese Domain auszustellen.',
570: 'Andere',
571: 'Ein Name zur einfachen Identifizierung des Gateways',
572: 'Nicht gut für öffentlichen Zugriff, da das Zertifikat von der Root-CA Ihres Servers signiert ist',
574: 'Datei',
575: 'StartTunnel-Konfigurationsdatei',
576: 'Kopieren/Einfügen',
@@ -548,7 +549,7 @@ export default {
584: 'Verbindungen können manchmal langsam oder unzuverlässig sein',
585: 'Öffentlich, wenn Sie die Adresse öffentlich teilen, andernfalls privat',
586: 'Erfordert ein Tor-fähiges Gerät oder einen Browser',
587: 'Nur nützlich für Clients, die SSL erzwingen',
587: 'In den meisten Fällen nicht empfohlen. Nur erforderlich für Apps, die HTTPS erzwingen',
588: 'Ideal für anonyme, zensurresistente Bereitstellung und Fernzugriff',
589: 'Ideal für lokalen Zugriff',
590: 'Erfordert die Verbindung mit demselben lokalen Netzwerk (LAN) wie Ihr Server, entweder physisch oder über VPN',
@@ -561,11 +562,11 @@ export default {
597: 'der sich auflöst zu',
598: 'Nicht empfohlen für VPN-Zugriff. VPNs unterstützen keine „.local“-Domains ohne erweiterte Konfiguration',
599: 'Kann für Clearnet-Zugriff verwendet werden',
600: 'In den meisten Fällen nicht empfohlen. Öffentliche Domains werden bevorzugt',
600: 'In den meisten Fällen nicht empfohlen. Öffentliche Domains sind üblicher und werden bevorzugt',
601: 'Lokal',
602: 'Kann für lokalen Zugriff verwendet werden',
603: 'Ideal für öffentlichen Zugriff über das Internet',
604: 'Kann für persönlichen Zugriff über das öffentliche Internet verwendet werden. VPN ist privater und sicherer',
604: 'Kann für persönlichen Zugriff über das öffentliche Internet verwendet werden, aber ein VPN ist privater und sicherer',
605: 'wenn die Verwendung von IP-Adressen und Ports unerwünscht ist',
606: 'Host',
607: 'Wert',

View File

@@ -534,6 +534,7 @@ export const ENGLISH = {
'Select a Certificate Authority to issue SSL/TLS certificates for this domain': 569,
'Other': 570, // as in, a list option to indicate none of the options listed
'A name to easily identify the gateway': 571,
"Not good for public access, since the certificate is signed by your Server's Root CA": 572,
'File': 574, // as in, a computer file
'StartTunnel Config File': 575,
'Copy/Paste': 576,
@@ -547,7 +548,7 @@ export const ENGLISH = {
'Connections can be slow or unreliable at times': 584,
'Public if you share the address publicly, otherwise private': 585,
'Requires using a Tor-enabled device or browser': 586,
'Only useful for clients that require SSL': 587,
'Not recommended in most cases. Only needed for apps that enforce HTTPS': 587,
'Ideal for anonymous, censorship-resistant hosting and remote access': 588,
'Ideal for local access': 589,
'Requires being connected to the same Local Area Network (LAN) as your server, either physically or via VPN': 590,
@@ -560,11 +561,11 @@ export const ENGLISH = {
'that resolves to': 597, // this is a partial sentence. It is preceded by "requires a DNS record for [domain] "
'Not recommended for VPN access. VPNs do not support ".local" domains without advanced configuration': 598,
'Can be used for clearnet access': 599,
'Not recommended in most cases. Public domains are preferred': 600,
'Not recommended in most cases. Using a public domain is more common and preferred': 600,
'Local': 601, // as in, not remote
'Can be used for local access': 602,
'Ideal for public access via the Internet': 603,
'Can be used for personal access via the public Internet. VPN is more private and secure': 604,
'Can be used for personal access via the public Internet, but a VPN is more private and secure': 604,
'when using IP addresses and ports is undesirable': 605, // this is a partial sentence. It is preceded by "Good for connections "
'Host': 606, // as in, a network host
'Value': 607, // as in, the value in a column of a table

View File

@@ -535,6 +535,7 @@ export default {
569: 'Selecciona una Autoridad Certificadora para emitir certificados SSL/TLS para este dominio.',
570: 'Otro',
571: 'Un nombre para identificar fácilmente la puerta de enlace',
572: 'No es adecuado para acceso público, ya que el certificado está firmado por la CA raíz de tu servidor',
574: 'Archivo',
575: 'Archivo de configuración de StartTunnel',
576: 'Copiar/Pegar',
@@ -548,7 +549,7 @@ export default {
584: 'Las conexiones pueden ser lentas o poco confiables a veces',
585: 'Público si compartes la dirección públicamente, de lo contrario privado',
586: 'Requiere un dispositivo o navegador habilitado para Tor',
587: 'Solo útil para clientes que imponen SSL',
587: 'No recomendado en la mayoría de los casos. Solo necesario para aplicaciones que imponen HTTPS',
588: 'Ideal para alojamiento y acceso remoto anónimo y resistente a la censura',
589: 'Ideal para acceso local',
590: 'Requiere estar conectado a la misma red de área local (LAN) que tu servidor, ya sea físicamente o mediante VPN',
@@ -561,11 +562,11 @@ export default {
597: 'que se resuelva en',
598: 'No recomendado para acceso VPN. Las VPN no admiten dominios “.local” sin configuración avanzada',
599: 'Se puede usar para acceso a clearnet',
600: 'No recomendado en la mayoría de los casos. Se prefieren los dominios de públicos',
600: 'No recomendado en la mayoría de los casos. Los dominios públicos son más comunes y preferidos',
601: 'Local',
602: 'Se puede usar para acceso local',
603: 'Ideal para acceso público a través de Internet',
604: 'Se puede usar para acceso personal a través de Internet público. VPN es más privado y seguro',
604: 'Puede usarse para acceso personal a través de Internet público, pero una VPN es más privada y segura',
605: 'cuando el uso de direcciones IP y puertos no es deseable',
606: 'Host',
607: 'Valor',

View File

@@ -535,6 +535,7 @@ export default {
569: 'Sélectionnez une Autorité de Certification pour émettre des certificats SSL/TLS pour ce domaine.',
570: 'Autre',
571: 'Un nom pour identifier facilement la passerelle',
572: 'Pas idéal pour un accès public, car le certificat est signé par lAC racine de votre serveur',
574: 'Fichier',
575: 'Fichier de configuration StartTunnel',
576: 'Copier/Coller',
@@ -548,7 +549,7 @@ export default {
584: 'Les connexions peuvent parfois être lentes ou peu fiables',
585: 'Public si vous partagez ladresse publiquement, sinon privé',
586: 'Nécessite un appareil ou un navigateur compatible Tor',
587: 'Utile uniquement pour les clients qui imposent SSL',
587: 'Non recommandé dans la plupart des cas. Nécessaire uniquement pour les applications qui imposent HTTPS',
588: 'Idéal pour lhébergement et laccès à distance anonymes et résistants à la censure',
589: 'Idéal pour un accès local',
590: 'Nécessite dêtre connecté au même réseau local (LAN) que votre serveur, soit physiquement, soit via VPN',
@@ -561,11 +562,11 @@ export default {
597: 'qui se résout en',
598: 'Non recommandé pour laccès VPN. Les VPN ne prennent pas en charge les domaines « .local » sans configuration avancée',
599: 'Peut être utilisé pour un accès clearnet',
600: 'Non recommandé dans la plupart des cas. Les domaines publics sont préférés',
600: 'Non recommandé dans la plupart des cas. Les domaines publics sont plus courants et préférés',
601: 'Local',
602: 'Peut être utilisé pour un accès local',
603: 'Idéal pour un accès public via Internet',
604: 'Peut être utilisé pour un accès personnel via Internet public. Le VPN est plus privé et sécurisé',
604: 'Peut être utilisé pour un accès personnel via lInternet public, mais un VPN est plus privé et plus sécurisé',
605: 'lorsque lutilisation des adresses IP et des ports est indésirable',
606: 'Hôte',
607: 'Valeur',

View File

@@ -535,6 +535,7 @@ export default {
569: 'Wybierz Urząd Certyfikacji, aby wystawić certyfikaty SSL/TLS dla tej domeny.',
570: 'Inne',
571: 'Nazwa ułatwiająca identyfikację bramy',
572: 'Niezalecane do publicznego dostępu, ponieważ certyfikat jest podpisany przez główną CA serwera',
574: 'Plik',
575: 'Plik konfiguracyjny StartTunnel',
576: 'Kopiuj/Wklej',
@@ -548,7 +549,7 @@ export default {
584: 'Połączenia mogą być czasami wolne lub niestabilne',
585: 'Publiczne, jeśli udostępniasz adres publicznie, w przeciwnym razie prywatne',
586: 'Wymaga urządzenia lub przeglądarki obsługującej Tor',
587: 'Przydatne tylko dla klientów wymuszających SSL',
587: 'Niezalecane w większości przypadków. Wymagane tylko dla aplikacji wymuszających HTTPS',
588: 'Idealne do anonimowego, odpornego na cenzurę hostingu i zdalnego dostępu',
589: 'Idealne do dostępu lokalnego',
590: 'Wymaga połączenia z tą samą siecią lokalną (LAN) co serwer, fizycznie lub przez VPN',
@@ -561,11 +562,11 @@ export default {
597: 'który rozwiązuje się na',
598: 'Niezalecane do dostępu VPN. VPN-y nie obsługują domen „.local” bez zaawansowanej konfiguracji',
599: 'Może być używane do dostępu do clearnet',
600: 'Niezalecane w większości przypadków. Preferowane są domeny publiczne',
600: 'Niezalecane w większości przypadków. Domeny publiczne są bardziej powszechne i preferowane',
601: 'Lokalne',
602: 'Może być używane do dostępu lokalnego',
603: 'Idealne do publicznego dostępu przez Internet',
604: 'Może być używane do osobistego dostępu przez publiczny Internet. VPN jest bardziej prywatny i bezpieczny',
604: 'Może być używane do osobistego dostępu przez publiczny Internet, ale VPN jest bardziej prywatny i bezpieczny',
605: 'gdy używanie adresów IP i portów jest niepożądane',
606: 'Host',
607: 'Wartość',

View File

@@ -1,10 +1,5 @@
import { AsyncPipe } from '@angular/common'
import {
ChangeDetectionStrategy,
Component,
inject,
Signal,
} from '@angular/core'
import { ChangeDetectionStrategy, Component, inject } from '@angular/core'
import {
NonNullableFormBuilder,
ReactiveFormsModule,
@@ -23,6 +18,7 @@ import {
TuiError,
TuiTextfield,
} from '@taiga-ui/core'
import { TuiDialogService } from '@taiga-ui/experimental'
import {
TuiChevron,
TuiDataListWrapper,
@@ -34,12 +30,13 @@ import { TuiForm } from '@taiga-ui/layout'
import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus'
import { ApiService } from 'src/app/services/api/api.service'
import { DEVICES_CONFIG } from './config'
import {
getIp,
DeviceData,
getIp,
ipInSubnetValidator,
MappedSubnet,
subnetValidator,
ipInSubnetValidator,
} from './utils'
@Component({
@@ -118,6 +115,7 @@ export class DevicesAdd {
private readonly loading = inject(LoadingService)
private readonly api = inject(ApiService)
private readonly errorService = inject(ErrorService)
private readonly dialogs = inject(TuiDialogService)
protected readonly mobile = inject(TUI_IS_MOBILE)
protected readonly context =
@@ -167,9 +165,18 @@ export class DevicesAdd {
const data = { ip, name, subnet: subnet?.range || '' }
try {
this.context.data.device
? await this.api.editDevice(data)
: await this.api.addDevice(data)
if (this.context.data.device) {
await this.api.editDevice(data)
} else {
await this.api.addDevice(data)
const config = await this.api.showDeviceConfig({
subnet: data.subnet,
ip,
})
this.dialogs.open(DEVICES_CONFIG, { data: config }).subscribe()
}
} catch (e: any) {
console.error(e)
this.errorService.handleError(e)

View File

@@ -354,7 +354,9 @@ export class InterfaceService {
if (ssl) {
type = `${type} (SSL)`
bullets = [
this.i18n.transform('Only useful for clients that require SSL'),
this.i18n.transform(
'Not recommended in most cases. Only needed for apps that enforce HTTPS',
),
rootCaRequired,
...bullets,
]
@@ -409,13 +411,13 @@ export class InterfaceService {
bullets = [
this.i18n.transform('Can be used for clearnet access'),
this.i18n.transform(
'Not recommended in most cases. Public domains are preferred',
'Not recommended in most cases. Using a public domain is more common and preferred',
),
rootCaRequired,
]
if (!info.gateway.public) {
bullets.push(
`${portForwarding} "${gatewayName}": ${port} -> ${gateway?.subnets.find(s => s.isIpv4())?.address}:${port}`,
`${portForwarding} "${gatewayName}": ${port} -> ${port}`,
)
}
} else {
@@ -452,7 +454,7 @@ export class InterfaceService {
if (!info.gateway.public) {
bullets.push(
`${portForwarding} "${gatewayName}": ${port} -> ${gateway?.subnets.find(s => s.isIpv4())?.address}:${port === 443 ? 5443 : port}`,
`${portForwarding} "${gatewayName}": ${port} -> ${port === 443 ? 5443 : port}`,
)
}
@@ -463,7 +465,10 @@ export class InterfaceService {
} else {
bullets = [
this.i18n.transform(
'Can be used for personal access via the public Internet. VPN is more private and secure',
'Can be used for personal access via the public Internet, but a VPN is more private and secure',
),
this.i18n.transform(
`Not good for public access, since the certificate is signed by your Server's Root CA`,
),
rootCaRequired,
...bullets,