Skip to content

Added missing ptBR translations #6503

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/forty-bottles-accept.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@clerk/localizations': patch
---

added missing ptBR translations
159 changes: 91 additions & 68 deletions packages/localizations/src/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,37 +14,58 @@ import type { LocalizationResource } from '@clerk/types';

export const ptBR: LocalizationResource = {
locale: 'pt-BR',
taskChooseOrganization: {
signOut: {
actionLink: 'Sair',
actionText: 'Conectado como {{identifier}}',
},
createOrganization: {
title: 'Configure sua conta',
subtitle: 'Conte-nos um pouco sobre sua organização',
formButtonSubmit: 'Criar nova organização',
formButtonReset: 'Cancelar',
},
chooseOrganization: {
title: 'Escolha uma organização',
subtitle: 'Junte-se a uma organização existente ou crie uma nova',
suggestionsAcceptedLabel: 'Aprovação pendente',
action__createOrganization: 'Criar nova organização',
action__suggestionsAccept: 'Solicitar participação',
action__invitationAccept: 'Participar',
},
},
apiKeys: {
action__add: undefined,
action__search: undefined,
createdAndExpirationStatus__expiresOn: undefined,
createdAndExpirationStatus__never: undefined,
detailsTitle__emptyRow: undefined,
formButtonPrimary__add: undefined,
formFieldCaption__expiration__expiresOn: undefined,
formFieldCaption__expiration__never: undefined,
formFieldOption__expiration__180d: undefined,
formFieldOption__expiration__1d: undefined,
formFieldOption__expiration__1y: undefined,
formFieldOption__expiration__30d: undefined,
formFieldOption__expiration__60d: undefined,
formFieldOption__expiration__7d: undefined,
formFieldOption__expiration__90d: undefined,
formFieldOption__expiration__never: undefined,
formHint: undefined,
formTitle: undefined,
lastUsed__days: undefined,
lastUsed__hours: undefined,
lastUsed__minutes: undefined,
lastUsed__months: undefined,
lastUsed__seconds: undefined,
lastUsed__years: undefined,
menuAction__revoke: undefined,
action__add: 'Adicionar nova chave',
action__search: 'Pesquisar chaves',
createdAndExpirationStatus__expiresOn:
"Criada {{ createdDate | shortDate('pt-BR') }} • Expira {{ expiresDate | longDate('pt-BR') }}",
createdAndExpirationStatus__never: "Criada {{ createdDate | shortDate('pt-BR') }} • Nunca expira",
detailsTitle__emptyRow: 'Nenhuma chave de API encontrada',
formButtonPrimary__add: 'Criar chave',
formFieldCaption__expiration__expiresOn: 'Expira em {{ date }}',
formFieldCaption__expiration__never: 'Esta chave nunca expirará',
formFieldOption__expiration__180d: '180 Dias',
formFieldOption__expiration__1d: '1 Dia',
formFieldOption__expiration__1y: '1 Ano',
formFieldOption__expiration__30d: '30 Dias',
formFieldOption__expiration__60d: '60 Dias',
formFieldOption__expiration__7d: '7 Dias',
formFieldOption__expiration__90d: '90 Dias',
formFieldOption__expiration__never: 'Nunca',
formHint: 'Forneça um nome para gerar uma nova chave. Você poderá revogá-la a qualquer momento.',
formTitle: 'Adicionar nova chave de API',
lastUsed__days: '{{days}}d atrás',
lastUsed__hours: '{{hours}}h atrás',
lastUsed__minutes: '{{minutes}}m atrás',
lastUsed__months: '{{months}}m atrás',
lastUsed__seconds: '{{seconds}}s atrás',
lastUsed__years: '{{years}}a atrás',
Comment on lines +57 to +62
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Disambiguate time abbreviations for minutes vs. months

Both minutes and months use “m”, which is ambiguous. Suggest:

  • minutes → “min”
  • months → “mês(es)”

This matches common pt-BR conventions and avoids confusion.

-    lastUsed__minutes: '{{minutes}}m atrás',
-    lastUsed__months: '{{months}}m atrás',
+    lastUsed__minutes: '{{minutes}}min atrás',
+    lastUsed__months: '{{months}}mês(es) atrás',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
lastUsed__days: '{{days}}d atrás',
lastUsed__hours: '{{hours}}h atrás',
lastUsed__minutes: '{{minutes}}m atrás',
lastUsed__months: '{{months}}m atrás',
lastUsed__seconds: '{{seconds}}s atrás',
lastUsed__years: '{{years}}a atrás',
lastUsed__days: '{{days}}d atrás',
lastUsed__hours: '{{hours}}h atrás',
- lastUsed__minutes: '{{minutes}}m atrás',
- lastUsed__months: '{{months}}m atrás',
+ lastUsed__minutes: '{{minutes}}min atrás',
+ lastUsed__months: '{{months}}mês(es) atrás',
lastUsed__seconds: '{{seconds}}s atrás',
lastUsed__years: '{{years}}a atrás',
🤖 Prompt for AI Agents
In packages/localizations/src/pt-BR.ts between lines 57 and 62, the time
abbreviations for minutes and months both use "m", causing ambiguity. Change the
abbreviation for minutes from "m" to "min" and for months from "m" to "mês" or
"meses" to clearly distinguish them according to pt-BR conventions.

menuAction__revoke: 'Revogar chave',
revokeConfirmation: {
confirmationText: undefined,
formButtonPrimary__revoke: undefined,
formHint: undefined,
formTitle: undefined,
confirmationText: 'Revogar',
formButtonPrimary__revoke: 'Revogar chave',
formHint: 'Tem certeza de que deseja excluir esta chave secreta?',
formTitle: 'Revogar chave secreta "{{apiKeyName}}"?',
},
Comment on lines +65 to 69
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Consistent terminology: use “chave de API” (not “chave secreta”)

Elsewhere you use “Chaves de API”. For consistency and clarity, prefer “chave de API” in revoke copy and title.

-      formHint: 'Tem certeza de que deseja excluir esta chave secreta?',
-      formTitle: 'Revogar chave secreta "{{apiKeyName}}"?',
+      formHint: 'Tem certeza de que deseja excluir esta chave de API?',
+      formTitle: 'Revogar chave de API "{{apiKeyName}}"?',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
confirmationText: 'Revogar',
formButtonPrimary__revoke: 'Revogar chave',
formHint: 'Tem certeza de que deseja excluir esta chave secreta?',
formTitle: 'Revogar chave secreta "{{apiKeyName}}"?',
},
confirmationText: 'Revogar',
formButtonPrimary__revoke: 'Revogar chave',
formHint: 'Tem certeza de que deseja excluir esta chave de API?',
formTitle: 'Revogar chave de API "{{apiKeyName}}"?',
},
🤖 Prompt for AI Agents
In packages/localizations/src/pt-BR.ts around lines 65 to 69, replace all
instances of "chave secreta" with "chave de API" in the revoke confirmation text
and title to maintain consistent terminology across the application. Update the
formHint and formTitle strings accordingly to use "chave de API" instead of
"chave secreta".

},
backButton: 'Voltar',
Expand All @@ -55,8 +76,8 @@ export const ptBR: LocalizationResource = {
badge__endsAt: "Termina {{ date | shortDate('pt-BR') }}",
badge__expired: 'Expirado',
badge__otherImpersonatorDevice: 'Personificar outro dispositivo',
badge__pastDueAt: undefined,
badge__pastDuePlan: undefined,
badge__pastDueAt: "Vencido em {{ date | shortDate('pt-BR') }}",
badge__pastDuePlan: 'Vencido',
badge__primary: 'Principal',
badge__renewsAt: "Renova {{ date | shortDate('pt-BR') }}",
badge__requiresAction: 'Requer ação',
Expand All @@ -80,7 +101,8 @@ export const ptBR: LocalizationResource = {
cancelSubscriptionTitle: 'Cancelar assinatura do plano {{plan}}?',
cannotSubscribeMonthly:
'Você não pode assinar este plano pagando mensalmente. Para assinar este plano, você precisa escolher pagar anualmente.',
cannotSubscribeUnrecoverable: undefined,
cannotSubscribeUnrecoverable:
'Você não pode assinar este plano. Sua assinatura existente é mais cara que este plano.',
checkout: {
description__paymentSuccessful: 'Seu pagamento foi realizado com sucesso.',
description__subscriptionSuccessful: 'Sua nova assinatura está pronta.',
Expand Down Expand Up @@ -139,26 +161,26 @@ export const ptBR: LocalizationResource = {
seeAllFeatures: 'Ver todos os recursos',
subscribe: 'Assinar',
subscriptionDetails: {
beginsOn: undefined,
currentBillingCycle: undefined,
endsOn: undefined,
nextPaymentAmount: undefined,
nextPaymentOn: undefined,
pastDueAt: undefined,
renewsAt: undefined,
subscribedOn: undefined,
title: undefined,
beginsOn: 'Inicia em',
currentBillingCycle: 'Ciclo de faturamento atual',
endsOn: 'Termina em',
nextPaymentAmount: 'Valor do próximo pagamento',
nextPaymentOn: 'Próximo pagamento em',
pastDueAt: 'Vencido em',
renewsAt: 'Renova em',
subscribedOn: 'Assinado em',
title: 'Assinatura',
},
subtotal: 'Subtotal',
switchPlan: 'Mudar de plano',
switchToAnnual: 'Mudar para anual',
switchToAnnualWithAnnualPrice: undefined,
switchToAnnualWithAnnualPrice: 'Mudar para anual {{currency}}{{price}} / ano',
switchToMonthly: 'Mudar para mensal',
switchToMonthlyWithPrice: undefined,
switchToMonthlyWithPrice: 'Mudar para mensal {{currency}}{{price}} / mês',
totalDue: 'Total devido',
totalDueToday: 'Total devido hoje',
viewFeatures: 'Ver recursos',
viewPayment: undefined,
viewPayment: 'Ver pagamento',
year: 'Ano',
},
createOrganization: {
Expand All @@ -177,7 +199,7 @@ export const ptBR: LocalizationResource = {
sameDay: "Hoje às {{ date | timeString('pt-BR') }}",
},
dividerText: 'ou',
footerActionLink__alternativePhoneCodeProvider: undefined,
footerActionLink__alternativePhoneCodeProvider: 'Enviar código via SMS',
footerActionLink__useAnotherMethod: 'Utilize outro método',
footerPageLink__help: 'Ajuda',
footerPageLink__privacy: 'Privacidade',
Expand All @@ -191,9 +213,9 @@ export const ptBR: LocalizationResource = {
formFieldHintText__optional: 'Opcional',
formFieldHintText__slug:
'Um rótulo é um identificador legível por humanos que deve ser único. É comumente usado em URLs.',
formFieldInputPlaceholder__apiKeyDescription: undefined,
formFieldInputPlaceholder__apiKeyExpirationDate: undefined,
formFieldInputPlaceholder__apiKeyName: undefined,
formFieldInputPlaceholder__apiKeyDescription: 'Explique por que você está gerando esta chave',
formFieldInputPlaceholder__apiKeyExpirationDate: 'Selecionar data',
formFieldInputPlaceholder__apiKeyName: 'Digite o nome da sua chave secreta',
formFieldInputPlaceholder__backupCode: 'Insira o código de backup',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Placeholder: prefer “chave de API” over “chave secreta”

Align with the rest of the file (e.g., page titles) and common wording.

-  formFieldInputPlaceholder__apiKeyName: 'Digite o nome da sua chave secreta',
+  formFieldInputPlaceholder__apiKeyName: 'Digite o nome da sua chave de API',

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In packages/localizations/src/pt-BR.ts at line 219, the placeholder text uses
"código de backup" which should be updated to use "chave de API" to align with
the rest of the file and common terminology. Replace the string value with
"Insira a chave de API" to maintain consistency in wording.

formFieldInputPlaceholder__confirmDeletionUserAccount: 'Excluir conta',
formFieldInputPlaceholder__emailAddress: 'Digite o endereço de e-mail',
Expand All @@ -208,9 +230,9 @@ export const ptBR: LocalizationResource = {
formFieldInputPlaceholder__password: 'Digite sua senha',
formFieldInputPlaceholder__phoneNumber: 'Digite seu número de telefone',
formFieldInputPlaceholder__username: 'Digite seu nome de usuário',
formFieldLabel__apiKeyDescription: undefined,
formFieldLabel__apiKeyExpiration: undefined,
formFieldLabel__apiKeyName: undefined,
formFieldLabel__apiKeyDescription: 'Descrição',
formFieldLabel__apiKeyExpiration: 'Expiração',
formFieldLabel__apiKeyName: 'Nome da chave secreta',
formFieldLabel__automaticInvitations: 'Ativar convites automáticos para este domínio',
Comment on lines +233 to 236
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Label: prefer “chave de API” over “chave secreta”

Keep terminology consistent with titles/navigation.

-  formFieldLabel__apiKeyName: 'Nome da chave secreta',
+  formFieldLabel__apiKeyName: 'Nome da chave de API',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
formFieldLabel__apiKeyDescription: 'Descrição',
formFieldLabel__apiKeyExpiration: 'Expiração',
formFieldLabel__apiKeyName: 'Nome da chave secreta',
formFieldLabel__automaticInvitations: 'Ativar convites automáticos para este domínio',
formFieldLabel__apiKeyDescription: 'Descrição',
formFieldLabel__apiKeyExpiration: 'Expiração',
formFieldLabel__apiKeyName: 'Nome da chave de API',
formFieldLabel__automaticInvitations: 'Ativar convites automáticos para este domínio',
🤖 Prompt for AI Agents
In packages/localizations/src/pt-BR.ts around lines 233 to 236, the label "Nome
da chave secreta" should be changed to "Nome da chave de API" to maintain
consistent terminology with titles and navigation. Update the string value
accordingly to reflect this preferred phrasing.

formFieldLabel__backupCode: 'Código de backup',
formFieldLabel__confirmDeletion: 'Confirmar exclusão',
Expand Down Expand Up @@ -256,7 +278,7 @@ export const ptBR: LocalizationResource = {
},
organizationProfile: {
apiKeysPage: {
title: undefined,
title: 'Chaves de API',
},
badge__automaticInvitation: 'Convites automáticos',
badge__automaticSuggestion: 'Sugestões automáticas',
Expand Down Expand Up @@ -378,7 +400,7 @@ export const ptBR: LocalizationResource = {
},
},
navbar: {
apiKeys: undefined,
apiKeys: 'Chaves de API',
billing: 'Faturamento',
description: 'Gerencie sua organização.',
general: 'Geral',
Expand Down Expand Up @@ -696,7 +718,7 @@ export const ptBR: LocalizationResource = {
title: 'Entrar no {{applicationName}} com {{provider}}',
},
subtitle: 'para continuar em {{applicationName}}',
subtitleCombined: undefined,
subtitleCombined: 'Bem-vindo de volta! Por favor, faça login para continuar',
title: 'Entrar',
titleCombined: 'Continuar em {{applicationName}}',
},
Expand Down Expand Up @@ -797,29 +819,29 @@ export const ptBR: LocalizationResource = {
},
},
socialButtonsBlockButton: 'Continuar com {{provider|titleize}}',
socialButtonsBlockButtonManyInView: undefined,
socialButtonsBlockButtonManyInView: '{{provider|titleize}}',
unstable__errors: {
already_a_member_in_organization: '{{email}} já é membro da organização.',
captcha_invalid:
'Não foi possível se inscrever devido a falhas nas validações de segurança. Por favor, atualize a página para tentar novamente ou entre em contato com o suporte para obter mais ajuda.',
captcha_unavailable:
'Não foi possível se inscrever devido à indisponibilidade do captcha. Por favor atualize a página para tentar novamente ou entre em contato com o suporte para obter mais ajuda.',
form_code_incorrect: undefined,
form_code_incorrect: 'Código incorreto.',
form_identifier_exists__email_address: 'E-mail já está em uso. Por favor, tente outro.',
form_identifier_exists__phone_number: 'Telefone já está em uso. Por favor, tente outro.',
form_identifier_exists__username: 'Nome de usuário já está em uso. Por favor, tente outro.',
form_identifier_not_found: 'Não foi possível encontrar o usuário.',
form_param_format_invalid: undefined,
form_param_format_invalid: 'Formato inválido.',
form_param_format_invalid__email_address: 'O endereço de e-mail deve ser um endereço de e-mail válido.',
form_param_format_invalid__phone_number: 'Número de telefone precisa estar num formato internacional válido.',
form_param_max_length_exceeded__first_name: 'O primeiro nome não deve exceder 256 caracteres.',
form_param_max_length_exceeded__last_name: 'O sobrenome não deve exceder 256 caracteres.',
form_param_max_length_exceeded__name: 'O nome não deve exceder 256 caracteres.',
form_param_nil: undefined,
form_param_type_invalid: undefined,
form_param_type_invalid__email_address: undefined,
form_param_type_invalid__phone_number: undefined,
form_param_value_invalid: undefined,
form_param_nil: 'Campo obrigatório.',
form_param_type_invalid: 'Tipo de parâmetro inválido.',
form_param_type_invalid__email_address: 'Endereço de e-mail inválido.',
form_param_type_invalid__phone_number: 'Número de telefone inválido.',
form_param_value_invalid: 'Valor inválido.',
form_password_incorrect: 'Senha incorreta.',
form_password_length_too_short: 'Sua senha é muito curta. Por favor, tente novamente.',
form_password_not_strong_enough: 'Sua senha não é forte o suficiente.',
Expand All @@ -835,7 +857,8 @@ export const ptBR: LocalizationResource = {
"O endereço de e-mail ou número de telefone não é permitido para registro. Isso pode ser devido ao uso de '+', '=', '#' ou '.' no endereço de e-mail, o uso de um domínio associado a um serviço de e-mail temporário ou uma exclusão explícita.",
organization_domain_blocked: 'Este é um provedor de domínio de e-mail bloqueado. Por favor, use um diferente.',
organization_domain_common: 'Este é um provedor de domínio de e-mail comum. Por favor, use um diferente.',
organization_domain_exists_for_enterprise_connection: undefined,
organization_domain_exists_for_enterprise_connection:
'Este domínio já existe para uma conexão empresarial.',
organization_membership_quota_exceeded:
'Você chegou ao seu limite de membros da organização, incluindo convites pendentes.',
organization_minimum_permissions_needed:
Expand All @@ -856,7 +879,7 @@ export const ptBR: LocalizationResource = {
},
phone_number_exists: 'Este número de telefone já está em uso. Por favor, tente outro.',
session_exists: 'Você já está conectado.',
web3_missing_identifier: undefined,
web3_missing_identifier: 'Uma extensão de carteira Web3 não pode ser encontrada. Por favor, instale uma para continuar.',
zxcvbn: {
couldBeStronger: 'Sua senha funciona, mas poderia ser mais forte. Tente adicionar mais caracteres.',
goodPassword: 'Sua senha atende a todos os requisitos necessários.',
Expand Down Expand Up @@ -905,7 +928,7 @@ export const ptBR: LocalizationResource = {
},
userProfile: {
apiKeysPage: {
title: undefined,
title: 'Chaves de API',
},
backupCodePage: {
actionLabel__copied: 'Copiado!',
Expand Down Expand Up @@ -1091,7 +1114,7 @@ export const ptBR: LocalizationResource = {
mobileButton__menu: 'Menu',
navbar: {
account: 'Perfil',
apiKeys: undefined,
apiKeys: 'Chaves de API',
billing: 'Faturamento',
description: 'Gerencie seus dados de perfil.',
security: 'Segurança',
Expand Down Expand Up @@ -1195,7 +1218,7 @@ export const ptBR: LocalizationResource = {
passkeysSection: {
menuAction__destructive: 'Remover',
menuAction__rename: 'Renomear',
primaryButton: undefined,
primaryButton: 'Adicionar chave de acesso',
title: 'Chaves de acesso',
},
passwordSection: {
Expand All @@ -1222,7 +1245,7 @@ export const ptBR: LocalizationResource = {
},
web3WalletsSection: {
destructiveAction: 'Remover carteira',
detailsAction__nonPrimary: undefined,
detailsAction__nonPrimary: 'Conectar carteira',
primaryButton: 'Carteiras Web3',
title: 'Carteiras Web3',
},
Comment on lines 1247 to 1251
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Likely wrong action label: should be “Definir como principal”

For consistency with similar actions (e.g., phoneCode.detailsAction__nonPrimary), this should set the wallet as primary, not “connect wallet”.

-        detailsAction__nonPrimary: 'Conectar carteira',
+        detailsAction__nonPrimary: 'Definir como principal',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
destructiveAction: 'Remover carteira',
detailsAction__nonPrimary: undefined,
detailsAction__nonPrimary: 'Conectar carteira',
primaryButton: 'Carteiras Web3',
title: 'Carteiras Web3',
},
destructiveAction: 'Remover carteira',
- detailsAction__nonPrimary: 'Conectar carteira',
+ detailsAction__nonPrimary: 'Definir como principal',
primaryButton: 'Carteiras Web3',
title: 'Carteiras Web3',
🤖 Prompt for AI Agents
In packages/localizations/src/pt-BR.ts around lines 1247 to 1251, the label for
detailsAction__nonPrimary is incorrectly set to "Conectar carteira" but should
be "Definir como principal" to match the intended action of setting the wallet
as primary. Update the string value of detailsAction__nonPrimary to "Definir
como principal" for consistency with similar action labels.

Expand Down