From 880aa8040d88ee526ef98100fb6b0423d93bf19d Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Tue, 13 Jan 2026 15:34:58 -0700 Subject: [PATCH] translations --- .../setup-wizard/src/app/app.module.ts | 2 + .../src/app/components/cifs.component.ts | 21 +++-- .../components/preserve-overwrite.dialog.ts | 17 +++-- .../select-network-backup.dialog.ts | 7 +- .../app/components/unlock-password.dialog.ts | 20 +++-- .../setup-wizard/src/app/pages/drives.page.ts | 59 +++++++------- .../setup-wizard/src/app/pages/home.page.ts | 18 +++-- .../src/app/pages/keyboard.page.ts | 8 +- .../src/app/pages/language.page.ts | 48 ++++++++---- .../src/app/pages/loading.page.ts | 13 ++-- .../src/app/pages/password.page.ts | 28 ++++--- .../src/app/pages/restore.page.ts | 24 +++--- .../src/app/pages/success.page.ts | 46 ++++++----- .../src/app/pages/transfer.page.ts | 30 +++++--- .../setup-wizard/src/app/utils/languages.ts | 22 +++--- .../shared/src/i18n/dictionaries/de.ts | 75 ++++++++++++++++++ .../shared/src/i18n/dictionaries/en.ts | 76 +++++++++++++++++++ .../shared/src/i18n/dictionaries/es.ts | 75 ++++++++++++++++++ .../shared/src/i18n/dictionaries/fr.ts | 75 ++++++++++++++++++ .../shared/src/i18n/dictionaries/pl.ts | 75 ++++++++++++++++++ 20 files changed, 601 insertions(+), 138 deletions(-) diff --git a/web/projects/setup-wizard/src/app/app.module.ts b/web/projects/setup-wizard/src/app/app.module.ts index effce9f2a..c6a815065 100644 --- a/web/projects/setup-wizard/src/app/app.module.ts +++ b/web/projects/setup-wizard/src/app/app.module.ts @@ -9,6 +9,7 @@ import { PreloadAllModules, RouterModule } from '@angular/router' import { WA_LOCATION } from '@ng-web-apis/common' import initArgon from '@start9labs/argon2' import { + I18N_PROVIDERS, provideSetupLogsService, RELATIVE_URL, VERSION, @@ -41,6 +42,7 @@ const version = require('../../../../package.json').version ], providers: [ NG_EVENT_PLUGINS, + I18N_PROVIDERS, provideSetupLogsService(ApiService), tuiButtonOptionsProvider({ size: 'm' }), { diff --git a/web/projects/setup-wizard/src/app/components/cifs.component.ts b/web/projects/setup-wizard/src/app/components/cifs.component.ts index e1902ca47..e71ea344c 100644 --- a/web/projects/setup-wizard/src/app/components/cifs.component.ts +++ b/web/projects/setup-wizard/src/app/components/cifs.component.ts @@ -6,6 +6,7 @@ import { ReactiveFormsModule, Validators, } from '@angular/forms' +import { i18nPipe } from '@start9labs/shared' import { T } from '@start9labs/start-sdk' import { TuiButton, @@ -34,7 +35,7 @@ export interface CifsResult { template: `
- + - + - + - + @@ -83,10 +84,10 @@ export interface CifsResult { [disabled]="connecting" (click)="cancel()" > - Cancel + {{ 'Cancel' | i18n }} @@ -112,6 +113,7 @@ export interface CifsResult { TuiError, TuiFieldErrorPipe, TuiIcon, + i18nPipe, ], providers: [ { @@ -126,6 +128,7 @@ export class CifsComponent { private readonly dialogs = inject(TuiDialogService) private readonly api = inject(ApiService) private readonly context = injectContext>() + private readonly i18n = inject(i18nPipe) connecting = false @@ -181,9 +184,11 @@ export class CifsComponent { private onFail() { this.dialogs .open( - '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.', + this.i18n.transform( + '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.', + ), { - label: 'Connection Failed', + label: this.i18n.transform('Connection Failed'), size: 's', }, ) diff --git a/web/projects/setup-wizard/src/app/components/preserve-overwrite.dialog.ts b/web/projects/setup-wizard/src/app/components/preserve-overwrite.dialog.ts index 179877dfe..2b5ed04cb 100644 --- a/web/projects/setup-wizard/src/app/components/preserve-overwrite.dialog.ts +++ b/web/projects/setup-wizard/src/app/components/preserve-overwrite.dialog.ts @@ -1,21 +1,22 @@ import { Component, inject } from '@angular/core' +import { i18nPipe } from '@start9labs/shared' import { TuiButton } from '@taiga-ui/core' import { TuiDialogContext } from '@taiga-ui/core' import { injectContext } from '@taiga-ui/polymorpheus' @Component({ standalone: true, - imports: [TuiButton], + imports: [TuiButton, i18nPipe], template: ` -

This drive contains existing StartOS data.

+

{{ 'This drive contains existing StartOS data.' | i18n }}

  • - Preserve - to keep your data. + {{ 'Preserve' | i18n }} + {{ 'to keep your data.' | i18n }}
  • - Overwrite - to discard + {{ 'Overwrite' | i18n }} + {{ 'to discard' | i18n }}
@@ -24,14 +25,14 @@ import { injectContext } from '@taiga-ui/polymorpheus' appearance="flat-destructive" (click)="context.completeWith(false)" > - Overwrite + {{ 'Overwrite' | i18n }}
`, diff --git a/web/projects/setup-wizard/src/app/components/select-network-backup.dialog.ts b/web/projects/setup-wizard/src/app/components/select-network-backup.dialog.ts index b8d173e9f..d9c9c1166 100644 --- a/web/projects/setup-wizard/src/app/components/select-network-backup.dialog.ts +++ b/web/projects/setup-wizard/src/app/components/select-network-backup.dialog.ts @@ -1,5 +1,6 @@ import { Component, inject } from '@angular/core' import { FormsModule } from '@angular/forms' +import { i18nPipe } from '@start9labs/shared' import { TuiDialogContext, TuiTextfield } from '@taiga-ui/core' import { TuiDataListWrapper, TuiSelect } from '@taiga-ui/kit' import { injectContext, PolymorpheusComponent } from '@taiga-ui/polymorpheus' @@ -11,11 +12,11 @@ interface Data { @Component({ standalone: true, - imports: [FormsModule, TuiTextfield, TuiSelect, TuiDataListWrapper], + imports: [FormsModule, TuiTextfield, TuiSelect, TuiDataListWrapper, i18nPipe], template: ` -

Multiple backups found. Select which one to restore.

+

{{ 'Multiple backups found. Select which one to restore.' | i18n }}

- + Enter the password that was used to encrypt this backup.

+

+ {{ 'Enter the password that was used to encrypt this backup.' | i18n }} +

- +
`, diff --git a/web/projects/setup-wizard/src/app/pages/drives.page.ts b/web/projects/setup-wizard/src/app/pages/drives.page.ts index 2c015c6fe..dadde0e1a 100644 --- a/web/projects/setup-wizard/src/app/pages/drives.page.ts +++ b/web/projects/setup-wizard/src/app/pages/drives.page.ts @@ -4,6 +4,7 @@ import { FormsModule } from '@angular/forms' import { DiskInfo, ErrorService, + i18nPipe, LoadingService, toGuid, } from '@start9labs/shared' @@ -29,27 +30,24 @@ import { ApiService } from '../services/api.service' import { StateService } from '../services/state.service' import { PreserveOverwriteDialog } from '../components/preserve-overwrite.dialog' -const OS_DRIVE_TOOLTIP = - 'The drive where the StartOS operating system will be installed.' -const DATA_DRIVE_TOOLTIP = - '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.' - @Component({ template: `
-

Select Drives

+

{{ 'Select Drives' | i18n }}

@if (loading) { } @else if (drives.length === 0) {

- No drives found. Please connect a drive and click Refresh. + {{ + 'No drives found. Please connect a drive and click Refresh.' | i18n + }}

} @else { - + @if (mobile) {
- {{ drive.vendor || 'Unknown' }} {{ drive.model || 'Drive' }} + {{ drive.vendor || ('Unknown' | i18n) }} + {{ drive.model || ('Drive' | i18n) }} {{ formatCapacity(drive.capacity) }} · {{ drive.logicalname }} @@ -124,7 +123,7 @@ const DATA_DRIVE_TOOLTIP =
@if (drives.length === 0) { } @else { }
@@ -166,6 +165,7 @@ const DATA_DRIVE_TOOLTIP = TuiTooltip, TuiHeader, TuiTitle, + i18nPipe, ], }) export default class DrivesPage { @@ -176,11 +176,16 @@ export default class DrivesPage { private readonly errorService = inject(ErrorService) private readonly stateService = inject(StateService) private readonly cdr = inject(ChangeDetectorRef) + private readonly i18n = inject(i18nPipe) protected readonly mobile = inject(TUI_IS_MOBILE) - readonly osDriveTooltip = OS_DRIVE_TOOLTIP - readonly dataDriveTooltip = DATA_DRIVE_TOOLTIP + readonly osDriveTooltip = this.i18n.transform( + 'The drive where the StartOS operating system will be installed.', + ) + readonly dataDriveTooltip = this.i18n.transform( + '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.', + ) drives: DiskInfo[] = [] loading = true @@ -189,7 +194,9 @@ export default class DrivesPage { preserveData: boolean | null = null readonly stringify = (drive: DiskInfo | null) => - drive ? `${drive.vendor || 'Unknown'} ${drive.model || 'Drive'}` : '' + drive + ? `${drive.vendor || this.i18n.transform('Unknown')} ${drive.model || this.i18n.transform('Drive')}` + : '' formatCapacity(bytes: number): string { const gb = bytes / 1e9 @@ -252,7 +259,7 @@ export default class DrivesPage { this.dialogs .open(new PolymorpheusComponent(PreserveOverwriteDialog), { - label: 'StartOS Data Detected', + label: this.i18n.transform('StartOS Data Detected'), size: 's', dismissible: true, closeable: true, @@ -277,15 +284,15 @@ export default class DrivesPage { private showOsDriveWarning() { this.dialogs .open(TUI_CONFIRM, { - label: 'Warning', + label: this.i18n.transform('Warning'), size: 's', data: { content: `
    -
  • Data on the OS drive may be overwritten.
  • -
  • your StartOS data on the data drive will be preserved.
  • +
  • ${this.i18n.transform('Data on the OS drive may be overwritten.')}
  • +
  • ${this.i18n.transform('your StartOS data on the data drive will be preserved.')}
`, - yes: 'Continue', - no: 'Cancel', + yes: this.i18n.transform('Continue'), + no: this.i18n.transform('Cancel'), }, }) .pipe(filter(Boolean)) @@ -296,17 +303,17 @@ export default class DrivesPage { private showFullWarning(sameDevice: boolean) { const message = sameDevice - ? `

Data on this drive will be overwritten.

` - : `

Data on both drives will be overwritten.

` + ? `

${this.i18n.transform('Data on this drive will be overwritten.')}

` + : `

${this.i18n.transform('Data on both drives will be overwritten.')}

` this.dialogs .open(TUI_CONFIRM, { - label: 'Warning', + label: this.i18n.transform('Warning'), size: 's', data: { content: message, - yes: 'Continue', - no: 'Cancel', + yes: this.i18n.transform('Continue'), + no: this.i18n.transform('Cancel'), }, }) .pipe(filter(Boolean)) diff --git a/web/projects/setup-wizard/src/app/pages/home.page.ts b/web/projects/setup-wizard/src/app/pages/home.page.ts index d88845c4a..43cc1ed21 100644 --- a/web/projects/setup-wizard/src/app/pages/home.page.ts +++ b/web/projects/setup-wizard/src/app/pages/home.page.ts @@ -1,5 +1,6 @@ import { Component, inject } from '@angular/core' import { Router } from '@angular/router' +import { i18nPipe } from '@start9labs/shared' import { TuiAppearance, TuiTitle } from '@taiga-ui/core' import { TuiAvatar } from '@taiga-ui/kit' import { TuiCardLarge, TuiCell, TuiHeader } from '@taiga-ui/layout' @@ -9,31 +10,33 @@ import { StateService } from '../services/state.service' template: `
-

Select Setup Flow

+

{{ 'Select Setup Flow' | i18n }}

@@ -46,6 +49,7 @@ import { StateService } from '../services/state.service' TuiCell, TuiTitle, TuiAvatar, + i18nPipe, ], }) export default class HomePage { diff --git a/web/projects/setup-wizard/src/app/pages/keyboard.page.ts b/web/projects/setup-wizard/src/app/pages/keyboard.page.ts index 0bdb9cdfe..7ed0fda2c 100644 --- a/web/projects/setup-wizard/src/app/pages/keyboard.page.ts +++ b/web/projects/setup-wizard/src/app/pages/keyboard.page.ts @@ -1,6 +1,7 @@ import { Component, inject } from '@angular/core' import { Router } from '@angular/router' import { FormsModule } from '@angular/forms' +import { i18nPipe } from '@start9labs/shared' import { TUI_IS_MOBILE } from '@taiga-ui/cdk' import { TuiButton, TuiTextfield, TuiTitle } from '@taiga-ui/core' import { TuiChevron, TuiDataListWrapper, TuiSelect } from '@taiga-ui/kit' @@ -12,14 +13,14 @@ import { Keyboard, getKeyboardsForLanguage } from '../utils/languages' template: `
-

Select Keyboard Layout

+

{{ 'Select Keyboard Layout' | i18n }}

- + @if (mobile) { } @else { @@ -36,7 +37,7 @@ import { Keyboard, getKeyboardsForLanguage } from '../utils/languages'
@@ -65,6 +66,7 @@ import { Keyboard, getKeyboardsForLanguage } from '../utils/languages' TuiDataListWrapper, TuiHeader, TuiTitle, + i18nPipe, ], }) export default class KeyboardPage { diff --git a/web/projects/setup-wizard/src/app/pages/language.page.ts b/web/projects/setup-wizard/src/app/pages/language.page.ts index af5193d9d..d7a5af24a 100644 --- a/web/projects/setup-wizard/src/app/pages/language.page.ts +++ b/web/projects/setup-wizard/src/app/pages/language.page.ts @@ -1,6 +1,7 @@ import { Component, inject } from '@angular/core' import { Router } from '@angular/router' import { FormsModule } from '@angular/forms' +import { i18nPipe, i18nService } from '@start9labs/shared' import { TUI_IS_MOBILE } from '@taiga-ui/cdk' import { TuiButton, TuiTextfield, TuiTitle } from '@taiga-ui/core' import { TuiChevron, TuiDataListWrapper, TuiSelect } from '@taiga-ui/kit' @@ -20,22 +21,30 @@ import {

Start9 - Welcome to StartOS + {{ 'Welcome to' | i18n }} StartOS - Select your language + {{ 'Select your language' | i18n }}

- - + @if (mobile) { - + } @else { - + } @if (!mobile) { + @let lang = asLanguage(item);
- {{ item.nativeName }} - @if (item.name !== item.nativeName) { - {{ item.name }} - } + {{ lang.nativeName }} + {{ lang.tuiName | i18n }}
@@ -90,29 +98,43 @@ import { TuiDataListWrapper, TuiHeader, TuiTitle, + i18nPipe, ], }) export default class LanguagePage { private readonly router = inject(Router) private readonly stateService = inject(StateService) + private readonly i18nService = inject(i18nService) protected readonly mobile = inject(TUI_IS_MOBILE) readonly languages = LANGUAGES + selected = LANGUAGES.find(l => l.code === this.stateService.language) || LANGUAGES[0] readonly stringify = (lang: Language) => lang.nativeName + readonly asLanguage = (item: unknown): Language => item as Language + + constructor() { + if (this.selected) { + this.i18nService.setLanguage(this.selected.tuiName) + } + } + + onLanguageChange(language: Language) { + if (language) { + this.i18nService.setLanguage(language.tuiName) + } + } async continue() { if (this.selected) { this.stateService.language = this.selected.code if (this.stateService.kiosk) { - // Check if we need keyboard selection if (needsKeyboardSelection(this.selected.code)) { await this.router.navigate(['/keyboard']) } else { - // Auto-select the only keyboard option this.stateService.keyboard = getDefaultKeyboard( this.selected.code, ).code diff --git a/web/projects/setup-wizard/src/app/pages/loading.page.ts b/web/projects/setup-wizard/src/app/pages/loading.page.ts index a11d152b9..3f971c0e4 100644 --- a/web/projects/setup-wizard/src/app/pages/loading.page.ts +++ b/web/projects/setup-wizard/src/app/pages/loading.page.ts @@ -10,7 +10,7 @@ import { DialogService, formatProgress, getErrorMessage, - i18nKey, + i18nPipe, InitializingComponent, LoadingService, } from '@start9labs/shared' @@ -33,9 +33,11 @@ import { StateService } from '../services/state.service' template: ` @if (error(); as err) {
-

Error initializing server

+

{{ 'Error initializing server' | i18n }}

{{ err }}

- +
} @else { @@ -57,7 +59,7 @@ import { StateService } from '../services/state.service' --tui-background-neutral-1: rgba(0, 0, 0, 0.1); } `, - imports: [InitializingComponent, TuiButton], + imports: [InitializingComponent, TuiButton, i18nPipe], changeDetection: ChangeDetectionStrategy.OnPush, }) export default class LoadingPage { @@ -65,6 +67,7 @@ export default class LoadingPage { private readonly loader = inject(LoadingService) private readonly dialog = inject(DialogService) private readonly router = inject(Router) + private readonly i18n = inject(i18nPipe) readonly type = inject(StateService).setupType readonly progress = toSignal( @@ -117,7 +120,7 @@ export default class LoadingPage { try { await this.api.restart() this.dialog - .openAlert('Wait 1-2 minutes and refresh the page' as i18nKey, { + .openAlert('Wait 1-2 minutes and refresh the page', { label: 'Server is restarting', }) .subscribe() diff --git a/web/projects/setup-wizard/src/app/pages/password.page.ts b/web/projects/setup-wizard/src/app/pages/password.page.ts index 4a721ae4c..adef97f3a 100644 --- a/web/projects/setup-wizard/src/app/pages/password.page.ts +++ b/web/projects/setup-wizard/src/app/pages/password.page.ts @@ -8,7 +8,7 @@ import { ReactiveFormsModule, Validators, } from '@angular/forms' -import { ErrorService, i18nKey, LoadingService } from '@start9labs/shared' +import { ErrorService, i18nPipe, LoadingService } from '@start9labs/shared' import { TuiAutoFocus, TuiMapperPipe, TuiValidator } from '@taiga-ui/cdk' import { TuiButton, @@ -31,13 +31,15 @@ import { StateService } from '../services/state.service'

{{ - isRequired ? 'Set Master Password' : 'Set New Password (Optional)' + isRequired + ? ('Set Master Password' | i18n) + : ('Set New Password (Optional)' | i18n) }} {{ isRequired - ? 'Make it good. Write it down.' - : 'Skip to keep your existing password.' + ? ('Make it good. Write it down.' | i18n) + : ('Skip to keep your existing password.' | i18n) }}

@@ -46,7 +48,9 @@ import { StateService } from '../services/state.service'
- + - Finish + {{ 'Finish' | i18n }} @if (!isRequired) { } @@ -127,6 +131,7 @@ import { StateService } from '../services/state.service' TuiMapperPipe, TuiHeader, TuiTitle, + i18nPipe, ], providers: [ tuiValidationErrorsProvider({ @@ -142,6 +147,7 @@ export default class PasswordPage { private readonly loader = inject(LoadingService) private readonly errorService = inject(ErrorService) private readonly stateService = inject(StateService) + private readonly i18n = inject(i18nPipe) // Password is required only for fresh install readonly isRequired = this.stateService.setupType === 'fresh' @@ -156,7 +162,9 @@ export default class PasswordPage { }) readonly validator = (value: string) => (control: AbstractControl) => - value === control.value ? null : { match: 'Passwords do not match' } + value === control.value + ? null + : { match: this.i18n.transform('Passwords do not match') } async skip() { // Skip means no new password - pass null @@ -168,7 +176,7 @@ export default class PasswordPage { } private async executeSetup(password: string | null) { - const loader = this.loader.open('Starting setup...' as i18nKey).subscribe() + const loader = this.loader.open('Starting setup').subscribe() try { if (this.stateService.setupType === 'attach') { diff --git a/web/projects/setup-wizard/src/app/pages/restore.page.ts b/web/projects/setup-wizard/src/app/pages/restore.page.ts index 37ef58dfa..8db41d5e9 100644 --- a/web/projects/setup-wizard/src/app/pages/restore.page.ts +++ b/web/projects/setup-wizard/src/app/pages/restore.page.ts @@ -1,6 +1,6 @@ import { Component, inject } from '@angular/core' import { Router } from '@angular/router' -import { ErrorService } from '@start9labs/shared' +import { ErrorService, i18nPipe } from '@start9labs/shared' import { T } from '@start9labs/start-sdk' import { TuiButton, @@ -26,12 +26,12 @@ import { UnlockPasswordDialog } from '../components/unlock-password.dialog'

- Select Backup + {{ 'Select Backup' | i18n }} - Select the StartOS backup you want to restore + {{ 'Select the StartOS backup you want to restore' | i18n }} - Refresh + {{ 'Refresh' | i18n }}

@@ -48,7 +48,7 @@ import { UnlockPasswordDialog } from '../components/unlock-password.dialog' [(tuiDropdownOpen)]="open" style="width: 100%" > - Select Backup + {{ 'Select Backup' | i18n }} @@ -56,10 +56,10 @@ import { UnlockPasswordDialog } from '../components/unlock-password.dialog' - + @for (server of physicalServers; track server.id) { } @empty { -
No physical backups
+
{{ 'No physical backups' | i18n }}
}
@@ -117,6 +117,7 @@ import { UnlockPasswordDialog } from '../components/unlock-password.dialog' TuiOptGroup, TuiTitle, TuiHeader, + i18nPipe, ], }) export default class RestorePage { @@ -125,6 +126,7 @@ export default class RestorePage { private readonly dialogs = inject(TuiDialogService) private readonly errorService = inject(ErrorService) private readonly stateService = inject(StateService) + private readonly i18n = inject(i18nPipe) loading = true open = false @@ -143,7 +145,7 @@ export default class RestorePage { this.open = false this.dialogs .open(CIFS, { - label: 'Connect Network Folder', + label: this.i18n.transform('Connect Network Folder'), size: 's', }) .subscribe(result => { @@ -178,7 +180,7 @@ export default class RestorePage { ) { this.dialogs .open(SELECT_NETWORK_BACKUP, { - label: 'Select Network Backup', + label: this.i18n.transform('Select Network Backup'), size: 's', data: { servers }, }) @@ -195,7 +197,7 @@ export default class RestorePage { ) { this.dialogs .open(new PolymorpheusComponent(UnlockPasswordDialog), { - label: 'Unlock Backup', + label: this.i18n.transform('Unlock Backup'), size: 's', }) .subscribe(password => { diff --git a/web/projects/setup-wizard/src/app/pages/success.page.ts b/web/projects/setup-wizard/src/app/pages/success.page.ts index 80df25333..ab60d41e8 100644 --- a/web/projects/setup-wizard/src/app/pages/success.page.ts +++ b/web/projects/setup-wizard/src/app/pages/success.page.ts @@ -6,7 +6,7 @@ import { ViewChild, DOCUMENT, } from '@angular/core' -import { DownloadHTMLService, ErrorService } from '@start9labs/shared' +import { DownloadHTMLService, ErrorService, i18nPipe } from '@start9labs/shared' import { TuiIcon, TuiLoader, TuiTitle } from '@taiga-ui/core' import { TuiAvatar } from '@taiga-ui/kit' import { TuiCardLarge, TuiCell, TuiHeader } from '@taiga-ui/layout' @@ -24,16 +24,17 @@ import { SetupCompleteRes } from '../types'

- Setup Complete! + {{ 'Setup Complete!' | i18n }} @if (!stateService.kiosk) { {{ stateService.setupType === 'restore' - ? 'You can unplug your backup drive' + ? ('You can unplug your backup drive' | i18n) : stateService.setupType === 'transfer' - ? 'You can unplug your transfer drive' - : 'http://start.local was for setup only. It will no longer work.' + ? ('You can unplug your transfer drive' | i18n) + : ('http://start.local was for setup only. It will no longer work.' + | i18n) }} } @@ -48,9 +49,12 @@ import { SetupCompleteRes } from '../types' @@ -135,8 +141,10 @@ import { SetupCompleteRes } from '../types' >
- Continue to Login -
Proceed to the StartOS login screen
+ {{ 'Continue to Login' | i18n }} +
+ {{ 'Proceed to the StartOS login screen' | i18n }} +
} @@ -165,6 +173,7 @@ import { SetupCompleteRes } from '../types' DocumentationComponent, TuiHeader, TuiTitle, + i18nPipe, ], }) export default class SuccessPage implements AfterViewInit { @@ -175,6 +184,7 @@ export default class SuccessPage implements AfterViewInit { private readonly errorService = inject(ErrorService) private readonly api = inject(ApiService) private readonly downloadHtml = inject(DownloadHTMLService) + private readonly i18n = inject(i18nPipe) readonly stateService = inject(StateService) @@ -270,7 +280,9 @@ export default class SuccessPage implements AfterViewInit { } throw new Error( - 'Server did not come back online. Please check your server and try accessing it manually.', + this.i18n.transform( + 'Server did not come back online. Please check your server and try accessing it manually.', + ), ) } } diff --git a/web/projects/setup-wizard/src/app/pages/transfer.page.ts b/web/projects/setup-wizard/src/app/pages/transfer.page.ts index 72b6900c8..c3cec94cd 100644 --- a/web/projects/setup-wizard/src/app/pages/transfer.page.ts +++ b/web/projects/setup-wizard/src/app/pages/transfer.page.ts @@ -1,6 +1,6 @@ import { Component, inject } from '@angular/core' import { Router } from '@angular/router' -import { DiskInfo, ErrorService, toGuid } from '@start9labs/shared' +import { DiskInfo, ErrorService, i18nPipe, toGuid } from '@start9labs/shared' import { TuiButton, TuiDataList, @@ -22,12 +22,14 @@ import { StateService } from '../services/state.service'

- Transfer Data + {{ 'Transfer Data' | i18n }} - Select the drive containing your existing StartOS data + {{ + 'Select the drive containing your existing StartOS data' | i18n + }} - Refresh + {{ 'Refresh' | i18n }}

@@ -44,7 +46,7 @@ import { StateService } from '../services/state.service' [(tuiDropdownOpen)]="open" style="width: 100%" > - Select Drive + {{ 'Select Drive' | i18n }} @@ -57,7 +59,9 @@ import { StateService } from '../services/state.service' } @empty { -
No StartOS data drives found
+
+ {{ 'No StartOS data drives found' | i18n }} +
}
@@ -101,6 +105,7 @@ import { StateService } from '../services/state.service' TuiLoader, TuiTitle, TuiHeader, + i18nPipe, ], }) export default class TransferPage { @@ -109,6 +114,7 @@ export default class TransferPage { private readonly dialogs = inject(TuiDialogService) private readonly errorService = inject(ErrorService) private readonly stateService = inject(StateService) + private readonly i18n = inject(i18nPipe) loading = true open = false @@ -127,14 +133,14 @@ export default class TransferPage { this.open = false const WARNING_OPTIONS: Partial> = { - label: 'Warning', + label: this.i18n.transform('Warning'), size: 's', data: { - content: `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.`, - yes: 'Continue', - no: 'Cancel', + content: this.i18n.transform( + '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.', + ), + yes: this.i18n.transform('Continue'), + no: this.i18n.transform('Cancel'), }, } diff --git a/web/projects/setup-wizard/src/app/utils/languages.ts b/web/projects/setup-wizard/src/app/utils/languages.ts index a32ef2123..034b0fb9b 100644 --- a/web/projects/setup-wizard/src/app/utils/languages.ts +++ b/web/projects/setup-wizard/src/app/utils/languages.ts @@ -1,20 +1,22 @@ -export interface Language { - code: string - name: string - nativeName: string -} +import { i18nKey } from '@start9labs/shared' export interface Keyboard { code: string name: string } +export interface Language { + code: string + tuiName: i18nKey + nativeName: string +} + export const LANGUAGES: Language[] = [ - { code: 'en', name: 'English', nativeName: 'English' }, - { code: 'es', name: 'Spanish', nativeName: 'Español' }, - { code: 'de', name: 'German', nativeName: 'Deutsch' }, - { code: 'fr', name: 'French', nativeName: 'Français' }, - { code: 'pl', name: 'Polish', nativeName: 'Polski' }, + { code: 'en', tuiName: 'english', nativeName: 'English' }, + { code: 'es', tuiName: 'spanish', nativeName: 'Español' }, + { code: 'de', tuiName: 'german', nativeName: 'Deutsch' }, + { code: 'fr', tuiName: 'french', nativeName: 'Français' }, + { code: 'pl', tuiName: 'polish', nativeName: 'Polski' }, ] export const KEYBOARDS_BY_LANGUAGE: Record = { diff --git a/web/projects/shared/src/i18n/dictionaries/de.ts b/web/projects/shared/src/i18n/dictionaries/de.ts index 082357785..593e1e2d1 100644 --- a/web/projects/shared/src/i18n/dictionaries/de.ts +++ b/web/projects/shared/src/i18n/dictionaries/de.ts @@ -597,5 +597,80 @@ export default { 627: 'UI öffnen', 628: 'In Zwischenablage kopiert', 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-Medium entfernen', + 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', } satisfies i18n diff --git a/web/projects/shared/src/i18n/dictionaries/en.ts b/web/projects/shared/src/i18n/dictionaries/en.ts index fdf5c1abf..bed021c85 100644 --- a/web/projects/shared/src/i18n/dictionaries/en.ts +++ b/web/projects/shared/src/i18n/dictionaries/en.ts @@ -595,6 +595,82 @@ export const ENGLISH = { 'Upload': 626, // as in, upload a file 'Open UI': 627, // as in, upload a file 'Copied to clipboard': 628, + // 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, + 'Remove USB Media': 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, // as in, a storage device + 'Transfer': 710, // the verb 'The list is empty': 711, } as const diff --git a/web/projects/shared/src/i18n/dictionaries/es.ts b/web/projects/shared/src/i18n/dictionaries/es.ts index 40a909415..dbabf0512 100644 --- a/web/projects/shared/src/i18n/dictionaries/es.ts +++ b/web/projects/shared/src/i18n/dictionaries/es.ts @@ -597,5 +597,80 @@ export default { 627: 'Abrir UI', 628: 'Copiado al portapapeles', 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: 'Retirar medio USB', + 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', } satisfies i18n diff --git a/web/projects/shared/src/i18n/dictionaries/fr.ts b/web/projects/shared/src/i18n/dictionaries/fr.ts index a7aec7a8e..dc1b99b10 100644 --- a/web/projects/shared/src/i18n/dictionaries/fr.ts +++ b/web/projects/shared/src/i18n/dictionaries/fr.ts @@ -597,5 +597,80 @@ export default { 627: 'Ouvrir UI', 628: 'Copié dans le presse-papiers', 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: 'Retirer le support USB', + 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', } satisfies i18n diff --git a/web/projects/shared/src/i18n/dictionaries/pl.ts b/web/projects/shared/src/i18n/dictionaries/pl.ts index 711ceb2fb..dd02ac4c2 100644 --- a/web/projects/shared/src/i18n/dictionaries/pl.ts +++ b/web/projects/shared/src/i18n/dictionaries/pl.ts @@ -597,5 +597,80 @@ export default { 627: 'Otwórz UI', 628: 'Skopiowano do schowka', 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: 'Usuń nośnik USB', + 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', } satisfies i18n