mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-30 12:11:56 +00:00
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:
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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 1–2 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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 1–2 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
|
||||
|
||||
@@ -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 à l’aide 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 d’une sauvegarde',
|
||||
637: 'Restaurer les données StartOS à partir d’une 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 d’adresse',
|
||||
677: 'Contient l’adresse locale permanente de votre serveur et la CA racine',
|
||||
678: 'USB retiré',
|
||||
679: 'Retirez le support d’installation 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 l’adresse locale',
|
||||
685: 'Continuer vers la connexion',
|
||||
686: 'Accéder à l’écran de connexion StartOS',
|
||||
687: 'Le serveur n’est pas revenu en ligne. Veuillez vérifier votre serveur et essayer d’y 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) l’ordinateur cible est connecté au LAN, (2) le dossier cible est partagé et (3) le nom d’hô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 d’exploitation StartOS sera installé.',
|
||||
701: 'Le disque sur lequel vos données StartOS (services, paramètres, etc.) seront stockées. Il peut s’agir du même disque que le système ou d’un disque séparé.',
|
||||
702: 'Après le transfert des données depuis ce disque, n’essayez 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
|
||||
|
||||
@@ -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 1–2 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
|
||||
|
||||
@@ -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(),
|
||||
})
|
||||
|
||||
@@ -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]
|
||||
|
||||
16
web/projects/shared/src/i18n/localize.pipe.ts
Normal file
16
web/projects/shared/src/i18n/localize.pipe.ts
Normal 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)
|
||||
}
|
||||
}
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
97
web/projects/shared/src/util/keyboards.ts
Normal file
97
web/projects/shared/src/util/keyboards.ts
Normal 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
|
||||
}
|
||||
44
web/projects/shared/src/util/languages.ts
Normal file
44
web/projects/shared/src/util/languages.ts
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user