feat: add support for pt-BR and pt-PT

This commit is contained in:
codytseng
2025-03-02 23:02:59 +08:00
parent 36240edc12
commit 5e7c852624
4 changed files with 220 additions and 5 deletions

View File

@@ -9,7 +9,8 @@ import es from './locales/es'
import fr from './locales/fr'
import ja from './locales/ja'
import pl from './locales/pl'
import pt from './locales/pt'
import pt_BR from './locales/pt-BR'
import pt_PT from './locales/pt-PT'
import ru from './locales/ru'
import zh from './locales/zh'
@@ -22,7 +23,8 @@ const languages = {
de: { resource: de, name: 'Deutsch' },
ja: { resource: ja, name: '日本語' },
ru: { resource: ru, name: 'Русский' },
pt: { resource: pt, name: 'Português' },
'pt-BR': { resource: pt_BR, name: 'Português (Brasil)' },
'pt-PT': { resource: pt_PT, name: 'Português (Portugal)' },
ar: { resource: ar, name: 'العربية' }
} as const
@@ -65,7 +67,8 @@ i18n.services.formatter?.add('date', (timestamp, lng) => {
return dayjs(timestamp).format('DD.MM.YYYY')
case 'es':
case 'fr':
case 'pt':
case 'pt-BR':
case 'pt-PT':
case 'ar':
return dayjs(timestamp).format('DD/MM/YYYY')
default:

212
src/i18n/locales/pt-PT.ts Normal file
View File

@@ -0,0 +1,212 @@
export default {
translation: {
// NOTE: The translations below were generated by ChatGPT and have not yet been verified.
'Welcome! 🥳': 'Bem-vindo! 🥳',
About: 'Sobre',
'New Note': 'Nova Nota',
Post: 'Postar',
Home: 'Início',
'Relay settings': 'Configurações de Relé',
Settings: 'Configurações',
SidebarRelays: 'Relés',
Refresh: 'Atualizar',
Profile: 'Perfil',
Logout: 'Sair',
Following: 'Seguindo',
followings: 'seguidos',
reposted: 'repostado',
'just now': 'agora mesmo',
'n minutes ago': '{{n}} minutos atrás',
'n m': '{{n}}m',
'n hours ago': '{{n}} horas atrás',
'n h': '{{n}}h',
'n days ago': '{{n}} dias atrás',
'n d': '{{n}}d',
date: '{{timestamp, date}}',
Follow: 'Seguir',
Unfollow: 'Deixar de Seguir',
'Follow failed': 'Falha ao Seguir',
'Unfollow failed': 'Falha ao Deixar de Seguir',
'show new notes': 'mostrar novas notas',
'loading...': 'carregando...',
'no more notes': 'não há mais notas',
'reply to': 'responder a',
reply: 'responder',
Reply: 'Responder',
'load more older replies': 'carregar mais respostas antigas',
'Write something...': 'Escreva algo...',
Cancel: 'Cancelar',
Mentions: 'Menções',
'Failed to post': 'Falha ao postar',
'Post successful': 'Postagem bem-sucedida',
'Your post has been published': 'Sua postagem foi publicada',
Repost: 'Repostar',
Quote: 'Citar',
'Copy event ID': 'Copiar ID do evento',
'Copy user ID': 'Copiar ID do usuário',
'View raw event': 'Ver evento bruto',
Like: 'Curtir',
'switch to light theme': 'alternar para tema claro',
'switch to dark theme': 'alternar para tema escuro',
'switch to system theme': 'alternar para tema do sistema',
Note: 'Nota',
note: 'nota',
"username's following": 'seguindo de {{username}}',
"username's used relays": 'relés usados por {{username}}',
"username's muted": '{{username}} silenciado',
Login: 'Entrar',
'Follows you': 'Segue você',
'Relay Settings': 'Configurações de Relé',
'Relay set name': 'Nome do conjunto de relé',
'Add a new relay set': 'Adicionar um novo conjunto de relé',
Add: 'Adicionar',
'n relays': '{{n}} relés',
Rename: 'Renomear',
'Copy share link': 'Copiar link de compartilhamento',
Delete: 'Excluir',
'Relay already exists': 'Relé já existe',
'invalid relay URL': 'URL de relé inválida',
'Add a new relay': 'Adicionar um novo relé',
back: 'voltar',
'Lost in the void': 'Perdido no vazio',
'Carry me home': 'Me leve para casa',
'no replies': 'sem respostas',
'Reply to': 'Responder a',
Search: 'Pesquisar',
'The relays you are connected to do not support search':
'Os relés aos quais você está conectado não suportam pesquisa',
'supports search': 'suporta pesquisa',
'Show more...': 'Mostrar mais...',
'All users': 'Todos os usuários',
'Display replies': 'Exibir respostas',
Notes: 'Notas',
Replies: 'Respostas',
Notifications: 'Notificações',
'no more notifications': 'não há mais notificações',
'Using private key login is insecure. It is recommended to use a browser extension for login, such as alby, nostr-keyx or nos2x.':
'Usar login com chave privada é inseguro. Recomenda-se utilizar uma extensão do navegador, como alby, nostr-keyx ou nos2x.',
'Login with Browser Extension': 'Entrar com Extensão do Navegador',
'Login with Bunker': 'Entrar com Bunker',
'Login with Private Key': 'Entrar com Chave Privada',
'reload notes': 'recarregar notas',
'Logged in Accounts': 'Contas Conectadas',
'Add an Account': 'Adicionar uma Conta',
'More options': 'Mais opções',
'Add client tag': 'Adicionar tag de cliente',
'Show others this was sent via Jumble': 'Mostrar aos outros que isso foi enviado via Jumble',
'Are you sure you want to logout?': 'Tem certeza de que deseja sair?',
'relay sets': 'conjuntos de relé',
edit: 'editar',
Languages: 'Idiomas',
Theme: 'Tema',
System: 'Sistema',
Light: 'Claro',
Dark: 'Escuro',
Temporary: 'Temporário',
'Choose a relay set': 'Escolha um conjunto de relé',
'Switch account': 'Trocar de Conta',
Pictures: 'Imagens',
'Picture note': 'Nota de Imagem',
'A special note for picture-first clients like Olas':
'Uma nota especial para clientes que priorizam imagens, como Olas',
'Picture note requires images': 'Nota de imagem requer imagens',
Relays: 'Relés',
image: 'imagem',
'Normal Note': 'Nota Normal',
'Picture Note': 'Nota de Imagem',
'R & W': 'Leitura & Escrita',
Read: 'Ler',
Write: 'Escrever',
'Push to relays': 'Enviar para relés',
'Push Successful': 'Envio Bem-sucedido',
'Successfully pushed relay sets to relays': 'Conjuntos de relé enviados com sucesso',
'Pull from relays': 'Receber de relés',
'Select the relay sets you want to pull': 'Selecione os conjuntos de relé que deseja receber',
'No relay sets found': 'Nenhum conjunto de relé encontrado',
'Pull n relay sets': 'Receber {{n}} conjuntos de relé',
Pull: 'Receber',
'Select all': 'Selecionar todos',
'Relay Sets': 'Conjuntos de relé',
'Read & Write Relays': 'Relés de Leitura & Escrita',
'read relays description':
'Relés de leitura são usados para buscar eventos sobre você. Outros usuários publicarão os eventos que deseja ver nesses relés.',
'write relays description':
'Relés de escrita são usados para publicar seus eventos. Outros usuários buscarão seus eventos nesses relés.',
'read & write relays notice':
'O número de servidores de leitura e escrita deve ser mantido entre 2 e 4, idealmente.',
"Don't have an account yet?": 'Não tem uma conta ainda?',
'or simply generate a private key': 'ou simplesmente gere uma chave privada',
'This is a private key. Do not share it with anyone. Keep it safe and secure. You will not be able to recover it if you lose it.':
'Esta é uma chave privada. Não a compartilhe com ninguém. Mantenha-a segura, pois não poderá recuperá-la se perdê-la.',
Edit: 'Editar',
Save: 'Salvar',
'Display Name': 'Nome de Exibição',
Bio: 'Biografia',
'Nostr Address (NIP-05)': 'Endereço Nostr (NIP-05)',
'Invalid NIP-05 address': 'Endereço NIP-05 inválido',
'Copy private key': 'Copiar chave privada',
'Enter the password to decrypt your ncryptsec':
'Digite a senha para descriptografar seu ncryptsec',
Back: 'Voltar',
'optional: encrypt nsec': 'opcional: criptografar nsec',
password: 'senha',
'Sign up': 'Registrar-se',
'Save to': 'Salvar em',
'Enter a name for the new relay set': 'Digite um nome para o novo conjunto de relé',
'Save to a new relay set': 'Salvar em um novo conjunto de relé',
Mute: 'Silenciar',
Muted: 'Silenciado',
Unmute: 'Ativar som',
'Mute user': 'Silenciar usuário',
'Unmute user': 'Ativar som do usuário',
'Append n relays': 'Adicionar {{n}} relés',
Append: 'Adicionar',
'Select relays to append': 'Selecione os relés para adicionar',
'calculating...': 'calculando...',
'Calculate optimal read relays': 'Calcular relés de leitura ideais',
'Login to set': 'Entrar no conjunto',
'Please login to view following feed': 'Por favor, faça login para ver o feed de seguidores',
'Send only to r': 'Enviar apenas para {{r}}',
'Send only to these relays': 'Enviar apenas para estes relés',
Explore: 'Explorar',
'Search relays': 'Pesquisar relés',
relayInfoBadgeAuth: 'Auth',
relayInfoBadgeSearch: 'Pesquisar',
relayInfoBadgePayment: 'Pagamento',
Operator: 'Operador',
Contact: 'Contato',
Software: 'Software',
Version: 'Versão',
'Random Relays': 'Relés Aleatórios',
randomRelaysRefresh: 'Atualizar',
'Explore more': 'Explorar mais',
'Payment page': 'Página de Pagamento',
'Supported NIPs': 'NIPs Suportados',
'Open in a': 'Abrir em {{a}}',
'Cannot handle event of kind k': 'Não é possível lidar com o evento do tipo {{k}}',
'Sorry! The note cannot be found 😔': 'Desculpe! A nota não pode ser encontrada 😔',
'This user has been muted': 'Este usuário foi silenciado',
Wallet: 'Carteira',
Sats: 'Sats',
sats: 'sats',
'Zap to': 'Zap para',
'Zap n sats': 'Zap {{n}} sats',
zapComment: 'Comentário',
'Default zap amount': 'Valor padrão do zap',
'Default zap comment': 'Comentário padrão do zap',
'Lightning Address (or LNURL)': 'Endereço Lightning (ou LNURL)',
'Quick zap': 'Zap Rápido',
'If enabled, you can zap with a single click': 'Se ativado, você pode enviar zap com um clique',
All: 'Tudo',
Reactions: 'Reações',
Zaps: 'Zaps',
'Enjoying Jumble?': 'Gostando do Jumble?',
'Your donation helps me maintain Jumble and make it better! 😊':
'Sua doação me ajuda a manter o Jumble e torná-lo melhor! 😊',
'Earlier notifications': 'Notificações anteriores',
'Temporarily display this note': 'Exibir esta nota temporariamente',
buttonFollowing: 'Seguindo',
'Are you sure you want to unfollow this user?':
'Tem certeza de que deseja deixar de seguir este usuário?'
}
}

View File

@@ -45,7 +45,7 @@ const SettingsPage = forwardRef(({ index }: { index?: number }, ref) => {
<div>{t('Languages')}</div>
</div>
<Select defaultValue="en" value={language} onValueChange={handleLanguageChange}>
<SelectTrigger className="w-32">
<SelectTrigger className="w-48">
<SelectValue />
</SelectTrigger>
<SelectContent>
@@ -63,7 +63,7 @@ const SettingsPage = forwardRef(({ index }: { index?: number }, ref) => {
<div>{t('Theme')}</div>
</div>
<Select defaultValue="system" value={themeSetting} onValueChange={setThemeSetting}>
<SelectTrigger className="w-32">
<SelectTrigger className="w-48">
<SelectValue />
</SelectTrigger>
<SelectContent>