From b8a7066c55cfcc1e8dc7e7d1b5837b7dd5d0d32d Mon Sep 17 00:00:00 2001 From: "Flaviano O. Silva" Date: Fri, 3 Oct 2025 16:00:17 -0300 Subject: [PATCH 1/3] feat(i18n): add Portuguese (pt-BR) translation, introduces the Portuguese (Brazil) language pack --- packages/i18n/src/translations/index.ts | 1 + packages/i18n/src/translations/pt-BR.ts | 159 ++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 packages/i18n/src/translations/pt-BR.ts diff --git a/packages/i18n/src/translations/index.ts b/packages/i18n/src/translations/index.ts index 51f67c07d..b3e7987a2 100644 --- a/packages/i18n/src/translations/index.ts +++ b/packages/i18n/src/translations/index.ts @@ -19,3 +19,4 @@ export {default as en_US} from './en-US'; export {default as fr_FR} from './fr-FR'; export {default as hi_IN} from './hi-IN'; +export {default as pt_BR} from './pt-BR'; diff --git a/packages/i18n/src/translations/pt-BR.ts b/packages/i18n/src/translations/pt-BR.ts new file mode 100644 index 000000000..ea374d4a7 --- /dev/null +++ b/packages/i18n/src/translations/pt-BR.ts @@ -0,0 +1,159 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable sort-keys */ +/* eslint-disable @typescript-eslint/naming-convention */ + +import {I18nTranslations, I18nMetadata, I18nBundle} from '../models/i18n'; + +const translations: I18nTranslations = { + /* |---------------------------------------------------------------| */ + /* | Elements | */ + /* |---------------------------------------------------------------| */ + + /* Buttons */ + 'elements.buttons.signIn': 'Entrar', + 'elements.buttons.signOut': 'Sair', + 'elements.buttons.signUp': 'Cadastre-se', + 'elements.buttons.facebook': 'Entrar com Facebook', + 'elements.buttons.google': 'Entrar com Google', + 'elements.buttons.github': 'Entrar com GitHub', + 'elements.buttons.microsoft': 'Entrar com Microsoft', + 'elements.buttons.linkedin': 'Entrar com LinkedIn', + 'elements.buttons.ethereum': 'Entrar com Ethereum', + 'elements.buttons.multi.option': 'Entrar com {connection}', + 'elements.buttons.social': 'Entrar com {connection}', + + /* Fields */ + 'elements.fields.placeholder': 'Digite seu {field}', + + /* |---------------------------------------------------------------| */ + /* | Widgets | */ + /* |---------------------------------------------------------------| */ + + /* Base Sign In */ + 'signin.title': 'Entrar', + 'signin.subtitle': 'Digite suas credencias para continuar.', + + /* Base Sign Up */ + 'signup.title': 'Cadastra-se', + 'signup.subtitle': 'Crie uma nova conta para iniciar.', + + /* Email OTP */ + 'email.otp.title': 'Verificação OTP', + 'email.otp.subtitle': 'Digite o código enviado para seu e-mail.', + 'email.otp.submit.button': 'Continue', + + /* Identifier First */ + 'identifier.first.title': 'Entrar', + 'identifier.first.subtitle': 'Digite seu usuário ou e-mail.', + 'identifier.first.submit.button': 'Continue', + + /* SMS OTP */ + 'sms.otp.title': 'Verificação OTP', + 'sms.otp.subtitle': 'Digite o código enviado para seu telefone.', + 'sms.otp.submit.button': 'Continue', + + /* TOTP */ + 'totp.title': 'Verifique sua identidade', + 'totp.subtitle': 'Digite o código do seu aplicativo autenticador.', + 'totp.submit.button': 'Continue', + + /* Username Password */ + 'username.password.submit.button': 'Continue', + 'username.password.title': 'Entrar', + 'username.password.subtitle': 'Digite seu usuário e senha para continuar.', + + /* |---------------------------------------------------------------| */ + /* | User Profile | */ + /* |---------------------------------------------------------------| */ + + 'user.profile.title': 'Perfil', + 'user.profile.update.generic.error': 'Ocorreu um erro ao atualizar seu perfil. Tente novamente.', + + /* |---------------------------------------------------------------| */ + /* | Organization Switcher | */ + /* |---------------------------------------------------------------| */ + + 'organization.switcher.select.organization': 'Escolher Organização', + 'organization.switcher.switch.organization': 'Trocar Organização', + 'organization.switcher.loading.organizations': 'Carregando organizações...', + 'organization.switcher.members': 'membros', + 'organization.switcher.member': 'membro', + 'organization.switcher.create.organization': 'Criar Organização', + 'organization.switcher.manage.organizations': 'Gerenciar Organizações', + 'organization.switcher.manage.button': 'Gerenciar', + 'organization.switcher.organizations.title': 'Organizações', + 'organization.switcher.switch.button': 'Trocar', + 'organization.switcher.no.access': 'Sem Acesso', + 'organization.switcher.status.label': 'Situação:', + 'organization.switcher.showing.count': 'Exibindo {showing} de {total} organizações', + 'organization.switcher.refresh.button': 'Atualizar', + 'organization.switcher.load.more': 'Carregar Mais Organizações', + 'organization.switcher.loading.more': 'Carregando...', + 'organization.switcher.no.organizations': 'Nenhuma organização encontrada', + 'organization.switcher.error.prefix': 'Erro:', + 'organization.profile.title': 'Perfil da Organização', + 'organization.profile.loading': 'Carregando organização...', + 'organization.profile.error': 'Falha ao carregar organização', + + 'organization.create.title': 'Criar Organização', + 'organization.create.name.label': 'Nome da Organização', + 'organization.create.name.placeholder': 'Digite o nome da organização', + 'organization.create.handle.label': 'Identificador da Organização', + 'organization.create.handle.placeholder': 'minha-organizacao', + 'organization.create.description.label': 'Descrição', + 'organization.create.description.placeholder': 'Digite a descrição da organização', + 'organization.create.button': 'Criar Organização', + 'organization.create.creating': 'Criando...', + 'organization.create.cancel': 'Cancelar', + + /* |---------------------------------------------------------------| */ + /* | Messages | */ + /* |---------------------------------------------------------------| */ + + 'messages.loading': 'Carregando...', + + /* |---------------------------------------------------------------| */ + /* | Errors | */ + /* |---------------------------------------------------------------| */ + + 'errors.title': 'Erro', + 'errors.sign.in.initialization': 'Ocorreu um erro ao inicializar. Tente novamente mais tarde.', + 'errors.sign.in.flow.failure': 'Ocorreu um erro durante o login. Tente novamente mais tarde.', + 'errors.sign.in.flow.completion.failure': + 'Ocorreu um erro ao completar o login. Tente novamente mais tarde.', + 'errors.sign.in.flow.passkeys.failure': 'Ocorreu um erro ao entrar com as chaves de acesso (passkeys). Tente novamente mais tarde.', + 'errors.sign.in.flow.passkeys.completion.failure': + 'Ocorreu um erro ao completar o login com as chaves de acesso (passkeys). Tente novamente mais tarde.', +}; + +const metadata: I18nMetadata = { + localeCode: 'pt-BR', + countryCode: 'BR', + languageCode: 'pt', + displayName: 'Português (Brazil)', + direction: 'ltr', +}; + +const pt_BR: I18nBundle = { + metadata, + translations, +}; + +export default pt_BR; From 71643c3daa892259187adda59a53ef192a0be71a Mon Sep 17 00:00:00 2001 From: "Flaviano O. Silva" Date: Wed, 8 Oct 2025 01:16:59 -0300 Subject: [PATCH 2/3] chore: housekeeping - fix lint errors and add changeset --- .changeset/quick-boxes-joke.md | 5 +++++ packages/i18n/src/translations/pt-BR.ts | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changeset/quick-boxes-joke.md diff --git a/.changeset/quick-boxes-joke.md b/.changeset/quick-boxes-joke.md new file mode 100644 index 000000000..e78b9cf00 --- /dev/null +++ b/.changeset/quick-boxes-joke.md @@ -0,0 +1,5 @@ +--- +'@asgardeo/i18n': minor +--- + +Add Portuguese (pt-BR) language support to @asgardeo/i18n package. diff --git a/packages/i18n/src/translations/pt-BR.ts b/packages/i18n/src/translations/pt-BR.ts index ea374d4a7..fb372e987 100644 --- a/packages/i18n/src/translations/pt-BR.ts +++ b/packages/i18n/src/translations/pt-BR.ts @@ -136,9 +136,9 @@ const translations: I18nTranslations = { 'errors.title': 'Erro', 'errors.sign.in.initialization': 'Ocorreu um erro ao inicializar. Tente novamente mais tarde.', 'errors.sign.in.flow.failure': 'Ocorreu um erro durante o login. Tente novamente mais tarde.', - 'errors.sign.in.flow.completion.failure': - 'Ocorreu um erro ao completar o login. Tente novamente mais tarde.', - 'errors.sign.in.flow.passkeys.failure': 'Ocorreu um erro ao entrar com as chaves de acesso (passkeys). Tente novamente mais tarde.', + 'errors.sign.in.flow.completion.failure': 'Ocorreu um erro ao completar o login. Tente novamente mais tarde.', + 'errors.sign.in.flow.passkeys.failure': + 'Ocorreu um erro ao entrar com as chaves de acesso (passkeys). Tente novamente mais tarde.', 'errors.sign.in.flow.passkeys.completion.failure': 'Ocorreu um erro ao completar o login com as chaves de acesso (passkeys). Tente novamente mais tarde.', }; From a71f79a37fda998f21dd61771b8feeeb4c4d70d2 Mon Sep 17 00:00:00 2001 From: "Flaviano O. Silva" Date: Wed, 8 Oct 2025 01:44:36 -0300 Subject: [PATCH 3/3] feat(i18n): add Portuguese (pt-PT) translation, introduces the Portuguese (Portugal) language pack --- .changeset/two-oranges-call.md | 5 + packages/i18n/src/translations/index.ts | 1 + packages/i18n/src/translations/pt-PT.ts | 160 ++++++++++++++++++++++++ 3 files changed, 166 insertions(+) create mode 100644 .changeset/two-oranges-call.md create mode 100644 packages/i18n/src/translations/pt-PT.ts diff --git a/.changeset/two-oranges-call.md b/.changeset/two-oranges-call.md new file mode 100644 index 000000000..c15a04283 --- /dev/null +++ b/.changeset/two-oranges-call.md @@ -0,0 +1,5 @@ +--- +'@asgardeo/i18n': minor +--- + +Add Portuguese (pt-PT) language support to @asgardeo/i18n package. diff --git a/packages/i18n/src/translations/index.ts b/packages/i18n/src/translations/index.ts index 5f1c28a1d..7c78ff132 100644 --- a/packages/i18n/src/translations/index.ts +++ b/packages/i18n/src/translations/index.ts @@ -20,4 +20,5 @@ export {default as en_US} from './en-US'; export {default as fr_FR} from './fr-FR'; export {default as hi_IN} from './hi-IN'; export {default as pt_BR} from './pt-BR'; +export {default as pt_PT} from './pt-PT'; export {default as si_LK} from './si-LK'; diff --git a/packages/i18n/src/translations/pt-PT.ts b/packages/i18n/src/translations/pt-PT.ts new file mode 100644 index 000000000..0c1f06a58 --- /dev/null +++ b/packages/i18n/src/translations/pt-PT.ts @@ -0,0 +1,160 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable sort-keys */ +/* eslint-disable @typescript-eslint/naming-convention */ + +import {I18nTranslations, I18nMetadata, I18nBundle} from '../models/i18n'; + +const translations: I18nTranslations = { + /* |---------------------------------------------------------------| */ + /* | Elements | */ + /* |---------------------------------------------------------------| */ + + /* Buttons */ + 'elements.buttons.signIn': 'Iniciar Sessão', + 'elements.buttons.signOut': 'Terminar Sessão', + 'elements.buttons.signUp': 'Registar-se', + 'elements.buttons.facebook': 'Iniciar Sessão com Facebook', + 'elements.buttons.google': 'Iniciar Sessão com Google', + 'elements.buttons.github': 'Iniciar Sessão com GitHub', + 'elements.buttons.microsoft': 'Iniciar Sessão com Microsoft', + 'elements.buttons.linkedin': 'Iniciar Sessão com LinkedIn', + 'elements.buttons.ethereum': 'Iniciar Sessão com Ethereum', + 'elements.buttons.multi.option': 'Iniciar Sessão com {connection}', + 'elements.buttons.social': 'Iniciar Sessão com {connection}', + + /* Fields */ + 'elements.fields.placeholder': 'Introduza o seu {field}', + + /* |---------------------------------------------------------------| */ + /* | Widgets | */ + /* |---------------------------------------------------------------| */ + + /* Base Sign In */ + 'signin.title': 'Iniciar Sessão', + 'signin.subtitle': 'Introduza as suas credenciais para continuar.', + + /* Base Sign Up */ + 'signup.title': 'Registar-se', + 'signup.subtitle': 'Crie uma nova conta para começar.', + + /* Email OTP */ + 'email.otp.title': 'Verificação OTP', + 'email.otp.subtitle': 'Introduza o código enviado para o seu e-mail.', + 'email.otp.submit.button': 'Continuar', + + /* Identifier First */ + 'identifier.first.title': 'Iniciar Sessão', + 'identifier.first.subtitle': 'Introduza o seu utilizador ou e-mail.', + 'identifier.first.submit.button': 'Continuar', + + /* SMS OTP */ + 'sms.otp.title': 'Verificação OTP', + 'sms.otp.subtitle': 'Introduza o código enviado para o seu telemóvel.', + 'sms.otp.submit.button': 'Continuar', + + /* TOTP */ + 'totp.title': 'Verifique a sua identidade', + 'totp.subtitle': 'Introduza o código da sua aplicação autenticadora.', + 'totp.submit.button': 'Continuar', + + /* Username Password */ + 'username.password.submit.button': 'Continuar', + 'username.password.title': 'Iniciar Sessão', + 'username.password.subtitle': 'Introduza o seu utilizador e palavra-passe para continuar.', + + /* |---------------------------------------------------------------| */ + /* | User Profile | */ + /* |---------------------------------------------------------------| */ + + 'user.profile.title': 'Perfil', + 'user.profile.update.generic.error': 'Ocorreu um erro ao actualizar o seu perfil. Tente novamente.', + + /* |---------------------------------------------------------------| */ + /* | Organization Switcher | */ + /* |---------------------------------------------------------------| */ + + 'organization.switcher.select.organization': 'Escolher Organização', + 'organization.switcher.switch.organization': 'Trocar Organização', + 'organization.switcher.loading.organizations': 'A carregar organizações...', + 'organization.switcher.members': 'membros', + 'organization.switcher.member': 'membro', + 'organization.switcher.create.organization': 'Criar Organização', + 'organization.switcher.manage.organizations': 'Gerir Organizações', + 'organization.switcher.manage.button': 'Gerir', + 'organization.switcher.organizations.title': 'Organizações', + 'organization.switcher.switch.button': 'Trocar', + 'organization.switcher.no.access': 'Sem Acesso', + 'organization.switcher.status.label': 'Estado:', + 'organization.switcher.showing.count': 'A mostrar {showing} de {total} organizações', + 'organization.switcher.refresh.button': 'Actualizar', + 'organization.switcher.load.more': 'Carregar Mais Organizações', + 'organization.switcher.loading.more': 'A carregar...', + 'organization.switcher.no.organizations': 'Nenhuma organização encontrada', + 'organization.switcher.error.prefix': 'Erro:', + 'organization.profile.title': 'Perfil da Organização', + 'organization.profile.loading': 'A carregar organização...', + 'organization.profile.error': 'Falha ao carregar organização', + + 'organization.create.title': 'Criar Organização', + 'organization.create.name.label': 'Nome da Organização', + 'organization.create.name.placeholder': 'Introduza o nome da organização', + 'organization.create.handle.label': 'Identificador da Organização', + 'organization.create.handle.placeholder': 'minha-organizacao', + 'organization.create.description.label': 'Descrição', + 'organization.create.description.placeholder': 'Introduza a descrição da organização', + 'organization.create.button': 'Criar Organização', + 'organization.create.creating': 'A criar...', + 'organization.create.cancel': 'Cancelar', + + /* |---------------------------------------------------------------| */ + /* | Messages | */ + /* |---------------------------------------------------------------| */ + + 'messages.loading': 'A carregar...', + + /* |---------------------------------------------------------------| */ + /* | Errors | */ + /* |---------------------------------------------------------------| */ + + 'errors.title': 'Erro', + 'errors.sign.in.initialization': 'Ocorreu um erro ao inicializar. Tente novamente mais tarde.', + 'errors.sign.in.flow.failure': 'Ocorreu um erro durante o início de sessão. Tente novamente mais tarde.', + 'errors.sign.in.flow.completion.failure': + 'Ocorreu um erro ao completar o início de sessão. Tente novamente mais tarde.', + 'errors.sign.in.flow.passkeys.failure': + 'Ocorreu um erro ao iniciar sessão com as chaves de acesso (passkeys). Tente novamente mais tarde.', + 'errors.sign.in.flow.passkeys.completion.failure': + 'Ocorreu um erro ao completar o início de sessão com as chaves de acesso (passkeys). Tente novamente mais tarde.', +}; + +const metadata: I18nMetadata = { + localeCode: 'pt-PT', + countryCode: 'PT', + languageCode: 'pt', + displayName: 'Português (Portugal)', + direction: 'ltr', +}; + +const pt_PT: I18nBundle = { + metadata, + translations, +}; + +export default pt_PT;