From 12bcf65f7d02d550f339cf7d5048e323cfaa1fb2 Mon Sep 17 00:00:00 2001 From: Daniel Pinto Date: Mon, 28 Oct 2024 01:14:00 +0000 Subject: [PATCH 01/18] locale: Add pt-PT translations (#4064) * locale: Add pt-PT translations * fix str --- web/src/i18n.ts | 1 + web/src/locales/pt-PT.json | 312 +++++++++++++++++++++++++++++++++++++ 2 files changed, 313 insertions(+) create mode 100644 web/src/locales/pt-PT.json diff --git a/web/src/i18n.ts b/web/src/i18n.ts index a522ba9c..4fe51acd 100644 --- a/web/src/i18n.ts +++ b/web/src/i18n.ts @@ -19,6 +19,7 @@ export const locales = [ "mr", "nl", "pl", + "pt-PT", "pt-BR", "ru", "sl", diff --git a/web/src/locales/pt-PT.json b/web/src/locales/pt-PT.json new file mode 100644 index 00000000..1a7f9520 --- /dev/null +++ b/web/src/locales/pt-PT.json @@ -0,0 +1,312 @@ +{ + "auth": { + "create-your-account": "Crie a sua conta", + "host-tip": "Está a registar-se como o Anfitrião do Site.", + "new-password": "Nova palavra-passe", + "repeat-new-password": "Repita a nova palavra-passe", + "sign-in-tip": "Já tem uma conta?", + "sign-up-tip": "Ainda não tem uma conta?" + }, + "common": { + "about": "Sobre", + "add": "Adicionar", + "admin": "Administrador", + "archive": "Arquivar", + "archived": "Arquivado", + "avatar": "Avatar", + "basic": "Básico", + "beta": "Beta", + "cancel": "Cancelar", + "change": "Alterar", + "clear": "Limpar", + "close": "Fechar", + "confirm": "Confirmar", + "collapse": "Recolher", + "create": "Criar", + "database": "Base de dados", + "days": "Dias", + "delete": "Eliminar", + "description": "Descrição", + "edit": "Editar", + "email": "Email", + "expand": "Expandir", + "explore": "Explorar", + "file": "Ficheiro", + "filter": "Filtrar", + "home": "Início", + "image": "Imagem", + "inbox": "Notificações", + "language": "Idioma", + "learn-more": "Saiba mais", + "link": "Link", + "mark": "Marcar", + "memos": "Memos", + "name": "Nome", + "new": "Novo", + "nickname": "Apelido", + "null": "Nulo", + "or": "ou", + "password": "Palavra-passe", + "pin": "Afixar", + "pinned": "Afixado", + "preview": "Pré-visualizar", + "profile": "Perfil", + "remember-me": "Lembrar-me", + "rename": "Renomear", + "reset": "Reiniciar", + "resources": "Recursos", + "restore": "Restaurar", + "role": "Função", + "save": "Guardar", + "search": "Pesquisar", + "select": "Selecionar", + "settings": "Definições", + "share": "Partilhar", + "sign-in": "Iniciar sessão", + "sign-in-with": "Iniciar sessão com {{provider}}", + "sign-out": "Terminar sessão", + "sign-up": "Registar-se", + "statistics": "Estatísticas", + "tags": "Etiquetas", + "title": "Título", + "type": "Tipo", + "unpin": "Desafixar", + "update": "Atualizar", + "upload": "Carregar", + "username": "Nome de utilizador", + "version": "Versão", + "visibility": "Visibilidade", + "yourself": "Você próprio" + }, + "days": { + "fri": "Sex", + "mon": "Seg", + "sat": "Sáb", + "sun": "Dom", + "thu": "Qui", + "tue": "Ter", + "wed": "Qua" + }, + "editor": { + "add-your-comment-here": "Adicione o seu comentário aqui...", + "any-thoughts": "Alguma ideia…", + "save": "Guardar" + }, + "inbox": { + "memo-comment": "{{user}} deixou um comentário no seu {{memo}}.", + "version-update": "A nova versão {{version}} está agora disponível!" + }, + "memo": { + "archived-at": "Arquivado em", + "comment": { + "self": "Comentários", + "write-a-comment": "Escreva um comentário" + }, + "copy-link": "Copiar link", + "count-memos-in-date": "{{count}} memos em {{date}}", + "delete-confirm": "Tem a certeza de que quer eliminar este memo? ESTA AÇÃO É IRREVERSÍVEL", + "load-more": "Carregar mais", + "no-archived-memos": "Não existem memos arquivados.", + "search-placeholder": "Pesquisar memos", + "show-more": "Mostrar mais", + "view-detail": "Ver detalhes", + "visibility": { + "disabled": "Memos públicos estão desativados", + "private": "Privado", + "protected": "Protegido", + "public": "Público" + }, + "links": "Links", + "to-do": "Tarefas", + "code": "Código" + }, + "message": { + "archived-successfully": "Arquivado com sucesso", + "change-memo-created-time": "Alterar a data de criação do memo", + "copied": "Copiado", + "deleted-successfully": "Eliminado com sucesso", + "fill-all": "Por favor, preencha todos os campos.", + "maximum-upload-size-is": "O tamanho máximo permitido para carregamento é {{size}} MiB", + "memo-not-found": "Memo não encontrado.", + "new-password-not-match": "As novas palavras-passe não coincidem.", + "no-data": "Nenhum dado encontrado.", + "password-changed": "Palavra-passe alterada", + "password-not-match": "As palavras-passe não coincidem.", + "restored-successfully": "Restaurado com sucesso", + "succeed-copy-link": "Link copiado com sucesso.", + "update-succeed": "Atualização bem-sucedida", + "user-not-found": "Utilizador não encontrado" + }, + "reference": { + "add-references": "Adicionar referências", + "embedded-usage": "Usar como conteúdo incorporado", + "no-memos-found": "Não foram encontrados memos", + "search-placeholder": "Pesquisar conteúdo" + }, + "resource": { + "clear": "Limpar", + "copy-link": "Copiar link", + "create-dialog": { + "external-link": { + "file-name": "Nome do ficheiro", + "file-name-placeholder": "Nome do ficheiro", + "link": "Link", + "link-placeholder": "https://o.link.para/o/seu/recurso", + "option": "Link externo", + "type": "Tipo", + "type-placeholder": "Tipo de ficheiro" + }, + "local-file": { + "choose": "Escolha um ficheiro…", + "option": "Ficheiro local" + }, + "title": "Criar Recurso", + "upload-method": "Método de carregamento" + }, + "delete-resource": "Eliminar Recurso", + "delete-selected-resources": "Eliminar Recursos Selecionados", + "fetching-data": "A obter dados…", + "file-drag-drop-prompt": "Arraste e largue o seu ficheiro aqui para carregar", + "linked-amount": "Quantidade associada", + "no-files-selected": "Nenhum ficheiro selecionado", + "no-resources": "Sem recursos.", + "no-unused-resources": "Sem recursos não utilizados", + "reset-link": "Reiniciar Link", + "reset-link-prompt": "Tem a certeza de que deseja reiniciar o link? Isto irá quebrar todos os usos atuais. ESTA AÇÃO É IRREVERSÍVEL", + "reset-resource-link": "Reiniciar Link do Recurso" + }, + "router": { + "back-to-top": "Voltar ao Topo", + "go-to-home": "Ir para a Página Inicial" + }, + "setting": { + "account-section": { + "change-password": "Alterar palavra-passe", + "email-note": "Opcional", + "export-memos": "Exportar Memos", + "nickname-note": "Exibido no banner", + "openapi-reset": "Reiniciar Chave OpenAPI", + "openapi-sample-post": "Olá #memos de {{url}}", + "openapi-title": "OpenAPI", + "reset-api": "Reiniciar API", + "title": "Informações da Conta", + "update-information": "Atualizar Informações", + "username-note": "Usado para iniciar sessão" + }, + "appearance-option": { + "dark": "Sempre escuro", + "light": "Sempre claro", + "system": "Seguir sistema" + }, + "member": "Membro", + "member-list": "Lista de membros", + "member-section": { + "archive-member": "Arquivar membro", + "archive-warning": "Tem a certeza de que deseja arquivar {{username}}?", + "create-a-member": "Criar um membro", + "delete-member": "Eliminar Membro", + "delete-warning": "Tem a certeza de que deseja eliminar {{username}}? ESTA AÇÃO É IRREVERSÍVEL" + }, + "my-account": "A Minha Conta", + "preference": "Preferências", + "preference-section": { + "default-memo-sort-option": "Ordenação padrão dos memos", + "default-memo-visibility": "Visibilidade padrão dos memos", + "theme": "Tema" + }, + "sso": "SSO", + "sso-section": { + "authorization-endpoint": "Ponto de Autorização", + "client-id": "ID do Cliente", + "client-secret": "Segredo do Cliente", + "confirm-delete": "Tem a certeza de que deseja eliminar a configuração \"{{name}}\" do SSO? ESTA AÇÃO É IRREVERSÍVEL", + "create-sso": "Criar SSO", + "custom": "Personalizado", + "delete-sso": "Confirmar eliminação", + "disabled-password-login-warning": "O login por palavra-passe está desativado, tenha cuidado ao remover provedores de identidade", + "display-name": "Nome de Exibição", + "identifier": "Identificador", + "identifier-filter": "Filtro de Identificador", + "redirect-url": "URL de Redirecionamento", + "scopes": "Âmbitos", + "sso-created": "SSO {{name}} criado", + "sso-list": "Lista de SSO", + "sso-updated": "SSO {{name}} atualizado", + "template": "Modelo", + "token-endpoint": "Ponto de Token", + "update-sso": "Atualizar SSO", + "user-endpoint": "Ponto do Utilizador" + }, + "storage": "Armazenamento", + "storage-section": { + "accesskey": "Chave de Acesso", + "accesskey-placeholder": "Chave de Acesso / ID de Acesso", + "bucket": "Bucket", + "bucket-placeholder": "Nome do Bucket", + "create-a-service": "Criar um serviço", + "create-storage": "Criar Armazenamento", + "current-storage": "Armazenamento de objetos atual", + "delete-storage": "Eliminar Armazenamento", + "endpoint": "Ponto Final", + "local-storage-path": "Caminho do Armazenamento Local", + "path": "Caminho do Armazenamento", + "path-description": "Pode usar variáveis dinâmicas como {filename}", + "path-placeholder": "caminho/personalizado", + "presign-placeholder": "URL de pré-assinatura, opcional", + "region": "Região", + "region-placeholder": "Nome da Região", + "s3-compatible-url": "URL compatível com S3", + "secretkey": "Chave Secreta", + "secretkey-placeholder": "Chave Secreta / Chave de Acesso", + "storage-services": "Serviços de Armazenamento", + "type-database": "Base de Dados", + "type-local": "Sistema de ficheiros local", + "update-a-service": "Atualizar um serviço", + "update-local-path": "Atualizar Caminho do Armazenamento Local", + "update-local-path-description": "O caminho do armazenamento local é relativo ao seu ficheiro de base de dados", + "update-storage": "Atualizar Armazenamento", + "url-prefix": "Prefixo de URL", + "url-prefix-placeholder": "Prefixo de URL personalizado, opcional", + "url-suffix": "Sufixo de URL", + "url-suffix-placeholder": "Sufixo de URL personalizado, opcional", + "warning-text": "Tem a certeza de que deseja eliminar o serviço de armazenamento \"{{name}}\"? ESTA AÇÃO É IRREVERSÍVEL" + }, + "system": "Sistema", + "system-section": { + "additional-script": "Script adicional", + "additional-script-placeholder": "Código JavaScript adicional", + "additional-style": "Estilo adicional", + "additional-style-placeholder": "Código CSS adicional", + "allow-user-signup": "Permitir registo de utilizadores", + "customize-server": { + "appearance": "Aparência do Servidor", + "description": "Descrição", + "icon-url": "URL do Ícone", + "locale": "Localização do Servidor", + "title": "Personalizar Servidor" + }, + "disable-password-login": "Desativar login por palavra-passe", + "disable-password-login-final-warning": "Escreva \"CONFIRM\" se tiver a certeza.", + "disable-password-login-warning": "Isto desativará o login para todos. Deve ter cuidado ao remover um provedor de identidade", + "disable-public-memos": "Desativar memos públicos", + "disable-markdown-shortcuts-in-editor": "Desativar atalhos Markdown", + "display-with-updated-time": "Exibir com hora atualizada", + "enable-auto-compact": "Ativar compactação automática", + "enable-double-click-to-edit": "Ativar duplo clique para editar", + "enable-password-login": "Ativar login por palavra-passe", + "enable-password-login-warning": "Isto permitirá login por palavra-passe e SSO", + "max-upload-size": "Tamanho máximo (MiB)", + "max-upload-size-hint": "32 MiB é recomendado.", + "server-name": "Nome do Servidor" + }, + "memo-related": "Memo" + }, + "tag": { + "all-tags": "Todas as Etiquetas", + "create-tag": "Criar Etiqueta", + "create-tags-guide": "Pode criar etiquetas digitando `#etiqueta`.", + "delete-confirm": "Tem a certeza que quer eliminar esta etiqueta? Memos associados serão arquivados.", + "delete-tag": "Eliminar Etiqueta", + "no-tag-found": "Nenhuma etiqueta encontrada" + } +} From db2b34a850467cf8032e6f79289f28b66157aa7e Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 28 Oct 2024 22:04:52 +0800 Subject: [PATCH 02/18] chore: update input source --- web/package.json | 2 +- web/pnpm-lock.yaml | 10 +++---- .../components/ChangeMemberPasswordDialog.tsx | 3 +- .../components/CreateAccessTokenDialog.tsx | 4 +-- .../CreateIdentityProviderDialog.tsx | 4 +-- web/src/components/CreateWebhookDialog.tsx | 3 +- .../ActionButton/LocationSelector.tsx | 29 +++++++++---------- web/src/components/PasswordSignInForm.tsx | 3 +- web/src/components/RenameTagDialog.tsx | 15 +++------- web/src/components/Settings/MemberSection.tsx | 4 +-- .../Settings/MemoRelatedSettings.tsx | 4 +-- .../components/Settings/StorageSection.tsx | 13 ++------- web/src/components/UpdateAccountDialog.tsx | 6 ++-- .../UpdateCustomizedProfileDialog.tsx | 3 +- web/src/pages/Resources.tsx | 4 +-- web/src/pages/SignUp.tsx | 3 +- 16 files changed, 45 insertions(+), 65 deletions(-) diff --git a/web/package.json b/web/package.json index e36918e8..8dcf1f3c 100644 --- a/web/package.json +++ b/web/package.json @@ -19,7 +19,7 @@ "@mui/joy": "5.0.0-beta.48", "@radix-ui/react-popover": "^1.1.2", "@reduxjs/toolkit": "^2.3.0", - "@usememos/mui": "0.0.1-alpha.14", + "@usememos/mui": "0.0.1-alpha.20", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "copy-to-clipboard": "^3.3.3", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 8304698d..ccaa518a 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: ^2.3.0 version: 2.3.0(react-redux@9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1))(react@18.3.1) '@usememos/mui': - specifier: 0.0.1-alpha.14 - version: 0.0.1-alpha.14(lucide-react@0.453.0(react@18.3.1))(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss@3.4.14) + specifier: 0.0.1-alpha.20 + version: 0.0.1-alpha.20(lucide-react@0.453.0(react@18.3.1))(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss@3.4.14) class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -1409,8 +1409,8 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@usememos/mui@0.0.1-alpha.14': - resolution: {integrity: sha512-KzLIWkTPVisukxfa6j9LtCmlJpO3QxOe9JFwUDV6AkIqw4QKkVK6Rl+DZu8N9uKSoAiNbg6gbu9vj+Ox3crmug==} + '@usememos/mui@0.0.1-alpha.20': + resolution: {integrity: sha512-O0wvI5z+ndKHLek+Be5t8e+KOSxPf0gHKJh8wu+M05bSzMldqs1dlm0kaP4bSW5rUifOybrEe0IUsesyg+eJzQ==} peerDependencies: lucide-react: ^0.453.0 postcss: ^8.4.47 @@ -4642,7 +4642,7 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@usememos/mui@0.0.1-alpha.14(lucide-react@0.453.0(react@18.3.1))(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss@3.4.14)': + '@usememos/mui@0.0.1-alpha.20(lucide-react@0.453.0(react@18.3.1))(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss@3.4.14)': dependencies: lucide-react: 0.453.0(react@18.3.1) postcss: 8.4.47 diff --git a/web/src/components/ChangeMemberPasswordDialog.tsx b/web/src/components/ChangeMemberPasswordDialog.tsx index f1aafe41..c732e1e1 100644 --- a/web/src/components/ChangeMemberPasswordDialog.tsx +++ b/web/src/components/ChangeMemberPasswordDialog.tsx @@ -1,5 +1,4 @@ -import { Input } from "@mui/joy"; -import { Button } from "@usememos/mui"; +import { Button, Input } from "@usememos/mui"; import { XIcon } from "lucide-react"; import { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; diff --git a/web/src/components/CreateAccessTokenDialog.tsx b/web/src/components/CreateAccessTokenDialog.tsx index 0cc22523..e46cec33 100644 --- a/web/src/components/CreateAccessTokenDialog.tsx +++ b/web/src/components/CreateAccessTokenDialog.tsx @@ -1,5 +1,5 @@ -import { Input, Radio, RadioGroup } from "@mui/joy"; -import { Button } from "@usememos/mui"; +import { Radio, RadioGroup } from "@mui/joy"; +import { Button, Input } from "@usememos/mui"; import { XIcon } from "lucide-react"; import React, { useState } from "react"; import { toast } from "react-hot-toast"; diff --git a/web/src/components/CreateIdentityProviderDialog.tsx b/web/src/components/CreateIdentityProviderDialog.tsx index 67574e49..b835a20e 100644 --- a/web/src/components/CreateIdentityProviderDialog.tsx +++ b/web/src/components/CreateIdentityProviderDialog.tsx @@ -1,5 +1,5 @@ -import { Divider, Input, Option, Select, Typography } from "@mui/joy"; -import { Button } from "@usememos/mui"; +import { Divider, Option, Select, Typography } from "@mui/joy"; +import { Button, Input } from "@usememos/mui"; import { XIcon } from "lucide-react"; import { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; diff --git a/web/src/components/CreateWebhookDialog.tsx b/web/src/components/CreateWebhookDialog.tsx index 03d5583d..441e1607 100644 --- a/web/src/components/CreateWebhookDialog.tsx +++ b/web/src/components/CreateWebhookDialog.tsx @@ -1,5 +1,4 @@ -import { Input } from "@mui/joy"; -import { Button } from "@usememos/mui"; +import { Button, Input } from "@usememos/mui"; import { XIcon } from "lucide-react"; import React, { useEffect, useState } from "react"; import { toast } from "react-hot-toast"; diff --git a/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx b/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx index 2e91a400..862803f0 100644 --- a/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx +++ b/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx @@ -1,5 +1,4 @@ -import { Input } from "@mui/joy"; -import { Button } from "@usememos/mui"; +import { Button, Input } from "@usememos/mui"; import { LatLng } from "leaflet"; import { MapPinIcon, XIcon } from "lucide-react"; import { useEffect, useState } from "react"; @@ -111,19 +110,19 @@ const LocationSelector = (props: Props) => {
- - [{state.position.lat.toFixed(3)}, {state.position.lng.toFixed(3)}] - - ) : null - } - onChange={(e) => setState((state) => ({ ...state, placeholder: e.target.value }))} - /> +
+ {state.position && ( + + [{state.position.lat.toFixed(2)}, {state.position.lng.toFixed(2)}] + + )} + setState((state) => ({ ...state, placeholder: e.target.value }))} + /> +
{workspaceStorageSetting.storageType !== WorkspaceStorageSetting_StorageType.DATABASE && (
diff --git a/web/src/components/UpdateAccountDialog.tsx b/web/src/components/UpdateAccountDialog.tsx index 64c6950a..4eee39fd 100644 --- a/web/src/components/UpdateAccountDialog.tsx +++ b/web/src/components/UpdateAccountDialog.tsx @@ -1,5 +1,5 @@ -import { Input, Textarea } from "@mui/joy"; -import { Button } from "@usememos/mui"; +import { Textarea } from "@mui/joy"; +import { Button, Input } from "@usememos/mui"; import { isEqual } from "lodash-es"; import { XIcon } from "lucide-react"; import { useState } from "react"; @@ -193,7 +193,7 @@ const UpdateAccountDialog: React.FC = ({ destroy }: Props) => { {t("common.email")} ({t("setting.account-section.email-note")})

- +

{t("common.description")}