diff --git a/client/config/languages.ts b/client/config/languages.ts index 1ecb1287..f899bc53 100644 --- a/client/config/languages.ts +++ b/client/config/languages.ts @@ -37,6 +37,7 @@ export const languages: Language[] = [ { code: 'or', name: 'Odia', localName: 'ଓଡ଼ିଆ' }, { code: 'pl', name: 'Polish', localName: 'Polski' }, { code: 'pt', name: 'Portuguese', localName: 'Português' }, + { code: 'pt-BR', name: 'Brazilian Portuguese', localName: 'Brasil' }, { code: 'ro', name: 'Romanian', localName: 'limba română' }, { code: 'ru', name: 'Russian', localName: 'русский' }, { code: 'sr', name: 'Serbian', localName: 'српски језик' }, diff --git a/client/next-i18next.config.js b/client/next-i18next.config.js index 2ce1be40..9f71c75f 100644 --- a/client/next-i18next.config.js +++ b/client/next-i18next.config.js @@ -35,6 +35,7 @@ const i18nConfig = { 'or', 'pl', 'pt', + 'pt-BR', 'ro', 'ru', 'sr', diff --git a/client/public/locales/pt-BR/builder.json b/client/public/locales/pt-BR/builder.json new file mode 100644 index 00000000..013261ef --- /dev/null +++ b/client/public/locales/pt-BR/builder.json @@ -0,0 +1,368 @@ +{ + "common": { + "actions": { + "add": "Adicionar {{token}}", + "delete": "Remover {{token}}", + "edit": "Editar {{token}}" + }, + "columns": { + "heading": "Colunas", + "tooltip": "Alterar o número de colunas" + }, + "form": { + "date": { + "label": "Data" + }, + "description": { + "label": "Descrição" + }, + "email": { + "label": "Endereço de e-mail" + }, + "end-date": { + "help-text": "Deixe este campo em branco se for até o presente", + "label": "Data de Término" + }, + "keywords": { + "label": "Palavras-chave" + }, + "level": { + "label": "Nível" + }, + "levelNum": { + "label": "Nível (Número)" + }, + "name": { + "label": "Nome" + }, + "phone": { + "label": "Número de telefone" + }, + "position": { + "label": "Cargo" + }, + "start-date": { + "label": "Data de Início" + }, + "subtitle": { + "label": "Subtítulo" + }, + "summary": { + "label": "Resumo" + }, + "title": { + "label": "Título" + }, + "url": { + "label": "Site" + } + }, + "glossary": { + "page": "Página" + }, + "list": { + "actions": { + "delete": "Excluir", + "duplicate": "Duplicar", + "edit": "Editar" + }, + "empty-text": "Essa lista está vazia." + }, + "tooltip": { + "delete-item": "Tem certeza de que deseja excluir este item? Esta ação é irreversível.", + "delete-section": "Excluir Seção", + "rename-section": "Renomear Seção", + "toggle-visibility": "Alternar Visibilidade" + } + }, + "controller": { + "tooltip": { + "center-artboard": "Prancheta central", + "copy-link": "Copiar link do currículo", + "export-pdf": "Exportar PDF", + "toggle-orientation": "Alternar orientação da página", + "toggle-page-break-line": "Alternar linha de quebra de página", + "toggle-sidebars": "Alternar barra lateral", + "zoom-in": "Mais Zoom", + "zoom-out": "Menos Zoom", + "undo": "Desfazer", + "redo": "Redo" + } + }, + "header": { + "menu": { + "delete": "Deletar", + "duplicate": "Duplicar", + "rename": "Renomear", + "share-link": "Compartilhar Link", + "tooltips": { + "delete": "Tem certeza de que deseja excluir este currículo? Esta ação é irreversível.", + "share-link": "Você precisa alterar a visibilidade do seu currículo para público para torná-lo visível para outras pessoas." + } + } + }, + "leftSidebar": { + "sections": { + "awards": { + "form": { + "awarder": { + "label": "Concedente" + } + } + }, + "basics": { + "actions": { + "photo-filters": "Filtros da foto" + }, + "heading": "Informações básicas", + "headline": { + "label": "Título" + }, + "name": { + "label": "Nome Completo" + }, + "birthdate": { + "label": "Data de nascimento" + }, + "photo-filters": { + "effects": { + "border": { + "label": "Borda" + }, + "grayscale": { + "label": "Escala de cinza" + }, + "heading": "Efeitos" + }, + "shape": { + "heading": "Forma" + }, + "size": { + "heading": "Tamanho (em px)" + } + }, + "photo-upload": { + "tooltip": { + "remove": "Excluir Foto", + "upload": "Enviar Foto" + } + } + }, + "certifications": { + "form": { + "issuer": { + "label": "Emissor" + } + } + }, + "education": { + "form": { + "area-study": { + "label": "Área de estudo" + }, + "courses": { + "label": "Cursos" + }, + "degree": { + "label": "Grau" + }, + "grade": { + "label": "Nota" + }, + "institution": { + "label": "Instituição" + } + } + }, + "location": { + "address": { + "label": "Endereço" + }, + "city": { + "label": "Cidade" + }, + "country": { + "label": "País" + }, + "heading": "Localização", + "postal-code": { + "label": "Código Postal" + }, + "region": { + "label": "Região" + } + }, + "profiles": { + "form": { + "network": { + "label": "Rede Social" + }, + "username": { + "label": "Nome de Usuário" + } + }, + "heading": "Perfis", + "heading_one": "Perfil" + }, + "publications": { + "form": { + "publisher": { + "label": "Editor" + } + } + }, + "references": { + "form": { + "relationship": { + "label": "Relação" + } + } + }, + "section": { + "heading": "Seção" + }, + "volunteer": { + "form": { + "organization": { + "label": "Organização" + } + } + } + } + }, + "rightSidebar": { + "sections": { + "css": { + "heading": "CSS Personalizado" + }, + "export": { + "heading": "Exportar", + "json": { + "primary": "JSON", + "secondary": "Baixe uma versão JSON do seu currículo que poderá ser importada de volta ao Reactive Resume." + }, + "pdf": { + "loading": { + "primary": "Gerando PDF", + "secondary": "Por favor aguarde enquanto o seu PDF é gerado, isso pode levar até 15 segundos." + }, + "normal": { + "primary": "PDF", + "secondary": "Baixe um PDF do seu currículo que você pode imprimir e enviar para o emprego dos seus sonhos. Este arquivo não pode ser importado de volta para edição posterior." + } + } + }, + "layout": { + "heading": "Layout", + "tooltip": { + "reset-layout": "Redefinir Layout" + } + }, + "links": { + "bugs-features": { + "body": "Alguma coisa te impede de fazer um currículo? Ou você tem uma ideia incrível para adicionar? Crie uma issue no GitHub para começar.", + "button": "GitHub Issues", + "heading": "Bugs? Sugestões de recursos?" + }, + "donate": { + "body": "Se você gostou de usar o Reactive Resume, considere doar o máximo possível para manter o aplicativo em funcionamento, sem anúncios e gratuito para sempre.", + "button": "Pague-me um café", + "heading": "Faça uma doação ao Reactive Resume" + }, + "github": "Código Fonte", + "docs": "Documentação", + "heading": "Links" + }, + "settings": { + "global": { + "date": { + "primary": "Data", + "secondary": "Formato de data usado em todo o aplicativo" + }, + "heading": "Global", + "language": { + "primary": "Idioma", + "secondary": "Idioma de exibição usado em todo o aplicativo" + }, + "theme": { + "primary": "Tema" + } + }, + "heading": "Configurações", + "page": { + "format": { + "primary": "Tamanho do papel", + "secondary": "Determina as dimensões das suas páginas de currículo" + }, + "break-line": { + "primary": "Linha de quebra", + "secondary": "Mostrar uma linha em todas as páginas para marcar a altura de uma página A4" + }, + "heading": "Página", + "orientation": { + "disabled": "Não tem efeito quando há somente uma página", + "primary": "Orientação", + "secondary": "Se as páginas devem ser exibidas horizontalmente ou verticalmente" + } + }, + "resume": { + "heading": "Currículo", + "reset": { + "primary": "Limpar Tudo", + "secondary": "Cometeu muitos erros? Clique aqui para redefinir todas as alterações e começar do zero. Tenha cuidado, esta ação não pode ser revertida." + }, + "sample": { + "primary": "Carregar dados de exemplo", + "secondary": "Não sabe por onde começar? Clique aqui para carregar alguns dados de exemplo para ver como é um currículo completo." + } + } + }, + "sharing": { + "heading": "Compartilhamento", + "short-url": { + "label": "Prefiro um URL curto" + }, + "visibility": { + "subtitle": "Permitir que qualquer um com um link veja seu currículo", + "title": "Público" + } + }, + "templates": { + "heading": "Modelos" + }, + "theme": { + "form": { + "background": { + "label": "Plano de fundo" + }, + "primary": { + "label": "Primário" + }, + "text": { + "label": "Texto" + } + }, + "heading": "Tema" + }, + "typography": { + "form": { + "font-family": { + "label": "Família da fonte" + }, + "font-size": { + "label": "Tamanho da fonte" + } + }, + "heading": "Tipografia", + "widgets": { + "body": { + "label": "Corpo" + }, + "headings": { + "label": "Cabeçalho" + } + } + } + } + } +} diff --git a/client/public/locales/pt-BR/common.json b/client/public/locales/pt-BR/common.json new file mode 100644 index 00000000..66eb2dfe --- /dev/null +++ b/client/public/locales/pt-BR/common.json @@ -0,0 +1,29 @@ +{ + "avatar": { + "menu": { + "greeting": "Olá", + "logout": "Sair" + } + }, + "footer": { + "credit": "Um projeto apaixonado de <1>Amruth Pillai", + "license": "Pela comunidade, para a comunidade." + }, + "markdown": { + "help-text": "Esta seção suporta formatação <1>markdown." + }, + "date": { + "present": "Presente" + }, + "subtitle": "Gerador de currículos gratuito e de código aberto.", + "title": "Reactive Resume", + "toast": { + "error": { + "upload-file-size": "Carregue apenas arquivos com menos de 2 megabytes.", + "upload-photo-size": "Carregue apenas fotos com menos de 2 megabytes, preferencialmente quadradas." + }, + "success": { + "resume-link-copied": "Um link para o seu currículo foi copiado para a área de transferência." + } + } +} diff --git a/client/public/locales/pt-BR/dashboard.json b/client/public/locales/pt-BR/dashboard.json new file mode 100644 index 00000000..9d6552a8 --- /dev/null +++ b/client/public/locales/pt-BR/dashboard.json @@ -0,0 +1,25 @@ +{ + "create-resume": { + "subtitle": "Começar do zero", + "title": "Criar Novo Currículo" + }, + "import-external": { + "subtitle": "LinkedIn, currículo em JSON, Reactive Resume", + "title": "Importar de fontes externas" + }, + "resume": { + "menu": { + "delete": "Deletar", + "duplicate": "Duplicar", + "open": "Abrir", + "rename": "Renomear", + "share-link": "Compartilhar Link", + "tooltips": { + "delete": "Tem certeza de que deseja excluir este currículo? Esta ação é irreversível.", + "share-link": "Você precisa alterar a visibilidade do seu currículo para público para torná-lo visível para outras pessoas." + } + }, + "timestamp": "Última atualização há {{timestamp}}" + }, + "title": "Painel de Controle" +} diff --git a/client/public/locales/pt-BR/landing.json b/client/public/locales/pt-BR/landing.json new file mode 100644 index 00000000..b01ab063 --- /dev/null +++ b/client/public/locales/pt-BR/landing.json @@ -0,0 +1,42 @@ +{ + "actions": { + "app": "Ir para aplicativo", + "login": "Entrar", + "logout": "Sair", + "register": "Registrar" + }, + "features": { + "heading": "Características", + "list": { + "ads": "Sem publicidade", + "export": "Exporte seu currículo para o formato JSON ou PDF", + "free": "Gratuito, para sempre", + "import": "Importe dados do LinkedIn, ou de um currículo em JSON", + "languages": "Disponível em vários idiomas", + "more": "E outros recursos interessantes, <1>veja todos aqui", + "tracking": "Sem rastreamento de usuários" + } + }, + "links": { + "heading": "Links", + "links": { + "donate": "Fazer doação", + "github": "Código Fonte", + "docs": "Documentação", + "privacy": "Política de privacidade", + "service": "Termos de serviço" + } + }, + "screenshots": { + "heading": "Imagens" + }, + "testimonials": { + "heading": "Depoimentos", + "body": "Considero importante a sua opinião, positiva ou negativa, a respeito do Reactive Resume, bem como a sua experiência ao usá-lo.
Confira algumas das mensagens enviadas por pessoas de todo o mundo.", + "contact": "Envie a sua mensagem por <1>e-mail ou pelo formulário disponível <3>aqui." + }, + "summary": { + "body": "O Reactive Resume é um gerador de currículos, gratuito e de código aberto, desenvolvido para facilitar as tarefas tediosas de criação, atualização e divulgação de seu currículo. Este aplicativo possibilita a criação de múltiplos currículos, que podem ser compartilhados com recrutadores ou amigos com um link exclusivo ou impressos como PDF. Tudo isso de graça, sem anúncios, sem rastreamento, mantendo a integridade e privacidade dos seus dados.", + "heading": "Resumo" + } +} diff --git a/client/public/locales/pt-BR/modals.json b/client/public/locales/pt-BR/modals.json new file mode 100644 index 00000000..aaa4a502 --- /dev/null +++ b/client/public/locales/pt-BR/modals.json @@ -0,0 +1,135 @@ +{ + "auth": { + "forgot-password": { + "actions": { + "send-email": "Enviar e-mail de redefinição de senha" + }, + "body": "Basta inserir o endereço de e-mail associado à conta que você gostaria de recuperar.", + "form": { + "email": { + "label": "Endereço de e-mail" + } + }, + "heading": "Esqueceu sua senha?", + "help-text": "Se a conta existir, você receberá um e-mail com um link para redefinir sua senha." + }, + "login": { + "actions": { + "login": "Entrar" + }, + "body": "Por favor, digite seu nome de usuário e senha associados à sua conta para fazer login e acessar, gerenciar e compartilhar seus currículos.", + "form": { + "password": { + "label": "Senha" + }, + "username": { + "help-text": "Você também pode inserir seu endereço de e-mail", + "label": "Nome de Usuário" + } + }, + "heading": "Acesse a sua conta", + "recover-text": "Caso tenha esquecido sua senha, você pode <1>recuperar sua conta aqui.", + "register-text": "Se não tiver, você pode <1>criar uma conta aqui." + }, + "register": { + "actions": { + "register": "Registre-se", + "google": "Registre-se com o Google" + }, + "body": "Por favor, insira suas informações pessoais para criar uma conta.", + "form": { + "confirm-password": { + "label": "Confirme a senha" + }, + "email": { + "label": "Endereço de e-mail" + }, + "name": { + "label": "Nome completo" + }, + "password": { + "label": "Senha" + }, + "username": { + "label": "Nome de usuário" + } + }, + "heading": "Criar uma conta", + "loginText": "Se já tem uma conta, você pode <1>entrar aqui." + }, + "reset-password": { + "actions": { + "set-password": "Definir nova senha" + }, + "body": "Digite uma nova senha para sua conta.", + "form": { + "confirm-password": { + "label": "Confirme a senha" + }, + "password": { + "label": "Senha" + } + }, + "heading": "Redefinir sua senha" + } + }, + "dashboard": { + "create-resume": { + "actions": { + "create-resume": "Criar Currículo" + }, + "body": "Comece a construir seu currículo dando-lhe um nome. Pode ser em referência ao cargo para o qual você está se candidatando ou apenas ao seu lanche favorito.", + "form": { + "name": { + "label": "Nome" + }, + "public": { + "label": "É publicamente acessível?" + }, + "slug": { + "label": "Endereço amigável" + } + }, + "heading": "Criar um novo currículo" + }, + "import-external": { + "heading": "Importar de fontes externas", + "json-resume": { + "actions": { + "upload-json": "Carregar JSON" + }, + "body": "Se você possui um <1>currículo JSON válido, poderá usá-lo para acelerar seu desenvolvimento no Reactive Resume. Clique no botão abaixo e carregue um arquivo JSON válido para começar.", + "heading": "Importar de um currículo JSON" + }, + "linkedin": { + "actions": { + "upload-archive": "Carregar arquivo ZIP" + }, + "body": "Você pode economizar tempo exportando seus dados do LinkedIn e usando-os para preencher automaticamente os campos no Reactive Resume. Vá para a seção <1>Privacidade dos Dados no LinkedIn e solicite um arquivo com seus dados. Assim que estiver disponível, faça upload do arquivo ZIP abaixo.", + "heading": "Importar do LinkedIn" + }, + "reactive-resume": { + "actions": { + "upload-json": "Carregar JSON", + "upload-json-v2": "Carregar JSON do v2" + }, + "body": "Se você possuir um JSON que foi exportado com a versão atual do Reactive Resume, poderá importá-lo de volta aqui para obter uma versão editável novamente.", + "heading": "Importe do Reactive Resume" + } + }, + "rename-resume": { + "actions": { + "rename-resume": "Renomear currículo" + }, + "form": { + "name": { + "label": "Nome" + }, + "slug": { + "label": "Endereço amigável" + } + }, + "heading": "Renomear o seu currículo" + } + } +} diff --git a/client/utils/date.ts b/client/utils/date.ts index 585554bb..8286b8d9 100644 --- a/client/utils/date.ts +++ b/client/utils/date.ts @@ -31,7 +31,7 @@ export const formatDateString = (date: string | DateRange, formatStr: string): s if (isString(date)) { if (!dayjs(date).isValid()) return null; - return dayjs.utc(date).local().format(formatStr); + return dayjs.utc(date).format(formatStr); } // If `date` is a DateRange