diff --git a/web/src/i18n/locales/ca.ts b/web/src/i18n/locales/ca.ts index 3e1f7b7..72e4012 100644 --- a/web/src/i18n/locales/ca.ts +++ b/web/src/i18n/locales/ca.ts @@ -1,273 +1,368 @@ const ca = { translation: { head: { - desktop: "Escriptori remot", - login: "Inici de sessió", - changePassword: "Canviar contrasenya", - terminal: "Terminal", - wifi: "Xarxa Sense fils" + desktop: 'Escriptori remot', + login: 'Inici de sessió', + changePassword: 'Canviar contrasenya', + terminal: 'Terminal', + wifi: 'Wi-Fi' }, auth: { - login: "Inici de sessió", + login: 'Inici de sessió', placeholderUsername: "Nom d'usuari", - placeholderPassword: "Contrasenya", - placeholderPassword2: "Torna a introduir la contrasenya", + placeholderPassword: 'Contrasenya', + placeholderPassword2: 'Torna a introduir la contrasenya', noEmptyUsername: "Cal introduir el nom d'usuari", - noEmptyPassword: "Cal introduir la contrasenya", - noAccount: "No s'ha pogut obtenir la informació de l'usuari, actualitza la pàgina web o restableix la contrasenya", + noEmptyPassword: 'Cal introduir la contrasenya', + noAccount: + "No s'ha pogut obtenir la informació de l'usuari, actualitza la pàgina web o restableix la contrasenya", invalidUser: "Nom d'usuari o contrasenya invàlids", - error: "Error inesperat", - changePassword: "Canviar la contrasenya", - changePasswordDesc: "Per a la seguretat del dispositiu, canvia la contrasenya!", - differentPassword: "Les contrasenyes no coincideixen", + locked: 'Massa inicis de sessió, si us plau, torna-ho a provar més tard', + globalLocked: 'Sistema sota protecció, torneu-ho a provar més tard', + error: 'Error inesperat', + changePassword: 'Canviar la contrasenya', + changePasswordDesc: 'Per a la seguretat del dispositiu, canvia la contrasenya!', + differentPassword: 'Les contrasenyes no coincideixen', illegalUsername: "El nom d'usuari conté caràcters no permesos", - illegalPassword: "La contrasenya conté caràcters no permesos", - forgetPassword: "Has oblidat la contrasenya", + illegalPassword: 'La contrasenya conté caràcters no permesos', + forgetPassword: 'Has oblidat la contrasenya', ok: "D'acord", - cancel: "Cancel·la", - loginButtonText: "Inicia sessió", + cancel: 'Cancel·la', + loginButtonText: 'Inicia sessió', tips: { - reset1: "Per restablir les contrasenyes, mantingues premut el botó BOOT del NanoKVM durant 10 segons.", - reset2: "Per veure els passos detallats, consulta aquest document:", - reset3: "Compte web per defecte:", - reset4: "Compte SSH per defecte:", - change1: "Aquesta acció canviarà les següents contrasenyes:", + reset1: + 'Per restablir les contrasenyes, mantingues premut el botó BOOT del NanoKVM durant 10 segons.', + reset2: 'Per veure els passos detallats, consulta aquest document:', + reset3: 'Compte web per defecte:', + reset4: 'Compte SSH per defecte:', + change1: 'Aquesta acció canviarà les següents contrasenyes:', change2: "Contrasenya d'inici de sessió web", - change3: "Contrasenya root del sistema (inici de sessió SSH)", - change4: "Per restablir les contrasenyes, mantingues premut el botó BOOT del NanoKVM." + change3: 'Contrasenya root del sistema (inici de sessió SSH)', + change4: 'Per restablir les contrasenyes, mantingues premut el botó BOOT del NanoKVM.' } }, wifi: { - title: "Xarxa Sense fils", - description: "Configura la xarxa sense fils per al NanoKVM", + title: 'Wi-Fi', + description: 'Configura Wi-Fi per al NanoKVM', success: "Comprova l'estat de la xarxa del NanoKVM i visita la nova adreça IP.", failed: "L'operació ha fallat, torna-ho a intentar.", + invalidMode: + 'El mode actual no admet la configuració de xarxa. Aneu al vostre dispositiu i activeu el mode de configuració Wi-Fi.', confirmBtn: "D'acord", - finishBtn: "Fet" + finishBtn: 'Fet', + ap: { + authTitle: 'Es requereix autenticació', + authDescription: 'Introduïu la contrasenya AP per continuar', + authFailed: 'Contrasenya AP no vàlida', + passPlaceholder: 'AP contrasenya', + verifyBtn: 'Verificar' + } }, screen: { - title: "Pantalla", - video: "Mode de vídeo", + scale: 'Escala', + title: 'Pantalla', + video: 'Mode de vídeo', videoDirectTips: "Activa HTTPS a 'Configuració > Dispositiu' per utilitzar aquest mode", - resolution: "Resolució", - auto: "Automàtic", - autoTips: "Poden aparèixer talls o desajustos del ratolí en certes resolucions. Prova a canviar la resolució de l'amfitrió remot o desactiva el mode automàtic.", - fps: "FPS", - customizeFps: "Personalitzat", - quality: "Qualitat", - qualityLossless: "Sense pèrdua", - qualityHigh: "Alta", - qualityMedium: "Mitjana", - qualityLow: "Baixa", - frameDetect: "Detecció de fotogrames", - frameDetectTip: "Calcula la diferència entre fotogrames. S'atura la transmissió si no hi ha canvis a la pantalla de l'amfitrió remot.", - resetHdmi: "Restablir HDMI" + resolution: 'Resolució', + auto: 'Automàtic', + autoTips: + "Poden aparèixer talls o desajustos del ratolí en certes resolucions. Prova a canviar la resolució de l'amfitrió remot o desactiva el mode automàtic.", + fps: 'FPS', + customizeFps: 'Personalitzat', + quality: 'Qualitat', + qualityLossless: 'Sense pèrdua', + qualityHigh: 'Alta', + qualityMedium: 'Mitjana', + qualityLow: 'Baixa', + frameDetect: 'Detecció de fotogrames', + frameDetectTip: + "Calcula la diferència entre fotogrames. S'atura la transmissió si no hi ha canvis a la pantalla de l'amfitrió remot.", + resetHdmi: 'Restablir HDMI' }, keyboard: { - title: "Teclat", - paste: "Enganxa", - tips: "Només es permeten lletres i símbols estàndard", - placeholder: "Escriu aquí", - submit: "Envia", - virtual: "Teclat", - ctrlaltdel: "Ctrl+Alt+Del" + title: 'Teclat', + paste: 'Enganxa', + tips: 'Només es permeten lletres i símbols estàndard', + placeholder: 'Escriu aquí', + submit: 'Envia', + virtual: 'Teclat', + readClipboard: 'Llegir des del porta-retalls', + clipboardPermissionDenied: + "S'ha denegat el permís del porta-retalls. Permet l'accés al porta-retalls al teu navegador.", + clipboardReadError: "No s'ha pogut llegir el porta-retalls", + dropdownEnglish: 'Anglès', + dropdownGerman: 'alemany', + dropdownFrench: 'francès', + dropdownRussian: 'rus', + shortcut: { + title: 'Dreceres', + custom: 'Personalitzat', + capture: 'Feu clic aquí per capturar la drecera', + clear: 'Clar', + save: 'Desa', + captureTips: + 'Capturar tecles del sistema (com la tecla Windows) requereix permís de pantalla completa.', + enterFullScreen: 'Canvia el mode de pantalla completa.' + }, + leaderKey: { + title: 'Tecla líder', + desc: "Evita les restriccions del navegador i envia dreceres del sistema directament a l'amfitrió remot.", + howToUse: "Com s'utilitza", + simultaneous: { + title: 'Mode simultània', + desc1: 'Manteniu premuda la tecla líder i premeu la drecera.', + desc2: 'Intuïtiu, però pot entrar en conflicte amb les dreceres del sistema.' + }, + sequential: { + title: 'Mode seqüencial', + desc1: + 'Premeu la tecla líder → premeu la drecera en seqüència → torneu a prémer la tecla líder.', + desc2: 'Requereix més passos, però evita completament els conflictes del sistema.' + }, + enable: 'Activa la tecla líder', + tip: "Quan s'assigna com a tecla líder, aquesta tecla només funciona com a activador de dreceres i perd el seu comportament predeterminat.", + placeholder: 'Premeu la tecla líder', + shiftRight: 'Maj dreta', + ctrlRight: 'Ctrl dret', + metaRight: 'Win dret', + submit: 'Envia', + recorder: { + rec: 'REC', + activate: 'Activa les tecles', + input: 'Premeu la drecera...' + } + } }, mouse: { - title: "Ratolí", - cursor: "Estil del cursor", - default: "Cursor per defecte", - pointer: "Cursor punter", - cell: "Cursor de cel·la", - text: "Cursor de text", - grab: "Cursor de mà", - hide: "Amaga el cursor", - mode: "Mode de ratolí", - absolute: "Mode absolut", - relative: "Mode relatiu", - speed: "Velocitat de la roda", - fast: "Ràpida", - slow: "Lenta", + title: 'Ratolí', + cursor: 'Estil del cursor', + default: 'Cursor per defecte', + pointer: 'Cursor punter', + cell: 'Cursor de cel·la', + text: 'Cursor de text', + grab: 'Cursor de mà', + hide: 'Amaga el cursor', + mode: 'Mode de ratolí', + absolute: 'Mode absolut', + relative: 'Mode relatiu', + direction: 'Direcció de la roda de desplaçament', + scrollUp: "Desplaça't cap amunt", + scrollDown: "Desplaça't cap avall", + speed: 'Velocitat de desplaçament', + fast: 'Ràpida', + slow: 'Lenta', requestPointer: "Estàs usant el mode relatiu. Fes clic a l'escriptori per obtenir el punter.", - resetHid: "Restablir HID", + resetHid: 'Restablir HID', hidOnly: { - title: "Mode només HID", - desc: "Si el teclat o ratolí deixen de funcionar i restablir HID no ajuda, pot ser un problema de compatibilitat. Prova d'activar el mode només HID.", - tip1: "Activar aquest mode desmuntarà el disc virtual i la xarxa virtual", - tip2: "En mode només HID, no es pot muntar imatges", - tip3: "El NanoKVM es reiniciarà automàticament en canviar de mode", - enable: "Activa mode només HID", - disable: "Desactiva mode només HID" + title: 'Mode només HID', + desc: 'Si el ratolí i el teclat deixen de respondre i restablir HID no ajuda, pot ser un problema de compatibilitat entre el NanoKVM i el dispositiu. Proveu d’activar el mode només HID per millorar la compatibilitat.', + tip1: 'Activar el mode només HID desmuntarà el disc virtual i la xarxa virtual', + tip2: 'En mode només HID, no es pot muntar imatges', + tip3: 'El NanoKVM es reiniciarà automàticament en canviar de mode', + enable: 'Activa mode només HID', + disable: 'Desactiva mode només HID' } }, image: { - title: "Imatges", - loading: "Carregant...", + title: 'Imatges', + loading: 'Carregant...', empty: "No s'ha trobat res", - cdrom: "Munta la imatge en mode CD-ROM", - mountFailed: "Error en muntar", - mountDesc: "En alguns sistemes cal expulsar el disc virtual abans de muntar la imatge.", - refresh: "Actualitza la llista", + mountMode: 'Mode de muntatge', + mountFailed: 'Error en muntar', + mountDesc: 'En alguns sistemes cal expulsar el disc virtual abans de muntar la imatge.', + unmountFailed: "No s'ha pogut desmuntar", + unmountDesc: + "En alguns sistemes, cal expulsar manualment de l'amfitrió remot abans de desmuntar la imatge.", + refresh: 'Actualitza la llista', + attention: 'Atenció', + deleteConfirm: 'Esteu segur que voleu suprimir aquesta imatge?', + okBtn: 'Sí', + cancelBtn: 'No', tips: { - title: "Com pujar imatges", - usb1: "Connecta el NanoKVM al teu ordinador via USB.", + title: 'Com pujar imatges', + usb1: 'Connecta el NanoKVM al teu ordinador via USB.', usb2: "Assegura't que el disc virtual està muntat (Configuració - Disc Virtual).", usb3: "Obre el disc virtual i copia la imatge a l'arrel.", - scp1: "Comprova que el NanoKVM i el teu ordinador estan a la mateixa xarxa.", - scp2: "Obre un terminal i usa SCP per pujar la imatge al directori /data del NanoKVM.", - scp3: "Exemple: scp ruta-de-la-imatge root@ip-del-nanokvm:/data", - tfCard: "Targeta TF", - tf1: "Mètode disponible a sistemes GNU/Linux", - tf2: "Extreu la targeta TF del NanoKVM (versió FULL, cal obrir la carcassa).", + scp1: 'Comprova que el NanoKVM i el teu ordinador estan a la mateixa xarxa.', + scp2: 'Obre un terminal i usa SCP per pujar la imatge al directori /data del NanoKVM.', + scp3: 'Exemple: scp ruta-de-la-imatge root@ip-del-nanokvm:/data', + tfCard: 'Targeta TF', + tf1: 'Mètode disponible a sistemes GNU/Linux', + tf2: 'Extreu la targeta TF del NanoKVM (versió FULL, cal obrir la carcassa).', tf3: "Introdueix la targeta en un lector i connecta'l a l'ordinador.", - tf4: "Copia la imatge al directori /data de la targeta.", - tf5: "Reintrodueix la targeta al NanoKVM." + tf4: 'Copia la imatge al directori /data de la targeta.', + tf5: 'Reintrodueix la targeta al NanoKVM.' } }, script: { - title: "Scripts", - upload: "Puja", - run: "Executa", - runBackground: "Executa en segon pla", + title: 'Scripts', + upload: 'Puja', + run: 'Executa', + runBackground: 'Executa en segon pla', runFailed: "Error en l'execució", - attention: "Atenció", - delDesc: "Estàs segur que vols eliminar aquest fitxer?", - confirm: "Sí", - cancel: "No", - delete: "Esborra", - close: "Tanca" + attention: 'Atenció', + delDesc: 'Estàs segur que vols eliminar aquest fitxer?', + confirm: 'Sí', + cancel: 'No', + delete: 'Esborra', + close: 'Tanca' }, terminal: { - title: "Terminal", - nanokvm: "Terminal NanoKVM", - serial: "Terminal de port sèrie", - serialPort: "Port sèrie", - serialPortPlaceholder: "Introdueix el port sèrie", - baudrate: "Velocitat (baudrate)", - parity: "Paritat", - parityNone: "Cap", - parityEven: "Parell", - parityOdd: "Senar", - flowControl: "Control de flux", - flowControlNone: "Cap", - flowControlSoft: "Suau", - flowControlHard: "Dur", - dataBits: "Bits de dades", - stopBits: "Bits de parada", + title: 'Terminal', + nanokvm: 'Terminal NanoKVM', + serial: 'Terminal de port sèrie', + serialPort: 'Port sèrie', + serialPortPlaceholder: 'Introdueix el port sèrie', + baudrate: 'Velocitat (baudrate)', + parity: 'Paritat', + parityNone: 'Cap', + parityEven: 'Parell', + parityOdd: 'Senar', + flowControl: 'Control de flux', + flowControlNone: 'Cap', + flowControlSoft: 'Programari', + flowControlHard: 'Maquinari', + dataBits: 'Bits de dades', + stopBits: 'Bits de parada', confirm: "D'acord" }, wol: { - title: "Wake-on-LAN", - sending: "Enviant comanda...", - sent: "Comanda enviada", - input: "Introdueix la MAC", + title: 'Wake-on-LAN', + sending: 'Enviant comanda...', + sent: 'Comanda enviada', + input: 'Introdueix la MAC', ok: "D'acord" }, download: { title: "Descarregador d'imatges", - input: "Introdueix la URL de la imatge", + input: 'Introdueix la URL de la imatge', ok: "D'acord", - disabled: "La partició /data és només lectura. No es pot descarregar la imatge." + disabled: 'La partició /data és només lectura. No es pot descarregar la imatge.', + uploadbox: 'Deixeu anar el fitxer aquí o feu clic per seleccionar-lo', + inputfile: "Introduïu el fitxer d'imatge", + NoISO: 'Cap ISO' }, power: { - title: "Alimentació", - showConfirm: "Confirmació", + title: 'Alimentació', + showConfirm: 'Confirmació', showConfirmTip: "Les operacions d'alimentació requereixen confirmació", - reset: "Reinicia", - power: "Encén", - powerShort: "Clic curt", - powerLong: "Clic llarg", - resetConfirm: "Vols realment reiniciar?", - powerConfirm: "Vols realment encendre/apagar?", - okBtn: "Sí", - cancelBtn: "No" + reset: 'Reinicia', + power: 'Encén', + powerShort: 'Clic curt', + powerLong: 'Clic llarg', + resetConfirm: 'Vols realment reiniciar?', + powerConfirm: 'Vols realment encendre/apagar?', + okBtn: 'Sí', + cancelBtn: 'No' }, settings: { - title: "Configuració", + title: 'Configuració', about: { - title: "Sobre NanoKVM", - information: "Informació", - ip: "IP", - mdns: "mDNS", - application: "Versió aplicació", - applicationTip: "Versió de la interfície web de NanoKVM", - image: "Versió de la imatge", - imageTip: "Versió del sistema NanoKVM", - deviceKey: "Clau del dispositiu", - community: "Comunitat", - hostname: "Nom del dispositiu", - hostnameUpdated: "Nom actualitzat. Reinicia per aplicar.", + title: 'Sobre NanoKVM', + information: 'Informació', + ip: 'IP', + mdns: 'mDNS', + application: 'Versió aplicació', + applicationTip: 'Versió de la interfície web de NanoKVM', + image: 'Versió de la imatge', + imageTip: 'Versió del sistema NanoKVM', + deviceKey: 'Clau del dispositiu', + community: 'Comunitat', + hostname: 'Nom del dispositiu', + hostnameUpdated: 'Nom actualitzat. Reinicia per aplicar.', ipType: { - Wired: "Cablejada", - Wireless: "Sense fil", - Other: "Altra" + Wired: 'Cablejada', + Wireless: 'Sense fil', + Other: 'Altra' } }, appearance: { - title: "Aparença", - display: "Pantalla", - language: "Idioma", - menuBar: "Barra de menú", - menuBarDesc: "Mostra icones a la barra de menú", - webTitle: "Títol web", - webTitleDesc: "Personalitza el títol de la pàgina" + title: 'Aparença', + display: 'Pantalla', + language: 'Idioma', + languageDesc: "Seleccioneu l'idioma per a la interfície", + webTitle: 'Títol web', + webTitleDesc: 'Personalitza el títol de la pàgina', + menuBar: { + title: 'Barra de menús', + mode: 'Mode de visualització', + modeDesc: 'Mostra la barra de menús a la pantalla', + modeOff: 'Apagat', + modeAuto: 'Ocultació automàtica', + modeAlways: 'Sempre visible', + icons: 'Icones del submenú', + iconsDesc: 'Mostra les icones del submenú a la barra de menús' + } }, device: { - title: "Dispositiu", + title: 'Dispositiu', oled: { - title: "OLED", - description: "Apagar pantalla OLED després de", - 0: "Mai", - 15: "15 s", - 30: "30 s", - 60: "1 min", - 180: "3 min", - 300: "5 min", - 600: "10 min", - 1800: "30 min", - 3600: "1 h" + title: 'OLED', + description: 'Apagar pantalla OLED després de', + 0: 'Mai', + 15: '15 s', + 30: '30 s', + 60: '1 min', + 180: '3 min', + 300: '5 min', + 600: '10 min', + 1800: '30 min', + 3600: '1 h' }, ssh: { - description: "Activa accés remot per SSH", - tip: "Configura una contrasenya segura abans (Compte - Canvia contrasenya)" + description: 'Activa accés remot per SSH', + tip: 'Configura una contrasenya segura abans (Compte - Canvia contrasenya)' }, - advanced: "Configuració avançada", + advanced: 'Configuració avançada', swap: { - title: "Swap", - disable: "Desactiva", - description: "Defineix la mida del fitxer swap", - tip: "Pot reduir la vida útil de la targeta SD!" + title: 'Swap', + disable: 'Desactiva', + description: 'Defineix la mida del fitxer swap', + tip: 'Pot reduir la vida útil de la targeta SD!' }, mouseJiggler: { - title: "Mou-ratolí automàtic", - description: "Evita que el dispositiu remot entri en repòs", - disable: "Desactiva", - absolute: "Mode absolut", - relative: "Mode relatiu" + title: 'Mou-ratolí automàtic', + description: 'Evita que el dispositiu remot entri en repòs', + disable: 'Desactiva', + absolute: 'Mode absolut', + relative: 'Mode relatiu' }, mdns: { - description: "Activa descobriment mDNS", - tip: "Desactiva-ho si no és necessari" + description: 'Activa descobriment mDNS', + tip: 'Desactiva-ho si no és necessari' }, hdmi: { - description: "Activa la sortida HDMI" + description: 'Activa la sortida HDMI' }, - hidOnly: "Mode només HID", - disk: "Disc virtual", - diskDesc: "Munta un disc U virtual al dispositiu remot", - network: "Xarxa virtual", - networkDesc: "Munta una targeta de xarxa virtual al dispositiu remot", - reboot: "Reinicia", - rebootDesc: "Segur que vols reiniciar el NanoKVM?", - okBtn: "Sí", - cancelBtn: "No" + autostart: { + title: "Configuració dels scripts d'inici automàtic", + description: "Gestioneu els scripts que s'executen automàticament a l'inici del sistema", + new: 'Nou', + deleteConfirm: 'Estàs segur que vols eliminar aquest fitxer?', + yes: 'Sí', + no: 'No', + scriptName: "Nom de l'script d'inici automàtic", + scriptContent: "Contingut de l'script d'inici automàtic", + settings: 'Configuració' + }, + hidOnly: 'Mode només HID', + hidOnlyDesc: "Deixeu d'emular dispositius virtuals, conservant només el control bàsic HID", + disk: 'Disc virtual', + diskDesc: 'Munta un disc U virtual al dispositiu remot', + network: 'Xarxa virtual', + networkDesc: 'Munta una targeta de xarxa virtual al dispositiu remot', + reboot: 'Reinicia', + rebootDesc: 'Segur que vols reiniciar el NanoKVM?', + okBtn: 'Sí', + cancelBtn: 'No' }, network: { title: 'Xarxa', wifi: { title: 'Wi-Fi', description: 'Configura la xarxa Wi-Fi', - apMode: 'El mode AP està activat; connecta\'t al Wi-Fi escanejant el codi QR', - connect: 'Connecta\'t a Wi-Fi', + apMode: "El mode AP està activat; connecta't al Wi-Fi escanejant el codi QR", + connect: "Connecta't a Wi-Fi", connectDesc1: 'Introdueix el SSID i la contrasenya de la xarxa', connectDesc2: 'Introdueix la contrasenya per connectar-te a aquesta xarxa', disconnect: 'Segur que vols desconnectar la xarxa?', @@ -275,7 +370,7 @@ const ca = { ssid: 'Nom', password: 'Contrasenya', joinBtn: 'Connecta', - confirmBtn: 'D\'acord', + confirmBtn: "D'acord", cancelBtn: 'Cancel·la' }, tls: { @@ -293,11 +388,11 @@ const ca = { invalid: 'Introdueix una adreça IP vàlida', noDhcp: 'No hi ha cap DNS DHCP disponible actualment', saved: 'Configuració DNS desada', - saveFailed: 'No s\'ha pogut desar la configuració DNS', + saveFailed: "No s'ha pogut desar la configuració DNS", unsaved: 'Canvis no desats', maxServers: 'Es permeten com a màxim {{count}} servidors DNS', dnsServers: 'Servidors DNS', - dhcpServersDescription: 'Els servidors DNS s\'obtenen automàticament via DHCP.', + dhcpServersDescription: "Els servidors DNS s'obtenen automàticament via DHCP.", manualServersDescription: 'Els servidors DNS es poden editar manualment.', networkDetails: 'Detalls de xarxa', interface: 'Interfície', @@ -308,77 +403,211 @@ const ca = { } }, tailscale: { - title: "Tailscale", + title: 'Tailscale', memory: { - title: "Optimització de memòria", - tip: "Quan es supera el límit de memòria, es fa una neteja més agressiva. Recomanat: 75MB si uses Tailscale. Requereix reiniciar Tailscale.", - disable: "Desactiva" + title: 'Optimització de memòria', + tip: 'Quan es supera el límit de memòria, es fa una neteja més agressiva. Recomanat: 75MB si uses Tailscale. Requereix reiniciar Tailscale.' }, - restart: "Reiniciar Tailscale?", - stop: "Aturar Tailscale?", - stopDesc: "Tanca la sessió i desactiva l'inici automàtic", - loading: "Carregant...", - notInstall: "Tailscale no instal·lat! Instal·la-ho.", - install: "Instal·la", - installing: "Instal·lant", - failed: "Error en la instal·lació", - retry: "Actualitza i torna-ho a provar. O instal·la manualment", - download: "Descarrega el", + swap: { + title: 'Intercanvi de memòria', + tip: "Si els problemes persisteixen després d'activar l'optimització de memòria, proveu d'habilitar la memòria d'intercanvi. Això estableix la mida del fitxer d'intercanvi a 256MB per defecte, que es pot ajustar a \"Configuració > Dispositiu\"." + }, + restart: 'Reiniciar Tailscale?', + stop: 'Aturar Tailscale?', + stopDesc: 'Tanca la sessió de Tailscale i desactiva l’inici automàtic en arrencar.', + loading: 'Carregant...', + notInstall: 'Tailscale no instal·lat! Instal·la-ho.', + install: 'Instal·la', + installing: 'Instal·lant', + failed: 'Error en la instal·lació', + retry: 'Actualitza i torna-ho a provar. O instal·la manualment', + download: 'Descarrega el', package: "paquet d'instal·lació", - unzip: "i descomprimeix-lo", - upTailscale: "Puja tailscale a /usr/bin/", - upTailscaled: "Puja tailscaled a /usr/sbin/", - refresh: "Actualitza la pàgina", - notLogin: "El dispositiu no està vinculat. Inicia sessió per vincular-lo.", - urlPeriod: "Aquesta URL és vàlida durant 10 minuts", - login: "Inicia sessió", - loginSuccess: "Sessió iniciada correctament", - enable: "Activa Tailscale", - deviceName: "Nom del dispositiu", - deviceIP: "IP del dispositiu", - account: "Compte", - logout: "Tanca sessió", - logoutDesc: "Segur que vols tancar sessió?", - uninstall: "Desinstal·la Tailscale", - okBtn: "Sí", - cancelBtn: "No" + unzip: 'i descomprimeix-lo', + upTailscale: 'Puja tailscale al directori /usr/bin/ del NanoKVM', + upTailscaled: 'Puja tailscaled al directori /usr/sbin/ del NanoKVM', + refresh: 'Actualitza la pàgina', + notRunning: "Tailscale no s'està executant. Si us plau, inicieu-lo per continuar.", + run: 'Comença', + notLogin: 'El dispositiu no està vinculat. Inicia sessió per vincular-lo.', + urlPeriod: 'Aquesta URL és vàlida durant 10 minuts', + login: 'Inicia sessió', + loginSuccess: 'Sessió iniciada correctament', + enable: 'Activa Tailscale', + deviceName: 'Nom del dispositiu', + deviceIP: 'IP del dispositiu', + account: 'Compte', + logout: 'Tanca sessió', + logoutDesc: 'Segur que vols tancar sessió?', + uninstall: 'Desinstal·la Tailscale', + uninstallDesc: 'Esteu segur que voleu desinstal·lar Tailscale?', + okBtn: 'Sí', + cancelBtn: 'No' }, update: { - title: "Comprova actualitzacions", - queryFailed: "Error en obtenir la versió", - updateFailed: "Error en actualitzar. Torna-ho a intentar.", - isLatest: "Ja tens la darrera versió.", - available: "Hi ha una actualització disponible. Vols actualitzar ara?", - updating: "Actualitzant... espera", - confirm: "Confirma", - cancel: "Cancel·la", - preview: "Versió de prova", - previewDesc: "Prova noves funcions abans que ningú", - previewTip: "Compte: aquestes versions poden tenir errors o funcions inacabades!" + title: 'Comprova actualitzacions', + queryFailed: 'Error en obtenir la versió', + updateFailed: 'Error en actualitzar. Torna-ho a intentar.', + isLatest: 'Ja tens la darrera versió.', + available: 'Hi ha una actualització disponible. Vols actualitzar ara?', + updating: 'Actualitzant... espera', + confirm: 'Confirma', + cancel: 'Cancel·la', + preview: 'Versió de prova', + previewDesc: 'Prova noves funcions abans que ningú', + previewTip: 'Compte: aquestes versions poden tenir errors o funcions inacabades!', + offline: { + title: 'Actualitzacions fora de línia', + desc: "Actualització mitjançant el paquet d'instal·lació local", + upload: 'Puja', + invalidName: 'Format de nom de fitxer no vàlid. Baixeu-lo des de les versions de GitHub.', + updateFailed: 'Error en actualitzar. Torna-ho a intentar.' + } }, account: { - title: "Compte", - webAccount: "Nom del compte web", - password: "Contrasenya", - updateBtn: "Canvia", - logoutBtn: "Tanca sessió", - logoutDesc: "Segur que vols tancar sessió?", - okBtn: "Sí", - cancelBtn: "No" + title: 'Compte', + webAccount: 'Nom del compte web', + password: 'Contrasenya', + updateBtn: 'Canvia', + logoutBtn: 'Tanca sessió', + logoutDesc: 'Segur que vols tancar sessió?', + okBtn: 'Sí', + cancelBtn: 'No' + } + }, + picoclaw: { + title: 'PicoClaw Assistent', + empty: 'Obriu el tauler i inicieu una tasca per començar.', + inputPlaceholder: 'Descriu què vols que faci el PicoClaw', + newConversation: 'Nova conversa', + processing: "S'està processant...", + agent: { + defaultTitle: 'Assistent general', + defaultDescription: 'Ajuda general de xat, cerca i espai de treball.', + kvmTitle: 'Control remot', + kvmDescription: "Opera l'amfitrió remot mitjançant NanoKVM.", + switched: "Rol d'agent canviat", + switchFailed: "No s'ha pogut canviar la funció d'agent" + }, + send: 'Envia', + cancel: 'Cancel·la', + status: { + connecting: "S'està connectant a la passarel·la...", + connected: 'Sessió de PicoClaw connectada', + disconnected: 'Sessió de PicoClaw tancada', + stopped: "S'ha enviat la sol·licitud d'aturada", + runtimeStarted: "Temps d'execució de PicoClaw iniciat", + runtimeStartFailed: "No s'ha pogut iniciar el temps d'execució de PicoClaw", + runtimeStopped: "Temps d'execució de PicoClaw aturat", + runtimeStopFailed: "No s'ha pogut aturar el temps d'execució de PicoClaw" + }, + connection: { + runtime: { + checking: 'Comprovació', + ready: "Temps d'execució a punt", + stopped: "El temps d'execució s'ha aturat", + unavailable: "Temps d'execució no disponible", + configError: 'Error de configuració' + }, + transport: { + connecting: 'En connexió', + connected: 'Connectat' + }, + run: { + idle: 'Inactiu', + busy: 'Ocupat' + } + }, + message: { + toolAction: 'Acció', + observation: 'Observació', + screenshot: 'Captura de pantalla' + }, + overlay: { + locked: "PicoClaw està controlant el dispositiu. L'entrada manual està en pausa." + }, + install: { + install: 'Instal·la PicoClaw', + installing: 'Instal·lant PicoClaw', + success: 'PicoClaw instal·lat correctament', + failed: "No s'ha pogut instal·lar PicoClaw", + uninstalling: "S'està desinstal·lant el temps d'execució...", + uninstalled: "El temps d'execució s'ha desinstal·lat correctament.", + uninstallFailed: 'La desinstal·lació ha fallat.', + requiredTitle: 'PicoClaw no està instal·lat', + requiredDescription: "Instal·leu PicoClaw abans d'iniciar el temps d'execució de PicoClaw.", + progressDescription: "PicoClaw s'està baixant i instal·lant.", + stages: { + preparing: 'Preparant', + downloading: "S'està baixant", + extracting: 'Extracció', + installing: 'Instal·lant', + installed: 'Instal·lat', + install_timeout: 'Temps esgotat', + install_failed: 'Ha fallat' + } + }, + model: { + requiredTitle: 'La configuració del model és necessària', + requiredDescription: "Configura el model PicoClaw abans d'utilitzar el xat PicoClaw.", + docsTitle: 'Guia de configuració', + docsDesc: 'Models i protocols compatibles', + menuLabel: 'Configura el model', + modelIdentifier: 'Identificador del model', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'Clau API', + apiKeyPlaceholder: 'Introduïu la clau API del model', + save: 'Desa', + saving: 'Desa', + saved: "S'ha desat la configuració del model", + saveFailed: "No s'ha pogut desar la configuració del model", + invalid: "Cal indicar l'identificador del model, l'API Base URL i la clau API" + }, + uninstall: { + menuLabel: 'Desinstal·la', + confirmTitle: 'Desinstal·la PicoClaw', + confirmContent: + "Esteu segur que voleu desinstal·lar PicoClaw? Això suprimirà l'executable i tots els fitxers de configuració.", + confirmOk: 'Desinstal·la', + confirmCancel: 'Cancel·la' + }, + history: { + title: 'Historial', + loading: 'Carregant sessions...', + emptyTitle: 'Encara no hi ha historial', + emptyDescription: 'Les sessions anteriors de PicoClaw apareixeran aquí.', + loadFailed: "No s'ha pogut carregar l'historial de sessions", + deleteFailed: "No s'ha pogut suprimir la sessió", + deleteConfirmTitle: 'Suprimeix la sessió', + deleteConfirmContent: 'Esteu segur que voleu suprimir "{{title}}"?', + deleteConfirmOk: 'Esborra', + deleteConfirmCancel: 'Cancel·la', + messageCount_one: '{{count}} missatge', + messageCount_other: '{{count}} missatges' + }, + config: { + startRuntime: 'Inici PicoClaw', + stopRuntime: 'Atura PicoClaw' + }, + start: { + title: 'Inici PicoClaw', + description: "Inicieu el temps d'execució per començar a utilitzar l'assistent PicoClaw." } }, error: { - title: "Hi ha hagut un error", - refresh: "Actualitza" + title: 'Hi ha hagut un error', + refresh: 'Actualitza' }, fullscreen: { - toggle: "Pantalla completa" + toggle: 'Pantalla completa' }, menu: { - collapse: "Amaga menú", - expand: "Mostra menú" + collapse: 'Amaga menú', + expand: 'Mostra menú' } } }; -export default ca; \ No newline at end of file +export default ca; diff --git a/web/src/i18n/locales/cz.ts b/web/src/i18n/locales/cz.ts index c782a7f..f69ce8d 100644 --- a/web/src/i18n/locales/cz.ts +++ b/web/src/i18n/locales/cz.ts @@ -17,6 +17,8 @@ const cz = { noAccount: 'Nepodařilo se získat informace o uživateli, prosím obnovte stránku nebo resetujte heslo', invalidUser: 'Neplatné uživatelské jméno nebo heslo', + locked: 'Příliš mnoho přihlášení, zkuste to znovu později', + globalLocked: 'Systém je chráněn, zkuste to znovu později', error: 'Neočekávaná chyba', changePassword: 'Změnit heslo', changePasswordDesc: @@ -31,25 +33,37 @@ const cz = { tips: { reset1: 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', - reset2: 'For detailed steps, please consult this document:', - reset3: 'Web default account:', - reset4: 'SSH default account:', - change1: 'Please note that this action will change the following passwords:', - change2: 'Web login password', - change3: 'System root password (SSH login password)', - change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + reset2: 'Podrobné kroky najdete v tomto dokumentu:', + reset3: 'Výchozí webový účet:', + reset4: 'Výchozí účet SSH:', + change1: 'Upozorňujeme, že tato akce změní následující hesla:', + change2: 'Heslo pro webové přihlášení', + change3: 'Heslo systémového uživatele root (heslo pro přihlášení SSH)', + change4: 'Chcete-li hesla resetovat, podržte tlačítko BOOT na NanoKVM.' } }, wifi: { title: 'Wi-Fi', - description: 'Configure Wi-Fi for NanoKVM', + description: 'Nastavit Wi-Fi pro NanoKVM', success: 'Please check the network status of NanoKVM and visit the new IP address.', - failed: 'Operation failed, please try again.', + failed: 'Operace selhala, zkuste to znovu.', + invalidMode: + 'Aktuální režim nepodporuje nastavení sítě. Přejděte do svého zařízení a povolte konfigurační režim Wi-Fi.', confirmBtn: 'Ok', - finishBtn: 'Finished' + finishBtn: 'Dokončeno', + ap: { + authTitle: 'Vyžaduje se ověření', + authDescription: 'Pokračujte zadáním hesla AP', + authFailed: 'Neplatné heslo AP', + passPlaceholder: 'AP heslo', + verifyBtn: 'Ověřte' + } }, screen: { + scale: 'Měřítko', + title: 'Obrazovka', video: 'Režim videa', + videoDirectTips: 'Chcete-li používat tento režim, povolte HTTPS v "Nastavení > Zařízení"', resolution: 'Rozlišení', auto: 'Automatické', autoTips: @@ -64,17 +78,65 @@ const cz = { frameDetect: 'Detekce snímků', frameDetectTip: 'Vypočítá rozdíl mezi snímky. Přenos video streamu se zastaví, pokud nejsou detekovány změny na obrazovce vzdáleného hostitele.', - resetHdmi: 'Reset HDMI' + resetHdmi: 'Resetovat HDMI' }, keyboard: { + title: 'Klávesnice', paste: 'Vložit', tips: 'Podporovány jsou pouze standardní písmena a symboly klávesnice', placeholder: 'Zadejte text', submit: 'Odeslat', virtual: 'Klávesnice', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Přečíst ze schránky', + clipboardPermissionDenied: + 'Oprávnění ke schránce odepřeno. Povolte prosím přístup do schránky ve svém prohlížeči.', + clipboardReadError: 'Nepodařilo se přečíst schránku', + dropdownEnglish: 'anglicky', + dropdownGerman: 'německy', + dropdownFrench: 'francouzsky', + dropdownRussian: 'rusky', + shortcut: { + title: 'Zkratky', + custom: 'Vlastní', + capture: 'Kliknutím sem zachytíte zástupce', + clear: 'Jasno', + save: 'Uložit', + captureTips: + 'Zachycení systémových kláves (například klávesy Windows) vyžaduje oprávnění pro celou obrazovku.', + enterFullScreen: 'Přepnout režim celé obrazovky.' + }, + leaderKey: { + title: 'Klávesa Leader', + desc: 'Obejít omezení prohlížeče a odeslat systémové zkratky přímo vzdálenému hostiteli.', + howToUse: 'Jak používat', + simultaneous: { + title: 'Simultánní režim', + desc1: 'Stiskněte a podržte klávesu Leader a poté stiskněte zkratku.', + desc2: 'Intuitivní, ale může být v rozporu se systémovými zkratkami.' + }, + sequential: { + title: 'Sekvenční režim', + desc1: + 'Stiskněte klávesu Leader → postupně stiskněte zkratku → znovu stiskněte klávesu Leader.', + desc2: 'Vyžaduje více kroků, ale zcela se vyhne systémovým konfliktům.' + }, + enable: 'Povolit klávesu Leader', + tip: 'Když je tato klávesa nastavena jako klávesa Leader, slouží pouze jako spouštěč zkratek a ztrácí své výchozí chování.', + placeholder: 'Stiskněte klávesu Leader', + shiftRight: 'Pravý Shift', + ctrlRight: 'Pravý Ctrl', + metaRight: 'Pravý Win', + submit: 'Odeslat', + recorder: { + rec: 'REC', + activate: 'Aktivovat klávesy', + input: 'Stiskněte prosím zkratku...' + } + } }, mouse: { + title: 'Myš', + cursor: 'Styl kurzoru', default: 'Výchozí kurzor', pointer: 'Ukazovací kurzor', cell: 'Kurzor buňky', @@ -84,17 +146,41 @@ const cz = { mode: 'Režim myši', absolute: 'Absolutní režim', relative: 'Relativní režim', + direction: 'Směr kolečka', + scrollUp: 'Přejděte nahoru', + scrollDown: 'Přejděte dolů', + speed: 'Rychlost kolečka', + fast: 'Rychle', + slow: 'Pomalu', requestPointer: 'Používá se relativní režim. Klikněte prosím na plochu pro získání kurzoru myši.', - resetHid: 'Resetovat HID' + resetHid: 'Resetovat HID', + hidOnly: { + title: 'Režim pouze HID', + desc: 'Pokud vaše myš a klávesnice přestanou reagovat a resetování HID nepomůže, může jít o problém s kompatibilitou mezi NanoKVM a zařízením. Zkuste povolit režim HID-Only pro lepší kompatibilitu.', + tip1: 'Povolení režimu HID-Only odpojí virtuální U-disk a virtuální síť', + tip2: 'V režimu HID-Only je připojení obrazu zakázáno', + tip3: 'NanoKVM se po přepnutí režimů automaticky restartuje', + enable: 'Povolit režim HID-Only', + disable: 'Zakázat režim HID-Only' + } }, image: { title: 'Obrázky', loading: 'Načítání...', empty: 'Nic nenalezeno', + mountMode: 'Režim připojení', mountFailed: 'Připojení se nezdařilo', mountDesc: 'V některých systémech je nutné před připojením obrazu vysunout virtuální disk na vzdáleném hostiteli.', + unmountFailed: 'Odpojení se nezdařilo', + unmountDesc: + 'Na některých systémech se musíte před odpojením obrazu ručně vysunout ze vzdáleného hostitele.', + refresh: 'Obnovte seznam obrázků', + attention: 'Pozor', + deleteConfirm: 'Opravdu chcete smazat tento obrázek?', + okBtn: 'Ano', + cancelBtn: 'Ne', tips: { title: 'Jak nahrát', usb1: 'Připojte NanoKVM k vašemu počítači přes USB.', @@ -131,6 +217,16 @@ const cz = { serialPort: 'Sériový port', serialPortPlaceholder: 'Zadejte prosím sériový port', baudrate: 'Přenosová rychlost', + parity: 'Parita', + parityNone: 'Žádné', + parityEven: 'Sudá', + parityOdd: 'Lichá', + flowControl: 'Řízení toku', + flowControlNone: 'Žádné', + flowControlSoft: 'Softwarové', + flowControlHard: 'Hardwarové', + dataBits: 'Datové bity', + stopBits: 'Stop bity', confirm: 'OK' }, wol: { @@ -140,12 +236,27 @@ const cz = { input: 'Zadejte prosím MAC adresu', ok: 'OK' }, + download: { + title: 'Stahovač obrazů', + input: 'Zadejte prosím vzdálený obrázek URL', + ok: 'OK', + disabled: 'Oddíl /data je RO, takže obrázek nelze stáhnout', + uploadbox: 'Přetáhněte soubor sem nebo kliknutím vyberte', + inputfile: 'Zadejte soubor obrázku', + NoISO: 'Žádné ISO' + }, power: { title: 'Napájení', + showConfirm: 'Potvrzení', + showConfirmTip: 'Výkonové operace vyžadují další potvrzení', reset: 'Resetovat', power: 'Napájení', powerShort: 'Napájení (krátký stisk)', - powerLong: 'Napájení (dlouhý stisk)' + powerLong: 'Napájení (dlouhý stisk)', + resetConfirm: 'Pokračovat v operaci resetování?', + powerConfirm: 'Pokračovat v napájení?', + okBtn: 'Ano', + cancelBtn: 'Ne' }, settings: { title: 'Nastavení', @@ -155,25 +266,43 @@ const cz = { ip: 'IP', mdns: 'mDNS', application: 'Verze aplikace', - applicationTip: 'NanoKVM web application version', + applicationTip: 'Verze webové aplikace NanoKVM', image: 'Verze obrazu', - imageTip: 'NanoKVM system image version', + imageTip: 'Verze systémového obrazu NanoKVM', deviceKey: 'Klíč zařízení', - community: 'Komunita' + community: 'Komunita', + hostname: 'Název hostitele', + hostnameUpdated: 'Název hostitele byl aktualizován. Pro použití restartujte.', + ipType: { + Wired: 'Kabelové', + Wireless: 'Bezdrátové', + Other: 'Jiné' + } }, appearance: { - title: 'Appearance', - display: 'Display', + title: 'Vzhled', + display: 'Zobrazení', language: 'Jazyk', - menuBar: 'Menu Bar', - menuBarDesc: 'Display icons in the menu bar' + languageDesc: 'Vyberte jazyk rozhraní', + webTitle: 'Název webu', + webTitleDesc: 'Přizpůsobte název webové stránky', + menuBar: { + title: 'Panel nabídek', + mode: 'Režim zobrazení', + modeDesc: 'Zobrazení panelu nabídek na obrazovce', + modeOff: 'Vypnuto', + modeAuto: 'Automatické skrytí', + modeAlways: 'Vždy viditelné', + icons: 'Ikony podnabídky', + iconsDesc: 'Zobrazení ikon podnabídky na liště nabídek' + } }, device: { - title: 'Device', + title: 'Zařízení', oled: { title: 'OLED', description: 'OLED screen automatically sleep', - 0: 'Never', + 0: 'Nikdy', 15: '15 sec', 30: '30 sec', 60: '1 min', @@ -181,12 +310,54 @@ const cz = { 300: '5 min', 600: '10 min', 1800: '30 min', - 3600: '1 hour' + 3600: '1 hodina' }, - disk: 'Virtual Disk', + ssh: { + description: 'Povolit vzdálený přístup SSH', + tip: 'Před povolením nastavte silné heslo (Účet – Změnit heslo)' + }, + advanced: 'Pokročilá nastavení', + swap: { + title: 'Vyměnit', + disable: 'Zakázat', + description: 'Nastavte velikost odkládacího souboru', + tip: 'Povolení této funkce může zkrátit životnost vaší SD karty!' + }, + mouseJiggler: { + title: 'Mouse Jiggler', + description: 'Zabraňte spánku vzdáleného hostitele', + disable: 'Zakázat', + absolute: 'Absolutní režim', + relative: 'Relativní režim' + }, + mdns: { + description: 'Povolit službu zjišťování mDNS', + tip: 'Vypnutí, pokud to není potřeba' + }, + hdmi: { + description: 'Povolit výstup HDMI/monitor' + }, + autostart: { + title: 'Nastavení automatického spuštění skriptů', + description: 'Správa skriptů, které se spouštějí automaticky při spuštění systému', + new: 'Nové', + deleteConfirm: 'Opravdu chcete tento soubor smazat?', + yes: 'Ano', + no: 'Ne', + scriptName: 'Název skriptu automatického spuštění', + scriptContent: 'Obsah skriptu automatického spuštění', + settings: 'Nastavení' + }, + hidOnly: 'HID-Pouze režim', + hidOnlyDesc: 'Zastavit emulaci virtuálních zařízení a zachovat pouze základní ovládání HID', + disk: 'Virtuální disk', diskDesc: 'Mount virtual U-disk on the remote host', - network: 'Virtual Network', - networkDesc: 'Mount virtual network card on the remote host' + network: 'Virtuální síť', + networkDesc: 'Připojit virtuální síťovou kartu na vzdáleném hostiteli', + reboot: 'Restartujte', + rebootDesc: 'Opravdu chcete restartovat NanoKVM?', + okBtn: 'Ano', + cancelBtn: 'Ne' }, network: { title: 'Síť', @@ -237,9 +408,12 @@ const cz = { tailscale: { title: 'Tailscale', memory: { - title: 'Memory optimization', - tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect.", - disable: 'Disable' + title: 'Optimalizace paměti', + tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect." + }, + swap: { + title: 'Vyměňte paměť', + tip: 'Pokud problémy přetrvávají i po povolení optimalizace paměti, zkuste povolit odkládací paměť. Tím se ve výchozím nastavení nastaví velikost odkládacího souboru na 256MB, kterou lze upravit v „Nastavení > Zařízení“.' }, restart: 'Are you sure to restart Tailscale?', stop: 'Are you sure to stop Tailscale?', @@ -256,6 +430,8 @@ const cz = { upTailscale: 'Nahrajte Tailscale do adresáře NanoKVM /usr/bin/', upTailscaled: 'Nahrajte Tailscaled do adresáře NanoKVM /usr/sbin/', refresh: 'Obnovit stránku', + notRunning: 'Tailscale neběží. Chcete-li pokračovat, spusťte jej.', + run: 'Spustit', notLogin: 'Zařízení nebylo dosud spárováno. Přihlaste se prosím a spárujte toto zařízení s vaším účtem.', urlPeriod: 'Tento odkaz je platný po dobu 10 minut', @@ -266,7 +442,9 @@ const cz = { deviceIP: 'IP zařízení', account: 'Účet', logout: 'Odhlásit se', - logout2: 'Opravdu se chcete odhlásit?', + logoutDesc: 'Opravdu se chcete odhlásit?', + uninstall: 'Odinstalovat Tailscale', + uninstallDesc: 'Opravdu chcete odinstalovat Tailscale?', okBtn: 'Yes', cancelBtn: 'No' }, @@ -278,15 +456,161 @@ const cz = { available: 'Je dostupná aktualizace. Opravdu chcete aktualizovat?', updating: 'Aktualizace zahájena. Prosím čekejte...', confirm: 'Potvrdit', - cancel: 'Zrušit' + cancel: 'Zrušit', + preview: 'Náhled aktualizací', + previewDesc: 'Získejte včasný přístup k novým funkcím a vylepšením', + previewTip: + 'Uvědomte si prosím, že předběžné verze mohou obsahovat chyby nebo neúplné funkce!', + offline: { + title: 'Offline aktualizace', + desc: 'Aktualizace prostřednictvím místního instalačního balíčku', + upload: 'Nahrát', + invalidName: 'Neplatný formát souboru. Stáhněte si prosím z vydání GitHubu.', + updateFailed: 'Aktualizace se nezdařila. Zkuste to prosím znovu.' + } }, account: { - title: 'Account', - webAccount: 'Web Account Name', - password: 'Password', + title: 'Účet', + webAccount: 'Název webového účtu', + password: 'Heslo', updateBtn: 'Update', - logoutBtn: 'Logout' + logoutBtn: 'Odhlásit', + logoutDesc: 'Opravdu se chcete odhlásit?', + okBtn: 'Ano', + cancelBtn: 'Ne' } + }, + picoclaw: { + title: 'PicoClaw asistent', + empty: 'Otevřete panel a spusťte úlohu.', + inputPlaceholder: 'Popište, co chcete, aby PicoClaw dělal', + newConversation: 'Nová konverzace', + processing: 'Zpracovává se...', + agent: { + defaultTitle: 'Obecný asistent', + defaultDescription: 'Obecná nápověda pro chat, vyhledávání a pracovní prostor.', + kvmTitle: 'Vzdálené ovládání', + kvmDescription: 'Ovládejte vzdáleného hostitele prostřednictvím NanoKVM.', + switched: 'Role agenta změněna', + switchFailed: 'Přepnutí role agenta se nezdařilo' + }, + send: 'Odeslat', + cancel: 'Zrušit', + status: { + connecting: 'Připojování k bráně...', + connected: 'Relace PicoClaw připojena', + disconnected: 'Relace PicoClaw uzavřena', + stopped: 'Požadavek na zastavení byl odeslán', + runtimeStarted: 'Spuštěno běhové prostředí PicoClaw', + runtimeStartFailed: 'Selhalo spuštění běhového prostředí PicoClaw', + runtimeStopped: 'Běhové prostředí PicoClaw zastaveno', + runtimeStopFailed: 'Zastavení běhového prostředí PicoClaw se nezdařilo' + }, + connection: { + runtime: { + checking: 'Kontrola', + ready: 'Běhové prostředí připraveno', + stopped: 'Běhové prostředí zastaveno', + unavailable: 'Běhové prostředí není k dispozici', + configError: 'Chyba konfigurace' + }, + transport: { + connecting: 'Připojování', + connected: 'Připojeno' + }, + run: { + idle: 'Nečinný', + busy: 'Zaneprázdněn' + } + }, + message: { + toolAction: 'Akce', + observation: 'Pozorování', + screenshot: 'Snímek obrazovky' + }, + overlay: { + locked: 'PicoClaw ovládá zařízení. Ruční zadávání je pozastaveno.' + }, + install: { + install: 'Nainstalovat PicoClaw', + installing: 'Instalace PicoClaw', + success: 'PicoClaw úspěšně nainstalováno', + failed: 'Nepodařilo se nainstalovat PicoClaw', + uninstalling: 'Odinstalování běhového prostředí...', + uninstalled: 'Běhové prostředí bylo úspěšně odinstalováno.', + uninstallFailed: 'Odinstalace se nezdařila.', + requiredTitle: 'PicoClaw není nainstalováno', + requiredDescription: 'Nainstalujte PicoClaw před spuštěním běhového prostředí PicoClaw.', + progressDescription: 'PicoClaw se stahuje a instaluje.', + stages: { + preparing: 'Příprava', + downloading: 'Stahování', + extracting: 'Extrakce', + installing: 'Instalace probíhá', + installed: 'Instalováno', + install_timeout: 'Vypršel časový limit', + install_failed: 'Selhalo' + } + }, + model: { + requiredTitle: 'Je vyžadována konfigurace modelu', + requiredDescription: 'Před použitím chatu PicoClaw nakonfigurujte model PicoClaw.', + docsTitle: 'Průvodce konfigurací', + docsDesc: 'Podporované modely a protokoly', + menuLabel: 'Konfigurace modelu', + modelIdentifier: 'Identifikátor modelu', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'Klíč API', + apiKeyPlaceholder: 'Zadejte klíč API modelu', + save: 'Uložit', + saving: 'Ukládání', + saved: 'Konfigurace modelu uložena', + saveFailed: 'Nepodařilo se uložit konfiguraci modelu', + invalid: 'Identifikátor modelu, API Base URL a klíč API jsou povinné' + }, + uninstall: { + menuLabel: 'Odinstalovat', + confirmTitle: 'Odinstalovat PicoClaw', + confirmContent: + 'Opravdu chcete odinstalovat PicoClaw? Tím smažete spustitelný soubor a všechny konfigurační soubory.', + confirmOk: 'Odinstalovat', + confirmCancel: 'Zrušit' + }, + history: { + title: 'Historie', + loading: 'Načítání relací...', + emptyTitle: 'Zatím žádná historie', + emptyDescription: 'Zde se zobrazí předchozí relace PicoClaw.', + loadFailed: 'Nepodařilo se načíst historii relace', + deleteFailed: 'Smazání relace se nezdařilo', + deleteConfirmTitle: 'Smazat relaci', + deleteConfirmContent: 'Opravdu chcete smazat "{{title}}"?', + deleteConfirmOk: 'Smazat', + deleteConfirmCancel: 'Zrušit', + messageCount_one: '{{count}} zpráva', + messageCount_other: '{{count}} zpráv' + }, + config: { + startRuntime: 'Spustit PicoClaw', + stopRuntime: 'Zastavit PicoClaw' + }, + start: { + title: 'Spustit PicoClaw', + description: 'Spusťte běhové prostředí a začněte používat asistenta PicoClaw.' + } + }, + error: { + title: 'Narazili jsme na problém', + refresh: 'Obnovit' + }, + fullscreen: { + toggle: 'Přepnout na celou obrazovku' + }, + menu: { + collapse: 'Sbalit nabídku', + expand: 'Rozbalte nabídku' } } }; diff --git a/web/src/i18n/locales/da.ts b/web/src/i18n/locales/da.ts index 1bd06be..3346b5a 100644 --- a/web/src/i18n/locales/da.ts +++ b/web/src/i18n/locales/da.ts @@ -17,6 +17,8 @@ const da = { noAccount: 'Kunne ikke hente brugeroplysninger. Prøv at opdater siden eller nulstil adgangskoden', invalidUser: 'ugyldigt brugernavn eller adgangskode', + locked: 'For mange logins, prøv venligst igen senere', + globalLocked: 'System under beskyttelse, prøv venligst igen senere', error: 'uventet fejl', changePassword: 'Skift adgangskode', changePasswordDesc: 'For sikkerheden af din enhed, bedes du ændre web-login adgangskoden.', @@ -30,25 +32,37 @@ const da = { tips: { reset1: 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', - reset2: 'For detailed steps, please consult this document:', - reset3: 'Web default account:', - reset4: 'SSH default account:', - change1: 'Please note that this action will change the following passwords:', - change2: 'Web login password', - change3: 'System root password (SSH login password)', - change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + reset2: 'Se detaljerede trin i dette dokument:', + reset3: 'Standard webkonto:', + reset4: 'Standard SSH-konto:', + change1: 'Bemærk, at denne handling ændrer følgende adgangskoder:', + change2: 'Adgangskode til weblogin', + change3: 'Systemets root-adgangskode (SSH-loginadgangskode)', + change4: 'For at nulstille adgangskoderne skal du holde BOOT-knappen på NanoKVM nede.' } }, wifi: { title: 'Wi-Fi', - description: 'Configure Wi-Fi for NanoKVM', + description: 'Konfigurer Wi-Fi for NanoKVM', success: 'Please check the network status of NanoKVM and visit the new IP address.', - failed: 'Operation failed, please try again.', + failed: 'Handlingen mislykkedes, prøv igen.', + invalidMode: + 'Den aktuelle tilstand understøtter ikke netværksopsætning. Gå til din enhed og aktiver Wi-Fi konfigurationstilstand.', confirmBtn: 'Ok', - finishBtn: 'Finished' + finishBtn: 'Færdig', + ap: { + authTitle: 'Godkendelse påkrævet', + authDescription: 'Indtast venligst AP adgangskoden for at fortsætte', + authFailed: 'Ugyldig AP adgangskode', + passPlaceholder: 'AP adgangskode', + verifyBtn: 'Bekræft' + } }, screen: { + scale: 'Skala', + title: 'Skærm', video: 'Videotilstand', + videoDirectTips: 'Aktiver HTTPS i "Indstillinger > Enhed" for at bruge denne tilstand', resolution: 'Opløsning', auto: 'Automatisk', autoTips: @@ -63,17 +77,65 @@ const da = { frameDetect: 'Beregn frames', frameDetectTip: 'Beregner forskellen mellem hver frame. Stopper med at sende et video stream hvis der ikke registreres ændringer på fjerncomputerens skærm.', - resetHdmi: 'Reset HDMI' + resetHdmi: 'Nulstil HDMI' }, keyboard: { + title: 'Tastatur', paste: 'Indsæt', tips: 'Kun standard bogstaver og symboler er understøttet', placeholder: 'Indtast tekst', submit: 'Send', virtual: 'Tastatur', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Læs fra udklipsholder', + clipboardPermissionDenied: + 'Udklipsholdertilladelse nægtet. Tillad venligst udklipsholderadgang i din browser.', + clipboardReadError: 'Kunne ikke læse udklipsholderen', + dropdownEnglish: 'Engelsk', + dropdownGerman: 'tysk', + dropdownFrench: 'Fransk', + dropdownRussian: 'russisk', + shortcut: { + title: 'Genveje', + custom: 'Brugerdefineret', + capture: 'Klik her for at fange genvej', + clear: 'Ryd', + save: 'Gem', + captureTips: + 'Optagelse af systemtaster (såsom Windows-tasten) kræver fuldskærmstilladelse.', + enterFullScreen: 'Skift fuldskærmstilstand.' + }, + leaderKey: { + title: 'Leader-tast', + desc: 'Omgå browserbegrænsninger og send systemgenveje direkte til fjernværten.', + howToUse: 'Sådan bruges', + simultaneous: { + title: 'Samtidig tilstand', + desc1: 'Hold Leader-tasten nede, og tryk derefter på genvejen.', + desc2: 'Intuitivt, men kan være i konflikt med systemgenveje.' + }, + sequential: { + title: 'Sekventiel tilstand', + desc1: + 'Tryk på Leader-tasten → tryk på genvejen i rækkefølge → tryk på Leader-tasten igen.', + desc2: 'Kræver flere trin, men undgår fuldstændig systemkonflikter.' + }, + enable: 'Aktiver Leader-tast', + tip: 'Når denne tast tildeles som Leader-tast, fungerer den kun som genvejsudløser og mister sin standardfunktion.', + placeholder: 'Tryk på Leader-tasten', + shiftRight: 'Højre Shift', + ctrlRight: 'Højre Ctrl', + metaRight: 'Højre Win', + submit: 'Send', + recorder: { + rec: 'REC', + activate: 'Aktiver taster', + input: 'Tryk på genvejen...' + } + } }, mouse: { + title: 'Mus', + cursor: 'Markørstil', default: 'Standard-markør', pointer: 'Peger-markør', cell: 'Celle-markør', @@ -83,16 +145,40 @@ const da = { mode: 'Tilstand for mus', absolute: 'Absolut tilstand', relative: 'Relativ tilstand', + direction: 'Rullehjulsretning', + scrollUp: 'Rul op', + scrollDown: 'Rul ned', + speed: 'Rullehjulshastighed', + fast: 'Hurtigt', + slow: 'Langsomt', requestPointer: 'Bruger relativ-tilstand. Klik på skrivebordet for at få musemarkør.', - resetHid: 'Nulstil HID' + resetHid: 'Nulstil HID', + hidOnly: { + title: 'Kun HID-tilstand', + desc: 'Hvis din mus og tastatur holder op med at reagere, og nulstilling af HID ikke hjælper, kan det være et kompatibilitetsproblem mellem NanoKVM og enheden. Prøv at aktivere HID-Only-tilstand for bedre kompatibilitet.', + tip1: 'Aktivering af HID-Only-tilstand vil afmontere den virtuelle U-disk og det virtuelle netværk', + tip2: 'I HID-Only-tilstand er billedmontering deaktiveret', + tip3: 'NanoKVM genstarter automatisk efter at have skiftet tilstand', + enable: 'Aktiver HID-kun tilstand', + disable: 'Deaktiver HID-kun tilstand' + } }, image: { title: 'Diskbilleder', loading: 'Kontrollerer...', empty: 'Ingen fundet', + mountMode: 'Monteringstilstand', mountFailed: 'Montering af diskbillede mislykkedes', mountDesc: 'På nogle systemer kan det være nødvendigt at skubbe den virtuelle disk ud på fjerncomputeren før du kan montere diskbilledet.', + unmountFailed: 'Afmontering mislykkedes', + unmountDesc: + 'På nogle systemer skal du manuelt skubbe ud fra fjernværten, før du afmonterer billedet.', + refresh: 'Opdater billedlisten', + attention: 'Opmærksomhed påkrævet', + deleteConfirm: 'Er du sikker på, at du vil slette dette billede?', + okBtn: 'Ja', + cancelBtn: 'Annuller', tips: { title: 'Sådan uploader du', usb1: 'Forbind din NanoKVM til din computer via USB.', @@ -129,6 +215,16 @@ const da = { serialPort: 'Serial port', serialPortPlaceholder: 'Angiv seriel port', baudrate: 'Baud-hastighed', + parity: 'Paritet', + parityNone: 'Ingen', + parityEven: 'Lige', + parityOdd: 'Ulige', + flowControl: 'Flowkontrol', + flowControlNone: 'Ingen', + flowControlSoft: 'Software', + flowControlHard: 'Hardware', + dataBits: 'Databits', + stopBits: 'Stopbit', confirm: 'OK' }, wol: { @@ -138,53 +234,129 @@ const da = { input: 'Angiv MAC-adresse', ok: 'OK' }, + download: { + title: 'Billedhenter', + input: 'Indtast venligst et fjernbillede URL', + ok: 'OK', + disabled: '/data partitionen er RO, så vi kan ikke downloade billedet', + uploadbox: 'Slip filen her, eller klik for at vælge', + inputfile: 'Indtast venligst billedfilen', + NoISO: 'Ingen ISO' + }, power: { title: 'Tænd/sluk-knap', + showConfirm: 'Bekræftelse', + showConfirmTip: 'Strømdrift kræver en ekstra bekræftelse', reset: 'Nulstillingsknap', power: 'Tænd/sluk-knap', powerShort: 'Tænd/sluk-knap (kort tryk)', - powerLong: 'Tænd/sluk-knap (langt tryk)' + powerLong: 'Tænd/sluk-knap (langt tryk)', + resetConfirm: 'Fortsæt med nulstilling?', + powerConfirm: 'Fortsæt strømdrift?', + okBtn: 'Ja', + cancelBtn: 'Annuller' }, settings: { - title: 'Settings', + title: 'Indstillinger', about: { title: 'Om NanoKVM', information: 'Information', ip: 'IP', mdns: 'mDNS', application: 'Program version', - applicationTip: 'NanoKVM web application version', + applicationTip: 'Version af NanoKVM-webapplikationen', image: 'Firmware version', - imageTip: 'NanoKVM system image version', + imageTip: 'Version af NanoKVM-systemimaget', deviceKey: 'Enhedsnøgle', - community: 'Fællesskab' + community: 'Fællesskab', + hostname: 'Værtsnavn', + hostnameUpdated: 'Værtsnavn opdateret. Genstart for at anvende.', + ipType: { + Wired: 'Kablet', + Wireless: 'Trådløs', + Other: 'Andet' + } }, appearance: { - title: 'Appearance', - display: 'Display', - language: 'Language', - menuBar: 'Menu Bar', - menuBarDesc: 'Display icons in the menu bar' + title: 'Udseende', + display: 'Visning', + language: 'Sprog', + languageDesc: 'Vælg sproget til grænsefladen', + webTitle: 'Webtitel', + webTitleDesc: 'Tilpas websidens titel', + menuBar: { + title: 'Menulinje', + mode: 'Visningstilstand', + modeDesc: 'Vis menulinje på skærmen', + modeOff: 'Fra', + modeAuto: 'Skjul automatisk', + modeAlways: 'Altid synlig', + icons: 'Undermenuikoner', + iconsDesc: 'Vis undermenuikoner i menulinjen' + } }, device: { - title: 'Device', + title: 'Enhed', oled: { title: 'OLED', description: 'OLED screen automatically sleep', - 0: 'Never', - 15: '15 sec', - 30: '30 sec', + 0: 'Aldrig', + 15: '15 sek.', + 30: '30 sek.', 60: '1 min', 180: '3 min', 300: '5 min', 600: '10 min', 1800: '30 min', - 3600: '1 hour' + 3600: '1 time' }, - disk: 'Virtual Disk', + ssh: { + description: 'Aktiver SSH fjernadgang', + tip: 'Indstil en stærk adgangskode før aktivering (Konto - Skift adgangskode)' + }, + advanced: 'Avancerede indstillinger', + swap: { + title: 'Byt', + disable: 'Deaktiver', + description: 'Indstil swap-filstørrelsen', + tip: 'Aktivering af denne funktion kan forkorte dit SD-korts brugbare levetid!' + }, + mouseJiggler: { + title: 'Mus Jiggler', + description: 'Forhindrer fjernværten i at sove', + disable: 'Deaktiver', + absolute: 'Absolut tilstand', + relative: 'Relativ tilstand' + }, + mdns: { + description: 'Aktiver mDNS opdagelsestjeneste', + tip: 'Slukker den, hvis den ikke er nødvendig' + }, + hdmi: { + description: 'Aktiver HDMI/monitor output' + }, + autostart: { + title: 'Indstillinger for autostart scripts', + description: 'Administrer scripts, der kører automatisk ved systemstart', + new: 'Ny', + deleteConfirm: 'Er du sikker på at du vil slette denne fil?', + yes: 'Ja', + no: 'Annuller', + scriptName: 'Autostart scriptnavn', + scriptContent: 'Autostart scriptindhold', + settings: 'Indstillinger' + }, + hidOnly: 'HID-Kun tilstand', + hidOnlyDesc: + 'Stop med at emulere virtuelle enheder, og behold kun grundlæggende HID kontrol', + disk: 'Virtuel disk', diskDesc: 'Mount virtual U-disk on the remote host', - network: 'Virtual Network', - networkDesc: 'Mount virtual network card on the remote host' + network: 'Virtuelt netværk', + networkDesc: 'Monter det virtuelle netværkskort på den eksterne vært', + reboot: 'Genstart', + rebootDesc: 'Er du sikker på, at du vil genstarte NanoKVM?', + okBtn: 'Ja', + cancelBtn: 'Annuller' }, network: { title: 'Netværk', @@ -235,9 +407,12 @@ const da = { tailscale: { title: 'Tailscale', memory: { - title: 'Memory optimization', - tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect.", - disable: 'Disable' + title: 'Hukommelsesoptimering', + tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect." + }, + swap: { + title: 'Skift hukommelse', + tip: 'Hvis problemerne fortsætter efter aktivering af hukommelsesoptimering, prøv at aktivere swap-hukommelse. Dette indstiller swap-filstørrelsen til 256MB som standard, som kan justeres i "Indstillinger > Enhed".' }, restart: 'Are you sure to restart Tailscale?', stop: 'Are you sure to stop Tailscale?', @@ -251,9 +426,11 @@ const da = { download: 'Download', package: 'installationspakken', unzip: 'og udpak den', - upTailscale: 'Upload tailscale til følgende mappe på enheden: /usr/bin/', - upTailscaled: 'Upload tailscaled til følgende mappe på enheden: /usr/sbin/', + upTailscale: 'Upload tailscale til NanoKVM-mappen /usr/bin/', + upTailscaled: 'Upload tailscaled til NanoKVM-mappen /usr/sbin/', refresh: 'Opdater sides', + notRunning: 'Tailscale kører ikke. Start det for at fortsætte.', + run: 'Start', notLogin: 'Enheden er ikke tilknyttet en Tailscale-konto endnu. Log ind for at fuldføre tilknytningen til din konto.', urlPeriod: 'Denne URL er gyldig i 10 minutter', @@ -264,7 +441,9 @@ const da = { deviceIP: 'Enhedens IP', account: 'Konto', logout: 'Log ud', - logout2: 'Er du sikker på at du vil logge ud?', + logoutDesc: 'Er du sikker på, at du vil logge ud?', + uninstall: 'Afinstaller Tailscale', + uninstallDesc: 'Er du sikker på, at du vil afinstallere Tailscale?', okBtn: 'Yes', cancelBtn: 'No' }, @@ -276,15 +455,161 @@ const da = { available: 'En opdatering er tilgængelig. Vil du installere den?', updating: 'Opdatering i gang. Vent venligst...', confirm: 'Bekræft', - cancel: 'Annuller' + cancel: 'Annuller', + preview: 'Forhåndsvisning af opdateringer', + previewDesc: 'Få tidlig adgang til nye funktioner og forbedringer', + previewTip: + 'Vær opmærksom på, at forhåndsvisningsudgivelser kan indeholde fejl eller ufuldstændig funktionalitet!', + offline: { + title: 'Offline opdateringer', + desc: 'Opdatering via lokal installationspakke', + upload: 'Upload', + invalidName: 'Ugyldigt filnavnsformat. Download venligst fra GitHub-udgivelser.', + updateFailed: 'Opdatering fejlede. Prøv igen.' + } }, account: { - title: 'Account', - webAccount: 'Web Account Name', - password: 'Password', + title: 'Konto', + webAccount: 'Navn på webkonto', + password: 'Adgangskode', updateBtn: 'Update', - logoutBtn: 'Logout' + logoutBtn: 'Log ud', + logoutDesc: 'Er du sikker på, at du vil logge ud?', + okBtn: 'Ja', + cancelBtn: 'Annuller' } + }, + picoclaw: { + title: 'PicoClaw Assistent', + empty: 'Åbn panelet og start en opgave for at begynde.', + inputPlaceholder: 'Beskriv, hvad du vil have PicoClaw til at gøre', + newConversation: 'Ny samtale', + processing: 'Behandler...', + agent: { + defaultTitle: 'Generel assistent', + defaultDescription: 'Generel hjælp til chat, søgning og arbejdsområde.', + kvmTitle: 'Fjernstyring', + kvmDescription: 'Betjen fjernværten gennem NanoKVM.', + switched: 'Agentrolle skiftet', + switchFailed: 'Kunne ikke skifte agentrolle' + }, + send: 'Send', + cancel: 'Annuller', + status: { + connecting: 'Opretter forbindelse til gateway...', + connected: 'PicoClaw-session tilsluttet', + disconnected: 'PicoClaw-session lukket', + stopped: 'Stopanmodning sendt', + runtimeStarted: 'PicoClaw runtime startet', + runtimeStartFailed: 'Kunne ikke starte PicoClaw runtime', + runtimeStopped: 'PicoClaw runtime stoppet', + runtimeStopFailed: 'Kunne ikke stoppe PicoClaw runtime' + }, + connection: { + runtime: { + checking: 'Kontrol', + ready: 'Runtime klar', + stopped: 'Runtime stoppet', + unavailable: 'Runtime utilgængelig', + configError: 'Konfigurationsfejl' + }, + transport: { + connecting: 'Tilslutning', + connected: 'Tilsluttet' + }, + run: { + idle: 'Tomgang', + busy: 'Optaget' + } + }, + message: { + toolAction: 'Handling', + observation: 'Observation', + screenshot: 'Skærmbillede' + }, + overlay: { + locked: 'PicoClaw styrer enheden. Manuel indtastning er sat på pause.' + }, + install: { + install: 'Installer PicoClaw', + installing: 'Installation af PicoClaw', + success: 'PicoClaw installeret korrekt', + failed: 'Kunne ikke installere PicoClaw', + uninstalling: 'Afinstallerer runtime...', + uninstalled: 'Runtime blev afinstalleret.', + uninstallFailed: 'Afinstallation mislykkedes.', + requiredTitle: 'PicoClaw er ikke installeret', + requiredDescription: 'Installer PicoClaw før start af PicoClaw runtime.', + progressDescription: 'PicoClaw bliver downloadet og installeret.', + stages: { + preparing: 'Forberedelse', + downloading: 'Downloader', + extracting: 'Udpakning', + installing: 'Installerer', + installed: 'Installeret', + install_timeout: 'Timeout', + install_failed: 'Mislykkedes' + } + }, + model: { + requiredTitle: 'Modelkonfiguration er påkrævet', + requiredDescription: 'Konfigurer PicoClaw-modellen, før du bruger PicoClaw chat.', + docsTitle: 'Konfigurationsvejledning', + docsDesc: 'Understøttede modeller og protokoller', + menuLabel: 'Konfigurer model', + modelIdentifier: 'Modelidentifikator', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API-nøgle', + apiKeyPlaceholder: 'Indtast modellens API-nøgle', + save: 'Gem', + saving: 'Gemmer', + saved: 'Modelkonfiguration gemt', + saveFailed: 'Kunne ikke gemme modelkonfigurationen', + invalid: 'Model-id, API Base URL og API-nøgle er påkrævet' + }, + uninstall: { + menuLabel: 'Afinstaller', + confirmTitle: 'Afinstaller PicoClaw', + confirmContent: + 'Er du sikker på, at du vil afinstallere PicoClaw? Dette vil slette den eksekverbare fil og alle konfigurationsfiler.', + confirmOk: 'Afinstaller', + confirmCancel: 'Annuller' + }, + history: { + title: 'Historik', + loading: 'Indlæser sessioner...', + emptyTitle: 'Ingen historik endnu', + emptyDescription: 'Tidligere PicoClaw sessioner vil blive vist her.', + loadFailed: 'Kunne ikke indlæse sessionshistorikken', + deleteFailed: 'Kunne ikke slette session', + deleteConfirmTitle: 'Slet session', + deleteConfirmContent: 'Er du sikker på, at du vil slette "{{title}}"?', + deleteConfirmOk: 'Slet', + deleteConfirmCancel: 'Annuller', + messageCount_one: '{{count}} besked', + messageCount_other: '{{count}} beskeder' + }, + config: { + startRuntime: 'Start PicoClaw', + stopRuntime: 'Stop PicoClaw' + }, + start: { + title: 'Start PicoClaw', + description: 'Start runtime for at begynde at bruge PicoClaw-assistenten.' + } + }, + error: { + title: 'Vi er stødt på et problem', + refresh: 'Opdater' + }, + fullscreen: { + toggle: 'Skift fuldskærm' + }, + menu: { + collapse: 'Skjul menu', + expand: 'Udvid menu' } } }; diff --git a/web/src/i18n/locales/de.ts b/web/src/i18n/locales/de.ts index 6f42f7e..d7770a9 100644 --- a/web/src/i18n/locales/de.ts +++ b/web/src/i18n/locales/de.ts @@ -17,6 +17,8 @@ const de = { noAccount: 'Abfragen der Benutzerdaten fehlgeschlagen, bitte die Seite neu laden oder Passwort zurücksetzen', invalidUser: 'Falscher Benutzername oder falsches Passwort', + locked: 'Zu viele Anmeldungen, bitte versuchen Sie es später noch einmal', + globalLocked: 'System wird geschützt, bitte versuchen Sie es später erneut', error: 'Unerwarteter Fehler', changePassword: 'Passwort ändern', changePasswordDesc: 'Für die Sicherheit Ihres Geräts ändern Sie bitte das Passwort!', @@ -46,12 +48,24 @@ const de = { success: 'Bitte überprüfen Sie den Netzwerk-Status des NanoKVM und greifen Sie über die neue IP Adresse darauf zu.', failed: 'Aktion fehlgeschlagen, bitte erneut versuchen.', + invalidMode: + 'Der aktuelle Modus unterstützt keine Netzwerkeinrichtung. Bitte gehen Sie zu Ihrem Gerät und aktivieren Sie den Wi-Fi-Konfigurationsmodus.', confirmBtn: 'Ok', - finishBtn: 'Fertig' + finishBtn: 'Fertig', + ap: { + authTitle: 'Authentifizierung erforderlich', + authDescription: 'Bitte geben Sie das Passwort AP ein, um fortzufahren', + authFailed: 'Ungültiges AP Passwort', + passPlaceholder: 'AP Passwort', + verifyBtn: 'Überprüfen' + } }, screen: { + scale: 'Skala', title: 'Bildschirm', video: 'Video Modus', + videoDirectTips: + 'Aktivieren Sie HTTPS unter „Einstellungen > Gerät“, um diesen Modus zu verwenden', resolution: 'Auflösung', auto: 'Automatisch', autoTips: @@ -75,11 +89,52 @@ const de = { placeholder: 'Bitte eingeben', submit: 'Senden', virtual: 'Tastatur', - ctrlaltdel: 'Ctrl+Alt+Del', + readClipboard: 'Aus der Zwischenablage lesen', + clipboardPermissionDenied: + 'Berechtigung für die Zwischenablage verweigert. Bitte erlauben Sie den Zugriff auf die Zwischenablage in Ihrem Browser.', + clipboardReadError: 'Zwischenablage konnte nicht gelesen werden', dropdownEnglish: 'Englisch', dropdownGerman: 'Deutsch', dropdownFrench: 'Französisch', - dropdownRussian: 'Russisch' + dropdownRussian: 'Russisch', + shortcut: { + title: 'Verknüpfungen', + custom: 'Benutzerdefiniert', + capture: 'Klicken Sie hier, um die Verknüpfung zu erfassen', + clear: 'Klar', + save: 'Speichern', + captureTips: + 'Das Erfassen systemweiter Tasten (z. B. der Windows-Taste) erfordert die Vollbildberechtigung.', + enterFullScreen: 'Vollbildmodus umschalten.' + }, + leaderKey: { + title: 'Leader-Taste', + desc: 'Browserbeschränkungen umgehen und Systemverknüpfungen direkt an den Remote-Host senden.', + howToUse: 'Verwendung', + simultaneous: { + title: 'Simultanmodus', + desc1: 'Halten Sie die Leader-Taste gedrückt und drücken Sie dann die Tastenkombination.', + desc2: 'Intuitiv, kann jedoch zu Konflikten mit Systemverknüpfungen führen.' + }, + sequential: { + title: 'Sequenzieller Modus', + desc1: + 'Drücken Sie die Leader-Taste → drücken Sie die Tastenkombination nacheinander → drücken Sie erneut die Leader-Taste.', + desc2: 'Erfordert mehr Schritte, vermeidet jedoch vollständig Systemkonflikte.' + }, + enable: 'Leader-Taste aktivieren', + tip: 'Wenn diese Taste als Leader-Taste zugewiesen wird, dient sie ausschließlich als Auslöser für Tastenkombinationen und verliert ihr Standardverhalten.', + placeholder: 'Bitte drücken Sie die Leader-Taste', + shiftRight: 'Rechts Shift', + ctrlRight: 'Rechts Ctrl', + metaRight: 'Rechts Win', + submit: 'Senden', + recorder: { + rec: 'REC', + activate: 'Tasten aktivieren', + input: 'Bitte drücken Sie die Tastenkombination...' + } + } }, mouse: { title: 'Maus', @@ -93,11 +148,17 @@ const de = { mode: 'Maus Modus', absolute: 'Absoluter Modus', relative: 'Relativer Modus', + direction: 'Scrollrichtung', + scrollUp: 'Nach oben scrollen', + scrollDown: 'Scrollen Sie nach unten', + speed: 'Scrollgeschwindigkeit', + fast: 'Schnell', + slow: 'Langsam', requestPointer: 'Relativer Modus aktiv. Klicken Sie auf den Desktop um den Mauszeiger zu sehen.', resetHid: 'HID zurücksetzen', hidOnly: { - title: 'HID-Only Modus', + title: 'HID-Only-Modus', desc: 'Wenn Ihre Maus und Tastatur nicht mehr reagieren und das Zurücksetzen der HID-Verbindung nicht hilft, könnte es sich um ein Kompatibilitätsproblem zwischen dem NanoKVM und dem Gerät handeln. Versuchen Sie, den HID-Only Modus zu aktivieren, um die Kompatibilität zu verbessern.', tip1: 'Die Aktivierung des HID-Only Modus entfernt das virtuelle U-Laufwerk und das virtuelle Netzwerk.', tip2: 'Im HID-Only Modus ist das Einbinden von Systemabbilder deaktiviert.', @@ -110,11 +171,18 @@ const de = { title: 'Bilder', loading: 'Lädt...', empty: 'Nichts gefunden', - cdrom: 'Binden Sie das Abbild im CD-ROM Modus ein', + mountMode: 'Mount-Modus', mountFailed: 'Einbinden fehlgeschlagen', mountDesc: 'In einigen Systemen ist es notwendig, die virtuelle Festplatte auf dem entfernten Host auszuwerfen, bevor das Image eingebunden werden kann.', + unmountFailed: 'Das Aufheben der Bereitstellung ist fehlgeschlagen', + unmountDesc: + 'Auf einigen Systemen müssen Sie das Image manuell vom Remote-Host auswerfen, bevor Sie die Bereitstellung aufheben.', refresh: 'Bilder aktualisieren', + attention: 'Achtung', + deleteConfirm: 'Sind Sie sicher, dass Sie dieses Bild löschen möchten?', + okBtn: 'Ja', + cancelBtn: 'Nein', tips: { title: 'So laden Sie Dateien hoch', usb1: 'Verbinden Sie den NanoKVM über USB mit Ihrem Computer.', @@ -157,8 +225,8 @@ const de = { parityOdd: 'Ungerade', flowControl: 'Fluss-Kontrolle', flowControlNone: 'Keine', - flowControlSoft: 'Wenig', - flowControlHard: 'Viel', + flowControlSoft: 'Software', + flowControlHard: 'Hardware', dataBits: 'Daten bits', stopBits: 'Stopp bits', confirm: 'Ok' @@ -204,7 +272,7 @@ const de = { applicationTip: 'NanoKVM Web Applikations-Version', image: 'Systemabbild-Version', imageTip: 'NanoKVM Systemabbild-Version', - deviceKey: 'Geräte Schlüssel', + deviceKey: 'Geräteschlüssel', community: 'Community', hostname: 'Hostname', hostnameUpdated: 'Hostname aktualisiert. Neustarten um zu übernehmen.', @@ -218,10 +286,19 @@ const de = { title: 'Erscheinungsbild', display: 'Bildschirm', language: 'Sprache', - menuBar: 'Menu-Leiste', - menuBarDesc: 'Symbole in der Menu-Leiste anzeigen', + languageDesc: 'Wählen Sie die Sprache für die Benutzeroberfläche aus', webTitle: 'Web Titel', - webTitleDesc: 'Passen Sie den Web-Seite Titel an' + webTitleDesc: 'Passen Sie den Web-Seite Titel an', + menuBar: { + title: 'Menüleiste', + mode: 'Anzeigemodus', + modeDesc: 'Menüleiste auf dem Bildschirm anzeigen', + modeOff: 'Aus', + modeAuto: 'Automatisch ausblenden', + modeAlways: 'Immer sichtbar', + icons: 'Untermenüsymbole', + iconsDesc: 'Untermenüsymbole in der Menüleiste anzeigen' + } }, device: { title: 'Gerät', @@ -260,7 +337,23 @@ const de = { description: 'mDNS-Erkennungsdienst aktivieren', tip: 'Deaktivieren Sie den Dienst, wenn Sie ihn nicht benötigen' }, + hdmi: { + description: 'HDMI/Monitor-Ausgabe aktivieren' + }, + autostart: { + title: 'Autostart-Skripteinstellungen', + description: 'Skripte verwalten, die beim Systemstart automatisch ausgeführt werden', + new: 'Neu', + deleteConfirm: 'Möchten Sie diese Datei wirklich löschen?', + yes: 'Ja', + no: 'Nein', + scriptName: 'Name des Autostart-Skripts', + scriptContent: 'Inhalt des Autostart-Skripts', + settings: 'Einstellungen' + }, hidOnly: 'HID-Only Mode', + hidOnlyDesc: + 'Hören Sie auf, virtuelle Geräte zu emulieren, und behalten Sie nur die grundlegende HID-Steuerung bei', disk: 'Virtuelle Festplatte', diskDesc: 'Binde das virtuelle U-Laufwerk an den entfernten Host', network: 'Virtuelles Netzwerk', @@ -320,8 +413,11 @@ const de = { title: 'Tailscale', memory: { title: 'Speicher Optimierung', - tip: 'Wenn die Speichernutzung das Limit überschreitet, wird die Speicherbereinigung aggressiver durchgeführt, um Speicher freizugeben. Es wird empfohlen, den Wert auf 75 MB zu setzen, wenn Tailscale verwendet wird. Ein Neustart von Tailscale ist erforderlich, damit die Änderung wirksam wird.', - disable: 'Deaktivieren' + tip: 'Wenn die Speichernutzung das Limit überschreitet, wird die Speicherbereinigung aggressiver durchgeführt, um Speicher freizugeben. Es wird empfohlen, den Wert auf 75 MB zu setzen, wenn Tailscale verwendet wird. Ein Neustart von Tailscale ist erforderlich, damit die Änderung wirksam wird.' + }, + swap: { + title: 'Speicher austauschen', + tip: 'Wenn die Probleme nach der Aktivierung der Speicheroptimierung weiterhin bestehen, versuchen Sie, den Swap-Speicher zu aktivieren. Dadurch wird die Größe der Auslagerungsdatei standardmäßig auf 256MB festgelegt, was unter „Einstellungen > Gerät“ angepasst werden kann.' }, restart: 'Tailscale neu starten?', stop: 'Tailscale stoppen?', @@ -338,6 +434,8 @@ const de = { upTailscale: 'Tailscale nach /usr/bin/ auf NanoKVM hochladen', upTailscaled: 'Tailscaled nach /usr/bin/ auf NanoKVM hochladen', refresh: 'Aktuelle Seite neu laden', + notRunning: 'Tailscale läuft nicht. Bitte starten Sie es, um fortzufahren.', + run: 'Start', notLogin: 'Das Gerät konnte noch nicht gefunden werden. Bitte melden Sie sich an und verknüpfen Sie dieses Gerät mit Ihrem Konto.', urlPeriod: 'Diese URL ist für 10 Minuten gültig', @@ -350,6 +448,7 @@ const de = { logout: 'Abmelden', logoutDesc: 'Möchten Sie sich wirklich abmelden?', uninstall: 'Tailscale deinstallieren', + uninstallDesc: 'Sind Sie sicher, dass Sie Tailscale deinstallieren möchten?', okBtn: 'Ja', cancelBtn: 'Nein' }, @@ -386,6 +485,129 @@ const de = { cancelBtn: 'Nein' } }, + picoclaw: { + title: 'PicoClaw Assistent', + empty: 'Öffnen Sie das Bedienfeld und starten Sie eine Aufgabe.', + inputPlaceholder: 'Beschreiben Sie, was der PicoClaw tun soll', + newConversation: 'Neues Gespräch', + processing: 'Wird verarbeitet...', + agent: { + defaultTitle: 'Allgemeiner Assistent', + defaultDescription: 'Allgemeine Chat-, Such- und Arbeitsbereichshilfe.', + kvmTitle: 'Fernsteuerung', + kvmDescription: 'Betreiben Sie den Remote-Host über NanoKVM.', + switched: 'Agentenrolle gewechselt', + switchFailed: 'Agentenrolle konnte nicht gewechselt werden' + }, + send: 'Senden', + cancel: 'Abbrechen', + status: { + connecting: 'Verbindung zum Gateway wird hergestellt...', + connected: 'PicoClaw Sitzung verbunden', + disconnected: 'PicoClaw Sitzung geschlossen', + stopped: 'Stoppanforderung gesendet', + runtimeStarted: 'PicoClaw Runtime gestartet', + runtimeStartFailed: 'PicoClaw Runtime konnte nicht gestartet werden', + runtimeStopped: 'PicoClaw Runtime gestoppt', + runtimeStopFailed: 'PicoClaw Runtime konnte nicht gestoppt werden' + }, + connection: { + runtime: { + checking: 'Überprüfung', + ready: 'Runtime bereit', + stopped: 'Runtime gestoppt', + unavailable: 'Runtime nicht verfügbar', + configError: 'Konfigurationsfehler' + }, + transport: { + connecting: 'Verbinden', + connected: 'Verbunden' + }, + run: { + idle: 'Leerlauf', + busy: 'Beschäftigt' + } + }, + message: { + toolAction: 'Aktion', + observation: 'Beobachtung', + screenshot: 'Screenshot' + }, + overlay: { + locked: 'PicoClaw steuert das Gerät. Die manuelle Eingabe wird angehalten.' + }, + install: { + install: 'Installieren Sie PicoClaw', + installing: 'Installation von PicoClaw', + success: 'PicoClaw erfolgreich installiert', + failed: 'Installation von PicoClaw fehlgeschlagen', + uninstalling: 'Runtime wird deinstalliert...', + uninstalled: 'Runtime erfolgreich deinstalliert.', + uninstallFailed: 'Deinstallation fehlgeschlagen.', + requiredTitle: 'PicoClaw ist nicht installiert', + requiredDescription: 'Installieren Sie PicoClaw, bevor Sie die PicoClaw Runtime starten.', + progressDescription: 'PicoClaw wird heruntergeladen und installiert.', + stages: { + preparing: 'Vorbereiten', + downloading: 'Wird heruntergeladen', + extracting: 'Extrahieren', + installing: 'Installiere', + installed: 'Installiert', + install_timeout: 'Zeitüberschreitung', + install_failed: 'Fehlgeschlagen' + } + }, + model: { + requiredTitle: 'Modellkonfiguration ist erforderlich', + requiredDescription: + 'Konfigurieren Sie das PicoClaw-Modell, bevor Sie den PicoClaw-Chat verwenden.', + docsTitle: 'Konfigurationshandbuch', + docsDesc: 'Unterstützte Modelle und Protokolle', + menuLabel: 'Modell konfigurieren', + modelIdentifier: 'Modell-ID', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API-Schlüssel', + apiKeyPlaceholder: 'API-Schlüssel des Modells eingeben', + save: 'Speichern', + saving: 'Speichern', + saved: 'Modellkonfiguration gespeichert', + saveFailed: 'Modellkonfiguration konnte nicht gespeichert werden', + invalid: 'Modellkennung, API Base URL und API-Schlüssel sind erforderlich' + }, + uninstall: { + menuLabel: 'Deinstallieren', + confirmTitle: 'Deinstallieren PicoClaw', + confirmContent: + 'Sind Sie sicher, dass Sie PicoClaw deinstallieren möchten? Dadurch werden die ausführbare Datei und alle Konfigurationsdateien gelöscht.', + confirmOk: 'Deinstallieren', + confirmCancel: 'Abbrechen' + }, + history: { + title: 'Verlauf', + loading: 'Sitzungen werden geladen...', + emptyTitle: 'Noch keine Historie', + emptyDescription: 'Frühere PicoClaw-Sitzungen werden hier angezeigt.', + loadFailed: 'Der Sitzungsverlauf konnte nicht geladen werden', + deleteFailed: 'Sitzung konnte nicht gelöscht werden', + deleteConfirmTitle: 'Sitzung löschen', + deleteConfirmContent: 'Sind Sie sicher, dass Sie „{{title}}“ löschen möchten?', + deleteConfirmOk: 'Löschen', + deleteConfirmCancel: 'Abbrechen', + messageCount_one: '{{count}} Nachricht', + messageCount_other: '{{count}} Nachrichten' + }, + config: { + startRuntime: 'PicoClaw starten', + stopRuntime: 'PicoClaw stoppen' + }, + start: { + title: 'PicoClaw starten', + description: + 'Starten Sie die Runtime, um mit der Verwendung des PicoClaw-Assistenten zu beginnen.' + } + }, error: { title: 'Wir sind auf ein Problem gestossen', refresh: 'Neuladen' diff --git a/web/src/i18n/locales/es.ts b/web/src/i18n/locales/es.ts index f281243..4e8a037 100644 --- a/web/src/i18n/locales/es.ts +++ b/web/src/i18n/locales/es.ts @@ -14,11 +14,15 @@ const es = { placeholderPassword2: 'Introduce tu contraseña de nuevo', noEmptyUsername: 'El nombre de usuario no puede estar vacío', noEmptyPassword: 'La contraseña no puede estar vacía', - noAccount: 'No se ha encontrado la cuenta. Por favor, recarga la página o recupera tu contraseña.', + noAccount: + 'No se ha encontrado la cuenta. Por favor, recarga la página o recupera tu contraseña.', invalidUser: 'Nombre de usuario o contraseña incorrectos', + locked: 'Demasiados inicios de sesión, inténtalo de nuevo más tarde', + globalLocked: 'Sistema bajo protección, inténtelo nuevamente más tarde', error: 'Error inesperado', changePassword: 'Cambiar contraseña', - changePasswordDesc: 'Para la seguridad de su dispositivo, por favor, modifique la contraseña de inicio de sesión en la web.', + changePasswordDesc: + 'Para la seguridad de su dispositivo, por favor, modifique la contraseña de inicio de sesión en la web.', differentPassword: 'Las contraseñas no coinciden', illegalUsername: 'El nombre de usuario contiene caracteres no permitidos', illegalPassword: 'La contraseña contiene caracteres no permitidos', @@ -27,7 +31,8 @@ const es = { cancel: 'Cancelar', loginButtonText: 'Iniciar sesión', tips: { - reset1: 'Para restablecer las contraseñas, mantén pulsado el botón BOOT del NanoKVM durante 10 segundos.', + reset1: + 'Para restablecer las contraseñas, mantén pulsado el botón BOOT del NanoKVM durante 10 segundos.', reset2: 'Para ver los pasos detallados, consulta este documento:', reset3: 'Cuenta predeterminada de la interfaz web:', reset4: 'Cuenta predeterminada de SSH:', @@ -42,16 +47,27 @@ const es = { description: 'Configura el Wi-Fi para el NanoKVM', success: 'Comprueba el estado de red del NanoKVM y accede a la nueva dirección IP.', failed: 'La operación ha fallado, vuelve a intentarlo.', + invalidMode: + 'El modo actual no admite la configuración de red. Vaya a su dispositivo y habilite el modo de configuración Wi-Fi.', confirmBtn: 'Aceptar', - finishBtn: 'Finalizado' + finishBtn: 'Finalizado', + ap: { + authTitle: 'Autenticación requerida', + authDescription: 'Por favor ingrese la contraseña AP para continuar', + authFailed: 'Contraseña AP no válida', + passPlaceholder: 'AP contraseña', + verifyBtn: 'Verificar' + } }, screen: { + scale: 'Escala', title: 'Pantalla', video: 'Modo de vídeo', videoDirectTips: 'Habilita HTTPS en "Ajustes > Dispositivo" para usar este modo', resolution: 'Resolución', auto: 'Automático', - autoTips: 'En determinadas resoluciones pueden producirse rasgado de imagen (tearing) o desplazamiento del ratón. Prueba a ajustar la resolución del host remoto o desactiva el modo automático.', + autoTips: + 'En determinadas resoluciones pueden producirse rasgado de imagen (tearing) o desplazamiento del ratón. Prueba a ajustar la resolución del host remoto o desactiva el modo automático.', fps: 'FPS', customizeFps: 'Personalizar', quality: 'Calidad', @@ -60,22 +76,63 @@ const es = { qualityMedium: 'Medio', qualityLow: 'Bajo', frameDetect: 'Detectar fotogramas', - frameDetectTip: 'Calcula la diferencia entre fotogramas. Para de transmitir vídeo cuando no se detectan cambios en la pantalla del host remoto.', + frameDetectTip: + 'Calcula la diferencia entre fotogramas. Para de transmitir vídeo cuando no se detectan cambios en la pantalla del host remoto.', resetHdmi: 'Reiniciar HDMI' }, keyboard: { - title: 'Teclado', + title: 'Teclado', paste: 'Pegar', tips: 'Sólo están soportadas las letras y símbolos estándar del teclado', placeholder: 'Por favor, introduce el texto', submit: 'Enviar', virtual: 'Teclado virtual', - ctrlaltdel: 'Ctrl+Alt+Del', readClipboard: 'Leer del portapapeles', - clipboardPermissionDenied: 'Permiso de portapapeles denegado. Por favor, permite el acceso al portapapeles en tu navegador.', + clipboardPermissionDenied: + 'Permiso de portapapeles denegado. Por favor, permite el acceso al portapapeles en tu navegador.', clipboardReadError: 'Error al leer del portapapeles', dropdownEnglish: 'Inglés', dropdownGerman: 'Alemán', + dropdownFrench: 'Francés', + dropdownRussian: 'ruso', + shortcut: { + title: 'Atajos', + custom: 'Personalizado', + capture: 'Haga clic aquí para capturar el acceso directo', + clear: 'Borrar', + save: 'Guardar', + captureTips: + 'Capturar teclas del sistema (como la tecla Windows) requiere permiso de pantalla completa.', + enterFullScreen: 'Alternar el modo de pantalla completa.' + }, + leaderKey: { + title: 'Tecla líder', + desc: 'Omite las restricciones del navegador y envía accesos directos al sistema directamente al host remoto.', + howToUse: 'Cómo utilizar', + simultaneous: { + title: 'Modo Simultáneo', + desc1: 'Mantenga pulsada la tecla líder y luego pulse el atajo.', + desc2: 'Intuitivo, pero puede entrar en conflicto con los atajos del sistema.' + }, + sequential: { + title: 'Modo Secuencial', + desc1: + 'Pulse la tecla líder → pulse el atajo en secuencia → vuelva a pulsar la tecla líder.', + desc2: 'Requiere más pasos, pero evita por completo conflictos del sistema.' + }, + enable: 'Habilitar tecla líder', + tip: 'Al asignarse como tecla líder, esta tecla funciona únicamente como activador de atajos y pierde su comportamiento predeterminado.', + placeholder: 'Pulse la tecla líder', + shiftRight: 'Shift derecho', + ctrlRight: 'Ctrl derecho', + metaRight: 'Win derecho', + submit: 'Enviar', + recorder: { + rec: 'REC', + activate: 'Activar teclas', + input: 'Por favor presione el atajo...' + } + } }, mouse: { title: 'Ratón', @@ -89,13 +146,17 @@ const es = { mode: 'Modo de ratón', absolute: 'Modo absoluto', relative: 'Modo relativo', - speed: 'Velocidad de la rueda', + direction: 'Dirección de la rueda de desplazamiento', + scrollUp: 'Desplazarse hacia arriba', + scrollDown: 'Desplácese hacia abajo', + speed: 'Velocidad de la rueda de desplazamiento', fast: 'Rápida', slow: 'Lenta', - requestPointer: 'Usando modo relativo. Por favor, haz clic en el escritorio para obtener el cursor del ratón.', + requestPointer: + 'Usando modo relativo. Por favor, haz clic en el escritorio para obtener el cursor del ratón.', resetHid: 'Restablecer HID', hidOnly: { - title: 'Modo sólo HID', + title: 'Modo solo HID', desc: 'Si tu ratón y teclado dejan de responder y restablecer el HID no ayuda, podría ser un problema de compatibilidad entre el NanoKVM y el dispositivo. Prueba a habilitar el modo sólo HID para mejorar la compatibilidad.', tip1: 'Habilitar el modo sólo HID desmontará el disco virtual y la red virtual', tip2: 'En modo sólo HID, el montaje de imágenes está deshabilitado', @@ -110,9 +171,11 @@ const es = { empty: 'No se ha encontrado nada', mountMode: 'Modo de montaje', mountFailed: 'Fallo al montar', - mountDesc: 'En algunos sistemas, es necesario expulsar el disco virtual del host remoto antes de montar una imagen.', + mountDesc: + 'En algunos sistemas, es necesario expulsar el disco virtual del host remoto antes de montar una imagen.', unmountFailed: 'Fallo al desmontar', - unmountDesc: 'En algunos sistemas, es necesario expulsar manualmente el disco virtual desde el host remoto antes de desmontar la imagen.', + unmountDesc: + 'En algunos sistemas, es necesario expulsar manualmente el disco virtual desde el host remoto antes de desmontar la imagen.', refresh: 'Actualizar la lista de imágenes', attention: 'Atención', deleteConfirm: '¿Estás seguro de que deseas eliminar esta imagen?', @@ -177,7 +240,10 @@ const es = { title: 'Descargador de imágenes', input: 'Por favor, introduce la URL de una imagen remota', ok: 'Aceptar', - disabled: 'La partición /data es de sólo lectura, no se puede descargar la imagen' + disabled: 'La partición /data es de sólo lectura, no se puede descargar la imagen', + uploadbox: 'Suelte el archivo aquí o haga clic para seleccionar', + inputfile: 'Por favor ingrese el archivo de imagen', + NoISO: 'Sin ISO' }, power: { title: 'Encender / Apagar', @@ -200,9 +266,9 @@ const es = { ip: 'IP', mdns: 'mDNS', application: 'Versión de la aplicación', - applicationTip: 'NanoKVM web application version', + applicationTip: 'Versión de la aplicación web NanoKVM', image: 'Versión de la imagen', - imageTip: 'NanoKVM system image version', + imageTip: 'Versión de la imagen del sistema NanoKVM', deviceKey: 'Clave del dispositivo', community: 'Comunidad', hostname: 'Nombre del host', @@ -217,10 +283,19 @@ const es = { title: 'Apariencia', display: 'Pantalla', language: 'Idioma', - menuBar: 'Barra de menú', - menuBarDesc: 'Mostrar iconos en la barra de menú', + languageDesc: 'Seleccionar el idioma de la interfaz', webTitle: 'Título web', - webTitleDesc: 'Personaliza el título de la página web' + webTitleDesc: 'Personaliza el título de la página web', + menuBar: { + title: 'Barra de menú', + mode: 'Modo de visualización', + modeDesc: 'Mostrar barra de menú en la pantalla', + modeOff: 'Apagado', + modeAuto: 'Ocultar automáticamente', + modeAlways: 'Siempre visible', + icons: 'Iconos del submenú', + iconsDesc: 'Mostrar iconos de submenú en la barra de menú' + } }, device: { title: 'Dispositivo', @@ -262,17 +337,26 @@ const es = { hdmi: { description: 'Habilitar salida HDMI/monitor' }, + autostart: { + title: 'Configuración de scripts de inicio automático', + description: 'Administrar scripts que se ejecutan automáticamente al iniciar el sistema', + new: 'Nuevo', + deleteConfirm: '¿Estás seguro de que deseas eliminar este archivo?', + yes: 'Sí', + no: 'No', + scriptName: 'Nombre del script de inicio automático', + scriptContent: 'Contenido del script de inicio automático', + settings: 'Ajustes' + }, hidOnly: 'Modo sólo HID', + hidOnlyDesc: + 'Dejar de emular dispositivos virtuales y conservar solo el control básico HID', disk: 'Disco Virtual', diskDesc: 'Montar disco virtual en el host remoto', - media: 'Imagen virtual', - mediaDesc: 'Adjuntar dispositivo de imagen virtual al host remoto', network: 'Red Virtual', networkDesc: 'Montar tarjeta de red virtual en el host remoto', reboot: 'Reiniciar', rebootDesc: '¿Estás seguro de que deseas reiniciar el NanoKVM?', - usb: 'Interfaz USB', - usbDesc: 'Habilitar interfaz USB hacia el host', okBtn: 'Sí', cancelBtn: 'No' }, @@ -340,7 +424,8 @@ const es = { install: 'Instalar', installing: 'Instalando', failed: 'La instalación falló', - retry: 'Por favor, actualiza la página e inténtalo de nuevo. O intenta instalarlo manualmente', + retry: + 'Por favor, actualiza la página e inténtalo de nuevo. O intenta instalarlo manualmente', download: 'Descargar el', package: 'paquete de instalación', unzip: 'y descomprimirlo', @@ -349,7 +434,8 @@ const es = { refresh: 'Actualizar la página actual', notRunning: 'Tailscale no se está ejecutando. Por favor, inícialo para continuar.', run: 'Iniciar', - notLogin: 'El dispositivo aún no ha sido vinculado. Por favor, inicia sesión y vincula este dispositivo a tu cuenta.', + notLogin: + 'El dispositivo aún no ha sido vinculado. Por favor, inicia sesión y vincula este dispositivo a tu cuenta.', urlPeriod: 'Esta URL es válida por 10 minutos', login: 'Iniciar sesión', loginSuccess: 'Inicio de sesión exitoso', @@ -375,7 +461,16 @@ const es = { cancel: 'Cancelar', preview: 'Vista previa de actualizaciones', previewDesc: 'Accede anticipadamente a nuevas funciones y mejoras', - previewTip: 'Ten en cuenta que las versiones de vista previa pueden contener errores o funcionalidades incompletas' + previewTip: + 'Ten en cuenta que las versiones de vista previa pueden contener errores o funcionalidades incompletas', + offline: { + title: 'Actualizaciones sin conexión', + desc: 'Actualización a través del paquete de instalación local', + upload: 'Subir', + invalidName: + 'Formato de nombre de archivo no válido. Descargue desde las versiones de GitHub.', + updateFailed: 'La actualización falló. Por favor, inténtalo de nuevo.' + } }, account: { title: 'Cuenta', @@ -388,6 +483,128 @@ const es = { cancelBtn: 'No' } }, + picoclaw: { + title: 'PicoClaw Asistente', + empty: 'Abre el panel e inicia una tarea para comenzar.', + inputPlaceholder: 'Describe lo que quieres que haga el PicoClaw', + newConversation: 'Nueva conversación', + processing: 'Procesando...', + agent: { + defaultTitle: 'Asistente general', + defaultDescription: 'Ayuda general para chat, búsqueda y espacio de trabajo.', + kvmTitle: 'Control remoto', + kvmDescription: 'Opere el host remoto a través de NanoKVM.', + switched: 'Rol de agente cambiado', + switchFailed: 'No se pudo cambiar la función del agente' + }, + send: 'Enviar', + cancel: 'Cancelar', + status: { + connecting: 'Conectándose a la puerta de enlace...', + connected: 'Sesión de PicoClaw conectada', + disconnected: 'Sesión de PicoClaw cerrada', + stopped: 'Solicitud de detención enviada', + runtimeStarted: 'Tiempo de ejecución de PicoClaw iniciado', + runtimeStartFailed: 'Error al iniciar el tiempo de ejecución de PicoClaw', + runtimeStopped: 'Tiempo de ejecución de PicoClaw detenido', + runtimeStopFailed: 'No se pudo detener el tiempo de ejecución de PicoClaw' + }, + connection: { + runtime: { + checking: 'Comprobando', + ready: 'Tiempo de ejecución listo', + stopped: 'Tiempo de ejecución detenido', + unavailable: 'Tiempo de ejecución no disponible', + configError: 'Error de configuración' + }, + transport: { + connecting: 'Conectando', + connected: 'Conectado' + }, + run: { + idle: 'Inactivo', + busy: 'Ocupado' + } + }, + message: { + toolAction: 'Acción', + observation: 'Observación', + screenshot: 'Captura de pantalla' + }, + overlay: { + locked: 'PicoClaw está controlando el dispositivo. La entrada manual está en pausa.' + }, + install: { + install: 'Instalar PicoClaw', + installing: 'Instalando PicoClaw', + success: 'PicoClaw instalado correctamente', + failed: 'Error al instalar PicoClaw', + uninstalling: 'Desinstalando el tiempo de ejecución...', + uninstalled: 'El tiempo de ejecución se desinstaló exitosamente.', + uninstallFailed: 'Falló la desinstalación.', + requiredTitle: 'PicoClaw no está instalado', + requiredDescription: + 'Instala PicoClaw antes de iniciar el tiempo de ejecución de PicoClaw.', + progressDescription: 'PicoClaw se está descargando e instalando.', + stages: { + preparing: 'Preparando', + downloading: 'Descargando', + extracting: 'Extrayendo', + installing: 'Instalando', + installed: 'Instalado', + install_timeout: 'Tiempo de espera agotado', + install_failed: 'Falló' + } + }, + model: { + requiredTitle: 'Se requiere configuración del modelo', + requiredDescription: 'Configure el modelo PicoClaw antes de usar el chat PicoClaw.', + docsTitle: 'Guía de configuración', + docsDesc: 'Modelos y protocolos compatibles', + menuLabel: 'Configurar modelo', + modelIdentifier: 'Identificador de modelo', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'Clave API', + apiKeyPlaceholder: 'Introduzca la clave API del modelo', + save: 'Guardar', + saving: 'Guardando', + saved: 'Configuración del modelo guardada', + saveFailed: 'No se pudo guardar la configuración del modelo', + invalid: 'Se requieren el identificador del modelo, API Base URL y la clave API' + }, + uninstall: { + menuLabel: 'Desinstalar', + confirmTitle: 'Desinstalar PicoClaw', + confirmContent: + '¿Está seguro de que desea desinstalar PicoClaw? Esto eliminará el ejecutable y todos los archivos de configuración.', + confirmOk: 'Desinstalar', + confirmCancel: 'Cancelar' + }, + history: { + title: 'Historial', + loading: 'Cargando sesiones...', + emptyTitle: 'Aún no hay historial', + emptyDescription: 'Las sesiones PicoClaw anteriores aparecerán aquí.', + loadFailed: 'Error al cargar el historial de sesiones', + deleteFailed: 'No se pudo eliminar la sesión', + deleteConfirmTitle: 'Eliminar sesión', + deleteConfirmContent: '¿Está seguro de que desea eliminar "{{title}}"?', + deleteConfirmOk: 'Eliminar', + deleteConfirmCancel: 'Cancelar', + messageCount_one: '{{count}} mensaje', + messageCount_other: '{{count}} mensajes' + }, + config: { + startRuntime: 'Iniciar PicoClaw', + stopRuntime: 'Detener PicoClaw' + }, + start: { + title: 'Iniciar PicoClaw', + description: 'Inicia el tiempo de ejecución para comenzar a utilizar el asistente PicoClaw.' + } + }, error: { title: 'Hemos encontrado un problema', refresh: 'Actualizar' diff --git a/web/src/i18n/locales/fr.ts b/web/src/i18n/locales/fr.ts index c652450..663bd9c 100644 --- a/web/src/i18n/locales/fr.ts +++ b/web/src/i18n/locales/fr.ts @@ -14,11 +14,15 @@ const fr = { placeholderPassword2: 'Veuillez entrer votre mot de passe à nouveau', noEmptyUsername: "Le nom d'utilisateur ne peut pas être vide", noEmptyPassword: 'Le mot de passe ne peut pas être vide', - noAccount: "Impossible de récupérer les informations de l'utilisateur, veuillez rafraîchir la page ou réinitialiser le mot de passe", + noAccount: + "Impossible de récupérer les informations de l'utilisateur, veuillez rafraîchir la page ou réinitialiser le mot de passe", invalidUser: "Nom d'utilisateur ou mot de passe invalide", + locked: 'Trop de connexions, veuillez réessayer plus tard', + globalLocked: 'Système sous protection, veuillez réessayer plus tard', error: 'Erreur inattendue', changePassword: 'Changer le mot de passe', - changePasswordDesc: 'Pour la sécurité de votre appareil, veuillez modifier le mot de passe de connexion Web.', + changePasswordDesc: + 'Pour la sécurité de votre appareil, veuillez modifier le mot de passe de connexion Web.', differentPassword: 'Les mots de passe ne correspondent pas', illegalUsername: "Le nom d'utilisateur contient des caractères illégaux", illegalPassword: 'Le mot de passe contient des caractères illégaux', @@ -35,19 +39,33 @@ const fr = { change1: 'Veuillez noter que cette action modifiera les mots de passe suivants :', change2: 'Mot de passe de connexion Web', change3: 'Mot de passe racine du système (mot de passe de connexion SSH)', - change4: 'Pour réinitialiser les mots de passe, appuyez et maintenez enfoncé le bouton BOOT sur le NanoKVM.' + change4: + 'Pour réinitialiser les mots de passe, appuyez et maintenez enfoncé le bouton BOOT sur le NanoKVM.' } }, wifi: { title: 'Wi-Fi', description: 'Configurez le Wi-Fi pour le NanoKVM', - success: 'Veuillez vérifier le statut du réseau du NanoKVM et visitez la nouvelle adresse IP.', - failed: 'L\'opération a échoué, veuillez réessayer.', + success: + 'Veuillez vérifier le statut du réseau du NanoKVM et visitez la nouvelle adresse IP.', + failed: "L'opération a échoué, veuillez réessayer.", + invalidMode: + 'Le mode actuel ne prend pas en charge la configuration réseau. Veuillez accéder à votre appareil et activer le mode de configuration Wi-Fi.', confirmBtn: 'Ok', - finishBtn: 'Terminé' + finishBtn: 'Terminé', + ap: { + authTitle: 'Authentification requise', + authDescription: 'Veuillez saisir le mot de passe AP pour continuer', + authFailed: 'Mot de passe AP invalide', + passPlaceholder: 'AP mot de passe', + verifyBtn: 'Vérifier' + } }, screen: { + scale: 'Échelle', + title: 'Écran', video: 'Mode vidéo', + videoDirectTips: 'Activez HTTPS dans "Paramètres > Appareil" pour utiliser ce mode', resolution: 'Résolution', auto: 'Automatique', autoTips: @@ -65,21 +83,62 @@ const fr = { resetHdmi: 'Réinitialiser le HDMI' }, keyboard: { + title: 'Clavier', paste: 'Coller', tips: 'Seuls les caractères et symboles standard du clavier sont pris en charge', placeholder: 'Veuillez saisir', submit: 'Soumettre', virtual: 'Clavier', - ctrlaltdel: 'Ctrl+Alt+Del', readClipboard: 'Lire le presse-papiers', - clipboardPermissionDenied: "Accès au presse-papiers refusé. Veuillez autoriser l'accès dans votre navigateur.", + clipboardPermissionDenied: + "Accès au presse-papiers refusé. Veuillez autoriser l'accès dans votre navigateur.", clipboardReadError: 'Échec de la lecture du presse-papiers', dropdownEnglish: 'Anglais', dropdownGerman: 'Allemand', dropdownFrench: 'Français', - dropdownRussian: 'Russe' + dropdownRussian: 'Russe', + shortcut: { + title: 'Raccourcis', + custom: 'Personnalisé', + capture: 'Cliquez ici pour capturer le raccourci', + clear: 'Effacer', + save: 'Enregistrer', + captureTips: + 'La capture de touches système (comme la touche Windows) nécessite l’autorisation du plein écran.', + enterFullScreen: 'Basculer en mode plein écran.' + }, + leaderKey: { + title: 'Touche Leader', + desc: "Contournez les restrictions du navigateur et envoyez les raccourcis système directement à l'hôte distant.", + howToUse: 'Comment utiliser', + simultaneous: { + title: 'Mode simultané', + desc1: 'Maintenez la touche Leader enfoncée, puis appuyez sur le raccourci.', + desc2: 'Intuitif, mais peut entrer en conflit avec les raccourcis système.' + }, + sequential: { + title: 'Mode séquentiel', + desc1: + 'Appuyez sur la touche Leader → appuyez sur le raccourci dans l’ordre → appuyez à nouveau sur la touche Leader.', + desc2: "Nécessite plus d'étapes, mais évite complètement les conflits système." + }, + enable: 'Activer la touche Leader', + tip: 'Lorsqu’elle est définie comme touche Leader, cette touche sert uniquement de déclencheur de raccourci et perd son comportement par défaut.', + placeholder: 'Appuyez sur la touche Leader', + shiftRight: 'Shift droit', + ctrlRight: 'Ctrl droit', + metaRight: 'Win droit', + submit: 'Soumettre', + recorder: { + rec: 'REC', + activate: 'Activer les touches', + input: 'Veuillez appuyer sur le raccourci...' + } + } }, mouse: { + title: 'Souris', + cursor: 'Style de curseur', default: 'Curseur par défaut', pointer: 'Curseur de la souris', cell: 'Curseur de cellule', @@ -89,17 +148,41 @@ const fr = { mode: 'Mode de la souris', absolute: 'Mode absolu', relative: 'Mode relatif', + direction: 'Sens de la molette', + scrollUp: 'Faire défiler vers le haut', + scrollDown: 'Faites défiler vers le bas', + speed: 'Vitesse de la molette', + fast: 'Rapide', + slow: 'Lent', requestPointer: 'Pour utiliser le mode relatif, cliquez sur le bureau pour capturer le pointeur de la souris.', - resetHid: 'Réinitialiser le périphérique HID' + resetHid: 'Réinitialiser le périphérique HID', + hidOnly: { + title: 'Mode HID uniquement', + desc: "Si votre souris et votre clavier ne répondent plus et que la réinitialisation de HID ne vous aide pas, il peut s'agir d'un problème de compatibilité entre le NanoKVM et l'appareil. Essayez d'activer le mode HID-Only pour une meilleure compatibilité.", + tip1: "L'activation du mode HID-Only démontera le disque U virtuel et le réseau virtuel", + tip2: "En mode HID-Only, le montage d'image est désactivé", + tip3: 'NanoKVM redémarrera automatiquement après avoir changé de mode', + enable: 'Activer le mode HID uniquement', + disable: 'Désactiver le mode HID uniquement' + } }, image: { title: 'Images', loading: 'Chargement', empty: 'Vide', + mountMode: 'Mode de montage', mountFailed: "Échec du montage de l'image.", mountDesc: "Dans certains systèmes, il est nécessaire de déséjecter le disque virtuel sur l'hôte distant avant de monter l'image.", + unmountFailed: 'Échec du démontage', + unmountDesc: + "Sur certains systèmes, vous devez l'éjecter manuellement de l'hôte distant avant de démonter l'image.", + refresh: 'Actualiser la liste des images', + attention: 'Attention', + deleteConfirm: 'Etes-vous sûr de vouloir supprimer cette image?', + okBtn: 'Oui', + cancelBtn: 'Non', tips: { title: 'Comment télécharger', usb1: 'Connectez le NanoKVM à votre ordinateur via USB.', @@ -136,6 +219,16 @@ const fr = { serialPort: 'Port série', serialPortPlaceholder: 'Veuillez entrer le port série', baudrate: 'Débit en bauds', + parity: 'Parité', + parityNone: 'Aucun', + parityEven: 'Paire', + parityOdd: 'Impaire', + flowControl: 'Contrôle de débit', + flowControlNone: 'Aucun', + flowControlSoft: 'Logiciel', + flowControlHard: 'Matériel', + dataBits: 'Bits de données', + stopBits: "Bits d'arrêt", confirm: 'Ok' }, wol: { @@ -149,14 +242,23 @@ const fr = { title: 'Télécharger l’image', input: 'Veuillez entrer l’URL d’une image distante', ok: 'Ok', - disabled: 'La partition /data est en lecture seule, impossible de télécharger l’image' + disabled: 'La partition /data est en lecture seule, impossible de télécharger l’image', + uploadbox: 'Déposez le fichier ici ou cliquez pour sélectionner', + inputfile: 'Veuillez saisir le fichier image', + NoISO: 'Aucun ISO' }, power: { title: 'Power', + showConfirm: 'Confirmation', + showConfirmTip: 'Les opérations électriques nécessitent une confirmation supplémentaire', reset: 'Réinitialiser', power: 'Power', powerShort: 'Power (appui court)', - powerLong: 'Power (appui long)' + powerLong: 'Power (appui long)', + resetConfirm: "Procéder à l'opération de réinitialisation?", + powerConfirm: 'Continuer le fonctionnement électrique?', + okBtn: 'Oui', + cancelBtn: 'Non' }, settings: { title: 'Paramètres', @@ -166,24 +268,42 @@ const fr = { ip: 'IP', mdns: 'mDNS', application: "Version de l'application", - applicationTip: 'Version de l\'application Web NanoKVM', + applicationTip: "Version de l'application Web NanoKVM", image: "Version de l'image", - imageTip: 'Version de l\'image système NanoKVM', + imageTip: "Version de l'image système NanoKVM", deviceKey: "Clé de l'appareil", - community: 'Communauté' + community: 'Communauté', + hostname: "Nom d'hôte", + hostnameUpdated: "Nom d'hôte mis à jour. Redémarrez pour appliquer.", + ipType: { + Wired: 'Filaire', + Wireless: 'Sans fil', + Other: 'Autre' + } }, appearance: { title: 'Apparence', display: 'Affichage', language: 'Langue', - menuBar: 'Barre de menus', - menuBarDesc: 'Afficher les icônes dans la barre de menus' + languageDesc: "Sélectionnez la langue de l'interface", + webTitle: 'Titre Web', + webTitleDesc: 'Personnaliser le titre de la page Web', + menuBar: { + title: 'Barre de menus', + mode: "Mode d'affichage", + modeDesc: "Afficher la barre de menu sur l'écran", + modeOff: 'Désactivé', + modeAuto: 'Masquer automatiquement', + modeAlways: 'Toujours visible', + icons: 'Icônes du sous-menu', + iconsDesc: 'Afficher les icônes des sous-menus dans la barre de menus' + } }, device: { title: 'Appareil', oled: { title: 'OLED', - description: 'Écran OLED s\'éteint automatiquement', + description: "Écran OLED s'éteint automatiquement", 0: 'Jamais', 15: '15 sec', 30: '30 sec', @@ -194,10 +314,53 @@ const fr = { 1800: '30 min', 3600: '1 heure' }, + ssh: { + description: "Activer l'accès à distance SSH", + tip: "Définissez un mot de passe fort avant d'activer (Compte - Modifier le mot de passe)" + }, + advanced: 'Paramètres avancés', + swap: { + title: 'Échange', + disable: 'Désactiver', + description: "Définir la taille du fichier d'échange", + tip: "L'activation de cette fonctionnalité pourrait réduire la durée de vie de votre carte SD!" + }, + mouseJiggler: { + title: 'Souris Jiggler', + description: "Empêcher l'hôte distant de dormir", + disable: 'Désactiver', + absolute: 'Mode absolu', + relative: 'Mode relatif' + }, + mdns: { + description: 'Activer le service de découverte mDNS', + tip: "L'éteindre si ce n'est pas nécessaire" + }, + hdmi: { + description: 'Activer HDMI/sortie moniteur' + }, + autostart: { + title: 'Paramètres des scripts de démarrage automatique', + description: "Gérer les scripts qui s'exécutent automatiquement au démarrage du système", + new: 'Nouveau', + deleteConfirm: 'Êtes-vous sûr de vouloir supprimer ce fichier ?', + yes: 'Oui', + no: 'Non', + scriptName: 'Nom du script de démarrage automatique', + scriptContent: 'Contenu du script de démarrage automatique', + settings: 'Paramètres' + }, + hidOnly: 'HID-Mode uniquement', + hidOnlyDesc: + "Arrêtez d'émuler des périphériques virtuels, en ne conservant que le contrôle de base HID", disk: 'Disque virtuel', - diskDesc: 'Monter le disque virtuel U sur l\'hôte distant', + diskDesc: "Monter le disque virtuel U sur l'hôte distant", network: 'Réseau virtuel', - networkDesc: 'Monter la carte réseau virtuelle sur l\'hôte distant' + networkDesc: "Monter la carte réseau virtuelle sur l'hôte distant", + reboot: 'Redémarrer', + rebootDesc: 'Êtes-vous sûr de vouloir redémarrer NanoKVM?', + okBtn: 'Oui', + cancelBtn: 'Non' }, network: { title: 'Réseau', @@ -218,7 +381,7 @@ const fr = { }, tls: { description: 'Activer le protocole HTTPS', - tip: 'Attention : l\'utilisation de HTTPS peut augmenter la latence, surtout en mode vidéo MJPEG.' + tip: "Attention : l'utilisation de HTTPS peut augmenter la latence, surtout en mode vidéo MJPEG." }, dns: { title: 'DNS', @@ -229,9 +392,9 @@ const fr = { add: 'Ajouter un DNS', save: 'Enregistrer', invalid: 'Veuillez saisir une adresse IP valide', - noDhcp: 'Aucun DNS DHCP n\'est actuellement disponible', + noDhcp: "Aucun DNS DHCP n'est actuellement disponible", saved: 'Paramètres DNS enregistrés', - saveFailed: 'Échec de l\'enregistrement des paramètres DNS', + saveFailed: "Échec de l'enregistrement des paramètres DNS", unsaved: 'Modifications non enregistrées', maxServers: '{{count}} serveurs DNS maximum autorisés', dnsServers: 'Serveurs DNS', @@ -249,8 +412,11 @@ const fr = { title: 'Tailscale', memory: { title: 'Optimisation de la mémoire', - tip: "Lorsque l'utilisation de la mémoire dépasse la limite, la collecte des ordures est effectuée plus agressivement pour essayer de libérer de la mémoire. Il est recommandé de définir à 50MB si vous utilisez Tailscale. Un redémarrage de Tailscale est nécessaire pour que le changement prenne effet.", - disable: 'Désactiver' + tip: "Lorsque l'utilisation de la mémoire dépasse la limite, la collecte des ordures est effectuée plus agressivement pour essayer de libérer de la mémoire. Il est recommandé de définir à 50MB si vous utilisez Tailscale. Un redémarrage de Tailscale est nécessaire pour que le changement prenne effet." + }, + swap: { + title: 'Échanger la mémoire', + tip: "Si les problèmes persistent après l'activation de l'optimisation de la mémoire, essayez d'activer la mémoire d'échange. Cela définit la taille du fichier d'échange sur 256MB par défaut, qui peut être ajustée dans « Paramètres > Appareil »." }, restart: 'Êtes-vous sûr de vouloir redémarrer Tailscale ?', stop: 'Êtes-vous sûr de vouloir arrêter Tailscale ?', @@ -262,11 +428,14 @@ const fr = { failed: 'Installation échouée', retry: "Veuillez rafraîchir et réessayer. Ou essayez d'installer manuellement", download: 'Télécharger le', - package: 'paquet d\'installation', + package: "paquet d'installation", unzip: 'et décompressez-le', upTailscale: 'Téléverser tailscale dans le répertoire NanoKVM /usr/sbin/', upTailscaled: 'Téléverser tailscaled dans le répertoire NanoKVM /usr/sbin/', refresh: 'Rafraîchir la page courante', + notRunning: + "Tailscale n'est pas en cours d'exécution. Veuillez le démarrer pour continuer.", + run: 'Début', notLogin: "L'appareil n'est pas relié. Connectez-vous et liez cet appareil à votre compte.", urlPeriod: "L'URL est valide pendant 10 minutes", login: 'Connexion', @@ -276,7 +445,9 @@ const fr = { deviceIP: "IP de l'appareil", account: 'Compte', logout: 'Déconnexion', - logout2: 'Voulez-vous vous déconnecter?', + logoutDesc: 'Êtes-vous sûr de vouloir vous déconnecter?', + uninstall: 'Désinstaller Tailscale', + uninstallDesc: 'Êtes-vous sûr de vouloir désinstaller Tailscale?', okBtn: 'Oui', cancelBtn: 'Non' }, @@ -288,19 +459,163 @@ const fr = { available: 'Une mise à jour est disponible. Voulez-vous vraiment mettre à jour?', updating: 'Mise à jour en cours. Veuillez patienter...', confirm: 'Confirmer', - cancel: 'Annuler' + cancel: 'Annuler', + preview: 'Aperçu des mises à jour', + previewDesc: + "Bénéficiez d'un accès anticipé aux nouvelles fonctionnalités et améliorations", + previewTip: + 'Veuillez noter que les versions préliminaires peuvent contenir des bugs ou des fonctionnalités incomplètes!', + offline: { + title: 'Mises à jour hors ligne', + desc: "Mise à jour via le package d'installation local", + upload: 'Téléverser', + invalidName: + 'Format de nom de fichier invalide. Veuillez télécharger à partir des versions de GitHub.', + updateFailed: 'Mise à jour échouée. Veuillez réessayer.' + } }, account: { title: 'Compte', webAccount: 'Nom du compte Web', password: 'Mot de passe', updateBtn: 'Mettre à jour', - logoutBtn: 'Déconnexion' - }, - error: { - title: "Une erreur est survenue", - refresh: 'Rafraîchir' + logoutBtn: 'Déconnexion', + logoutDesc: 'Êtes-vous sûr de vouloir vous déconnecter?', + okBtn: 'Oui', + cancelBtn: 'Non' } + }, + picoclaw: { + title: 'PicoClaw Assistante', + empty: 'Ouvrez le panneau et démarrez une tâche pour commencer.', + inputPlaceholder: 'Décrivez ce que vous voulez que le PicoClaw fasse', + newConversation: 'Nouvelle conversation', + processing: 'Traitement...', + agent: { + defaultTitle: 'Assistant général', + defaultDescription: "Aide générale sur le chat, la recherche et l'espace de travail.", + kvmTitle: 'Contrôle à distance', + kvmDescription: "Faites fonctionner l'hôte distant via NanoKVM.", + switched: "Rôle d'agent modifié", + switchFailed: "Échec du changement de rôle d'agent" + }, + send: 'Envoyer', + cancel: 'Annuler', + status: { + connecting: 'Connexion à la passerelle...', + connected: 'Session PicoClaw connectée', + disconnected: 'Session PicoClaw fermée', + stopped: "Demande d'arrêt envoyée", + runtimeStarted: 'Runtime PicoClaw démarré', + runtimeStartFailed: 'Échec du démarrage du runtime PicoClaw', + runtimeStopped: 'Runtime PicoClaw arrêté', + runtimeStopFailed: "Échec de l'arrêt du runtime PicoClaw" + }, + connection: { + runtime: { + checking: 'Vérification', + ready: 'Runtime prêt', + stopped: 'Runtime arrêté', + unavailable: 'Runtime indisponible', + configError: 'Erreur de configuration' + }, + transport: { + connecting: 'Connexion', + connected: 'Connecté' + }, + run: { + idle: 'Inactif', + busy: 'Occupé' + } + }, + message: { + toolAction: 'Action', + observation: 'Observation', + screenshot: "Capture d'écran" + }, + overlay: { + locked: "PicoClaw contrôle l'appareil. La saisie manuelle est suspendue." + }, + install: { + install: 'Installer PicoClaw', + installing: 'Installation de PicoClaw', + success: 'PicoClaw installé avec succès', + failed: "Échec de l'installation de PicoClaw", + uninstalling: 'Désinstallation du runtime...', + uninstalled: 'Runtime désinstallé avec succès.', + uninstallFailed: 'Échec de la désinstallation.', + requiredTitle: "PicoClaw n'est pas installé", + requiredDescription: 'Installez PicoClaw avant de démarrer le runtime PicoClaw.', + progressDescription: "PicoClaw est en cours de téléchargement et d'installation.", + stages: { + preparing: 'Préparation', + downloading: 'Téléchargement', + extracting: 'Extraction', + installing: 'Installation', + installed: 'Installé', + install_timeout: 'Délai expiré', + install_failed: 'Échec' + } + }, + model: { + requiredTitle: 'La configuration du modèle est requise', + requiredDescription: "Configurez le modèle PicoClaw avant d'utiliser le chat PicoClaw.", + docsTitle: 'Guide de configuration', + docsDesc: 'Modèles et protocoles pris en charge', + menuLabel: 'Configurer le modèle', + modelIdentifier: 'Identifiant du modèle', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'Clé API', + apiKeyPlaceholder: 'Saisissez la clé API du modèle', + save: 'Enregistrer', + saving: 'Enregistrement', + saved: 'Configuration du modèle enregistrée', + saveFailed: "Échec de l'enregistrement de la configuration du modèle", + invalid: 'L’identifiant du modèle, l’API Base URL et la clé API sont requis' + }, + uninstall: { + menuLabel: 'Désinstaller', + confirmTitle: 'Désinstaller PicoClaw', + confirmContent: + "Êtes-vous sûr de vouloir désinstaller PicoClaw? Cela supprimera l'exécutable et tous les fichiers de configuration.", + confirmOk: 'Désinstaller', + confirmCancel: 'Annuler' + }, + history: { + title: 'Historique', + loading: 'Chargement des sessions...', + emptyTitle: "Pas encore d'historique", + emptyDescription: 'Les sessions précédentes PicoClaw apparaîtront ici.', + loadFailed: "Échec du chargement de l'historique de la session", + deleteFailed: 'Échec de la suppression de la session', + deleteConfirmTitle: 'Supprimer la session', + deleteConfirmContent: 'Etes-vous sûr de vouloir supprimer « {{title}} »?', + deleteConfirmOk: 'Supprimer', + deleteConfirmCancel: 'Annuler', + messageCount_one: '{{count}} message', + messageCount_other: '{{count}} messages' + }, + config: { + startRuntime: 'Démarrer PicoClaw', + stopRuntime: 'Arrêter PicoClaw' + }, + start: { + title: 'Démarrer PicoClaw', + description: "Démarrez le runtime pour commencer à utiliser l'assistant PicoClaw." + } + }, + error: { + title: 'Nous avons rencontré un problème', + refresh: 'Actualiser' + }, + fullscreen: { + toggle: 'Basculer vers le plein écran' + }, + menu: { + collapse: 'Réduire le menu', + expand: 'Développer le menu' } } }; diff --git a/web/src/i18n/locales/hu.ts b/web/src/i18n/locales/hu.ts index c494df7..9371504 100644 --- a/web/src/i18n/locales/hu.ts +++ b/web/src/i18n/locales/hu.ts @@ -17,6 +17,8 @@ const hu = { noAccount: 'Nem sikerült megszerezni a felhasználói információkat, frissítse az oldalt vagy állítsa vissza a jelszót', invalidUser: 'Érvénytelen felhasználónév vagy jelszó', + locked: 'Túl sok bejelentkezés, kérjük, próbálja újra később', + globalLocked: 'A rendszer védelem alatt áll, próbálkozzon újra később', error: 'Váratlan hiba', changePassword: 'Jelszó megváltoztatása', changePasswordDesc: @@ -31,25 +33,38 @@ const hu = { tips: { reset1: 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', - reset2: 'For detailed steps, please consult this document:', - reset3: 'Web default account:', - reset4: 'SSH default account:', - change1: 'Please note that this action will change the following passwords:', - change2: 'Web login password', - change3: 'System root password (SSH login password)', - change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + reset2: 'A részletes lépésekért tekintse meg ezt a dokumentumot:', + reset3: 'Alapértelmezett webes fiók:', + reset4: 'Alapértelmezett SSH-fiók:', + change1: 'Vegye figyelembe, hogy ez a művelet a következő jelszavakat módosítja:', + change2: 'Webes bejelentkezési jelszó', + change3: 'Rendszer root jelszava (SSH bejelentkezési jelszó)', + change4: 'A jelszavak visszaállításához tartsa lenyomva a BOOT gombot a NanoKVM-en.' } }, wifi: { title: 'Wi-Fi', - description: 'Configure Wi-Fi for NanoKVM', + description: 'Wi-Fi beállítása a NanoKVM-hez', success: 'Please check the network status of NanoKVM and visit the new IP address.', - failed: 'Operation failed, please try again.', + failed: 'A művelet sikertelen, próbálja újra.', + invalidMode: + 'Az aktuális mód nem támogatja a hálózat beállítását. Kérjük, lépjen az eszközére, és engedélyezze a Wi-Fi konfigurációs módot.', confirmBtn: 'Ok', - finishBtn: 'Finished' + finishBtn: 'Kész', + ap: { + authTitle: 'Hitelesítés szükséges', + authDescription: 'A folytatáshoz adja meg a AP jelszót', + authFailed: 'Érvénytelen AP jelszó', + passPlaceholder: 'AP jelszót', + verifyBtn: 'Ellenőrizze' + } }, screen: { + scale: 'Skála', + title: 'Képernyő', video: 'Videó mód', + videoDirectTips: + 'Engedélyezze az HTTPS elemet a "Beállítások > Eszköz" menüpontban ennek a módnak a használatához', resolution: 'Felbontás', auto: 'Automatikus', autoTips: @@ -64,17 +79,65 @@ const hu = { frameDetect: 'Képkocka-figyelés', frameDetectTip: 'Elemzi a képkockák közötti különbségeket. A videó stream küldése leáll, ha a távoli gép képernyőjén nem történik változás.', - resetHdmi: 'Reset HDMI' + resetHdmi: 'HDMI visszaállítása' }, keyboard: { + title: 'Billentyűzet', paste: 'Beillesztés', tips: 'Csak a szabványos billentyűzet betűi és szimbólumai támogatottak', placeholder: 'Írja be', submit: 'Elküldés', virtual: 'Billentyűzet', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Olvasás a vágólapról', + clipboardPermissionDenied: + 'A vágólap engedélye megtagadva. Kérjük, engedélyezze a vágólaphoz való hozzáférést a böngészőjében.', + clipboardReadError: 'Nem sikerült beolvasni a vágólapot', + dropdownEnglish: 'angol', + dropdownGerman: 'német', + dropdownFrench: 'francia', + dropdownRussian: 'orosz', + shortcut: { + title: 'Parancsikonok', + custom: 'Egyedi', + capture: 'Kattintson ide a parancsikon rögzítéséhez', + clear: 'Tiszta', + save: 'Mentés', + captureTips: + 'A rendszerszintű billentyűk (például a Windows billentyű) rögzítéséhez teljes képernyős engedély szükséges.', + enterFullScreen: 'Teljes képernyős mód váltása.' + }, + leaderKey: { + title: 'Leader billentyű', + desc: 'Kerülje ki a böngésző korlátozásait, és küldje el a rendszer parancsikonjait közvetlenül a távoli gazdagépnek.', + howToUse: 'Használat', + simultaneous: { + title: 'Egyidejű üzemmód', + desc1: 'Tartsa lenyomva a Leader billentyűt, majd nyomja meg a gyorsbillentyűt.', + desc2: 'Intuitív, de ütközhet a rendszer parancsikonjaival.' + }, + sequential: { + title: 'Szekvenciális mód', + desc1: + 'Nyomja meg a Leader billentyűt → nyomja meg sorban a gyorsbillentyűt → nyomja meg újra a Leader billentyűt.', + desc2: 'Több lépést igényel, de teljesen elkerülhető a rendszerütközések.' + }, + enable: 'Leader billentyű engedélyezése', + tip: 'Leader billentyűként beállítva ez a billentyű kizárólag gyorsbillentyű-indítóként működik, és elveszíti alapértelmezett viselkedését.', + placeholder: 'Nyomja meg a Leader billentyűt', + shiftRight: 'Jobb Shift', + ctrlRight: 'Jobb Ctrl', + metaRight: 'Jobb Win', + submit: 'Elküldés', + recorder: { + rec: 'REC', + activate: 'Billentyűk aktiválása', + input: 'Kérjük, nyomja meg a parancsikont...' + } + } }, mouse: { + title: 'Egér', + cursor: 'Kurzorstílus', default: 'Alapértelmezett kurzor', pointer: 'Mutató kurzor', cell: 'Cella kurzor', @@ -84,17 +147,41 @@ const hu = { mode: 'Egér mód', absolute: 'Abszolút mód', relative: 'Relatív mód', + direction: 'Görgő iránya', + scrollUp: 'Görgessen felfelé', + scrollDown: 'Görgessen le', + speed: 'Görgő sebessége', + fast: 'Gyors', + slow: 'Lassú', requestPointer: 'Relatív mód használata. Kattintson az asztalra, hogy megjelenjen az egérmutató.', - resetHid: 'HID alaphelyzetbe állítása' + resetHid: 'HID alaphelyzetbe állítása', + hidOnly: { + title: 'Csak HID mód', + desc: 'Ha az egér és a billentyűzet nem válaszol, és az HID alaphelyzetbe állítása nem segít, akkor az NanoKVM és az eszköz közötti kompatibilitási probléma lehet. Próbálja engedélyezni az HID-Csak módot a jobb kompatibilitás érdekében.', + tip1: 'Az HID-Csak mód engedélyezése leválasztja a virtuális U-lemezt és a virtuális hálózatot', + tip2: 'HID-Csak módban a képrögzítés le van tiltva', + tip3: 'A NanoKVM automatikusan újraindul az üzemmódváltás után', + enable: 'Engedélyezze a HID-Csak módot', + disable: 'A HID-Csak mód letiltása' + } }, image: { title: 'Képek', loading: 'Betöltés...', empty: 'Nem található semmi', + mountMode: 'Felszerelési mód', mountFailed: 'Csatlakoztatás sikertelen', mountDesc: 'Egyes rendszerekben szükséges lehet a virtuális lemez eltávolítása a távoli gépen, mielőtt a képet csatlakoztatja.', + unmountFailed: 'A leválasztás nem sikerült', + unmountDesc: + 'Egyes rendszereken manuálisan kell kiadnia a távoli gazdagépről a kép leválasztása előtt.', + refresh: 'Frissítse a képlistát', + attention: 'Figyelem', + deleteConfirm: 'Biztosan törli ezt a képet?', + okBtn: 'Igen', + cancelBtn: 'Nem', tips: { title: 'Hogyan tölts fel képeket', usb1: 'Csatlakoztassa a NanoKVM-t a számítógépéhez USB-n keresztül.', @@ -131,6 +218,16 @@ const hu = { serialPort: 'Soros port', serialPortPlaceholder: 'Adja meg a soros portot', baudrate: 'Baudráta', + parity: 'Paritás', + parityNone: 'Nincs', + parityEven: 'Páros', + parityOdd: 'Páratlan', + flowControl: 'Áramlásszabályozás', + flowControlNone: 'Nincs', + flowControlSoft: 'Szoftveres', + flowControlHard: 'Hardveres', + dataBits: 'Adatbitek', + stopBits: 'Stop bitek', confirm: 'Ok' }, wol: { @@ -140,40 +237,73 @@ const hu = { input: 'Adja meg a MAC címet', ok: 'Ok' }, + download: { + title: 'Képletöltő', + input: 'Adjon meg egy távoli képet URL', + ok: 'Ok', + disabled: '/data partíció RO, ezért nem tudjuk letölteni a képet', + uploadbox: 'Dobja ide a fájlt, vagy kattintson a kiválasztáshoz', + inputfile: 'Kérjük, írja be a képfájlt', + NoISO: 'Nincs ISO' + }, power: { title: 'Bekapcsolás', - power: 'Bekapcsolás', + showConfirm: 'Megerősítés', + showConfirmTip: 'Az áramellátási műveletekhez külön megerősítés szükséges', reset: 'Újraindítás', + power: 'Bekapcsolás', powerShort: 'Bekapcsolás (rövid kattintás)', - powerLong: 'Bekapcsolás (hosszú kattintás)' + powerLong: 'Bekapcsolás (hosszú kattintás)', + resetConfirm: 'Folytatja a visszaállítási műveletet?', + powerConfirm: 'Folytatja az áramellátást?', + okBtn: 'Igen', + cancelBtn: 'Nem' }, settings: { - title: 'Settings', + title: 'Beállítások', about: { title: 'NanoKVM Névjegy', information: 'Információ', ip: 'IP', mdns: 'mDNS', application: 'Alkalmazás verzió', - applicationTip: 'NanoKVM web application version', + applicationTip: 'NanoKVM webalkalmazás verziója', image: 'Képfájl verzió', - imageTip: 'NanoKVM system image version', + imageTip: 'NanoKVM rendszerkép verziója', deviceKey: 'Eszköz kulcs', - community: 'Közösség' + community: 'Közösség', + hostname: 'Gazdanév', + hostnameUpdated: 'Gazdanév frissítve. Az alkalmazáshoz indítsa újra.', + ipType: { + Wired: 'Vezetékes', + Wireless: 'Vezeték nélküli', + Other: 'Egyéb' + } }, appearance: { - title: 'Appearance', - display: 'Display', - language: 'Language', - menuBar: 'Menu Bar', - menuBarDesc: 'Display icons in the menu bar' + title: 'Megjelenés', + display: 'Kijelző', + language: 'Nyelv', + languageDesc: 'Válassza ki a felület nyelvét', + webTitle: 'Webcím', + webTitleDesc: 'A weboldal címének testreszabása', + menuBar: { + title: 'Menüsor', + mode: 'Megjelenítési mód', + modeDesc: 'Menüsor megjelenítése a képernyőn', + modeOff: 'Ki', + modeAuto: 'Automatikus elrejtés', + modeAlways: 'Mindig látható', + icons: 'Almenü ikonok', + iconsDesc: 'Almenüikonok megjelenítése a menüsorban' + } }, device: { - title: 'Device', + title: 'Eszköz', oled: { title: 'OLED', description: 'OLED screen automatically sleep', - 0: 'Never', + 0: 'Soha', 15: '15 sec', 30: '30 sec', 60: '1 min', @@ -181,12 +311,55 @@ const hu = { 300: '5 min', 600: '10 min', 1800: '30 min', - 3600: '1 hour' + 3600: '1 óra' }, - disk: 'Virtual Disk', + ssh: { + description: 'Engedélyezze a SSH távoli hozzáférést', + tip: 'Az engedélyezés előtt állítson be erős jelszót (Fiók - Jelszó módosítása)' + }, + advanced: 'Speciális beállítások', + swap: { + title: 'Csere', + disable: 'Letiltás', + description: 'Állítsa be a swap fájl méretét', + tip: 'Ennek a funkciónak az engedélyezése lerövidítheti az SD-kártya élettartamát!' + }, + mouseJiggler: { + title: 'Mouse Jiggler', + description: 'A távoli gazdagép alvó állapotának megakadályozása', + disable: 'Letiltás', + absolute: 'Abszolút mód', + relative: 'Relatív mód' + }, + mdns: { + description: 'Engedélyezze az mDNS felderítési szolgáltatást', + tip: 'Kikapcsolás, ha nincs rá szükség' + }, + hdmi: { + description: 'HDMI/monitor kimenet engedélyezése' + }, + autostart: { + title: 'Automatikus indítási parancsfájlok beállításai', + description: 'A rendszer indításakor automatikusan futó szkriptek kezelése', + new: 'Új', + deleteConfirm: 'Biztosan törli ezt a fájlt?', + yes: 'Igen', + no: 'Nem', + scriptName: 'Automatikusan induló szkript neve', + scriptContent: 'A szkripttartalom automatikus indítása', + settings: 'Beállítások' + }, + hidOnly: 'HID-Csak mód', + hidOnlyDesc: + 'A virtuális eszközök emulálásának leállítása, csak az alapvető HID vezérlés megtartásával', + disk: 'Virtuális lemez', diskDesc: 'Mount virtual U-disk on the remote host', - network: 'Virtual Network', - networkDesc: 'Mount virtual network card on the remote host' + network: 'Virtuális hálózat', + networkDesc: 'Virtuális hálózati kártya csatlakoztatása a távoli gazdagépen', + reboot: 'Újraindítás', + rebootDesc: 'Biztos, hogy újra akarja indítani a NanoKVM-t?', + okBtn: 'Igen', + cancelBtn: 'Nem' }, network: { title: 'Hálózat', @@ -237,9 +410,12 @@ const hu = { tailscale: { title: 'Tailscale', memory: { - title: 'Memory optimization', - tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect.", - disable: 'Disable' + title: 'Memóriaoptimalizálás', + tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect." + }, + swap: { + title: 'Memória csere', + tip: 'Ha a memóriaoptimalizálás engedélyezése után is fennállnak a problémák, próbálja meg engedélyezni a swap memóriát. Ez alapértelmezés szerint a swap fájl méretét 256MB értékre állítja be, amely a "Beállítások > Eszköz" menüpontban állítható be.' }, restart: 'Are you sure to restart Tailscale?', stop: 'Are you sure to stop Tailscale?', @@ -256,6 +432,8 @@ const hu = { upTailscale: 'Töltsön fel tailscale-t a NanoKVM /usr/bin/ könyvtárába', upTailscaled: 'Töltsön fel tailscaled-t a NanoKVM /usr/sbin/ könyvtárába', refresh: 'Frissítse az aktuális oldalt', + notRunning: 'Tailscale nem fut. Kérjük, indítsa el a folytatáshoz.', + run: 'Indítás', notLogin: 'Az eszköz még nincs kötve. Kérem, jelentkezzen be és kösse az eszközt a fiókjához.', urlPeriod: 'Ez az url 10 percig érvényes', @@ -266,7 +444,9 @@ const hu = { deviceIP: 'Eszköz IP', account: 'Fiók', logout: 'Kijelentkezés', - logout2: 'Biztos, hogy kijelentkezik?', + logoutDesc: 'Biztos, hogy ki szeretne jelentkezni?', + uninstall: 'Eltávolítás Tailscale', + uninstallDesc: 'Biztosan eltávolítja a Tailscale alkalmazást?', okBtn: 'Yes', cancelBtn: 'No' }, @@ -278,15 +458,162 @@ const hu = { available: 'Frissítés elérhető. Biztos, hogy frissít?', updating: 'Frissítés elkezdődött. Kérem várjon...', confirm: 'Megerősítés', - cancel: 'Mégse' + cancel: 'Mégse', + preview: 'Frissítések előnézete', + previewDesc: 'Korai hozzáférést kap az új funkciókhoz és fejlesztésekhez', + previewTip: + 'Kérjük, vegye figyelembe, hogy az előzetes verziók hibákat vagy hiányos funkciókat tartalmazhatnak!', + offline: { + title: 'Offline frissítések', + desc: 'Frissítés helyi telepítőcsomaggal', + upload: 'Feltöltés', + invalidName: 'Érvénytelen fájlnévformátum. Kérjük, töltse le a GitHub kiadásaiból.', + updateFailed: 'Frissítés sikertelen. Kérem, próbálja újra.' + } }, account: { - title: 'Account', - webAccount: 'Web Account Name', - password: 'Password', + title: 'Fiók', + webAccount: 'Webes fiók neve', + password: 'Jelszó', updateBtn: 'Update', - logoutBtn: 'Logout' + logoutBtn: 'Kijelentkezés', + logoutDesc: 'Biztos, hogy ki szeretne jelentkezni?', + okBtn: 'Igen', + cancelBtn: 'Nem' } + }, + picoclaw: { + title: 'PicoClaw Asszisztens', + empty: 'Nyissa meg a panelt, és indítsa el a feladatot.', + inputPlaceholder: 'Írja le, mit szeretne tenni az PicoClaw-val', + newConversation: 'Új beszélgetés', + processing: 'Feldolgozás...', + agent: { + defaultTitle: 'Általános asszisztens', + defaultDescription: 'Általános csevegési, keresési és munkaterületi súgó.', + kvmTitle: 'Távoli vezérlés', + kvmDescription: 'Működtesse a távoli gazdagépet az NanoKVM segítségével.', + switched: 'Ügynöki szerepkör megváltozott', + switchFailed: 'Nem sikerült váltani az ügynöki szerepkört' + }, + send: 'Küldés', + cancel: 'Mégse', + status: { + connecting: 'Csatlakozás az átjáróhoz...', + connected: 'PicoClaw munkamenet csatlakoztatva', + disconnected: 'PicoClaw munkamenet lezárva', + stopped: 'Leállítási kérés elküldve', + runtimeStarted: 'PicoClaw Runtime elindult', + runtimeStartFailed: 'Nem sikerült elindítani a PicoClaw Runtime-ot', + runtimeStopped: 'PicoClaw Runtime leállt', + runtimeStopFailed: 'Nem sikerült leállítani a PicoClaw Runtime-ot' + }, + connection: { + runtime: { + checking: 'Ellenőrzés', + ready: 'Runtime kész', + stopped: 'Runtime leállt', + unavailable: 'Runtime nem érhető el', + configError: 'Konfigurációs hiba' + }, + transport: { + connecting: 'Csatlakozás', + connected: 'Csatlakoztatva' + }, + run: { + idle: 'Üresjárat', + busy: 'Elfoglalt' + } + }, + message: { + toolAction: 'Akció', + observation: 'Megfigyelés', + screenshot: 'Képernyőkép' + }, + overlay: { + locked: 'PicoClaw vezérli az eszközt. A kézi bevitel szünetel.' + }, + install: { + install: 'PicoClaw telepítése', + installing: 'PicoClaw telepítése folyamatban', + success: 'PicoClaw sikeresen telepítve', + failed: 'Nem sikerült telepíteni PicoClaw', + uninstalling: 'Runtime eltávolítása...', + uninstalled: 'A Runtime sikeresen eltávolítva.', + uninstallFailed: 'Az eltávolítás nem sikerült.', + requiredTitle: 'PicoClaw nincs telepítve', + requiredDescription: + 'Telepítse a PicoClaw alkalmazást a PicoClaw Runtime elindítása előtt.', + progressDescription: 'PicoClaw letöltése és telepítése folyamatban van.', + stages: { + preparing: 'Felkészülés', + downloading: 'Letöltés', + extracting: 'Kibontás', + installing: 'Telepítés folyamatban', + installed: 'Telepítve', + install_timeout: 'Időtúllépés', + install_failed: 'Sikertelen' + } + }, + model: { + requiredTitle: 'Modellkonfiguráció szükséges', + requiredDescription: 'A PicoClaw chat használata előtt konfigurálja az PicoClaw modellt.', + docsTitle: 'Konfigurációs útmutató', + docsDesc: 'Támogatott modellek és protokollok', + menuLabel: 'Modell konfigurálása', + modelIdentifier: 'Modellazonosító', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API-kulcs', + apiKeyPlaceholder: 'Adja meg a modell API-kulcsát', + save: 'Mentés', + saving: 'Mentés', + saved: 'A modell konfigurációja mentve', + saveFailed: 'Nem sikerült menteni a modellkonfigurációt', + invalid: 'A modellazonosító, az API Base URL és az API-kulcs megadása kötelező' + }, + uninstall: { + menuLabel: 'Eltávolítás', + confirmTitle: 'Eltávolítás PicoClaw', + confirmContent: + 'Biztosan eltávolítja a következőt: PicoClaw? Ezzel törli a végrehajtható fájlt és az összes konfigurációs fájlt.', + confirmOk: 'Eltávolítás', + confirmCancel: 'Mégse' + }, + history: { + title: 'Előzmények', + loading: 'Munkamenetek betöltése...', + emptyTitle: 'Még nincs előzmény', + emptyDescription: 'A korábbi PicoClaw munkamenetek itt jelennek meg.', + loadFailed: 'Nem sikerült betölteni a munkamenet-előzményeket', + deleteFailed: 'Nem sikerült törölni a munkamenetet', + deleteConfirmTitle: 'Munkamenet törlése', + deleteConfirmContent: 'Biztos, hogy törölni szeretné a következőt: "{{title}}"?', + deleteConfirmOk: 'Törlés', + deleteConfirmCancel: 'Mégse', + messageCount_one: '{{count}} üzenet', + messageCount_other: '{{count}} üzenet' + }, + config: { + startRuntime: 'PicoClaw indítása', + stopRuntime: 'PicoClaw leállítása' + }, + start: { + title: 'PicoClaw indítása', + description: 'Indítsa el a Runtime-ot a PicoClaw segéd használatának megkezdéséhez.' + } + }, + error: { + title: 'Problémába ütköztünk', + refresh: 'Frissítés' + }, + fullscreen: { + toggle: 'Teljes képernyő váltás' + }, + menu: { + collapse: 'Menü összecsukása', + expand: 'Bontsa ki a menüt' } } }; diff --git a/web/src/i18n/locales/id.ts b/web/src/i18n/locales/id.ts index f4fc858..42341cb 100644 --- a/web/src/i18n/locales/id.ts +++ b/web/src/i18n/locales/id.ts @@ -1,7 +1,7 @@ const id = { translation: { head: { - desktop: 'Remote Desktop', + desktop: 'Desktop jarak jauh', login: 'Masuk', changePassword: 'Ubah Sandi', terminal: 'Terminal', @@ -17,6 +17,8 @@ const id = { noAccount: 'Gagal mendapatkan informasi user, silahkan segarkan halaman atau atur ulang sandi', invalidUser: 'invalid username or password', + locked: 'Terlalu banyak login, silakan coba lagi nanti', + globalLocked: 'Sistem dalam perlindungan, silakan coba lagi nanti', error: 'terjadi kesalahan tak terduga', changePassword: 'Ganti Sandi', changePasswordDesc: 'Untuk keamanan perangkat Anda, silakan ubah kata sandi masuk web.', @@ -30,25 +32,37 @@ const id = { tips: { reset1: 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', - reset2: 'For detailed steps, please consult this document:', - reset3: 'Web default account:', - reset4: 'SSH default account:', - change1: 'Please note that this action will change the following passwords:', - change2: 'Web login password', - change3: 'System root password (SSH login password)', - change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + reset2: 'Untuk langkah-langkah rinci, lihat dokumen ini:', + reset3: 'Akun web default:', + reset4: 'Akun SSH default:', + change1: 'Perhatikan bahwa tindakan ini akan mengubah kata sandi berikut:', + change2: 'Kata sandi login web', + change3: 'Kata sandi root sistem (kata sandi login SSH)', + change4: 'Untuk mengatur ulang kata sandi, tekan dan tahan tombol BOOT pada NanoKVM.' } }, wifi: { title: 'Wi-Fi', - description: 'Configure Wi-Fi for NanoKVM', + description: 'Konfigurasi Wi-Fi untuk NanoKVM', success: 'Please check the network status of NanoKVM and visit the new IP address.', - failed: 'Operation failed, please try again.', + failed: 'Operasi gagal, silakan coba lagi.', + invalidMode: + 'Mode saat ini tidak mendukung pengaturan jaringan. Silakan buka perangkat Anda dan aktifkan mode konfigurasi Wi-Fi.', confirmBtn: 'Ok', - finishBtn: 'Finished' + finishBtn: 'Selesai', + ap: { + authTitle: 'Otentikasi Diperlukan', + authDescription: 'Silakan masukkan kata sandi AP untuk melanjutkan', + authFailed: 'Kata sandi AP tidak valid', + passPlaceholder: 'AP kata sandi', + verifyBtn: 'Verifikasi' + } }, screen: { + scale: 'Skala', + title: 'Layar', video: 'Mode Video', + videoDirectTips: 'Aktifkan HTTPS di "Pengaturan > Perangkat" untuk menggunakan mode ini', resolution: 'Resolusi', auto: 'Otomatis', autoTips: @@ -63,17 +77,65 @@ const id = { frameDetect: 'Deteksi bingkai', frameDetectTip: 'Hitung selisih antar frame. Hentikan transmisi aliran video saat tidak ada perubahan yang terdeteksi di layar host jarak jauh.', - resetHdmi: 'Reset HDMI' + resetHdmi: 'Atur ulang HDMI' }, keyboard: { + title: 'Keyboard', paste: 'Tempel', tips: 'Hanya huruf dan simbol keyboard standar yang didukung', placeholder: 'Silahkan isi', submit: 'Kirimkan', virtual: 'Keyboard', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Membaca dari Papan Klip', + clipboardPermissionDenied: + 'Izin papan klip ditolak. Harap izinkan akses clipboard di browser Anda.', + clipboardReadError: 'Gagal membaca papan klip', + dropdownEnglish: 'Bahasa Inggris', + dropdownGerman: 'Jerman', + dropdownFrench: 'Perancis', + dropdownRussian: 'Rusia', + shortcut: { + title: 'Pintasan', + custom: 'Adat', + capture: 'Klik di sini untuk mengambil pintasan', + clear: 'Jelas', + save: 'Simpan', + captureTips: + 'Menangkap tombol tingkat sistem (seperti tombol Windows) memerlukan izin layar penuh.', + enterFullScreen: 'Beralih ke mode layar penuh.' + }, + leaderKey: { + title: 'Tombol Leader', + desc: 'Lewati batasan browser dan kirim pintasan sistem langsung ke host jarak jauh.', + howToUse: 'Cara Menggunakan', + simultaneous: { + title: 'Mode Simultan', + desc1: 'Tekan dan tahan tombol Leader, lalu tekan pintasan.', + desc2: 'Intuitif, tetapi mungkin bertentangan dengan pintasan sistem.' + }, + sequential: { + title: 'Mode Berurutan', + desc1: + 'Tekan tombol Leader → tekan pintasan secara berurutan → tekan tombol Leader lagi.', + desc2: 'Memerlukan lebih banyak langkah, namun sepenuhnya menghindari konflik sistem.' + }, + enable: 'Aktifkan tombol Leader', + tip: 'Saat ditetapkan sebagai tombol Leader, tombol ini hanya berfungsi sebagai pemicu pintasan dan kehilangan perilaku defaultnya.', + placeholder: 'Tekan tombol Leader', + shiftRight: 'Shift kanan', + ctrlRight: 'Ctrl kanan', + metaRight: 'Win kanan', + submit: 'Kirimkan', + recorder: { + rec: 'REKAM', + activate: 'Aktifkan tombol', + input: 'Silakan tekan pintasan...' + } + } }, mouse: { + title: 'Tikus', + cursor: 'Gaya kursor', default: 'Kursor bawaan', pointer: 'Kursor penunjuk', cell: 'Kursor cell', @@ -83,17 +145,41 @@ const id = { mode: 'Mode tetikus', absolute: 'Mode absolut', relative: 'Mode relatif', + direction: 'Arah roda gulir', + scrollUp: 'Gulir ke atas', + scrollDown: 'Gulir ke bawah', + speed: 'Kecepatan roda gulir', + fast: 'Cepat', + slow: 'Lambat', requestPointer: 'Menggunakan mode relatf. Silakan klik desktop untuk mendapatkan penunjuk tetikus.', - resetHid: 'Setel ulang HID' + resetHid: 'Setel ulang HID', + hidOnly: { + title: 'Mode hanya HID', + desc: 'Jika mouse dan keyboard Anda berhenti merespons dan menyetel ulang HID tidak membantu, mungkin ada masalah kompatibilitas antara NanoKVM dan perangkat. Coba aktifkan mode HID-Only untuk kompatibilitas yang lebih baik.', + tip1: 'Mengaktifkan mode HID-Hanya akan melepas U-disk virtual dan jaringan virtual', + tip2: 'Dalam mode HID-Only, pemasangan gambar dinonaktifkan', + tip3: 'NanoKVM akan otomatis reboot setelah berpindah mode', + enable: 'Aktifkan mode HID-Hanya', + disable: 'Nonaktifkan mode HID-Hanya' + } }, image: { title: 'Gambar', loading: 'Memuat...', empty: 'Tidak ada yang ditemukan', + mountMode: 'Mode pemasangan', mountFailed: 'Pemasangan Gagal', mountDesc: 'Di beberapa sistem, perlu mengeluarkan disk virtual pada host jarak jauh sebelum memasang gambar.', + unmountFailed: 'Pelepasan gagal', + unmountDesc: + 'Pada beberapa sistem, Anda perlu mengeluarkan secara manual dari host jarak jauh sebelum melepas gambar.', + refresh: 'Segarkan daftar gambar', + attention: 'Perhatian', + deleteConfirm: 'Apakah Anda yakin ingin menghapus gambar ini?', + okBtn: 'Ya', + cancelBtn: 'Tidak', tips: { title: 'Cara mengunggah', usb1: 'Hubungkan NanoKVM ke komputer Anda melalui USB.', @@ -130,6 +216,16 @@ const id = { serialPort: 'Port Serial', serialPortPlaceholder: 'Silahkan masukkan port serial', baudrate: 'Baud rate', + parity: 'Paritas', + parityNone: 'Tidak ada', + parityEven: 'Genap', + parityOdd: 'Ganjil', + flowControl: 'Kontrol aliran', + flowControlNone: 'Tidak ada', + flowControlSoft: 'Perangkat lunak', + flowControlHard: 'Perangkat keras', + dataBits: 'Bit data', + stopBits: 'Hentikan bit', confirm: 'Ok' }, wol: { @@ -139,40 +235,73 @@ const id = { input: 'Silahkan masukkan MAC', ok: 'Ok' }, + download: { + title: 'Pengunduh Gambar', + input: 'Silakan masukkan gambar jarak jauh URL', + ok: 'Ok', + disabled: 'Partisi /data adalah RO, jadi kami tidak dapat mengunduh gambarnya', + uploadbox: 'Letakkan file di sini atau klik untuk memilih', + inputfile: 'Silakan masukkan File gambar', + NoISO: 'Tidak ada ISO' + }, power: { title: 'Daya', + showConfirm: 'Konfirmasi', + showConfirmTip: 'Pengoperasian listrik memerlukan konfirmasi tambahan', reset: 'Mulai Ulang', power: 'Daya', powerShort: 'Data (tekan sebentar)', - powerLong: 'Power (tekan lama)' + powerLong: 'Power (tekan lama)', + resetConfirm: 'Lanjutkan operasi penyetelan ulang?', + powerConfirm: 'Lanjutkan pengoperasian listrik?', + okBtn: 'Ya', + cancelBtn: 'Tidak' }, settings: { - title: 'Settings', + title: 'Pengaturan', about: { title: 'Tentang NanoKVM', information: 'Informasi', ip: 'IP', mdns: 'mDNS', application: 'Versi Aplikasi', - applicationTip: 'NanoKVM web application version', + applicationTip: 'Versi aplikasi web NanoKVM', image: 'Version Gambar', - imageTip: 'NanoKVM system image version', + imageTip: 'Versi image sistem NanoKVM', deviceKey: 'Kunci Perangkat', - community: 'Komunitas' + community: 'Komunitas', + hostname: 'Nama Host', + hostnameUpdated: 'Nama host diperbarui. Nyalakan ulang untuk menerapkan.', + ipType: { + Wired: 'Berkabel', + Wireless: 'Nirkabel', + Other: 'Lainnya' + } }, appearance: { - title: 'Appearance', - display: 'Display', - language: 'Language', - menuBar: 'Menu Bar', - menuBarDesc: 'Display icons in the menu bar' + title: 'Tampilan', + display: 'Layar', + language: 'Bahasa', + languageDesc: 'Pilih bahasa untuk antarmuka', + webTitle: 'Judul Web', + webTitleDesc: 'Menyesuaikan judul halaman web', + menuBar: { + title: 'Bilah Menu', + mode: 'Mode Tampilan', + modeDesc: 'Menampilkan bilah menu di layar', + modeOff: 'Mati', + modeAuto: 'Sembunyikan otomatis', + modeAlways: 'Selalu terlihat', + icons: 'Ikon Submenu', + iconsDesc: 'Menampilkan ikon submenu di bilah menu' + } }, device: { - title: 'Device', + title: 'Perangkat', oled: { title: 'OLED', description: 'OLED screen automatically sleep', - 0: 'Never', + 0: 'Tidak pernah', 15: '15 sec', 30: '30 sec', 60: '1 min', @@ -180,12 +309,54 @@ const id = { 300: '5 min', 600: '10 min', 1800: '30 min', - 3600: '1 hour' + 3600: '1 jam' }, - disk: 'Virtual Disk', + ssh: { + description: 'Aktifkan akses jarak jauh SSH', + tip: 'Tetapkan kata sandi yang kuat sebelum mengaktifkan (Akun - Ubah Kata Sandi)' + }, + advanced: 'Pengaturan Lanjutan', + swap: { + title: 'Tukar', + disable: 'Nonaktifkan', + description: 'Atur ukuran file swap', + tip: 'Mengaktifkan fitur ini dapat mempersingkat masa pakai kartu SD Anda!' + }, + mouseJiggler: { + title: 'Tikus Jiggler', + description: 'Mencegah host jarak jauh tertidur', + disable: 'Nonaktifkan', + absolute: 'Mode Absolut', + relative: 'Mode Relatif' + }, + mdns: { + description: 'Aktifkan layanan penemuan mDNS', + tip: 'Mematikan jika tidak diperlukan' + }, + hdmi: { + description: 'Aktifkan keluaran HDMI/monitor' + }, + autostart: { + title: 'Pengaturan Skrip Mulai Otomatis', + description: 'Mengelola skrip yang berjalan secara otomatis saat startup sistem', + new: 'Baru', + deleteConfirm: 'Apa kamu yakin menghapus data ini?', + yes: 'Ya', + no: 'Tidak', + scriptName: 'Nama Skrip Mulai Otomatis', + scriptContent: 'Konten Skrip Mulai Otomatis', + settings: 'Pengaturan' + }, + hidOnly: 'HID-Mode Hanya', + hidOnlyDesc: 'Berhenti meniru perangkat virtual, hanya mempertahankan kontrol dasar HID', + disk: 'Disk virtual', diskDesc: 'Mount virtual U-disk on the remote host', - network: 'Virtual Network', - networkDesc: 'Mount virtual network card on the remote host' + network: 'Jaringan virtual', + networkDesc: 'Pasang kartu jaringan virtual pada host jarak jauh', + reboot: 'Mulai ulang', + rebootDesc: 'Apakah Anda yakin ingin me-reboot NanoKVM?', + okBtn: 'Ya', + cancelBtn: 'Tidak' }, network: { title: 'Jaringan', @@ -228,7 +399,7 @@ const id = { networkDetails: 'Detail Jaringan', interface: 'Antarmuka', ipAddress: 'Alamat IP', - subnetMask: 'Subnet Mask', + subnetMask: 'Subnet mask', router: 'Router', none: 'Tidak ada' } @@ -236,9 +407,12 @@ const id = { tailscale: { title: 'Tailscale', memory: { - title: 'Memory optimization', - tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect.", - disable: 'Disable' + title: 'Optimasi memori', + tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect." + }, + swap: { + title: 'Tukar memori', + tip: 'Jika masalah terus berlanjut setelah mengaktifkan pengoptimalan memori, coba aktifkan memori swap. Ini menetapkan ukuran file swap ke 256MB secara default, yang dapat disesuaikan di "Pengaturan > Perangkat".' }, restart: 'Are you sure to restart Tailscale?', stop: 'Are you sure to stop Tailscale?', @@ -255,6 +429,8 @@ const id = { upTailscale: 'Unggah tailscale ke direktori NanoKVM /usr/bin/', upTailscaled: 'Unggah tailscaled ke direktori NanoKVM /usr/sbin/', refresh: 'Segarkan halaman ini', + notRunning: 'Tailscale tidak berjalan. Silakan mulai untuk melanjutkan.', + run: 'Mulai', notLogin: 'Perangkat belum ditautkan. Silakan masuk dan tautkan perangkat ini ke akun Anda.', urlPeriod: 'Url ini berlaku selama 10 menit', @@ -265,7 +441,9 @@ const id = { deviceIP: 'IP Perangkat', account: 'Akun', logout: 'Keluar', - logout2: 'Yakin untuk keluar?', + logoutDesc: 'Apakah Anda yakin ingin logout?', + uninstall: 'Copot pemasangan Tailscale', + uninstallDesc: 'Apakah Anda yakin ingin menghapus instalan Tailscale?', okBtn: 'Yes', cancelBtn: 'No' }, @@ -277,15 +455,161 @@ const id = { available: 'Ada pembaruan baru. apa kamu mau memperbarui?', updating: 'Pembaruan dimulai. Silahkan tunggu...', confirm: 'Konfirmasi', - cancel: 'Batalkan' + cancel: 'Batalkan', + preview: 'Pratinjau Pembaruan', + previewDesc: 'Dapatkan akses awal ke fitur dan peningkatan baru', + previewTip: + 'Perlu diketahui bahwa rilis pratinjau mungkin mengandung bug atau fungsi yang tidak lengkap!', + offline: { + title: 'Pembaruan Offline', + desc: 'Perbarui melalui paket instalasi lokal', + upload: 'Mengunggah', + invalidName: 'Format nama file tidak valid. Silakan unduh dari rilis GitHub.', + updateFailed: 'Gagal memperbarui, tolong coba lagi.' + } }, account: { - title: 'Account', - webAccount: 'Web Account Name', - password: 'Password', + title: 'Akun', + webAccount: 'Nama akun web', + password: 'Kata sandi', updateBtn: 'Update', - logoutBtn: 'Logout' + logoutBtn: 'Keluar', + logoutDesc: 'Apakah Anda yakin ingin logout?', + okBtn: 'Ya', + cancelBtn: 'Tidak' } + }, + picoclaw: { + title: 'PicoClaw Asisten', + empty: 'Buka panel dan mulai tugas untuk memulai.', + inputPlaceholder: 'Jelaskan apa yang Anda ingin PicoClaw lakukan', + newConversation: 'Percakapan baru', + processing: 'Memproses...', + agent: { + defaultTitle: 'Asisten umum', + defaultDescription: 'Obrolan umum, pencarian, dan bantuan ruang kerja.', + kvmTitle: 'Kontrol jarak jauh', + kvmDescription: 'Operasikan host jarak jauh melalui NanoKVM.', + switched: 'Peran agen dialihkan', + switchFailed: 'Gagal mengganti peran agen' + }, + send: 'Kirim', + cancel: 'Batalkan', + status: { + connecting: 'Menghubungkan ke gerbang...', + connected: 'Sesi PicoClaw terhubung', + disconnected: 'Sesi PicoClaw ditutup', + stopped: 'Permintaan penghentian terkirim', + runtimeStarted: 'Runtime PicoClaw dimulai', + runtimeStartFailed: 'Gagal memulai Runtime PicoClaw', + runtimeStopped: 'Runtime PicoClaw dihentikan', + runtimeStopFailed: 'Gagal menghentikan Runtime PicoClaw' + }, + connection: { + runtime: { + checking: 'Memeriksa', + ready: 'Runtime siap', + stopped: 'Runtime dihentikan', + unavailable: 'Runtime tidak tersedia', + configError: 'Kesalahan konfigurasi' + }, + transport: { + connecting: 'Menghubungkan', + connected: 'Terhubung' + }, + run: { + idle: 'Menganggur', + busy: 'Sibuk' + } + }, + message: { + toolAction: 'Aksi', + observation: 'Pengamatan', + screenshot: 'Tangkapan layar' + }, + overlay: { + locked: 'PicoClaw sedang mengendalikan perangkat. Input manual dijeda.' + }, + install: { + install: 'Instal PicoClaw', + installing: 'Menginstal PicoClaw', + success: 'PicoClaw berhasil diinstal', + failed: 'Gagal menginstal PicoClaw', + uninstalling: 'Mencopot pemasangan runtime...', + uninstalled: 'Runtime berhasil di-uninstall.', + uninstallFailed: 'Pencopotan pemasangan gagal.', + requiredTitle: 'PicoClaw tidak diinstal', + requiredDescription: 'Instal PicoClaw sebelum memulai runtime PicoClaw.', + progressDescription: 'PicoClaw sedang diunduh dan diinstal.', + stages: { + preparing: 'Mempersiapkan', + downloading: 'Mengunduh', + extracting: 'Mengekstraksi', + installing: 'Memasangkan', + installed: 'Terpasang', + install_timeout: 'Waktu Habis', + install_failed: 'Gagal' + } + }, + model: { + requiredTitle: 'Konfigurasi model diperlukan', + requiredDescription: 'Konfigurasikan model PicoClaw sebelum menggunakan obrolan PicoClaw.', + docsTitle: 'Panduan Konfigurasi', + docsDesc: 'Model dan protokol yang didukung', + menuLabel: 'Konfigurasi model', + modelIdentifier: 'Pengenal Model', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'Kunci API', + apiKeyPlaceholder: 'Masukkan kunci API model', + save: 'Simpan', + saving: 'Menyimpan', + saved: 'Konfigurasi model disimpan', + saveFailed: 'Gagal menyimpan konfigurasi model', + invalid: 'Pengidentifikasi model, API Base URL, dan kunci API wajib diisi' + }, + uninstall: { + menuLabel: 'Copot pemasangan', + confirmTitle: 'Copot pemasangan PicoClaw', + confirmContent: + 'Apakah Anda yakin ingin menghapus instalan PicoClaw? Ini akan menghapus semua file yang dapat dieksekusi dan konfigurasi.', + confirmOk: 'Copot pemasangan', + confirmCancel: 'Batalkan' + }, + history: { + title: 'Riwayat', + loading: 'Memuat sesi...', + emptyTitle: 'Belum ada riwayat', + emptyDescription: 'Sesi PicoClaw sebelumnya akan muncul di sini.', + loadFailed: 'Gagal memuat riwayat sesi', + deleteFailed: 'Gagal menghapus sesi', + deleteConfirmTitle: 'Hapus sesi', + deleteConfirmContent: 'Apakah Anda yakin ingin menghapus "{{title}}"?', + deleteConfirmOk: 'Hapus', + deleteConfirmCancel: 'Batalkan', + messageCount_one: '{{count}} pesan', + messageCount_other: '{{count}} pesan' + }, + config: { + startRuntime: 'Mulai PicoClaw', + stopRuntime: 'Hentikan PicoClaw' + }, + start: { + title: 'Mulai PicoClaw', + description: 'Mulai runtime untuk mulai menggunakan asisten PicoClaw.' + } + }, + error: { + title: 'Kami mengalami masalah', + refresh: 'Segarkan' + }, + fullscreen: { + toggle: 'Beralih Layar Penuh' + }, + menu: { + collapse: 'Tutup Menu', + expand: 'Perluas Menu' } } }; diff --git a/web/src/i18n/locales/it.ts b/web/src/i18n/locales/it.ts index 3f52595..2893cbb 100644 --- a/web/src/i18n/locales/it.ts +++ b/web/src/i18n/locales/it.ts @@ -17,6 +17,8 @@ const it = { noAccount: 'Impossibile ottenere informazioni utente, aggiorna la pagina o reimposta la password', invalidUser: 'Nome utente o password non validi', + locked: 'Troppi accessi, riprova più tardi', + globalLocked: 'Sistema sotto protezione, riprova più tardi', error: 'Errore imprevisto', changePassword: 'Cambia Password', changePasswordDesc: @@ -31,25 +33,38 @@ const it = { tips: { reset1: 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', - reset2: 'For detailed steps, please consult this document:', - reset3: 'Web default account:', - reset4: 'SSH default account:', - change1: 'Please note that this action will change the following passwords:', - change2: 'Web login password', - change3: 'System root password (SSH login password)', - change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + reset2: 'Per i passaggi dettagliati, consulta questo documento:', + reset3: 'Account web predefinito:', + reset4: 'Account SSH predefinito:', + change1: 'Tieni presente che questa azione modificherà le seguenti password:', + change2: 'Password di accesso web', + change3: 'Password root di sistema (password di accesso SSH)', + change4: 'Per reimpostare le password, tieni premuto il pulsante BOOT sul NanoKVM.' } }, wifi: { title: 'Wi-Fi', - description: 'Configure Wi-Fi for NanoKVM', + description: 'Configura il Wi-Fi per NanoKVM', success: 'Please check the network status of NanoKVM and visit the new IP address.', - failed: 'Operation failed, please try again.', + failed: 'Operazione non riuscita, riprova.', + invalidMode: + 'La modalità corrente non supporta la configurazione di rete. Vai al tuo dispositivo e abilita la modalità di configurazione Wi-Fi.', confirmBtn: 'Ok', - finishBtn: 'Finished' + finishBtn: 'Completato', + ap: { + authTitle: 'Autenticazione richiesta', + authDescription: 'Inserisci la password AP per continuare', + authFailed: 'Password AP non valida', + passPlaceholder: 'AP password', + verifyBtn: 'Verifica' + } }, screen: { + scale: 'Scala', + title: 'Schermo', video: 'Modalità video', + videoDirectTips: + 'Abilita HTTPS in "Impostazioni > Dispositivo" per utilizzare questa modalità', resolution: 'Risoluzione', auto: 'Automatico', autoTips: @@ -64,17 +79,65 @@ const it = { frameDetect: 'Rilevamento Frame', frameDetectTip: 'Calcola la differenza tra i frame. Interrompe la trasmissione del flusso video quando non vengono rilevate modifiche sullo schermo del dispositivo remoto.', - resetHdmi: 'Reset HDMI' + resetHdmi: 'Reimposta HDMI' }, keyboard: { + title: 'Tastiera', paste: 'Incolla', tips: 'Sono supportati solo lettere e simboli standard della tastiera', placeholder: 'Inserisci testo', submit: 'Invia', virtual: 'Tastiera', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Leggi dagli Appunti', + clipboardPermissionDenied: + "Autorizzazione Appunti negata. Consenti l'accesso agli appunti nel tuo browser.", + clipboardReadError: 'Impossibile leggere gli appunti', + dropdownEnglish: 'Inglese', + dropdownGerman: 'Tedesco', + dropdownFrench: 'Francese', + dropdownRussian: 'Russo', + shortcut: { + title: 'Scorciatoie', + custom: 'Personalizzato', + capture: 'Fai clic qui per acquisire il collegamento', + clear: 'Cancella', + save: 'Salva', + captureTips: + 'La cattura dei tasti di sistema (come il tasto Windows) richiede l’autorizzazione a schermo intero.', + enterFullScreen: 'Attiva/disattiva la modalità a schermo intero.' + }, + leaderKey: { + title: 'Tasto Leader', + desc: "Ignora le restrizioni del browser e invia collegamenti di sistema direttamente all'host remoto.", + howToUse: 'Come usare', + simultaneous: { + title: 'Modalità simultanea', + desc1: 'Tieni premuto il tasto Leader, quindi premi la scorciatoia.', + desc2: 'Intuitivo, ma potrebbe entrare in conflitto con le scorciatoie di sistema.' + }, + sequential: { + title: 'Modalità sequenziale', + desc1: + 'Premi il tasto Leader → premi la scorciatoia in sequenza → premi di nuovo il tasto Leader.', + desc2: 'Richiede più passaggi, ma evita completamente i conflitti di sistema.' + }, + enable: 'Abilita tasto Leader', + tip: 'Quando assegnato come tasto Leader, questo tasto funziona solo come attivatore di scorciatoie e perde il comportamento predefinito.', + placeholder: 'Premi il tasto Leader', + shiftRight: 'Shift destro', + ctrlRight: 'Ctrl destro', + metaRight: 'Win destro', + submit: 'Invia', + recorder: { + rec: 'REC', + activate: 'Attiva i tasti', + input: 'Premi la scorciatoia...' + } + } }, mouse: { + title: 'Mouse', + cursor: 'Stile cursore', default: 'Cursore predefinito', pointer: 'Cursore a puntatore', cell: 'Cursore a cella', @@ -84,17 +147,41 @@ const it = { mode: 'Modalità mouse', absolute: 'Modalità assoluta', relative: 'Modalità relativa', + direction: 'Direzione della rotellina', + scrollUp: "Scorri verso l'alto", + scrollDown: 'Scorri verso il basso', + speed: 'Velocità della rotellina', + fast: 'Veloce', + slow: 'Lento', requestPointer: 'Usando la modalità relativa. Clicca sul desktop per ottenere il puntatore del mouse.', - resetHid: 'Reimposta HID' + resetHid: 'Reimposta HID', + hidOnly: { + title: 'Modalità solo HID', + desc: 'Se il mouse e la tastiera smettono di rispondere e il ripristino di HID non aiuta, potrebbe trattarsi di un problema di compatibilità tra NanoKVM e il dispositivo. Prova ad abilitare la modalità HID-Only per una migliore compatibilità.', + tip1: "L'abilitazione della modalità HID-Solo smonterà il disco U virtuale e la rete virtuale", + tip2: "Nella modalità HID-Only, il montaggio dell'immagine è disabilitato", + tip3: 'NanoKVM si riavvierà automaticamente dopo aver cambiato modalità', + enable: 'Abilita la modalità HID-Solo', + disable: 'Disabilita la modalità HID-Solo' + } }, image: { title: 'Immagini', loading: 'Caricamento...', empty: 'Nessun risultato', + mountMode: 'Modalità di montaggio', mountFailed: 'Montaggio immagine fallito', mountDesc: "In alcuni sistemi, è necessario espellere il disco virtuale sull'host remoto prima di montare l'immagine.", + unmountFailed: 'Smontaggio non riuscito', + unmountDesc: + "Su alcuni sistemi, è necessario espellere manualmente l'host remoto prima di smontare l'immagine.", + refresh: "Aggiorna l'elenco delle immagini", + attention: 'Attenzione', + deleteConfirm: 'Sei sicuro di voler eliminare questa immagine?', + okBtn: 'Sì', + cancelBtn: 'No', tips: { title: 'Come caricare', usb1: 'Collega il NanoKVM al tuo computer tramite USB.', @@ -131,6 +218,16 @@ const it = { serialPort: 'Porta Seriale', serialPortPlaceholder: 'Inserisci la porta seriale', baudrate: 'Baud rate', + parity: 'Parità', + parityNone: 'Nessuno', + parityEven: 'Pari', + parityOdd: 'Dispari', + flowControl: 'Controllo del flusso', + flowControlNone: 'Nessuno', + flowControlSoft: 'Software', + flowControlHard: 'Hardware', + dataBits: 'Bit di dati', + stopBits: 'Bit di stop', confirm: 'Ok' }, wol: { @@ -140,40 +237,73 @@ const it = { input: 'Inserisci il MAC', ok: 'Ok' }, + download: { + title: 'Scaricatore di immagini', + input: "Inserisci un'immagine remota URL", + ok: 'Ok', + disabled: "La partizione /data è RO, quindi non possiamo scaricare l'immagine", + uploadbox: 'Rilascia il file qui o fai clic per selezionarlo', + inputfile: 'Inserisci il file immagine', + NoISO: 'Nessuna ISO' + }, power: { title: 'Accensione', + showConfirm: 'Conferma', + showConfirmTip: 'Le operazioni di alimentazione richiedono una conferma aggiuntiva', reset: 'Reimposta', power: 'Accensione', powerShort: 'Accensione (clic breve)', - powerLong: 'Accensione (clic lungo)' + powerLong: 'Accensione (clic lungo)', + resetConfirm: "Procedere con l'operazione di ripristino?", + powerConfirm: "Procedere con l'operazione di accensione?", + okBtn: 'Sì', + cancelBtn: 'No' }, settings: { - title: 'Settings', + title: 'Impostazioni', about: { title: 'Informazioni su NanoKVM', information: 'Informazioni', ip: 'IP', mdns: 'mDNS', application: 'Versione Applicazione', - applicationTip: 'NanoKVM web application version', + applicationTip: 'Versione dell’applicazione web NanoKVM', image: 'Versione Immagine', - imageTip: 'NanoKVM system image version', + imageTip: 'Versione dell’immagine di sistema NanoKVM', deviceKey: 'Chiave Dispositivo', - community: 'Comunità' + community: 'Comunità', + hostname: 'Nome host', + hostnameUpdated: 'Nome host aggiornato. Riavviare per applicare.', + ipType: { + Wired: 'Cablato', + Wireless: 'Senza fili', + Other: 'Altro' + } }, appearance: { - title: 'Appearance', - display: 'Display', - language: 'Language', - menuBar: 'Menu Bar', - menuBarDesc: 'Display icons in the menu bar' + title: 'Aspetto', + display: 'Schermo', + language: 'Lingua', + languageDesc: "Seleziona la lingua per l'interfaccia", + webTitle: 'Titolo web', + webTitleDesc: 'Personalizza il titolo della pagina web', + menuBar: { + title: 'Barra dei menu', + mode: 'Modalità di visualizzazione', + modeDesc: 'Visualizza la barra dei menu sullo schermo', + modeOff: 'Spento', + modeAuto: 'Nascondi automaticamente', + modeAlways: 'Sempre visibile', + icons: 'Icone dei sottomenu', + iconsDesc: 'Visualizza le icone dei sottomenu nella barra dei menu' + } }, device: { - title: 'Device', + title: 'Dispositivo', oled: { title: 'OLED', description: 'OLED screen automatically sleep', - 0: 'Never', + 0: 'Mai', 15: '15 sec', 30: '30 sec', 60: '1 min', @@ -181,12 +311,56 @@ const it = { 300: '5 min', 600: '10 min', 1800: '30 min', - 3600: '1 hour' + 3600: '1 ora' }, - disk: 'Virtual Disk', + ssh: { + description: 'Abilita SSH accesso remoto', + tip: "Imposta una password complessa prima dell'abilitazione (Account - Modifica password)" + }, + advanced: 'Impostazioni avanzate', + swap: { + title: 'Scambia', + disable: 'Disabilita', + description: 'Imposta la dimensione del file di scambio', + tip: 'Abilitare questa funzione potrebbe ridurre la durata utile della tua scheda SD!' + }, + mouseJiggler: { + title: 'Muovi il mouse', + description: "Impedisce la sospensione dell'host remoto", + disable: 'Disabilita', + absolute: 'Modalità assoluta', + relative: 'Modalità relativa' + }, + mdns: { + description: 'Abilita il servizio di rilevamento mDNS', + tip: 'Spegnerlo se non è necessario' + }, + hdmi: { + description: 'Abilita HDMI/monitora uscita' + }, + autostart: { + title: 'Impostazioni script di avvio automatico', + description: + "Gestisce gli script che vengono eseguiti automaticamente all'avvio del sistema", + new: 'Nuovo', + deleteConfirm: 'Sei sicuro di voler eliminare questo file?', + yes: 'Sì', + no: 'No', + scriptName: 'Nome script di avvio automatico', + scriptContent: 'Contenuto script di avvio automatico', + settings: 'Impostazioni' + }, + hidOnly: 'HID-Solo modalità', + hidOnlyDesc: + 'Smette di emulare i dispositivi virtuali, mantenendo solo il controllo di base HID', + disk: 'Disco virtuale', diskDesc: 'Mount virtual U-disk on the remote host', - network: 'Virtual Network', - networkDesc: 'Mount virtual network card on the remote host' + network: 'Rete virtuale', + networkDesc: 'Monta la scheda di rete virtuale sull’host remoto', + reboot: 'Riavvia', + rebootDesc: 'Sei sicuro di voler riavviare NanoKVM?', + okBtn: 'Sì', + cancelBtn: 'No' }, network: { title: 'Rete', @@ -207,7 +381,7 @@ const it = { }, tls: { description: 'Abilita protocollo HTTPS', - tip: 'Attenzione: l\'uso di HTTPS può aumentare la latenza, soprattutto in modalità video MJPEG.' + tip: "Attenzione: l'uso di HTTPS può aumentare la latenza, soprattutto in modalità video MJPEG." }, dns: { title: 'DNS', @@ -237,9 +411,12 @@ const it = { tailscale: { title: 'Tailscale', memory: { - title: 'Memory optimization', - tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect.", - disable: 'Disable' + title: 'Ottimizzazione memoria', + tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect." + }, + swap: { + title: 'Scambia memoria', + tip: 'Se i problemi persistono dopo aver abilitato l\'ottimizzazione della memoria, provare ad abilitare la memoria di scambio. Ciò imposta la dimensione del file di scambio su 256MB per impostazione predefinita, che può essere regolata in "Impostazioni > Dispositivo".' }, restart: 'Are you sure to restart Tailscale?', stop: 'Are you sure to stop Tailscale?', @@ -256,6 +433,8 @@ const it = { upTailscale: 'Carica tailscale nella directory /usr/bin/ del NanoKVM', upTailscaled: 'Carica tailscaled nella directory /usr/sbin/ del NanoKVM', refresh: 'Aggiorna la pagina corrente', + notRunning: 'Tailscale non è in esecuzione. Per favore avvialo per continuare.', + run: 'Inizio', notLogin: 'Il dispositivo non è ancora stato associato. Effettua il login e associa questo dispositivo al tuo account.', urlPeriod: 'Questo URL è valido per 10 minuti', @@ -266,7 +445,9 @@ const it = { deviceIP: 'IP Dispositivo', account: 'Account', logout: 'Disconnetti', - logout2: 'Sei sicuro di voler uscire?', + logoutDesc: 'Sei sicuro di voler uscire?', + uninstall: 'Disinstalla Tailscale', + uninstallDesc: 'Sei sicuro di voler disinstallare Tailscale?', okBtn: 'Yes', cancelBtn: 'No' }, @@ -278,15 +459,162 @@ const it = { available: 'Un aggiornamento è disponibile. Sei sicuro di voler aggiornare?', updating: 'Aggiornamento avviato. Attendere prego...', confirm: 'Conferma', - cancel: 'Annulla' + cancel: 'Annulla', + preview: 'Anteprima aggiornamenti', + previewDesc: "Ottieni l'accesso anticipato a nuove funzionalità e miglioramenti", + previewTip: + 'Tieni presente che le versioni di anteprima possono contenere bug o funzionalità incomplete!', + offline: { + title: 'Aggiornamenti offline', + desc: 'Aggiornamento tramite pacchetto di installazione locale', + upload: 'Carica', + invalidName: 'Formato nome file non valido. Si prega di scaricare dalle versioni GitHub.', + updateFailed: 'Aggiornamento fallito. Riprova.' + } }, account: { title: 'Account', - webAccount: 'Web Account Name', + webAccount: 'Nome account web', password: 'Password', updateBtn: 'Update', - logoutBtn: 'Logout' + logoutBtn: 'Esci', + logoutDesc: 'Sei sicuro di voler uscire?', + okBtn: 'Sì', + cancelBtn: 'No' } + }, + picoclaw: { + title: 'PicoClaw Assistente', + empty: "Apri il pannello e avvia un'attività da iniziare.", + inputPlaceholder: 'Descrivi cosa vuoi che PicoClaw faccia', + newConversation: 'Nuova conversazione', + processing: 'In elaborazione...', + agent: { + defaultTitle: 'Assistente generale', + defaultDescription: "Chat generale, ricerca e aiuto nell'area di lavoro.", + kvmTitle: 'Controllo remoto', + kvmDescription: "Gestisci l'host remoto tramite NanoKVM.", + switched: "Ruolo dell'agente cambiato", + switchFailed: "Impossibile cambiare il ruolo dell'agente" + }, + send: 'Invia', + cancel: 'Annulla', + status: { + connecting: 'Connessione al gateway...', + connected: 'Sessione PicoClaw connessa', + disconnected: 'Sessione PicoClaw chiusa', + stopped: 'Richiesta di interruzione inviata', + runtimeStarted: 'Runtime PicoClaw avviato', + runtimeStartFailed: 'Impossibile avviare il runtime PicoClaw', + runtimeStopped: 'Runtime PicoClaw interrotto', + runtimeStopFailed: 'Impossibile arrestare il runtime di PicoClaw' + }, + connection: { + runtime: { + checking: 'Controllo', + ready: 'Runtime pronto', + stopped: 'Runtime interrotto', + unavailable: 'Runtime non disponibile', + configError: 'Errore di configurazione' + }, + transport: { + connecting: 'Connessione', + connected: 'Connesso' + }, + run: { + idle: 'Inattivo', + busy: 'Occupato' + } + }, + message: { + toolAction: 'Azione', + observation: 'Osservazione', + screenshot: 'Schermata' + }, + overlay: { + locked: "PicoClaw sta controllando il dispositivo. L'immissione manuale è in pausa." + }, + install: { + install: 'Installa PicoClaw', + installing: 'Installazione PicoClaw', + success: 'PicoClaw installato correttamente', + failed: 'Impossibile installare PicoClaw', + uninstalling: 'Disinstallazione del runtime in corso...', + uninstalled: 'Runtime disinstallato correttamente.', + uninstallFailed: 'Disinstallazione non riuscita.', + requiredTitle: 'PicoClaw non è installato', + requiredDescription: 'Installa PicoClaw prima di avviare il runtime PicoClaw.', + progressDescription: 'PicoClaw è in fase di download e installazione.', + stages: { + preparing: 'Preparazione', + downloading: 'Download in corso', + extracting: 'Estrazione', + installing: 'Installazione in corso', + installed: 'Installato', + install_timeout: 'Timeout', + install_failed: 'Non riuscito' + } + }, + model: { + requiredTitle: 'È richiesta la configurazione del modello', + requiredDescription: + 'Configura il modello PicoClaw prima di utilizzare la chat di PicoClaw.', + docsTitle: 'Guida alla configurazione', + docsDesc: 'Modelli e protocolli supportati', + menuLabel: 'Configura modello', + modelIdentifier: 'Identificatore del modello', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'Chiave API', + apiKeyPlaceholder: 'Inserisci la chiave API del modello', + save: 'Salva', + saving: 'Salvataggio', + saved: 'Configurazione del modello salvata', + saveFailed: 'Impossibile salvare la configurazione del modello', + invalid: 'Identificatore del modello, API Base URL e chiave API sono obbligatori' + }, + uninstall: { + menuLabel: 'Disinstalla', + confirmTitle: 'Disinstalla PicoClaw', + confirmContent: + "Sei sicuro di voler disinstallare PicoClaw? Ciò eliminerà l'eseguibile e tutti i file di configurazione.", + confirmOk: 'Disinstalla', + confirmCancel: 'Annulla' + }, + history: { + title: 'Cronologia', + loading: 'Caricamento sessioni...', + emptyTitle: 'Nessuna cronologia ancora', + emptyDescription: 'Le sessioni PicoClaw precedenti verranno visualizzate qui.', + loadFailed: 'Impossibile caricare la cronologia della sessione', + deleteFailed: 'Impossibile eliminare la sessione', + deleteConfirmTitle: 'Elimina sessione', + deleteConfirmContent: 'Sei sicuro di voler eliminare "{{title}}"?', + deleteConfirmOk: 'Elimina', + deleteConfirmCancel: 'Annulla', + messageCount_one: '{{count}} messaggio', + messageCount_other: '{{count}} messaggi' + }, + config: { + startRuntime: 'Avvia PicoClaw', + stopRuntime: 'Arresta PicoClaw' + }, + start: { + title: 'Avvia PicoClaw', + description: "Avvia il runtime per iniziare a utilizzare l'assistente PicoClaw." + } + }, + error: { + title: 'Si è verificato un problema', + refresh: 'Aggiorna' + }, + fullscreen: { + toggle: 'Attiva/disattiva schermo intero' + }, + menu: { + collapse: 'Comprimi menu', + expand: 'Espandi il menu' } } }; diff --git a/web/src/i18n/locales/ja.ts b/web/src/i18n/locales/ja.ts index d4e77dd..5afd9e6 100644 --- a/web/src/i18n/locales/ja.ts +++ b/web/src/i18n/locales/ja.ts @@ -14,8 +14,11 @@ const ja = { placeholderPassword2: 'パスワードをもう一度入力してください', noEmptyUsername: 'ユーザー名は空にできません', noEmptyPassword: 'パスワードは空にできません', - noAccount: 'ユーザー情報の取得に失敗しました。ページを更新してもう一度お試しいただくか、パスワードをリセットしてください。', + noAccount: + 'ユーザー情報の取得に失敗しました。ページを更新してもう一度お試しいただくか、パスワードをリセットしてください。', invalidUser: 'ユーザー名またはパスワードが正しくありません', + locked: 'ログインが多すぎます。後でもう一度お試しください。', + globalLocked: 'システムは保護されています。後でもう一度試してください。', error: '不明なエラー', changePassword: 'パスワード変更', changePasswordDesc: 'デバイスのセキュリティのために、パスワードを変更してください!', @@ -34,7 +37,8 @@ const ja = { change1: 'この操作により、以下のパスワードも更新されることに注意してください:', change2: 'ウェブログインパスワード', change3: 'システム root パスワード(SSH ログインパスワード)', - change4: 'パスワードを忘れた場合は、NanoKVM の BOOT ボタンを長押ししてパスワードをリセットする必要があります。' + change4: + 'パスワードを忘れた場合は、NanoKVM の BOOT ボタンを長押ししてパスワードをリセットする必要があります。' } }, wifi: { @@ -42,9 +46,17 @@ const ja = { description: 'NanoKVM の Wi-Fi を設定する', success: 'NanoKVM のネットワークステータスを確認するにはデバイスにアクセスしてください。', failed: '操作に失敗しました。もう一度お試しください。', - invalidMode: '現在のモードではネットワーク設定はサポートされていません。デバイスで Wi-Fi 設定モードを有効にしてください。', + invalidMode: + '現在のモードではネットワーク設定はサポートされていません。デバイスで Wi-Fi 設定モードを有効にしてください。', confirmBtn: 'OK', - finishBtn: '完了' + finishBtn: '完了', + ap: { + authTitle: '認証が必要です', + authDescription: '続行するには、AP パスワードを入力してください', + authFailed: '無効な AP パスワード', + passPlaceholder: 'AP パスワード', + verifyBtn: '確認する' + } }, screen: { scale: '倍率', @@ -63,7 +75,8 @@ const ja = { qualityMedium: '中', qualityLow: '低', frameDetect: 'フレーム差分検出', - frameDetectTip: 'フレーム間の差異を計算し、リモートホストの画面が変更されない場合はビデオストリームの送信を停止します', + frameDetectTip: + 'フレーム間の差異を計算し、リモートホストの画面が変更されない場合はビデオストリームの送信を停止します', resetHdmi: 'HDMI をリセット' }, keyboard: { @@ -73,13 +86,22 @@ const ja = { placeholder: '入力してください', submit: '送信', virtual: '仮想キーボード', + readClipboard: 'クリップボードから読み取る', + clipboardPermissionDenied: + 'クリップボードのアクセス許可が拒否されました。ブラウザでクリップボードへのアクセスを許可してください。', + clipboardReadError: 'クリップボードの読み取りに失敗しました', + dropdownEnglish: '英語', + dropdownGerman: 'ドイツ語', + dropdownFrench: 'フランス語', + dropdownRussian: 'ロシア語', shortcut: { title: 'ショートカット', custom: 'カスタム', capture: 'ショートカットをキャプチャするにはここをクリックしてください', clear: 'クリア', save: '保存', - captureTips: 'システムレベルのキー(Windows キーなど)をキャプチャするには、全画面表示の権限が必要です。', + captureTips: + 'Windows キーなどのシステムレベルのキーを取得するには、全画面表示の許可が必要です。', enterFullScreen: '全画面モードに切り替えます。' }, leaderKey: { @@ -88,16 +110,17 @@ const ja = { howToUse: '使用方法', simultaneous: { title: '同時モード', - desc1: 'リーダーキーを押したまま、ショートカットキーを押します。', - desc2: '操作は直感的ですが、システムの使用状況により一部のショートカットキーが機能しない場合があります。' + desc1: 'リーダーキーを押したまま、ショートカットを押します。', + desc2: + '操作は直感的ですが、システムの使用状況により一部のショートカットキーが機能しない場合があります。' }, sequential: { title: 'シーケンシャルモード', - desc1: '【リーダーキー】をクリックして開始 →【ショートカットキー】を順にクリック →【リーダーキー】をクリックして終了します。', + desc1: 'リーダーキーを押す → ショートカットを順番に押す → リーダーキーをもう一度押す。', desc2: 'いくつかの手順が必要ですが、システムキーの競合を完全に回避します。' }, enable: 'リーダーキーを有効化', - tip: 'リーダーキーとして設定すると、このキーはショートカットキーをトリガーするためにのみ使用され、通常のキーとしては使用できなくなります。', + tip: 'リーダーキーに設定すると、このキーはショートカットのトリガー専用になり、通常の動作は失われます。', placeholder: 'リーダーキーを押してください', shiftRight: '右 Shift', ctrlRight: '右 Ctrl', @@ -105,7 +128,7 @@ const ja = { submit: '送信', recorder: { rec: 'REC', - activate: 'キーを有効にする', + activate: 'キーを有効化', input: 'ショートカットキーを押してください...' } } @@ -128,13 +151,14 @@ const ja = { speed: 'ホイール速度', fast: '速い', slow: '遅い', - requestPointer: '相対モードを使用中です。マウスポインターを取得するには、デスクトップをクリックしてください。', + requestPointer: + '相対モードを使用中です。マウスポインターを取得するには、デスクトップをクリックしてください。', resetHid: 'HID をリセット', hidOnly: { title: 'HID-Only モード', desc: '使用中にマウスとキーボードが反応しなくなり、HID をリセットしても効果がない場合は、NanoKVM とデバイス間の互換性に問題がある可能性があります。互換性を向上させるために、HID-Only モードを有効にすることをお勧めします。', - tip1: 'このモードを有効にすると仮想 USB ドライブと仮想ネットワークアダプターが無効になります。', - tip2: 'このモードではイメージマウント機能は使用できません。', + tip1: 'HID-Only モードを有効にすると、仮想 U ディスクと仮想ネットワークがアンマウントされます', + tip2: 'HID-Only モードでは、イメージのマウントは無効になります', tip3: 'モードを切り替えると、NanoKVM は自動的に再起動します。', enable: 'HID-Only モードを有効化', disable: 'HID-Only モードを無効化' @@ -146,9 +170,11 @@ const ja = { empty: 'イメージファイルがありません', mountMode: 'マウントモード', mountFailed: 'マウントに失敗しました', - mountDesc: '一部のシステムでは、イメージをマウントする前にリモートホストで仮想ディスクをアンマウントする必要があります。', + mountDesc: + '一部のシステムでは、イメージをマウントする前にリモートホストで仮想ディスクをアンマウントする必要があります。', unmountFailed: 'アンマウントに失敗しました', - unmountDesc: '一部のシステムでは、イメージをアンマウントする前にリモートホストから手動で取り出す必要があります。', + unmountDesc: + '一部のシステムでは、イメージをアンマウントする前にリモートホストから手動で取り出す必要があります。', refresh: 'イメージリストを更新', attention: '注意', deleteConfirm: 'このイメージを削除してもよろしいですか?', @@ -190,6 +216,16 @@ const ja = { serialPort: 'シリアルポート', serialPortPlaceholder: 'シリアルポートを入力してください', baudrate: 'ボーレート', + parity: 'パリティ', + parityNone: 'なし', + parityEven: '偶数', + parityOdd: '奇数', + flowControl: 'フロー制御', + flowControlNone: 'なし', + flowControlSoft: 'ソフトウェア', + flowControlHard: 'ハードウェア', + dataBits: 'データビット', + stopBits: 'ストップビット', confirm: 'OK' }, wol: { @@ -201,9 +237,13 @@ const ja = { }, download: { title: 'イメージダウンローダー', - input: 'イメージのダウンロードアドレスを入力してください', + input: 'リモートイメージの URL を入力してください', ok: 'OK', - disabled: '/data パーティションは読み取り専用であり、イメージのダウンロードには使用できません' + disabled: + '/data パーティションは読み取り専用であり、イメージのダウンロードには使用できません', + uploadbox: 'ここにファイルをドロップするか、クリックして選択してください', + inputfile: '画像ファイルを入力してください', + NoISO: 'ISO なし' }, power: { title: '電源', @@ -232,7 +272,12 @@ const ja = { deviceKey: 'デバイスキー', community: 'コミュニティ', hostname: 'ホスト名', - hostnameUpdated: 'ホスト名は正常に変更され、再起動後に有効になります' + hostnameUpdated: 'ホスト名は正常に変更され、再起動後に有効になります', + ipType: { + Wired: '有線', + Wireless: 'ワイヤレス', + Other: 'その他' + } }, appearance: { title: '外観', @@ -273,6 +318,7 @@ const ja = { }, advanced: '詳細設定', swap: { + title: 'スワップ', disable: '無効', description: 'スワップファイルのサイズを設定する', tip: 'この機能を有効にすると、SD カードの寿命が短くなる可能性があります!' @@ -303,11 +349,14 @@ const ja = { settings: '設定' }, hidOnly: 'HID-Only モード', - hidOnlyDesc: 'このモードでは仮想デバイスはマウントされなくなり、基本的な HID 制御機能のみが保持されます。', + hidOnlyDesc: + 'このモードでは仮想デバイスはマウントされなくなり、基本的な HID 制御機能のみが保持されます。', disk: '仮想ディスク', diskDesc: 'リモートホストに仮想 USB ドライブをマウントする', network: '仮想ネットワークカード', networkDesc: 'リモートホストに仮想ネットワークカードをマウントする', + reboot: '再起動', + rebootDesc: 'NanoKVM を再起動してもよろしいですか?', okBtn: 'はい', cancelBtn: 'いいえ' }, @@ -361,7 +410,7 @@ const ja = { title: 'Tailscale', memory: { title: 'メモリ最適化', - tip: "メモリ使用量が上限を超えると、メモリ解放のためにより積極的にガベージコレクションが実行されます。Tailscale を使用する場合は 50MB に設定することをお勧めします。この設定を有効にするには Tailscale を再起動する必要があります。", + tip: 'メモリ使用量が上限を超えると、メモリ解放のためにより積極的にガベージコレクションが実行されます。Tailscale を使用する場合は 50MB に設定することをお勧めします。この設定を有効にするには Tailscale を再起動する必要があります。' }, swap: { title: 'スワップメモリ', @@ -384,7 +433,8 @@ const ja = { refresh: 'ページを更新します', notRunning: 'Tailscale はまだ実行されていません。起動操作を実行してください', run: '起動', - notLogin: 'このデバイスはまだバインドされていません。ログインしてデバイスをアカウントにバインドしてください。', + notLogin: + 'このデバイスはまだバインドされていません。ログインしてデバイスをアカウントにバインドしてください。', urlPeriod: 'この URL は 10 分間有効です', login: 'ログイン', loginSuccess: 'ログイン成功', @@ -396,8 +446,6 @@ const ja = { logoutDesc: 'ログアウトしてもよろしいですか?', uninstall: 'Tailscale をアンインストール', uninstallDesc: 'Tailscale をアンインストールしてもよろしいですか?', - reboot: '再起動', - rebootDesc: 'NanoKVM を再起動してもよろしいですか?', okBtn: 'はい', cancelBtn: 'いいえ' }, @@ -412,12 +460,14 @@ const ja = { cancel: 'いいえ', preview: 'プレビューアップデート', previewDesc: '新機能や改善をいち早く体験する', - previewTip: 'プレビューアップデートには不安定な部分や不完全な機能が含まれる場合があります!', + previewTip: + 'プレビューアップデートには不安定な部分や不完全な機能が含まれる場合があります!', offline: { title: 'オフラインアップデート', desc: 'ローカルインストールパッケージでアップデートする', upload: 'アップロード', - invalidName: 'ファイル名の形式が正しくありません。GitHub リリースページにアクセスしてインストールパッケージをダウンロードしてください。', + invalidName: + 'ファイル名の形式が正しくありません。GitHub リリースページにアクセスしてインストールパッケージをダウンロードしてください。', updateFailed: 'アップデートに失敗しました。もう一度お試しください。' } }, @@ -428,8 +478,130 @@ const ja = { updateBtn: '変更', logoutBtn: 'ログアウト', logoutDesc: 'ログアウトしてもよろしいですか?', - confirm: 'はい', - cancel: 'いいえ' + okBtn: 'はい', + cancelBtn: 'いいえ' + } + }, + picoclaw: { + title: 'PicoClaw アシスタント', + empty: 'パネルを開いてタスクを開始して開始します。', + inputPlaceholder: 'PicoClaw に実行してほしいことを説明してください', + newConversation: '新しい会話', + processing: '処理中...', + agent: { + defaultTitle: '一般アシスタント', + defaultDescription: '一般的なチャット、検索、およびワークスペースのヘルプ。', + kvmTitle: 'リモート操作', + kvmDescription: 'NanoKVM を通じてリモート ホストを操作します。', + switched: 'エージェントの役割が切り替わりました', + switchFailed: 'エージェントの役割を切り替えることができませんでした' + }, + send: '送信', + cancel: 'キャンセル', + status: { + connecting: 'ゲートウェイに接続しています...', + connected: 'PicoClaw セッションが接続されました', + disconnected: 'PicoClaw セッションが終了しました', + stopped: '停止要求が送信されました', + runtimeStarted: 'PicoClaw ランタイムが開始されました', + runtimeStartFailed: 'PicoClaw ランタイムの開始に失敗しました', + runtimeStopped: 'PicoClaw ランタイムが停止しました', + runtimeStopFailed: 'PicoClaw ランタイムの停止に失敗しました' + }, + connection: { + runtime: { + checking: 'チェック中', + ready: 'ランタイムの準備が完了しました', + stopped: 'ランタイムが停止しました', + unavailable: 'ランタイムが使用できません', + configError: '構成エラー' + }, + transport: { + connecting: '接続中', + connected: '接続されました' + }, + run: { + idle: 'アイドル状態', + busy: '忙しいです' + } + }, + message: { + toolAction: 'アクション', + observation: '観察', + screenshot: 'スクリーンショット' + }, + overlay: { + locked: 'PicoClaw がデバイスを制御しています。手動入力が一時停止されます。' + }, + install: { + install: 'PicoClaw をインストールする', + installing: 'PicoClaw をインストールしています', + success: 'PicoClaw は正常にインストールされました', + failed: 'PicoClaw のインストールに失敗しました', + uninstalling: 'ランタイムをアンインストールしています...', + uninstalled: 'ランタイムは正常にアンインストールされました。', + uninstallFailed: 'アンインストールに失敗しました。', + requiredTitle: 'PicoClaw がインストールされていません', + requiredDescription: + 'PicoClaw ランタイムを開始する前に PicoClaw をインストールしてください。', + progressDescription: 'PicoClaw をダウンロードしてインストールしています。', + stages: { + preparing: '準備中', + downloading: 'ダウンロード中', + extracting: '展開中', + installing: 'インストール中', + installed: 'インストール完了', + install_timeout: 'タイムアウト', + install_failed: '失敗' + } + }, + model: { + requiredTitle: 'モデル構成が必要です', + requiredDescription: 'PicoClaw チャットを使用する前に、PicoClaw モデルを構成します。', + docsTitle: '構成ガイド', + docsDesc: 'サポートされているモデルとプロトコル', + menuLabel: 'モデルの構成', + modelIdentifier: 'モデル識別子', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API キー', + apiKeyPlaceholder: 'モデルの API キーを入力してください', + save: '保存', + saving: '保存中', + saved: 'モデル構成が保存されました', + saveFailed: 'モデル構成の保存に失敗しました', + invalid: 'モデル識別子、API Base URL、API キーは必須です' + }, + uninstall: { + menuLabel: 'アンインストール', + confirmTitle: 'PicoClaw のアンインストール', + confirmContent: + 'PicoClaw をアンインストールしてもよろしいですか?これにより、実行可能ファイルとすべての構成ファイルが削除されます。', + confirmOk: 'アンインストール', + confirmCancel: 'キャンセル' + }, + history: { + title: '履歴', + loading: 'セッションを読み込み中...', + emptyTitle: '履歴はまだありません', + emptyDescription: '以前の PicoClaw セッションがここに表示されます。', + loadFailed: 'セッション履歴のロードに失敗しました', + deleteFailed: 'セッションの削除に失敗しました', + deleteConfirmTitle: 'セッションを削除します', + deleteConfirmContent: '「{{title}}」を削除してもよろしいですか?', + deleteConfirmOk: '削除', + deleteConfirmCancel: 'キャンセル', + messageCount_one: '{{count}} メッセージ', + messageCount_other: '{{count}} メッセージ' + }, + config: { + startRuntime: 'PicoClaw を開始', + stopRuntime: 'PicoClaw を停止' + }, + start: { + title: 'PicoClaw を開始', + description: 'ランタイムを起動して、PicoClaw アシスタントの使用を開始します。' } }, error: { diff --git a/web/src/i18n/locales/ko.ts b/web/src/i18n/locales/ko.ts index 8c0468a..1512475 100644 --- a/web/src/i18n/locales/ko.ts +++ b/web/src/i18n/locales/ko.ts @@ -14,8 +14,11 @@ const ko = { placeholderPassword2: '비밀번호를 다시 입력하세요.', noEmptyUsername: '사용자 이름은 비어있을 수 없습니다.', noEmptyPassword: '비밀번호는 비어있을 수 없습니다.', - noAccount: '사용자 정보를 불러오는 데 실패했습니다. 페이지를 새로고침하거나 비밀번호를 초기화하세요.', + noAccount: + '사용자 정보를 불러오는 데 실패했습니다. 페이지를 새로고침하거나 비밀번호를 초기화하세요.', invalidUser: '사용자 이름이나 비밀번호가 틀렸습니다.', + locked: '로그인 횟수가 너무 많습니다. 나중에 다시 시도해 주세요.', + globalLocked: '시스템이 보호 중입니다. 나중에 다시 시도해 주세요.', error: '알 수 없는 오류', changePassword: '비밀번호 변경', changePasswordDesc: '보안을 위해 웹 로그인 비밀번호를 변경하세요.', @@ -27,8 +30,7 @@ const ko = { cancel: '취소', loginButtonText: '로그인', tips: { - reset1: - '비밀번호를 재설정하려면 NanoKVM의 BOOT 버튼을 10초 동안 누르고 계세요.', + reset1: '비밀번호를 재설정하려면 NanoKVM의 BOOT 버튼을 10초 동안 누르고 계세요.', reset2: '자세한 절차는 이 문서를 참조하세요:', reset3: '웹 기본 계정:', reset4: 'SSH 기본 계정:', @@ -43,10 +45,20 @@ const ko = { description: 'NanoKVM Wi-Fi 설정', success: 'NanoKVM의 네트워크 상태를 확인하고 새 IP 주소로 접속하세요.', failed: '작업에 실패했습니다. 다시 시도하세요.', + invalidMode: + '현재 모드는 네트워크 설정을 지원하지 않습니다. 장치로 이동하여 Wi-Fi 구성 모드를 활성화하십시오.', confirmBtn: '확인', - finishBtn: '완료' + finishBtn: '완료', + ap: { + authTitle: '인증 필요', + authDescription: '계속하려면 AP 비밀번호를 입력하세요', + authFailed: '잘못된 AP 비밀번호', + passPlaceholder: 'AP 비밀번호', + verifyBtn: '확인' + } }, screen: { + scale: '규모', title: '화면', video: '비디오 모드', videoDirectTips: '이 모드를 사용하려면 "설정 > 장치"에서 HTTPS를 활성화하세요', @@ -73,7 +85,50 @@ const ko = { placeholder: '입력하세요', submit: '전송', virtual: '키보드', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: '클립보드에서 읽기', + clipboardPermissionDenied: + '클립보드 권한이 거부되었습니다. 브라우저에서 클립보드 액세스를 허용해 주세요.', + clipboardReadError: '클립보드를 읽지 못했습니다.', + dropdownEnglish: '영어', + dropdownGerman: '독일어', + dropdownFrench: '프랑스어', + dropdownRussian: '러시아어', + shortcut: { + title: '바로가기', + custom: '관습', + capture: '바로가기를 캡처하려면 여기를 클릭하세요', + clear: '클리어', + save: '저장', + captureTips: 'Windows 키와 같은 시스템 수준 키를 캡처하려면 전체 화면 권한이 필요합니다.', + enterFullScreen: '전체 화면 모드를 전환합니다.' + }, + leaderKey: { + title: '리더 키', + desc: '브라우저 제한을 우회하고 시스템 바로가기를 원격 호스트에 직접 보냅니다.', + howToUse: '사용방법', + simultaneous: { + title: '동시 모드', + desc1: '리더 키를 누른 상태에서 단축키를 누르세요.', + desc2: '직관적이지만 시스템 단축키와 충돌할 수 있습니다.' + }, + sequential: { + title: '순차 모드', + desc1: '리더 키를 누름 → 단축키를 순서대로 누름 → 리더 키를 다시 누름.', + desc2: '더 많은 단계가 필요하지만 시스템 충돌을 완전히 방지합니다.' + }, + enable: '리더 키 활성화', + tip: '리더 키로 지정하면 이 키는 단축키 트리거로만 동작하며 기본 동작을 잃습니다.', + placeholder: '리더 키를 누르세요', + shiftRight: '오른쪽 Shift', + ctrlRight: '오른쪽 Ctrl', + metaRight: '오른쪽 Win', + submit: '전송', + recorder: { + rec: 'REC', + activate: '키 활성화', + input: '단축키를 눌러주세요...' + } + } }, mouse: { title: '마우스', @@ -87,7 +142,10 @@ const ko = { mode: '마우스 모드', absolute: '절대값 모드', relative: '상대값 모드', - speed: '휠 속도', + direction: '스크롤 휠 방향', + scrollUp: '위로 스크롤', + scrollDown: '아래로 스크롤', + speed: '스크롤 휠 속도', fast: '빠름', slow: '느림', requestPointer: '상대값 모드를 사용 중입니다. 커서를 찾으려면 데스크톱을 클릭하세요.', @@ -177,7 +235,10 @@ const ko = { title: '이미지 다운로드', input: '원격 이미지 URL을 입력하세요.', ok: '확인', - disabled: '/data 파티션이 읽기 전용(RO) 상태이므로 이미지를 다운로드할 수 없습니다.' + disabled: '/data 파티션이 읽기 전용(RO) 상태이므로 이미지를 다운로드할 수 없습니다.', + uploadbox: '여기에 파일을 놓거나 클릭하여 선택하세요.', + inputfile: '이미지 파일을 입력해주세요', + NoISO: 'ISO 없음' }, power: { title: '전원', @@ -271,7 +332,19 @@ const ko = { hdmi: { description: 'HDMI/모니터 출력 활성화' }, + autostart: { + title: '자동 시작 스크립트 설정', + description: '시스템 시작 시 자동으로 실행되는 스크립트를 관리합니다.', + new: '새로운', + deleteConfirm: '이 파일을 정말로 삭제합니까?', + yes: '네', + no: '아니오', + scriptName: '자동 시작 스크립트 이름', + scriptContent: '자동 시작 스크립트 내용', + settings: '설정' + }, hidOnly: 'HID 전용 모드', + hidOnlyDesc: '가상 장치 에뮬레이션을 중지하고 기본 HID 제어만 유지합니다.', disk: '가상 디스크', diskDesc: '원격 호스트에서 가상 USB를 마운트합니다.', network: '가상 네트워크', @@ -354,8 +427,7 @@ const ko = { refresh: '현재 페이지 새로고침', notRunning: 'Tailscale이 실행되고 있지 않습니다. 계속하려면 시작해 주세요.', run: '시작', - notLogin: - '이 기기는 현재 연동 되지 않았습니다. 로그인해서 계정에 이 장치를 연동하세요.', + notLogin: '이 기기는 현재 연동 되지 않았습니다. 로그인해서 계정에 이 장치를 연동하세요.', urlPeriod: '이 주소는 10분간 유효합니다.', login: '로그인', loginSuccess: '로그인 성공', @@ -365,7 +437,6 @@ const ko = { account: '계정', logout: '로그아웃', logoutDesc: '정말로 로그아웃 하시겠습니까?', - logout2: '정말로 로그아웃 할까요?', uninstall: 'Tailscale 제거', uninstallDesc: '정말로 Tailscale을 제거할까요?', okBtn: '네', @@ -422,7 +493,7 @@ const ko = { connecting: '게이트웨이 연결 중...', connected: 'PicoClaw 세션이 연결되었습니다', disconnected: 'PicoClaw 세션이 종료되었습니다', - stopped: '요청 전송 중지', + stopped: '중지 요청이 전송되었습니다', runtimeStarted: 'PicoClaw 런타임이 시작되었습니다', runtimeStartFailed: 'PicoClaw 런타임 시작에 실패했습니다', runtimeStopped: 'PicoClaw 런타임이 중지되었습니다', @@ -462,8 +533,8 @@ const ko = { uninstalled: '런타임 삭제에 성공했습니다.', uninstallFailed: '삭제에 실패했습니다.', requiredTitle: 'PicoClaw가 설치되지 않았습니다', - requiredDescription: 'PicoClaw를 설치하기 전에 PicoClaw 런타임을 먼저 설치하세요.', - progressDescription: 'PicoClaw가 다운로되고 설치되고 있습니다.', + requiredDescription: 'PicoClaw 런타임을 시작하기 전에 PicoClaw를 설치하세요.', + progressDescription: 'PicoClaw가 다운로드되고 설치되고 있습니다.', stages: { preparing: '준비 중', downloading: '다운로드 중', @@ -482,7 +553,7 @@ const ko = { menuLabel: '모델 구성', modelIdentifier: '모델 식별자', modelIdentifierPlaceholder: 'openai/gpt-5.4', - apiBase: 'API 기본 URL', + apiBase: 'API Base URL', apiBasePlaceholder: 'https://api.example.com/v1', apiKey: 'API 키', apiKeyPlaceholder: '모델 API 키를 입력하세요', @@ -490,13 +561,12 @@ const ko = { saving: '저장 중', saved: '모델 구성이 저장되었습니다', saveFailed: '모델 구성 저장에 실패했습니다', - invalid: '모델 식별자, API 기본 URL, API 키가 필요합니다' + invalid: '모델 식별자, API Base URL, API 키가 필요합니다' }, uninstall: { menuLabel: '제거', confirmTitle: 'PicoClaw 제거', - confirmContent: - 'PicoClaw를 정말로 제거할까요? 실행 파일과 모든 구성 파일이 삭제됩니다.', + confirmContent: 'PicoClaw를 정말로 제거할까요? 실행 파일과 모든 구성 파일이 삭제됩니다.', confirmOk: '제거', confirmCancel: '취소' }, @@ -520,7 +590,7 @@ const ko = { }, start: { title: 'PicoClaw 시작', - description: '런타임을 시작하여 PicoClaw 어시스턴트를 시작합니다.' + description: '런타임을 시작하여 PicoClaw 어시스턴트 사용을 시작하세요.' } }, error: { diff --git a/web/src/i18n/locales/nb.ts b/web/src/i18n/locales/nb.ts index 936a84a..39e437d 100644 --- a/web/src/i18n/locales/nb.ts +++ b/web/src/i18n/locales/nb.ts @@ -17,6 +17,8 @@ const nb = { noAccount: 'Kunne ikke hente brukerinformasjon. Vennligst last inn siden på nytt eller gjenopprett passord', invalidUser: 'Ugyldig brukernavn eller passord', + locked: 'For mange pålogginger, vennligst prøv igjen senere', + globalLocked: 'System under beskyttelse, prøv igjen senere', error: 'Uventet feil', changePassword: 'Endre passord', changePasswordDesc: @@ -31,25 +33,37 @@ const nb = { tips: { reset1: 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', - reset2: 'For detailed steps, please consult this document:', - reset3: 'Web default account:', - reset4: 'SSH default account:', - change1: 'Please note that this action will change the following passwords:', - change2: 'Web login password', - change3: 'System root password (SSH login password)', - change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + reset2: 'Se dette dokumentet for detaljerte trinn:', + reset3: 'Standard webkonto:', + reset4: 'Standard SSH-konto:', + change1: 'Merk at denne handlingen endrer følgende passord:', + change2: 'Passord for webinnlogging', + change3: 'Systemets root-passord (SSH-innloggingspassord)', + change4: 'For å tilbakestille passordene holder du BOOT-knappen på NanoKVM inne.' } }, wifi: { title: 'Wi-Fi', - description: 'Configure Wi-Fi for NanoKVM', + description: 'Konfigurer Wi-Fi for NanoKVM', success: 'Please check the network status of NanoKVM and visit the new IP address.', - failed: 'Operation failed, please try again.', + failed: 'Operasjonen mislyktes, prøv igjen.', + invalidMode: + 'Gjeldende modus støtter ikke nettverksoppsett. Gå til enheten din og aktiver Wi-Fi konfigurasjonsmodus.', confirmBtn: 'Ok', - finishBtn: 'Finished' + finishBtn: 'Ferdig', + ap: { + authTitle: 'Autentisering kreves', + authDescription: 'Vennligst skriv inn AP passordet for å fortsette', + authFailed: 'Ugyldig AP passord', + passPlaceholder: 'AP passord', + verifyBtn: 'Bekreft' + } }, screen: { + scale: 'Skala', + title: 'Skjerm', video: 'Video-kodek', + videoDirectTips: 'Aktiver HTTPS i "Innstillinger > Enhet" for å bruke denne modusen', resolution: 'Oppløsning', auto: 'Automatisk', autoTips: @@ -59,22 +73,70 @@ const nb = { quality: 'Kvalitet', qualityLossless: 'Tapsfri', qualityHigh: 'Høy', - qualityMedium: 'Medium', + qualityMedium: 'Middels', qualityLow: 'Lav', frameDetect: 'Bildefrekvensoppdagelse', frameDetectTip: 'Kalkuler forskjellen mellom bilder. Stopper overføring av video når det ikke oppdages forskjell på den eksterne vertens skjerm.', - resetHdmi: 'Reset HDMI' + resetHdmi: 'Tilbakestill HDMI' }, keyboard: { + title: 'Åpne tastatur', paste: 'Lim inn', tips: 'Kun vanlige tegn på tastatur er støttet', placeholder: 'Vennligst angi teksten du vil lime inn', submit: 'Lim inn', virtual: 'Åpne tastatur', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Les fra utklippstavlen', + clipboardPermissionDenied: + 'Utklippstavle tillatelse nektet. Tillat utklippstavletilgang i nettleseren din.', + clipboardReadError: 'Kunne ikke lese utklippstavlen', + dropdownEnglish: 'Engelsk', + dropdownGerman: 'tysk', + dropdownFrench: 'Fransk', + dropdownRussian: 'russisk', + shortcut: { + title: 'Snarveier', + custom: 'Egendefinert', + capture: 'Klikk her for å ta en snarvei', + clear: 'Tøm', + save: 'Lagre', + captureTips: + 'Registrering av systemtaster (som Windows-tasten) krever fullskjermtillatelse.', + enterFullScreen: 'Veksle fullskjermmodus.' + }, + leaderKey: { + title: 'Leader-tast', + desc: 'Omgå nettleserrestriksjoner og send systemsnarveier direkte til den eksterne verten.', + howToUse: 'Hvordan bruke', + simultaneous: { + title: 'Samtidig modus', + desc1: 'Hold Leader-tasten inne, og trykk deretter på snarveien.', + desc2: 'Intuitivt, men kan komme i konflikt med systemsnarveier.' + }, + sequential: { + title: 'Sekvensiell modus', + desc1: + 'Trykk på Leader-tasten → trykk på snarveien i rekkefølge → trykk på Leader-tasten igjen.', + desc2: 'Krever flere trinn, men unngår fullstendig systemkonflikter.' + }, + enable: 'Aktiver Leader-tast', + tip: 'Når denne tasten er tilordnet som Leader-tast, fungerer den bare som snarveisutløser og mister standardoppførselen.', + placeholder: 'Trykk på Leader-tasten', + shiftRight: 'Høyre Shift', + ctrlRight: 'Høyre Ctrl', + metaRight: 'Høyre Win', + submit: 'Lim inn', + recorder: { + rec: 'REC', + activate: 'Aktiver taster', + input: 'Trykk snarveien...' + } + } }, mouse: { + title: 'Mus', + cursor: 'Markørstil', default: 'Vanlig', pointer: 'Hånd', cell: 'Celle', @@ -84,16 +146,40 @@ const nb = { mode: 'Modus', absolute: 'Absolutt', relative: 'Relativ', + direction: 'Rullehjulretning', + scrollUp: 'Rull opp', + scrollDown: 'Rull ned', + speed: 'Rullehjulhastighet', + fast: 'Rask', + slow: 'Sakte', requestPointer: 'Bruker relativ modus. Vennligsk klikk på skrivebordet for vise musepeker.', - resetHid: 'Gjenopprett HID' + resetHid: 'Gjenopprett HID', + hidOnly: { + title: 'Kun HID-modus', + desc: 'Hvis musen og tastaturet slutter å svare og tilbakestilling av HID ikke hjelper, kan det være et kompatibilitetsproblem mellom NanoKVM og enheten. Prøv å aktivere HID-Only-modus for bedre kompatibilitet.', + tip1: 'Aktivering av HID-Only-modus vil demontere den virtuelle U-disken og det virtuelle nettverket', + tip2: 'I HID-Only-modus er bildemontering deaktivert', + tip3: 'NanoKVM vil automatisk starte på nytt etter bytte av modus', + enable: 'Aktiver HID-Only-modus', + disable: 'Deaktiver HID-bare-modus' + } }, image: { title: 'Bilder', loading: 'Laster...', empty: 'Ingen funnet', + mountMode: 'Monteringsmodus', mountFailed: 'Montering feilet', mountDesc: 'På noen systemer er det nødvendig å koble fra den virtuelle disken på den eksterne verten før man kan montere arkivfilen.', + unmountFailed: 'Avmontering mislyktes', + unmountDesc: + 'På noen systemer må du manuelt løse ut fra den eksterne verten før du demonterer bildet.', + refresh: 'Oppdater bildelisten', + attention: 'Merknad', + deleteConfirm: 'Er du sikker på at du vil slette dette bildet?', + okBtn: 'Ja', + cancelBtn: 'Nei', tips: { title: 'Hvordan laste opp', usb1: 'Koble til NanoKVM-enheten til din datamaskin med USB.', @@ -130,6 +216,16 @@ const nb = { serialPort: 'Seriell port', serialPortPlaceholder: 'Vennligst angi den serielle porten', baudrate: 'Baud-rate', + parity: 'Paritet', + parityNone: 'Ingen', + parityEven: 'Lik', + parityOdd: 'Ulik', + flowControl: 'Strømningskontroll', + flowControlNone: 'Ingen', + flowControlSoft: 'Programvare', + flowControlHard: 'Maskinvare', + dataBits: 'Databiter', + stopBits: 'Stoppbiter', confirm: 'Ok' }, wol: { @@ -139,40 +235,73 @@ const nb = { input: 'Vennligst angi MAC-adressen', ok: 'Ok' }, + download: { + title: 'Bildedaster', + input: 'Vennligst skriv inn et eksternt bilde URL', + ok: 'Ok', + disabled: '/data partisjonen er RO, så vi kan ikke laste ned bildet', + uploadbox: 'Slipp filen her eller klikk for å velge', + inputfile: 'Vennligst skriv inn bildefilen', + NoISO: 'Ingen ISO' + }, power: { title: 'På-knapp', + showConfirm: 'Bekreftelse', + showConfirmTip: 'Strømdrift krever en ekstra bekreftelse', reset: 'Reset-knapp', power: 'På-knapp', powerShort: 'På-knapp (kort trykk)', - powerLong: 'På-knapp (langt trykk)' + powerLong: 'På-knapp (langt trykk)', + resetConfirm: 'Fortsette tilbakestilling?', + powerConfirm: 'Fortsette strømdrift?', + okBtn: 'Ja', + cancelBtn: 'Nei' }, settings: { - title: 'Settings', + title: 'Innstillinger', about: { title: 'Om NanoKVM', information: 'Informasjon', ip: 'IP', mdns: 'mDNS', application: 'Applikasjonsversjon', - applicationTip: 'NanoKVM web application version', + applicationTip: 'Versjon av NanoKVM-webapplikasjonen', image: 'Arkivfil-versjon', - imageTip: 'NanoKVM system image version', + imageTip: 'Versjon av NanoKVM-systemavbildningen', deviceKey: 'Enhetsnøkkel', - community: 'Fellesskap' + community: 'Fellesskap', + hostname: 'Vertsnavn', + hostnameUpdated: 'Vertsnavn oppdatert. Start på nytt for å søke.', + ipType: { + Wired: 'Kablet', + Wireless: 'Trådløs', + Other: 'Annet' + } }, appearance: { - title: 'Appearance', - display: 'Display', - language: 'Language', - menuBar: 'Menu Bar', - menuBarDesc: 'Display icons in the menu bar' + title: 'Utseende', + display: 'Skjerm', + language: 'Språk', + languageDesc: 'Velg språket for grensesnittet', + webTitle: 'Netttittel', + webTitleDesc: 'Tilpass nettsidetittelen', + menuBar: { + title: 'Menylinje', + mode: 'Visningsmodus', + modeDesc: 'Vis menylinje på skjermen', + modeOff: 'Av', + modeAuto: 'Skjul automatisk', + modeAlways: 'Alltid synlig', + icons: 'Undermenyikoner', + iconsDesc: 'Vis undermenyikoner i menylinjen' + } }, device: { - title: 'Device', + title: 'Enhet', oled: { title: 'OLED', description: 'OLED screen automatically sleep', - 0: 'Never', + 0: 'Aldri', 15: '15 sec', 30: '30 sec', 60: '1 min', @@ -180,12 +309,54 @@ const nb = { 300: '5 min', 600: '10 min', 1800: '30 min', - 3600: '1 hour' + 3600: '1 time' }, - disk: 'Virtual Disk', + ssh: { + description: 'Aktiver SSH ekstern tilgang', + tip: 'Angi et sterkt passord før du aktiverer (Konto - Endre passord)' + }, + advanced: 'Avanserte innstillinger', + swap: { + title: 'Bytt', + disable: 'Deaktiver', + description: 'Angi størrelsen på byttefilen', + tip: 'Aktivering av denne funksjonen kan forkorte SD-kortets brukbare levetid!' + }, + mouseJiggler: { + title: 'Mus Jiggler', + description: 'Hindre den eksterne verten fra å sove', + disable: 'Deaktiver', + absolute: 'Absolutt modus', + relative: 'Relativ modus' + }, + mdns: { + description: 'Aktiver mDNS oppdagelsestjeneste', + tip: 'Slå den av hvis den ikke er nødvendig' + }, + hdmi: { + description: 'Aktiver HDMI/skjermutgang' + }, + autostart: { + title: 'Autostart skriptinnstillinger', + description: 'Administrer skript som kjører automatisk ved systemstart', + new: 'Ny', + deleteConfirm: 'Er du sikker på at du vil slette denne filen?', + yes: 'Ja', + no: 'Nei', + scriptName: 'Autostart skriptnavn', + scriptContent: 'Autostart skriptinnhold', + settings: 'Innstillinger' + }, + hidOnly: 'HID-Bare modus', + hidOnlyDesc: 'Slutt å emulere virtuelle enheter, behold bare grunnleggende HID-kontroll', + disk: 'Virtuell disk', diskDesc: 'Mount virtual U-disk on the remote host', - network: 'Virtual Network', - networkDesc: 'Mount virtual network card on the remote host' + network: 'Virtuelt nettverk', + networkDesc: 'Monter virtuelt nettverkskort på den eksterne verten', + reboot: 'Start på nytt', + rebootDesc: 'Er du sikker på at du vil starte NanoKVM på nytt?', + okBtn: 'Ja', + cancelBtn: 'Nei' }, network: { title: 'Nettverk', @@ -236,9 +407,12 @@ const nb = { tailscale: { title: 'Tailscale', memory: { - title: 'Memory optimization', - tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect.", - disable: 'Disable' + title: 'Minneoptimalisering', + tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect." + }, + swap: { + title: 'Bytt minne', + tip: 'Hvis problemene vedvarer etter at du har aktivert minneoptimalisering, prøv å aktivere swap-minne. Dette setter swap-filstørrelsen til 256MB som standard, som kan justeres i "Innstillinger > Enhet".' }, restart: 'Are you sure to restart Tailscale?', stop: 'Are you sure to stop Tailscale?', @@ -255,6 +429,8 @@ const nb = { upTailscale: 'Last opp Tailscale til NanoKVM-enhetens mappe /usr/bin/', upTailscaled: 'Last opp tailscaled til NanoKVM-enhetens mappe /usr/sbin/', refresh: 'Last inn denne siden på nytt', + notRunning: 'Tailscale kjører ikke. Start den for å fortsette.', + run: 'Start', notLogin: 'Denne enheten er ikke knyttet til din konto enda. Vennligst logg inn og knytt den til kontoen din..', urlPeriod: 'Denne lenken er gyldig i 10 minutter', @@ -265,7 +441,9 @@ const nb = { deviceIP: 'Enhetens IP', account: 'Konto', logout: 'Logg ut', - logout2: 'Er du sikker på at du ønsker å logge ut?', + logoutDesc: 'Er du sikker på at du vil logge ut?', + uninstall: 'Avinstaller Tailscale', + uninstallDesc: 'Er du sikker på at du vil avinstallere Tailscale?', okBtn: 'Yes', cancelBtn: 'No' }, @@ -277,15 +455,161 @@ const nb = { available: 'En oppdatering er tilgjengelig. Er du sikker på at du ønsker å oppdatere?', updating: 'Oppdatering har startet. Vennligst vent...', confirm: 'Oppdater', - cancel: 'Avbryt' + cancel: 'Avbryt', + preview: 'Forhåndsvisningsoppdateringer', + previewDesc: 'Få tidlig tilgang til nye funksjoner og forbedringer', + previewTip: + 'Vær oppmerksom på at forhåndsvisningsutgivelser kan inneholde feil eller ufullstendig funksjonalitet!', + offline: { + title: 'Offline oppdateringer', + desc: 'Oppdater gjennom lokal installasjonspakke', + upload: 'Last opp', + invalidName: 'Ugyldig filnavnformat. Last ned fra GitHub-utgivelser.', + updateFailed: 'En feil oppstod under oppdatering. Vennligst forsøk igjen.' + } }, account: { - title: 'Account', - webAccount: 'Web Account Name', - password: 'Password', + title: 'Konto', + webAccount: 'Navn på webkonto', + password: 'Passord', updateBtn: 'Update', - logoutBtn: 'Logout' + logoutBtn: 'Logg ut', + logoutDesc: 'Er du sikker på at du vil logge ut?', + okBtn: 'Ja', + cancelBtn: 'Nei' } + }, + picoclaw: { + title: 'PicoClaw Assistent', + empty: 'Åpne panelet og start en oppgave for å begynne.', + inputPlaceholder: 'Beskriv hva du vil at PicoClaw skal gjøre', + newConversation: 'Ny samtale', + processing: 'Behandler...', + agent: { + defaultTitle: 'Generell assistent', + defaultDescription: 'Generell chat-, søk- og arbeidsområdehjelp.', + kvmTitle: 'Fjernstyring', + kvmDescription: 'Betjen den eksterne verten gjennom NanoKVM.', + switched: 'Agentrolle byttet', + switchFailed: 'Kunne ikke bytte agentrolle' + }, + send: 'Send', + cancel: 'Avbryt', + status: { + connecting: 'Kobler til gateway...', + connected: 'PicoClaw-økt tilkoblet', + disconnected: 'PicoClaw-økt frakoblet', + stopped: 'Stoppforespørsel sendt', + runtimeStarted: 'PicoClaw runtime startet', + runtimeStartFailed: 'Kunne ikke starte PicoClaw runtime', + runtimeStopped: 'PicoClaw runtime stoppet', + runtimeStopFailed: 'Kunne ikke stoppe PicoClaw runtime' + }, + connection: { + runtime: { + checking: 'Kontrollerer', + ready: 'Runtime klar', + stopped: 'Runtime stoppet', + unavailable: 'Runtime utilgjengelig', + configError: 'Konfigurasjonsfeil' + }, + transport: { + connecting: 'Kobler til', + connected: 'Tilkoblet' + }, + run: { + idle: 'Inaktiv', + busy: 'Opptatt' + } + }, + message: { + toolAction: 'Handling', + observation: 'Observasjon', + screenshot: 'Skjermbilde' + }, + overlay: { + locked: 'PicoClaw kontrollerer enheten. Manuell inntasting er satt på pause.' + }, + install: { + install: 'Installer PicoClaw', + installing: 'Installerer PicoClaw', + success: 'PicoClaw installert vellykket', + failed: 'Kunne ikke installere PicoClaw', + uninstalling: 'Avinstallerer runtime...', + uninstalled: 'Runtime ble avinstallert.', + uninstallFailed: 'Avinstallering mislyktes.', + requiredTitle: 'PicoClaw er ikke installert', + requiredDescription: 'Installer PicoClaw før du starter PicoClaw runtime.', + progressDescription: 'PicoClaw blir lastet ned og installert.', + stages: { + preparing: 'Forbereder', + downloading: 'Laster ned', + extracting: 'Pakker ut', + installing: 'Installerer', + installed: 'Installert', + install_timeout: 'Tidsavbrudd', + install_failed: 'Mislyktes' + } + }, + model: { + requiredTitle: 'Modellkonfigurasjon er nødvendig', + requiredDescription: 'Konfigurer PicoClaw-modellen før du bruker PicoClaw chat.', + docsTitle: 'Konfigurasjonsveiledning', + docsDesc: 'Støttede modeller og protokoller', + menuLabel: 'Konfigurer modell', + modelIdentifier: 'Modellidentifikator', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API-nøkkel', + apiKeyPlaceholder: 'Skriv inn modellens API-nøkkel', + save: 'Lagre', + saving: 'Lagrer', + saved: 'Modellkonfigurasjon lagret', + saveFailed: 'Kunne ikke lagre modellkonfigurasjonen', + invalid: 'Modellidentifikator, API Base URL og API-nøkkel kreves' + }, + uninstall: { + menuLabel: 'Avinstaller', + confirmTitle: 'Avinstaller PicoClaw', + confirmContent: + 'Er du sikker på at du vil avinstallere PicoClaw? Dette vil slette den kjørbare filen og alle konfigurasjonsfilene.', + confirmOk: 'Avinstaller', + confirmCancel: 'Avbryt' + }, + history: { + title: 'Historikk', + loading: 'Laster inn økter...', + emptyTitle: 'Ingen historikk ennå', + emptyDescription: 'Tidligere PicoClaw økter vil vises her.', + loadFailed: 'Kunne ikke laste inn økthistorikk', + deleteFailed: 'Kunne ikke slette økten', + deleteConfirmTitle: 'Slett økt', + deleteConfirmContent: 'Er du sikker på at du vil slette "{{title}}"?', + deleteConfirmOk: 'Slett', + deleteConfirmCancel: 'Avbryt', + messageCount_one: '{{count}} melding', + messageCount_other: '{{count}} meldinger' + }, + config: { + startRuntime: 'Start PicoClaw', + stopRuntime: 'Stopp PicoClaw' + }, + start: { + title: 'Start PicoClaw', + description: 'Start runtime for å begynne å bruke PicoClaw-assistenten.' + } + }, + error: { + title: 'Vi har hatt et problem', + refresh: 'Oppdater' + }, + fullscreen: { + toggle: 'Veksle fullskjerm' + }, + menu: { + collapse: 'Skjul meny', + expand: 'Utvid menyen' } } }; diff --git a/web/src/i18n/locales/nl.ts b/web/src/i18n/locales/nl.ts index 1b13b8a..604ffca 100644 --- a/web/src/i18n/locales/nl.ts +++ b/web/src/i18n/locales/nl.ts @@ -5,7 +5,7 @@ const nl = { login: 'Inloggen', changePassword: 'Wachtwoord wijzigen', terminal: 'Terminal', - wifi: 'Wifi' + wifi: 'Wi-Fi' }, auth: { login: 'Inloggen', @@ -17,6 +17,8 @@ const nl = { noAccount: 'Ophalen van gebruikersinformatie mislukt, vernieuw de webpagina of reset het wachtwoord', invalidUser: 'Ongeldige gebruikersnaam of wachtwoord', + locked: 'Te veel aanmeldingen, probeer het later opnieuw', + globalLocked: 'Systeem wordt beveiligd. Probeer het later opnieuw', error: 'Onverwachte fout', changePassword: 'Wachtwoord wijzigen', changePasswordDesc: @@ -29,26 +31,40 @@ const nl = { cancel: 'Annuleren', loginButtonText: 'Inloggen', tips: { - reset1: 'Om de wachtwoorden opnieuw in te stellen, houdt u de BOOT-knop op de NanoKVM 10 seconden lang ingedrukt.', + reset1: + 'Om de wachtwoorden opnieuw in te stellen, houdt u de BOOT-knop op de NanoKVM 10 seconden lang ingedrukt.', reset2: 'Voor gedetailleerde stappen kunt u dit document raadplegen:', reset3: 'Standaard webaccount:', reset4: 'Standaard SSH-account:', change1: 'Houd er rekening mee dat deze actie de volgende wachtwoorden zal wijzigen:', change2: 'Web login wachtwoord', change3: 'Systeem root-wachtwoord (SSH-inlogwachtwoord)', - change4: 'Om de wachtwoorden opnieuw in te stellen, houdt u de BOOT-knop op de NanoKVM ingedrukt.' + change4: + 'Om de wachtwoorden opnieuw in te stellen, houdt u de BOOT-knop op de NanoKVM ingedrukt.' } }, wifi: { - title: 'Wifi', - description: 'Wifi configureren voor NanoKVM', + title: 'Wi-Fi', + description: 'Wi-Fi configureren voor NanoKVM', success: 'Controleer de netwerkstatus van NanoKVM en bezoek het nieuwe IP-adres.', failed: 'De bewerking is mislukt. Probeer het opnieuw.', + invalidMode: + 'De huidige modus ondersteunt geen netwerkconfiguratie. Ga naar uw apparaat en schakel de configuratiemodus Wi-Fi in.', confirmBtn: 'Ok', - finishBtn: 'Gereed' + finishBtn: 'Gereed', + ap: { + authTitle: 'Authenticatie vereist', + authDescription: 'Voer het wachtwoord AP in om door te gaan', + authFailed: 'Ongeldig AP wachtwoord', + passPlaceholder: 'AP wachtwoord', + verifyBtn: 'Verifieer' + } }, screen: { + scale: 'Schaal', + title: 'Scherm', video: 'Videomodus', + videoDirectTips: 'Schakel HTTPS in "Instellingen > Apparaat" in om deze modus te gebruiken', resolution: 'Resolutie', auto: 'Automatisch', autoTips: @@ -66,14 +82,62 @@ const nl = { resetHdmi: 'Reset HDMI' }, keyboard: { + title: 'Toetsenbord', paste: 'Plakken', tips: 'Alleen standaard toetsenbordletters en symbolen worden ondersteund', placeholder: 'Voer tekst in', submit: 'Verzenden', virtual: 'Toetsenbord', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Lezen vanaf het Klembord', + clipboardPermissionDenied: + 'Klembordtoestemming geweigerd. Sta klembordtoegang toe in uw browser.', + clipboardReadError: 'Kan het klembord niet lezen', + dropdownEnglish: 'Engels', + dropdownGerman: 'Duits', + dropdownFrench: 'Frans', + dropdownRussian: 'Russisch', + shortcut: { + title: 'Snelkoppelingen', + custom: 'Aangepast', + capture: 'Klik hier om de snelkoppeling vast te leggen', + clear: 'Duidelijk', + save: 'Opslaan', + captureTips: + 'Voor het vastleggen van systeemtoetsen (zoals de Windows-toets) is toestemming voor volledig scherm vereist.', + enterFullScreen: 'Schakelen naar volledig scherm.' + }, + leaderKey: { + title: 'Leader-toets', + desc: 'Omzeil browserbeperkingen en stuur systeemsnelkoppelingen rechtstreeks naar de externe host.', + howToUse: 'Hoe te gebruiken', + simultaneous: { + title: 'Gelijktijdige modus', + desc1: 'Houd de Leader-toets ingedrukt en druk daarna op de sneltoets.', + desc2: 'Intuïtief, maar kan conflicteren met systeemsnelkoppelingen.' + }, + sequential: { + title: 'Sequentiële modus', + desc1: + 'Druk op de Leader-toets → druk de sneltoets in volgorde in → druk opnieuw op de Leader-toets.', + desc2: 'Vereist meer stappen, maar vermijdt systeemconflicten volledig.' + }, + enable: 'Leader-toets inschakelen', + tip: 'Wanneer deze toets als Leader-toets is toegewezen, werkt hij uitsluitend als sneltoetstrigger en verliest hij zijn standaardgedrag.', + placeholder: 'Druk op de Leader-toets', + shiftRight: 'Rechter Shift', + ctrlRight: 'Rechter Ctrl', + metaRight: 'Rechter Win', + submit: 'Verzenden', + recorder: { + rec: 'OPN', + activate: 'Toetsen activeren', + input: 'Druk op de snelkoppeling...' + } + } }, mouse: { + title: 'Muis', + cursor: 'Cursorstijl', default: 'Standaard cursor', pointer: 'Aanwijzer cursor', cell: 'Cel cursor', @@ -83,17 +147,41 @@ const nl = { mode: 'Muismodus', absolute: 'Absolute modus', relative: 'Relatieve modus', + direction: 'Scrollwielrichting', + scrollUp: 'Scroll naar boven', + scrollDown: 'Scroll naar beneden', + speed: 'Scrollwielsnelheid', + fast: 'Snel', + slow: 'Langzaam', requestPointer: 'Relatieve modus wordt gebruikt. Klik op het bureaublad om de muisaanwijzer te krijgen.', - resetHid: 'HID resetten' + resetHid: 'HID resetten', + hidOnly: { + title: 'Alleen HID-modus', + desc: 'Als uw muis en toetsenbord niet meer reageren en het opnieuw instellen van HID niet helpt, kan er sprake zijn van een compatibiliteitsprobleem tussen de NanoKVM en het apparaat. Probeer de modus HID-Only in te schakelen voor betere compatibiliteit.', + tip1: 'Als u de modus HID-Only inschakelt, worden de virtuele U-schijf en het virtuele netwerk ontkoppeld', + tip2: 'In de modus HID-Alleen is beeldmontage uitgeschakeld', + tip3: 'NanoKVM wordt automatisch opnieuw opgestart na het wisselen van modus', + enable: 'Schakel de modus HID-Alleen in', + disable: 'Schakel de modus HID-Alleen uit' + } }, image: { title: 'Afbeeldingen', loading: 'Laden...', empty: 'Niets gevonden', + mountMode: 'Montagemodus', mountFailed: 'Koppelen mislukt', mountDesc: 'In sommige systemen is het noodzakelijk om de virtuele schijf op de externe host uit te werpen voordat het image wordt gekoppeld.', + unmountFailed: 'Ontkoppelen mislukt', + unmountDesc: + 'Op sommige systemen moet u de image handmatig uitwerpen van de externe host voordat u de image ontkoppelt.', + refresh: 'Vernieuw de afbeeldingenlijst', + attention: 'Let op', + deleteConfirm: 'Weet u zeker dat u deze afbeelding wilt verwijderen?', + okBtn: 'Ja', + cancelBtn: 'Nee', tips: { title: 'Hoe te uploaden', usb1: 'Verbind de NanoKVM met uw computer via USB.', @@ -130,6 +218,16 @@ const nl = { serialPort: 'Seriële poort', serialPortPlaceholder: 'Voer de seriële poort in', baudrate: 'Baudrate', + parity: 'Pariteit', + parityNone: 'Geen', + parityEven: 'Even', + parityOdd: 'Oneven', + flowControl: 'Debietregeling', + flowControlNone: 'Geen', + flowControlSoft: 'Software', + flowControlHard: 'Hardware', + dataBits: 'Databits', + stopBits: 'Stopbits', confirm: 'Ok' }, wol: { @@ -139,33 +237,66 @@ const nl = { input: 'Voer het MAC-adres in', ok: 'Ok' }, + download: { + title: 'Afbeeldingdownloader', + input: 'Voer een externe afbeelding in URL', + ok: 'Ok', + disabled: '/data partitie is RO, dus we kunnen de afbeelding niet downloaden', + uploadbox: 'Zet het bestand hier neer of klik om te selecteren', + inputfile: 'Voer het afbeeldingsbestand in', + NoISO: 'Geen ISO' + }, power: { title: 'Aan/uit', + showConfirm: 'Bevestiging', + showConfirmTip: 'Stroombedieningen vereisen een extra bevestiging', reset: 'Resetten', power: 'Aan/uit', powerShort: 'Aan/uit (kort indrukken)', - powerLong: 'Aan/uit (lang indrukken)' + powerLong: 'Aan/uit (lang indrukken)', + resetConfirm: 'Doorgaan met resetten?', + powerConfirm: 'Doorgaan met stroomvoorziening?', + okBtn: 'Ja', + cancelBtn: 'Nee' }, settings: { - title: 'Settings', + title: 'Instellingen', about: { title: 'Over NanoKVM', information: 'Informatie', ip: 'IP', mdns: 'mDNS', application: 'Applicatie versie', - applicationTip: 'NanoKVM web application version', + applicationTip: 'Versie van de NanoKVM-webapplicatie', image: 'Image versie', - imageTip: 'NanoKVM system image version', + imageTip: 'Versie van de NanoKVM-systeemimage', deviceKey: 'Apparaat sleutel', - community: 'Community' + community: 'Community', + hostname: 'Hostnaam', + hostnameUpdated: 'Hostnaam bijgewerkt. Start opnieuw op om toe te passen.', + ipType: { + Wired: 'Bedraad', + Wireless: 'Draadloos', + Other: 'Anders' + } }, appearance: { title: 'Uiterlijk', display: 'Beeldscherm', language: 'Taal', - menuBar: 'Menubalk', - menuBarDesc: 'Toon iconen in de menubalk' + languageDesc: 'Selecteer de taal voor de interface', + webTitle: 'Webtitel', + webTitleDesc: 'Pas de titel van de webpagina aan', + menuBar: { + title: 'Menubalk', + mode: 'Weergavemodus', + modeDesc: 'Geef de menubalk weer op het scherm', + modeOff: 'Uit', + modeAuto: 'Automatisch verbergen', + modeAlways: 'Altijd zichtbaar', + icons: 'Submenupictogrammen', + iconsDesc: 'Submenupictogrammen weergeven in de menubalk' + } }, device: { title: 'Apparaat', @@ -182,18 +313,62 @@ const nl = { 1800: '30 min', 3600: '1 uur' }, + ssh: { + description: 'Schakel SSH externe toegang in', + tip: 'Stel een sterk wachtwoord in voordat u (Account - Wachtwoord wijzigen) inschakelt' + }, + advanced: 'Geavanceerde instellingen', + swap: { + title: 'Wisselen', + disable: 'Uitschakelen', + description: 'Stel de grootte van het wisselbestand in', + tip: 'Het inschakelen van deze functie kan de bruikbare levensduur van uw SD-kaart verkorten!' + }, + mouseJiggler: { + title: 'Muisschommel', + description: 'Voorkom dat de externe host in slaap valt', + disable: 'Uitschakelen', + absolute: 'Absolute modus', + relative: 'Relatieve modus' + }, + mdns: { + description: 'Schakel de mDNS detectieservice in', + tip: 'Schakel het uit als het niet nodig is' + }, + hdmi: { + description: 'Schakel HDMI/monitoruitgang in' + }, + autostart: { + title: 'Instellingen voor automatisch starten van scripts', + description: + 'Beheer scripts die automatisch worden uitgevoerd bij het opstarten van het systeem', + new: 'Nieuw', + deleteConfirm: 'Weet u zeker dat u dit bestand wilt verwijderen?', + yes: 'Ja', + no: 'Nee', + scriptName: 'Scriptnaam automatisch starten', + scriptContent: 'Scriptinhoud automatisch starten', + settings: 'Instellingen' + }, + hidOnly: 'HID-Alleen modus', + hidOnlyDesc: + 'Stop met het emuleren van virtuele apparaten en behoud alleen de basisbesturing van HID', disk: 'Virtuele schijf', diskDesc: 'Koppel virtuele U-schijf aan de externe host', network: 'Virtueel Netwerk', - networkDesc: 'Koppel virtueel netwerk kaart aan de externe host' + networkDesc: 'Koppel virtueel netwerk kaart aan de externe host', + reboot: 'Opnieuw opstarten', + rebootDesc: 'Weet u zeker dat u NanoKVM opnieuw wilt opstarten?', + okBtn: 'Ja', + cancelBtn: 'Nee' }, network: { title: 'Netwerk', wifi: { - title: 'Wifi', - description: 'Configureer wifi', - apMode: 'AP-modus is ingeschakeld, maak verbinding met wifi door de QR-code te scannen', - connect: 'Wifi verbinden', + title: 'Wi-Fi', + description: 'Wi-Fi configureren', + apMode: 'AP-modus is ingeschakeld, maak verbinding met Wi-Fi door de QR-code te scannen', + connect: 'Wi-Fi verbinden', connectDesc1: 'Voer de netwerk-SSID en het wachtwoord in', connectDesc2: 'Voer het wachtwoord in om met dit netwerk te verbinden', disconnect: 'Weet je zeker dat je de netwerkverbinding wilt verbreken?', @@ -237,8 +412,11 @@ const nl = { title: 'Tailscale', memory: { title: 'Geheugen optimalisatie', - tip: "Wanneer geheugen gebruik de limiet overschreid, garbage collection wordt agressiever uitgevoerd om geheugen vrij te maken. geadviseerd om 50MB te kiezen als Tailscale wordt gebruikt. Tailscale moet worden herstart om de wijziging door te voeren.", - disable: 'Uitschakelen' + tip: 'Wanneer geheugen gebruik de limiet overschreid, garbage collection wordt agressiever uitgevoerd om geheugen vrij te maken. geadviseerd om 50MB te kiezen als Tailscale wordt gebruikt. Tailscale moet worden herstart om de wijziging door te voeren.' + }, + swap: { + title: 'Geheugen wisselen', + tip: 'Als de problemen aanhouden nadat u geheugenoptimalisatie hebt ingeschakeld, probeer dan het wisselgeheugen in te schakelen. Hierdoor wordt de grootte van het wisselbestand standaard ingesteld op 256MB, wat kan worden aangepast in "Instellingen > Apparaat".' }, restart: 'Weet u zeker dat u Tailscale opnieuw wilt opstarten?', stop: 'Weet u zeker dat u Tailscale wilt stoppen?', @@ -255,6 +433,8 @@ const nl = { upTailscale: 'Upload tailscale naar NanoKVM directory /usr/bin/', upTailscaled: 'Upload tailscaled naar NanoKVM directory /usr/sbin/', refresh: 'Vernieuw huidige pagina', + notRunning: 'Tailscale is niet actief. Start het programma om door te gaan.', + run: 'Begin', notLogin: 'Het apparaat is nog niet gekoppeld. Log in en koppel dit apparaat aan uw account.', urlPeriod: 'Deze url is 10 minuten geldig', @@ -265,7 +445,9 @@ const nl = { deviceIP: 'Apparaat IP', account: 'Account', logout: 'Uitloggen', - logout2: 'Weet u zeker dat u wilt uitloggen?', + logoutDesc: 'Weet u zeker dat u wilt uitloggen?', + uninstall: 'Verwijderen Tailscale', + uninstallDesc: 'Weet u zeker dat u Tailscale wilt verwijderen?', okBtn: 'Ja', cancelBtn: 'Nee' }, @@ -277,15 +459,161 @@ const nl = { available: 'Er is een update beschikbaar. Weet u zeker dat u wilt updaten?', updating: 'Update gestart. Even geduld a.u.b...', confirm: 'Bevestigen', - cancel: 'Annuleren' + cancel: 'Annuleren', + preview: 'Preview-updates', + previewDesc: 'Krijg vroegtijdig toegang tot nieuwe functies en verbeteringen', + previewTip: + 'Houd er rekening mee dat preview-releases bugs of onvolledige functionaliteit kunnen bevatten!', + offline: { + title: 'Offline-updates', + desc: 'Update via lokaal installatiepakket', + upload: 'Uploaden', + invalidName: 'Ongeldig bestandsnaamformaat. Download de versie van GitHub-releases.', + updateFailed: 'Update mislukt. Probeer het opnieuw.' + } }, account: { title: 'Account', webAccount: 'Web Account Naam', password: 'Wachtwoord', updateBtn: 'Update', - logoutBtn: 'Afmelden' + logoutBtn: 'Afmelden', + logoutDesc: 'Weet u zeker dat u wilt uitloggen?', + okBtn: 'Ja', + cancelBtn: 'Nee' } + }, + picoclaw: { + title: 'PicoClaw Assistent', + empty: 'Open het paneel en start een taak om te beginnen.', + inputPlaceholder: 'Beschrijf wat u wilt dat de PicoClaw doet', + newConversation: 'Nieuw gesprek', + processing: 'Verwerken...', + agent: { + defaultTitle: 'Algemene assistent', + defaultDescription: 'Algemene hulp bij chatten, zoeken en werkruimte.', + kvmTitle: 'Bediening op afstand', + kvmDescription: 'Bedien de externe host via NanoKVM.', + switched: 'Agentrol gewijzigd', + switchFailed: 'Kan agentrol niet wisselen' + }, + send: 'Verzenden', + cancel: 'Annuleren', + status: { + connecting: 'Verbinden met gateway...', + connected: 'PicoClaw-sessie verbonden', + disconnected: 'PicoClaw-sessie gesloten', + stopped: 'Stopverzoek verzonden', + runtimeStarted: 'PicoClaw runtime gestart', + runtimeStartFailed: 'Kan PicoClaw runtime niet starten', + runtimeStopped: 'PicoClaw runtime gestopt', + runtimeStopFailed: 'Kan PicoClaw runtime niet stoppen' + }, + connection: { + runtime: { + checking: 'Controleren', + ready: 'Runtime gereed', + stopped: 'Runtime gestopt', + unavailable: 'Runtime niet beschikbaar', + configError: 'Configuratiefout' + }, + transport: { + connecting: 'Verbinden', + connected: 'Verbonden' + }, + run: { + idle: 'Inactief', + busy: 'Bezet' + } + }, + message: { + toolAction: 'Actie', + observation: 'Observatie', + screenshot: 'Schermafbeelding' + }, + overlay: { + locked: 'PicoClaw bestuurt het apparaat. Handmatige invoer is gepauzeerd.' + }, + install: { + install: 'PicoClaw installeren', + installing: 'PicoClaw installeren', + success: 'PicoClaw is succesvol geïnstalleerd', + failed: 'Kan PicoClaw niet installeren', + uninstalling: 'Runtime verwijderen...', + uninstalled: 'Runtime is succesvol verwijderd.', + uninstallFailed: 'Verwijderen mislukt.', + requiredTitle: 'PicoClaw is niet geïnstalleerd', + requiredDescription: 'Installeer PicoClaw voordat u de runtime van PicoClaw start.', + progressDescription: 'PicoClaw wordt gedownload en geïnstalleerd.', + stages: { + preparing: 'Voorbereiden', + downloading: 'Downloaden', + extracting: 'Uitpakken', + installing: 'Installeren', + installed: 'Geïnstalleerd', + install_timeout: 'Time-out', + install_failed: 'Mislukt' + } + }, + model: { + requiredTitle: 'Modelconfiguratie is vereist', + requiredDescription: 'Configureer het PicoClaw-model voordat u PicoClaw chat gebruikt.', + docsTitle: 'Configuratiehandleiding', + docsDesc: 'Ondersteunde modellen en protocollen', + menuLabel: 'Model configureren', + modelIdentifier: 'Modelidentificatie', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API-sleutel', + apiKeyPlaceholder: 'Voer de API-sleutel van het model in', + save: 'Opslaan', + saving: 'Opslaan', + saved: 'Modelconfiguratie opgeslagen', + saveFailed: 'Kan de modelconfiguratie niet opslaan', + invalid: 'Model-ID, API Base URL en API-sleutel zijn vereist' + }, + uninstall: { + menuLabel: 'Verwijderen', + confirmTitle: 'PicoClaw verwijderen', + confirmContent: + 'Weet u zeker dat u PicoClaw wilt verwijderen? Hiermee worden het uitvoerbare bestand en alle configuratiebestanden verwijderd.', + confirmOk: 'Verwijderen', + confirmCancel: 'Annuleren' + }, + history: { + title: 'Geschiedenis', + loading: 'Sessies laden...', + emptyTitle: 'Nog geen geschiedenis', + emptyDescription: 'Eerdere PicoClaw sessies verschijnen hier.', + loadFailed: 'Kan de sessiegeschiedenis niet laden', + deleteFailed: 'Kan sessie niet verwijderen', + deleteConfirmTitle: 'Sessie verwijderen', + deleteConfirmContent: 'Weet u zeker dat u "{{title}}" wilt verwijderen?', + deleteConfirmOk: 'Verwijderen', + deleteConfirmCancel: 'Annuleren', + messageCount_one: '{{count}} bericht', + messageCount_other: '{{count}} berichten' + }, + config: { + startRuntime: 'Start PicoClaw', + stopRuntime: 'Stop PicoClaw' + }, + start: { + title: 'Start PicoClaw', + description: 'Start de runtime om de PicoClaw assistent te gaan gebruiken.' + } + }, + error: { + title: 'Er is een probleem opgetreden', + refresh: 'Vernieuwen' + }, + fullscreen: { + toggle: 'Volledig scherm schakelen' + }, + menu: { + collapse: 'Menu samenvouwen', + expand: 'Menu uitvouwen' } } }; diff --git a/web/src/i18n/locales/pl.ts b/web/src/i18n/locales/pl.ts index ceac4c4..e4f7176 100644 --- a/web/src/i18n/locales/pl.ts +++ b/web/src/i18n/locales/pl.ts @@ -2,13 +2,13 @@ const pl = { translation: { head: { desktop: 'Zdalny pulpit', - login: 'Login', + login: 'Logowanie', changePassword: 'Zmień Hasło', terminal: 'Terminal', wifi: 'Wi-Fi' }, auth: { - login: 'Login', + login: 'Logowanie', placeholderUsername: 'Wprowadź nazwę użykownika', placeholderPassword: 'wprowadź hasło', placeholderPassword2: 'wprowadź hasło ponownie', @@ -17,6 +17,8 @@ const pl = { noAccount: 'Nie udało się uzyskać informacji o użytkowniku, odśwież stronę lub zresetuj hasło', invalidUser: 'Błędne hasło lub nazwa użykownika', + locked: 'Zbyt wiele loginów, spróbuj ponownie później', + globalLocked: 'System chroniony, spróbuj ponownie później', error: 'niespodziewany błąd', changePassword: 'Zmień Hasło', changePasswordDesc: @@ -31,17 +33,37 @@ const pl = { tips: { reset1: 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', - reset2: 'For detailed steps, please consult this document:', - reset3: 'Web default account:', - reset4: 'SSH default account:', - change1: 'Please note that this action will change the following passwords:', - change2: 'Web login password', - change3: 'System root password (SSH login password)', - change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + reset2: 'Szczegółowe kroki znajdziesz w tym dokumencie:', + reset3: 'Domyślne konto web:', + reset4: 'Domyślne konto SSH:', + change1: 'Pamiętaj, że ta operacja zmieni następujące hasła:', + change2: 'Hasło logowania web', + change3: 'Hasło roota systemu (hasło logowania SSH)', + change4: 'Aby zresetować hasła, naciśnij i przytrzymaj przycisk BOOT na NanoKVM.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'Skonfiguruj Wi-Fi dla NanoKVM', + success: 'Proszę podejść do urządzenia, aby sprawdzić stan sieci NanoKVM.', + failed: 'Operacja nie powiodła się, spróbuj ponownie.', + invalidMode: + 'Bieżący tryb nie obsługuje konfiguracji sieci. Przejdź do swojego urządzenia i włącz tryb konfiguracji Wi-Fi.', + confirmBtn: 'Ok', + finishBtn: 'Zakończono', + ap: { + authTitle: 'Wymagane uwierzytelnienie', + authDescription: 'Aby kontynuować, wprowadź AP hasło', + authFailed: 'Nieprawidłowe hasło AP', + passPlaceholder: 'AP hasło', + verifyBtn: 'Sprawdź' } }, screen: { + scale: 'Skala', + title: 'Ekran', video: 'Tryb wideo', + videoDirectTips: 'Włącz HTTPS w „Ustawienia > Urządzenie”, aby korzystać z tego trybu', resolution: 'Rozdzielczość', auto: 'Automatyczny', autoTips: @@ -56,17 +78,66 @@ const pl = { frameDetect: 'Wykrywanie klatek', frameDetectTip: 'Obliczanie różnicy między klatkami. Zatrzymaj transmisję strumienia wideo, gdy na ekranie zdalnego hosta nie zostaną wykryte żadne zmiany.', - resetHdmi: 'Reset HDMI' + resetHdmi: 'Resetuj HDMI' }, keyboard: { + title: 'Klawiatura', paste: 'Wklej', tips: 'Tylko standardowe klawiaturowe znaki i symbole są obsługiwane.', placeholder: 'Proszę wprowadzić coś', submit: 'Prześlij', virtual: 'Klawiatura', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Czytaj ze schowka', + clipboardPermissionDenied: + 'Odmowa dostępu do schowka. Zezwól na dostęp do schowka w przeglądarce.', + clipboardReadError: 'Nie udało się odczytać schowka', + dropdownEnglish: 'Angielski', + dropdownGerman: 'niemiecki', + dropdownFrench: 'Francuski', + dropdownRussian: 'Rosyjski', + shortcut: { + title: 'Skróty', + custom: 'Niestandardowe', + capture: 'Kliknij tutaj, aby przechwycić skrót', + clear: 'Jasne', + save: 'Zapisz', + captureTips: + 'Przechwytywanie klawiszy systemowych (takich jak klawisz Windows) wymaga uprawnienia do pełnego ekranu.', + enterFullScreen: 'Przełącz tryb pełnoekranowy.' + }, + leaderKey: { + title: 'Klawisz Leader', + desc: 'Omiń ograniczenia przeglądarki i wyślij skróty systemowe bezpośrednio do zdalnego hosta.', + howToUse: 'Jak używać', + simultaneous: { + title: 'Tryb symultaniczny', + desc1: 'Naciśnij i przytrzymaj klawisz Leader, a następnie naciśnij skrót.', + desc2: 'Intuicyjne, ale może kolidować ze skrótami systemowymi.' + }, + sequential: { + title: 'Tryb sekwencyjny', + desc1: + 'Naciśnij klawisz Leader → naciśnij skrót w sekwencji → ponownie naciśnij klawisz Leader.', + desc2: + 'Wymaga większej liczby kroków, ale całkowicie pozwala uniknąć konfliktów systemowych.' + }, + enable: 'Włącz klawisz Leader', + tip: 'Po przypisaniu jako klawisz Leader ten klawisz działa wyłącznie jako wyzwalacz skrótów i traci swoje domyślne zachowanie.', + placeholder: 'Naciśnij klawisz Leader', + shiftRight: 'Prawy Shift', + ctrlRight: 'Prawy Ctrl', + metaRight: 'Prawy Win', + submit: 'Prześlij', + recorder: { + rec: 'NAGR', + activate: 'Aktywuj klawisze', + input: 'Proszę nacisnąć skrót...' + } + } }, mouse: { + title: 'Mysz', + cursor: 'Styl kursora', default: 'Domyślny kursor', pointer: 'Wskazujący kursor', cell: 'Kursor komórki', @@ -76,16 +147,40 @@ const pl = { mode: 'Tryb myszki', absolute: 'Tryb bezwzględny', relative: 'Tryb względny', + direction: 'Kierunek kółka przewijania', + scrollUp: 'Przewiń w górę', + scrollDown: 'Przewiń w dół', + speed: 'Szybkość kółka przewijania', + fast: 'Szybko', + slow: 'Powoli', requestPointer: 'Korzystanie z trybu względnego. Kliknij pulpit, aby uzyskać wskaźnik myszy.', - resetHid: 'Zresetuj HID' + resetHid: 'Zresetuj HID', + hidOnly: { + title: 'Tryb tylko HID', + desc: 'Jeśli mysz i klawiatura przestaną odpowiadać, a resetowanie HID nie pomoże, może to oznaczać problem ze zgodnością między NanoKVM a urządzeniem. Spróbuj włączyć tryb HID-Only, aby uzyskać lepszą kompatybilność.', + tip1: 'Włączenie trybu HID-Only spowoduje odmontowanie wirtualnego dysku U i sieci wirtualnej', + tip2: 'W trybie HID-Only montowanie obrazu jest wyłączone', + tip3: 'NanoKVM automatycznie uruchomi się ponownie po przełączeniu trybów', + enable: 'Włącz tryb HID-Only', + disable: 'Wyłącz tryb HID-Tylko' + } }, image: { title: 'Obrazy', loading: 'Ładowanie...', empty: 'Nic nie znaleziono', + mountMode: 'Tryb montowania', mountFailed: 'Nie udało się zamontować obrazu', mountDesc: 'W niektórych systemach wymagane jest wyjęcie dysku wirtualnego na zdalnym hoście przed zamontowaniem obrazu.', + unmountFailed: 'Odmontowanie nie powiodło się', + unmountDesc: + 'W niektórych systemach należy ręcznie wysunąć obraz ze zdalnego hosta przed odmontowaniem obrazu.', + refresh: 'Odśwież listę obrazów', + attention: 'Uwaga', + deleteConfirm: 'Czy na pewno chcesz usunąć to zdjęcie?', + okBtn: 'Tak', + cancelBtn: 'Nie', tips: { title: 'Jak przesłać obrazy', usb1: 'Podłącz urządzenie NanoKVM do komputera przez USB.', @@ -124,12 +219,12 @@ const pl = { baudrate: 'Szybkość transmisji', parity: 'Kontrola parzystości', parityNone: 'Brak kontroli', - parityEven: 'Parzystość', - parityOdd: 'Nieparzystość', + parityEven: 'Parzysta', + parityOdd: 'Nieparzysta', flowControl: 'Kontrola przepływu', flowControlNone: 'Brak kontroli', - flowControlSoft: 'Miękka', - flowControlHard: 'Twarda', + flowControlSoft: 'Programowe', + flowControlHard: 'Sprzętowe', dataBits: 'Bity danych', stopBits: 'Bity stopu', confirm: 'Ok' @@ -141,40 +236,73 @@ const pl = { input: 'Wprowadź numer adresu MAC', ok: 'Ok' }, + download: { + title: 'Narzędzie do pobierania obrazów', + input: 'Proszę wprowadzić zdalny obraz URL', + ok: 'Ok', + disabled: '/data partycja to RO, więc nie możemy pobrać obrazu', + uploadbox: 'Upuść plik tutaj lub kliknij, aby wybrać', + inputfile: 'Proszę wprowadzić plik obrazu', + NoISO: 'Brak ISO' + }, power: { title: 'Zasilanie', - reset: 'Reset', + showConfirm: 'Potwierdzenie', + showConfirmTip: 'Operacje zasilania wymagają dodatkowego potwierdzenia', + reset: 'Resetuj', power: 'Zasilanie', powerShort: 'Zasilanie (krótkie kliknięcie)', - powerLong: 'Zasilanie (długie kliknięcie)' + powerLong: 'Zasilanie (długie kliknięcie)', + resetConfirm: 'Kontynuować operację resetowania?', + powerConfirm: 'Kontynuować zasilanie?', + okBtn: 'Tak', + cancelBtn: 'Nie' }, settings: { - title: 'Settings', + title: 'Ustawienia', about: { title: 'NanoKVM - informacje', information: 'Informacje o systemie', ip: 'IP', mdns: 'mDNS', application: 'Wersja oprogramowania', - applicationTip: 'NanoKVM web application version', + applicationTip: 'Wersja aplikacji web NanoKVM', image: 'Wersja obrazu', - imageTip: 'NanoKVM system image version', + imageTip: 'Wersja obrazu systemu NanoKVM', deviceKey: 'Klucz urządzenia', - community: 'Społeczność' + community: 'Społeczność', + hostname: 'Nazwa hosta', + hostnameUpdated: 'Zaktualizowano nazwę hosta. Uruchom ponownie, aby zastosować.', + ipType: { + Wired: 'Przewodowy', + Wireless: 'Bezprzewodowe', + Other: 'Inne' + } }, appearance: { - title: 'Appearance', - display: 'Display', - language: 'Language', - menuBar: 'Menu Bar', - menuBarDesc: 'Display icons in the menu bar' + title: 'Wygląd', + display: 'Ekran', + language: 'Język', + languageDesc: 'Wybierz język interfejsu', + webTitle: 'Tytuł strony internetowej', + webTitleDesc: 'Dostosuj tytuł strony internetowej', + menuBar: { + title: 'Pasek menu', + mode: 'Tryb wyświetlania', + modeDesc: 'Wyświetl pasek menu na ekranie', + modeOff: 'Wyłączone', + modeAuto: 'Automatyczne ukrywanie', + modeAlways: 'Zawsze widoczny', + icons: 'Ikony podmenu', + iconsDesc: 'Wyświetla ikony podmenu na pasku menu' + } }, device: { - title: 'Device', + title: 'Urządzenie', oled: { title: 'OLED', description: 'OLED screen automatically sleep', - 0: 'Never', + 0: 'Nigdy', 15: '15 sec', 30: '30 sec', 60: '1 min', @@ -182,12 +310,56 @@ const pl = { 300: '5 min', 600: '10 min', 1800: '30 min', - 3600: '1 hour' + 3600: '1 godzina' }, - disk: 'Virtual Disk', + ssh: { + description: 'Włącz SSH zdalny dostęp', + tip: 'Ustaw silne hasło przed włączeniem (Konto - Zmień hasło)' + }, + advanced: 'Ustawienia zaawansowane', + swap: { + title: 'Zamień', + disable: 'Wyłącz', + description: 'Ustaw rozmiar pliku wymiany', + tip: 'Włączenie tej funkcji może skrócić żywotność karty SD!' + }, + mouseJiggler: { + title: 'Jiggler myszy', + description: 'Uniemożliwia uśpienie zdalnego hosta', + disable: 'Wyłącz', + absolute: 'Tryb absolutny', + relative: 'Tryb względny' + }, + mdns: { + description: 'Włącz usługę wykrywania mDNS', + tip: 'Wyłączanie, jeśli nie jest potrzebne' + }, + hdmi: { + description: 'Włącz HDMI/wyjście monitora' + }, + autostart: { + title: 'Ustawienia skryptów autostartu', + description: + 'Zarządzaj skryptami uruchamianymi automatycznie podczas uruchamiania systemu', + new: 'Nowy', + deleteConfirm: 'Czy na pewno chcesz usunąć ten plik?', + yes: 'Tak', + no: 'Nie', + scriptName: 'Nazwa skryptu autostartu', + scriptContent: 'Treść skryptu autostartu', + settings: 'Ustawienia' + }, + hidOnly: 'HID – tylko tryb', + hidOnlyDesc: + 'Przestań emulować urządzenia wirtualne, zachowując jedynie podstawową kontrolę HID', + disk: 'Dysk wirtualny', diskDesc: 'Mount virtual U-disk on the remote host', - network: 'Virtual Network', - networkDesc: 'Mount virtual network card on the remote host' + network: 'Sieć wirtualna', + networkDesc: 'Zamontuj wirtualną kartę sieciową na zdalnym hoście', + reboot: 'Uruchom ponownie', + rebootDesc: 'Czy na pewno chcesz ponownie uruchomić NanoKVM?', + okBtn: 'Tak', + cancelBtn: 'Nie' }, network: { title: 'Sieć', @@ -238,9 +410,12 @@ const pl = { tailscale: { title: 'Tailscale', memory: { - title: 'Memory optimization', - tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect.", - disable: 'Disable' + title: 'Optymalizacja pamięci', + tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect." + }, + swap: { + title: 'Zamień pamięć', + tip: 'Jeśli po włączeniu optymalizacji pamięci problemy nadal występują, spróbuj włączyć pamięć wymiany. Spowoduje to ustawienie domyślnego rozmiaru pliku wymiany na 256MB, który można dostosować w „Ustawienia > Urządzenie”.' }, restart: 'Are you sure to restart Tailscale?', stop: 'Are you sure to stop Tailscale?', @@ -257,6 +432,8 @@ const pl = { upTailscale: 'Prześlij tailscale do NanoKVM w katalogu /usr/bin/', upTailscaled: 'Prześlij tailscaled do NanoKVM w katalogu /usr/sbin/', refresh: 'Odśwież obecną stronę', + notRunning: 'Tailscale nie działa. Rozpocznij, aby kontynuować.', + run: 'Rozpocznij', notLogin: 'Urządzenie nie zostało jeszcze powiązane. Zaloguj się i powiąż to urządzenie ze swoim kontem.', urlPeriod: 'Ten URL jest ważny przez 10 minut', @@ -267,7 +444,9 @@ const pl = { deviceIP: 'Adres IP urządzenia', account: 'Konto', logout: 'Wyloguj', - logout2: 'Chcesz się wylogować?', + logoutDesc: 'Czy na pewno chcesz się wylogować?', + uninstall: 'Odinstaluj Tailscale', + uninstallDesc: 'Czy na pewno chcesz odinstalować Tailscale?', okBtn: 'Yes', cancelBtn: 'No' }, @@ -279,15 +458,161 @@ const pl = { available: 'Aktualizacja jest dostępna. Czy na pewno chcesz dokonać aktualizacji?', updating: 'Aktualizacja rozpoczęta. Proszę czekać...', confirm: 'Potwierdź', - cancel: 'Anuluj' + cancel: 'Anuluj', + preview: 'Podgląd aktualizacji', + previewDesc: 'Uzyskaj wcześniejszy dostęp do nowych funkcji i ulepszeń', + previewTip: + 'Należy pamiętać, że wersje poglądowe mogą zawierać błędy lub niekompletną funkcjonalność!', + offline: { + title: 'Aktualizacje offline', + desc: 'Aktualizacja poprzez lokalny pakiet instalacyjny', + upload: 'Prześlij', + invalidName: 'Nieprawidłowy format nazwy pliku. Proszę pobrać z wydań GitHub.', + updateFailed: 'Aktualizacja nie powiodła się. Spróbuj ponownie.' + } }, account: { - title: 'Account', - webAccount: 'Web Account Name', - password: 'Password', + title: 'Konto', + webAccount: 'Nazwa konta web', + password: 'Hasło', updateBtn: 'Update', - logoutBtn: 'Logout' + logoutBtn: 'Wyloguj', + logoutDesc: 'Czy na pewno chcesz się wylogować?', + okBtn: 'Tak', + cancelBtn: 'Nie' } + }, + picoclaw: { + title: 'PicoClaw Asystent', + empty: 'Otwórz panel i rozpocznij zadanie.', + inputPlaceholder: 'Opisz, co chcesz, aby PicoClaw zrobił', + newConversation: 'Nowa rozmowa', + processing: 'Przetwarzanie...', + agent: { + defaultTitle: 'Asystent ogólny', + defaultDescription: 'Ogólna pomoc dotycząca czatu, wyszukiwania i przestrzeni roboczej.', + kvmTitle: 'Zdalne sterowanie', + kvmDescription: 'Sterowanie zdalnym hostem poprzez NanoKVM.', + switched: 'Rola agenta została zmieniona', + switchFailed: 'Nie udało się zmienić roli agenta' + }, + send: 'Wyślij', + cancel: 'Anuluj', + status: { + connecting: 'Łączenie z bramką...', + connected: 'Sesja PicoClaw połączona', + disconnected: 'Sesja PicoClaw zamknięta', + stopped: 'Wysłano żądanie zatrzymania', + runtimeStarted: 'Runtime PicoClaw uruchomiony', + runtimeStartFailed: 'Nie udało się uruchomić runtime PicoClaw', + runtimeStopped: 'Runtime PicoClaw zatrzymany', + runtimeStopFailed: 'Nie udało się zatrzymać runtime PicoClaw' + }, + connection: { + runtime: { + checking: 'Sprawdzam', + ready: 'Runtime gotowy', + stopped: 'Runtime zatrzymany', + unavailable: 'Runtime niedostępny', + configError: 'Błąd konfiguracji' + }, + transport: { + connecting: 'Łączenie', + connected: 'Połączono' + }, + run: { + idle: 'Bezczynność', + busy: 'Zajęty' + } + }, + message: { + toolAction: 'Akcja', + observation: 'Obserwacja', + screenshot: 'Zrzut ekranu' + }, + overlay: { + locked: 'PicoClaw steruje urządzeniem. Wprowadzanie ręczne zostało wstrzymane.' + }, + install: { + install: 'Zainstaluj PicoClaw', + installing: 'Instalowanie PicoClaw', + success: 'PicoClaw zainstalowano pomyślnie', + failed: 'Nie udało się zainstalować PicoClaw', + uninstalling: 'Odinstalowywanie runtime...', + uninstalled: 'Runtime został pomyślnie odinstalowany.', + uninstallFailed: 'Odinstalowanie nie powiodło się.', + requiredTitle: 'PicoClaw nie jest zainstalowany', + requiredDescription: 'Zainstaluj PicoClaw przed uruchomieniem runtime PicoClaw.', + progressDescription: 'PicoClaw jest pobierany i instalowany.', + stages: { + preparing: 'Przygotowanie', + downloading: 'Pobieranie', + extracting: 'Wypakowywanie', + installing: 'Instalowanie', + installed: 'Zainstalowano', + install_timeout: 'Upłynął limit czasu', + install_failed: 'Niepowodzenie' + } + }, + model: { + requiredTitle: 'Wymagana jest konfiguracja modelu', + requiredDescription: 'Skonfiguruj model PicoClaw przed użyciem czatu PicoClaw.', + docsTitle: 'Przewodnik konfiguracji', + docsDesc: 'Obsługiwane modele i protokoły', + menuLabel: 'Skonfiguruj model', + modelIdentifier: 'Identyfikator modelu', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'Klucz API', + apiKeyPlaceholder: 'Wprowadź klucz API modelu', + save: 'Zapisz', + saving: 'Zapisywanie', + saved: 'Konfiguracja modelu została zapisana', + saveFailed: 'Nie udało się zapisać konfiguracji modelu', + invalid: 'Identyfikator modelu, API Base URL i klucz API są wymagane' + }, + uninstall: { + menuLabel: 'Odinstaluj', + confirmTitle: 'Odinstaluj PicoClaw', + confirmContent: + 'Czy na pewno chcesz odinstalować PicoClaw? Spowoduje to usunięcie pliku wykonywalnego i wszystkich plików konfiguracyjnych.', + confirmOk: 'Odinstaluj', + confirmCancel: 'Anuluj' + }, + history: { + title: 'Historia', + loading: 'Ładowanie sesji...', + emptyTitle: 'Nie ma jeszcze historii', + emptyDescription: 'Tutaj pojawią się poprzednie sesje PicoClaw.', + loadFailed: 'Nie udało się załadować historii sesji', + deleteFailed: 'Nie udało się usunąć sesji', + deleteConfirmTitle: 'Usuń sesję', + deleteConfirmContent: 'Czy na pewno chcesz usunąć „{{title}}”?', + deleteConfirmOk: 'Usuń', + deleteConfirmCancel: 'Anuluj', + messageCount_one: '{{count}} wiadomość', + messageCount_other: '{{count}} wiadomości' + }, + config: { + startRuntime: 'Uruchom PicoClaw', + stopRuntime: 'Zatrzymaj PicoClaw' + }, + start: { + title: 'Uruchom PicoClaw', + description: 'Uruchom runtime, aby rozpocząć korzystanie z asystenta PicoClaw.' + } + }, + error: { + title: 'Wystąpił problem', + refresh: 'Odśwież' + }, + fullscreen: { + toggle: 'Przełącz tryb pełnoekranowy' + }, + menu: { + collapse: 'Zwiń menu', + expand: 'Rozwiń Menu' } } }; diff --git a/web/src/i18n/locales/pt_br.ts b/web/src/i18n/locales/pt_br.ts index cbf79ad..538162b 100644 --- a/web/src/i18n/locales/pt_br.ts +++ b/web/src/i18n/locales/pt_br.ts @@ -14,8 +14,11 @@ const pt_br = { placeholderPassword2: 'Por favor, digite a senha novamente', noEmptyUsername: 'Nome de usuário é obrigatório', noEmptyPassword: 'Senha é obrigatória', - noAccount: 'Falha ao obter informações do usuário, por favor atualize a página ou redefina a senha', + noAccount: + 'Falha ao obter informações do usuário, por favor atualize a página ou redefina a senha', invalidUser: 'Nome de usuário ou senha inválidos', + locked: 'Muitos logins, tente novamente mais tarde', + globalLocked: 'Sistema sob proteção, tente novamente mais tarde', error: 'Erro inesperado', changePassword: 'Mudar Senha', changePasswordDesc: 'Para a segurança do seu dispositivo, por favor, mude a senha!', @@ -27,7 +30,8 @@ const pt_br = { cancel: 'Cancelar', loginButtonText: 'Login', tips: { - reset1: 'Para redefinir as senhas, pressione e segure o botão BOOT no NanoKVM por 10 segundos.', + reset1: + 'Para redefinir as senhas, pressione e segure o botão BOOT no NanoKVM por 10 segundos.', reset2: 'Para etapas detalhadas, por favor, consulte este documento:', reset3: 'Conta padrão da Web:', reset4: 'Conta padrão SSH:', @@ -42,16 +46,27 @@ const pt_br = { description: 'Configurar Wi-Fi para o NanoKVM', success: 'Por favor, verifique o status da rede do NanoKVM e visite o novo endereço IP.', failed: 'Operação falhou, por favor, tente novamente.', + invalidMode: + 'O modo atual não suporta configuração de rede. Vá para o seu dispositivo e ative o modo de configuração Wi-Fi.', confirmBtn: 'Ok', - finishBtn: 'Finalizado' + finishBtn: 'Finalizado', + ap: { + authTitle: 'Autenticação necessária', + authDescription: 'Por favor, digite a senha AP para continuar', + authFailed: 'Senha AP inválida', + passPlaceholder: 'AP senha', + verifyBtn: 'Verificar' + } }, screen: { + scale: 'Escala', title: 'Tela', video: 'Modo de Vídeo', videoDirectTips: 'Ative HTTPS em "Configurações > Dispositivo" para usar este modo', resolution: 'Resolução', auto: 'Automático', - autoTips: 'Rasgos na tela ou desvio do mouse podem ocorrer em resoluções específicas. Considere ajustar a resolução do host remoto ou desativar o modo automático.', + autoTips: + 'Rasgos na tela ou desvio do mouse podem ocorrer em resoluções específicas. Considere ajustar a resolução do host remoto ou desativar o modo automático.', fps: 'FPS', customizeFps: 'Personalizar', quality: 'Qualidade', @@ -60,7 +75,8 @@ const pt_br = { qualityMedium: 'Média', qualityLow: 'Baixa', frameDetect: 'Detecção de Quadros', - frameDetectTip: 'Calcular a diferença entre os quadros. Parar a transmissão de vídeo quando nenhuma alteração for detectada na tela do host remoto.', + frameDetectTip: + 'Calcular a diferença entre os quadros. Parar a transmissão de vídeo quando nenhuma alteração for detectada na tela do host remoto.', resetHdmi: 'Redefinir HDMI' }, keyboard: { @@ -70,7 +86,52 @@ const pt_br = { placeholder: 'Por favor, digite', submit: 'Enviar', virtual: 'Teclado', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Ler da área de transferência', + clipboardPermissionDenied: + 'Permissão da área de transferência negada. Permita o acesso à área de transferência no seu navegador.', + clipboardReadError: 'Falha ao ler a área de transferência', + dropdownEnglish: 'Inglês', + dropdownGerman: 'Alemão', + dropdownFrench: 'Francês', + dropdownRussian: 'Russo', + shortcut: { + title: 'Atalhos', + custom: 'Personalizado', + capture: 'Clique aqui para capturar o atalho', + clear: 'Limpar', + save: 'Salvar', + captureTips: + 'Capturar teclas do sistema (como a tecla Windows) requer permissão de tela cheia.', + enterFullScreen: 'Alternar modo de tela cheia.' + }, + leaderKey: { + title: 'Tecla Leader', + desc: 'Ignore as restrições do navegador e envie atalhos do sistema diretamente para o host remoto.', + howToUse: 'Como usar', + simultaneous: { + title: 'Modo Simultâneo', + desc1: 'Pressione e segure a tecla Leader e depois pressione o atalho.', + desc2: 'Intuitivo, mas pode entrar em conflito com atalhos do sistema.' + }, + sequential: { + title: 'Modo Sequencial', + desc1: + 'Pressione a tecla Leader → pressione o atalho em sequência → pressione a tecla Leader novamente.', + desc2: 'Requer mais etapas, mas evita completamente conflitos de sistema.' + }, + enable: 'Habilitar tecla Leader', + tip: 'Quando atribuída como tecla Leader, esta tecla funciona apenas como gatilho de atalho e perde seu comportamento padrão.', + placeholder: 'Pressione a tecla Leader', + shiftRight: 'Shift direito', + ctrlRight: 'Ctrl direito', + metaRight: 'Win direito', + submit: 'Enviar', + recorder: { + rec: 'REC', + activate: 'Ativar teclas', + input: 'Por favor, pressione o atalho...' + } + } }, mouse: { title: 'Mouse', @@ -84,13 +145,17 @@ const pt_br = { mode: 'Modo do mouse', absolute: 'Modo absoluto', relative: 'Modo relativo', - speed: 'Velocidade da roda', + direction: 'Direção da roda de rolagem', + scrollUp: 'Role para cima', + scrollDown: 'Role para baixo', + speed: 'Velocidade da roda de rolagem', fast: 'Rápido', slow: 'Lento', - requestPointer: 'Usando modo relativo. Por favor, clique na área de trabalho para obter o ponteiro do mouse.', + requestPointer: + 'Usando modo relativo. Por favor, clique na área de trabalho para obter o ponteiro do mouse.', resetHid: 'Redefinir HID', hidOnly: { - title: 'Modo Somente-HID', + title: 'Modo somente HID', desc: 'Se o seu mouse e teclado pararem de responder e a redefinição de HID não ajudar, pode ser um problema de compatibilidade entre o NanoKVM e o dispositivo. Tente habilitar o modo Somente-HID para melhor compatibilidade.', tip1: 'Habilitar o modo Somente-HID irá desmontar o U-disk virtual e a rede virtual', tip2: 'No modo Somente-HID, a montagem de imagem está desativada', @@ -103,10 +168,18 @@ const pt_br = { title: 'Imagens', loading: 'Carregando...', empty: 'Nada Encontrado', - cdrom: 'Montar a imagem no modo CD-ROM', + mountMode: 'Modo de montagem', mountFailed: 'Falha na Montagem', - mountDesc: 'Em alguns sistemas, é necessário ejetar o disco virtual no host remoto antes de montar a imagem.', + mountDesc: + 'Em alguns sistemas, é necessário ejetar o disco virtual no host remoto antes de montar a imagem.', + unmountFailed: 'Falha na desmontagem', + unmountDesc: + 'Em alguns sistemas, é necessário ejetar manualmente do host remoto antes de desmontar a imagem.', refresh: 'Atualizar a lista de imagens', + attention: 'Atenção', + deleteConfirm: 'Tem certeza que deseja excluir esta imagem?', + okBtn: 'Sim', + cancelBtn: 'Não', tips: { title: 'Como fazer upload', usb1: 'Conecte o NanoKVM ao seu computador via USB.', @@ -166,7 +239,10 @@ const pt_br = { title: 'Baixador de Imagens', input: 'Por favor, digite uma URL de imagem remota', ok: 'Ok', - disabled: 'A partição /data é RO, então não podemos baixar a imagem' + disabled: 'A partição /data é RO, então não podemos baixar a imagem', + uploadbox: 'Solte o arquivo aqui ou clique para selecionar', + inputfile: 'Por favor insira o arquivo de imagem', + NoISO: 'Sem ISO' }, power: { title: 'Energia', @@ -206,10 +282,19 @@ const pt_br = { title: 'Aparência', display: 'Exibição', language: 'Idioma', - menuBar: 'Barra de Menu', - menuBarDesc: 'Exibir ícones na barra de menu', + languageDesc: 'Selecione o idioma da interface', webTitle: 'Título da Web', - webTitleDesc: 'Personalizar o título da página web' + webTitleDesc: 'Personalizar o título da página web', + menuBar: { + title: 'Barra de Menu', + mode: 'Modo de exibição', + modeDesc: 'Exibir barra de menu na tela', + modeOff: 'Desligado', + modeAuto: 'Ocultar automaticamente', + modeAlways: 'Sempre visível', + icons: 'Ícones do submenu', + iconsDesc: 'Exibir ícones de submenus na barra de menu' + } }, device: { title: 'Dispositivo', @@ -251,7 +336,20 @@ const pt_br = { hdmi: { description: 'Habilitar saída HDMI/monitor' }, + autostart: { + title: 'Configurações de scripts de inicialização automática', + description: + 'Gerencia scripts que são executados automaticamente na inicialização do sistema', + new: 'Novo', + deleteConfirm: 'Tem certeza de que deseja excluir este arquivo?', + yes: 'Sim', + no: 'Não', + scriptName: 'Nome do script de inicialização automática', + scriptContent: 'Conteúdo do script de inicialização automática', + settings: 'Configurações' + }, hidOnly: 'Modo Somente-HID', + hidOnlyDesc: 'Pare de emular dispositivos virtuais, mantendo apenas o controle básico HID', disk: 'Disco Virtual', diskDesc: 'Montar U-disk virtual no host remoto', network: 'Rede Virtual', @@ -311,8 +409,11 @@ const pt_br = { title: 'Tailscale', memory: { title: 'Otimização de memória', - tip: 'Quando o uso de memória excede o limite, a coleta de lixo é realizada de forma mais agressiva para tentar liberar memória. Recomenda-se definir para 75MB se estiver usando Tailscale. É necessário reiniciar o Tailscale para que a alteração tenha efeito.', - disable: 'Desativar' + tip: 'Quando o uso de memória excede o limite, a coleta de lixo é realizada de forma mais agressiva para tentar liberar memória. Recomenda-se definir para 75MB se estiver usando Tailscale. É necessário reiniciar o Tailscale para que a alteração tenha efeito.' + }, + swap: { + title: 'Trocar memória', + tip: 'Se os problemas persistirem após ativar a otimização de memória, tente ativar a memória swap. Isso define o tamanho do arquivo de troca para 256MB por padrão, que pode ser ajustado em "Configurações > Dispositivo".' }, restart: 'Reiniciar Tailscale?', stop: 'Parar Tailscale?', @@ -329,7 +430,10 @@ const pt_br = { upTailscale: 'Fazer upload do tailscale para o diretório NanoKVM /usr/bin/', upTailscaled: 'Fazer upload do tailscaled para o diretório NanoKVM /usr/sbin/', refresh: 'Atualizar página atual', - notLogin: 'O dispositivo ainda não foi vinculado. Por favor, faça login e vincule este dispositivo à sua conta.', + notRunning: 'Tailscale não está em execução. Por favor, inicie-o para continuar.', + run: 'Iniciar', + notLogin: + 'O dispositivo ainda não foi vinculado. Por favor, faça login e vincule este dispositivo à sua conta.', urlPeriod: 'Esta URL é válida por 10 minutos', login: 'Login', loginSuccess: 'Login Bem-sucedido', @@ -340,6 +444,7 @@ const pt_br = { logout: 'Sair', logoutDesc: 'Tem certeza de que deseja sair?', uninstall: 'Desinstalar Tailscale', + uninstallDesc: 'Tem certeza de que deseja desinstalar Tailscale?', okBtn: 'Sim', cancelBtn: 'Não' }, @@ -354,7 +459,15 @@ const pt_br = { cancel: 'Cancelar', preview: 'Prévia das Atualizações', previewDesc: 'Tenha acesso antecipado a novos recursos e melhorias', - previewTip: 'Esteja ciente de que as versões de prévia podem conter bugs ou funcionalidade incompleta!' + previewTip: + 'Esteja ciente de que as versões de prévia podem conter bugs ou funcionalidade incompleta!', + offline: { + title: 'Atualizações off-line', + desc: 'Atualização através do pacote de instalação local', + upload: 'Upload', + invalidName: 'Formato de nome de arquivo inválido. Faça download das versões do GitHub.', + updateFailed: 'Falha na atualização. Por favor, tente novamente.' + } }, account: { title: 'Conta', @@ -367,6 +480,127 @@ const pt_br = { cancelBtn: 'Não' } }, + picoclaw: { + title: 'PicoClaw Assistente', + empty: 'Abra o painel e inicie uma tarefa para começar.', + inputPlaceholder: 'Descreva o que você deseja que PicoClaw faça', + newConversation: 'Nova conversa', + processing: 'Processando...', + agent: { + defaultTitle: 'Assistente geral', + defaultDescription: 'Ajuda geral sobre bate-papo, pesquisa e espaço de trabalho.', + kvmTitle: 'Controle remoto', + kvmDescription: 'Opera o host remoto por meio de NanoKVM.', + switched: 'Função de agente trocada', + switchFailed: 'Falha ao mudar de função de agente' + }, + send: 'Enviar', + cancel: 'Cancelar', + status: { + connecting: 'Conectando ao gateway...', + connected: 'Sessão PicoClaw conectada', + disconnected: 'Sessão PicoClaw desconectada', + stopped: 'Solicitação de parada enviada', + runtimeStarted: 'Runtime do PicoClaw iniciado', + runtimeStartFailed: 'Falha ao iniciar o runtime do PicoClaw', + runtimeStopped: 'Runtime do PicoClaw interrompido', + runtimeStopFailed: 'Falha ao parar o runtime do PicoClaw' + }, + connection: { + runtime: { + checking: 'Verificando', + ready: 'Runtime pronto', + stopped: 'Runtime interrompido', + unavailable: 'Runtime indisponível', + configError: 'Erro de configuração' + }, + transport: { + connecting: 'Conectando', + connected: 'Conectado' + }, + run: { + idle: 'Inativo', + busy: 'Ocupado' + } + }, + message: { + toolAction: 'Ação', + observation: 'Observação', + screenshot: 'Captura de tela' + }, + overlay: { + locked: 'PicoClaw está controlando o dispositivo. A entrada manual está pausada.' + }, + install: { + install: 'Instalar PicoClaw', + installing: 'Instalando PicoClaw', + success: 'PicoClaw instalado com sucesso', + failed: 'Falha ao instalar PicoClaw', + uninstalling: 'Desinstalando o runtime...', + uninstalled: 'Runtime desinstalado com sucesso.', + uninstallFailed: 'Falha na desinstalação.', + requiredTitle: 'PicoClaw não está instalado', + requiredDescription: 'Instale o PicoClaw antes de iniciar o runtime do PicoClaw.', + progressDescription: 'PicoClaw está sendo baixado e instalado.', + stages: { + preparing: 'Preparando', + downloading: 'Baixando', + extracting: 'Extraindo', + installing: 'Instalando', + installed: 'Instalado', + install_timeout: 'Tempo limite esgotado', + install_failed: 'Falhou' + } + }, + model: { + requiredTitle: 'A configuração do modelo é necessária', + requiredDescription: 'Configure o modelo PicoClaw antes de usar o chat PicoClaw.', + docsTitle: 'Guia de configuração', + docsDesc: 'Modelos e protocolos suportados', + menuLabel: 'Configurar modelo', + modelIdentifier: 'Identificador do modelo', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'Chave API', + apiKeyPlaceholder: 'Insira a chave API do modelo', + save: 'Salvar', + saving: 'Salvando', + saved: 'Configuração do modelo salva', + saveFailed: 'Falha ao salvar a configuração do modelo', + invalid: 'Identificador do modelo, API Base URL e chave API são obrigatórios' + }, + uninstall: { + menuLabel: 'Desinstalar', + confirmTitle: 'Desinstalar PicoClaw', + confirmContent: + 'Tem certeza de que deseja desinstalar PicoClaw? Isso excluirá o executável e todos os arquivos de configuração.', + confirmOk: 'Desinstalar', + confirmCancel: 'Cancelar' + }, + history: { + title: 'Histórico', + loading: 'Carregando sessões...', + emptyTitle: 'Ainda sem histórico', + emptyDescription: 'As sessões anteriores de PicoClaw aparecerão aqui.', + loadFailed: 'Falha ao carregar o histórico da sessão', + deleteFailed: 'Falha ao excluir sessão', + deleteConfirmTitle: 'Excluir sessão', + deleteConfirmContent: 'Tem certeza de que deseja excluir "{{title}}"?', + deleteConfirmOk: 'Excluir', + deleteConfirmCancel: 'Cancelar', + messageCount_one: '{{count}} mensagem', + messageCount_other: '{{count}} mensagens' + }, + config: { + startRuntime: 'Iniciar PicoClaw', + stopRuntime: 'Parar PicoClaw' + }, + start: { + title: 'Iniciar PicoClaw', + description: 'Inicie o runtime para começar a usar o assistente PicoClaw.' + } + }, error: { title: 'Encontramos um problema', refresh: 'Atualizar' @@ -379,6 +613,6 @@ const pt_br = { expand: 'Expandir Menu' } } -} +}; export default pt_br; diff --git a/web/src/i18n/locales/ru.ts b/web/src/i18n/locales/ru.ts index 5fa9eb8..a3e1b83 100644 --- a/web/src/i18n/locales/ru.ts +++ b/web/src/i18n/locales/ru.ts @@ -14,8 +14,11 @@ const ru = { placeholderPassword2: 'Введите пароль снова', noEmptyUsername: 'Имя пользователя не может быть пустым', noEmptyPassword: 'Пароль не может быть пустым', - noAccount: 'Не удалось получить информацию о пользователе, пожалуйста, обновите веб-страницу или сбросьте пароль', + noAccount: + 'Не удалось получить информацию о пользователе, пожалуйста, обновите веб-страницу или сбросьте пароль', invalidUser: 'Неверное имя пользователя или пароль', + locked: 'Слишком много входов. Повторите попытку позже.', + globalLocked: 'Система находится под защитой. Повторите попытку позже.', error: 'Непредвиденная ошибка', changePassword: 'Изменить пароль', changePasswordDesc: 'Для безопасности вашего устройства, пожалуйста поменяйте пароль!', @@ -43,10 +46,20 @@ const ru = { description: 'Настройка Wi-Fi для NanoKVM', success: 'Пожалуйста, проверьте сетевой статус NanoKVM и откройте в браузере новый IP адрес.', failed: 'Операция не удалась, пожалуйста попробуйте снова.', + invalidMode: + 'Текущий режим не поддерживает настройку сети. Пожалуйста, перейдите на свое устройство и включите режим конфигурации Wi-Fi.', confirmBtn: 'OK', - finishBtn: 'Готово' + finishBtn: 'Готово', + ap: { + authTitle: 'Требуется аутентификация', + authDescription: 'Пожалуйста, введите пароль AP, чтобы продолжить.', + authFailed: 'Неверный пароль AP', + passPlaceholder: 'AP пароль', + verifyBtn: 'Проверить' + } }, screen: { + scale: 'Масштаб', title: 'Экран', video: 'Видеорежим', videoDirectTips: 'Включите HTTPS в "Настройки > Устройство", чтобы использовать этот режим', @@ -73,11 +86,53 @@ const ru = { placeholder: 'Текст для ввода', submit: 'Вставить', virtual: 'Клавиатура', - ctrlaltdel: 'Ctrl+Alt+Del', + readClipboard: 'Чтение из буфера обмена', + clipboardPermissionDenied: + 'Разрешение на доступ к буферу обмена отклонено. Пожалуйста, разрешите доступ к буферу обмена в вашем браузере.', + clipboardReadError: 'Не удалось прочитать буфер обмена.', dropdownEnglish: 'Английский', dropdownGerman: 'Немецкий', dropdownFrench: 'Французский', - dropdownRussian: 'Русский' + dropdownRussian: 'Русский', + shortcut: { + title: 'Ярлыки', + custom: 'Пользовательский', + capture: 'Нажмите здесь, чтобы сохранить ярлык', + clear: 'Очистить', + save: 'Сохранить', + captureTips: + 'Для захвата системных клавиш (например, клавиши Windows) требуется разрешение полноэкранного режима.', + enterFullScreen: 'Переключить полноэкранный режим.' + }, + leaderKey: { + title: 'Клавиша Leader', + desc: 'Обход ограничений браузера и отправка системных ярлыков непосредственно на удаленный хост.', + howToUse: 'Как использовать', + simultaneous: { + title: 'Одновременный режим', + desc1: 'Нажмите и удерживайте клавишу Leader, затем нажмите сочетание клавиш.', + desc2: 'Интуитивно понятен, но может конфликтовать с системными ярлыками.' + }, + sequential: { + title: 'Последовательный режим', + desc1: + 'Нажмите клавишу Leader → последовательно нажмите сочетание клавиш → снова нажмите клавишу Leader.', + desc2: + 'Требует большего количества шагов, но полностью позволяет избежать системных конфликтов.' + }, + enable: 'Включить клавишу Leader', + tip: 'При назначении клавишей Leader эта клавиша работает только как триггер сочетаний клавиш и теряет поведение по умолчанию.', + placeholder: 'Нажмите клавишу Leader', + shiftRight: 'Правый Shift', + ctrlRight: 'Правый Ctrl', + metaRight: 'Правый Win', + submit: 'Вставить', + recorder: { + rec: 'ЗАП.', + activate: 'Активировать клавиши', + input: 'Пожалуйста, нажмите ярлык...' + } + } }, mouse: { title: 'Мышь', @@ -91,6 +146,12 @@ const ru = { mode: 'Режим мыши', absolute: 'Абсолютный режим', relative: 'Относительный режим', + direction: 'Направление прокрутки', + scrollUp: 'Прокрутите вверх', + scrollDown: 'Прокрутите вниз', + speed: 'Скорость прокрутки', + fast: 'Быстро', + slow: 'Медленно', requestPointer: 'Используется относительный режим. Нажмите на рабочий стол для захвата мыши.', resetHid: 'Перезагрузить HID-подсистему', hidOnly: { @@ -107,11 +168,18 @@ const ru = { title: 'Образы', loading: 'Загрузка...', empty: 'Пусто', - cdrom: 'Смонтировать образ как CD-ROM диск', + mountMode: 'Режим монтирования', mountFailed: 'Монтирование образа не удалось', mountDesc: 'В некоторых системах необходимо отсоединить виртуальный диск на удаленном хосте перед монтированием образа.', + unmountFailed: 'Не удалось размонтировать', + unmountDesc: + 'В некоторых системах перед размонтированием образа необходимо вручную извлечь образ с удаленного хоста.', refresh: 'Обновить список образов', + attention: 'Внимание', + deleteConfirm: 'Вы уверены, что хотите удалить это изображение?', + okBtn: 'Да', + cancelBtn: 'Нет', tips: { title: 'Как загрузить', usb1: 'Подключите NanoKVM к вашему компьютеру через USB.', @@ -169,9 +237,12 @@ const ru = { }, download: { title: 'Скачать образ', - input: 'Введите адрес удаленного образа', + input: 'Введите URL удаленного образа', ok: 'OK', - disabled: 'Невозможно скачать образ, раздел /data находится в режиме только для чтения' + disabled: 'Невозможно скачать образ, раздел /data находится в режиме только для чтения', + uploadbox: 'Перетащите сюда файл или нажмите, чтобы выбрать', + inputfile: 'Пожалуйста, введите файл изображения', + NoISO: 'Нет ISO' }, power: { title: 'Питание', @@ -200,21 +271,31 @@ const ru = { deviceKey: 'Ключ устройства', community: 'Сообщество', hostname: 'Имя хоста', - hostnameUpdated: 'Имя хоста изменено. Перезагрузите NanoKVM, чтобы настройки вступили в силу.', + hostnameUpdated: + 'Имя хоста изменено. Перезагрузите NanoKVM, чтобы настройки вступили в силу.', ipType: { - 'Wired': 'Проводное', - 'Wireless': 'Беспроводное', - 'Other': 'Другое' + Wired: 'Проводное', + Wireless: 'Беспроводное', + Other: 'Другое' } }, appearance: { title: 'Внешний вид', display: 'Отображение', language: 'Язык', - menuBar: 'Панель меню', - menuBarDesc: 'Иконки для отображения в панели меню', + languageDesc: 'Выбор языка интерфейса', webTitle: 'Заголовок страницы', - webTitleDesc: 'Изменить заголовок страницы' + webTitleDesc: 'Изменить заголовок страницы', + menuBar: { + title: 'Строка меню', + mode: 'Режим отображения', + modeDesc: 'Отображение строки меню на экране', + modeOff: 'Выкл.', + modeAuto: 'Автоматическое скрытие', + modeAlways: 'Всегда виден', + icons: 'Значки подменю', + iconsDesc: 'Отображение значков подменю в строке меню' + } }, device: { title: 'Устройство', @@ -240,7 +321,7 @@ const ru = { title: 'Файл подкачки', disable: 'Отключить', description: 'Задать размер файла подкачки', - tip: 'Включение этой опции может негативно сказаться на долговечности SD-карты!', + tip: 'Включение этой опции может негативно сказаться на долговечности SD-карты!' }, mouseJiggler: { title: 'Дрожалка для мыши', @@ -251,9 +332,26 @@ const ru = { }, mdns: { description: 'Включить сервис обнаружения mDNS', - tip: "Выключите, если нет необходимости" + tip: 'Выключите, если нет необходимости' + }, + hdmi: { + description: 'Включить HDMI/выход монитора' + }, + autostart: { + title: 'Настройки сценариев автозапуска', + description: + 'Управление сценариями, которые запускаются автоматически при запуске системы.', + new: 'Новый', + deleteConfirm: 'Вы уверены, что хотите удалить этот файл?', + yes: 'Да', + no: 'Нет', + scriptName: 'Имя сценария автозапуска', + scriptContent: 'Содержимое сценария автозапуска', + settings: 'Настройки' }, hidOnly: 'Режим только HID', + hidOnlyDesc: + 'Прекратить эмуляцию виртуальных устройств, сохранив только базовый контроль HID.', disk: 'Виртуальный диск', diskDesc: 'Смонтировать виртуальный USB диск на удаленном хосте', network: 'Виртуальная сеть', @@ -313,8 +411,11 @@ const ru = { title: 'Tailscale', memory: { title: 'Оптимизация памяти', - tip: "Когда использование ОЗУ выходит за пределы, очистка мусора происходит более агрессивно, дабы попытаться освободить память. Рекомендуется задать на 50MB при использовании Tailscale. Перезагрузка Tailscale рекомендуется для вступления данной настройки в силу.", - disable: 'Отключить' + tip: 'Когда использование ОЗУ выходит за пределы, очистка мусора происходит более агрессивно, дабы попытаться освободить память. Рекомендуется задать на 50MB при использовании Tailscale. Перезагрузка Tailscale рекомендуется для вступления данной настройки в силу.' + }, + swap: { + title: 'Подмена памяти', + tip: 'Если после включения оптимизации памяти проблемы сохраняются, попробуйте включить подкачку памяти. При этом размер файла подкачки по умолчанию устанавливается равным 256MB, который можно настроить в «Настройки > Устройство».' }, restart: 'Вы уверены что хотите перезагрузить Tailscale?', stop: 'Вы уверены что хотите остановить Tailscale?', @@ -331,8 +432,9 @@ const ru = { upTailscale: 'Переместите tailscale в каталог /usr/bin/ на NanoKVM', upTailscaled: 'Переместите tailscaled в каталог /usr/sbin/ на NanoKVM', refresh: 'Обновите текущую страницу', - notLogin: - 'Устройство не привязано. Войдите, чтобы привязать его к аккаунту.', + notRunning: 'Tailscale не работает. Пожалуйста, начните, чтобы продолжить.', + run: 'Старт', + notLogin: 'Устройство не привязано. Войдите, чтобы привязать его к аккаунту.', urlPeriod: 'Этот адрес действителен в течение 10 минут', login: 'Войти', loginSuccess: 'Вход выполнен', @@ -343,6 +445,7 @@ const ru = { logout: 'Выход', logoutDesc: 'Вы действительно хотите выйти?', uninstall: 'Удалить Tailscale', + uninstallDesc: 'Вы уверены, что хотите удалить Tailscale?', okBtn: 'Да', cancelBtn: 'Нет' }, @@ -358,7 +461,14 @@ const ru = { preview: 'Ранние обновления', previewDesc: 'Получайте ранний доступ к новым функциям и улучшениям', previewTip: - 'Обратите внимание: в ранних версиях могут быть ошибки или незавершённый функционал!' + 'Обратите внимание: в ранних версиях могут быть ошибки или незавершённый функционал!', + offline: { + title: 'Автономные обновления', + desc: 'Обновление через локальный установочный пакет', + upload: 'Загрузить', + invalidName: 'Неверный формат имени файла. Загрузите выпуски с GitHub.', + updateFailed: 'Обновление не удалось. Пожалуйста, попробуйте еще раз.' + } }, account: { title: 'Аккаунт', @@ -371,8 +481,129 @@ const ru = { cancelBtn: 'Нет' } }, + picoclaw: { + title: 'PicoClaw Ассистент', + empty: 'Откройте панель и запустите задачу для начала.', + inputPlaceholder: 'Опишите, что вы хотите от PicoClaw.', + newConversation: 'Новый разговор', + processing: 'Обработка...', + agent: { + defaultTitle: 'Универсальный помощник', + defaultDescription: 'Общая помощь в чате, поиске и рабочей области.', + kvmTitle: 'Удалённое управление', + kvmDescription: 'Управляйте удаленным хостом через NanoKVM.', + switched: 'Роль агента изменена', + switchFailed: 'Не удалось переключить роль агента.' + }, + send: 'Отправить', + cancel: 'Отмена', + status: { + connecting: 'Подключение к шлюзу...', + connected: 'Сеанс PicoClaw подключен', + disconnected: 'Сеанс PicoClaw отключен', + stopped: 'Запрос на остановку отправлен', + runtimeStarted: 'Runtime PicoClaw запущен', + runtimeStartFailed: 'Не удалось запустить runtime PicoClaw', + runtimeStopped: 'Runtime PicoClaw остановлен', + runtimeStopFailed: 'Не удалось остановить runtime PicoClaw' + }, + connection: { + runtime: { + checking: 'Проверка', + ready: 'Runtime готов', + stopped: 'Runtime остановлен', + unavailable: 'Runtime недоступен', + configError: 'Ошибка конфигурации' + }, + transport: { + connecting: 'Подключение', + connected: 'Подключено' + }, + run: { + idle: 'Простой', + busy: 'Занят' + } + }, + message: { + toolAction: 'Действие', + observation: 'Наблюдение', + screenshot: 'Скриншот' + }, + overlay: { + locked: 'PicoClaw управляет устройством. Ручной ввод приостановлен.' + }, + install: { + install: 'Установить PicoClaw', + installing: 'Установка PicoClaw', + success: 'PicoClaw успешно установлен', + failed: 'Не удалось установить PicoClaw', + uninstalling: 'Удаление runtime...', + uninstalled: 'Runtime успешно удален.', + uninstallFailed: 'Не удалось удалить.', + requiredTitle: 'PicoClaw не установлен', + requiredDescription: 'Установите PicoClaw перед запуском runtime PicoClaw.', + progressDescription: 'PicoClaw загружается и устанавливается.', + stages: { + preparing: 'Подготовка', + downloading: 'Загрузка', + extracting: 'Распаковка', + installing: 'Установка', + installed: 'Установлено', + install_timeout: 'Время ожидания истекло', + install_failed: 'Ошибка' + } + }, + model: { + requiredTitle: 'Требуется конфигурация модели', + requiredDescription: 'Настройте модель PicoClaw перед использованием чата PicoClaw.', + docsTitle: 'Руководство по настройке', + docsDesc: 'Поддерживаемые модели и протоколы', + menuLabel: 'Настройка модели', + modelIdentifier: 'Идентификатор модели', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API-ключ', + apiKeyPlaceholder: 'Введите API-ключ модели', + save: 'Сохранить', + saving: 'Сохранение', + saved: 'Конфигурация модели сохранена.', + saveFailed: 'Не удалось сохранить конфигурацию модели.', + invalid: 'Требуются идентификатор модели, API Base URL и API-ключ' + }, + uninstall: { + menuLabel: 'Удалить', + confirmTitle: 'Удалить PicoClaw', + confirmContent: + 'Вы уверены, что хотите удалить PicoClaw? Это приведет к удалению исполняемого файла и всех файлов конфигурации.', + confirmOk: 'Удалить', + confirmCancel: 'Отмена' + }, + history: { + title: 'История', + loading: 'Загрузка сеансов...', + emptyTitle: 'Пока нет истории', + emptyDescription: 'Здесь появятся предыдущие сеансы PicoClaw.', + loadFailed: 'Не удалось загрузить историю сеансов.', + deleteFailed: 'Не удалось удалить сеанс.', + deleteConfirmTitle: 'Удалить сеанс', + deleteConfirmContent: 'Вы уверены, что хотите удалить «{{title}}»?', + deleteConfirmOk: 'Удалить', + deleteConfirmCancel: 'Отмена', + messageCount_one: '{{count}} сообщение', + messageCount_other: '{{count}} сообщения' + }, + config: { + startRuntime: 'Запустить PicoClaw', + stopRuntime: 'Остановить PicoClaw' + }, + start: { + title: 'Запустить PicoClaw', + description: 'Запустите runtime, чтобы начать использовать помощник PicoClaw.' + } + }, error: { - title: "У нас возникла проблема", + title: 'У нас возникла проблема', refresh: 'Обновить страницу' }, fullscreen: { diff --git a/web/src/i18n/locales/se.ts b/web/src/i18n/locales/se.ts index 6c12327..1e5ba7a 100644 --- a/web/src/i18n/locales/se.ts +++ b/web/src/i18n/locales/se.ts @@ -16,6 +16,8 @@ const se = { noEmptyPassword: 'Lösenord krävs', noAccount: 'Kunde inte hämta användarinformation, uppdatera sidan eller återställ lösenordet', invalidUser: 'Ogiltigt användarnamn eller lösenord', + locked: 'För många inloggningar, försök igen senare', + globalLocked: 'System under skydd, försök igen senare', error: 'Oväntat fel', changePassword: 'Byt lösenord', changePasswordDesc: 'För din enhets säkerhet, byt lösenord!', @@ -27,8 +29,7 @@ const se = { cancel: 'Avbryt', loginButtonText: 'Logga in', tips: { - reset1: - 'För att återställa lösenordet, håll in BOOT-knappen på NanoKVM i 10 sekunder.', + reset1: 'För att återställa lösenordet, håll in BOOT-knappen på NanoKVM i 10 sekunder.', reset2: 'För detaljerade steg, se detta dokument:', reset3: 'Standardkonto för webben:', reset4: 'Standardkonto för SSH:', @@ -43,10 +44,20 @@ const se = { description: 'Konfigurera Wi-Fi för NanoKVM', success: 'Kontrollera nätverksstatusen för NanoKVM och besök den nya IP-adressen.', failed: 'Åtgärden misslyckades, försök igen.', + invalidMode: + 'Det aktuella läget stöder inte nätverksinstallation. Gå till din enhet och aktivera Wi-Fi konfigurationsläge.', confirmBtn: 'Ok', - finishBtn: 'Färdig' + finishBtn: 'Färdig', + ap: { + authTitle: 'Autentisering krävs', + authDescription: 'Ange lösenordet AP för att fortsätta', + authFailed: 'Ogiltigt AP lösenord', + passPlaceholder: 'AP lösenord', + verifyBtn: 'Verifiera' + } }, screen: { + scale: 'Skala', title: 'Skärm', video: 'Videoläge', videoDirectTips: 'Aktivera HTTPS i "Inställningar > Enhet" för att använda detta läge', @@ -63,7 +74,7 @@ const se = { qualityLow: 'Låg', frameDetect: 'Ramdetection', frameDetectTip: - "Beräkna skillnaden mellan ramar. Sluta skicka videoström när inga förändringar upptäcks på fjärrvärdens skärm.", + 'Beräkna skillnaden mellan ramar. Sluta skicka videoström när inga förändringar upptäcks på fjärrvärdens skärm.', resetHdmi: 'Återställ HDMI' }, keyboard: { @@ -73,12 +84,52 @@ const se = { placeholder: 'Ange text', submit: 'Skicka', virtual: 'Tangentbord', - ctrlaltdel: 'Ctrl+Alt+Del', readClipboard: 'Läs från Urklipp', - clipboardPermissionDenied: 'Behörighet till Urklipp nekad. Vänligen tillåt åtkomst till Urklipp i din webbläsare.', + clipboardPermissionDenied: + 'Behörighet till Urklipp nekad. Vänligen tillåt åtkomst till Urklipp i din webbläsare.', clipboardReadError: 'Misslyckades med att läsa Urklipp', dropdownEnglish: 'Engelska', - dropdownGerman: 'Tyska' + dropdownGerman: 'Tyska', + dropdownFrench: 'Franska', + dropdownRussian: 'ryska', + shortcut: { + title: 'Genvägar', + custom: 'Anpassad', + capture: 'Klicka här för att fånga genväg', + clear: 'Rensa', + save: 'Spara', + captureTips: + 'Att fånga systemtangenter (som Windows-tangenten) kräver helskärmsbehörighet.', + enterFullScreen: 'Växla helskärmsläge.' + }, + leaderKey: { + title: 'Leader-tangent', + desc: 'Gå förbi webbläsarbegränsningar och skicka systemgenvägar direkt till fjärrvärden.', + howToUse: 'Hur man använder', + simultaneous: { + title: 'Samtidigt läge', + desc1: 'Håll ned Leader-tangenten och tryck sedan på genvägen.', + desc2: 'Intuitivt, men kan komma i konflikt med systemgenvägar.' + }, + sequential: { + title: 'Sekventiellt läge', + desc1: + 'Tryck på Leader-tangenten → tryck på genvägen i följd → tryck på Leader-tangenten igen.', + desc2: 'Kräver fler steg, men undviker helt systemkonflikter.' + }, + enable: 'Aktivera Leader-tangent', + tip: 'När den tilldelas som Leader-tangent fungerar denna tangent endast som genvägsutlösare och förlorar sitt standardbeteende.', + placeholder: 'Tryck på Leader-tangenten', + shiftRight: 'Höger Shift', + ctrlRight: 'Höger Ctrl', + metaRight: 'Höger Win', + submit: 'Skicka', + recorder: { + rec: 'REC', + activate: 'Aktivera tangenter', + input: 'Vänligen tryck på genvägen...' + } + } }, mouse: { title: 'Mus', @@ -92,13 +143,16 @@ const se = { mode: 'Musläge', absolute: 'Absolut läge', relative: 'Relativt läge', - speed: 'Scrollhastighet', + direction: 'Rullhjulsriktning', + scrollUp: 'Scrolla uppåt', + scrollDown: 'Scrolla ner', + speed: 'Rullhjulshastighet', fast: 'Snabb', slow: 'Långsam', requestPointer: 'Använder relativt läge. Klicka på skrivbordet för att få muspekaren.', resetHid: 'Återställ HID', hidOnly: { - title: 'Endast-HID-läge', + title: 'Endast HID-läge', desc: 'Om din mus och ditt tangentbord slutar svara och återställning av HID inte hjälper, kan det bero på kompatibilitetsproblem mellan NanoKVM och enheten. Prova att aktivera Endast-HID-läge för bättre kompatibilitet.', tip1: 'Aktivering av Endast-HID-läge avmonterar den virtuella U-disken och nätverket', tip2: 'I Endast-HID-läge är avbildningsmontering inaktiverat', @@ -112,13 +166,13 @@ const se = { loading: 'Laddar...', empty: 'Inget hittades', mountMode: 'Monteringsläge', - cdrom: 'Montera avbildning i CD-ROM-läge', mountFailed: 'Montering misslyckades', mountDesc: - "I vissa system måste den virtuella disken avmonteras på fjärrvärden innan avbildningen monteras.", - refresh: 'Uppdatera avbildningslistan', + 'I vissa system måste den virtuella disken avmonteras på fjärrvärden innan avbildningen monteras.', unmountFailed: 'Avmontering misslyckades', - unmountDesc: 'I vissa system måste du manuellt mata ut från fjärrvärden innan du avmonterar avbildningen.', + unmountDesc: + 'I vissa system måste du manuellt mata ut från fjärrvärden innan du avmonterar avbildningen.', + refresh: 'Uppdatera avbildningslistan', attention: 'Observera', deleteConfirm: 'Är du säker på att du vill ta bort denna avbildning?', okBtn: 'Ja', @@ -165,8 +219,8 @@ const se = { parityOdd: 'Udda', flowControl: 'Flödeskontroll', flowControlNone: 'Ingen', - flowControlSoft: 'Mjuk', - flowControlHard: 'Hård', + flowControlSoft: 'Programvara', + flowControlHard: 'Hårdvara', dataBits: 'Databitar', stopBits: 'Stoppbitar', confirm: 'Ok' @@ -182,7 +236,10 @@ const se = { title: 'Avbildningshämtare', input: 'Ange en fjärravbildnings-URL', ok: 'Ok', - disabled: '/data partitionen är skrivskyddad, kan inte hämta avbildning' + disabled: '/data partitionen är skrivskyddad, kan inte hämta avbildning', + uploadbox: 'Släpp filen här eller klicka för att välja', + inputfile: 'Vänligen ange bildfilen', + NoISO: 'Ingen ISO' }, power: { title: 'Ström', @@ -220,12 +277,21 @@ const se = { }, appearance: { title: 'Utseende', - display: 'Display', + display: 'Visning', language: 'Språk', - menuBar: 'Menyfält', - menuBarDesc: 'Visa ikoner i menyfältet', + languageDesc: 'Välj språk för gränssnittet', webTitle: 'Webbtitel', - webTitleDesc: 'Anpassa webbsidans titel' + webTitleDesc: 'Anpassa webbsidans titel', + menuBar: { + title: 'Menyrad', + mode: 'Visningsläge', + modeDesc: 'Visa menyraden på skärmen', + modeOff: 'Av', + modeAuto: 'Dölj automatiskt', + modeAlways: 'Alltid synlig', + icons: 'Undermenyikoner', + iconsDesc: 'Visa undermenyikoner i menyraden' + } }, device: { title: 'Enhet', @@ -267,7 +333,19 @@ const se = { hdmi: { description: 'Aktivera HDMI/monitorutgång' }, + autostart: { + title: 'Autostart skriptinställningar', + description: 'Hantera skript som körs automatiskt vid systemstart', + new: 'Nytt', + deleteConfirm: 'Är du säker på att du vill ta bort denna fil?', + yes: 'Ja', + no: 'Nej', + scriptName: 'Autostart skriptnamn', + scriptContent: 'Autostart skriptinnehåll', + settings: 'Inställningar' + }, hidOnly: 'Endast-HID-läge', + hidOnlyDesc: 'Sluta emulera virtuella enheter, behåll bara grundläggande HID kontroll', disk: 'Virtuell disk', diskDesc: 'Montera virtuell U-disk på fjärrvärden', network: 'Virtuellt nätverk', @@ -327,8 +405,11 @@ const se = { title: 'Tailscale', memory: { title: 'Minnesoptimering', - tip: 'När minnesanvändningen överskrider gränsen utförs aggressivare skräpsamling för att frigöra minne. Rekommenderas att sättas till 75 MB om du använder Tailscale. Omstart krävs för att det ska gälla.', - disable: 'Inaktivera' + tip: 'När minnesanvändningen överskrider gränsen utförs aggressivare skräpsamling för att frigöra minne. Rekommenderas att sättas till 75 MB om du använder Tailscale. Omstart krävs för att det ska gälla.' + }, + swap: { + title: 'Byt minne', + tip: 'Om problemen kvarstår efter att du har aktiverat minnesoptimering, försök att aktivera utbyte av minne. Detta ställer in växlingsfilens storlek till 256MB som standard, vilket kan justeras i "Inställningar > Enhet".' }, restart: 'Starta om Tailscale?', stop: 'Stoppa Tailscale?', @@ -343,10 +424,11 @@ const se = { package: 'installationspaketet', unzip: 'och packa upp det', upTailscale: 'Ladda upp tailscale till NanoKVM-katalogen /usr/bin/', - upTailscaled: 'Ladda upp tailscaled till katalogen /usr/sbin/', + upTailscaled: 'Ladda upp tailscaled till NanoKVM-katalogen /usr/sbin/', refresh: 'Uppdatera sidan', - notLogin: - 'Enheten är ännu inte bunden. Logga in och bind enheten till ditt konto.', + notRunning: 'Tailscale körs inte. Starta den för att fortsätta.', + run: 'Start', + notLogin: 'Enheten är ännu inte bunden. Logga in och bind enheten till ditt konto.', urlPeriod: 'Denna URL är giltig i 10 minuter', login: 'Logga in', loginSuccess: 'Inloggning lyckades', @@ -357,6 +439,7 @@ const se = { logout: 'Logga ut', logoutDesc: 'Är du säker på att du vill logga ut?', uninstall: 'Avinstallera Tailscale', + uninstallDesc: 'Är du säker på att du vill avinstallera Tailscale?', okBtn: 'Ja', cancelBtn: 'Nej' }, @@ -372,7 +455,14 @@ const se = { preview: 'Förhandsvisning av uppdateringar', previewDesc: 'Få tidig tillgång till nya funktioner och förbättringar', previewTip: - 'Observera att förhandsversioner kan innehålla buggar eller ofullständig funktionalitet!' + 'Observera att förhandsversioner kan innehålla buggar eller ofullständig funktionalitet!', + offline: { + title: 'Offlineuppdateringar', + desc: 'Uppdatera genom lokalt installationspaket', + upload: 'Ladda upp', + invalidName: 'Ogiltigt filnamnsformat. Ladda ner från GitHub-versioner.', + updateFailed: 'Uppdatering misslyckades. Försök igen.' + } }, account: { title: 'Konto', @@ -385,6 +475,127 @@ const se = { cancelBtn: 'Nej' } }, + picoclaw: { + title: 'PicoClaw Assistent', + empty: 'Öppna panelen och starta en uppgift för att börja.', + inputPlaceholder: 'Beskriv vad du vill att PicoClaw ska göra', + newConversation: 'Ny konversation', + processing: 'Bearbetar...', + agent: { + defaultTitle: 'Allmän assistent', + defaultDescription: 'Allmän hjälp för chatt, sökning och arbetsyta.', + kvmTitle: 'Fjärrstyrning', + kvmDescription: 'Manövrera fjärrvärden genom NanoKVM.', + switched: 'Agentroll bytte', + switchFailed: 'Det gick inte att byta agentroll' + }, + send: 'Skicka', + cancel: 'Avbryt', + status: { + connecting: 'Ansluter till gateway...', + connected: 'PicoClaw-session ansluten', + disconnected: 'PicoClaw-session frånkopplad', + stopped: 'Stoppbegäran har skickats', + runtimeStarted: 'PicoClaw runtime startad', + runtimeStartFailed: 'Det gick inte att starta PicoClaw runtime', + runtimeStopped: 'PicoClaw runtime stoppad', + runtimeStopFailed: 'Det gick inte att stoppa PicoClaw runtime' + }, + connection: { + runtime: { + checking: 'Kontrollerar', + ready: 'Runtime klar', + stopped: 'Runtime stoppad', + unavailable: 'Runtime inte tillgänglig', + configError: 'Konfigurationsfel' + }, + transport: { + connecting: 'Ansluter', + connected: 'Ansluten' + }, + run: { + idle: 'Inaktiv', + busy: 'Upptagen' + } + }, + message: { + toolAction: 'Åtgärd', + observation: 'Observation', + screenshot: 'Skärmdump' + }, + overlay: { + locked: 'PicoClaw styr enheten. Manuell inmatning är pausad.' + }, + install: { + install: 'Installera PicoClaw', + installing: 'Installerar PicoClaw', + success: 'PicoClaw har installerats framgångsrikt', + failed: 'Det gick inte att installera PicoClaw', + uninstalling: 'Avinstallerar runtime...', + uninstalled: 'Runtime avinstallerades framgångsrikt.', + uninstallFailed: 'Avinstallationen misslyckades.', + requiredTitle: 'PicoClaw är inte installerad', + requiredDescription: 'Installera PicoClaw innan du startar PicoClaw runtime.', + progressDescription: 'PicoClaw laddas ner och installeras.', + stages: { + preparing: 'Förbereder', + downloading: 'Laddar ner', + extracting: 'Packar upp', + installing: 'Installerar', + installed: 'Installerad', + install_timeout: 'Timeout', + install_failed: 'Misslyckades' + } + }, + model: { + requiredTitle: 'Modellkonfiguration krävs', + requiredDescription: 'Konfigurera PicoClaw-modellen innan du använder PicoClaw-chatten.', + docsTitle: 'Konfigurationsguide', + docsDesc: 'Modeller och protokoll som stöds', + menuLabel: 'Konfigurera modell', + modelIdentifier: 'Modellidentifierare', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API-nyckel', + apiKeyPlaceholder: 'Ange modellens API-nyckel', + save: 'Spara', + saving: 'Sparar', + saved: 'Modellkonfiguration sparad', + saveFailed: 'Det gick inte att spara modellkonfigurationen', + invalid: 'Modellidentifierare, API Base URL och API-nyckel krävs' + }, + uninstall: { + menuLabel: 'Avinstallera', + confirmTitle: 'Avinstallera PicoClaw', + confirmContent: + 'Är du säker på att du vill avinstallera PicoClaw? Detta kommer att radera den körbara filen och alla konfigurationsfiler.', + confirmOk: 'Avinstallera', + confirmCancel: 'Avbryt' + }, + history: { + title: 'Historik', + loading: 'Laddar sessioner...', + emptyTitle: 'Ingen historik än', + emptyDescription: 'Tidigare PicoClaw-sessioner kommer att visas här.', + loadFailed: 'Det gick inte att ladda sessionshistoriken', + deleteFailed: 'Det gick inte att ta bort sessionen', + deleteConfirmTitle: 'Ta bort session', + deleteConfirmContent: 'Är du säker på att du vill ta bort "{{title}}"?', + deleteConfirmOk: 'Ta bort', + deleteConfirmCancel: 'Avbryt', + messageCount_one: '{{count}} meddelande', + messageCount_other: '{{count}} meddelanden' + }, + config: { + startRuntime: 'Starta PicoClaw', + stopRuntime: 'Stoppa PicoClaw' + }, + start: { + title: 'Starta PicoClaw', + description: 'Starta runtime för att börja använda PicoClaw-assistenten.' + } + }, error: { title: 'Vi stötte på ett problem', refresh: 'Uppdatera' diff --git a/web/src/i18n/locales/th.ts b/web/src/i18n/locales/th.ts index f98c06f..88be2bc 100644 --- a/web/src/i18n/locales/th.ts +++ b/web/src/i18n/locales/th.ts @@ -1,337 +1,610 @@ const th = { - translation: { - head: { - desktop: 'Remote Desktop', - login: 'เข้าสู่ระบบ', - changePassword: 'เปลี่ยนรหัสผ่าน', - terminal: 'Terminal', - wifi: 'Wi-Fi' - }, - auth: { - login: 'เข้าสู่ระบบ', - placeholderUsername: 'ชื่อผู้ใช้งาน', - placeholderPassword: 'รห้สผ่าน', - placeholderPassword2: 'ใส่รหัสผ่านอีกครั้ง', - noEmptyUsername: 'ต้องใส่ชื่อผู้ใช้งาน', - noEmptyPassword: 'ต้องใส้รหัสผ่าน', - noAccount: 'ไม่สามารถอ่านข้อมูลได้, โปรดรีเฟรชหน้าเว็บหรือรีเซ็ตรหัสผ่าน', - invalidUser: 'ชื่อผู้ใช้งานหรือรหัสผ่านไม่ถูกต้อง', - error: 'เกิดข้อผิดพลาด', - changePassword: 'เปลี่ยนรหัสผ่าน', - changePasswordDesc: 'เพื่อความปลอดภัย, โปรดเปลี่ยนรหัสผ่าน!', - differentPassword: 'รหัสผ่านไม่ตรงกัน', - illegalUsername: 'ชื่อผู้ใช้ไม่สามารถมีอักขระที่ไม่ถูกต้อง', - illegalPassword: 'รหัสผ่านไม่สามารถมีอักขระที่ไม่ถูกต้อง', - forgetPassword: 'ลืมรหัสผ่าน', - ok: 'โอเค', - cancel: 'ยกเลิก', - loginButtonText: 'เข้าสู่ระบบ', - tips: { - reset1: - 'เพื่อรีเช็ทรหัสผ่าน, กดปุ่ม BOOT ค้างไว้ 10 วินาที.', - reset2: 'สำหรับวิธีแบบลงลึก โปรดอ่าน::', - reset3: 'ค่าเริ่มต้นบัญชีเว็บ:', - reset4: 'ค่าเริ่มต้นบัญชี SSH:', - change1: 'โปรดทราบ การกระทำนี้จะเปลี่ยนรหัสดีงกล่าว:', - change2: 'รหัสผ่านเว็บไชต์', - change3: 'รหัส Root ของระบบ (ใช้เข้า SSH)', - change4: 'เพื่อรีเช็ทรหัสผ่าน, กรุณากดปุ่ม BOOT บนอุปกรณ์ NanoKVM ค้างไว้.' - } - }, - wifi: { - title: 'Wi-Fi', - description: 'ตั้งค้า Wi-Fi สำหรับ NanoKVM', - success: 'กรุณาตรวจสอบสถานะเครื่องข่ายของ NanoKVM และไปที่ IP address ใหม่', - failed: 'เกิดข้อผิดพลาด กรุณาลองใหม่.', - confirmBtn: 'โอเค', - finishBtn: 'เสร็จ' - }, - screen: { - video: 'โหมดวีดีโอ', - resolution: 'ความคมชัด', - auto: 'อัตโนมัติ', - autoTips: - "อาการภาพฉีกขาดหรือเมาส์ไม่ตรงตำแหน่งอาจเกิดขึ้นที่ความละเอียดบางระดับ แนะนำให้ปรับความละเอียดของคอมพิวเตอร์ต้นทางหรือปิดโหมดอัตโนมัติ", - fps: 'FPS', - customizeFps: 'กำหนดเอง', - quality: 'คุณภาพ', - qualityLossless: 'ไม่สูญเสียคุณภาพ', - qualityHigh: 'สูง', - qualityMedium: 'กลาง', - qualityLow: 'ต่ำ', - frameDetect: 'ตรวจจับเฟรม', - frameDetectTip: - "ระบบจะคำนวณความแตกต่างระหว่างเฟรม และหยุดส่งสตรีมวิดีโอเมื่อไม่พบการเปลี่ยนแปลงบนหน้าจอของคอมพิวเตอร์ต้นทาง", - resetHdmi: 'รีเช็ท HDMI' - }, - keyboard: { - paste: 'วาง', - tips: 'รองรับเฉพาะตัวอักษรและสัญลักษณ์มาตรฐานของแป้นพิมพ์เท่านั้น', - placeholder: 'กรุณาป้อน', - submit: 'ยืนยัน', - virtual: 'คีบอร์ด', - ctrlaltdel: 'Ctrl+Alt+Del' - }, - mouse: { - default: 'ตัวชี้เริ่มต้น', - pointer: 'ตัวชี้แบบชี้', - cell: 'ตัวชี้แบบเซลล์', - text: 'ตัวชี้แบบข้อความ', - grab: 'ตัวชี้แบบจับ', - hide: 'ซ่อนตัวชี้', - mode: 'โหมดเมาส์', - absolute: 'โหมดสัมบูรณ์', - relative: 'โหมดสัมพัทธ์', - requestPointer: 'กำลังใช้โหมดสัมพัทธ์ กรุณาคลิกที่เดสก์ท็อปเพื่อรับตัวชี้เมาส์', - resetHid: 'รีเซ็ต HID', - hidOnly: { - title: 'โหมด HID-Only', - desc: 'หากเมาส์และคีย์บอร์ดของคุณหยุดตอบสนองและการรีเซ็ต HID ไม่ช่วย อาจเป็นปัญหาความเข้ากันได้ระหว่าง NanoKVM และอุปกรณ์ ลองเปิดโหมด HID-Only เพื่อความเข้ากันได้ที่ดีขึ้น', - tip1: 'การเปิดโหมด HID-Only จะปิดการทำงานดิสก์จำลองและ NIC จำลอง', - tip2: 'ในโหมด HID-Only ดิสก์จะลองจะถูกปิดใช้งาน', - tip3: 'NanoKVM จะรีบูตอัตโนมัติหลังจากเปลี่ยนโหมด', - enable: 'เปิดใช้งานโหมด HID-Only', - disable: 'ปิดใช้งานโหมด HID-Only' - } - }, - image: { - title: 'ดิสก์จำลอง', - loading: 'กำลังโหลด...', - empty: 'ไม่พบดิสก์', - mountFailed: 'การติดตั้งล้มเหลว', - mountDesc: - "ในบางระบบ, จะต้อง eject ดิสก์จำลองก่อนที่จะใส่ดิสก์ใหม่.", - tips: { - title: 'วิธีการอัปโหลด', - usb1: 'เชื่อมต่อ NanoKVM กับคอมพิวเตอร์ของคุณผ่าน USB', - usb2: 'ตรวจสอบให้แน่ใจว่าได้เปิดใช้งานดิสก์เสมือนแล้ว (ตั้งค่า - ดิสก์เสมือน)', - usb3: 'เปิดดิสก์บนคอมพิวเตอร์ของคุณและคัดลอกไฟล์อิมเมจไปยังไดเรกทอรีหลักของดิสก์', - scp1: 'ตรวจสอบให้แน่ใจว่า NanoKVM และคอมพิวเตอร์ของคุณอยู่ในเครือข่ายเดียวกัน', - scp2: 'เปิดเทอร์มินัลบนคอมพิวเตอร์ของคุณและใช้คำสั่ง SCP เพื่ออัปโหลดไฟล์อิมเมจไปยังไดเรกทอรี /data บน NanoKVM', - scp3: 'ตัวอย่าง: scp <ที่อยู่ของไฟล์> root@:/data', - tfCard: 'การ์ด TF', - tf1: 'วิธีนี้รองรับแค่บนระบบปฏิบัติการ Linux', - tf2: 'นำการ์ด TF ออกจาก NanoKVM', - tf3: 'ใส่การ์ด TF ลงในเครื่องอ่านการ์ดและเชื่อมต่อกับคอมพิวเตอร์ของคุณ', - tf4: 'คัดลอกไฟล์อิมเมจไปยังไดเรกทอรี /data บนการ์ด TF', - tf5: 'ใส่การ์ด TF กลับเข้า NanoKVM' - } - }, - script: { - title: 'สคริปต์', - upload: 'อัปโหลด', - run: 'เรียกใช้', - runBackground: 'เรียกใช้ในพื้นหลัง', - runFailed: 'การเรียกใช้ล้มเหลว', - attention: 'ความสนใจ', - delDesc: 'คุณแน่ใจที่จะลบไฟล์นี้หรือไม่?', - confirm: 'ใช่', - cancel: 'ไม่ใช่', - delete: 'ลบ', - close: 'ปิด' + translation: { + head: { + desktop: 'เดสก์ท็อประยะไกล', + login: 'เข้าสู่ระบบ', + changePassword: 'เปลี่ยนรหัสผ่าน', + terminal: 'Terminal', + wifi: 'Wi-Fi' }, - terminal: { - title: 'เทอร์มินอล', - nanokvm: 'เทอร์มินอลของ NanoKVM', - serial: 'เทอร์มินอลของ Serial Port', - serialPort: 'Serial Port', - serialPortPlaceholder: 'กรุณาเลือก serial port', - baudrate: 'Baud rate', - confirm: 'ยืนยัน', - parity: 'Parity', - parityNone: 'ไม่มี', - parityEven: 'คู่', - parityOdd: 'คี่', - flowControl: 'การควบคุมการไหล', - flowControlNone: 'ไม่มี', - flowControlSoft: 'ซอฟต์', - flowControlHard: 'ฮาร์ด', - dataBits: 'บิตข้อมูล', - stopBits: 'บิตหยุด' + auth: { + login: 'เข้าสู่ระบบ', + placeholderUsername: 'ชื่อผู้ใช้งาน', + placeholderPassword: 'รห้สผ่าน', + placeholderPassword2: 'ใส่รหัสผ่านอีกครั้ง', + noEmptyUsername: 'ต้องใส่ชื่อผู้ใช้งาน', + noEmptyPassword: 'ต้องใส้รหัสผ่าน', + noAccount: 'ไม่สามารถอ่านข้อมูลได้, โปรดรีเฟรชหน้าเว็บหรือรีเซ็ตรหัสผ่าน', + invalidUser: 'ชื่อผู้ใช้งานหรือรหัสผ่านไม่ถูกต้อง', + locked: 'มีการเข้าสู่ระบบมากเกินไป โปรดลองอีกครั้งในภายหลัง', + globalLocked: 'ระบบอยู่ระหว่างการป้องกัน โปรดลองอีกครั้งในภายหลัง', + error: 'เกิดข้อผิดพลาด', + changePassword: 'เปลี่ยนรหัสผ่าน', + changePasswordDesc: 'เพื่อความปลอดภัย, โปรดเปลี่ยนรหัสผ่าน!', + differentPassword: 'รหัสผ่านไม่ตรงกัน', + illegalUsername: 'ชื่อผู้ใช้ไม่สามารถมีอักขระที่ไม่ถูกต้อง', + illegalPassword: 'รหัสผ่านไม่สามารถมีอักขระที่ไม่ถูกต้อง', + forgetPassword: 'ลืมรหัสผ่าน', + ok: 'โอเค', + cancel: 'ยกเลิก', + loginButtonText: 'เข้าสู่ระบบ', + tips: { + reset1: 'หากต้องการรีเซ็ตรหัสผ่าน ให้กดปุ่ม BOOT บน NanoKVM ค้างไว้ 10 วินาที', + reset2: 'สำหรับวิธีแบบลงลึก โปรดอ่าน::', + reset3: 'ค่าเริ่มต้นบัญชีเว็บ:', + reset4: 'ค่าเริ่มต้นบัญชี SSH:', + change1: 'โปรดทราบ การกระทำนี้จะเปลี่ยนรหัสดีงกล่าว:', + change2: 'รหัสผ่านเว็บไชต์', + change3: 'รหัส Root ของระบบ (ใช้เข้า SSH)', + change4: 'เพื่อรีเช็ทรหัสผ่าน, กรุณากดปุ่ม BOOT บนอุปกรณ์ NanoKVM ค้างไว้.' + } + }, + wifi: { + title: 'Wi-Fi', + description: 'ตั้งค้า Wi-Fi สำหรับ NanoKVM', + success: 'กรุณาตรวจสอบสถานะเครื่องข่ายของ NanoKVM และไปที่ IP address ใหม่', + failed: 'เกิดข้อผิดพลาด กรุณาลองใหม่.', + invalidMode: + 'โหมดปัจจุบันไม่รองรับการตั้งค่าเครือข่าย โปรดไปที่อุปกรณ์ของคุณและเปิดใช้งานโหมดการกำหนดค่า Wi-Fi', + confirmBtn: 'โอเค', + finishBtn: 'เสร็จ', + ap: { + authTitle: 'จำเป็นต้องมีการรับรองความถูกต้อง', + authDescription: 'โปรดป้อนรหัสผ่าน AP เพื่อดำเนินการต่อ', + authFailed: 'รหัสผ่าน AP ไม่ถูกต้อง', + passPlaceholder: 'AP รหัสผ่าน', + verifyBtn: 'ตรวจสอบ' + } + }, + screen: { + scale: 'สเกล', + title: 'หน้าจอ', + video: 'โหมดวีดีโอ', + videoDirectTips: 'เปิดใช้งาน HTTPS ใน "การตั้งค่า > อุปกรณ์" เพื่อใช้โหมดนี้', + resolution: 'ความคมชัด', + auto: 'อัตโนมัติ', + autoTips: + 'อาการภาพฉีกขาดหรือเมาส์ไม่ตรงตำแหน่งอาจเกิดขึ้นที่ความละเอียดบางระดับ แนะนำให้ปรับความละเอียดของคอมพิวเตอร์ต้นทางหรือปิดโหมดอัตโนมัติ', + fps: 'FPS', + customizeFps: 'กำหนดเอง', + quality: 'คุณภาพ', + qualityLossless: 'ไม่สูญเสียคุณภาพ', + qualityHigh: 'สูง', + qualityMedium: 'กลาง', + qualityLow: 'ต่ำ', + frameDetect: 'ตรวจจับเฟรม', + frameDetectTip: + 'ระบบจะคำนวณความแตกต่างระหว่างเฟรม และหยุดส่งสตรีมวิดีโอเมื่อไม่พบการเปลี่ยนแปลงบนหน้าจอของคอมพิวเตอร์ต้นทาง', + resetHdmi: 'รีเช็ท HDMI' + }, + keyboard: { + title: 'คีบอร์ด', + paste: 'วาง', + tips: 'รองรับเฉพาะตัวอักษรและสัญลักษณ์มาตรฐานของแป้นพิมพ์เท่านั้น', + placeholder: 'กรุณาป้อน', + submit: 'ยืนยัน', + virtual: 'คีบอร์ด', + readClipboard: 'อ่านจากคลิปบอร์ด', + clipboardPermissionDenied: + 'การอนุญาตคลิปบอร์ดถูกปฏิเสธ โปรดอนุญาตการเข้าถึงคลิปบอร์ดในเบราว์เซอร์ของคุณ', + clipboardReadError: 'ไม่สามารถอ่านคลิปบอร์ดได้', + dropdownEnglish: 'ภาษาอังกฤษ', + dropdownGerman: 'เยอรมัน', + dropdownFrench: 'ฝรั่งเศส', + dropdownRussian: 'รัสเซีย', + shortcut: { + title: 'ทางลัด', + custom: 'กำหนดเอง', + capture: 'คลิกที่นี่เพื่อจับภาพทางลัด', + clear: 'ชัดเจน', + save: 'บันทึก', + captureTips: 'การจับปุ่มระดับระบบ (เช่น ปุ่ม Windows) ต้องได้รับสิทธิ์โหมดเต็มหน้าจอ', + enterFullScreen: 'สลับโหมดเต็มหน้าจอ' }, - wol: { - title: 'Wake-on-LAN', - sending: 'กำลังส่งคำสั่ง...', - sent: 'ส่งคำสั่งแล้ว', - input: 'กรุณาใส่ MAC Address ของเครื่องที่ต้องการปลุก', - ok: 'ยืนยัน' - }, - download: { - title: 'ดาวโหลด Disk Image', - input: 'กรุณาใส่ลิงค์ของ Disk Image.', - ok: 'ยืนยัน', - disabled: '/data มีการตั้งค่าเป็นอ่านอย่างเดียว ดังนั้นเราไม่สามารถดาวโหลด Disk Image ได้' - }, - power: { - title: 'เปิด/ปิด', - reset: 'รีเช็ท', - power: 'เปิด/ปิด', - powerShort: 'เปิด/ปิด (กดปล่อย)', - powerLong: 'เปิด/ปิด (กดค้าง)' - }, - settings: { - title: 'การตั้งค่า', - about: { - title: 'เกี๋ยวกับ NanoKVM', - information: 'ข้อมูล', - ip: 'IP', - mdns: 'mDNS', - application: 'เวอร์ชั่นแอปพิเคชั่น', - applicationTip: 'เวอร์ชั่นเว็บ NanoKVM', - image: 'เวอร์ชั่น Image ระบบ', - imageTip: 'เวอร์ชั่น Image ระบบ NanoKVM', - deviceKey: 'คีย์อุปกรณ์', - community: 'ชุมชน' + leaderKey: { + title: 'ปุ่ม Leader', + desc: 'ข้ามข้อจำกัดของเบราว์เซอร์และส่งทางลัดของระบบไปยังโฮสต์ระยะไกลโดยตรง', + howToUse: 'วิธีการใช้งาน', + simultaneous: { + title: 'โหมดพร้อมกัน', + desc1: 'กดปุ่ม Leader ค้างไว้ แล้วกดปุ่มลัด', + desc2: 'ใช้งานง่าย แต่อาจขัดแย้งกับทางลัดของระบบ' }, - appearance: { - title: 'ลักษณะการแสดงผล', - display: 'การแสดงผล', - language: 'ภาษา', - menuBar: 'แถบเมนู', - menuBarDesc: 'แสดงไอคอนในแถบเมนู' + sequential: { + title: 'โหมดต่อเนื่อง', + desc1: 'กดปุ่ม Leader → กดปุ่มลัดตามลำดับ → กดปุ่ม Leader อีกครั้ง', + desc2: 'ต้องมีขั้นตอนเพิ่มเติม แต่หลีกเลี่ยงความขัดแย้งของระบบโดยสิ้นเชิง' }, - device: { - title: 'อุปกรณ์', - oled: { - title: 'OLED', - description: 'เวลาก่อนจอ OLED จะปิดอัตโนมัติ', - 0: 'ไม่เลย', - 15: '15 วินาที', - 30: '30 วินาที', - 60: '1 นาที', - 180: '3 นาทร', - 300: '5 นาที', - 600: '10 นาที', - 1800: '30 นาที', - 3600: '1 ชั่วโมง' - }, - ssh: { - description: 'เปิดใช้งาน SSH', - tip: 'ตั้งรหัสผ่านทีปลอดถัยก่อนเปิดใช้งาน (บัญชี - เปลี่ยนรหัสผ่าน)' - }, - disk: 'ดิสก์จำลอง', - diskDesc: 'เปิดใช้งาน U-disk จำลอง', - network: 'เครือข่ายจำลอง', - networkDesc: 'เปิดใช้งานอุปกรณ์เครือข่ายจำลอง' - }, - network: { - title: 'เครือข่าย', - wifi: { - title: 'Wi-Fi', - description: 'ตั้งค่า Wi-Fi', - apMode: 'เปิดใช้งานโหมด AP แล้ว ให้เชื่อมต่อ Wi-Fi โดยสแกนรหัส QR', - connect: 'เชื่อมต่อ Wi-Fi', - connectDesc1: 'กรุณาใส่ SSID และรหัสผ่านของเครือข่าย', - connectDesc2: 'กรุณาใส่รหัสผ่านเพื่อเข้าร่วมเครือข่ายนี้', - disconnect: 'คุณแน่ใจหรือไม่ว่าต้องการตัดการเชื่อมต่อเครือข่าย?', - failed: 'เชื่อมต่อไม่สำเร็จ กรุณาลองอีกครั้ง', - ssid: 'ชื่อ', - password: 'รหัสผ่าน', - joinBtn: 'เข้าร่วม', - confirmBtn: 'ตกลง', - cancelBtn: 'ยกเลิก' - }, - tls: { - description: 'เปิดใช้งานโปรโตคอล HTTPS', - tip: 'โปรดทราบ: การใช้ HTTPS อาจเพิ่มความหน่วง โดยเฉพาะในโหมดวิดีโอ MJPEG' - }, - dns: { - title: 'DNS', - description: 'ตั้งค่าเซิร์ฟเวอร์ DNS สำหรับ NanoKVM', - mode: 'โหมด', - dhcp: 'DHCP', - manual: 'กำหนดเอง', - add: 'เพิ่ม DNS', - save: 'บันทึก', - invalid: 'กรุณาใส่ที่อยู่ IP ที่ถูกต้อง', - noDhcp: 'ขณะนี้ไม่มี DHCP DNS ให้ใช้งาน', - saved: 'บันทึกการตั้งค่า DNS แล้ว', - saveFailed: 'บันทึกการตั้งค่า DNS ไม่สำเร็จ', - unsaved: 'มีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก', - maxServers: 'อนุญาตเซิร์ฟเวอร์ DNS ได้สูงสุด {{count}} รายการ', - dnsServers: 'เซิร์ฟเวอร์ DNS', - dhcpServersDescription: 'เซิร์ฟเวอร์ DNS จะได้รับจาก DHCP โดยอัตโนมัติ', - manualServersDescription: 'สามารถแก้ไขเซิร์ฟเวอร์ DNS ได้ด้วยตนเอง', - networkDetails: 'รายละเอียดเครือข่าย', - interface: 'อินเทอร์เฟซ', - ipAddress: 'ที่อยู่ IP', - subnetMask: 'Subnet Mask', - router: 'เราเตอร์', - none: 'ไม่มี' - } - }, - tailscale: { - title: 'Tailscale', - memory: { - title: 'การปรับแต่งหน่วยความจำ', - tip: "เมื่อการใช้งานหน่วยความจำเกินขีดจำกัด การเก็บขยะจะทำงานอย่างเข้มงวดมากขึ้นเพื่อพยายามปล่อยหน่วยความจำ คำแนะนำคือการตั้งค่าเป็น 50MB หากใช้ Tailscale และต้องทำการรีสตาร์ท Tailscale เพื่อให้การเปลี่ยนแปลงมีผล", - disable: 'ปิดใช้งาน' - }, - restart: 'คุณแน่ใจที่จะรีสตาร์ท Tailscale หรือไม่?', - stop: 'คุณแน่ใจที่จะปิด Tailscale หรือไม่?', - stopDesc: 'ออกจากระบบ Tailscale และปิดใช้งานการเริ่มต้นอัตโนมัติเมื่อบูตเครื่อง', - loading: 'กำลังโหลด...', - notInstall: 'ไม่พบ Tailscale! กรุณาติดตั้ง', - install: 'ติดตั้ง', - installing: 'กำลังติดตั้ง', - failed: 'การติดตั้งล้มเหลว', - retry: 'กรุณารีเฟรชและลองใหม่ หรือพยายามติดตั้งด้วยตนเอง', - download: 'ดาวน์โหลด', - package: 'แพ็กเกจการติดตั้ง', - unzip: 'และแตกไฟล์', - upTailscale: 'อัปโหลด tailscale ไปยังไดเรกทอรี /usr/bin/ ของ NanoKVM', - upTailscaled: 'อัปโหลด tailscaled ไปยังไดเรกทอรี /usr/sbin/ ของ NanoKVM', - refresh: 'รีเฟรชหน้าปัจจุบัน', - notLogin: 'อุปกรณ์ยังไม่ได้ผูกบัญชี กรุณาล็อกอินและผูกอุปกรณ์นี้กับบัญชีของคุณ', - urlPeriod: 'ลิงก์นี้ใช้ได้ 10 นาที', - login: 'ล็อกอิน', - loginSuccess: 'ล็อกอินสำเร็จ', - enable: 'เปิดใช้งาน Tailscale', - deviceName: 'ชื่ออุปกรณ์', - deviceIP: 'IP อุปกรณ์', - account: 'บัญชีผู้ใช้', - logout: 'ออกจากระบบ', - logout2: 'คุณแน่ใจที่จะออกจากระบบหรือไม่?', - uninstall: 'ถอนการติดตั้ง Tailscale', - okBtn: 'ใช่', - cancelBtn: 'ไม่ใช่' - }, - update: { - title: 'ตรวจสอบการอัปเดต', - queryFailed: 'ไม่สามารถรับข้อมูลเวอร์ชันได้', - updateFailed: 'การอัปเดตล้มเหลว กรุณาลองใหม่', - isLatest: 'คุณมีเวอร์ชันล่าสุดแล้ว', - available: 'มีการอัปเดตใหม่ คุณแน่ใจที่จะอัปเดตหรือไม่?', - updating: 'กำลังเริ่มอัปเดต กรุณารอสักครู่...', - confirm: 'ยืนยัน', - cancel: 'ยกเลิก', - preview: 'ดูตัวอย่างการอัปเดต', - previewDesc: 'เข้าถึงฟีเจอร์และการปรับปรุงใหม่ก่อนใคร', - previewTip: 'โปรดทราบว่าการเผยแพร่ตัวอย่างอาจมีข้อบกพร่องหรือฟังก์ชันการทำงานที่ไม่สมบูรณ์!' - }, - account: { - title: 'บัญชี', - webAccount: 'ชื่อผู้ใช้', - password: 'รหัสผ่าน', - updateBtn: 'ยืนยัน', - logoutBtn: 'ออกจากระบบ', - logoutDesc: 'คุณแน่ใจที่จะออกจากระบบหรือไม่?', - okBtn: 'ใช่', - cancelBtn: 'ไม่ใช่' + enable: 'เปิดใช้งานปุ่ม Leader', + tip: 'เมื่อตั้งเป็นปุ่ม Leader ปุ่มนี้จะใช้เป็นตัวเรียกปุ่มลัดเท่านั้น และจะไม่ทำงานตามค่าเริ่มต้นอีกต่อไป', + placeholder: 'กรุณากดปุ่ม Leader', + shiftRight: 'Shift ขวา', + ctrlRight: 'Ctrl ขวา', + metaRight: 'Win ขวา', + submit: 'ยืนยัน', + recorder: { + rec: 'บันทึก', + activate: 'เปิดใช้งานปุ่ม', + input: 'กรุณากดทางลัด...' + } + } + }, + mouse: { + title: 'เมาส์', + cursor: 'รูปแบบเคอร์เซอร์', + default: 'ตัวชี้เริ่มต้น', + pointer: 'ตัวชี้แบบชี้', + cell: 'ตัวชี้แบบเซลล์', + text: 'ตัวชี้แบบข้อความ', + grab: 'ตัวชี้แบบจับ', + hide: 'ซ่อนตัวชี้', + mode: 'โหมดเมาส์', + absolute: 'โหมดสัมบูรณ์', + relative: 'โหมดสัมพัทธ์', + direction: 'ทิศทางล้อเลื่อน', + scrollUp: 'เลื่อนขึ้น', + scrollDown: 'เลื่อนลง', + speed: 'ความเร็วล้อเลื่อน', + fast: 'รวดเร็ว', + slow: 'ช้า', + requestPointer: 'กำลังใช้โหมดสัมพัทธ์ กรุณาคลิกที่เดสก์ท็อปเพื่อรับตัวชี้เมาส์', + resetHid: 'รีเซ็ต HID', + hidOnly: { + title: 'โหมด HID เท่านั้น', + desc: 'หากเมาส์และคีย์บอร์ดของคุณหยุดตอบสนองและการรีเซ็ต HID ไม่ช่วย อาจเป็นปัญหาความเข้ากันได้ระหว่าง NanoKVM และอุปกรณ์ ลองเปิดโหมด HID-Only เพื่อความเข้ากันได้ที่ดีขึ้น', + tip1: 'การเปิดโหมด HID-Only จะปิดการทำงานดิสก์จำลองและ NIC จำลอง', + tip2: 'ในโหมด HID-Only ดิสก์จะลองจะถูกปิดใช้งาน', + tip3: 'NanoKVM จะรีบูตอัตโนมัติหลังจากเปลี่ยนโหมด', + enable: 'เปิดใช้งานโหมด HID-Only', + disable: 'ปิดใช้งานโหมด HID-Only' + } + }, + image: { + title: 'ดิสก์จำลอง', + loading: 'กำลังโหลด...', + empty: 'ไม่พบดิสก์', + mountMode: 'โหมดเมาท์', + mountFailed: 'การติดตั้งล้มเหลว', + mountDesc: 'ในบางระบบ, จะต้อง eject ดิสก์จำลองก่อนที่จะใส่ดิสก์ใหม่.', + unmountFailed: 'การถอนติดตั้งล้มเหลว', + unmountDesc: + 'ในบางระบบ คุณต้องดีดออกจากโฮสต์ระยะไกลด้วยตนเองก่อนที่จะยกเลิกการต่อเชื่อมอิมเมจ', + refresh: 'รีเฟรชรายการรูปภาพ', + attention: 'ความสนใจ', + deleteConfirm: 'คุณแน่ใจหรือไม่ว่าต้องการลบภาพนี้?', + okBtn: 'ใช่', + cancelBtn: 'ไม่ใช่', + tips: { + title: 'วิธีการอัปโหลด', + usb1: 'เชื่อมต่อ NanoKVM กับคอมพิวเตอร์ของคุณผ่าน USB', + usb2: 'ตรวจสอบให้แน่ใจว่าได้เปิดใช้งานดิสก์เสมือนแล้ว (ตั้งค่า - ดิสก์เสมือน)', + usb3: 'เปิดดิสก์บนคอมพิวเตอร์ของคุณและคัดลอกไฟล์อิมเมจไปยังไดเรกทอรีหลักของดิสก์', + scp1: 'ตรวจสอบให้แน่ใจว่า NanoKVM และคอมพิวเตอร์ของคุณอยู่ในเครือข่ายเดียวกัน', + scp2: 'เปิดเทอร์มินัลบนคอมพิวเตอร์ของคุณและใช้คำสั่ง SCP เพื่ออัปโหลดไฟล์อิมเมจไปยังไดเรกทอรี /data บน NanoKVM', + scp3: 'ตัวอย่าง: scp <ที่อยู่ของไฟล์> root@:/data', + tfCard: 'การ์ด TF', + tf1: 'วิธีนี้รองรับแค่บนระบบปฏิบัติการ Linux', + tf2: 'นำการ์ด TF ออกจาก NanoKVM', + tf3: 'ใส่การ์ด TF ลงในเครื่องอ่านการ์ดและเชื่อมต่อกับคอมพิวเตอร์ของคุณ', + tf4: 'คัดลอกไฟล์อิมเมจไปยังไดเรกทอรี /data บนการ์ด TF', + tf5: 'ใส่การ์ด TF กลับเข้า NanoKVM' + } + }, + script: { + title: 'สคริปต์', + upload: 'อัปโหลด', + run: 'เรียกใช้', + runBackground: 'เรียกใช้ในพื้นหลัง', + runFailed: 'การเรียกใช้ล้มเหลว', + attention: 'ความสนใจ', + delDesc: 'คุณแน่ใจที่จะลบไฟล์นี้หรือไม่?', + confirm: 'ใช่', + cancel: 'ไม่ใช่', + delete: 'ลบ', + close: 'ปิด' + }, + terminal: { + title: 'เทอร์มินอล', + nanokvm: 'เทอร์มินอลของ NanoKVM', + serial: 'เทอร์มินอลของ Serial Port', + serialPort: 'พอร์ตอนุกรม', + serialPortPlaceholder: 'กรุณาเลือก serial port', + baudrate: 'อัตราบอด', + parity: 'พาริตี', + parityNone: 'ไม่มี', + parityEven: 'คู่', + parityOdd: 'คี่', + flowControl: 'การควบคุมการไหล', + flowControlNone: 'ไม่มี', + flowControlSoft: 'ซอฟต์แวร์', + flowControlHard: 'ฮาร์ดแวร์', + dataBits: 'บิตข้อมูล', + stopBits: 'บิตหยุด', + confirm: 'ยืนยัน' + }, + wol: { + title: 'Wake-on-LAN', + sending: 'กำลังส่งคำสั่ง...', + sent: 'ส่งคำสั่งแล้ว', + input: 'กรุณาใส่ MAC Address ของเครื่องที่ต้องการปลุก', + ok: 'ยืนยัน' + }, + download: { + title: 'ดาวโหลด Disk Image', + input: 'กรุณาใส่ URL ของอิมเมจระยะไกล', + ok: 'ยืนยัน', + disabled: '/data มีการตั้งค่าเป็นอ่านอย่างเดียว ดังนั้นเราไม่สามารถดาวโหลด Disk Image ได้', + uploadbox: 'วางไฟล์ที่นี่หรือคลิกเพื่อเลือก', + inputfile: 'กรุณากรอกไฟล์ภาพ', + NoISO: 'ไม่มี ISO' + }, + power: { + title: 'เปิด/ปิด', + showConfirm: 'การยืนยัน', + showConfirmTip: 'การทำงานของระบบไฟฟ้าต้องมีการยืนยันเพิ่มเติม', + reset: 'รีเช็ท', + power: 'เปิด/ปิด', + powerShort: 'เปิด/ปิด (กดปล่อย)', + powerLong: 'เปิด/ปิด (กดค้าง)', + resetConfirm: 'ดำเนินการรีเซ็ตต่อไปหรือไม่', + powerConfirm: 'ดำเนินการจ่ายไฟต่อหรือไม่', + okBtn: 'ใช่', + cancelBtn: 'ไม่ใช่' + }, + settings: { + title: 'การตั้งค่า', + about: { + title: 'เกี๋ยวกับ NanoKVM', + information: 'ข้อมูล', + ip: 'IP', + mdns: 'mDNS', + application: 'เวอร์ชั่นแอปพิเคชั่น', + applicationTip: 'เวอร์ชั่นเว็บ NanoKVM', + image: 'เวอร์ชั่น Image ระบบ', + imageTip: 'เวอร์ชั่น Image ระบบ NanoKVM', + deviceKey: 'คีย์อุปกรณ์', + community: 'ชุมชน', + hostname: 'ชื่อโฮสต์', + hostnameUpdated: 'อัปเดตชื่อโฮสต์แล้ว รีบูตเพื่อใช้', + ipType: { + Wired: 'มีสาย', + Wireless: 'ไร้สาย', + Other: 'อื่นๆ' } }, - error: { - title: 'เราเจอปัญหา', - refresh: 'รีเฟรช' + appearance: { + title: 'ลักษณะการแสดงผล', + display: 'การแสดงผล', + language: 'ภาษา', + languageDesc: 'เลือกภาษาสำหรับอินเทอร์เฟซ', + webTitle: 'ชื่อเว็บ', + webTitleDesc: 'ปรับแต่งชื่อหน้าเว็บ', + menuBar: { + title: 'แถบเมนู', + mode: 'โหมดการแสดงผล', + modeDesc: 'แสดงแถบเมนูบนหน้าจอ', + modeOff: 'ปิด', + modeAuto: 'ซ่อนอัตโนมัติ', + modeAlways: 'มองเห็นได้เสมอ', + icons: 'ไอคอนเมนูย่อย', + iconsDesc: 'แสดงไอคอนเมนูย่อยในแถบเมนู' + } }, - fullscreen: { - toggle: 'โหมดเต็มหน้าจอ' + device: { + title: 'อุปกรณ์', + oled: { + title: 'OLED', + description: 'เวลาก่อนจอ OLED จะปิดอัตโนมัติ', + 0: 'ไม่เลย', + 15: '15 วินาที', + 30: '30 วินาที', + 60: '1 นาที', + 180: '3 นาทร', + 300: '5 นาที', + 600: '10 นาที', + 1800: '30 นาที', + 3600: '1 ชั่วโมง' + }, + ssh: { + description: 'เปิดใช้งาน SSH', + tip: 'ตั้งรหัสผ่านทีปลอดถัยก่อนเปิดใช้งาน (บัญชี - เปลี่ยนรหัสผ่าน)' + }, + advanced: 'การตั้งค่าขั้นสูง', + swap: { + title: 'สลับ', + disable: 'ปิดการใช้งาน', + description: 'กำหนดขนาดไฟล์สลับ', + tip: 'การเปิดใช้งานคุณลักษณะนี้อาจทำให้อายุการใช้งานของการ์ด SD สั้นลง!' + }, + mouseJiggler: { + title: 'เมาส์กระตุก', + description: 'ป้องกันไม่ให้โฮสต์ระยะไกลเข้าสู่โหมดสลีป', + disable: 'ปิดการใช้งาน', + absolute: 'โหมดสัมบูรณ์', + relative: 'โหมดสัมพัทธ์' + }, + mdns: { + description: 'เปิดใช้งานบริการค้นหา mDNS', + tip: 'ปิดเครื่องหากไม่จำเป็น' + }, + hdmi: { + description: 'เปิดใช้งาน HDMI/เอาต์พุตมอนิเตอร์' + }, + autostart: { + title: 'การตั้งค่าสคริปต์เริ่มอัตโนมัติ', + description: 'จัดการสคริปต์ที่ทำงานโดยอัตโนมัติเมื่อเริ่มต้นระบบ', + new: 'ใหม่', + deleteConfirm: 'คุณแน่ใจที่จะลบไฟล์นี้หรือไม่?', + yes: 'ใช่', + no: 'ไม่ใช่', + scriptName: 'ชื่อสคริปต์เริ่มอัตโนมัติ', + scriptContent: 'เนื้อหาสคริปต์เริ่มอัตโนมัติ', + settings: 'การตั้งค่า' + }, + hidOnly: 'HID-โหมดเท่านั้น', + hidOnlyDesc: 'หยุดการจำลองอุปกรณ์เสมือน โดยคงไว้เพียงการควบคุม HID พื้นฐานเท่านั้น', + disk: 'ดิสก์จำลอง', + diskDesc: 'เปิดใช้งาน U-disk จำลอง', + network: 'เครือข่ายจำลอง', + networkDesc: 'เปิดใช้งานอุปกรณ์เครือข่ายจำลอง', + reboot: 'รีบูต', + rebootDesc: 'คุณแน่ใจหรือไม่ว่าต้องการรีบูต NanoKVM', + okBtn: 'ใช่', + cancelBtn: 'ไม่ใช่' }, - menu: { - collapse: 'ย่อเมนู', - expand: 'ขยายเมนู' + network: { + title: 'เครือข่าย', + wifi: { + title: 'Wi-Fi', + description: 'ตั้งค่า Wi-Fi', + apMode: 'เปิดใช้งานโหมด AP แล้ว ให้เชื่อมต่อ Wi-Fi โดยสแกนรหัส QR', + connect: 'เชื่อมต่อ Wi-Fi', + connectDesc1: 'กรุณาใส่ SSID และรหัสผ่านของเครือข่าย', + connectDesc2: 'กรุณาใส่รหัสผ่านเพื่อเข้าร่วมเครือข่ายนี้', + disconnect: 'คุณแน่ใจหรือไม่ว่าต้องการตัดการเชื่อมต่อเครือข่าย?', + failed: 'เชื่อมต่อไม่สำเร็จ กรุณาลองอีกครั้ง', + ssid: 'ชื่อ', + password: 'รหัสผ่าน', + joinBtn: 'เข้าร่วม', + confirmBtn: 'ตกลง', + cancelBtn: 'ยกเลิก' + }, + tls: { + description: 'เปิดใช้งานโปรโตคอล HTTPS', + tip: 'โปรดทราบ: การใช้ HTTPS อาจเพิ่มความหน่วง โดยเฉพาะในโหมดวิดีโอ MJPEG' + }, + dns: { + title: 'DNS', + description: 'ตั้งค่าเซิร์ฟเวอร์ DNS สำหรับ NanoKVM', + mode: 'โหมด', + dhcp: 'DHCP', + manual: 'กำหนดเอง', + add: 'เพิ่ม DNS', + save: 'บันทึก', + invalid: 'กรุณาใส่ที่อยู่ IP ที่ถูกต้อง', + noDhcp: 'ขณะนี้ไม่มี DHCP DNS ให้ใช้งาน', + saved: 'บันทึกการตั้งค่า DNS แล้ว', + saveFailed: 'บันทึกการตั้งค่า DNS ไม่สำเร็จ', + unsaved: 'มีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก', + maxServers: 'อนุญาตเซิร์ฟเวอร์ DNS ได้สูงสุด {{count}} รายการ', + dnsServers: 'เซิร์ฟเวอร์ DNS', + dhcpServersDescription: 'เซิร์ฟเวอร์ DNS จะได้รับจาก DHCP โดยอัตโนมัติ', + manualServersDescription: 'สามารถแก้ไขเซิร์ฟเวอร์ DNS ได้ด้วยตนเอง', + networkDetails: 'รายละเอียดเครือข่าย', + interface: 'อินเทอร์เฟซ', + ipAddress: 'ที่อยู่ IP', + subnetMask: 'ซับเน็ตมาสก์', + router: 'เราเตอร์', + none: 'ไม่มี' + } + }, + tailscale: { + title: 'Tailscale', + memory: { + title: 'การปรับแต่งหน่วยความจำ', + tip: 'เมื่อการใช้งานหน่วยความจำเกินขีดจำกัด การเก็บขยะจะทำงานอย่างเข้มงวดมากขึ้นเพื่อพยายามปล่อยหน่วยความจำ คำแนะนำคือการตั้งค่าเป็น 50MB หากใช้ Tailscale และต้องทำการรีสตาร์ท Tailscale เพื่อให้การเปลี่ยนแปลงมีผล' + }, + swap: { + title: 'สลับหน่วยความจำ', + tip: 'หากปัญหายังคงมีอยู่หลังจากเปิดใช้งานการเพิ่มประสิทธิภาพหน่วยความจำ ให้ลองเปิดใช้งานหน่วยความจำสลับ นี่เป็นการตั้งค่าขนาดไฟล์สลับเป็น 256MB ตามค่าเริ่มต้น ซึ่งสามารถปรับได้ใน "การตั้งค่า > อุปกรณ์"' + }, + restart: 'คุณแน่ใจที่จะรีสตาร์ท Tailscale หรือไม่?', + stop: 'คุณแน่ใจที่จะปิด Tailscale หรือไม่?', + stopDesc: 'ออกจากระบบ Tailscale และปิดใช้งานการเริ่มต้นอัตโนมัติเมื่อบูตเครื่อง', + loading: 'กำลังโหลด...', + notInstall: 'ไม่พบ Tailscale! กรุณาติดตั้ง', + install: 'ติดตั้ง', + installing: 'กำลังติดตั้ง', + failed: 'การติดตั้งล้มเหลว', + retry: 'กรุณารีเฟรชและลองใหม่ หรือพยายามติดตั้งด้วยตนเอง', + download: 'ดาวน์โหลด', + package: 'แพ็กเกจการติดตั้ง', + unzip: 'และแตกไฟล์', + upTailscale: 'อัปโหลด tailscale ไปยังไดเรกทอรี /usr/bin/ ของ NanoKVM', + upTailscaled: 'อัปโหลด tailscaled ไปยังไดเรกทอรี /usr/sbin/ ของ NanoKVM', + refresh: 'รีเฟรชหน้าปัจจุบัน', + notRunning: 'Tailscale ไม่ทำงาน กรุณาเริ่มต้นเพื่อดำเนินการต่อ', + run: 'เริ่ม', + notLogin: 'อุปกรณ์ยังไม่ได้ผูกบัญชี กรุณาล็อกอินและผูกอุปกรณ์นี้กับบัญชีของคุณ', + urlPeriod: 'ลิงก์นี้ใช้ได้ 10 นาที', + login: 'ล็อกอิน', + loginSuccess: 'ล็อกอินสำเร็จ', + enable: 'เปิดใช้งาน Tailscale', + deviceName: 'ชื่ออุปกรณ์', + deviceIP: 'IP อุปกรณ์', + account: 'บัญชีผู้ใช้', + logout: 'ออกจากระบบ', + logoutDesc: 'คุณแน่ใจที่จะออกจากระบบหรือไม่?', + uninstall: 'ถอนการติดตั้ง Tailscale', + uninstallDesc: 'คุณแน่ใจหรือไม่ว่าต้องการถอนการติดตั้ง Tailscale', + okBtn: 'ใช่', + cancelBtn: 'ไม่ใช่' + }, + update: { + title: 'ตรวจสอบการอัปเดต', + queryFailed: 'ไม่สามารถรับข้อมูลเวอร์ชันได้', + updateFailed: 'การอัปเดตล้มเหลว กรุณาลองใหม่', + isLatest: 'คุณมีเวอร์ชันล่าสุดแล้ว', + available: 'มีการอัปเดตใหม่ คุณแน่ใจที่จะอัปเดตหรือไม่?', + updating: 'กำลังเริ่มอัปเดต กรุณารอสักครู่...', + confirm: 'ยืนยัน', + cancel: 'ยกเลิก', + preview: 'ดูตัวอย่างการอัปเดต', + previewDesc: 'เข้าถึงฟีเจอร์และการปรับปรุงใหม่ก่อนใคร', + previewTip: + 'โปรดทราบว่าการเผยแพร่ตัวอย่างอาจมีข้อบกพร่องหรือฟังก์ชันการทำงานที่ไม่สมบูรณ์!', + offline: { + title: 'อัปเดตออฟไลน์', + desc: 'อัปเดตผ่านแพ็คเกจการติดตั้งในเครื่อง', + upload: 'อัปโหลด', + invalidName: 'รูปแบบชื่อไฟล์ไม่ถูกต้อง กรุณาดาวน์โหลดจากรุ่น GitHub', + updateFailed: 'การอัปเดตล้มเหลว กรุณาลองใหม่' + } + }, + account: { + title: 'บัญชี', + webAccount: 'ชื่อผู้ใช้', + password: 'รหัสผ่าน', + updateBtn: 'ยืนยัน', + logoutBtn: 'ออกจากระบบ', + logoutDesc: 'คุณแน่ใจที่จะออกจากระบบหรือไม่?', + okBtn: 'ใช่', + cancelBtn: 'ไม่ใช่' } + }, + picoclaw: { + title: 'PicoClaw ผู้ช่วย', + empty: 'เปิดแผงควบคุมและเริ่มงานเพื่อเริ่มต้น', + inputPlaceholder: 'อธิบายสิ่งที่คุณต้องการให้ PicoClaw ทำ', + newConversation: 'บทสนทนาใหม่', + processing: 'กำลังประมวลผล...', + agent: { + defaultTitle: 'ผู้ช่วยทั่วไป', + defaultDescription: 'แชททั่วไป การค้นหา และพื้นที่ช่วยเหลือ', + kvmTitle: 'การควบคุมระยะไกล', + kvmDescription: 'ใช้งานโฮสต์ระยะไกลผ่าน NanoKVM', + switched: 'เปลี่ยนบทบาทตัวแทนแล้ว', + switchFailed: 'ไม่สามารถเปลี่ยนบทบาทตัวแทนได้' + }, + send: 'ส่ง', + cancel: 'ยกเลิก', + status: { + connecting: 'กำลังเชื่อมต่อกับเกตเวย์...', + connected: 'เชื่อมต่อเซสชัน PicoClaw แล้ว', + disconnected: 'ตัดการเชื่อมต่อเซสชัน PicoClaw แล้ว', + stopped: 'ส่งคำขอหยุดแล้ว', + runtimeStarted: 'เริ่ม Runtime PicoClaw แล้ว', + runtimeStartFailed: 'ไม่สามารถเริ่ม Runtime PicoClaw ได้', + runtimeStopped: 'หยุด Runtime PicoClaw แล้ว', + runtimeStopFailed: 'ไม่สามารถหยุด Runtime PicoClaw ได้' + }, + connection: { + runtime: { + checking: 'กำลังตรวจสอบ', + ready: 'Runtime พร้อมใช้งาน', + stopped: 'หยุด Runtime แล้ว', + unavailable: 'Runtime ไม่พร้อมใช้งาน', + configError: 'ข้อผิดพลาดในการกำหนดค่า' + }, + transport: { + connecting: 'กำลังเชื่อมต่อ', + connected: 'เชื่อมต่อแล้ว' + }, + run: { + idle: 'ไม่ได้ใช้งาน', + busy: 'ไม่ว่าง' + } + }, + message: { + toolAction: 'การกระทำ', + observation: 'การสังเกต', + screenshot: 'ภาพหน้าจอ' + }, + overlay: { + locked: 'PicoClaw กำลังควบคุมอุปกรณ์ การป้อนข้อมูลด้วยตนเองถูกหยุดชั่วคราว' + }, + install: { + install: 'ติดตั้ง PicoClaw', + installing: 'กำลังติดตั้ง PicoClaw', + success: 'PicoClaw ติดตั้งสำเร็จแล้ว', + failed: 'ไม่สามารถติดตั้ง PicoClaw', + uninstalling: 'กำลังถอนการติดตั้ง Runtime...', + uninstalled: 'ถอนการติดตั้ง Runtime สำเร็จแล้ว', + uninstallFailed: 'การถอนการติดตั้งล้มเหลว', + requiredTitle: 'PicoClaw ไม่ได้ติดตั้ง', + requiredDescription: 'ติดตั้ง PicoClaw ก่อนที่จะเริ่ม Runtime PicoClaw', + progressDescription: 'PicoClaw กำลังดาวน์โหลดและติดตั้ง', + stages: { + preparing: 'กำลังเตรียมการ', + downloading: 'กำลังดาวน์โหลด', + extracting: 'กำลังแตกไฟล์', + installing: 'กำลังติดตั้ง', + installed: 'ติดตั้งแล้ว', + install_timeout: 'หมดเวลา', + install_failed: 'ล้มเหลว' + } + }, + model: { + requiredTitle: 'จำเป็นต้องมีการกำหนดค่าโมเดล', + requiredDescription: 'กำหนดค่าโมเดล PicoClaw ก่อนใช้แชท PicoClaw', + docsTitle: 'คู่มือการกำหนดค่า', + docsDesc: 'รุ่นและโปรโตคอลที่รองรับ', + menuLabel: 'กำหนดค่าโมเดล', + modelIdentifier: 'ตัวระบุรุ่น', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'คีย์ API', + apiKeyPlaceholder: 'ป้อนคีย์ API ของโมเดล', + save: 'บันทึก', + saving: 'กำลังบันทึก', + saved: 'บันทึกการกำหนดค่าโมเดลแล้ว', + saveFailed: 'ไม่สามารถบันทึกการกำหนดค่าโมเดลได้', + invalid: 'ต้องระบุรหัสโมเดล, API Base URL และคีย์ API' + }, + uninstall: { + menuLabel: 'ถอนการติดตั้ง', + confirmTitle: 'ถอนการติดตั้ง PicoClaw', + confirmContent: + 'คุณแน่ใจหรือไม่ว่าต้องการถอนการติดตั้ง PicoClaw การดำเนินการนี้จะลบไฟล์ปฏิบัติการและไฟล์การกำหนดค่าทั้งหมด', + confirmOk: 'ถอนการติดตั้ง', + confirmCancel: 'ยกเลิก' + }, + history: { + title: 'ประวัติ', + loading: 'กำลังโหลดเซสชัน...', + emptyTitle: 'ยังไม่มีประวัติ', + emptyDescription: 'เซสชัน PicoClaw ก่อนหน้าจะปรากฏที่นี่', + loadFailed: 'ไม่สามารถโหลดประวัติเซสชันได้', + deleteFailed: 'ไม่สามารถลบเซสชันได้', + deleteConfirmTitle: 'ลบเซสชัน', + deleteConfirmContent: 'คุณแน่ใจหรือไม่ว่าต้องการลบ "{{title}}"', + deleteConfirmOk: 'ลบ', + deleteConfirmCancel: 'ยกเลิก', + messageCount_one: '{{count}} ข้อความ', + messageCount_other: '{{count}} ข้อความ' + }, + config: { + startRuntime: 'เริ่ม PicoClaw', + stopRuntime: 'หยุด PicoClaw' + }, + start: { + title: 'เริ่ม PicoClaw', + description: 'เริ่ม Runtime เพื่อเริ่มใช้ผู้ช่วย PicoClaw' + } + }, + error: { + title: 'เราเจอปัญหา', + refresh: 'รีเฟรช' + }, + fullscreen: { + toggle: 'โหมดเต็มหน้าจอ' + }, + menu: { + collapse: 'ย่อเมนู', + expand: 'ขยายเมนู' } - }; - - export default th; + } +}; + +export default th; diff --git a/web/src/i18n/locales/tr.ts b/web/src/i18n/locales/tr.ts index da80b55..655ef6a 100644 --- a/web/src/i18n/locales/tr.ts +++ b/web/src/i18n/locales/tr.ts @@ -14,8 +14,11 @@ const tr = { placeholderPassword2: 'Şifrenizi tekrar deneyiniz', noEmptyUsername: 'Kullanıcı adı gereklidir', noEmptyPassword: 'Şifre gereklidir', - noAccount: 'Kullanıcı verileri alınırken hata yaşandı, lütfen sayfayı yenileyiniz ya da şifrenizi sıfırlayınız', + noAccount: + 'Kullanıcı verileri alınırken hata yaşandı, lütfen sayfayı yenileyiniz ya da şifrenizi sıfırlayınız', invalidUser: 'Yanlış kullanıcı adı ya da şifre', + locked: 'Çok fazla giriş yapıldı, lütfen daha sonra tekrar deneyin', + globalLocked: 'Sistem koruma altında, lütfen daha sonra tekrar deneyin', error: 'Beklenmedik bir hata', changePassword: 'Şifrenizi değiştiriniz', changePasswordDesc: 'Güvenlik sebebiyle lütfen şifrenizi değiştiriniz!', @@ -35,25 +38,36 @@ const tr = { change1: 'Bu işlem şu şifreleri değiştiricektir:', change2: 'Arayüz giriş şifresi', change3: 'Sistem yöneticisi şifresi (Güvenli Kabuk Bağlantısı (SSH) giriş şifresi)', - change4: 'Şifreleri sıfırlamak için NanoKVM üzerinde bulunan BOOT tuşuna 10 saniye boyunca basılı tutun.' + change4: + 'Şifreleri sıfırlamak için NanoKVM üzerinde bulunan BOOT tuşuna 10 saniye boyunca basılı tutun.' } }, wifi: { title: 'Wi-Fi', description: 'NanoKVM için Wi-Fi ayarlarını ayarlayın', - success: 'NanoKVM\'in bağlantı durumunu kontrol edin ve yeni IP adresini ziyaret edin.', + success: "NanoKVM'in bağlantı durumunu kontrol edin ve yeni IP adresini ziyaret edin.", failed: 'İşlem başarısız oldu, lütfen tekrar deneyiniz.', + invalidMode: + 'Geçerli mod ağ kurulumunu desteklemiyor. Lütfen cihazınıza gidin ve Wi-Fi yapılandırma modunu etkinleştirin.', confirmBtn: 'Tamam', - finishBtn: 'Bitti' + finishBtn: 'Bitti', + ap: { + authTitle: 'Kimlik Doğrulaması Gerekli', + authDescription: 'Devam etmek için lütfen AP şifresini girin', + authFailed: 'Geçersiz AP şifresi', + passPlaceholder: 'AP şifre', + verifyBtn: 'Doğrula' + } }, screen: { + scale: 'Ölçek', title: 'Ekran', video: 'Görüntü modu', videoDirectTips: 'kullanmak için "Ayarlar > Cihaz" HTTPS aktif edin', resolution: 'Çözünürlük', auto: 'Otomatik', autoTips: - "Belirli çözünürlüklerde ekran yırtılması veya fare kayması meydana gelebilir. Bu durumda uzak ana bilgisayarın çözünürlüğünü ayarlamayı ya da otomatik modu devre dışı bırakmayı deneyin.", + 'Belirli çözünürlüklerde ekran yırtılması veya fare kayması meydana gelebilir. Bu durumda uzak ana bilgisayarın çözünürlüğünü ayarlamayı ya da otomatik modu devre dışı bırakmayı deneyin.', fps: 'Saniyedeki kare sayısı', customizeFps: 'Kişiselleştir', quality: 'Kalite', @@ -63,7 +77,7 @@ const tr = { qualityLow: 'Düşük', frameDetect: 'Kareleri algıla', frameDetectTip: - "Gönderilen kareler arasındaki farkı hesaplar. Uzak ana bilgisayardan gönderilen yayında bir değişiklik yoksa görüntü yayınını durdurur.", + 'Gönderilen kareler arasındaki farkı hesaplar. Uzak ana bilgisayardan gönderilen yayında bir değişiklik yoksa görüntü yayınını durdurur.', resetHdmi: 'HDMI sıfırla' }, keyboard: { @@ -73,7 +87,51 @@ const tr = { placeholder: 'Girdi', submit: 'Gönder', virtual: 'Klavye', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Panodan Oku', + clipboardPermissionDenied: + 'Pano izni reddedildi. Lütfen tarayıcınızda pano erişimine izin verin.', + clipboardReadError: 'Pano okunamadı', + dropdownEnglish: 'İngilizce', + dropdownGerman: 'Almanca', + dropdownFrench: 'Fransızca', + dropdownRussian: 'Rusça', + shortcut: { + title: 'Kısayollar', + custom: 'Özel', + capture: 'Kısayolu yakalamak için burayı tıklayın', + clear: 'Temizle', + save: 'Kaydet', + captureTips: + 'Windows tuşu gibi sistem düzeyi tuşları yakalamak için tam ekran izni gerekir.', + enterFullScreen: 'Tam ekran moduna geçiş yapın.' + }, + leaderKey: { + title: 'Leader Tuşu', + desc: 'Tarayıcı kısıtlamalarını atlayın ve sistem kısayollarını doğrudan uzak ana bilgisayara gönderin.', + howToUse: 'Nasıl Kullanılır', + simultaneous: { + title: 'Eşzamanlı Mod', + desc1: 'Leader tuşunu basılı tutun, ardından kısayola basın.', + desc2: 'Sezgisel, ancak sistem kısayollarıyla çakışabilir.' + }, + sequential: { + title: 'Sıralı Mod', + desc1: 'Leader tuşuna basın → kısayola sırayla basın → Leader tuşuna tekrar basın.', + desc2: 'Daha fazla adım gerektirir ancak sistem çakışmalarını tamamen önler.' + }, + enable: 'Leader tuşunu etkinleştir', + tip: 'Leader tuşu olarak atandığında bu tuş yalnızca kısayol tetikleyici olarak çalışır ve varsayılan davranışını kaybeder.', + placeholder: 'Leader tuşuna basın', + shiftRight: 'Sağ Shift', + ctrlRight: 'Sağ Ctrl', + metaRight: 'Sağ Win', + submit: 'Gönder', + recorder: { + rec: 'KAYIT', + activate: 'Tuşları etkinleştir', + input: 'Lütfen kısayola basın...' + } + } }, mouse: { title: 'Fare', @@ -87,44 +145,54 @@ const tr = { mode: 'Fare modu', absolute: 'Mutlak fare modu', relative: 'Bağıl fare modu', - speed: 'Tekerlek hızı', + direction: 'Kaydırma tekerleği yönü', + scrollUp: 'Yukarı kaydır', + scrollDown: 'Aşağı kaydır', + speed: 'Kaydırma tekerleği hızı', fast: 'Hızlı', slow: 'Yavaş', requestPointer: 'Bağıl fare modu kullanılıyor. Masaüstüne tıklayarak imleç elde edinin.', - resetHid: 'İnsan Arayüz Cihazı\'nı sıfırlayın', + resetHid: 'HID’yi sıfırla', hidOnly: { - title: 'Sadece İnsan Arayüz Cihazı modu', - desc: "Eğer fare ve klavye çalışmayı bırakırsa ve İnsan Arayüz Cihazı'nı sıfırlamak sorunu çözmezse bunun sebebi cihazınız ve NanoKVM arasındaki bir uyumluluk sorunu olabilir. Uyumluluğu arttırmak için Sadece İnsan Arayüz Cihazı modunu kullanın.", - tip1: 'Sadece İnsan Arayüz Cihazı modunu aktifleştirmek, sanal U-disk’i ve sanal ağı devre dışı bırakacaktır.', - tip2: 'Sadece İnsan Arayüz Cihazı modunda disk imajı bağlama özelliği devre dışı bırakılır', + title: 'Yalnızca HID modu', + desc: 'Fare ve klavye yanıt vermeyi durdurursa ve HID sıfırlama yardımcı olmazsa, NanoKVM ile cihaz arasında bir uyumluluk sorunu olabilir. Daha iyi uyumluluk için yalnızca HID modunu etkinleştirmeyi deneyin.', + tip1: 'Yalnızca HID modunu etkinleştirmek sanal U-disk’i ve sanal ağı ayırır', + tip2: 'Yalnızca HID modunda imaj bağlama devre dışıdır', tip3: 'NanoKVM mod değişiminden sonra kendiliğinden yeniden başlatılacaktır', - enable: 'Sadece İnsan Arayüz Cihazı modunu aktifleştir', - disable: 'Sadece İnsan Arayüz Cihazı modunu devre dışı bırak' + enable: 'Yalnızca HID modunu etkinleştir', + disable: 'Yalnızca HID modunu devre dışı bırak' } }, image: { title: 'Disk İmajları', loading: 'Yükleniyor...', empty: 'Hiçbir şey bulunamadı', - cdrom: 'Disk imajını CD-ROM modunda bağlayın.', + mountMode: 'Montaj modu', mountFailed: 'Bağlantı başarısız oldu', mountDesc: - "Bazı sistemlerde, disk imajını bağlamadan önce uzak ana bilgisayardaki sanal diski çıkarmak gerekir.", + 'Bazı sistemlerde, disk imajını bağlamadan önce uzak ana bilgisayardaki sanal diski çıkarmak gerekir.', + unmountFailed: 'Bağlantıyı kesme işlemi başarısız oldu', + unmountDesc: + 'Bazı sistemlerde, görüntünün bağlantısını kesmeden önce uzak ana bilgisayardan manuel olarak çıkarmanız gerekir.', refresh: 'Disk imajı listesini yenile', + attention: 'Dikkat', + deleteConfirm: 'Bu resmi silmek istediğinizden emin misiniz?', + okBtn: 'Evet', + cancelBtn: 'Hayır', tips: { title: 'Nasıl yüklenir', - usb1: 'NanoKVM\'i bilgisayarınıza USB ile bağlayın.', + usb1: "NanoKVM'i bilgisayarınıza USB ile bağlayın.", usb2: 'Sanal diskin bağlı olduğundan emin olun (Ayarlar - Sanal Disk).', usb3: 'Sanal diski bilgisayarınızda açın ve disk imajı dosyanızı sanal diskin kök dizinine kopyalayın.', scp1: 'NanoKVM ve bilgisayarınızın aynı yerel ağda bulunduğundan emin olun.', - scp2: 'Bilgisayarınızda uçbirimi açın ve disk imajı dosyanını SCP komudunu kullanarak NanoKVM\'in /data dizinine yükleyin.', + scp2: "Bilgisayarınızda uçbirimi açın ve disk imajı dosyanını SCP komudunu kullanarak NanoKVM'in /data dizinine yükleyin.", scp3: 'Örnek: scp senin-disk-imajı-dizinin root@senin-nanokvm-ip:/data', tfCard: 'micro SD kart', tf1: 'Bu yöntem Linux sistemlerde desteklenmektedir.', - tf2: 'NanoKVM\'den micro SD kartı çıkartın(TAM sürüm için öncelikle kutuyu sökün).', + tf2: "NanoKVM'den micro SD kartı çıkartın(TAM sürüm için öncelikle kutuyu sökün).", tf3: 'micro SD kartı kart okuyucusuna takın ve bilgisayarınıza bağlayın.', tf4: 'Disk imajı dosyanını micro SD kartın /data dizinine kopyalayın.', - tf5: 'micro SD kartı NanoKVM\'e geri yerleştirin.' + tf5: "micro SD kartı NanoKVM'e geri yerleştirin." } }, script: { @@ -144,7 +212,7 @@ const tr = { title: 'Uçbirim', nanokvm: 'NanoKVM Uçbirimi', serial: 'Serial Port Uçbirimi', - serialPort: 'Serial Port', + serialPort: 'Seri port', serialPortPlaceholder: 'Lütfen serial portunu giriniz', baudrate: 'Baud hızı', parity: 'Eşlik kontrolü', @@ -168,9 +236,12 @@ const tr = { }, download: { title: 'Disk İmajı İndirici', - input: 'Uzaktaki disk imajı adresini girin', + input: 'Uzak imaj URL’sini girin', ok: 'Tamam', - disabled: '/data bölüntüsü salt okunur modda, disk imajı indirilemiyor.' + disabled: '/data bölüntüsü salt okunur modda, disk imajı indirilemiyor.', + uploadbox: 'Dosyayı buraya bırakın veya seçmek için tıklayın', + inputfile: 'Lütfen resim dosyasını giriniz', + NoISO: 'ISO yok' }, power: { title: 'Güç', @@ -198,7 +269,7 @@ const tr = { imageTip: 'NanoKVM sistem imajı sürümü', deviceKey: 'Cihaz Anahtarı', community: 'Topluluk', - hostname: 'Hostname', + hostname: 'Ana makine adı', hostnameUpdated: 'Hostname güncellendi. Uygulamak için yeniden başlatın.', ipType: { Wired: 'Kablolu bağlantı', @@ -210,10 +281,19 @@ const tr = { title: 'Görünüm', display: 'Ekran', language: 'Dil', - menuBar: 'Menü çubuğu', - menuBarDesc: 'Menü çubuğunda ikonları göster', + languageDesc: 'Arayüz için dili seçin', webTitle: 'Site başlığı', - webTitleDesc: 'Görünen site başlığını güncelleyin' + webTitleDesc: 'Görünen site başlığını güncelleyin', + menuBar: { + title: 'Menü Çubuğu', + mode: 'Görüntüleme Modu', + modeDesc: 'Ekranda menü çubuğunu görüntüle', + modeOff: 'Kapalı', + modeAuto: 'Otomatik gizle', + modeAlways: 'Her zaman görünür', + icons: 'Alt Menü Simgeleri', + iconsDesc: 'Menü çubuğunda alt menü simgelerini görüntüle' + } }, device: { title: 'Cihaz', @@ -239,7 +319,7 @@ const tr = { title: 'Swap', disable: 'Aktifleştir', description: 'Swap dosyasının boyutunu belirle', - tip: "Bu özelliği aktifleştirmek micro SD kartınızın ömrünü kısaltabilir!" + tip: 'Bu özelliği aktifleştirmek micro SD kartınızın ömrünü kısaltabilir!' }, mouseJiggler: { title: 'Fare Oynatıcı', @@ -250,18 +330,32 @@ const tr = { }, mdns: { description: 'mDNS keşif hizmetini etkinleştir', - tip: "Kullanmıyorsanız devre dışı bırakabilirsiniz" + tip: 'Kullanmıyorsanız devre dışı bırakabilirsiniz' }, hdmi: { description: 'HDMI/Momitör çıktısını aktifleştir' }, - hidOnly: 'Sadece İnsan Arayüz Cihazı modu', + autostart: { + title: 'Otomatik Başlatılan Komut Dosyaları Ayarları', + description: + 'Sistem başlangıcında otomatik olarak çalıştırılan komut dosyalarını yönetme', + new: 'Yeni', + deleteConfirm: 'Bu dosyayı silmek istediğinden emin misin?', + yes: 'Evet', + no: 'Hayır', + scriptName: 'Otomatik Başlatma Komut Dosyası Adı', + scriptContent: 'Otomatik Başlatılan Komut Dosyası İçeriği', + settings: 'Ayarlar' + }, + hidOnly: 'Yalnızca HID modu', + hidOnlyDesc: + 'Yalnızca temel HID kontrolünü koruyarak sanal aygıtları taklit etmeyi bırakın', disk: 'Sanal Disk', - diskDesc: 'Sanal U-disk\'i uzak ana bilgisayara bağla', + diskDesc: "Sanal U-disk'i uzak ana bilgisayara bağla", network: 'Sanal Ağ', networkDesc: 'Sanal ağ kartını uzak ana bilgisayara bağla', reboot: 'Yeniden Başlat', - rebootDesc: 'NanoKVM\'i yeniden başlatmak istediğinizden emin misiniz?', + rebootDesc: "NanoKVM'i yeniden başlatmak istediğinizden emin misiniz?", okBtn: 'Evet', cancelBtn: 'Hayır' }, @@ -270,9 +364,9 @@ const tr = { wifi: { title: 'Wi-Fi', description: 'Wi-Fi ayarlayın', - apMode: 'AP modu etkin, QR kodu tarayarak Wi-Fi\'ye bağlanın', - connect: 'Wi-Fi\'ye bağlan', - connectDesc1: 'Lütfen ağ SSID\'sini ve parolayı girin', + apMode: "AP modu etkin, QR kodu tarayarak Wi-Fi'ye bağlanın", + connect: "Wi-Fi'ye bağlan", + connectDesc1: "Lütfen ağ SSID'sini ve parolayı girin", connectDesc2: 'Bu ağa katılmak için parolayı girin', disconnect: 'Ağ bağlantısını kesmek istediğinizden emin misiniz?', failed: 'Bağlantı başarısız, lütfen tekrar deneyin.', @@ -301,7 +395,7 @@ const tr = { unsaved: 'Kaydedilmemiş değişiklikler', maxServers: 'En fazla {{count}} DNS sunucusuna izin verilir', dnsServers: 'DNS Sunucuları', - dhcpServersDescription: 'DNS sunucuları DHCP\'den otomatik olarak alınır.', + dhcpServersDescription: "DNS sunucuları DHCP'den otomatik olarak alınır.", manualServersDescription: 'DNS sunucuları manuel olarak düzenlenebilir.', networkDetails: 'Ağ Ayrıntıları', interface: 'Arayüz', @@ -315,11 +409,14 @@ const tr = { title: 'Tailscale', memory: { title: 'Bellek optimizasyonu', - tip: "Bellek kullanımı sınırı aştığında, belleği boşaltmak amacıyla çöp toplama işlemi daha agresif bir şekilde gerçekleştirilir. Tailscale kullanıyorsanız bu değerin 75 MB olarak ayarlanması önerilir. Değişikliğin etkili olabilmesi için Tailscale'in yeniden başlatılması gerekir.", - disable: 'Devre dışı bırak' + tip: "Bellek kullanımı sınırı aştığında, belleği boşaltmak amacıyla çöp toplama işlemi daha agresif bir şekilde gerçekleştirilir. Tailscale kullanıyorsanız bu değerin 75 MB olarak ayarlanması önerilir. Değişikliğin etkili olabilmesi için Tailscale'in yeniden başlatılması gerekir." }, - restart: 'Tailscale\'i yeniden başlat?', - stop: 'Tailscale\'i durdur?', + swap: { + title: 'Belleği değiştir', + tip: 'Bellek optimizasyonunu etkinleştirdikten sonra sorunlar devam ederse, takas belleğini etkinleştirmeyi deneyin. Bu, takas dosyası boyutunu varsayılan olarak 256MB olarak ayarlar ve bu, "Ayarlar > Cihaz" bölümünden ayarlanabilir.' + }, + restart: "Tailscale'i yeniden başlat?", + stop: "Tailscale'i durdur?", stopDesc: 'Tailscale oturumundan çıkış yap ve başlangıçta çalışmasını devre dışı bırak.', loading: 'Yükleniyor...', notInstall: 'Tailscale bulunamadı! Lütfen indirin.', @@ -330,21 +427,23 @@ const tr = { download: 'İndir', package: 'yükleme paketi', unzip: 'sıkışmış dosyayı açın', - upTailscale: 'tailscale dosyasını NanoKVM\'in /usr/bin dizinine yükleyin', - upTailscaled: 'tailscaled dosyasını NanoKVM\'in /usr/sbin dizinine yükleyin', + upTailscale: "tailscale dosyasını NanoKVM'in /usr/bin dizinine yükleyin", + upTailscaled: "tailscaled dosyasını NanoKVM'in /usr/sbin dizinine yükleyin", refresh: 'İçinde bulunduğunuz sayfayı yenileyin', - notLogin: - 'Cihaz bağlı değil. Lütfen giriş yapıp cihazınızı hesabınıza bağlayın.', + notRunning: 'Tailscale çalışmıyor. Devam etmek için lütfen başlatın.', + run: 'Başlat', + notLogin: 'Cihaz bağlı değil. Lütfen giriş yapıp cihazınızı hesabınıza bağlayın.', urlPeriod: 'Adres sadece 10 ndakika boyunca geçerlidir', login: 'Giriş yap', loginSuccess: 'Giriş yapıldı', - enable: 'Tailscale\'i etkinleştir', + enable: "Tailscale'i etkinleştir", deviceName: 'Cihaz Adı', deviceIP: 'Cihaz IP adresi', account: 'Hesap', logout: 'Çıkış yap', logoutDesc: 'Çıkış yapmak istediğinizden emin misiniz?', - uninstall: 'Tailscale\'i kaldır', + uninstall: "Tailscale'i kaldır", + uninstallDesc: "Tailscale'i kaldırmak istediğinizden emin misiniz?", okBtn: 'Evet', cancelBtn: 'Hayır' }, @@ -360,7 +459,14 @@ const tr = { preview: 'Ön İzleme Güncellemeleri', previewDesc: 'En son geliştirmelere ve özelliklere erken erişin', previewTip: - 'Ön izleme güncellemelerinin tamamlanmamış olduğunu ve sorunlara sebep olabileceğini unutmayın!' + 'Ön izleme güncellemelerinin tamamlanmamış olduğunu ve sorunlara sebep olabileceğini unutmayın!', + offline: { + title: 'Çevrimdışı Güncellemeler', + desc: 'Yerel kurulum paketi aracılığıyla güncelleme', + upload: 'Yükle', + invalidName: 'Geçersiz dosya adı biçimi. Lütfen GitHub sürümlerinden indirin.', + updateFailed: 'Güncelleme başarısız oldu. Lütfen tekrar deneyin.' + } }, account: { title: 'Hesap', @@ -373,8 +479,129 @@ const tr = { cancelBtn: 'Hayır' } }, + picoclaw: { + title: 'PicoClaw Asistan', + empty: 'Paneli açın ve başlamak için bir görevi başlatın.', + inputPlaceholder: "PicoClaw'nin ne yapmasını istediğinizi açıklayın", + newConversation: 'Yeni görüşme', + processing: 'İşleniyor...', + agent: { + defaultTitle: 'Genel Asistan', + defaultDescription: 'Genel sohbet, arama ve çalışma alanı yardımı.', + kvmTitle: 'Uzaktan Kontrol', + kvmDescription: 'Uzak ana bilgisayarı NanoKVM aracılığıyla çalıştırın.', + switched: 'Temsilci rolü değiştirildi', + switchFailed: 'Temsilci rolü değiştirilemedi' + }, + send: 'Gönder', + cancel: 'İptal', + status: { + connecting: 'Ağ geçidine bağlanılıyor...', + connected: 'PicoClaw oturumu bağlandı', + disconnected: 'PicoClaw oturumu bağlantısı kesildi', + stopped: 'Durdurma isteği gönderildi', + runtimeStarted: 'PicoClaw runtime başlatıldı', + runtimeStartFailed: 'PicoClaw runtime başlatılamadı', + runtimeStopped: 'PicoClaw runtime durduruldu', + runtimeStopFailed: 'PicoClaw runtime durdurulamadı' + }, + connection: { + runtime: { + checking: 'Kontrol ediliyor', + ready: 'Runtime hazır', + stopped: 'Runtime durduruldu', + unavailable: 'Runtime mevcut değil', + configError: 'Yapılandırma hatası' + }, + transport: { + connecting: 'Bağlanıyor', + connected: 'Bağlandı' + }, + run: { + idle: 'Boşta', + busy: 'Meşgul' + } + }, + message: { + toolAction: 'Eylem', + observation: 'Gözlem', + screenshot: 'Ekran Görüntüsü' + }, + overlay: { + locked: 'PicoClaw cihazı kontrol ediyor. Manuel giriş duraklatıldı.' + }, + install: { + install: 'Yükle PicoClaw', + installing: 'PicoClaw yükleniyor', + success: 'PicoClaw başarıyla yüklendi', + failed: 'PicoClaw yüklenemedi', + uninstalling: 'Runtime kaldırılıyor...', + uninstalled: 'Runtime başarıyla kaldırıldı.', + uninstallFailed: 'Kaldırma başarısız oldu.', + requiredTitle: 'PicoClaw kurulu değil', + requiredDescription: "PicoClaw runtime'ı başlatmadan önce PicoClaw'ı yükleyin.", + progressDescription: 'PicoClaw indiriliyor ve kuruluyor.', + stages: { + preparing: 'Hazırlanıyor', + downloading: 'İndiriliyor', + extracting: 'Çıkarılıyor', + installing: 'Yükleniyor', + installed: 'Yüklendi', + install_timeout: 'Zaman Aşımı', + install_failed: 'Başarısız' + } + }, + model: { + requiredTitle: 'Model yapılandırması gerekli', + requiredDescription: 'PicoClaw sohbetini kullanmadan önce PicoClaw modelini yapılandırın.', + docsTitle: 'Yapılandırma Kılavuzu', + docsDesc: 'Desteklenen modeller ve protokoller', + menuLabel: 'Modeli yapılandır', + modelIdentifier: 'Model Tanımlayıcı', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API Anahtarı', + apiKeyPlaceholder: 'Model API anahtarını girin', + save: 'Kaydet', + saving: 'Kaydediliyor', + saved: 'Model yapılandırması kaydedildi', + saveFailed: 'Model yapılandırması kaydedilemedi', + invalid: 'Model tanımlayıcı, API Base URL ve API anahtarı gereklidir' + }, + uninstall: { + menuLabel: 'Kaldırma', + confirmTitle: 'Kaldırma PicoClaw', + confirmContent: + "PicoClaw'yi kaldırmak istediğinizden emin misiniz? Bu, yürütülebilir dosyayı ve tüm yapılandırma dosyalarını siler.", + confirmOk: 'Kaldırma', + confirmCancel: 'İptal' + }, + history: { + title: 'Geçmiş', + loading: 'Oturumlar yükleniyor...', + emptyTitle: 'Henüz geçmiş yok', + emptyDescription: 'Önceki PicoClaw oturumlar burada görünecek.', + loadFailed: 'Oturum geçmişi yüklenemedi', + deleteFailed: 'Oturum silinemedi', + deleteConfirmTitle: 'Oturumu sil', + deleteConfirmContent: '"{{title}}" silmek istediğinizden emin misiniz?', + deleteConfirmOk: 'Sil', + deleteConfirmCancel: 'İptal', + messageCount_one: '{{count}} mesaj', + messageCount_other: '{{count}} mesaj' + }, + config: { + startRuntime: "PicoClaw'ı Başlat", + stopRuntime: "PicoClaw'ı Durdur" + }, + start: { + title: "PicoClaw'ı Başlat", + description: "PicoClaw yardımcısını kullanmaya başlamak için runtime'ı başlatın." + } + }, error: { - title: "Bir hata oldu!", + title: 'Bir hata oldu!', refresh: 'Yenile' }, fullscreen: { diff --git a/web/src/i18n/locales/uk.ts b/web/src/i18n/locales/uk.ts index 68533a4..fc32322 100644 --- a/web/src/i18n/locales/uk.ts +++ b/web/src/i18n/locales/uk.ts @@ -14,11 +14,15 @@ const uk = { placeholderPassword2: 'Введіть пароль ще раз', noEmptyUsername: "Ім'я користувача не може бути порожнім", noEmptyPassword: 'Пароль не може бути порожнім', - noAccount: 'Не вдалося отримати інформацію про користувача, оновіть веб-сторінку або скиньте пароль', + noAccount: + 'Не вдалося отримати інформацію про користувача, оновіть веб-сторінку або скиньте пароль', invalidUser: "Недійсне ім'я користувача або пароль", + locked: 'Забагато входів, спробуйте пізніше', + globalLocked: 'Система під захистом, спробуйте пізніше', error: 'Якась халепа! Непередбачена помилка :(', changePassword: 'Змінити пароль', - changePasswordDesc: 'Для безпеки вашого пристрою, будь ласка, змініть пароль для входу в веб-інтерфейс.', + changePasswordDesc: + 'Для безпеки вашого пристрою, будь ласка, змініть пароль для входу в веб-інтерфейс.', differentPassword: 'Паролі не збігаються', illegalUsername: "Ім'я користувача містить недопустимі символи", illegalPassword: 'Пароль містить недопустимі символи', @@ -28,25 +32,35 @@ const uk = { loginButtonText: 'Увійти', tips: { reset1: - 'Щоб скинути паролі, натискаючи та тримаючи кнопку завантаження на Nanokvm протягом 10 секунд.', + 'Щоб скинути паролі, натисніть і утримуйте кнопку BOOT на NanoKVM протягом 10 секунд.', reset2: 'Щоб отримати детальні кроки, зверніться до цього документа:', reset3: 'Обліковий запис вебінтерфейс за замовчуванням:', reset4: 'Обліковий запис SSH за замовчуванням:', change1: 'Зверніть увагу, що ця дія змінить наступні паролі:', change2: 'Пароль для входу у веб-інтерфейс', change3: 'Системний root пароль (пароль для входу в систему по SSH)', - change4: 'Щоб скинути паролі, натисніть та утримуйте кнопку "Завантаження" на Nanokvm.' + change4: 'Щоб скинути паролі, натисніть і утримуйте кнопку BOOT на NanoKVM.' } }, wifi: { title: 'Wi-Fi', - description: 'Налаштування Wi-Fi для Nanokvm', - success: 'Будь ласка, перевірте статус мережі NANOKVM та відвідайте нову IP -адресу.', + description: 'Налаштування Wi-Fi для NanoKVM', + success: 'Перейдіть до пристрою та перевірте стан мережі NanoKVM.', failed: 'Операція не вдалася, спробуйте ще раз.', + invalidMode: + 'Поточний режим не підтримує налаштування мережі. Перейдіть на свій пристрій і ввімкніть режим конфігурації Wi-Fi.', confirmBtn: 'Так', - finishBtn: 'Готово' + finishBtn: 'Готово', + ap: { + authTitle: 'Потрібна автентифікація', + authDescription: 'Щоб продовжити, введіть пароль AP', + authFailed: 'Недійсний пароль AP', + passPlaceholder: 'AP пароль', + verifyBtn: 'Перевірити' + } }, screen: { + scale: 'Масштаб', title: 'Екран', video: 'Відеорежим', videoDirectTips: 'Увімкніть HTTPS у "Налаштування > Пристрій", щоб використовувати цей режим', @@ -73,7 +87,52 @@ const uk = { placeholder: 'Будь ласка, введіть', submit: 'Надіслати', virtual: 'Клавіатура', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Читання з буфера обміну', + clipboardPermissionDenied: + 'Відмовлено в дозволі буфера обміну. Будь ласка, дозвольте доступ до буфера обміну у вашому браузері.', + clipboardReadError: 'Не вдалося прочитати буфер обміну', + dropdownEnglish: 'англійська', + dropdownGerman: 'нім', + dropdownFrench: 'французька', + dropdownRussian: 'рос', + shortcut: { + title: 'Ярлики', + custom: 'Custom', + capture: 'Натисніть тут, щоб захопити ярлик', + clear: 'Ясно', + save: 'Зберегти', + captureTips: + 'Для захоплення системних клавіш (наприклад, клавіші Windows) потрібен дозвіл повноекранного режиму.', + enterFullScreen: 'Перемкнути повноекранний режим.' + }, + leaderKey: { + title: 'Клавіша Leader', + desc: 'Обійти обмеження браузера та надсилати системні ярлики безпосередньо на віддалений хост.', + howToUse: 'Як використовувати', + simultaneous: { + title: 'Одночасний режим', + desc1: 'Натисніть і утримуйте клавішу Leader, потім натисніть клавішу швидкого доступу.', + desc2: 'Інтуїтивно зрозумілий, але може конфліктувати з системними ярликами.' + }, + sequential: { + title: 'Послідовний режим', + desc1: + 'Натисніть клавішу Leader → послідовно натисніть клавішу швидкого доступу → знову натисніть клавішу Leader.', + desc2: 'Вимагає більше кроків, але повністю уникає системних конфліктів.' + }, + enable: 'Увімкнути клавішу Leader', + tip: 'Якщо її призначити клавішею Leader, ця клавіша працює лише як тригер швидкого доступу та втрачає поведінку за замовчуванням.', + placeholder: 'Натисніть клавішу Leader', + shiftRight: 'Правий Shift', + ctrlRight: 'Правий Ctrl', + metaRight: 'Правий Win', + submit: 'Надіслати', + recorder: { + rec: 'REC', + activate: 'Активувати клавіші', + input: 'Будь ласка, натисніть клавішу швидкого доступу...' + } + } }, mouse: { title: 'Миша', @@ -87,14 +146,21 @@ const uk = { mode: 'Режим миші', absolute: 'Абсолютний режим', relative: 'Відносний режим', - requestPointer: 'Використовується відносний режим. Будь ласка, натисніть на робочий стіл, щоб отримати курсор миші.', + direction: 'Напрямок коліщатка', + scrollUp: 'Прокрутіть вгору', + scrollDown: 'Прокрутіть вниз', + speed: 'Швидкість коліщатка', + fast: 'Швидко', + slow: 'Повільно', + requestPointer: + 'Використовується відносний режим. Будь ласка, натисніть на робочий стіл, щоб отримати курсор миші.', resetHid: 'Скинути HID', hidOnly: { title: 'Режим лише HID', desc: 'Якщо ваша миша та клавіатура перестають відповідати та скинути HID, це не допомагає, це може бути проблемою сумісності між NanoKVM та пристроєм. Спробуйте ввімкнути режим "лише HID" лише для кращої сумісності.', tip1: 'Увімкнення режиму "лише HID" демонтує віртуальний U-диск і віртуальну мережу', tip2: 'У режимі "лише HID" монтування образів буде вимкнено', - tip3: 'NANOKVM автоматично перезавантажиться після перемикання режимів', + tip3: 'NanoKVM автоматично перезавантажиться після перемикання режимів', enable: 'Увімкнути режим "лише HID"', disable: 'Ввимкнути режим "лише HID"' } @@ -103,11 +169,18 @@ const uk = { title: 'Образи', loading: 'Завантаження...', empty: 'Нічого не знайдено', - cdrom: 'Встановіть образ в режимі CD-ROM', + mountMode: 'Режим монтування', mountFailed: 'Не вдалося змонтувати образ у режимі CD-ROM', mountDesc: 'У деяких системах необхідно витягнути віртуальний диск на віддаленому хості перед монтуванням файлу образа.', + unmountFailed: 'Не вдалося розмонтувати', + unmountDesc: + 'У деяких системах вам потрібно вручну вийти з віддаленого хоста перед демонтуванням образу.', refresh: 'Оновіть список образів', + attention: 'Увага', + deleteConfirm: 'Ви впевнені, що хочете видалити це зображення?', + okBtn: 'Так', + cancelBtn: 'Ні', tips: { title: 'Як завантажити', usb1: "Під'єднайте NanoKVM до вашого комп'ютера через USB.", @@ -146,12 +219,12 @@ const uk = { baudrate: 'Швидкість передачі', parity: 'Парність', parityNone: 'Без парності', - parityEven: 'Парний', - parityOdd: 'Непарний', + parityEven: 'Парна', + parityOdd: 'Непарна', flowControl: 'Керування потоком', flowControlNone: 'Без керування', - flowControlSoft: "М'яке керування", - flowControlHard: 'Жорстке керування', + flowControlSoft: 'Програмне', + flowControlHard: 'Апаратне', dataBits: 'Біти даних', stopBits: 'Стопові біти', confirm: 'Ок' @@ -167,7 +240,10 @@ const uk = { title: 'Завантажувач образів', input: 'Введіть URL-адресу віддаленого образу', ok: 'Так', - disabled: 'Розділ даних /data у режимі лише для читання, тому ми не можемо завантажити образ' + disabled: 'Розділ даних /data у режимі лише для читання, тому ми не можемо завантажити образ', + uploadbox: 'Перетягніть файл сюди або натисніть, щоб вибрати', + inputfile: 'Будь ласка, введіть файл зображення', + NoISO: 'Немає ISO' }, power: { title: 'Живлення', @@ -207,10 +283,19 @@ const uk = { title: 'Зовнішній вигляд', display: 'Відображення', language: 'Мова', - menuBar: 'Панель меню', - menuBarDesc: 'Піктограми відображення в панелі меню', + languageDesc: 'Виберіть мову для інтерфейсу', webTitle: 'Веб-назва', - webTitleDesc: 'Налаштуйте назву веб-сторінки' + webTitleDesc: 'Налаштуйте назву веб-сторінки', + menuBar: { + title: 'Рядок меню', + mode: 'Режим відображення', + modeDesc: 'Відображення панелі меню на екрані', + modeOff: 'Вимк', + modeAuto: 'Автоматичне приховування', + modeAlways: 'Завжди видно', + icons: 'Значки підменю', + iconsDesc: 'Відображення значків підменю на панелі меню' + } }, device: { title: 'Пристрій', @@ -236,7 +321,7 @@ const uk = { title: 'Swap (файл підкачки)', disable: 'Відключено', description: 'Встановіть розмір файлу свопу', - tip: "Увімкнення цієї опції може вивести з ладу SD карту!" + tip: 'Увімкнення цієї опції може вивести з ладу SD карту!' }, mouseJiggler: { title: 'Налаштування пацюка', @@ -247,15 +332,30 @@ const uk = { }, mdns: { description: 'Увімкнути службу MDNS Discovery', - tip: "Вимкнути, якщо це не потрібно" + tip: 'Вимкнути, якщо це не потрібно' + }, + hdmi: { + description: 'Увімкнути вихід HDMI/monitor' + }, + autostart: { + title: 'Налаштування сценаріїв автозапуску', + description: 'Керування сценаріями, які запускаються автоматично під час запуску системи', + new: 'Нове', + deleteConfirm: 'Ви впевнені, що хочете видалити цей файл?', + yes: 'Так', + no: 'Ні', + scriptName: 'Назва сценарію автозапуску', + scriptContent: 'Вміст сценарію автозапуску', + settings: 'Налаштування' }, hidOnly: 'Режим лише HID', + hidOnlyDesc: 'Зупиніть емуляцію віртуальних пристроїв, зберігши лише базовий контроль HID', disk: 'Віртуальний диск', diskDesc: 'Монтувати віртуальний U-диск на віддаленому хості', network: 'Віртуальна мережа', networkDesc: 'Встановити віртуальну мережеву карту на віддаленому хості', reboot: 'Перезавантажити', - rebootDesc: 'Ви впевнені, що хочете перезавантажити Nanokvm?', + rebootDesc: 'Ви впевнені, що хочете перезавантажити NanoKVM?', okBtn: 'Так', cancelBtn: 'Ні' }, @@ -309,8 +409,11 @@ const uk = { title: 'Tailscale', memory: { title: "Оптимізація пам'яті", - tip: "Коли використання пам’яті перевищує обмеження, збирання сміття проводиться більш агресивно, щоб спробувати звільнити пам’ять. Рекомендується встановити 50 Мб, якщо використовувати Tailscale. Після зміни налаштувань потрібно перезавантажити Tailscale.", - disable: 'Відключено' + tip: 'Коли використання пам’яті перевищує обмеження, збирання сміття проводиться більш агресивно, щоб спробувати звільнити пам’ять. Рекомендується встановити 50 Мб, якщо використовувати Tailscale. Після зміни налаштувань потрібно перезавантажити Tailscale.' + }, + swap: { + title: "Обмін пам'яттю", + tip: 'Якщо проблеми не зникають після ввімкнення оптимізації пам’яті, спробуйте ввімкнути підкачну пам’ять. Це встановлює розмір файлу підкачки 256MB за замовчуванням, який можна налаштувати в «Параметрах > Пристрій».' }, restart: 'Ви впевнені, що бажаєте перезавантажити Tailscale?', stop: 'Ви впевнені, що бажаєте зупинити Tailscale?', @@ -327,6 +430,8 @@ const uk = { upTailscale: 'Завантажте Tailscale до каталогу /usr/bin/ на NanoKVM', upTailscaled: 'Завантажте Tailscaled до каталогу /usr/sbin/ на NanoKVM', refresh: 'Оновіть поточну сторінку', + notRunning: 'Tailscale не працює. Щоб продовжити, запустіть його.', + run: 'Початок', notLogin: "Пристрій ще не прив'язаний. Будь ласка, увійдіть і прив'яжіть цей пристрій до вашого облікового запису.", urlPeriod: 'Ця URL-адреса дійсна протягом 10 хвилин', @@ -339,6 +444,7 @@ const uk = { logout: 'Вийти', logoutDesc: 'Ви впевнені, що хочете вийти?', uninstall: 'Видалити Tailscale', + uninstallDesc: 'Ви впевнені, що хочете видалити Tailscale?', okBtn: 'Так', cancelBtn: 'Ні' }, @@ -354,7 +460,14 @@ const uk = { preview: 'О бета релізах', previewDesc: 'Отримайте ранній доступ до нових функцій та вдосконалень', previewTip: - 'Будь ласка, майте на увазі, що випуски бета релізів можуть містити помилки або неповну функціональність!' + 'Будь ласка, майте на увазі, що випуски бета релізів можуть містити помилки або неповну функціональність!', + offline: { + title: 'Оновлення в автономному режимі', + desc: 'Оновлення через локальний інсталяційний пакет', + upload: 'Завантажити', + invalidName: 'Недійсний формат імені файлу. Завантажте випуски з GitHub.', + updateFailed: 'Оновлення не вдалося. Будь ласка, спробуйте ще раз.' + } }, account: { title: 'Обліковий запис', @@ -367,8 +480,129 @@ const uk = { cancelBtn: 'Ні' } }, + picoclaw: { + title: 'PicoClaw Помічник', + empty: 'Для початку відкрийте панель і запустіть завдання.', + inputPlaceholder: 'Опишіть, що ви хочете, щоб PicoClaw зробив', + newConversation: 'Нова розмова', + processing: 'Обробка...', + agent: { + defaultTitle: 'Загальний помічник', + defaultDescription: 'Загальна довідка щодо чату, пошуку та робочої області.', + kvmTitle: 'Віддалене керування', + kvmDescription: 'Керуйте віддаленим хостом через NanoKVM.', + switched: 'Роль агента змінена', + switchFailed: 'Не вдалося змінити роль агента' + }, + send: 'Надіслати', + cancel: 'Скасувати', + status: { + connecting: 'Підключення до шлюзу...', + connected: 'Сеанс PicoClaw підключено', + disconnected: 'Сеанс PicoClaw відключено', + stopped: 'Запит на зупинку надіслано', + runtimeStarted: 'Runtime PicoClaw запущено', + runtimeStartFailed: 'Не вдалося запустити runtime PicoClaw', + runtimeStopped: 'Runtime PicoClaw зупинено', + runtimeStopFailed: 'Не вдалося зупинити runtime PicoClaw' + }, + connection: { + runtime: { + checking: 'Перевірка', + ready: 'Runtime готовий', + stopped: 'Runtime зупинено', + unavailable: 'Runtime недоступний', + configError: 'Помилка конфігурації' + }, + transport: { + connecting: 'Підключення', + connected: 'Підключено' + }, + run: { + idle: 'Бездіяльність', + busy: 'Зайнятий' + } + }, + message: { + toolAction: 'Дія', + observation: 'Спостереження', + screenshot: 'Скріншот' + }, + overlay: { + locked: 'PicoClaw керує пристроєм. Ручне введення призупинено.' + }, + install: { + install: 'Встановити PicoClaw', + installing: 'Встановлення PicoClaw', + success: 'PicoClaw успішно встановлено', + failed: 'Не вдалося встановити PicoClaw', + uninstalling: 'Видалення runtime...', + uninstalled: 'Runtime успішно видалено.', + uninstallFailed: 'Помилка видалення.', + requiredTitle: 'PicoClaw не встановлено', + requiredDescription: 'Встановіть PicoClaw перед запуском runtime PicoClaw.', + progressDescription: 'PicoClaw завантажується та встановлюється.', + stages: { + preparing: 'Підготовка', + downloading: 'Завантаження', + extracting: 'Розпакування', + installing: 'Встановлення', + installed: 'Встановлено', + install_timeout: 'Час очікування минув', + install_failed: 'Помилка' + } + }, + model: { + requiredTitle: 'Потрібна конфігурація моделі', + requiredDescription: 'Налаштуйте модель PicoClaw перед використанням чату PicoClaw.', + docsTitle: 'Керівництво з налаштування', + docsDesc: 'Підтримувані моделі та протоколи', + menuLabel: 'Налаштувати модель', + modelIdentifier: 'Ідентифікатор моделі', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API-ключ', + apiKeyPlaceholder: 'Введіть API-ключ моделі', + save: 'Зберегти', + saving: 'Збереження', + saved: 'Конфігурацію моделі збережено', + saveFailed: 'Не вдалося зберегти конфігурацію моделі', + invalid: 'Потрібні ідентифікатор моделі, API Base URL і API-ключ' + }, + uninstall: { + menuLabel: 'Видалити', + confirmTitle: 'Видалити PicoClaw', + confirmContent: + 'Ви впевнені, що хочете видалити PicoClaw? Це призведе до видалення виконуваного файлу та всіх конфігураційних файлів.', + confirmOk: 'Видалити', + confirmCancel: 'Скасувати' + }, + history: { + title: 'Історія', + loading: 'Завантаження сеансів...', + emptyTitle: 'Історії ще немає', + emptyDescription: 'Попередні PicoClaw сесії відображатимуться тут.', + loadFailed: 'Не вдалося завантажити історію сеансу', + deleteFailed: 'Не вдалося видалити сеанс', + deleteConfirmTitle: 'Видалити сеанс', + deleteConfirmContent: 'Ви впевнені, що хочете видалити "{{title}}"?', + deleteConfirmOk: 'Видалити', + deleteConfirmCancel: 'Скасувати', + messageCount_one: '{{count}} повідомлення', + messageCount_other: '{{count}} повідомлень' + }, + config: { + startRuntime: 'Запустити PicoClaw', + stopRuntime: 'Зупинити PicoClaw' + }, + start: { + title: 'Запустити PicoClaw', + description: 'Запустіть runtime, щоб почати використовувати помічника PicoClaw.' + } + }, error: { - title: "Ми зіткнулися з проблемою", + title: 'Ми зіткнулися з проблемою', refresh: 'Оновити' }, fullscreen: { diff --git a/web/src/i18n/locales/vi.ts b/web/src/i18n/locales/vi.ts index d11f534..8724338 100644 --- a/web/src/i18n/locales/vi.ts +++ b/web/src/i18n/locales/vi.ts @@ -1,7 +1,7 @@ const vi = { translation: { head: { - desktop: 'Remote Desktop', + desktop: 'Màn hình từ xa', login: 'Đăng nhập', changePassword: 'Đổi mật khẩu', terminal: 'Terminal', @@ -17,6 +17,8 @@ const vi = { noAccount: 'Không thể lấy thông tin người dùng, vui lòng làm mới trang web hoặc đặt lại mật khẩu', invalidUser: 'tên người dùng hoặc mật khẩu không hợp lệ', + locked: 'Đăng nhập quá nhiều, vui lòng thử lại sau', + globalLocked: 'Hệ thống đang được bảo vệ, vui lòng thử lại sau', error: 'lỗi không mong đợi', changePassword: 'Đổi mật khẩu', changePasswordDesc: 'Để bảo mật thiết bị của bạn, vui lòng thay đổi mật khẩu đăng nhập web.', @@ -30,25 +32,37 @@ const vi = { tips: { reset1: 'To reset the passwords, pressing and holding the BOOT button on the NanoKVM for 10 seconds.', - reset2: 'For detailed steps, please consult this document:', - reset3: 'Web default account:', - reset4: 'SSH default account:', - change1: 'Please note that this action will change the following passwords:', - change2: 'Web login password', - change3: 'System root password (SSH login password)', - change4: 'To reset the passwords, press and hold the BOOT button on the NanoKVM.' + reset2: 'Để biết các bước chi tiết, vui lòng xem tài liệu này:', + reset3: 'Tài khoản web mặc định:', + reset4: 'Tài khoản SSH mặc định:', + change1: 'Lưu ý rằng thao tác này sẽ thay đổi các mật khẩu sau:', + change2: 'Mật khẩu đăng nhập web', + change3: 'Mật khẩu root hệ thống (mật khẩu đăng nhập SSH)', + change4: 'Để đặt lại mật khẩu, hãy nhấn và giữ nút BOOT trên NanoKVM.' } }, wifi: { title: 'Wi-Fi', - description: 'Configure Wi-Fi for NanoKVM', + description: 'Cấu hình Wi-Fi cho NanoKVM', success: 'Please check the network status of NanoKVM and visit the new IP address.', - failed: 'Operation failed, please try again.', + failed: 'Thao tác thất bại, vui lòng thử lại.', + invalidMode: + 'Chế độ hiện tại không hỗ trợ thiết lập mạng. Vui lòng truy cập thiết bị của bạn và bật chế độ cấu hình Wi-Fi.', confirmBtn: 'Ok', - finishBtn: 'Finished' + finishBtn: 'Hoàn tất', + ap: { + authTitle: 'Yêu cầu xác thực', + authDescription: 'Vui lòng nhập mật khẩu AP để tiếp tục', + authFailed: 'Mật khẩu AP không hợp lệ', + passPlaceholder: 'AP mật khẩu', + verifyBtn: 'Xác minh' + } }, screen: { + scale: 'Quy mô', + title: 'Màn hình', video: 'Chế độ video', + videoDirectTips: 'Bật HTTPS trong "Cài đặt > Thiết bị" để sử dụng chế độ này', resolution: 'Độ phân giải', auto: 'Tự động', autoTips: @@ -63,17 +77,64 @@ const vi = { frameDetect: 'Phát hiện khung hình', frameDetectTip: 'Tính toán sự khác biệt giữa các khung hình. Dừng truyền video khi không có thay đổi trên màn hình máy chủ từ xa.', - resetHdmi: 'Reset HDMI' + resetHdmi: 'Đặt lại HDMI' }, keyboard: { + title: 'Bàn phím', paste: 'Dán', tips: 'Chỉ hỗ trợ các chữ cái và ký hiệu bàn phím tiêu chuẩn', placeholder: 'Vui lòng nhập', submit: 'Gửi', virtual: 'Bàn phím', - ctrlaltdel: 'Ctrl+Alt+Del' + readClipboard: 'Đọc từ Clipboard', + clipboardPermissionDenied: + 'Quyền bảng nhớ tạm bị từ chối. Vui lòng cho phép truy cập clipboard trong trình duyệt của bạn.', + clipboardReadError: 'Không đọc được bảng nhớ tạm', + dropdownEnglish: 'Tiếng Anh', + dropdownGerman: 'Tiếng Đức', + dropdownFrench: 'Tiếng Pháp', + dropdownRussian: 'Tiếng Nga', + shortcut: { + title: 'Phím tắt', + custom: 'Tùy chỉnh', + capture: 'Bấm vào đây để chụp phím tắt', + clear: 'Rõ ràng', + save: 'Lưu', + captureTips: + 'Việc ghi nhận các phím cấp hệ thống (như phím Windows) yêu cầu quyền toàn màn hình.', + enterFullScreen: 'Chuyển sang chế độ toàn màn hình.' + }, + leaderKey: { + title: 'Phím Leader', + desc: 'Bỏ qua các hạn chế của trình duyệt và gửi các phím tắt hệ thống trực tiếp đến máy chủ từ xa.', + howToUse: 'Cách sử dụng', + simultaneous: { + title: 'Chế độ đồng thời', + desc1: 'Nhấn giữ phím Leader, rồi nhấn phím tắt.', + desc2: 'Trực quan nhưng có thể xung đột với các phím tắt hệ thống.' + }, + sequential: { + title: 'Chế độ tuần tự', + desc1: 'Nhấn phím Leader → nhấn phím tắt theo thứ tự → nhấn lại phím Leader.', + desc2: 'Yêu cầu nhiều bước hơn nhưng hoàn toàn tránh được xung đột hệ thống.' + }, + enable: 'Bật phím Leader', + tip: 'Khi được gán làm phím Leader, phím này chỉ hoạt động như bộ kích hoạt phím tắt và mất hành vi mặc định.', + placeholder: 'Vui lòng nhấn phím Leader', + shiftRight: 'Shift phải', + ctrlRight: 'Ctrl phải', + metaRight: 'Win phải', + submit: 'Gửi', + recorder: { + rec: 'REC', + activate: 'Kích hoạt phím', + input: 'Hãy nhấn phím tắt...' + } + } }, mouse: { + title: 'Chuột', + cursor: 'Kiểu con trỏ', default: 'Con trỏ mặc định', pointer: 'Con trỏ trỏ', cell: 'Con trỏ ô', @@ -83,16 +144,40 @@ const vi = { mode: 'Chế độ chuột', absolute: 'Chế độ tuyệt đối', relative: 'Chế độ tương đối', + direction: 'Hướng bánh xe cuộn', + scrollUp: 'Cuộn lên', + scrollDown: 'Cuộn xuống', + speed: 'Tốc độ bánh xe cuộn', + fast: 'Nhanh lên', + slow: 'Chậm', requestPointer: 'Đang sử dụng chế độ tương đối. Vui lòng nhấp vào màn hình để lấy con trỏ chuột.', - resetHid: 'Đặt lại HID' + resetHid: 'Đặt lại HID', + hidOnly: { + title: 'Chế độ chỉ HID', + desc: 'Nếu chuột và bàn phím của bạn ngừng phản hồi và việc đặt lại HID không có tác dụng thì đó có thể là sự cố tương thích giữa NanoKVM và thiết bị. Hãy thử bật chế độ HID-Only để tương thích tốt hơn.', + tip1: 'Kích hoạt HID-Chế độ chỉ sẽ ngắt kết nối đĩa U ảo và mạng ảo', + tip2: 'Ở chế độ HID-Chỉ, tính năng gắn hình ảnh bị tắt', + tip3: 'NanoKVM sẽ tự động khởi động lại sau khi chuyển chế độ', + enable: 'Bật chế độ HID-Chỉ', + disable: 'Tắt chế độ HID-Chỉ' + } }, image: { title: 'Hình ảnh', loading: 'Đang tải...', empty: 'Không tìm thấy', + mountMode: 'Chế độ gắn kết', mountFailed: 'Mount thất bại', mountDesc: 'Trong một số hệ thống, cần phải eject đĩa ảo trên máy remote trước khi mount.', + unmountFailed: 'Tháo lắp không thành công', + unmountDesc: + 'Trên một số hệ thống, bạn cần đẩy hình ảnh ra khỏi máy chủ từ xa theo cách thủ công trước khi ngắt kết nối hình ảnh.', + refresh: 'Làm mới danh sách hình ảnh', + attention: 'Chú ý', + deleteConfirm: 'Bạn có chắc chắn muốn xóa hình ảnh này không?', + okBtn: 'Có', + cancelBtn: 'Không', tips: { title: 'Cách tải lên', usb1: 'Kết nối NanoKVM với máy tính của bạn qua USB.', @@ -129,6 +214,16 @@ const vi = { serialPort: 'Cổng Nối Tiếp', serialPortPlaceholder: 'Vui lòng nhập cổng nối tiếp', baudrate: 'Tốc độ Baud', + parity: 'Tính chẵn lẻ', + parityNone: 'Không có', + parityEven: 'Chẵn', + parityOdd: 'Lẻ', + flowControl: 'Kiểm soát luồng', + flowControlNone: 'Không có', + flowControlSoft: 'Phần mềm', + flowControlHard: 'Phần cứng', + dataBits: 'Bit dữ liệu', + stopBits: 'Bit dừng', confirm: 'OK' }, wol: { @@ -138,40 +233,73 @@ const vi = { input: 'Vui lòng nhập địa chỉ MAC', ok: 'OK' }, + download: { + title: 'Trình tải xuống hình ảnh', + input: 'Vui lòng nhập hình ảnh từ xa URL', + ok: 'OK', + disabled: '/data phân vùng là RO nên không tải được image', + uploadbox: 'Thả file vào đây hoặc bấm vào để chọn', + inputfile: 'Vui lòng nhập File hình ảnh', + NoISO: 'Không có ISO' + }, power: { title: 'Nguồn', + showConfirm: 'Xác nhận', + showConfirmTip: 'Hoạt động cấp nguồn yêu cầu xác nhận bổ sung', reset: 'Đặt lại', power: 'Nguồn', powerShort: 'Nguồn (nhấp ngắn)', - powerLong: 'Nguồn (nhấp dài)' + powerLong: 'Nguồn (nhấp dài)', + resetConfirm: 'Tiến hành thao tác đặt lại?', + powerConfirm: 'Tiếp tục vận hành nguồn điện?', + okBtn: 'Có', + cancelBtn: 'Không' }, settings: { - title: 'Settings', + title: 'Cài đặt', about: { title: 'Giới thiệu về NanoKVM', information: 'Thông tin', ip: 'IP', mdns: 'mDNS', application: 'Phiên bản Ứng dụng', - applicationTip: 'NanoKVM web application version', + applicationTip: 'Phiên bản ứng dụng web NanoKVM', image: 'Phiên bản Hình ảnh', - imageTip: 'NanoKVM system image version', + imageTip: 'Phiên bản image hệ thống NanoKVM', deviceKey: 'Khóa Thiết bị', - community: 'Cộng đồng' + community: 'Cộng đồng', + hostname: 'Tên máy chủ', + hostnameUpdated: 'Đã cập nhật tên máy chủ. Khởi động lại để áp dụng.', + ipType: { + Wired: 'Có dây', + Wireless: 'Không dây', + Other: 'Khác' + } }, appearance: { - title: 'Appearance', - display: 'Display', - language: 'Language', - menuBar: 'Menu Bar', - menuBarDesc: 'Display icons in the menu bar' + title: 'Giao diện', + display: 'Hiển thị', + language: 'Ngôn ngữ', + languageDesc: 'Chọn ngôn ngữ cho giao diện', + webTitle: 'Tiêu đề trang web', + webTitleDesc: 'Tùy chỉnh tiêu đề trang web', + menuBar: { + title: 'Thanh menu', + mode: 'Chế độ hiển thị', + modeDesc: 'Hiển thị thanh menu trên màn hình', + modeOff: 'Tắt', + modeAuto: 'Tự động ẩn', + modeAlways: 'Luôn hiển thị', + icons: 'Biểu tượng menu con', + iconsDesc: 'Hiển thị biểu tượng menu con trên thanh menu' + } }, device: { - title: 'Device', + title: 'Thiết bị', oled: { title: 'OLED', description: 'OLED screen automatically sleep', - 0: 'Never', + 0: 'Không bao giờ', 15: '15 sec', 30: '30 sec', 60: '1 min', @@ -179,12 +307,54 @@ const vi = { 300: '5 min', 600: '10 min', 1800: '30 min', - 3600: '1 hour' + 3600: '1 giờ' }, - disk: 'Virtual Disk', + ssh: { + description: 'Kích hoạt SSH truy cập từ xa', + tip: 'Đặt mật khẩu mạnh trước khi kích hoạt (Tài khoản - Đổi mật khẩu)' + }, + advanced: 'Cài đặt nâng cao', + swap: { + title: 'Hoán đổi', + disable: 'Tắt', + description: 'Đặt kích thước tệp hoán đổi', + tip: 'Kích hoạt tính năng này có thể rút ngắn thời gian sử dụng thẻ SD của bạn!' + }, + mouseJiggler: { + title: 'Máy lắc lư chuột', + description: 'Ngăn máy chủ từ xa ngủ', + disable: 'Tắt', + absolute: 'Chế độ tuyệt đối', + relative: 'Chế độ tương đối' + }, + mdns: { + description: 'Kích hoạt dịch vụ khám phá mDNS', + tip: 'Tắt đi nếu không cần thiết' + }, + hdmi: { + description: 'Kích hoạt HDMI/đầu ra màn hình' + }, + autostart: { + title: 'Cài đặt tập lệnh tự khởi động', + description: 'Quản lý các tập lệnh chạy tự động khi khởi động hệ thống', + new: 'Mới', + deleteConfirm: 'Bạn có chắc chắn muốn xóa tệp này không?', + yes: 'Có', + no: 'Không', + scriptName: 'Tên tập lệnh tự khởi động', + scriptContent: 'Nội dung tập lệnh tự khởi động', + settings: 'Cài đặt' + }, + hidOnly: 'HID-Chế độ chỉ', + hidOnlyDesc: 'Dừng mô phỏng các thiết bị ảo, chỉ giữ lại điều khiển HID cơ bản', + disk: 'Đĩa ảo', diskDesc: 'Mount virtual U-disk on the remote host', - network: 'Virtual Network', - networkDesc: 'Mount virtual network card on the remote host' + network: 'Mạng ảo', + networkDesc: 'Gắn card mạng ảo trên máy chủ từ xa', + reboot: 'Khởi động lại', + rebootDesc: 'Bạn có chắc chắn muốn khởi động lại NanoKVM không?', + okBtn: 'Có', + cancelBtn: 'Không' }, network: { title: 'Mạng', @@ -235,9 +405,12 @@ const vi = { tailscale: { title: 'Tailscale', memory: { - title: 'Memory optimization', - tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect.", - disable: 'Disable' + title: 'Tối ưu bộ nhớ', + tip: "When memory usage exceeds the limit, garbage collection is performed more aggressively to attempt to free up memory. it's recommended to set to 50MB if using Tailscale. A Tailscale restart is required for the change to take effect." + }, + swap: { + title: 'Hoán đổi bộ nhớ', + tip: 'Nếu sự cố vẫn tiếp diễn sau khi bật tối ưu hóa bộ nhớ, hãy thử bật bộ nhớ trao đổi. Việc này sẽ đặt kích thước tệp hoán đổi thành 256MB theo mặc định, có thể điều chỉnh được trong "Cài đặt > Thiết bị".' }, restart: 'Are you sure to restart Tailscale?', stop: 'Are you sure to stop Tailscale?', @@ -254,6 +427,8 @@ const vi = { upTailscale: 'Tải tailscale lên thư mục /usr/bin/ của NanoKVM', upTailscaled: 'Tải tailscaled lên thư mục /usr/sbin/ của NanoKVM', refresh: 'Làm mới trang hiện tại', + notRunning: 'Tailscale không chạy. Hãy bắt đầu nó để tiếp tục.', + run: 'Bắt đầu', notLogin: 'Thiết bị chưa được liên kết. Vui lòng đăng nhập và liên kết thiết bị này với tài khoản của bạn.', urlPeriod: 'URL này có hiệu lực trong 10 phút', @@ -264,7 +439,9 @@ const vi = { deviceIP: 'IP Thiết bị', account: 'Tài khoản', logout: 'Đăng xuất', - logout2: 'Bạn có chắc chắn muốn đăng xuất không?', + logoutDesc: 'Bạn có chắc chắn muốn đăng xuất không?', + uninstall: 'Gỡ cài đặt Tailscale', + uninstallDesc: 'Bạn có chắc chắn muốn gỡ cài đặt Tailscale không?', okBtn: 'Yes', cancelBtn: 'No' }, @@ -276,15 +453,163 @@ const vi = { available: 'Có bản cập nhật mới. Bạn có chắc chắn muốn cập nhật không?', updating: 'Bắt đầu cập nhật. Vui lòng chờ...', confirm: 'Xác nhận', - cancel: 'Hủy' + cancel: 'Hủy', + preview: 'Bản cập nhật xem trước', + previewDesc: 'Nhận quyền truy cập sớm vào các tính năng và cải tiến mới', + previewTip: + 'Xin lưu ý rằng các bản phát hành xem trước có thể có lỗi hoặc chức năng chưa hoàn chỉnh!', + offline: { + title: 'Cập nhật ngoại tuyến', + desc: 'Cập nhật thông qua gói cài đặt cục bộ', + upload: 'Tải lên', + invalidName: + 'Định dạng tên tệp không hợp lệ. Vui lòng tải xuống từ bản phát hành GitHub.', + updateFailed: 'Cập nhật thất bại. Vui lòng thử lại.' + } }, account: { - title: 'Account', - webAccount: 'Web Account Name', - password: 'Password', + title: 'Tài khoản', + webAccount: 'Tên tài khoản web', + password: 'Mật khẩu', updateBtn: 'Update', - logoutBtn: 'Logout' + logoutBtn: 'Đăng xuất', + logoutDesc: 'Bạn có chắc chắn muốn đăng xuất không?', + okBtn: 'Có', + cancelBtn: 'Không' } + }, + picoclaw: { + title: 'PicoClaw Trợ lý', + empty: 'Mở bảng điều khiển và bắt đầu một nhiệm vụ.', + inputPlaceholder: 'Mô tả những gì bạn muốn PicoClaw làm', + newConversation: 'Cuộc trò chuyện mới', + processing: 'Đang xử lý...', + agent: { + defaultTitle: 'Trợ lý chung', + defaultDescription: 'Trợ giúp chung về trò chuyện, tìm kiếm và không gian làm việc.', + kvmTitle: 'Điều khiển từ xa', + kvmDescription: 'Vận hành máy chủ từ xa thông qua NanoKVM.', + switched: 'Vai trò đại lý đã chuyển đổi', + switchFailed: 'Chuyển đổi vai trò đại lý không thành công' + }, + send: 'Gửi', + cancel: 'Hủy', + status: { + connecting: 'Đang kết nối với cổng...', + connected: 'Phiên PicoClaw đã kết nối', + disconnected: 'Phiên PicoClaw đã ngắt kết nối', + stopped: 'Đã gửi yêu cầu dừng', + runtimeStarted: 'Runtime PicoClaw đã bắt đầu', + runtimeStartFailed: 'Không khởi động được runtime PicoClaw', + runtimeStopped: 'Runtime PicoClaw đã dừng', + runtimeStopFailed: 'Không dừng được runtime PicoClaw' + }, + connection: { + runtime: { + checking: 'Đang kiểm tra', + ready: 'Runtime đã sẵn sàng', + stopped: 'Đã dừng runtime', + unavailable: 'Runtime không khả dụng', + configError: 'Lỗi cấu hình' + }, + transport: { + connecting: 'Đang kết nối', + connected: 'Đã kết nối' + }, + run: { + idle: 'Nhàn rỗi', + busy: 'Bận' + } + }, + message: { + toolAction: 'Hành động', + observation: 'Quan sát', + screenshot: 'Ảnh chụp màn hình' + }, + overlay: { + locked: 'PicoClaw đang điều khiển thiết bị. Việc nhập thủ công bị tạm dừng.' + }, + install: { + install: 'Cài đặt PicoClaw', + installing: 'Đang cài đặt PicoClaw', + success: 'PicoClaw cài đặt thành công', + failed: 'Không cài đặt được PicoClaw', + uninstalling: 'Đang gỡ cài đặt runtime...', + uninstalled: 'Đã gỡ cài đặt thành công runtime.', + uninstallFailed: 'Gỡ cài đặt không thành công.', + requiredTitle: 'PicoClaw chưa được cài đặt', + requiredDescription: 'Cài đặt PicoClaw trước khi bắt đầu runtime PicoClaw.', + progressDescription: 'PicoClaw đang được tải xuống và cài đặt.', + stages: { + preparing: 'Đang chuẩn bị', + downloading: 'Đang tải xuống', + extracting: 'Đang giải nén', + installing: 'Đang cài đặt', + installed: 'Đã cài đặt', + install_timeout: 'Đã hết thời gian', + install_failed: 'Không thành công' + } + }, + model: { + requiredTitle: 'Cần có cấu hình mô hình', + requiredDescription: + 'Định cấu hình mô hình PicoClaw trước khi sử dụng trò chuyện PicoClaw.', + docsTitle: 'Hướng dẫn cấu hình', + docsDesc: 'Các mô hình và giao thức được hỗ trợ', + menuLabel: 'Cấu hình mô hình', + modelIdentifier: 'Định danh mô hình', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'Khóa API', + apiKeyPlaceholder: 'Nhập khóa API của mô hình', + save: 'Lưu', + saving: 'Đang lưu', + saved: 'Đã lưu cấu hình mô hình', + saveFailed: 'Không lưu được cấu hình mô hình', + invalid: 'Bắt buộc nhập mã định danh mô hình, API Base URL và khóa API' + }, + uninstall: { + menuLabel: 'Gỡ cài đặt', + confirmTitle: 'Gỡ cài đặt PicoClaw', + confirmContent: + 'Bạn có chắc chắn muốn gỡ cài đặt PicoClaw không? Thao tác này sẽ xóa tệp thực thi và tất cả các tệp cấu hình.', + confirmOk: 'Gỡ cài đặt', + confirmCancel: 'Hủy' + }, + history: { + title: 'Lịch sử', + loading: 'Đang tải phiên...', + emptyTitle: 'Chưa có lịch sử', + emptyDescription: 'Các phiên PicoClaw trước đó sẽ xuất hiện ở đây.', + loadFailed: 'Không tải được lịch sử phiên', + deleteFailed: 'Không xóa được phiên', + deleteConfirmTitle: 'Xóa phiên', + deleteConfirmContent: 'Bạn có chắc chắn muốn xóa "{{title}}" không?', + deleteConfirmOk: 'Xóa', + deleteConfirmCancel: 'Hủy', + messageCount_one: '{{count}} tin nhắn', + messageCount_other: '{{count}} tin nhắn' + }, + config: { + startRuntime: 'Bắt đầu PicoClaw', + stopRuntime: 'Dừng PicoClaw' + }, + start: { + title: 'Bắt đầu PicoClaw', + description: 'Bắt đầu runtime để sử dụng trợ lý PicoClaw.' + } + }, + error: { + title: 'Chúng tôi đã gặp sự cố', + refresh: 'Làm mới' + }, + fullscreen: { + toggle: 'Chuyển đổi toàn màn hình' + }, + menu: { + collapse: 'Thu gọn Menu', + expand: 'Mở rộng Menu' } } }; diff --git a/web/src/i18n/locales/zh.ts b/web/src/i18n/locales/zh.ts index be9821f..95e4611 100644 --- a/web/src/i18n/locales/zh.ts +++ b/web/src/i18n/locales/zh.ts @@ -82,6 +82,13 @@ const zh = { placeholder: '请输入内容', submit: '确定', virtual: '虚拟键盘', + readClipboard: '从剪贴板读取', + clipboardPermissionDenied: '剪贴板权限被拒绝。请允许您的浏览器访问剪贴板。', + clipboardReadError: '无法读取剪贴板', + dropdownEnglish: '英语', + dropdownGerman: '德语', + dropdownFrench: '法语', + dropdownRussian: '俄语', shortcut: { title: '快捷键', custom: '自定义', @@ -102,7 +109,7 @@ const zh = { }, sequential: { title: '序列输入模式', - desc1: '点击【引导键】开始 → 依次点击【快捷键】→ 点击【引导键】结束。', + desc1: '点击引导键开始 → 依次点击快捷键 → 再次点击引导键结束。', desc2: '步骤较多,但能完美避开系统键位冲突。' }, enable: '启用引导键', @@ -142,8 +149,8 @@ const zh = { hidOnly: { title: 'HID-Only 模式', desc: '若使用过程中遇到鼠标键盘无响应,且重置 HID 无效,可能是 NanoKVM 与您的设备存在兼容性问题。建议尝试启用 HID-Only 模式以提升兼容性。', - tip1: '启用该模式会禁用虚拟U盘和虚拟网卡', - tip2: '该模式下无法使用镜像挂载功能', + tip1: '启用 HID-Only 模式会卸载虚拟 U 盘和虚拟网络', + tip2: 'HID-Only 模式下,镜像挂载将被禁用', tip3: '切换模式后将自动重启 NanoKVM', enable: '启用 HID-Only 模式', disable: '关闭 HID-Only 模式' @@ -199,6 +206,16 @@ const zh = { serialPort: '串口', serialPortPlaceholder: '请输入串口', baudrate: '波特率', + parity: '奇偶校验', + parityNone: '无', + parityEven: '偶校验', + parityOdd: '奇校验', + flowControl: '流量控制', + flowControlNone: '无', + flowControlSoft: '软件', + flowControlHard: '硬件', + dataBits: '数据位', + stopBits: '停止位', confirm: '确定' }, wol: { @@ -210,9 +227,12 @@ const zh = { }, download: { title: '下载镜像', - input: '请输入镜像的下载地址', + input: '请输入远程镜像 URL', ok: '确定', - disabled: '/data 是只读分区,无法下载镜像' + disabled: '/data 是只读分区,无法下载镜像', + uploadbox: '将文件拖放到此处或单击选择', + inputfile: '请输入图片文件', + NoISO: '无 ISO' }, power: { title: '电源', @@ -241,7 +261,12 @@ const zh = { deviceKey: '设备码', community: '社区', hostname: '主机名', - hostnameUpdated: '主机名修改成功,重启后生效' + hostnameUpdated: '主机名修改成功,重启后生效', + ipType: { + Wired: '有线', + Wireless: '无线', + Other: '其他' + } }, appearance: { title: '外观', @@ -282,6 +307,7 @@ const zh = { }, advanced: '高级设置', swap: { + title: '交换', disable: '禁用', description: '设置交换文件大小', tip: '启用该功能可能会减少SD卡使用寿命!' @@ -317,6 +343,8 @@ const zh = { diskDesc: '在远程主机中挂载虚拟U盘', network: '虚拟网卡', networkDesc: '在远程主机中挂载虚拟网卡', + reboot: '重新启动', + rebootDesc: '您确定要重新启动 NanoKVM 吗?', okBtn: '是', cancelBtn: '否' }, @@ -325,7 +353,7 @@ const zh = { wifi: { title: 'Wi-Fi', description: '配置 Wi-Fi 信息', - apMode: 'AP 模式已启用,该模式下仅支持扫描二维码配网', + apMode: 'AP 模式已启用,请扫描二维码连接 Wi-Fi', connect: '连接 Wi-Fi', connectDesc1: '请输入网络名称和密码', connectDesc2: '请输入密码以连接此网络', @@ -378,7 +406,7 @@ const zh = { }, restart: '取定要重启 Tailscale 吗?', stop: '确定要停止 Tailscale 吗?', - stopDesc: '该操作会退出登录,并停止开机自动启动。', + stopDesc: '退出 Tailscale 并禁用开机自动启动。', loading: '加载中...', notInstall: '未检测到 Tailscale,请先安装', install: '安装', @@ -388,8 +416,8 @@ const zh = { download: '下载', package: '安装包', unzip: '并解压', - upTailscale: '将 tailscale 文件上传到 /usr/bin/ 目录', - upTailscaled: '将 tailscaled 文件上传到 /usr/sbin/ 目录', + upTailscale: '将 tailscale 上传到 NanoKVM 的 /usr/bin/ 目录', + upTailscaled: '将 tailscaled 上传到 NanoKVM 的 /usr/sbin/ 目录', refresh: '刷新页面', notRunning: 'Tailscale 尚未运行,请先执行启动操作', run: '启动', @@ -405,8 +433,6 @@ const zh = { logoutDesc: '确定要退出吗?', uninstall: '卸载 Tailscale', uninstallDesc: '确定要卸载 Tailscale 吗?', - reboot: '重启', - rebootDesc: '你确定要重启 NanoKVM 吗?', okBtn: '确认', cancelBtn: '取消' }, @@ -437,8 +463,8 @@ const zh = { updateBtn: '修改', logoutBtn: '退出', logoutDesc: '确定要退出吗?', - confirm: '确定', - cancel: '取消' + okBtn: '确定', + cancelBtn: '取消' } }, picoclaw: { diff --git a/web/src/i18n/locales/zh_tw.ts b/web/src/i18n/locales/zh_tw.ts index 9bafc10..ee167af 100644 --- a/web/src/i18n/locales/zh_tw.ts +++ b/web/src/i18n/locales/zh_tw.ts @@ -16,6 +16,8 @@ const zh_tw = { noEmptyPassword: '密碼不能為空', noAccount: '找不到使用者,請重新整理網頁或重設密碼', invalidUser: '使用者名稱或密碼錯誤', + locked: '登入次數過多,請稍後重試', + globalLocked: '系統受保護,請稍後重試', error: '非預期性錯誤', changePassword: '更改密碼', changePasswordDesc: '為了您的裝置安全,請修改登入密碼。', @@ -44,7 +46,14 @@ const zh_tw = { failed: '操作失敗,請重試。', invalidMode: '目前模式不支援設定網路。請先前往裝置啟用 Wi-Fi 配置模式。', confirmBtn: '確定', - finishBtn: '完成' + finishBtn: '完成', + ap: { + authTitle: '需要身份驗證', + authDescription: '請輸入 AP 密碼繼續', + authFailed: 'AP 密碼無效', + passPlaceholder: 'AP 密碼', + verifyBtn: '驗證' + } }, screen: { scale: '缩放', @@ -73,15 +82,48 @@ const zh_tw = { placeholder: '請輸入內容', submit: '送出', virtual: '虛擬鍵盤', - ctrlaltdel: 'Ctrl+Alt+Del', + readClipboard: '從剪貼簿讀取', + clipboardPermissionDenied: '剪貼簿權限被拒絕。請允許您的瀏覽器存取剪貼簿。', + clipboardReadError: '無法讀取剪貼簿', + dropdownEnglish: '英語', + dropdownGerman: '德語', + dropdownFrench: '法語', + dropdownRussian: '俄語', shortcut: { title: '快捷鍵', custom: '自定義', capture: '點選此處錄製快捷鍵', clear: '清空', save: '儲存', - captureTips: '錄製系統級按鍵(如 Windows 鍵)需要全螢幕的權限。', + captureTips: '擷取系統級按鍵(如 Windows 鍵)需要全螢幕權限。', enterFullScreen: '切換全螢幕模式。' + }, + leaderKey: { + title: '引導鍵', + desc: '繞過瀏覽器限制並將系統捷徑直接傳送到遠端主機。', + howToUse: '如何使用', + simultaneous: { + title: '同步模式', + desc1: '按住引導鍵不放,同時按下目標快捷鍵。', + desc2: '直觀,但可能與系統快速鍵衝突。' + }, + sequential: { + title: '順序模式', + desc1: '點擊引導鍵開始 → 依序點擊快捷鍵 → 再次點擊引導鍵結束。', + desc2: '需要更多步驟,但完全避免了系統衝突。' + }, + enable: '啟用引導鍵', + tip: '設為引導鍵後,該按鍵將僅用於觸發快捷鍵,不再作為普通按鍵使用。', + placeholder: '請按下引導鍵', + shiftRight: '右 Shift', + ctrlRight: '右 Ctrl', + metaRight: '右 Win', + submit: '送出', + recorder: { + rec: '記錄', + activate: '啟用按鍵', + input: '請按快捷鍵...' + } } }, mouse: { @@ -106,7 +148,7 @@ const zh_tw = { resetHid: '重設 HID', hidOnly: { title: 'HID-Only 模式', - desc: "如果您的滑鼠和鍵盤沒有反應,且重設 HID 無效,可能是 NanoKVM 與您的裝置間有相容性問題。請嘗試啟用 HID-Only 模式以獲得更好的相容性。", + desc: '如果您的滑鼠和鍵盤沒有反應,且重設 HID 無效,可能是 NanoKVM 與您的裝置間有相容性問題。請嘗試啟用 HID-Only 模式以獲得更好的相容性。', tip1: '啟用 HID-Only 模式將會停用虛擬隨身碟和虛擬網卡的功能', tip2: '在 HID-Only 模式下,映像檔掛載功能將被停用', tip3: 'NanoKVM 將在切換模式後自動重新啟動', @@ -118,7 +160,6 @@ const zh_tw = { title: '映像檔', loading: '載入中...', empty: '未找到任何內容', - cdrom: '以CD-ROM模式掛載', mountMode: '掛載模式', mountFailed: '掛載失敗', mountDesc: '在某些系統中,需要在遠端主機中彈出虛擬硬碟後再掛載映像檔。', @@ -162,19 +203,19 @@ const zh_tw = { title: '終端機', nanokvm: 'NanoKVM 終端機', serial: 'Serial Port 終端機', - serialPort: 'Serial Port', + serialPort: '序列埠', serialPortPlaceholder: '請輸入 Serial Port', - baudrate: 'Baud rate', - parity: 'Parity', + baudrate: '鮑率', + parity: '同位檢查', parityNone: 'None', - parityEven: 'Even', - parityOdd: 'Odd', - flowControl: 'Flow control', + parityEven: '偶同位', + parityOdd: '奇同位', + flowControl: '流量控制', flowControlNone: 'None', - flowControlSoft: 'Soft', - flowControlHard: 'Hard', - dataBits: 'Data bits', - stopBits: 'Stop bits', + flowControlSoft: '軟體', + flowControlHard: '硬體', + dataBits: '資料位元', + stopBits: '停止位元', confirm: '確定' }, wol: { @@ -188,7 +229,10 @@ const zh_tw = { title: '下载映像檔', input: '請輸入映像檔的下載 URL', ok: '確定', - disabled: '/data 為唯讀目錄,無法下載映像檔' + disabled: '/data 為唯讀目錄,無法下載映像檔', + uploadbox: '將檔案拖曳到此處或按一下選擇', + inputfile: '請輸入圖片檔案', + NoISO: '無 ISO' }, power: { title: '電源控制', @@ -229,7 +273,6 @@ const zh_tw = { display: '顯示', language: '語言', languageDesc: '選擇介面語言', - menuBarDesc: '是否在選單列中顯示圖案', webTitle: '網頁標題', webTitleDesc: '自訂網頁標題', menuBar: { @@ -267,7 +310,7 @@ const zh_tw = { title: 'Swap', disable: '停用', description: '設定 Swap 檔大小', - tip: "啟用此功能可能會減少SD卡的使用壽命!" + tip: '啟用此功能可能會減少SD卡的使用壽命!' }, mouseJiggler: { title: '滑鼠抖動模式 (Mouse Jiggler)', @@ -278,7 +321,7 @@ const zh_tw = { }, mdns: { description: '啟用 mDNS 發現服務', - tip: "若無需求,建議關閉此功能" + tip: '若無需求,建議關閉此功能' }, hdmi: { description: '啟用 HDMI/螢幕 輸出' @@ -295,7 +338,7 @@ const zh_tw = { settings: '設定' }, hidOnly: 'HID-Only 模式', - hidOnlyDesc: '該模式下不再打開虛擬隨身碟,僅保留基礎的 鍵盤/滑鼠 的控制功能。', + hidOnlyDesc: '停止模擬虛擬設備,僅保留基礎 HID 控制', disk: '虛擬隨身碟', diskDesc: '在遠端主機上連接虛擬隨身碟', network: '虛擬網卡', @@ -310,7 +353,7 @@ const zh_tw = { wifi: { title: 'Wi-Fi', description: '設定 Wi-Fi', - apMode: 'AP 模式已啟用,該模式下僅支援掃描 QRCode 配網', + apMode: 'AP 模式已啟用,請掃描 QRCode 連接 Wi-Fi', connect: '連線 Wi-Fi', connectDesc1: '請輸入網路名稱和密碼', connectDesc2: '請輸入密碼以連線此網路', @@ -355,8 +398,7 @@ const zh_tw = { title: 'Tailscale', memory: { title: '記憶體最佳化', - tip: '當記憶體使用量超過限制時,會更積極的進行垃圾回收來嘗試釋放記憶體。若使用 Tailscale 建議設定為 50MB,於重啟 Tailscale 後生效。', - disable: '關閉' + tip: '當記憶體使用量超過限制時,會更積極的進行垃圾回收來嘗試釋放記憶體。若使用 Tailscale 建議設定為 50MB,於重啟 Tailscale 後生效。' }, swap: { title: 'Swap', @@ -364,7 +406,7 @@ const zh_tw = { }, restart: '確定要重啟 Tailscale 嗎?', stop: '確定要停止 Tailscale 嗎?', - stopDesc: '此操作將會登出帳號,並停止開機自動啟動。', + stopDesc: '登出 Tailscale 並停用開機自動啟動。', loading: '載入中...', notInstall: '未找到 Tailscale !請先安裝。', install: '安裝', @@ -391,8 +433,6 @@ const zh_tw = { logoutDesc: '確認要登出嗎?', uninstall: '移除 Tailscale', uninstallDesc: '確定要解除安裝 Tailscale 嗎?', - reboot: '重啟', - rebootDesc: '您確定要重啟 NanoKVM 嗎?', okBtn: '確認', cancelBtn: '取消' }, @@ -423,8 +463,128 @@ const zh_tw = { updateBtn: '修改', logoutBtn: '登出', logoutDesc: '您確定要登出嗎?', - confirm: '確定', - cancel: '取消' + okBtn: '確定', + cancelBtn: '取消' + } + }, + picoclaw: { + title: 'PicoClaw 助理', + empty: '打開面板並啟動一個任務來開始。', + inputPlaceholder: '描述您希望 PicoClaw 執行的操作', + newConversation: '新對話', + processing: '正在處理...', + agent: { + defaultTitle: '通用助理', + defaultDescription: '一般聊天、搜尋和工作區域幫助。', + kvmTitle: '遠端控制', + kvmDescription: '透過 NanoKVM 操作遠端主機。', + switched: '代理角色已切換', + switchFailed: '代理角色切換失敗' + }, + send: '發送', + cancel: '取消', + status: { + connecting: '正在連線 Gateway...', + connected: 'PicoClaw 會話已連線', + disconnected: 'PicoClaw 會話已關閉', + stopped: '已發送停止請求', + runtimeStarted: 'PicoClaw Runtime 已啟動', + runtimeStartFailed: '啟動 PicoClaw Runtime 失敗', + runtimeStopped: 'PicoClaw Runtime 已停止', + runtimeStopFailed: '停止 PicoClaw Runtime 失敗' + }, + connection: { + runtime: { + checking: '檢查中', + ready: 'Runtime 已就緒', + stopped: 'Runtime 未啟動', + unavailable: 'Runtime 不可用', + configError: '設定錯誤' + }, + transport: { + connecting: '連接中', + connected: '已連接' + }, + run: { + idle: '空閒', + busy: '忙' + } + }, + message: { + toolAction: '行動', + observation: '觀察', + screenshot: '截圖' + }, + overlay: { + locked: 'PicoClaw 正在控制設備。手動輸入已暫停。' + }, + install: { + install: '安裝 PicoClaw', + installing: '正在安裝 PicoClaw', + success: 'PicoClaw 安裝成功', + failed: 'PicoClaw 安裝失敗', + uninstalling: '正在解除安裝 Runtime...', + uninstalled: 'Runtime 解除安裝成功。', + uninstallFailed: '解除安裝失敗。', + requiredTitle: 'PicoClaw 未安裝', + requiredDescription: '在啟動 PicoClaw Runtime 之前,請先安裝 PicoClaw。', + progressDescription: '正在下載並安裝 PicoClaw。', + stages: { + preparing: '準備中', + downloading: '下載中', + extracting: '解壓縮中', + installing: '安裝中', + installed: '已安裝', + install_timeout: '超時', + install_failed: '失敗' + } + }, + model: { + requiredTitle: '需要設定模型', + requiredDescription: '在使用 PicoClaw 聊天之前,請先設定 PicoClaw 模型。', + docsTitle: '設定指南', + docsDesc: '支援的模型與通訊協定', + menuLabel: '設定模型', + modelIdentifier: '模型標識符', + modelIdentifierPlaceholder: 'openai/gpt-5.4', + apiBase: 'API Base URL', + apiBasePlaceholder: 'https://api.example.com/v1', + apiKey: 'API Key', + apiKeyPlaceholder: '請輸入模型 API Key', + save: '儲存', + saving: '儲存中', + saved: '模型設定已儲存', + saveFailed: '儲存模型設定失敗', + invalid: '模型標識、API Base URL 和 API Key 不能為空' + }, + uninstall: { + menuLabel: '解除安裝', + confirmTitle: '解除安裝 PicoClaw', + confirmContent: '您確定要解除安裝 PicoClaw 嗎?這將刪除可執行檔和所有設定檔。', + confirmOk: '解除安裝', + confirmCancel: '取消' + }, + history: { + title: '歷史會話', + loading: '正在載入會話...', + emptyTitle: '還沒有歷史記錄', + emptyDescription: '之前的 PicoClaw 會話將會出現在此。', + loadFailed: '無法載入會話歷史記錄', + deleteFailed: '刪除會話失敗', + deleteConfirmTitle: '刪除會話', + deleteConfirmContent: '您確定要刪除「{{title}}」嗎?', + deleteConfirmOk: '刪除', + deleteConfirmCancel: '取消', + messageCount_one: '{{count}} 則訊息', + messageCount_other: '{{count}} 則訊息' + }, + config: { + startRuntime: '啟動 PicoClaw', + stopRuntime: '停止 PicoClaw' + }, + start: { + title: '啟動 PicoClaw', + description: '啟動 Runtime 後即可開始使用 PicoClaw 助理。' } }, error: {