mirror of
https://github.com/screentinker/screentinker.git
synced 2026-05-15 07:32:23 -06:00
Session 1 of 2 of the i18n rollout. - Split i18n module into per-language files under frontend/js/i18n/ so a translator can edit one language without touching the others. - Add Portuguese (pt) and seed Hindi (hi). Hindi is intentionally a skeleton -- 0 keys, full English fallback -- because we have an active Indian user and would rather ship "no Hindi" than ship machine-quality Hindi that could read as unprofessional or get formality/gender register wrong. - 183 keys, 100% parity across en/es/fr/de/pt; native review still recommended before publicizing as "fully supported". - Add t(key, vars) variable substitution and tn(keyBase, n, vars) plural helper for _one/_other key pairs. - setLanguage() now triggers a CustomEvent + HashChangeEvent so the existing hash router naturally re-renders the current view, plus a subscriber pattern for nav labels rendered once outside the router. - Wire t() into 3 high-traffic views end-to-end: dashboard, login, content-library. Sidebar nav labels in app.js update on language change. - The remaining 16 views still ship with hardcoded English; they will be wired in session 2. The t() lookup is robust against unwired views, so the dashboard works in 5 languages while clicking into e.g. Schedule still shows English. No regressions. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
198 lines
9.9 KiB
JavaScript
198 lines
9.9 KiB
JavaScript
// Portuguese translations (Brazilian-leaning vocab; pt-BR is the larger market).
|
|
// Reviewed for UI register (informal você). Native review recommended before
|
|
// publicizing as fully supported.
|
|
export default {
|
|
// Nav
|
|
'nav.displays': 'Telas',
|
|
'nav.content': 'Conteúdo',
|
|
'nav.playlists': 'Playlists',
|
|
'nav.layouts': 'Layouts',
|
|
'nav.widgets': 'Widgets',
|
|
'nav.schedule': 'Agenda',
|
|
'nav.walls': 'Paredes de vídeo',
|
|
'nav.reports': 'Relatórios',
|
|
'nav.kiosk': 'Quiosque',
|
|
'nav.designer': 'Designer',
|
|
'nav.activity': 'Atividade',
|
|
'nav.teams': 'Equipes',
|
|
'nav.help': 'Ajuda',
|
|
'nav.settings': 'Configurações',
|
|
'nav.subscription': 'Assinatura',
|
|
'nav.admin': 'Admin',
|
|
|
|
// Common
|
|
'common.save': 'Salvar',
|
|
'common.cancel': 'Cancelar',
|
|
'common.delete': 'Excluir',
|
|
'common.edit': 'Editar',
|
|
'common.done': 'Concluído',
|
|
'common.loading': 'Carregando...',
|
|
'common.connected': 'Conectado',
|
|
'common.disconnected': 'Desconectado',
|
|
'common.never': 'Nunca',
|
|
'common.just_now': 'Agora mesmo',
|
|
'common.minutes_ago': 'há {n}m',
|
|
'common.hours_ago': 'há {n}h',
|
|
'common.days_ago': 'há {n}d',
|
|
'common.unknown': 'Desconhecido',
|
|
|
|
// Auth
|
|
'auth.sign_in': 'Entrar',
|
|
'auth.sign_out': 'Sair',
|
|
'auth.create_account': 'Criar conta',
|
|
'auth.create_admin_account': 'Criar conta de administrador',
|
|
'auth.email': 'E-mail',
|
|
'auth.password': 'Senha',
|
|
'auth.name': 'Nome',
|
|
'auth.placeholder_email': 'voce@exemplo.com',
|
|
'auth.placeholder_password': '••••••••',
|
|
'auth.placeholder_name': 'Seu nome',
|
|
'auth.placeholder_register_password': 'No mínimo 6 caracteres',
|
|
'auth.subtitle_setup': 'Crie sua conta de administrador para começar',
|
|
'auth.subtitle_signin': 'Entre para gerenciar suas telas',
|
|
'auth.trial_notice': 'Contas novas ganham 14 dias de avaliação Pro grátis',
|
|
'auth.divider_or': 'OU',
|
|
'auth.signin_google': 'Entrar com o Google',
|
|
'auth.signin_microsoft': 'Entrar com a Microsoft',
|
|
'auth.back_to_signin': 'Voltar ao login',
|
|
'auth.support_access': 'Acesso de suporte',
|
|
'auth.support_token_placeholder': 'Cole o token de suporte',
|
|
'auth.support_authenticate': 'Autenticar com token de suporte',
|
|
'auth.terms': 'Termos de Serviço',
|
|
'auth.privacy': 'Política de Privacidade',
|
|
'auth.error_email_password_required': 'E-mail e senha obrigatórios',
|
|
'auth.error_password_min_6': 'A senha deve ter no mínimo 6 caracteres',
|
|
'auth.error_login_failed': 'Falha no login',
|
|
'auth.error_registration_failed': 'Falha no cadastro',
|
|
'auth.error_paste_support_token': 'Cole um token de suporte',
|
|
'auth.error_support_failed': 'Falha no login de suporte',
|
|
'auth.error_google_failed': 'Falha no login com Google',
|
|
'auth.error_microsoft_failed': 'Falha no login com Microsoft',
|
|
|
|
// Dashboard
|
|
'dashboard.title': 'Telas',
|
|
'dashboard.subtitle': 'Gerencie suas telas remotas',
|
|
'dashboard.help_tip': 'Seus dispositivos pareados. Verde = online, vermelho = offline. Clique em um para gerenciar a playlist, ver telemetria ou usar o controle remoto.',
|
|
'dashboard.add': 'Adicionar tela',
|
|
'dashboard.create_group': '+ Grupo',
|
|
'dashboard.search': 'Buscar telas...',
|
|
'dashboard.all_status': 'Todos os status',
|
|
'dashboard.online': 'Online',
|
|
'dashboard.offline': 'Offline',
|
|
'dashboard.awaiting_pairing': 'Aguardando pareamento',
|
|
'dashboard.no_preview': 'Pré-visualização indisponível',
|
|
'dashboard.total_displays': 'Total de telas',
|
|
'dashboard.ungrouped': 'Sem grupo',
|
|
'dashboard.no_displays': 'Nenhuma tela ainda',
|
|
'dashboard.no_displays_desc': 'Instale o aplicativo ScreenTinker na sua TV e pareie com o botão acima.',
|
|
'dashboard.failed_to_load': 'Falha ao carregar as telas',
|
|
'dashboard.unknown_playlist': 'Playlist desconhecida',
|
|
'dashboard.mixed_playlists': 'Playlists variadas',
|
|
'dashboard.playlist_label': 'Playlist: {name}',
|
|
'dashboard.devices_count_one': '{n} dispositivo',
|
|
'dashboard.devices_count_other': '{n} dispositivos',
|
|
'dashboard.online_count': '{n} online',
|
|
'dashboard.set_playlist_placeholder': 'Definir playlist...',
|
|
'dashboard.send_command_placeholder': 'Enviar comando...',
|
|
'dashboard.manage': 'Gerenciar',
|
|
'dashboard.manage_tooltip': 'Adicionar/remover dispositivos',
|
|
'dashboard.delete_group_tooltip': 'Excluir grupo',
|
|
'dashboard.no_devices_in_group': 'Nenhum dispositivo neste grupo. Clique em Gerenciar para adicionar.',
|
|
'dashboard.manage_group_subtitle': 'Marque os dispositivos para adicioná-los a este grupo',
|
|
'dashboard.draft_suffix': '(rascunho)',
|
|
'dashboard.cmd.screen_on': 'Ligar tela',
|
|
'dashboard.cmd.screen_off': 'Desligar tela',
|
|
'dashboard.cmd.restart_app': 'Reiniciar app',
|
|
'dashboard.cmd.check_update': 'Verificar atualização',
|
|
'dashboard.cmd.reboot': 'Reiniciar',
|
|
'dashboard.cmd.shutdown': 'Desligar',
|
|
'dashboard.prompt_group_name': 'Nome do grupo:',
|
|
'dashboard.error_pairing_code': 'Digite um código de pareamento válido de 6 dígitos',
|
|
'dashboard.confirm_add_to_group': '{name} já está em: {groups}\n\nAdicionar também a "{target}"?',
|
|
'dashboard.confirm_assign_playlist': 'Atribuir a playlist "{playlist}" a todos os dispositivos de "{group}"?',
|
|
'dashboard.confirm_destructive_command': '{cmd} todos os {n} dispositivos de "{group}"?\n\nIsso não pode ser desfeito.',
|
|
'dashboard.confirm_delete_group': 'Excluir este grupo? Os dispositivos não serão afetados.',
|
|
'dashboard.toast.display_paired': 'Tela pareada com sucesso!',
|
|
'dashboard.toast.group_created': 'Grupo criado',
|
|
'dashboard.toast.group_deleted': 'Grupo excluído',
|
|
'dashboard.toast.already_in_group': '{name} já está em {group}',
|
|
'dashboard.toast.moved_device': '{name} movido para {group}',
|
|
'dashboard.toast.removed_device_one': '{name} removido de 1 grupo',
|
|
'dashboard.toast.removed_device_other': '{name} removido de {n} grupos',
|
|
'dashboard.toast.playlist_assigned_one': 'Playlist atribuída a 1 dispositivo',
|
|
'dashboard.toast.playlist_assigned_other': 'Playlist atribuída a {n} dispositivos',
|
|
'dashboard.toast.command_sent': '{cmd} enviado para {sent}/{total} dispositivos',
|
|
'dashboard.toast.command_sent_with_offline': '{cmd} enviado para {sent}/{total} dispositivos ({offline} offline)',
|
|
|
|
// Content library
|
|
'content.title': 'Biblioteca de conteúdo',
|
|
'content.subtitle': 'Envie e gerencie seus arquivos de mídia',
|
|
'content.help_tip': 'Envie vídeos e imagens aqui. Selecione vários arquivos para envio em lote. Use URL remota para transmitir de fontes externas. Clique em uma miniatura para pré-visualizar.',
|
|
'content.drop': 'Solte os arquivos aqui ou clique para enviar',
|
|
'content.upload_hint': 'Suporta MP4, WebM, AVI, MKV, JPEG, PNG, GIF, WebP',
|
|
'content.upload_progress': 'Enviando...',
|
|
'content.upload_progress_named': 'Enviando {name}...',
|
|
'content.upload_progress_named_pct': 'Enviando {name}... {pct}%',
|
|
'content.remote_url': 'URL remota',
|
|
'content.remote_desc': 'Transmita direto de uma URL. Economiza largura de banda local.',
|
|
'content.remote_url_placeholder': 'https://exemplo.com/video.mp4',
|
|
'content.remote_name_placeholder': 'Nome de exibição (opcional)',
|
|
'content.remote_add_btn': 'Adicionar URL remota',
|
|
'content.youtube': 'YouTube',
|
|
'content.youtube_desc': 'Incorpore um vídeo do YouTube nas suas telas.',
|
|
'content.youtube_url_placeholder': 'https://youtube.com/watch?v=...',
|
|
'content.youtube_name_placeholder': 'Nome de exibição (opcional)',
|
|
'content.youtube_add_btn': 'Adicionar vídeo do YouTube',
|
|
'content.search_placeholder': 'Buscar conteúdo...',
|
|
'content.new_folder_btn': '+ Nova pasta',
|
|
'content.breadcrumb_root': 'Todo o conteúdo',
|
|
'content.rename_btn': 'Renomear',
|
|
'content.delete_folder_btn': 'Excluir pasta',
|
|
'content.prompt_folder_name': 'Nome da pasta:',
|
|
'content.prompt_rename_folder': 'Renomear pasta:',
|
|
'content.confirm_delete_folder': 'Excluir esta pasta? O conteúdo voltará para o nível raiz. Subpastas também serão excluídas.',
|
|
'content.empty_folder_title': 'Esta pasta está vazia',
|
|
'content.empty_folder_desc': 'Arraste o conteúdo para cá ou use a ação Mover.',
|
|
'content.no_content': 'Nenhum conteúdo ainda',
|
|
'content.no_content_desc': 'Envie vídeos e imagens para começar.',
|
|
'content.failed_to_load': 'Falha ao carregar o conteúdo',
|
|
'content.type_youtube': 'YouTube',
|
|
'content.type_remote': 'URL remota',
|
|
'content.type_remote_short': 'Remoto',
|
|
'content.type_video': 'Vídeo',
|
|
'content.type_image': 'Imagem',
|
|
'content.btn_edit': 'Editar',
|
|
'content.btn_delete': 'Excluir',
|
|
'content.btn_confirm_delete': 'Confirmar exclusão?',
|
|
'content.btn_deleting': 'Excluindo...',
|
|
'content.edit_modal_title': 'Editar conteúdo',
|
|
'content.label_filename': 'Nome do arquivo / Exibição',
|
|
'content.label_remote_url_field': 'URL remota',
|
|
'content.label_mime_type': 'Tipo MIME',
|
|
'content.label_folder': 'Pasta',
|
|
'content.label_replace_file': 'Substituir arquivo',
|
|
'content.replace_file_hint': 'Deixe vazio para manter o arquivo atual',
|
|
'content.folder_root_option': '— Raiz —',
|
|
'content.save_changes': 'Salvar alterações',
|
|
'content.mime.video_mp4': 'Vídeo (MP4)',
|
|
'content.mime.video_webm': 'Vídeo (WebM)',
|
|
'content.mime.image_jpeg': 'Imagem (JPEG)',
|
|
'content.mime.image_png': 'Imagem (PNG)',
|
|
'content.mime.image_gif': 'Imagem (GIF)',
|
|
'content.mime.image_webp': 'Imagem (WebP)',
|
|
'content.error_enter_url': 'Digite uma URL',
|
|
'content.error_enter_youtube_url': 'Digite uma URL do YouTube',
|
|
'content.error_update_failed': 'Falha ao atualizar',
|
|
'content.toast.remote_added': 'Conteúdo remoto adicionado',
|
|
'content.toast.youtube_added': 'Vídeo do YouTube adicionado',
|
|
'content.toast.deleted': 'Conteúdo excluído',
|
|
'content.toast.updated': 'Conteúdo atualizado',
|
|
'content.toast.uploaded_named': '{name} enviado com sucesso',
|
|
'content.toast.upload_failed_named': 'Falha ao enviar {name}: {error}',
|
|
'content.toast.folder_created_named': 'Pasta "{name}" criada',
|
|
'content.toast.folder_renamed': 'Pasta renomeada',
|
|
'content.toast.folder_deleted': 'Pasta excluída',
|
|
'content.toast.moved': 'Movido',
|
|
'content.toast.moved_to_root': 'Movido para a raiz',
|
|
};
|