mirror of
https://github.com/hcengineering/platform.git
synced 2026-08-17 18:05:42 +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
17 KiB
JSON
287 lines
17 KiB
JSON
{
|
|
"string": {
|
|
"Setting": "Configuração",
|
|
"Spaces": "Espaços",
|
|
"Integrations": "Integrações",
|
|
"Support": "Suporte",
|
|
"Privacy": "Privacidade",
|
|
"Terms": "Termos",
|
|
"AccountSettings": "Configurações da conta",
|
|
"Categories": "Categorias",
|
|
"Delete": "Eliminar",
|
|
"ChangePassword": "Mudar senha",
|
|
"Disconnect": "Desconectar",
|
|
"DisconnectAll": "Desconectar todos",
|
|
"Saving": "Salvando...",
|
|
"Saved": "Salvo",
|
|
"Add": "Adicionar",
|
|
"AddNew": "Adicionar {type}",
|
|
"Proceed": "Prosseguir",
|
|
"NewEmail": "Novo email",
|
|
"SendConfirmation": "Enviar código de confirmação",
|
|
"CodeSent": "O código foi enviado. Por favor, digite-o no campo abaixo.",
|
|
"SendAgain": "Enviar novamente",
|
|
"SendAgainIn": "Pode enviar novamente em",
|
|
"Value": "Valor",
|
|
"Signout": "Sair",
|
|
"Settings": "Configurações",
|
|
"SelectWorkspace": "Selecionar espaço de trabalho",
|
|
"InviteWorkspace": "Convidar para o espaço de trabalho",
|
|
"DeleteStatus": "Eliminar status",
|
|
"DeleteStatusConfirm": "Deseja excluir este status?",
|
|
"Reconnect": "Reconectar",
|
|
"IntegrationDisabled": "foi desabilitado",
|
|
"IntegrationDisabledSetting": "A integração foi desabilitada",
|
|
"IntegrationDisabledDescr": "Integração desabilitada",
|
|
"IntegrationWith": "Integração com ",
|
|
"ClassSetting": "Configuração de classe",
|
|
"ClassSettingHint": "Um grupo ou categoria de coisas que têm alguma propriedade ou atributo em comum com outras por tipo, classe ou qualidade.",
|
|
"ClassProperties": "Propriedades da classe",
|
|
"Classes": "Classes",
|
|
"Attributes": "Atributos",
|
|
"DeleteAttribute": "Eliminar atributo",
|
|
"DeleteAttributeConfirm": "Deseja excluir este atributo?",
|
|
"DeleteAttributeExistConfirm": "Deseja excluir este atributo? Os dados serão perdidos",
|
|
"DeleteMixin": "Eliminar Mixin",
|
|
"DeleteMixinConfirm": "Deseja excluir este Mixin?",
|
|
"DeleteMixinExistConfirm": "Deseja excluir este Mixin? Os dados não estarão disponíveis",
|
|
"Attribute": "Atributo",
|
|
"Custom": "Personalizado",
|
|
"Type": "Tipo",
|
|
"WithTime": "Com hora",
|
|
"DateMode": "Modo de data",
|
|
"CreatingAttribute": "Criando um atributo",
|
|
"EditAttribute": "Editar atributo",
|
|
"CreateEnum": "Criar enumeração",
|
|
"EditEnum": "Editar enumeração",
|
|
"Enums": "Enumerações",
|
|
"EnumsSettingHint": "Um grupo ou categoria de coisas que têm alguma propriedade ou atributo em comum com outras por tipo, classe ou qualidade.",
|
|
"EnumTitle": "Título da enumeração",
|
|
"EnumsCount": "{count, plural, =1 {# opção} other {# opções}}",
|
|
"ProjectTypesCount": "{count, plural, =0 {Nenhum tipo de projeto} =1 {# tipo de projeto} other {# tipos de projeto}}",
|
|
"Options": "Opções",
|
|
"EnterOptionTitle": "Digite o título da opção",
|
|
"NewEnumDialogClose": "Deseja fechar esta caixa de diálogo?",
|
|
"NewEnumDialogCloseNote": "Todas as alterações serão perdidas",
|
|
"NewValue": "Novo valor",
|
|
"Leave": "Sair do espaço de trabalho",
|
|
"LeaveDescr": "Tem certeza de que deseja sair do espaço de trabalho? Esta ação não pode ser desfeita.",
|
|
"Members": "Membros",
|
|
"WorkspaceSettings": "Configurações do espaço de trabalho",
|
|
"Select": "Selecionar",
|
|
"AddOwner": "Adicionar proprietário",
|
|
"ReadonlyGuest": "Somente leitura",
|
|
"Guest": "Convidado",
|
|
"User": "Usuário",
|
|
"Maintainer": "Mantenedor",
|
|
"Owner": "Proprietário",
|
|
"OwnerFirstName": "Primeiro nome do proprietário",
|
|
"OwnerLastName": "Sobrenome do proprietário",
|
|
"Role": "Função",
|
|
"FailedToSave": "Falha ao atualizar a senha",
|
|
"ImportEnum": "Importar valores de enumeração",
|
|
"ImportEnumCopy": "Copiar valores de enumeração da área de transferência",
|
|
"CreateMixin": "Criar Mixin",
|
|
"OldNames": "Valores antigos",
|
|
"NewClassName": "Digite um novo nome para a classe ou selecione um dos valores anteriores...",
|
|
"ShowAttribute": "Mostrar atributo",
|
|
"HideAttribute": "Ocultar atributo",
|
|
"Visibility": "Visibilidade",
|
|
"Hidden": "Oculto",
|
|
"Configure": "Configurar",
|
|
"InviteSettings": "Configurações de convite",
|
|
"RoleCapabilitySettings": "Permissões de função",
|
|
"DefaultInviteRoleForJoin": "Função padrão atribuída após entrar por link de convite:",
|
|
"InviteLinkGeneratorRoles": "Selecione as funções de usuário que podem gerar links de convite:",
|
|
"DefaultValue": "Valor padrão",
|
|
"SelectAValue": "Selecionar um valor",
|
|
"DateOnly": "Somente data",
|
|
"OnlyTime": "Somente hora",
|
|
"DateAndTime": "Data e hora",
|
|
"Configuration": "Configuração",
|
|
"ConfigurationEnabled": "Ativado",
|
|
"ConfigurationDisabled": "Desativado",
|
|
"ConfigDisable": "Desativar",
|
|
"ConfigEnable": "Ativar",
|
|
"ConfigBeta": "Versão beta",
|
|
"Properties": "Propriedades",
|
|
"TaskTypes": "Tipos de tarefa",
|
|
"Automations": "Automações",
|
|
"Collections": "Coleções",
|
|
"ClassColon": "Classe:",
|
|
"Assignees": "Atribuídos",
|
|
"DeleteRole": "Eliminar função",
|
|
"DeleteRoleConfirmation": "Tem a certeza de que pretende eliminar esta função? Todos os utilizadores com esta função perderão as suas permissões.",
|
|
"DeleteWorkspace": "Eliminar espaço de trabalho",
|
|
"DeleteWorkspaceConfirm": "Tem certeza de que deseja excluir este espaço de trabalho? Você e todos os outros membros perderão o acesso a este espaço de trabalho. Todas as informações do espaço de trabalho serão perdidas. Esta ação não pode ser desfeita. Deseja prosseguir?",
|
|
"DeleteSpaceType": "Eliminar tipo de espaço",
|
|
"DeleteSpaceTypeConfirm": "Tem certeza de que deseja excluir este tipo de espaço?",
|
|
"WorkspaceName": "Nome do espaço de trabalho",
|
|
"Workspace": "Espaço de trabalho",
|
|
"OwnerOrMaintainerRequired": "Precisa ser proprietário ou mantenedor do espaço de trabalho",
|
|
"LastOwnerLeaveTitle": "Não é possível sair do espaço de trabalho",
|
|
"LastOwnerLeaveMessage": "Você é o único proprietário deste espaço de trabalho. Para sair, primeiro conceda permissões de proprietário a outro membro. Se ninguém mais precisar deste espaço de trabalho, considere excluí-lo.",
|
|
"Backup": "Backup",
|
|
"BackupLast": "Último backup",
|
|
"BackupTotalSnapshots": "Total de Snapshots",
|
|
"BackupTotalFiles": "Arquivos",
|
|
"BackupSize": "Tamanho do backup",
|
|
"BackupLinkInfo": "A URL de uma pasta de backup que pode ser baixado recursivamente usando ferramentas como wget ou curl.",
|
|
"BackupBearerTokenInfo": "É necessário um token bearer para acessar o backup.",
|
|
"BackupSnapshots": "Snapshots de Backup",
|
|
"BackupFileDownload": "Baixar Arquivo",
|
|
"BackupFiles": "Arquivos de Backup",
|
|
"BackupNoBackup": "Não há backups disponíveis no momento.",
|
|
"BackupDownloadAll": "Baixar backup completo",
|
|
"BackupPreparingDownload": "Preparando backup…",
|
|
"BackupDownloadAllInfo": "Baixe todos os arquivos de backup em um único arquivo .zip que você pode guardar no seu computador.",
|
|
"BackupCopyScript": "Copiar script de download",
|
|
"BackupCopyToken": "Copiar token",
|
|
"BackupScriptInfo": "Um script de shell que baixa todos os arquivos de backup com curl. Salve-o e execute-o em um terminal; ele solicitará seu token de backup, então nenhum segredo é armazenado no script.",
|
|
"BackupRestoreGuide": "Guia de backup e restauração",
|
|
"BackupRestoreGuideInfo": "Instruções passo a passo para baixar este backup e restaurá-lo em outra instância do Huly.",
|
|
"NonBackupedBlobs": "Blobs sem backup",
|
|
"Calendar": "Calendário",
|
|
"StartOfTheWeek": "Início da semana",
|
|
"SystemSetupString": "Configuração do sistema ({day})",
|
|
"DefaultString": "Predefinição ({day})",
|
|
"AddAttribute": "Adicionar atributo",
|
|
"WorkspaceNamePattern": "O nome deve ter 40 caracteres ou menos, não estar vazio e não pode conter caracteres especiais (<, >, /)",
|
|
"Mailboxes": "Caixas de entrada",
|
|
"CreateMailbox": "Criar caixa de entrada",
|
|
"CreateMailboxPlaceholder": "o-meu-nome-cool",
|
|
"MailboxNoDomains": "Os domínios de e-mail não estão configurados",
|
|
"MailboxLimitReached": "Limite de caixa de entrada atingido",
|
|
"MailboxErrorInvalidName": "O nome da caixa de entrada é inválido",
|
|
"MailboxErrorDomainNotFound": "Domínio não encontrado",
|
|
"MailboxErrorNameRulesViolated": "O nome da caixa de entrada deve ter de {minLen} a {maxLen} caracteres",
|
|
"MailboxErrorMailboxExists": "Este nome de caixa de entrada já está ocupado",
|
|
"MailboxErrorMailboxCountLimit": "O limite de contagem de caixas de entrada foi atingido para a sua conta",
|
|
"DeleteMailbox": "Apagar caixa de entrada",
|
|
"MailboxDeleteConfirmation": "Tem a certeza de que deseja excluir esta caixa de entrada?",
|
|
"DisablePermissions": "Desativar controle de acesso baseado em funções",
|
|
"EnablePermissions": "Ativar controle de acesso baseado em funções",
|
|
"DisablePermissionsConfirmation": "Tem certeza de que deseja desativar o controle de acesso baseado em funções? Todos os papéis e permissões serão desativados.",
|
|
"EnablePermissionsConfirmation": "Tem certeza de que deseja ativar o controle de acesso baseado em funções? Todos os papéis e permissões serão ativados.",
|
|
"BetaWarning": "Módulos marcados como beta estão disponíveis de maneira experimental e podem não funcionar totalmente. Não recomendamos depender de funcionalidades beta para trabalhos críticos no momento.",
|
|
"IntegrationFailed": "Falha na integração",
|
|
"IntegrationError": "Tente novamente ou entre em contato com o suporte se o problema persistir",
|
|
"EmailIsUsed": "Este e-mail já está em uso",
|
|
"Customize": "Personalizar",
|
|
"GuestAccess": "Convidados anônimos",
|
|
"GuestAccessDescription": "Permite que usuários anônimos acessem seu espaço de trabalho em modo somente leitura",
|
|
"GuestSignUpDescription": "Permite que usuários anônimos entrem em seu espaço de trabalho como convidados com direitos de edição limitados",
|
|
"GuestChannelsDescription": "Canais onde convidados podem escrever mensagens após entrar",
|
|
"GuestChannelsArrayLabel": "Selecionar canais",
|
|
"GuestSelectSpaces": "Selecionar espaços",
|
|
"GuestAutoJoinAvailableSpaces": "Adesão automática a espaços",
|
|
"GuestAutoJoinAvailableSpacesHint": "Cada cartão de app tem sua própria linha « Adesão automática a espaços »: escolha onde os convidados são adicionados ao ativarem. As alterações são aplicadas na hora.",
|
|
"GuestAnonymousVisibleSpaces": "Espaços visíveis de forma anônima",
|
|
"GuestAnonymousVisibleSpacesHint": "Cada cartão de app tem sua própria linha: escolha os espaços em que a conta anônima somente leitura é adicionada como membro para que visitantes sem conta possam abri-los. As alterações são aplicadas na hora.",
|
|
"ManageIdentities": "Gerenciar identidades",
|
|
"Release": "Liberação",
|
|
"ReleaseSocialId": "Liberar ID social",
|
|
"ReleaseSocialIdConfirm": "Tem certeza de que deseja liberar este ID social: {socialId}? Isso o removerá da sua conta e você não poderá mais usá-lo para fazer login. Além disso, todas as integrações associadas serão removidas.",
|
|
"ReleasePrimarySocialId": "Liberar ID social primário",
|
|
"ReleasePrimarySocialIdConfirm": "Liberar seu ID social primário atual exigirá que a página seja recarregada. Tem certeza de que deseja prosseguir?",
|
|
"Login": "Login",
|
|
"Primary": "Primário",
|
|
"MyIntegrations": "Minhas integrações",
|
|
"AllIntegrations": "Todas",
|
|
"ConnectedIntegrations": "Conectadas",
|
|
"AvailableIntegrations": "Disponíveis",
|
|
"Connect": "Conectar",
|
|
"Integrate": "Integrar",
|
|
"FailedToLoadIntegrations": "Falha ao carregar integrações",
|
|
"FailedToDisconnect": "Falha ao desconectar a integração",
|
|
"ServiceIsUnavailable": "Serviço indisponível",
|
|
"Integrated": "Integrado",
|
|
"Connected": "Conectado",
|
|
"Disconnected": "Desconectado",
|
|
"Available": "Disponível",
|
|
"NotConnectedIntegration": "A conta {account} não está integrada com o espaço de trabalho",
|
|
"IntegrationIsUnstable": "O serviço de integração está enfrentando problemas. Algumas funcionalidades podem não funcionar corretamente.",
|
|
"MinValue": "Valor mínimo",
|
|
"Restricted": "Restringido",
|
|
"RestrictedAttributeWarning": "Tem certeza de que deseja restringir a alteração deste atributo? Esta ação criará permissões para este atributo e não pode ser desfeita.",
|
|
"MaxValue": "Valor máximo",
|
|
"IntegerOnly": "Apenas números inteiros",
|
|
"AccessControl": "Controle de acesso",
|
|
"DangerZone": "Zona de perigo",
|
|
"IdentifierExists": "Identificador já existe",
|
|
"PasswordAgingRule": "Regra de envelhecimento de senha",
|
|
"PasswordAgingRuleDescription": "Número de dias após os quais os usuários serão obrigados a alterar sua senha.",
|
|
"OfficeSettings": "Configurações do escritório",
|
|
"OfficeDefaultSettings": "Configurações padrão para salas de reunião",
|
|
"DefaultStartWithTranscription": "Habilitar transcrição em novos escritórios",
|
|
"DefaultStartWithRecording": "Habilitar gravação em novos escritórios",
|
|
"GuestPermissionsSettings": "Convidados",
|
|
"GuestPermissionsApplicationPermissions": "Permissões de aplicativos",
|
|
"GuestPermissionsApplicationPermissionsHint": "Escolha quais aplicativos os convidados podem usar e, em seguida, ajuste as permissões de cada aplicativo abaixo.",
|
|
"GuestPermissionsTabGuest": "Convidado",
|
|
"GuestPermissionsTabAnonymousGuest": "Convidado anônimo",
|
|
"GuestPermissionsAnonymousApplicationHint": "Acesso a aplicativos para convidados anônimos (somente leitura). Os aplicativos visíveis também podem depender da configuração de implantação.",
|
|
"ImportDocumentPermission": "Importar documentos",
|
|
"ImportDocumentDescription": "Concede aos usuários a capacidade de importar documentos para o espaço de trabalho",
|
|
"SelectUsers": "Selecionar usuários",
|
|
"ShowInTitle": "Mostrar no título",
|
|
"SpaceMembersOnly": "Apenas membros do espaço",
|
|
"Reset": "Reiniciar",
|
|
"Security": "Segurança",
|
|
"TwoFactorAuth": "Autenticação de dois fatores",
|
|
"TwoFactorAuthDescription": "A autenticação de dois fatores adiciona uma camada extra de segurança à sua conta",
|
|
"EnableTwoFactorAuth": "Ativar autenticação de dois fatores",
|
|
"DisableTwoFactorAuth": "Desativar autenticação de dois fatores",
|
|
"TwoFactorAuthEnabled": "Autenticação de dois fatores está ativada",
|
|
"TwoFactorAuthDisabled": "Autenticação de dois fatores está desativada",
|
|
"ShowQRCode": "Mostrar código QR",
|
|
"EnterVerificationCode": "Inserir código de verificação",
|
|
"OverrideAttribute": "Sobrescrever atributo",
|
|
"Required": "Obrigatório",
|
|
"ApiBaseUrl": "URL base",
|
|
"ApiEndpointAccount": "Obter informações da conta",
|
|
"ApiEndpointFindAll": "Consultar documentos por classe",
|
|
"ApiEndpointFindAllPost": "Consulta com filtros (corpo JSON)",
|
|
"ApiEndpointLoadModel": "Carregar o modelo de dados",
|
|
"ApiEndpointPing": "Verificação de integridade",
|
|
"ApiEndpointTx": "Criar ou atualizar documentos",
|
|
"ApiTokenCopyWarning": "Copie este token agora. Você não poderá vê-lo novamente.",
|
|
"ApiTokenCreated": "Token criado",
|
|
"ApiTokenExpiry": "Expiração",
|
|
"ApiTokenName": "Nome do token",
|
|
"ApiTokenNoTokens": "Ainda não há tokens de API",
|
|
"ApiTokenRevoke": "Revogar token",
|
|
"ApiTokenRevokeConfirm": "Tem certeza de que deseja revogar este token? Ele não poderá mais ser usado para acesso à API.",
|
|
"ApiTokenWorkspace": "Espaço de trabalho",
|
|
"ApiTokens": "Tokens de API",
|
|
"ApiUsageDescription": "Use seu token de API com a API REST integrada para consultar e modificar os dados do espaço de trabalho. Passe o token como token Bearer no cabeçalho Authorization.",
|
|
"ApiUsageTitle": "Usando a API REST",
|
|
"ApiWorkspaceId": "O ID do seu espaço de trabalho (UUID) está incluído no token. Passe-o como :workspaceId na URL.",
|
|
"CountSpaces": "{count, plural, =0 {No spaces} =1 {# space} other {# spaces}}",
|
|
"CreateApiToken": "Criar token",
|
|
"Created": "Criado",
|
|
"Description": "Description",
|
|
"Expires": "Expira",
|
|
"General": "General",
|
|
"NewSpaceType": "New space type",
|
|
"Permissions": "Permissions",
|
|
"RoleName": "Role name",
|
|
"Roles": "Roles",
|
|
"SpaceTypeTitle": "Space type title",
|
|
"SpaceTypes": "Space types",
|
|
"TokenStatus": "Status",
|
|
"ApiTokenStatusActive": "Ativo",
|
|
"ApiTokenStatusExpiring": "Expirando",
|
|
"ApiTokenStatusRevoked": "Revogado",
|
|
"ApiTokenStatusExpired": "Expirado",
|
|
"ApiTokenExpiry7Days": "7 dias",
|
|
"ApiTokenExpiry30Days": "30 dias",
|
|
"ApiTokenExpiry90Days": "90 dias",
|
|
"ApiTokenExpiry180Days": "180 dias",
|
|
"ApiTokenExpiry365Days": "365 dias",
|
|
"ApiTokenLoadError": "Falha ao carregar os tokens de API",
|
|
"ApiTokenCreateError": "Falha ao criar o token. Tente novamente.",
|
|
"ApiTokenRevokeError": "Falha ao revogar o token. Tente novamente."
|
|
}
|
|
}
|