mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-29 14:45:24 +00:00
* fix(sso): send the PKCE verifier for GitHub login (#1534) * fix(remote-desktop): clip cursor overflow without disabling zoom (#1535) * test(remote-desktop): preserve sessions beyond one hour (#1536) * fix(hosts): expose controls for overflowing editor tabs (#1537) * fix(hosts): expose controls for overflowing editor tabs * test(hosts): mock resize observation in admin panel tests * fix(status): skip TCP probes while host sessions are active (#1538) * fix(database): batch session activity persistence (#1539) * docs(api): describe cookie and API key authentication (#1540) * fix(snippets): repair missing note column on SQLite upgrades (#1541) * fix(docker): retain stored SSH credential association (#1543) * fix(file-manager): render transfer toasts without plugin hooks (#1546) * feat(hosts): keep compact row actions inline (#1547) * fix(auth): allow retrying unavailable second-factor interfaces (#1549) * fix(auth): reject unresolved legacy identity provisioning (#1550) * fix(desktop): ship the plugin SDK inside Mac App Store builds (#1551) * fix(tmux): pass full session info to the terminal's session picker (#1552) The tmux.sessions service reduced detected sessions to bare names, but the picker reads session.name, so every entry rendered blank and selecting one sent an empty name, which created a new session instead of attaching. * fix(ssh): read force keyboard-interactive as a boolean when resolving hosts (#1553) The column holds the text "true"/"false", and the resolver passed it through as-is. The string "false" is truthy, so the password provider treated every saved host as forced keyboard-interactive and left the password out. Jump hops are built straight from the resolved host, so a password hop whose server doesn't offer keyboard-interactive failed with "All configured authentication methods failed". * fix(database): batch database saves for bulk host writes (#1554) * fix(database): yield to the event loop between database saves Each SQLite save serializes and encrypts the whole database into new buffers, which V8 only releases once the event loop turns. Boot migrations and bulk host import write plugin settings per host and per key in an awaited loop, so hundreds of full copies piled up and the container ran out of memory. * fix(database): save once per bulk host write instead of once per row On SQLite every repository write force-saves the whole database. Boot plugin data migrations, host defaults materialization and the bulk host routes write one row per host per setting, so they serialized and encrypted the full database hundreds of times in a row. DatabaseSaveTrigger.batched wraps a function so force saves made while it runs collapse into a single save when it finishes. Nested scopes fold into the outer one, and work that outlives its scope saves normally. * feat(hosts): add instance-wide predefined tag suggestions (#1548) * feat(hosts): add shared predefined tag suggestions * style(hosts): format tag catalog routes * test(database): advance fake timers past the save yield (#1555) * fix(i18n): complete Simplified Chinese core and plugin translations (#1542) * fix(i18n): complete Chinese onboarding and navigation labels * fix(i18n): translate remaining Chinese core and plugin interfaces * fix(i18n): translate host editor tab overflow controls * fix(i18n): use consistent Chinese fleet terminology * fix(i18n): localize hardcoded controls and plugin views * fix(i18n): translate built-in homepage widget catalog * test(homepage): follow translated timezone placeholder * fix(i18n): translate plugin-provided homepage widgets * fix(i18n): localize feature settings section titles * fix: 2.8 oidc accounts unable to sign in after upgrading (#1381) * fix: plugins losing the saved ssh login when copying a host (#1391) * fix: fleets, proxmox and automations not getting the host sudo password * fix: host imports running a defaults pass and metrics restart per host (#1384) * fix: high cpu from status probes and full database saves on every sample (#1300) * fix: user data export freezing the server (#1393) * fix: op:// secret references rejected as ssh keys on credentials (#1394) * fix: slow file deletes from the trash lookups on every delete (#1390) * fix: add openapi docs and error handling to host tag routes * test: compare download stream buffers directly so it stops timing out * chore: drop em dash from host row comment * chore: update release notes for 2.9.1 * fix: restore space to add host tags and redesign predefined tags editor * fix: host key silently accepted when the host is missing from the database (#1397) * fix: clearer host login failed status label and fix its translations (#1396) * chore: add host key and status label fixes to release notes * fix: sso and ldap provider dialogs overflowing the screen and using mismatched toggles * chore: increment ver * fix(audit): store plugin entries with no acting user as a null user_id (#1556) Plugin audit entries written outside a request used the literal "system" as user_id. That column references users.id, so the insert was refused (Postgres logs it as an FK violation) and the entry was silently dropped. Write null instead and keep "system" / plugin:<id> in username. * chore: add sso/ldap dialog and audit log fixes to release notes * fix: tunnels and host settings missing from shared hosts on desktop * fix: remote desktop logins missing from shared hosts on desktop * fix: simplify host status to online/offline and keep it live without a refresh * chore: sync Crowdin translations for 2.9.1 --------- Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
190 lines
9.2 KiB
JSON
190 lines
9.2 KiB
JSON
{
|
|
"sessionSharing": {
|
|
"guestView": {
|
|
"loading": "Connectant a la sessió compartida...",
|
|
"linkInvalid": "Aquest enllaç per compartir no és vàlid, ha caducat o s'ha revocat.",
|
|
"rateLimited": "Massa intents, si us plau, torneu-ho a intentar en breu",
|
|
"sessionEnded": "Aquesta sessió ha finalitzat",
|
|
"readOnlyBadge": "Només visualització",
|
|
"ownerLabel": "Propietari de l'amfitrió"
|
|
},
|
|
"modalTitle": "Comparteix la sessió",
|
|
"shareButton": "Comparteix",
|
|
"notReadyToShare": "La sessió encara no està a punt per compartir",
|
|
"modeTab": {
|
|
"link": "Enllaç",
|
|
"user": "Usuari"
|
|
},
|
|
"linkModeDescription": "Qualsevol persona amb aquest enllaç s'hi pot unir, no cal tenir cap compte.",
|
|
"userModeDescription": "Comparteix amb un usuari específic que ja tingui accés a aquest amfitrió. Si encara no hi té accés, comparteix primer l'amfitrió amb ell o utilitza un enllaç. Un cop compartida, la sessió apareix a la pestanya Connexions.",
|
|
"permissionLevel": {
|
|
"label": "Nivell de permís",
|
|
"readOnly": "Només lectura",
|
|
"readOnlyDescription": "Puc veure la sessió en directe però no puc escriure ni interactuar.",
|
|
"readWrite": "Lectura i escriptura",
|
|
"readWriteDescription": "Pot escriure i interactuar amb la sessió igual que el propietari."
|
|
},
|
|
"expiryLabel": "Caducitat de l'enllaç",
|
|
"createLinkButton": "Crea un enllaç",
|
|
"createShareButton": "Comparteix amb l'usuari",
|
|
"searchUsersPlaceholder": "Cerca usuaris...",
|
|
"noUsersFound": "No s'han trobat usuaris",
|
|
"linkCreated": "Enllaç de compartició creat",
|
|
"linkNeedsServer": "Els enllaços per compartir només funcionen per a sessions en un servidor Termix. Connecteu aquest amfitrió a través del vostre servidor enllaçat per compartir-lo amb un enllaç.",
|
|
"linkCopied": "Enllaç copiat al porta-retalls",
|
|
"copyLink": "Copia l'enllaç",
|
|
"shareCreated": "Sessió compartida. Apareixerà a la pestanya Connexions.",
|
|
"shareFailed": "No s'ha pogut crear la compartició",
|
|
"userLacksHostAccess": "Aquest usuari encara no té accés a aquest amfitrió. Primer comparteix l'amfitrió amb ell o utilitza un enllaç.",
|
|
"activeShares": "Accions actives",
|
|
"noActiveShares": "No hi ha cap compartició activa per a aquesta sessió",
|
|
"revoke": "Revocar",
|
|
"revokeConfirmTitle": "Voleu revocar aquesta compartició?",
|
|
"revokeConfirmDescription": "Qualsevol persona que utilitzi aquesta opció compartida perdrà l'accés immediatament.",
|
|
"revoked": "Compartir revocat",
|
|
"revokeFailed": "No s'ha pogut revocar la compartició",
|
|
"joinCount": "{{count}} uneix-te",
|
|
"joinCount_other": "{{count}} s'uneix",
|
|
"expiresAt": "Caduca {{date}}",
|
|
"linkShareBadge": "Enllaç",
|
|
"userShareBadge": "Usuari: {{username}}",
|
|
"loadSharesFailed": "No s'han pogut carregar les comparticions actives",
|
|
"remoteDisplayUnavailable": "L'escriptori remot no està disponible ara mateix.",
|
|
"sharedWithMe": "Sessions compartides amb mi",
|
|
"customHoursPlaceholder": "Hores fins que caduca l'accés"
|
|
},
|
|
"collab": {
|
|
"createRoom": "Nova habitació",
|
|
"roomName": "Nom de l'habitació",
|
|
"persistentRoom": "Sala persistent",
|
|
"persistentRoomHint": "Les sales persistents romanen a la llista després que finalitzi la reunió i es poden reutilitzar.",
|
|
"noRooms": "Encara no hi ha cap sala. Crea'n una per iniciar una reunió.",
|
|
"openRoom": "Obre",
|
|
"endRoom": "Finalitza la reunió",
|
|
"leaveRoom": "Marxar",
|
|
"deleteMember": "Elimina",
|
|
"removeMember": "Elimina {{name}}",
|
|
"removeMemberTitle": "Voleu eliminar aquest membre?",
|
|
"removeMemberDescription": "{{name}} perdrà l'accés a aquesta sala immediatament. Qualsevol visor SSH actiu es desconnectarà.",
|
|
"invite": "Convidar",
|
|
"inviteTitle": "Convida membres",
|
|
"members": "Membres",
|
|
"membersPanel": "Membres de la sala i sol·licituds de control",
|
|
"membersWithCount": "Membres ({{count}})",
|
|
"guestsWithCount": "Convidats ({{count}})",
|
|
"removeGuests": "Elimina els convidats",
|
|
"anonymousGuest": "Convidat",
|
|
"online": "en línia",
|
|
"offline": "fora de línia",
|
|
"you": "(tu)",
|
|
"hostBadge": "Amfitrió",
|
|
"presenterBadge": "Presentant",
|
|
"present": "Present",
|
|
"presentTitle": "Puja a l'escenari",
|
|
"presentHost": "Amfitrió",
|
|
"searchHosts": "Cerca amfitrions",
|
|
"noHostsFound": "No s'han trobat amfitrions disponibles.",
|
|
"presentProtocol": "Protocol",
|
|
"stopPresenting": "Atura la presentació",
|
|
"takeOver": "Prendre el control",
|
|
"takeOverConfirmTitle": "Voleu substituir la presentació actual?",
|
|
"takeOverDescription": "{{name}} està presentant ara. Prendre el control desconnectarà tothom d'aquesta etapa.",
|
|
"emptyStage": "Ningú fa una presentació. Puja a l'escenari per compartir una sessió.",
|
|
"stageLoading": "Connexió amb l'escenari...",
|
|
"stageEnded": "La presentació va acabar",
|
|
"roomEnded": "Aquesta reunió ha acabat",
|
|
"presenterLabel": "{{name}} presenta",
|
|
"guestLink": "Enllaç de convidat",
|
|
"guestLinkOn": "L'enllaç de convidat està activat. Qualsevol persona que tingui l'enllaç pot veure l'escenari.",
|
|
"guestLinkOff": "L'enllaç de convidat està desactivat.",
|
|
"copyLink": "Copia l'enllaç",
|
|
"rotateLink": "Gira l'enllaç",
|
|
"disableLink": "Desactiva l'enllaç",
|
|
"rotateLinkConfirmTitle": "Voleu girar l'enllaç de convidat?",
|
|
"rotateLinkDescription": "L'enllaç actual deixarà de funcionar immediatament. Els convidats SSH connectats es desconnectaran.",
|
|
"disableLinkConfirmTitle": "Voleu desactivar l'enllaç de convidat?",
|
|
"disableLinkDescription": "Els visors SSH anònims es desconnectaran immediatament i l'enllaç actual deixarà de funcionar.",
|
|
"linkCopied": "Enllaç copiat",
|
|
"roles": "Rols",
|
|
"users": "Usuaris",
|
|
"searchUsers": "Cerca usuaris",
|
|
"endConfirmTitle": "Voleu finalitzar aquesta reunió?",
|
|
"endDescription": "{{name}} finalitzarà per a tothom i no es podrà tornar a obrir.",
|
|
"endPersistentDescription": "La presentació activa a {{name}} s'aturarà. La sala romandrà disponible per a reutilització.",
|
|
"deleteRoom": "Suprimeix l'habitació",
|
|
"deleteConfirmTitle": "Voleu suprimir aquesta sala?",
|
|
"deleteDescription": "{{name}} s'eliminarà permanentment per a tothom i no es podrà desfer.",
|
|
"invitedTo": "Has estat convidat a \"{{name}}\"",
|
|
"guest": {
|
|
"title": "Reunió",
|
|
"waiting": "Esperant el presentador...",
|
|
"linkInvalid": "Aquest enllaç de convidat no és vàlid o la reunió ha finalitzat."
|
|
},
|
|
"reopenFromPanel": "Aquesta pestanya de reunió ha caducat. Torna a obrir la sala des del tauler Reunions.",
|
|
"retry": "Torna-ho a intentar",
|
|
"requestControl": "Sol·licitud de control",
|
|
"cancelControlRequest": "Cancel·la la sol·licitud",
|
|
"controlQueue": "Sol·licituds de control",
|
|
"noControlRequests": "No hi ha sol·licituds pendents.",
|
|
"grantControlTo": "Dóna el control a {{name}}",
|
|
"dismissControlRequest": "Ignora la sol·licitud de control de {{name}}",
|
|
"releaseControl": "Control de llançament",
|
|
"grantControl": "Donar control",
|
|
"revokeControl": "Recupera el control",
|
|
"controlRequestedBy": "{{name}} va demanar control",
|
|
"grant": "Subvenció",
|
|
"controlBadge": "En control",
|
|
"youArePresenting": "Esteu presentant en una altra pestanya. Deixeu de presentar per cedir l'escenari.",
|
|
"created": "Sala creada",
|
|
"invited": "Membres convidats",
|
|
"roomTab": "Reunió",
|
|
"serverChanged": "El servidor de reunions ha canviat. Torna a obrir aquesta reunió des del tauler Reunions.",
|
|
"hostNotSynced": "Sincronitza aquest amfitrió amb el servidor de reunions abans de presentar.",
|
|
"linkRequiresServer": "Enllaça aquest escriptori a un servidor de Termix i crea-hi la reunió per compartir un enllaç web."
|
|
},
|
|
"nav": {
|
|
"collab": "Reunions"
|
|
},
|
|
"settings": {
|
|
"admin": {
|
|
"globallyEnabled": {
|
|
"label": "Permetre la compartició de sessions",
|
|
"description": "Permet que les sessions de terminal, RDP, VNC i Telnet en directe es comparteixin a tota la instància. Anul·la tots els activables i desactivables per compartir per host quan estan desactivats."
|
|
}
|
|
},
|
|
"host": {
|
|
"allowSessionSharing": {
|
|
"label": "Permetre la compartició de sessions",
|
|
"description": "Permet que les sessions en directe d'aquest amfitrió es comparteixin mitjançant un enllaç o amb altres usuaris"
|
|
}
|
|
}
|
|
},
|
|
"permissions": {
|
|
"use": {
|
|
"title": "Comparteix sessions i uneix-te a sales",
|
|
"description": "Comparteix sessions en directe mitjançant un enllaç o amb altres usuaris, i crea sales de col·laboració i uneix-te-hi."
|
|
}
|
|
},
|
|
"hosts": {
|
|
"sharing": {
|
|
"expiry": {
|
|
"never": "Mai",
|
|
"oneHour": "1 hora",
|
|
"oneDay": "24 hores",
|
|
"sevenDays": "7 dies",
|
|
"thirtyDays": "30 dies",
|
|
"custom": "Personalitzat"
|
|
}
|
|
}
|
|
},
|
|
"connections": {
|
|
"sectionSharedWithMe": "Compartit amb mi",
|
|
"sharedBy": "Compartit per {{username}}",
|
|
"join": "Uneix-te",
|
|
"sharedSessionLabel": "{{hostName}} (compartit)"
|
|
},
|
|
"plugin": {
|
|
"name": "Session Sharing"
|
|
}
|
|
}
|