From e2ba2b45e6b68ab3c9a7ce4b235cb306b8b4961e Mon Sep 17 00:00:00 2001 From: MadTiago Date: Mon, 2 Oct 2023 04:22:13 +0100 Subject: [PATCH] Added pt-PT language --- frontend/src/lib/i18n/i18n-types.ts | 1 + frontend/src/lib/i18n/i18n-util.async.ts | 1 + frontend/src/lib/i18n/i18n-util.sync.ts | 2 + frontend/src/lib/i18n/i18n-util.ts | 3 +- frontend/src/lib/i18n/pt-PT/index.ts | 212 +++++++++++++++++++++++ frontend/src/routes/account/+page.svelte | 3 +- 6 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 frontend/src/lib/i18n/pt-PT/index.ts diff --git a/frontend/src/lib/i18n/i18n-types.ts b/frontend/src/lib/i18n/i18n-types.ts index bb9e6f3f..66f5e811 100644 --- a/frontend/src/lib/i18n/i18n-types.ts +++ b/frontend/src/lib/i18n/i18n-types.ts @@ -8,6 +8,7 @@ export type BaseLocale = 'en-US' export type Locales = | 'de' | 'en-US' + | 'pt-PT' export type Translation = RootTranslation diff --git a/frontend/src/lib/i18n/i18n-util.async.ts b/frontend/src/lib/i18n/i18n-util.async.ts index 3a4a8288..88cd6b72 100644 --- a/frontend/src/lib/i18n/i18n-util.async.ts +++ b/frontend/src/lib/i18n/i18n-util.async.ts @@ -8,6 +8,7 @@ import { loadedFormatters, loadedLocales, locales } from './i18n-util' const localeTranslationLoaders = { de: () => import('./de'), 'en-US': () => import('./en-US'), + 'pt-PT': () => import('./pt-PT'), } const updateDictionary = (locale: Locales, dictionary: Partial): Translations => diff --git a/frontend/src/lib/i18n/i18n-util.sync.ts b/frontend/src/lib/i18n/i18n-util.sync.ts index 602097e1..faf99b16 100644 --- a/frontend/src/lib/i18n/i18n-util.sync.ts +++ b/frontend/src/lib/i18n/i18n-util.sync.ts @@ -7,10 +7,12 @@ import { loadedFormatters, loadedLocales, locales } from './i18n-util' import de from './de' import en_US from './en-US' +import pt_PT from './pt-PT' const localeTranslations = { de, 'en-US': en_US, + 'pt-PT': pt_PT, } export const loadLocale = (locale: Locales): void => { diff --git a/frontend/src/lib/i18n/i18n-util.ts b/frontend/src/lib/i18n/i18n-util.ts index 1008754b..b54e5001 100644 --- a/frontend/src/lib/i18n/i18n-util.ts +++ b/frontend/src/lib/i18n/i18n-util.ts @@ -12,7 +12,8 @@ export const baseLocale: Locales = 'en-US' export const locales: Locales[] = [ 'de', - 'en-US' + 'en-US', + 'pt-PT' ] export const isLocale = (locale: string): locale is Locales => locales.includes(locale as Locales) diff --git a/frontend/src/lib/i18n/pt-PT/index.ts b/frontend/src/lib/i18n/pt-PT/index.ts new file mode 100644 index 00000000..9e9bedf6 --- /dev/null +++ b/frontend/src/lib/i18n/pt-PT/index.ts @@ -0,0 +1,212 @@ +import en_US from '../en-US'; +import type { Translation } from '../i18n-types'; + +const pt_PT = { + ...(en_US as unknown as Translation), + home: { + page_title: 'Início', + order_groups: 'Grupos', + order_name: 'Nome', + order_ip: 'IP', + order_tooltip: 'Ordem', + no_devices: 'Sem dispositivos.', + add_first_device: 'Adicione o seu primeiro dispositivo', + grant_permissions: + 'Peça ao administrador para alterar as suas permissões para dispositivos existentes ou para criar novos.' + }, + account: { + page_title: 'Conta', + account_type_admin: 'Admin', + account_type_user: 'Utilizador', + avatar_title: 'Avatar', + language_title: 'Idioma', + language_option_auto: 'Automático', + change_password_title: 'Alterar password', + change_password_body: 'Terá de voltar a entrar após alterar a sua password.', + change_password_label: 'Antiga password', + change_password_new: 'Nova password', + change_password_confirm: 'Confirmar password' + }, + device: { + page_title: 'Novo dispositivo', + tabs: ['Manual', 'Pesquisa de rede'], + card_btn_more: 'Mais', + card_btn_more_edit: 'Editar', + card_btn_more_sleep: 'Suspender', + card_btn_more_reboot: 'Reiniciar', + card_tooltip_wake_cron: 'Wake cron', + card_tooltip_shutdown_cron: 'Shutdown cron', + card_tooltip_wake_password: 'Wake password', + card_tooltip_last_status_change: 'Última alteração de estado', + card_password: 'Password', + card_nic_tooltip_pending: 'Pendente', + card_nic_tooltip_shutdown: 'Desligar', + card_nic_tooltip_shutdown_no_cmd: 'Comando para desligar não está definido', + card_nic_tooltip_shutdown_no_permission: 'Não tem permissão para desligar este dispositivo', + card_nic_tooltip_power: 'Ligar', + card_nic_tooltip_power_no_permission: 'Não tem permissão para ligar este dispositivo', + general: 'Geral', + general_name: 'Nome', + general_name_placeholder: 'Nome do dispositivo', + general_ip: 'IP', + general_mac: 'Mac', + general_netmask: 'Máscara de rede', + general_required_field: 'campo obrigatório', + ports: 'Portos', + ports_desc: 'UpSnap pode verificar se certos portos estão abertos.', + ports_add_new: 'Adicionar novo porto', + ports_name: 'Nome', + ports_number: 'Número', + link: 'Link', + link_desc: + 'Permite que o nome do seu dispositivo seja um link. Perfeito para dashboard, por exemplo.', + wake: 'Ligar', + wake_desc: 'Poderá ligar este dispositivo através dum cron job agendado.', + wake_cron: 'Wake cron', + wake_cron_enable: 'Ativar wake cron', + sol: 'Sleep-On-LAN', + sol_desc1: + 'Poderá suspender o seu dispositivo usando a ferramenta Sleep-On-LAN. Sleep-On-LAN (SOL) é uma ferramenta externa que terá de ser executada no dispositivo que quer suspender, facilitando um REST endpoint. Para instruções em como configurar Sleep-On-LAN, veja a secção Usage.', + sol_desc2: + 'SOL envia pedidos através de HTTP em vez de UDP para permitir autenticação e tornar os pedidos mais seguros.', + sol_desc3: + 'Portanto, tenha a certeza que inclui HTTP:<SEU_PORTO> na secção Listeners de configuração SOL.', + sol_enable: 'Ativar Sleep-On-LAN', + sol_port: 'Porto SOL', + sol_authorization: 'Autenticação', + sol_user: 'Utilizador SOL', + sol_password: 'Password SOL', + shutdown: 'Desligar', + shutdown_desc: + 'Este comando shell irá correr dentro do teu container (no caso de usar docker) ou no seu host (na versão standalone). Para verificar que funciona, pode executar o comando primeiro no seu container/host. Comandos comuns são net rpc para windows, sshpass para linux ou curl em geral para enviar pedidos web.', + shutdown_examples: 'Exemplos:', + shutdown_examples_windows: 'Desligar dispositivo windows remoto:', + shutdown_examples_linux: 'Desligar dispositivo linux remoto:', + shutdown_cmd: 'Comando para desligar', + shutdown_cron_desc: + 'Assim como pode ter um cron job para ligar o seu dispositivo, pode também usar para desligar.', + shutdown_cron: 'Shutdown cron', + shutdown_cron_enable: 'Ativar shutdown cron', + password: 'Password', + password_desc: + 'Alguns adaptadores de rede têm a opção de definir uma password para magic packets, também conhecido como SecureON. A password só poderá conter 0, 4 ou 6 caracteres.', + groups: 'Grupos', + groups_desc: 'Pode adicionar dispositivos a grupos para ordenar na dashboard.', + groups_placeholder: "e.g. 'Cave' ou 'Escritório'", + network_scan_range_saved: 'Intervalo de pesquisa guardado', + network_scan_desc: + "Procurar automaticamente na sua rede por dispositivos. Terá de executar o UpSnap como root/admin e ter o nmap instalado e disponível no seu $PATH (No caso de usar docker, não tem de fazer nada). Poderá demorar alguns segundos.", + network_scan_ip_range: 'Intervalo IP', + network_scan_no_range: 'Sem intervalo de IP', + network_scan_unsaved_changes: 'Alterações por guardar', + network_scan_running: 'Pesquisa em curso', + network_scan: 'Pesquisar', + network_scan_ip: 'IP:', + network_scan_mac: 'Mac:', + network_scan_mac_vendor: 'Fornecedor Mac:', + network_scan_netmask: 'Máscara de rede:', + network_scan_add_all: 'Adicionar todos os dispositivos', + network_scan_replace_netmask: 'Substituir máscara de rede para todos os dispositivos?', + network_scan_new_netmask: 'Nova máscara de rede', + network_scan_include_unknown: 'Incluir dispositivos em que o nome é "Unknown"' + }, + login: { + welcome: 'Bem-vindo', + email_label: 'Email ou Utilizador:', + password_label: 'Password:', + btn_more: 'Mais', + menu_title_auth_providers: 'Outros provedores de autenticação', + btn_login: 'Entrar' + }, + settings: { + page_title: 'Definições', + ping_interval_title: 'Intervalo ping', + ping_interval_desc1: + 'Define o intervalo em que o ping é executado. Deixe em branco para usar o valor por defeito de @every 3s.', + ping_interval_desc2: + 'Poderá ver a sintaxe correta para cron em Wikipedia ou em documentação cron.', + lazy_ping_title: 'Lazy ping', + lazy_ping_desc: + "Quando o lazy ping está activo, o UpSnap irá apenas executar o ping se existir um utilizador ativo no website. Se desligado, o UpSnap irá executar sempre o ping.", + lazy_ping_enable: 'Activar', + website_title_title: 'Título do website', + website_title_desc: 'Define o título do website.', + icon_title: 'Ícone', + icon_desc: 'Define um favicon personalizado. Tipos de ficheiros suportados são:', + upsnap_version: 'Versão UpSnap' + }, + users: { + page_title: 'Utilizadores', + allow_create_devices: 'Permitir a {username} adicionar novos dispositivos e editar grupos de dispositivos', + device_permissions: 'Permissões de dispositivos', + create_new_device: 'Adicionar dispositivo', + read: 'Ver', + update: 'Editar', + delete: 'Apagar', + power: 'Ligar/desligar', + toggle: 'Alternar', + confirm_delete_title: 'Confirmar', + confirm_delete_desc: 'Tem a certeza que quer apagar {username}?', + create_new_user: 'Criar novo utilizador', + username: 'Utilizador', + password: 'Password', + password_confirm: 'Confirmar password', + required_field: 'campo obrigatório' + }, + buttons: { + save: 'Guardar', + delete: 'Apagar', + change: 'Alterar', + reset: 'Repor', + cancle: 'Cancelar', + add: 'Adicionar' + }, + welcome: { + step1_page_title: 'Bem-vindo ao UpSnap 🥳', + step1_setup_desc: 'Complete os próximos passos para terminar a configuração.', + step1_setup_btn_next: 'Seguinte', + step2_page_title: 'Criar conta de administrador', + step2_label_email: 'Email:', + step2_label_password: 'Password:', + step2_label_min_chars: 'min. 10 caracteres', + step2_label_password_confirm: 'Confirmar password:', + step2_btn_create: 'Criar', + step3_page_title: 'Concluído! 🎉', + step3_page_desc: 'Adicione alguns dispositivos à sua dashboard.', + step3_btn_done: 'Vamos!', + not_expected_title: "Não esperava ver aqui alguém! 🧐", + not_expected_desc: 'A configuração está concluída. Nada a fazer aqui.', + not_expected_back: 'Voltar', + progress_step1: 'Bem-vindo', + progress_step2: 'Criar conta', + progress_step3: 'Concluído' + }, + toasts: { + admin_saved: 'Administrador atualizado', + user_saved: 'Utilizador atualizado', + user_created: 'Utilizador {username} criado', + user_deleted: 'Utilizador {username} apagado', + settings_saved: 'Definições guardadas', + password_changed: 'Password alterada. Terá de entrar novamente.', + passwords_missmatch: "As passwords não correspondem", + permissions_created: 'Permissões criadas para {username}', + permissions_deleted: 'Permissões apagadas para {username}', + permissions_updated: 'Permissões atualizadas para {username}', + permissions_updated_personal: 'As suas permissões foram atualizadas', + no_permission: "Não tem permissão para visitar {url}", + device_created: 'Adicionado dispositivo {device}', + devices_created_multiple: 'Adicionados {count|int} dispositivos', + device_updated: '{device} atualizado', + device_deleted: '{device} apagado', + group_created: 'Grupo {group} criado', + group_deleted: 'Grupo {group} apagado' + }, + navbar: { + theme: 'Tema', + new: 'Novo', + edit_account: 'Editar conta', + logout: 'Sair' + } +} satisfies Translation; + +export default pt_PT; diff --git a/frontend/src/routes/account/+page.svelte b/frontend/src/routes/account/+page.svelte index 01594e7f..e4eb1aa9 100644 --- a/frontend/src/routes/account/+page.svelte +++ b/frontend/src/routes/account/+page.svelte @@ -16,7 +16,8 @@ // locales const languageEmojis = { 'en-US': '🇺🇸', - de: '🇩🇪' + de: '🇩🇪', + 'pt-PT': '🇵🇹' }; let localStorageLang: Locales | 'auto' = 'auto'; let selectedLanguage: Locales | 'auto' = localStorageLang;