From 52348d565ddb8b0b4396241ec5a49f1f6fb37f3b Mon Sep 17 00:00:00 2001 From: Alex <67554455+handwerk2016@users.noreply.github.com> Date: Thu, 20 Mar 2025 16:55:29 +0200 Subject: [PATCH] Added Russian Locale Added a Russian locale and fixed my typo in readme --- README.md | 2 +- locales/de.json | 15 +- locales/en.json | 4 +- locales/fr.json | 11 +- locales/nl.json | 11 +- locales/pt.json | 7 +- locales/ru.json | 383 +++++++++++++++++++++++++++++++++++++++++++++ locales/vi.json | 7 +- locales/zh_cn.json | 3 +- locales/zh_tw.json | 3 +- main.py | 7 +- 11 files changed, 424 insertions(+), 29 deletions(-) create mode 100644 locales/ru.json diff --git a/README.md b/README.md index 104cc99..c294ea1 100644 --- a/README.md +++ b/README.md @@ -168,7 +168,7 @@ max_timeout = 160 | 如果遇到權限問題,請確保: | 此腳本以管理員身份運行 | |:--------------------------------------------------:|:------------------------------------------------:| | If you encounter permission issues, please ensure: | This script is run with administrator privileges | -| Error 'User is no authorized' | This means your account was banned for using temporary (disposal) mail. Ensure using a non-temporary mail service | +| Error 'User is not authorized' | This means your account was banned for using temporary (disposal) mail. Ensure using a non-temporary mail service | ## 🤩 Contribution | 貢獻 歡迎提交 Issue 和 Pull Request! diff --git a/locales/de.json b/locales/de.json index ec0dbcb..b187796 100644 --- a/locales/de.json +++ b/locales/de.json @@ -19,14 +19,15 @@ "totally_reset": "Cursor Vollständig Zurücksetzen" }, "languages": { - "en": "English", - "zh_cn": "简体中文", - "zh_tw": "繁體中文", - "vi": "Tiếng Việt", - "nl": "Nederlands", + "en": "Englisch", + "zh_cn": "Vereinfachtes Chinesisch", + "zh_tw": "Traditionelles Chinesisch", + "vi": "Vietnamesisch", + "nl": "Niederländisch", "de": "Deutsch", - "fr": "Français", - "pt": "Brazilian Portuguese" + "fr": "Französisch", + "pt": "Brazilian Portuguese", + "ru": "Russisch" }, "quit_cursor": { "start": "Beginne Cursor zu Beenden", diff --git a/locales/en.json b/locales/en.json index e9d3213..ab532e8 100644 --- a/locales/en.json +++ b/locales/en.json @@ -25,7 +25,9 @@ "vi": "Vietnamese", "nl": "Dutch", "de": "German", - "fr": "French" + "fr": "French", + "pt": "Portuguese", + "ru": "Russian" }, "quit_cursor": { "start": "Start Quitting Cursor", diff --git a/locales/fr.json b/locales/fr.json index ac279d2..469bb00 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -19,14 +19,15 @@ "totally_reset": "Réinitialisation Complète de Cursor" }, "languages": { - "en": "English", + "en": "Anglais", "zh_cn": "简体中文", "zh_tw": "繁體中文", - "vi": "Tiếng Việt", - "nl": "Nederlands", - "de": "Deutsch", + "vi": "Vietnamien", + "nl": "Néerlandais", + "de": "Allemand", "fr": "Français", - "pt": "Brazilian Portuguese" + "pt": "Brazilian Portuguese", + "ru": "Russe" }, "quit_cursor": { "start": "Début de la Fermeture de Cursor", diff --git a/locales/nl.json b/locales/nl.json index cff049b..290651b 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -19,14 +19,15 @@ "totally_reset": "Cursor volledig resetten" }, "languages": { - "en": "English", + "en": "Engels", "zh_cn": "简体中文", "zh_tw": "繁體中文", - "vi": "Tiếng Việt", + "vi": "Vietnamees", "nl": "Nederlands", - "de": "Deutsch", - "fr": "Français", - "pt": "Brazilian Portuguese" + "de": "Duits", + "fr": "Frans", + "pt": "Brazilian Portuguese", + "ru": "Russisch" }, "quit_cursor": { "start": "Start met afsluiten van Cursor", diff --git a/locales/pt.json b/locales/pt.json index 73624b2..95d7a1a 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -20,13 +20,14 @@ }, "languages": { "en": "Inglês", - "zh_cn": "Chinês Simplificado", - "zh_tw": "Chinês Tradicional", + "zh_cn": "简体中文", + "zh_tw": "繁體中文", "vi": "Vietnamita", "nl": "Holandês", "de": "Alemão", "fr": "Francês", - "pt": "Português do Brasil" + "pt": "Português do Brasil", + "ru": "Russo" }, "quit_cursor": { "start": "Iniciando fechamento do Cursor", diff --git a/locales/ru.json b/locales/ru.json new file mode 100644 index 0000000..6d843bd --- /dev/null +++ b/locales/ru.json @@ -0,0 +1,383 @@ +{ + "menu": { + "title": "Доступные опции", + "exit": "Выйти из программы", + "reset": "Сбросить ID машины", + "register": "Зарегистрировать новый аккаунт Cursor", + "register_google": "Зарегистрироваться через Google", + "register_github": "Зарегистрироваться через GitHub", + "register_manual": "Зарегистрировать Cursor используя свою почту", + "quit": "Закрыть приложение Cursor", + "select_language": "Выбрать язык", + "input_choice": "Пожалуйста, введите ваш выбор ({choices})", + "invalid_choice": "Неверный выбор. Пожалуйста, введите число из {choices}", + "program_terminated": "Программа была завершена пользователем", + "error_occurred": "Произошла ошибка: {error}. Пожалуйста, попробуйте снова", + "press_enter": "Нажмите Enter для выхода", + "disable_auto_update": "Отключить автоматическое обновление Cursor", + "lifetime_access_enabled": "ВКЛЮЧЕН ПОЖИЗНЕННЫЙ ДОСТУП", + "totally_reset": "Полностью сбросить Cursor" + }, + "languages": { + "en": "Английский", + "zh_cn": "Упрощенный китайский", + "zh_tw": "Традиционный китайский", + "vi": "Вьетнамский", + "nl": "Нидерландский", + "de": "Немецкий", + "fr": "Французский", + "pt": "Бразильский португальский", + "ru": "Русский" + }, + "quit_cursor": { + "start": "Начало закрытия Cursor", + "no_process": "Нет запущенных процессов Cursor", + "terminating": "Завершение процесса {pid}", + "waiting": "Ожидание завершения процесса", + "success": "Все процессы Cursor закрыты", + "timeout": "Таймаут процесса: {pids}", + "error": "Произошла ошибка: {error}" + }, + "reset": { + "title": "Инструмент сброса ID машины Cursor", + "checking": "Проверка конфигурационного файла", + "not_found": "Конфигурационный файл не найден", + "no_permission": "Невозможно прочитать или записать конфигурационный файл, проверьте права доступа", + "reading": "Чтение текущей конфигурации", + "creating_backup": "Создание резервной копии конфигурации", + "backup_exists": "Резервный файл уже существует, пропускаем шаг резервного копирования", + "generating": "Генерация нового ID машины", + "saving_json": "Сохранение новой конфигурации в JSON", + "success": "ID машины успешно сброшен", + "new_id": "Новый ID машины", + "permission_error": "Ошибка прав доступа: {error}", + "run_as_admin": "Пожалуйста, запустите программу от имени администратора", + "process_error": "Ошибка процесса сброса: {error}", + "updating_sqlite": "Обновление базы данных SQLite", + "updating_pair": "Обновление пары ключ-значение", + "sqlite_success": "База данных SQLite успешно обновлена", + "sqlite_error": "Ошибка обновления базы данных SQLite: {error}", + "press_enter": "Нажмите Enter для выхода", + "unsupported_os": "Неподдерживаемая ОС: {os}", + "linux_path_not_found": "Путь Linux не найден", + "updating_system_ids": "Обновление системных ID", + "system_ids_updated": "Системные ID успешно обновлены", + "system_ids_update_failed": "Ошибка обновления системных ID: {error}", + "windows_guid_updated": "Windows GUID успешно обновлен", + "windows_permission_denied": "Отказано в доступе Windows", + "windows_guid_update_failed": "Ошибка обновления Windows GUID", + "macos_uuid_updated": "macOS UUID успешно обновлен", + "plutil_command_failed": "Ошибка команды plutil", + "start_patching": "Начало патчинга getMachineId", + "macos_uuid_update_failed": "Ошибка обновления macOS UUID", + "current_version": "Текущая версия Cursor: {version}", + "patch_completed": "Патчинг getMachineId завершен", + "patch_failed": "Ошибка патчинга getMachineId: {error}", + "version_check_passed": "Проверка версии Cursor пройдена", + "file_modified": "Файл изменен", + "version_less_than_0_45": "Версия Cursor < 0.45.0, пропускаем патчинг getMachineId", + "detecting_version": "Определение версии Cursor", + "patching_getmachineid": "Патчинг getMachineId", + "version_greater_than_0_45": "Версия Cursor >= 0.45.0, патчинг getMachineId", + "permission_denied": "Отказано в доступе: {error}", + "backup_created": "Резервная копия создана", + "update_success": "Обновление успешно", + "update_failed": "Ошибка обновления: {error}", + "windows_machine_guid_updated": "Windows Machine GUID успешно обновлен", + "reading_package_json": "Чтение package.json {path}", + "invalid_json_object": "Неверный JSON объект", + "no_version_field": "Поле версии не найдено в package.json", + "version_field_empty": "Поле версии пусто", + "invalid_version_format": "Неверный формат версии: {version}", + "found_version": "Найдена версия: {version}", + "version_parse_error": "Ошибка разбора версии: {error}", + "package_not_found": "Package.json не найден: {path}", + "check_version_failed": "Ошибка проверки версии: {error}", + "stack_trace": "Трассировка стека", + "version_too_low": "Версия Cursor слишком низкая: {version} < 0.45.0" + }, + "register": { + "title": "Инструмент регистрации Cursor", + "start": "Запуск процесса регистрации...", + "handling_turnstile": "Обработка проверки безопасности...", + "retry_verification": "Повторная попытка проверки...", + "detect_turnstile": "Проверка безопасности...", + "verification_success": "Проверка безопасности успешна", + "starting_browser": "Открытие браузера...", + "form_success": "Форма успешно отправлена", + "browser_started": "Браузер успешно открыт", + "waiting_for_second_verification": "Ожидание проверки email...", + "waiting_for_verification_code": "Ожидание кода подтверждения...", + "password_success": "Пароль успешно установлен", + "password_error": "Не удалось установить пароль: {error}. Пожалуйста, попробуйте снова", + "waiting_for_page_load": "Загрузка страницы...", + "first_verification_passed": "Первичная проверка успешна", + "mailbox": "Успешный доступ к почтовому ящику", + "register_start": "Начать регистрацию", + "form_submitted": "Форма отправлена, начало проверки...", + "filling_form": "Заполнение формы", + "visiting_url": "Переход по URL", + "basic_info": "Основная информация отправлена", + "handle_turnstile": "Обработка Turnstile", + "no_turnstile": "Turnstile не обнаружен", + "turnstile_passed": "Turnstile пройден", + "verification_start": "Начало получения кода подтверждения", + "verification_timeout": "Таймаут получения кода подтверждения", + "verification_not_found": "Код подтверждения не найден", + "try_get_code": "Попытка | {attempt} Получение кода подтверждения | Осталось времени: {time}с", + "get_account": "Получение информации об аккаунте", + "get_token": "Получение токена сессии Cursor", + "token_success": "Токен успешно получен", + "token_attempt": "Попытка | {attempt} раз получить токен | Повторная попытка через {time}с", + "token_max_attempts": "Достигнуто максимальное количество попыток ({max}) | Не удалось получить токен", + "token_failed": "Ошибка получения токена: {error}", + "account_error": "Ошибка получения информации об аккаунте: {error}", + "press_enter": "Нажмите Enter для выхода", + "browser_start": "Запуск браузера", + "open_mailbox": "Открытие страницы почтового ящика", + "email_error": "Не удалось получить email адрес", + "setup_error": "Ошибка настройки email: {error}", + "start_getting_verification_code": "Начало получения кода подтверждения, попытка через 60с", + "get_verification_code_timeout": "Таймаут получения кода подтверждения", + "get_verification_code_success": "Код подтверждения успешно получен", + "try_get_verification_code": "Попытка | {attempt} Получение кода подтверждения | Осталось времени: {remaining_time}с", + "verification_code_filled": "Код подтверждения введен", + "login_success_and_jump_to_settings_page": "Успешный вход и переход на страницу настроек", + "detect_login_page": "Обнаружена страница входа, начало входа...", + "cursor_registration_completed": "Регистрация Cursor завершена!", + "set_password": "Установка пароля", + "basic_info_submitted": "Основная информация отправлена", + "cursor_auth_info_updated": "Информация авторизации Cursor обновлена", + "cursor_auth_info_update_failed": "Ошибка обновления информации авторизации Cursor", + "reset_machine_id": "Сброс ID машины", + "account_info_saved": "Информация об аккаунте сохранена", + "save_account_info_failed": "Ошибка сохранения информации об аккаунте", + "get_email_address": "Получение email адреса", + "update_cursor_auth_info": "Обновление информации авторизации Cursor", + "register_process_error": "Ошибка процесса регистрации: {error}", + "setting_password": "Установка пароля", + "manual_code_input": "Ручной ввод кода", + "manual_email_input": "Ручной ввод email", + "password": "Пароль", + "first_name": "Имя", + "last_name": "Фамилия", + "exit_signal": "Сигнал выхода", + "email_address": "Email адрес", + "config_created": "Конфигурация создана", + "verification_failed": "Проверка не пройдена", + "verification_error": "Ошибка проверки: {error}", + "config_option_added": "Опция конфигурации добавлена: {option}", + "config_updated": "Конфигурация обновлена", + "password_submitted": "Пароль отправлен", + "total_usage": "Общее использование: {usage}", + "setting_on_password": "Установка пароля", + "getting_code": "Получение кода подтверждения, попытка через 60с" + }, + "auth": { + "title": "Менеджер авторизации Cursor", + "checking_auth": "Проверка файла авторизации", + "auth_not_found": "Файл авторизации не найден", + "auth_file_error": "Ошибка файла авторизации: {error}", + "reading_auth": "Чтение файла авторизации", + "updating_auth": "Обновление информации авторизации", + "auth_updated": "Информация авторизации успешно обновлена", + "auth_update_failed": "Ошибка обновления информации авторизации: {error}", + "auth_file_created": "Файл авторизации создан", + "auth_file_create_failed": "Ошибка создания файла авторизации: {error}", + "press_enter": "Нажмите Enter для выхода", + "reset_machine_id": "Сброс ID машины", + "database_connection_closed": "Соединение с базой данных закрыто", + "database_updated_successfully": "База данных успешно обновлена", + "connected_to_database": "Подключено к базе данных", + "updating_pair": "Обновление пары ключ-значение", + "db_not_found": "Файл базы данных не найден по пути: {path}", + "db_permission_error": "Невозможно получить доступ к файлу базы данных. Проверьте права доступа", + "db_connection_error": "Ошибка подключения к базе данных: {error}" + }, + "control": { + "generate_email": "Генерация нового email", + "blocked_domain": "Заблокированный домен", + "select_domain": "Выбор случайного домена", + "copy_email": "Копирование email адреса", + "enter_mailbox": "Вход в почтовый ящик", + "refresh_mailbox": "Обновление почтового ящика", + "check_verification": "Проверка кода подтверждения", + "verification_found": "Код подтверждения найден", + "verification_not_found": "Код подтверждения не найден", + "browser_error": "Ошибка управления браузером: {error}", + "navigation_error": "Ошибка навигации: {error}", + "email_copy_error": "Ошибка копирования email: {error}", + "mailbox_error": "Ошибка почтового ящика: {error}", + "token_saved_to_file": "Токен сохранен в cursor_tokens.txt", + "navigate_to": "Переход на {url}", + "generate_email_success": "Email успешно сгенерирован", + "select_email_domain": "Выбор домена email", + "select_email_domain_success": "Домен email успешно выбран", + "get_email_name": "Получение имени email", + "get_email_name_success": "Имя email успешно получено", + "get_email_address": "Получение email адреса", + "get_email_address_success": "Email адрес успешно получен", + "enter_mailbox_success": "Успешный вход в почтовый ящик", + "found_verification_code": "Найден код подтверждения", + "get_cursor_session_token": "Получение токена сессии Cursor", + "get_cursor_session_token_success": "Токен сессии Cursor успешно получен", + "get_cursor_session_token_failed": "Ошибка получения токена сессии Cursor", + "save_token_failed": "Ошибка сохранения токена", + "database_updated_successfully": "База данных успешно обновлена", + "database_connection_closed": "Соединение с базой данных закрыто", + "no_valid_verification_code": "Нет действительного кода подтверждения" + }, + "email": { + "starting_browser": "Запуск браузера", + "visiting_site": "Переход на сайты почтовых доменов", + "create_success": "Email успешно создан", + "create_failed": "Не удалось создать email", + "create_error": "Ошибка создания email: {error}", + "refreshing": "Обновление email", + "refresh_success": "Email успешно обновлен", + "refresh_error": "Ошибка обновления email: {error}", + "refresh_button_not_found": "Кнопка обновления не найдена", + "verification_found": "Проверка найдена", + "verification_not_found": "Проверка не найдена", + "verification_error": "Ошибка проверки: {error}", + "verification_code_found": "Код подтверждения найден", + "verification_code_not_found": "Код подтверждения не найден", + "verification_code_error": "Ошибка кода подтверждения: {error}", + "address": "Email адрес", + "all_domains_blocked": "Все домены заблокированы, переключение сервиса", + "no_available_domains_after_filtering": "Нет доступных доменов после фильтрации", + "switching_service": "Переключение на сервис {service}", + "domains_list_error": "Не удалось получить список доменов: {error}", + "failed_to_get_available_domains": "Не удалось получить доступные домены", + "domains_excluded": "Исключенные домены: {domains}", + "failed_to_create_account": "Не удалось создать аккаунт", + "account_creation_error": "Ошибка создания аккаунта: {error}", + "blocked_domains": "Заблокированные домены: {domains}", + "blocked_domains_loaded": "Загружены заблокированные домены: {count}", + "blocked_domains_loaded_error": "Ошибка загрузки заблокированных доменов: {error}", + "blocked_domains_loaded_success": "Заблокированные домены успешно загружены", + "blocked_domains_loaded_timeout": "Таймаут загрузки заблокированных доменов: {timeout}с", + "blocked_domains_loaded_timeout_error": "Ошибка таймаута загрузки заблокированных доменов: {error}", + "available_domains_loaded": "Загружены доступные домены: {count}", + "domains_filtered": "Отфильтрованы домены: {count}", + "trying_to_create_email": "Попытка создания email: {email}", + "domain_blocked": "Домен заблокирован: {domain}" + }, + "update": { + "title": "Отключение автоматического обновления Cursor", + "disable_success": "Автоматическое обновление успешно отключено", + "disable_failed": "Ошибка отключения автоматического обновления: {error}", + "press_enter": "Нажмите Enter для выхода", + "start_disable": "Начало отключения автоматического обновления", + "killing_processes": "Завершение процессов", + "processes_killed": "Процессы завершены", + "removing_directory": "Удаление директории", + "directory_removed": "Директория удалена", + "creating_block_file": "Создание файла блокировки", + "block_file_created": "Файл блокировки создан" + }, + "updater": { + "checking": "Проверка обновлений...", + "new_version_available": "Доступна новая версия! (Текущая: {current}, Последняя: {latest})", + "updating": "Обновление до последней версии. Программа перезапустится автоматически.", + "up_to_date": "У вас установлена последняя версия.", + "check_failed": "Не удалось проверить обновления: {error}", + "continue_anyway": "Продолжение работы с текущей версией...", + "update_confirm": "Хотите обновить до последней версии? (Y/n)", + "update_skipped": "Обновление пропущено.", + "invalid_choice": "Неверный выбор. Пожалуйста, введите 'Y' или 'n'.", + "development_version": "Версия разработки {current} > {latest}", + "changelog_title": "Журнал изменений" + }, + "totally_reset": { + "title": "Полный сброс Cursor", + "checking_config": "Проверка конфигурационного файла", + "config_not_found": "Конфигурационный файл не найден", + "no_permission": "Невозможно прочитать или записать конфигурационный файл, проверьте права доступа", + "reading_config": "Чтение текущей конфигурации", + "creating_backup": "Создание резервной копии конфигурации", + "backup_exists": "Резервный файл уже существует, пропускаем шаг резервного копирования", + "generating_new_machine_id": "Генерация нового ID машины", + "saving_new_config": "Сохранение новой конфигурации в JSON", + "success": "Cursor успешно сброшен", + "error": "Ошибка сброса Cursor: {error}", + "press_enter": "Нажмите Enter для выхода", + "reset_machine_id": "Сброс ID машины", + "database_connection_closed": "Соединение с базой данных закрыто", + "database_updated_successfully": "База данных успешно обновлена", + "connected_to_database": "Подключено к базе данных", + "updating_pair": "Обновление пары ключ-значение", + "db_not_found": "Файл базы данных не найден по пути: {path}", + "db_permission_error": "Невозможно получить доступ к файлу базы данных. Проверьте права доступа", + "db_connection_error": "Ошибка подключения к базе данных: {error}", + "feature_title": "ФУНКЦИИ", + "feature_1": "Полное удаление настроек и конфигураций Cursor AI", + "feature_2": "Очистка всех кэшированных данных, включая историю AI и промпты", + "feature_3": "Сброс ID машины для обхода обнаружения пробной версии", + "feature_4": "Создание новых случайных идентификаторов машины", + "feature_5": "Удаление пользовательских расширений и настроек", + "feature_6": "Сброс информации о пробной версии и данных активации", + "feature_7": "Глубокий поиск скрытых файлов лицензии и пробной версии", + "feature_8": "Безопасное сохранение файлов и приложений, не относящихся к Cursor", + "feature_9": "Совместимость с Windows, macOS и Linux", + "disclaimer_title": "ПРЕДУПРЕЖДЕНИЕ", + "disclaimer_1": "Этот инструмент навсегда удалит все настройки Cursor AI,", + "disclaimer_2": "конфигурации и кэшированные данные. Это действие нельзя отменить.", + "disclaimer_3": "Ваши файлы кода НЕ будут затронуты, и инструмент разработан", + "disclaimer_4": "только для файлов редактора Cursor AI и механизмов обнаружения пробной версии.", + "disclaimer_5": "Другие приложения на вашей системе не будут затронуты.", + "disclaimer_6": "После запуска этого инструмента вам нужно будет настроить Cursor AI заново.", + "disclaimer_7": "Используйте на свой страх и риск", + "confirm_title": "Вы уверены, что хотите продолжить?", + "confirm_1": "Это действие удалит все настройки Cursor AI,", + "confirm_2": "конфигурации и кэшированные данные. Это действие нельзя отменить.", + "confirm_3": "Ваши файлы кода НЕ будут затронуты, и инструмент разработан", + "confirm_4": "только для файлов редактора Cursor AI и механизмов обнаружения пробной версии.", + "confirm_5": "Другие приложения на вашей системе не будут затронуты.", + "confirm_6": "После запуска этого инструмента вам нужно будет настроить Cursor AI заново.", + "confirm_7": "Используйте на свой страх и риск", + "invalid_choice": "Пожалуйста, введите 'Y' или 'n'", + "skipped_for_safety": "Пропущено для безопасности (не относится к Cursor): {path}", + "deleted": "Удалено: {path}", + "error_deleting": "Ошибка удаления {path}: {error}", + "not_found": "Файл не найден: {path}", + "resetting_machine_id": "Сброс идентификаторов машины для обхода обнаружения пробной версии...", + "created_machine_id": "Создан новый ID машины: {path}", + "error_creating_machine_id": "Ошибка создания файла ID машины {path}: {error}", + "error_searching": "Ошибка поиска файлов в {path}: {error}", + "created_extended_trial_info": "Создана новая расширенная информация о пробной версии: {path}", + "error_creating_trial_info": "Ошибка создания файла информации о пробной версии {path}: {error}", + "resetting_cursor_ai_editor": "Сброс редактора Cursor AI... Пожалуйста, подождите.", + "reset_cancelled": "Сброс отменен. Выход без внесения изменений.", + "windows_machine_id_modification_skipped": "Изменение ID машины Windows пропущено: {error}", + "linux_machine_id_modification_skipped": "Изменение machine-id Linux пропущено: {error}", + "note_complete_machine_id_reset_may_require_running_as_administrator": "Примечание: полный сброс ID машины может потребовать запуска от имени администратора", + "note_complete_system_machine_id_reset_may_require_sudo_privileges": "Примечание: полный сброс системного machine-id может потребовать прав sudo", + "windows_registry_instructions": "📝 ПРИМЕЧАНИЕ: Для полного сброса в Windows может потребоваться очистка записей реестра.", + "windows_registry_instructions_2": " Запустите 'regedit' и найдите ключи, содержащие 'Cursor' или 'CursorAI' в HKEY_CURRENT_USER\\Software\\ и удалите их.\n", + "reset_log_1": "Cursor AI полностью сброшен и обнаружение пробной версии обойдено!", + "reset_log_2": "Пожалуйста, перезагрузите систему для применения изменений.", + "reset_log_3": "Вам нужно будет переустановить Cursor AI, и теперь у вас должен быть новый пробный период.", + "reset_log_4": "Для лучших результатов рекомендуется также:", + "reset_log_5": "Использовать другой email адрес при регистрации нового пробного периода", + "reset_log_6": "Если возможно, использовать VPN для изменения IP адреса", + "reset_log_7": "Очистить куки и кэш браузера перед посещением сайта Cursor AI", + "reset_log_8": "Если проблемы сохраняются, попробуйте установить Cursor AI в другое место", + "reset_log_9": "Если вы столкнулись с проблемами, перейдите на Github Issue Tracker и создайте issue на https://github.com/yeongpin/cursor-free-vip/issues", + "unexpected_error": "Произошла непредвиденная ошибка: {error}", + "report_issue": "Пожалуйста, сообщите об этой проблеме на Github Issue Tracker на https://github.com/yeongpin/cursor-free-vip/issues", + "keyboard_interrupt": "Процесс прерван пользователем. Выход...", + "return_to_main_menu": "Возврат в главное меню...", + "process_interrupted": "Процесс прерван. Выход...", + "press_enter_to_return_to_main_menu": "Нажмите Enter для возврата в главное меню...", + "removing_known": "Удаление известных файлов лицензии/пробной версии", + "performing_deep_scan": "Выполнение глубокого поиска дополнительных файлов лицензии/пробной версии", + "found_additional_potential_license_trial_files": "Найдено {count} дополнительных потенциальных файлов лицензии/пробной версии", + "checking_for_electron_localstorage_files": "Проверка файлов localStorage Electron", + "no_additional_license_trial_files_found_in_deep_scan": "Дополнительные файлы лицензии/пробной версии не найдены при глубоком поиске", + "removing_electron_localstorage_files": "Удаление файлов localStorage Electron", + "electron_localstorage_files_removed": "Файлы localStorage Electron удалены", + "electron_localstorage_files_removal_error": "Ошибка удаления файлов localStorage Electron: {error}", + "removing_electron_localstorage_files_completed": "Удаление файлов localStorage Electron завершено" + } +} \ No newline at end of file diff --git a/locales/vi.json b/locales/vi.json index a700ec2..827cf39 100644 --- a/locales/vi.json +++ b/locales/vi.json @@ -20,11 +20,12 @@ "en": "English", "zh_cn": "简体中文", "zh_tw": "繁體中文", - "vi": "Tiếng Việt", + "vi": "Vietnamese", "nl": "Dutch", - "de": "Germa", + "de": "German", "fr": "French", - "pt": "Brazilian Portuguese" + "pt": "Brazilian Portuguese", + "ru": "Russian" }, "quit_cursor": { "start": "Bắt Đầu Thoát Cursor", diff --git a/locales/zh_cn.json b/locales/zh_cn.json index aac3893..749afa3 100644 --- a/locales/zh_cn.json +++ b/locales/zh_cn.json @@ -26,7 +26,8 @@ "nl": "Dutch", "de": "German", "fr": "French", - "pt": "Brazilian Portuguese" + "pt": "Portuguese", + "ru": "Russian" }, "quit_cursor": { "start": "开始退出 Cursor", diff --git a/locales/zh_tw.json b/locales/zh_tw.json index 1a71886..e89a444 100644 --- a/locales/zh_tw.json +++ b/locales/zh_tw.json @@ -24,7 +24,8 @@ "nl": "Dutch", "de": "German", "fr": "French", - "pt": "Brazilian Portuguese" + "pt": "Portuguese", + "ru": "Russian" }, "quit_cursor": { "start": "開始退出 Cursor", diff --git a/main.py b/main.py index ffd1437..3290a03 100644 --- a/main.py +++ b/main.py @@ -108,6 +108,7 @@ class Translator: 0x0404: 'zh_tw', # Traditional Chinese 0x0804: 'zh_cn', # Simplified Chinese 0x0422: 'vi', # Vietnamese + 0x0419: 'ru', # Russian } return language_map.get(layout_id, 'en') @@ -141,9 +142,9 @@ class Translator: return 'fr' elif system_locale.startswith('pt'): return 'pt' + elif system_locale.startswith('ru'): + return 'ru' - - # Try to get language from LANG environment variable as fallback env_lang = os.getenv('LANG', '').lower() if 'tw' in env_lang or 'hk' in env_lang: @@ -160,6 +161,8 @@ class Translator: return 'fr' elif 'pt' in env_lang: return 'pt' + elif 'ru' in env_lang: + return 'ru' return 'en' except: