mirror of
https://github.com/hcengineering/platform.git
synced 2026-08-20 03:15:41 +02:00
* feat: API token management in workspace settings Add UI and backend support for creating, listing, and revoking API tokens scoped to workspaces. Includes owner-level workspace token visibility, OpenAPI documentation, Mongo/Postgres persistence, and i18n translations. Signed-off-by: Don Kendall <kendall@donkendall.com> * feat: enforce API token revocation at transactor level Embed apiTokenId in JWT extra field and add a per-token revocation cache (60s TTL) in the transactor REST handler. Revoked tokens are now rejected within ~60 seconds instead of remaining valid until JWT expiry. Adds checkApiTokenRevoked account service method for the transactor to query individual token revocation status. Signed-off-by: Don Kendall <kendall@donkendall.com> * feat: implement Phase 1 API token scopes (read/write/delete) Add coarse-grained scope enforcement for API tokens. Tokens can now be created with scopes ['read:*'], ['read:*','write:*'], or ['read:*','write:*','delete:*']. Existing tokens without scopes retain full access (backward compatible). - DB: v26 migration adds scopes TEXT[] column to api_tokens - Types: add scopes field to ApiToken and ApiTokenInfo - Operations: createApiToken accepts/validates/persists scopes, embeds in JWT via extra.scopes - Enforcement: withSession checks scopes against method; tx handler additionally requires delete:* for TxRemoveDoc - Client: createApiToken signature accepts optional scopes param - UI: scope preset dropdown in create popup (default: Read Only), permissions column in token list with i18n labels - Also fixes 3 pre-existing TS2322/TS2345 errors in operations.ts Signed-off-by: Don Kendall <kendall@donkendall.com> * test: add unit tests for API token scope enforcement - scopes.test.ts: 8 tests for hasScope() and getRequiredScope() logic - apiTokenScopes.test.ts: 7 tests for createApiToken scope validation (valid scopes, multiple scopes, no scopes backward compat, invalid format rejection, empty array rejection, domain-scope rejection) and listApiTokens scopes inclusion - Export hasScope/getRequiredScope from rpc.ts for testability Signed-off-by: Don Kendall <kendall@donkendall.com> * fix: address review feedback — role restriction, locale parity, formatting - Restrict API token creation/revocation to AccountRole.User or higher (guests cannot use API tokens), per reviewer suggestion - Add 5 missing translation keys (ApiTokenPermissions, ApiTokenScopePreset, ApiTokenScopeReadOnly, ApiTokenScopeReadWrite, ApiTokenScopeFullAccess) to all non-en locale files to fix locale parity CI test - Fix prettier formatting in apiTokenScopes.test.ts - Rename local `extra` to `tokenExtra` in createApiToken to avoid shadowing the decoded token's `extra` field Signed-off-by: Don Kendall <kendall@donkendall.com> * fix: address aonnikov architectural review feedback - rpc.ts: use system service token for checkApiTokenRevoked so the revocation check is not coupled to the user's potentially-revoked bearer token; systemAccountUuid + service:'server' ensures account service always accepts the call - ApiDocsSection.svelte: derive transactor base URL from login.metadata.LoginEndpoint (set on auth) instead of window.location.origin, which is not necessarily the transactor host - ApiTokenCreatePopup.svelte: replace manual translate() calls and themeStore language watch with DropdownLabelsIntl + DropdownIntlItem[], which handle i18n automatically; error state is now IntlString - General.svelte: remove legacy GenerateApiToken button, handler, and ApiTokenPopup import in favour of the new ApiTokens settings panel Signed-off-by: Don Kendall <kendall@donkendall.com> * fix: formatting in ApiTokenPopup, apiTokenScopes test, and operations Signed-off-by: Don Kendall <kendall@donkendall.com> * fix: apply rushx fmt to pass CI formatting check Signed-off-by: Don Kendall <dkendall@ledoweb.com> * fix: restore (s as any) cast in server_http.ts removed by ESLint autofix Signed-off-by: Don Kendall <dkendall@ledoweb.com> * refactor(token): centralize API token revocation/expiry in verifyToken Address @aonnikov's review: the bespoke checkApiTokenRevoked RPC and the ad-hoc revocation cache in the transactor are replaced by a reusable verifyToken in server-token that checks signature, expiry, and (for revokable API tokens) revocation via a pluggable checker. - server-token: add verifyToken + isTokenExpired + setApiTokenRevocationChecker (the 'method to verify' metadata the plugin needs, without depending on the account client). Revocation cache (60s TTL) now lives here, reusable by any service (transactor, blob access, etc.). - account: the account is now authoritative — wrap() rejects revoked/expired API tokens, so any account method (selectWorkspace/getWorkspaceInfo/...) naturally 401s. Removed the redundant checkApiTokenRevoked method. - account-client: drop checkApiTokenRevoked. - transactor: withSession uses verifyToken; the registered checker reuses the existing getLoginInfoByToken instead of a dedicated boolean RPC. Scopes are parsed once and threaded through (no re-decode in the tx handler). - tests: verifyToken/isTokenExpired unit coverage. Signed-off-by: Don Kendall <dkendall@ledoweb.com> * fix(setting): derive REST API base from account-provided transactor endpoint Address @aonnikov: the REST API host must come from the transactor endpoint returned by the account service (the login endpoint, a ws(s):// URL), not be constructed from window.location. Convert ws->http and append /api/v1, matching the existing ServerManagerGeneral pattern. Signed-off-by: Don Kendall <dkendall@ledoweb.com> * i18n(setting): translate API token strings across all locales Address @ArtyomSavchenko: the new API token UI strings were left in English in non-en locales. Provide translations for ru/de/es/fr/it/pt/pt-br/zh/ja/cs/tr. The en/ru locale-parity test passes (the prior failure was an en/ru key mismatch, resolved by the develop merge). Signed-off-by: Don Kendall <dkendall@ledoweb.com> * style: wrap long lines to satisfy prettier (account utils import, ApiDocsSection) Signed-off-by: Don Kendall <dkendall@ledoweb.com> * fix(api-token): drop unenforceable scopes, harden the token lifecycle The scopes were only ever consulted in the transactor's REST handler, so they promised a boundary the platform did not keep: - the WebSocket transport decodes the token and never looks at scopes, so a read-only token could open a socket and issue any transaction; - even on the REST path, delete:* only matched a top-level TxRemoveDoc and was bypassed by nesting the removal in a TxApplyIf; - nothing stopped a scoped token from calling createApiToken and minting an unscoped one. Narrowing a token's rights has to happen in the pipeline, where it covers every transport, and that is a larger design than this feature. Until then a token carries its account's rights and says so, rather than displaying a restriction that does not hold. Scopes are removed end to end. What is kept is made to work: - API tokens can no longer create, list or revoke API tokens. Otherwise a leaked token renews itself and revokes the tokens meant to stop it. - Revocation fails closed. The account is the only authority on it, so an unreachable account now rejects the token instead of admitting a revoked one to whoever can keep the account busy. Verdicts stay trusted for the cache TTL so brief outages do not cut off healthy tokens. - The revocation cache is bounded and re-checks negative verdicts. - Revoking your own token no longer requires a role in its workspace, so leaving a workspace cannot strand a credential you can never revoke. - The per-account limit counts only usable tokens; revoked and expired ones are kept for the audit trail and used to lock out anyone rotating. - Rejected REST tokens are logged with a reason, since expired, revoked and unverifiable are one opaque 401 from outside. The unused listWorkspaceApiTokens/revokeWorkspaceApiToken pair is removed; it had no caller and no test. Tests cover the role restriction, the API-token guard, ownership on revoke, the limit accounting and fail-closed revocation. Removing any of those checks fails them. Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7 Signed-off-by: Don Kendall <dkendall@ledoweb.com> * fix(setting): correct the API token settings page - Moves the page from workspace settings to account settings. Tokens belong to the account: the page already lists them across every workspace, and creating one only needs the User role the account service checks, not Owner as the category required. - Surfaces failures. A failed revoke was logged to the console and the row re-rendered unchanged; loading workspaces could reject unhandled and leave an empty dropdown with no explanation. - Outside a secure context there is no clipboard API, so the OK button did nothing and the dialog had no way out but Cancel. It now closes, leaving the token selectable. - Replaces hardcoded English labels, adds aria-expanded on the docs disclosure and labels on the copy targets. - Fills in the Korean and Polish translations, which were the only two locales missing these keys, and drops the API access strings orphaned when this PR replaced the old Generate API token button. Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7 Signed-off-by: Don Kendall <dkendall@ledoweb.com> * chore: drop docs/openapi.yaml from the API token PR Unrelated to this feature and wrong for this repo: it documents a /_tokens minting service and a tools/mint-token CLI that do not exist here, uses reverse-proxy prefixes from a self-hosted deployment rather than the transactor's /api/v1 routes, and states that revocation is a future enhancement, which is what this PR implements. Nothing references it. REST API docs belong in their own change, generated against the routes that exist. Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7 Signed-off-by: Don Kendall <dkendall@ledoweb.com> --------- Signed-off-by: Don Kendall <kendall@donkendall.com> Signed-off-by: Don Kendall <dkendall@ledoweb.com>
287 lines
16 KiB
JSON
287 lines
16 KiB
JSON
{
|
||
"string": {
|
||
"Setting": "Impostazione",
|
||
"Spaces": "Spazi",
|
||
"Integrations": "Integrazioni",
|
||
"Support": "Supporto",
|
||
"Privacy": "Privacy",
|
||
"Terms": "Termini",
|
||
"AccountSettings": "Impostazioni account",
|
||
"Categories": "Categorie",
|
||
"Delete": "Elimina",
|
||
"ChangePassword": "Cambia password",
|
||
"Disconnect": "Disconnetti",
|
||
"DisconnectAll": "Disconnetti tutti",
|
||
"Saving": "Salvataggio...",
|
||
"Saved": "Salvato",
|
||
"Add": "Aggiungi",
|
||
"AddNew": "Aggiungi {type}",
|
||
"Proceed": "Procedi",
|
||
"NewEmail": "Nuova email",
|
||
"SendConfirmation": "Invia codice di conferma",
|
||
"CodeSent": "Il codice è stato inviato. Inseriscilo nel campo sottostante.",
|
||
"SendAgain": "Invia di nuovo",
|
||
"SendAgainIn": "Può essere inviato di nuovo tra",
|
||
"Value": "Valore",
|
||
"Signout": "Disconnettiti",
|
||
"Settings": "Impostazioni",
|
||
"SelectWorkspace": "Seleziona spazio di lavoro",
|
||
"InviteWorkspace": "Invita nello spazio di lavoro",
|
||
"DeleteStatus": "Elimina stato",
|
||
"DeleteStatusConfirm": "Vuoi eliminare questo stato?",
|
||
"Reconnect": "Riconnetti",
|
||
"IntegrationDisabled": " è stato disabilitato",
|
||
"IntegrationDisabledSetting": "Integrazione disabilitata",
|
||
"IntegrationDisabledDescr": "Integrazione disabilitata",
|
||
"IntegrationWith": "Integrazione con ",
|
||
"ClassSetting": "Impostazione di classe",
|
||
"ClassSettingHint": "Un insieme o categoria di cose che hanno qualche proprietà o attributo in comune.",
|
||
"ClassProperties": "Proprietà della classe",
|
||
"Classes": "Classi",
|
||
"Attributes": "Attributi",
|
||
"DeleteAttribute": "Elimina attributo",
|
||
"DeleteAttributeConfirm": "Vuoi eliminare questo attributo?",
|
||
"DeleteAttributeExistConfirm": "Vuoi eliminare questo attributo? I dati andranno persi",
|
||
"DeleteMixin": "Elimina Mixin",
|
||
"DeleteMixinConfirm": "Vuoi eliminare questo mixin?",
|
||
"DeleteMixinExistConfirm": "Vuoi eliminare questo mixin? I dati non saranno disponibili",
|
||
"Attribute": "Attributo",
|
||
"Custom": "Personalizzato",
|
||
"Type": "Tipo",
|
||
"WithTime": "Con tempo",
|
||
"DateMode": "Modalità data",
|
||
"CreatingAttribute": "Creazione di un attributo",
|
||
"EditAttribute": "Modifica attributo",
|
||
"CreateEnum": "Crea enum",
|
||
"EditEnum": "Modifica enum",
|
||
"Enums": "Enum",
|
||
"EnumsSettingHint": "Un insieme o categoria di cose che hanno qualche proprietà o attributo in comune.",
|
||
"EnumTitle": "Titolo enum",
|
||
"EnumsCount": "{count, plural, =1 {# opzione} other {# opzioni}}",
|
||
"ProjectTypesCount": "{count, plural, =0 {Nessun tipo di progetto} =1 {# tipo di progetto} other {# tipi di progetto}}",
|
||
"Options": "Opzioni",
|
||
"EnterOptionTitle": "Inserisci il titolo dell'opzione",
|
||
"NewEnumDialogClose": "Vuoi chiudere questa finestra?",
|
||
"NewEnumDialogCloseNote": "Tutte le modifiche andranno perse",
|
||
"NewValue": "Nuovo valore",
|
||
"Leave": "Lascia spazio di lavoro",
|
||
"LeaveDescr": "Sei sicuro di voler lasciare lo spazio di lavoro? Questa azione non può essere annullata.",
|
||
"Members": "Membri",
|
||
"WorkspaceSettings": "Impostazioni spazio di lavoro",
|
||
"Select": "Seleziona",
|
||
"AddOwner": "Aggiungi proprietario",
|
||
"ReadonlyGuest": "Sola lettura",
|
||
"Guest": "Ospite",
|
||
"User": "Utente",
|
||
"Maintainer": "Manutentore",
|
||
"Owner": "Proprietario",
|
||
"OwnerFirstName": "Nome del proprietario",
|
||
"OwnerLastName": "Cognome del proprietario",
|
||
"Role": "Ruolo",
|
||
"FailedToSave": "Impossibile aggiornare la password",
|
||
"ImportEnum": "Importa valori enum",
|
||
"ImportEnumCopy": "Copia valori enum dagli appunti",
|
||
"CreateMixin": "Crea Mixin",
|
||
"OldNames": "Vecchi valori",
|
||
"NewClassName": "Digita un nuovo nome di classe o seleziona dai valori precedenti...",
|
||
"ShowAttribute": "Mostra attributo",
|
||
"HideAttribute": "Nascondi attributo",
|
||
"Visibility": "Visibilità",
|
||
"Hidden": "Nascosto",
|
||
"Configure": "Configura",
|
||
"InviteSettings": "Impostazioni invito",
|
||
"RoleCapabilitySettings": "Autorizzazioni ruolo",
|
||
"DefaultInviteRoleForJoin": "Ruolo predefinito assegnato dopo l'accesso tramite link di invito:",
|
||
"InviteLinkGeneratorRoles": "Seleziona i ruoli utente che possono generare link di invito:",
|
||
"DefaultValue": "Valore predefinito",
|
||
"SelectAValue": "Seleziona un valore",
|
||
"DateOnly": "Solo data",
|
||
"OnlyTime": "Solo ora",
|
||
"DateAndTime": "Data e ora",
|
||
"Configuration": "Configurazione",
|
||
"ConfigurationEnabled": "Abilitato",
|
||
"ConfigurationDisabled": "Disabilitato",
|
||
"ConfigDisable": "Disabilita",
|
||
"ConfigEnable": "Abilita",
|
||
"ConfigBeta": "Versione beta",
|
||
"Properties": "Proprietà",
|
||
"TaskTypes": "Tipi di attività",
|
||
"Automations": "Automazioni",
|
||
"Collections": "Collezioni",
|
||
"ClassColon": "Classe:",
|
||
"SpaceTypes": "Tipi di spazio",
|
||
"NewSpaceType": "Nuovo tipo di spazio",
|
||
"SpaceTypeTitle": "Titolo tipo di spazio",
|
||
"General": "Generale",
|
||
"Description": "Descrizione",
|
||
"CountSpaces": "{count, plural, =0 {Nessuni spazi} =1 {# spazio} other {# spazi}}",
|
||
"Roles": "Ruoli",
|
||
"RoleName": "Nome ruolo",
|
||
"Permissions": "Permessi",
|
||
"Assignees": "Assegnatari",
|
||
"DeleteRole": "Elimina ruolo",
|
||
"DeleteRoleConfirmation": "Sei sicuro di voler eliminare questo ruolo? Tutti gli utenti con questo ruolo perderanno i loro permessi.",
|
||
"DeleteWorkspace": "Elimina spazio di lavoro",
|
||
"DeleteWorkspaceConfirm": "Sei sicuro di voler eliminare questo spazio di lavoro? Tu e tutti gli altri membri perderete l'accesso a questo spazio di lavoro. Tutte le informazioni dallo spazio di lavoro andranno perse. Questa azione non può essere annullata. Vuoi procedere?",
|
||
"DeleteSpaceType": "Elimina tipo di spazio",
|
||
"DeleteSpaceTypeConfirm": "Sei sicuro di voler eliminare questo tipo di spazio?",
|
||
"WorkspaceName": "Nome spazio di lavoro",
|
||
"Workspace": "Spazio di lavoro",
|
||
"OwnerOrMaintainerRequired": "Devi essere un proprietario o un manutentore dello spazio di lavoro",
|
||
"LastOwnerLeaveTitle": "Impossibile uscire dallo spazio di lavoro",
|
||
"LastOwnerLeaveMessage": "Sei l'unico proprietario di questo spazio di lavoro. Per uscire, assegna prima i permessi di proprietario a un altro membro. Se nessuno ha più bisogno di questo spazio di lavoro, valuta di eliminarlo.",
|
||
"Backup": "Backup",
|
||
"BackupLast": "Ultimo backup",
|
||
"BackupTotalSnapshots": "Totale istantanee",
|
||
"BackupTotalFiles": "File",
|
||
"BackupSize": "Dimensione backup",
|
||
"BackupLinkInfo": "L'URL di una directory di backup che può essere scaricata ricorsivamente utilizzando strumenti come wget o curl.",
|
||
"BackupBearerTokenInfo": "È richiesto un token di accesso per accedere al backup.",
|
||
"BackupSnapshots": "Istantanee di backup",
|
||
"BackupFileDownload": "Scarica file",
|
||
"BackupFiles": "File di backup",
|
||
"BackupNoBackup": "Non sono attualmente disponibili backup.",
|
||
"BackupDownloadAll": "Scarica backup completo",
|
||
"BackupPreparingDownload": "Preparazione del backup…",
|
||
"BackupDownloadAllInfo": "Scarica tutti i file di backup in un unico archivio .zip che puoi conservare sul tuo computer.",
|
||
"BackupCopyScript": "Copia script di download",
|
||
"BackupCopyToken": "Copia token",
|
||
"BackupScriptInfo": "Uno script shell che scarica tutti i file di backup con curl. Salvalo ed eseguilo in un terminale; richiederà il tuo token di backup, quindi nello script non vengono memorizzati segreti.",
|
||
"BackupRestoreGuide": "Guida a backup e ripristino",
|
||
"BackupRestoreGuideInfo": "Istruzioni dettagliate per scaricare questo backup e ripristinarlo in un'altra istanza di Huly.",
|
||
"NonBackupedBlobs": "Non Backed up blobs",
|
||
"Calendar": "Calendario",
|
||
"StartOfTheWeek": "Inizio settimana",
|
||
"SystemSetupString": "Configurazione del sistema ({day})",
|
||
"DefaultString": "Predefinito ({day})",
|
||
"AddAttribute": "Aggiungi attributo",
|
||
"WorkspaceNamePattern": "Il nome deve essere di 40 caratteri o meno, non vuoto e non può contenere caratteri speciali (<, >, /)",
|
||
"Mailboxes": "Mailboxes",
|
||
"CreateMailbox": "Crea casella di posta",
|
||
"CreateMailboxPlaceholder": "my-cool-name",
|
||
"MailboxNoDomains": "I domini di posta elettronica non sono configurati",
|
||
"MailboxLimitReached": "Limite di caselle di posta raggiunto",
|
||
"MailboxErrorInvalidName": "Il nome della casella di posta non è valido",
|
||
"MailboxErrorDomainNotFound": "Dominio non trovato",
|
||
"MailboxErrorNameRulesViolated": "Il nome della casella di posta deve essere lungo da {minLen} a {maxLen} caratteri",
|
||
"MailboxErrorMailboxExists": "Questo nome di casella di posta è già occupato",
|
||
"MailboxErrorMailboxCountLimit": "Limite di conteggio delle caselle di posta raggiunto per il tuo account",
|
||
"DeleteMailbox": "Elimina casella di posta",
|
||
"MailboxDeleteConfirmation": "Sei sicuro di voler eliminare questa casella di posta?",
|
||
"DisablePermissions": "Disabilita il controllo degli accessi basato sui ruoli",
|
||
"EnablePermissions": "Abilita il controllo degli accessi basato sui ruoli",
|
||
"DisablePermissionsConfirmation": "Sei sicuro di voler disabilitare il controllo degli accessi basato sui ruoli? Tutti i ruoli e le autorizzazioni verranno disabilitati.",
|
||
"EnablePermissionsConfirmation": "Sei sicuro di voler abilitare il controllo degli accessi basato sui ruoli? Tutti i ruoli e le autorizzazioni verranno abilitati.",
|
||
"BetaWarning": "I moduli contrassegnati come beta sono disponibili per scopi sperimentali e potrebbero non funzionare completamente. Non ti consigliamo di fare affidamento sulle funzionalità beta per il lavoro critico in questo momento.",
|
||
"IntegrationFailed": "Impossibile creare l'integrazione",
|
||
"IntegrationError": "Si prega di riprovare o contattare il supporto se il problema persiste",
|
||
"EmailIsUsed": "L'email è già in uso",
|
||
"Customize": "Personalizzare",
|
||
"GuestAccess": "Ospiti anonimi",
|
||
"GuestAccessDescription": "Consente agli utenti anonimi di accedere all'area di lavoro in modalità sola lettura",
|
||
"GuestSignUpDescription": "Consente agli utenti anonimi di unirsi al tuo spazio di lavoro come ospiti con diritti di modifica limitati",
|
||
"GuestChannelsDescription": "Canali in cui gli ospiti possono scrivere messaggi dopo essersi uniti",
|
||
"GuestChannelsArrayLabel": "Seleziona canali",
|
||
"GuestSelectSpaces": "Seleziona spazi",
|
||
"GuestAutoJoinAvailableSpaces": "Ingresso automatico negli spazi",
|
||
"GuestAutoJoinAvailableSpacesHint": "Ogni scheda applicazione ha la propria riga « Ingresso automatico negli spazi »: scegli dove vengono aggiunti gli ospiti all’attivazione. Le modifiche sono immediate.",
|
||
"GuestAnonymousVisibleSpaces": "Spazi visibili in anonimo",
|
||
"GuestAnonymousVisibleSpacesHint": "Ogni scheda applicazione ha la propria riga: scegli gli spazi in cui l’account anonimo in sola lettura viene aggiunto come membro, così i visitatori senza account possono aprirli. Le modifiche sono immediate.",
|
||
"ManageIdentities": "Gestisci identità",
|
||
"Release": "Rilascio",
|
||
"ReleaseSocialId": "Rilascia ID social",
|
||
"ReleaseSocialIdConfirm": "Sei sicuro di voler rilasciare questo ID social: {socialId}? Questo lo rimuoverà dal tuo account e non potrai più usarlo per accedere. Inoltre, tutte le integrazioni associate verranno rimosse.",
|
||
"ReleasePrimarySocialId": "Rilascia ID social primario",
|
||
"ReleasePrimarySocialIdConfirm": "Rilasciare il tuo ID social primario attuale richiederà il ricaricamento della pagina. Sei sicuro di voler procedere?",
|
||
"Login": "Accesso",
|
||
"Primary": "Primario",
|
||
"MyIntegrations": "Le mie integrazioni",
|
||
"AllIntegrations": "Tutte",
|
||
"ConnectedIntegrations": "Connesse",
|
||
"AvailableIntegrations": "Disponibili",
|
||
"Connect": "Connetti",
|
||
"Integrate": "Integra",
|
||
"FailedToLoadIntegrations": "Impossibile caricare le integrazioni",
|
||
"FailedToDisconnect": "Impossibile disconnettere l'integrazione",
|
||
"ServiceIsUnavailable": "Il servizio non è disponibile",
|
||
"Integrated": "Integrato",
|
||
"Connected": "Connesso",
|
||
"Disconnected": "Disconnesso",
|
||
"Available": "Disponibile",
|
||
"NotConnectedIntegration": "L'account {account} non è integrato con il workspace",
|
||
"IntegrationIsUnstable": "L'integrazione è instabile. Alcune funzionalità potrebbero non funzionare correttamente.",
|
||
"MinValue": "Valore minimo",
|
||
"Restricted": "Limitato",
|
||
"RestrictedAttributeWarning": "Sei sicuro di voler limitare la modifica di questo attributo? Questa azione creerà permessi per questo attributo e non può essere annullata.",
|
||
"MaxValue": "Valore massimo",
|
||
"IntegerOnly": "Solo numeri interi",
|
||
"AccessControl": "Controllo accessi",
|
||
"DangerZone": "Zona pericolosa",
|
||
"IdentifierExists": "Identificatore già esistente",
|
||
"PasswordAgingRule": "Regola di invecchiamento della password",
|
||
"PasswordAgingRuleDescription": "Numero di giorni dopo i quali agli utenti verrà richiesto di cambiare la password.",
|
||
"OfficeSettings": "Impostazioni dell'ufficio",
|
||
"OfficeDefaultSettings": "Impostazioni predefinite per le sale riunioni",
|
||
"DefaultStartWithTranscription": "Abilita trascrizione nelle nuove stanze dell'ufficio",
|
||
"DefaultStartWithRecording": "Abilita registrazione nelle nuove stanze dell'ufficio",
|
||
"GuestPermissionsSettings": "Ospiti",
|
||
"GuestPermissionsApplicationPermissions": "Permessi delle applicazioni",
|
||
"GuestPermissionsApplicationPermissionsHint": "Scegli quali applicazioni possono usare gli ospiti, poi regola i permessi per ogni applicazione qui sotto.",
|
||
"GuestPermissionsTabGuest": "Ospite",
|
||
"GuestPermissionsTabAnonymousGuest": "Ospite anonimo",
|
||
"GuestPermissionsAnonymousApplicationHint": "Accesso alle applicazioni per ospiti anonimi (sola lettura). Le applicazioni visibili possono dipendere anche dalla configurazione di distribuzione.",
|
||
"ImportDocumentPermission": "Importa documenti",
|
||
"ImportDocumentDescription": "Concede agli utenti la possibilità di importare documenti nell'area di lavoro",
|
||
"SelectUsers": "Seleziona utenti",
|
||
"ShowInTitle": "Mostra nel titolo",
|
||
"SpaceMembersOnly": "Solo membri dello spazio",
|
||
"Reset": "Reset",
|
||
"Security": "Sicurezza",
|
||
"TwoFactorAuth": "Autenticazione a due fattori",
|
||
"TwoFactorAuthDescription": "L'autenticazione a due fattori aggiunge un ulteriore livello di sicurezza al tuo account",
|
||
"EnableTwoFactorAuth": "Abilita autenticazione a due fattori",
|
||
"DisableTwoFactorAuth": "Disabilita autenticazione a due fattori",
|
||
"TwoFactorAuthEnabled": "L'autenticazione a due fattori è abilitata",
|
||
"TwoFactorAuthDisabled": "L'autenticazione a due fattori è disabilitata",
|
||
"ShowQRCode": "Mostra codice QR",
|
||
"EnterVerificationCode": "Inserisci codice di verifica",
|
||
"OverrideAttribute": "Sovrascrivi attributo",
|
||
"Required": "Richiesto",
|
||
"ApiBaseUrl": "URL di base",
|
||
"ApiEndpointAccount": "Ottieni le informazioni dell’account",
|
||
"ApiEndpointFindAll": "Interroga i documenti per classe",
|
||
"ApiEndpointFindAllPost": "Query con filtri (corpo JSON)",
|
||
"ApiEndpointLoadModel": "Carica il modello dati",
|
||
"ApiEndpointPing": "Controllo di stato",
|
||
"ApiEndpointTx": "Crea o aggiorna documenti",
|
||
"ApiTokenCopyWarning": "Copia subito questo token. Non potrai più visualizzarlo.",
|
||
"ApiTokenCreated": "Token creato",
|
||
"ApiTokenExpiry": "Scadenza",
|
||
"ApiTokenName": "Nome del token",
|
||
"ApiTokenNoTokens": "Nessun token API",
|
||
"ApiTokenRevoke": "Revoca token",
|
||
"ApiTokenRevokeConfirm": "Vuoi davvero revocare questo token? Non sarà più utilizzabile per l’accesso all’API.",
|
||
"ApiTokenWorkspace": "Area di lavoro",
|
||
"ApiTokens": "Token API",
|
||
"ApiUsageDescription": "Usa il tuo token API con l’API REST integrata per interrogare e modificare i dati dell’area di lavoro. Passa il token come token Bearer nell’intestazione Authorization.",
|
||
"ApiUsageTitle": "Utilizzo dell’API REST",
|
||
"ApiWorkspaceId": "L’ID della tua area di lavoro (UUID) è incluso nel token. Passalo come :workspaceId nell’URL.",
|
||
"CreateApiToken": "Crea token",
|
||
"Created": "Creato",
|
||
"Expires": "Scade",
|
||
"TokenStatus": "Stato",
|
||
"ApiTokenStatusActive": "Attivo",
|
||
"ApiTokenStatusExpiring": "In scadenza",
|
||
"ApiTokenStatusRevoked": "Revocato",
|
||
"ApiTokenStatusExpired": "Scaduto",
|
||
"ApiTokenExpiry7Days": "7 giorni",
|
||
"ApiTokenExpiry30Days": "30 giorni",
|
||
"ApiTokenExpiry90Days": "90 giorni",
|
||
"ApiTokenExpiry180Days": "180 giorni",
|
||
"ApiTokenExpiry365Days": "365 giorni",
|
||
"ApiTokenLoadError": "Impossibile caricare i token API",
|
||
"ApiTokenCreateError": "Impossibile creare il token. Riprova.",
|
||
"ApiTokenRevokeError": "Impossibile revocare il token. Riprova."
|
||
}
|
||
}
|