Feature/consolidate setup (#3092)

* start consolidating

* add start-cli flash-os

* combine install and setup and refactor all

* use http

* undo mock

* fix translation

* translations

* use dialogservice wrapper

* better ST messaging on setup

* only warn on update if breakages (#3097)

* finish setup wizard and ui language-keyboard feature

* fix typo

* wip: localization

* remove start-tunnel readme

* switch to posix strings for language internal

* revert mock

* translate backend strings

* fix missing about text

* help text for args

* feat: add "Add new gateway" option (#3098)

* feat: add "Add new gateway" option

* Update web/projects/ui/src/app/routes/portal/components/form/controls/select.component.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add translation

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Matt Hill <mattnine@protonmail.com>

* fix dns selection

* keyboard keymap also

* ability to shutdown after install

* revert mock

* working setup flow + manifest localization

* (mostly) redundant localization on frontend

* version bump

* omit live medium from disk list and better space management

* ignore missing package archive on 035 migration

* fix device migration

* add i18n helper to sdk

* fix install over 0.3.5.1

* fix grub config

---------

Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
Co-authored-by: Alex Inkin <alexander@inkin.ru>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Aiden McClelland
2026-01-27 14:44:41 -08:00
committed by GitHub
parent 99871805bd
commit c65db31fd9
251 changed files with 12163 additions and 3966 deletions

View File

@@ -1,28 +0,0 @@
import { TuiIcon, TuiTitle } from '@taiga-ui/core'
import { Component, Input } from '@angular/core'
import { UnitConversionPipesModule } from '../pipes/unit-conversion/unit-conversion.module'
@Component({
selector: 'button[drive]',
template: `
<tui-icon icon="@tui.save" />
<span tuiTitle>
<strong>{{ drive.logicalname }}</strong>
<span tuiSubtitle>
{{ drive.vendor || 'Unknown Vendor' }} -
{{ drive.model || 'Unknown Model' }}
</span>
<span tuiSubtitle>Capacity: {{ drive.capacity | convertBytes }}</span>
<ng-content />
</span>
`,
imports: [TuiIcon, TuiTitle, UnitConversionPipesModule],
})
export class DriveComponent {
@Input() drive!: {
logicalname: string | null
vendor: string | null
model: string | null
capacity: number
}
}

View File

@@ -99,6 +99,7 @@ export default {
101: 'Sie haben nicht gespeicherte Änderungen. Möchten Sie die Seite wirklich verlassen?',
102: 'Verlassen',
103: 'Sind Sie sicher?',
104: 'Neues Netzwerk-Gateway',
108: 'Öffentlich',
109: 'privat',
111: 'Keine Onion-Domains',
@@ -493,6 +494,7 @@ export default {
516: 'Empfohlen',
517: 'Möchten Sie diese Aufgabe wirklich verwerfen?',
518: 'Verwerfen',
519: 'Muss eine gültige IPv4- oder IPv6-Adresse mit optionalem Port sein',
520: 'Update verfügbar',
521: 'Um das Problem zu beheben, siehe',
522: 'SDK version',
@@ -582,10 +584,10 @@ export default {
612: 'Grund',
613: 'Private Gateways für die StartOS-Benutzeroberfläche können nicht deaktiviert werden',
614: 'Root-CA',
615: 'DHCP-Server',
616: 'DHCP-Server können nicht bearbeitet werden',
615: 'Die von Ihrem Router bereitgestellten DNS-Server verwenden',
616: 'Manuell festgelegte DNS-Server verwenden',
617: 'Statisch',
618: 'Statische Server',
618: 'Server',
619: 'Warnung. StartOS verwendet derzeit das folgende Gateway für DNS',
620: 'Wenn Sie dieses Gateway für die Auflösung privater Domains verwenden möchten, legen Sie alternative statische DNS-Server mit dem obigen Formular fest.',
621: 'Einen Dienst paketieren',
@@ -596,5 +598,86 @@ export default {
626: 'Hochladen',
627: 'UI öffnen',
628: 'In Zwischenablage kopiert',
629: 'Die Liste ist leer',
629: 'StartOS wird installiert',
630: 'Wähle deine Sprache',
631: 'Tastaturlayout auswählen',
632: 'Tastatur',
633: 'Einrichtungsablauf auswählen',
634: 'Neu beginnen',
635: 'Einen brandneuen Server einrichten',
636: 'Aus Backup wiederherstellen',
637: 'StartOS-Daten aus einem verschlüsselten Backup wiederherstellen',
638: 'Daten von einem bestehenden StartOS-Datenträger übertragen',
639: 'Laufwerke auswählen',
640: 'Keine Laufwerke gefunden. Bitte schließen Sie ein Laufwerk an und klicken Sie auf Aktualisieren.',
641: 'OS-Laufwerk',
642: 'Datenlaufwerk',
643: 'StartOS-Daten erkannt',
644: 'Daten auf dem OS-Laufwerk könnten überschrieben werden.',
645: 'Ihre StartOS-Daten auf dem Datenlaufwerk bleiben erhalten.',
646: 'Daten auf diesem Laufwerk werden überschrieben.',
647: 'Daten auf beiden Laufwerken werden überschrieben.',
648: 'Backup auswählen',
649: 'Wählen Sie das StartOS-Backup aus, das Sie wiederherstellen möchten',
650: 'Netzwerk-Backup öffnen',
651: 'Physische Backups',
652: 'Keine physischen Backups',
653: 'Netzwerkordner verbinden',
654: 'Netzwerk-Backup auswählen',
655: 'Backup entsperren',
656: 'Daten übertragen',
657: 'Wählen Sie das Laufwerk mit Ihren bestehenden StartOS-Daten aus',
658: 'Laufwerk auswählen',
659: 'Keine StartOS-Datenlaufwerke gefunden',
660: 'Master-Passwort festlegen',
661: 'Neues Passwort festlegen (optional)',
662: 'Machen Sie es gut. Schreiben Sie es auf.',
663: 'Überspringen, um Ihr bestehendes Passwort beizubehalten.',
664: 'Passwort eingeben',
665: 'Passwort bestätigen',
666: 'Fertigstellen',
667: 'Einrichtung wird gestartet',
670: 'Warten Sie 12 Minuten und aktualisieren Sie die Seite',
672: 'Einrichtung abgeschlossen!',
673: 'Sie können Ihr Backup-Laufwerk entfernen',
674: 'Sie können Ihr Übertragungs-Laufwerk entfernen',
675: 'http://start.local war nur für die Einrichtung gedacht. Es funktioniert nicht mehr.',
676: 'Adressinformationen herunterladen',
677: 'Enthält die permanente lokale Adresse Ihres Servers und die Root-CA',
678: 'USB entfernt',
679: 'Entfernen Sie das USB-Installationsmedium aus Ihrem Server',
680: 'Server neu starten',
681: 'Warten, bis der Server wieder online ist',
682: 'Server ist wieder online',
683: 'Starten Sie Ihren Server neu, um die Einrichtung abzuschließen',
684: 'Lokale Adresse öffnen',
685: 'Weiter zur Anmeldung',
686: 'Zur StartOS-Anmeldeseite wechseln',
687: 'Der Server ist nicht wieder online gegangen. Bitte überprüfen Sie Ihren Server und versuchen Sie, manuell darauf zuzugreifen.',
691: 'Dieses Feld ist erforderlich',
692: 'Verbindung fehlgeschlagen',
693: 'Verbindung zum Netzwerkordner nicht möglich. Stellen Sie sicher, dass (1) der Zielcomputer mit dem LAN verbunden ist, (2) der Zielordner freigegeben ist und (3) Hostname, Pfad und Anmeldedaten korrekt sind.',
694: 'Dieses Laufwerk enthält bestehende StartOS-Daten.',
695: 'um Ihre Daten zu behalten.',
696: 'um zu verwerfen',
697: 'Geben Sie das Passwort ein, das zum Verschlüsseln dieses Backups verwendet wurde.',
698: 'Mehrere Backups gefunden. Wählen Sie aus, welches wiederhergestellt werden soll.',
699: 'Backups',
700: 'Das Laufwerk, auf dem das StartOS-Betriebssystem installiert wird.',
701: 'Das Laufwerk, auf dem Ihre StartOS-Daten (Dienste, Einstellungen usw.) gespeichert werden. Dies kann dasselbe wie das OS-Laufwerk oder ein separates Laufwerk sein.',
702: 'Versuchen Sie nach der Datenübertragung von diesem Laufwerk nicht, erneut als Start9-Server davon zu booten. Dies kann zu Fehlfunktionen von Diensten, Datenbeschädigung oder Geldverlust führen.',
703: 'Muss mindestens 12 Zeichen lang sein',
704: 'Darf höchstens 64 Zeichen lang sein',
705: 'Passwörter stimmen nicht überein',
706: 'Beibehalten',
707: 'Überschreiben',
708: 'Entsperren',
709: 'Laufwerk',
710: 'Übertragen',
711: 'Die Liste ist leer',
712: 'Jetzt neu starten',
713: 'Später',
714: 'Installation abgeschlossen!',
715: 'StartOS wurde erfolgreich installiert.',
716: 'Weiter zur Einrichtung',
} satisfies i18n

View File

@@ -56,7 +56,7 @@ export const ENGLISH = {
'Beginning shutdown': 57,
'Add': 58,
'Ok': 59,
'french': 60,
'fr_FR': 60,
'This value cannot be changed once set': 61,
'Continue': 62,
'Click or drop file here': 63,
@@ -98,6 +98,7 @@ export const ENGLISH = {
'You have unsaved changes. Are you sure you want to leave?': 101,
'Leave': 102,
'Are you sure?': 103,
'New gateway': 104, // as in, a network gateway
'public': 108,
'private': 109,
'No Tor domains': 111,
@@ -462,10 +463,10 @@ export const ENGLISH = {
'StartOS UI': 485,
'WiFi': 486,
'Documentation': 487, // as in, a website to view documentation
'spanish': 488,
'polish': 489,
'german': 490,
'english': 491,
'es_ES': 488,
'pl_PL': 489,
'de_DE': 490,
'en_US': 491,
'Start Menu': 492,
'Install Progress': 493,
'Downloading': 494,
@@ -492,6 +493,7 @@ export const ENGLISH = {
'Recommended': 516, // as in, we recommend this
'Are you sure you want to dismiss this task?': 517,
'Dismiss': 518, // as in, dismiss or delete a task
'Must be a valid IPv4 or Ipv6 address with optional port': 519,
'Update available': 520,
'To resolve the issue, refer to': 521,
'SDK version': 522,
@@ -581,10 +583,10 @@ export const ENGLISH = {
'Reason': 612, // as in, an explanation for something
'Cannot disable private gateways for StartOS UI': 613,
'Root CA': 614, // as in, the unique, fixed-length digital identifier generated from a certificate's data using a cryptographic hash function
'DHCP Servers': 615,
'Cannot edit DHCP servers': 616,
'Use the DNS servers provided by your router': 615,
'Use DNS servers you specify manually': 616,
'Static': 617, // as in, unchanging
'Static Servers': 618, // as in, servers that do not change
'Servers': 618, // as in, computer servers
'Warning. StartOS is currently using the following gateway for DNS': 619,
'If you intend to use this gateway for private domain resolution, set alternative static DNS servers using the form above.': 620,
'Package a service': 621, // as in, package a software application for an operating system
@@ -595,5 +597,87 @@ export const ENGLISH = {
'Upload': 626, // as in, upload a file
'Open UI': 627, // as in, upload a file
'Copied to clipboard': 628,
'The list is empty': 629,
} as Record<any, any>
// Setup wizard keys
'Installing StartOS': 629,
'Select your language': 630,
'Select Keyboard Layout': 631,
'Keyboard': 632,
'Select Setup Flow': 633,
'Start Fresh': 634,
'Set up a brand new server': 635,
'Restore from Backup': 636,
'Restore StartOS data from an encrypted backup': 637,
'Transfer data from an existing StartOS data drive': 638,
'Select Drives': 639, // as in storage devices
'No drives found. Please connect a drive and click Refresh.': 640,
'OS Drive': 641,
'Data Drive': 642,
'StartOS Data Detected': 643,
'Data on the OS drive may be overwritten.': 644,
'your StartOS data on the data drive will be preserved.': 645,
'Data on this drive will be overwritten.': 646,
'Data on both drives will be overwritten.': 647,
'Select Backup': 648,
'Select the StartOS backup you want to restore': 649,
'Open Network Backup': 650, // as in, a backup stored on a networked device
'Physical Backups': 651, // as in, a backup stored on a physical drive
'No physical backups': 652,
'Connect Network Folder': 653,
'Select Network Backup': 654,
'Unlock Backup': 655,
'Transfer Data': 656,
'Select the drive containing your existing StartOS data': 657,
'Select Drive': 658,
'No StartOS data drives found': 659,
'Set Master Password': 660,
'Set New Password (Optional)': 661,
'Make it good. Write it down.': 662,
'Skip to keep your existing password.': 663,
'Enter Password': 664,
'Confirm Password': 665,
'Finish': 666,
'Starting setup': 667,
'Wait 1-2 minutes and refresh the page': 670,
'Setup Complete!': 672,
'You can unplug your backup drive': 673,
'You can unplug your transfer drive': 674,
'http://start.local was for setup only. It will no longer work.': 675,
'Download Address Info': 676,
"Contains your server's permanent local address and Root CA": 677,
'USB Removed': 678,
'Remove the USB installation media from your server': 679,
'Restart Server': 680,
'Waiting for server to come back online': 681,
'Server is back online': 682,
'Restart your server to complete setup': 683,
'Open Local Address': 684,
'Continue to Login': 685,
'Proceed to the StartOS login screen': 686,
'Server did not come back online. Please check your server and try accessing it manually.': 687,
'This field is required': 691,
'Connection Failed': 692,
'Unable to connect to network folder. Ensure (1) target computer is connected to LAN, (2) target folder is being shared, and (3) hostname, path, and credentials are accurate.': 693,
'This drive contains existing StartOS data.': 694,
'to keep your data.': 695,
'to discard': 696,
'Enter the password that was used to encrypt this backup.': 697,
'Multiple backups found. Select which one to restore.': 698,
'Backups': 699,
'The drive where the StartOS operating system will be installed.': 700,
'The drive where your StartOS data (services, settings, etc.) will be stored. This can be the same as the OS drive or a separate drive.': 701,
'After transferring data from this drive, do not attempt to boot into it again as a Start9 Server. This may result in services malfunctioning, data corruption, or loss of funds.': 702,
'Must be 12 characters or greater': 703,
'Must be 64 character or less': 704,
'Passwords do not match': 705,
'Preserve': 706,
'Overwrite': 707,
'Unlock': 708,
'Drive': 709, // the noun, a storage device
'Transfer': 710, // the verb
'The list is empty': 711,
'Restart now': 712,
'Later': 713, // as in, (do it) later
'Installation Complete!': 714,
'StartOS has been installed successfully.': 715,
'Continue to Setup': 716,
} as const

View File

@@ -99,6 +99,7 @@ export default {
101: 'Tienes cambios no guardados. ¿Estás seguro de que deseas salir?',
102: 'Salir',
103: '¿Estás seguro?',
104: 'Nueva puerta de enlace de red',
108: 'público',
109: 'privado',
111: 'Sin dominios onion',
@@ -493,6 +494,7 @@ export default {
516: 'Recomendado',
517: '¿Estás seguro de que deseas descartar esta tarea?',
518: 'Descartar',
519: 'Debe ser una dirección IPv4 o IPv6 válida con puerto opcional',
520: 'Actualización disponible',
521: 'Para resolver el problema, consulta',
522: 'Versión de SDK',
@@ -582,10 +584,10 @@ export default {
612: 'Razón',
613: 'No se pueden deshabilitar las puertas de enlace privadas para la interfaz de usuario de StartOS',
614: 'CA raíz',
615: 'Servidores DHCP',
616: 'No se pueden editar los servidores DHCP',
615: 'Usar los servidores DNS proporcionados por su router',
616: 'Usar servidores DNS que especifique manualmente',
617: 'Estático',
618: 'Servidores estáticos',
618: 'Servidores',
619: 'Advertencia. StartOS está utilizando actualmente la siguiente puerta de enlace para DNS',
620: 'Si deseas usar esta puerta de enlace para la resolución de dominios privados, configura servidores DNS estáticos alternativos usando el formulario anterior.',
621: 'Empaquetar un servicio',
@@ -596,5 +598,86 @@ export default {
626: 'Subir',
627: 'Abrir UI',
628: 'Copiado al portapapeles',
629: 'La lista está vacía',
629: 'Instalando StartOS',
630: 'Selecciona tu idioma',
631: 'Seleccionar distribución del teclado',
632: 'Teclado',
633: 'Seleccionar flujo de configuración',
634: 'Empezar desde cero',
635: 'Configurar un servidor completamente nuevo',
636: 'Restaurar desde copia de seguridad',
637: 'Restaurar datos de StartOS desde una copia de seguridad cifrada',
638: 'Transferir datos desde una unidad de datos StartOS existente',
639: 'Seleccionar unidades',
640: 'No se encontraron unidades. Conecte una unidad y haga clic en Actualizar.',
641: 'Unidad del sistema operativo',
642: 'Unidad de datos',
643: 'Datos de StartOS detectados',
644: 'Los datos de la unidad del sistema operativo pueden sobrescribirse.',
645: 'Sus datos de StartOS en la unidad de datos se conservarán.',
646: 'Los datos de esta unidad se sobrescribirán.',
647: 'Los datos de ambas unidades se sobrescribirán.',
648: 'Seleccionar copia de seguridad',
649: 'Seleccione la copia de seguridad de StartOS que desea restaurar',
650: 'Abrir copia de seguridad de red',
651: 'Copias de seguridad físicas',
652: 'No hay copias de seguridad físicas',
653: 'Conectar carpeta de red',
654: 'Seleccionar copia de seguridad de red',
655: 'Desbloquear copia de seguridad',
656: 'Transferir datos',
657: 'Seleccione la unidad que contiene sus datos StartOS existentes',
658: 'Seleccionar unidad',
659: 'No se encontraron unidades de datos StartOS',
660: 'Establecer contraseña maestra',
661: 'Establecer nueva contraseña (opcional)',
662: 'Que sea buena. Escríbala.',
663: 'Omitir para mantener su contraseña existente.',
664: 'Introducir contraseña',
665: 'Confirmar contraseña',
666: 'Finalizar',
667: 'Iniciando configuración',
670: 'Espere 12 minutos y actualice la página',
672: '¡Configuración completa!',
673: 'Puede desconectar su unidad de copia de seguridad',
674: 'Puede desconectar su unidad de transferencia',
675: 'http://start.local era solo para la configuración. Ya no funcionará.',
676: 'Descargar información de direcciones',
677: 'Contiene la dirección local permanente de su servidor y la CA raíz',
678: 'USB retirado',
679: 'Retire el medio de instalación USB de su servidor',
680: 'Reiniciar servidor',
681: 'Esperando a que el servidor vuelva a estar en línea',
682: 'El servidor ha vuelto a estar en línea',
683: 'Reinicie su servidor para completar la configuración',
684: 'Abrir dirección local',
685: 'Continuar al inicio de sesión',
686: 'Ir a la pantalla de inicio de sesión de StartOS',
687: 'El servidor no volvió a estar en línea. Verifique su servidor e intente acceder manualmente.',
691: 'Este campo es obligatorio',
692: 'Conexión fallida',
693: 'No se pudo conectar a la carpeta de red. Asegúrese de que (1) el equipo de destino esté conectado a la LAN, (2) la carpeta de destino esté compartida y (3) el nombre de host, la ruta y las credenciales sean correctos.',
694: 'Esta unidad contiene datos existentes de StartOS.',
695: 'para conservar sus datos.',
696: 'para descartar',
697: 'Introduzca la contraseña que se utilizó para cifrar esta copia de seguridad.',
698: 'Se encontraron varias copias de seguridad. Seleccione cuál restaurar.',
699: 'Copias de seguridad',
700: 'La unidad donde se instalará el sistema operativo StartOS.',
701: 'La unidad donde se almacenarán sus datos de StartOS (servicios, ajustes, etc.). Puede ser la misma que la unidad del sistema operativo o una unidad separada.',
702: 'Después de transferir datos desde esta unidad, no intente arrancar desde ella nuevamente como un servidor Start9. Esto puede provocar fallos en los servicios, corrupción de datos o pérdida de fondos.',
703: 'Debe tener 12 caracteres o más',
704: 'Debe tener 64 caracteres o menos',
705: 'Las contraseñas no coinciden',
706: 'Conservar',
707: 'Sobrescribir',
708: 'Desbloquear',
709: 'Unidad',
710: 'Transferir',
711: 'La lista está vacía',
712: 'Reiniciar ahora',
713: 'Más tarde',
714: '¡Instalación completada!',
715: 'StartOS se ha instalado correctamente.',
716: 'Continuar con la configuración',
} satisfies i18n

View File

@@ -99,6 +99,7 @@ export default {
101: 'Vous avez des modifications non enregistrées. Voulez-vous vraiment quitter ?',
102: 'Quitter',
103: 'Êtes-vous sûr ?',
104: 'Nouvelle passerelle réseau',
108: 'public',
109: 'privé',
111: 'Aucune domaine onion',
@@ -493,6 +494,7 @@ export default {
516: 'Recommandé',
517: 'Êtes-vous sûr de vouloir ignorer cette tâche ?',
518: 'Ignorer',
519: 'Doit être une adresse IPv4 ou IPv6 valide avec un port facultatif',
520: 'Mise à jour disponible',
521: 'Pour résoudre le problème, consultez',
522: 'Version de SDK',
@@ -582,10 +584,10 @@ export default {
612: 'Raison',
613: "Impossible de désactiver les passerelles privées pour l'interface utilisateur StartOS",
614: 'CA racine',
615: 'Serveurs DHCP',
616: 'Impossible de modifier les serveurs DHCP',
615: 'Utiliser les serveurs DNS fournis par votre routeur',
616: 'Utiliser des serveurs DNS que vous spécifiez manuellement',
617: 'Statique',
618: 'Serveurs statiques',
618: 'Serveurs',
619: 'Avertissement. StartOS utilise actuellement la passerelle suivante pour le DNS',
620: 'Si vous souhaitez utiliser cette passerelle pour la résolution de domaines privés, définissez des serveurs DNS statiques alternatifs à laide du formulaire ci-dessus.',
621: 'Emballer un service',
@@ -596,5 +598,86 @@ export default {
626: 'Téléverser',
627: 'Ouvrir UI',
628: 'Copié dans le presse-papiers',
629: 'La liste est vide',
629: 'Installation de StartOS',
630: 'Sélectionnez votre langue',
631: 'Sélectionner la disposition du clavier',
632: 'Clavier',
633: 'Sélectionner le mode de configuration',
634: 'Démarrer à neuf',
635: 'Configurer un tout nouveau serveur',
636: 'Restaurer à partir dune sauvegarde',
637: 'Restaurer les données StartOS à partir dune sauvegarde chiffrée',
638: 'Transférer les données depuis un disque de données StartOS existant',
639: 'Sélectionner les disques',
640: 'Aucun disque trouvé. Veuillez connecter un disque et cliquer sur Actualiser.',
641: 'Disque du système',
642: 'Disque de données',
643: 'Données StartOS détectées',
644: 'Les données du disque système peuvent être écrasées.',
645: 'Vos données StartOS sur le disque de données seront conservées.',
646: 'Les données de ce disque seront écrasées.',
647: 'Les données des deux disques seront écrasées.',
648: 'Sélectionner une sauvegarde',
649: 'Sélectionnez la sauvegarde StartOS que vous souhaitez restaurer',
650: 'Ouvrir une sauvegarde réseau',
651: 'Sauvegardes physiques',
652: 'Aucune sauvegarde physique',
653: 'Connecter un dossier réseau',
654: 'Sélectionner une sauvegarde réseau',
655: 'Déverrouiller la sauvegarde',
656: 'Transférer les données',
657: 'Sélectionnez le disque contenant vos données StartOS existantes',
658: 'Sélectionner le disque',
659: 'Aucun disque de données StartOS trouvé',
660: 'Définir le mot de passe maître',
661: 'Définir un nouveau mot de passe (facultatif)',
662: 'Choisissez-le bien. Notez-le.',
663: 'Ignorer pour conserver votre mot de passe existant.',
664: 'Saisir le mot de passe',
665: 'Confirmer le mot de passe',
666: 'Terminer',
667: 'Démarrage de la configuration',
670: 'Attendez 1 à 2 minutes puis actualisez la page',
672: 'Configuration terminée !',
673: 'Vous pouvez débrancher votre disque de sauvegarde',
674: 'Vous pouvez débrancher votre disque de transfert',
675: 'http://start.local était réservé à la configuration. Il ne fonctionnera plus.',
676: 'Télécharger les informations dadresse',
677: 'Contient ladresse locale permanente de votre serveur et la CA racine',
678: 'USB retiré',
679: 'Retirez le support dinstallation USB de votre serveur',
680: 'Redémarrer le serveur',
681: 'En attente du retour en ligne du serveur',
682: 'Le serveur est de nouveau en ligne',
683: 'Redémarrez votre serveur pour terminer la configuration',
684: 'Ouvrir ladresse locale',
685: 'Continuer vers la connexion',
686: 'Accéder à lécran de connexion StartOS',
687: 'Le serveur nest pas revenu en ligne. Veuillez vérifier votre serveur et essayer dy accéder manuellement.',
691: 'Ce champ est requis',
692: 'Échec de la connexion',
693: 'Impossible de se connecter au dossier réseau. Assurez-vous que (1) lordinateur cible est connecté au LAN, (2) le dossier cible est partagé et (3) le nom dhôte, le chemin et les identifiants sont corrects.',
694: 'Ce disque contient des données StartOS existantes.',
695: 'pour conserver vos données.',
696: 'pour supprimer',
697: 'Saisissez le mot de passe utilisé pour chiffrer cette sauvegarde.',
698: 'Plusieurs sauvegardes trouvées. Sélectionnez celle à restaurer.',
699: 'Sauvegardes',
700: 'Le disque sur lequel le système dexploitation StartOS sera installé.',
701: 'Le disque sur lequel vos données StartOS (services, paramètres, etc.) seront stockées. Il peut sagir du même disque que le système ou dun disque séparé.',
702: 'Après le transfert des données depuis ce disque, nessayez pas de démarrer dessus à nouveau en tant que serveur Start9. Cela peut entraîner des dysfonctionnements des services, une corruption des données ou une perte de fonds.',
703: 'Doit comporter au moins 12 caractères',
704: 'Doit comporter au maximum 64 caractères',
705: 'Les mots de passe ne correspondent pas',
706: 'Conserver',
707: 'Écraser',
708: 'Déverrouiller',
709: 'Disque',
710: 'Transférer',
711: 'La liste est vide',
712: 'Redémarrer maintenant',
713: 'Plus tard',
714: 'Installation terminée !',
715: 'StartOS a été installé avec succès.',
716: 'Continuer vers la configuration',
} satisfies i18n

View File

@@ -99,6 +99,7 @@ export default {
101: 'Masz niezapisane zmiany. Czy na pewno chcesz opuścić tę stronę?',
102: 'Opuść',
103: 'Czy jesteś pewien?',
104: 'Nowa brama sieciowa',
108: 'publiczny',
109: 'prywatny',
111: 'Brak domeny onion',
@@ -493,6 +494,7 @@ export default {
516: 'Zalecane',
517: 'Czy na pewno chcesz odrzucić to zadanie?',
518: 'Odrzuć',
519: 'Musi być prawidłowym adresem IPv4 lub IPv6 z opcjonalnym portem',
520: 'Aktualizacja dostępna',
521: 'Aby rozwiązać problem, zapoznaj się z',
522: 'Wersja SDK',
@@ -582,10 +584,10 @@ export default {
612: 'Powód',
613: 'Nie można wyłączyć prywatnych bram dla interfejsu użytkownika StartOS',
614: 'głównego CA',
615: 'Serwery DHCP',
616: 'Nie można edytować serwerów DHCP',
615: 'Użyj serwerów DNS dostarczonych przez router',
616: 'Użyj serwerów DNS określonych ręcznie',
617: 'Statyczny',
618: 'Serwery statyczne',
618: 'Serwery',
619: 'Ostrzeżenie. StartOS obecnie używa następującej bramy do DNS',
620: 'Jeśli zamierzasz używać tej bramy do rozwiązywania domen prywatnych, ustaw alternatywne statyczne serwery DNS za pomocą powyższego formularza.',
621: 'Spakietuj usługę',
@@ -596,5 +598,86 @@ export default {
626: 'Prześlij',
627: 'Otwórz UI',
628: 'Skopiowano do schowka',
629: 'Lista jest pusta',
629: 'Instalowanie StartOS',
630: 'Wybierz swój język',
631: 'Wybierz układ klawiatury',
632: 'Klawiatura',
633: 'Wybierz tryb konfiguracji',
634: 'Rozpocznij od nowa',
635: 'Skonfiguruj zupełnie nowy serwer',
636: 'Przywróć z kopii zapasowej',
637: 'Przywróć dane StartOS z zaszyfrowanej kopii zapasowej',
638: 'Przenieś dane z istniejącego dysku danych StartOS',
639: 'Wybierz dyski',
640: 'Nie znaleziono dysków. Podłącz dysk i kliknij Odśwież.',
641: 'Dysk systemowy',
642: 'Dysk danych',
643: 'Wykryto dane StartOS',
644: 'Dane na dysku systemowym mogą zostać nadpisane.',
645: 'Twoje dane StartOS na dysku danych zostaną zachowane.',
646: 'Dane na tym dysku zostaną nadpisane.',
647: 'Dane na obu dyskach zostaną nadpisane.',
648: 'Wybierz kopię zapasową',
649: 'Wybierz kopię zapasową StartOS do przywrócenia',
650: 'Otwórz kopię zapasową sieciową',
651: 'Kopie zapasowe fizyczne',
652: 'Brak fizycznych kopii zapasowych',
653: 'Połącz folder sieciowy',
654: 'Wybierz kopię zapasową sieciową',
655: 'Odblokuj kopię zapasową',
656: 'Przenieś dane',
657: 'Wybierz dysk zawierający istniejące dane StartOS',
658: 'Wybierz dysk',
659: 'Nie znaleziono dysków danych StartOS',
660: 'Ustaw hasło główne',
661: 'Ustaw nowe hasło (opcjonalnie)',
662: 'Zadbaj o nie. Zapisz je.',
663: 'Pomiń, aby zachować istniejące hasło.',
664: 'Wprowadź hasło',
665: 'Potwierdź hasło',
666: 'Zakończ',
667: 'Rozpoczynanie konfiguracji',
670: 'Poczekaj 12 minuty i odśwież stronę',
672: 'Konfiguracja zakończona!',
673: 'Możesz odłączyć dysk kopii zapasowej',
674: 'Możesz odłączyć dysk transferowy',
675: 'http://start.local służył tylko do konfiguracji. Nie będzie już działać.',
676: 'Pobierz informacje adresowe',
677: 'Zawiera stały lokalny adres serwera oraz główny urząd certyfikacji (Root CA)',
678: 'USB usunięty',
679: 'Usuń instalacyjny nośnik USB z serwera',
680: 'Uruchom ponownie serwer',
681: 'Oczekiwanie na ponowne połączenie serwera',
682: 'Serwer jest ponownie online',
683: 'Uruchom ponownie serwer, aby zakończyć konfigurację',
684: 'Otwórz adres lokalny',
685: 'Przejdź do logowania',
686: 'Przejdź do ekranu logowania StartOS',
687: 'Serwer nie wrócił do trybu online. Sprawdź serwer i spróbuj uzyskać do niego dostęp ręcznie.',
691: 'To pole jest wymagane',
692: 'Nie udało się połączyć',
693: 'Nie można połączyć się z folderem sieciowym. Upewnij się, że (1) komputer docelowy jest podłączony do sieci LAN, (2) folder docelowy jest udostępniony oraz (3) nazwa hosta, ścieżka i dane logowania są poprawne.',
694: 'Ten dysk zawiera istniejące dane StartOS.',
695: 'aby zachować dane.',
696: 'aby odrzucić',
697: 'Wprowadź hasło użyte do zaszyfrowania tej kopii zapasowej.',
698: 'Znaleziono wiele kopii zapasowych. Wybierz, którą przywrócić.',
699: 'Kopie zapasowe',
700: 'Dysk, na którym zostanie zainstalowany system operacyjny StartOS.',
701: 'Dysk, na którym będą przechowywane dane StartOS (usługi, ustawienia itp.). Może to być ten sam dysk co systemowy lub oddzielny dysk.',
702: 'Po przeniesieniu danych z tego dysku nie próbuj ponownie uruchamiać z niego systemu jako serwer Start9. Może to spowodować nieprawidłowe działanie usług, uszkodzenie danych lub utratę środków.',
703: 'Musi mieć co najmniej 12 znaków',
704: 'Musi mieć maksymalnie 64 znaki',
705: 'Hasła nie są zgodne',
706: 'Zachowaj',
707: 'Nadpisz',
708: 'Odblokuj',
709: 'Dysk',
710: 'Przenieś',
711: 'Lista jest pusta',
712: 'Uruchom ponownie teraz',
713: 'Później',
714: 'Instalacja zakończona!',
715: 'StartOS został pomyślnie zainstalowany.',
716: 'Przejdź do konfiguracji',
} satisfies i18n

View File

@@ -6,7 +6,7 @@ import {
TuiLanguageSwitcherService,
} from '@taiga-ui/i18n'
import { ENGLISH } from './dictionaries/en'
import { i18nService } from './i18n.service'
import { i18nService, Languages } from './i18n.service'
export type i18nKey = keyof typeof ENGLISH
export type i18n = Record<(typeof ENGLISH)[i18nKey], string>
@@ -20,7 +20,7 @@ export const I18N_LOADER = new InjectionToken<
>('')
export const I18N_STORAGE = new InjectionToken<
(lang: TuiLanguageName) => Promise<void>
(lang: Languages) => Promise<void>
>('', {
factory: () => () => Promise.resolve(),
})

View File

@@ -1,6 +1,21 @@
import { inject, Injectable, signal } from '@angular/core'
import { TuiLanguageName, TuiLanguageSwitcherService } from '@taiga-ui/i18n'
import { I18N, I18N_LOADER, I18N_STORAGE } from './i18n.providers'
import { T } from '@start9labs/start-sdk'
export const languages = ['en_US', 'es_ES', 'de_DE', 'fr_FR', 'pl_PL'] as const
export type Languages = (typeof languages)[number]
/**
* Maps POSIX locale strings to TUI language names
*/
export const LANGUAGE_TO_TUI: Record<Languages, TuiLanguageName> = {
en_US: 'english',
es_ES: 'spanish',
de_DE: 'german',
fr_FR: 'french',
pl_PL: 'polish',
}
@Injectable({
providedIn: 'root',
@@ -12,20 +27,40 @@ export class i18nService extends TuiLanguageSwitcherService {
readonly loading = signal(false)
override setLanguage(language: TuiLanguageName = 'english'): void {
/**
* Current language as POSIX locale string
*/
get lang(): Languages {
return (
(Object.entries(LANGUAGE_TO_TUI).find(
([, tui]) => tui === this.language,
)?.[0] as Languages) || 'en_US'
)
}
localize(string: T.LocaleString): string {
if (typeof string === 'string') return string
return (
string[this.lang] ?? string['en_US'] ?? Object.values(string)[0] ?? ''
)
}
setLang(language: Languages = 'en_US'): void {
const tuiLang = LANGUAGE_TO_TUI[language]
const current = this.language
super.setLanguage(language)
super.setLanguage(tuiLang)
this.loading.set(true)
if (current === language) {
this.i18nLoader(language).then(value => {
if (current === tuiLang) {
this.i18nLoader(tuiLang).then(value => {
this.i18n.set(value)
this.loading.set(false)
})
} else {
this.store(language).then(() =>
this.i18nLoader(language).then(value => {
this.i18nLoader(tuiLang).then(value => {
this.i18n.set(value)
this.loading.set(false)
}),
@@ -33,12 +68,3 @@ export class i18nService extends TuiLanguageSwitcherService {
}
}
}
export const languages = [
'english',
'spanish',
'polish',
'german',
'french',
] as const
export type Languages = (typeof languages)[number]

View File

@@ -0,0 +1,16 @@
import { inject, Injectable, Pipe, PipeTransform } from '@angular/core'
import { i18nService } from './i18n.service'
import { T } from '@start9labs/start-sdk'
@Pipe({
name: 'localize',
pure: false,
})
@Injectable({ providedIn: 'root' })
export class LocalizePipe implements PipeTransform {
private readonly i18nService = inject(i18nService)
transform(string: T.LocaleString): string {
return this.i18nService.localize(string)
}
}

View File

@@ -8,7 +8,6 @@ export * from './classes/rpc-error'
export * from './components/initializing/logs-window.component'
export * from './components/initializing/initializing.component'
export * from './components/ticker.component'
export * from './components/drive.component'
export * from './components/markdown.component'
export * from './components/prompt.component'
export * from './components/server.component'
@@ -19,6 +18,7 @@ export * from './directives/safe-links.directive'
export * from './i18n/i18n.pipe'
export * from './i18n/i18n.providers'
export * from './i18n/i18n.service'
export * from './i18n/localize.pipe'
export * from './pipes/exver/exver.module'
export * from './pipes/exver/exver.pipe'
@@ -59,3 +59,5 @@ export * from './util/rpc.util'
export * from './util/to-guid'
export * from './util/to-local-iso-string'
export * from './util/unused'
export * from './util/keyboards'
export * from './util/languages'

View File

@@ -10,7 +10,7 @@ export type AccessType =
export type WorkspaceConfig = {
gitHash: string
useMocks: boolean
// each key corresponds to a project and values adjust settings for that project, eg: ui, install-wizard, setup-wizard
// each key corresponds to a project and values adjust settings for that project, eg: ui, setup-wizard
ui: {
api: {
url: string

View File

@@ -0,0 +1,97 @@
import { LanguageCode } from './languages'
/**
* Keyboard layout codes (X11/Wayland)
*/
export type KeyboardLayout = 'us' | 'gb' | 'es' | 'latam' | 'de' | 'fr' | 'pl'
/**
* Keyboard keymap codes (console/TTY)
*/
export type KeyboardKeymap = 'us' | 'uk' | 'es' | 'la' | 'de' | 'fr' | 'pl'
/**
* Keyboard layout display names
*/
export type KeyboardName =
| 'US English'
| 'UK English'
| 'Spanish'
| 'Latin American'
| 'German'
| 'French'
| 'Polish'
/**
* Keyboard definition with layout and keymap
*/
export interface Keyboard {
layout: KeyboardLayout
keymap: KeyboardKeymap
name: KeyboardName
}
/**
* Full keyboard configuration for backend API
*/
export interface FullKeyboard {
layout: KeyboardLayout
keymap: KeyboardKeymap
model: string | null
variant: string | null
options: string[]
}
/**
* Keyboard layouts grouped by language code
*/
export const KEYBOARDS_BY_LANGUAGE: Record<LanguageCode, Keyboard[]> = {
en: [
{ layout: 'us', keymap: 'us', name: 'US English' },
{ layout: 'gb', keymap: 'uk', name: 'UK English' },
],
es: [
{ layout: 'es', keymap: 'es', name: 'Spanish' },
{ layout: 'latam', keymap: 'la', name: 'Latin American' },
],
de: [{ layout: 'de', keymap: 'de', name: 'German' }],
fr: [{ layout: 'fr', keymap: 'fr', name: 'French' }],
pl: [{ layout: 'pl', keymap: 'pl', name: 'Polish' }],
}
/**
* All available keyboard layouts
*/
export const ALL_KEYBOARDS: Keyboard[] = [
{ layout: 'us', keymap: 'us', name: 'US English' },
{ layout: 'gb', keymap: 'uk', name: 'UK English' },
{ layout: 'es', keymap: 'es', name: 'Spanish' },
{ layout: 'latam', keymap: 'la', name: 'Latin American' },
{ layout: 'de', keymap: 'de', name: 'German' },
{ layout: 'fr', keymap: 'fr', name: 'French' },
{ layout: 'pl', keymap: 'pl', name: 'Polish' },
]
/**
* Get all keyboards sorted with language-specific keyboards first,
* then remaining keyboards alphabetically by name.
*/
export function getAllKeyboardsSorted(languageCode: LanguageCode): Keyboard[] {
const languageKeyboards = KEYBOARDS_BY_LANGUAGE[languageCode]
const languageLayouts = new Set(languageKeyboards.map(kb => kb.layout))
const otherKeyboards = ALL_KEYBOARDS.filter(
kb => !languageLayouts.has(kb.layout),
).sort((a, b) => a.name.localeCompare(b.name))
return [...languageKeyboards, ...otherKeyboards]
}
/**
* Get the display name for a keyboard layout.
*/
export function getKeyboardName(
layout: KeyboardLayout | string,
): KeyboardName | string {
const keyboard = ALL_KEYBOARDS.find(kb => kb.layout === layout)
if (keyboard) return keyboard.name
return layout // fallback to the layout itself if not found
}

View File

@@ -0,0 +1,44 @@
import { Languages } from '../i18n/i18n.service'
/**
* ISO language codes
*/
export type LanguageCode = 'en' | 'es' | 'de' | 'fr' | 'pl'
/**
* Language definition with metadata
*/
export interface Language {
code: LanguageCode
name: Languages
nativeName: string
}
/**
* Available languages with their metadata
*/
export const LANGUAGES: Language[] = [
{ code: 'en', name: 'en_US', nativeName: 'English' },
{ code: 'es', name: 'es_ES', nativeName: 'Español' },
{ code: 'de', name: 'de_DE', nativeName: 'Deutsch' },
{ code: 'fr', name: 'fr_FR', nativeName: 'Français' },
{ code: 'pl', name: 'pl_PL', nativeName: 'Polski' },
]
/**
* Maps POSIX locale strings to ISO language codes
*/
export const LANGUAGE_TO_CODE: Record<Languages, LanguageCode> = {
en_US: 'en',
es_ES: 'es',
de_DE: 'de',
fr_FR: 'fr',
pl_PL: 'pl',
}
/**
* Params for setting language via API
*/
export interface SetLanguageParams {
language: Languages
}