diff --git a/package.json b/package.json index ff05b2ed..e3666029 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "knex:migrate:make": "knex --knexfile src/main/knexfile.ts migrate:make --esm" }, "dependencies": { + "@cospired/i18n-iso-languages": "^4.2.0", "@electron-toolkit/preload": "^3.0.0", "@electron-toolkit/utils": "^3.0.0", "@fontsource/noto-sans": "^5.0.22", diff --git a/src/locales/index.ts b/src/locales/index.ts index 10f128ae..f698976f 100644 --- a/src/locales/index.ts +++ b/src/locales/index.ts @@ -1,5 +1,6 @@ export { default as en } from "./en/translation.json"; -export { default as pt } from "./pt/translation.json"; +export { default as ptPT } from "./pt-PT/translation.json"; +export { default as ptBR } from "./pt-BR/translation.json"; export { default as es } from "./es/translation.json"; export { default as nl } from "./nl/translation.json"; export { default as fr } from "./fr/translation.json"; diff --git a/src/locales/pt/translation.json b/src/locales/pt-BR/translation.json similarity index 98% rename from src/locales/pt/translation.json rename to src/locales/pt-BR/translation.json index a97a81cf..02823aa1 100644 --- a/src/locales/pt/translation.json +++ b/src/locales/pt-BR/translation.json @@ -166,7 +166,7 @@ "real_debrid_linked_message": "Conta \"{{username}}\" vinculada", "save_changes": "Salvar mudanças", "changes_saved": "Ajustes salvos com sucesso", - "download_sources_description": "Hydra vai buscar links de download em todas as fonte habilitadas. A URL da fonte deve ser um link direto para um arquivo .json contendo uma lista de links.", + "download_sources_description": "Hydra vai buscar links de download em todas as fontes habilitadas. A URL da fonte deve ser um link direto para um arquivo .json contendo uma lista de links.", "validate_download_source": "Validar", "remove_download_source": "Remover", "add_download_source": "Adicionar fonte", diff --git a/src/locales/pt-PT/translation.json b/src/locales/pt-PT/translation.json new file mode 100644 index 00000000..6fb8b453 --- /dev/null +++ b/src/locales/pt-PT/translation.json @@ -0,0 +1,280 @@ +{ + "app": { + "successfully_signed_in": "Sessão iniciada com sucesso" + }, + "home": { + "featured": "Destaques", + "trending": "Populares", + "surprise_me": "Surpreende-me", + "no_results": "Nenhum resultado encontrado" + }, + "sidebar": { + "catalogue": "Catálogo", + "downloads": "Transferências", + "settings": "Definições", + "my_library": "Biblioteca", + "downloading_metadata": "{{title}} (A transferir metadados…)", + "paused": "{{title}} (Pausado)", + "downloading": "{{title}} ({{percentage}} - A transferir…)", + "filter": "Procurar", + "home": "Início", + "queued": "{{title}} (Na fila)", + "game_has_no_executable": "Jogo não tem executável selecionado", + "sign_in": "Iniciar sessão" + }, + "header": { + "search": "Procurar jogos", + "catalogue": "Catálogo", + "downloads": "Transferências", + "search_results": "Resultados da pesquisa", + "settings": "Definições", + "home": "Início", + "version_available_install": "Versão {{version}} disponível. Clique aqui para reiniciar e instalar.", + "version_available_download": "Versão {{version}} disponível. Clique aqui para fazer o download." + }, + "bottom_panel": { + "no_downloads_in_progress": "Sem transferências em andamento", + "downloading_metadata": "A transferir metadados de {{title}}…", + "downloading": "A transferir {{title}}… ({{percentage}} concluído) - Conclusão {{eta}} - {{speed}}", + "calculating_eta": "A transferir {{title}}… ({{percentage}} concluído) - A calcular tempo restante…", + "checking_files": "A verificar ficheiros de {{title}}…" + }, + "game_details": { + "open_download_options": "Ver opções de transferência", + "download_options_zero": "Sem opções de transferência", + "download_options_one": "{{count}} opção de transferência", + "download_options_other": "{{count}} opções de transferência", + "updated_at": "Atualizado a {{updated_at}}", + "resume": "Retomar", + "pause": "Pausar", + "cancel": "Cancelar", + "remove": "Remover", + "space_left_on_disk": "{{space}} livres no disco", + "eta": "Conclusão {{eta}}", + "calculating_eta": "A calcular tempo restante…", + "downloading_metadata": "A transferir metadados…", + "filter": "Filtrar repacks", + "requirements": "Requisitos do sistema", + "minimum": "Mínimos", + "recommended": "Recomendados", + "paused": "Pausado", + "release_date": "Lançado em {{date}}", + "publisher": "Publicado por {{publisher}}", + "hours": "horas", + "minutes": "minutos", + "amount_hours": "{{amount}} horas", + "amount_minutes": "{{amount}} minutos", + "accuracy": "{{accuracy}}% de precisão", + "add_to_library": "Adicionar à biblioteca", + "remove_from_library": "Remover da biblioteca", + "no_downloads": "Nenhuma transferência disponível", + "play_time": "Jogou por {{amount}}", + "next_suggestion": "Próxima sugestão", + "install": "Instalar", + "last_time_played": "Última sessão {{period}}", + "play": "Jogar", + "not_played_yet": "Ainda não jogou {{title}}", + "close": "Fechar", + "deleting": "A eliminar instalador…", + "playing_now": "A jogar agora", + "change": "Explorar", + "repacks_modal_description": "Escolha o repack do jogo que deseja transferir", + "select_folder_hint": "Para trocar o diretório padrão, aceda à <0>Tela de Definições", + "download_now": "Iniciar transferência", + "no_shop_details": "Não foi possível obter os detalhes da loja.", + "download_options": "Opções de transferência", + "download_path": "Diretório de transferência", + "previous_screenshot": "Captura de ecrã anterior", + "next_screenshot": "Próxima captura de ecrã", + "screenshot": "Captura de ecrã {{number}}", + "open_screenshot": "Ver captura de ecrã {{number}}", + "download_settings": "Definições de transferência", + "downloader": "Downloader", + "select_executable": "Explorar", + "no_executable_selected": "Nenhum executável selecionado", + "open_folder": "Abrir pasta", + "open_download_location": "Ver ficheiros transferidos", + "create_shortcut": "Criar atalho no ambiente de trabalho", + "remove_files": "Remover ficheiros", + "options": "Gerir", + "remove_from_library_description": "Isto irá remover {{game}} da sua biblioteca", + "remove_from_library_title": "Tem a certeza?", + "executable_section_title": "Executável", + "executable_section_description": "O caminho do ficheiro que será executado ao clicar em \"Jogar\"", + "downloads_secion_title": "Transferências", + "downloads_section_description": "Confira atualizações ou versões diferentes para este mesmo título", + "danger_zone_section_title": "Zona de perigo", + "danger_zone_section_description": "Remova o jogo da sua biblioteca ou os ficheiros que foram transferidos pelo Hydra", + "download_in_progress": "Transferência em andamento", + "download_paused": "Transferência pausada", + "last_downloaded_option": "Última opção transferida", + "create_shortcut_success": "Atalho criado com sucesso", + "create_shortcut_error": "Erro ao criar atalho" + }, + "activation": { + "title": "Ativação", + "installation_id": "ID da instalação:", + "enter_activation_code": "Insira o seu código de ativação", + "message": "Se não sabe onde conseguir o código, talvez não devesse estar aqui.", + "activate": "Ativar", + "loading": "A carregar…" + }, + "downloads": { + "resume": "Retomar", + "pause": "Pausar", + "eta": "Conclusão {{eta}}", + "paused": "Pausado", + "verifying": "A verificar…", + "completed": "Concluído", + "removed": "Cancelado", + "cancel": "Cancelar", + "filter": "Filtrar jogos transferidos", + "remove": "Remover", + "downloading_metadata": "A transferir metadados…", + "delete": "Remover instalador", + "delete_modal_description": "Isto removerá todos os ficheiros de instalação do seu computador", + "delete_modal_title": "Tem a certeza?", + "deleting": "A eliminar instalador…", + "install": "Instalar", + "download_in_progress": "A transferir agora", + "queued_downloads": "Na fila", + "downloads_completed": "Concluído", + "queued": "Na fila", + "no_downloads_title": "Nada por aqui…", + "no_downloads_description": "Ainda não transferiu nada pelo Hydra, mas nunca é tarde para começar.", + "checking_files": "A verificar ficheiros…" + }, + "settings": { + "downloads_path": "Diretório das transferências", + "change": "Explorar...", + "notifications": "Notificações", + "enable_download_notifications": "Quando uma transferência for concluída", + "enable_repack_list_notifications": "Quando a lista de repacks for atualizada", + "real_debrid_api_token_label": "Token de API do Real-Debrid", + "quit_app_instead_hiding": "Encerrar o Hydra em vez de apenas minimizá-lo ao fechar.", + "launch_with_system": "Iniciar o Hydra com o sistema", + "general": "Geral", + "behavior": "Comportamento", + "download_sources": "Fontes de transferência", + "language": "Idioma", + "real_debrid_api_token": "Token de API", + "enable_real_debrid": "Ativar Real-Debrid", + "real_debrid_api_token_hint": "Pode obter o seu token de API <0>aqui", + "real_debrid_description": "O Real-Debrid é um downloader sem restrições que permite transferir ficheiros instantaneamente e com a melhor velocidade da sua Internet.", + "real_debrid_invalid_token": "Token de API inválido", + "real_debrid_free_account_error": "A conta \"{{username}}\" é uma conta gratuita. Por favor, subscreva o Real-Debrid", + "real_debrid_linked_message": "Conta \"{{username}}\" vinculada", + "save_changes": "Guardar alterações", + "changes_saved": "Definições guardadas com sucesso", + "download_sources_description": "O Hydra vai procurar links de transferência em todas as fontes ativadas. A URL da página de detalhes da loja não é guardada no seu dispositivo. Utilizamos um sistema de metadados criado pela comunidade para fornecer suporte a mais fontes de transferência de jogos.", + "enable_source": "Ativar", + "disable_source": "Desativar", + "validate_download_source": "Validar", + "remove_download_source": "Remover", + "add_download_source": "Adicionar fonte", + "download_count_zero": "Sem transferências na lista", + "download_count_one": "{{countFormatted}} transferência na lista", + "download_count_other": "{{countFormatted}} transferências na lista", + "download_options_zero": "Sem transferências disponíveis", + "download_options_one": "{{countFormatted}} transferência disponível", + "download_options_other": "{{countFormatted}} transferências disponíveis", + "download_source_url": "URL da fonte", + "add_download_source_description": "Insira o URL contendo o arquivo .json", + "download_source_up_to_date": "Sincronizada", + "download_source_errored": "Falhou", + "sync_download_sources": "Sincronizar", + "removed_download_source": "Fonte removida", + "added_download_source": "Fonte adicionada", + "download_sources_synced": "As fontes foram sincronizadas", + "insert_valid_json_url": "Insira o URL de um JSON válido", + "found_download_option_zero": "Nenhuma opção de transferência encontrada", + "found_download_option_one": "{{countFormatted}} opção de transferência encontrada", + "found_download_option_other": "{{countFormatted}} opções de transferências encontradas", + "import": "Importar" + }, + "notifications": { + "download_complete": "Transferência concluída", + "game_ready_to_install": "{{title}} está pronto para ser descarregado", + "repack_list_updated": "Lista de repacks atualizada", + "repack_count_one": "{{count}} novo repack", + "repack_count_other": "{{count}} novos repacks", + "new_update_available": "Versão {{version}} disponível", + "restart_to_install_update": "Reinicie o Hydra para instalar a nova versão" + }, + "system_tray": { + "open": "Abrir Hydra", + "quit": "Fechar" + }, + "game_card": { + "no_downloads": "Sem transferências disponíveis" + }, + "binary_not_found_modal": { + "title": "Programas não instalados", + "description": "Os executáveis do Wine ou Lutris não foram encontrados em seu sistema.", + "instructions": "Verifique a forma correta de instalar algum deles na sua distro Linux, garantindo assim a execução normal do jogo." + }, + "catalogue": { + "next_page": "Próxima página", + "previous_page": "Página anterior" + }, + "modal": { + "close": "Botão de fechar" + }, + "forms": { + "toggle_password_visibility": "Alternar visibilidade da palavra-passe" + }, + "user_profile": { + "amount_hours": "{{amount}} horas", + "amount_minutes": "{{amount}} minutos", + "last_time_played": "Última sessão {{period}}", + "activity": "Atividades recentes", + "library": "Biblioteca", + "total_play_time": "Tempo total de jogo: {{amount}}", + "no_recent_activity_title": "Hmmm… nada por aqui", + "no_recent_activity_description": "Parece que não jogaste nada recentemente. Que tal começar agora?", + "display_name": "Nome de exibição", + "saving": "a guardar…", + "save": "Guardar", + "edit_profile": "Editar perfil", + "saved_successfully": "Guardado com sucesso", + "try_again": "Por favor, tenta novamente", + "cancel": "Cancelar", + "successfully_signed_out": "Terminado com sucesso", + "sign_out": "Terminar sessão", + "sign_out_modal_title": "Tens a certeza?", + "playing_for": "A jogar há {{amount}}", + "sign_out_modal_text": "A tua biblioteca de jogos está associada com a tua conta atual. Ao sair, a tua biblioteca não aparecerá mais no Hydra e qualquer progresso não será guardado. Desejas continuar?", + "add_friends": "Adicionar Amigos", + "friend_code": "Código de amigo", + "see_profile": "Ver perfil", + "friend_request_sent": "Pedido de amizade enviado", + "friends": "Amigos", + "add": "Adicionar", + "sending": "A enviar", + "friends_list": "Lista de amigos", + "user_not_found": "Utilizador não encontrado", + "block_user": "Bloquear", + "add_friend": "Adicionar amigo", + "request_sent": "Pedido enviado", + "request_received": "Pedido recebido", + "accept_request": "Aceitar pedido", + "ignore_request": "Ignorar pedido", + "cancel_request": "Cancelar pedido", + "undo_friendship": "Desfazer amizade", + "request_accepted": "Pedido de amizade aceito", + "user_blocked_successfully": "Utilizador bloqueado com sucesso", + "user_block_modal_text": "Bloquear {{displayName}}", + "settings": "Definições", + "privacy": "Privacidade", + "private": "Privado", + "friends_only": "Apenas amigos", + "public": "Público", + "blocked_users": "Utilizadores bloqueados", + "unblock": "Desbloquear", + "no_friends_added": "Ainda não adicionaste amigos", + "pending": "Pendentes", + "no_pending_invites": "Não tens convites de amizade pendentes", + "no_blocked_users": "Não tens nenhum utilizador bloqueado", + "friend_code_copied": "Código de amigo copiado" + } +} diff --git a/src/renderer/src/pages/settings/settings-general.tsx b/src/renderer/src/pages/settings/settings-general.tsx index e09ebb11..3e69e5bf 100644 --- a/src/renderer/src/pages/settings/settings-general.tsx +++ b/src/renderer/src/pages/settings/settings-general.tsx @@ -1,5 +1,6 @@ import { useContext, useEffect, useState } from "react"; -import ISO6391 from "iso-639-1"; +import languages from "@cospired/i18n-iso-languages"; +import languagesEn from "@cospired/i18n-iso-languages/langs/en.json"; import { TextField, @@ -21,6 +22,13 @@ interface LanguageOption { nativeName: string; } +languages.registerLocale(languagesEn); + +const customLanguageNames = { + ptBR: "Português (Brasil)", + ptPT: "Português (Portugal)", +}; + export function SettingsGeneral() { const { t } = useTranslation("settings"); @@ -52,7 +60,9 @@ export function SettingsGeneral() { orderBy( Object.keys(languageResources).map((language) => { return { - nativeName: ISO6391.getNativeName(language), + nativeName: + customLanguageNames[language] || + languages.getName(language, "en"), option: language, }; }), @@ -93,7 +103,7 @@ export function SettingsGeneral() { function updateFormWithUserPreferences() { if (userPreferences) { - const parsedLanguage = userPreferences.language.split("-")[0]; + const parsedLanguage = userPreferences.language; setForm((prev) => ({ ...prev, diff --git a/yarn.lock b/yarn.lock index 9ffbf746..6ee3491a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -579,6 +579,11 @@ "@types/conventional-commits-parser" "^5.0.0" chalk "^5.3.0" +"@cospired/i18n-iso-languages@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@cospired/i18n-iso-languages/-/i18n-iso-languages-4.2.0.tgz#094418a72f250fd612b3fc856b12f674a10864eb" + integrity sha512-vy8cq1176MTxVwB1X9niQjcIYOH29F8Huxtx8hLmT5Uz3l1ztGDGri8KN/4zE7LV2mCT7JrcAoNV/I9yb+lNUw== + "@develar/schema-utils@~2.6.5": version "2.6.5" resolved "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz"