Soundboard: naming a clip used window.prompt, which Electron does not implement — it returned nothing, the flow aborted in silence, and adding a sound worked in the browser while doing nothing at all in the desktop app. Replaced with a two-step field inside the popover, identical in both. Spotify, three separate defects behind the two symptoms reported: Out of sync — a 20s poll stacked on the activity store's 5s debounce left everyone else on the previous track for up to 25s. The next poll is now scheduled just past the current track's end instead of on a fixed interval, and a track change bypasses the debounce (it happens once every few minutes; the debounce exists for chatty producers). Vanishing — a paused track, and the silent gap Spotify reports between two songs, both cleared the activity outright. Pausing is now carried as state rather than absence, and an empty answer is tolerated for 25s before the block comes down. Progress bar — timestamps are computed with the server's clock and were drawn against the viewer's, so any drift displaced the bar; and it kept advancing after a pause until the next poll. The ready payload now carries server time so each client can correct its own offset, and the bar freezes when paused. Tray, native notifications and system audio in screen share were all found already implemented and wired end to end; recorded in the roadmap rather than built again.
138 lines
6.5 KiB
TypeScript
138 lines
6.5 KiB
TypeScript
import type { Dictionary } from './en';
|
|
|
|
/**
|
|
* Partial on purpose. Translation happens one system per update, and anything
|
|
* absent here falls back to English — so a half-migrated interface is never
|
|
* broken, just partly in English.
|
|
*/
|
|
export const ptBR: Partial<Dictionary> = {
|
|
// Configurações — navegação
|
|
'settings.tab.account': 'Conta',
|
|
'settings.tab.voice': 'Voz e Vídeo',
|
|
'settings.tab.privacy': 'Privacidade',
|
|
'settings.tab.connections': 'Conexões',
|
|
'settings.tab.keybinds': 'Atalhos',
|
|
'settings.tab.desktop': 'Desktop',
|
|
'settings.tab.instance': 'Instância',
|
|
'settings.tab.language': 'Idioma',
|
|
|
|
// Configurações — idioma
|
|
'settings.language.title': 'Idioma',
|
|
'settings.language.description': 'Escolha o idioma da interface. O que ainda não foi traduzido continua em inglês.',
|
|
'settings.language.en': 'Inglês',
|
|
'settings.language.ptBR': 'Português (Brasil)',
|
|
|
|
// Configurações — voz: entrada
|
|
'settings.voice.input.title': 'Dispositivo de entrada',
|
|
'settings.voice.input.volume': 'Volume de entrada',
|
|
'settings.voice.micTest.start': 'Testar microfone',
|
|
'settings.voice.micTest.stop': 'Parar teste',
|
|
'settings.voice.micTest.playing': 'Devolvendo seu microfone para você — fale alguma coisa.',
|
|
'settings.voice.micTest.inCall': 'O medidor fica ativo enquanto você está numa call.',
|
|
'settings.voice.micTest.idle': 'Teste seu microfone sem entrar numa call.',
|
|
'settings.voice.micTest.failed': 'Não foi possível abrir o microfone. Verifique o dispositivo e a permissão.',
|
|
|
|
// Soundboard
|
|
'soundboard.title': 'Soundboard',
|
|
'soundboard.empty': 'Nenhum som ainda.',
|
|
'soundboard.add': 'Adicionar som',
|
|
'soundboard.adding': 'Enviando...',
|
|
'soundboard.remove': 'Remover',
|
|
'soundboard.namePrompt': 'Nome deste som',
|
|
'soundboard.confirm': 'Adicionar',
|
|
'soundboard.cancel': 'Cancelar',
|
|
'soundboard.joinFirst': 'Entre num canal de voz para usar o soundboard.',
|
|
'soundboard.tooLarge': 'O som precisa ter menos de 2 MB e poucos segundos.',
|
|
'soundboard.uploadFailed': 'Não foi possível enviar esse arquivo. Tente outro.',
|
|
|
|
// Menu da conta (próprio nome na barra de usuário)
|
|
'accountMenu.editProfile': 'Editar perfil',
|
|
'accountMenu.status': 'Status',
|
|
'accountMenu.status.online': 'Disponível',
|
|
'accountMenu.status.idle': 'Ausente',
|
|
'accountMenu.status.dnd': 'Não perturbe',
|
|
'accountMenu.status.offline': 'Invisível',
|
|
'accountMenu.copyId': 'Copiar ID do usuário',
|
|
'accountMenu.copied': 'Copiado',
|
|
|
|
// Estatísticas
|
|
'stats.title': 'Estatísticas',
|
|
'stats.range.7': 'Últimos 7 dias',
|
|
'stats.range.30': 'Últimos 30 dias',
|
|
'stats.range.365': 'Último ano',
|
|
'stats.voice.title': 'Tempo em call',
|
|
'stats.messages.title': 'Mensagens enviadas',
|
|
'stats.empty': 'Nada registrado neste período ainda.',
|
|
'stats.total.voice': '{value} no total',
|
|
'stats.total.messages': '{value} mensagens no total',
|
|
'stats.hours': '{hours}h {minutes}min',
|
|
'stats.minutes': '{minutes}min',
|
|
'stats.note': 'A contagem começou quando esta funcionalidade foi instalada — atividade anterior não entra.',
|
|
|
|
// Registro de auditoria
|
|
'audit.title': 'Registro de auditoria',
|
|
'audit.empty': 'Nada registrado ainda. Mudanças no servidor aparecem aqui.',
|
|
'audit.loadMore': 'Carregar mais',
|
|
'audit.unknownActor': 'Conta excluída',
|
|
'audit.action.space.update': '{actor} alterou as configurações do servidor',
|
|
'audit.action.space.transfer_ownership': '{actor} transferiu a propriedade do servidor',
|
|
'audit.action.channel.create': '{actor} criou o canal {name}',
|
|
'audit.action.channel.update': '{actor} alterou o canal {name}',
|
|
'audit.action.channel.delete': '{actor} excluiu o canal {name}',
|
|
'audit.action.member.kick': '{actor} removeu um membro',
|
|
'audit.action.member.leave': '{actor} saiu do servidor',
|
|
'audit.action.member.ban': '{actor} baniu um membro',
|
|
'audit.action.member.unban': '{actor} removeu o banimento de um membro',
|
|
'audit.action.role.create': '{actor} criou o cargo {name}',
|
|
'audit.action.role.update': '{actor} alterou o cargo {name}',
|
|
'audit.action.role.delete': '{actor} excluiu um cargo',
|
|
'audit.action.invite.create': '{actor} criou um convite',
|
|
'audit.action.message.delete': '{actor} excluiu uma mensagem',
|
|
'audit.action.unknown': '{actor} realizou uma ação',
|
|
|
|
// Seletor de GIF
|
|
'gif.search': 'Buscar GIFs',
|
|
'gif.tab.favorites': 'Favoritos',
|
|
'gif.tab.trending': 'Em alta',
|
|
'gif.empty.search': 'Nenhum GIF encontrado',
|
|
'gif.empty.trending': 'Nenhum GIF em alta',
|
|
'gif.empty.favorites': 'Nenhum favorito ainda — toque na estrela de um GIF.',
|
|
'gif.favorite.add': 'Adicionar aos favoritos',
|
|
'gif.favorite.remove': 'Remover dos favoritos',
|
|
'gif.category.hello': 'oi',
|
|
'gif.category.lol': 'risada',
|
|
'gif.category.love': 'amor',
|
|
'gif.category.birthday': 'feliz aniversário',
|
|
'gif.category.dance': 'dança',
|
|
'gif.category.facepalm': 'vergonha alheia',
|
|
|
|
// Configurações — privacidade
|
|
'privacy.title': 'Privacidade',
|
|
'privacy.discoverable.label': 'Permitir que me encontrem',
|
|
'privacy.discoverable.description': 'Quando ativado, seu perfil aparece em Descobrir Pessoas. Qualquer um sempre pode te adicionar pelo nome de usuário exato.',
|
|
'privacy.activity.label': 'Compartilhar atividade',
|
|
'privacy.activity.description': 'Permite que os outros vejam o que você está fazendo, como jogos que está jogando ou música que está ouvindo.',
|
|
|
|
// Configurações — conexões
|
|
'connections.title': 'Conexões',
|
|
'connections.spotify.description': 'Mostre no seu perfil o que você está ouvindo.',
|
|
'connections.spotify.connect': 'Conectar Spotify',
|
|
'connections.spotify.disconnect': 'Desconectar',
|
|
'connections.spotify.connected': 'Conectado',
|
|
'connections.spotify.notConfigured': 'Esta instância não tem credenciais do Spotify configuradas.',
|
|
'connections.spotify.hint': 'Só é lido o que está tocando — não é possível controlar a reprodução.',
|
|
'connections.spotify.error.denied': 'A autorização foi cancelada no Spotify.',
|
|
'connections.spotify.error.invalid_state': 'O link de autorização expirou. Tente de novo.',
|
|
'connections.spotify.error.exchange_failed': 'O Spotify recusou a autorização. Tente de novo.',
|
|
|
|
// Cartão de perfil
|
|
'profile.aboutMe': 'Sobre mim',
|
|
'profile.memberSince': 'Membro desde',
|
|
'profile.sendMessage': 'Enviar mensagem',
|
|
'profile.activity.playing': 'Jogando',
|
|
'profile.activity.listening': 'Ouvindo',
|
|
'profile.activity.watching': 'Assistindo',
|
|
'profile.activity.streaming': 'Transmitindo',
|
|
'profile.activity.elapsed': '{time} decorrido',
|
|
};
|