diff --git a/src/locales/pt-BR/translation.json b/src/locales/pt-BR/translation.json index b9cee539..91a10149 100755 --- a/src/locales/pt-BR/translation.json +++ b/src/locales/pt-BR/translation.json @@ -212,6 +212,7 @@ "uploading_backup": "Criando backup…", "no_backups": "Você ainda não fez nenhum backup deste jogo", "backup_uploaded": "Backup criado", + "backup_failed": "Falha no backup", "backup_deleted": "Backup apagado", "backup_restored": "Backup restaurado", "see_all_achievements": "Ver todas as conquistas", @@ -382,6 +383,7 @@ "stop_seeding": "Parar de semear", "resume_seeding": "Semear", "options": "Gerenciar", + "alldebrid_size_not_supported": "Informações de download para AllDebrid ainda não são suportadas", "extract": "Extrair arquivos", "extracting": "Extraindo arquivos…" }, @@ -466,6 +468,8 @@ "subscription_renews_on": "Sua assinatura renova dia {{date}}", "bill_sent_until": "Sua próxima cobrança será enviada até esse dia", "no_themes": "Parece que você ainda não tem nenhum tema. Não se preocupe, clique aqui para criar sua primeira obra de arte.", + "editor_tab_code": "Código", + "editor_tab_info": "Info", "editor_tab_save": "Salvar", "web_store": "Loja de temas", "clear_themes": "Limpar", @@ -491,6 +495,17 @@ "create_real_debrid_account": "Clique aqui se você ainda não tem uma conta do Real-Debrid", "create_torbox_account": "Clique aqui se você ainda não tem uma conta do TorBox", "real_debrid_account_linked": "Conta Real-Debrid associada", + "enable_all_debrid": "Habilitar All-Debrid", + "all_debrid_description": "All-Debrid é um downloader sem restrições que permite baixar rapidamente arquivos de várias fontes.", + "all_debrid_free_account_error": "A conta \"{{username}}\" é uma conta gratuita. Por favor, assine o All-Debrid", + "all_debrid_account_linked": "Conta All-Debrid vinculada com sucesso", + "alldebrid_missing_key": "Por favor, forneça uma chave de API", + "alldebrid_invalid_key": "Chave de API inválida", + "alldebrid_blocked": "Sua chave de API está bloqueada por geolocalização ou IP", + "alldebrid_banned": "Esta conta foi banida", + "alldebrid_unknown_error": "Ocorreu um erro desconhecido", + "alldebrid_invalid_response": "Resposta inválida do All-Debrid", + "alldebrid_network_error": "Erro de rede. Por favor, verifique sua conexão", "name_min_length": "O nome do tema deve ter pelo menos 3 caracteres", "import_theme": "Importar tema", "import_theme_description": "Você irá importar {{theme}} da loja de temas", @@ -521,8 +536,7 @@ "hidden": "Oculta", "test_notification": "Testar notificação", "notification_preview": "Prévia da Notificação de Conquistas", - "enable_friend_start_game_notifications": "Quando um amigo iniciar um jogo", - "editor_tab_code": "Código" + "enable_friend_start_game_notifications": "Quando um amigo iniciar um jogo" }, "notifications": { "download_complete": "Download concluído", @@ -538,7 +552,9 @@ "game_extracted": "{{title}} extraído com sucesso", "friend_started_playing_game": "{{displayName}} começou a jogar", "test_achievement_notification_title": "Esta é uma notificação de teste", - "test_achievement_notification_description": "Bem legal, né?" + "test_achievement_notification_description": "Bem legal, né?", + "notification_achievement_unlocked_title": "Conquista desbloqueada para {{game}}", + "notification_achievement_unlocked_body": "{{achievement}} e outras {{count}} foram desbloqueadas" }, "system_tray": { "open": "Abrir Hydra", diff --git a/src/locales/ru/translation.json b/src/locales/ru/translation.json index 45177eaf..f3b25ee4 100644 --- a/src/locales/ru/translation.json +++ b/src/locales/ru/translation.json @@ -6,8 +6,8 @@ "home": { "surprise_me": "Удиви меня", "no_results": "Ничего не найдено", - "hot": "Сейчас популярно", "start_typing": "Начинаю вводить текст...", + "hot": "Сейчас популярно", "weekly": "📅 Лучшие игры недели", "achievements": "🏆 Игры с достижениями" }, @@ -28,6 +28,8 @@ "need_help": "Нужна помощь?", "favorites": "Избранное", "playable_button_title": "Показать только установленные игры.", + "add_custom_game_tooltip": "Добавить пользовательскую игру", + "show_playable_only_tooltip": "Показать только доступные для игры", "custom_game_modal": "Добавить пользовательскую игру", "custom_game_modal_description": "Добавьте пользовательскую игру в библиотеку, выбрав исполняемый файл", "custom_game_modal_executable_path": "Путь к исполняемому файлу", @@ -74,7 +76,19 @@ "edit_game_modal_drop_hero_image_here": "Перетащите изображение обложки сюда", "edit_game_modal_drop_to_replace_icon": "Перетащите для замены иконки", "edit_game_modal_drop_to_replace_logo": "Перетащите для замены логотипа", - "edit_game_modal_drop_to_replace_hero": "Перетащите для замены обложки" + "edit_game_modal_drop_to_replace_hero": "Перетащите для замены обложки", + "install_decky_plugin": "Установить плагин Decky", + "update_decky_plugin": "Обновить плагин Decky", + "decky_plugin_installed_version": "Плагин Decky (v{{version}})", + "install_decky_plugin_title": "Установить плагин Hydra Decky", + "install_decky_plugin_message": "Это загрузит и установит плагин Hydra для Decky Loader. Может потребоваться повышенные разрешения. Продолжить?", + "update_decky_plugin_title": "Обновить плагин Hydra Decky", + "update_decky_plugin_message": "Доступна новая версия плагина Hydra Decky. Хотите обновить его сейчас?", + "decky_plugin_installed": "Плагин Decky v{{version}} успешно установлен", + "decky_plugin_installation_failed": "Не удалось установить плагин Decky: {{error}}", + "decky_plugin_installation_error": "Ошибка установки плагина Decky: {{error}}", + "confirm": "Подтвердить", + "cancel": "Отмена" }, "header": { "search": "Поиск", @@ -135,6 +149,7 @@ "amount_minutes": "{{amount}} минут", "accuracy": "точность {{accuracy}}%", "add_to_library": "Добавить в библиотеку", + "already_in_library": "Уже в библиотеке", "remove_from_library": "Удалить из библиотеки", "no_downloads": "Нет доступных источников", "play_time": "Сыграно {{amount}}", @@ -163,11 +178,13 @@ "open_folder": "Открыть папку", "open_download_location": "Просмотреть папку загрузок", "create_shortcut": "Создать ярлык на рабочем столе", + "create_shortcut_simple": "Создать ярлык", "clear": "Очистить", "remove_files": "Удалить файлы", "remove_from_library_title": "Вы уверены?", "remove_from_library_description": "{{game}} будет удалена из вашей библиотеки.", "options": "Настройки", + "properties": "Свойства", "executable_section_title": "Файл", "executable_section_description": "Путь к файлу, который будет запущен при нажатии на \"Play\"", "downloads_section_title": "Загрузки", @@ -177,26 +194,71 @@ "download_in_progress": "Идёт загрузка", "download_paused": "Загрузка приостановлена", "last_downloaded_option": "Последний вариант загрузки", + "create_steam_shortcut": "Создать ярлык Steam", "create_shortcut_success": "Ярлык создан", + "you_might_need_to_restart_steam": "Возможно, вам потребуется перезапустить Steam, чтобы увидеть изменения", "create_shortcut_error": "Не удалось создать ярлык", - "allow_nsfw_content": "Продолжить", - "download": "Скачать", - "download_count": "Загрузки", - "download_error": "Этот вариант загрузки недоступен", - "executable_path_in_use": "Исполняемый файл уже используется \"{{game}}\"", - "nsfw_content_description": "{{title}} содержит контент, который может не подходить для всех возрастов. \nВы уверены, что хотите продолжить?", + "add_to_favorites": "Добавить в избранное", + "remove_from_favorites": "Удалить из избранного", + "failed_update_favorites": "Не удалось обновить избранное", + "game_removed_from_library": "Игра удалена из библиотеки", + "failed_remove_from_library": "Не удалось удалить из библиотеки", + "files_removed_success": "Файлы успешно удалены", + "failed_remove_files": "Не удалось удалить файлы", "nsfw_content_title": "Эта игра содержит неприемлемый контент", + "nsfw_content_description": "{{title}} содержит контент, который может не подходить для всех возрастов. \nВы уверены, что хотите продолжить?", + "allow_nsfw_content": "Продолжить", "refuse_nsfw_content": "Назад", "stats": "Статистика", + "download_count": "Загрузки", "player_count": "Активные игроки", - "rating_count": "Рейтинг", + "download_error": "Этот вариант загрузки недоступен", + "download": "Скачать", + "executable_path_in_use": "Исполняемый файл уже используется \"{{game}}\"", "warning": "Внимание:", "hydra_needs_to_remain_open": "Для этой загрузки Hydra должна оставаться открытой до завершения. Если Hydra закроется до завершения, вы потеряете прогресс.", "achievements": "Достижения", "achievements_count": "Достижения {{unlockedCount}}/{{achievementsCount}}", "show_more": "Показать больше", + "show_less": "Показать меньше", "reviews": "Отзывы", "leave_a_review": "Оставить отзыв", + "write_review_placeholder": "Поделитесь своими мыслями об этой игре...", + "sort_newest": "Сначала новые", + "no_reviews_yet": "Пока нет отзывов", + "be_first_to_review": "Станьте первым, кто поделится своими мыслями об этой игре!", + "sort_oldest": "Сначала старые", + "sort_highest_score": "Высший балл", + "sort_lowest_score": "Низший балл", + "sort_most_voted": "Самые популярные", + "rating": "Оценка", + "rating_stats": "Оценка", + "rating_very_negative": "Очень негативно", + "rating_negative": "Негативно", + "rating_neutral": "Нейтрально", + "rating_positive": "Позитивно", + "rating_very_positive": "Очень позитивно", + "submit_review": "Отправить", + "submitting": "Отправка...", + "review_submitted_successfully": "Отзыв успешно отправлен!", + "review_submission_failed": "Не удалось отправить отзыв. Пожалуйста, попробуйте снова.", + "review_cannot_be_empty": "Текстовое поле отзыва не может быть пустым.", + "review_deleted_successfully": "Отзыв успешно удален.", + "review_deletion_failed": "Не удалось удалить отзыв. Пожалуйста, попробуйте снова.", + "loading_reviews": "Загрузка отзывов...", + "loading_more_reviews": "Загрузка дополнительных отзывов...", + "load_more_reviews": "Загрузить больше отзывов", + "you_seemed_to_enjoy_this_game": "Похоже, вам понравилась эта игра", + "would_you_recommend_this_game": "Хотите оставить отзыв об этой игре?", + "yes": "Да", + "maybe_later": "Возможно позже", + "rating_count": "Оценка", + "delete_review": "Удалить отзыв", + "remove_review": "Удалить отзыв", + "delete_review_modal_title": "Вы уверены, что хотите удалить свой отзыв?", + "delete_review_modal_description": "Это действие нельзя отменить.", + "delete_review_modal_delete_button": "Удалить", + "delete_review_modal_cancel_button": "Отмена", "cloud_save": "Облачное сохранение", "cloud_save_description": "Сохраняйте ваш прогресс в облаке и продолжайте играть на любом устройстве", "backups": "Резервные копии", @@ -209,6 +271,7 @@ "uploading_backup": "Загрузка резервной копии…", "no_backups": "Вы еще не создали резервных копий для этой игры", "backup_uploaded": "Резервная копия загружена", + "backup_failed": "Ошибка резервного копирования", "backup_deleted": "Резервная копия удалена", "backup_restored": "Резервная копия восстановлена", "see_all_achievements": "Просмотреть все достижения", @@ -248,26 +311,29 @@ "update_playtime_title": "Обновить время игры", "update_playtime_description": "Вручную обновите время игры для {{game}}", "update_playtime": "Обновить время игры", + "update_playtime_success": "Время игры успешно обновлено", + "update_playtime_error": "Не удалось обновить время игры", "update_game_playtime": "Обновить время игры", + "manual_playtime_warning": "Ваши часы будут отмечены как обновленные вручную. Это действие нельзя отменить.", + "manual_playtime_tooltip": "Это время игры было обновлено вручную", "download_error_not_cached_on_torbox": "Эта загрузка недоступна на TorBox, и получить статус загрузки с TorBox пока невозможно.", - "game_added_to_favorites": "Игра добавлена в избранное", + "download_error_not_cached_on_hydra": "Эта загрузка недоступна на Nimbus.", "game_removed_from_favorites": "Игра удалена из избранного", + "game_added_to_favorites": "Игра добавлена в избранное", + "game_removed_from_pinned": "Игра удалена из закрепленных", + "game_added_to_pinned": "Игра добавлена в закрепленные", "automatically_extract_downloaded_files": "Автоматическая распаковка загруженных файлов", - "create_steam_shortcut": "Создать ярлык Steam", - "you_might_need_to_restart_steam": "Возможно, вам потребуется перезапустить Steam, чтобы увидеть изменения", "create_start_menu_shortcut": "Создать ярлык в меню «Пуск»", "invalid_wine_prefix_path": "Недопустимый путь префикса Wine", "invalid_wine_prefix_path_description": "Путь к префиксу Wine недействителен. Пожалуйста, проверьте путь и попробуйте снова.", "missing_wine_prefix": "Префикс Wine необходим для создания резервной копии в Linux", - "download_error_not_cached_on_hydra": "Эта загрузка недоступна на Nimbus.", - "update_playtime_success": "Время игры успешно обновлено", - "update_playtime_error": "Не удалось обновить время игры", - "manual_playtime_warning": "Ваши часы будут отмечены как обновленные вручную. Это действие нельзя отменить.", "artifact_renamed": "Резервная копия успешно переименована", "rename_artifact": "Переименовать резервную копию", "rename_artifact_description": "Переименуйте резервную копию, присвоив ей более описательное имя.", "artifact_name_label": "Название резервной копии", "artifact_name_placeholder": "Введите название для резервной копии", + "save_changes": "Сохранить изменения", + "required_field": "Это поле обязательно к заполнению", "max_length_field": "Это поле должно содержать менее {{length}} символов", "freeze_backup": "Закрепить, чтобы она не была перезаписана автоматическими резервными копиями", "unfreeze_backup": "Открепить", @@ -275,41 +341,22 @@ "backup_unfrozen": "Резервная копия откреплена", "backup_freeze_failed": "Не удалось закрепить резервную копию", "backup_freeze_failed_description": "Вы должны оставить как минимум один свободный слот для автоматических резервных копий", - "manual_playtime_tooltip": "Это время игры было обновлено вручную", - "write_review_placeholder": "Поделитесь своими мыслями об этой игре...", - "sort_newest": "Новые", - "no_reviews_yet": "Пока нет отзывов", - "be_first_to_review": "Будьте первым, кто поделится своими мыслями об этой игре!", - "sort_oldest": "Старые", - "sort_highest_score": "Высший балл", - "sort_lowest_score": "Низший балл", - "sort_most_voted": "Самые популярные", - "rating": "Рейтинг", - "rating_stats": "Рейтинг", - "rating_very_negative": "Очень негативный", - "rating_negative": "Негативный", - "rating_neutral": "Нейтральный", - "rating_positive": "Позитивный", - "rating_very_positive": "Очень позитивный", - "submit_review": "Отправить отзыв", - "submitting": "Отправка...", - "remove_review": "Удалить отзыв", - "delete_review_modal_title": "Вы уверены, что хотите удалить свой отзыв?", - "delete_review_modal_description": "Это действие нельзя отменить.", - "delete_review_modal_delete_button": "Удалить", - "delete_review_modal_cancel_button": "Отмена", - "review_submitted_successfully": "Отзыв успешно отправлен!", - "review_submission_failed": "Не удалось отправить отзыв. Попробуйте еще раз.", - "review_cannot_be_empty": "Поле отзыва не может быть пустым.", - "review_deleted_successfully": "Отзыв успешно удален.", - "review_deletion_failed": "Не удалось удалить отзыв. Попробуйте еще раз.", - "loading_reviews": "Загрузка отзывов...", - "loading_more_reviews": "Загрузка дополнительных отзывов...", - "load_more_reviews": "Загрузить больше отзывов", - "you_seemed_to_enjoy_this_game": "Похоже, вам понравилась эта игра", - "would_you_recommend_this_game": "Хотели бы вы оставить отзыв об этой игре?", - "yes": "Да", - "maybe_later": "Может быть позже" + "edit_game_modal_button": "Изменить детали игры", + "game_details": "Детали игры", + "currency_symbol": "₽", + "currency_country": "ru", + "prices": "Цены", + "no_prices_found": "Цены не найдены", + "view_all_prices": "Нажмите, чтобы посмотреть все цены", + "retail_price": "Розничная цена", + "keyshop_price": "Цена в магазине ключей", + "historical_retail": "Исторические розничные цены", + "historical_keyshop": "Исторические цены в магазинах ключей", + "language": "Язык", + "caption": "Субтитры", + "audio": "Аудио", + "filter_by_source": "Фильтр по источнику", + "no_repacks_found": "Источники для этой игры не найдены" }, "activation": { "title": "Активировать Hydra", @@ -347,6 +394,7 @@ "stop_seeding": "Остановить раздачу", "resume_seeding": "Продолжить раздачу", "options": "Управлять", + "alldebrid_size_not_supported": "Информация о загрузке для AllDebrid пока не поддерживается", "extract": "Распаковать файлы", "extracting": "Распаковка файлов…" }, @@ -355,13 +403,10 @@ "change": "Изменить", "notifications": "Уведомления", "enable_download_notifications": "По завершении загрузки", - "enable_achievement_notifications": "Когда достижение разблокировано", "enable_repack_list_notifications": "При добавлении нового репака", "real_debrid_api_token_label": "Real-Debrid API-токен", "quit_app_instead_hiding": "Закрывать приложение вместо сворачивания в трей", "launch_with_system": "Запускать Hydra вместе с системой", - "launch_minimized": "Запустить Hydra в свернутом виде", - "disable_nsfw_alert": "Отключить предупреждение о непристойном контенте", "general": "Основные", "behavior": "Поведение", "download_sources": "Источники загрузки", @@ -388,11 +433,11 @@ "download_source_errored": "Ошибка", "sync_download_sources": "Обновить источники", "removed_download_source": "Источник удален", + "removed_download_sources": "Источники удалены", "cancel_button_confirmation_delete_all_sources": "Нет", "confirm_button_confirmation_delete_all_sources": "Да, удалить все", - "description_confirmation_delete_all_sources": "Вы удалите все источники", "title_confirmation_delete_all_sources": "Удалить все источники", - "removed_download_sources": "Источники удалены", + "description_confirmation_delete_all_sources": "Вы удалите все источники", "button_delete_all_sources": "Удалить все источники", "added_download_source": "Источник добавлен", "download_sources_synced": "Все источники обновлены", @@ -401,17 +446,20 @@ "found_download_option_one": "Найден {{countFormatted}} вариант загрузки", "found_download_option_other": "Найдено {{countFormatted}} вариантов загрузки", "import": "Импортировать", - "blocked_users": "Заблокированные пользователи", - "friends_only": "Только для друзей", - "must_be_valid_url": "У источника должен быть правильный URL", - "privacy": "Конфиденциальность", + "public": "Публичный", "private": "Частный", + "friends_only": "Только для друзей", + "privacy": "Конфиденциальность", "profile_visibility": "Видимость профиля", "profile_visibility_description": "Выберите, кто может видеть ваш профиль и библиотеку", - "public": "Публичный", "required_field": "Это поле обязательно к заполнению", "source_already_exists": "Этот источник уже добавлен", + "must_be_valid_url": "У источника должен быть правильный URL", + "blocked_users": "Заблокированные пользователи", "user_unblocked": "Пользователь разблокирован", + "enable_achievement_notifications": "Когда достижение разблокировано", + "launch_minimized": "Запускать Hydra в свернутом виде", + "disable_nsfw_alert": "Отключить предупреждение о непристойном контенте", "seed_after_download_complete": "Раздавать после завершения загрузки", "show_hidden_achievement_description": "Показывать описание скрытых достижений перед их получением", "account": "Аккаунт", @@ -450,12 +498,25 @@ "delete_theme_description": "Это приведет к удалению темы {{theme}}", "cancel": "Отменить", "appearance": "Внешний вид", + "debrid": "Debrid", + "debrid_description": "Сервисы Debrid - это премиум-загрузчики без ограничений, которые позволяют быстро скачивать файлы с различных файлообменников, ограничиваясь только скоростью вашего интернета.", "enable_torbox": "Включить TorBox", "torbox_description": "TorBox - это ваш премиум-сервис, конкурирующий даже с лучшими серверами на рынке.", "torbox_account_linked": "Аккаунт TorBox привязан", - "real_debrid_account_linked": "Аккаунт Real-Debrid привязан", "create_real_debrid_account": "Нажмите здесь, если у вас еще нет аккаунта Real-Debrid", "create_torbox_account": "Нажмите здесь, если у вас еще нет учетной записи TorBox", + "real_debrid_account_linked": "Аккаунт Real-Debrid привязан", + "enable_all_debrid": "Включить All-Debrid", + "all_debrid_description": "All-Debrid - это неограниченный загрузчик, который позволяет быстро скачивать файлы из различных источников.", + "all_debrid_free_account_error": "Аккаунт \"{{username}}\" является бесплатным. Пожалуйста, оформите подписку на All-Debrid", + "all_debrid_account_linked": "Аккаунт All-Debrid успешно привязан", + "alldebrid_missing_key": "Пожалуйста, предоставьте API ключ", + "alldebrid_invalid_key": "Неверный API ключ", + "alldebrid_blocked": "Ваш API ключ заблокирован по геолокации или IP", + "alldebrid_banned": "Этот аккаунт был заблокирован", + "alldebrid_unknown_error": "Произошла неизвестная ошибка", + "alldebrid_invalid_response": "Неверный ответ от All-Debrid", + "alldebrid_network_error": "Ошибка сети. Пожалуйста, проверьте соединение", "name_min_length": "Название темы должно содержать не менее 3 символов", "import_theme": "Импортировать тему", "import_theme_description": "Вы импортируете {{theme}} из магазина тем", @@ -469,6 +530,7 @@ "installing_common_redist": "Установка…", "show_download_speed_in_megabytes": "Показать скорость загрузки в мегабайтах в секунду", "extract_files_by_default": "Извлекать файлы по умолчанию после загрузки", + "enable_steam_achievements": "Включить поиск достижений Steam", "achievement_custom_notification_position": "Позиция уведомлений достижений", "top-left": "Верхний левый угол", "top-center": "Верхний центр", @@ -485,8 +547,7 @@ "hidden": "Скрытый", "test_notification": "Тестовое уведомление", "notification_preview": "Предварительный просмотр уведомления о достижении", - "enable_friend_start_game_notifications": "Когда друг начинает играть в игру", - "enable_steam_achievements": "Включить поиск достижений Steam" + "enable_friend_start_game_notifications": "Когда друг начинает играть в игру" }, "notifications": { "download_complete": "Загрузка завершена", @@ -498,13 +559,13 @@ "restart_to_install_update": "Перезапустите Hydra для установки обновления", "notification_achievement_unlocked_title": "Достижение разблокировано для {{game}}", "notification_achievement_unlocked_body": "были разблокированы {{achievement}} и другие {{count}}", + "new_friend_request_description": "{{displayName}} отправил вам запрос в друзья", "new_friend_request_title": "Новый запрос на добавление в друзья", "extraction_complete": "Распаковка завершена", "game_extracted": "{{title}} успешно распакован", "friend_started_playing_game": "{{displayName}} начал играть в игру", "test_achievement_notification_title": "Это тестовое уведомление", - "test_achievement_notification_description": "Довольно круто, да?", - "new_friend_request_description": "{{displayName}} отправил вам запрос в друзья" + "test_achievement_notification_description": "Довольно круто, да?" }, "system_tray": { "open": "Открыть Hydra", @@ -535,6 +596,10 @@ "last_time_played": "Последняя игра {{period}}", "activity": "Недавняя активность", "library": "Библиотека", + "pinned": "Закрепленные", + "achievements_earned": "Заработанные достижения", + "played_recently": "Недавно сыгранные", + "playtime": "Время игры", "total_play_time": "Всего сыграно", "manual_playtime_tooltip": "Время игры было обновлено вручную", "no_recent_activity_title": "Хммм... Тут ничего нет", @@ -578,24 +643,24 @@ "no_pending_invites": "У вас нет запросов ожидающих ответа", "no_blocked_users": "Вы не заблокировали ни одного пользователя", "friend_code_copied": "Код друга скопирован", - "displayname_max_length": "Отображаемое имя должно содержать не более 50 символов.", - "displayname_min_length": "Отображаемое имя должно содержать не менее 3 символов.", - "image_process_failure": "Сбой при обработке изображения", - "locked_profile": "Этот профиль является частным", + "undo_friendship_modal_text": "Это отменит вашу дружбу с {{displayName}}.", "privacy_hint": "Чтобы указать, кто может это видеть, перейдите в <0>Настройки.", - "profile_reported": "Профиль сообщил", - "report": "Отчет", - "report_description": "Дополнительная информация", - "report_description_placeholder": "Дополнительная информация", + "locked_profile": "Этот профиль является частным", + "image_process_failure": "Сбой при обработке изображения", + "required_field": "Это поле обязательно к заполнению", + "displayname_min_length": "Отображаемое имя должно содержать не менее 3 символов.", + "displayname_max_length": "Отображаемое имя должно содержать не более 50 символов.", "report_profile": "Пожаловаться на этот профиль", "report_reason": "Почему вы жалуетесь на этот профиль?", + "report_description": "Дополнительная информация", + "report_description_placeholder": "Дополнительная информация", + "report": "Пожаловаться", "report_reason_hate": "Разжигание ненависти", - "report_reason_other": "Другой", "report_reason_sexual_content": "Сексуальный контент", - "report_reason_spam": "Спам", "report_reason_violence": "Насилие", - "required_field": "Это поле обязательно к заполнению", - "undo_friendship_modal_text": "Это отменит вашу дружбу с {{displayName}}.", + "report_reason_spam": "Спам", + "report_reason_other": "Другое", + "profile_reported": "Жалоба на профиль отправлена", "your_friend_code": "Код вашего друга:", "upload_banner": "Загрузить баннер", "uploading_banner": "Загрузка баннера...", @@ -616,7 +681,7 @@ "game_added_to_pinned": "Игра добавлена в закрепленные", "karma": "Карма", "karma_count": "карма", - "karma_description": "Заработано от положительных лайков на отзывах" + "karma_description": "Заработана положительными оценками отзывов" }, "achievement": { "achievement_unlocked": "Достижение разблокировано", diff --git a/src/main/services/steam.ts b/src/main/services/steam.ts index e3aad8d9..886772b5 100644 --- a/src/main/services/steam.ts +++ b/src/main/services/steam.ts @@ -19,7 +19,12 @@ export interface SteamAppDetailsResponse { export const getSteamLocation = async () => { if (process.platform === "linux") { - return path.join(SystemPath.getPath("home"), ".local", "share", "Steam"); + const possiblePaths = [ + path.join(SystemPath.getPath("home"), ".steam", "steam"), + path.join(SystemPath.getPath("home"), ".local", "share", "Steam"), + ]; + + return possiblePaths.find((p) => fs.existsSync(p)) || possiblePaths[0]; } if (process.platform === "darwin") { diff --git a/src/renderer/src/components/game-context-menu/game-context-menu.tsx b/src/renderer/src/components/game-context-menu/game-context-menu.tsx index 2b17a6ba..e424dac7 100644 --- a/src/renderer/src/components/game-context-menu/game-context-menu.tsx +++ b/src/renderer/src/components/game-context-menu/game-context-menu.tsx @@ -19,8 +19,8 @@ import { ContextMenuItemData, ContextMenuProps, ConfirmationModal, + useGameActions, } from ".."; -import { useGameActions } from ".."; interface GameContextMenuProps extends Omit { game: LibraryGame; diff --git a/src/shared/html-sanitizer.ts b/src/shared/html-sanitizer.ts index c78d7dd8..01027b2f 100644 --- a/src/shared/html-sanitizer.ts +++ b/src/shared/html-sanitizer.ts @@ -1,6 +1,5 @@ function removeZalgoText(text: string): string { const zalgoRegex = - // eslint-disable-next-line no-misleading-character-class /[\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/g; return text.replaceAll(zalgoRegex, ""); @@ -11,11 +10,9 @@ export function sanitizeHtml(html: string): string { return ""; } - // Use DOM-based sanitization to preserve safe formatting while removing dangerous content. const tempDiv = document.createElement("div"); tempDiv.innerHTML = html; - // Remove clearly unsafe elements entirely. const disallowedSelectors = [ "script", "style", @@ -25,29 +22,28 @@ export function sanitizeHtml(html: string): string { "link", "meta", ]; - disallowedSelectors.forEach((sel) => { - tempDiv.querySelectorAll(sel).forEach((el) => el.remove()); - }); + for (const sel of disallowedSelectors) { + for (const el of tempDiv.querySelectorAll(sel)) { + el.remove(); + } + } - // Strip potentially dangerous attributes from remaining elements. - tempDiv.querySelectorAll("*").forEach((el) => { - Array.from(el.attributes).forEach((attr) => { + for (const el of tempDiv.querySelectorAll("*")) { + for (const attr of Array.from(el.attributes)) { const name = attr.name.toLowerCase(); if ( - name.startsWith("on") || // Event handlers + name.startsWith("on") || name === "style" || name === "src" || - name === "href" // Links disabled in editor; avoid javascript: URLs + name === "href" ) { el.removeAttribute(attr.name); } - }); - }); + } + } - // Clean Zalgo text characters within text nodes. const walker = document.createTreeWalker(tempDiv, NodeFilter.SHOW_TEXT); let node: Node | null; - // eslint-disable-next-line no-cond-assign while ((node = walker.nextNode())) { const textNode = node as Text; const value = textNode.nodeValue || "";