0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-03-31 22:51:25 -05:00

Merge pull request #1864 from FlurryNight/i18n/portuguese

feat(phrases): add portuguese language
This commit is contained in:
Charles Zhao 2022-09-05 20:47:39 +08:00 committed by GitHub
commit 4360a4aaea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
34 changed files with 868 additions and 1 deletions

View file

@ -10,6 +10,7 @@ export const mockMetadata: ConnectorMetadata = {
platform: null,
name: {
en: 'Connector',
'pt-PT': 'Conector',
'zh-CN': '连接器',
'tr-TR': 'Connector',
'ko-KR': 'Connector',
@ -18,6 +19,7 @@ export const mockMetadata: ConnectorMetadata = {
logoDark: './logo-dark.png',
description: {
en: 'Connector',
'pt-PT': 'Conector',
'zh-CN': '连接器',
'tr-TR': 'Connector',
'ko-KR': 'Connector',

View file

@ -3,6 +3,7 @@ import { NormalizeKeyPaths } from '@silverhand/essentials';
import en from './locales/en';
import fr from './locales/fr';
import koKR from './locales/ko-kr';
import ptPT from './locales/pt-pt';
import trTR from './locales/tr-tr';
import zhCN from './locales/zh-cn';
import { Resource } from './types';
@ -14,6 +15,7 @@ export type I18nKey = NormalizeKeyPaths<typeof en.translation>;
const resource: Resource = {
en,
fr,
'pt-PT': ptPT,
'zh-CN': zhCN,
'ko-KR': koKR,
'tr-TR': trTR,

View file

@ -0,0 +1,78 @@
import en from './en';
const translation = {
input: {
username: 'Utilizador',
password: 'Password',
email: 'Email',
phone_number: 'Telefone',
confirm_password: 'Confirmar password',
},
secondary: {
sign_in_with: 'Entrar com {{methods, list(type: disjunction;)}}',
social_bind_with:
'Já tem uma conta? Faça login para agregar {{methods, list(type: disjunction;)}} com a sua identidade social.',
},
action: {
sign_in: 'Entrar',
continue: 'Continuar',
create_account: 'Criar uma conta',
create: 'Criar',
enter_passcode: 'Digite a senha',
confirm: 'Confirmar',
cancel: 'Cancelar',
bind: 'Agregar a {{address}}',
back: 'Voltar',
nav_back: 'Anterior',
agree: 'Aceito',
got_it: 'Entendi',
sign_in_with: 'Entrar com {{name}}',
},
description: {
email: 'email',
phone_number: 'telefone',
reminder: 'Lembrete',
not_found: '404 Não encontrado',
agree_with_terms: 'Eu li e concordo com os ',
agree_with_terms_modal: 'Para prosseguir, por favor, concorde com o <link></link>.',
terms_of_use: 'Termos de uso',
create_account: 'Criar uma conta',
forgot_password: 'Esqueceu a password?',
or: 'ou',
enter_passcode: 'A senha foi enviada para o seu {{address}}',
passcode_sent: 'A senha foi reenviada',
resend_after_seconds: 'Reenviar após <span>{{seconds}}</span> segundos',
resend_passcode: 'Reenviar senha',
continue_with: 'Continuar com',
create_account_id_exists: 'A conta com {{type}} {{value}} já existe, gostaria de fazer login?',
sign_in_id_does_not_exists: 'A conta com {{type}} {{value}} não existe, gostaria de criar uma?',
bind_account_title: 'Agregar conta',
social_create_account: 'Sem conta? Pode criar uma nova e agregar.',
social_bind_account: 'Já tem uma conta? Faça login para agregar a sua identidade social.',
social_bind_with_existing: 'Encontramos uma conta relacionada, pode agrega-la diretamente.',
},
error: {
username_password_mismatch: 'O Utilizador e a password não correspondem',
username_required: 'Utilizador necessário',
password_required: 'Password necessária',
username_exists: 'O nome de utilizador já existe',
username_should_not_start_with_number: 'O nome de utilizador não deve começar com um número',
username_valid_charset:
'O nome de utilizador deve conter apenas letras, números ou underscores.',
invalid_email: 'O email é inválido',
invalid_phone: 'O número de telefone é inválido',
password_min_length: 'A password requer um mínimo de {{min}} caracteres',
passwords_do_not_match: 'As passwords não coincidem',
invalid_passcode: 'A senha é inválida',
invalid_connector_auth: 'A autorização é inválida',
invalid_connector_request: 'Os dados do conector são inválidos',
unknown: 'Erro desconhecido. Por favor, tente novamente mais tarde.',
invalid_session: 'Sessão não encontrada. Volte e faça login novamente.',
},
};
const ptPT: typeof en = Object.freeze({
translation,
});
export default ptPT;

View file

@ -10,6 +10,7 @@ export type ResourceKey = string | Record<string, unknown>;
const languageCodeAndDisplayNameMappings: Record<LanguageKey, string> = {
en: 'English',
fr: 'Français',
'pt-PT': 'Português',
'zh-CN': '简体中文',
'tr-TR': 'Türkçe',
'ko-KR': '한국어',

View file

@ -3,6 +3,7 @@ import { NormalizeKeyPaths } from '@silverhand/essentials';
import en from './locales/en';
import fr from './locales/fr';
import koKR from './locales/ko-kr';
import ptPT from './locales/pt-pt';
import trTR from './locales/tr-tr';
import zhCN from './locales/zh-cn';
import { Resource } from './types';
@ -18,6 +19,7 @@ export type AdminConsoleKey = NormalizeKeyPaths<typeof en.translation.admin_cons
const resource: Resource = {
en,
fr,
'pt-PT': ptPT,
'zh-CN': zhCN,
'ko-KR': koKR,
'tr-TR': trTR,

View file

@ -0,0 +1,119 @@
const errors = {
auth: {
authorization_header_missing: 'O cabeçalho de autorização está ausente.',
authorization_token_type_not_supported: 'O tipo de autorização não é suportado.',
unauthorized: 'Não autorizado. Verifique as credenciais e o scope.',
forbidden: 'Proibido. Verifique os seus cargos e permissões.',
expected_role_not_found: 'Role esperado não encontrado. Verifique os seus cargos e permissões.',
jwt_sub_missing: 'Campo `sub` está ausente no JWT.',
},
guard: {
invalid_input: 'O pedido {{type}} é inválido.',
invalid_pagination: 'O valor de paginação enviado é inválido.',
},
oidc: {
aborted: 'O utilizador final abortou a interação.',
invalid_scope: 'Scope {{scope}} não é suportado.',
invalid_scope_plural: 'Scope {{scopes}} não são suportados.',
invalid_token: 'O Token fornecido é inválido.',
invalid_client_metadata: 'Metadados de cliente inválidos fornecidos.',
insufficient_scope: 'Token de acesso sem scope solicitado {{scopes}}.',
invalid_request: 'Pedido inválido.',
invalid_grant: 'Pedido Grant inválido.',
invalid_redirect_uri:
'`redirect_uri` não correspondeu a nenhum dos `redirect_uris` registados.',
access_denied: 'Acesso negado.',
invalid_target: 'Indicador de recurso inválido.',
unsupported_grant_type: '`grant_type` solicitado não é suportado.',
unsupported_response_mode: '`response_mode` solicitado não é suportado.',
unsupported_response_type: '`response_type` solicitado não é suportado.',
provider_error: 'Erro interno OIDC: {{message}}.',
},
user: {
username_exists_register: 'Já existe um utilizador com esse nome de utilizador.',
email_exists_register: 'Já existe um utilizador com esse endereço de email.',
phone_exists_register: 'Já existe um utilizador com esse numero do telefone.',
invalid_email: 'Endereço de email inválido.',
invalid_phone: 'Número de telefone inválido.',
email_not_exists: 'O endereço de email ainda não foi registada.',
phone_not_exists: 'O numero do telefone ainda não foi registada.',
identity_not_exists: 'A conta social ainda não foi registada.',
identity_exists: 'A conta social foi registada.',
invalid_role_names: '({{roleNames}}) não são válidos',
cannot_delete_self: 'Não se pode remover a si mesmo.',
},
password: {
unsupported_encryption_method: 'O método de enncriptação {{name}} não é suportado.',
pepper_not_found: 'pepper da Password não encontrada. Por favor, verifique os envs.',
},
session: {
not_found: 'Sessão não encontrada. Por favor, volte e faça login novamente.',
invalid_credentials: 'Credenciais inválidas. Por favor, verifique os dados.',
invalid_sign_in_method: 'O método de login atual não está disponível.',
invalid_connector_id:
'Não foi possível encontrar um conector disponível com o id {{connectorId}}.',
insufficient_info: 'Informações de login insuficientes.',
connector_id_mismatch: 'O connectorId não corresponde ao registado na sessão.',
connector_session_not_found:
'Sessão do conector não encontrada. Por favor, volte e faça login novamente.',
unauthorized: 'Faça login primeiro.',
unsupported_prompt_name: 'Nome de prompt não suportado.',
},
connector: {
general: 'Ocorreu um erro inesperado no conector.{{errorDescription}}',
not_found: 'Não é possível encontrar nenhum conector disponível para o tipo: {{type}}.',
not_enabled: 'O conector não está ativo.',
invalid_metadata: 'Os metadados do conector são inválidos.',
invalid_config_guard: 'A configuração de proteção do conector é inválida.',
unexpected_type: 'O tipo do conector é inesperado.',
insufficient_request_parameters: 'A solicitação pode perder alguns parâmetros de entrada.',
invalid_config: 'A configuração do conector é inválida.',
invalid_response: 'A resposta do conector é inválida.',
template_not_found: 'Não foi possível encontrar o modelo correto na configuração do conector.',
not_implemented: '{{method}}: ainda não foi implementado.',
social_invalid_access_token: 'O token de acesso do conector é inválido.',
invalid_auth_code: 'O código de autenticação do conector é inválido.',
social_invalid_id_token: 'O token de ID do conector é inválido.',
authorization_failed: 'O processo de autorização do usuário não foi bem-sucedido.',
social_auth_code_invalid:
'Não foi possível obter o token de acesso, verifique o código de autorização.',
more_than_one_sms: 'O número de conectores SMS é maior que 1.',
more_than_one_email: 'O número de conectores de e-mail é maior que 1.',
db_connector_type_mismatch: 'Há um conector no banco de dados que não corresponde ao tipo.',
},
passcode: {
phone_email_empty: 'O campos telefone e email estão vazios.',
not_found: 'Senha não encontrada. Por favor, envie a senha primeiro.',
phone_mismatch: 'O telefone não correspond. Por favor, solicite uma nova senha.',
email_mismatch: 'O email não corresponde. Por favor, solicite uma nova senha.',
code_mismatch: 'Senha inválida.',
expired: 'A senha expirou. Por favor, solicite uma nova senha.',
exceed_max_try:
'Limitação de verificação de senha excedida. Por favor, solicite uma nova senha.',
},
sign_in_experiences: {
empty_content_url_of_terms_of_use:
'URL dos "Termos de uso" vazio. Adicione o URL se os "Termos de uso" estiverem ativados.',
empty_logo: 'Insira o URL do seu logotipo',
empty_slogan:
'Slogan de marca vazio. Adicione um slogan se o estilo da interface com o slogan for selecionado.',
empty_social_connectors:
'Conectores sociais vazios. Adicione conectores sociais e ative os quando o método de login social estiver ativado.',
enabled_connector_not_found: 'Conector {{type}} ativado não encontrado.',
not_one_and_only_one_primary_sign_in_method:
'Deve haver um e apenas um método de login principal. Por favor, verifique sua entrada.',
},
swagger: {
invalid_zod_type: 'Tipo de Zod inválido. Verifique a configuração do protetor de rota.',
not_supported_zod_type_for_params:
'Tipo Zod não suportado para os parâmetros. Verifique a configuração do protetor de rota.',
},
entity: {
create_failed: 'Falha ao criar {{name}}.',
not_exists: '{{name}} não existe.',
not_exists_with_id: '{{name}} com o ID `{{id}}` não existe.',
not_found: 'O recurso não existe.',
},
};
export default errors;

View file

@ -0,0 +1,10 @@
import en from '../en';
import errors from './errors';
import translation from './translation';
const ptPT: typeof en = Object.freeze({
translation,
errors,
});
export default ptPT;

View file

@ -0,0 +1,11 @@
const api_resource_details = {
back_to_api_resources: 'Voltar aos recursos API',
token_expiration_time_in_seconds: 'Tempo de expiração do token (em segundos)',
token_expiration_time_in_seconds_placeholder: 'Insira o tempo de expiração do token',
delete_description:
'Esta ação não pode ser desfeita. Isso ira eliminar permanentemente o recurso API. Insira o nome do recurso <span>{{name}}</span> para confirmar.',
enter_your_api_resource_name: 'Digite o nome do recurso API',
api_resource_deleted: 'O recurso API {{name}} foi eliminado com sucesso',
};
export default api_resource_details;

View file

@ -0,0 +1,14 @@
const api_resources = {
title: 'Recursos API',
subtitle: 'Defina APIs que pode consumir nos aplicações autorizadas',
create: 'Criar recurso API',
api_name: 'Nome da API',
api_name_placeholder: 'Introduza o nome da sua API',
api_identifier: 'identificador da API',
api_identifier_tip:
'O identificador exclusivo para o recurso API. Deve ser um URI absoluto e não tem componente de fragmento (#). Igual ao resource parameter no OAuth 2.0.',
api_resource_created: 'O recurso API {{name}} foi criado com sucesso',
api_identifier_placeholder: 'https://your-api-identifier/',
};
export default api_resources;

View file

@ -0,0 +1,40 @@
const application_details = {
back_to_applications: 'Voltar para aplicações',
check_guide: 'Guia de verificação',
advanced_settings: 'Configurações avançadas',
application_name: 'Nome da aplicação',
application_name_placeholder: 'Ex: Site Empresa',
description: 'Descrição',
description_placeholder: 'Insira a descrição da sua aplicação',
authorization_endpoint: 'Endpoint de autorização',
authorization_endpoint_tip:
'O endpoint para realizar autenticação e autorização. É usado para autenticação OpenID Connect.',
application_secret: 'Segredo da aplicação',
redirect_uri: 'URI de redirecionamento',
redirect_uris: 'URIs de redirecionamento',
redirect_uri_placeholder: 'https://your.website.com/app',
redirect_uri_placeholder_native: 'io.logto://callback',
redirect_uri_tip:
'O URI redireciona após o login de um utilizador (com êxito ou não). Consulte OpenID Connect AuthRequest para obter mais informações.',
post_sign_out_redirect_uri: 'URI de redirecionamento pós-logout',
post_sign_out_redirect_uris: 'URIs de redirecionamento pós-logout',
post_sign_out_redirect_uri_placeholder: 'https://your.website.com/home',
post_sign_out_redirect_uri_tip:
'O URI redireciona após a saída de um utilizador (opcional). Pode não ter efeito prático em alguns tipos de aplicações.',
cors_allowed_origins: 'origens permitidas CORS',
cors_allowed_origins_placeholder: 'https://your.website.com',
cors_allowed_origins_tip:
'Por padrão, todas as origens de redirecionamento serão permitidas. Recomenda-se restringir isto.',
add_another: 'Adicionar outro',
id_token_expiration: 'Expiração do token de ID',
refresh_token_expiration: 'Expiração do token de atualização',
token_endpoint: 'Endpoint Token',
user_info_endpoint: 'Enpoint Userinfo',
delete_description:
'Esta ação não pode ser desfeita. Isso ira eliminar permanentemente a app. Insira o nome da aplicação <span>{{name}}</span> para confirmar.',
enter_your_application_name: 'Digite o nome da aplicação',
application_deleted: 'Aplicação {{name}} eliminada com sucesso',
redirect_uri_required: 'Deve inserir pelo menos um URI de redirecionamento',
};
export default application_details;

View file

@ -0,0 +1,43 @@
const applications = {
title: 'Aplicações',
subtitle:
'Configure um aplicativo móvel, de página única ou tradicional para usar o Logto para autenticação',
create: 'Criar aplicação',
application_name: 'Nome da aplicação',
application_name_placeholder: 'Ex: Site Empresa',
application_description: 'Descrição do aplicação',
application_description_placeholder: 'Insira a descrição da sua aplicação',
select_application_type: 'Selecione o tipo de aplicação',
no_application_type_selected: 'Ainda não selecionou nenhum tipo de aplicação',
application_created:
'A aplicação {{name}} foi criada com sucesso! \nAgora termine as configurações do seu aplicativo.',
app_id: 'ID da aplicação',
type: {
native: {
title: 'Nativo',
subtitle: 'Uma aplicação que é executada em um ambiente nativo',
description: 'Ex., App iOS, App Android',
},
spa: {
title: 'Página única (SPAs)',
subtitle: 'Uma aplicação que é executada num navegador e atualiza dinamicamente os dados',
description: 'Ex., App React, App VueJS',
},
traditional: {
title: 'Web tradicional',
subtitle: 'Uma aplicação que renderiza e atualiza páginas apenas pelo servidor web',
description: 'Ex., Next.js, PHP',
},
},
guide: {
get_sample_file: 'Obter amostra',
header_description:
'Siga um guia passo a passo para integrar a sua aplicação ou clique com o botão direito para obter nosso projeto de amostra',
title: 'A aplicação foi criada com sucesso',
subtitle:
'Agora siga as etapas abaixo para concluir as configurações da aplicação. Selecione o tipo de SDK para continuar.',
description_by_sdk: 'Este guia de início rápido demonstra como integrar o Logto em {{sdk}}',
},
};
export default applications;

View file

@ -0,0 +1,22 @@
const connector_details = {
back_to_connectors: 'Voltar para Conectores',
check_readme: 'Verifique o README',
save_error_empty_config: 'Por favor, insira a configuração',
send: 'Enviar',
send_error_invalid_format: 'Entrada inválida',
edit_config_label: 'Introduza o JSON aqui',
test_email_sender: 'Teste o conector de email',
test_sms_sender: 'Teste o conector de SMS',
test_email_placeholder: 'Insira um endereço de email para o teste',
test_sms_placeholder: 'Insira um número de telefone para o teste',
test_message_sent: 'Mensagem de teste enviada!',
test_sender_description: 'Receberá uma mensagem se o JSON estiver configurado corretamente',
options_change_email: 'Alterar conector de email',
options_change_sms: 'Alterar conector de SMS',
connector_deleted: 'O conector foi removido com sucesso',
type_email: 'Conector de Email',
type_sms: 'Conector de SMS',
type_social: 'Conector Social',
};
export default connector_details;

View file

@ -0,0 +1,37 @@
const connectors = {
title: 'Conectores',
subtitle: 'Configure conectores para habilitar a experiência de login social e sem senha',
create: 'Adicionar conector social',
tab_email_sms: 'Conectores de Email e SMS',
tab_social: 'Conectores sociais',
connector_name: 'Nome do conector',
connector_type: 'Tipo',
connector_status: 'Experiência de login',
connector_status_in_use: 'Em uso',
connector_status_not_in_use: 'Fora de uso',
social_connector_eg: 'Ex., Google, Facebook, Github',
save_and_done: 'Guardar',
type: {
email: 'Email',
sms: 'SMS',
social: 'Social',
},
setup_title: {
email: 'Configurar o conector de email',
sms: 'Configurar o conector de SMS',
social: 'Adicionar conector social',
},
guide: {
subtitle: 'Um guia passo a passo para configurar o conector',
},
platform: {
universal: 'Universal',
web: 'Web',
native: 'Nativo',
},
add_multi_platform: ' suporta várias plataformas, selecione uma plataforma para continuar',
drawer_title: 'Guia do conector',
drawer_subtitle: 'Siga as instruções para integrar o conector',
};
export default connectors;

View file

@ -0,0 +1,22 @@
const contact = {
title: 'Contate-nos',
description:
'Junte-se à nossa comunidade para fornecer feedback, pedir ajuda e compartilhar pensamentos com outros desenvolvedores',
discord: {
title: 'Discord',
description: 'Junte-se ao nosso canal público para conversar com outros desenvolvedores',
button: 'Juntar',
},
github: {
title: 'GitHub',
description: 'Crie um issue e submeta no GitHub',
button: 'Abrir',
},
email: {
title: 'Enviar email',
description: 'Envie-nos um email para mais informações e ajuda',
button: 'Enviar',
},
};
export default contact;

View file

@ -0,0 +1,22 @@
const dashboard = {
title: 'Painel',
description: 'Obtenha uma visão geral sobre o desempenho da sua aplicação',
total_users: 'Utilizadores totais',
total_users_tip: 'Nº de Utilizadores registados',
new_users_today: 'Novos utilizadores hoje',
new_users_today_tip: 'O número de novos utilizadores registados nas suas aplicações hoje',
new_users_7_days: 'Novos utilizadores nos últimos 7 dias',
new_users_7_days_tip:
'O número de novos utilizadores registados nas suas aplicações nos últimos sete dias',
daily_active_users: 'Utilizadores ativos diariamente',
daily_active_users_tip:
'O número de utilizadores únicos que efetuaram login nas suas aplicações hoje',
weekly_active_users: 'Utilizadores ativos semanalmente',
weekly_active_users_tip:
'O número de utilizadores únicos que efetuaram login nas suas aplicações nos últimos sete dias',
monthly_active_users: 'Utilizadores ativos mensais',
monthly_active_users_tip:
'O número de utilizadores únicos que efetuaram login nas suas aplicações nos últimos 30 dias',
};
export default dashboard;

View file

@ -0,0 +1,21 @@
const errors = {
something_went_wrong: 'Ops! Algo deu errado.',
page_not_found: 'Página não encontrada',
unknown_server_error: 'Ocorreu um erro de servidor desconhecido',
empty: 'Sem dados',
missing_total_number: 'Não foi possível encontrar `Total-Number` nos cabeçalhos da resposta',
invalid_uri_format: 'Formato de URI inválido',
invalid_origin_format: 'Formato de origem de URI inválido',
invalid_json_format: 'Formato JSON inválido',
invalid_error_message_format: 'The error message format is invalid.',
required_field_missing: 'Por favor, introduza {{field}}',
required_field_missing_plural: 'Deve inserir pelo menos um {{field}}',
more_details: 'Mais detalhes',
username_pattern_error:
'O nome de utilizador deve conter apenas letras, números ou underscores e não deve começar com um número.',
password_pattern_error: 'A password requer um mínimo de 6 caracteres',
insecure_contexts: 'Contextos inseguros (não HTTPS) não são compatíveis.',
unexpected_error: 'Um erro inesperado ocorreu',
};
export default errors;

View file

@ -0,0 +1,40 @@
const general = {
placeholder: 'Placeholder',
skip: 'Saltar',
next: 'Seguine',
retry: 'Tente novamente',
done: 'Feito',
search: 'Pesquisar',
search_placeholder: 'Pesquise',
clear_result: 'Limpar resultados',
save: 'Guardar',
save_changes: 'Guardar Alterações',
saved: 'Guardado!',
loading: 'Carregando...',
redirecting: 'Redirecionando...',
add: 'Adicionar',
added: 'Adicionado',
cancel: 'Cancelar',
confirm: 'Confirmar',
check_out: 'Verificar',
create: 'Criar',
set_up: 'Configurar',
customize: 'Customizar',
enable: 'Ativar',
reminder: 'Lembrete',
delete: 'Apagar',
more_options: 'MAIS OPÇÕES',
close: 'Fechar',
copy: 'Copiar',
copying: 'Copiando',
copied: 'Copiado',
required: 'Necessário',
add_another: '+ Adicionar outro',
deletion_confirmation: 'Tem a certeza que deseja eliminar isso {{title}}?',
settings_nav: 'Definições',
unsaved_changes_warning: 'Fez algumas alterações. Tem a certeza que deseja sair desta página?',
leave_page: 'Sair da página',
stay_on_page: 'Ficar na página',
};
export default general;

View file

@ -0,0 +1,27 @@
const get_started = {
progress: 'Guia de primeiros passos: {{completed}}/{{total}}',
progress_dropdown_title: 'Algumas coisas que pode fazer...',
title: 'Como deseja começar a usar o Logto?',
subtitle_part1: 'Algumas coisas que pode fazer para obter rapidamente o valor do Logto',
subtitle_part2: 'Acabei com esta configuração. ',
hide_this: 'Ocultar isto',
confirm_message: 'Tem a certeza que deseja ocultar esta página? Esta ação não pode ser desfeita.',
card1_title: 'Confira a demonstração',
card1_subtitle: 'Experimente a experiência de login do Logto agora para ver como funciona',
card2_title: 'Crie e integre a primeira aplicação',
card2_subtitle:
'Configure um aplicativo móvel, de página única ou tradicional para usar o Logto para autenticação',
card3_title: 'Personalize a experiência de login',
card3_subtitle:
'Personalize a interface de login para corresponder a sua marca e visualize em tempo rea',
card4_title: 'Configure um conector de SMS/Email',
card4_subtitle:
'Experimente o login sem senha com número de telefone ou email para permitir uma experiência do cliente segura e sem atritos',
card5_title: 'Adicione um conector social',
card5_subtitle: 'Permita que os seus clientes entrem com as identidades sociais em um clique',
card6_title: 'Outras leituras',
card6_subtitle:
'Confira a nossa documentação passo a passo baseados em cenários sem conceitos tediosos',
};
export default get_started;

View file

@ -0,0 +1,52 @@
import api_resource_details from './api-resource-details';
import api_resources from './api-resources';
import application_details from './application-details';
import applications from './applications';
import connector_details from './connector-details';
import connectors from './connectors';
import contact from './contact';
import dashboard from './dashboard';
import errors from './errors';
import general from './general';
import get_started from './get-started';
import log_details from './log-details';
import logs from './logs';
import session_expired from './session-expired';
import settings from './settings';
import sign_in_exp from './sign-in-exp';
import tab_sections from './tab-sections';
import tabs from './tabs';
import user_details from './user-details';
import users from './users';
import welcome from './welcome';
const admin_console = {
title: 'Consola de Administrador',
sign_out: 'Terminar sessão',
profile: 'Perfil',
admin_user: 'Administrador',
system_app: 'Sistema',
general,
errors,
tab_sections,
tabs,
applications,
application_details,
api_resources,
api_resource_details,
connectors,
connector_details,
get_started,
users,
user_details,
contact,
sign_in_exp,
settings,
dashboard,
logs,
log_details,
session_expired,
welcome,
};
export default admin_console;

View file

@ -0,0 +1,17 @@
const log_details = {
back_to_logs: 'Voltar aos registos de auditoria',
back_to_user: 'De volta a {{name}}',
success: 'Sucesso',
failed: 'Falha',
event_type: 'Tipo de evento',
application: 'Aplicação',
ip_address: 'Endereço IP',
user: 'Utilizador',
log_id: 'ID do registo',
time: 'Hora',
user_agent: 'User agent',
tab_details: 'Detalhes',
raw_data: 'Dados não tratados',
};
export default log_details;

View file

@ -0,0 +1,11 @@
const logs = {
title: 'Registos de auditoria',
subtitle: 'Visualize logs de autenticação feitos por administradores e utilizadores',
event: 'Evento',
user: 'Utilizador',
application: 'Aplicação',
time: 'Hora',
filter_by: 'Filtrar pors',
};
export default logs;

View file

@ -0,0 +1,8 @@
const session_expired = {
title: 'Sessão expirada',
subtitle:
'A sua sessão pode ter expirado foi desconectado. Clique no botão abaixo para fazer login novamente.',
button: 'Entrar novamente',
};
export default session_expired;

View file

@ -0,0 +1,27 @@
const settings = {
title: 'Definições',
description: 'Gerenciar as configurações globais',
tabs: {
general: 'Geral',
},
custom_domain: 'Domínio personalizado',
language: 'Linguagem',
appearance: 'Aparência',
appearance_system: 'Sincronizar com o sistema',
appearance_light: 'Claro',
appearance_dark: 'Escuro',
saved: 'Guardado!',
change_password: 'Mudar password',
change_password_description:
'Pode alterar a senha desta conta. Usará o nome de utilizador atual com a nova password para fazer login na consola.',
change_modal_title: 'Alterar password da conta',
change_modal_description:
'Usará o nome de utilizador atual com a nova password para fazer login na consola.',
new_password: 'Nova Password',
new_password_placeholder: 'Introduza a password',
confirm_password: 'Confirme a password',
confirm_password_placeholder: 'Confirme a password',
password_changed: 'Password alterada!',
};
export default settings;

View file

@ -0,0 +1,115 @@
const sign_in_exp = {
title: 'Experiência de login',
description:
'Personalize a interface de login para corresponder a sua marca e visualize em tempo real',
tabs: {
branding: 'Marca',
methods: 'Métodos de login',
others: 'Outros',
},
welcome: {
title:
'Esta é a primeira vez que define a experiência de login. Este guia irá ajudá-lo a passar por todas as configurações necessárias e começar rapidamente.',
get_started: 'Começar',
apply_remind: 'Observe que a experiência de login será aplicada a todos os apps nesta conta.',
got_it: 'Entendi',
},
color: {
title: 'COR',
primary_color: 'Cor da marca',
dark_primary_color: 'Cor da marca (tema escuro)',
dark_mode: 'Ativar tema escuro',
dark_mode_description:
'O app terá um tema escuro gerado automaticamente com base na cor da marca e no algoritmo Logto. contudo é livre de personalizar.',
dark_mode_reset_tip: 'Recalcular a cor do tema escuro com base na cor da marca.',
reset: 'Recalcular',
},
branding: {
title: 'ÁREA DE MARCA',
ui_style: 'Estilo',
styles: {
logo_slogan: 'Logo da app com slogan',
logo: 'Apenas o logo da app',
},
logo_image_url: 'URL do logotipo da app',
logo_image_url_placeholder: 'https://your.cdn.domain/logo.png',
dark_logo_image_url: 'URL do logotipo da app (tema escuro)',
dark_logo_image_url_placeholder: 'https://your.cdn.domain/logo-dark.png',
slogan: 'Slogan',
slogan_placeholder: 'Liberte a sua criatividade',
},
sign_in_methods: {
title: 'MÉTODOS DE LOGIN',
primary: 'Método de login principal',
enable_secondary: 'Ativar login secundário',
enable_secondary_description:
'Depois de ativado, a sua app oferecerá suporte a mais métodos de login além do principal. ',
methods: 'Método de login',
methods_sms: 'SMS',
methods_email: 'Email',
methods_social: 'Rede social',
methods_username: 'Utilizador e password',
methods_primary_tag: '(Primário)',
define_social_methods: 'Definir métodos de login social',
transfer: {
title: 'Conectores sociais',
footer: {
not_in_list: 'Não está na lista?',
set_up_more: 'Configurar mais',
go_to: 'conectores sociais ou vá para a seção "Conectores".',
},
},
},
others: {
terms_of_use: {
title: 'TERMOS DE USO',
enable: 'Ativar termos de uso',
description: 'Adicione os termos legais para uso do seu produto',
terms_of_use: 'Termos de uso',
terms_of_use_placeholder: 'https://your.terms.of.use/',
terms_of_use_tip: 'URL dos termos de uso',
},
languages: {
title: 'LÍNGUAS',
mode: 'Modo de idioma',
auto: 'automático',
fixed: 'Fixo',
fallback_language: 'Idioma fallback',
fallback_language_tip: 'Qual idioma usar se o Logto não encontrar o idioma requisitado.',
fixed_language: 'Idioma fixo',
},
authentication: {
title: 'AUTENTICAÇÃO',
enable_create_account: 'Permitir criar conta?',
enable_create_account_description:
'Ativa ou desativa a criação de contas. Depois de desativado, os seus clientes não poderão criar contas por meio da pagina de login, mas você poderá adicionar utiizadores na Consola de Administrador.',
},
},
setup_warning: {
no_connector: '',
no_connector_sms:
'Ainda não configurou um conector de SMS. A experiência de login não será ativada até que conclua as configurações primeiro. ',
no_connector_email:
'Ainda não configurou um conector de email. A experiência de login não será ativada até que conclua as configurações primeiro. ',
no_connector_social:
'Ainda não configurou um conector social. A experiência de login não será ativada até que conclua as configurações primeiro. ',
no_added_social_connector:
'Configurou alguns conectores sociais agora. Certifique-se de adicionar alguns a experiência de login.',
},
save_alert: {
description:
'Está alterando os métodos de login. Isso afetará alguns dos seus utilizadoress. Tem a certeza que deseja fazer isso?',
before: 'Antes',
after: 'Depois',
},
preview: {
title: 'Pre-visualização do login',
dark: 'Escuro',
light: 'Claro',
native: 'Nativo',
desktop_web: 'Web computador',
mobile_web: 'Web móvel',
},
};
export default sign_in_exp;

View file

@ -0,0 +1,8 @@
const tab_sections = {
overview: 'Vista geral',
resource_management: 'Gestão de recursos',
user_management: 'Gestão de utilizadores',
help_and_support: 'Ajuda e suporte',
};
export default tab_sections;

View file

@ -0,0 +1,15 @@
const tabs = {
get_started: 'Começo',
dashboard: 'Painel',
applications: 'Aplicações',
api_resources: 'Recursos API',
sign_in_experience: 'Experiência de login',
connectors: 'Conectores',
users: 'Gestão de utilizadores',
audit_logs: 'Registos de auditoria',
docs: 'Documentação',
contact_us: 'Contate-nos',
settings: 'Definições',
};
export default tabs;

View file

@ -0,0 +1,41 @@
const user_details = {
back_to_users: 'Voltar a gestão de utilizadores',
created_title: 'Este utilizador foi criado com sucesso',
created_guide: 'Pode enviar as seguintes informações de login para o utilizador',
created_username: 'Utilizador:',
created_password: 'Password:',
menu_delete: 'eliminar',
delete_description:
'Esta ação não pode ser desfeita. Isso ira eliminar o utilizador permanentemente.',
deleted: 'The user has been successfully deleted',
reset_password: {
reset_password: 'Redefinir password',
title: 'Tem a certeza que deseja redefinir a password?',
content:
'Esta ação não pode ser desfeita. Isso irá redefinir as informações de login do utilizador.',
congratulations: 'Este utilizador foi redefinido',
new_password: 'Nova password:',
},
tab_logs: 'Registros do utilizador',
field_email: 'Email',
field_phone: 'Telefone',
field_username: 'Nome de utilizador',
field_name: 'Nome',
field_avatar: 'URL da imagem do avatar',
field_avatar_placeholder: 'https://your.cdn.domain/avatar.png',
field_custom_data: 'Dados personalizados',
field_custom_data_tip:
'Informações adicionais do utilizador não listadas nas propriedades predefinidas, ex: idioma preferido pelo utilizador.',
field_connectors: 'Conexões sociais',
custom_data_invalid: 'Os dados personalizados devem ser um objeto JSON válido',
connectors: {
connectors: 'Conectores',
user_id: 'ID do utilizador',
remove: 'Remover',
not_connected: 'O utilizador não está conectado a nenhum conector social',
deletion_confirmation:
'Está removendo a identidade <name/> existente. Tem a certeza que deseja fazer isso?',
},
};
export default user_details;

View file

@ -0,0 +1,15 @@
const users = {
title: 'Gestão de utilizadores',
subtitle:
'Gerencie os utilizadores, incluindo a criação, edição de informações, visualização de logs, recuperações de password e exclusões',
create: 'Adicionar usuário',
user_name: 'Utilizador',
application_name: 'Do app',
latest_sign_in: 'Último login',
create_form_username: 'Utilizador',
create_form_password: 'Password',
create_form_name: 'Nome completo',
unnamed: 'Sem nome',
};
export default users;

View file

@ -0,0 +1,8 @@
const welcome = {
title: 'Bem-vindo a consola de Administrador',
description:
'A consola de Administrador é o lugar para gerenciar o Logto sem ter conhecimentos de programação. Vamos primeiro criar uma conta. Com esta conta, pode gerir o Logto por conta própria ou em nome da empresa.',
create_account: 'Criar uma conta',
};
export default welcome;

View file

@ -0,0 +1,15 @@
const demo_app = {
notification:
'Use a sua conta de administrador padrão ou crie uma nova conta para entrar na app de demonstração.',
title: 'Entrou com sucesso na app de demonstração!',
subtitle: 'Aqui estão as suas informações de login:',
username: 'Utilizador: ',
user_id: 'ID de utilizador: ',
sign_out: 'Sair da app de demonstração',
continue_explore: 'Ou continue a explorar',
customize_sign_in_experience: 'Personalizar a experiência de login',
enable_passwordless: 'Ativar login sem passsword (passwordless)',
add_social_connector: 'Adicionar conector socials',
};
export default demo_app;

View file

@ -0,0 +1,9 @@
import admin_console from './admin-console';
import demo_app from './demo-app';
const translation = {
admin_console,
demo_app,
};
export default translation;

View file

@ -10,6 +10,7 @@ export type ResourceKey = string | Record<string, unknown>;
const languageCodeAndDisplayNameMappings: Record<LanguageKey, string> = {
en: 'English',
fr: 'Français',
'pt-PT': 'Português',
'zh-CN': '简体中文',
'tr-TR': 'Türkçe',
'ko-KR': '한국어',

View file

@ -1,5 +1,5 @@
import { z } from 'zod';
export const languageKeys = ['en', 'fr', 'zh-CN', 'tr-TR', 'ko-KR'] as const;
export const languageKeys = ['en', 'fr', 'pt-PT', 'zh-CN', 'tr-TR', 'ko-KR'] as const;
export const languageKeyGuard = z.enum(languageKeys);
export type LanguageKey = z.infer<typeof languageKeyGuard>;

View file

@ -21,12 +21,14 @@ export const socialConnectors = [
logoDark: null,
name: {
en: 'Sign in with GitHub',
'pt-PT': 'Entrar com GitHub',
'zh-CN': '使用 GitHub 登录',
'tr-TR': 'Github ile giriş yap',
'ko-KR': 'Github 로그인',
},
description: {
en: 'Sign in with GitHub',
'pt-PT': 'Entrar com GitHub',
'zh-CN': '使用 GitHub 登录',
'tr-TR': 'Github ile giriş yap',
'ko-KR': 'Github 로그인',
@ -43,12 +45,14 @@ export const socialConnectors = [
logoDark: null,
name: {
en: 'Sign in with Alipay',
'pt-PT': 'Entrar com Alipay',
'zh-CN': '使用 Alipay 登录',
'tr-TR': 'Alipay ile giriş yap',
'ko-KR': 'Alipay 로그인',
},
description: {
en: 'Sign in with Alipay',
'pt-PT': 'Entrar com Alipay',
'zh-CN': '使用 Alipay 登录',
'tr-TR': 'Alipay ile giriş yap',
'ko-KR': 'Alipay 로그인',
@ -65,12 +69,14 @@ export const socialConnectors = [
logoDark: null,
name: {
en: 'Sign in with WeChat',
'pt-PT': 'Entrar com WeChat',
'zh-CN': '使用 WeChat 登录',
'tr-TR': 'WeChat ile giriş yap',
'ko-KR': 'WeChat 로그인',
},
description: {
en: 'Sign in with WeChat',
'pt-PT': 'Entrar com WeChat',
'zh-CN': '使用 WeChat 登录',
'tr-TR': 'WeChat ile giriş yap',
'ko-KR': 'WeChat 로그인',
@ -87,12 +93,14 @@ export const socialConnectors = [
logoDark: null,
name: {
en: 'Sign in with Google',
'pt-PT': 'Entrar com Google',
'zh-CN': '使用 Google 登录',
'tr-TR': 'Google ile giriş yap',
'ko-KR': 'Google 로그인',
},
description: {
en: 'Sign in with Google',
'pt-PT': 'Entrar com Google',
'zh-CN': '使用 Google 登录',
'tr-TR': 'Google ile giriş yap',
'ko-KR': 'Google 로그인',
@ -109,12 +117,14 @@ export const socialConnectors = [
logoDark: null,
name: {
en: 'Sign in with Meta',
'pt-PT': 'Entrar com Facebook',
'zh-CN': '使用 Meta 登录',
'tr-TR': 'Meta ile giriş yap',
'ko-KR': 'Meta 로그인',
},
description: {
en: 'Sign in with Meta',
'pt-PT': 'Entrar com Facebook',
'zh-CN': '使用 Meta 登录',
'tr-TR': 'Meta ile giriş yap',
'ko-KR': 'Meta 로그인',
@ -133,12 +143,14 @@ export const mockSocialConnectorData = {
logoDark: null,
name: {
en: 'Sign in with Xxx',
'pt-PT': 'Entrar com Xxx',
'zh-CN': '使用 Xxx 登录',
'tr-TR': 'Xxx ile giriş yap',
'ko-KR': 'Xxx 로그인',
},
description: {
en: 'Sign in with Xxx',
'pt-PT': 'Entrar com Xxx',
'zh-CN': '使用 Xxx 登录',
'tr-TR': 'Xxx ile giriş yap',
'ko-KR': 'Xxx 로그인',