Compare commits

...

485 Commits

Author SHA1 Message Date
Pin Studios
1c36ff010e
Merge pull request #1033 from LoveDoLove/lovedolove
修復 install.ps1 下載狀態條的問題
2025-06-18 10:18:31 +08:00
LoveDoLove
4f060abc93 修復 progress bar 下載狀態不對稱 install.ps1 2025-06-13 10:51:29 +08:00
yeongpin
e8ab5654ad Map Source Code 2025-05-22 10:41:36 +08:00
Pin Studios
f9e3c6025b
Merge pull request #893 from cjahv/main
增强TempMailPlusTab类,添加轮询功能以检查新邮件,支持自定义轮询间隔和最大尝试次数
2025-05-21 10:29:17 +08:00
jahv
d02e5d69c8 增强TempMailPlusTab类,添加轮询功能以检查新邮件,支持自定义轮询间隔和最大尝试次数。同时更新文档以反映新参数,并优化了部分注释的翻译。 2025-05-15 00:30:09 +08:00
Pin Studios
849de8fac2
Merge pull request #836 from cjahv/main
新增 AccountManager 类,支持推荐邮箱及账户信息统一保存
2025-05-12 11:31:22 +08:00
cjahv
201557d79c
Merge branch 'yeongpin:main' into main 2025-05-06 15:53:23 +08:00
yeongpin
30418e36a5 Update version to 1.11.03 and document changes in CHANGELOG.md, including improvements to TempMailPlus email detection logic and fixes for Windows user directory path issues. 2025-05-06 13:33:40 +08:00
jahv
c3a3963a76 Merge branch 'main' of github.com:cjahv/cursor-free-vip 2025-05-02 14:02:01 +08:00
Pin Studios
baec0937c3
Merge pull request #832 from AmzGrainRain/main
修正 windows 环境下用户目录的获取方式
2025-05-02 12:13:57 +08:00
Pin Studios
bdbec76a7b
Merge pull request #829 from cjahv/main
在 README.md 中新增 TempMailPlus 配置项说明
2025-05-02 12:13:03 +08:00
AmzGrainRain
3386d8e08e 修正 windows 环境下用户目录的获取方式 2025-05-01 14:37:36 +08:00
jahv
cb9ec64388 新增账户管理类,创建AccountManager类以处理账户信息的保存和建议邮箱的生成。同时更新CursorRegistration类以使用AccountManager进行账户信息的保存,并在用户输入邮箱时提供建议邮箱功能。更新多语言本地化文件以支持新功能的翻译。 2025-05-01 13:25:16 +08:00
jahv
76179807bc 在README.md中新增TempMailPlus配置选项,包含启用状态、电子邮件地址和PIN码设置,以支持邮件验证功能的扩展。 2025-04-30 23:12:12 +08:00
Pin Studios
f8499708c9
Merge pull request #823 from cjahv/main
🚀 更新 TempMailPlus 的 Cursor 邮件识别逻辑
2025-04-30 17:10:20 +08:00
Pin Studios
4a459574ad Enhance TempMailPlus integration by adding translator support for internationalization, improving error messages, and updating the email tab interface documentation. Additionally, update localization files for multiple languages to include new translation keys related to email verification processes. 2025-04-30 17:09:53 +08:00
jahv
2d1604c646 增强邮件验证功能,新增发件人邮箱检查,确保发件人包含'cursor'字符串以提高邮件处理的准确性。 2025-04-30 07:56:28 +08:00
jahv
be950c510c 增强邮件检查功能,新增验证码缓存机制,优化获取验证码的方法,并更新相关文档注释。 2025-04-30 07:49:54 +08:00
jahv
e190a81ee4 优化邮件检查功能,简化逻辑,直接检查邮件列表中的第一个邮件是否为新邮件,并更新相关文档注释。 2025-04-30 07:41:12 +08:00
cjahv
fa74b17dce
Merge branch 'yeongpin:main' into main 2025-04-29 10:17:23 +08:00
jahv
db490718c5 更新邮件检查功能,支持检查最近3分钟内的邮件,并更新错误处理信息。同时,添加了主程序入口以便于直接运行和测试TempMailPlusTab类。 2025-04-29 10:07:02 +08:00
Pin Studios
50c3d0e522 Update README.md to reflect support for the latest 0.49.x version, ensuring accurate versioning information. 2025-04-28 12:31:54 +08:00
Pin Studios
2aae59a905 Update README.md to include a badge for DeepWiki.com, enhancing visibility and support options for the project. 2025-04-28 12:21:51 +08:00
Pin Studios
c9a294af0b Update CHANGELOG for missing translations, add manual custom authentication feature, and enhance error handling in cursor authentication. Fix: ensure proper handling of database connection errors and improve user feedback in various languages. 2025-04-28 12:16:32 +08:00
Pin Studios
d3d73798f6 Add: update CHANGELOG for new features including Japanese and Italian language support, TempMailPlus integration, and a script for auto-translating missing translation keys. Fix: address Chrome user data directory permission issues on mac. 2025-04-28 11:36:27 +08:00
Pin Studios
5b091bfaf1 fix: add missing comma in Chinese translation for tracking processes 2025-04-28 11:34:34 +08:00
Pin Studios
0e4d91843f
Merge pull request #788 from Ahmed-Nagi1/auto-translate-missing-keys
Add script to auto-translate missing keys in translation files
2025-04-28 11:33:22 +08:00
Pin Studios
f39435f2de
Merge branch 'main' into auto-translate-missing-keys 2025-04-28 11:33:16 +08:00
Pin Studios
a1588c7e00 Enhance translation script to utilize Google Translate API, add error handling, and improve language code mapping. Introduce interactive menu for processing language files and backup options. Update Bulgarian, Japanese, and Chinese translations with new keys and improved error messages. 2025-04-28 11:25:17 +08:00
Pin Studios
8e94fa4e46
Merge pull request #800 from Dragonzhoulong/test-chrome-permissions-fix
fix: 修复 Chrome 用户数据目录权限问题
2025-04-28 11:03:42 +08:00
along
8d7407c72e fix: 修复 Chrome 用户数据目录权限问题 2025-04-27 22:42:56 +08:00
Pin Studios
d365e86952
Merge pull request #785 from cjahv/main
新增TempMailPlus配置,支持临时邮箱验证功能
2025-04-27 14:09:16 +08:00
Pin Studios
7c2ac9b734
Update README.md 2025-04-27 02:25:17 +08:00
Pin Studios
f5b0f4f9ea
Update README.md 2025-04-26 21:15:28 +08:00
Ahmed Nagi
1158068a31 Add script to auto-translate missing keys in translation files with colored output and parallel processing 2025-04-26 13:13:35 +02:00
陈佳慧
dee6a788bb 新增TempMailPlus配置,支持临时邮箱验证功能。更新CursorRegistration类以集成TempMailPlus,并添加相应的国际化支持。新增EmailTabInterface和TempMailPlusTab类以实现邮箱验证逻辑。 2025-04-26 10:29:20 +08:00
Pin Studios
4286b94a86 Update version to 1.11.02, add Japanese and Italian language support, refactor account generation using Faker, and fix various issues. Update CHANGELOG.md to reflect these changes. 2025-04-24 15:05:46 +08:00
Pin Studios
60bd46f192
Merge pull request #763 from wang93wei/main
refactor: Account Generation with Faker and Update requirements.txt
2025-04-24 15:03:51 +08:00
Pin Studios
63d84e0f4d
Merge pull request #762 from Wheeeeeeeeels/add-japanese-italian-support
feat: add Japanese and Italian language support
2025-04-24 14:48:56 +08:00
alanwang
23036da768 Introduced the Faker library in the CursorRegistration class to generate random account information, replacing the original random name generation logic.
Also updated the password generation method to use Faker for creating more complex passwords. Additionally, updated requirements.txt to include the Faker dependency.
2025-04-24 14:35:26 +08:00
wheels
1002c9ca11 feat: add Japanese and Italian language support 2025-04-24 14:03:49 +08:00
Pin Studios
809dac091d Update CHANGELOG.md to include mandatory update notice for version 1.11.01, enhancing user awareness of the new features and improvements. 2025-04-24 11:21:12 +08:00
Pin Studios
da5bff5994 Update version to 1.11.01 and enhance localization for OAuth profile selection. Added new features including Arabic language support, machine ID restoration from backup, and improved error handling in the update process. Updated menu options and fixed various issues for a better user experience. 2025-04-24 11:20:21 +08:00
Pin Studios
296a69bf73 Add CursorGoogleAccountDeleter class for Google account deletion via OAuth. Implemented robust authentication flow, including dynamic waits, error handling, and user feedback. This tool enhances user experience by providing a streamlined process for account deletion. 2025-04-24 10:51:09 +08:00
Pin Studios
5ca6c97d96 Add OAuthHandler class for Google and GitHub authentication, including profile selection and browser setup. Implemented error handling and user feedback for various authentication states. This new functionality enhances the user experience by streamlining the OAuth process. 2025-04-24 10:50:21 +08:00
Pin Studios
fb52888f9c
Merge pull request #756 from ppanphper/main
增加备份的机器ID还原功能
2025-04-24 10:47:52 +08:00
Pin Studios
8e6df1d1f8
Merge branch 'main' into main 2025-04-24 10:47:28 +08:00
Pin Studios
be5a17c861 Update localization files to add "restore_machine_id" entry in English, Vietnamese, Simplified Chinese, and Traditional Chinese, enhancing user feedback consistency across languages. 2025-04-24 10:45:44 +08:00
Pin Studios
ca496ea53f Remove "restore_machine_id" entry from English localization file to streamline user feedback messages. 2025-04-24 10:45:00 +08:00
Pin Studios
52eaecd040 Update localization files to add new language configuration messages for English, Vietnamese, Simplified Chinese, and Traditional Chinese. Added "language_config_saved" and "lang_invalid_choice" entries to enhance user feedback. 2025-04-24 10:43:01 +08:00
Pin Studios
5fac4d6e45
Merge pull request #751 from TranMC/main
Language configuration saved setting
2025-04-24 10:39:06 +08:00
ppanphper
271d5d9db9
Merge branch 'yeongpin:main' into main 2025-04-23 16:40:44 +08:00
ppanphper
c2af657c88 添加恢复机器ID功能,新增restore_machine_id.py文件并更新主菜单以支持该功能。更新多语言支持,包含相关提示信息和错误处理。 2025-04-23 16:31:53 +08:00
TranMC
cf55c91117 Merge branch 'main' of https://github.com/TranMC/cursor-free-vip 2025-04-23 12:58:27 +07:00
TranMC
9abf4f4899 Change something in language file 2025-04-23 12:58:24 +07:00
TranMC
a78b1160c2 Merge branch 'main' of https://github.com/TranMC/cursor-free-vip 2025-04-23 12:56:22 +07:00
TranMC
c5453a4374 Merge branch 'main' of https://github.com/TranMC/cursor-free-vip 2025-04-23 12:49:06 +07:00
TranMC
8c497d7639 Commit vui vui 2025-04-23 12:48:58 +07:00
TranMC
c0c2cd6120
Merge branch 'main' into main 2025-04-23 12:46:52 +07:00
Pin Studios
e36f6d986e
Merge pull request #745 from Ahmed-Nagi1/add-arabic-translation
Add Arabic language
2025-04-23 13:13:05 +08:00
TranMC
0b547c0542 Fix nofitication 2025-04-23 12:09:02 +07:00
TranMC
ef17ba8803 Small language change 2025-04-23 12:04:03 +07:00
TranMC
31bf75e4de Update language configuration 2025-04-23 11:38:17 +07:00
TranMC
63e4e72ec7 Add language config saved 2025-04-23 10:57:50 +07:00
Ahmed Nagi
b51d9c7a74 Add Arabic language option to all locale files and support proper Arabic text display in terminal
- Added "ar" (Arabic) to the languages section in all translation JSON files in the locales directory.
- Implemented Arabic text reshaping and bidi support in main.py using arabic_reshaper and python-bidi for correct RTL display in terminal when Arabic is selected.
2025-04-22 10:57:51 +02:00
yeongpin
4aba849cf1 Refactor GitHub Actions workflow to adjust job dependencies for build processes, ensuring that version determination occurs before tag creation for Linux and macOS builds. 2025-04-22 11:15:15 +08:00
yeongpin
1489357328 Update GitHub Actions workflow to ensure build jobs depend on version determination. Simplify ARM64 Docker build process by directly renaming output files without pre-checks for existence. 2025-04-22 11:13:40 +08:00
yeongpin
243c47adb4 Update CHANGELOG for v1.10.05 to clarify the use of GitHub Actions for builds and include a fix for various issues. 2025-04-22 11:04:11 +08:00
yeongpin
b571356fbf Enhance GitHub Actions workflow to include checks for the existence of output files before renaming them in the ARM64 Docker build process. This ensures proper handling of file naming and provides error feedback if expected files are not found. 2025-04-22 11:03:08 +08:00
yeongpin
615c3ea2db Enhance GitHub Actions workflow to check for existing tags before creating new ones. Update tag creation step to only execute if the tag does not already exist. Remove deprecated steps related to Windows SDK installation and signing processes, which are currently disabled. 2025-04-22 10:40:07 +08:00
yeongpin
cffde7066e Refactor GitHub Actions workflow to replace deprecated set-output command with new output syntax. Update Windows SDK installation step and add fallback for SignTool download in case of failure. 2025-04-22 10:30:43 +08:00
yeongpin
73a8b23257 Update version to 1.10.05, remove block_domain.txt from build specification, and enhance GitHub Actions workflow to dynamically determine version from .env file or manual input. Update CHANGELOG for new version release. 2025-04-22 10:27:08 +08:00
Pin Studios
6d182fda55 Update CHANGELOG for v1.10.04 with hotfix for 'main_path' access issue on Windows and macOS, and general bug fixes. Modify issue templates to clarify version placeholder for bug reports. 2025-04-21 14:05:15 +08:00
Pin Studios
c243e9f2f6 Add main path retrieval for non-Linux systems in get_workbench_cursor_path function 2025-04-21 14:02:59 +08:00
yeongpin
caf996864f Update version to 1.10.03 in build workflow configuration. 2025-04-21 11:03:55 +08:00
yeongpin
ce9411dcda Update version to 1.10.03, enhance CHANGELOG with new features including manual registration, email support, and various bug fixes. Add new cursor_auth and cursor_register_manual scripts for improved user registration process. 2025-04-21 11:03:17 +08:00
Pin Studios
1c10750c2b
Merge pull request #708 from DaydreamCoding/patch-for-cursor_path
fix use cursor_path
2025-04-21 10:55:48 +08:00
Pin Studios
5aa8dbb614
Merge pull request #709 from DaydreamCoding/patch-macOS-bypass_version-use-config_file
fix macOS 'bypass_version.py' get product_json_path from config_file
2025-04-21 10:55:30 +08:00
QTom
30df4d9ad1
fix macOS 'bypass_version.py' get product_json_path from config_file 2025-04-19 16:58:01 +08:00
QTom
4a533436eb
fix use cursor_path 2025-04-19 16:47:06 +08:00
Pin Studios
b271166247
Merge pull request #684 from swechencheng/fix-win-totally-reset-cursor
fix: Port 80aab8741fa826ab286856c0ebfded9cc64ce2ba
2025-04-17 17:54:33 +08:00
Charles Zhang
75825fe3fe fix: Port 80aab8741fa826ab286856c0ebfded9cc64ce2ba
This applies the same fix in 80aab8741fa826ab286856c0ebfded9cc64ce2ba to totally_reset_cursor,
which was missing.
2025-04-17 11:42:55 +02:00
yeongpin
56f9a86e7a Update version to 1.10.02, enhance CHANGELOG with new project guidelines, and implement a function to retrieve user Documents folder path in reset_machine_manual.py and totally_reset_cursor.py. 2025-04-16 11:33:17 +08:00
yeongpin
bdb7fa4ddf Update README.md to clarify tool's purpose and usage, remove outdated features, and add new product image. 2025-04-16 10:41:29 +08:00
yeongpin
51ac969f76 Update version to 1.10.01, add function to retrieve user Documents folder path, and enhance CHANGELOG with new project guidelines and fixes. 2025-04-16 10:34:53 +08:00
Pin Studios
da9d4a3648 Update version to 1.9.06 and remove deprecated cursor authentication and registration scripts 2025-04-16 10:29:12 +08:00
Pin Studios
33a497bf52
Merge pull request #648 from tking007/main
fix: disable UPX in build.spec to resolve GLIBC dependency error
2025-04-16 01:23:19 +08:00
Pin Studios
c392e287fe
Merge pull request #652 from BronzonTech-Cloud/main
Update block_domain.txt
2025-04-16 01:19:10 +08:00
Pin Studios
ea4cfaa7ab
Merge pull request #651 from canmi21/main
sync(aur): 1.9.05
2025-04-16 01:18:12 +08:00
BronzonTech-Cloud
24c1acc562 Update block_domain.txt to add and reorder disposable email domains for improved filtering 2025-04-15 12:49:17 +00:00
Canmi
43eea92f21
sync: 1.9.05 2025-04-15 20:30:55 +08:00
limu3
631f8be5e4 fix: 禁用 build.spec 中的 UPX,解决 [PYI-714723:ERROR] Failed to load Python shared library ...,修复 Bug #620 2025-04-15 19:03:07 +08:00
yeongpin
c8fa00589e Update button replacement logic in bypass_token_limit.py to link to the yeongpin GitHub page, refining patterns for Windows, Linux, and Mac environments. 2025-04-15 12:05:12 +08:00
yeongpin
a3dff87da9 Enhance GitHub Actions workflow by adding code checkout step, calculating SHA256 checksums for release files, and extracting release notes from CHANGELOG. The release notes now include checksums for better transparency. 2025-04-15 10:41:46 +08:00
yeongpin
861f258ce4 Update CHANGELOG.md to reflect new version 1.9.04, including multiple fixes for package issues, readme formatting, and exception handling. 2025-04-15 10:33:08 +08:00
Pin Studios
ab9202fe48
Merge pull request #631 from xbhel/main
Fix ChromiumOptions.arguments type error: list object has no attribute 'get'
2025-04-15 10:28:41 +08:00
Pin Studios
d60c46bac6
Merge pull request #630 from canmi21/main
update: aur release 1.9.04 & fix(linux): pkg name & fix(chrome): oauth error
2025-04-15 10:27:43 +08:00
Pin Studios
4757f9777a Merge branch 'main' of https://github.com/canmi21/cursor into pr/597 2025-04-15 10:24:08 +08:00
Pin Studios
caecbd4c8d fix(readme): format download links for browsers 2025-04-15 10:24:07 +08:00
Canmi
105b5d4517
fix: github ouath fail error 2025-04-15 00:00:14 +08:00
Canmi
f325690e32
add: more output 2025-04-14 23:48:25 +08:00
Canmi
3de2db74b2
fix: unexpected 2025-04-14 23:32:49 +08:00
Canmi
6153041607
fix: handle 2025-04-14 23:22:56 +08:00
Canmi
6eba95c055
fix: oauth logic, add more debug output 2025-04-14 23:05:10 +08:00
Canmi
21535104a6
fix: google-chrome-stable on archlinx(linux), killall, port, and debug 2025-04-14 23:04:43 +08:00
Canmi
b42b4b01b9
fix: fetch 2025-04-14 22:02:10 +08:00
Canmi
4b9c465dd5
fix: path 2025-04-14 21:49:54 +08:00
Canmi
b98059a476
fix: missspell 2025-04-14 21:41:16 +08:00
xbhel
56882f0663 Fix ChromiumOptions#arguments has no attribute 'get' 2025-04-14 21:16:26 +08:00
Canmi
0852472746
fix: conflict 2025-04-14 21:10:56 +08:00
Canmi
d867f5cfe9
update: SRCINFO 2025-04-14 21:02:50 +08:00
Canmi
e69e500e8d
add: LICENSE install 2025-04-14 21:02:34 +08:00
Canmi
2f012b9dc5
fix: missing LICENSE 2025-04-14 21:01:47 +08:00
Canmi
d3c6bf227b
sync: aur version 2025-04-14 21:00:58 +08:00
Canmi
f697b71755
Merge branch 'yeongpin:main' into main 2025-04-14 20:59:13 +08:00
yeongpin
5863891f4b Merge branch 'main' of https://github.com/yeongpin/cursor-free-vip 2025-04-14 16:24:53 +08:00
yeongpin
7e0da4a0cb Update version to 1.9.05 and enhance CHANGELOG with new features, fixes, and Python version update in Docker container. 2025-04-14 16:24:50 +08:00
Pin Studios
1cdb543ea9
Merge pull request #613 from haroondilshad/fix/f-string-backslash-errors
fix:  An error occurred: f-string expression part cannot include a b…
2025-04-14 16:24:04 +08:00
Pin Studios
5dad4f35a6
Merge pull request #614 from wang93wei/main
refactor: 优化语言逻辑 + 升级 Linux arm64 Docker Python 版本至 3.10
2025-04-14 16:20:32 +08:00
Pin Studios
34a23a69a1
Update README.md 2025-04-14 15:24:40 +08:00
Pin Studios
3cca2e3b17
Update README.md 2025-04-14 15:01:06 +08:00
alanwang
ee287b91f2 ci: 更新 ARM64 Docker 容器中的 Python 版本至 3.10
将 ARM64 Docker 容器中的 Python 版本从 3.9 更新至 3.10,以使用最新的稳定版本并确保兼容性
2025-04-14 14:31:06 +08:00
Pin Studios
96704e9f38
Update README.md 2025-04-14 14:21:42 +08:00
haroondilshad
f541bc40b4 fix: An error occurred: f-string expression part cannot include a backslash (delete_cursor_google.py, line 243) 2025-04-14 08:20:55 +02:00
alanwang
a730b145a1 refactor: 使用match-case重构语言映射和菜单选择逻辑
将语言映射和菜单选择逻辑从if-elif重构为match-case,提高代码可读性和维护性
2025-04-14 14:18:58 +08:00
yeongpin
1e72e59985 Update version in .env file to 1.9.04 2025-04-14 13:49:02 +08:00
yeongpin
7d355f126c Update CHANGELOG for v1.9.04, adding Opera GX support and fixing various issues. Update config and OAuth handler to include paths for Opera GX. Enhance utils to retrieve default browser paths for Opera GX. 2025-04-14 13:08:32 +08:00
Pin Studios
abcc3a84fa
Update README.md 2025-04-14 12:52:45 +08:00
Pin Studios
d8f1cbfc3b
Merge pull request #611 from yeongpin/revert-609-main
Revert "Create generator-generic-ossf-slsa3-publish.yml"
2025-04-14 12:43:02 +08:00
Pin Studios
431550e4a9
Revert "Create generator-generic-ossf-slsa3-publish.yml" 2025-04-14 12:42:45 +08:00
Pin Studios
dde25cba02
Merge pull request #609 from Martyb166/main
Create generator-generic-ossf-slsa3-publish.yml
2025-04-14 12:41:06 +08:00
Pin Studios
0466421823
Update README.md 2025-04-14 12:38:52 +08:00
Pin Studios
aa4177d5ec
Update README.md 2025-04-14 12:35:12 +08:00
Pin Studios
75b17bb515
Update README.md 2025-04-14 12:31:10 +08:00
Pin Studios
80a76b507a
Update README.md 2025-04-14 12:28:00 +08:00
Marcin Tyburski
84b77e8b13
Create generator-generic-ossf-slsa3-publish.yml 2025-04-14 06:20:18 +02:00
Pin Studios
f471450e12
Update README.md
Unable to select next GitHub token from pool
2025-04-14 12:01:18 +08:00
Canmi
9f81f94957
rm: duplicate content 2025-04-14 11:15:31 +08:00
Pin Studios
b423779d04
Merge pull request #602 from canmi21/main
fix(readme): missing linux
2025-04-14 01:00:17 +08:00
Canmi
5203634f0a
Merge branch 'yeongpin:main' into main 2025-04-14 00:03:58 +08:00
Canmi
1a73ec0a32
fix(readme): missing linux 2025-04-14 00:03:17 +08:00
Pin Studios
92263013f2
Merge pull request #597 from canmi21/main
update(readme):  add linux & add: aur
2025-04-13 20:57:50 +08:00
Pin Studios
3edb69e831 update(readme): change section title for Archlinux 2025-04-13 20:57:34 +08:00
Pin Studios
271fc818b1 refactor(Translator): enhance language detection and fallback logic
Reorganize language detection methods for Windows and Unix systems, simplifying the fallback mechanism to ensure English is returned when detection fails. Introduce a mapping for language codes based on keyboard layout and system locale, improving maintainability and clarity in the code. This update also removes redundant code and enhances the overall structure of the Translator class.
2025-04-13 20:54:10 +08:00
Pin Studios
61803031dc
Merge pull request #551 from paulpham157/feat/locales
[WIP] Support more new languages
2025-04-13 20:50:29 +08:00
Canmi
9a56bc5f7e
fix: title 2025-04-13 20:19:54 +08:00
Canmi
32fea2c82b
update(readme): add aur 2025-04-13 20:17:10 +08:00
Canmi
45f10a6da8
add: pkg 2025-04-13 20:11:44 +08:00
Canmi
a4692d11dc
update(readme): add linux 2025-04-13 19:37:53 +08:00
Pin Studios
43a58db339
Update README.md 2025-04-13 16:57:03 +08:00
Pin Studios
bc55000668
Update README.md 2025-04-13 15:01:39 +08:00
paulpham157
84358805fc feat(locales): add new translation keys and update existing ones
Add new translation keys for various languages including zh_cn, pt, bg, ru, zh_tw, tr, nl, es, fr, and de. These changes include new error messages, prompts, and additional UI text to improve user experience and localization. Also, reorder initialization code in main.py for better readability.
2025-04-13 10:55:40 +07:00
paulpham157
82e2625dfe refactor(Translator): simplify language detection logic
Consolidate language detection logic for Windows and Unix systems by using a default layout mapping and simplifying locale extraction. Fallback to English if detection fails. This improves maintainability and reduces redundancy in the code.
2025-04-13 10:54:26 +07:00
paulpham157
d5404e8f57 fix: main.py:132: DeprecationWarning: 'locale.getdefaultlocale' is deprecated and slated for removal in Python 3.15. Use setlocale(), getencoding() and getlocale() instead. 2025-04-13 10:54:26 +07:00
yeongpin
fb3e532058 Update version to 1.9.03 and enhance CHANGELOG
- Updated the version in the .env file to 1.9.03.
- Added new entries in CHANGELOG.md for version 1.9.03, detailing hotfixes and improvements, including bypassing Cursor JWT expiration issues and fixing automatic logout in the Cursor editor.
- Refactored token extraction logic in cursor registration files to utilize a new method for improved reliability.
2025-04-13 02:11:59 +08:00
yeongpin
a7c4631ea4 Update CHANGELOG.md for version 1.9.02 with new features and fixes
- Added support for more browsers including Opera, Brave, Edge, and Firefox.
- Introduced a manual browser path configuration option.
- Enhanced existing features by fixing browser profile selection and addressing the Cursor JWT expiration issue.
- Retained fixes for configuration file path, Windows user permissions, and other minor issues.
2025-04-12 17:36:56 +08:00
yeongpin
5b64e54e90 Update CHANGELOG.md for version 1.9.02 with new features and fixes
- Added entry for bypassing Cursor JWT expiration issue.
- Fixed redirect issue in Cursor editor that caused automatic logout.
- Retained existing fixes for configuration file path, Windows user permissions, and other issues.
2025-04-12 17:31:14 +08:00
yeongpin
f667da64b3 Add token refresh functionality and improve token extraction
- Introduced a new `get_user_token.py` file to handle token refresh logic using the Chinese server API.
- Updated `config.py` to include new token settings for refresh server URL and enable refresh option.
- Refactored `oauth_auth.py` to utilize the new token extraction method, enhancing error handling and user feedback.
- Added localization strings for token refresh messages in both English and Chinese to improve user experience.
2025-04-12 17:28:11 +08:00
yeongpin
26a8e8da28 Update CHANGELOG.md for version 1.9.02 and enhance config handling
- Added entries for version 1.9.02 in CHANGELOG.md, detailing fixes for configuration file path, Windows user permissions, and other issues.
- Improved `config.py` to handle document path retrieval more robustly, including fallback to a temporary directory if the documents path is not found.
- Updated localization files to include new strings for configuration messages in both English and Chinese.
2025-04-12 17:00:18 +08:00
yeongpin
3862176867 Refactor README.md for improved readability
- Adjusted formatting of browser download instructions to enhance clarity and presentation.
- Separated links for better visual structure in both English and Chinese sections.
2025-04-12 14:37:32 +08:00
yeongpin
5adc598661 Update README.md and configuration files for enhanced browser support
- Revised browser download instructions in README.md to include multiple options: Google Chrome, Opera, Edge, Firefox, and Brave.
- Added new Windows path configurations for browser executables and drivers in the configuration section, improving support for various browsers and their respective drivers.
- Introduced new settings for OAuth configuration, including alert display options and timeout settings.
2025-04-12 14:36:37 +08:00
yeongpin
5e6651bb32 Update CHANGELOG.md for version 1.9.01
- Reorganized entries for clarity, ensuring the new features and fixes are listed under the correct version.
- Added details on enhanced browser support, including Opera, Brave, Edge, and Firefox, along with fixes for browser profile selection and other issues.
2025-04-12 14:35:10 +08:00
yeongpin
bdc606ce2d Update default version in build workflow to 1.9.01 2025-04-12 14:29:54 +08:00
yeongpin
564e421288 Update version to 1.9.01 and enhance CHANGELOG
- Updated the version in the .env file to 1.9.01.
- Added new entries in CHANGELOG.md for version 1.9.01, detailing enhancements such as increased browser support for Opera, Brave, Edge, and Firefox, along with fixes for browser profile selection and other issues.
2025-04-12 14:28:56 +08:00
yeongpin
dce359dc33 Enhance OAuth and browser configuration
- Updated `config.py` to include paths for Opera browser and added new OAuth settings for alert display and timeout configurations.
- Modified `oauth_auth.py` to improve error handling and user data directory retrieval for Opera, along with conditional alert display based on configuration.
- Enhanced `utils.py` to support multiple Opera installation paths for better browser detection.
- Updated localization files to include new strings for user data directory messages.
2025-04-12 14:26:46 +08:00
yeongpin
ff79fae77b Merge branch 'main' of https://github.com/yeongpin/cursor-free-vip 2025-04-12 14:11:24 +08:00
yeongpin
db3a2032dc Enhance browser configuration and path retrieval
- Updated `config.py` to include a comprehensive browser configuration section, allowing for dynamic retrieval of browser paths and drivers for Chrome, Edge, Firefox, and Brave.
- Refactored `new_signup.py`, `new_tempemail.py`, and `oauth_auth.py` to utilize the new browser configuration, improving flexibility and maintainability.
- Removed deprecated `get_default_chrome_path` function and replaced it with a more generalized `get_default_browser_path` function in `utils.py`.
- Updated localization files to include new strings related to browser path validation and selection.
2025-04-12 14:11:22 +08:00
Pin Studios
e2a33d178d
Merge pull request #562 from eltociear/patch-1
docs: update CHANGELOG.md
2025-04-12 13:24:15 +08:00
Ikko Eltociear Ashimine
42d97cfa87
docs: update CHANGELOG.md
Faild -> Failed
2025-04-11 18:23:14 +09:00
yeongpin
c42d7d5422 Add option to bypass token limit in menu
- Updated the menu in `main.py` to include a new option for bypassing token limits.
- Adjusted the choice number in the main loop to accommodate the new functionality.
- Integrated the `bypass_token_limit` script to be executed when the new menu option is selected.
2025-04-11 10:54:29 +08:00
yeongpin
c7a84ca59f Update version to 1.8.11 in .env file 2025-04-11 10:53:49 +08:00
yeongpin
4746af7ce9 Add bypass token limit functionality
- Introduced a new script `bypass_token_limit.py` to modify the `workbench.desktop.main.js` file, allowing users to bypass token limits.
- Updated localization files to include new strings for the bypass token limit feature in English, Simplified Chinese, and Traditional Chinese.
- Enhanced CHANGELOG.md to reflect the addition of the bypass token limit feature and related fixes.
2025-04-11 10:53:06 +08:00
yeongpin
9f51ba8128 Update CHANGELOG.md for version 1.8.10, detailing fixes for Linux reset process errors and enhancements to cursor path retrieval for improved maintainability across operating systems. 2025-04-10 00:29:37 +08:00
yeongpin
9aa09c436e Enhance cursor path retrieval in reset_machine_manual.py for Linux systems
- Updated the get_workbench_cursor_path function to handle Linux systems more effectively.
- Added logic to use the first base path if no valid paths are found in the existing loop.
- Improved maintainability and clarity of the code by explicitly handling different operating systems.
2025-04-10 00:28:20 +08:00
yeongpin
1e3e9c99eb Merge branch 'main' of https://github.com/yeongpin/cursor-free-vip 2025-04-09 20:49:43 +08:00
yeongpin
3f9cbc3d08 Update version to 1.8.10, add user authorization check feature, and enhance localization support
- Bumped version in .env file to 1.8.10.
- Introduced a new script for checking user authorization with detailed feedback and error handling.
- Updated CHANGELOG.md to include new entries for the user authorization feature and minor fixes.
- Added localization strings for user authorization checks in English, Simplified Chinese, and Traditional Chinese.
2025-04-09 20:49:39 +08:00
yeongpin
12d46d5f18 Update build.yml to bump version to 1.8.09 and remove changelog extraction step from release process 2025-04-09 16:26:43 +08:00
yeongpin
6cb3ad79af Update CHANGELOG.md for version 1.8.09, adding new entries for bypassing token limits and enhancing multilingual support, along with minor issue fixes. 2025-04-09 16:17:23 +08:00
yeongpin
6470c65f8b Update CHANGELOG.md for version 1.8.09, adding a fix for reset break and enhancing the button replacement logic in reset_machine_manual.py for improved maintainability and clarity. 2025-04-09 16:14:57 +08:00
yeongpin
491b227486 Bump version to 1.8.09 in .env file 2025-04-09 10:30:48 +08:00
Pin Studios
96c0cd5274
Merge pull request #528 from Cantue35/fix/disable-forced-update
Fix forced update config deletion when update check is disabled
2025-04-09 10:29:55 +08:00
yeongpin
60a438e618 Update CHANGELOG.md for version 1.8.09, adding new entries for force update configuration enhancements and multilingual support, along with minor issue fixes. 2025-04-09 10:29:43 +08:00
yeongpin
6a25871366 feat: Enhance force update configuration with new options and multilingual support
- Added 'enabled_force_update' option in the [Utils] section of the configuration.
- Updated the force_update_config() function to utilize the new option for determining update behavior.
- Improved user feedback messages for force update status in English, Simplified Chinese, and Traditional Chinese locale files.
- Ensured consistent messaging for enabling and disabling force updates.
2025-04-09 10:29:28 +08:00
Cantue35
b46a58bd23
Fix forced update config deletion when update check is disabled
- Added a conditional check in force_update_config() to verify that enabled_update_check in the [Utils] section is read as False.
- If disabled, the config file will not be deleted.
- This prevents loss of custom configuration and improves usability.
- Tested on macOS with our modifications.
2025-04-08 20:35:09 +03:00
yeongpin
fea2b88a8e Update CHANGELOG.md to reflect recent changes, including a new entry for bypassing Cursor version checks and documentation for header configuration. Adjusted existing entries for clarity. 2025-04-07 12:43:35 +08:00
yeongpin
63fe39f2c1 fix: Update backup timestamp format in force update configuration
- Changed the variable name from 'time' to 'current_time' for clarity.
- Updated the backup file naming to use the current timestamp correctly, ensuring accurate backup creation.
2025-04-07 10:53:06 +08:00
yeongpin
386ffa4568 chore: Bump version to 1.8.08 in .env file 2025-04-07 10:51:09 +08:00
yeongpin
9c66725caf feat: Introduce force update configuration feature with multilingual support
- Added a new function to force update the configuration file with the latest defaults, including backup and removal of the original file.
- Implemented multilingual support for force update messages in English, Simplified Chinese, and Traditional Chinese locale files.
- Updated CHANGELOG.md to reflect the new feature and fixes, bumping the version to 1.8.08 in the build workflow.
2025-04-07 10:51:01 +08:00
yeongpin
16b6ba95e2 fix: Update RESET emoji in totally_reset_cursor.py for improved clarity
- Changed the RESET emoji from an invalid character to a clear refresh symbol (🔄) for better user understanding.
2025-04-06 17:31:57 +08:00
yeongpin
3424f49a57 fix: Correct indentation and formatting issues in totally_reset_cursor.py
- Fixed indentation in the get_cursor_paths function for better readability.
- Adjusted the else statement in the MachineIDResetter class to maintain consistent formatting.
- Ensured proper newline at the end of the file for compliance with coding standards.
2025-04-06 17:31:10 +08:00
yeongpin
07bed23848 Update CHANGELOG.md with new messaging for free accounts and fix minor issues; bump version to 1.8.07 in build workflow 2025-04-06 12:58:36 +08:00
yeongpin
c12c52269e feat: Add multilingual support for new bypass version check messages
- Added "bypass_version_check" and "token_not_found" messages to English, Simplified Chinese, and Traditional Chinese locale files.
- Enhanced user experience by ensuring consistent messaging across multiple languages.
2025-04-06 12:56:33 +08:00
yeongpin
8d279ce972 feat: Add option to bypass version check in menu
- Introduced a new menu option for bypassing the Cursor version check.
- Updated the main menu to include the new option and adjusted the choice number accordingly.
- Enhanced user experience by integrating the new feature with existing multilingual support.
2025-04-06 12:54:54 +08:00
yeongpin
849ec5ea8d feat: Implement Cursor version bypass tool with multilingual support
- Updated version to 1.8.07 in .env file.
- Added bypass_version.py to modify product.json for bypassing version checks.
- Enhanced user experience with multilingual support for bypass messages in English, Chinese (Simplified and Traditional).
- Updated CHANGELOG.md to reflect new features and fixes.
2025-04-06 12:51:22 +08:00
Pin Studios
c48c35fd09
Merge pull request #500 from BronzonTech-Cloud/main
Blocklist Updated with more Temp Mail Domains
2025-04-05 22:17:36 +08:00
Charles Bronzon
a361d2fe6d
Update block_domain.txt
Added more temporary/disposable email domains
2025-04-05 13:50:20 +00:00
Pin Studios
74be8a0a77 refactor: Simplify profile selection process in OAuthHandler
- Removed the user data directory retrieval in main.py for cleaner profile selection.
- Updated profile selection logic to include an exit option in oauth_auth.py.
- Enhanced user prompts in multiple languages to improve user experience during profile selection.
2025-04-05 19:10:21 +08:00
Pin Studios
bce205b252 chore: Update README image size for better visibility
- Increased the width of the image in README.md from 400px to 800px to enhance visual clarity and presentation.
2025-04-05 18:49:05 +08:00
Pin Studios
8fcf3b62cf chore: Update README with new image and improve visual content
- Replaced the old image with a new one in the README.md to enhance visual appeal.
- Added the new image file 'pro_2025-04-05_18-47-56.png' to the images directory.
2025-04-05 18:48:28 +08:00
Pin Studios
eeaee073cf feat: Add multilingual feature request templates for improved user engagement
- Introduced new feature request templates in both English and Chinese to enhance user experience and encourage suggestions.
- Removed the old single-language feature request template to streamline the process.
2025-04-05 18:40:12 +08:00
Pin Studios
2f353da381 Fix: Address issues with custom Chrome installations in CHANGELOG.md 2025-04-05 18:37:29 +08:00
Pin Studios
efd1417407
Merge pull request #480 from handwerk2016/main
[Windows] Fix for custom Chrome Installations
2025-04-05 18:36:25 +08:00
Pin Studios
2cc7cce283 Refactor OAuthHandler for improved Chrome profile management
- Introduced methods to retrieve and select available Chrome profiles.
- Enhanced error handling for profile loading and selection.
- Removed unnecessary Linux-specific checks and subprocess calls.
- Streamlined browser setup process to utilize selected profiles.
- Improved account usage limit detection with a dedicated function.
- Cleaned up code by removing deprecated methods and comments.
2025-04-05 18:36:00 +08:00
Pin Studios
4c30afcd7f chore: update version to 1.8.06 in .env file 2025-04-05 18:31:33 +08:00
Pin Studios
bfb2f5e95a
Merge pull request #494 from saadtahir995/main
feat: Added Google OAuth Acc Deletion Tool
2025-04-05 18:30:57 +08:00
Pin Studios
35e01edf9c feat: Enhance account deletion process with improved translations and error handling
- Added multilingual support for account deletion messages in delete_cursor_google.py and oauth_auth.py
- Updated CHANGELOG.md to reflect new features and fixes
- Improved user prompts and error messages for better clarity and user experience
2025-04-05 18:30:44 +08:00
Pin Studios
df9e88131b
Merge pull request #469 from Nigel1992/feat/feature-request-template-new
feat: add comprehensive feature request issue template [EN only]
2025-04-05 18:16:20 +08:00
Pin Studios
8a4d22103e
Merge pull request #492 from Lucaszmv/fix/usage-limits-check
Fix: Improve usage limits check and tuple index error
2025-04-05 18:16:02 +08:00
Pin Studios
1244d86994
Merge pull request #489 from Hexoso/main
Fix: bug in disable cursor auto update
2025-04-05 18:14:56 +08:00
Pin Studios
a2833fcbd4 fix: handle permission errors in auto-update disabling process and enhance localization messages 2025-04-05 18:14:42 +08:00
Saad
b3e7c101d3 feat: Added Google OAuth Acc Deletion Tool 2025-04-05 12:16:02 +05:00
Sadegh Barzegar
0a779063bf chore: modify disable auto update & config 2025-04-05 05:01:46 +03:30
Lucas
c96433e446 Fix: Improve usage limits check and tuple index error 2025-04-04 17:23:27 -03:00
Sadegh Barzegar
5604f5073d fix: bug in disable cursor update 2025-04-04 12:19:14 +03:30
Alex
3cad68be36
Update oauth_auth.py
changed locale
2025-04-04 09:31:54 +03:00
Pin Studios
d8799cdf2e
Merge pull request #485 from moelbanna-bot/main
fix-linux-appimage
2025-04-04 06:12:59 +08:00
Pin Studios
3e5c22b816
Merge pull request #479 from vauns/main
feat: Add support for custom Cursor installation paths on Windows
2025-04-04 06:12:10 +08:00
Pin Studios
893c3f8a52
Merge pull request #467 from Nigel1992/feat/chrome-profile-selection
feat(oauth): add Chrome profile selection feature
2025-04-04 06:10:07 +08:00
Mohamed Elbanna
edb74e21be Enhance Linux cursor path detection to include extracted AppImage directories and add debug output for found paths 2025-04-03 15:47:58 +02:00
Mohamed Elbanna
be52ce98a6 Improve Linux cursor path detection to include extracted AppImage with correct usr structure and add debug output for found paths 2025-04-03 15:20:38 +02:00
Mohamed Elbanna
163748fd96 Refactor Linux path detection to use extracted AppImage with correct usr structure 2025-04-03 14:55:56 +02:00
Mohamed Elbanna
f888b8c90c Enhance Linux path detection for Cursor AppImage installations 2025-04-03 14:35:07 +02:00
Alex
3c12561997 [Windows] Fix for Custom Chrome Installations
This commit fixes that error when you had an custom chrome installation. For example: D:\Chromium or something.
Now it uses windows PATH to start chrome and if there's no PATH installation script would check default location.

Here's demo for current bug: https://youtu.be/O8lPblnBIGQ
2025-04-03 10:55:45 +03:00
吕海龙
80aab8741f feat: Add support for custom Cursor installation paths on Windows
- Modify base_path detection to use custom paths from config
- Replace forward slashes with backslashes in Windows path definition
2025-04-03 15:42:10 +08:00
Nigel
2595c4c95d
Merge branch 'yeongpin:main' into feat/feature-request-template-new 2025-04-03 01:11:38 +02:00
Nigel1992
f18e65f391 feat(template): add feature request issue template 2025-04-03 01:10:19 +02:00
Nigel1992
671307b53b fix(oauth): remove duplicate browser data directory message 2025-04-03 01:02:57 +02:00
Nigel1992
f58bb70d3a fix(oauth): fix translation keys in Chrome profile selection 2025-04-03 01:01:58 +02:00
Nigel1992
5bfe653a92 fix(oauth): remove duplicate Chrome warning message 2025-04-03 01:00:38 +02:00
Nigel1992
a66a0e5395 feat(oauth): add Chrome profile selection feature
- Add new menu option to select which Chrome profile to use

- Display actual profile names from Chrome's Local State

- Add safety warning and confirmation before closing Chrome

- Add translations for all supported languages
2025-04-03 00:51:04 +02:00
Pin Studios
ea44218a8a
Update CHANGELOG.md 2025-04-03 02:09:29 +08:00
Pin Studios
fdc8317380
Update .env 2025-04-03 02:07:49 +08:00
Pin Studios
523daea54e
Merge pull request #463 from blobs0/patch-1
Patch Linux Path Not Found
2025-04-03 02:06:52 +08:00
Pin Studios
5a4e32f3f4
Merge pull request #460 from Lucaszmv/fix/oauth-account-usage-limit
fix: improve account usage limit detection
2025-04-03 02:06:09 +08:00
Valentin Guerdin
d91485ec75
Patch Linux Path Not Found
add folder /usr/lib/cursor/app/
2025-04-02 14:32:27 +02:00
Lucas
51cef9c2b2 fix: improve account usage limit detection
- Add support for detecting both 150/150 and 50/50 usage limits
- Improve usage parsing and validation
- Add better error handling for usage detection
- Add more descriptive log messages
2025-04-01 15:42:05 -03:00
yeongpin
6e6180e331 fix: update reset emoji and correct button patterns for cross-platform compatibility 2025-03-31 17:49:35 +08:00
yeongpin
e2d7c1c496 chore: update version to 1.8.04 and enhance CHANGELOG with new features and fixes 2025-03-31 12:35:35 +08:00
yeongpin
a56b978669 feat: add new error messages for browser process handling in English, Simplified Chinese, and Traditional Chinese locales 2025-03-31 12:33:25 +08:00
Pin Studios
9793b91bc7
Merge pull request #437 from Nigel1992/fix/433-linux-chrome-visibility
fix: improve Linux Chrome visibility and root user handling
2025-03-31 12:00:11 +08:00
yeongpin
735dd8c1eb refactor: enhance user feedback and error messages with translation support across multiple modules 2025-03-31 11:58:54 +08:00
Pin Studios
e5d192efcb
Merge pull request #434 from BasaiCorp/main
Update totally_reset_cursor.py face 1 wait for face 3
2025-03-31 11:23:52 +08:00
Pin Studios
a4d5b0e467
Update totally_reset_cursor.py
Fix & Add Locale
2025-03-31 11:23:31 +08:00
Nigel1992
d7b056b339 fix: improve Linux Chrome visibility and root user handling 2025-03-30 22:27:08 +02:00
Nigel1992
bd152be4e8 fix: improve Linux path handling and fix permission issues 2025-03-30 22:14:03 +02:00
Prathmesh Barot
172d9fb4bb
Update totally_reset_cursor.py face 1 wait for face 3
1/3
2025-03-30 23:23:10 +05:30
Pin Studios
e2d70c1738
Update CHANGELOG.md 2025-03-31 01:03:13 +08:00
Pin Studios
650e2d33db
Update .env 2025-03-31 01:01:02 +08:00
Pin Studios
2d1347c8c6
Merge pull request #430 from Lostata/main
Fixed grammar errors in README.md
2025-03-31 01:00:37 +08:00
Pin Studios
67d3554664
Merge pull request #426 from Nigel1992/fix/412-case-insensitive-cursor
Fix: improve Linux path handling and add case-insensitive Cursor directory detection
2025-03-31 00:59:50 +08:00
yeongpin
cb202e08e5 refactor: enhance configuration error messages with translation support and improve user feedback 2025-03-31 00:58:51 +08:00
Lostata
0c0ec47432
Fixed grammar errors in README.md 2025-03-30 09:05:46 +03:00
Nigel1992
f00678ddcb fix: add case-insensitive handling for Cursor/cursor directory 2025-03-29 23:59:04 +01:00
Nigel1992
dbc220053d fix: improve Linux path handling for config file detection 2025-03-29 23:53:45 +01:00
yeongpin
d7ab362c4c Update README.md to reflect support for the latest 0.48.x version and add new configuration options for checking updates and displaying account information. 2025-03-29 22:30:59 +08:00
yeongpin
4448a62458 Update CHANGELOG.md to reflect the reorganization of features and fixes for version 1.8.02, including the addition of new configuration options and enhancements to the temporary email functionality. 2025-03-29 22:29:27 +08:00
yeongpin
50d09e5172 Update CHANGELOG.md to reflect the addition of a new temporary email feature, and fixes for Linux Chrome issues and other minor problems. 2025-03-29 22:23:16 +08:00
yeongpin
ffff3bdeb1 Update block_domain.txt to include corhash.net and mailshou.com; modify new_signup.py and new_tempemail.py to conditionally set the --no-sandbox argument for Linux platforms. 2025-03-29 22:22:43 +08:00
yeongpin
816a09d4de Refactor NewTempEmail class to enhance email creation and verification processes, including improved browser setup and error handling. Add new_tempemail_api.py to .gitignore. 2025-03-29 22:18:11 +08:00
yeongpin
e5b7e5727c Enhance NewTempEmail functionality by integrating random service selection, improving email creation process with retries, and implementing API calls for domain and message handling. Add new_tempemail_smail.py to .gitignore. 2025-03-29 22:15:33 +08:00
yeongpin
087e3ebf78 Add solerbe.net to block_domain.txt 2025-03-29 21:59:06 +08:00
yeongpin
bd96107911 Format new GUID in reset_machine_manual.py to include braces for consistency. 2025-03-29 21:55:21 +08:00
yeongpin
17799e0209 Add dugmail.com to block_domain.txt 2025-03-29 21:52:51 +08:00
yeongpin
c15ea25cb3 Update version to 1.8.02 in .env and CHANGELOG.md, adding new features and fixes including disabling auto-update, configuration options, and contributors options. 2025-03-29 21:49:57 +08:00
yeongpin
350d781ce8 Update default version in build.yml to 1.8.02 2025-03-28 23:49:32 +08:00
yeongpin
4485cc5571 Add support for 'Free Trial' membership type in format_subscription_type function 2025-03-28 23:47:24 +08:00
yeongpin
df58b2e4ab Update version to 1.8.01 in .env and CHANGELOG.md, reflecting new features and fixes. 2025-03-28 23:42:28 +08:00
yeongpin
5f380ebe5e Refactor reset_machine_manual.py to remove deprecated comments and add new error message translations for file modification failures in English, Simplified Chinese, and Traditional Chinese locales. 2025-03-28 23:41:19 +08:00
yeongpin
c97bfd1475 Update CHANGELOG.md with specific Linux Chrome fix, add no-sandbox option in new_tempemail.py, and uncomment workbench path modification in reset_machine_manual.py. 2025-03-28 23:33:48 +08:00
yeongpin
28cd662e83 Update CHANGELOG.md, fix logo centering, and enhance totally reset cursor functionality. Revert cursor reset to beta, add new confirmation and display functions, and improve file handling for cursor-related paths. 2025-03-28 23:27:00 +08:00
Pin Studios
1b6ba5eab8
Merge pull request #409 from lulavc/main
updated the text in
2025-03-28 22:45:02 +08:00
Luiz Henrique
3e3cd40e3f
Merge branch 'yeongpin:main' into main 2025-03-28 10:25:43 -03:00
Luiz Henrique
8f35f163c5
Update README.md 2025-03-28 10:24:49 -03:00
yeongpin
f6ffb18427 Update configuration path for update.yml to app-update.yml in setup_config function. 2025-03-28 19:29:57 +08:00
yeongpin
b6bf62f841 Update configuration paths for update.yml and add new translation key for 'create_block_file_failed' in English, Simplified Chinese, and Traditional Chinese locales. 2025-03-28 19:28:46 +08:00
yeongpin
1c1174fa6c Add new translation key for 'remove_directory_failed' in English, Simplified Chinese, and Traditional Chinese locales to enhance error messaging consistency. 2025-03-28 19:26:58 +08:00
yeongpin
4587fd9373 Update version to 1.7.19, add Cursor Account Info feature, and enhance configuration handling for updater paths. Update CHANGELOG.md with new features and fixes. 2025-03-28 19:24:55 +08:00
Luiz Henrique
51fcf83ebb
Merge branch 'yeongpin:main' into main 2025-03-28 00:40:09 -03:00
Luiz Henrique
5cc7630ce6
Update README.md 2025-03-28 00:39:21 -03:00
Pin Studios
bd9e10056f
Merge pull request #394 from distributedStorage/tiny-fix
fix: inconsistent UI message
2025-03-26 18:43:16 +08:00
Pin Studios
36f5356b4a
Merge pull request #387 from AliAsgharRanjbar/main
fix: modified the change language option number
2025-03-26 18:43:01 +08:00
imbajin
18fc0532fd fix: inconsistent message 2025-03-26 18:24:10 +08:00
Ali Asghar Ranjbar
7405c61cc9
fix: modified the change language option number 2025-03-26 08:26:56 +03:30
Pin Studios
80e9946294
Update CHANGELOG.md 2025-03-25 16:12:04 +08:00
Pin Studios
4ef293da81
Update .env 2025-03-25 06:52:29 +08:00
Pin Studios
eb6ef6bb3b
Update CHANGELOG.md 2025-03-25 06:51:28 +08:00
Pin Studios
3700239c99
Merge pull request #373 from Nigel1992/fix/linux-path-detection
fix: Improve Linux path detection and config handling
2025-03-25 06:48:28 +08:00
yeongpin
a8966de771 Add new translation key for 'path_not_found' in English and Chinese (Simplified and Traditional) locales, ensuring consistent error messaging across languages. 2025-03-25 06:37:20 +08:00
Nigel1992
8943266f6e fix: Improve Linux path detection and config handling 2025-03-24 23:01:24 +01:00
yeongpin
35ed9cb6f6 Merge branch 'main' of https://github.com/yeongpin/cursor-free-vip 2025-03-23 21:13:11 +08:00
yeongpin
3d1450ced0 Update CHANGELOG for v1.7.18 with fixes for write permissions and other issues. Add new translation keys for error messages in English and Chinese (Simplified and Traditional) locales. 2025-03-23 21:13:08 +08:00
Pin Studios
892fc85efa
Merge pull request #362 from lulavc/main
Added Spanish translation
2025-03-23 11:50:52 +08:00
Luiz Henrique
feaf9906ba
Added Spanish translation 2025-03-22 23:14:23 -03:00
Luiz Henrique
568e38e70c Added spanish 2025-03-22 23:10:03 -03:00
Pin Studios
ab7281921e
Update README.md 2025-03-23 08:48:29 +08:00
yeongpin
58b4b0dece Update version to 1.7.17, add 'fixed soon' translation key in English and Chinese (Simplified and Traditional), and modify CHANGELOG to reflect recent fixes and updates. 2025-03-23 08:34:50 +08:00
yeongpin
07bee3207d Add new display features and warnings to CHANGELOG, fix cursor reset message, and remake logo centering for improved clarity and user experience. 2025-03-22 21:33:23 +08:00
yeongpin
06a9d47dad Update warning message translation key for improved clarity in user feedback. 2025-03-22 21:22:15 +08:00
yeongpin
048a69be8f Update cursor reset messages for improved clarity and user feedback. Modify translation strings in English and Chinese (Simplified and Traditional) locales to reflect completed reset status and cancellation notifications. 2025-03-22 21:21:09 +08:00
yeongpin
0b2081175d Refactor cursor reset process to include translator support in file and directory deletion functions. Enhance user feedback with new messages for removal failures and deep scanning operations in English and Chinese (Simplified and Traditional) locales. 2025-03-22 21:18:29 +08:00
yeongpin
eb31209b6a Enhance logo formatting and add warning emoji to improve user interface. Update feature display and confirmation prompts for better clarity and user experience. 2025-03-22 20:39:25 +08:00
yeongpin
7a239d3348 Refactor cursor reset functionality to enhance user experience with improved prompts and error handling. Update translation support for various messages and warnings in English, Chinese (Simplified and Traditional). Change function calls in main.py to align with updated definitions in totally_reset_cursor.py. 2025-03-22 20:27:39 +08:00
yeongpin
a9eed9818c Update README to replace outdated image with a new screenshot and add the new image file for improved visual representation. 2025-03-22 19:54:35 +08:00
yeongpin
0260d6be04 Update version to 1.7.16, add Bulgarian language support, enhance GitHub + Cursor AI registration automation, and improve user prompts. Update CHANGELOG with new features and fixes. 2025-03-22 19:42:49 +08:00
BasaiCorp
cff7e05e4e Merge remote changes with local modifications 2025-03-22 15:26:24 +05:30
BasaiCorp
9fe6d1ae2c fix and added some things still in beta 2025-03-22 15:23:30 +05:30
yeongpin
b3f905acb6 Update input choice prompt to include options 0-10 for improved user interaction. 2025-03-22 17:17:57 +08:00
yeongpin
492482199a Merge branch 'main' of https://github.com/yeongpin/cursor-free-vip 2025-03-22 16:55:44 +08:00
yeongpin
846a044704 Add webdriver_manager to requirements.txt for improved browser driver management 2025-03-22 16:55:16 +08:00
Pin Studios
b131281515
Update build.yml 2025-03-22 16:32:06 +08:00
yeongpin
b797d93db5 Update requirements.txt to include selenium package for enhanced browser automation capabilities. 2025-03-22 16:31:21 +08:00
yeongpin
e0a7afd835 Update version to 1.7.15 and enhance GitHub + Cursor AI registration automation. Added Turkish language support, improved user confirmation prompts, and optimized logging. Updated CHANGELOG with new features and fixes. 2025-03-22 16:14:27 +08:00
Pin Studios
902f6bd6f8
Merge pull request #351 from muhammedfurkan/patch-1
Create  Turkish lang
2025-03-22 15:21:50 +08:00
M.Furkan
56cdeaa116
Create tr.json 2025-03-22 10:19:29 +03:00
Pin Studios
225a24aad5
Merge pull request #348 from BasaiCorp/main
Comprehensive Enhancements to Cursor AI Reset and Registration Automation Scripts
2025-03-22 11:05:13 +08:00
Pin Studios
6464306958
Update README.md 2025-03-22 08:47:11 +08:00
BasaiCorp
5d70214a2f
Update github_cursor_register.py Stable
Working and usable final
2025-03-21 22:07:40 +05:30
BasaiCorp
854e987927
Update totally_reset_cursor.py Stable
Working and Stable
2025-03-21 22:06:01 +05:30
Pin Studios
8f47801dad
Merge pull request #347 from BasaiCorp/main
 Major Enhancements: Improved Cursor AI Reset & Automated GitHub + Cursor Registration
2025-03-21 23:44:59 +08:00
BasaiCorp
05e4d7faa9
Update github_cursor_register.py stable v1.0
stable and test both.
2025-03-21 20:49:09 +05:30
BasaiCorp
34f5c679a5
Update github_cursor_register.py test 0.1.2 2025-03-21 20:47:37 +05:30
BasaiCorp
f90a2916b1
Create github_cursor_register.py test 0.1.0
test now may be need time and this change and determinate all other tools and this tool will be favourite of all users
2025-03-21 20:46:26 +05:30
BasaiCorp
7b757c2d57
Update totally_reset_cursor.py test v0.2 2025-03-21 20:38:53 +05:30
BasaiCorp
209c58e3f8
Update totally_reset_cursor.py with new locations and test v0.1 2025-03-21 20:37:12 +05:30
Pin Studios
caa47fad03
Update CHANGELOG.md 2025-03-21 09:49:47 +08:00
Pin Studios
47e4a752a3
Update CHANGELOG.md 2025-03-21 09:48:47 +08:00
Pin Studios
bd254cb43c
Update .env 2025-03-21 09:45:20 +08:00
Pin Studios
b5d50ac15a
Merge pull request #339 from Nigel1992/fix/human-verification-retry
fix: add retry logic for human verification failures
2025-03-21 09:44:56 +08:00
Pin Studios
dd190fac8e
Merge pull request #338 from Nigel1992/fix/linux-machineid-path
fix: Update Linux machineId path to use lowercase cursor/machineid
2025-03-21 09:44:46 +08:00
Pin Studios
7971b6449e
Merge pull request #334 from handwerk2016/main
Added Russian Locale
2025-03-21 09:44:31 +08:00
Nigel1992
e58acce44e fix: add retry logic for human verification failures 2025-03-21 00:10:33 +01:00
Nigel1992
dc8cbca8ce fix: Update Linux machineId path to use lowercase cursor/machineid 2025-03-20 23:43:01 +01:00
Alex
2385cc2b3f locales update 2025-03-20 17:00:51 +02:00
Alex
52348d565d Added Russian Locale
Added a Russian locale and fixed my typo in readme
2025-03-20 16:55:29 +02:00
Pin Studios
93f4f05ac4
Update logo.py 2025-03-20 22:11:25 +08:00
Pin Studios
869f1e5225
Update README.md 2025-03-20 21:01:51 +08:00
Pin Studios
f6c958ccbb
Merge pull request #331 from handwerk2016/patch-2
Added a common issue "User is not authorized".
2025-03-20 21:00:43 +08:00
Alex
8fd4235fba
Update README.md (EN) 2025-03-20 14:57:00 +02:00
Pin Studios
5d3439a7d8
Update logo.py 2025-03-20 17:24:52 +08:00
Pin Studios
684323e328
Update CHANGELOG.md 2025-03-20 17:24:06 +08:00
Pin Studios
8115a0b397
Merge pull request #327 from httpmerak/main
feat: Add Brazilian Portuguese language
2025-03-20 16:35:53 +08:00
Pin Studios
cca8ba1ae7
Update .env 2025-03-20 16:33:41 +08:00
Pin Studios
a392c8cc27
Update CHANGELOG.md 2025-03-20 16:33:14 +08:00
Ricardo Negreiros
63209d6ed6 feat: Add Brazilian Portuguese language 2025-03-20 05:25:29 -03:00
Pin Studios
cbdd4fae4a
Merge pull request #321 from Nigel1992/fix-github-reset
fix: Add GitHub account reset functionality and maintain Google OAuth…
2025-03-20 16:21:38 +08:00
Nigel1992
414b5a7837 fix: Add GitHub account reset functionality and maintain Google OAuth reset 2025-03-19 22:36:00 +01:00
Pin Studios
cba470344f
Update block_domain.txt 2025-03-20 03:31:08 +08:00
Pin Studios
12a3a522be
Merge pull request #298 from MFaiqKhan/patch-1
Update block_domain.txt
2025-03-19 10:31:26 +08:00
Muhammad Faiq Khan
6346059916
Update block_domain.txt 2025-03-18 11:13:23 -07:00
Pin Studios
ab8489cdb9
Update block_domain.txt 2025-03-19 00:46:02 +08:00
Pin Studios
bcb3565b9e
Update block_domain.txt 2025-03-19 00:44:53 +08:00
Pin Studios
c30e7dc3df
Update block_domain.txt 2025-03-19 00:43:10 +08:00
yeongpin
aad19d89e4 Update README.md to replace image with a new version and add the new image file for better visual representation. 2025-03-19 00:21:05 +08:00
yeongpin
4eac8a9e0e Update version to 1.7.12, enhance email creation logic, and add changelog display in the menu. Update locale files for improved translations and reflect changes in CHANGELOG.md. 2025-03-19 00:13:34 +08:00
yeongpin
fd2da5d701 Update version to 1.7.11 and add new blocked domains to block_domain.txt. Reflect changes in the environment configuration and enhance domain filtering capabilities. 2025-03-17 17:59:06 +08:00
yeongpin
a7433ec032 Add local blocked domains feature and enhance verification code retrieval with retry mechanism. Update CHANGELOG.md to reflect new feature. 2025-03-17 17:17:58 +08:00
yeongpin
bef2162509 Update CHANGELOG.md to include new features: auto-detect max use count, account deletion, and logic optimizations. 2025-03-17 17:11:27 +08:00
Pin Studios
eb6a5d5ac7
Merge pull request #262 from Nigel1992/update-locale-files
Update locale files
2025-03-17 17:00:35 +08:00
yeongpin
17212081ae Update version to 1.7.11, adding multi-language support for German, Dutch, and French. Update CHANGELOG.md to reflect new language additions and enhancements in the translation files. 2025-03-17 17:00:23 +08:00
Pin Studios
5544a78f6f
Update block_domain.txt 2025-03-17 12:41:31 +08:00
Nigel1992
415da78768 Update locale files for Dutch, German, and French languages 2025-03-16 22:28:34 +01:00
Pin Studios
2cb788ddc1
Merge pull request #253 from BasaiCorp/main
Totally Reset Cusror
2025-03-16 12:48:02 +08:00
yeongpin
60ff9897f3 Update version to 1.7.10 and enhance totally_reset_cursor.py with multi-language support and new features. Update CHANGELOG.md to reflect changes. 2025-03-16 12:45:27 +08:00
BasaiCorp
21ca0a6b2d CLI Interface update 2025-03-16 09:44:31 +05:30
BasaiCorp
1dba533e93 COmmit v2.1 with machine id reset and all this one file will only do all for you but for account emails and registration please use https://github.com/yeongpin/cursor-free-vip 2025-03-16 09:28:53 +05:30
BasaiCorp
9146677bc4 update v2 of totally_reset_cursor.py 2025-03-16 09:18:54 +05:30
BasaiCorp
50366e319a Added totally_reset_cursor.py to fully reset Cursor AI 2025-03-16 09:05:17 +05:30
yeongpin
ad98bed98d Refactor: Remove GitHub trial reset feature and add development version check. Update translations for lifetime access and development version messages. 2025-03-16 10:54:43 +08:00
Pin Studios
6f2ec1b373
Merge pull request #250 from yeongpin/revert-248-feature/github-reset-trial
Revert "feat: Add GitHub-based trial reset"
2025-03-16 10:45:52 +08:00
Pin Studios
5574091273
Revert "feat: Add GitHub-based trial reset" 2025-03-16 10:44:40 +08:00
Pin Studios
0226c9e735
Update CHANGELOG.md 2025-03-16 10:18:35 +08:00
Pin Studios
375347a7a5
Update .env 2025-03-16 10:05:57 +08:00
Pin Studios
8301ea74d5
Delete pr_description.md 2025-03-16 10:05:41 +08:00
Pin Studios
96981a2c37
Merge pull request #248 from Nigel1992/feature/github-reset-trial
feat: Add GitHub-based trial reset
2025-03-16 10:04:44 +08:00
Nigel1992
975647765d feat: Add JavaScript trial reset code and update PR description 2025-03-15 23:52:39 +01:00
Nigel1992
808b1ba3dc feat: Add JavaScript trial reset code for automatic account deletion 2025-03-15 23:48:55 +01:00
Nigel1992
9595a8792f docs: Update PR description to include JavaScript trial reset code 2025-03-15 23:45:15 +01:00
Nigel1992
6b5dfab362 feat: Add GitHub-based trial reset with improved organization 2025-03-15 23:39:02 +01:00
Pin Studios
d5fceb2624
Update .env 2025-03-15 23:46:50 +08:00
Pin Studios
45046002df
Merge pull request #243 from mALIk-sHAHId/feature/google-github-auth
feat: Add Google and GitHub OAuth Authentication with Lifetime Access…
2025-03-15 23:46:28 +08:00
mALIk-sHAHId
6bb33cec4c feat: Add Google and GitHub OAuth Authentication with Lifetime Access - Add OAuth integrations, update menu system, add multi-language support, and update documentation 2025-03-15 19:39:30 +05:30
Pin Studios
66f6197e6d
Update block_domain.txt 2025-03-15 11:10:30 +08:00
Pin Studios
5514e47759
Update block_domain.txt 2025-03-15 10:29:03 +08:00
Pin Studios
3a53d59d52
Merge pull request #227 from distributedStorage/enhance-readme
doc: unify the README & CHANGELOG style
2025-03-14 23:02:31 +08:00
imbajin
c2e5499f19 doc: unify the README & CHANGELOG 2025-03-14 15:29:49 +08:00
Pin Studios
9a223756c5
Merge pull request #226 from distributedStorage/fix-download
fix(script): avoid empty version when call release api
2025-03-14 15:26:39 +08:00
imbajin
9b5912357d fix(script): avoid empty version when call release api
Also enhance the way for judging $?
2025-03-14 15:11:57 +08:00
Pin Studios
3200271156
Merge pull request #224 from RenjiYuusei/main
Add Vietnamese Language Support
2025-03-14 12:15:53 +08:00
yeongpin
8401f4718e Update CHANGELOG.md for version 1.7.07
- Add Vietnamese language support and admin privilege management features for Windows executables.
- Implement admin privilege detection and enhance startup process with verification.
- Introduce functions to check and request admin rights when running as a frozen executable.
- Include new admin-related emoji in the EMOJI dictionary and provide fallback for non-Windows platforms.
2025-03-14 12:15:37 +08:00
yeongpin
b761bf0b6d Update localization and versioning for Vietnamese support
- Increment version to 1.7.07 in .env file.
- Add Vietnamese language support in main.py and localization files (vi.json, zh_cn.json, zh_tw.json).
- Translate Chinese language options to English in localization files.
2025-03-14 12:12:58 +08:00
Renji Yuusei
db95689a8e Remove Vietnamese Language Option from Chinese Localization Files
- Updated zh_cn.json and zh_tw.json to remove the Vietnamese language entry while retaining other language options.
2025-03-14 06:54:12 +07:00
Renji Yuusei
652ffc809a Add Vietnamese Language Support
- Update localization files to include Vietnamese language option
2025-03-14 00:25:20 +07:00
Pin Studios
a854969682
Update README.md 2025-03-13 12:09:56 +08:00
Pin Studios
9c5ac85759
Merge pull request #199 from ahmed98Osama/feature/admin-privileges
feat: Add Admin Privilege Management for Windows Executable
2025-03-13 12:08:36 +08:00
Ahemd Farouk
a67264d5c2 refactor: Simplify Admin Privilege Request Logic
- Consolidate admin privilege request logic for Windows by removing redundant checks for frozen executables
2025-03-12 16:51:56 +02:00
Ahemd Farouk
68b1dae466 feat: Add Admin Privilege Management for Windows Executable
- Implement admin privilege detection for Windows platform
- Add functions to check and request admin rights when running as a frozen executable
- Enhance startup process with admin privilege verification
- Add new admin-related emoji to the EMOJI dictionary
- Provide fallback mechanism for non-Windows platforms
2025-03-11 14:56:47 +02:00
yeongpin
0da6f9a1b7 feat: Add Chinese and English Question Issue Templates
- Create bilingual issue templates for discussions and questions
- Add comprehensive sections for platform, version, and problem description
- Include checklist to guide users in providing clear and helpful issue details
- Support both Chinese and English language issue submissions
2025-03-11 12:53:58 +08:00
yeongpin
59fccecb0f feat: Add English Bug Report Issue Template
- Create a new issue template for English-language bug reports
- Mirror the structure of the Chinese bug report template
- Include comprehensive sections for platform, version, and error description
- Add checklist to guide users in providing clear and helpful issue details
2025-03-11 12:47:33 +08:00
yeongpin
1769d245f9 feat: Add Chinese Bug Report Issue Template
- Create a new issue template for Chinese-language bug reports
- Include comprehensive sections for platform, version, and error description
- Add checklist to guide users in providing clear and helpful issue details
- Enhance issue submission process with specific guidelines
2025-03-11 12:45:17 +08:00
yeongpin
b98f094407 refactor: Internationalize and Clean Up Code Comments
- Translate Chinese comments to English across multiple files
- Improve code readability by using consistent, clear comments
- Remove redundant comments and simplify language-specific annotations
- Maintain existing code structure while enhancing internationalization
2025-03-11 12:09:07 +08:00
yeongpin
ff358588bb feat: Refactor Project Structure and Add Configuration Management
- Add `config.py` for centralized configuration management
- Add `utils.py` for cross-platform utility functions
- Remove `browser.py` and `control.py` to simplify project structure
- Update version to 1.7.06
- Modify build specification to reflect new file structure
- Update localization files with new update confirmation messages
- Enhance configuration loading and path detection across different platforms
2025-03-11 11:49:17 +08:00
yeongpin
6ca80ccb10 Merge branch 'main' of https://github.com/yeongpin/cursor-free-vip 2025-03-11 10:12:57 +08:00
yeongpin
2fca5218fb remove md 2025-03-11 10:12:54 +08:00
Pin Studios
71ecf5a201
Update issue templates 2025-03-11 10:12:41 +08:00
Pin Studios
4570b174ab
Update issue templates 2025-03-10 18:36:36 +08:00
yeongpin
f708ce443b fix: Correct Syntax in Linux Installation Script
- Fix syntax error in install script's conditional statements
- Remove unnecessary braces and correct shell script syntax
- Ensure proper handling of Linux architecture detection
2025-03-10 17:54:09 +08:00
yeongpin
4f6f3fe814 fix: Improve Cursor Version Check and Configuration Handling
- Enhance version checking in `reset_machine_manual.py` with more robust error handling
- Add detailed error messages and logging for version detection
- Update configuration paths in `new_signup.py` to include Cursor application path
- Add configuration initialization in `main.py`
- Update localization files with new error and version-related messages
2025-03-10 17:41:07 +08:00
yeongpin
54ecf2d752 feat: Add Linux ARM64 Support and Update Build Workflow
- Extend GitHub Actions workflow to build Linux x64 and ARM64 executables
- Update install script to detect Linux architecture (x64 or ARM64)
- Modify release process to include both Linux architecture artifacts
- Rename Linux build job to clarify x64 architecture
2025-03-10 16:28:26 +08:00
yeongpin
1f1231d1a9 remove br in readme 2025-03-10 14:43:35 +08:00
yeongpin
d10999a517 Update Readme Doc 2025-03-10 14:43:09 +08:00
yeongpin
fb4be6334a docs: Add Detailed Comments and Localization for Configuration Settings
- Add bilingual comments (English and Chinese) for OSPaths section
- Provide clear descriptions for timing-related configuration parameters
- Enhance readability of README.md configuration settings
- Improve documentation for storage, SQLite, and machine ID paths
2025-03-10 13:42:18 +08:00
Pin Studios
786eba5371
Update README.md 2025-03-10 13:41:05 +08:00
yeongpin
41ddbf519e hotfix: Optimize Verification Code Handling and Timing Configuration
- Refactor verification code retrieval with dynamic wait time generation
- Use `get_random_wait_time()` for more flexible retry intervals
- Update version to 1.7.04 across project files
- Minor improvements to timing and retry logic in signup process
2025-03-10 13:27:41 +08:00
yeongpin
ffd48201fd hotfix: Improve Signup Flow and Timing Configuration
- Add comprehensive timing configuration for signup process
- Refactor random wait time generation with more flexible config options
- Update form filling and verification code handling with configurable wait times
- Enhance localization support for new timing-related messages
- Update version to 1.7.03 across project files
2025-03-10 12:24:43 +08:00
yeongpin
cd4f36725c refactor: Optimize Signup Flow and Error Handling
- Implement direct URL-based signup with pre-filled parameters
- Enhance password setting process with improved error detection
- Add more robust retry mechanism for password input
- Improve error handling for email availability and submission
- Refactor signup and password setting methods for better reliability
2025-03-10 11:44:37 +08:00
yeongpin
dccb524bd7 Update Readme add some doc 2025-03-10 11:21:42 +08:00
yeongpin
90e9a5b287 feat: Enhance Configuration Management for Cursor Paths
- Add OS-specific path configurations for Cursor storage, SQLite, and machine ID files
- Integrate configuration file management in `new_signup.py` and `reset_machine_manual.py`
- Remove Workbench Cursor path and main.js modification steps
- Improve cross-platform path detection and configuration handling
- Update version to 1.7.02
2025-03-10 11:18:21 +08:00
Pin Studios
66a67fce8b
Update README.md 2025-03-07 11:20:04 +08:00
Pin Studios
0981f00b9c
Update build.yml 2025-03-07 11:19:49 +08:00
yeongpin
02851c9a09 feat: Implement Configuration Management and Enhance Browser Setup
- Add `setup_config` function to manage configuration file across platforms
- Extract configuration-related code from `setup_driver` into a separate function
- Implement dynamic Chrome path detection for Windows, macOS, and Linux
- Add configurable Turnstile verification settings
- Update README.md with configuration file details
- Enhance localization support for configuration-related messages
- Improve code maintainability and platform compatibility
2025-03-07 11:18:43 +08:00
yeongpin
6312d66813 chore: Bump version to 1.6.03
- Update version in .env file
- Update CHANGELOG.md with version 1.6.03 details
- Minor hotfix and maintenance release
2025-03-06 18:37:04 +08:00
yeongpin
1b1a21f3d7 feat: Add Machine ID File Update Functionality
- Implement `update_machine_id_file` method in `MachineIDResetter` class
- Add new `get_cursor_machine_id_path` function to detect machineId file path across platforms
- Enhance machine ID reset process with file-level machine ID update
- Implement backup mechanism for existing machineId file
- Add cross-platform support for Linux, macOS, and Windows
- Improve error handling and logging with colorful console output
2025-03-06 18:36:00 +08:00
yeongpin
c94bd605e5 fix: Update GitHub Link in Workbench JS Modification
- Correct GitHub repository link to point to specific project repository
- Modify onClick handler to open the correct GitHub page for the project
2025-03-06 18:14:34 +08:00
yeongpin
9f6eee77e0 feat: Add Workbench JS Modification and Cursor Path Detection
- Update `MachineIDResetter` to include workbench.desktop.main.js modification step
- Enhance platform support for Linux, macOS, and Windows
- Update CHANGELOG.md to version 1.6.02
2025-03-06 18:11:40 +08:00
Pin Studios
2bdcc2f633 chore: Bump version to 1.6.01 2025-03-06 12:19:26 +08:00
Pin Studios
4aabe2e403 chore: Bump version to 1.5.04 and improve system compatibility
- Update version in .env file to 1.5.04
- Add Mac-specific run_venv script to .gitignore
- Enhance Cursor Auth platform detection with more precise sys.platform checks
- Add maximum retry mechanism for email creation
- Improve error handling and platform support in cursor_auth.py
2025-03-06 12:18:55 +08:00
yeongpin
005aa2cd95 feat: Improve Version Update Mechanism with Robust Error Handling
- Enhance GitHub API version check with proper headers and timeout
- Add comprehensive error handling for version retrieval
- Implement more reliable update script download and execution
- Improve cross-platform update process with better error reporting
- Add fallback mechanisms for network and update failures
2025-03-06 11:18:21 +08:00
yeongpin
14f6dfc29d fix: Improve Browser Startup and Error Handling
- Add `--no-sandbox` flag to resolve browser startup issues
- Enhance error handling in temp email creation
- Update localization files with new email-related messages
- Improve translation support for email creation process
2025-03-06 11:01:34 +08:00
Pin Studios
2e9bd269ad
Update README.md 2025-03-03 15:24:36 +08:00
Pin Studios
f9b7e23253
Update README.md 2025-03-03 15:19:44 +08:00
yeongpin
0d979f7543 chore: Bump default version to 1.5.03 in build workflow 2025-03-03 11:59:15 +08:00
yeongpin
cce3025f7f feat: Enhance Name Generation and Improve Account Registration Process
- Implement realistic name generation with predefined name lists
- Modify first name letter for uniqueness
- Add more descriptive console output with emojis and translations
- Update localization files with new registration-related keys
- Optimize random name generation in registration modules
2025-03-03 11:58:28 +08:00
Pin Studios
fe3e27561b
Update .env 2025-03-03 11:17:35 +08:00
yeongpin
bf2bea71eb Merge branch 'main' of https://github.com/yeongpin/cursor-free-vip 2025-03-03 11:16:45 +08:00
yeongpin
77a61647dd docs: Update CHANGELOG with version 1.5.01 release notes 2025-03-03 11:10:10 +08:00
yeongpin
813dd4431e feat: Add version update checker with GitHub release support 2025-03-03 11:09:11 +08:00
Pin Studios
d7116b8cf3
Update .env 2025-03-02 13:55:25 +08:00
Pin Studios
f5a7acc4e3
Merge pull request #122 from bingoohuang/main
print account info as early as possible
2025-03-02 13:54:58 +08:00
bingoohuang
479933844a print account info as early as possible 2025-02-28 21:20:12 +08:00
yeongpin
93046d7f03 Update README.md with improved image styling and new screenshot 2025-02-27 10:44:18 +08:00
Pin Studios
e7ca31b710
Update build.yml 2025-02-27 10:33:53 +08:00
Pin Studios
87b99b0d16
Update CHANGELOG.md 2025-02-27 10:29:10 +08:00
Pin Studios
e983b6f560
Update .env 2025-02-27 10:27:18 +08:00
Pin Studios
21ca7ab24f
Merge pull request #111 from ahmed98Osama/feature/return-to-menu
Return to main menu after each operation
2025-02-27 10:27:00 +08:00
Ahmed Osama
e7468644a4 feat: return to main menu after each operation instead of exiting 2025-02-26 19:07:14 +02:00
Pin Studios
2bca7d7d14
Update install.sh 2025-02-26 22:34:38 +08:00
Pin Studios
040c5f5836
Update install.ps1 2025-02-26 22:30:56 +08:00
Pin Studios
4a86bbeeb4
Update block_domain.txt 2025-02-26 22:01:53 +08:00
Pin Studios
68b7888a83
Merge pull request #101 from aliensb/main
add support for linux
2025-02-25 23:56:29 +08:00
yeongpin
78dee025a7 feat: Enhance Temporary Email Service with Domain Blocking and Improved Error Handling
- Add domain blocking mechanism to filter out problematic email domains
- Implement dynamic domain list retrieval from external source
- Improve error handling and logging in email creation process
- Add fallback service switching when domains are blocked
- Update localization files with new error and blocking-related messages
- Increment version to 1.4.06
2025-02-25 23:53:55 +08:00
Pin Studios
17c2b4b243
Create block_domain.txt 2025-02-25 23:30:53 +08:00
tom
2acb271f19 add support for linux 2025-02-25 16:52:32 +08:00
Pin Studios
b688b67c26
Update .gitignore 2025-02-25 12:23:45 +08:00
yeongpin
3543615a69 fix: Improve Windows Language Detection and Platform Compatibility
- Correct Windows language detection method in Translator class
- Update platform system check for Windows-specific imports
- Refactor language detection to use platform-specific checks
- Ensure more robust cross-platform language detection logic
2025-02-25 12:16:55 +08:00
yeongpin
24b0a5c09e refactor: Streamline System Language Detection Logic
- Consolidate language detection methods into a single unified approach
- Improve cross-platform language detection for Windows and Unix-like systems
- Simplify error handling and add more robust language code mapping
- Remove platform-specific detection methods in favor of a more generic approach
- Enhance language fallback mechanism with better default handling
2025-02-25 12:14:54 +08:00
yeongpin
5bbba05f69 feat: Improve System Language Detection in Translator Class
- Refactor language detection method with separate methods for Windows, macOS, and Linux
- Add more robust language detection for different platforms
- Improve error handling and fallback mechanisms
- Ensure consistent language code formatting (zh_CN, zh_TW)
- Update Windows language detection using windll with additional error checks
2025-02-25 12:09:13 +08:00
yeongpin
72c95e4b4f refactor: Simplify OS Detection and Download Process
- Streamline OS detection logic by removing detailed architecture checks
- Reduce complexity in download URL generation
- Remove verbose download verification steps
- Simplify error handling during binary download
2025-02-25 12:00:59 +08:00
yeongpin
8afd5df4ea fix: Correct Syntax Error in Installation Script Conditional Logic
- Fix incorrect brace placement in install_cursor_free_vip function
- Remove unnecessary closing brace that was causing syntax error
- Ensure proper flow control in installation script
2025-02-25 11:55:38 +08:00
yeongpin
a7a97b5621 feat: Enhance OS Detection and Download Resilience in Installation Script
- Add Windows system detection
- Implement fallback mechanism for macOS binary downloads
- Improve download link verification with HEAD request
- Add graceful handling for missing architecture-specific binaries
- Provide more informative error messages during download process
2025-02-25 11:54:45 +08:00
yeongpin
e2e2ebc12e feat: Enhance Download Verification in Installation Script
- Add verbose curl download logging
- Implement file size check for downloaded binaries
- Provide detailed error messages for download failures
- Improve download error handling and diagnostics
2025-02-25 11:53:37 +08:00
yeongpin
d131bccac0 feat: Improve macOS Architecture Detection in Installation Script
- Add detailed macOS architecture detection (ARM64 and Intel)
- Enhance system type logging with informative messages
- Provide more precise OS and architecture identification
2025-02-25 11:50:39 +08:00
yeongpin
d852bcff50 feat: Enhance Multilingual Support and System Language Detection
- Add automatic system language detection for Windows and Unix-like systems
- Update localization files with new translation keys
- Improve language handling in various modules
- Translate more UI messages to English
- Add GitHub link to logo display
- Bump version to 1.4.04
2025-02-25 10:46:36 +08:00
Pin Studios
4c91525082
Merge pull request #94 from UntaDotMy/main
feat: Add support for Cursor v0.46.X and improve email service
2025-02-25 10:35:34 +08:00
BilaUnta
b565232ba6 bump version 2025-02-25 09:26:10 +08:00
BilaUnta
5725a2b2f7 improve for 1.4.03 2025-02-25 09:22:22 +08:00
yeongpin
6ec6f8bdbf Add license section to README.md 2025-02-24 12:11:20 +08:00
yeongpin
5c1bcff55a Update Readme 2025-02-24 11:43:54 +08:00
yeongpin
025c4e2ef3 Update readme 2025-02-24 11:30:34 +08:00
yeongpin
6ac1294bee Add Disable Cursor Auto Update Feature 2025-02-24 11:18:57 +08:00
Pin Studios
fb443592d3
Update README.md 2025-02-21 18:02:22 +08:00
Pin Studios
c30a62b072
Update README.md 2025-02-17 16:30:55 +08:00
Pin Studios
8bc509cccf
Update README.md 2025-02-17 16:29:16 +08:00
yeongpin
9f814708d1 Update CHANGELOG.md for v1.3.02 release 2025-02-13 15:33:09 +08:00
Pin Studios
1889f9827a
Update README.md 2025-02-13 15:28:00 +08:00
yeongpin
57d2d40e67 update coffee 2025-02-13 15:24:40 +08:00
yeongpin
04fa6ee935 update 2025-02-13 15:07:29 +08:00
yeongpin
ed1e0f787e fixed some env 2025-02-13 15:05:45 +08:00
yeongpin
240716e45f fixed small update 2025-02-13 15:05:20 +08:00
yeongpin
35bbe6c93c update cl 2025-02-13 13:25:32 +08:00
yeongpin
fed50a31cc Add manual Cursor registration with manual email input 2025-02-13 13:24:32 +08:00
yeongpin
57ea4dd25a update changelog 2025-02-13 12:16:54 +08:00
yeongpin
72eadfaf74 update 2025-02-13 12:13:43 +08:00
yeongpin
9521c0ce75 remove ublock 2025-02-13 12:13:06 +08:00
yeongpin
637f923c16 change changelog 2025-02-13 11:42:48 +08:00
yeongpin
1cc93ffc22 fix & optimize 2025-02-13 11:33:20 +08:00
703 changed files with 1053112 additions and 355098 deletions

21
.SRCINFO Normal file
View File

@ -0,0 +1,21 @@
pkgbase = cursor-free-vip-git
pkgdesc = Reset Cursor AI MachineID & Auto Sign Up / In & Bypass Higher Token Limit
pkgver = 1.9.05
pkgrel = 1
url = https://github.com/yeongpin/cursor-free-vip
arch = x86_64
license = MIT
license = Attribution-NonCommercial-NoDerivatives 4.0 International
makedepends = git
makedepends = python
makedepends = pyinstaller
makedepends = uv
depends = python
depends = cursor-bin
provides = cursor-free-vip
source = cursor-free-vip::git+https://github.com/yeongpin/cursor-free-vip.git
source = https://raw.githubusercontent.com/canmi21/openjlc/refs/heads/main/LICENSE
sha256sums = SKIP
sha256sums = SKIP
pkgname = cursor-free-vip-git

4
.env
View File

@ -1,2 +1,2 @@
version=1.1.01
VERSION=1.1.01
version=1.11.03
VERSION=1.11.03

View File

@ -0,0 +1,70 @@
name: ❌ 错误报告 [中文]
description: 创建一个报告以帮助我们改进
title: '[Bug]: '
labels: ['bug']
body:
- type: markdown
attributes:
value: |
感谢您花时间填写此错误报告!
在提交 Issue 前请确保您已经阅读了[Github Issues](https://github.com/yeongpin/cursor-free-vip/issues)
- type: checkboxes
id: checklist
attributes:
label: 提交前检查
description: |
请确保您在提交 Issue 前已经完成了以下所有步骤
options:
- label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决。
required: true
- label: 我已经查看了置顶 Issue 并搜索了现有的 [开放 Issue](https://github.com/yeongpin/cursor-free-vip/issues)和[已关闭 Issue](https://github.com/yeongpin/cursor-free-vip/issues?q=is%3Aissue%20state%3Aclosed%20),没有找到类似的问题。
required: true
- label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等。
required: true
- type: dropdown
id: platform
attributes:
label: 平台
description: 您正在使用哪个平台?
options:
- Windows x32
- Windows x64
- macOS Intel
- macOS ARM64
- Linux x64
- Linux ARM64
validations:
required: true
- type: input
id: version
attributes:
label: 版本
description: 您正在运行的 Cursor Free Vip 版本是什么?
placeholder: 例如 v1.0.0 ( 不是 Cursor AI 版本 )
validations:
required: true
- type: textarea
id: description
attributes:
label: 错误描述
description: 描述问题时请尽可能详细
placeholder: 告诉我们发生了什么...
validations:
required: true
- type: textarea
id: logs
attributes:
label: 相关日志输出
description: 请复制并粘贴任何相关的日志输出
render: shell
- type: textarea
id: additional
attributes:
label: 附加信息
description: 任何能让我们对你所遇到的问题有更多了解的东西

View File

@ -0,0 +1,75 @@
name: 💡 功能建议
description: 为这个项目提出新的想法
title: "[功能建议]: "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
感谢您抽出时间提出新功能建议!
请确保填写以下所有部分。
- type: textarea
id: feature-description
attributes:
label: 功能描述
description: 清晰简洁地描述您想要实现的功能。
placeholder: "我希望能够..."
validations:
required: true
- type: textarea
id: problem-solution
attributes:
label: 问题和解决方案
description: 描述您试图解决的问题,以及这个功能将如何帮助解决。
placeholder: "目前,当我尝试..."
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: 考虑过的替代方案
description: 描述您考虑过的任何替代解决方案或功能。
placeholder: "我考虑过..."
- type: dropdown
id: priority
attributes:
label: 优先级
description: 这个功能对您来说有多重要?
options:
- 高(对我的工作流程至关重要)
- 中(会很有帮助)
- 低(有更好)
validations:
required: true
- type: dropdown
id: impact
attributes:
label: 影响范围
description: 有多少用户会从这个功能中受益?
options:
- 所有用户
- 大多数用户
- 部分用户
- 仅我个人
validations:
required: true
- type: textarea
id: technical-details
attributes:
label: 技术细节
description: 您想分享的任何技术考虑或实现细节。
placeholder: "这个功能可以通过..."
- type: textarea
id: screenshots
attributes:
label: 截图
description: 如果适用,添加截图以帮助解释您的功能建议。
placeholder: "您可以在此处拖放截图..."
- type: checkboxes
id: terms
attributes:
label: 行为准则
description: 提交此问题即表示您同意遵守本项目的行为准则
options:
- label: 我同意遵守本项目的行为准则
required: true

75
.github/ISSUE_TEMPLATE/cn_question.yml vendored Normal file
View File

@ -0,0 +1,75 @@
name: ❓ 讨论 & 提问 (中文)
description: 寻求帮助、讨论问题、提出疑问等...
title: '[讨论]: '
labels: ['question']
body:
- type: markdown
attributes:
value: |
感谢您的提问!请尽可能详细地描述您的问题,这样我们才能更好地帮助您。
- type: checkboxes
id: checklist
attributes:
label: Issue 检查清单
description: |
在提交 Issue 前请确保您已经完成了以下所有步骤
options:
- label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决。
required: true
- label: 我确认自己需要的是提出问题并且讨论问题,而不是 Bug 反馈或需求建议。
required: true
- label: 我已阅读 [Github Issues](https://github.com/yeongpin/cursor-free-vip/issues) 并搜索了现有的 [开放 Issue](https://github.com/yeongpin/cursor-free-vip/issues) 和 [已关闭 Issue](https://github.com/yeongpin/cursor-free-vip/issues?q=is%3Aissue%20state%3Aclosed%20),没有找到类似的问题。
required: true
- type: dropdown
id: platform
attributes:
label: 平台
description: 您正在使用哪个平台?
options:
- Windows x32
- Windows x64
- macOS Intel
- macOS ARM64
- Linux x64
- Linux ARM64
validations:
required: true
- type: input
id: version
attributes:
label: 版本
description: 您正在运行的 Cursor Free Vip 版本是什么?
placeholder: 例如 v1.0.0
validations:
required: true
- type: textarea
id: question
attributes:
label: 您的问题
description: 请详细描述您的问题
placeholder: 请尽可能清楚地说明您的问题...
validations:
required: true
- type: textarea
id: additional
attributes:
label: 补充信息
description: 任何其他相关的信息、截图或代码示例
render: shell
- type: dropdown
id: priority
attributes:
label: 优先级
description: 这个问题对您来说有多紧急?
options:
- 低 (有空再看)
- 中 (希望尽快得到答复)
- 高 (阻碍工作进行)
validations:
required: true

View File

@ -0,0 +1,70 @@
name: ❌ Bug Report [English]
description: Create a report to help us improve
title: '[Bug]: '
labels: ['bug']
body:
- type: markdown
attributes:
value: |
Thank you for taking the time to fill out this bug report!
Before submitting this issue, please ensure that you have read the [github issues](https://github.com/yeongpin/cursor-free-vip/issues)
- type: checkboxes
id: checklist
attributes:
label: Commit before submitting
description: |
Please ensure that you have completed all of the following steps before submitting an issue
options:
- label: I understand that Issues are used to provide feedback and solve problems, not to complain in the comments section, and will provide more information to help solve the problem.
required: true
- label: I have checked the top Issue and searched for existing [open issues](https://github.com/yeongpin/cursor-free-vip/issues) and [closed issues](https://github.com/yeongpin/cursor-free-vip/issues?q=is%3Aissue%20state%3Aclosed%20), and found no similar issues.
required: true
- label: I have filled out a short and clear title, so that developers can quickly determine the general problem when browsing the Issue list. Not "a suggestion", "stuck", etc.
required: true
- type: dropdown
id: platform
attributes:
label: Platform
description: Which platform are you using?
options:
- Windows x32
- Windows x64
- macOS Intel
- macOS ARM64
- Linux x64
- Linux ARM64
validations:
required: true
- type: input
id: version
attributes:
label: Version
description: What version of Cursor Free Vip are you running?
placeholder: For example v1.0.0 ( Not Cursor AI Version )
validations:
required: true
- type: textarea
id: description
attributes:
label: Description
description: Please describe the problem as detailed as possible
placeholder: Tell us what happened...
validations:
required: true
- type: textarea
id: logs
attributes:
label: Related log output
description: Please copy and paste any related log output
render: shell
- type: textarea
id: additional
attributes:
label: Additional information
description: Anything that might help us understand the problem better

View File

@ -0,0 +1,75 @@
name: 💡 Feature Request
description: Suggest an idea for this project
title: "[Feature]: "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to suggest a new feature!
Please make sure to fill out all the sections below.
- type: textarea
id: feature-description
attributes:
label: Feature Description
description: A clear and concise description of what you want to happen.
placeholder: "I would like to..."
validations:
required: true
- type: textarea
id: problem-solution
attributes:
label: Problem & Solution
description: Describe the problem you're trying to solve and how this feature would help.
placeholder: "Currently, when I try to..."
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives Considered
description: Describe any alternative solutions or features you've considered.
placeholder: "I've considered..."
- type: dropdown
id: priority
attributes:
label: Priority
description: How important is this feature to you?
options:
- High (Critical for my workflow)
- Medium (Would be very helpful)
- Low (Nice to have)
validations:
required: true
- type: dropdown
id: impact
attributes:
label: Impact
description: How many users would benefit from this feature?
options:
- All users
- Most users
- Some users
- Just me
validations:
required: true
- type: textarea
id: technical-details
attributes:
label: Technical Details
description: Any technical considerations or implementation details you'd like to share.
placeholder: "The feature could be implemented by..."
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain your feature.
placeholder: "You can drag and drop screenshots here..."
- type: checkboxes
id: terms
attributes:
label: Code of Conduct
description: By submitting this issue, you agree to follow this project's Code of Conduct
options:
- label: I agree to follow this project's Code of Conduct
required: true

75
.github/ISSUE_TEMPLATE/en_question.yml vendored Normal file
View File

@ -0,0 +1,75 @@
name: ❓ Discussion & Question [English]
description: Seeking help, discussing problems, asking questions, etc.
title: '[Discussion]: '
labels: ['question']
body:
- type: markdown
attributes:
value: |
Thank you for your question! Please describe your problem as detailed as possible so we can help you better.
- type: checkboxes
id: checklist
attributes:
label: Issue Checklist
description: |
Please ensure that you have completed all of the following steps before submitting an issue
options:
- label: I understand that Issues are used to provide feedback and solve problems, not to complain in the comments section, and will provide more information to help solve the problem.
required: true
- label: I confirm that I need to raise questions and discuss problems, not Bug feedback or demand suggestions.
required: true
- label: I have read [Github Issues](https://github.com/yeongpin/cursor-free-vip/issues) and searched for existing [open issues](https://github.com/yeongpin/cursor-free-vip/issues) and [closed issues](https://github.com/yeongpin/cursor-free-vip/issues?q=is%3Aissue%20state%3Aclosed%20), and found no similar issues.
required: true
- type: dropdown
id: platform
attributes:
label: Platform
description: Which platform are you using?
options:
- Windows x32
- Windows x64
- macOS Intel
- macOS ARM64
- Linux x64
- Linux ARM64
validations:
required: true
- type: input
id: version
attributes:
label: Version
description: What version of Cursor Free Vip are you running?
placeholder: For example v1.0.0
validations:
required: true
- type: textarea
id: question
attributes:
label: Your question
description: Please describe your problem as detailed as possible
placeholder: Please explain your question as clearly as possible...
validations:
required: true
- type: textarea
id: additional
attributes:
label: Additional information
description: Any other related information, screenshots, or code examples
render: shell
- type: dropdown
id: priority
attributes:
label: Priority
description: How urgent is this issue for you?
options:
- Low (I'll look at it when I have time)
- Medium (I hope to get an answer soon)
- High (It blocks my work)
validations:
required: true

View File

@ -3,10 +3,14 @@ name: Build Executables
on:
workflow_dispatch:
inputs:
version:
description: 'Version number (e.g. 1.0.9)'
use_env_version:
description: 'Use version from .env file (yes/no)'
required: true
default: '1.0.9-dev'
default: 'yes'
version:
description: 'Version number (only used if not using .env version)'
required: false
default: ''
permissions:
contents: write
@ -14,27 +18,65 @@ permissions:
packages: write
jobs:
determine-version:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.set-version.outputs.version }}
steps:
- uses: actions/checkout@v2
- name: Get version from .env file
id: env-version
if: ${{ github.event.inputs.use_env_version == 'yes' }}
run: |
VERSION=$(grep "^version=" .env | cut -d'=' -f2)
echo "ENV_VERSION=$VERSION" >> $GITHUB_ENV
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Using version from .env file: $VERSION"
- name: Use manual version
id: manual-version
if: ${{ github.event.inputs.use_env_version != 'yes' }}
run: |
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
echo "Using manually entered version: ${{ github.event.inputs.version }}"
- name: Set final version
id: set-version
run: |
if [ "${{ github.event.inputs.use_env_version }}" == "yes" ]; then
echo "version=${{ env.ENV_VERSION }}" >> $GITHUB_OUTPUT
else
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
fi
create-tag:
needs: determine-version
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0 # 获取所有标签
- name: Delete existing tag if exists
- name: Check if tag exists
id: check_tag
run: |
if git ls-remote --tags origin | grep -q "refs/tags/v${{ github.event.inputs.version }}"; then
git push origin --delete "v${{ github.event.inputs.version }}" || true
git tag -d "v${{ github.event.inputs.version }}" || true
if git ls-remote --tags origin | grep -q "refs/tags/v${{ needs.determine-version.outputs.version }}"; then
echo "Tag v${{ needs.determine-version.outputs.version }} already exists, will use existing tag"
echo "tag_exists=true" >> $GITHUB_OUTPUT
else
echo "Tag v${{ needs.determine-version.outputs.version }} does not exist, will create new tag"
echo "tag_exists=false" >> $GITHUB_OUTPUT
fi
- name: Create Tag
- name: Create Tag if not exists
if: steps.check_tag.outputs.tag_exists == 'false'
run: |
git tag "v${{ github.event.inputs.version }}"
git push origin "v${{ github.event.inputs.version }}"
git tag "v${{ needs.determine-version.outputs.version }}"
git push origin "v${{ needs.determine-version.outputs.version }}"
build-windows:
needs: create-tag
needs: [determine-version, create-tag]
runs-on: windows-latest
steps:
@ -47,7 +89,7 @@ jobs:
- name: Set version
shell: bash
run: echo "VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
run: echo "VERSION=${{ needs.determine-version.outputs.version }}" >> $GITHUB_ENV
- name: Install dependencies
run: |
@ -63,10 +105,10 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: CursorFreeVIP_${{ env.VERSION }}_windows.exe
path: dist/*
path: dist/CursorFreeVIP_${{ env.VERSION }}_windows.exe
build-macos-arm64:
needs: create-tag
needs: [determine-version, create-tag]
runs-on: macos-latest
steps:
@ -79,7 +121,7 @@ jobs:
- name: Set version
shell: bash
run: echo "VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
run: echo "VERSION=${{ needs.determine-version.outputs.version }}" >> $GITHUB_ENV
- name: Install dependencies
run: |
@ -90,15 +132,16 @@ jobs:
- name: Build MacOS ARM executable
run: |
pyinstaller build.spec
mv "dist/CursorFreeVIP_${{ env.VERSION }}_mac" "dist/CursorFreeVIP_${{ env.VERSION }}_mac_arm64"
- name: Upload MacOS ARM artifact
uses: actions/upload-artifact@v4
with:
name: CursorFreeVIP_${{ env.VERSION }}_mac_arm64
path: dist/*
path: dist/CursorFreeVIP_${{ env.VERSION }}_mac_arm64
build-linux:
needs: create-tag
build-linux-x64:
needs: [determine-version, create-tag]
runs-on: ubuntu-22.04
steps:
@ -111,7 +154,7 @@ jobs:
- name: Set version
shell: bash
run: echo "VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
run: echo "VERSION=${{ needs.determine-version.outputs.version }}" >> $GITHUB_ENV
- name: Install dependencies
run: |
@ -119,19 +162,58 @@ jobs:
pip install pyinstaller
pip install -r requirements.txt
- name: Build Linux executable
- name: Build Linux x64 executable
env:
VERSION: ${{ env.VERSION }}
run: |
pyinstaller build.spec
mv "dist/CursorFreeVIP_${{ env.VERSION }}_linux" "dist/CursorFreeVIP_${{ env.VERSION }}_linux_x64"
echo "Contents of dist directory:"
ls -la dist/
- name: Upload Linux artifact
- name: Upload Linux x64 artifact
uses: actions/upload-artifact@v4
with:
name: CursorFreeVIP_${{ env.VERSION }}_linux
path: dist/*
name: CursorFreeVIP_${{ env.VERSION }}_linux_x64
path: dist/CursorFreeVIP_${{ env.VERSION }}_linux_x64
build-linux-arm64:
needs: [determine-version, create-tag]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
with:
platforms: arm64
- name: Set version
shell: bash
run: echo "VERSION=${{ needs.determine-version.outputs.version }}" >> $GITHUB_ENV
- name: Build in ARM64 Docker container
run: |
docker run --rm --platform linux/arm64 -v ${{ github.workspace }}:/app -w /app arm64v8/python:3.10-slim bash -c "
apt-get update && apt-get install -y build-essential
pip install --upgrade pip
pip install pyinstaller
pip install -r requirements.txt
python -m PyInstaller build.spec
mv /app/dist/CursorFreeVIP_${{ env.VERSION }}_linux /app/dist/CursorFreeVIP_${{ env.VERSION }}_linux_arm64
"
echo "Contents of dist directory:"
ls -la dist/
- name: Upload Linux ARM64 artifact
uses: actions/upload-artifact@v4
with:
name: CursorFreeVIP_${{ env.VERSION }}_linux_arm64
path: dist/CursorFreeVIP_${{ env.VERSION }}_linux_arm64
build-macos-intel:
needs: create-tag
needs: [determine-version, create-tag]
runs-on: macos-latest
steps:
@ -144,7 +226,7 @@ jobs:
- name: Set version
shell: bash
run: echo "VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
run: echo "VERSION=${{ needs.determine-version.outputs.version }}" >> $GITHUB_ENV
- name: Install dependencies
run: |
@ -155,51 +237,100 @@ jobs:
- name: Build MacOS Intel executable
env:
TARGET_ARCH: 'x86_64'
VERSION: ${{ env.VERSION }}
run: |
arch -x86_64 python3 -m PyInstaller build.spec
mv "dist/CursorFreeVIP_${{ env.VERSION }}_mac" "dist/CursorFreeVIP_${{ env.VERSION }}_mac_intel"
- name: Upload MacOS Intel artifact
uses: actions/upload-artifact@v4
with:
name: CursorFreeVIP_${{ env.VERSION }}_mac_intel
path: dist/*
path: dist/CursorFreeVIP_${{ env.VERSION }}_mac_intel
create-release:
needs: [build-windows, build-macos-arm64, build-linux, build-macos-intel]
needs: [determine-version, build-windows, build-macos-arm64, build-linux-x64, build-linux-arm64, build-macos-intel]
runs-on: ubuntu-22.04
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Get version
shell: bash
run: echo "VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
run: echo "VERSION=${{ needs.determine-version.outputs.version }}" >> $GITHUB_ENV
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Prepare release files
- name: Calculate SHA256 checksums
run: |
cd artifacts
# 重命名文件为最终的可执行文件名
mv CursorFreeVIP_${{ env.VERSION }}_windows.exe/CursorFreeVIP.exe CursorFreeVIP_${{ env.VERSION }}_windows.exe
mv CursorFreeVIP_${{ env.VERSION }}_mac_arm64/CursorFreeVIP CursorFreeVIP_${{ env.VERSION }}_mac_arm64
mv CursorFreeVIP_${{ env.VERSION }}_linux/CursorFreeVIP CursorFreeVIP_${{ env.VERSION }}_linux
mv CursorFreeVIP_${{ env.VERSION }}_mac_intel/CursorFreeVIP CursorFreeVIP_${{ env.VERSION }}_mac_intel
# 删除空目录
rm -rf */
ls -la
mkdir -p checksums
for file in artifacts/CursorFreeVIP_${{ env.VERSION }}_windows.exe/CursorFreeVIP_${{ env.VERSION }}_windows.exe \
artifacts/CursorFreeVIP_${{ env.VERSION }}_mac_arm64/CursorFreeVIP_${{ env.VERSION }}_mac_arm64 \
artifacts/CursorFreeVIP_${{ env.VERSION }}_linux_x64/CursorFreeVIP_${{ env.VERSION }}_linux_x64 \
artifacts/CursorFreeVIP_${{ env.VERSION }}_linux_arm64/CursorFreeVIP_${{ env.VERSION }}_linux_arm64 \
artifacts/CursorFreeVIP_${{ env.VERSION }}_mac_intel/CursorFreeVIP_${{ env.VERSION }}_mac_intel
do
if [ -f "$file" ]; then
filename=$(basename $file)
sha256sum "$file" | cut -d ' ' -f 1 > checksums/${filename}.sha256
echo "${filename}: $(cat checksums/${filename}.sha256)" >> checksums/all_checksums.txt
else
echo "Warning: File $file not found"
fi
done
cat checksums/all_checksums.txt
- name: Extract release notes from CHANGELOG
run: |
version_pattern="## v${{ env.VERSION }}"
next_version_pattern="## v"
# Find the start line number of the current version
start_line=$(grep -n "$version_pattern" CHANGELOG.md | head -1 | cut -d: -f1)
if [ -z "$start_line" ]; then
echo "Error: Version ${{ env.VERSION }} not found in CHANGELOG.md"
exit 1
fi
# Find the line number of the next version
next_version_line=$(tail -n +$((start_line + 1)) CHANGELOG.md | grep -n "$next_version_pattern" | head -1 | cut -d: -f1)
if [ -z "$next_version_line" ]; then
# If there's no next version, get to the end of the file
changelog_content=$(tail -n +$start_line CHANGELOG.md)
else
# Extract content between current version and next version
end_line=$((start_line + next_version_line - 1))
changelog_content=$(sed -n "${start_line},${end_line}p" CHANGELOG.md)
fi
# Create release notes file
{
echo "$changelog_content"
echo ""
echo "## SHA256 Checksums"
cat checksums/all_checksums.txt
} > release_notes.md
# Display release notes for debugging
cat release_notes.md
- name: Create Release
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ env.VERSION }}
body_path: release_notes.md
files: |
artifacts/CursorFreeVIP_${{ env.VERSION }}_windows.exe
artifacts/CursorFreeVIP_${{ env.VERSION }}_mac_arm64
artifacts/CursorFreeVIP_${{ env.VERSION }}_linux
artifacts/CursorFreeVIP_${{ env.VERSION }}_mac_intel
artifacts/CursorFreeVIP_${{ env.VERSION }}_windows.exe/CursorFreeVIP_${{ env.VERSION }}_windows.exe
artifacts/CursorFreeVIP_${{ env.VERSION }}_mac_arm64/CursorFreeVIP_${{ env.VERSION }}_mac_arm64
artifacts/CursorFreeVIP_${{ env.VERSION }}_linux_x64/CursorFreeVIP_${{ env.VERSION }}_linux_x64
artifacts/CursorFreeVIP_${{ env.VERSION }}_linux_arm64/CursorFreeVIP_${{ env.VERSION }}_linux_arm64
artifacts/CursorFreeVIP_${{ env.VERSION }}_mac_intel/CursorFreeVIP_${{ env.VERSION }}_mac_intel
draft: false
prerelease: false
env:

53
.gitignore vendored Normal file
View File

@ -0,0 +1,53 @@
__pycache__
server/
venv/
check_license.py
cursor_modifier.py
reset_machine.py
Run_Venv.bat
token_monitor.py
get_mac.py
.gitignore
build.bat
build.mac.command
build.py
build.sh
ENV/
test.py
new_tempemail_smail.py
new_tempemail_api.py
install.bat
run.bat
temp_account_info.txt
.env copy
# PyInstaller
build/
dist/
*.spec2
credentials.txt
cursor_accounts.txt
recaptcha.py
install_requirements.bat
# IDE
.idea/
.vscode/
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Project specific
*.log
*.db
*.sqlite3
# Mac
run_venv.mac.command

611
CHANGELOG.md Normal file
View File

@ -0,0 +1,611 @@
# Change Log
## v1.11.03
1. Update: TempMailPlus Cursor Email Detection Logic | 更新 TempMailPlus Cursor 邮件识别逻辑
2. Fix: Windows User Directory Path | 修正 windows 环境下用户目录的获取方式
3. Fix: Some Issues | 修復一些問題
## v1.11.02
1. Fill: Missing Translationsar, zh-cn, zh-tw, vi, nl, de, fr, pt, ru, tr, bg, es, ja, it | 填補缺失的翻譯
2. Add: Japanese and Italian language support
3. Refactor: Account Generation with Faker and Update requirements.txt
4. Add: script to auto-translate missing keys in translation files | 增加 fill_missing_translations.py 自動翻譯缺失的翻譯鍵
5. Add: TempMailPlus Support, support temp email verification | 新增 TempMailPlus 配置,支持临时邮箱验证功能
6. Fix: Chrome user data directory permission problem on mac | 修復 Chrome 用戶數據目錄權限問題 on mac
7. Fix: Some Issues | 修復一些問題
## v1.11.01
0. Must Update to this version to get full experience | 必須更新到此版本以獲取完整體驗
1. Restore: Some Main Code | 恢復一些主程式碼
2. Add: Arabic language | 增加阿拉伯語
3. Add: Language configuration saved setting | 增加語言配置保存設定
4. Add: Restore Machine ID from Backup | 增加從備份恢復機器ID
5. Add: Owned Website Check Version | 增加擁有網站檢查版本
6. Fix: use cursor_path from config_file | 修復使用 cursor_path 從 config_file
7. Fix: macOS 'bypass_version.py' get product_json_path from config_file | 修復 macOS 'bypass_version.py' 從 config_file 獲取 product_json_path
8. Fix: Some Issues | 修復一些問題
## v1.10.05
1. Remove block_domain.txt | 移除 block_domain.txt
2. Original Code In Github , If u afraid of virus, please clone the code and run locally | 原始碼在 Github 上,如果怕病毒,請複製原始碼並在本機運行
3. All Action using github workflow , not build myself , so i cant place virus in the file | 所有 Action 使用 github workflow ,不是我自己 build 的,所以我不會在文件中放置病毒
4. Fix: Some Issues | 修復一些問題
## v1.10.04
1. Hotfix: Reset Process Error: cannot access local variable 'main_path' where it is not associated with a value on windows & macos | 修復在 Windows 和 macOS 上無法訪問局部變量 'main_path' 的問題
2. Fix: Some Issues | 修復一些問題
## v1.10.03
1. Add: Manual Registration | 增加手動註冊
2. Only support your own Email | 只支持自己的Email 請勿使用Temp Email 註冊 註冊假賬號.
3. Fix: macOS 'bypass_version.py' get product_json_path from config_file | 修復 macOS 'bypass_version.py' 從 config_file 獲取 product_json_path
4. Fix: use cursor_path from config_file | 修復使用 cursor_path 從 config_file
5. Fix: Some Issues | 修復一些問題
## v1.10.02
1. Remove: Remove All Auto generating fake Google email accounts and OAuth access | 移除所有自動生成假 Google 電子郵件帳戶和 OAuth 訪問
2. Follow GitHub Terms of Service | 遵守 GitHub Terms of Service
3. Follow Cursor Terms of Service | 遵守 Cursor Terms of Service
4. All are for educational purposes, currently the repo does not violate any laws | 全都是教育用途,目前 repo 沒有違反任何法律
5. This project adopts CC BY-NC-ND 4.0 , do not use for commercial purposes | 本專案採用 CC BY-NC-ND 4.0,拒絕任何商業用途
6. Use & Cherish | 切用且珍惜
7. Same as v1.10.01 | 與 v1.10.01 相同
8. Fix: reset machine ID no module name 'new_signup' | 修復機器 ID 重置 no module name 'new_signup'
9. Fix: Some Issues | 修復一些問題
## v1.10.01
1. Remove: Remove All Auto generating fake Google email accounts and OAuth access | 移除所有自動生成假 Google 電子郵件帳戶和 OAuth 訪問
2. Follow GitHub Terms of Service | 遵守 GitHub Terms of Service
3. Follow Cursor Terms of Service | 遵守 Cursor Terms of Service
4. All are for educational purposes, currently the repo does not violate any laws | 全都是教育用途,目前 repo 沒有違反任何法律
5. This project adopts CC BY-NC-ND 4.0 , do not use for commercial purposes | 本專案採用 CC BY-NC-ND 4.0,拒絕任何商業用途
6. Use & Cherish | 切用且珍惜
7. Fix: Some Issues | 修復一些問題
## v1.9.05
1. Refactor: Using match-case to refactor language mapping and menu selection logic, making the code clearer and more maintainable. | 使用 match-case 重构语言映射和菜单选择逻辑,使代码更清晰、可维护性更高。
2. Ci: Update the Python version in the ARM64 Docker build container to 3.10, making it more compatible and easier to migrate in the future. | 更新 ARM64 Docker 构建容器中的 Python 版本至 3.10,兼容性更强,方便未来迁移。
3. Fix: f-string backslash expression errors in multiple files | 修復多個文件中的 f-string 反斜杠表達式錯誤
4. Sync AUR new version 1.9.04 | 同步 AUR 新版本 1.9.04
5. Fix: missing license install on pkgbuild @michaeldavis246611119 mention here | 修復 pkgbuild 中缺少授權安裝 @michaeldavis246611119 提到這裡
6. Fix: readme table | 修復 readme 表格
7. Fix: google-chrome package name problem, add "google-chrome-stable" [Bug]: Chrome error | Arch | gnome | AUR chrome #242 [Discussion]: how to use the new feature, Register with Google Account #249 [Discussion]: Having issues using the script in Ubuntu #487 [Bug]: Can open chromium bin in linux #616 | 修復 google-chrome 包名稱問題,添加 "google-chrome-stable" [Bug]: Chrome error | Arch | gnome | AUR chrome #242 [Discussion]: how to use the new feature, Register with Google Account #249 [Discussion]: Having issues using the script in Ubuntu #487 [Bug]: Can open chromium bin in linux #616
8. Fix: exception error log | 修復異常錯誤日誌
9. Fix: github oauth error [Bug]: #564 | 修復 github oauth 錯誤 [Bug]: #564
10. Fix: ChromiumOptions.arguments type error: list object has no attribute 'get' | 修復 ChromiumOptions.arguments 類型錯誤list 對象沒有屬性 'get'
11. Fix: Some Issues | 修復一些問題
## v1.9.04
1. Add: Opera GX Support | 添加 Opera GX 支持
2. Same as v1.9.03 | 與 v1.9.03 相同
3. Hotfix: Some Issues | 修復一些問題
4. Add: Bypass Cursor JWT EXP Problem | 添加繞過 Cursor JWT EXP 問題
5. Fix: Cursor editor redirects to logout page and logout automatically | 修復 Cursor 編輯器重定向到登出頁面並自動登出
6. Fix: Some Issues | 修復一些問題
## v1.9.03[Skip & Merge to v1.9.04]
1. Hotfix: Some Issues | 修復一些問題
2. Add: Bypass Cursor JWT EXP Problem | 添加繞過 Cursor JWT EXP 問題
3. Fix: Cursor editor redirects to logout page and logout automatically | 修復 Cursor 編輯器重定向到登出頁面並自動登出
4. Fix: Some Issues | 修復一些問題
## v1.9.02
1. Add: Bypass Token Limit | 添加繞過 Token 限制
2. Add: More Browser Support | 添加更多瀏覽器支持
3. Add: Bypass Cursor JWT EXP Problem | 添加繞過 Cursor JWT EXP 問題
4. Support: Add Opera, Brave, Edge, Firefox | 添加支持 Opera, Brave, Edge, Firefox
5. Add config manual browser path | 添加配置手動選擇遊覽器路徑
5. Fix: Browser Profile Selection | 修復瀏覽器配置文件選擇
6. Fix: Cursor editor redirects to logout page and logout automatically | 修復 Cursor 編輯器重定向到登出頁面並自動登出
7. Fix: Config File Path | 修復配置文件路徑
8. Fix: window user permission | 修復 window 用戶權限
9. Fix: Some Issues | 修復一些問題
## v1.9.01
1. Add: Bypass Token Limit | 添加繞過 Token 限制
2. Add: More Browser Support | 添加更多瀏覽器支持
3. Support: Add Opera, Brave, Edge, Firefox | 添加支持 Opera, Brave, Edge, Firefox
4. Add config manual browser path | 添加配置手動選擇遊覽器路徑
5. Fix: Browser Profile Selection | 修復瀏覽器配置文件選擇
6. Fix: Some Issues | 修復一些問題
## v1.8.10
1. Add: Check User Authorized | 添加檢查用戶授權
2. Fix: Linux Reset Process Error: 'base' | 修復 Linux 重置過程錯誤:'base'
3. Updated the get_workbench_cursor_path function to handle Linux systems more effectively. | 更新 get_workbench_cursor_path 函數以更有效地處理 Linux 系統
4. Added logic to use the first base path if no valid paths are found in the existing loop. | 添加邏輯以在找不到有效路徑時使用第一個基礎路徑
5. Improved maintainability and clarity of the code by explicitly handling different operating systems. | 通過明確處理不同的操作系統,顯著提高了代碼的可維護性和清晰性
6. Fix: Some Issues | 修復一些問題
## v1.8.09
1. Add: Bypass Token Limit Check | 繞過 Token 使用限制檢查
2. AddBypass Claude Limit 30000 set to 900000(9e5) | 繞過 Claude 使用限制 30000 設置為 900000(9e5)
3. Add: Force Update Config | 添加強制更新配置
4. Add: Multilanguage support for force update | 添加強制更新功能的多語言支持
5. Fix: Reset break | 修復重置中斷
4. Fix: Some Issues | 修復一些問題
## v1.8.08
1. Add: Force Update Config | 添加強制更新配置
2. Add: Multilanguage support for force update | 添加強制更新功能的多語言支持
3. Fix: Google Auth & Github Auth JWT Problem | 修復 Google Auth & Github Auth JWT 問題
4. Fix: Totally reset import & import * raw options problem | 修復 totally reset import & import * raw 選項問題
5. Fix: reset.file_not_found problem | 修復 reset.file_not_found 問題
6. Outdated: Bypass Cursor Version Check | 過期:繞過 Cursor 版本檢查
7. Document: i.header.set("x-cursor-config-version", "UUID4-xxxxxx-xxxxxx-xxxxxx-xxxxxx"); | 文檔i.header.set("x-cursor-config-version", "UUID4-xxxxxx-xxxxxx-xxxxxx-xxxxxx");
8. Fix: Some Issues | 修復一些問題
## v1.8.07
1. Add: Bypass Cursor Version Check | 添加繞過 Cursor 版本檢查
2. Add: Multilanguage support for bypass | 添加繞過的多語言支持
3. MSG: Free & free trial accounts can no longer use chat with premium models on Cursor Version 0.45 or less. Please upgrade to Pro or use Cursor Version 0.46 or later. Install Cursor at https://www.cursor.com/downloads or update from within the editor.
4. Fix: Some Issues | 修復一些問題
## v1.8.06
1. Add: Google Account Deletion Feature | 添加 Google 账号删除功能
2. Update: Menu with new account deletion option | 更新菜单添加账号删除选项
3. Add: Multilanguage support for account deletion | 添加账号删除功能的多语言支持
4. Fix: Improve usage limits check and tuple index error | 修复使用限制检查和元组索引错误
5. Fix: bug in disable cursor auto update | 修复禁用 Cursor 自动更新的错误
6. Fix: Linux-appimage | 修复 Linux-appimage 问题
7. Add: Support for custom Cursor installation paths on Windows | 添加 Windows 系统下自定义 Cursor 安装路径支持
8. Add: Chrome profile selection feature | 添加 Chrome 配置文件选择功能
9. Fix: improve account usage limit detection | 修復賬號檢測
10. Fix: For custom Chrome Installations | 修復自定義chrome遊覽器安裝
## v1.8.05
1. Fix: Linux Path Not Found 修復linuxpath問題
2. Add: support for detecting both 150/150 and 50/50 usage limits 添加偵測50 或者150的使用量
3. Improve: usage parsing and validation 檢測使用量
## v1.8.04
1. Update totally_reset_cursor.py | 更新 totally_reset_cursor.py
2. Fix: improve Linux Chrome visibility and root user handling | 修復 Linux Chrome 可見性以及 root 用戶處理
3. Fix: improve Linux path handling and fix permission issues | 修復 Linux 路徑處理以及修復權限問題
4. Fix: Some Issues | 修復一些問題
## v1.8.03
1. Fix: Improve Linux path handling and add case-insensitive Cursor directory detection 修復Linux系統路徑錯誤以及添加cursor 路徑偵測
2. Fix: Some Issues | 修復一些問題
## v1.8.02
1. Add: New Temp Email | 增加新臨時郵箱
2. Add: Config Options | 增加配置選項
3. Add: Update Windows Machine ID | 增加更新 Windows 機器 ID
4. Add: Contributors Options | 增加貢獻者選項
5. Add: Check update enable Options In config | 增加在 config 中檢查更新選項
6. Add: Show account info enabled options in config | 增加在 config 中顯示賬號信息選項
7. Optimize Row & Colume Options | 優化行與列選項
8. Fix: Too Many Free Trial On Some Machine | 修復某些機器上太多免費試用
9. Fix: Disable Auto Update | 修復禁用自動更新
10. Fix: Linux Chrome Not Open Correct | 修復 Linux Chrome 未正確打開
11. Fix: Some Issues | 修復一些問題
## v1.8.01
1. Add: Cursor Account Info | 增加 Cursor 賬號信息
2. Fix: Disable Auto Update | 修復禁用自動更新
3. Add: 0.48.x Version Support | 增加 0.48.x 版本支持
4. Revert: Totally Reser Cursor to Beta | 恢復完全重置 Cursor 到 Beta
5. Reopen: Totally Reset Cursor | 重新開啟完全重置 Cursor
6. Fix: Logo.py Center | 修復 Logo.py 居中
7. Fix: Linux Chrome Not Open Correct | 修復 Linux Chrome 未正確打開
8. Fix: Some Issues | 修復一些問題
## v1.7.18
1. Fix: No Write Permission | 修復沒有寫入權限
2. Fix: Improve Linux path detection and config handling 修正 linux 路徑和config寫入讀取
3. Fix: Locale path_no_exist missing 修正 path_no_exist 語言遺失
4. Fix: Some Issues | 修復一些問題
## v1.7.17
1. Fix: Remove 10 options Totally Reset Cursor | 修復完全重置 Cursor 選項
## v1.7.16
1. Add bulgarian language | 增加保加利亚语
2. Fix: Some Issues | 修復一些問題
3. Add: Contributors | 增加貢獻者
4. Fix: Total Reset Cursor | 修復完全重置 Cursor
5. Add: Display Features and Warnings | 增加顯示功能與警告
6. Fix: Totally Reset Cursor | 修復完全重置 Cursor
7. Remake: Logo.py Center | 重做 Logo.py 居中
## v1.7.15
1. Fix: Cant Verify the User is Human | 修復無法驗證用戶是否為人類
2. Added temporary email & GitHub + Cursor AI registration automation | 增加临时邮箱 & GitHub + Cursor AI 注册自动化
3. Added Turkish language support | 增加土耳其语支持
4. Removed outdated temporary option in Option 2 | 移除选项2中的过期临时添加项
5. Enhanced machine ID reset (Linux, Windows, macOS), bypasses Cursor free trial detection | 机器 ID 重置支持 Linux/Windows/macOS绕过 Cursor 免费试用检测
6. Expanded Cursor AI file detection, deep removal of leftover trial files | 扩展 Cursor AI 文件检测,深度清理残留试用文件
7. Optimized logging, replaced print with logging module, added verification steps | 日志优化,统一采用 logging 模块,增加验证步骤提示
8. Added retry mechanism for email verification | 增加邮箱验证重试机制
9. Automated GitHub OAuth login for Cursor AI | 自动 GitHub OAuth 登录 Cursor AI
10. Saved registered GitHub accounts and timestamps | 保存 GitHub 账户和注册时间戳
11. Added user confirmation before execution | 添加用户确认步骤,防止误操作
12. Displayed feature list & warnings before actions | 显示功能与风险警告
13. Improved Selenium flow and error handling | 增强 Selenium 流程与错误处理
14. Added Chrome process tracking and cleanup | 增加 Chrome 进程跟踪和清理
## v1.7.14
1. Added a Russian locale to program, fixed a typo in readme.md. Also translated other files
為程式新增了俄語語系,修正了 readme.md 的拼寫錯誤,並翻譯了其他文件。
2. Changing the directory from ~/.config/Cursor to ~/.config/cursor
將目錄從 `~/.config/Cursor` 更改為 `~/.config/cursor`
3. Changing the filename from machineId to machineid
將檔案名稱從 `machineId` 更改為 `machineid`
4. Updated all related paths in:
更新了以下檔案中的相關路徑:
- `reset_machine_manual.py`
- `config.py`
5. Added Linux path note in README.md
`README.md` 中新增了 Linux 路徑的說明。
6. These changes align with Linux filesystem conventions and fix issues with Chrome/Chromium integration
這些變更符合 Linux 文件系統的規範,並修復了與 Chrome/Chromium 整合的問題。
7. This PR adds retry logic to handle the 'Can't verify the user is human' error during registration
此 PR 新增了重試機制,以處理註冊時的「無法驗證用戶是否為人類」錯誤。
8. Added max 5 retries for form submission when human verification fails
當人類驗證失敗時,最多允許 5 次表單提交重試。
9. Added random delays between retries (2-4 seconds)
在重試之間隨機延遲 2-4 秒。
10. Enhanced browser fingerprint randomization to better bypass detection
增強了瀏覽器指紋的隨機性,以更好地繞過檢測。
11. Added new translation strings for retry status messages
新增了重試狀態訊息的翻譯字串。
12. Improved error handling and user feedback
改進了錯誤處理和用戶回饋機制。
13. The changes ensure a more robust registration process by automatically retrying when human verification fails, while maintaining human-like behavior through randomized delays and improved browser fingerprinting
這些變更確保了更穩定的註冊流程,透過自動重試機制處理人類驗證失敗的情況,同時透過隨機延遲與增強的瀏覽器指紋技術,維持類似人類的行為模式。
## v1.7.13
1. Added _delete_current_account method to handle account deletion via API 新增 _delete_current_account 方法,透過 API 處理帳號刪除
2. Updated account reset logic to use the appropriate auth method based on auth_type 更新帳號重置邏輯,根據 auth_type 選擇適當的驗證方式
3. Maintained existing Google OAuth reset functionality 維持現有的 Google OAuth 重置功能
4. Added proper error handling for account deletion failures 新增帳號刪除失敗時的錯誤處理
5. Ensures GitHub authentication maintains its flow when resetting accounts 確保 GitHub 認證在帳號重置時保持正常流程
6. The _delete_current_account method makes a POST request to https://www.cursor.com/api/dashboard/delete-account
_delete_current_account 方法會發送 POST 請求至 https://www.cursor.com/api/dashboard/delete-account
7. After successful deletion, redirects back to the authentication page 刪除成功後,會導回驗證頁面
8. Uses Promise-based JavaScript for reliable API communication 使用 Promise-based JavaScript確保 API 通訊穩定
9. Includes proper error handling and logging 包含適當的錯誤處理與日誌記錄
10. Add Brazilian Portuguese language 新增巴西葡萄牙語
## v1.7.12
1. Add: Changelog Show in Menu | 增加更新日志在菜單中
2. Remake Create Mail Logic | 重做創建郵箱邏輯
3. Fix: Some Issues | 修復一些問題
## v1.7.11 ( Skip & Merge to v1.7.12 )
1. Add: Multi-language Support | 增加多語言支持
2. Add: German Language | 增加德語
3. Add: Dutch Language | 增加荷蘭語
4. Add: French Language | 增加法語
5. Add: Auto Detect Max Use Count | 增加自動檢測最大使用次數
6. Add: Detect & Auto Delete Account | 增加檢測 & 自動刪除賬號
7. Add: Optimize Some Logic | 優化一些邏輯
8. Add: Local Blocked Domains | 增加本地被屏蔽域名
9. Fix : Get Verification Code for None | 修復獲取驗證碼為 None
## v1.7.10
1. Add: Totally Reset Cursor | 增加完全重置 Cursor
2. Add: Multi-language Support for Totally Reset | 增加完全重置多語言支持
## v1.7.09
1. Add: Development Version Check | 增加開發版本檢查
2. Remove: Github Trial Reset | 移除 Github 試用重置
3. Fixed: Some Issues | 修復一些問題
## v1.7.08
1. Add: Google OAuth Authentication | 增加 Google OAuth 認證
2. Add: GitHub OAuth Authentication | 增加 GitHub OAuth 認證
3. Add: Lifetime Access for OAuth Users | 增加 OAuth 用戶終身訪問權限
4. Add: OAuth Authentication Integration | 增加 OAuth 認證集成
5. Update: Menu System with OAuth Options | 更新菜單系統,添加 OAuth 選項
6. Add: Multi-language Support for OAuth | 增加 OAuth 多語言支持
## v1.7.07
1. Add: Vietnamese Language | 增加越南語言
2. Add: Admin Privilege Management for Windows Executable | 增加 Windows 可執行文件管理員權限
3. Implement admin privilege detection for Windows platform | 實現 Windows 平台管理員權限檢測
4. Add functions to check and request admin rights when running as a frozen executable | 增加檢查和請求管理員權限的功能
5. Enhance startup process with admin privilege verification | 增強啟動過程中的管理員權限驗證
6. Add new admin-related emoji to the EMOJI dictionary | 增加新的管理員相關表情符號到 EMOJI 字典
7. Provide fallback mechanism for non-Windows platforms (macos and linux ) | 提供非 Windows 平台macos 和 linux的回退機制
These changes make the application more user-friendly by only requesting admin privileges when necessary (when running as an executable). | 這些改進使應用程序更易於使用,只在必要時(當作為可執行文件運行時)請求管理員權限。
## v1.7.06
1. Add: Update Confirm | 增加更新確認
2. Add: Update Skipped | 增加更新跳過
3. Add: Invalid Choice | 增加無效選擇
4. Fix: Cursor Path | 修復 Cursor 路徑
5. Fix: Path Encoding | 修復路徑編碼
6. Fix: Getting Verification Code | 修復獲取驗證碼
7. Fix: Setting Password | 修復設置密碼
8. Fix: Disable Auto Update | 修復禁用自動更新
9. Add Config.py | 增加 Config.py
10. Add utils.py | 增加 utils.py
11. Rebuild some logic | 重新構建一些邏輯
## v1.7.05
1. Fix: Cursor Version Check | 修復 Cursor 版本檢查
2. Fix: Small Problem | 修復一些小問題
## v1.7.04
1. Hotfix: Small Problem | 修復一些小問題
## v1.7.03
1. Hotfix: Small Problem | 修復一些小問題
## v1.7.02
1. Fix: Cursor Path | 修復 Cursor 路徑
2. Add: Config File | 增加配置文件
3. Remove: Workbench Cursor Path | 移除 Workbench Cursor 路徑
4. Remove: Cursor Main JS | 移除 Cursor main.js
## v1.7.01
- Refactoring: Extract configuration-related code from the `setup_driver` function to an independent `setup_config` function
- Optimization: Improve code maintainability and make configuration management and browser settings more clear
- Improvement: The creation and update logic of the configuration file is clearer and more independent
## v1.6.03
1. Hotfix: Small Problem | 修復一些問題
## v1.6.02
1. Hotfix: Small Problem | 修復一些問題
2. Add: Test some Bypass Code | 測試一些繞過代碼
## v1.6.01
1. Fix: Cursor Auth | 修復 Cursor Auth
2. Add: Create Account Maximum Retry | 增加創建賬號最大重試次數
3. Fix: Cursor Auth Error | 修復 Cursor Auth 錯誤
4. Fix: Update Curl Failed | 修復更新 Curl 失敗
## v1.5.03
1. HOTFIX: Stuck on starting browser | 修復啟動瀏覽器卡住問題
2. Small Fix: Error Handling | 小修錯誤處理
3. Small Fix: Translation | 小修翻譯
4. Small Fix: Performance | 小修性能
## v1.5.02
1. Add: Generate Random Name Alias | 增加生成隨機真實姓名
2. Add: Realistic Name Input | 增加真實姓名輸入
3. Optimize: Error Handling | 優化錯誤處理
4. Optimize: Translation | 優化翻譯
5. Optimize: Performance | 優化性能
## v1.5.01
1. Add: Check Latest Version | 增加檢查最新版本
2. Add: Update Command | 增加更新命令
## v1.4.08
1. Add: Print Some Account Info | 增加打印一些賬號信息
## v1.4.07
1. Add Removed break statements after each operation | 修改結束 event 後的 break 暫停應用
2. Added print_menu() calls to show the menu again | 添加 print_menu調用以再次顯示菜單
3. Updated error handling to show menu instead of exiting | 更新錯誤處理以顯示菜單而不是退出
## v1.4.06
1. Add: Blocked Domains Loaded | 增加被屏蔽的域名加載
2. Fix: Cleanup Error | 修復清理進程時出錯
3. Fix: Blocked Domains Loaded Error | 修復被屏蔽的域名加載錯誤
4. Fix: Available Domains Loaded Error | 修復可用域名加載錯誤
5. Fix: Domains Filtered Error | 修復過濾後剩餘域名錯誤
6. Fix: Domains Excluded Error | 修復排除域名錯誤
## v1.4.05
1. Fix: macOS Language Detection | 修復 macOS 語言檢測
## v1.4.04
1. Change Some Language Info to English | 更改一些語言信息為英文
2. Add Auto Detect System Language | 增加自動檢測系統語言
3. Fixed Some Issues | 修復一些問題
## v1.4.03
1. Switch to API-based Registration System | 改用 API 註冊系統替代瀏覽器操作
2. Add Support for Latest Cursor Version | 增加支持最新版本 Cursor
3. Enhance Translation System | 優化多語言翻譯系統
4. Add Database Connection Status Messages | 增加數據庫連接狀態提示
5. Improve Error Handling for Database Operations | 改進數據庫操作的錯誤處理
6. Add New API Integration | 新增 API 集成
7. Optimize Performance and Stability | 優化性能和穩定性
## v1.4.01
1. Add Disable Cursor Auto Upgrade | 增加禁用 Cursor 自動升級
## v1.3.02
1. Add Buy Me a Coffee | 增加請我喝杯咖啡
2. Add PayPal | 增加 PayPal
3. Very Small Fix | 非常小的修復
4. Fix main.py option number | 修復 main.py 選項數量
## v1.3.01
1. Add Manual Email Input | 增加手動輸入郵箱地址
2. Add Manual Code Input | 增加手動輸入驗證碼
3. Fix Cursor Options | 修復 Cursor 選項
## v1.2.02
1. Add PBlock | 增加 PBlock
2. Remove uBlock0.chromium | 移除 uBlock0.chromium
3. Optimize the logic of the script | 優化腳本邏輯
4. Optimize Size | 優化大小
## v1.2.01
1. Fix Cursor Cloudflare Human Verification Problem | 修復 Cursor Cloudflare 人機驗證問題
2. Change to automatic registration account | 全面改為自動註冊賬號
3. Change Mail Site | 改變郵箱網站
4. Fix Cursor Cloudflare Problem | 修復 Cursor Cloudflare 問題
## v1.1.01
<p align="center">
<img src="./images/cloudflare_2025-02-12_13-43-21.png" alt="free" width="400"/><br>
</p>
1. Hot Fix Cursor Cloudflare Problem | 修復 Cursor Cloudflare 問題
2. Fix Cursor Cloudflare Human Verification Problem | 修復 Cursor Cloudflare 人機驗證問題
3. Remake signup logic | 重做註冊邏輯
## v1.0.10
1. Hot Fix Mac Chrome Problem | 修復 Mac Chrome 問題
2. Fix Linux Start Donet Problem | 修復 Linux 啟動開發者問題
## v1.0.9
<p align="center">
<img src="./images/cloudflare_2025-02-12_13-43-21.png" alt="free" width="400"/><br>
</p>
1. Fixed New 0.45.x Version Reset Machine | 修復新 0.45 版本重置機器
2. Fix Locale Language | 修復多語言
3. Add Support Crypto Machine Regedit | 增加支持加密機器註冊
4. Add Remake main.js | 重做 main.js
## v1.0.8
1. Fix New 0.45 Version Reset Machine | 修復新 0.45 版本重置機器
2. Fix Locale Language | 修復多語言
3. Add Support Crypto Machine Regedit | 增加支持加密機器註冊
## v1.0.7 - HotFix
1. Fix Reset Machine | 修復重置機器
2. Fix Locale Language | 修復多語言
## v1.0.7
1. Add Locale Language Support | 增加多語言支持
<p align="center">
<img src="./images/locale_2025-01-15_13-40-08.png" alt="locale" width="400"/><br>
</p>
## v1.0.6
1. Add Quit Cursor Option | 增加退出 Cursor 選項
2. Add Recaptcha Path Patch | 增加 Recaptcha 路徑修復
3. Fix Admin Permission | 修復管理員權限問題
4. Remove all need admin permission | 移除所有需要管理員權限
## v1.0.5 - HotFix
1. Fix: Mac Browser Control | 修復 Mac 瀏覽器控制問題
2. Fix: Verification Code Cant Patch | 修復驗證碼無法修復問題
3. Add Linux Support | 增加 Linux 支持
<p align="center">
<img src="./images/fix_2025-01-14_21-30-43.png" alt="fix" width="400"/><br>
</p>
## v1.0.5
1. Remove MachineID | 移除機器碼 ID
2. Change to automatic registration account | 全面改為自動註冊賬號
3. Use your own exclusive new account | 使用自己獨享的新賬號
4. Fully automatic reset machine configuration | 全面自動化重置機器配置
<p align="center">
<img src="./images/pro_2025-01-14_14-40-37.png" alt="Why" width="400"/><br>
</p>
## v1.0.4
1. Fix: Cursor's configuration | 修復 Cursor 的配置問題
2. Fix Cloud Lame | 修復雲端慢速模式
## v1.0.3
1. Fix: Cursor's configuration | 修復 Cursor 的配置問題
2. Add Manual Reset Machine | 增加手動重置機器
3. Add CDN Cloud Control WatchDog | 增加 CDN 雲端控制 WatchDog
4. Add Mac OS Support | 增加 Mac OS 支持
5. 759 ++ People use , but star only a few | 759 ++人使用,但只有幾個人點贊
<p align="center">
<img src="./images/what_2025-01-13_13-32-54.png" alt="Why" width="400"/><br>
</p>
## v1.0.2
1. Fix: Some known issues | 修復了一些已知問題
2. Add cloud control device code | 增加雲端控制設備碼
3. Cloud reset device code | 雲端重置設備碼
4. Remove official WatchDog monitoring | 移除官方 WatchDog 監控
5. Remove Proxy official prompt | 移除 Proxy 官方提示
6. Fix: Too Many Computer | 修復 Too Many Computer 問題
7. Fix Billing Issue | 修復計費問題
8. Fix: Cursor's configuration | 修復 Cursor 的配置問題
9. Fix cursor-slow mode | 修復 cursor-slow 模式
## v1.0.1
1. Fix: Reset machine ID | 修復了重置機器 ID 的問題
2. Fix: Bypass membership check | 修復了 繞過會員檢查的問題
3. Fix: Auto upgrade to "pro" membership | 修復了 自動升級為 pro 會員的問題
4. Fix: Real-time send Token request | 修復了 實時發送 Token 請求的問題
5. Fix: Reset Cursor's configuration | 修復了 重置 Cursor 的配置的問題
## v1.0
1. Preview Image | 預覽圖<br>
<p align="center">
<img src="./images/pro_2025-01-11_00-50-40.png" alt="Cursor Pro Logo" width="400"/><br>
</p>
<p align="center">
<img src="./images/pro_2025-01-11_00-51-07.png" alt="Cursor Pro Logo" width="400"/><br>
</p>
2. Add usage period,but can be contacted by leaving MachineID | 不得已才添加,但可以通過留下 MachineID 聯繫作者
<br>
<p align="center">
<img src="./images/pro_2025-01-11_16-24-03.png" alt="Cursor Pro Logo" width="400"/><br>
</p>

34
PKGBUILD Normal file
View File

@ -0,0 +1,34 @@
# Maintainer: Canmi21 <9997200@qq.com>
# Contributor: Canmi (Canmi21)
pkgname=cursor-free-vip-git
pkgver=1.9.05
pkgrel=1
pkgdesc="Reset Cursor AI MachineID & Auto Sign Up / In & Bypass Higher Token Limit"
arch=('x86_64')
url="https://github.com/yeongpin/cursor-free-vip"
license=('MIT' 'Attribution-NonCommercial-NoDerivatives 4.0 International')
depends=('python' 'cursor-bin')
makedepends=('git' 'python' 'pyinstaller' 'uv')
provides=('cursor-free-vip')
source=("cursor-free-vip::git+https://github.com/yeongpin/cursor-free-vip.git" "https://raw.githubusercontent.com/canmi21/openjlc/refs/heads/main/LICENSE")
sha256sums=('SKIP' 'SKIP')
pkgver() {
cd "$srcdir/cursor-free-vip"
git describe --tags --always | sed 's/^v//;s/-/./g'
}
build() {
cd "$srcdir/cursor-free-vip"
uv venv .venv
source .venv/bin/activate
uv pip install -r requirements.txt
pyinstaller --clean --noconfirm --onefile main.py --name cursor-free-vip
}
package() {
install -Dm644 "$srcdir/LICENSE" "$pkgdir/usr/share/licenses/$pkgname/mit_license"
install -Dm644 "$srcdir/cursor-free-vip/LICENSE.md" "$pkgdir/usr/share/licenses/$pkgname/attribution_non_commercial_no_derivatives_license"
install -Dm755 "$srcdir/cursor-free-vip/dist/cursor-free-vip" "$pkgdir/usr/bin/cursor-free-vip"
}

393
README.md
View File

@ -1,264 +1,257 @@
# ➤ Cursor Free VIP
<div align="center">
<p align="center">
<img src="./images/logo.png" alt="Cursor Pro Logo" width="200"/>
<img src="./images/logo.png" alt="Cursor Pro Logo" width="200" style="border-radius: 6px;"/>
</p>
<p align="center">
[![Release](https://img.shields.io/github/v/release/yeongpin/cursor-free-vip?style=flat-square&logo=github&color=blue)](https://github.com/yeongpin/cursor-free-vip/releases/latest)
[![Release](https://img.shields.io/endpoint?url=https://api.pinstudios.net/api/badges/release/yeongpin/cursor-free-vip)](https://github.com/yeongpin/cursor-free-vip/releases/latest)
[![License: CC BY-NC-ND 4.0](https://img.shields.io/badge/License-CC_BY--NC--ND_4.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc-nd/4.0/)
[![Stars](https://img.shields.io/github/stars/yeongpin/cursor-free-vip?style=flat-square&logo=github)](https://github.com/yeongpin/cursor-free-vip/stargazers)
[![Stars](https://img.shields.io/endpoint?url=https://api.pinstudios.net/api/badges/stars/yeongpin/cursor-free-vip)](https://github.com/yeongpin/cursor-free-vip/stargazers)
[![Downloads](https://img.shields.io/endpoint?url=https://api.pinstudios.net/api/badges/downloads/yeongpin/cursor-free-vip/total)](https://github.com/yeongpin/cursor-free-vip/releases/latest)
<a href="https://buymeacoffee.com/yeongpin" target="_blank"><img alt="Buy Me a Coffee" src="https://img.shields.io/badge/Buy%20Me%20a%20Coffee-Support%20Me-FFDA33"></a>
[<img src="https://devin.ai/assets/deepwiki-badge.png" alt="Ask DeepWiki.com" height="20"/>](https://deepwiki.com/yeongpin/cursor-free-vip)
</p>
<h4>Support Latest 0.45.11 Version | 支持最新0.45.11版本</h4>
This is a tool to automatically register (except for Google verification code), support Windows and macOS systems, complete Auth verification, and reset Cursor's configuration.
這是一個自動化工具自動註冊除了Google驗證碼),支持 Windows 和 macOS 系統完成Auth驗證重置Cursor的配置。
<p align="center">
<img src="./images/new107_2025-01-15_13-53-56.png" alt="new" width="400"/><br>
</p>
<a href="https://trendshift.io/repositories/13425" target="_blank"><img src="https://trendshift.io/api/badge/repositories/13425" alt="yeongpin%2Fcursor-free-vip | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
<br>
<a href="https://www.buymeacoffee.com/yeongpin" target="_blank">
<img src="https://img.buymeacoffee.com/button-api/?text=buy me a coffee&emoji=☕&slug=yeongpin&button_colour=ffda33&font_colour=000000&font_family=Bree&outline_colour=000000&coffee_colour=FFDD00&latest=2" width="160" height='55' alt="Buy Me a Coffee"/>
</a>
<h4>Support Latest 0.49.x Version | 支持最新 0.49.x 版本</h4>
This tool is for educational purposes, currently the repo does not violate any laws. Please support the original project.
This tool will not generate any fake email accounts and OAuth access.
Supports Windows, macOS and Linux.
For optimal performance, run with privileges and always stay up to date.
這是一款用於學習和研究的工具,目前 repo 沒有違反任何法律。請支持原作者。
這款工具不會生成任何假的電子郵件帳戶和 OAuth 訪問。
支持 Windows、macOS 和 Linux。
對於最佳性能,請以管理員身份運行並始終保持最新。
<p align="center">
<img src="./images/free_2025-01-14_14-59-15.png" alt="free" width="400"/><br>
<img src="./images/product_2025-04-16_10-40-21.png" alt="new" width="800" style="border-radius: 6px;"/><br>
</p>
##### ⚠️ Google Recaptcha need to be manually verified, don't be lazy, move your fingers, verify it, otherwise it will keep prompting you to verify ⚠️
##### If you dont have google chrome , you can download it from [here](https://www.google.com/intl/en_pk/chrome/)
##### ⚠️ 郵箱驗證 需要手動驗證,不要那麼懶,動一動手指,驗證一下,不然會一直提示你驗證 ⚠️
##### 如果沒有Google Chrome可以從[這裡](https://www.google.com/intl/en_pk/chrome/)下載
</p>
</div>
## 🔄 Change Log | 更新日志
## 🔄 更新日志
<details open>
<summary>v1.1.01</summary>
<p align="center">
<img src="./images/cloudflare_2025-02-12_13-43-21.png" alt="free" width="400"/><br>
</p>
1. Hot Fix Cursor Cloudflare Problem | 修復Cursor Cloudflare問題
2. Fix Cursor Cloudflare Human Verification Problem | 修復Cursor Cloudflare人機驗證問題
3. Remake signup logic | 重做註冊邏輯
</details>
<details>
<summary>Other Version Change Log</summary>
<details>
<summary>v1.0.10</summary>
1. Hot Fix Mac Chrome Problem | 修復Mac Chrome問題
2. Fix Linux Start Donet Problem | 修復Linux啟動開發者問題
</details>
<details>
<summary>v1.0.9</summary>
<p align="center">
<img src="./images/cloudflare_2025-02-12_13-43-21.png.png" alt="free" width="400"/><br>
</p>
1. Fixed New 0.45.x Version Reset Machine | 修復新0.45版本重置機器
2. Fix Locale Language | 修復多語言
3. Add Support Crypto Machine Regedit | 增加支持加密機器註冊
4. Add Remake main.js | 重做main.js
</details>
<details>
<summary>v1.0.8</summary>
1. Fix New 0.45 Version Reset Machine | 修復新0.45版本重置機器
2. Fix Locale Language | 修復多語言
3. Add Support Crypto Machine Regedit | 增加支持加密機器註冊
</details>
<details>
<summary>v1.0.7 - HotFix</summary>
1. Fix Reset Machine | 修復重置機器
2. Fix Locale Language | 修復多語言
</details>
<details>
<summary>v1.0.7</summary>
1. Add Locale Language Support | 增加多語言支持
<p align="center">
<img src="./images/locale_2025-01-15_13-40-08.png" alt="locale" width="400"/><br>
</p>
</details>
<details>
<summary>v1.0.6</summary>
1. Add Quit Cursor Option | 增加退出Cursor選項
2. Add Recaptcha Path Patch | 增加Recaptcha路徑修復
3. Fix Admin Permission | 修復管理員權限問題
4. Remove all need admin permission | 移除所有需要管理員權限
</details>
<details>
<summary>v1.0.5 - HotFix</summary>
1. Fix: Mac Browser Control | 修復Mac瀏覽器控制問題
2. Fix: Verification Code Cant Patch | 修復驗證碼無法修復問題
3. Add Linux Support | 增加Linux支持
<p align="center">
<img src="./images/fix_2025-01-14_21-30-43.png" alt="fix" width="400"/><br>
</p>
</details>
<details>
<summary>v1.0.5</summary>
1. Remove MachineID | 移除機器碼ID
2. Change to automatic registration account | 全面改為自動註冊賬號
3. Use your own exclusive new account | 使用自己獨享的新賬號
4. Fully automatic reset machine configuration | 全面自動化重置機器配置
<p align="center">
<img src="./images/pro_2025-01-14_14-40-37.png" alt="Why" width="400"/><br>
</p>
</details>
<details>
<summary>v1.0.4</summary>
1. Fix: Cursor's configuration | 修復Cursor的配置問題
2. Fix Cloud Lame | 修復雲端慢速模式
</details>
<details>
<summary>v1.0.3</summary>
1. Fix: Cursor's configuration | 修復Cursor的配置問題
2. Add Manual Reset Machine | 增加手動重置機器
3. Add CDN Cloud Control WatchDog | 增加CDN雲端控制WatchDog
4. Add Mac OS Support | 增加Mac OS支持
5. 759 ++ People use , but star only a few | 759 ++人使用,但只有幾個人點贊
<p align="center">
<img src="./images/what_2025-01-13_13-32-54.png" alt="Why" width="400"/><br>
</p>
</details>
<details>
<summary>v1.0.2</summary>
1. Fix: Some known issues | 修復了一些已知問題
2. Add cloud control device code | 增加雲端控制設備碼
3. Cloud reset device code | 雲端重置設備碼
4. Remove official WatchDog monitoring | 移除官方WatchDog監控
5. Remove Proxy official prompt | 移除Proxy 官方提示
6. Fix: Too Many Computer | 修復Too Many Computer 問題
7. Fix Billing Issue | 修復計費問題
8. Fix: Cursor's configuration | 修復Cursor的配置問題
9. Fix cursor-slow mode | 修復cursor-slow模式
</details>
<details>
<summary>v1.0.1</summary>
1. Fix: Reset machine ID | 修復了重置機器ID的問題
2. Fix: Bypass membership check | 修復了 繞過會員檢查的問題
3. Fix: Auto upgrade to "pro" membership | 修復了 自動升級為pro會員的問題
4. Fix: Real-time send Token request | 修復了 實時發送Token請求的問題
5. Fix: Reset Cursor's configuration | 修復了 重置Cursor的配置的問題
</details>
<details>
<summary>v1.0</summary>
1. Preview Image | 預覽圖<br>
<p align="center">
<img src="./images/pro_2025-01-11_00-50-40.png" alt="Cursor Pro Logo" width="400"/><br>
</p>
<p align="center">
<img src="./images/pro_2025-01-11_00-51-07.png" alt="Cursor Pro Logo" width="400"/><br>
</p>
2. Add usage period,but can be contacted by leaving MachineID | 不得已才添加但可以通過留下MachineID 聯繫作者
<br>
<p align="center">
<img src="./images/pro_2025-01-11_16-24-03.png" alt="Cursor Pro Logo" width="400"/><br>
</p>
</details>
</details>
[Watch Change Log | 查看更新日志](CHANGELOG.md)
## ✨ Features | 功能特點
* Automatically register Cursor membership<br>自動註冊Cursor會員<br>
* Support Windows macOS and Linux systems<br>支持 Windows、macOS 和 Linux 系統<br>
* Except for Google verification code<br>除了Google驗證碼<br>
* Support Windows and macOS systems<br>支持 Windows 和 macOS 系統<br>
* Complete Auth verification<br>完成Auth驗證<br>
* Reset Cursor's configuration<br>重置Cursor的配置<br>
* Reset Cursor's configuration<br>重置 Cursor 的配置<br>
* Multi-language support (English, 简体中文, 繁體中文, Vietnamese)<br>多語言支持(英文、简体中文、繁體中文、越南語)<br>
## 💻 System Support | 系統支持
|Windows|x64|✅|macOS|Intel|✅|
|:---:|:---:|:---:|:---:|:---:|:---:|
|Windows|x86|✅|macOS|Apple Silicon|✅|
|Linux|x64|✅|Linux|x86|✅|
|Linux|ARM64|✅|Linux|ARM64|✅|
| Operating System | Architecture | Supported |
|------------------|-------------------|-----------|
| Windows | x64, x86 | ✅ |
| macOS | Intel, Apple Silicon | ✅ |
| Linux | x64, x86, ARM64 | ✅ |
## 👀 How to use | 如何使用
<details open>
<summary><b>⭐ Auto Run Script | 腳本自動化運行</b></summary>
**Linux/macOS**
### **Linux/macOS**
```bash
curl -fsSL https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/scripts/install.sh -o install.sh && chmod +x install.sh && ./install.sh
```
**Windows**
### **Archlinux**
Install via [AUR](https://aur.archlinux.org/packages/cursor-free-vip-git)
```bash
yay -S cursor-free-vip-git
```
### **Windows**
```powershell
irm https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/scripts/install.ps1 | iex
```
</details>
<details>
<summary><b>⭐ Manual Reset Machine | 手動運行重置機器</b></summary>
**Linux/macOS**
```bash
curl -fsSL https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/scripts/reset.sh | sudo bash
```
**Windows**
```powershell
irm https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/scripts/reset.ps1 | iex
```
</details>
2. If you want to stop the script, please press Ctrl+C<br>要停止腳本,請按 Ctrl+C
If you want to stop the script, please press Ctrl+C<br>要停止腳本,請按 Ctrl+C
## ❗ Note | 注意事項
📝 Config | 文件配置
`Win / Macos / Linux Path | 路徑 [Documents/.cursor-free-vip/config.ini]`
<details>
<summary><b>⭐ Config | 文件配置</b></summary>
```
[Chrome]
# Default Google Chrome Path | 默認Google Chrome 遊覽器路徑
chromepath = C:\Program Files\Google/Chrome/Application/chrome.exe
[Turnstile]
# Handle Turnstile Wait Time | 等待人機驗證時間
handle_turnstile_time = 2
# Handle Turnstile Wait Random Time (must merge 1-3 or 1,3) | 等待人機驗證隨機時間(必須是 1-3 或者 1,3 這樣的組合)
handle_turnstile_random_time = 1-3
[OSPaths]
# Storage Path | 存儲路徑
storage_path = /Users/username/Library/Application Support/Cursor/User/globalStorage/storage.json
# SQLite Path | SQLite路徑
sqlite_path = /Users/username/Library/Application Support/Cursor/User/globalStorage/state.vscdb
# Machine ID Path | 機器ID路徑
machine_id_path = /Users/username/Library/Application Support/Cursor/machineId
# For Linux users: ~/.config/cursor/machineid
[Timing]
# Min Random Time | 最小隨機時間
min_random_time = 0.1
# Max Random Time | 最大隨機時間
max_random_time = 0.8
# Page Load Wait | 頁面加載等待時間
page_load_wait = 0.1-0.8
# Input Wait | 輸入等待時間
input_wait = 0.3-0.8
# Submit Wait | 提交等待時間
submit_wait = 0.5-1.5
# Verification Code Input | 驗證碼輸入等待時間
verification_code_input = 0.1-0.3
# Verification Success Wait | 驗證成功等待時間
verification_success_wait = 2-3
# Verification Retry Wait | 驗證重試等待時間
verification_retry_wait = 2-3
# Email Check Initial Wait | 郵件檢查初始等待時間
email_check_initial_wait = 4-6
# Email Refresh Wait | 郵件刷新等待時間
email_refresh_wait = 2-4
# Settings Page Load Wait | 設置頁面加載等待時間
settings_page_load_wait = 1-2
# Failed Retry Time | 失敗重試時間
failed_retry_time = 0.5-1
# Retry Interval | 重試間隔
retry_interval = 8-12
# Max Timeout | 最大超時時間
max_timeout = 160
[Utils]
# Check Update | 檢查更新
check_update = True
# Show Account Info | 顯示賬號信息
show_account_info = True
[TempMailPlus]
# Enable TempMailPlus | 啓用 TempMailPlus任何轉發到TempMailPlus的郵件都支持獲取驗證碼例如cloudflare郵件Catch-all
enabled = false
# TempMailPlus Email | TempMailPlus 電子郵件
email = xxxxx@mailto.plus
# TempMailPlus pin | TempMailPlus pin碼
epin =
[WindowsPaths]
storage_path = C:\Users\yeongpin\AppData\Roaming\Cursor\User\globalStorage\storage.json
sqlite_path = C:\Users\yeongpin\AppData\Roaming\Cursor\User\globalStorage\state.vscdb
machine_id_path = C:\Users\yeongpin\AppData\Roaming\Cursor\machineId
cursor_path = C:\Users\yeongpin\AppData\Local\Programs\Cursor\resources\app
updater_path = C:\Users\yeongpin\AppData\Local\cursor-updater
update_yml_path = C:\Users\yeongpin\AppData\Local\Programs\Cursor\resources\app-update.yml
product_json_path = C:\Users\yeongpin\AppData\Local\Programs\Cursor\resources\app\product.json
[Browser]
default_browser = opera
chrome_path = C:\Program Files\Google\Chrome\Application\chrome.exe
edge_path = C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
firefox_path = C:\Program Files\Mozilla Firefox\firefox.exe
brave_path = C:\Program Files\BraveSoftware/Brave-Browser/Application/brave.exe
chrome_driver_path = D:\VisualCode\cursor-free-vip-new\drivers\chromedriver.exe
edge_driver_path = D:\VisualCode\cursor-free-vip-new\drivers\msedgedriver.exe
firefox_driver_path = D:\VisualCode\cursor-free-vip-new\drivers\geckodriver.exe
brave_driver_path = D:\VisualCode\cursor-free-vip-new\drivers\chromedriver.exe
opera_path = C:\Users\yeongpin\AppData\Local\Programs\Opera\opera.exe
opera_driver_path = D:\VisualCode\cursor-free-vip-new\drivers\chromedriver.exe
[OAuth]
show_selection_alert = False
timeout = 120
max_attempts = 3
```
</details>
* Use administrator privileges to run the script <br>請使用管理員身份運行腳本
* Confirm that Cursor is closed before running the script <br>請確保在運行腳本前已經關閉 Cursor<br>
* This tool is only for learning and research purposes <br>此工具僅供學習和研究使用<br>
* Please comply with the relevant software usage terms when using this tool <br>使用本工具時請遵守相關軟件使用條款
## 🚨 Common Issues | 常見問題
|如果遇到權限問題,請確保:|If you encounter permission issues, please ensure:|
|:---:|:---:|
| 此腳本以管理員身份運行 | This script is run with administrator privileges |
| 如果遇到權限問題,請確保: | 此腳本以管理員身份運行 |
|:--------------------------------------------------:|:------------------------------------------------:|
| If you encounter permission issues, please ensure: | This script is run with administrator privileges |
| 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
<a href="https://github.com/yeongpin/cursor-free-vip/graphs/contributors">
<img src="https://contrib.rocks/image?repo=yeongpin/cursor-free-vip&preview=true&max=&columns=" />
</a>
<br /><br />
## 📩 Disclaimer | 免責聲明
本工具僅供學習和研究使用,使用本工具所產生的任何後果由使用者自行承擔。 <br>
源代碼靈感來之 | Original code inspiration from [Here](https://github.com/hmhm2022/gpt-cursor-auto)
This tool is only for learning and research purposes, and any consequences arising from the use of this tool are borne
by the user.
This tool is only for learning and research purposes, and any consequences arising from the use of this tool are borne by the user.
## 💰 Buy Me a Coffee | 請我喝杯咖啡
<div align="center">
<table>
<tr>
<td>
<img src="./images/provi-code.jpg" alt="buy_me_a_coffee" width="280"/><br>
</td>
<td>
<img src="./images/paypal.png" alt="buy_me_a_coffee" width="280"/><br>
</td>
</tr>
</table>
</div>
## ⭐ Star History | 星星數
<div align="center">
[![Star History Chart](https://api.star-history.com/svg?repos=yeongpin/cursor-free-vip&type=Date)](https://star-history.com/#yeongpin/cursor-free-vip&Date)
</div>
## 📝 License | 授權
本項目採用 [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/) 授權。
Please refer to the [LICENSE](LICENSE.md) file for details.

97
account_manager.py Normal file
View File

@ -0,0 +1,97 @@
import os
from colorama import Fore, Style
import re
# Define emoji constants
EMOJI = {
'SUCCESS': '',
'ERROR': '',
'INFO': ''
}
class AccountManager:
def __init__(self, translator=None):
self.translator = translator
self.accounts_file = 'cursor_accounts.txt'
def save_account_info(self, email, password, token, total_usage):
"""Save account information to file"""
try:
with open(self.accounts_file, 'a', encoding='utf-8') as f:
f.write(f"\n{'='*50}\n")
f.write(f"Email: {email}\n")
f.write(f"Password: {password}\n")
f.write(f"Token: {token}\n")
f.write(f"Usage Limit: {total_usage}\n")
f.write(f"{'='*50}\n")
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('register.account_info_saved') if self.translator else 'Account information saved'}...{Style.RESET_ALL}")
return True
except Exception as e:
error_msg = self.translator.get('register.save_account_info_failed', error=str(e)) if self.translator else f'Failed to save account information: {str(e)}'
print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}")
return False
def get_last_email_domain(self):
"""Get the domain from the last used email"""
try:
if not os.path.exists(self.accounts_file):
return None
# Only read the last 1KB of data from the file
with open(self.accounts_file, 'rb') as f:
# Get file size
f.seek(0, os.SEEK_END)
file_size = f.tell()
if file_size == 0:
return None
# Determine the number of bytes to read, maximum 1KB
read_size = min(1024, file_size)
# Move to the appropriate position to start reading
f.seek(file_size - read_size)
# Read the end data
data = f.read(read_size).decode('utf-8', errors='ignore')
# Split by lines and search in reverse
lines = data.split('\n')
for line in reversed(lines):
if line.strip().startswith('Email:'):
email = line.split('Email:')[1].strip()
# Extract domain part (after @)
if '@' in email:
return email.split('@')[1]
return None
# If no email is found in the last 1KB
return None
except Exception as e:
error_msg = self.translator.get('account.get_last_email_domain_failed', error=str(e)) if self.translator else f'Failed to get the last used email domain: {str(e)}'
print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}")
return None
def suggest_email(self, first_name, last_name):
"""Generate a suggested email based on first and last name with the last used domain"""
try:
# Get the last used email domain
domain = self.get_last_email_domain()
if not domain:
return None
# Generate email prefix from first and last name (lowercase)
email_prefix = f"{first_name.lower()}.{last_name.lower()}"
# Combine prefix and domain
suggested_email = f"{email_prefix}@{domain}"
return suggested_email
except Exception as e:
error_msg = self.translator.get('account.suggest_email_failed', error=str(e)) if self.translator else f'Failed to suggest email: {str(e)}'
print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}")
return None

View File

@ -1,5 +0,0 @@
fr.nf
yopmail.com
1s.fr
xl.cx
fr.cr

134
block_domain.txt Normal file
View File

@ -0,0 +1,134 @@
0-mail.com
10minemail.com
1secmail.com
20minutemail.com
2925.com
2prong.com
33mail.com
abusemail.de
afrobacon.com
anonbox.net
anonymbox.com
antichef.com
bareed.ws
begemail.com
boun.cr
brefmail.com
burnermail.io
byom.de
chammy.info
cloud-mail.top
cocovpn.com
cool.fr.nf
corhash.net
crazymailing.com
cuvox.de
dayrep.com
deadaddress.com
discard.email
dispostable.com
drewzen.com
dudmail.com
dugmail.com
emailondeck.com
emailtemporario.com.br
ephemail.net
fakeinbox.com
fakeinbox.org
fakemailgenerator.com
famamail.com
fastmailbox.net
filzmail.com
fizmail.com
getairmail.com
getnada.com
givmail.com
guerrillamail.com
gustr.com
harakirimail.com
hottempmail.com
ikomail.com
inboxbear.com
inboxkitten.com
incognitomail.org
indigobook.com
jetable.org
kaspop.com
letthemeatspam.com
linshiyouxiang.net
luxusmail.org
mail-temp.com
mail1a.de
mailbucket.org
mailcatch.com
maildrop.cc
mailexpire.com
mailhazard.com
mailimate.com
mailin8r.com
mailinator.com
mailme.lv
mailnesia.com
mailnull.com
mailpull.com
mailsac.com
mailshou.com
mailtemp.net
mailzilla.org
meltmail.com
mintemail.com
moakt.com
mohmal.com
my10minutemail.com
mycleaninbox.net
mytrashmail.com
no-spam.ws
nomail.pw
nospamfor.us
notmailinator.com
nowmymail.com
oakon.com
objectmail.com
ofanda.com
openmailbox.org
owlpic.com
pastryofistanbul.com
privacyroot.com
pusmail.com
questtechsystems.com
raleigh-construction.com
rcpt.at
safemail.link
sendspamhere.com
sharklasers.com
shortmail.net
solerbe.net
spam4.me
spamavert.com
spambog.com
spamdecoy.net
spamex.com
spamfree24.org
spamgourmet.com
spamhereplease.com
spaml.com
spamslicer.com
spamsphere.com
spamtroll.net
teihu.com
temp-mail.org
tempmail.net
tempmailaddress.com
temporaryemail.net
throwawayemail.com
tmail.ws
trash-mail.com
trash2009.com
trashdevil.com
trashmail.com
trashmail.de
trbvn.com
wegwerfadresse.org
yepmail.net
yopmail.com
zippymail.info

View File

@ -1,143 +0,0 @@
from DrissionPage import ChromiumOptions, ChromiumPage
import sys
import os
import logging
import random
class BrowserManager:
def __init__(self, noheader=False):
self.browser = None
self.noheader = noheader
def init_browser(self):
"""初始化浏览器"""
co = self._get_browser_options()
# 如果设置了 noheader添加相应的参数
if self.noheader:
co.set_argument('--headless=new')
self.browser = ChromiumPage(co)
return self.browser
def _get_browser_options(self):
"""获取浏览器配置"""
co = ChromiumOptions()
try:
extension_path = self._get_extension_path()
co.add_extension(extension_path)
co.set_argument("--allow-extensions-in-incognito")
extension_block_path = self.get_extension_block()
co.add_extension(extension_block_path)
co.set_argument("--allow-extensions-in-incognito")
extension_recaptcha_path = self.get_extension_recaptcha()
co.add_extension(extension_recaptcha_path)
co.set_argument("--allow-extensions-in-incognito")
except FileNotFoundError as e:
logging.warning(f"警告: {e}")
# 设置更真实的用户代理
co.set_user_agent(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
)
# 基本设置
co.set_pref("credentials_enable_service", False)
co.set_pref("profile.password_manager_enabled", False)
# 禁用自动化标志
co.set_pref("useAutomationExtension", False)
co.set_pref("excludeSwitches", ["enable-automation"])
# WebGL 和 GPU 设置
co.set_pref("webgl.disabled", False)
co.set_pref("webgl.enable_webgl2", True)
# 设置语言和地区
co.set_pref("intl.accept_languages", "en-US,en")
# 基本命令行参数
co.set_argument("--disable-blink-features=AutomationControlled")
co.set_argument("--hide-crash-restore-bubble")
co.set_argument("--no-first-run")
co.set_argument("--no-default-browser-check")
co.set_argument("--disable-popup-blocking")
# 性能和稳定性参数
co.set_argument("--disable-dev-shm-usage")
co.set_argument("--disable-gpu")
co.set_argument("--no-sandbox")
co.set_argument("--ignore-certificate-errors")
# WebGL 相关参数
co.set_argument("--use-gl=swiftshader")
co.set_argument("--enable-webgl")
# 随机端口
co.auto_port()
# 系统特定设置
if sys.platform == "darwin": # macOS
co.set_argument("--disable-gpu")
co.set_argument("--no-sandbox")
elif sys.platform == "win32": # Windows
co.set_argument("--disable-software-rasterizer")
# 设置窗口大小
window_width = random.randint(1024, 1920)
window_height = random.randint(768, 1080)
co.set_argument(f"--window-size={window_width},{window_height}")
return co
def _get_extension_path(self):
"""获取插件路径"""
root_dir = os.getcwd()
extension_path = os.path.join(root_dir, "turnstilePatch")
if hasattr(sys, "_MEIPASS"):
extension_path = os.path.join(sys._MEIPASS, "turnstilePatch")
if not os.path.exists(extension_path):
raise FileNotFoundError(f"插件不存在: {extension_path}")
return extension_path
def get_extension_block(self):
"""获取插件路径"""
root_dir = os.getcwd()
extension_path = os.path.join(root_dir, "uBlock0.chromium")
if hasattr(sys, "_MEIPASS"):
extension_path = os.path.join(sys._MEIPASS, "uBlock0.chromium")
if not os.path.exists(extension_path):
raise FileNotFoundError(f"插件不存在: {extension_path}")
return extension_path
def get_extension_recaptcha(self):
"""获取插件路径"""
root_dir = os.getcwd()
extension_path = os.path.join(root_dir, "recaptchaPatch")
if hasattr(sys, "_MEIPASS"):
extension_path = os.path.join(sys._MEIPASS, "recaptchaPatch")
if not os.path.exists(extension_path):
raise FileNotFoundError(f"插件不存在: {extension_path}")
return extension_path
def quit(self):
"""关闭浏览器"""
if self.browser:
try:
self.browser.quit()
except:
pass

View File

@ -2,28 +2,28 @@
chcp 65001 > nul
cls
:: 檢查是否以管理員權限運行
:: Check if running with administrator privileges
net session >nul 2>&1
if %errorLevel% == 0 (
:: 如果是管理員權限,只創建虛擬環境後就降權運行
:: If running with administrator privileges, create virtual environment and then run with normal user privileges
if not exist venv (
echo 正在創建虛擬環境...
python -m venv venv
)
:: 降權運行剩餘的步驟
:: Run remaining steps with normal user privileges
echo 以普通用戶權限繼續...
powershell -Command "Start-Process -FilePath '%comspec%' -ArgumentList '/c cd /d %cd% && %~f0 run' -Verb RunAs:NO"
exit /b
) else (
:: 檢查是否是第二階段運行
:: Check if running in second stage
if "%1"=="run" (
goto RUN_BUILD
) else (
:: 如果是普通權限且需要創建虛擬環境,請求管理員權限
:: If running with normal privileges and creating virtual environment is required, request administrator privileges
if not exist venv (
echo ⚠️ 需要管理員權限來創建虛擬環境
echo 正在請求管理員權限...
echo ⚠️ Requires administrator privileges to create virtual environment
echo Requesting administrator privileges...
powershell -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c cd /d %cd% && %~f0'"
exit /b
) else (
@ -33,30 +33,30 @@ if %errorLevel% == 0 (
)
:RUN_BUILD
echo 啟動虛擬環境...
echo Starting virtual environment...
call venv\Scripts\activate.bat
if errorlevel 1 (
echo啟動虛擬環境失敗
echoFailed to start virtual environment
pause
exit /b 1
)
:: 檢查並安裝缺失的依賴
echo 檢查依賴...
:: Check and install missing dependencies
echo Checking dependencies...
for /f "tokens=1" %%i in (requirements.txt) do (
pip show %%i >nul 2>&1 || (
echo 安裝 %%i...
echo Installing %%i...
pip install %%i
)
)
echo 開始構建...
echo Starting build...
python build.py
if errorlevel 1 (
echo構建失敗
echoBuild failed
pause
exit /b 1
)
echo完成!
echoCompleted!
pause

View File

@ -8,7 +8,7 @@ import shutil
from logo import print_logo
from dotenv import load_dotenv
# 忽略特定警告
# Ignore specific warnings
warnings.filterwarnings("ignore", category=SyntaxWarning)
class LoadingAnimation:
@ -50,21 +50,21 @@ def simulate_progress(message, duration=1.0, steps=20):
progress_bar(i, steps, prefix="Progress:", length=40)
def build():
# 清理屏幕
# Clean screen
os.system("cls" if platform.system().lower() == "windows" else "clear")
# 顯示 logo
# Display logo
print_logo()
# 清理 PyInstaller 緩存
print("\033[93m🧹 清理構建緩存...\033[0m")
# Clean PyInstaller cache
print("\033[93m🧹 Cleaning build cache...\033[0m")
if os.path.exists('build'):
shutil.rmtree('build')
# 重新加載環境變量以確保獲取最新版本
# Reload environment variables to ensure getting the latest version
load_dotenv(override=True)
version = os.getenv('VERSION', '1.0.0')
print(f"\033[93m📦 正在構建版本: v{version}\033[0m")
print(f"\033[93m📦 Building version: v{version}\033[0m")
try:
simulate_progress("Preparing build environment...", 0.5)
@ -72,7 +72,7 @@ def build():
loading = LoadingAnimation()
loading.start("Building in progress")
# 根据系统类型设置输出名称
# Set output name based on system type
system = platform.system().lower()
if system == "windows":
os_type = "windows"
@ -86,7 +86,7 @@ def build():
output_name = f"CursorFreeVIP_{version}_{os_type}"
# 构建命令
# Build command
build_command = f'pyinstaller --clean --noconfirm build.spec'
output_path = os.path.join('dist', f'{output_name}{ext}')
@ -95,16 +95,16 @@ def build():
loading.stop()
if os.path.exists(output_path):
print(f"\n\033[92m✅ 構建完成!")
print(f"📦 可執行文件位於: {output_path}\033[0m")
print(f"\n\033[92m✅ Build completed!")
print(f"📦 Executable file located: {output_path}\033[0m")
else:
print("\n\033[91m❌ 構建失敗:未找到輸出文件\033[0m")
print("\n\033[91m❌ Build failed: Output file not found\033[0m")
return False
except Exception as e:
if loading:
loading.stop()
print(f"\n\033[91m❌ 構建過程出錯: {str(e)}\033[0m")
print(f"\n\033[91m❌ Build process error: {str(e)}\033[0m")
return False
return True

20
build.sh Normal file → Executable file
View File

@ -8,7 +8,7 @@ NC='\033[0m' # No Color
# 检查并安装必要的依赖
check_dependencies() {
echo -e "${YELLOW}检查系统依赖...${NC}"
echo -e "${YELLOW}Checking system dependencies...${NC}"
# 检查是否为 Ubuntu/Debian
if [ -f /etc/debian_version ]; then
@ -16,42 +16,42 @@ check_dependencies() {
PACKAGES="python3 python3-pip python3-venv"
for pkg in $PACKAGES; do
if ! dpkg -l | grep -q "^ii $pkg "; then
echo -e "${YELLOW}安装 $pkg...${NC}"
echo -e "${YELLOW}Installing $pkg...${NC}"
sudo apt-get update
sudo apt-get install -y $pkg
fi
done
else
echo -e "${RED}不支持的系统,请手动安装 python3, pip3 和 python3-venv${NC}"
echo -e "${RED}Unsupported system, please install python3, pip3 and python3-venv manually${NC}"
exit 1
fi
}
# 创建并激活虚拟环境
setup_venv() {
echo -e "${GREEN}正在创建虚拟环境...${NC}"
echo -e "${GREEN}Creating virtual environment...${NC}"
python3 -m venv venv
echo -e "${GREEN}启动虚拟环境...${NC}"
echo -e "${GREEN}Starting virtual environment...${NC}"
. ./venv/bin/activate || source ./venv/bin/activate
}
# 安装依赖
install_dependencies() {
echo -e "${GREEN}安装依赖...${NC}"
echo -e "${GREEN}Installing dependencies...${NC}"
python3 -m pip install --upgrade pip
pip3 install -r requirements.txt
}
# 构建程序
build_program() {
echo -e "${GREEN}开始构建...${NC}"
echo -e "${GREEN}Starting build...${NC}"
python3 build.py
}
# 清理
cleanup() {
echo -e "${GREEN}清理虚拟环境...${NC}"
echo -e "${GREEN}Cleaning virtual environment...${NC}"
deactivate 2>/dev/null || true
rm -rf venv
}
@ -73,8 +73,8 @@ main() {
# 清理
cleanup
echo -e "${GREEN}完成!${NC}"
echo "按任意键退出..."
echo -e "${GREEN}Completed!${NC}"
echo "Press any key to exit..."
# 使用兼容的方式读取输入
if [ "$(uname)" = "Linux" ]; then
read dummy

View File

@ -23,23 +23,14 @@ a = Analysis(
pathex=[],
binaries=[],
datas=[
('turnstilePatch', 'turnstilePatch'),
('recaptchaPatch', 'recaptchaPatch'),
('uBlock0.chromium', 'uBlock0.chromium'),
('locales', 'locales'),
('cursor_auth.py', '.'),
('reset_machine_manual.py', '.'),
('cursor_register.py', '.'),
('browser.py', '.'),
('control.py', '.'),
('.env', '.'),
('blacklist.txt', '.')
('quit_cursor.py', '.'),
('utils.py', '.'),
('.env', '.')
],
hiddenimports=[
'cursor_auth',
'reset_machine_manual',
'browser',
'control'
'quit_cursor',
'utils'
],
hookspath=[],
hooksconfig={},
@ -62,7 +53,7 @@ exe = EXE(
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx=False,
upx_exclude=[],
runtime_tmpdir=None,
console=True,

201
bypass_token_limit.py Normal file
View File

@ -0,0 +1,201 @@
import os
import shutil
import platform
import tempfile
import glob
from colorama import Fore, Style, init
import configparser
import sys
from config import get_config
from datetime import datetime
# Initialize colorama
init()
# Define emoji constants
EMOJI = {
"FILE": "📄",
"BACKUP": "💾",
"SUCCESS": "",
"ERROR": "",
"INFO": "",
"RESET": "🔄",
"WARNING": "⚠️",
}
def get_user_documents_path():
"""Get user Documents folder path"""
if sys.platform == "win32":
try:
import winreg
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders") as key:
documents_path, _ = winreg.QueryValueEx(key, "Personal")
return documents_path
except Exception as e:
# fallback
return os.path.join(os.path.expanduser("~"), "Documents")
elif sys.platform == "darwin":
return os.path.join(os.path.expanduser("~"), "Documents")
else: # Linux
# Get actual user's home directory
sudo_user = os.environ.get('SUDO_USER')
if sudo_user:
return os.path.join("/home", sudo_user, "Documents")
return os.path.join(os.path.expanduser("~"), "Documents")
def get_workbench_cursor_path(translator=None) -> str:
"""Get Cursor workbench.desktop.main.js path"""
system = platform.system()
# Read configuration
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if os.path.exists(config_file):
config.read(config_file)
paths_map = {
"Darwin": { # macOS
"base": "/Applications/Cursor.app/Contents/Resources/app",
"main": "out/vs/workbench/workbench.desktop.main.js"
},
"Windows": {
"main": "out\\vs\\workbench\\workbench.desktop.main.js"
},
"Linux": {
"bases": ["/opt/Cursor/resources/app", "/usr/share/cursor/resources/app", "/usr/lib/cursor/app/"],
"main": "out/vs/workbench/workbench.desktop.main.js"
}
}
if system == "Linux":
# Add extracted AppImage with correct usr structure
extracted_usr_paths = glob.glob(os.path.expanduser("~/squashfs-root/usr/share/cursor/resources/app"))
paths_map["Linux"]["bases"].extend(extracted_usr_paths)
if system not in paths_map:
raise OSError(translator.get('reset.unsupported_os', system=system) if translator else f"不支持的操作系统: {system}")
if system == "Linux":
for base in paths_map["Linux"]["bases"]:
main_path = os.path.join(base, paths_map["Linux"]["main"])
print(f"{Fore.CYAN}{EMOJI['INFO']} Checking path: {main_path}{Style.RESET_ALL}")
if os.path.exists(main_path):
return main_path
if system == "Windows":
base_path = config.get('WindowsPaths', 'cursor_path')
elif system == "Darwin":
base_path = paths_map[system]["base"]
if config.has_section('MacPaths') and config.has_option('MacPaths', 'cursor_path'):
base_path = config.get('MacPaths', 'cursor_path')
else: # Linux
# For Linux, we've already checked all bases in the loop above
# If we're here, it means none of the bases worked, so we'll use the first one
base_path = paths_map[system]["bases"][0]
if config.has_section('LinuxPaths') and config.has_option('LinuxPaths', 'cursor_path'):
base_path = config.get('LinuxPaths', 'cursor_path')
main_path = os.path.join(base_path, paths_map[system]["main"])
if not os.path.exists(main_path):
raise OSError(translator.get('reset.file_not_found', path=main_path) if translator else f"未找到 Cursor main.js 文件: {main_path}")
return main_path
def modify_workbench_js(file_path: str, translator=None) -> bool:
"""
Modify file content
"""
try:
# Save original file permissions
original_stat = os.stat(file_path)
original_mode = original_stat.st_mode
original_uid = original_stat.st_uid
original_gid = original_stat.st_gid
# Create temporary file
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", errors="ignore", delete=False) as tmp_file:
# Read original content
with open(file_path, "r", encoding="utf-8", errors="ignore") as main_file:
content = main_file.read()
patterns = {
# 通用按钮替换模式
r'B(k,D(Ln,{title:"Upgrade to Pro",size:"small",get codicon(){return A.rocket},get onClick(){return t.pay}}),null)': r'B(k,D(Ln,{title:"yeongpin GitHub",size:"small",get codicon(){return A.github},get onClick(){return function(){window.open("https://github.com/yeongpin/cursor-free-vip","_blank")}}}),null)',
# Windows/Linux
r'M(x,I(as,{title:"Upgrade to Pro",size:"small",get codicon(){return $.rocket},get onClick(){return t.pay}}),null)': r'M(x,I(as,{title:"yeongpin GitHub",size:"small",get codicon(){return $.github},get onClick(){return function(){window.open("https://github.com/yeongpin/cursor-free-vip","_blank")}}}),null)',
# Mac 通用按钮替换模式
r'$(k,E(Ks,{title:"Upgrade to Pro",size:"small",get codicon(){return F.rocket},get onClick(){return t.pay}}),null)': r'$(k,E(Ks,{title:"yeongpin GitHub",size:"small",get codicon(){return F.rocket},get onClick(){return function(){window.open("https://github.com/yeongpin/cursor-free-vip","_blank")}}}),null)',
# Badge 替换
r'<div>Pro Trial': r'<div>Pro',
r'py-1">Auto-select': r'py-1">Bypass-Version-Pin',
#
r'async getEffectiveTokenLimit(e){const n=e.modelName;if(!n)return 2e5;':r'async getEffectiveTokenLimit(e){return 9000000;const n=e.modelName;if(!n)return 9e5;',
# Pro
r'var DWr=ne("<div class=settings__item_description>You are currently signed in with <strong></strong>.");': r'var DWr=ne("<div class=settings__item_description>You are currently signed in with <strong></strong>. <h1>Pro</h1>");',
# Toast 替换
r'notifications-toasts': r'notifications-toasts hidden'
}
# 使用patterns进行替换
for old_pattern, new_pattern in patterns.items():
content = content.replace(old_pattern, new_pattern)
# Write to temporary file
tmp_file.write(content)
tmp_path = tmp_file.name
# Backup original file with timestamp
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{file_path}.backup.{timestamp}"
shutil.copy2(file_path, backup_path)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.backup_created', path=backup_path)}{Style.RESET_ALL}")
# Move temporary file to original position
if os.path.exists(file_path):
os.remove(file_path)
shutil.move(tmp_path, file_path)
# Restore original permissions
os.chmod(file_path, original_mode)
if os.name != "nt": # Not Windows
os.chown(file_path, original_uid, original_gid)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.file_modified')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.modify_file_failed', error=str(e))}{Style.RESET_ALL}")
if "tmp_path" in locals():
try:
os.unlink(tmp_path)
except:
pass
return False
def run(translator=None):
config = get_config(translator)
if not config:
return False
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{EMOJI['RESET']} {translator.get('bypass_token_limit.title')}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
modify_workbench_js(get_workbench_cursor_path(translator), translator)
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
input(f"{EMOJI['INFO']} {translator.get('bypass_token_limit.press_enter')}...")
if __name__ == "__main__":
from main import translator as main_translator
run(main_translator)

160
bypass_version.py Normal file
View File

@ -0,0 +1,160 @@
import os
import json
import shutil
import platform
import configparser
import time
from colorama import Fore, Style, init
import sys
import traceback
from utils import get_user_documents_path
# Initialize colorama
init()
# Define emoji constants
EMOJI = {
'INFO': '',
'SUCCESS': '',
'ERROR': '',
'WARNING': '⚠️',
'FILE': '📄',
'BACKUP': '💾',
'RESET': '🔄',
'VERSION': '🏷️'
}
def get_product_json_path(translator=None):
"""Get Cursor product.json path"""
system = platform.system()
# Read configuration
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if os.path.exists(config_file):
config.read(config_file)
if system == "Windows":
localappdata = os.environ.get("LOCALAPPDATA")
if not localappdata:
raise OSError(translator.get('bypass.localappdata_not_found') if translator else "LOCALAPPDATA environment variable not found")
product_json_path = os.path.join(localappdata, "Programs", "Cursor", "resources", "app", "product.json")
# Check if path exists in config
if 'WindowsPaths' in config and 'cursor_path' in config['WindowsPaths']:
cursor_path = config.get('WindowsPaths', 'cursor_path')
product_json_path = os.path.join(cursor_path, "product.json")
elif system == "Darwin": # macOS
product_json_path = "/Applications/Cursor.app/Contents/Resources/app/product.json"
if config.has_section('MacPaths') and config.has_option('MacPaths', 'product_json_path'):
product_json_path = config.get('MacPaths', 'product_json_path')
elif system == "Linux":
# Try multiple common paths
possible_paths = [
"/opt/Cursor/resources/app/product.json",
"/usr/share/cursor/resources/app/product.json",
"/usr/lib/cursor/app/product.json"
]
# Add extracted AppImage paths
extracted_usr_paths = os.path.expanduser("~/squashfs-root/usr/share/cursor/resources/app/product.json")
if os.path.exists(extracted_usr_paths):
possible_paths.append(extracted_usr_paths)
for path in possible_paths:
if os.path.exists(path):
product_json_path = path
break
else:
raise OSError(translator.get('bypass.product_json_not_found') if translator else "product.json not found in common Linux paths")
else:
raise OSError(translator.get('bypass.unsupported_os', system=system) if translator else f"Unsupported operating system: {system}")
if not os.path.exists(product_json_path):
raise OSError(translator.get('bypass.file_not_found', path=product_json_path) if translator else f"File not found: {product_json_path}")
return product_json_path
def compare_versions(version1, version2):
"""Compare two version strings"""
v1_parts = [int(x) for x in version1.split('.')]
v2_parts = [int(x) for x in version2.split('.')]
for i in range(max(len(v1_parts), len(v2_parts))):
v1 = v1_parts[i] if i < len(v1_parts) else 0
v2 = v2_parts[i] if i < len(v2_parts) else 0
if v1 < v2:
return -1
elif v1 > v2:
return 1
return 0
def bypass_version(translator=None):
"""Bypass Cursor version check by modifying product.json"""
try:
print(f"\n{Fore.CYAN}{EMOJI['INFO']} {translator.get('bypass.starting') if translator else 'Starting Cursor version bypass...'}{Style.RESET_ALL}")
# Get product.json path
product_json_path = get_product_json_path(translator)
print(f"{Fore.CYAN}{EMOJI['FILE']} {translator.get('bypass.found_product_json', path=product_json_path) if translator else f'Found product.json: {product_json_path}'}{Style.RESET_ALL}")
# Check file permissions
if not os.access(product_json_path, os.W_OK):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('bypass.no_write_permission', path=product_json_path) if translator else f'No write permission for file: {product_json_path}'}{Style.RESET_ALL}")
return False
# Read product.json
try:
with open(product_json_path, "r", encoding="utf-8") as f:
product_data = json.load(f)
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('bypass.read_failed', error=str(e)) if translator else f'Failed to read product.json: {str(e)}'}{Style.RESET_ALL}")
return False
# Get current version
current_version = product_data.get("version", "0.0.0")
print(f"{Fore.CYAN}{EMOJI['VERSION']} {translator.get('bypass.current_version', version=current_version) if translator else f'Current version: {current_version}'}{Style.RESET_ALL}")
# Check if version needs to be modified
if compare_versions(current_version, "0.46.0") < 0:
# Create backup
timestamp = time.strftime("%Y%m%d%H%M%S")
backup_path = f"{product_json_path}.{timestamp}"
shutil.copy2(product_json_path, backup_path)
print(f"{Fore.GREEN}{EMOJI['BACKUP']} {translator.get('bypass.backup_created', path=backup_path) if translator else f'Backup created: {backup_path}'}{Style.RESET_ALL}")
# Modify version
new_version = "0.48.7"
product_data["version"] = new_version
# Save modified product.json
try:
with open(product_json_path, "w", encoding="utf-8") as f:
json.dump(product_data, f, indent=2)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('bypass.version_updated', old=current_version, new=new_version) if translator else f'Version updated from {current_version} to {new_version}'}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('bypass.write_failed', error=str(e)) if translator else f'Failed to write product.json: {str(e)}'}{Style.RESET_ALL}")
return False
else:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('bypass.no_update_needed', version=current_version) if translator else f'No update needed. Current version {current_version} is already >= 0.46.0'}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('bypass.bypass_failed', error=str(e)) if translator else f'Version bypass failed: {str(e)}'}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('bypass.stack_trace') if translator else 'Stack trace'}: {traceback.format_exc()}{Style.RESET_ALL}")
return False
def main(translator=None):
"""Main function"""
return bypass_version(translator)
if __name__ == "__main__":
main()

214
check_user_authorized.py Normal file
View File

@ -0,0 +1,214 @@
import os
import requests
import time
import hashlib
import base64
import struct
from colorama import Fore, Style, init
# Initialize colorama
init()
# Define emoji constants
EMOJI = {
"SUCCESS": "",
"ERROR": "",
"INFO": "",
"WARNING": "⚠️",
"KEY": "🔑",
"CHECK": "🔍"
}
def generate_hashed64_hex(input_str: str, salt: str = '') -> str:
"""Generate a SHA-256 hash of input + salt and return as hex"""
hash_obj = hashlib.sha256()
hash_obj.update((input_str + salt).encode('utf-8'))
return hash_obj.hexdigest()
def obfuscate_bytes(byte_array: bytearray) -> bytearray:
"""Obfuscate bytes using the algorithm from utils.js"""
t = 165
for r in range(len(byte_array)):
byte_array[r] = ((byte_array[r] ^ t) + (r % 256)) & 0xFF
t = byte_array[r]
return byte_array
def generate_cursor_checksum(token: str, translator=None) -> str:
"""Generate Cursor checksum from token using the algorithm"""
try:
# Clean the token
clean_token = token.strip()
# Generate machineId and macMachineId
machine_id = generate_hashed64_hex(clean_token, 'machineId')
mac_machine_id = generate_hashed64_hex(clean_token, 'macMachineId')
# Get timestamp and convert to byte array
timestamp = int(time.time() * 1000) // 1000000
byte_array = bytearray(struct.pack('>Q', timestamp)[-6:]) # Take last 6 bytes
# Obfuscate bytes and encode as base64
obfuscated_bytes = obfuscate_bytes(byte_array)
encoded_checksum = base64.b64encode(obfuscated_bytes).decode('utf-8')
# Combine final checksum
return f"{encoded_checksum}{machine_id}/{mac_machine_id}"
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('auth_check.error_generating_checksum', error=str(e)) if translator else f'Error generating checksum: {str(e)}'}{Style.RESET_ALL}")
return ""
def check_user_authorized(token: str, translator=None) -> bool:
"""
Check if the user is authorized with the given token
Args:
token (str): The authorization token
translator: Optional translator for internationalization
Returns:
bool: True if authorized, False otherwise
"""
try:
print(f"{Fore.CYAN}{EMOJI['CHECK']} {translator.get('auth_check.checking_authorization') if translator else 'Checking authorization...'}{Style.RESET_ALL}")
# Clean the token
if token and '%3A%3A' in token:
token = token.split('%3A%3A')[1]
elif token and '::' in token:
token = token.split('::')[1]
# Remove any whitespace
token = token.strip()
if not token or len(token) < 10: # Add a basic validation for token length
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('auth_check.invalid_token') if translator else 'Invalid token'}{Style.RESET_ALL}")
return False
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('auth_check.token_length', length=len(token)) if translator else f'Token length: {len(token)} characters'}{Style.RESET_ALL}")
# Try to get usage info using the DashboardService API
try:
# Generate checksum
checksum = generate_cursor_checksum(token, translator)
# Create request headers
headers = {
'accept-encoding': 'gzip',
'authorization': f'Bearer {token}',
'connect-protocol-version': '1',
'content-type': 'application/proto',
'user-agent': 'connect-es/1.6.1',
'x-cursor-checksum': checksum,
'x-cursor-client-version': '0.48.7',
'x-cursor-timezone': 'Asia/Shanghai',
'x-ghost-mode': 'false',
'Host': 'api2.cursor.sh'
}
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('auth_check.checking_usage_information') if translator else 'Checking usage information...'}{Style.RESET_ALL}")
# Make the request - this endpoint doesn't need a request body
usage_response = requests.post(
'https://api2.cursor.sh/aiserver.v1.DashboardService/GetUsageBasedPremiumRequests',
headers=headers,
data=b'', # Empty body
timeout=10
)
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('auth_check.usage_response', response=usage_response.status_code) if translator else f'Usage response status: {usage_response.status_code}'}{Style.RESET_ALL}")
if usage_response.status_code == 200:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('auth_check.user_authorized') if translator else 'User is authorized'}{Style.RESET_ALL}")
return True
elif usage_response.status_code == 401 or usage_response.status_code == 403:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('auth_check.user_unauthorized') if translator else 'User is unauthorized'}{Style.RESET_ALL}")
return False
else:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('auth_check.unexpected_status_code', code=usage_response.status_code) if translator else f'Unexpected status code: {usage_response.status_code}'}{Style.RESET_ALL}")
# If the token at least looks like a valid JWT, consider it valid
if token.startswith('eyJ') and '.' in token and len(token) > 100:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('auth_check.jwt_token_warning') if translator else 'Token appears to be in JWT format, but API check returned an unexpected status code. The token might be valid but API access is restricted.'}{Style.RESET_ALL}")
return True
return False
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} Error checking usage: {str(e)}{Style.RESET_ALL}")
# If the token at least looks like a valid JWT, consider it valid even if the API check fails
if token.startswith('eyJ') and '.' in token and len(token) > 100:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('auth_check.jwt_token_warning') if translator else 'Token appears to be in JWT format, but API check failed. The token might be valid but API access is restricted.'}{Style.RESET_ALL}")
return True
return False
except requests.exceptions.Timeout:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('auth_check.request_timeout') if translator else 'Request timed out'}{Style.RESET_ALL}")
return False
except requests.exceptions.ConnectionError:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('auth_check.connection_error') if translator else 'Connection error'}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('auth_check.check_error', error=str(e)) if translator else f'Error checking authorization: {str(e)}'}{Style.RESET_ALL}")
return False
def run(translator=None):
"""Run function to be called from main.py"""
try:
# Ask user if they want to get token from database or input manually
choice = input(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('auth_check.token_source') if translator else 'Get token from database or input manually? (d/m, default: d): '}{Style.RESET_ALL}").strip().lower()
token = None
# If user chooses database or default
if not choice or choice == 'd':
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('auth_check.getting_token_from_db') if translator else 'Getting token from database...'}{Style.RESET_ALL}")
try:
# Import functions from cursor_acc_info.py
from cursor_acc_info import get_token
# Get token using the get_token function
token = get_token()
if token:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('auth_check.token_found_in_db') if translator else 'Token found in database'}{Style.RESET_ALL}")
else:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('auth_check.token_not_found_in_db') if translator else 'Token not found in database'}{Style.RESET_ALL}")
except ImportError:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('auth_check.cursor_acc_info_not_found') if translator else 'cursor_acc_info.py not found'}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('auth_check.error_getting_token_from_db', error=str(e)) if translator else f'Error getting token from database: {str(e)}'}{Style.RESET_ALL}")
# If token not found in database or user chooses manual input
if not token:
# Try to get token from environment
token = os.environ.get('CURSOR_TOKEN')
# If not in environment, ask user to input
if not token:
token = input(f"{Fore.CYAN}{EMOJI['KEY']} {translator.get('auth_check.enter_token') if translator else 'Enter your Cursor token: '}{Style.RESET_ALL}")
# Check authorization
is_authorized = check_user_authorized(token, translator)
if is_authorized:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('auth_check.authorization_successful') if translator else 'Authorization successful!'}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('auth_check.authorization_failed') if translator else 'Authorization failed!'}{Style.RESET_ALL}")
return is_authorized
except KeyboardInterrupt:
print(f"\n{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('auth_check.operation_cancelled') if translator else 'Operation cancelled by user'}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('auth_check.unexpected_error', error=str(e)) if translator else f'Unexpected error: {str(e)}'}{Style.RESET_ALL}")
return False
def main(translator=None):
"""Main function to check user authorization"""
return run(translator)
if __name__ == "__main__":
main()

380
config.py Normal file
View File

@ -0,0 +1,380 @@
import os
import sys
import configparser
from colorama import Fore, Style
from utils import get_user_documents_path, get_linux_cursor_path, get_default_driver_path, get_default_browser_path
import shutil
import datetime
EMOJI = {
"INFO": "",
"WARNING": "⚠️",
"ERROR": "",
"SUCCESS": "",
"ADMIN": "🔒",
"ARROW": "➡️",
"USER": "👤",
"KEY": "🔑",
"SETTINGS": "⚙️"
}
# global config cache
_config_cache = None
def setup_config(translator=None):
"""Setup configuration file and return config object"""
try:
# get documents path
docs_path = get_user_documents_path()
if not docs_path or not os.path.exists(docs_path):
# if documents path not found, use current directory
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('config.documents_path_not_found', fallback='Documents path not found, using current directory') if translator else 'Documents path not found, using current directory'}{Style.RESET_ALL}")
docs_path = os.path.abspath('.')
# normalize path
config_dir = os.path.normpath(os.path.join(docs_path, ".cursor-free-vip"))
config_file = os.path.normpath(os.path.join(config_dir, "config.ini"))
# create config directory, only print message when directory not exists
dir_exists = os.path.exists(config_dir)
try:
os.makedirs(config_dir, exist_ok=True)
if not dir_exists: # only print message when directory not exists
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('config.config_dir_created', path=config_dir) if translator else f'Config directory created: {config_dir}'}{Style.RESET_ALL}")
except Exception as e:
# if cannot create directory, use temporary directory
import tempfile
temp_dir = os.path.normpath(os.path.join(tempfile.gettempdir(), ".cursor-free-vip"))
temp_exists = os.path.exists(temp_dir)
config_dir = temp_dir
config_file = os.path.normpath(os.path.join(config_dir, "config.ini"))
os.makedirs(config_dir, exist_ok=True)
if not temp_exists: # only print message when temporary directory not exists
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('config.using_temp_dir', path=config_dir, error=str(e)) if translator else f'Using temporary directory due to error: {config_dir} (Error: {str(e)})'}{Style.RESET_ALL}")
# create config object
config = configparser.ConfigParser()
# Default configuration
default_config = {
'Browser': {
'default_browser': 'chrome',
'chrome_path': get_default_browser_path('chrome'),
'chrome_driver_path': get_default_driver_path('chrome'),
'edge_path': get_default_browser_path('edge'),
'edge_driver_path': get_default_driver_path('edge'),
'firefox_path': get_default_browser_path('firefox'),
'firefox_driver_path': get_default_driver_path('firefox'),
'brave_path': get_default_browser_path('brave'),
'brave_driver_path': get_default_driver_path('brave'),
'opera_path': get_default_browser_path('opera'),
'opera_driver_path': get_default_driver_path('opera'),
'operagx_path': get_default_browser_path('operagx'),
'operagx_driver_path': get_default_driver_path('chrome') # Opera GX 使用 Chrome 驱动
},
'Turnstile': {
'handle_turnstile_time': '2',
'handle_turnstile_random_time': '1-3'
},
'Timing': {
'min_random_time': '0.1',
'max_random_time': '0.8',
'page_load_wait': '0.1-0.8',
'input_wait': '0.3-0.8',
'submit_wait': '0.5-1.5',
'verification_code_input': '0.1-0.3',
'verification_success_wait': '2-3',
'verification_retry_wait': '2-3',
'email_check_initial_wait': '4-6',
'email_refresh_wait': '2-4',
'settings_page_load_wait': '1-2',
'failed_retry_time': '0.5-1',
'retry_interval': '8-12',
'max_timeout': '160'
},
'Utils': {
'enabled_update_check': 'True',
'enabled_force_update': 'False',
'enabled_account_info': 'True'
},
'OAuth': {
'show_selection_alert': False, # 默认不显示选择提示弹窗
'timeout': 120,
'max_attempts': 3
},
'Token': {
'refresh_server': 'https://token.cursorpro.com.cn',
'enable_refresh': True
},
'Language': {
'current_language': '', # Set by local system detection if empty
'fallback_language': 'en',
'auto_update_languages': 'True',
'language_cache_dir': os.path.join(config_dir, "language_cache")
}
}
# Add system-specific path configuration
if sys.platform == "win32":
appdata = os.getenv("APPDATA")
localappdata = os.getenv("LOCALAPPDATA", "")
default_config['WindowsPaths'] = {
'storage_path': os.path.join(appdata, "Cursor", "User", "globalStorage", "storage.json"),
'sqlite_path': os.path.join(appdata, "Cursor", "User", "globalStorage", "state.vscdb"),
'machine_id_path': os.path.join(appdata, "Cursor", "machineId"),
'cursor_path': os.path.join(localappdata, "Programs", "Cursor", "resources", "app"),
'updater_path': os.path.join(localappdata, "cursor-updater"),
'update_yml_path': os.path.join(localappdata, "Programs", "Cursor", "resources", "app-update.yml"),
'product_json_path': os.path.join(localappdata, "Programs", "Cursor", "resources", "app", "product.json")
}
# Create storage directory
os.makedirs(os.path.dirname(default_config['WindowsPaths']['storage_path']), exist_ok=True)
elif sys.platform == "darwin":
default_config['MacPaths'] = {
'storage_path': os.path.abspath(os.path.expanduser("~/Library/Application Support/Cursor/User/globalStorage/storage.json")),
'sqlite_path': os.path.abspath(os.path.expanduser("~/Library/Application Support/Cursor/User/globalStorage/state.vscdb")),
'machine_id_path': os.path.expanduser("~/Library/Application Support/Cursor/machineId"),
'cursor_path': "/Applications/Cursor.app/Contents/Resources/app",
'updater_path': os.path.expanduser("~/Library/Application Support/cursor-updater"),
'update_yml_path': "/Applications/Cursor.app/Contents/Resources/app-update.yml",
'product_json_path': "/Applications/Cursor.app/Contents/Resources/app/product.json"
}
# Create storage directory
os.makedirs(os.path.dirname(default_config['MacPaths']['storage_path']), exist_ok=True)
elif sys.platform == "linux":
# Get the actual user's home directory, handling both sudo and normal cases
sudo_user = os.environ.get('SUDO_USER')
current_user = sudo_user if sudo_user else (os.getenv('USER') or os.getenv('USERNAME'))
if not current_user:
current_user = os.path.expanduser('~').split('/')[-1]
# Handle sudo case
if sudo_user:
actual_home = f"/home/{sudo_user}"
root_home = "/root"
else:
actual_home = f"/home/{current_user}"
root_home = None
if not os.path.exists(actual_home):
actual_home = os.path.expanduser("~")
# Define base config directory
config_base = os.path.join(actual_home, ".config")
# Try both "Cursor" and "cursor" directory names in both user and root locations
cursor_dir = None
possible_paths = [
os.path.join(config_base, "Cursor"),
os.path.join(config_base, "cursor"),
os.path.join(root_home, ".config", "Cursor") if root_home else None,
os.path.join(root_home, ".config", "cursor") if root_home else None
]
for path in possible_paths:
if path and os.path.exists(path):
cursor_dir = path
break
if not cursor_dir:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('config.neither_cursor_nor_cursor_directory_found', config_base=config_base) if translator else f'Neither Cursor nor cursor directory found in {config_base}'}{Style.RESET_ALL}")
if root_home:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.also_checked', path=f'{root_home}/.config') if translator else f'Also checked {root_home}/.config'}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.please_make_sure_cursor_is_installed_and_has_been_run_at_least_once') if translator else 'Please make sure Cursor is installed and has been run at least once'}{Style.RESET_ALL}")
# Define Linux paths using the found cursor directory
storage_path = os.path.abspath(os.path.join(cursor_dir, "User/globalStorage/storage.json")) if cursor_dir else ""
storage_dir = os.path.dirname(storage_path) if storage_path else ""
# Verify paths and permissions
try:
# Check storage directory
if storage_dir and not os.path.exists(storage_dir):
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('config.storage_directory_not_found', storage_dir=storage_dir) if translator else f'Storage directory not found: {storage_dir}'}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.please_make_sure_cursor_is_installed_and_has_been_run_at_least_once') if translator else 'Please make sure Cursor is installed and has been run at least once'}{Style.RESET_ALL}")
# Check storage.json with more detailed verification
if storage_path and os.path.exists(storage_path):
# Get file stats
try:
stat = os.stat(storage_path)
print(f"{Fore.GREEN}{EMOJI['INFO']} {translator.get('config.storage_file_found', storage_path=storage_path) if translator else f'Storage file found: {storage_path}'}{Style.RESET_ALL}")
print(f"{Fore.GREEN}{EMOJI['INFO']} {translator.get('config.file_size', size=stat.st_size) if translator else f'File size: {stat.st_size} bytes'}{Style.RESET_ALL}")
print(f"{Fore.GREEN}{EMOJI['INFO']} {translator.get('config.file_permissions', permissions=oct(stat.st_mode & 0o777)) if translator else f'File permissions: {oct(stat.st_mode & 0o777)}'}{Style.RESET_ALL}")
print(f"{Fore.GREEN}{EMOJI['INFO']} {translator.get('config.file_owner', owner=stat.st_uid) if translator else f'File owner: {stat.st_uid}'}{Style.RESET_ALL}")
print(f"{Fore.GREEN}{EMOJI['INFO']} {translator.get('config.file_group', group=stat.st_gid) if translator else f'File group: {stat.st_gid}'}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('config.error_getting_file_stats', error=str(e)) if translator else f'Error getting file stats: {str(e)}'}{Style.RESET_ALL}")
# Check if file is readable and writable
if not os.access(storage_path, os.R_OK | os.W_OK):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('config.permission_denied', storage_path=storage_path) if translator else f'Permission denied: {storage_path}'}{Style.RESET_ALL}")
if sudo_user:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.try_running', command=f'chown {sudo_user}:{sudo_user} {storage_path}') if translator else f'Try running: chown {sudo_user}:{sudo_user} {storage_path}'}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.and') if translator else 'And'}: chmod 644 {storage_path}{Style.RESET_ALL}")
else:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.try_running', command=f'chown {current_user}:{current_user} {storage_path}') if translator else f'Try running: chown {current_user}:{current_user} {storage_path}'}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.and') if translator else 'And'}: chmod 644 {storage_path}{Style.RESET_ALL}")
# Try to read the file to verify it's not corrupted
try:
with open(storage_path, 'r') as f:
content = f.read()
if not content.strip():
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('config.storage_file_is_empty', storage_path=storage_path) if translator else f'Storage file is empty: {storage_path}'}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.the_file_might_be_corrupted_please_reinstall_cursor') if translator else 'The file might be corrupted, please reinstall Cursor'}{Style.RESET_ALL}")
else:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('config.storage_file_is_valid_and_contains_data') if translator else 'Storage file is valid and contains data'}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('config.error_reading_storage_file', error=str(e)) if translator else f'Error reading storage file: {str(e)}'}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.the_file_might_be_corrupted_please_reinstall_cursor') if translator else 'The file might be corrupted. Please reinstall Cursor'}{Style.RESET_ALL}")
elif storage_path:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('config.storage_file_not_found', storage_path=storage_path) if translator else f'Storage file not found: {storage_path}'}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.please_make_sure_cursor_is_installed_and_has_been_run_at_least_once') if translator else 'Please make sure Cursor is installed and has been run at least once'}{Style.RESET_ALL}")
except (OSError, IOError) as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('config.error_checking_linux_paths', error=str(e)) if translator else f'Error checking Linux paths: {str(e)}'}{Style.RESET_ALL}")
# Define all paths using the found cursor directory
default_config['LinuxPaths'] = {
'storage_path': storage_path,
'sqlite_path': os.path.abspath(os.path.join(cursor_dir, "User/globalStorage/state.vscdb")) if cursor_dir else "",
'machine_id_path': os.path.join(cursor_dir, "machineid") if cursor_dir else "",
'cursor_path': get_linux_cursor_path(),
'updater_path': os.path.join(config_base, "cursor-updater"),
'update_yml_path': os.path.join(cursor_dir, "resources/app-update.yml") if cursor_dir else "",
'product_json_path': os.path.join(cursor_dir, "resources/app/product.json") if cursor_dir else ""
}
# Add tempmail_plus configuration
default_config['TempMailPlus'] = {
'enabled': 'false',
'email': '',
'epin': ''
}
# Read existing configuration and merge
if os.path.exists(config_file):
config.read(config_file, encoding='utf-8')
config_modified = False
for section, options in default_config.items():
if not config.has_section(section):
config.add_section(section)
config_modified = True
for option, value in options.items():
if not config.has_option(section, option):
config.set(section, option, str(value))
config_modified = True
if translator:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('config.config_option_added', option=f'{section}.{option}') if translator else f'Config option added: {section}.{option}'}{Style.RESET_ALL}")
if config_modified:
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
if translator:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('config.config_updated') if translator else 'Config updated'}{Style.RESET_ALL}")
else:
for section, options in default_config.items():
config.add_section(section)
for option, value in options.items():
config.set(section, option, str(value))
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
if translator:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('config.config_created', config_file=config_file) if translator else f'Config created: {config_file}'}{Style.RESET_ALL}")
return config
except Exception as e:
if translator:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('config.config_setup_error', error=str(e)) if translator else f'Error setting up config: {str(e)}'}{Style.RESET_ALL}")
return None
def print_config(config, translator=None):
"""Print configuration in a readable format"""
if not config:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('config.config_not_available') if translator else 'Configuration not available'}{Style.RESET_ALL}")
return
print(f"\n{Fore.CYAN}{EMOJI['INFO']} {translator.get('config.configuration') if translator else 'Configuration'}:{Style.RESET_ALL}")
print(f"\n{Fore.CYAN}{'' * 70}{Style.RESET_ALL}")
for section in config.sections():
print(f"{Fore.GREEN}[{section}]{Style.RESET_ALL}")
for key, value in config.items(section):
# 对布尔值进行特殊处理,使其显示为彩色
if value.lower() in ('true', 'yes', 'on', '1'):
value_display = f"{Fore.GREEN}{translator.get('config.enabled') if translator else 'Enabled'}{Style.RESET_ALL}"
elif value.lower() in ('false', 'no', 'off', '0'):
value_display = f"{Fore.RED}{translator.get('config.disabled') if translator else 'Disabled'}{Style.RESET_ALL}"
else:
value_display = value
print(f" {key} = {value_display}")
print(f"\n{Fore.CYAN}{'' * 70}{Style.RESET_ALL}")
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip", "config.ini")
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('config.config_directory') if translator else 'Config Directory'}: {config_dir}{Style.RESET_ALL}")
print()
def force_update_config(translator=None):
"""
Force update configuration file with latest defaults if update check is enabled.
Args:
translator: Translator instance
Returns:
ConfigParser instance or None if failed
"""
try:
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
current_time = datetime.datetime.now()
# If the config file exists, check if forced update is enabled
if os.path.exists(config_file):
# First, read the existing configuration
existing_config = configparser.ConfigParser()
existing_config.read(config_file, encoding='utf-8')
# Check if "enabled_update_check" is True
update_enabled = True # Default to True if not set
if existing_config.has_section('Utils') and existing_config.has_option('Utils', 'enabled_force_update'):
update_enabled = existing_config.get('Utils', 'enabled_force_update').strip().lower() in ('true', 'yes', '1', 'on')
if update_enabled:
try:
# Create a backup
backup_file = f"{config_file}.bak.{current_time.strftime('%Y%m%d_%H%M%S')}"
shutil.copy2(config_file, backup_file)
if translator:
print(f"\n{Fore.CYAN}{EMOJI['INFO']} {translator.get('config.backup_created', path=backup_file) if translator else f'Backup created: {backup_file}'}{Style.RESET_ALL}")
print(f"\n{Fore.CYAN}{EMOJI['INFO']} {translator.get('config.config_force_update_enabled') if translator else 'Config file force update enabled'}{Style.RESET_ALL}")
# Delete the original config file (forced update)
os.remove(config_file)
if translator:
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('config.config_removed') if translator else 'Config file removed for forced update'}{Style.RESET_ALL}")
except Exception as e:
if translator:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('config.backup_failed', error=str(e)) if translator else f'Failed to backup config: {str(e)}'}{Style.RESET_ALL}")
else:
if translator:
print(f"\n{Fore.CYAN}{EMOJI['INFO']} {translator.get('config.config_force_update_disabled', fallback='Config file force update disabled by configuration. Keeping existing config file.') if translator else 'Config file force update disabled by configuration. Keeping existing config file.'}{Style.RESET_ALL}")
# Generate a new (or updated) configuration if needed
return setup_config(translator)
except Exception as e:
if translator:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('config.force_update_failed', error=str(e)) if translator else f'Force update config failed: {str(e)}'}{Style.RESET_ALL}")
return None
def get_config(translator=None):
"""Get existing config or create new one"""
global _config_cache
if _config_cache is None:
_config_cache = setup_config(translator)
return _config_cache

View File

@ -1,404 +0,0 @@
import time
import random
import os
from colorama import Fore, Style, init
# 初始化colorama
init()
# 定义emoji常量
EMOJI = {
'MAIL': '📧',
'REFRESH': '🔄',
'SUCCESS': '',
'ERROR': '',
'INFO': '',
'CODE': '📱'
}
class BrowserControl:
def __init__(self, browser, translator=None):
self.browser = browser
self.translator = translator # 保存translator
self.sign_up_url = "https://authenticator.cursor.sh/sign-up"
self.current_tab = None # 当前标签页
self.signup_tab = None # 注册标签页
self.email_tab = None # 邮箱标签页
def create_new_tab(self):
"""创建新标签页"""
try:
# 保存当前标签页
self.current_tab = self.browser
# 创建新的浏览器实例
from browser import BrowserManager
browser_manager = BrowserManager()
new_browser = browser_manager.init_browser()
# 保存新标签页
self.signup_tab = new_browser
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.create_new_tab_success')}{Style.RESET_ALL}")
return new_browser
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.create_new_tab_failed', error=str(e))}{Style.RESET_ALL}")
return None
def switch_to_tab(self, browser):
"""切换到指定浏览器窗口"""
try:
self.browser = browser
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.switch_tab_success')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.switch_tab_failed', error=str(e))}{Style.RESET_ALL}")
return False
def get_current_tab(self):
"""获取当前标签页"""
return self.browser
def generate_new_email(self):
"""点击新的按钮生成新邮箱"""
try:
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.generate_email')}...{Style.RESET_ALL}")
new_button = self.browser.ele('xpath://button[contains(@class, "egenbut")]')
if new_button:
new_button.click()
time.sleep(1) # 等待生成
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.generate_email_success')}{Style.RESET_ALL}")
return True
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.generate_email_failed')}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.browser_error', error=str(e))}{Style.RESET_ALL}")
return False
def select_email_domain(self, domain_index=None):
"""选择邮箱域名如果不指定index则随机选择"""
try:
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.select_email_domain')}...{Style.RESET_ALL}")
# 读取黑名单域名
blacklist = []
try:
with open('blacklist.txt', 'r', encoding='utf-8') as f:
blacklist = [line.strip().lower() for line in f if line.strip()]
except FileNotFoundError:
# 如果文件不存在,创建一个包含已知黑名单域名的文件
with open('blacklist.txt', 'w', encoding='utf-8') as f:
f.write("fr.nf\nyopmail.com\n1s.fr\nfr.cr")
blacklist = ["fr.nf", "yopmail.com", "1s.fr", "fr.cr"]
# 找到下拉框
select_element = self.browser.ele('xpath://select[@id="seldom"]')
if select_element:
# 获取所有选项
all_options = []
new_options = self.browser.eles('xpath://select[@id="seldom"]/optgroup[@label="-- 新的 --"]/option')
other_options = self.browser.eles('xpath://select[@id="seldom"]/optgroup[@label="-- 其他 --"]/option')
all_options.extend(new_options)
all_options.extend(other_options)
if all_options:
max_attempts = 5
attempt = 0
while attempt < max_attempts:
if domain_index is None:
domain_index = random.randint(0, len(all_options) - 1)
if domain_index < len(all_options):
selected_domain = all_options[domain_index].text.lower()
# 检查域名是否在黑名单中
is_blacklisted = False
for blocked_domain in blacklist:
if blocked_domain in selected_domain:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('control.blocked_domain', domain=blocked_domain)}{Style.RESET_ALL}")
domain_index = None
attempt += 1
is_blacklisted = True
break
if is_blacklisted:
continue
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.select_email_domain')}: {selected_domain}{Style.RESET_ALL}")
# 点击选择
all_options[domain_index].click()
time.sleep(1)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.select_email_domain_success')}{Style.RESET_ALL}")
return True
attempt += 1
print(f"{Fore.RED}{EMOJI['ERROR']} 无法找到可用的域名{Style.RESET_ALL}")
return False
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.no_available_domain_options', count=len(all_options))}{Style.RESET_ALL}")
return False
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.no_domain_select_box')}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.select_email_domain_failed', error=str(e))}{Style.RESET_ALL}")
return False
def wait_for_page_load(self, seconds=2):
"""等待页面加载"""
time.sleep(seconds)
def navigate_to(self, url):
"""导航到指定URL"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('control.navigate_to', url=url)}...{Style.RESET_ALL}")
self.browser.get(url)
self.wait_for_page_load()
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.browser_error', error=str(e))}{Style.RESET_ALL}")
return False
def copy_and_get_email(self):
"""获取邮箱地址"""
try:
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.generate_email')}...{Style.RESET_ALL}")
# 等待元素加载
time.sleep(1)
# 获取邮箱名称
try:
email_div = self.browser.ele('xpath://div[@class="segen"]//div[contains(@style, "color: #e5e5e5")]')
if email_div:
email_name = email_div.text.split()[0]
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.get_email_name')}: {email_name}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.get_email_name_failed')}{Style.RESET_ALL}")
return None
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.get_email_name_failed', error=str(e))}{Style.RESET_ALL}")
return None
# 直接使用上一步选择的域名
try:
domain = self.browser.ele('xpath://select[@id="seldom"]').value
if not domain: # 如果获取不到value尝试获取选中的选项文本
selected_option = self.browser.ele('xpath://select[@id="seldom"]/option[1]')
domain = selected_option.text if selected_option else "@yopmail.com" # 使用默认域名作为后备
except:
domain = "@yopmail.com" # 如果出错,使用默认域名
# 组合完整邮箱地址
full_email = f"{email_name}{domain}"
print(f"{Fore.GREEN}{EMOJI['MAIL']} {self.translator.get('control.get_email_address')}: {full_email}{Style.RESET_ALL}")
return full_email
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.get_email_address_failed', error=str(e))}{Style.RESET_ALL}")
return None
def view_mailbox(self):
"""点击查看邮箱按钮"""
try:
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.enter_mailbox')}...{Style.RESET_ALL}")
view_button = self.browser.ele('xpath://button[contains(@class, "egenbut") and contains(.//span, "查看邮箱")]')
if view_button:
view_button.click()
time.sleep(2) # 等待页面加载
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.enter_mailbox_success')}{Style.RESET_ALL}")
return True
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.no_view_mailbox_button')}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.enter_mailbox_failed', error=str(e))}{Style.RESET_ALL}")
return False
def refresh_mailbox(self):
"""刷新邮箱获取最新信息"""
try:
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('control.refresh_mailbox')}...{Style.RESET_ALL}")
refresh_button = self.browser.ele('xpath://button[@id="refresh"]')
if refresh_button:
refresh_button.click()
time.sleep(2) # 等待刷新完成
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.refresh_mailbox_success')}{Style.RESET_ALL}")
return True
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.no_refresh_button')}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.refresh_mailbox_failed', error=str(e))}{Style.RESET_ALL}")
return False
def get_verification_code(self):
"""从邮件中获取验证码"""
try:
# 尝试所有可能的样式组合
selectors = [
# 新样式
'xpath://div[contains(@style, "font-family:-apple-system") and contains(@style, "font-size:28px") and contains(@style, "letter-spacing:2px") and contains(@style, "color:#202020")]',
# 带行高的样式
'xpath://div[contains(@style, "font-size:28px") and contains(@style, "letter-spacing:2px") and contains(@style, "line-height:30px")]',
# rgba 颜色样式
'xpath://div[contains(@style, "font-size: 28px") and contains(@style, "letter-spacing: 2px") and contains(@style, "color: rgba(32, 32, 32, 1)")]',
# 宽松样式
'xpath://div[contains(@style, "font-size:28px") and contains(@style, "letter-spacing:2px")]'
]
# 依次尝试每个选择器
for selector in selectors:
code_div = self.browser.ele(selector)
if code_div:
verification_code = code_div.text.strip()
if verification_code.isdigit() and len(verification_code) == 6:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.found_verification_code')}: {verification_code}{Style.RESET_ALL}")
return verification_code
print(f"{Fore.YELLOW}{EMOJI['ERROR']} {self.translator.get('control.no_valid_verification_code')}{Style.RESET_ALL}")
return None
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.get_verification_code_error', error=str(e))}{Style.RESET_ALL}")
return None
def fill_verification_code(self, code):
"""填写验证码"""
try:
if not code or len(code) != 6:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.verification_code_format_error')}{Style.RESET_ALL}")
return False
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('control.fill_verification_code')}...{Style.RESET_ALL}")
# 记住当前标签页(邮箱页面)
email_tab = self.browser
# 切换回注册页面标签
self.switch_to_tab(self.signup_tab)
time.sleep(1)
# 输入验证码
for digit in code:
self.browser.actions.input(digit)
time.sleep(random.uniform(0.1, 0.3))
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.verification_code_filled')}{Style.RESET_ALL}")
# 等待页面加载和登录完成
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('control.wait_for_login')}...{Style.RESET_ALL}")
time.sleep(5)
# 先访问登录页面确保登录状态
login_url = "https://authenticator.cursor.sh"
self.browser.get(login_url)
time.sleep(3) # 增加等待时间
# 获取cookies第一次尝试
token = self.get_cursor_session_token()
if not token:
print(f"{Fore.YELLOW}{EMOJI['ERROR']} {self.translator.get('control.get_token_failed')}...{Style.RESET_ALL}")
time.sleep(3)
token = self.get_cursor_session_token()
if token:
self.save_token_to_file(token)
# 获取到token后再访问设置页面
settings_url = "https://www.cursor.com/settings"
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('control.get_account_info')}...{Style.RESET_ALL}")
self.browser.get(settings_url)
time.sleep(2)
# 获取账户额度信息
try:
usage_selector = (
"css:div.col-span-2 > div > div > div > div > "
"div:nth-child(1) > div.flex.items-center.justify-between.gap-2 > "
"span.font-mono.text-sm\\/\\[0\\.875rem\\]"
)
usage_ele = self.browser.ele(usage_selector)
if usage_ele:
usage_info = usage_ele.text
total_usage = usage_info.split("/")[-1].strip()
print(f"{Fore.GREEN}{EMOJI['INFO']} {self.translator.get('control.account_usage_limit')}: {total_usage}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.get_account_usage_failed', error=str(e))}{Style.RESET_ALL}")
# 切换回邮箱页面
self.switch_to_tab(email_tab)
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.fill_verification_code_failed', error=str(e))}{Style.RESET_ALL}")
return False
def check_and_click_turnstile(self):
"""检查并点击 Turnstile 验证框"""
try:
# 等待验证框出现
time.sleep(1)
# 查找验证框
verify_checkbox = self.browser.ele('xpath://label[contains(@class, "cb-lb")]//input[@type="checkbox"]')
if verify_checkbox:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('control.find_turnstile_verification_box')}...{Style.RESET_ALL}")
verify_checkbox.click()
time.sleep(2) # 等待验证完成
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.clicked_turnstile_verification_box')}{Style.RESET_ALL}")
return True
return False
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['ERROR']} {self.translator.get('control.check_and_click_turnstile_failed', error=str(e))}{Style.RESET_ALL}")
return False
def get_cursor_session_token(self, max_attempts=3, retry_interval=2):
"""获取Cursor会话token"""
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('control.get_cursor_session_token')}...{Style.RESET_ALL}")
attempts = 0
while attempts < max_attempts:
try:
# 直接从浏览器对象获取cookies
all_cookies = self.browser.get_cookies()
# 遍历查找目标cookie
for cookie in all_cookies:
if cookie.get("name") == "WorkosCursorSessionToken":
token = cookie["value"].split("%3A%3A")[1]
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.get_cursor_session_token_success')}: {token}{Style.RESET_ALL}")
return token
attempts += 1
if attempts < max_attempts:
print(f"{Fore.YELLOW}{EMOJI['ERROR']} {self.translator.get('control.get_cursor_session_token_failed', attempts=attempts, retry_interval=retry_interval)}...{Style.RESET_ALL}")
time.sleep(retry_interval)
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.reach_max_attempts', max_attempts=max_attempts)}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.get_cookie_failed', error=str(e))}{Style.RESET_ALL}")
attempts += 1
if attempts < max_attempts:
print(f"{Fore.YELLOW}{EMOJI['ERROR']} {self.translator.get('control.will_retry_in', retry_interval=retry_interval)}...{Style.RESET_ALL}")
time.sleep(retry_interval)
return None
def save_token_to_file(self, token):
"""保存token到文件"""
try:
with open('cursor_tokens.txt', 'a', encoding='utf-8') as f:
f.write(f"Token: {token}\n")
f.write("-" * 50 + "\n")
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('control.token_saved_to_file')}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('control.save_token_failed', error=str(e))}{Style.RESET_ALL}")

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

552
cursor_acc_info.py Normal file
View File

@ -0,0 +1,552 @@
import os
import sys
import json
import requests
import sqlite3
from typing import Dict, Optional
import platform
from colorama import Fore, Style, init
import logging
import re
# Initialize colorama
init()
# Setup logger
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# Define emoji constants
EMOJI = {
"USER": "👤",
"USAGE": "📊",
"PREMIUM": "",
"BASIC": "📝",
"SUBSCRIPTION": "💳",
"INFO": "",
"ERROR": "",
"SUCCESS": "",
"WARNING": "⚠️",
"TIME": "🕒"
}
class Config:
"""Config"""
NAME_LOWER = "cursor"
NAME_CAPITALIZE = "Cursor"
BASE_HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Accept": "application/json",
"Content-Type": "application/json"
}
class UsageManager:
"""Usage Manager"""
@staticmethod
def get_proxy():
"""get proxy"""
# from config import get_config
proxy = os.environ.get("HTTP_PROXY") or os.environ.get("HTTPS_PROXY")
if proxy:
return {"http": proxy, "https": proxy}
return None
@staticmethod
def get_usage(token: str) -> Optional[Dict]:
"""get usage"""
url = f"https://www.{Config.NAME_LOWER}.com/api/usage"
headers = Config.BASE_HEADERS.copy()
headers.update({"Cookie": f"Workos{Config.NAME_CAPITALIZE}SessionToken=user_01OOOOOOOOOOOOOOOOOOOOOOOO%3A%3A{token}"})
try:
proxies = UsageManager.get_proxy()
response = requests.get(url, headers=headers, timeout=10, proxies=proxies)
response.raise_for_status()
data = response.json()
# get Premium usage and limit
gpt4_data = data.get("gpt-4", {})
premium_usage = gpt4_data.get("numRequestsTotal", 0)
max_premium_usage = gpt4_data.get("maxRequestUsage", 999)
# get Basic usage, but set limit to "No Limit"
gpt35_data = data.get("gpt-3.5-turbo", {})
basic_usage = gpt35_data.get("numRequestsTotal", 0)
return {
'premium_usage': premium_usage,
'max_premium_usage': max_premium_usage,
'basic_usage': basic_usage,
'max_basic_usage': "No Limit" # set Basic limit to "No Limit"
}
except requests.RequestException as e:
# only log error
logger.error(f"Get usage info failed: {str(e)}")
return None
except Exception as e:
# catch all other exceptions
logger.error(f"Get usage info failed: {str(e)}")
return None
@staticmethod
def get_stripe_profile(token: str) -> Optional[Dict]:
"""get user subscription info"""
url = f"https://api2.{Config.NAME_LOWER}.sh/auth/full_stripe_profile"
headers = Config.BASE_HEADERS.copy()
headers.update({"Authorization": f"Bearer {token}"})
try:
proxies = UsageManager.get_proxy()
response = requests.get(url, headers=headers, timeout=10, proxies=proxies)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
logger.error(f"Get subscription info failed: {str(e)}")
return None
def get_token_from_config():
"""get path info from config"""
try:
from config import get_config
config = get_config()
if not config:
return None
system = platform.system()
if system == "Windows" and config.has_section('WindowsPaths'):
return {
'storage_path': config.get('WindowsPaths', 'storage_path'),
'sqlite_path': config.get('WindowsPaths', 'sqlite_path'),
'session_path': os.path.join(os.getenv("APPDATA"), "Cursor", "Session Storage")
}
elif system == "Darwin" and config.has_section('MacPaths'): # macOS
return {
'storage_path': config.get('MacPaths', 'storage_path'),
'sqlite_path': config.get('MacPaths', 'sqlite_path'),
'session_path': os.path.expanduser("~/Library/Application Support/Cursor/Session Storage")
}
elif system == "Linux" and config.has_section('LinuxPaths'):
return {
'storage_path': config.get('LinuxPaths', 'storage_path'),
'sqlite_path': config.get('LinuxPaths', 'sqlite_path'),
'session_path': os.path.expanduser("~/.config/Cursor/Session Storage")
}
except Exception as e:
logger.error(f"Get config path failed: {str(e)}")
return None
def get_token_from_storage(storage_path):
"""get token from storage.json"""
if not os.path.exists(storage_path):
return None
try:
with open(storage_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# try to get accessToken
if 'cursorAuth/accessToken' in data:
return data['cursorAuth/accessToken']
# try other possible keys
for key in data:
if 'token' in key.lower() and isinstance(data[key], str) and len(data[key]) > 20:
return data[key]
except Exception as e:
logger.error(f"get token from storage.json failed: {str(e)}")
return None
def get_token_from_sqlite(sqlite_path):
"""get token from sqlite"""
if not os.path.exists(sqlite_path):
return None
try:
conn = sqlite3.connect(sqlite_path)
cursor = conn.cursor()
cursor.execute("SELECT value FROM ItemTable WHERE key LIKE '%token%'")
rows = cursor.fetchall()
conn.close()
for row in rows:
try:
value = row[0]
if isinstance(value, str) and len(value) > 20:
return value
# try to parse JSON
data = json.loads(value)
if isinstance(data, dict) and 'token' in data:
return data['token']
except:
continue
except Exception as e:
logger.error(f"get token from sqlite failed: {str(e)}")
return None
def get_token_from_session(session_path):
"""get token from session"""
if not os.path.exists(session_path):
return None
try:
# try to find all possible session files
for file in os.listdir(session_path):
if file.endswith('.log'):
file_path = os.path.join(session_path, file)
try:
with open(file_path, 'rb') as f:
content = f.read().decode('utf-8', errors='ignore')
# find token pattern
token_match = re.search(r'"token":"([^"]+)"', content)
if token_match:
return token_match.group(1)
except:
continue
except Exception as e:
logger.error(f"get token from session failed: {str(e)}")
return None
def get_token():
"""get Cursor token"""
# get path from config
paths = get_token_from_config()
if not paths:
return None
# try to get token from different locations
token = get_token_from_storage(paths['storage_path'])
if token:
return token
token = get_token_from_sqlite(paths['sqlite_path'])
if token:
return token
token = get_token_from_session(paths['session_path'])
if token:
return token
return None
def format_subscription_type(subscription_data: Dict) -> str:
"""format subscription type"""
if not subscription_data:
return "Free"
# handle new API response format
if "membershipType" in subscription_data:
membership_type = subscription_data.get("membershipType", "").lower()
subscription_status = subscription_data.get("subscriptionStatus", "").lower()
if subscription_status == "active":
if membership_type == "pro":
return "Pro"
elif membership_type == "free_trial":
return "Free Trial"
elif membership_type == "pro_trial":
return "Pro Trial"
elif membership_type == "team":
return "Team"
elif membership_type == "enterprise":
return "Enterprise"
elif membership_type:
return membership_type.capitalize()
else:
return "Active Subscription"
elif subscription_status:
return f"{membership_type.capitalize()} ({subscription_status})"
# compatible with old API response format
subscription = subscription_data.get("subscription")
if subscription:
plan = subscription.get("plan", {}).get("nickname", "Unknown")
status = subscription.get("status", "unknown")
if status == "active":
if "pro" in plan.lower():
return "Pro"
elif "pro_trial" in plan.lower():
return "Pro Trial"
elif "free_trial" in plan.lower():
return "Free Trial"
elif "team" in plan.lower():
return "Team"
elif "enterprise" in plan.lower():
return "Enterprise"
else:
return plan
else:
return f"{plan} ({status})"
return "Free"
def get_email_from_storage(storage_path):
"""get email from storage.json"""
if not os.path.exists(storage_path):
return None
try:
with open(storage_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# try to get email
if 'cursorAuth/cachedEmail' in data:
return data['cursorAuth/cachedEmail']
# try other possible keys
for key in data:
if 'email' in key.lower() and isinstance(data[key], str) and '@' in data[key]:
return data[key]
except Exception as e:
logger.error(f"get email from storage.json failed: {str(e)}")
return None
def get_email_from_sqlite(sqlite_path):
"""get email from sqlite"""
if not os.path.exists(sqlite_path):
return None
try:
conn = sqlite3.connect(sqlite_path)
cursor = conn.cursor()
# try to query records containing email
cursor.execute("SELECT value FROM ItemTable WHERE key LIKE '%email%' OR key LIKE '%cursorAuth%'")
rows = cursor.fetchall()
conn.close()
for row in rows:
try:
value = row[0]
# if it's a string and contains @, it might be an email
if isinstance(value, str) and '@' in value:
return value
# try to parse JSON
try:
data = json.loads(value)
if isinstance(data, dict):
# check if there's an email field
if 'email' in data:
return data['email']
# check if there's a cachedEmail field
if 'cachedEmail' in data:
return data['cachedEmail']
except:
pass
except:
continue
except Exception as e:
logger.error(f"get email from sqlite failed: {str(e)}")
return None
def display_account_info(translator=None):
"""display account info"""
print(f"\n{Fore.CYAN}{'' * 70}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{EMOJI['USER']} {translator.get('account_info.title') if translator else 'Cursor Account Information'}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'' * 70}{Style.RESET_ALL}")
# get token
token = get_token()
if not token:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('account_info.token_not_found') if translator else 'Token not found. Please login to Cursor first.'}{Style.RESET_ALL}")
return
# get path info
paths = get_token_from_config()
if not paths:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('account_info.config_not_found') if translator else 'Configuration not found.'}{Style.RESET_ALL}")
return
# get email info - try multiple sources
email = get_email_from_storage(paths['storage_path'])
# if not found in storage, try from sqlite
if not email:
email = get_email_from_sqlite(paths['sqlite_path'])
# get subscription info
try:
subscription_info = UsageManager.get_stripe_profile(token)
except Exception as e:
logger.error(f"Get subscription info failed: {str(e)}")
subscription_info = None
# if not found in storage and sqlite, try from subscription info
if not email and subscription_info:
# try to get email from subscription info
if 'customer' in subscription_info and 'email' in subscription_info['customer']:
email = subscription_info['customer']['email']
# get usage info - silently handle errors
try:
usage_info = UsageManager.get_usage(token)
except Exception as e:
logger.error(f"Get usage info failed: {str(e)}")
usage_info = None
# Prepare left and right info
left_info = []
right_info = []
# Left side shows account info
if email:
left_info.append(f"{Fore.GREEN}{EMOJI['USER']} {translator.get('account_info.email') if translator else 'Email'}: {Fore.WHITE}{email}{Style.RESET_ALL}")
else:
left_info.append(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('account_info.email_not_found') if translator else 'Email not found'}{Style.RESET_ALL}")
# Add an empty line
# left_info.append("")
# Show subscription type
if subscription_info:
subscription_type = format_subscription_type(subscription_info)
left_info.append(f"{Fore.GREEN}{EMOJI['SUBSCRIPTION']} {translator.get('account_info.subscription') if translator else 'Subscription'}: {Fore.WHITE}{subscription_type}{Style.RESET_ALL}")
# Show remaining trial days
days_remaining = subscription_info.get("daysRemainingOnTrial")
if days_remaining is not None and days_remaining > 0:
left_info.append(f"{Fore.GREEN}{EMOJI['TIME']} {translator.get('account_info.trial_remaining') if translator else 'Remaining Pro Trial'}: {Fore.WHITE}{days_remaining} {translator.get('account_info.days') if translator else 'days'}{Style.RESET_ALL}")
else:
left_info.append(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('account_info.subscription_not_found') if translator else 'Subscription information not found'}{Style.RESET_ALL}")
# Right side shows usage info - only if available
if usage_info:
right_info.append(f"{Fore.GREEN}{EMOJI['USAGE']} {translator.get('account_info.usage') if translator else 'Usage Statistics'}:{Style.RESET_ALL}")
# Premium usage
premium_usage = usage_info.get('premium_usage', 0)
max_premium_usage = usage_info.get('max_premium_usage', "No Limit")
# make sure the value is not None
if premium_usage is None:
premium_usage = 0
# handle "No Limit" case
if isinstance(max_premium_usage, str) and max_premium_usage == "No Limit":
premium_color = Fore.GREEN # when there is no limit, use green
premium_display = f"{premium_usage}/{max_premium_usage}"
else:
# calculate percentage when the value is a number
if max_premium_usage is None or max_premium_usage == 0:
max_premium_usage = 999
premium_percentage = 0
else:
premium_percentage = (premium_usage / max_premium_usage) * 100
# select color based on usage percentage
premium_color = Fore.GREEN
if premium_percentage > 70:
premium_color = Fore.YELLOW
if premium_percentage > 90:
premium_color = Fore.RED
premium_display = f"{premium_usage}/{max_premium_usage} ({premium_percentage:.1f}%)"
right_info.append(f"{Fore.YELLOW}{EMOJI['PREMIUM']} {translator.get('account_info.premium_usage') if translator else 'Fast Response'}: {premium_color}{premium_display}{Style.RESET_ALL}")
# Slow Response
basic_usage = usage_info.get('basic_usage', 0)
max_basic_usage = usage_info.get('max_basic_usage', "No Limit")
# make sure the value is not None
if basic_usage is None:
basic_usage = 0
# handle "No Limit" case
if isinstance(max_basic_usage, str) and max_basic_usage == "No Limit":
basic_color = Fore.GREEN # when there is no limit, use green
basic_display = f"{basic_usage}/{max_basic_usage}"
else:
# calculate percentage when the value is a number
if max_basic_usage is None or max_basic_usage == 0:
max_basic_usage = 999
basic_percentage = 0
else:
basic_percentage = (basic_usage / max_basic_usage) * 100
# select color based on usage percentage
basic_color = Fore.GREEN
if basic_percentage > 70:
basic_color = Fore.YELLOW
if basic_percentage > 90:
basic_color = Fore.RED
basic_display = f"{basic_usage}/{max_basic_usage} ({basic_percentage:.1f}%)"
right_info.append(f"{Fore.BLUE}{EMOJI['BASIC']} {translator.get('account_info.basic_usage') if translator else 'Slow Response'}: {basic_color}{basic_display}{Style.RESET_ALL}")
else:
# if get usage info failed, only log in log, not show in interface
# you can choose to not show any usage info, or show a simple prompt
# right_info.append(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('account_info.usage_unavailable') if translator else 'Usage information unavailable'}{Style.RESET_ALL}")
pass # not show any usage info
# Calculate the maximum display width of left info
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
def get_display_width(s):
"""Calculate the display width of a string, considering Chinese characters and emojis"""
# Remove ANSI color codes
clean_s = ansi_escape.sub('', s)
width = 0
for c in clean_s:
# Chinese characters and some emojis occupy two character widths
if ord(c) > 127:
width += 2
else:
width += 1
return width
max_left_width = 0
for item in left_info:
width = get_display_width(item)
max_left_width = max(max_left_width, width)
# Set the starting position of right info
fixed_spacing = 4 # Fixed spacing
right_start = max_left_width + fixed_spacing
# Calculate the number of spaces needed for right info
spaces_list = []
for i in range(len(left_info)):
if i < len(left_info):
left_item = left_info[i]
left_width = get_display_width(left_item)
spaces = right_start - left_width
spaces_list.append(spaces)
# Print info
max_rows = max(len(left_info), len(right_info))
for i in range(max_rows):
# Print left info
if i < len(left_info):
left_item = left_info[i]
print(left_item, end='')
# Use pre-calculated spaces
spaces = spaces_list[i]
else:
# If left side has no items, print only spaces
spaces = right_start
print('', end='')
# Print right info
if i < len(right_info):
print(' ' * spaces + right_info[i])
else:
print() # Change line
print(f"{Fore.CYAN}{'' * 70}{Style.RESET_ALL}")
def main(translator=None):
"""main function"""
try:
display_account_info(translator)
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('account_info.error') if translator else 'Error'}: {str(e)}{Style.RESET_ALL}")
if __name__ == "__main__":
main()

View File

@ -2,11 +2,12 @@ import sqlite3
import os
import sys
from colorama import Fore, Style, init
from config import get_config
# 初始化colorama
# Initialize colorama
init()
# 定义emoji和颜色常量
# Define emoji and color constants
EMOJI = {
'DB': '🗄️',
'UPDATE': '🔄',
@ -21,25 +22,68 @@ EMOJI = {
class CursorAuth:
def __init__(self, translator=None):
self.translator = translator
# 判断操作系统
if os.name == "nt": # Windows
self.db_path = os.path.join(
os.getenv("APPDATA"), "Cursor", "User", "globalStorage", "state.vscdb"
)
else: # macOS
self.db_path = os.path.expanduser(
"~/Library/Application Support/Cursor/User/globalStorage/state.vscdb"
)
# Get configuration
config = get_config(translator)
if not config:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('auth.config_error') if self.translator else 'Failed to load configuration'}{Style.RESET_ALL}")
sys.exit(1)
# Get path based on operating system
try:
if sys.platform == "win32": # Windows
if not config.has_section('WindowsPaths'):
raise ValueError("Windows paths not configured")
self.db_path = config.get('WindowsPaths', 'sqlite_path')
elif sys.platform == 'linux': # Linux
if not config.has_section('LinuxPaths'):
raise ValueError("Linux paths not configured")
self.db_path = config.get('LinuxPaths', 'sqlite_path')
elif sys.platform == 'darwin': # macOS
if not config.has_section('MacPaths'):
raise ValueError("macOS paths not configured")
self.db_path = config.get('MacPaths', 'sqlite_path')
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('auth.unsupported_platform') if self.translator else 'Unsupported platform'}{Style.RESET_ALL}")
sys.exit(1)
# Verify if the path exists
if not os.path.exists(os.path.dirname(self.db_path)):
raise FileNotFoundError(f"Database directory not found: {os.path.dirname(self.db_path)}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('auth.path_error', error=str(e)) if self.translator else f'Error getting database path: {str(e)}'}{Style.RESET_ALL}")
sys.exit(1)
def update_auth(self, email=None, access_token=None, refresh_token=None):
# Check if the database file exists
if not os.path.exists(self.db_path):
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('auth.db_not_found', path=self.db_path) if self.translator else f'Database not found: {self.db_path}'}{Style.RESET_ALL}")
return
# Check file permissions
if not os.access(self.db_path, os.R_OK | os.W_OK):
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('auth.db_permission_error') if self.translator else 'Database permission error'}{Style.RESET_ALL}")
return
try:
self.conn = sqlite3.connect(self.db_path)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('auth.connected_to_database') if self.translator else 'Connected to database'}{Style.RESET_ALL}")
except sqlite3.Error as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('auth.db_connection_error', error=str(e)) if self.translator else f'Database connection error: {str(e)}'}{Style.RESET_ALL}")
return
def update_auth(self, email=None, access_token=None, refresh_token=None, auth_type="Auth_0"):
conn = None
try:
# 确保目录存在并设置正确权限
# Ensure the directory exists and set the correct permissions
db_dir = os.path.dirname(self.db_path)
if not os.path.exists(db_dir):
os.makedirs(db_dir, mode=0o755, exist_ok=True)
# 如果数据库文件不存在,创建一个新的
# If the database file does not exist, create a new one
if not os.path.exists(self.db_path):
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
@ -54,31 +98,34 @@ class CursorAuth:
os.chmod(self.db_path, 0o644)
conn.close()
# 重新连接数据库
# Reconnect to the database
conn = sqlite3.connect(self.db_path)
print(f"{EMOJI['INFO']} {Fore.GREEN} {self.translator.get('auth.connected_to_database')}{Style.RESET_ALL}")
print(f"{EMOJI['INFO']} {Fore.GREEN} {self.translator.get('auth.connected_to_database') if self.translator else 'Connected to database'}{Style.RESET_ALL}")
cursor = conn.cursor()
# 增加超时和其他优化设置
# Add timeout and other optimization settings
conn.execute("PRAGMA busy_timeout = 5000")
conn.execute("PRAGMA journal_mode = WAL")
conn.execute("PRAGMA synchronous = NORMAL")
# 设置要更新的键值对
# Set the key-value pairs to update
updates = []
updates.append(("cursorAuth/cachedSignUpType", auth_type))
if email is not None:
updates.append(("cursorAuth/cachedEmail", email))
if access_token is not None:
updates.append(("cursorAuth/accessToken", access_token))
if refresh_token is not None:
updates.append(("cursorAuth/refreshToken", refresh_token))
updates.append(("cursorAuth/cachedSignUpType", "Auth_0"))
# 使用事务来确保数据完整性
# Use transactions to ensure data integrity
cursor.execute("BEGIN TRANSACTION")
try:
for key, value in updates:
# 检查键是否存在
# Check if the key exists
cursor.execute("SELECT COUNT(*) FROM ItemTable WHERE key = ?", (key,))
if cursor.fetchone()[0] == 0:
cursor.execute("""
@ -90,10 +137,10 @@ class CursorAuth:
UPDATE ItemTable SET value = ?
WHERE key = ?
""", (value, key))
print(f"{EMOJI['INFO']} {Fore.CYAN} {self.translator.get('auth.updating_pair')} {key.split('/')[-1]}...{Style.RESET_ALL}")
print(f"{EMOJI['INFO']} {Fore.CYAN} {self.translator.get('auth.updating_pair') if self.translator else 'Updating key-value pair:'} {key.split('/')[-1]}...{Style.RESET_ALL}")
cursor.execute("COMMIT")
print(f"{EMOJI['SUCCESS']} {Fore.GREEN}{self.translator.get('auth.database_updated_successfully')}{Style.RESET_ALL}")
print(f"{EMOJI['SUCCESS']} {Fore.GREEN}{self.translator.get('auth.database_updated_successfully') if self.translator else 'Database updated successfully'}{Style.RESET_ALL}")
return True
except Exception as e:
@ -101,14 +148,12 @@ class CursorAuth:
raise e
except sqlite3.Error as e:
print(f"\n{EMOJI['ERROR']} {Fore.RED} {self.translator.get('auth.database_error', error=str(e))}{Style.RESET_ALL}")
print(f"\n{EMOJI['ERROR']} {Fore.RED} {self.translator.get('auth.database_error', error=str(e)) if self.translator else f'Database error: {str(e)}'}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"\n{EMOJI['ERROR']} {Fore.RED} {self.translator.get('auth.an_error_occurred', error=str(e))}{Style.RESET_ALL}")
print(f"\n{EMOJI['ERROR']} {Fore.RED} {self.translator.get('auth.an_error_occurred', error=str(e)) if self.translator else f'An error occurred: {str(e)}'}{Style.RESET_ALL}")
return False
finally:
if conn:
conn.close()
print(f"{EMOJI['DB']} {Fore.CYAN} {self.translator.get('auth.database_connection_closed')}{Style.RESET_ALL}")
print(f"{EMOJI['DB']} {Fore.CYAN} {self.translator.get('auth.database_connection_closed') if self.translator else 'Database connection closed'}{Style.RESET_ALL}")

View File

@ -2,18 +2,20 @@ import os
from colorama import Fore, Style, init
import time
import random
from browser import BrowserManager
from control import BrowserControl
from faker import Faker
from cursor_auth import CursorAuth
from reset_machine_manual import MachineIDResetter
from get_user_token import get_token_from_cookie
from config import get_config
from account_manager import AccountManager
os.environ["PYTHONVERBOSE"] = "0"
os.environ["PYINSTALLER_VERBOSE"] = "0"
# 初始化colorama
# Initialize colorama
init()
# 定义emoji常量
# Define emoji constants
EMOJI = {
'START': '🚀',
'FORM': '📝',
@ -33,86 +35,124 @@ EMOJI = {
class CursorRegistration:
def __init__(self, translator=None):
self.translator = translator
# 设置为显示模式
# Set to display mode
os.environ['BROWSER_HEADLESS'] = 'False'
self.browser_manager = BrowserManager()
self.browser = None
self.controller = None
self.mail_url = "https://yopmail.com/zh/email-generator"
self.sign_up_url = "https://authenticator.cursor.sh/sign-up"
self.settings_url = "https://www.cursor.com/settings"
self.email_address = None
self.signup_tab = None
self.email_tab = None
# 账号信息
# initialize Faker instance
self.faker = Faker()
# generate account information
self.password = self._generate_password()
self.first_name = self._generate_name()
self.last_name = self._generate_name()
self.first_name = self.faker.first_name()
self.last_name = self.faker.last_name()
# modify the first letter of the first name(keep the original function)
new_first_letter = random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
self.first_name = new_first_letter + self.first_name[1:]
print(f"\n{Fore.CYAN}{EMOJI['PASSWORD']} {self.translator.get('register.password')}: {self.password} {Style.RESET_ALL}")
print(f"{Fore.CYAN}{EMOJI['FORM']} {self.translator.get('register.first_name')}: {self.first_name} {Style.RESET_ALL}")
print(f"{Fore.CYAN}{EMOJI['FORM']} {self.translator.get('register.last_name')}: {self.last_name} {Style.RESET_ALL}")
def _generate_password(self, length=12):
"""Generate Random Password"""
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*"
return ''.join(random.choices(chars, k=length))
def _generate_name(self, length=6):
"""Generate Random Name"""
first_letter = random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
rest_letters = ''.join(random.choices("abcdefghijklmnopqrstuvwxyz", k=length-1))
return first_letter + rest_letters
"""Generate password"""
return self.faker.password(length=length, special_chars=True, digits=True, upper_case=True, lower_case=True)
def setup_email(self):
"""设置邮箱"""
"""Setup Email"""
try:
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.browser_start')}...{Style.RESET_ALL}")
# Try to get a suggested email
account_manager = AccountManager(self.translator)
suggested_email = account_manager.suggest_email(self.first_name, self.last_name)
# 使用 new_tempemail 创建临时邮箱,传入 translator
from new_tempemail import NewTempEmail
self.temp_email = NewTempEmail(self.translator) # 传入 translator
if suggested_email:
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.suggest_email', suggested_email=suggested_email) if self.translator else f'Suggested email: {suggested_email}'}")
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.use_suggested_email_or_enter') if self.translator else 'Type "yes" to use this email or enter your own email:'}")
user_input = input().strip()
if user_input.lower() == 'yes' or user_input.lower() == 'y':
self.email_address = suggested_email
else:
# User input is their own email address
self.email_address = user_input
else:
# If there's no suggested email
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.manual_email_input') if self.translator else 'Please enter your email address:'}")
self.email_address = input().strip()
# 创建临时邮箱
email_address = self.temp_email.create_email()
if not email_address:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.email_create_failed')}{Style.RESET_ALL}")
# Validate if the email is valid
if '@' not in self.email_address:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_email') if self.translator else 'Invalid email address'}{Style.RESET_ALL}")
return False
# 保存邮箱地址和浏览器实例
self.email_address = email_address
self.email_tab = self.temp_email # 传递 NewTempEmail 实例而不是 page
self.controller = BrowserControl(self.temp_email.page, self.translator)
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('register.email_address')}: {self.email_address}" + "\n" + f"{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.email_setup_failed', error=str(e))}{Style.RESET_ALL}")
return False
def get_verification_code(self):
"""Manually Get Verification Code"""
try:
print(f"{Fore.CYAN}{EMOJI['CODE']} {self.translator.get('register.manual_code_input') if self.translator else 'Please enter the verification code:'}")
code = input().strip()
if not code.isdigit() or len(code) != 6:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_code') if self.translator else 'Invalid verification code'}{Style.RESET_ALL}")
return None
return code
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.code_input_failed', error=str(e))}{Style.RESET_ALL}")
return None
def register_cursor(self):
"""注册 Cursor"""
"""Register Cursor"""
browser_tab = None
try:
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.register_start')}...{Style.RESET_ALL}")
# 直接使用 new_signup.py 进行注册
# Check if tempmail_plus is enabled
config = get_config(self.translator)
email_tab = None
if config and config.has_section('TempMailPlus'):
if config.getboolean('TempMailPlus', 'enabled'):
email = config.get('TempMailPlus', 'email')
epin = config.get('TempMailPlus', 'epin')
if email and epin:
from email_tabs.tempmail_plus_tab import TempMailPlusTab
email_tab = TempMailPlusTab(email, epin, self.translator)
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('register.using_tempmail_plus')}{Style.RESET_ALL}")
# Use new_signup.py directly for registration
from new_signup import main as new_signup_main
# 执行新的注册流程,传入 translator
# Execute new registration process, passing translator
result, browser_tab = new_signup_main(
email=self.email_address,
password=self.password,
first_name=self.first_name,
last_name=self.last_name,
email_tab=self.email_tab,
controller=self.controller,
email_tab=email_tab, # Pass email_tab if tempmail_plus is enabled
controller=self, # Pass self instead of self.controller
translator=self.translator
)
if result:
# 使用返回的浏览器实例获取账户信息
self.signup_tab = browser_tab # 保存浏览器实例
# Use the returned browser instance to get account information
self.signup_tab = browser_tab # Save browser instance
success = self._get_account_info()
# 获取信息后关闭浏览器
# Close browser after getting information
if browser_tab:
try:
browser_tab.quit()
@ -127,7 +167,7 @@ class CursorRegistration:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.register_process_error', error=str(e))}{Style.RESET_ALL}")
return False
finally:
# 确保在任何情况下都关闭浏览器
# Ensure browser is closed in any case
if browser_tab:
try:
browser_tab.quit()
@ -135,7 +175,7 @@ class CursorRegistration:
pass
def _get_account_info(self):
"""获取账户信息和 Token"""
"""Get Account Information and Token"""
try:
self.signup_tab.get(self.settings_url)
time.sleep(2)
@ -150,6 +190,7 @@ class CursorRegistration:
if usage_ele:
total_usage = usage_ele.text.split("/")[-1].strip()
print(f"Total Usage: {total_usage}\n")
print(f"{Fore.CYAN}{EMOJI['WAIT']} {self.translator.get('register.get_token')}...{Style.RESET_ALL}")
max_attempts = 30
retry_interval = 2
@ -160,7 +201,7 @@ class CursorRegistration:
cookies = self.signup_tab.cookies()
for cookie in cookies:
if cookie.get("name") == "WorkosCursorSessionToken":
token = cookie["value"].split("%3A%3A")[1]
token = get_token_from_cookie(cookie["value"], self.translator)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('register.token_success')}{Style.RESET_ALL}")
self._save_account_info(token, total_usage)
return True
@ -186,39 +227,34 @@ class CursorRegistration:
return False
def _save_account_info(self, token, total_usage):
"""保存账户信息到文件"""
"""Save Account Information to File"""
try:
# 先更新认证信息
# Update authentication information first
print(f"{Fore.CYAN}{EMOJI['KEY']} {self.translator.get('register.update_cursor_auth_info')}...{Style.RESET_ALL}")
if self.update_cursor_auth(email=self.email_address, access_token=token, refresh_token=token):
if self.update_cursor_auth(email=self.email_address, access_token=token, refresh_token=token, auth_type="Auth_0"):
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('register.cursor_auth_info_updated')}...{Style.RESET_ALL}")
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.cursor_auth_info_update_failed')}...{Style.RESET_ALL}")
# 重置机器ID
# Reset machine ID
print(f"{Fore.CYAN}{EMOJI['UPDATE']} {self.translator.get('register.reset_machine_id')}...{Style.RESET_ALL}")
resetter = MachineIDResetter(self.translator) # 创建实例时传入translator
if not resetter.reset_machine_ids(): # 直接调用reset_machine_ids方法
resetter = MachineIDResetter(self.translator) # Create instance with translator
if not resetter.reset_machine_ids(): # Call reset_machine_ids method directly
raise Exception("Failed to reset machine ID")
# 保存账户信息到文件
with open('cursor_accounts.txt', 'a', encoding='utf-8') as f:
f.write(f"\n{'='*50}\n")
f.write(f"Email: {self.email_address}\n")
f.write(f"Password: {self.password}\n")
f.write(f"Token: {token}\n")
f.write(f"Usage Limit: {total_usage}\n")
f.write(f"{'='*50}\n")
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('register.account_info_saved')}...{Style.RESET_ALL}")
return True
# Save account information to file using AccountManager
account_manager = AccountManager(self.translator)
if account_manager.save_account_info(self.email_address, self.password, token, total_usage):
return True
else:
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.save_account_info_failed', error=str(e))}{Style.RESET_ALL}")
return False
def start(self):
"""启动注册流程"""
"""Start Registration Process"""
try:
if self.setup_email():
if self.register_cursor():
@ -226,17 +262,17 @@ class CursorRegistration:
return True
return False
finally:
# 关闭邮箱标签页
# Close email tab
if hasattr(self, 'temp_email'):
try:
self.temp_email.close()
except:
pass
def update_cursor_auth(self, email=None, access_token=None, refresh_token=None):
"""更新Cursor的认证信息的便捷函数"""
def update_cursor_auth(self, email=None, access_token=None, refresh_token=None, auth_type="Auth_0"):
"""Convenient function to update Cursor authentication information"""
auth_manager = CursorAuth(translator=self.translator)
return auth_manager.update_auth(email, access_token, refresh_token)
return auth_manager.update_auth(email, access_token, refresh_token, auth_type)
def main(translator=None):
"""Main function to be called from main.py"""

386
delete_cursor_google.py Normal file
View File

@ -0,0 +1,386 @@
from oauth_auth import OAuthHandler
import time
from colorama import Fore, Style, init
import sys
# Initialize colorama
init()
# Define emoji constants
EMOJI = {
'START': '🚀',
'DELETE': '🗑️',
'SUCCESS': '',
'ERROR': '',
'WAIT': '',
'INFO': '',
'WARNING': '⚠️'
}
class CursorGoogleAccountDeleter(OAuthHandler):
def __init__(self, translator=None):
super().__init__(translator, auth_type='google')
def delete_google_account(self):
"""Delete Cursor account using Google OAuth"""
try:
# Setup browser and select profile
if not self.setup_browser():
return False
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('account_delete.starting_process') if self.translator else 'Starting account deletion process...'}{Style.RESET_ALL}")
# Navigate to Cursor auth page - using the same URL as in registration
self.browser.get("https://authenticator.cursor.sh/sign-up")
time.sleep(2)
# Click Google auth button using same selectors as in registration
selectors = [
"//a[contains(@href,'GoogleOAuth')]",
"//a[contains(@class,'auth-method-button') and contains(@href,'GoogleOAuth')]",
"(//a[contains(@class,'auth-method-button')])[1]" # First auth button as fallback
]
auth_btn = None
for selector in selectors:
try:
auth_btn = self.browser.ele(f"xpath:{selector}", timeout=2)
if auth_btn:
break
except:
continue
if not auth_btn:
raise Exception(self.translator.get('account_delete.google_button_not_found') if self.translator else "Google login button not found")
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('account_delete.logging_in') if self.translator else 'Logging in with Google...'}{Style.RESET_ALL}")
auth_btn.click()
# Wait for authentication to complete using a more robust method
print(f"{Fore.CYAN}{EMOJI['WAIT']} {self.translator.get('account_delete.waiting_for_auth', fallback='Waiting for Google authentication...')}{Style.RESET_ALL}")
# Dynamic wait for authentication
max_wait_time = 120 # Increase maximum wait time to 120 seconds
start_time = time.time()
check_interval = 3 # Check every 3 seconds
google_account_alert_shown = False # Track if we've shown the alert already
while time.time() - start_time < max_wait_time:
current_url = self.browser.url
# If we're already on the settings or dashboard page, we're successful
if "/dashboard" in current_url or "/settings" in current_url or "cursor.com" in current_url:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('account_delete.login_successful') if self.translator else 'Login successful'}{Style.RESET_ALL}")
break
# If we're on Google accounts page or accounts.google.com, wait for user selection
if "accounts.google.com" in current_url:
# Only show the alert once to avoid spamming
if not google_account_alert_shown:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('account_delete.select_google_account', fallback='Please select your Google account...')}{Style.RESET_ALL}")
# Alert to indicate user action needed
try:
self.browser.run_js("""
alert('Please select your Google account to continue with Cursor authentication');
""")
google_account_alert_shown = True # Mark that we've shown the alert
except:
pass # Alert is optional
# Sleep before checking again
time.sleep(check_interval)
else:
# If the loop completed without breaking, it means we hit the timeout
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('account_delete.auth_timeout', fallback='Authentication timeout, continuing anyway...')}{Style.RESET_ALL}")
# Check current URL to determine next steps
current_url = self.browser.url
# If we're already on the settings page, no need to navigate
if "/settings" in current_url and "cursor.com" in current_url:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('account_delete.already_on_settings', fallback='Already on settings page')}{Style.RESET_ALL}")
# If we're on the dashboard or any Cursor page but not settings, navigate to settings
elif "cursor.com" in current_url or "authenticator.cursor.sh" in current_url:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('account_delete.navigating_to_settings', fallback='Navigating to settings page...')}{Style.RESET_ALL}")
self.browser.get("https://www.cursor.com/settings")
# If we're still on Google auth or somewhere else, try directly going to settings
else:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('account_delete.login_redirect_failed', fallback='Login redirection failed, trying direct navigation...')}{Style.RESET_ALL}")
self.browser.get("https://www.cursor.com/settings")
# Wait for the settings page to load
time.sleep(3) # Reduced from 5 seconds
# First look for the email element to confirm we're logged in
try:
email_element = self.browser.ele("css:div[class='flex w-full flex-col gap-2'] div:nth-child(2) p:nth-child(2)")
if email_element:
email = email_element.text
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('account_delete.found_email', email=email, fallback=f'Found email: {email}')}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('account_delete.email_not_found', error=str(e), fallback=f'Email not found: {str(e)}')}{Style.RESET_ALL}")
# Click on "Advanced" tab or dropdown - keep only the successful approach
advanced_found = False
# Direct JavaScript querySelector approach that worked according to logs
try:
advanced_element_js = self.browser.run_js("""
// Try to find the Advanced dropdown using querySelector with the exact classes
let advancedElement = document.querySelector('div.mb-0.flex.cursor-pointer.items-center.text-xs:not([style*="display: none"])');
// If not found, try a more general approach
if (!advancedElement) {
const allDivs = document.querySelectorAll('div');
for (const div of allDivs) {
if (div.textContent.includes('Advanced') &&
div.className.includes('mb-0') &&
div.className.includes('flex') &&
div.className.includes('cursor-pointer')) {
advancedElement = div;
break;
}
}
}
// Click the element if found
if (advancedElement) {
advancedElement.click();
return true;
}
return false;
""")
if advanced_element_js:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('account_delete.advanced_tab_clicked', fallback='Found and clicked Advanced using direct JavaScript selector')}{Style.RESET_ALL}")
advanced_found = True
time.sleep(1) # Reduced from 2 seconds
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('account_delete.advanced_tab_error', error=str(e), fallback='JavaScript querySelector approach failed: {str(e)}')}{Style.RESET_ALL}")
if not advanced_found:
# Fallback to direct URL navigation which is faster and more reliable
try:
self.browser.get("https://www.cursor.com/settings?tab=advanced")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('account_delete.direct_advanced_navigation', fallback='Trying direct navigation to advanced tab')}{Style.RESET_ALL}")
advanced_found = True
except:
raise Exception(self.translator.get('account_delete.advanced_tab_not_found') if self.translator else "Advanced option not found after multiple attempts")
# Wait for dropdown/tab content to load
time.sleep(2) # Reduced from 4 seconds
# Find and click the "Delete Account" button
delete_button_found = False
# Simplified approach for delete button based on what worked
delete_button_selectors = [
'xpath://button[contains(., "Delete Account")]',
'xpath://button[text()="Delete Account"]',
'xpath://div[contains(text(), "Delete Account")]',
'xpath://button[contains(text(), "Delete") and contains(text(), "Account")]'
]
for selector in delete_button_selectors:
try:
delete_button = self.browser.ele(selector, timeout=2)
if delete_button:
delete_button.click()
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('account_delete.delete_button_clicked') if self.translator else 'Clicked on Delete Account button'}{Style.RESET_ALL}")
delete_button_found = True
break
except:
continue
if not delete_button_found:
raise Exception(self.translator.get('account_delete.delete_button_not_found') if self.translator else "Delete Account button not found")
# Wait for confirmation dialog to appear
time.sleep(2)
# Check if we need to input "Delete" at all - some modals might not require it
input_required = True
try:
# Try detecting if the DELETE button is already enabled
delete_button_enabled = self.browser.run_js("""
const buttons = Array.from(document.querySelectorAll('button'));
const deleteButtons = buttons.filter(btn =>
btn.textContent.trim() === 'DELETE' ||
btn.textContent.trim() === 'Delete'
);
if (deleteButtons.length > 0) {
return !deleteButtons.some(btn => btn.disabled);
}
return false;
""")
if delete_button_enabled:
print(f"{Fore.CYAN}{EMOJI['INFO']} DELETE button appears to be enabled already. Input may not be required.{Style.RESET_ALL}")
input_required = False
except:
pass
# Type "Delete" in the confirmation input - only if required
delete_input_found = False
if input_required:
# Try common selectors for the input field
delete_input_selectors = [
'xpath://input[@placeholder="Delete"]',
'xpath://div[contains(@class, "modal")]//input',
'xpath://input',
'css:input'
]
for selector in delete_input_selectors:
try:
delete_input = self.browser.ele(selector, timeout=3)
if delete_input:
delete_input.clear()
delete_input.input("Delete")
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('account_delete.typed_delete', fallback='Typed \"Delete\" in confirmation box')}{Style.RESET_ALL}")
delete_input_found = True
time.sleep(2)
break
except:
# Try direct JavaScript input as fallback
try:
self.browser.run_js(r"""
arguments[0].value = "Delete";
const event = new Event('input', { bubbles: true });
arguments[0].dispatchEvent(event);
const changeEvent = new Event('change', { bubbles: true });
arguments[0].dispatchEvent(changeEvent);
""", delete_input)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('account_delete.typed_delete_js', fallback='Typed \"Delete\" using JavaScript')}{Style.RESET_ALL}")
delete_input_found = True
time.sleep(2)
break
except:
continue
if not delete_input_found:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('account_delete.delete_input_not_found', fallback='Delete confirmation input not found, continuing anyway')}{Style.RESET_ALL}")
time.sleep(2)
# Wait before clicking the final DELETE button
time.sleep(2)
# Click on the final DELETE button
confirm_button_found = False
# Use JavaScript approach for the DELETE button
try:
delete_button_js = self.browser.run_js("""
// Try to find the DELETE button by exact text content
const buttons = Array.from(document.querySelectorAll('button'));
const deleteButton = buttons.find(btn =>
btn.textContent.trim() === 'DELETE' ||
btn.textContent.trim() === 'Delete'
);
if (deleteButton) {
console.log("Found DELETE button with JavaScript");
deleteButton.click();
return true;
}
// If not found by text, try to find right-most button in the modal
const modalButtons = Array.from(document.querySelectorAll('.relative button, [role="dialog"] button, .modal button, [aria-modal="true"] button'));
if (modalButtons.length > 1) {
modalButtons.sort((a, b) => {
const rectA = a.getBoundingClientRect();
const rectB = b.getBoundingClientRect();
return rectB.right - rectA.right;
});
console.log("Clicking right-most button in modal");
modalButtons[0].click();
return true;
} else if (modalButtons.length === 1) {
console.log("Clicking single button found in modal");
modalButtons[0].click();
return true;
}
return false;
""")
if delete_button_js:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('account_delete.delete_button_clicked', fallback='Clicked DELETE button')}{Style.RESET_ALL}")
confirm_button_found = True
except:
pass
if not confirm_button_found:
# Fallback to simple selectors
delete_button_selectors = [
'xpath://button[text()="DELETE"]',
'xpath://div[contains(@class, "modal")]//button[last()]'
]
for selector in delete_button_selectors:
try:
delete_button = self.browser.ele(selector, timeout=2)
if delete_button:
delete_button.click()
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('account_delete.delete_button_clicked', fallback='Account deleted successfully!')}{Style.RESET_ALL}")
confirm_button_found = True
break
except:
continue
if not confirm_button_found:
raise Exception(self.translator.get('account_delete.confirm_button_not_found') if self.translator else "Confirm button not found")
# Wait a moment to see the confirmation
time.sleep(2)
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('account_delete.error', error=str(e)) if self.translator else f'Error during account deletion: {str(e)}'}{Style.RESET_ALL}")
return False
finally:
# Clean up browser
if self.browser:
try:
self.browser.quit()
except:
pass
def main(translator=None):
"""Main function to handle Google account deletion"""
print(f"\n{Fore.CYAN}{EMOJI['START']} {translator.get('account_delete.title') if translator else 'Cursor Google Account Deletion Tool'}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{'' * 50}{Style.RESET_ALL}")
deleter = CursorGoogleAccountDeleter(translator)
try:
# Ask for confirmation
print(f"{Fore.RED}{EMOJI['WARNING']} {translator.get('account_delete.warning') if translator else 'WARNING: This will permanently delete your Cursor account. This action cannot be undone.'}{Style.RESET_ALL}")
confirm = input(f"{Fore.RED} {translator.get('account_delete.confirm_prompt') if translator else 'Are you sure you want to proceed? (y/N): '}{Style.RESET_ALL}").lower()
if confirm != 'y':
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('account_delete.cancelled') if translator else 'Account deletion cancelled.'}{Style.RESET_ALL}")
return
success = deleter.delete_google_account()
if success:
print(f"\n{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('account_delete.success') if translator else 'Your Cursor account has been successfully deleted!'}{Style.RESET_ALL}")
else:
print(f"\n{Fore.RED}{EMOJI['ERROR']} {translator.get('account_delete.failed') if translator else 'Account deletion process failed or was cancelled.'}{Style.RESET_ALL}")
except KeyboardInterrupt:
print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('account_delete.interrupted') if translator else 'Account deletion process interrupted by user.'}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('account_delete.unexpected_error', error=str(e)) if translator else f'Unexpected error: {str(e)}'}{Style.RESET_ALL}")
finally:
print(f"{Fore.YELLOW}{'' * 50}{Style.RESET_ALL}")
if __name__ == "__main__":
main()

268
disable_auto_update.py Normal file
View File

@ -0,0 +1,268 @@
import os
import sys
import platform
import shutil
from colorama import Fore, Style, init
import subprocess
from config import get_config
import re
import tempfile
# Initialize colorama
init()
# Define emoji constants
EMOJI = {
"PROCESS": "🔄",
"SUCCESS": "",
"ERROR": "",
"INFO": "",
"FOLDER": "📁",
"FILE": "📄",
"STOP": "🛑",
"CHECK": "✔️"
}
class AutoUpdateDisabler:
def __init__(self, translator=None):
self.translator = translator
self.system = platform.system()
# Get path from configuration file
config = get_config(translator)
if config:
if self.system == "Windows":
self.updater_path = config.get('WindowsPaths', 'updater_path', fallback=os.path.join(os.getenv("LOCALAPPDATA", ""), "cursor-updater"))
self.update_yml_path = config.get('WindowsPaths', 'update_yml_path', fallback=os.path.join(os.getenv("LOCALAPPDATA", ""), "Programs", "Cursor", "resources", "app", "update.yml"))
self.product_json_path = config.get('WindowsPaths', 'product_json_path', fallback=os.path.join(os.getenv("LOCALAPPDATA", ""), "Programs", "Cursor", "resources", "app", "product.json"))
elif self.system == "Darwin":
self.updater_path = config.get('MacPaths', 'updater_path', fallback=os.path.expanduser("~/Library/Application Support/cursor-updater"))
self.update_yml_path = config.get('MacPaths', 'update_yml_path', fallback="/Applications/Cursor.app/Contents/Resources/app-update.yml")
self.product_json_path = config.get('MacPaths', 'product_json_path', fallback="/Applications/Cursor.app/Contents/Resources/app/product.json")
elif self.system == "Linux":
self.updater_path = config.get('LinuxPaths', 'updater_path', fallback=os.path.expanduser("~/.config/cursor-updater"))
self.update_yml_path = config.get('LinuxPaths', 'update_yml_path', fallback=os.path.expanduser("~/.config/cursor/resources/app-update.yml"))
self.product_json_path = config.get('LinuxPaths', 'product_json_path', fallback=os.path.expanduser("~/.config/cursor/resources/app/product.json"))
else:
# If configuration loading fails, use default paths
self.updater_paths = {
"Windows": os.path.join(os.getenv("LOCALAPPDATA", ""), "cursor-updater"),
"Darwin": os.path.expanduser("~/Library/Application Support/cursor-updater"),
"Linux": os.path.expanduser("~/.config/cursor-updater")
}
self.updater_path = self.updater_paths.get(self.system)
self.update_yml_paths = {
"Windows": os.path.join(os.getenv("LOCALAPPDATA", ""), "Programs", "Cursor", "resources", "app", "update.yml"),
"Darwin": "/Applications/Cursor.app/Contents/Resources/app-update.yml",
"Linux": os.path.expanduser("~/.config/cursor/resources/app-update.yml")
}
self.update_yml_path = self.update_yml_paths.get(self.system)
self.product_json_paths = {
"Windows": os.path.join(os.getenv("LOCALAPPDATA", ""), "Programs", "Cursor", "resources", "app", "product.json"),
"Darwin": "/Applications/Cursor.app/Contents/Resources/app/product.json",
"Linux": os.path.expanduser("~/.config/cursor/resources/app/product.json")
}
self.product_json_path = self.product_json_paths.get(self.system)
def _remove_update_url(self):
"""Remove update URL"""
try:
original_stat = os.stat(self.product_json_path)
original_mode = original_stat.st_mode
original_uid = original_stat.st_uid
original_gid = original_stat.st_gid
with tempfile.NamedTemporaryFile(mode="w", delete=False) as tmp_file:
with open(self.product_json_path, "r", encoding="utf-8") as product_json_file:
content = product_json_file.read()
patterns = {
r"https://api2.cursor.sh/aiserver.v1.AuthService/DownloadUpdate": r"",
r"https://api2.cursor.sh/updates": r"",
r"http://cursorapi.com/updates": r"",
}
for pattern, replacement in patterns.items():
content = re.sub(pattern, replacement, content)
tmp_file.write(content)
tmp_path = tmp_file.name
shutil.copy2(self.product_json_path, self.product_json_path + ".old")
shutil.move(tmp_path, self.product_json_path)
os.chmod(self.product_json_path, original_mode)
if os.name != "nt":
os.chown(self.product_json_path, original_uid, original_gid)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.file_modified')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.modify_file_failed', error=str(e))}{Style.RESET_ALL}")
if "tmp_path" in locals():
os.unlink(tmp_path)
return False
def _kill_cursor_processes(self):
"""End all Cursor processes"""
try:
print(f"{Fore.CYAN}{EMOJI['PROCESS']} {self.translator.get('update.killing_processes') if self.translator else '正在结束 Cursor 进程...'}{Style.RESET_ALL}")
if self.system == "Windows":
subprocess.run(['taskkill', '/F', '/IM', 'Cursor.exe', '/T'], capture_output=True)
else:
subprocess.run(['pkill', '-f', 'Cursor'], capture_output=True)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('update.processes_killed') if self.translator else 'Cursor 进程已结束'}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('update.kill_process_failed', error=str(e)) if self.translator else f'结束进程失败: {e}'}{Style.RESET_ALL}")
return False
def _remove_updater_directory(self):
"""Delete updater directory"""
try:
updater_path = self.updater_path
if not updater_path:
raise OSError(self.translator.get('update.unsupported_os', system=self.system) if self.translator else f"不支持的操作系统: {self.system}")
print(f"{Fore.CYAN}{EMOJI['FOLDER']} {self.translator.get('update.removing_directory') if self.translator else '正在删除更新程序目录...'}{Style.RESET_ALL}")
if os.path.exists(updater_path):
try:
if os.path.isdir(updater_path):
shutil.rmtree(updater_path)
else:
os.remove(updater_path)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('update.directory_removed') if self.translator else '更新程序目录已删除'}{Style.RESET_ALL}")
except PermissionError:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('update.directory_locked', path=updater_path) if self.translator else f'更新程序目录已被锁定,跳过删除: {updater_path}'}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('update.remove_directory_failed', error=str(e)) if self.translator else f'删除目录失败: {e}'}{Style.RESET_ALL}")
return True
def _clear_update_yml_file(self):
"""Clear update.yml file"""
try:
update_yml_path = self.update_yml_path
if not update_yml_path:
raise OSError(self.translator.get('update.unsupported_os', system=self.system) if self.translator else f"不支持的操作系统: {self.system}")
print(f"{Fore.CYAN}{EMOJI['FILE']} {self.translator.get('update.clearing_update_yml') if self.translator else '正在清空更新配置文件...'}{Style.RESET_ALL}")
if os.path.exists(update_yml_path):
try:
with open(update_yml_path, 'w') as f:
f.write('')
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('update.update_yml_cleared') if self.translator else '更新配置文件已清空'}{Style.RESET_ALL}")
except PermissionError:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('update.yml_locked') if self.translator else '更新配置文件已被锁定,跳过清空'}{Style.RESET_ALL}")
else:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('update.update_yml_not_found') if self.translator else '更新配置文件不存在'}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('update.clear_update_yml_failed', error=str(e)) if self.translator else f'清空更新配置文件失败: {e}'}{Style.RESET_ALL}")
return False
def _create_blocking_file(self):
"""Create blocking files"""
try:
# 检查 updater_path
updater_path = self.updater_path
if not updater_path:
raise OSError(self.translator.get('update.unsupported_os', system=self.system) if self.translator else f"不支持的操作系统: {self.system}")
print(f"{Fore.CYAN}{EMOJI['FILE']} {self.translator.get('update.creating_block_file') if self.translator else '正在创建阻止文件...'}{Style.RESET_ALL}")
# 创建 updater_path 阻止文件
try:
os.makedirs(os.path.dirname(updater_path), exist_ok=True)
open(updater_path, 'w').close()
# 设置 updater_path 为只读
if self.system == "Windows":
os.system(f'attrib +r "{updater_path}"')
else:
os.chmod(updater_path, 0o444) # 设置为只读
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('update.block_file_created') if self.translator else '阻止文件已创建'}: {updater_path}{Style.RESET_ALL}")
except PermissionError:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('update.block_file_locked') if self.translator else '阻止文件已被锁定,跳过创建'}{Style.RESET_ALL}")
# 检查 update_yml_path
update_yml_path = self.update_yml_path
if update_yml_path and os.path.exists(os.path.dirname(update_yml_path)):
try:
# 创建 update_yml_path 阻止文件
with open(update_yml_path, 'w') as f:
f.write('# This file is locked to prevent auto-updates\nversion: 0.0.0\n')
# 设置 update_yml_path 为只读
if self.system == "Windows":
os.system(f'attrib +r "{update_yml_path}"')
else:
os.chmod(update_yml_path, 0o444) # 设置为只读
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('update.yml_locked') if self.translator else '更新配置文件已锁定'}: {update_yml_path}{Style.RESET_ALL}")
except PermissionError:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('update.yml_already_locked') if self.translator else '更新配置文件已被锁定,跳过修改'}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('update.create_block_file_failed', error=str(e)) if self.translator else f'创建阻止文件失败: {e}'}{Style.RESET_ALL}")
return True # 返回 True 以继续执行后续步骤
def disable_auto_update(self):
"""Disable auto update"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('update.start_disable') if self.translator else '开始禁用自动更新...'}{Style.RESET_ALL}")
# 1. End processes
if not self._kill_cursor_processes():
return False
# 2. Delete directory - 即使失败也继续执行
self._remove_updater_directory()
# 3. Clear update.yml file
if not self._clear_update_yml_file():
return False
# 4. Create blocking file
if not self._create_blocking_file():
return False
# 5. Remove update URL from product.json
if not self._remove_update_url():
return False
print(f"{Fore.GREEN}{EMOJI['CHECK']} {self.translator.get('update.disable_success') if self.translator else '自动更新已禁用'}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('update.disable_failed', error=str(e)) if self.translator else f'禁用自动更新失败: {e}'}{Style.RESET_ALL}")
return False
def run(translator=None):
"""Convenient function for directly calling the disable function"""
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{EMOJI['STOP']} {translator.get('update.title') if translator else 'Disable Cursor Auto Update'}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
disabler = AutoUpdateDisabler(translator)
disabler.disable_auto_update()
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
input(f"{EMOJI['INFO']} {translator.get('update.press_enter') if translator else 'Press Enter to Continue...'}")
if __name__ == "__main__":
from main import translator as main_translator
run(main_translator)

View File

@ -0,0 +1,27 @@
from abc import ABC, abstractmethod
class EmailTabInterface(ABC):
"""Interface for email tab implementations"""
@abstractmethod
def refresh_inbox(self) -> None:
"""Refresh the email inbox"""
pass
@abstractmethod
def check_for_cursor_email(self) -> bool:
"""Check if there is a new email from Cursor
Returns:
bool: True if new email found, False otherwise
"""
pass
@abstractmethod
def get_verification_code(self) -> str:
"""Get the verification code from the email
Returns:
str: The verification code if available, empty string otherwise
"""
pass

View File

@ -0,0 +1,217 @@
import requests
import re
import datetime
import time
from typing import Optional
from .email_tab_interface import EmailTabInterface
class TempMailPlusTab(EmailTabInterface):
"""Implementation of EmailTabInterface for tempmail.plus"""
def __init__(self, email: str, epin: str, translator=None,
polling_interval: int = 2, max_attempts: int = 10):
"""Initialize TempMailPlusTab
Args:
email: The email address to check
epin: The epin token for authentication
translator: Optional translator for internationalization
polling_interval: Time in seconds between polling attempts
max_attempts: Maximum number of polling attempts
"""
self.email = email
self.epin = epin
self.translator = translator
self.base_url = "https://tempmail.plus/api"
self.headers = {
'accept': 'application/json',
'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6',
'cache-control': 'no-cache',
'pragma': 'no-cache',
'referer': 'https://tempmail.plus/zh/',
'sec-ch-ua': '"Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
'x-requested-with': 'XMLHttpRequest'
}
self.cookies = {'email': email}
self._cached_mail_id = None # Cache for mail_id
self._cached_verification_code = None # Cache for verification code
# Polling configuration
self.polling_interval = polling_interval
self.max_attempts = max_attempts
self.current_attempt = 0
def refresh_inbox(self) -> None:
"""Refresh the email inbox"""
pass
def check_for_cursor_email(self) -> bool:
"""Check if there is a new email and immediately retrieve verification code
Returns:
bool: True if new email found and verification code retrieved, False otherwise
"""
# Reset attempt counter
self.current_attempt = 0
# Polling logic
while self.current_attempt < self.max_attempts:
found = self._check_email_once()
if found:
# Successfully found email and retrieved verification code
self.current_attempt = 0 # Reset counter for next use
return True
# Not found, continue polling
self.current_attempt += 1
if self.current_attempt < self.max_attempts:
# Print polling status information
if self.translator:
print(self.translator.get('tempmail.polling',
attempt=self.current_attempt,
max=self.max_attempts))
else:
print(f"Polling for email: attempt {self.current_attempt}/{self.max_attempts}")
time.sleep(self.polling_interval)
# Exceeded maximum attempts
if self.translator:
print(self.translator.get('tempmail.max_attempts_reached'))
else:
print(f"Max attempts ({self.max_attempts}) reached. No verification email found.")
return False
def _check_email_once(self) -> bool:
"""Single attempt to check for email
Returns:
bool: True if new email found and verification code retrieved, False otherwise
"""
try:
params = {
'email': self.email,
'epin': self.epin
}
response = requests.get(
f"{self.base_url}/mails",
params=params,
headers=self.headers,
cookies=self.cookies
)
response.raise_for_status()
data = response.json()
if data.get('result') and data.get('mail_list'):
# Check if the first email in the list is a new email
if data['mail_list'][0].get('is_new') == True:
self._cached_mail_id = data['mail_list'][0].get('mail_id') # Cache the mail_id
# Immediately retrieve verification code
verification_code = self._extract_verification_code()
if verification_code:
self._cached_verification_code = verification_code
return True
return False
except Exception as e:
print(f"{self.translator.get('tempmail.check_email_failed', error=str(e)) if self.translator else f'Check email failed: {str(e)}'}")
return False
def _extract_verification_code(self) -> str:
"""Extract verification code from email content
Returns:
str: The verification code if found, empty string otherwise
"""
try:
if not self._cached_mail_id:
return ""
params = {
'email': self.email,
'epin': self.epin
}
response = requests.get(
f"{self.base_url}/mails/{self._cached_mail_id}",
params=params,
headers=self.headers,
cookies=self.cookies
)
response.raise_for_status()
data = response.json()
if not data.get('result'):
return ""
# Verify if sender email contains cursor string
from_mail = data.get('from_mail', '')
if 'cursor' not in from_mail.lower():
return ""
# Extract verification code from text content using regex
text = data.get('text', '')
match = re.search(r'\n\n(\d{6})\n\n', text)
if match:
return match.group(1)
return ""
except Exception as e:
print(f"{self.translator.get('tempmail.extract_code_failed', error=str(e)) if self.translator else f'Extract verification code failed: {str(e)}'}")
return ""
def get_verification_code(self) -> str:
"""Get the verification code from cache
Returns:
str: The cached verification code if available, empty string otherwise
"""
return self._cached_verification_code or ""
if __name__ == "__main__":
import os
import sys
import configparser
from config import get_config
# Try to import translator
try:
from main import Translator
translator = Translator()
except ImportError:
translator = None
config = get_config(translator)
try:
email = config.get('TempMailPlus', 'email')
epin = config.get('TempMailPlus', 'epin')
print(f"{translator.get('tempmail.configured_email', email=email) if translator else f'Configured email: {email}'}")
# Initialize TempMailPlusTab, pass translator
mail_tab = TempMailPlusTab(email, epin, translator)
# Check if there is a Cursor email
print(f"{translator.get('tempmail.checking_email') if translator else 'Checking for Cursor verification email...'}")
if mail_tab.check_for_cursor_email():
print(f"{translator.get('tempmail.email_found') if translator else 'Found Cursor verification email'}")
# Get verification code
verification_code = mail_tab.get_verification_code()
if verification_code:
print(f"{translator.get('tempmail.verification_code', code=verification_code) if translator else f'Verification code: {verification_code}'}")
else:
print(f"{translator.get('tempmail.no_code') if translator else 'Could not get verification code'}")
else:
print(f"{translator.get('tempmail.no_email') if translator else 'No Cursor verification email found'}")
except configparser.Error as e:
print(f"{translator.get('tempmail.config_error', error=str(e)) if translator else f'Config file error: {str(e)}'}")
except Exception as e:
print(f"{translator.get('tempmail.general_error', error=str(e)) if translator else f'An error occurred: {str(e)}'}")

View File

@ -0,0 +1,361 @@
"""
Compares two JSON translation files in /locales (e.g., en.json and ar.json).
Finds keys missing in the target file, translates their values using Google Translate API (googletrans 4.0.2),
and inserts the translations. Runs in parallel for speed and creates a backup of the target file.
"""
import json
import sys
import os
from pathlib import Path
import re
from concurrent.futures import ThreadPoolExecutor, as_completed
from colorama import init, Fore, Style
import time
import shutil
import asyncio
# Import googletrans with error handling
try:
from googletrans import Translator as GoogleTranslator
GOOGLETRANS_AVAILABLE = True
print(f"{Fore.GREEN}Using googletrans for translation.{Style.RESET_ALL}")
except ImportError:
GOOGLETRANS_AVAILABLE = False
print(f"{Fore.YELLOW}googletrans library not found. Will use web scraping fallback method.{Style.RESET_ALL}")
print(f"{Fore.YELLOW}To install googletrans: pip install googletrans==4.0.2{Style.RESET_ALL}")
import requests
init(autoreset=True)
# Language code mapping to Google Translate language codes
LANGUAGE_MAPPING = {
"zh_cn": "zh-CN", # Simplified Chinese
"zh_tw": "zh-TW", # Traditional Chinese
"ar": "ar", # Arabic
"bg": "bg", # Bulgarian
"de": "de", # German
"en": "en", # English
"es": "es", # Spanish
"fr": "fr", # French
"it": "it", # Italian
"ja": "ja", # Japanese
"ko": "ko", # Korean
"nl": "nl", # Dutch
"pt": "pt", # Portuguese
"ru": "ru", # Russian
"tr": "tr", # Turkish
"vi": "vi", # Vietnamese
# Add more mappings as needed
}
# Recursively get all keys in the JSON as dot-separated paths
def get_keys(d, prefix=''):
keys = set()
for k, v in d.items():
full_key = f"{prefix}.{k}" if prefix else k
if isinstance(v, dict):
keys |= get_keys(v, full_key)
else:
keys.add(full_key)
return keys
# Get value from nested dict by dot-separated path
def get_by_path(d, path):
for p in path.split('.'):
d = d[p]
return d
# Set value in nested dict by dot-separated path
def set_by_path(d, path, value):
parts = path.split('.')
for p in parts[:-1]:
if p not in d:
d[p] = {}
d = d[p]
d[parts[-1]] = value
# Get Google Translate language code from file name
def get_google_lang_code(file_lang):
# Remove .json extension if present
if file_lang.endswith('.json'):
file_lang = file_lang[:-5]
# Return mapped language code or the original if not in mapping
return LANGUAGE_MAPPING.get(file_lang, file_lang)
# Translate text using Google Translate API if available, otherwise fallback to web scraping
def translate(text, source, target):
# Map language codes to Google Translate format
source_lang = get_google_lang_code(source)
target_lang = get_google_lang_code(target)
print(f"{Fore.CYAN}Translating from {source_lang} to {target_lang}{Style.RESET_ALL}")
if GOOGLETRANS_AVAILABLE:
try:
# Use synchronous web scraping instead of async googletrans
return translate_web_scraping(text, source_lang, target_lang)
except Exception as e:
print(Fore.YELLOW + f"Translation error: {e}. Trying alternative method.")
return translate_web_scraping(text, source_lang, target_lang)
else:
return translate_web_scraping(text, source_lang, target_lang)
# Fallback translation method using web scraping
def translate_web_scraping(text, source, target):
try:
import requests
# 使用更可靠的 Google 翻译 API URL
url = f"https://translate.googleapis.com/translate_a/single?client=gtx&sl={source}&tl={target}&dt=t&q={requests.utils.quote(text)}"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 200:
# 解析 JSON 响应
result = response.json()
# 提取翻译结果
translated_text = ''
for sentence in result[0]:
if len(sentence) > 0:
translated_text += sentence[0]
if translated_text:
return translated_text
else:
print(Fore.RED + f"Translation not found for: {text}")
return text
else:
print(Fore.RED + f"Request failed with status code {response.status_code} for: {text}")
return text
except Exception as e:
print(Fore.RED + f"Web scraping translation error: {e}")
return text
# Process a single language file
def process_language(en_filename, other_filename, create_backup=None):
# Always use the /locales directory
en_path = Path("locales") / en_filename
other_path = Path("locales") / other_filename
# Infer language code from filename (before .json)
en_lang = Path(en_filename).stem
other_lang = Path(other_filename).stem
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
print(f"{Fore.CYAN}Processing: {other_filename} (Translating to {get_google_lang_code(other_lang)}){Style.RESET_ALL}")
print(f"{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
print(f"{Fore.CYAN}Reading source file: {en_path}{Style.RESET_ALL}")
with open(en_path, encoding='utf-8') as f:
en = json.load(f)
print(f"{Fore.CYAN}Reading target file: {other_path}{Style.RESET_ALL}")
try:
with open(other_path, encoding='utf-8') as f:
other = json.load(f)
except FileNotFoundError:
# If target file doesn't exist, create an empty one
print(f"{Fore.YELLOW}Target file not found. Creating a new file.{Style.RESET_ALL}")
other = {}
except json.JSONDecodeError:
# If target file is invalid JSON, create an empty one
print(f"{Fore.YELLOW}Target file contains invalid JSON. Creating a new file.{Style.RESET_ALL}")
other = {}
en_keys = get_keys(en)
other_keys = get_keys(other)
missing = en_keys - other_keys
print(f"{Fore.YELLOW}Found {len(missing)} missing keys{Style.RESET_ALL}")
if not missing:
print(f"{Fore.GREEN}No missing keys found. Translation is complete!{Style.RESET_ALL}")
return True
# Parallel translation using ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=3) as executor: # Further reduced workers for googletrans 4.0.2
future_to_key = {
executor.submit(translate, get_by_path(en, key), en_lang, other_lang): key
for key in missing
}
completed = 0
total = len(missing)
for future in as_completed(future_to_key):
key = future_to_key[future]
value = get_by_path(en, key)
try:
translated = future.result()
completed += 1
print(f"{Fore.CYAN}[{completed}/{total}] Translated [{key}]: '{value}' -> " + Fore.MAGENTA + f"'{translated}'")
except Exception as exc:
print(f"{Fore.RED}Error translating {key}: {exc}")
translated = value
set_by_path(other, key, translated)
# Ask about backup if not specified
if create_backup is None and os.path.exists(other_path):
while True:
backup_choice = input(f"{Fore.CYAN}Create backup file? (y/N): {Style.RESET_ALL}").lower()
if backup_choice in ['y', 'yes']:
create_backup = True
break
elif backup_choice in ['', 'n', 'no']:
create_backup = False
break
else:
print(f"{Fore.RED}Invalid choice. Please enter 'y' or 'n'.{Style.RESET_ALL}")
# Create backup if requested and file exists
if create_backup and os.path.exists(other_path):
backup_path = other_path.with_suffix('.bak.json')
shutil.copy2(other_path, backup_path)
print(f"{Fore.GREEN}Backup created at {backup_path}{Style.RESET_ALL}")
# Save the updated file
with open(other_path, 'w', encoding='utf-8') as f:
json.dump(other, f, ensure_ascii=False, indent=4)
print(f"{Fore.GREEN}File updated: {other_path}{Style.RESET_ALL}")
return True
# Main function with interactive menu
def main():
# Check if locales directory exists
locales_dir = Path("locales")
if not locales_dir.exists():
print(f"{Fore.YELLOW}Creating 'locales' directory...{Style.RESET_ALL}")
locales_dir.mkdir(parents=True)
# Get all JSON files in locales directory (excluding backup files)
json_files = [f for f in os.listdir(locales_dir) if f.endswith('.json') and not f.endswith('.bak.json')]
# Check if en.json exists (source file)
if 'en.json' not in json_files:
print(f"{Fore.RED}Error: 'en.json' not found in locales directory. This file is required as the source for translations.{Style.RESET_ALL}")
return False
# Get all target language files (excluding en.json)
target_files = [f for f in json_files if f != 'en.json']
# Add option to create a new language file
available_languages = list(LANGUAGE_MAPPING.keys())
if 'en' in available_languages:
available_languages.remove('en') # Remove English as it's the source
# Filter out languages that already have files
existing_lang_codes = [f.split('.')[0] for f in target_files]
available_languages = [lang for lang in available_languages if lang not in existing_lang_codes]
# Display menu
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
print(f"{Fore.CYAN}Translation Tool - Select target language to update{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
print(f"{Fore.GREEN}0{Style.RESET_ALL}. Translate all existing language files")
# List existing language files
for i, file in enumerate(target_files, 1):
lang_code = file.split('.')[0]
google_lang = get_google_lang_code(lang_code)
print(f"{Fore.GREEN}{i}{Style.RESET_ALL}. {lang_code} ({google_lang})")
# Option to create a new language file (only if there are available languages)
next_option = len(target_files) + 1
if available_languages:
print(f"\n{Fore.CYAN}Create new language file:{Style.RESET_ALL}")
print(f"{Fore.GREEN}{next_option}{Style.RESET_ALL}. Create a new language file")
max_choice = next_option
else:
max_choice = len(target_files)
# Get user choice
while True:
try:
choice = input(f"\n{Fore.CYAN}Enter your choice (0-{max_choice}): {Style.RESET_ALL}")
if choice.strip() == '':
print(f"{Fore.RED}Please enter a number.{Style.RESET_ALL}")
continue
choice = int(choice)
if choice < 0 or choice > max_choice:
print(f"{Fore.RED}Invalid choice. Please enter a number between 0 and {max_choice}.{Style.RESET_ALL}")
continue
break
except ValueError:
print(f"{Fore.RED}Invalid input. Please enter a number.{Style.RESET_ALL}")
# Ask about backup for all files
create_backup = None
if choice == 0:
while True:
backup_choice = input(f"{Fore.CYAN}Create backup files? (y/N): {Style.RESET_ALL}").lower()
if backup_choice in ['y', 'yes']:
create_backup = True
break
elif backup_choice in ['', 'n', 'no']:
create_backup = False
break
else:
print(f"{Fore.RED}Invalid choice. Please enter 'y' or 'n'.{Style.RESET_ALL}")
# Process selected language(s)
if choice == 0:
print(f"{Fore.CYAN}Translating all existing languages...{Style.RESET_ALL}")
success_count = 0
for target_file in target_files:
try:
if process_language('en.json', target_file, create_backup):
success_count += 1
except Exception as e:
print(f"{Fore.RED}Error processing {target_file}: {str(e)}{Style.RESET_ALL}")
print(f"\n{Fore.GREEN}Translation completed for {success_count} out of {len(target_files)} languages.{Style.RESET_ALL}")
elif available_languages and choice == next_option:
# Create a new language file
print(f"\n{Fore.CYAN}Available languages:{Style.RESET_ALL}")
for i, lang in enumerate(available_languages):
google_lang = get_google_lang_code(lang)
print(f"{Fore.GREEN}{i+1}{Style.RESET_ALL}. {lang} ({google_lang})")
while True:
try:
lang_choice = input(f"\n{Fore.CYAN}Select language (1-{len(available_languages)}): {Style.RESET_ALL}")
lang_choice = int(lang_choice)
if lang_choice < 1 or lang_choice > len(available_languages):
print(f"{Fore.RED}Invalid choice. Please enter a number between 1 and {len(available_languages)}.{Style.RESET_ALL}")
continue
selected_lang = available_languages[lang_choice-1]
new_file = f"{selected_lang}.json"
if new_file in json_files:
print(f"{Fore.YELLOW}Warning: {new_file} already exists. It will be updated with missing translations.{Style.RESET_ALL}")
process_language('en.json', new_file)
print(f"\n{Fore.GREEN}Created and translated {new_file}.{Style.RESET_ALL}")
break
except ValueError:
print(f"{Fore.RED}Invalid input. Please enter a number.{Style.RESET_ALL}")
else:
target_file = target_files[choice - 1]
try:
process_language('en.json', target_file)
print(f"\n{Fore.GREEN}Translation completed for {target_file}.{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}Error processing {target_file}: {str(e)}{Style.RESET_ALL}")
return True
if __name__ == "__main__":
# If arguments are provided, use the old method
if len(sys.argv) == 3:
process_language(sys.argv[1], sys.argv[2])
else:
# Otherwise, show the interactive menu
main()

112
get_user_token.py Normal file
View File

@ -0,0 +1,112 @@
import requests
import json
import time
from colorama import Fore, Style
import os
from config import get_config
# Define emoji constants
EMOJI = {
'START': '🚀',
'OAUTH': '🔑',
'SUCCESS': '',
'ERROR': '',
'WAIT': '',
'INFO': '',
'WARNING': '⚠️'
}
def refresh_token(token, translator=None):
"""Refresh the token using the Chinese server API
Args:
token (str): The full WorkosCursorSessionToken cookie value
translator: Optional translator object
Returns:
str: The refreshed access token or original token if refresh fails
"""
try:
config = get_config(translator)
# Get refresh_server URL from config or use default
refresh_server = config.get('Token', 'refresh_server', fallback='https://token.cursorpro.com.cn')
# Ensure the token is URL encoded properly
if '%3A%3A' not in token and '::' in token:
# Replace :: with URL encoded version if needed
token = token.replace('::', '%3A%3A')
# Make the request to the refresh server
url = f"{refresh_server}/reftoken?token={token}"
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('token.refreshing') if translator else 'Refreshing token...'}{Style.RESET_ALL}")
response = requests.get(url, timeout=30)
if response.status_code == 200:
try:
data = response.json()
if data.get('code') == 0 and data.get('msg') == "获取成功":
access_token = data.get('data', {}).get('accessToken')
days_left = data.get('data', {}).get('days_left', 0)
expire_time = data.get('data', {}).get('expire_time', 'Unknown')
if access_token:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('token.refresh_success', days=days_left, expire=expire_time) if translator else f'Token refreshed successfully! Valid for {days_left} days (expires: {expire_time})'}{Style.RESET_ALL}")
return access_token
else:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {translator.get('token.no_access_token') if translator else 'No access token in response'}{Style.RESET_ALL}")
else:
error_msg = data.get('msg', 'Unknown error')
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('token.refresh_failed', error=error_msg) if translator else f'Token refresh failed: {error_msg}'}{Style.RESET_ALL}")
except json.JSONDecodeError:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('token.invalid_response') if translator else 'Invalid JSON response from refresh server'}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('token.server_error', status=response.status_code) if translator else f'Refresh server error: HTTP {response.status_code}'}{Style.RESET_ALL}")
except requests.exceptions.Timeout:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('token.request_timeout') if translator else 'Request to refresh server timed out'}{Style.RESET_ALL}")
except requests.exceptions.ConnectionError:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('token.connection_error') if translator else 'Connection error to refresh server'}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('token.unexpected_error', error=str(e)) if translator else f'Unexpected error during token refresh: {str(e)}'}{Style.RESET_ALL}")
# Return original token if refresh fails
return token.split('%3A%3A')[-1] if '%3A%3A' in token else token.split('::')[-1] if '::' in token else token
def get_token_from_cookie(cookie_value, translator=None):
"""Extract and process token from cookie value
Args:
cookie_value (str): The WorkosCursorSessionToken cookie value
translator: Optional translator object
Returns:
str: The processed token
"""
try:
# Try to refresh the token with the API first
refreshed_token = refresh_token(cookie_value, translator)
# If refresh succeeded and returned a different token, use it
if refreshed_token and refreshed_token != cookie_value:
return refreshed_token
# If refresh failed or returned same token, use traditional extraction method
if '%3A%3A' in cookie_value:
return cookie_value.split('%3A%3A')[-1]
elif '::' in cookie_value:
return cookie_value.split('::')[-1]
else:
return cookie_value
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('token.extraction_error', error=str(e)) if translator else f'Error extracting token: {str(e)}'}{Style.RESET_ALL}")
# Fall back to original behavior
if '%3A%3A' in cookie_value:
return cookie_value.split('%3A%3A')[-1]
elif '::' in cookie_value:
return cookie_value.split('::')[-1]
else:
return cookie_value

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
images/paypal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
images/provi-code.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

866
locales/ar.json Normal file
View File

@ -0,0 +1,866 @@
{
"menu": {
"title": "الخيارات المتاحة",
"exit": "خروج من البرنامج",
"reset": "إعادة تعيين معرف الجهاز",
"register": "تسجيل حساب Cursor جديد",
"register_google": "تسجيل باستخدام حساب جوجل",
"register_github": "تسجيل باستخدام حساب GitHub",
"register_manual": "تسجيل Cursor باستخدام بريد إلكتروني مخصص",
"quit": "إغلاق تطبيق Cursor",
"select_language": "تغيير اللغة",
"select_chrome_profile": "اختيار ملف تعريف Chrome",
"input_choice": "الرجاء إدخال اختيارك ({choices})",
"invalid_choice": "اختيار غير صالح. الرجاء إدخال رقم من {choices}",
"program_terminated": "تم إنهاء البرنامج بواسطة المستخدم",
"error_occurred": "حدث خطأ: {error}. يرجى المحاولة مرة أخرى",
"press_enter": "اضغط Enter للخروج",
"disable_auto_update": "تعطيل التحديث التلقائي لـ Cursor",
"lifetime_access_enabled": "تم تفعيل الوصول مدى الحياة",
"totally_reset": "إعادة تعيين Cursor بالكامل",
"outdate": "قديم",
"temp_github_register": "تسجيل GitHub مؤقت",
"admin_required": "يجب تشغيل البرنامج كمسؤول عند التنفيذ.",
"admin_required_continue": "المتابعة بدون صلاحيات المسؤول.",
"coming_soon": "قريباً",
"fixed_soon": "سيتم إصلاحه قريباً",
"contribute": "المساهمة في المشروع",
"config": "عرض الإعدادات",
"delete_google_account": "حذف حساب Cursor المرتبط بجوجل",
"continue_prompt": "المتابعة؟ (y/N): ",
"operation_cancelled_by_user": "تم إلغاء العملية بواسطة المستخدم",
"exiting": "جاري الخروج ……",
"bypass_version_check": "تجاوز فحص إصدار Cursor",
"check_user_authorized": "فحص صلاحية المستخدم",
"bypass_token_limit": "تجاوز حد الرمز المميز (Token)",
"restore_machine_id": "استعادة معرف الجهاز من النسخ الاحتياطي",
"lang_invalid_choice": "اختيار غير صالح. الرجاء إدخال أحد الخيارات التالية: ({lang_choices})",
"language_config_saved": "تم حفظ تكوين اللغة بنجاح",
"manual_custom_auth": "مصادقة مخصصة يدوي"
},
"languages": {
"en": "الإنجليزية",
"zh_cn": "الصينية المبسطة",
"zh_tw": "الصينية التقليدية",
"vi": "الفيتنامية",
"nl": "الهولندية",
"de": "الألمانية",
"fr": "الفرنسية",
"pt": "البرتغالية",
"ru": "الروسية",
"tr": "التركية",
"bg": "البلغارية",
"es": "الإسبانية",
"ar": "العربية",
"ja": "اليابانية",
"it": "إيطالي"
},
"quit_cursor": {
"start": "بدء إغلاق Cursor",
"no_process": "لا توجد عمليات Cursor قيد التشغيل",
"terminating": "إنهاء العملية {pid}",
"waiting": "في انتظار إنهاء العملية",
"success": "تم إغلاق جميع عمليات Cursor",
"timeout": "انتهت مهلة العملية: {pids}",
"error": "حدث خطأ: {error}"
},
"reset": {
"title": "أداة إعادة تعيين معرف جهاز Cursor",
"checking": "جارٍ فحص ملف الإعدادات",
"not_found": "لم يتم العثور على ملف الإعدادات",
"no_permission": "لا يمكن قراءة أو كتابة ملف الإعدادات، يرجى التحقق من صلاحيات الملف",
"reading": "جارٍ قراءة الإعدادات الحالية",
"creating_backup": "جارٍ إنشاء نسخة احتياطية للإعدادات",
"backup_exists": "النسخة الاحتياطية موجودة بالفعل، تخطي خطوة النسخ الاحتياطي",
"generating": "جارٍ إنشاء معرف جهاز جديد",
"saving_json": "جارٍ حفظ الإعدادات الجديدة في JSON",
"success": "تم إعادة تعيين معرف الجهاز بنجاح",
"new_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": "جارٍ تحديث معرفات النظام",
"system_ids_updated": "تم تحديث معرفات النظام بنجاح",
"system_ids_update_failed": "فشل تحديث معرفات النظام: {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",
"no_write_permission": "لا توجد صلاحيات كتابة: {path}",
"path_not_found": "لم يتم العثور على المسار: {path}",
"modify_file_failed": "فشل تعديل الملف: {error}",
"windows_machine_id_updated": "تم تحديث Windows Machine ID بنجاح",
"update_windows_machine_id_failed": "فشل تحديث Windows Machine ID: {error}",
"update_windows_machine_guid_failed": "فشل تحديث Windows Machine GUID: {error}",
"file_not_found": "لم يتم العثور على الملف: {path}"
},
"register": {
"title": "أداة تسجيل Cursor",
"start": "بدء عملية التسجيل...",
"handling_turnstile": "جارٍ معالجة التحقق الأمني...",
"retry_verification": "إعادة محاولة التحقق...",
"detect_turnstile": "جارٍ التحقق من الأمان...",
"verification_success": "تم التحقق الأمني بنجاح",
"starting_browser": "جارٍ فتح المتصفح...",
"form_success": "تم إرسال النموذج بنجاح",
"browser_started": "تم فتح المتصفح بنجاح",
"waiting_for_second_verification": "في انتظار التحقق عبر البريد الإلكتروني...",
"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": "جارٍ زيارة الرابط",
"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": "فشل الحصول على عنوان البريد الإلكتروني",
"setup_error": "خطأ في إعداد البريد الإلكتروني: {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": "إعادة تعيين معرف الجهاز",
"account_info_saved": "تم حفظ معلومات الحساب",
"save_account_info_failed": "فشل حفظ معلومات الحساب",
"get_email_address": "الحصول على عنوان البريد الإلكتروني",
"update_cursor_auth_info": "تحديث معلومات مصادقة Cursor",
"register_process_error": "خطأ في عملية التسجيل: {error}",
"setting_password": "جارٍ تعيين كلمة المرور",
"manual_code_input": "إدخال الرمز يدوياً",
"manual_email_input": "إدخال البريد الإلكتروني يدوياً",
"password": "كلمة المرور",
"first_name": "الاسم الأول",
"last_name": "الاسم الأخير",
"exit_signal": "إشارة خروج",
"email_address": "عنوان البريد الإلكتروني",
"config_created": "تم إنشاء الإعدادات",
"verification_failed": "فشل التحقق",
"verification_error": "خطأ في التحقق: {error}",
"config_option_added": "تمت إضافة خيار الإعدادات: {option}",
"config_updated": "تم تحديث الإعدادات",
"password_submitted": "تم إرسال كلمة المرور",
"total_usage": "إجمالي الاستخدام: {usage}",
"setting_on_password": "جارٍ تعيين كلمة المرور",
"getting_code": "جارٍ الحصول على رمز التحقق، سيتم المحاولة خلال 60 ثانية",
"human_verify_error": "تعذر التحقق من أن المستخدم بشري. جارٍ إعادة المحاولة...",
"max_retries_reached": "تم الوصول إلى الحد الأقصى للمحاولات. فشل التسجيل.",
"browser_path_invalid": "مسار {browser} غير صالح، جارٍ استخدام المسار الافتراضي",
"using_browser": "جارٍ استخدام متصفح {browser}: {path}",
"using_browser_profile": "جارٍ استخدام ملف تعريف {browser} من: {user_data_dir}",
"make_sure_browser_is_properly_installed": "تأكد من تثبيت {browser} بشكل صحيح",
"try_install_browser": "حاول تثبيت المتصفح باستخدام مدير الحزم الخاص بك",
"tracking_processes": "جارٍ تتبع {count} عمليات {browser}",
"no_new_processes_detected": "لم يتم اكتشاف عمليات {browser} جديدة للتتبع",
"could_not_track_processes": "تعذر تتبع عمليات {browser}: {error}",
"tempmail_plus_verification_completed": "تم الانتهاء من التحقق من TempMailPlus بنجاح",
"tempmail_plus_initialized": "تهيئة TempMailPlus بنجاح",
"tempmail_plus_epin_missing": "لم يتم تكوين TempMailplus Epin",
"using_tempmail_plus": "باستخدام TempMailPlus للتحقق من البريد الإلكتروني",
"tempmail_plus_disabled": "يتم تعطيل TempMailPlus",
"tempmail_plus_verification_failed": "فشل التحقق من TempMailPlus: {error}",
"tempmail_plus_email_missing": "لم يتم تكوين البريد الإلكتروني tempmailplus",
"tempmail_plus_enabled": "يتم تمكين TempMailPlus",
"tempmail_plus_verification_started": "بدء عملية التحقق من TempMailPlus",
"tempmail_plus_config_missing": "تكوين TempMailPlus مفقود",
"tempmail_plus_init_failed": "فشل تهيئة TempMailPlus: {error}"
},
"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": "إعادة تعيين معرف الجهاز",
"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": "جارٍ إنشاء بريد إلكتروني جديد",
"blocked_domain": "نطاق محظور",
"select_domain": "جارٍ اختيار نطاق عشوائي",
"copy_email": "جارٍ نسخ عنوان البريد الإلكتروني",
"enter_mailbox": "جارٍ الدخول إلى صندوق البريد",
"refresh_mailbox": "جارٍ تحديث صندوق البريد",
"check_verification": "جارٍ التحقق من رمز التحقق",
"verification_found": "تم العثور على رمز التحقق",
"verification_not_found": "لم يتم العثور على رمز تحقق",
"browser_error": "خطأ في التحكم بالمتصفح: {error}",
"navigation_error": "خطأ في التنقل: {error}",
"email_copy_error": "خطأ في نسخ البريد الإلكتروني: {error}",
"mailbox_error": "خطأ في صندوق البريد: {error}",
"token_saved_to_file": "تم حفظ الرمز في ملف cursor_tokens.txt",
"navigate_to": "جارٍ الانتقال إلى {url}",
"generate_email_success": "تم إنشاء البريد الإلكتروني بنجاح",
"select_email_domain": "اختيار نطاق البريد الإلكتروني",
"select_email_domain_success": "تم اختيار نطاق البريد الإلكتروني بنجاح",
"get_email_name": "الحصول على اسم البريد الإلكتروني",
"get_email_name_success": "تم الحصول على اسم البريد الإلكتروني بنجاح",
"get_email_address": "الحصول على عنوان البريد الإلكتروني",
"get_email_address_success": "تم الحصول على عنوان البريد الإلكتروني بنجاح",
"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": "تم إنشاء البريد الإلكتروني بنجاح",
"create_failed": "فشل إنشاء البريد الإلكتروني",
"create_error": "خطأ في إنشاء البريد الإلكتروني: {error}",
"refreshing": "جارٍ تحديث البريد الإلكتروني",
"refresh_success": "تم تحديث البريد الإلكتروني بنجاح",
"refresh_error": "خطأ في تحديث البريد الإلكتروني: {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": "عنوان البريد الإلكتروني",
"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}",
"domain_blocked": "النطاق محظور: {domain}",
"using_chrome_profile": "جارٍ استخدام ملف تعريف Chrome من: {user_data_dir}",
"no_display_found": "لم يتم العثور على شاشة. تأكد من تشغيل خادم X.",
"try_export_display": "حاول: export DISPLAY=:0",
"extension_load_error": "خطأ في تحميل الامتداد: {error}",
"make_sure_chrome_chromium_is_properly_installed": "تأكد من تثبيت Chrome/Chromium بشكل صحيح",
"try_install_chromium": "حاول: sudo apt install chromium-browser"
},
"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": "تم إنشاء ملف الحظر",
"clearing_update_yml": "جارٍ مسح ملف update.yml",
"update_yml_cleared": "تم مسح ملف update.yml",
"update_yml_not_found": "لم يتم العثور على ملف update.yml",
"clear_update_yml_failed": "فشل مسح ملف update.yml: {error}",
"unsupported_os": "نظام تشغيل غير مدعوم: {system}",
"remove_directory_failed": "فشل إزالة الدليل: {error}",
"create_block_file_failed": "فشل إنشاء ملف الحظر: {error}",
"directory_locked": "الدليل مقفل: {path}",
"yml_locked": "ملف update.yml مقفل",
"block_file_locked": "ملف الحظر مقفل",
"yml_already_locked": "ملف update.yml مقفل بالفعل",
"block_file_already_locked": "ملف الحظر مقفل بالفعل",
"block_file_locked_error": "خطأ في قفل ملف الحظر: {error}",
"yml_locked_error": "خطأ في قفل ملف update.yml: {error}",
"block_file_already_locked_error": "خطأ في قفل ملف الحظر الموجود بالفعل: {error}",
"yml_already_locked_error": "خطأ في قفل ملف update.yml الموجود بالفعل: {error}"
},
"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": "سجل التغييرات",
"rate_limit_exceeded": "تم تجاوز حد معدل GitHub API. تخطي فحص التحديث."
},
"totally_reset": {
"title": "إعادة تعيين Cursor بالكامل",
"checking_config": "جارٍ فحص ملف الإعدادات",
"config_not_found": "لم يتم العثور على ملف الإعدادات",
"no_permission": "لا يمكن قراءة أو كتابة ملف الإعدادات، يرجى التحقق من صلاحيات الملف",
"reading_config": "جارٍ قراءة الإعدادات الحالية",
"creating_backup": "جارٍ إنشاء نسخة احتياطية للإعدادات",
"backup_exists": "النسخة الاحتياطية موجودة بالفعل، تخطي خطوة النسخ الاحتياطي",
"generating_new_machine_id": "جارٍ إنشاء معرف جهاز جديد",
"saving_new_config": "جارٍ حفظ الإعدادات الجديدة في JSON",
"success": "تم إعادة تعيين Cursor بنجاح",
"error": "فشل إعادة تعيين Cursor: {error}",
"press_enter": "اضغط Enter للخروج",
"reset_machine_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": "مسح جميع البيانات المخزنة مؤقتاً بما في ذلك سجل الذكاء الاصطناعي",
"feature_3": "إعادة تعيين معرف الجهاز لتجاوز كشف الفترة التجريبية",
"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": "تم إنشاء معرف جهاز جديد: {path}",
"error_creating_machine_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": "تم تخطي تعديل معرف جهاز Windows: {error}",
"linux_machine_id_modification_skipped": "تم تخطي تعديل machine-id في Linux: {error}",
"note_complete_machine_id_reset_may_require_running_as_administrator": "ملاحظة: قد تتطلب إعادة تعيين معرف الجهاز الكامل تشغيل البرنامج كمسؤول",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "ملاحظة: قد تتطلب إعادة تعيين معرف الجهاز الكامل صلاحيات 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": "استخدم عنوان بريد إلكتروني مختلف عند التسجيل للحصول على فترة تجريبية جديدة",
"reset_log_6": "استخدم شبكة VPN لتغيير عنوان IP الخاص بك إذا كان ذلك متاحًا",
"reset_log_7": "قم بمسح ملفات تعريف الارتباط وذاكرة التخزين المؤقت للمتصفح قبل زيارة موقع Cursor AI",
"reset_log_8": "إذا استمرت المشكلات، حاول تثبيت Cursor AI في موقع مختلف",
"reset_log_9": "إذا واجهتك أي مشكلات، انتقل إلى متتبع المشكلات على Github وقم بإنشاء مشكلة جديدة على https://github.com/yeongpin/cursor-free-vip/issues",
"unexpected_error": "حدث خطأ غير متوقع: {error}",
"report_issue": "يرجى الإبلاغ عن هذه المشكلة على متتبع المشكلات في Github على 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": "جارٍ التحقق من وجود ملفات التخزين المحلي لـ Electron",
"no_additional_license_trial_files_found_in_deep_scan": "لم يتم العثور على ملفات ترخيص/تجريبية إضافية في الفحص العميق",
"removing_electron_localstorage_files": "جارٍ إزالة ملفات التخزين المحلي لـ Electron",
"electron_localstorage_files_removed": "تمت إزالة ملفات التخزين المحلي لـ Electron",
"electron_localstorage_files_removal_error": "خطأ في إزالة ملفات التخزين المحلي لـ Electron: {error}",
"removing_electron_localstorage_files_completed": "اكتملت إزالة ملفات التخزين المحلي لـ Electron",
"warning_title": "تحذير",
"warning_1": "هذا الإجراء سيحذف جميع إعدادات Cursor AI،",
"warning_2": "والتكوينات والبيانات المخزنة مؤقتاً. لا يمكن التراجع عن هذا الإجراء.",
"warning_3": "لن تتأثر ملفات الكود الخاصة بك، وقد صممت الأداة",
"warning_4": "لاستهداف ملفات محرر Cursor AI وآليات اكتشاف الفترة التجريبية فقط.",
"warning_5": "لن تتأثر التطبيقات الأخرى على نظامك.",
"warning_6": "ستحتاج إلى إعداد Cursor AI مرة أخرى بعد تشغيل هذه الأداة.",
"warning_7": "استخدم على مسؤوليتك الخاصة",
"removed": "تمت الإزالة: {path}",
"failed_to_reset_machine_guid": "فشل إعادة تعيين معرّف الجهاز",
"failed_to_remove": "فشل في الإزالة: {path}",
"failed_to_delete_file": "فشل في حذف الملف: {path}",
"failed_to_delete_directory": "فشل في حذف المجلد: {path}",
"failed_to_delete_file_or_directory": "فشل في حذف الملف أو المجلد: {path}",
"deep_scanning": "جارٍ إجراء فحص عميق للبحث عن ملفات ترخيص/تجريبية إضافية",
"resetting_cursor": "جارٍ إعادة تعيين محرر Cursor AI... يرجى الانتظار.",
"completed_in": "اكتمل في {time} ثانية",
"cursor_reset_completed": "تمت إعادة تعيين محرر Cursor AI بالكامل وتجاوز اكتشاف الفترة التجريبية!",
"cursor_reset_failed": "فشلت إعادة تعيين محرر Cursor AI: {error}",
"cursor_reset_cancelled": "تم إلغاء إعادة تعيين محرر Cursor AI. جارٍ الخروج دون إجراء أي تغييرات.",
"operation_cancelled": "تم إلغاء العملية. جارٍ الخروج دون إجراء أي تغييرات.",
"navigating_to_settings": "جارٍ الانتقال إلى صفحة الإعدادات...",
"already_on_settings": "أنت بالفعل في صفحة الإعدادات",
"login_redirect_failed": "فشلت إعادة توجيه تسجيل الدخول، جارٍ محاولة التنقل المباشر...",
"advanced_tab_not_found": "لم يتم العثور على علامة التبويب المتقدمة بعد عدة محاولات",
"advanced_tab_retry": "لم يتم العثور على علامة التبويب المتقدمة، المحاولة {attempt}/{max_attempts}",
"advanced_tab_error": "خطأ في العثور على علامة التبويب المتقدمة: {error}",
"advanced_tab_clicked": "تم النقر على علامة التبويب المتقدمة",
"direct_advanced_navigation": "جارٍ محاولة التنقل المباشر إلى علامة التبويب المتقدمة",
"delete_button_not_found": "لم يتم العثور على زر حذف الحساب بعد عدة محاولات",
"delete_button_retry": "لم يتم العثور على زر الحذف، المحاولة {attempt}/{max_attempts}",
"delete_button_error": "خطأ في العثور على زر الحذف: {error}",
"delete_button_clicked": "تم النقر على زر حذف الحساب",
"found_danger_zone": "تم العثور على قسم المنطقة الخطرة",
"delete_input_not_found": "لم يتم العثور على حقل تأكيد الحذف بعد عدة محاولات",
"delete_input_retry": "لم يتم العثور على حقل الحذف، المحاولة {attempt}/{max_attempts}",
"delete_input_error": "خطأ في العثور على حقل الحذف: {error}",
"delete_input_not_found_continuing": "لم يتم العثور على حقل تأكيد الحذف، جارٍ محاولة المتابعة على أي حال"
},
"github_register": {
"title": "أتمتة تسجيل GitHub و Cursor AI",
"features_header": "الميزات",
"feature1": "ينشئ بريدًا إلكترونيًا مؤقتًا باستخدام 1secmail.",
"feature2": "يسجل حساب GitHub جديد ببيانات اعتماد عشوائية.",
"feature3": "يتحقق من بريد GitHub تلقائيًا.",
"feature4": "يسجل الدخول إلى Cursor AI باستخدام مصادقة GitHub.",
"feature5": "يعيد تعيين معرف الجهاز لتجاوز اكتشاف الفترة التجريبية.",
"feature6": "يحفظ جميع بيانات الاعتماد في ملف.",
"warnings_header": "تحذيرات",
"warning1": "تقوم هذه الأداة بأتمتة إنشاء الحساب، مما قد ينتهك شروط خدمة GitHub/Cursor.",
"warning2": "تتطلب وصولاً إلى الإنترنت وامتيازات المسؤول.",
"warning3": "قد تتعارض CAPTCHA أو عمليات التحقق الإضافية مع الأتمتة.",
"warning4": "استخدمها بمسؤولية وعلى مسؤوليتك الخاصة.",
"confirm": "هل أنت متأكد أنك تريد المتابعة؟",
"invalid_choice": "اختيار غير صالح. الرجاء إدخال 'yes' أو 'no'",
"cancelled": "تم إلغاء العملية",
"program_terminated": "تم إنهاء البرنامج بواسطة المستخدم",
"starting_automation": "جارٍ بدء الأتمتة...",
"github_username": "اسم مستخدم GitHub",
"github_password": "كلمة مرور GitHub",
"email_address": "عنوان البريد الإلكتروني",
"credentials_saved": "تم حفظ بيانات الاعتماد هذه في ملف github_cursor_accounts.txt",
"completed_successfully": "اكتمل تسجيل GitHub و Cursor بنجاح!",
"registration_encountered_issues": "واجه تسجيل GitHub و Cursor مشكلات.",
"check_browser_windows_for_manual_intervention_or_try_again_later": "تحقق من نوافذ المتصفح للتدخل اليدوي أو حاول مرة أخرى لاحقًا."
},
"account_info": {
"subscription": "الاشتراك",
"trial_remaining": "المتبقي من الفترة التجريبية Pro",
"days": "أيام",
"subscription_not_found": "لم يتم العثور على معلومات الاشتراك",
"email_not_found": "لم يتم العثور على البريد الإلكتروني",
"failed_to_get_account": "فشل في الحصول على معلومات الحساب",
"config_not_found": "لم يتم العثور على الإعدادات.",
"failed_to_get_usage": "فشل في الحصول على معلومات الاستخدام",
"failed_to_get_subscription": "فشل في الحصول على معلومات الاشتراك",
"failed_to_get_email": "فشل في الحصول على عنوان البريد الإلكتروني",
"failed_to_get_token": "فشل في الحصول على الرمز",
"failed_to_get_account_info": "فشل في الحصول على معلومات الحساب",
"title": "معلومات الحساب",
"email": "البريد الإلكتروني",
"token": "الرمز",
"usage": "الاستخدام",
"subscription_type": "نوع الاشتراك",
"remaining_trial": "الفترة التجريبية المتبقية",
"days_remaining": "الأيام المتبقية",
"premium": "مميز",
"pro": "محترف",
"pro_trial": "تجريبي محترف",
"team": "فريق",
"enterprise": "مؤسسة",
"free": "مجاني",
"active": "نشط",
"inactive": "غير نشط",
"premium_usage": "استخدام مميز",
"basic_usage": "استخدام أساسي",
"usage_not_found": "لم يتم العثور على الاستخدام",
"lifetime_access_enabled": "تم تمكين الوصول مدى الحياة",
"token_not_found": "لم يتم العثور على الرمز"
},
"config": {
"config_not_available": "الإعدادات غير متاحة",
"configuration": "الإعدادات",
"enabled": "ممكّن",
"disabled": "معطّل",
"config_directory": "دليل الإعدادات",
"neither_cursor_nor_cursor_directory_found": "لم يتم العثور على Cursor أو دليل Cursor في {config_base}",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "يرجى التأكد من تثبيت Cursor وتشغيله مرة واحدة على الأقل",
"storage_directory_not_found": "لم يتم العثور على دليل التخزين: {storage_dir}",
"storage_file_found": "تم العثور على ملف التخزين: {storage_path}",
"file_size": "حجم الملف: {size} بايت",
"file_permissions": "صلاحيات الملف: {permissions}",
"file_owner": "مالك الملف: {owner}",
"file_group": "مجموعة الملف: {group}",
"error_getting_file_stats": "خطأ في الحصول على إحصائيات الملف: {error}",
"permission_denied": "تم رفض الإذن: {storage_path}",
"try_running": "حاول تشغيل: {command}",
"and": "و",
"storage_file_is_empty": "ملف التخزين فارغ: {storage_path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "قد يكون الملف تالفًا، يرجى إعادة تثبيت Cursor",
"storage_file_not_found": "لم يتم العثور على ملف التخزين: {storage_path}",
"error_checking_linux_paths": "خطأ في فحص مسارات Linux: {error}",
"config_option_added": "تمت إضافة خيار الإعدادات: {option}",
"config_updated": "تم تحديث الإعدادات",
"config_created": "تم إنشاء الإعدادات: {config_file}",
"config_setup_error": "خطأ في إعداد الإعدادات: {error}",
"storage_file_is_valid_and_contains_data": "ملف التخزين صالح ويحتوي على بيانات",
"error_reading_storage_file": "خطأ في قراءة ملف التخزين: {error}",
"also_checked": "تم فحص {path} أيضًا",
"backup_created": "تم إنشاء نسخة احتياطية: {path}",
"config_removed": "تمت إزالة ملف الإعدادات للتحديث القسري",
"backup_failed": "فشل نسخ الإعدادات احتياطيًا: {error}",
"force_update_failed": "فشل تحديث الإعدادات القسري: {error}",
"config_force_update_disabled": "تم تعطيل التحديث القسري لملف الإعدادات، جارٍ تخطي التحديث القسري",
"config_force_update_enabled": "تم تمكين التحديث القسري لملف الإعدادات، جارٍ إجراء التحديث القسري",
"documents_path_not_found": "لم يتم العثور على مسار المستندات، جارٍ استخدام الدليل الحالي",
"config_dir_created": "تم إنشاء دليل الإعدادات: {path}",
"using_temp_dir": "جارٍ استخدام دليل مؤقت بسبب خطأ: {path} (الخطأ: {error})"
},
"oauth": {
"authentication_button_not_found": "لم يتم العثور على زر المصادقة",
"authentication_failed": "فشلت المصادقة: {error}",
"found_cookies": "تم العثور على {count} من ملفات تعريف الارتباط",
"token_extraction_error": "خطأ في استخراج الرمز: {error}",
"authentication_successful": "تمت المصادقة بنجاح - البريد الإلكتروني: {email}",
"missing_authentication_data": "بيانات المصادقة مفقودة: {data}",
"failed_to_delete_account": "فشل حذف الحساب: {error}",
"invalid_authentication_type": "نوع المصادقة غير صالح",
"auth_update_success": "تم تحديث المصادقة بنجاح",
"browser_closed": "تم إغلاق المتصفح",
"auth_update_failed": "فشل تحديث المصادقة",
"google_start": "بدء Google",
"github_start": "بدء Github",
"usage_count": "عدد مرات الاستخدام: {usage}",
"account_has_reached_maximum_usage": "وصل الحساب إلى الحد الأقصى للاستخدام، {deleting}",
"starting_new_authentication_process": "جارٍ بدء عملية مصادقة جديدة...",
"failed_to_delete_expired_account": "فشل حذف الحساب المنتهي",
"could_not_check_usage_count": "تعذر التحقق من عدد مرات الاستخدام: {error}",
"found_email": "تم العثور على البريد الإلكتروني: {email}",
"could_not_find_email": "تعذر العثور على البريد الإلكتروني: {error}",
"could_not_find_usage_count": "تعذر العثور على عدد مرات الاستخدام: {error}",
"already_on_settings_page": "أنت بالفعل في صفحة الإعدادات!",
"failed_to_extract_auth_info": "فشل استخراج معلومات المصادقة: {error}",
"no_chrome_profiles_found": "لم يتم العثور على ملفات تعريف Chrome، جارٍ استخدام الملف الافتراضي",
"found_default_chrome_profile": "تم العثور على ملف تعريف Chrome الافتراضي",
"using_first_available_chrome_profile": "جارٍ استخدام أول ملف تعريف Chrome متاح: {profile}",
"error_finding_chrome_profile": "خطأ في العثور على ملف تعريف Chrome، جارٍ استخدام الملف الافتراضي: {error}",
"initializing_browser_setup": "جارٍ تهيئة إعداد المتصفح...",
"detected_platform": "تم اكتشاف النظام: {platform}",
"running_as_root_warning": "التشغيل كمستخدم جذر غير مستحسن لأتمتة المتصفح",
"consider_running_without_sudo": "فكر في تشغيل البرنامج بدون sudo",
"no_compatible_browser_found": "لم يتم العثور على متصفح متوافق. يرجى تثبيت Google Chrome أو Chromium.",
"supported_browsers": "المتصفحات المدعومة لـ {platform}",
"using_browser_profile": "جارٍ استخدام ملف تعريف المتصفح: {profile}",
"starting_browser": "جارٍ بدء المتصفح في: {path}",
"browser_setup_completed": "تم إكمال إعداد المتصفح بنجاح",
"browser_setup_failed": "فشل إعداد المتصفح: {error}",
"try_running_without_sudo_admin": "حاول التشغيل بدون امتيازات sudo/المسؤول",
"redirecting_to_authenticator_cursor_sh": "جارٍ إعادة التوجيه إلى authenticator.cursor.sh...",
"starting_google_authentication": "جارٍ بدء مصادقة Google...",
"starting_github_authentication": "جارٍ بدء مصادقة GitHub...",
"waiting_for_authentication": "في انتظار المصادقة...",
"page_changed_checking_auth": "تغيرت الصفحة، جارٍ التحقق من المصادقة...",
"status_check_error": "خطأ في فحص الحالة: {error}",
"authentication_timeout": "انتهت مهلة المصادقة",
"account_is_still_valid": "الحساب لا يزال صالحًا (الاستخدام: {usage})",
"starting_re_authentication_process": "جارٍ بدء عملية إعادة المصادقة...",
"starting_new_google_authentication": "جارٍ بدء مصادقة Google جديدة...",
"failed_to_delete_account_or_re_authenticate": "فشل حذف الحساب أو إعادة المصادقة: {error}",
"navigating_to_authentication_page": "جارٍ الانتقال إلى صفحة المصادقة...",
"please_select_your_google_account_to_continue": "يرجى اختيار حساب Google الخاص بك للمتابعة...",
"found_browser_data_directory": "تم العثور على دليل بيانات المتصفح: {path}",
"authentication_successful_getting_account_info": "تمت المصادقة بنجاح، جارٍ الحصول على معلومات الحساب...",
"warning_could_not_kill_existing_browser_processes": "تحذير: تعذر إنهاء عمليات المتصفح الحالية: {error}",
"browser_failed_to_start": "فشل بدء تشغيل المتصفح: {error}",
"browser_failed": "فشل بدء تشغيل المتصفح: {error}",
"browser_failed_to_start_fallback": "فشل بدء تشغيل المتصفح: {error}",
"user_data_dir_not_found": "لم يتم العثور على دليل بيانات مستخدم {browser} في {path}، سيتم تجربة Chrome بدلاً من ذلك",
"error_getting_user_data_directory": "خطأ في الحصول على دليل بيانات المستخدم: {error}",
"warning_browser_close": "تحذير: سيؤدي هذا إلى إغلاق جميع عمليات {browser} قيد التشغيل",
"killing_browser_processes": "جارٍ إنهاء عمليات {browser}...",
"profile_selection_error": "خطأ أثناء اختيار الملف الشخصي: {error}",
"using_configured_browser_path": "جارٍ استخدام مسار {browser} المُكوّن: {path}",
"browser_not_found_trying_chrome": "تعذر العثور على {browser}، جارٍ تجربة Chrome بدلاً من ذلك",
"found_chrome_at": "تم العثور على Chrome في: {path}",
"found_browser_user_data_dir": "تم العثور على دليل بيانات مستخدم {browser}: {path}"
},
"browser_profile": {
"title": "اختيار ملف تعريف المتصفح",
"select_profile": "اختر ملف تعريف {browser} للاستخدام:",
"profile_list": "ملفات تعريف {browser} المتاحة:",
"default_profile": "ملف التعريف الافتراضي",
"profile": "ملف التعريف {number}",
"no_profiles": "لم يتم العثور على ملفات تعريف {browser}",
"error_loading": "خطأ في تحميل ملفات تعريف {browser}: {error}",
"profile_selected": "ملف التعريف المحدد: {profile}",
"invalid_selection": "اختيار غير صالح. يرجى المحاولة مرة أخرى."
},
"account_delete": {
"title": "أداة حذف حساب Cursor المرتبط بـ Google",
"warning": "تحذير: سيؤدي هذا إلى حذف حساب Cursor الخاص بك بشكل دائم. لا يمكن التراجع عن هذا الإجراء.",
"cancelled": "تم إلغاء حذف الحساب.",
"starting_process": "جارٍ بدء عملية حذف الحساب...",
"google_button_not_found": "لم يتم العثور على زر تسجيل الدخول بـ Google",
"logging_in": "جارٍ تسجيل الدخول باستخدام Google...",
"waiting_for_auth": "في انتظار مصادقة Google...",
"login_successful": "تم تسجيل الدخول بنجاح",
"unexpected_page": "صفحة غير متوقعة بعد تسجيل الدخول: {url}",
"trying_settings": "جارٍ محاولة الانتقال إلى صفحة الإعدادات...",
"select_google_account": "يرجى اختيار حساب Google الخاص بك...",
"auth_timeout": "انتهت مهلة المصادقة، جارٍ المتابعة على أي حال...",
"navigating_to_settings": "جارٍ الانتقال إلى صفحة الإعدادات...",
"already_on_settings": "أنت بالفعل في صفحة الإعدادات",
"login_redirect_failed": "فشلت إعادة توجيه تسجيل الدخول، جارٍ محاولة التنقل المباشر...",
"advanced_tab_not_found": "لم يتم العثور على علامة التبويب المتقدمة بعد عدة محاولات",
"advanced_tab_retry": "لم يتم العثور على علامة التبويب المتقدمة، المحاولة {attempt}/{max_attempts}",
"advanced_tab_error": "خطأ في العثور على علامة التبويب المتقدمة: {error}",
"advanced_tab_clicked": "تم النقر على علامة التبويب المتقدمة",
"direct_advanced_navigation": "جارٍ محاولة التنقل المباشر إلى علامة التبويب المتقدمة",
"delete_button_not_found": "لم يتم العثور على زر حذف الحساب بعد عدة محاولات",
"delete_button_retry": "لم يتم العثور على زر الحذف، المحاولة {attempt}/{max_attempts}",
"delete_button_error": "خطأ في العثور على زر الحذف: {error}",
"delete_button_clicked": "تم النقر على زر حذف الحساب",
"found_danger_zone": "تم العثور على قسم المنطقة الخطرة",
"delete_input_not_found": "لم يتم العثور على حقل تأكيد الحذف بعد عدة محاولات",
"delete_input_retry": "لم يتم العثور على حقل الحذف، المحاولة {attempt}/{max_attempts}",
"delete_input_error": "خطأ في العثور على حقل الحذف: {error}",
"delete_input_not_found_continuing": "لم يتم العثور على حقل تأكيد الحذف، جارٍ محاولة المتابعة على أي حال",
"typed_delete": "تم كتابة \"Delete\" في مربع التأكيد",
"confirm_button_not_found": "لم يتم العثور على زر التأكيد بعد عدة محاولات",
"confirm_button_retry": "لم يتم العثور على زر التأكيد، المحاولة {attempt}/{max_attempts}",
"confirm_button_error": "خطأ في العثور على زر التأكيد: {error}",
"account_deleted": "تم حذف الحساب بنجاح!",
"error": "خطأ أثناء حذف الحساب: {error}",
"success": "تم حذف حساب Cursor الخاص بك بنجاح!",
"failed": "فشلت عملية حذف الحساب أو تم إلغاؤها.",
"interrupted": "تمت مقاطعة عملية حذف الحساب بواسطة المستخدم.",
"unexpected_error": "خطأ غير متوقع: {error}",
"found_email": "تم العثور على البريد الإلكتروني: {email}",
"email_not_found": "لم يتم العثور على البريد الإلكتروني: {error}",
"confirm_prompt": "هل أنت متأكد أنك تريد المتابعة؟ (y/N): "
},
"bypass": {
"starting": "جارٍ بدء تجاوز إصدار Cursor...",
"found_product_json": "تم العثور على product.json: {path}",
"no_write_permission": "لا توجد صلاحية كتابة للملف: {path}",
"read_failed": "فشلت قراءة product.json: {error}",
"current_version": "الإصدار الحالي: {version}",
"backup_created": "تم إنشاء نسخة احتياطية: {path}",
"version_updated": "تم تحديث الإصدار من {old} إلى {new}",
"write_failed": "فشلت كتابة product.json: {error}",
"no_update_needed": "لا يلزم التحديث. الإصدار الحالي {version} بالفعل >= 0.46.0",
"bypass_failed": "فشل تجاوز الإصدار: {error}",
"stack_trace": "تتبع المكدس",
"localappdata_not_found": "لم يتم العثور على متغير بيئة LOCALAPPDATA",
"product_json_not_found": "لم يتم العثور على product.json في مسارات Linux الشائعة",
"unsupported_os": "نظام تشغيل غير مدعوم: {system}",
"file_not_found": "لم يتم العثور على الملف: {path}",
"title": "أداة تجاوز إصدار Cursor",
"description": "تقوم هذه الأداة بتعديل ملف product.json الخاص بـ Cursor لتجاوز قيود الإصدار",
"menu_option": "تجاوز فحص إصدار Cursor"
},
"auth_check": {
"checking_authorization": "جارٍ التحقق من التصريح...",
"token_source": "الحصول على الرمز من قاعدة البيانات أو إدخاله يدوياً؟ (d/m، الافتراضي: d)",
"getting_token_from_db": "جارٍ الحصول على الرمز من قاعدة البيانات...",
"token_found_in_db": "تم العثور على الرمز في قاعدة البيانات",
"token_not_found_in_db": "لم يتم العثور على الرمز في قاعدة البيانات",
"cursor_acc_info_not_found": "لم يتم العثور على cursor_acc_info.py",
"error_getting_token_from_db": "خطأ في الحصول على الرمز من قاعدة البيانات: {error}",
"enter_token": "أدخل رمز Cursor الخاص بك: ",
"token_length": "طول الرمز: {length} حرفاً",
"usage_response_status": "حالة استجابة الاستخدام: {response}",
"unexpected_status_code": "رمز حالة غير متوقع: {code}",
"jwt_token_warning": "يبدو أن الرمز بتنسيق JWT، لكن فحص API أعاد رمز حالة غير متوقع. قد يكون الرمز صالحاً ولكن الوصول إلى API مقيد.",
"invalid_token": "رمز غير صالح",
"user_authorized": "المستخدم مصرح له",
"user_unauthorized": "المستخدم غير مصرح له",
"request_timeout": "انتهت مهلة الطلب",
"connection_error": "خطأ في الاتصال",
"check_error": "خطأ في التحقق من التصريح: {error}",
"authorization_successful": "تم التصريح بنجاح!",
"authorization_failed": "فشل التصريح!",
"operation_cancelled": "تم إلغاء العملية بواسطة المستخدم",
"unexpected_error": "خطأ غير متوقع: {error}",
"error_generating_checksum": "خطأ في إنشاء المجموع الاختباري: {error}",
"checking_usage_information": "جارٍ التحقق من معلومات الاستخدام...",
"check_usage_response": "استجابة فحص الاستخدام: {response}",
"usage_response": "استجابة الاستخدام: {response}"
},
"bypass_token_limit": {
"title": "أداة تجاوز حد الرمز",
"description": "تقوم هذه الأداة بتعديل ملف workbench.desktop.main.js لتجاوز حد الرمز",
"press_enter": "اضغط Enter للمتابعة..."
},
"token": {
"refreshing": "جارٍ تحديث الرمز...",
"refresh_success": "تم تحديث الرمز بنجاح! صالح لمدة {days} يوماً (تاريخ انتهاء الصلاحية: {expire})",
"no_access_token": "لا يوجد رمز وصول في الاستجابة",
"refresh_failed": "فشل تحديث الرمز: {error}",
"invalid_response": "استجابة JSON غير صالحة من خادم التحديث",
"server_error": "خطأ في خادم التحديث: HTTP {status}",
"request_timeout": "انتهت مهلة طلب خادم التحديث",
"connection_error": "خطأ في الاتصال بخادم التحديث",
"unexpected_error": "خطأ غير متوقع أثناء تحديث الرمز: {error}",
"extraction_error": "خطأ في استخراج الرمز: {error}"
},
"restore": {
"update_failed": "Failed to update storage file: {error}",
"read_backup_failed": "Failed to read backup file: {error}",
"please_enter_number": "Please enter a valid number",
"no_backups_found": "No backup files found",
"title": "Restore Machine ID from Backup",
"sqlite_updated": "SQLite database updated successfully",
"permission_denied": "Permission denied. Please try running as administrator",
"sqlite_not_found": "SQLite database not found",
"backup_creation_failed": "فشل في إنشاء نسخة احتياطية: {error}",
"windows_machine_guid_updated": "تم تحديث GUID Machine Windows بنجاح",
"select_backup": "حدد النسخ الاحتياطي لاستعادة",
"sqm_client_key_not_found": "لم يتم العثور على مفتاح تسجيل SQMClient",
"machine_id_backup_created": "تم إنشاء نسخة احتياطية من ملف الجهاز",
"system_ids_update_failed": "فشل في تحديث معرفات النظام: {error}",
"current_backup_created": "تم إنشاء نسخة احتياطية من ملف التخزين الحالي",
"update_windows_machine_guid_failed": "فشل في تحديث GUID MAVEN",
"updating_pair": "تحديث زوج القيمة الرئيسية",
"press_enter": "اضغط على Enter للمتابعة",
"missing_id": "معرف مفقود: {id}",
"current_file_not_found": "لم يتم العثور على ملف التخزين الحالي",
"sqlite_update_failed": "فشل في تحديث قاعدة بيانات SQLite: {error}",
"success": "تم استعادة معرف الجهاز بنجاح",
"process_error": "استعادة خطأ العملية: {error}",
"update_macos_system_ids_failed": "فشل في تحديث معرفات نظام MacOS: {error}",
"machine_id_update_failed": "فشل في تحديث ملف الماكينة: {error}",
"available_backups": "ملفات النسخ الاحتياطي المتاحة",
"windows_machine_id_updated": "معرف جهاز Windows تم تحديثه بنجاح",
"updating_sqlite": "تحديث قاعدة بيانات SQLite",
"invalid_selection": "اختيار غير صالح",
"update_windows_system_ids_failed": "فشل في تحديث معرفات نظام Windows: {error}",
"macos_platform_uuid_updated": "تم تحديث منصة MacOS UUID بنجاح",
"ids_to_restore": "معرفات الماكينة لاستعادة",
"operation_cancelled": "تم إلغاء العملية",
"machine_id_updated": "تم تحديث ملف الجهاز بنجاح",
"update_windows_machine_id_failed": "فشل في تحديث معرف جهاز Windows: {error}",
"storage_updated": "تم تحديث ملف التخزين بنجاح",
"failed_to_execute_plutil_command": "فشل تنفيذ أمر بلوتيل",
"updating_system_ids": "تحديث معرفات النظام",
"starting": "بدء عملية استعادة معرف الجهاز",
"confirm": "هل أنت متأكد من أنك تريد استعادة هذه المعرفات؟",
"to_cancel": "للإلغاء"
},
"manual_auth": {
"auth_updated_successfully": "معلومات المصادقة تحديث بنجاح!",
"proceed_prompt": "يتابع؟ (Y/N):",
"auth_type_selected": "نوع المصادقة المحدد: {type}",
"token_verification_skipped": "تم تخطي التحقق المميز (check_user_authorized.py غير موجود)",
"auth_type_google": "جوجل",
"token_required": "الرمز المميز مطلوب",
"continue_anyway": "تواصل على أي حال؟ (Y/N):",
"verifying_token": "التحقق من صحة الرمز المميز ...",
"auth_type_github": "جيثب",
"error": "خطأ: {error}",
"random_email_generated": "تم إنشاء بريد إلكتروني عشوائي: {البريد الإلكتروني}",
"auth_type_prompt": "حدد نوع المصادقة:",
"operation_cancelled": "تم إلغاء العملية",
"auth_type_auth0": "Auth_0 (افتراضي)",
"token_verification_error": "خطأ في التحقق من الرمز المميز: {error}",
"email_prompt": "أدخل البريد الإلكتروني (اترك فارغًا للبريد الإلكتروني العشوائي):",
"token_verified": "تم التحقق من الرمز المميز بنجاح!",
"token_prompt": "أدخل رمز المؤشر الخاص بك (Access_Token/Refresh_token):",
"confirm_prompt": "يرجى تأكيد المعلومات التالية:",
"invalid_token": "رمز غير صالح. مصادقة أجهض.",
"updating_database": "تحديث قاعدة بيانات مصادقة المؤشر ...",
"title": "مصادقة المؤشر اليدوي",
"auth_update_failed": "فشل في تحديث معلومات المصادقة"
},
"tempmail": {
"config_error": "خطأ في ملف التكوين: {error}",
"no_email": "لم يتم العثور على بريد إلكتروني للتحقق من المؤشر",
"general_error": "حدث خطأ: {error}",
"checking_email": "التحقق من البريد الإلكتروني للتحقق من المؤشر ...",
"extract_code_failed": "فشل استخراج رمز التحقق: {error}",
"configured_email": "البريد الإلكتروني المكون: {البريد الإلكتروني}",
"check_email_failed": "فشل التحقق من البريد الإلكتروني: {error}",
"no_code": "لا يمكن الحصول على رمز التحقق",
"email_found": "تم العثور على البريد الإلكتروني للتحقق من المؤشر",
"verification_code": "رمز التحقق: {code}"
}
}

879
locales/bg.json Normal file
View File

@ -0,0 +1,879 @@
{
"menu": {
"title": "Възможни избори",
"exit": "Затвори програмата",
"reset": "Нулирай ид-то на компютъра",
"register": "Регистрирай нов Курсор акаунт",
"register_google": "Регистрирай се с Google акаунт",
"register_github": "Регистрирай се с GitHub акаунт",
"register_manual": "Регистрирай се със свой имейл по избор",
"quit": "Затвори приложението Курсор",
"select_language": "Избери език",
"es": "Spanish",
"input_choice": "Моля, въведете своя избор ({choices})",
"invalid_choice": "Невалиден избор. Моля, въведете избор от {choices}.",
"program_terminated": "Програмата беше затворена от вас",
"error_occurred": "Възникна грешка: {error}. Опитайте отново",
"press_enter": "Натиснете Enter, за да излезете",
"disable_auto_update": "Спрете автоматичните ъпдейти на Курсор",
"lifetime_access_enabled": "ДОЖИВОТЕН ДОСТЪП Е АКТИВИРАН",
"totally_reset": "Нулирайте изцяло Курсор",
"outdate": "Изтекъл срок",
"temp_github_register": "Временно регистриране с GitHub",
"coming_soon": "Очаквайте скоро",
"fixed_soon": "Ще бъде поправено скоро",
"contribute": "Принос към проекта",
"config": "Покажи конфигурацията",
"delete_google_account": "Изтрий Google акаунта на Cursor",
"continue_prompt": "Продължи? (y/N): ",
"operation_cancelled_by_user": "Операцията е отменена от потребителя",
"exiting": "Излизане ......",
"bypass_version_check": "Пропусни проверката на версията на Cursor",
"check_user_authorized": "Провери оторизацията на потребителя",
"select_chrome_profile": "Избери Chrome профил",
"bypass_token_limit": "Заобикаляне на ограничението на токените",
"restore_machine_id": "Възстановяване на машинен идентификатор от резервно копие",
"lang_invalid_choice": "Невалиден избор. Моля, въведете една от следните опции: ({lang_choices})",
"admin_required": "Изпълнявайки се като изпълними, администраторските привилегии са необходими.",
"language_config_saved": "Езиковата конфигурация се запази успешно",
"admin_required_continue": "Продължаване без привилегии на администратор.",
"manual_custom_auth": "Ръчен персонализиран Auth"
},
"languages": {
"ar": "Арабски",
"en": "English",
"zh_cn": "简体中文",
"zh_tw": "繁體中文",
"vi": "Vietnamese",
"nl": "Dutch",
"de": "German",
"fr": "French",
"pt": "Portuguese",
"ru": "Russian",
"tr": "Turkish",
"bg": "Bulgarian",
"es": "Spanish",
"it": "Италиански",
"ja": "Японски"
},
"quit_cursor": {
"start": "Започни излизането от Курсор",
"no_process": "Няма съществуващ процес, засягащ Курсор",
"terminating": "Прекратяване на процес {pid}",
"waiting": "Изчакване на процеса да приключи",
"success": "Всички процеси, свързани с Курсор, бяха прекратени",
"timeout": "Таймаут на процеса: {pids}",
"error": "Възникна грешка: {error}"
},
"reset": {
"title": "",
"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": "Текуща версия на Курсор: {version}",
"patch_completed": "Корекцията на getMachineId беше успешно завършена",
"patch_failed": "Грешка при прилагане на корекция за getMachineId: {error}",
"version_check_passed": "Проверката на версията на Курсор беше успешна",
"file_modified": "Файлът беше променен",
"version_less_than_0_45": "Версията на Курсор е < 0.45.0, корекцията на getMachineId се пропуска",
"detecting_version": "Откриване на версията на Курсор",
"patching_getmachineid": "Прилагане на корекция за getMachineId",
"version_greater_than_0_45": "Версията на Курсор е >= 0.45.0, прилага се корекция за getMachineId",
"permission_denied": "Достъпът беше отказан: {error}",
"backup_created": "Резервното копие беше създадено",
"update_success": "Актуализацията беше успешна",
"update_failed": "Грешка при актуализация: {error}",
"windows_machine_guid_updated": "Windows машинното 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": "Версията на Курсор е твърде ниска: {version} < 0.45.0",
"windows_machine_id_updated": "Успешно актуализиран ID на машината на Windows актуализиран",
"modify_file_failed": "Променете файла не е успешен: {Грешка}",
"file_not_found": "Файлът не е намерен: {path}",
"update_windows_machine_guid_failed": "Актуализирайте Windows Machine Guid неуспешно: {Грешка}",
"update_windows_machine_id_failed": "Актуализиране на ID на Windows Machine не успя: {грешка}",
"path_not_found": "Пътят не е намерен: {path}",
"no_write_permission": "Без разрешение за запис: {path}"
},
"register": {
"title": "Инструмент за регистрация в Курсор",
"start": "Започване на процеса на регистрация...",
"handling_turnstile": "Обработка на проверка за сигурност...",
"retry_verification": "Опит за повторна проверка...",
"detect_turnstile": "Проверка на защитната врата...",
"verification_success": "Проверката за сигурност беше успешна",
"starting_browser": "Стартиране на браузъра...",
"form_success": "Формата беше успешно изпратена",
"browser_started": "Браузърът беше успешно стартиран",
"waiting_for_second_verification": "Изчакване на втората проверка по имейл...",
"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": "Обработка на защитната врата",
"no_turnstile": "Няма защитна врата",
"turnstile_passed": "Защитната врата беше премината",
"verification_start": "Започване на получаване на код за потвърждение",
"verification_timeout": "Времето за получаване на код за потвърждение изтече",
"verification_not_found": "Кодът за потвърждение не беше намерен",
"try_get_code": "Опит | {attempt} Получаване на код за потвърждение | Оставащо време: {time}s",
"get_account": "Получаване на информация за акаунта",
"get_token": "Получаване на токен за сесия на Курсор",
"token_success": "Токенът беше успешно получен",
"token_attempt": "Опит | {attempt} опита за получаване на токен | Ще бъде опит отново след {time}s",
"token_max_attempts": "Достигнат максимален брой опити ({max}) | Неуспешно получаване на токен",
"token_failed": "Грешка при получаване на токен: {error}",
"account_error": "Грешка при получаване на информация за акаунта: {error}",
"press_enter": "Натиснете Enter, за да излезете",
"browser_start": "Стартиране на браузъра",
"open_mailbox": "Отваряне на страницата на пощенската кутия",
"email_error": "Грешка при получаване на имейл адрес",
"setup_error": "Грешка при настройка на имейл: {error}",
"start_getting_verification_code": "Започване на получаване на код за потвърждение, ще бъде опит след 60 секунди",
"get_verification_code_timeout": "Времето за получаване на код за потвърждение изтече",
"get_verification_code_success": "Кодът за потвърждение беше успешно получен",
"try_get_verification_code": "Опит | {attempt} Получаване на код за потвърждение | Оставащо време: {remaining_time}s",
"verification_code_filled": "Кодът за потвърждение беше попълнен",
"login_success_and_jump_to_settings_page": "Успешен вход и преход към страницата с настройки",
"detect_login_page": "Открита е страница за вход, започване на влизане...",
"cursor_registration_completed": "Регистрацията в Курсор беше завършена!",
"set_password": "Задаване на парола",
"basic_info_submitted": "Основните данни бяха изпратени",
"cursor_auth_info_updated": "Информацията за удостоверяване на Курсор беше актуализирана",
"cursor_auth_info_update_failed": "Грешка при актуализиране на информацията за удостоверяване на Курсор",
"reset_machine_id": "Нулиране на машинното ID",
"account_info_saved": "Информацията за акаунта беше запазена",
"save_account_info_failed": "Грешка при запазване на информацията за акаунта",
"get_email_address": "Получаване на имейл адрес",
"update_cursor_auth_info": "Актуализиране на информацията за удостоверяване на Курсор",
"register_process_error": "Грешка в процеса на регистрация: {error}",
"setting_password": "Задаване на парола",
"manual_code_input": "Ръчно въвеждане на код",
"manual_email_input": "Ръчно въвеждане на имейл",
"password": "Парола",
"first_name": "Име",
"last_name": "Фамилия",
"exit_signal": "Сигнал за изход",
"email_address": "Имейл адрес",
"config_created": "Конфигурацията беше създадена",
"verification_failed": "Проверката беше неуспешна",
"verification_error": "Грешка при проверка: {error}",
"config_option_added": "Добавена е опция за конфигурация: {option}",
"config_updated": "Конфигурацията беше актуализирана",
"password_submitted": "Паролата беше изпратена",
"total_usage": "Общо използване: {usage}",
"setting_on_password": "Задаване на парола",
"getting_code": "Получаване на код за потвърждение, ще бъде опит след 60 секунди",
"human_verify_error": "Не може да се потвърди, че потребителят е човек. Опитва се отново...",
"max_retries_reached": "Достигнат максимален брой опити. Регистрацията беше неуспешна.",
"using_browser": "Използване на браузър} браузър: {path}",
"tracking_processes": "Проследяване {count} {браузър} процеси",
"using_browser_profile": "Използване на {браузър} профил от: {user_data_dir}",
"could_not_track_processes": "Не можах да проследяваме {браузър} процеси: {грешка}",
"browser_path_invalid": "{браузър} Пътят е невалиден, използвайки пътя по подразбиране",
"try_install_browser": "Опитайте да инсталирате браузъра с вашия мениджър на пакети",
"no_new_processes_detected": "Няма нови {браузър} процеси, открити за проследяване",
"make_sure_browser_is_properly_installed": "Уверете се, че {браузърът} е инсталиран правилно",
"tempmail_plus_verification_completed": "Проверката tempmailplus приключи успешно",
"tempmail_plus_initialized": "TempMailplus инициализира успешно",
"tempmail_plus_epin_missing": "Tempmailplus epin не е конфигуриран",
"using_tempmail_plus": "Използване на TempMailPlus за проверка по имейл",
"tempmail_plus_verification_failed": "Проверката на tempmailplus не бе успешна: {грешка}",
"tempmail_plus_disabled": "Tempmailplus е деактивиран",
"tempmail_plus_email_missing": "Tempmailplus имейл не е конфигуриран",
"tempmail_plus_verification_started": "Стартиране на процеса на проверка на TempMailplus",
"tempmail_plus_enabled": "Tempmailplus е активиран",
"tempmail_plus_config_missing": "Липсва конфигурацията TempMailplus",
"tempmail_plus_init_failed": "Неуспешно инициализиране на tempmailplus: {грешка}"
},
"auth": {
"title": "Управление на удостоверяването на Курсор",
"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": "Създаване на нов имейл",
"blocked_domain": "Блокиран домейн",
"select_domain": "Избиране на случаен домейн",
"copy_email": "Копиране на имейл адрес",
"enter_mailbox": "Влизане в пощенската кутия",
"refresh_mailbox": "Опресняване на пощенската кутия",
"check_verification": "Проверка на кода за потвърждение",
"verification_found": "Кодът за потвърждение беше намерен",
"verification_not_found": "Кодът за потвърждение не беше намерен",
"browser_error": "Грешка при контрол на браузъра: {error}",
"navigation_error": "Грешка при навигация: {error}",
"email_copy_error": "Грешка при копиране на имейл: {error}",
"mailbox_error": "Грешка в пощенската кутия: {error}",
"token_saved_to_file": "Токенът беше запазен във файла cursor_tokens.txt",
"navigate_to": "Навигиране към {url}",
"generate_email_success": "Имейлът беше успешно създаден",
"select_email_domain": "Избор на домейн за имейл",
"select_email_domain_success": "Успешен избор на домейн за имейл",
"get_email_name": "Получаване на име на имейл",
"get_email_name_success": "Успешно получаване на име на имейл",
"get_email_address": "Получаване на имейл адрес",
"get_email_address_success": "Успешно получаване на имейл адрес",
"enter_mailbox_success": "Успешно влизане в пощенската кутия",
"found_verification_code": "Кодът за потвърждение беше намерен",
"get_cursor_session_token": "Получаване на токен за сесия на Курсор",
"get_cursor_session_token_success": "Успешно получаване на токен за сесия на Курсор",
"get_cursor_session_token_failed": "Грешка при получаване на токен за сесия на Курсор",
"save_token_failed": "Грешка при запазване на токен",
"database_updated_successfully": "Базата данни беше успешно актуализирана",
"database_connection_closed": "Връзката с базата данни беше затворена",
"no_valid_verification_code": "Няма валиден код за потвърждение"
},
"email": {
"starting_browser": "Стартиране на браузъра",
"visiting_site": "Посещение на сайтове за имейл домейни",
"create_success": "Имейлът беше успешно създаден",
"create_failed": "Грешка при създаване на имейл",
"create_error": "Грешка при създаване на имейл: {error}",
"refreshing": "Опресняване на имейл",
"refresh_success": "Имейлът беше успешно опреснен",
"refresh_error": "Грешка при опресняване на имейл: {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": "Имейл адрес",
"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}s",
"blocked_domains_loaded_timeout_error": "Грешка при време за зареждане на блокирани домейни: {error}",
"available_domains_loaded": "Налични домейни са заредени: {count}",
"domains_filtered": "Филтрирани домейни: {count}",
"trying_to_create_email": "Опит за създаване на имейл: {email}",
"domain_blocked": "Домейнът е блокиран: {domain}",
"no_display_found": "Не е намерен дисплей. Уверете се, че X сървърът работи.",
"try_install_chromium": "Опитайте: Sudo Apt Инсталирайте хром-браузър",
"extension_load_error": "Грешка в натоварването на удължаване: {Грешка}",
"try_export_display": "Опитайте: Експортиране на дисплея =: 0",
"make_sure_chrome_chromium_is_properly_installed": "Уверете се, че хромът/хромът е правилно инсталиран",
"using_chrome_profile": "Използване на Chrome профил от: {user_data_dir}"
},
"update": {
"title": "Деактивиране на автоматичните актуализации на Курсор",
"disable_success": "Автоматичните актуализации бяха успешно деактивирани",
"disable_failed": "Грешка при деактивиране на автоматичните актуализации: {error}",
"press_enter": "Натиснете Enter, за да излезете",
"start_disable": "Започване на деактивиране на автоматичните актуализации",
"killing_processes": "Прекратяване на процеси",
"processes_killed": "Процесите бяха прекратени",
"removing_directory": "Премахване на директория",
"directory_removed": "Директорията беше премахната",
"creating_block_file": "Създаване на блокиращ файл",
"block_file_created": "Блокиращият файл беше създаден",
"block_file_locked_error": "Заключена грешка в блок файл: {Грешка}",
"clear_update_yml_failed": "Неуспешно изчистване на Update.yml файл: {грешка}",
"yml_already_locked_error": "Update.yml файл вече заключена грешка: {грешка}",
"yml_locked": "Update.yml файл е заключен",
"yml_locked_error": "Update.yml Заключена файл Грешка: {Грешка}",
"block_file_already_locked": "Блок файлът вече е заключен",
"directory_locked": "Директорията е заключена: {path}",
"create_block_file_failed": "Неуспешно създаване на блок файл: {грешка}",
"block_file_locked": "блок файл е заключен",
"update_yml_not_found": "Update.yml файл не е намерен",
"remove_directory_failed": "Неуспешно премахване на директорията: {грешка}",
"block_file_already_locked_error": "Блок файл вече заключена грешка: {грешка}",
"update_yml_cleared": "Update.yml файл, изчистен",
"yml_already_locked": "Update.yml файл вече е заключен",
"unsupported_os": "Неподдържана ОС: {Система}",
"clearing_update_yml": "Изчистване на актуализация.yml файл"
},
"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": "Списък с промени",
"rate_limit_exceeded": "Превишена граница на скоростта на API на GitHub. Проверка на актуализацията на пропускане."
},
"totally_reset": {
"title": "Пълно нулиране на Курсор",
"checking_config": "Проверка на конфигурационния файл",
"config_not_found": "Конфигурационният файл не беше намерен",
"no_permission": "Конфигурационният файл не може да бъде прочетен или записан. Моля, проверете разрешенията на файла",
"reading_config": "Четене на текущата конфигурация",
"creating_backup": "Създаване на резервно копие на конфигурацията",
"backup_exists": "Резервното копие вече съществува. Стъпката за резервно копие се пропуска",
"generating_new_machine_id": "Генериране на ново машинно ID",
"saving_new_config": "Запазване на новата конфигурация в JSON",
"success": "Курсор беше успешно нулиран",
"error": "Грешка при нулиране на Курсор: {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": "Пълно премахване на настройките и конфигурациите на Курсор AI",
"feature_2": "Изчистване на всички кеширани данни, включително историята и командите на AI",
"feature_3": "Нулиране на машинното ID за заобикаляне на ограниченията за пробен период",
"feature_4": "Генериране на нови случайни машинни идентификатори",
"feature_5": "Премахване на персонализирани разширения и предпочитания",
"feature_6": "Нулиране на информацията за пробния период и активиране",
"feature_7": "Дълбоко сканиране за скрити файлове, свързани с лицензи и пробен период",
"feature_8": "Безопасно запазване на файлове и приложения, които не са свързани с Курсор",
"feature_9": "Съвместимост с Windows, macOS и Linux",
"disclaimer_title": "ПРАВНО ИЗВЕСТВИЕ",
"disclaimer_1": "Този инструмент ще изтрие за постоянно всички настройки на Курсор AI,",
"disclaimer_2": "конфигурации и кеширани данни. Това действие е необратимо.",
"disclaimer_3": "Вашите кодови файлове НЯМА да бъдат засегнати и този инструмент",
"disclaimer_4": "е проектиран специално да се фокусира върху файловете на редактора на Курсор AI и механизмите за откриване на пробен период.",
"disclaimer_5": "Другите приложения на вашата система няма да бъдат засегнати.",
"disclaimer_6": "След като използвате този инструмент, ще трябва да преинсталирате Курсор AI.",
"disclaimer_7": "Вие носите отговорността за използването му",
"confirm_title": "Сигурни ли сте, че искате да продължите?",
"confirm_1": "Това действие ще изтрие всички настройки на Курсор AI,",
"confirm_2": "конфигурации и кеширани данни. Това действие е необратимо.",
"confirm_3": "Вашите кодови файлове НЯМА да бъдат засегнати и този инструмент",
"confirm_4": "е проектиран специално да се фокусира върху файловете на редактора на Курсор AI и механизмите за откриване на пробен период.",
"confirm_5": "Другите приложения на вашата система няма да бъдат засегнати.",
"confirm_6": "След като използвате този инструмент, ще трябва да преинсталирате Курсор AI.",
"confirm_7": "Вие носите отговорността за използването му",
"invalid_choice": "Моля, въведете 'Y' или 'n'",
"skipped_for_safety": "Пропуснато за безопасност (не е свързано с Курсор): {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": "Нулиране на редактора на Курсор 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": "Курсор AI беше напълно нулиран и ограниченията за пробен период бяха заобиколени!",
"reset_log_2": "Моля, рестартирайте системата си, за да влязат в сила промените.",
"reset_log_3": "Ще трябва да преинсталирате Курсор AI и сега трябва да имате нов пробен период.",
"reset_log_4": "За най-добри резултати, помислете за следното:",
"reset_log_5": "Използвайте различен имейл адрес при регистрация за нов пробен период",
"reset_log_6": "Ако е възможно, използвайте VPN за промяна на IP адреса си",
"reset_log_7": "Изчистете бисквитките и кеша на браузъра си, преди да посетите уебсайта на Курсор AI",
"reset_log_8": "Ако проблемите продължават, опитайте да инсталирате Курсор AI на друго място",
"reset_log_9": "Ако срещнете проблеми, посетете Github Issue Tracker и създайте проблем на 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": "Проверка на Electron localStorage файлове",
"no_additional_license_trial_files_found_in_deep_scan": "Няма намерени допълнителни файлове за лиценз/пробен период при дълбоко сканиране",
"removing_electron_localstorage_files": "Премахване на Electron localStorage файлове",
"electron_localstorage_files_removed": "Electron localStorage файлове бяха премахнати",
"electron_localstorage_files_removal_error": "Грешка при премахване на Electron localStorage файлове: {error}",
"removing_electron_localstorage_files_completed": "Премахването на Electron localStorage файлове беше завършено",
"failed_to_reset_machine_guid": "Неуспешно нулиране на машината GUID",
"delete_input_retry": "Изтриването на входа не е намерено, опит {опит}/{max_attempts}",
"warning_6": "Ще трябва да настроите курсора AI отново, след като стартирате този инструмент.",
"warning_5": "Други приложения във вашата система няма да бъдат засегнати.",
"warning_4": "За да се насочите само към файловете на редактора на курсора и механизмите за откриване на проби.",
"completed_in": "Завършено за {време} секунди",
"removed": "Премахнато: {path}",
"cursor_reset_completed": "Редакторът на Cursor AI е напълно нулиран и пробният откриване на проби!",
"warning_1": "Това действие ще изтрие всички настройки на курсора AI,",
"delete_input_error": "Грешка за намиране на вход за изтриване: {Грешка}",
"warning_2": "конфигурации и кеширани данни. Това действие не може да бъде отменено.",
"advanced_tab_retry": "Разширен раздел не е намерен, опит {опит}/{max_attempts}",
"failed_to_delete_file": "Неуспешно изтриване на файл: {path}",
"warning_3": "Вашите кодови файлове няма да бъдат засегнати и инструментът е проектиран",
"delete_button_retry": "Бутонът за изтриване не е намерен, опит {опит}/{max_attempts}",
"cursor_reset_cancelled": "Cursor AI Editor Reset отменено. Излизане, без да прави никакви промени.",
"deep_scanning": "Извършване на дълбоко сканиране за допълнителни пробни/лицензионни файлове",
"failed_to_delete_file_or_directory": "Неуспешно изтриване на файл или директория: {path}",
"delete_button_not_found": "Бутонът за изтриване на акаунта не е намерен след множество опити",
"delete_button_error": "Грешка за намиране на бутон за изтриване: {Грешка}",
"already_on_settings": "Вече на страницата Настройки",
"failed_to_delete_directory": "Неуспешно изтриване на директория: {path}",
"found_danger_zone": "Намерено сечение на опасната зона",
"cursor_reset_failed": "Ревелиране на Cursor AI Editor Неуспешно: {Грешка}",
"navigating_to_settings": "Навигация до страницата на настройките ...",
"warning_title": "Предупреждение",
"resetting_cursor": "Нулиране на курсора AI редактор ... Моля, почакайте.",
"login_redirect_failed": "Пренасочването на вход не успя, опитвайки се директна навигация ...",
"advanced_tab_not_found": "Разширен раздел не е намерен след множество опити",
"direct_advanced_navigation": "Опитване на директна навигация към раздел Advanced",
"delete_button_clicked": "Щракнете върху бутона за изтриване на акаунта",
"advanced_tab_error": "Грешка за намиране на разширен раздел: {Грешка}",
"delete_input_not_found": "Изтриване на входа за потвърждение не е намерен след множество опити",
"operation_cancelled": "Операция отменена. Излизане, без да прави никакви промени.",
"failed_to_remove": "Неуспешно премахване: {path}",
"warning_7": "Използвайте на свой риск",
"delete_input_not_found_continuing": "Изтриването на входа за потвърждение не е намерено, опитвайки се да продължите така или иначе",
"advanced_tab_clicked": "Щракна върху раздела Advanced"
},
"chrome_profile": {
"title": "Избор на Chrome Профил",
"select_profile": "Изберете Chrome профил за използване:",
"profile_list": "Налични профили:",
"default_profile": "Профил по Подразбиране",
"profile": "Профил {number}",
"no_profiles": "Не са намерени Chrome профили",
"error_loading": "Грешка при зареждане на Chrome профили: {error}",
"profile_selected": "Избран профил: {profile}",
"invalid_selection": "Невалиден избор. Моля, опитайте отново",
"warning_chrome_close": "Предупреждение: Това ще затвори всички работещи Chrome процеси"
},
"restore": {
"title": "Възстановяване на машинен идентификатор от резервно копие",
"starting": "Стартиране на процеса на възстановяване на машинния идентификатор",
"no_backups_found": "Не са намерени резервни копия",
"available_backups": "Налични резервни копия",
"select_backup": "Изберете резервно копие за възстановяване",
"to_cancel": "за отказ",
"operation_cancelled": "Операцията е отменена",
"invalid_selection": "Невалиден избор",
"please_enter_number": "Моля, въведете валиден номер",
"missing_id": "Липсващ идентификатор: {id}",
"read_backup_failed": "Неуспешно четене на резервното копие: {error}",
"current_file_not_found": "Текущият файл за съхранение не е намерен",
"current_backup_created": "Създадено е резервно копие на текущия файл за съхранение",
"storage_updated": "Файлът за съхранение е успешно актуализиран",
"update_failed": "Неуспешно актуализиране на файла за съхранение: {error}",
"sqlite_not_found": "SQLite базата данни не е намерена",
"updating_sqlite": "Актуализиране на SQLite базата данни",
"updating_pair": "Актуализиране на двойката ключ-стойност",
"sqlite_updated": "SQLite базата данни е успешно актуализирана",
"sqlite_update_failed": "Неуспешно актуализиране на SQLite базата данни: {error}",
"machine_id_backup_created": "Създадено е резервно копие на файла с машинния идентификатор",
"backup_creation_failed": "Неуспешно създаване на резервно копие: {error}",
"machine_id_updated": "Файлът с машинния идентификатор е успешно актуализиран",
"machine_id_update_failed": "Неуспешно актуализиране на файла с машинния идентификатор: {error}",
"updating_system_ids": "Актуализиране на системните идентификатори",
"system_ids_update_failed": "Неуспешно актуализиране на системните идентификатори: {error}",
"permission_denied": "Достъпът е отказан. Опитайте да стартирате като администратор",
"windows_machine_guid_updated": "Windows машинният GUID е успешно актуализиран",
"update_windows_machine_guid_failed": "Неуспешно актуализиране на Windows машинния GUID: {error}",
"windows_machine_id_updated": "Windows машинният идентификатор е успешно актуализиран",
"update_windows_machine_id_failed": "Неуспешно актуализиране на Windows машинния идентификатор: {error}",
"sqm_client_key_not_found": "Регистърният ключ SQMClient не е намерен",
"update_windows_system_ids_failed": "Неуспешно актуализиране на Windows системните идентификатори: {error}",
"macos_platform_uuid_updated": "macOS платформеният UUID е успешно актуализиран",
"failed_to_execute_plutil_command": "Неуспешно изпълнение на plutil командата",
"update_macos_system_ids_failed": "Неуспешно актуализиране на macOS системните идентификатори: {error}",
"ids_to_restore": "Машинни идентификатори за възстановяване",
"confirm": "Сигурни ли сте, че искате да възстановите тези идентификатори?",
"success": "Машинният идентификатор е успешно възстановен",
"process_error": "Грешка при процеса на възстановяване: {error}",
"press_enter": "Натиснете Enter, за да продължите"
},
"config": {
"configuration": "Конфигурация",
"config_not_available": "Конфигурацията не е налична",
"config_directory": "Конфигурационна директория",
"disabled": "Деактивиран",
"using_temp_dir": "Използване на временна директория поради грешка: {path} (Грешка: {Грешка})",
"file_permissions": "Разрешения за файлове: {разрешения}",
"config_option_added": "Опция за конфигурация Добавена е: {опция}",
"config_setup_error": "Грешка Настройване на конфигурация: {Грешка}",
"config_dir_created": "Създадена директория Config: {path}",
"config_force_update_disabled": "Конфигуриране на актуализацията на силата на файлове Деактивиране, пропускане на принудителна актуализация",
"backup_created": "Създадено архивиране: {path}",
"also_checked": "Също така проверен {path}",
"force_update_failed": "Конфигурация за актуализация на силата не успя: {грешка}",
"file_group": "Файлова група: {Group}",
"config_created": "Config създаден: {config_file}",
"config_force_update_enabled": "Конфигуриране на актуализацията на силата на файла, изпълняваща принудителна актуализация",
"error_getting_file_stats": "Грешка Получаване на статистика на файловете: {Грешка}",
"file_owner": "Собственик на файлове: {собственик}",
"and": "И",
"enabled": "Активиран",
"error_checking_linux_paths": "Проверка на грешки в Linux пътища: {Грешка}",
"the_file_might_be_corrupted_please_reinstall_cursor": "Файлът може да бъде покварен, моля, инсталирайте отново курсор",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Моля, уверете се, че курсорът е инсталиран и е бил стартиран поне веднъж",
"storage_file_is_valid_and_contains_data": "Файлът за съхранение е валиден и съдържа данни",
"documents_path_not_found": "Документът не е намерен, използвайки текущата директория",
"file_size": "Размер на файла: {размер} байта",
"try_running": "Опитайте да стартирате: {команда}",
"backup_failed": "Неуспешно архивиране на конфигурация: {грешка}",
"neither_cursor_nor_cursor_directory_found": "Нито курсор, нито директория на курсора, намерени в {config_base}",
"storage_file_is_empty": "Файлът за съхранение е празен: {Storage_path}",
"storage_directory_not_found": "Директорията за съхранение не е намерена: {Storage_dir}",
"storage_file_not_found": "Файлът за съхранение не е намерен: {Storage_path}",
"error_reading_storage_file": "Грешка за четене на файл за съхранение: {Грешка}",
"config_updated": "Config актуализирана",
"config_removed": "Конфигурационният файл е премахнат за принудителна актуализация",
"storage_file_found": "Намерен файл за съхранение: {Storage_path}",
"permission_denied": "Разрешение е отказано: {storage_path}"
},
"account_info": {
"config_not_found": "Конфигурацията не е намерена.",
"days_remaining": "Остават дни",
"inactive": "Неактивен",
"failed_to_get_subscription": "Не успя да получи информация за абонамента",
"usage_not_found": "Използването не е намерено",
"title": "Информация за акаунта",
"days": "дни",
"email": "Имейл",
"premium": "Премия",
"trial_remaining": "Останал професионален опит",
"basic_usage": "Основно използване",
"failed_to_get_token": "Не успя да получи знак",
"pro": "Про",
"email_not_found": "Имейл не е намерен",
"lifetime_access_enabled": "Достъп до целия живот е активиран",
"active": "Активен",
"failed_to_get_account": "Не успя да получи информация за акаунта",
"pro_trial": "Pro Trial",
"subscription_type": "Тип абонамент",
"token": "Токен",
"usage": "Употреба",
"token_not_found": "Токена не е намерен",
"failed_to_get_email": "Не успя да получи имейл адрес",
"enterprise": "Предприятие",
"premium_usage": "Използване на премиум",
"free": "Безплатно",
"remaining_trial": "Останал опит",
"failed_to_get_usage": "Не успя да получи информация за използване",
"subscription_not_found": "Информацията за абонамента не е намерена",
"subscription": "Абонамент",
"team": "Екип",
"failed_to_get_account_info": "Не успя да получи информация за акаунта"
},
"account_delete": {
"select_google_account": "Моля, изберете вашия акаунт в Google ...",
"advanced_tab_retry": "Разширен раздел не е намерен, опит {опит}/{max_attempts}",
"advanced_tab_clicked": "Щракна върху раздела Advanced",
"login_redirect_failed": "Пренасочването на вход не успя, опитвайки се директна навигация ...",
"navigating_to_settings": "Навигация до страницата на настройките ...",
"unexpected_error": "Неочаквана грешка: {грешка}",
"starting_process": "Начален процес на изтриване на акаунта ...",
"unexpected_page": "Неочаквана страница след влизане: {url}",
"cancelled": "Изтриване на акаунт Анулира.",
"success": "Вашият Cursor акаунт е успешно изтрит!",
"warning": "Предупреждение: Това ще изтрие постоянно вашия акаунт на курсор. Това действие не може да бъде отменено.",
"delete_input_retry": "Изтриването на входа не е намерено, опит {опит}/{max_attempts}",
"confirm_button_error": "Грешка за намиране на бутон за потвърждение: {Грешка}",
"confirm_prompt": "Сигурни ли сте, че искате да продължите? (Y/N):",
"trying_settings": "Опитвам се да се ориентирате към страницата за настройки ...",
"advanced_tab_error": "Грешка за намиране на разширен раздел: {Грешка}",
"found_danger_zone": "Намерено сечение на опасната зона",
"waiting_for_auth": "В очакване на удостоверяване на Google ...",
"logging_in": "Влезте в Google ...",
"title": "Инструмент за изтриване на акаунта на Cursor Google",
"login_successful": "Вход е успешен",
"already_on_settings": "Вече на страницата Настройки",
"direct_advanced_navigation": "Опитване на директна навигация към раздел Advanced",
"account_deleted": "Сметката се изтрива успешно!",
"advanced_tab_not_found": "Разширен раздел не е намерен след множество опити",
"confirm_button_retry": "Бутон за потвърждение не е намерен, опит {опит}/{max_attempts}",
"delete_button_clicked": "Щракнете върху бутона за изтриване на акаунта",
"delete_input_not_found": "Изтриване на входа за потвърждение не е намерен след множество опити",
"email_not_found": "Имейл не е намерен: {Грешка}",
"found_email": "Намерен имейл: {имейл}",
"failed": "Процесът на изтриване на акаунта не е успешен или е анулиран.",
"delete_button_not_found": "Бутонът за изтриване на акаунта не е намерен след множество опити",
"error": "Грешка по време на изтриване на акаунта: {Грешка}",
"delete_button_error": "Грешка за намиране на бутон за изтриване: {Грешка}",
"delete_button_retry": "Бутонът за изтриване не е намерен, опит {опит}/{max_attempts}",
"auth_timeout": "Тайм -аут за удостоверяване, продължаващо така или иначе ...",
"google_button_not_found": "Бутонът за влизане в Google не е намерен",
"delete_input_error": "Грешка за намиране на вход за изтриване: {Грешка}",
"interrupted": "Процесът на изтриване на акаунта, прекъснат от потребителя.",
"confirm_button_not_found": "Бутон за потвърждение не е намерен след множество опити",
"delete_input_not_found_continuing": "Изтриването на входа за потвърждение не е намерено, опитвайки се да продължите така или иначе",
"typed_delete": "Въведено \"Изтриване\" в полето за потвърждение"
},
"github_register": {
"invalid_choice": "Невалиден избор. Моля, въведете „Да“ или „Не“",
"warning2": "Изисква достъп до интернет и административни привилегии.",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Проверете прозорците на браузъра за ръчна намеса или опитайте отново по -късно.",
"title": "GitHub + Cursor AI регистрация автоматизация",
"warning1": "Този скрипт автоматизира създаването на акаунти, което може да наруши условията за обслужване на GitHub/Cursor.",
"completed_successfully": "Регистрацията на GitHub + Cursor приключи успешно!",
"credentials_saved": "Тези идентификационни данни са запазени в github_cursor_accounts.txt",
"confirm": "Сигурни ли сте, че искате да продължите?",
"email_address": "Имейл адрес",
"github_password": "Парола за github",
"cancelled": "Операция отменена",
"warnings_header": "Предупреждения",
"github_username": "Потребителско име на GitHub",
"starting_automation": "Стартиране на автоматизация ...",
"feature1": "Генерира временен имейл с помощта на 1SecMail.",
"feature3": "Проверява автоматично имейла на GitHub.",
"feature2": "Регистрира нов акаунт в GitHub със случайни идентификационни данни.",
"program_terminated": "Програма, прекратена от потребителя",
"features_header": "Характеристики",
"registration_encountered_issues": "Регистрацията на GitHub + курсор срещна проблеми.",
"feature5": "Възстановява идентификатора на машината, за да заобиколи пробното откриване.",
"warning3": "Captcha или допълнителна проверка може да прекъсне автоматизацията.",
"feature6": "Запазва всички идентификационни данни във файл.",
"feature4": "Влиза в курсора AI, използвайки автентификация на GitHub.",
"warning4": "Използвайте отговорно и на свой риск."
},
"oauth": {
"could_not_check_usage_count": "Не можах да проверя броя на употребата: {Грешка}",
"try_running_without_sudo_admin": "Опитайте да стартирате без привилегии за SUDO/администратор",
"browser_setup_completed": "Настройката на браузъра приключи успешно",
"status_check_error": "Грешка в проверката на състоянието: {Грешка}",
"warning_could_not_kill_existing_browser_processes": "Предупреждение: Не можа да убие съществуващите процеси на браузъра: {Грешка}",
"failed_to_extract_auth_info": "Неуспешно извличане на Auth Info: {Грешка}",
"browser_setup_failed": "Настройката на браузъра не бе успешна: {грешка}",
"detected_platform": "Открита платформа: {платформа}",
"auth_update_success": "AUTH актуализиране на успеха",
"account_is_still_valid": "Акаунт все още е валиден (Използване: {usage})",
"running_as_root_warning": "Изпълнението като root не се препоръчва за автоматизация на браузъра",
"using_browser_profile": "Използване на профил на браузъра: {профил}",
"warning_browser_close": "ПРЕДУПРЕЖДЕНИЕ: Това ще затвори всички работещи {браузър} процеси",
"google_start": "Google Start",
"failed_to_delete_account": "Неуспешно изтриване на акаунт: {Грешка}",
"initializing_browser_setup": "Инициализиране на настройка на браузъра ...",
"consider_running_without_sudo": "Помислете за стартиране на скрипта без sudo",
"found_browser_user_data_dir": "Намерено {браузър} директория на потребителски данни: {path}",
"using_first_available_chrome_profile": "Използване на първи наличен хромиран профил: {профил}",
"invalid_authentication_type": "Невалиден тип удостоверяване",
"could_not_find_email": "Не можах да намеря имейл: {грешка}",
"found_default_chrome_profile": "Намерен хромиран профил по подразбиране",
"user_data_dir_not_found": "{Браузър} Директория за потребителски данни не е намерена в {path}, вместо това ще опитате Chrome",
"using_configured_browser_path": "Използване на конфигуриран {браузър} път: {path}",
"could_not_find_usage_count": "Не можах да намеря броя на употребата: {грешка}",
"waiting_for_authentication": "В очакване на удостоверяване ...",
"browser_not_found_trying_chrome": "Не можах да намеря {браузър}, да опитаме хром вместо това",
"found_cookies": "Намерени {count} бисквитки",
"no_chrome_profiles_found": "Не са намерени хромирани профили, използвайки по подразбиране",
"authentication_button_not_found": "Бутонът за удостоверяване не е намерен",
"starting_google_authentication": "Започване на автентификация на Google ...",
"starting_re_authentication_process": "Стартиране на процес на повторна устойчивост ...",
"authentication_successful": "Успехът на удостоверяването - имейл: {имейл}",
"failed_to_delete_expired_account": "Неуспешно изтриване на изтекъл акаунт",
"authentication_failed": "Удостоверяването не бе успешно: {Грешка}",
"error_getting_user_data_directory": "Грешка Получаване на директория за потребителски данни: {Грешка}",
"found_email": "Намерен имейл: {имейл}",
"token_extraction_error": "Грешка в извличането на токени: {Грешка}",
"account_has_reached_maximum_usage": "Акаунт е достигнал максимално използване, {изтриване}",
"found_chrome_at": "Намерен хром на: {path}",
"starting_new_authentication_process": "Стартиране на нов процес на удостоверяване ...",
"github_start": "Github start",
"error_finding_chrome_profile": "Грешка за намиране на хромиран профил, използвайки по подразбиране: {грешка}",
"navigating_to_authentication_page": "Навигация към страницата за удостоверяване ...",
"failed_to_delete_account_or_re_authenticate": "Неуспешно изтриване на акаунт или повторно автентика: {Грешка}",
"starting_browser": "Стартиращ браузър на: {path}",
"no_compatible_browser_found": "Не е намерен съвместим браузър. Моля, инсталирайте Google Chrome или Chromium.",
"killing_browser_processes": "Убиване {браузър} процеси ...",
"browser_failed": "Браузърът не успя да започне: {грешка}",
"browser_closed": "Браузърът е затворен",
"starting_new_google_authentication": "Стартиране на ново удостоверяване на Google ...",
"usage_count": "Брой на употребата: {Използване}",
"authentication_timeout": "Време за изчакване на удостоверяване",
"found_browser_data_directory": "Намерена директория за данни на браузъра: {path}",
"already_on_settings_page": "Вече на страницата Настройки!",
"supported_browsers": "Поддържани браузъри за {платформа}",
"page_changed_checking_auth": "Страницата се промени, проверка на Auth ...",
"browser_failed_to_start": "Браузърът не успя да започне: {грешка}",
"starting_github_authentication": "Стартиране на автентификация на GitHub ...",
"auth_update_failed": "Auth Update не успя",
"missing_authentication_data": "Липсващи данни за удостоверяване: {data}",
"please_select_your_google_account_to_continue": "Моля, изберете вашия акаунт в Google, за да продължите ...",
"authentication_successful_getting_account_info": "Удостоверяване е успешно, получаване на информация за акаунта ...",
"redirecting_to_authenticator_cursor_sh": "Пренасочване към Authenticator.Cursor.sh ...",
"profile_selection_error": "Грешка по време на избор на профил: {Грешка}",
"browser_failed_to_start_fallback": "Браузърът не успя да започне: {грешка}"
},
"auth_check": {
"connection_error": "Грешка в връзката",
"operation_cancelled": "Операция, анулирана от потребителя",
"error_generating_checksum": "Грешка Генериране на контролна сума: {Грешка}",
"user_unauthorized": "Потребителят е неоторизиран",
"authorization_failed": "Упълномощаването не успя!",
"error_getting_token_from_db": "Грешка Получаване на знака от база данни: {Грешка}",
"checking_usage_information": "Проверка на информацията за използването ...",
"token_found_in_db": "Токен, намерен в базата данни",
"unexpected_status_code": "Неочакван код на състоянието: {код}",
"token_source": "Вземете знак от база данни или въведете ръчно? (D/M, по подразбиране: D)",
"usage_response_status": "Състояние на отговора на употребата: {Отговор}",
"enter_token": "Въведете вашия токен на курсора:",
"getting_token_from_db": "Получаване на знака от база данни ...",
"invalid_token": "Невалиден маркер",
"token_length": "Дължина на токена: {дължина} символи",
"authorization_successful": "Разрешение успешно!",
"unexpected_error": "Неочаквана грешка: {грешка}",
"user_authorized": "Потребителят е упълномощен",
"cursor_acc_info_not_found": "cursor_acc_info.py не е намерен",
"check_error": "Разрешение за проверка на грешки: {Грешка}",
"usage_response": "Отговор на употреба: {Отговор}",
"check_usage_response": "Проверете отговора на употребата: {Отговор}",
"checking_authorization": "Проверка на разрешението ...",
"request_timeout": "Заявка изтече",
"jwt_token_warning": "Изглежда, че Token е във формат JWT, но API Check върна неочакван код на състоянието. Маркерът може да е валиден, но достъпът до API е ограничен.",
"token_not_found_in_db": "Токена не е намерен в базата данни"
},
"token": {
"unexpected_error": "Неочаквана грешка по време на опресняване на маркера: {грешка}",
"request_timeout": "Заявка за опресняване на сървъра се изчерпа",
"no_access_token": "Няма маркер за достъп в отговор",
"extraction_error": "Грешка при извличане на токен: {Грешка}",
"refresh_failed": "Опресняване на токена не успя: {грешка}",
"refreshing": "Освежаващ жетон ...",
"refresh_success": "Токенът се освежи! Валидно за {дни} дни (изтича: {изтича})",
"invalid_response": "Невалиден json отговор от опреснен сървър",
"server_error": "Опреснителна грешка в сървъра: http {status}",
"connection_error": "Грешка в връзката за опресняване на сървъра"
},
"bypass": {
"menu_option": "Проверка на версията на байпас курсор",
"backup_created": "Създадено архивиране: {path}",
"write_failed": "Неуспешно напишете product.json: {грешка}",
"description": "Този инструмент променя продукта на Cursor.json, за да заобиколи ограниченията на версията",
"found_product_json": "Намерен product.json: {path}",
"current_version": "Текуща версия: {версия}",
"version_updated": "Версията се актуализира от {old} до {new}",
"title": "Байпасен инструмент за версия на курсора",
"file_not_found": "Файлът не е намерен: {path}",
"no_write_permission": "Без разрешение за запис за файл: {path}",
"stack_trace": "Сметка на стек",
"product_json_not_found": "product.json не е намерен в обикновените Linux пътеки",
"no_update_needed": "Не е необходима актуализация. Текущата версия {версия} вече е> = 0,46.0",
"starting": "Стартиране на байпас на версията на курсора ...",
"unsupported_os": "Неподдържана операционна система: {Система}",
"read_failed": "Неуспешно четене на product.json: {грешка}",
"localappdata_not_found": "LocalAppData Environment Променлива не е намерена",
"bypass_failed": "Байпас на версията не бе успешен: {Грешка}"
},
"bypass_token_limit": {
"title": "Байпасен инструмент за ограничаване на маркера",
"press_enter": "Натиснете Enter, за да продължите ...",
"description": "Този инструмент променя файла workbench.desktop.main.js, за да заобиколи ограничението на маркера"
},
"browser_profile": {
"profile": "Профил {номер}",
"no_profiles": "Не {браузър} профили, намерени",
"error_loading": "Грешка за зареждане {браузър} профили: {грешка}",
"profile_list": "Налични {браузър} профили:",
"invalid_selection": "Невалидна селекция. Моля, опитайте отново.",
"profile_selected": "Избран профил: {профил}",
"select_profile": "Изберете {Browser} профил, който да използвате:",
"title": "Избор на профил на браузъра",
"default_profile": "Профил по подразбиране"
},
"manual_auth": {
"proceed_prompt": "Продължете? (Y/N):",
"auth_updated_successfully": "Информацията за удостоверяване се актуализира успешно!",
"token_verification_skipped": "Проверката на токена пропусна (check_user_authorized.py не е намерен)",
"auth_type_selected": "Избран тип удостоверяване: {type}",
"auth_type_google": "Google",
"token_required": "Необходим е жетон",
"continue_anyway": "Продължете така или иначе? (Y/N):",
"auth_type_github": "Github",
"verifying_token": "Проверка на валидността на жетони ...",
"random_email_generated": "Генериран произволен имейл: {имейл}",
"auth_type_prompt": "Изберете Тип удостоверяване:",
"error": "Грешка: {Грешка}",
"operation_cancelled": "Операция отменена",
"auth_type_auth0": "Auth_0 (по подразбиране)",
"token_verification_error": "Грешка в проверката на токена: {грешка}",
"email_prompt": "Въведете имейл (оставете празно за случаен имейл):",
"token_verified": "Токен успешно се проверява!",
"token_prompt": "Въведете вашия токен на курсора (access_token/refresh_token):",
"invalid_token": "Невалиден маркер. Удостоверяване абортирано.",
"confirm_prompt": "Моля, потвърдете следната информация:",
"auth_update_failed": "Неуспешно актуализиране на информацията за удостоверяване",
"title": "Ръчно удостоверяване на курсора",
"updating_database": "Актуализиране на базата данни за удостоверяване на курсора ..."
},
"tempmail": {
"no_email": "Не е намерен имейл за проверка на курсора",
"config_error": "Грешка в конфигурацията на файла: {грешка}",
"general_error": "Възникна грешка: {грешка}",
"configured_email": "Конфигуриран имейл: {имейл}",
"extract_code_failed": "Кодът за проверка на екстракт не успя: {Грешка}",
"checking_email": "Проверка за имейл за проверка на курсора ...",
"no_code": "Не можа да получи код за проверка",
"email_found": "Намерен имейл за проверка на курсора",
"check_email_failed": "Проверете имейла не е успешен: {Грешка}",
"verification_code": "Код за проверка: {код}"
}
}

878
locales/de.json Normal file
View File

@ -0,0 +1,878 @@
{
"menu": {
"title": "Verfügbare Optionen",
"exit": "Programm Beenden",
"reset": "Maschinen-ID Zurücksetzen",
"register": "Neues Cursor-Konto Registrieren",
"register_google": "Mit Google-Konto Registrieren",
"register_github": "Mit GitHub-Konto Registrieren",
"register_manual": "Cursor Mit Benutzerdefinierter E-Mail Registrieren",
"quit": "Cursor-Anwendung Schließen",
"select_language": "Sprache Ändern",
"select_chrome_profile": "Chrome-Profil Auswählen",
"input_choice": "Bitte geben Sie Ihre Auswahl ein ({choices})",
"invalid_choice": "Ungültige Auswahl. Bitte eine Nummer von {choices} eingeben",
"program_terminated": "Programm wurde vom Benutzer beendet",
"error_occurred": "Ein Fehler ist aufgetreten: {error}. Bitte erneut versuchen",
"press_enter": "Drücken Sie Enter zum Beenden",
"disable_auto_update": "Cursor Auto-Update Deaktivieren",
"lifetime_access_enabled": "LEBENSLANGER ZUGRIFF AKTIVIERT",
"totally_reset": "Cursor Vollständig Zurücksetzen",
"outdate": "Veraltet",
"temp_github_register": "Temporäre GitHub-Registrierung",
"admin_required": "Ausführen als ausführbare Datei, Administratorrechte erforderlich.",
"admin_required_continue": "Mit der aktuellen Version fortfahren...",
"coming_soon": "Bald verfügbar",
"fixed_soon": "Bald Behoben",
"contribute": "Zum Projekt Beitragen",
"config": "Konfiguration Anzeigen",
"delete_google_account": "Cursor Google-Konto Löschen",
"continue_prompt": "Fortfahren? (y/N): ",
"operation_cancelled_by_user": "Vorgang vom Benutzer abgebrochen",
"exiting": "Wird beendet ……",
"bypass_version_check": "Cursor Versionsprüfung Überspringen",
"check_user_authorized": "Benutzerautorisierung Prüfen",
"bypass_token_limit": "Token-Limit umgehen",
"restore_machine_id": "Geräte-ID aus Backup wiederherstellen",
"language_config_saved": "Sprachkonfiguration erfolgreich gespeichert",
"lang_invalid_choice": "Ungültige Auswahl. Bitte geben Sie eine der folgenden Optionen ein: ({Lang_Choices})",
"manual_custom_auth": "Handbuch benutzerdefinierte Auth"
},
"languages": {
"ar": "Arabisch",
"en": "Englisch",
"zh_cn": "Vereinfachtes Chinesisch",
"zh_tw": "Traditionelles Chinesisch",
"vi": "Vietnamesisch",
"nl": "Niederländisch",
"de": "Deutsch",
"fr": "Französisch",
"pt": "Portugiesisch",
"ru": "Russisch",
"es": "Spanisch",
"tr": "Türkisch",
"bg": "Bulgarisch",
"ja": "japanisch",
"it": "Italienisch"
},
"quit_cursor": {
"start": "Beginne Cursor zu Beenden",
"no_process": "Kein Laufender Cursor-Prozess",
"terminating": "Beende Prozess {pid}",
"waiting": "Warte auf Prozessende",
"success": "Alle Cursor-Prozesse Beendet",
"timeout": "Prozess-Timeout: {pids}",
"error": "Fehler Aufgetreten: {error}"
},
"reset": {
"title": "Cursor Maschinen-ID Zurücksetzen Tool",
"checking": "Konfigurationsdatei Überprüfen",
"not_found": "Konfigurationsdatei Nicht Gefunden",
"no_permission": "Kann Konfigurationsdatei Nicht Lesen oder Schreiben, Bitte Dateiberechtigungen Überprüfen",
"reading": "Aktuelle Konfiguration Lesen",
"creating_backup": "Konfigurations-Backup Erstellen",
"backup_exists": "Backup-Datei Existiert Bereits, Backup-Schritt Überspringen",
"generating": "Neue Maschinen-ID Generieren",
"saving_json": "Neue Konfiguration in JSON Speichern",
"success": "Maschinen-ID Erfolgreich Zurückgesetzt",
"new_id": "Neue Maschinen-ID",
"permission_error": "Berechtigungsfehler: {error}",
"run_as_admin": "Bitte Versuchen Sie, Dieses Programm als Administrator Auszuführen",
"process_error": "Zurücksetzungsprozessfehler: {error}",
"updating_sqlite": "SQLite-Datenbank Aktualisieren",
"updating_pair": "Schlüssel-Wert-Paar Aktualisieren",
"sqlite_success": "SQLite-Datenbank Erfolgreich Aktualisiert",
"sqlite_error": "SQLite-Datenbank Aktualisierung Fehlgeschlagen: {error}",
"press_enter": "Drücken Sie Enter zum Fortfahren",
"unsupported_os": "Nicht Unterstütztes Betriebssystem: {os}",
"linux_path_not_found": "Linux-Pfad Nicht Gefunden",
"updating_system_ids": "System-IDs Aktualisieren",
"system_ids_updated": "System-IDs Erfolgreich Aktualisiert",
"system_ids_update_failed": "System-IDs Aktualisierung Fehlgeschlagen: {error}",
"windows_guid_updated": "Windows GUID Erfolgreich Aktualisiert",
"windows_permission_denied": "Windows Berechtigung Verweigert",
"windows_guid_update_failed": "Windows GUID Aktualisierung Fehlgeschlagen",
"macos_uuid_updated": "macOS UUID Erfolgreich Aktualisiert",
"plutil_command_failed": "plutil-Befehl Fehlgeschlagen",
"start_patching": "Patching getMachineId Starten",
"macos_uuid_update_failed": "macOS UUID Aktualisierung Fehlgeschlagen",
"current_version": "Aktuelle Cursor-Version: {version}",
"patch_completed": "Patching getMachineId Abgeschlossen",
"patch_failed": "Patching getMachineId Fehlgeschlagen: {error}",
"version_check_passed": "Cursor-Version Überprüfung Erfolgreich",
"file_modified": "Datei Geändert",
"version_less_than_0_45": "Cursor-Version < 0.45.0, Patching getMachineId Überspringen",
"detecting_version": "Cursor-Version Erkennen",
"patching_getmachineid": "Patching getMachineId",
"version_greater_than_0_45": "Cursor-Version >= 0.45.0, Patching getMachineId",
"permission_denied": "Berechtigung Verweigert: {error}",
"backup_created": "Backup Erstellt",
"update_success": "Update Erfolgreich",
"update_failed": "Update Fehlgeschlagen: {error}",
"windows_machine_guid_updated": "Windows Maschinen-GUID Erfolgreich Aktualisiert",
"reading_package_json": "package.json Lesen {path}",
"invalid_json_object": "Ungültiges JSON-Objekt",
"no_version_field": "Kein Versionsfeld in package.json Gefunden",
"version_field_empty": "Versionsfeld ist Leer",
"invalid_version_format": "Ungültiges Versionsformat: {version}",
"found_version": "Gefundene Version: {version}",
"version_parse_error": "Versions-Parse-Fehler: {error}",
"package_not_found": "Package.json Nicht Gefunden: {path}",
"check_version_failed": "Versionsüberprüfung Fehlgeschlagen: {error}",
"stack_trace": "Stack Trace",
"version_too_low": "Cursor-Version Zu Niedrig: {version} < 0.45.0",
"no_write_permission": "Keine Schreibberechtigung: {path}",
"path_not_found": "Pfad Nicht Gefunden: {path}",
"modify_file_failed": "Datei Ändern Fehlgeschlagen: {error}",
"windows_machine_id_updated": "Windows Maschinen-ID Erfolgreich Aktualisiert",
"update_windows_machine_id_failed": "Windows Maschinen-ID Aktualisierung Fehlgeschlagen: {error}",
"update_windows_machine_guid_failed": "Windows Maschinen-GUID Aktualisierung Fehlgeschlagen: {error}",
"file_not_found": "Datei Nicht Gefunden: {path}"
},
"register": {
"title": "Cursor Registrierungstool",
"start": "Registrierungsprozess Starten...",
"handling_turnstile": "Sicherheitsüberprüfung Verarbeiten...",
"retry_verification": "Überprüfung Erneut Versuchen...",
"detect_turnstile": "Sicherheitsüberprüfung Überprüfen...",
"verification_success": "Sicherheitsüberprüfung Erfolgreich",
"starting_browser": "Browser Öffnen...",
"form_success": "Formular Erfolgreich Eingereicht",
"browser_started": "Browser Erfolgreich Geöffnet",
"waiting_for_second_verification": "Warten auf E-Mail-Verifizierung...",
"waiting_for_verification_code": "Warten auf Verifizierungscode...",
"password_success": "Passwort Erfolgreich Eingestellt",
"password_error": "Konnte Passwort Nicht Einstellen: {error}. Bitte Erneut Versuchen",
"waiting_for_page_load": "Seite Laden...",
"first_verification_passed": "Erste Überprüfung Erfolgreich",
"mailbox": "E-Mail-Postfach Erfolgreich Geöffnet",
"register_start": "Registrierung Starten",
"form_submitted": "Formular Eingereicht, Überprüfung Starten...",
"filling_form": "Formular Ausfüllen",
"visiting_url": "URL Besuchen",
"basic_info": "Grundlegende Informationen Eingereicht",
"handle_turnstile": "Turnstile Verarbeiten",
"no_turnstile": "Kein Turnstile Erkannt",
"turnstile_passed": "Turnstile Erfolgreich",
"verification_start": "Verifizierungscode Erhalten Starten",
"verification_timeout": "Verifizierungscode Timeout",
"verification_not_found": "Kein Verifizierungscode Gefunden",
"try_get_code": "Versuchen | {attempt} Verifizierungscode Erhalten | Verbleibende Zeit: {time}s",
"get_account": "Kontoinformationen Erhalten",
"get_token": "Cursor-Sitzungstoken Erhalten",
"token_success": "Token Erfolgreich Erhalten",
"token_attempt": "Versuchen | {attempt} Mal Token zu Erhalten | Erneut Versuchen in {time}s",
"token_max_attempts": "Maximale Versuche Erreicht ({max}) | Token Erhalten Fehlgeschlagen",
"token_failed": "Token Erhalten Fehlgeschlagen: {error}",
"account_error": "Kontoinformationen Erhalten Fehlgeschlagen: {error}",
"press_enter": "Drücken Sie Enter zum Fortfahren",
"browser_start": "Browser Starten",
"open_mailbox": "Mailbox-Seite Öffnen",
"email_error": "E-Mail-Adresse Erhalten Fehlgeschlagen",
"setup_error": "E-Mail-Einrichtungsfehler: {error}",
"start_getting_verification_code": "Verifizierungscode Erhalten Starten, Erneut Versuchen in 60s",
"get_verification_code_timeout": "Verifizierungscode Erhalten Timeout",
"get_verification_code_success": "Verifizierungscode Erfolgreich Erhalten",
"try_get_verification_code": "Versuchen | {attempt} Verifizierungscode Erhalten | Verbleibende Zeit: {remaining_time}s",
"verification_code_filled": "Verifizierungscode Ausgefüllt",
"login_success_and_jump_to_settings_page": "Anmeldung Erfolgreich und zu Einstellungsseite Springen",
"detect_login_page": "Anmeldeseite Erkennen, Anmeldung Starten...",
"cursor_registration_completed": "Cursor-Registrierung Abgeschlossen!",
"set_password": "Passwort Einstellen",
"basic_info_submitted": "Grundlegende Informationen Eingereicht",
"cursor_auth_info_updated": "Cursor-Authentifizierungsinformationen Aktualisiert",
"cursor_auth_info_update_failed": "Cursor-Authentifizierungsinformationen Aktualisierung Fehlgeschlagen",
"reset_machine_id": "Maschinen-ID Zurücksetzen",
"account_info_saved": "Kontoinformationen Gespeichert",
"save_account_info_failed": "Kontoinformationen Speichern Fehlgeschlagen",
"get_email_address": "E-Mail-Adresse Erhalten",
"update_cursor_auth_info": "Cursor-Authentifizierungsinformationen Aktualisieren",
"register_process_error": "Registrierungsprozessfehler: {error}",
"setting_password": "Passwort Einstellen",
"manual_code_input": "Manuelle Code-Eingabe",
"manual_email_input": "Manuelle E-Mail-Eingabe",
"password": "Passwort",
"first_name": "Vorname",
"last_name": "Nachname",
"exit_signal": "Exit-Signal",
"email_address": "E-Mail-Adresse",
"config_created": "Konfiguration Erstellt",
"verification_failed": "Verifizierung Fehlgeschlagen",
"verification_error": "Verifizierungsfehler: {error}",
"config_option_added": "Konfigurationsoption Hinzugefügt: {option}",
"config_updated": "Konfiguration Aktualisiert",
"password_submitted": "Passwort Eingereicht",
"total_usage": "Gesamtnutzung: {usage}",
"setting_on_password": "Passwort Einstellen",
"getting_code": "Verifizierungscode Erhalten, Erneut Versuchen in 60s",
"using_browser": "Verwenden Sie {Browser} Browser: {Path}",
"could_not_track_processes": "Konnte {Browser} Prozesse nicht verfolgen: {Fehler}",
"try_install_browser": "Installieren Sie den Browser mit Ihrem Paketmanager",
"tempmail_plus_verification_started": "TempmailPlus -Überprüfungsprozess starten",
"max_retries_reached": "Maximale Wiederholungsversuche erreichten. Registrierung fehlgeschlagen.",
"tempmail_plus_enabled": "TempmailPlus ist aktiviert",
"browser_path_invalid": "{Browser} Pfad ist ungültig unter Verwendung des Standardpfads",
"human_verify_error": "Ich kann nicht überprüfen, ob der Benutzer menschlich ist. Wiederholung ...",
"using_tempmail_plus": "Verwenden von TempmailPlus zur E -Mail -Überprüfung",
"tracking_processes": "Tracking {count} {Browser} Prozesse",
"tempmail_plus_verification_failed": "TEMPMAILPLUS -Überprüfung fehlgeschlagen: {Fehler}",
"tempmail_plus_epin_missing": "TempmailPlus Epin ist nicht konfiguriert",
"using_browser_profile": "Verwenden Sie {Browser} Profil von: {user_data_dir}",
"tempmail_plus_verification_completed": "TEMPMAILPLUS -Überprüfung erfolgreich abgeschlossen",
"tempmail_plus_email_missing": "TempmailPlus -E -Mail ist nicht konfiguriert",
"tempmail_plus_init_failed": "Tempmailplus nicht initialisieren: {Fehler}",
"tempmail_plus_config_missing": "Die Konfiguration von TempmailPlus fehlt",
"tempmail_plus_initialized": "TempmailPlus erfolgreich initialisiert",
"tempmail_plus_disabled": "TempmailPlus ist deaktiviert",
"no_new_processes_detected": "Keine neuen {Browser} -Prozesse zur Verfolgung erkannt",
"make_sure_browser_is_properly_installed": "Stellen Sie sicher, dass {Browser} ordnungsgemäß installiert ist"
},
"auth": {
"title": "Cursor Authentifizierungsmanager",
"checking_auth": "Authentifizierungsdatei Überprüfen",
"auth_not_found": "Authentifizierungsdatei Nicht Gefunden",
"auth_file_error": "Authentifizierungsdateifehler: {error}",
"reading_auth": "Authentifizierungsdatei Lesen",
"updating_auth": "Authentifizierungsinformationen Aktualisieren",
"auth_updated": "Authentifizierungsinformationen Erfolgreich Aktualisiert",
"auth_update_failed": "Authentifizierungsinformationen Aktualisierung Fehlgeschlagen: {error}",
"auth_file_created": "Authentifizierungsdatei Erstellt",
"auth_file_create_failed": "Authentifizierungsdatei Erstellen Fehlgeschlagen: {error}",
"press_enter": "Drücken Sie Enter zum Fortfahren",
"reset_machine_id": "Maschinen-ID Zurücksetzen",
"database_connection_closed": "Datenbankverbindung Geschlossen",
"database_updated_successfully": "Datenbank Erfolgreich Aktualisiert",
"connected_to_database": "Mit Datenbank Verbunden",
"updating_pair": "Schlüssel-Wert-Paar Aktualisieren",
"db_not_found": "Datenbankdatei Nicht Gefunden bei: {path}",
"db_permission_error": "Kann Nicht auf Datenbankdatei Zugreifen. Bitte Berechtigungen Überprüfen",
"db_connection_error": "Verbindung zur Datenbank Fehlgeschlagen: {error}"
},
"control": {
"generate_email": "Neue E-Mail Generieren",
"blocked_domain": "Gesperrte Domain",
"select_domain": "Zufällige Domain Auswählen",
"copy_email": "E-Mail-Adresse Kopieren",
"enter_mailbox": "Mailbox Betreten",
"refresh_mailbox": "Mailbox Aktualisieren",
"check_verification": "Verifizierungscode Überprüfen",
"verification_found": "Verifizierungscode Gefunden",
"verification_not_found": "Kein Verifizierungscode Gefunden",
"browser_error": "Browsersteuerungsfehler: {error}",
"navigation_error": "Navigationsfehler: {error}",
"email_copy_error": "E-Mail-Kopierfehler: {error}",
"mailbox_error": "Mailbox-Fehler: {error}",
"token_saved_to_file": "Token Gespeichert in cursor_tokens.txt",
"navigate_to": "Navigieren zu {url}",
"generate_email_success": "E-Mail Erfolgreich Generiert",
"select_email_domain": "E-Mail-Domain Auswählen",
"select_email_domain_success": "E-Mail-Domain Erfolgreich Ausgewählt",
"get_email_name": "E-Mail-Name Erhalten",
"get_email_name_success": "E-Mail-Name Erfolgreich Erhalten",
"get_email_address": "E-Mail-Adresse Erhalten",
"get_email_address_success": "E-Mail-Adresse Erfolgreich Erhalten",
"enter_mailbox_success": "Mailbox Erfolgreich Betreten",
"found_verification_code": "Verifizierungscode Gefunden",
"get_cursor_session_token": "Cursor-Sitzungstoken Erhalten",
"get_cursor_session_token_success": "Cursor-Sitzungstoken Erfolgreich Erhalten",
"get_cursor_session_token_failed": "Cursor-Sitzungstoken Erhalten Fehlgeschlagen",
"save_token_failed": "Token Speichern Fehlgeschlagen",
"database_updated_successfully": "Datenbank Erfolgreich Aktualisiert",
"database_connection_closed": "Datenbankverbindung Geschlossen",
"no_valid_verification_code": "Kein Gültiger Verifizierungscode"
},
"email": {
"starting_browser": "Browser Starten",
"visiting_site": "Besuche mail domains",
"create_success": "E-Mail Erfolgreich Erstellt",
"create_failed": "E-Mail Erstellen Fehlgeschlagen",
"create_error": "E-Mail-Erstellungsfehler: {error}",
"refreshing": "E-Mail Aktualisieren",
"refresh_success": "E-Mail Erfolgreich Aktualisiert",
"refresh_error": "E-Mail-Aktualisierungsfehler: {error}",
"refresh_button_not_found": "Aktualisierungsknopf Nicht Gefunden",
"verification_found": "Verifizierung Gefunden",
"verification_not_found": "Verifizierung Nicht Gefunden",
"verification_error": "Verifizierungsfehler: {error}",
"verification_code_found": "Verifizierungscode Gefunden",
"verification_code_not_found": "Verifizierungscode Nicht Gefunden",
"verification_code_error": "Verifizierungscodefehler: {error}",
"address": "E-Mail-Adresse",
"all_domains_blocked": "Alle Domains Gesperrt, Service Wechseln",
"no_available_domains_after_filtering": "Keine Verfügbaren Domains Nach Filterung",
"switching_service": "Wechseln zu {service} Service",
"domains_list_error": "Domains-Liste Erhalten Fehlgeschlagen: {error}",
"failed_to_get_available_domains": "Verfügbare Domains Erhalten Fehlgeschlagen",
"domains_excluded": "Ausgeschlossene Domains: {domains}",
"failed_to_create_account": "Konto Erstellen Fehlgeschlagen",
"account_creation_error": "Konto-Erstellungsfehler: {error}",
"domain_blocked": "Domain Blocked: {domain}",
"no_display_found": "Kein Display gefunden. Stellen Sie sicher, dass der X -Server ausgeführt wird.",
"try_export_display": "Versuchen Sie: Exportanzeige =: 0",
"try_install_chromium": "Versuchen Sie: sudo apt installieren Chrom-Browser",
"blocked_domains": "Blockierte Domänen: {Domains}",
"blocked_domains_loaded_timeout_error": "Blockierte Domänen geladener Zeitüberschreitungsfehler: {Fehler}",
"blocked_domains_loaded_success": "Blockierte Domänen erfolgreich geladen",
"extension_load_error": "Erweiterungslastfehler: {Fehler}",
"available_domains_loaded": "Verfügbare Domänen geladen: {count}",
"blocked_domains_loaded_error": "Blockierte Domänen geladener Fehler: {Fehler}",
"blocked_domains_loaded_timeout": "Blockierte Domänen geladen Timeout: {Timeout} s",
"make_sure_chrome_chromium_is_properly_installed": "Stellen Sie sicher, dass Chrom/Chrom ordnungsgemäß installiert ist",
"domains_filtered": "Domänen gefiltert: {count}",
"trying_to_create_email": "Versuch, E -Mail zu erstellen: {E -Mail}",
"using_chrome_profile": "Verwenden Sie das Chrome -Profil von: {user_data_dir}",
"blocked_domains_loaded": "Blockierte Domänen geladen: {count}"
},
"update": {
"title": "Cursor Auto-Update Deaktivieren",
"disable_success": "Auto-Update Deaktiviert Erfolgreich",
"disable_failed": "Auto-Update Deaktivieren Fehlgeschlagen: {error}",
"press_enter": "Drücken Sie Enter zum Fortfahren",
"start_disable": "Auto-Update Deaktivieren Starten",
"killing_processes": "Prozesse Töten",
"processes_killed": "Prozesse Getötet",
"removing_directory": "Verzeichnis Entfernen",
"directory_removed": "Verzeichnis Entfernt",
"creating_block_file": "Block-Datei Erstellen",
"block_file_created": "Block-Datei Erstellt",
"clearing_update_yml": "Clearing update.yml -Datei",
"update_yml_cleared": "update.yml -Datei gelöscht",
"unsupported_os": "Nicht unterstütztes Betriebssystem: {System}",
"block_file_already_locked": "Die Blockdatei ist bereits gesperrt",
"yml_already_locked_error": "update.yml -Datei bereits gesperrte Fehler: {Fehler}",
"update_yml_not_found": "update.yml -Datei nicht gefunden",
"yml_locked_error": "update.yml -Datei gesperrter Fehler: {Fehler}",
"remove_directory_failed": "Verzeichnis nicht entfernen: {Fehler}",
"create_block_file_failed": "Die Blockdatei nicht erstellt: {Fehler}",
"yml_already_locked": "update.yml -Datei ist bereits gesperrt",
"block_file_locked_error": "Blockdatei gesperrte Fehler: {Fehler}",
"directory_locked": "Verzeichnis ist gesperrt: {Path}",
"block_file_already_locked_error": "Blockdatei bereits gesperrte Fehler: {Fehler}",
"clear_update_yml_failed": "Fehlgeschlagen, update.yml -Datei zu löschen: {Fehler}",
"yml_locked": "update.yml -Datei ist gesperrt",
"block_file_locked": "Die Blockdatei ist gesperrt"
},
"updater": {
"checking": "Updates prüfen...",
"new_version_available": "Neue Version verfügbar! (Aktuell: {current}, Neueste: {latest})",
"updating": "Zur neuesten Version aktualisieren. Das Programm wird automatisch neu starten.",
"up_to_date": "Sie verwenden die neueste Version.",
"check_failed": "Überprüfung auf Updates fehlgeschlagen: {error}",
"continue_anyway": "Mit der aktuellen Version fortfahren...",
"update_confirm": "Möchten Sie die neueste Version aktualisieren? (Y/n)",
"update_skipped": "Update überspringen.",
"invalid_choice": "Ungültige Auswahl. Bitte geben Sie 'Y' oder 'n' ein.",
"development_version": "Entwickler-Version {current} > {latest}",
"changelog_title": "Changelog",
"rate_limit_exceeded": "Die Github -API -Ratengrenze überschritten. Überspringen Sie Update -Check."
},
"totally_reset": {
"title": "Cursor Vollständig Zurücksetzen",
"checking_config": "Konfigurationsdatei Überprüfen",
"config_not_found": "Konfigurationsdatei Nicht Gefunden",
"no_permission": "Kann Konfigurationsdatei Nicht Lesen oder Schreiben, Bitte Berechtigungen Überprüfen",
"reading_config": "Aktuelle Konfiguration Lesen",
"creating_backup": "Konfigurationsdatei Sichern",
"backup_exists": "Backup-Datei bereits vorhanden, Sicherungsschritt überspringen",
"generating_new_machine_id": "Neue Maschinen-ID Generieren",
"saving_new_config": "Neue Konfiguration in JSON Speichern",
"success": "Cursor Erfolgreich Zurückgesetzt",
"error": "Cursor Zurücksetzen Fehlgeschlagen: {error}",
"press_enter": "Drücken Sie Enter zum Beenden",
"reset_machine_id": "Maschinen-ID Zurücksetzen",
"database_connection_closed": "Datenbankverbindung Geschlossen",
"database_updated_successfully": "Datenbank Erfolgreich Aktualisiert",
"connected_to_database": "Mit Datenbank Verbunden",
"updating_pair": "Schlüssel-Wert-Paar Aktualisieren",
"db_not_found": "Datenbankdatei Nicht Gefunden bei: {path}",
"db_permission_error": "Kann Nicht auf Datenbankdatei Zugreifen. Bitte Berechtigungen Überprüfen",
"db_connection_error": "Verbindung zur Datenbank Fehlgeschlagen: {error}",
"feature_title": "FEATURES",
"feature_1": "Vollständige Entfernung von Cursor AI Einstellungen und Konfigurationen",
"feature_2": "Entfernt alle zwischengespeicherten Daten, einschließlich AI-Verlauf und Prompts",
"feature_3": "Maschinen-ID Zurücksetzen, um Trial-Erkennung zu umgehen",
"feature_4": "Erstellt neue zufällige Maschinen-IDs",
"feature_5": "Entfernt benutzerdefinierte Erweiterungen und Einstellungen",
"feature_6": "Zurücksetzt Trial-Informationen und Aktivierungsdaten",
"feature_7": "Tiefes Scannen für versteckte Lizenz- und Trial-bezogene Dateien",
"feature_8": "Sichert nicht-Cursor-Dateien und Anwendungen",
"feature_9": "Kompatibel mit Windows, macOS und Linux",
"disclaimer_title": "Disclaimer",
"disclaimer_1": "Dieses Tool wird alle Cursor AI Einstellungen,",
"disclaimer_2": "Konfigurationen und zwischengespeicherte Daten löschen. Diese Aktion kann nicht rückgängig gemacht werden.",
"disclaimer_3": "Ihre Code-Dateien werden NICHT beeinflusst, und das Tool ist so konzipiert,",
"disclaimer_4": "nur Cursor AI Editor-Dateien und Trial-Erkennungsmechanismen zu zielen.",
"disclaimer_5": "Andere Anwendungen auf Ihrem System werden NICHT beeinflusst.",
"disclaimer_6": "Sie müssen Cursor AI erneut einrichten, nachdem Sie dieses Tool ausgeführt haben.",
"disclaimer_7": "Verwenden Sie auf eigene Gefahr",
"confirm_title": "Sind Sie sicher, dass Sie fortfahren möchten?",
"confirm_1": "Diese Aktion wird alle Cursor AI Einstellungen,",
"confirm_2": "Konfigurationen und zwischengespeicherte Daten löschen. Diese Aktion kann nicht rückgängig gemacht werden.",
"confirm_3": "Ihre Code-Dateien werden NICHT beeinflusst, und das Tool ist so konzipiert,",
"confirm_4": "nur Cursor AI Editor-Dateien und Trial-Erkennungsmechanismen zu zielen.",
"confirm_5": "Andere Anwendungen auf Ihrem System werden NICHT beeinflusst.",
"confirm_6": "Sie müssen Cursor AI erneut einrichten, nachdem Sie dieses Tool ausgeführt haben.",
"confirm_7": "Verwenden Sie auf eigene Gefahr",
"invalid_choice": "Bitte geben Sie 'Y' oder 'n' ein",
"skipped_for_safety": "Übersprungen für Sicherheit (nicht Cursor-bezogen): {path}",
"deleted": "Gelöscht: {path}",
"error_deleting": "Fehler beim Löschen von {path}: {error}",
"not_found": "Datei nicht gefunden: {path}",
"resetting_machine_id": "Maschinen-IDs zurücksetzen, um Trial-Erkennung zu umgehen...",
"created_machine_id": "Neue Maschinen-ID erstellt: {path}",
"error_creating_machine_id": "Fehler beim Erstellen der Maschinen-ID-Datei {path}: {error}",
"error_searching": "Fehler beim Suchen nach Dateien in {path}: {error}",
"created_extended_trial_info": "Neue erweiterte Trial-Informationen erstellt: {path}",
"error_creating_trial_info": "Fehler beim Erstellen der Trial-Informationen-Datei {path}: {error}",
"resetting_cursor_ai_editor": "Cursor AI Editor zurücksetzen... Bitte warten.",
"reset_cancelled": "Reset abgebrochen. Ohne Änderungen verlassen.",
"windows_machine_id_modification_skipped": "Windows Maschinen-ID-Änderung übersprungen: {error}",
"linux_machine_id_modification_skipped": "Linux machine-id-Änderung übersprungen: {error}",
"note_complete_machine_id_reset_may_require_running_as_administrator": "Hinweis: Vollständiges Zurücksetzen der Maschinen-ID kann erfordern, dass Sie als Administrator ausführen",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "Hinweis: Vollständiges System-Maschinen-ID-Zurücksetzen kann sudo-Berechtigungen erfordern",
"windows_registry_instructions": "📝 HINWEIS: Für vollständiges Zurücksetzen auf Windows müssen Sie möglicherweise auch die Registrierungseinträge bereinigen.",
"windows_registry_instructions_2": " Führen Sie 'regedit' aus und suchen Sie nach Schlüsseln, die 'Cursor' oder 'CursorAI' enthalten, unter HKEY_CURRENT_USER\\Software\\ und löschen Sie sie.\n",
"reset_log_1": "Cursor AI wurde vollständig zurückgesetzt und Trial-Erkennung umgangen!",
"reset_log_2": "Bitte starten Sie Ihr System neu, um die Änderungen zu übernehmen.",
"reset_log_3": "Sie müssen Cursor AI erneut installieren und sollten jetzt einen neuen Trial-Zeitraum haben.",
"reset_log_4": "Für die besten Ergebnisse betrachten Sie auch:",
"reset_log_5": "Verwenden Sie eine andere E-Mail-Adresse beim Registrieren für einen neuen Trial",
"reset_log_6": "Wenn verfügbar, verwenden Sie einen VPN, um Ihre IP-Adresse zu ändern",
"reset_log_7": "Löschen Sie Ihre Browser-Cookies und Cache vor dem Besuch der Cursor AI-Website",
"reset_log_8": "Wenn Probleme bestehen, versuchen Sie, Cursor AI in einem anderen Speicherort zu installieren",
"reset_log_9": "Wenn Sie irgendwelche Probleme haben, gehen Sie zu Github Issue Tracker und erstellen Sie ein Problem unter https://github.com/yeongpin/cursor-free-vip/issues",
"unexpected_error": "Ein unerwarteter Fehler ist aufgetreten: {error}",
"report_issue": "Bitte melden Sie dieses Problem bei Github Issue Tracker unter https://github.com/yeongpin/cursor-free-vip/issues",
"keyboard_interrupt": "Prozess von Benutzer unterbrochen. Beenden...",
"return_to_main_menu": "Zurück zur Hauptseite...",
"process_interrupted": "Prozess unterbrochen. Beenden...",
"press_enter_to_return_to_main_menu": "Drücken Sie Enter, um zur Hauptseite zurückzukehren...",
"removing_known": "Bekannte Trial/Lizenz-Dateien entfernen",
"performing_deep_scan": "Tiefes Scannen nach zusätzlichen Trial/Lizenz-Dateien",
"found_additional_potential_license_trial_files": "Gefundene {count} zusätzliche potentielle Lizenz/Trial-Dateien",
"checking_for_electron_localstorage_files": "Überprüfen auf Electron localStorage-Dateien",
"no_additional_license_trial_files_found_in_deep_scan": "Keine zusätzlichen Lizenz/Trial-Dateien in tiefem Scan gefunden",
"removing_electron_localstorage_files": "Electron localStorage-Dateien entfernen",
"electron_localstorage_files_removed": "Electron localStorage-Dateien entfernt",
"electron_localstorage_files_removal_error": "Fehler beim Entfernen von Electron localStorage-Dateien: {error}",
"removing_electron_localstorage_files_completed": "Entfernen von Electron localStorage-Dateien abgeschlossen",
"warning_title": "WARNUNG",
"delete_input_error": "Fehler finden",
"direct_advanced_navigation": "Versuchen Sie die direkte Navigation auf Advanced Registerkarte",
"delete_input_not_found_continuing": "Löschen Sie die Bestätigungseingabe, die nicht gefunden wurde, und versuche trotzdem weiterzumachen",
"advanced_tab_not_found": "Erweiterte Registerkarte nicht nach mehreren Versuchen gefunden",
"advanced_tab_error": "FEHLER FORDERUNG ERWEITERTE TAB: {ERROR}",
"delete_input_not_found": "Bestätigungseingabe löschen, die nach mehreren Versuchen nicht gefunden wurden",
"failed_to_delete_file": "Datei nicht löschen: {Pfad}",
"operation_cancelled": "Operation storniert. Beenden, ohne Änderungen vorzunehmen.",
"removed": "Entfernt: {Pfad}",
"warning_6": "Nach dem Ausführen dieses Tools müssen Sie Cursor AI erneut einrichten.",
"delete_input_retry": "Eingabe löschen nicht gefunden, versuchen {Versuch}/{max_attempts}",
"warning_4": "Nur Cursor AI -Editor -Dateien und Versuchserkennungsmechanismen abzielen.",
"cursor_reset_failed": "Cursor AI Editor Reset fehlgeschlagen: {Fehler}",
"login_redirect_failed": "Die Anmeldung umgeleitet und versuchte direkte Navigation ...",
"warning_5": "Andere Anwendungen in Ihrem System sind nicht betroffen.",
"failed_to_delete_file_or_directory": "Nicht löschen Datei oder Verzeichnis: {Path}",
"failed_to_delete_directory": "Verzeichnis nicht löschen: {Path}",
"resetting_cursor": "Cursor AI Editor zurücksetzen ... Bitte warten Sie.",
"cursor_reset_completed": "Der Cursor AI -Herausgeber wurde vollständig zurückgesetzt und die Versuchserkennung umgangen!",
"warning_3": "Ihre Codedateien sind nicht betroffen und das Tool ist gestaltet",
"advanced_tab_retry": "Advanced Registerkarte Nicht gefunden, Versuch {Versuch}/{max_attempts}",
"completed_in": "Abgeschlossen in {Zeit} Sekunden",
"delete_button_retry": "Schaltfläche nicht gefunden, versuchen Sie {Versuch}/{max_attempts}",
"advanced_tab_clicked": "Klickte auf die Registerkarte Erweitert",
"already_on_settings": "Bereits auf Einstellungsseite",
"found_danger_zone": "Gefahrenzonenabschnitt gefunden",
"failed_to_remove": "Nicht entfernen: {Pfad}",
"failed_to_reset_machine_guid": "Die Richtlinie des Maschine nicht zurücksetzen",
"deep_scanning": "Tiefenscan für zusätzliche Test-/Lizenzdateien durchführen",
"delete_button_clicked": "Klicken Sie auf die Schaltfläche Konto löschen",
"warning_7": "Verwenden Sie auf eigenes Risiko",
"delete_button_not_found": "Die Kontotaste löschen, die nach mehreren Versuchen nicht gefunden wurden",
"delete_button_error": "Fehler finden Sie Schaltfläche Löschen: {Fehler}",
"warning_1": "Diese Aktion löscht alle Cursor -AI -Einstellungen.",
"warning_2": "Konfigurationen und zwischengespeicherte Daten. Diese Aktion kann nicht rückgängig gemacht werden.",
"navigating_to_settings": "Navigieren zur Seite \"Einstellungen\" ...",
"cursor_reset_cancelled": "Cursor AI Editor Reset Storniert. Beenden, ohne Änderungen vorzunehmen."
},
"chrome_profile": {
"title": "Chrome-Profil Auswahl",
"select_profile": "Wählen Sie ein Chrome-Profil zum Verwenden:",
"profile_list": "Verfügbare Profile:",
"default_profile": "Standard-Profil",
"profile": "Profil {number}",
"no_profiles": "Keine Chrome-Profile gefunden",
"error_loading": "Fehler beim Laden der Chrome-Profile: {error}",
"profile_selected": "Ausgewähltes Profil: {profile}",
"invalid_selection": "Ungültige Auswahl. Bitte versuchen Sie es erneut",
"warning_chrome_close": "Warnung: Dies wird alle laufenden Chrome-Prozesse beenden"
},
"restore": {
"title": "Geräte-ID aus Backup wiederherstellen",
"starting": "Starte Wiederherstellungsprozess für Geräte-ID",
"no_backups_found": "Keine Backup-Dateien gefunden",
"available_backups": "Verfügbare Backup-Dateien",
"select_backup": "Wählen Sie ein Backup zur Wiederherstellung aus",
"to_cancel": "zum Abbrechen",
"operation_cancelled": "Vorgang abgebrochen",
"invalid_selection": "Ungültige Auswahl",
"please_enter_number": "Bitte geben Sie eine gültige Zahl ein",
"missing_id": "Fehlende ID: {id}",
"read_backup_failed": "Backup-Datei konnte nicht gelesen werden: {error}",
"current_file_not_found": "Aktuelle Speicherdatei nicht gefunden",
"current_backup_created": "Backup der aktuellen Speicherdatei erstellt",
"storage_updated": "Speicherdatei erfolgreich aktualisiert",
"update_failed": "Aktualisierung der Speicherdatei fehlgeschlagen: {error}",
"sqlite_not_found": "SQLite-Datenbank nicht gefunden",
"updating_sqlite": "Aktualisiere SQLite-Datenbank",
"updating_pair": "Aktualisiere Schlüssel-Wert-Paar",
"sqlite_updated": "SQLite-Datenbank erfolgreich aktualisiert",
"sqlite_update_failed": "Aktualisierung der SQLite-Datenbank fehlgeschlagen: {error}",
"machine_id_backup_created": "Backup der machineId-Datei erstellt",
"backup_creation_failed": "Backup-Erstellung fehlgeschlagen: {error}",
"machine_id_updated": "machineId-Datei erfolgreich aktualisiert",
"machine_id_update_failed": "Aktualisierung der machineId-Datei fehlgeschlagen: {error}",
"updating_system_ids": "Aktualisiere System-IDs",
"system_ids_update_failed": "Aktualisierung der System-IDs fehlgeschlagen: {error}",
"permission_denied": "Zugriff verweigert. Bitte versuchen Sie es mit Administratorrechten",
"windows_machine_guid_updated": "Windows-Geräte-GUID erfolgreich aktualisiert",
"update_windows_machine_guid_failed": "Aktualisierung des Windows-Geräte-GUID fehlgeschlagen: {error}",
"windows_machine_id_updated": "Windows-Geräte-ID erfolgreich aktualisiert",
"update_windows_machine_id_failed": "Aktualisierung der Windows-Geräte-ID fehlgeschlagen: {error}",
"sqm_client_key_not_found": "SQMClient-Registrierungsschlüssel nicht gefunden",
"update_windows_system_ids_failed": "Aktualisierung der Windows-System-IDs fehlgeschlagen: {error}",
"macos_platform_uuid_updated": "macOS-Plattform-UUID erfolgreich aktualisiert",
"failed_to_execute_plutil_command": "Ausführung des plutil-Befehls fehlgeschlagen",
"update_macos_system_ids_failed": "Aktualisierung der macOS-System-IDs fehlgeschlagen: {error}",
"ids_to_restore": "Wiederherzustellende Geräte-IDs",
"confirm": "Sind Sie sicher, dass Sie diese IDs wiederherstellen möchten?",
"success": "Geräte-ID erfolgreich wiederhergestellt",
"process_error": "Fehler beim Wiederherstellungsprozess: {error}",
"press_enter": "Drücken Sie Enter, um fortzufahren"
},
"oauth": {
"no_chrome_profiles_found": "Keine Chromprofile mit Standardeinstellung gefunden",
"starting_new_authentication_process": "Neuen Authentifizierungsprozess beginnen ...",
"failed_to_delete_account": "Das Konto nicht löschen: {Fehler}",
"found_email": "E -Mail gefunden: {E -Mail}",
"github_start": "Github Start",
"already_on_settings_page": "Bereits auf Einstellungsseite!",
"starting_github_authentication": "GitHub -Authentifizierung starten ...",
"status_check_error": "Statusprüfungsfehler: {Fehler}",
"account_is_still_valid": "Konto ist noch gültig (Nutzung: {Verwendung})",
"authentication_timeout": "Authentifizierungszeitüberschreitung",
"using_first_available_chrome_profile": "Verwenden Sie das erste verfügbare Chromprofil: {Profil}",
"google_start": "Google Start",
"usage_count": "Nutzungsanzahl: {Verwendung}",
"no_compatible_browser_found": "Kein kompatibler Browser gefunden. Bitte installieren Sie Google Chrome oder Chrom.",
"authentication_successful_getting_account_info": "Authentifizierung erfolgreich, Kontoinformationen erhalten ...",
"found_chrome_at": "Chrome bei: {Path} gefunden",
"error_getting_user_data_directory": "Fehler beim Erhalten von Benutzerdatenverzeichnissen: {Fehler}",
"error_finding_chrome_profile": "Fehlerfindungschromprofil unter Verwendung von Standard: {Fehler}",
"auth_update_success": "AUTH -UPDATE ERFORDERUNG",
"authentication_successful": "Authentifizierung erfolgreich - E -Mail: {E -Mail}",
"authentication_failed": "Authentifizierung fehlgeschlagen: {Fehler}",
"warning_browser_close": "Warnung: Dies schließt alle laufenden {Browser} -Prozesse",
"supported_browsers": "Unterstützte Browser für {Plattform}",
"authentication_button_not_found": "Authentifizierungstaste nicht gefunden",
"starting_new_google_authentication": "Neue Google -Authentifizierung starten ...",
"waiting_for_authentication": "Warten auf Authentifizierung ...",
"found_default_chrome_profile": "Standardchromprofil gefunden",
"starting_browser": "Starten Sie Browser bei: {Path}",
"could_not_check_usage_count": "Die Nutzungsanzahl nicht überprüfen: {Fehler}",
"token_extraction_error": "Token -Extraktionsfehler: {Fehler}",
"profile_selection_error": "Fehler während der Profilauswahl: {Fehler}",
"warning_could_not_kill_existing_browser_processes": "WARNUNG: Bestehende Browserprozesse nicht abtöten: {Fehler}",
"browser_failed_to_start": "Browser startete nicht: {Fehler}",
"redirecting_to_authenticator_cursor_sh": "Umleitung von Authenticator.cursor.sh ...",
"starting_re_authentication_process": "Neuauthentifizierungsprozess beginnen ...",
"found_browser_data_directory": "Fund Browser Data Directory: {Path}",
"browser_not_found_trying_chrome": "Konnte {browser} nicht finden, das Chrome stattdessen ausprobiert",
"found_cookies": "Gefunden {count} Cookies",
"auth_update_failed": "Auth -Update fehlgeschlagen",
"failed_to_delete_expired_account": "Nicht abgelaufenes Konto löschen",
"browser_failed_to_start_fallback": "Browser startete nicht: {Fehler}",
"navigating_to_authentication_page": "Navigieren zur Authentifizierungsseite ...",
"initializing_browser_setup": "Initialisieren von Browser -Setup ...",
"browser_closed": "Browser geschlossen",
"failed_to_delete_account_or_re_authenticate": "Das Konto nicht löschen oder neu authentifiziert: {Fehler}",
"detected_platform": "Erkennete Plattform: {Plattform}",
"failed_to_extract_auth_info": "Nicht extrahierte Auth -Info: {Fehler}",
"using_browser_profile": "Verwenden von Browserprofil: {Profil}",
"starting_google_authentication": "Google Authentifizierung starten ...",
"browser_failed": "Browser startete nicht: {Fehler}",
"consider_running_without_sudo": "Erwägen Sie das Skript ohne sudo auszuführen",
"try_running_without_sudo_admin": "Versuchen Sie, ohne sudo/administratorische Privilegien auszuführen",
"page_changed_checking_auth": "Seite geändert, Auth prüfen ...",
"running_as_root_warning": "Für die Browserautomatisierung wird nicht empfohlen",
"please_select_your_google_account_to_continue": "Bitte wählen Sie Ihr Google -Konto aus, um fortzufahren ...",
"browser_setup_failed": "Browser -Setup fehlgeschlagen: {Fehler}",
"missing_authentication_data": "Fehlende Authentifizierungsdaten: {Daten}",
"using_configured_browser_path": "Verwenden Sie konfiguriert {Browser} Pfad: {Path}",
"killing_browser_processes": "Töten {Browser} Prozesse ...",
"could_not_find_usage_count": "Nutzungsanzahl nicht finden: {Fehler}",
"browser_setup_completed": "Browser -Setup erfolgreich abgeschlossen",
"account_has_reached_maximum_usage": "Das Konto hat die maximale Nutzung erreicht, {Löschen}",
"could_not_find_email": "Konnte keine E -Mail finden: {Fehler}",
"user_data_dir_not_found": "{Browser} Benutzerdatenverzeichnis, das bei {Path} nicht gefunden wird, versucht stattdessen Chrome",
"found_browser_user_data_dir": "Gefunden {Browser} Benutzerdatenverzeichnis: {Path}",
"invalid_authentication_type": "Ungültiger Authentifizierungstyp"
},
"auth_check": {
"token_length": "Tokenlänge: {Länge} Zeichen",
"usage_response_status": "Verwendungsantwortstatus: {Antwort}",
"operation_cancelled": "Operation durch den Benutzer abgebrochen",
"checking_usage_information": "Nutzungsinformationen überprüfen ...",
"error_getting_token_from_db": "Fehler, das Token aus der Datenbank erhalten: {Fehler}",
"usage_response": "Verwendungsantwort: {Antwort}",
"authorization_failed": "Autorisierung fehlgeschlagen!",
"authorization_successful": "Autorisierung erfolgreich!",
"check_error": "Fehlerprüfung Autorisierung: {Fehler}",
"request_timeout": "Zeitlich anfordern",
"connection_error": "Verbindungsfehler",
"invalid_token": "Ungültiges Token",
"check_usage_response": "Überprüfen Sie die Nutzungsantwort: {Antwort}",
"enter_token": "Geben Sie Ihren Cursor -Token ein:",
"user_unauthorized": "Der Benutzer ist nicht autorisiert",
"token_found_in_db": "Token in der Datenbank gefunden",
"checking_authorization": "Überprüfung der Autorisierung ...",
"error_generating_checksum": "Fehlergenerierung Prüfsumme: {Fehler}",
"token_source": "Token aus der Datenbank bekommen oder manuell eingeben? (D/M, Standard: D)",
"unexpected_error": "Unerwarteter Fehler: {Fehler}",
"user_authorized": "Der Benutzer ist autorisiert",
"token_not_found_in_db": "Token nicht in der Datenbank gefunden",
"jwt_token_warning": "Token scheint im JWT -Format zu sein, aber der API -Check hat einen unerwarteten Statuscode zurückgegeben. Das Token ist möglicherweise gültig, aber der API -Zugriff ist eingeschränkt.",
"unexpected_status_code": "Unerwarteter Statuscode: {Code}",
"getting_token_from_db": "Token aus der Datenbank zu bekommen ...",
"cursor_acc_info_not_found": "Cursor_acc_info.py nicht gefunden"
},
"account_delete": {
"delete_input_not_found": "Bestätigungseingabe löschen, die nach mehreren Versuchen nicht gefunden wurden",
"logging_in": "Anmelden bei Google ...",
"confirm_button_not_found": "Bestätigen Sie die Taste, die nach mehreren Versuchen nicht gefunden wurde",
"delete_button_clicked": "Klicken Sie auf die Schaltfläche Konto löschen",
"confirm_button_error": "Fehlerfest -Bestätigungs -Taste: {Fehler}",
"confirm_prompt": "Sind Sie sicher, dass Sie fortfahren möchten? (y/n):",
"delete_button_error": "Fehler finden Sie Schaltfläche Löschen: {Fehler}",
"cancelled": "Konto Löschung storniert.",
"error": "Fehler während der Kontoneletion: {Fehler}",
"interrupted": "Der vom Benutzer unterbrochene Konto -Löschungsprozess.",
"delete_input_not_found_continuing": "Löschen Sie die Bestätigungseingabe, die nicht gefunden wurde, und versuche trotzdem weiterzumachen",
"advanced_tab_retry": "Advanced Registerkarte Nicht gefunden, Versuch {Versuch}/{max_attempts}",
"waiting_for_auth": "Warten auf die Google -Authentifizierung ...",
"typed_delete": "In Bestätigungsbox \"Löschen\" eingeben",
"trying_settings": "Versuch, zur Seite \"Einstellungen\" zu navigieren ...",
"email_not_found": "E -Mail nicht gefunden: {Fehler}",
"delete_input_retry": "Eingabe löschen nicht gefunden, versuchen {Versuch}/{max_attempts}",
"delete_button_not_found": "Die Kontotaste löschen, die nach mehreren Versuchen nicht gefunden wurden",
"already_on_settings": "Bereits auf Einstellungsseite",
"failed": "Das Konto -Löschungsprozess ist fehlgeschlagen oder wurde storniert.",
"warning": "Warnung: Dies löscht Ihr Cursorkonto dauerhaft. Diese Aktion kann nicht rückgängig gemacht werden.",
"direct_advanced_navigation": "Versuchen Sie die direkte Navigation auf Advanced Registerkarte",
"advanced_tab_not_found": "Erweiterte Registerkarte nicht nach mehreren Versuchen gefunden",
"auth_timeout": "Authentifizierungszeitüberschreitung, trotzdem fortgesetzt ...",
"select_google_account": "Bitte wählen Sie Ihr Google -Konto aus ...",
"google_button_not_found": "Google Login -Schaltfläche nicht gefunden",
"found_danger_zone": "Gefahrenzonenabschnitt gefunden",
"account_deleted": "Konto erfolgreich gelöscht!",
"advanced_tab_error": "FEHLER FORDERUNG ERWEITERTE TAB: {ERROR}",
"starting_process": "Löschungsprozess des Kontos starten ...",
"delete_button_retry": "Schaltfläche nicht gefunden, versuchen Sie {Versuch}/{max_attempts}",
"login_redirect_failed": "Die Anmeldung umgeleitet und versuchte direkte Navigation ...",
"unexpected_error": "Unerwarteter Fehler: {Fehler}",
"delete_input_error": "Fehler finden",
"login_successful": "Erfolgreich anmelden",
"advanced_tab_clicked": "Klickte auf die Registerkarte Erweitert",
"unexpected_page": "Unerwartete Seite nach Anmeldung: {url}",
"found_email": "E -Mail gefunden: {E -Mail}",
"title": "Cursor Google -Konto Löschungstool",
"navigating_to_settings": "Navigieren zur Seite \"Einstellungen\" ...",
"success": "Ihr Cursorkonto wurde erfolgreich gelöscht!",
"confirm_button_retry": "Nicht gefundene Schaltfläche bestätigen, Versuch {Versuch}/{max_attempts}"
},
"manual_auth": {
"auth_type_selected": "Ausgewählter Authentifizierungstyp: {Typ}",
"proceed_prompt": "Fortfahren? (y/n):",
"auth_type_github": "Github",
"confirm_prompt": "Bitte bestätigen Sie die folgenden Informationen:",
"invalid_token": "Ungültiges Token. Authentifizierung abgebrochen.",
"continue_anyway": "Trotzdem fortfahren? (y/n):",
"token_verified": "Token verifiziert erfolgreich!",
"error": "Fehler: {Fehler}",
"auth_update_failed": "Die Authentifizierungsinformationen nicht aktualisieren",
"auth_type_auth0": "Auth_0 (Standard)",
"auth_type_prompt": "Wählen Sie Authentifizierungstyp:",
"verifying_token": "Überprüfung der Gültigkeit der Token ...",
"auth_updated_successfully": "Authentifizierungsinformationen erfolgreich aktualisiert!",
"email_prompt": "E -Mail eingeben (für zufällige E -Mails leer lassen):",
"token_prompt": "Geben Sie Ihr Cursor -Token (Access_Token/refresh_token) ein:",
"title": "Manuelle Cursorauthentifizierung",
"token_verification_skipped": "Token -Überprüfung übersprungen (check_user_authorized.py nicht gefunden)",
"random_email_generated": "Zufällige E -Mail generiert: {E -Mail}",
"token_required": "Token ist erforderlich",
"auth_type_google": "Google",
"operation_cancelled": "Operation storniert",
"token_verification_error": "Fehlerüberprüfung der Token: {Fehler}",
"updating_database": "Aktualisieren von Cursorauthentifizierungsdatenbank ..."
},
"token": {
"refreshing": "Erfrischendes Token ...",
"extraction_error": "Fehler beim Extrahieren von Token: {Fehler}",
"invalid_response": "Ungültige JSON -Antwort vom Refresh -Server",
"no_access_token": "Kein Zugangstoken als Antwort",
"connection_error": "Verbindungsfehler zum aktuellen Server",
"unexpected_error": "Unerwarteter Fehler während der Token -Aktualisierung: {Fehler}",
"server_error": "Serverfehler aktualisieren: http {Status}",
"refresh_success": "Token wurde erfolgreich erfrischt! Gültig für {Tage} Tage (abläuft: {Ablauf})",
"request_timeout": "Anfrage zum Aktualisieren des Servers zeitlich festgelegt",
"refresh_failed": "Token -Aktualisierung fehlgeschlagen: {Fehler}"
},
"browser_profile": {
"profile_selected": "Ausgewähltes Profil: {Profil}",
"default_profile": "Standardprofil",
"no_profiles": "Keine {Browser} -Profile gefunden",
"select_profile": "Wählen Sie {Browser} -Profile aus, um zu verwenden:",
"error_loading": "Fehler laden {Browser} Profile: {Fehler}",
"invalid_selection": "Ungültige Auswahl. Bitte versuchen Sie es erneut.",
"title": "Browser -Profilauswahl",
"profile": "Profil {Nummer}",
"profile_list": "Verfügbar {Browser} Profile:"
},
"github_register": {
"feature2": "Registriert ein neues Github -Konto mit zufälligen Anmeldeinformationen.",
"feature6": "Speichert alle Anmeldeinformationen in einer Datei.",
"starting_automation": "Automatisierung beginnen ...",
"feature1": "Generiert eine temporäre E -Mail mit 1secmail.",
"title": "GitHub + Cursor AI Registrierung Automatisierung",
"github_username": "Github Benutzername",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Überprüfen Sie die Browserfenster auf manuelle Eingriffe oder versuchen Sie es später erneut.",
"warning1": "Dieses Skript automatisiert die Kontoerstellung, die möglicherweise gegen GitHub/Cursor -Nutzungsbedingungen verstoßen.",
"feature4": "Loggen Sie sich in Cursor AI unter Verwendung der Github -Authentifizierung an.",
"invalid_choice": "Ungültige Auswahl. Bitte geben Sie 'Ja' oder 'Nein' ein",
"completed_successfully": "GitHub + Cursor -Registrierung erfolgreich abgeschlossen!",
"warning2": "Benötigt Internetzugang und administrative Berechtigungen.",
"registration_encountered_issues": "GitHub + Cursorregistrierung trafen auf Probleme.",
"credentials_saved": "Diese Anmeldeinformationen wurden auf github_cursor_accounts.txt gespeichert",
"feature3": "Überprüft die GitHub -E -Mail automatisch.",
"github_password": "GitHub Passwort",
"features_header": "Merkmale",
"feature5": "Setzt die Maschinen -ID zurück, um die Versuchserkennung zu umgehen.",
"warning4": "Verwenden Sie verantwortungsbewusst und auf eigenes Risiko.",
"warning3": "Captcha oder zusätzliche Überprüfung kann die Automatisierung unterbrechen.",
"cancelled": "Operation storniert",
"warnings_header": "Warnungen",
"program_terminated": "Programm vom Benutzer beendet",
"confirm": "Sind Sie sicher, dass Sie fortfahren möchten?",
"email_address": "E-Mail-Adresse"
},
"account_info": {
"subscription": "Abonnement",
"failed_to_get_account_info": "Es wurden keine Kontoinformationen erhalten",
"subscription_type": "Abonnementtyp",
"pro": "Pro",
"failed_to_get_account": "Es wurden keine Kontoinformationen erhalten",
"config_not_found": "Konfiguration nicht gefunden.",
"premium_usage": "Premium -Nutzung",
"failed_to_get_subscription": "Abonnementinformationen nicht erhalten",
"basic_usage": "Grundnutzung",
"premium": "Prämie",
"free": "Frei",
"email_not_found": "E -Mail nicht gefunden",
"title": "Kontoinformationen",
"inactive": "Inaktiv",
"remaining_trial": "Verbleibender Versuch",
"enterprise": "Unternehmen",
"lifetime_access_enabled": "Lebensdauer Zugang aktiviert",
"failed_to_get_usage": "Nutzungsinformationen nicht erhalten",
"usage_not_found": "Nutzung nicht gefunden",
"days_remaining": "Verbleibende Tage",
"failed_to_get_token": "Versäumte es, Token zu bekommen",
"token": "Token",
"subscription_not_found": "Abonnementinformationen nicht gefunden",
"days": "Tage",
"team": "Team",
"token_not_found": "Token nicht gefunden",
"pro_trial": "Pro Test",
"active": "Aktiv",
"email": "E-Mail",
"failed_to_get_email": "Die E -Mail -Adresse nicht erhalten",
"trial_remaining": "Verbleibender Pro -Versuch",
"usage": "Verwendung"
},
"config": {
"config_updated": "Konfiguration aktualisiert",
"configuration": "Konfiguration",
"file_owner": "Dateibesitzer: {Eigentümer}",
"error_checking_linux_paths": "Fehlerprüfung Linux -Pfade: {Fehler}",
"storage_file_is_empty": "Speicherdatei ist leer: {Storage_path}",
"config_directory": "Konfigurationsverzeichnis",
"documents_path_not_found": "Dokumente Pfad nicht gefunden, unter Verwendung des aktuellen Verzeichnisses",
"config_not_available": "Konfiguration nicht verfügbar",
"neither_cursor_nor_cursor_directory_found": "Weder Cursor noch Cursorverzeichnis in {config_base} gefunden",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Bitte stellen Sie sicher, dass der Cursor installiert ist und mindestens einmal ausgeführt wurde",
"using_temp_dir": "Verwenden von temporärem Verzeichnis aufgrund von Fehler: {Path} (Fehler: {Fehler})",
"config_created": "Konfiguration erstellt: {config_file}",
"storage_file_not_found": "Speicherdatei nicht gefunden: {Storage_path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "Die Datei kann beschädigt sein. Bitte installieren Sie den Cursor neu.",
"error_getting_file_stats": "Fehler Erhalten von Dateistatistiken: {Fehler}",
"enabled": "Ermöglicht",
"backup_created": "Sicherung erstellt: {Path}",
"file_permissions": "Dateiberechtigungen: {Berechtigungen}",
"config_setup_error": "Fehler einrichten Konfiguration: {Fehler}",
"config_removed": "Konfigurationsdatei für erzwungene Aktualisierung entfernt",
"config_force_update_enabled": "Konfigurationsdatei -Kraft -Update aktiviert und erzwungenes Update durchführen",
"error_reading_storage_file": "Fehler beim Lesen der Speicherdatei: {Fehler}",
"file_size": "Dateigröße: {Größe} Bytes",
"config_force_update_disabled": "Konfigurationsdatei -Kraft -Aktualisierung deaktiviert, überspringen erzwungenes Update",
"config_dir_created": "Konfigurationsverzeichnis erstellt: {Path}",
"config_option_added": "Konfigurationsoption hinzugefügt: {Option}",
"file_group": "Dateigruppe: {Gruppe}",
"and": "Und",
"force_update_failed": "Force -Update -Konfiguration fehlgeschlagen: {Fehler}",
"storage_directory_not_found": "Speicherverzeichnis nicht gefunden: {Storage_dir}",
"also_checked": "Auch überprüft {Path}",
"storage_file_found": "Speicherdatei gefunden: {Storage_path}",
"disabled": "Deaktiviert",
"try_running": "Versuchen Sie das Ausführen: {Befehl}",
"backup_failed": "Failed to backup config: {error}",
"storage_file_is_valid_and_contains_data": "Die Speicherdatei ist gültig und enthält Daten",
"permission_denied": "Erlaubnis abgelehnt: {Storage_path}"
},
"bypass": {
"found_product_json": "Found Product.json: {Path}",
"starting": "Cursorversion Bypass starten ...",
"version_updated": "Version von {Old} zu {new} aktualisiert",
"menu_option": "Bypass Cursor Versionsprüfung",
"unsupported_os": "Nicht unterstütztes Betriebssystem: {System}",
"backup_created": "Sicherung erstellt: {Path}",
"current_version": "Aktuelle Version: {Version}",
"localappdata_not_found": "LocalAppdata -Umgebungsvariable nicht gefunden",
"no_write_permission": "Keine Schreibberechtigung für Datei: {Path}",
"write_failed": "Product nicht geschrieben.json: {error}",
"description": "Dieses Tool modifiziert Cursors product.json, um die Versionsbeschränkungen zu umgehen",
"bypass_failed": "Versionsbypass fehlgeschlagen: {Fehler}",
"title": "Cursorversion Bypass -Tool",
"no_update_needed": "Kein Update erforderlich. Die aktuelle Version {Version} ist bereits> = 0,46.0",
"read_failed": "Product nicht gelesen.json: {error}",
"stack_trace": "Stapelspur",
"product_json_not_found": "product.json nicht in gemeinsamen Linux -Pfaden gefunden",
"file_not_found": "Datei nicht gefunden: {Path}"
},
"bypass_token_limit": {
"description": "Dieses Tool modifiziert die Datei workbench.desktop.main.js, um die Token -Grenze zu umgehen",
"press_enter": "Drücken Sie die Eingabetaste, um fortzufahren ...",
"title": "Bypass Token Limit Tool"
},
"tempmail": {
"no_email": "Keine Cursorüberprüfungs -E -Mail gefunden",
"general_error": "Es ist ein Fehler aufgetreten: {Fehler}",
"config_error": "Konfigurationsdateifehler: {Fehler}",
"checking_email": "Überprüfung nach Cursor -Überprüfungs -E -Mail ...",
"extract_code_failed": "Verifizierungscode extrahieren fehlgeschlagen: {Fehler}",
"configured_email": "Konfigurierte E -Mail: {E -Mail}",
"no_code": "Konnte keinen Bestätigungscode erhalten",
"check_email_failed": "Überprüfen Sie die E -Mail fehlgeschlagen: {Fehler}",
"email_found": "Gefundene Cursor -Überprüfungs -E -Mail gefunden",
"verification_code": "Überprüfungscode: {Code}"
}
}

View File

@ -2,20 +2,58 @@
"menu": {
"title": "Available Options",
"exit": "Exit Program",
"reset": "Reset Machine Manual",
"register": "Register Cursor",
"quit": "Quit Cursor",
"select_language": "Select Language",
"input_choice": "Enter your choice ({choices})",
"invalid_choice": "Invalid choice. Please try again",
"program_terminated": "Program terminated by user",
"error_occurred": "An error occurred: {error}",
"press_enter": "Press Enter to Exit"
"reset": "Reset Machine ID",
"register": "Register New Cursor Account",
"register_google": "Register with Self Google Account",
"register_github": "Register with Self GitHub Account",
"register_manual": "Register Cursor with Custom Email",
"quit": "Close Cursor Application",
"select_language": "Change Language",
"select_chrome_profile": "Select Chrome Profile",
"input_choice": "Please enter your choice ({choices})",
"invalid_choice": "Invalid selection. Please enter a number from {choices}",
"program_terminated": "Program was terminated by user",
"error_occurred": "An error occurred: {error}. Please try again",
"press_enter": "Press Enter to Exit",
"disable_auto_update": "Disable Cursor Auto-Update",
"lifetime_access_enabled": "LIFETIME ACCESS ENABLED",
"totally_reset": "Totally Reset Cursor",
"outdate": "Outdated",
"temp_github_register": "Temporary GitHub Register",
"admin_required": "Running as executable, administrator privileges required.",
"admin_required_continue": "Continuing without administrator privileges.",
"coming_soon": "Coming Soon",
"fixed_soon": "Fixed Soon",
"contribute": "Contribute to the Project",
"config": "Show Config",
"delete_google_account": "Delete Cursor Google Account",
"continue_prompt": "Continue? (y/N): ",
"operation_cancelled_by_user": "Operation cancelled by user",
"exiting": "Exiting ……",
"bypass_version_check": "Bypass Cursor Version Check",
"check_user_authorized": "Check User Authorized",
"bypass_token_limit": "Bypass Token Limit",
"language_config_saved": "Language configuration saved successfully",
"lang_invalid_choice": "Invalid choice. Please enter one of the following options: ({lang_choices})",
"restore_machine_id": "Restore Machine ID from Backup",
"manual_custom_auth": "Manual Custom Auth"
},
"languages": {
"ar": "Arabic",
"en": "English",
"zh_cn": "简体中文",
"zh_tw": "繁體中文"
"zh_tw": "繁體中文",
"vi": "Vietnamese",
"nl": "Dutch",
"de": "German",
"fr": "French",
"pt": "Portuguese",
"ru": "Russian",
"tr": "Turkish",
"bg": "Bulgarian",
"es": "Spanish",
"ja": "Japanese",
"it": "Italian"
},
"quit_cursor": {
"start": "Start Quitting Cursor",
@ -62,25 +100,52 @@
"patch_completed": "Patching getMachineId Completed",
"patch_failed": "Patching getMachineId Failed: {error}",
"version_check_passed": "Cursor Version Check Passed",
"file_modified": "File Modified"
"file_modified": "File Modified",
"version_less_than_0_45": "Cursor Version < 0.45.0, Skip Patching getMachineId",
"detecting_version": "Detecting Cursor Version",
"patching_getmachineid": "Patching getMachineId",
"version_greater_than_0_45": "Cursor Version >= 0.45.0, Patching getMachineId",
"permission_denied": "Permission Denied: {error}",
"backup_created": "Backup Created",
"update_success": "Update Success",
"update_failed": "Update Failed: {error}",
"windows_machine_guid_updated": "Windows Machine GUID Updated Successfully",
"reading_package_json": "Reading package.json {path}",
"invalid_json_object": "Invalid JSON Object",
"no_version_field": "No Version Field Found in package.json",
"version_field_empty": "Version Field is Empty",
"invalid_version_format": "Invalid Version Format: {version}",
"found_version": "Found Version: {version}",
"version_parse_error": "Version Parse Error: {error}",
"package_not_found": "Package.json Not Found: {path}",
"check_version_failed": "Check Version Failed: {error}",
"stack_trace": "Stack Trace",
"version_too_low": "Cursor Version Too Low: {version} < 0.45.0",
"no_write_permission": "No Write Permission: {path}",
"path_not_found": "Path Not Found: {path}",
"modify_file_failed": "Modify File Failed: {error}",
"windows_machine_id_updated": "Windows Machine ID Updated Successfully",
"update_windows_machine_id_failed": "Update Windows Machine ID Failed: {error}",
"update_windows_machine_guid_failed": "Update Windows Machine GUID Failed: {error}",
"file_not_found": "File Not Found: {path}"
},
"register": {
"title": "Cursor Registration Tool",
"start": "Starting Registration Process",
"handling_turnstile": "Handling Turnstile",
"retry_verification": "Retry Verification",
"detect_turnstile": "Detect Turnstile",
"verification_success": "Verification Success",
"starting_browser": "Starting Browser",
"form_success": "Form Success",
"browser_started": "Browser Started",
"waiting_for_second_verification": "Waiting for Second Verification",
"waiting_for_verification_code": "Waiting for Verification Code",
"password_success": "Password Set Successfully",
"password_error": "Password Set Failed: {error}",
"waiting_for_page_load": "Waiting for Page Load",
"first_verification_passed": "First Verification Passed",
"mailbox": "Successfully Entered Mailbox",
"start": "Starting registration process...",
"handling_turnstile": "Processing security verification...",
"retry_verification": "Retrying verification...",
"detect_turnstile": "Checking security verification...",
"verification_success": "Security verification successful",
"starting_browser": "Opening browser...",
"form_success": "Form submitted successfully",
"browser_started": "Browser opened successfully",
"waiting_for_second_verification": "Waiting for email verification...",
"waiting_for_verification_code": "Waiting for verification code...",
"password_success": "Password set successfully",
"password_error": "Could not set password: {error}. Please try again",
"waiting_for_page_load": "Loading page...",
"first_verification_passed": "Initial verification successful",
"mailbox": "Successfully accessed email inbox",
"register_start": "Start Register",
"form_submitted": "Form Submitted, Start Verification...",
"filling_form": "Fill Form",
@ -123,7 +188,46 @@
"get_email_address": "Get Email Address",
"update_cursor_auth_info": "Update Cursor Auth Info",
"register_process_error": "Register Process Error: {error}",
"setting_password": "Setting Password"
"setting_password": "Setting Password",
"manual_code_input": "Manual Code Input",
"manual_email_input": "Manual Email Input",
"suggest_email": "Suggested email: {suggested_email}",
"use_suggested_email_or_enter": "Type \"yes\" to use this email or enter your own email:",
"password": "Password",
"first_name": "First Name",
"last_name": "Last Name",
"exit_signal": "Exit Signal",
"email_address": "Email Address",
"config_created": "Config Created",
"verification_failed": "Verification Failed",
"verification_error": "Verification Error: {error}",
"config_option_added": "Config Option Added: {option}",
"config_updated": "Config Updated",
"password_submitted": "Password Submitted",
"total_usage": "Total Usage: {usage}",
"setting_on_password": "Setting Password",
"getting_code": "Getting Verification Code, Will Try in 60s",
"human_verify_error": "Can't verify the user is human. Retrying...",
"max_retries_reached": "Maximum retry attempts reached. Registration failed.",
"browser_path_invalid": "{browser} path is invalid, using default path",
"using_browser": "Using {browser} browser: {path}",
"using_browser_profile": "Using {browser} profile from: {user_data_dir}",
"make_sure_browser_is_properly_installed": "Make sure {browser} is properly installed",
"try_install_browser": "Try installing the browser with your package manager",
"tracking_processes": "Tracking {count} {browser} processes",
"no_new_processes_detected": "No new {browser} processes detected to track",
"could_not_track_processes": "Could not track {browser} processes: {error}",
"using_tempmail_plus": "Using TempMailPlus for email verification",
"tempmail_plus_enabled": "TempMailPlus is enabled",
"tempmail_plus_disabled": "TempMailPlus is disabled",
"tempmail_plus_config_missing": "TempMailPlus configuration is missing",
"tempmail_plus_email_missing": "TempMailPlus email is not configured",
"tempmail_plus_epin_missing": "TempMailPlus epin is not configured",
"tempmail_plus_initialized": "TempMailPlus initialized successfully",
"tempmail_plus_init_failed": "Failed to initialize TempMailPlus: {error}",
"tempmail_plus_verification_started": "Starting TempMailPlus verification process",
"tempmail_plus_verification_completed": "TempMailPlus verification completed successfully",
"tempmail_plus_verification_failed": "TempMailPlus verification failed: {error}"
},
"auth": {
"title": "Cursor Auth Manager",
@ -141,7 +245,10 @@
"database_connection_closed": "Database Connection Closed",
"database_updated_successfully": "Database Updated Successfully",
"connected_to_database": "Connected to Database",
"updating_pair": "Updating Key-Value Pair"
"updating_pair": "Updating Key-Value Pair",
"db_not_found": "Database file not found at: {path}",
"db_permission_error": "Cannot access database file. Please check permissions",
"db_connection_error": "Failed to connect to database: {error}"
},
"control": {
"generate_email": "Generating New Email",
@ -178,7 +285,7 @@
},
"email": {
"starting_browser": "Starting Browser",
"visiting_site": "Visiting smailpro.com",
"visiting_site": "Visiting mail domains",
"create_success": "Email Created Successfully",
"create_failed": "Failed to Create Email",
"create_error": "Email Creation Error: {error}",
@ -192,6 +299,570 @@
"verification_code_found": "Verification Code Found",
"verification_code_not_found": "Verification Code Not Found",
"verification_code_error": "Verification Code Error: {error}",
"address": "Email Address"
"address": "Email Address",
"all_domains_blocked": "All Domains Blocked, Switching Service",
"no_available_domains_after_filtering": "No Available Domains After Filtering",
"switching_service": "Switching to {service} Service",
"domains_list_error": "Failed to Get Domains List: {error}",
"failed_to_get_available_domains": "Failed to Get Available Domains",
"domains_excluded": "Domains Excluded: {domains}",
"failed_to_create_account": "Failed to Create Account",
"account_creation_error": "Account Creation Error: {error}",
"blocked_domains": "Blocked Domains: {domains}",
"blocked_domains_loaded": "Blocked Domains Loaded: {count}",
"blocked_domains_loaded_error": "Blocked Domains Loaded Error: {error}",
"blocked_domains_loaded_success": "Blocked Domains Loaded Successfully",
"blocked_domains_loaded_timeout": "Blocked Domains Loaded Timeout: {timeout}s",
"blocked_domains_loaded_timeout_error": "Blocked Domains Loaded Timeout Error: {error}",
"available_domains_loaded": "Available Domains Loaded: {count}",
"domains_filtered": "Domains Filtered: {count}",
"trying_to_create_email": "Trying to create email: {email}",
"domain_blocked": "Domain Blocked: {domain}",
"using_chrome_profile": "Using Chrome profile from: {user_data_dir}",
"no_display_found": "No display found. Make sure X server is running.",
"try_export_display": "Try: export DISPLAY=:0",
"extension_load_error": "Extension Load Error: {error}",
"make_sure_chrome_chromium_is_properly_installed": "Make sure Chrome/Chromium is properly installed",
"try_install_chromium": "Try: sudo apt install chromium-browser"
},
"update": {
"title": "Disable Cursor Auto Update",
"disable_success": "Auto Update Disabled Successfully",
"disable_failed": "Disable Auto Update Failed: {error}",
"press_enter": "Press Enter to Exit",
"start_disable": "Start Disabling Auto Update",
"killing_processes": "Killing Processes",
"processes_killed": "Processes Killed",
"removing_directory": "Removing Directory",
"directory_removed": "Directory Removed",
"creating_block_file": "Creating Block File",
"block_file_created": "Block File Created",
"clearing_update_yml": "Clearing update.yml file",
"update_yml_cleared": "update.yml file cleared",
"update_yml_not_found": "update.yml file not found",
"clear_update_yml_failed": "Failed to clear update.yml file: {error}",
"unsupported_os": "Unsupported OS: {system}",
"remove_directory_failed": "Failed to remove directory: {error}",
"create_block_file_failed": "Failed to create block file: {error}",
"directory_locked": "Directory is locked: {path}",
"yml_locked": "update.yml file is locked",
"block_file_locked": "block file is locked",
"yml_already_locked": "update.yml file is already locked",
"block_file_already_locked": "block file is already locked",
"block_file_locked_error": "Block file locked error: {error}",
"yml_locked_error": "update.yml file locked error: {error}",
"block_file_already_locked_error": "Block file already locked error: {error}",
"yml_already_locked_error": "update.yml file already locked error: {error}"
},
"updater": {
"checking": "Checking for updates...",
"new_version_available": "New version available! (Current: {current}, Latest: {latest})",
"updating": "Updating to the latest version. The program will restart automatically.",
"up_to_date": "You are using the latest version.",
"check_failed": "Failed to check for updates: {error}",
"continue_anyway": "Continuing with current version...",
"update_confirm": "Do you want to update to the latest version? (Y/n)",
"update_skipped": "Skipping update.",
"invalid_choice": "Invalid choice. Please enter 'Y' or 'n'.",
"development_version": "Development Version {current} > {latest}",
"changelog_title": "Changelog",
"rate_limit_exceeded": "GitHub API rate limit exceeded. Skipping update check."
},
"totally_reset": {
"title": "Totally Reset Cursor",
"checking_config": "Checking Config File",
"config_not_found": "Config File Not Found",
"no_permission": "Cannot Read or Write Config File, Please Check File Permissions",
"reading_config": "Reading Current Config",
"creating_backup": "Creating Config Backup",
"backup_exists": "Backup File Already Exists, Skipping Backup Step",
"generating_new_machine_id": "Generating New Machine ID",
"saving_new_config": "Saving New Config to JSON",
"success": "Cursor Reset Successfully",
"error": "Cursor Reset Failed: {error}",
"press_enter": "Press Enter to Exit",
"reset_machine_id": "Reset Machine ID",
"database_connection_closed": "Database Connection Closed",
"database_updated_successfully": "Database Updated Successfully",
"connected_to_database": "Connected to Database",
"updating_pair": "Updating Key-Value Pair",
"db_not_found": "Database file not found at: {path}",
"db_permission_error": "Cannot access database file. Please check permissions",
"db_connection_error": "Failed to connect to database: {error}",
"feature_title": "FEATURES",
"feature_1": "Complete removal of Cursor AI settings and configurations",
"feature_2": "Clears all cached data including AI history and prompts",
"feature_3": "Resets machine ID to bypass trial detection",
"feature_4": "Creates new randomized machine identifiers",
"feature_5": "Removes custom extensions and preferences",
"feature_6": "Resets trial information and activation data",
"feature_7": "Deep scan for hidden license and trial-related files",
"feature_8": "Safely preserves non-Cursor files and applications",
"feature_9": "Compatible with Windows, macOS, and Linux",
"disclaimer_title": "DISCLAIMER",
"disclaimer_1": "This tool will permanently delete all Cursor AI settings,",
"disclaimer_2": "configurations, and cached data. This action cannot be undone.",
"disclaimer_3": "Your code files will NOT be affected, and the tool is designed",
"disclaimer_4": "to only target Cursor AI editor files and trial detection mechanisms.",
"disclaimer_5": "Other applications on your system will not be affected.",
"disclaimer_6": "You will need to set up Cursor AI again after running this tool.",
"disclaimer_7": "Use at your own risk",
"confirm_title": "Are you sure you want to proceed?",
"confirm_1": "This action will delete all Cursor AI settings,",
"confirm_2": "configurations, and cached data. This action cannot be undone.",
"confirm_3": "Your code files will NOT be affected, and the tool is designed",
"confirm_4": "to only target Cursor AI editor files and trial detection mechanisms.",
"confirm_5": "Other applications on your system will not be affected.",
"confirm_6": "You will need to set up Cursor AI again after running this tool.",
"confirm_7": "Use at your own risk",
"invalid_choice": "Please enter 'Y' or 'n'",
"skipped_for_safety": "Skipped for safety (not Cursor-related): {path}",
"deleted": "Deleted: {path}",
"error_deleting": "Error deleting {path}: {error}",
"not_found": "File not found: {path}",
"resetting_machine_id": "Resetting machine identifiers to bypass trial detection...",
"created_machine_id": "Created new machine ID: {path}",
"error_creating_machine_id": "Error creating machine ID file {path}: {error}",
"error_searching": "Error searching for files in {path}: {error}",
"created_extended_trial_info": "Created new extended trial info: {path}",
"error_creating_trial_info": "Error creating trial info file {path}: {error}",
"resetting_cursor_ai_editor": "Resetting Cursor AI Editor... Please wait.",
"reset_cancelled": "Reset cancelled. Exiting without making any changes.",
"windows_machine_id_modification_skipped": "Windows machine ID modification skipped: {error}",
"linux_machine_id_modification_skipped": "Linux machine-id modification skipped: {error}",
"note_complete_machine_id_reset_may_require_running_as_administrator": "Note: Complete machine ID reset may require running as administrator",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "Note: Complete system machine-id reset may require sudo privileges",
"windows_registry_instructions": "📝 NOTE: For complete reset on Windows, you might also need to clean registry entries.",
"windows_registry_instructions_2": " Run 'regedit' and search for keys containing 'Cursor' or 'CursorAI' under HKEY_CURRENT_USER\\Software\\ and delete them.\n",
"reset_log_1": "Cursor AI has been fully reset and trial detection bypassed!",
"reset_log_2": "Please restart your system for changes to take effect.",
"reset_log_3": "You will need to reinstall Cursor AI and should now have a fresh trial period.",
"reset_log_4": "For best results, consider also:",
"reset_log_5": "Use a different email address when registering for a new trial",
"reset_log_6": "If available, use a VPN to change your IP address",
"reset_log_7": "Clear your browser cookies and cache before visiting Cursor AI's website",
"reset_log_8": "If issues persist, try installing Cursor AI in a different location",
"reset_log_9": "If you encounter any issues, go to Github Issue Tracker and create an issue at https://github.com/yeongpin/cursor-free-vip/issues",
"unexpected_error": "An unexpected error occurred: {error}",
"report_issue": "Please report this issue to Github Issue Tracker at https://github.com/yeongpin/cursor-free-vip/issues",
"keyboard_interrupt": "Process interrupted by user. Exiting...",
"return_to_main_menu": "Returning to main menu...",
"process_interrupted": "Process interrupted. Exiting...",
"press_enter_to_return_to_main_menu": "Press Enter to return to main menu...",
"removing_known": "Removing known trial/license files",
"performing_deep_scan": "Performing deep scan for additional trial/license files",
"found_additional_potential_license_trial_files": "Found {count} additional potential license/trial files",
"checking_for_electron_localstorage_files": "Checking for Electron localStorage files",
"no_additional_license_trial_files_found_in_deep_scan": "No additional license/trial files found in deep scan",
"removing_electron_localstorage_files": "Removing Electron localStorage files",
"electron_localstorage_files_removed": "Electron localStorage files removed",
"electron_localstorage_files_removal_error": "Error removing Electron localStorage files: {error}",
"removing_electron_localstorage_files_completed": "Electron localStorage files removal completed",
"warning_title": "WARNING",
"warning_1": "This action will delete all Cursor AI settings,",
"warning_2": "configurations, and cached data. This action cannot be undone.",
"warning_3": "Your code files will NOT be affected, and the tool is designed",
"warning_4": "to only target Cursor AI editor files and trial detection mechanisms.",
"warning_5": "Other applications on your system will not be affected.",
"warning_6": "You will need to set up Cursor AI again after running this tool.",
"warning_7": "Use at your own risk",
"removed": "Removed: {path}",
"failed_to_reset_machine_guid": "Failed to reset machine GUID",
"failed_to_remove": "Failed to remove: {path}",
"failed_to_delete_file": "Failed to delete file: {path}",
"failed_to_delete_directory": "Failed to delete directory: {path}",
"failed_to_delete_file_or_directory": "Failed to delete file or directory: {path}",
"deep_scanning": "Performing deep scan for additional trial/license files",
"resetting_cursor": "Resetting Cursor AI Editor... Please wait.",
"completed_in": "Completed in {time} seconds",
"cursor_reset_completed": "Cursor AI Editor has been fully reset and trial detection bypassed!",
"cursor_reset_failed": "Cursor AI Editor reset failed: {error}",
"cursor_reset_cancelled": "Cursor AI Editor reset cancelled. Exiting without making any changes.",
"operation_cancelled": "Operation cancelled. Exiting without making any changes.",
"navigating_to_settings": "Navigating to settings page...",
"already_on_settings": "Already on settings page",
"login_redirect_failed": "Login redirection failed, trying direct navigation...",
"advanced_tab_not_found": "Advanced tab not found after multiple attempts",
"advanced_tab_retry": "Advanced tab not found, attempt {attempt}/{max_attempts}",
"advanced_tab_error": "Error finding Advanced tab: {error}",
"advanced_tab_clicked": "Clicked on Advanced tab",
"direct_advanced_navigation": "Trying direct navigation to advanced tab",
"delete_button_not_found": "Delete Account button not found after multiple attempts",
"delete_button_retry": "Delete button not found, attempt {attempt}/{max_attempts}",
"delete_button_error": "Error finding Delete button: {error}",
"delete_button_clicked": "Clicked on Delete Account button",
"found_danger_zone": "Found Danger Zone section",
"delete_input_not_found": "Delete confirmation input not found after multiple attempts",
"delete_input_retry": "Delete input not found, attempt {attempt}/{max_attempts}",
"delete_input_error": "Error finding Delete input: {error}",
"delete_input_not_found_continuing": "Delete confirmation input not found, trying to continue anyway"
},
"github_register": {
"title": "GitHub + Cursor AI Registration Automation",
"features_header": "Features",
"feature1": "Generates a temporary email using 1secmail.",
"feature2": "Registers a new GitHub account with random credentials.",
"feature3": "Verifies the GitHub email automatically.",
"feature4": "Logs into Cursor AI using GitHub authentication.",
"feature5": "Resets the machine ID to bypass trial detection.",
"feature6": "Saves all credentials to a file.",
"warnings_header": "Warnings",
"warning1": "This script automates account creation, which may violate GitHub/Cursor terms of service.",
"warning2": "Requires internet access and administrative privileges.",
"warning3": "CAPTCHA or additional verification may interrupt automation.",
"warning4": "Use responsibly and at your own risk.",
"confirm": "Are you sure you want to proceed?",
"invalid_choice": "Invalid choice. Please enter 'yes' or 'no'",
"cancelled": "Operation cancelled",
"program_terminated": "Program terminated by user",
"starting_automation": "Starting automation...",
"github_username": "GitHub Username",
"github_password": "GitHub Password",
"email_address": "Email Address",
"credentials_saved": "These credentials have been saved to github_cursor_accounts.txt",
"completed_successfully": "GitHub + Cursor registration completed successfully!",
"registration_encountered_issues": "GitHub + Cursor registration encountered issues.",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Check browser windows for manual intervention or try again later."
},
"account_info": {
"subscription": "Subscription",
"trial_remaining": "Remaining Pro Trial",
"days": "days",
"subscription_not_found": "Subscription information not found",
"email_not_found": "Email not found",
"failed_to_get_account": "Failed to get account information",
"config_not_found": "Configuration not found.",
"failed_to_get_usage": "Failed to get usage information",
"failed_to_get_subscription": "Failed to get subscription information",
"failed_to_get_email": "Failed to get email address",
"failed_to_get_token": "Failed to get token",
"failed_to_get_account_info": "Failed to get account information",
"title": "Account Information",
"email": "Email",
"token": "Token",
"usage": "Usage",
"subscription_type": "Subscription Type",
"remaining_trial": "Remaining Trial",
"days_remaining": "Days Remaining",
"premium": "Premium",
"pro": "Pro",
"pro_trial": "Pro Trial",
"team": "Team",
"enterprise": "Enterprise",
"free": "Free",
"active": "Active",
"inactive": "Inactive",
"premium_usage": "Premium Usage",
"basic_usage": "Basic Usage",
"usage_not_found": "Usage not found",
"lifetime_access_enabled": "Lifetime Access Enabled",
"token_not_found": "Token not found"
},
"config": {
"config_not_available": "Configuration not available",
"configuration": "Configuration",
"enabled": "Enabled",
"disabled": "Disabled",
"config_directory": "Config Directory",
"neither_cursor_nor_cursor_directory_found": "Neither Cursor nor Cursor directory found in {config_base}",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Please make sure Cursor is installed and has been run at least once",
"storage_directory_not_found": "Storage directory not found: {storage_dir}",
"storage_file_found": "Storage file found: {storage_path}",
"file_size": "File size: {size} bytes",
"file_permissions": "File permissions: {permissions}",
"file_owner": "File owner: {owner}",
"file_group": "File group: {group}",
"error_getting_file_stats": "Error getting file stats: {error}",
"permission_denied": "Permission denied: {storage_path}",
"try_running": "Try running: {command}",
"and": "And",
"storage_file_is_empty": "Storage file is empty: {storage_path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "The file might be corrupted, please reinstall Cursor",
"storage_file_not_found": "Storage file not found: {storage_path}",
"error_checking_linux_paths": "Error checking Linux paths: {error}",
"config_option_added": "Config option added: {option}",
"config_updated": "Config updated",
"config_created": "Config created: {config_file}",
"config_setup_error": "Error setting up config: {error}",
"storage_file_is_valid_and_contains_data": "Storage file is valid and contains data",
"error_reading_storage_file": "Error reading storage file: {error}",
"also_checked": "Also checked {path}",
"backup_created": "Backup created: {path}",
"config_removed": "Config file removed for forced update",
"backup_failed": "Failed to backup config: {error}",
"force_update_failed": "Force update config failed: {error}",
"config_force_update_disabled": "Config file force update disabled , skipping forced update",
"config_force_update_enabled": "Config file force update enabled , performing forced update",
"documents_path_not_found": "Documents path not found, using current directory",
"config_dir_created": "Config directory created: {path}",
"using_temp_dir": "Using temporary directory due to error: {path} (Error: {error})"
},
"oauth": {
"authentication_button_not_found": "Authentication button not found",
"authentication_failed": "Authentication failed: {error}",
"found_cookies": "Found {count} cookies",
"token_extraction_error": "Token extraction error: {error}",
"authentication_successful": "Authentication successful - Email: {email}",
"missing_authentication_data": "Missing authentication data: {data}",
"failed_to_delete_account": "Failed to delete account: {error}",
"invalid_authentication_type": "Invalid authentication type",
"auth_update_success": "Auth update success",
"browser_closed": "Browser closed",
"auth_update_failed": "Auth update failed",
"google_start": "Google start",
"github_start": "Github start",
"usage_count": "Usage count: {usage}",
"account_has_reached_maximum_usage": "Account has reached maximum usage, {deleting}",
"starting_new_authentication_process": "Starting new authentication process...",
"failed_to_delete_expired_account": "Failed to delete expired account",
"could_not_check_usage_count": "Could not check usage count: {error}",
"found_email": "Found email: {email}",
"could_not_find_email": "Could not find email: {error}",
"could_not_find_usage_count": "Could not find usage count: {error}",
"already_on_settings_page": "Already on settings page!",
"failed_to_extract_auth_info": "Failed to extract auth info: {error}",
"no_chrome_profiles_found": "No Chrome profiles found, using Default",
"found_default_chrome_profile": "Found Default Chrome profile",
"using_first_available_chrome_profile": "Using first available Chrome profile: {profile}",
"error_finding_chrome_profile": "Error finding Chrome profile, using Default: {error}",
"initializing_browser_setup": "Initializing browser setup...",
"detected_platform": "Detected platform: {platform}",
"running_as_root_warning": "Running as root is not recommended for browser automation",
"consider_running_without_sudo": "Consider running the script without sudo",
"no_compatible_browser_found": "No compatible browser found. Please install Google Chrome or Chromium.",
"supported_browsers": "Supported browsers for {platform}",
"using_browser_profile": "Using browser profile: {profile}",
"starting_browser": "Starting browser at: {path}",
"browser_setup_completed": "Browser setup completed successfully",
"browser_setup_failed": "Browser setup failed: {error}",
"try_running_without_sudo_admin": "Try running without sudo/administrator privileges",
"redirecting_to_authenticator_cursor_sh": "Redirecting to authenticator.cursor.sh...",
"starting_google_authentication": "Starting Google authentication...",
"starting_github_authentication": "Starting GitHub authentication...",
"waiting_for_authentication": "Waiting for authentication...",
"page_changed_checking_auth": "Page changed, checking auth...",
"status_check_error": "Status check error: {error}",
"authentication_timeout": "Authentication timeout",
"account_is_still_valid": "Account is still valid (Usage: {usage})",
"starting_re_authentication_process": "Starting re-authentication process...",
"starting_new_google_authentication": "Starting new Google authentication...",
"failed_to_delete_account_or_re_authenticate": "Failed to delete account or re-authenticate: {error}",
"navigating_to_authentication_page": "Navigating to authentication page...",
"please_select_your_google_account_to_continue": "Please select your Google account to continue...",
"found_browser_data_directory": "Found browser data directory: {path}",
"authentication_successful_getting_account_info": "Authentication successful, getting account info...",
"warning_could_not_kill_existing_browser_processes": "Warning: Could not kill existing browser processes: {error}",
"browser_failed_to_start": "Browser failed to start: {error}",
"browser_failed": "Browser failed to start: {error}",
"browser_failed_to_start_fallback": "Browser failed to start: {error}",
"user_data_dir_not_found": "{browser} user data directory not found at {path}, will try Chrome instead",
"error_getting_user_data_directory": "Error getting user data directory: {error}",
"warning_browser_close": "Warning: This will close all running {browser} processes",
"killing_browser_processes": "Killing {browser} processes...",
"profile_selection_error": "Error during profile selection: {error}",
"using_configured_browser_path": "Using configured {browser} path: {path}",
"browser_not_found_trying_chrome": "Could not find {browser}, trying Chrome instead",
"found_chrome_at": "Found Chrome at: {path}",
"found_browser_user_data_dir": "Found {browser} user data directory: {path}"
},
"browser_profile": {
"title": "Browser Profile Selection",
"select_profile": "Select {browser} profile to use:",
"profile_list": "Available {browser} profiles:",
"default_profile": "Default profile",
"profile": "Profile {number}",
"no_profiles": "No {browser} profiles found",
"error_loading": "Error loading {browser} profiles: {error}",
"profile_selected": "Selected profile: {profile}",
"invalid_selection": "Invalid selection. Please try again."
},
"account_delete": {
"title": "Cursor Google Account Deletion Tool",
"warning": "WARNING: This will permanently delete your Cursor account. This action cannot be undone.",
"cancelled": "Account deletion cancelled.",
"starting_process": "Starting account deletion process...",
"google_button_not_found": "Google login button not found",
"logging_in": "Logging in with Google...",
"waiting_for_auth": "Waiting for Google authentication...",
"login_successful": "Login successful",
"unexpected_page": "Unexpected page after login: {url}",
"trying_settings": "Trying to navigate to settings page...",
"select_google_account": "Please select your Google account...",
"auth_timeout": "Authentication timeout, continuing anyway...",
"navigating_to_settings": "Navigating to settings page...",
"already_on_settings": "Already on settings page",
"login_redirect_failed": "Login redirection failed, trying direct navigation...",
"advanced_tab_not_found": "Advanced tab not found after multiple attempts",
"advanced_tab_retry": "Advanced tab not found, attempt {attempt}/{max_attempts}",
"advanced_tab_error": "Error finding Advanced tab: {error}",
"advanced_tab_clicked": "Clicked on Advanced tab",
"direct_advanced_navigation": "Trying direct navigation to advanced tab",
"delete_button_not_found": "Delete Account button not found after multiple attempts",
"delete_button_retry": "Delete button not found, attempt {attempt}/{max_attempts}",
"delete_button_error": "Error finding Delete button: {error}",
"delete_button_clicked": "Clicked on Delete Account button",
"found_danger_zone": "Found Danger Zone section",
"delete_input_not_found": "Delete confirmation input not found after multiple attempts",
"delete_input_retry": "Delete input not found, attempt {attempt}/{max_attempts}",
"delete_input_error": "Error finding Delete input: {error}",
"delete_input_not_found_continuing": "Delete confirmation input not found, trying to continue anyway",
"typed_delete": "Typed \"Delete\" in confirmation box",
"confirm_button_not_found": "Confirm button not found after multiple attempts",
"confirm_button_retry": "Confirm button not found, attempt {attempt}/{max_attempts}",
"confirm_button_error": "Error finding Confirm button: {error}",
"account_deleted": "Account deleted successfully!",
"error": "Error during account deletion: {error}",
"success": "Your Cursor account has been successfully deleted!",
"failed": "Account deletion process failed or was cancelled.",
"interrupted": "Account deletion process interrupted by user.",
"unexpected_error": "Unexpected error: {error}",
"found_email": "Found email: {email}",
"email_not_found": "Email not found: {error}",
"confirm_prompt": "Are you sure you want to proceed? (y/N): "
},
"bypass": {
"starting": "Starting Cursor version bypass...",
"found_product_json": "Found product.json: {path}",
"no_write_permission": "No write permission for file: {path}",
"read_failed": "Failed to read product.json: {error}",
"current_version": "Current version: {version}",
"backup_created": "Backup created: {path}",
"version_updated": "Version updated from {old} to {new}",
"write_failed": "Failed to write product.json: {error}",
"no_update_needed": "No update needed. Current version {version} is already >= 0.46.0",
"bypass_failed": "Version bypass failed: {error}",
"stack_trace": "Stack trace",
"localappdata_not_found": "LOCALAPPDATA environment variable not found",
"product_json_not_found": "product.json not found in common Linux paths",
"unsupported_os": "Unsupported operating system: {system}",
"file_not_found": "File not found: {path}",
"title": "Cursor Version Bypass Tool",
"description": "This tool modifies Cursor's product.json to bypass version restrictions",
"menu_option": "Bypass Cursor Version Check"
},
"auth_check": {
"checking_authorization": "Checking authorization...",
"token_source": "Get token from database or input manually? (d/m, default: d)",
"getting_token_from_db": "Getting token from database...",
"token_found_in_db": "Token found in database",
"token_not_found_in_db": "Token not found in database",
"cursor_acc_info_not_found": "cursor_acc_info.py not found",
"error_getting_token_from_db": "Error getting token from database: {error}",
"enter_token": "Enter your Cursor token: ",
"token_length": "Token length: {length} characters",
"usage_response_status": "Usage response status: {response}",
"unexpected_status_code": "Unexpected status code: {code}",
"jwt_token_warning": "Token appears to be in JWT format, but API check returned an unexpected status code. The token might be valid but API access is restricted.",
"invalid_token": "Invalid token",
"user_authorized": "User is authorized",
"user_unauthorized": "User is unauthorized",
"request_timeout": "Request timed out",
"connection_error": "Connection error",
"check_error": "Error checking authorization: {error}",
"authorization_successful": "Authorization successful!",
"authorization_failed": "Authorization failed!",
"operation_cancelled": "Operation cancelled by user",
"unexpected_error": "Unexpected error: {error}",
"error_generating_checksum": "Error generating checksum: {error}",
"checking_usage_information": "Checking usage information...",
"check_usage_response": "Check usage response: {response}",
"usage_response": "Usage response: {response}"
},
"bypass_token_limit": {
"title": "Bypass Token Limit Tool",
"description": "This tool modifies the workbench.desktop.main.js file to bypass the token limit",
"press_enter": "Press Enter to continue..."
},
"token": {
"refreshing": "Refreshing token...",
"refresh_success": "Token refreshed successfully! Valid for {days} days (expires: {expire})",
"no_access_token": "No access token in response",
"refresh_failed": "Token refresh failed: {error}",
"invalid_response": "Invalid JSON response from refresh server",
"server_error": "Refresh server error: HTTP {status}",
"request_timeout": "Request to refresh server timed out",
"connection_error": "Connection error to refresh server",
"unexpected_error": "Unexpected error during token refresh: {error}",
"extraction_error": "Error extracting token: {error}"
},
"restore": {
"title": "Restore Machine ID from Backup",
"starting": "Starting Machine ID Restore Process",
"no_backups_found": "No backup files found",
"available_backups": "Available backup files",
"select_backup": "Select backup to restore",
"to_cancel": "to cancel",
"operation_cancelled": "Operation cancelled",
"invalid_selection": "Invalid selection",
"please_enter_number": "Please enter a valid number",
"missing_id": "Missing ID: {id}",
"read_backup_failed": "Failed to read backup file: {error}",
"current_file_not_found": "Current storage file not found",
"current_backup_created": "Created backup of current storage file",
"storage_updated": "Storage file updated successfully",
"update_failed": "Failed to update storage file: {error}",
"sqlite_not_found": "SQLite database not found",
"updating_sqlite": "Updating SQLite database",
"updating_pair": "Updating key-value pair",
"sqlite_updated": "SQLite database updated successfully",
"sqlite_update_failed": "Failed to update SQLite database: {error}",
"machine_id_backup_created": "Created backup of machineId file",
"backup_creation_failed": "Failed to create backup: {error}",
"machine_id_updated": "machineId file updated successfully",
"machine_id_update_failed": "Failed to update machineId file: {error}",
"updating_system_ids": "Updating system IDs",
"system_ids_update_failed": "Failed to update system IDs: {error}",
"permission_denied": "Permission denied. Please try running as administrator",
"windows_machine_guid_updated": "Windows Machine GUID updated successfully",
"update_windows_machine_guid_failed": "Failed to update Windows Machine GUID: {error}",
"windows_machine_id_updated": "Windows Machine ID updated successfully",
"update_windows_machine_id_failed": "Failed to update Windows Machine ID: {error}",
"sqm_client_key_not_found": "SQMClient registry key not found",
"update_windows_system_ids_failed": "Failed to update Windows system IDs: {error}",
"macos_platform_uuid_updated": "macOS Platform UUID updated successfully",
"failed_to_execute_plutil_command": "Failed to execute plutil command",
"update_macos_system_ids_failed": "Failed to update macOS system IDs: {error}",
"ids_to_restore": "Machine IDs to restore",
"confirm": "Are you sure you want to restore these IDs?",
"success": "Machine ID restored successfully",
"process_error": "Restore process error: {error}",
"press_enter": "Press Enter to continue"
},
"manual_auth": {
"title": "Manual Cursor Authentication",
"token_prompt": "Enter your Cursor token (access_token/refresh_token):",
"token_required": "Token is required",
"verifying_token": "Verifying token validity...",
"token_verified": "Token verified successfully!",
"invalid_token": "Invalid token. Authentication aborted.",
"token_verification_skipped": "Token verification skipped (check_user_authorized.py not found)",
"token_verification_error": "Error verifying token: {error}",
"continue_anyway": "Continue anyway? (y/N): ",
"email_prompt": "Enter email (leave blank for random email):",
"random_email_generated": "Random email generated: {email}",
"auth_type_prompt": "Select authentication type:",
"auth_type_auth0": "Auth_0 (Default)",
"auth_type_google": "Google",
"auth_type_github": "GitHub",
"auth_type_selected": "Selected authentication type: {type}",
"confirm_prompt": "Please confirm the following information:",
"proceed_prompt": "Proceed? (y/N): ",
"operation_cancelled": "Operation cancelled",
"updating_database": "Updating Cursor authentication database...",
"auth_updated_successfully": "Authentication information updated successfully!",
"auth_update_failed": "Failed to update authentication information",
"error": "Error: {error}"
},
"tempmail": {
"check_email_failed": "Check email failed: {error}",
"extract_code_failed": "Extract verification code failed: {error}",
"configured_email": "Configured email: {email}",
"checking_email": "Checking for Cursor verification email...",
"email_found": "Found Cursor verification email",
"verification_code": "Verification code: {code}",
"no_code": "Could not get verification code",
"no_email": "No Cursor verification email found",
"config_error": "Config file error: {error}",
"general_error": "An error occurred: {error}"
}
}

878
locales/es.json Normal file
View File

@ -0,0 +1,878 @@
{
"menu": {
"title": "Opciones Disponibles",
"exit": "Salir del Programa",
"reset": "Restablecer ID de Máquina",
"register": "Registrar Nueva Cuenta de Cursor",
"register_google": "Registrarse con Cuenta de Google",
"register_github": "Registrarse con Cuenta de GitHub",
"register_manual": "Registrar Cursor con Correo Personalizado",
"quit": "Cerrar Aplicación Cursor",
"select_language": "Cambiar Idioma",
"input_choice": "Por favor, ingrese su elección ({choices})",
"invalid_choice": "Selección inválida. Por favor ingrese un número de {choices}",
"program_terminated": "El programa fue terminado por el usuario",
"error_occurred": "Ocurrió un error: {error}. Por favor intente de nuevo",
"press_enter": "Presione Enter para Salir",
"disable_auto_update": "Deshabilitar Actualización Automática de Cursor",
"lifetime_access_enabled": "ACCESO DE POR VIDA ACTIVADO",
"totally_reset": "Restablecer Cursor Completamente",
"outdate": "Desactualizado",
"temp_github_register": "Registro Temporal de GitHub",
"admin_required": "Ejecutando como ejecutable, se requieren privilegios de administrador.",
"admin_required_continue": "Continuando sin privilegios de administrador.",
"coming_soon": "Próximamente",
"fixed_soon": "Arreglado Pronto",
"contribute": "Contribuir al Proyecto",
"config": "Mostrar Configuración",
"delete_google_account": "Eliminar Cuenta Google de Cursor",
"continue_prompt": "¿Continuar? (y/N): ",
"operation_cancelled_by_user": "Operación cancelada por el usuario",
"exiting": "Saliendo ……",
"bypass_version_check": "Omitir Verificación de Versión de Cursor",
"check_user_authorized": "Verificar Usuario Autorizado",
"bypass_token_limit": "Omitir límite de tokens",
"restore_machine_id": "Restaurar ID de máquina desde copia de seguridad",
"select_chrome_profile": "Seleccionar perfil de Chrome",
"language_config_saved": "Configuración del idioma guardada correctamente",
"lang_invalid_choice": "Elección no válida. Ingrese una de las siguientes opciones: ({Lang_Choices})",
"manual_custom_auth": "Autorización personalizada manual"
},
"languages": {
"ar": "Árabe",
"en": "Inglés",
"zh_cn": "简体中文",
"zh_tw": "繁體中文",
"vi": "Vietnamita",
"nl": "Holandés",
"de": "Alemán",
"fr": "Francés",
"pt": "Portugués",
"ru": "Ruso",
"tr": "Turco",
"bg": "Búlgaro",
"es": "Español",
"it": "italiano",
"ja": "japonés"
},
"quit_cursor": {
"start": "Comenzando a Cerrar Cursor",
"no_process": "No Hay Procesos de Cursor en Ejecución",
"terminating": "Terminando Proceso {pid}",
"waiting": "Esperando que el Proceso Termine",
"success": "Todos los Procesos de Cursor Cerrados",
"timeout": "Tiempo de Espera Agotado: {pids}",
"error": "Ocurrió un Error: {error}"
},
"reset": {
"title": "Herramienta de Restablecimiento de ID de Máquina de Cursor",
"checking": "Verificando Archivo de Configuración",
"not_found": "Archivo de Configuración No Encontrado",
"no_permission": "No se Puede Leer o Escribir el Archivo de Configuración, Verifique los Permisos",
"reading": "Leyendo Configuración Actual",
"creating_backup": "Creando Copia de Seguridad de la Configuración",
"backup_exists": "El Archivo de Respaldo ya Existe, Omitiendo Paso de Respaldo",
"generating": "Generando Nuevo ID de Máquina",
"saving_json": "Guardando Nueva Configuración en JSON",
"success": "ID de Máquina Restablecido Exitosamente",
"new_id": "Nuevo ID de Máquina",
"permission_error": "Error de Permisos: {error}",
"run_as_admin": "Por Favor Intente Ejecutar Este Programa como Administrador",
"process_error": "Error en el Proceso de Restablecimiento: {error}",
"updating_sqlite": "Actualizando Base de Datos SQLite",
"updating_pair": "Actualizando Par Clave-Valor",
"sqlite_success": "Base de Datos SQLite Actualizada Exitosamente",
"sqlite_error": "Falló la Actualización de la Base de Datos SQLite: {error}",
"press_enter": "Presione Enter para Salir",
"unsupported_os": "Sistema Operativo No Soportado: {os}",
"linux_path_not_found": "Ruta de Linux No Encontrada",
"updating_system_ids": "Actualizando IDs del Sistema",
"system_ids_updated": "IDs del Sistema Actualizados Exitosamente",
"system_ids_update_failed": "Falló la Actualización de IDs del Sistema: {error}",
"windows_guid_updated": "GUID de Windows Actualizado Exitosamente",
"windows_permission_denied": "Permisos de Windows Denegados",
"windows_guid_update_failed": "Falló la Actualización del GUID de Windows",
"macos_uuid_updated": "UUID de macOS Actualizado Exitosamente",
"plutil_command_failed": "Falló el Comando plutil",
"start_patching": "Iniciando Parcheo de getMachineId",
"macos_uuid_update_failed": "Falló la Actualización del UUID de macOS",
"current_version": "Versión Actual de Cursor: {version}",
"patch_completed": "Parcheo de getMachineId Completado",
"patch_failed": "Falló el Parcheo de getMachineId: {error}",
"version_check_passed": "Verificación de Versión de Cursor Exitosa",
"file_modified": "Archivo Modificado",
"version_less_than_0_45": "Versión de Cursor < 0.45.0, Omitiendo Parcheo de getMachineId",
"detecting_version": "Detectando Versión de Cursor",
"patching_getmachineid": "Parcheando getMachineId",
"version_greater_than_0_45": "Versión de Cursor >= 0.45.0, Parcheando getMachineId",
"permission_denied": "Permiso Denegado: {error}",
"backup_created": "Copia de Seguridad Creada",
"update_success": "Actualización Exitosa",
"update_failed": "Falló la Actualización: {error}",
"windows_machine_guid_updated": "GUID de Máquina Windows Actualizado Exitosamente",
"reading_package_json": "Leyendo package.json {path}",
"invalid_json_object": "Objeto JSON Inválido",
"no_version_field": "No se Encontró el Campo de Versión en package.json",
"version_field_empty": "El Campo de Versión está Vacío",
"invalid_version_format": "Formato de Versión Inválido: {version}",
"found_version": "Versión Encontrada: {version}",
"version_parse_error": "Error al Analizar Versión: {error}",
"package_not_found": "Package.json No Encontrado: {path}",
"check_version_failed": "Falló la Verificación de Versión: {error}",
"stack_trace": "Traza de la Pila",
"version_too_low": "Versión de Cursor Muy Baja: {version} < 0.45.0",
"no_write_permission": "Sin Permiso de Escritura: {path}",
"path_not_found": "Ruta No Encontrada: {path}",
"modify_file_failed": "Falló la Modificación del Archivo: {error}",
"windows_machine_id_updated": "ID de Máquina Windows Actualizado Exitosamente",
"update_windows_machine_id_failed": "Falló la Actualización del ID de Máquina Windows: {error}",
"update_windows_machine_guid_failed": "Falló la Actualización del GUID de Máquina Windows: {error}",
"file_not_found": "Archivo No Encontrado: {path}"
},
"register": {
"title": "Herramienta de Registro de Cursor",
"start": "Iniciando proceso de registro...",
"handling_turnstile": "Procesando verificación de seguridad...",
"retry_verification": "Reintentando verificación...",
"detect_turnstile": "Comprobando verificación de seguridad...",
"verification_success": "Verificación de seguridad exitosa",
"starting_browser": "Abriendo navegador...",
"form_success": "Formulario enviado exitosamente",
"browser_started": "Navegador abierto exitosamente",
"waiting_for_second_verification": "Esperando verificación por correo electrónico...",
"waiting_for_verification_code": "Esperando código de verificación...",
"password_success": "Contraseña establecida exitosamente",
"password_error": "No se pudo establecer la contraseña: {error}. Por favor intente de nuevo",
"waiting_for_page_load": "Cargando página...",
"first_verification_passed": "Verificación inicial exitosa",
"mailbox": "Acceso exitoso a la bandeja de entrada",
"register_start": "Iniciar Registro",
"form_submitted": "Formulario Enviado, Iniciando Verificación...",
"filling_form": "Rellenando Formulario",
"visiting_url": "Visitando URL",
"basic_info": "Información Básica Enviada",
"handle_turnstile": "Manejar Turnstile",
"no_turnstile": "No se Detectó Turnstile",
"turnstile_passed": "Turnstile Superado",
"verification_start": "Comenzar a Obtener Código de Verificación",
"verification_timeout": "Tiempo de Espera Agotado para Código de Verificación",
"verification_not_found": "No se Encontró Código de Verificación",
"try_get_code": "Intento | {attempt} Obtener Código de Verificación | Tiempo Restante: {time}s",
"get_account": "Obteniendo Información de la Cuenta",
"get_token": "Obtener Token de Sesión de Cursor",
"token_success": "Token Obtenido Exitosamente",
"token_attempt": "Intento | {attempt} veces para obtener Token | Se reintentará en {time}s",
"token_max_attempts": "Alcanzado Máximo de Intentos ({max}) | No se pudo obtener Token",
"token_failed": "Falló al Obtener Token: {error}",
"account_error": "Falló al Obtener Información de la Cuenta: {error}",
"press_enter": "Presione Enter para Salir",
"browser_start": "Iniciando Navegador",
"open_mailbox": "Abriendo Página de Correo",
"email_error": "Falló al Obtener Dirección de Correo",
"setup_error": "Error de Configuración de Correo: {error}",
"start_getting_verification_code": "Comenzando a Obtener Código de Verificación, Se Intentará en 60s",
"get_verification_code_timeout": "Tiempo de Espera Agotado para Código de Verificación",
"get_verification_code_success": "Código de Verificación Obtenido Exitosamente",
"try_get_verification_code": "Intento | {attempt} Obtener Código de Verificación | Tiempo Restante: {remaining_time}s",
"verification_code_filled": "Código de Verificación Completado",
"login_success_and_jump_to_settings_page": "Inicio de Sesión Exitoso y Salto a Página de Configuración",
"detect_login_page": "Página de Inicio de Sesión Detectada, Iniciando Sesión...",
"cursor_registration_completed": "¡Registro de Cursor Completado!",
"set_password": "Establecer Contraseña",
"basic_info_submitted": "Información Básica Enviada",
"cursor_auth_info_updated": "Información de Autenticación de Cursor Actualizada",
"cursor_auth_info_update_failed": "Falló la Actualización de Información de Autenticación de Cursor",
"reset_machine_id": "Restablecer ID de Máquina",
"account_info_saved": "Información de Cuenta Guardada",
"save_account_info_failed": "Falló al Guardar Información de Cuenta",
"get_email_address": "Obtener Dirección de Correo",
"update_cursor_auth_info": "Actualizar Información de Autenticación de Cursor",
"register_process_error": "Error en el Proceso de Registro: {error}",
"setting_password": "Estableciendo Contraseña",
"manual_code_input": "Entrada Manual de Código",
"manual_email_input": "Entrada Manual de Correo",
"password": "Contraseña",
"first_name": "Nombre",
"last_name": "Apellido",
"exit_signal": "Señal de Salida",
"email_address": "Dirección de Correo",
"config_created": "Configuración Creada",
"verification_failed": "Verificación Fallida",
"verification_error": "Error de Verificación: {error}",
"config_option_added": "Opción de Configuración Añadida: {option}",
"config_updated": "Configuración Actualizada",
"password_submitted": "Contraseña Enviada",
"total_usage": "Uso Total: {usage}",
"setting_on_password": "Estableciendo Contraseña",
"getting_code": "Obteniendo Código de Verificación, Se Intentará en 60s",
"human_verify_error": "No se puede verificar que el usuario es humano. Reintentando...",
"max_retries_reached": "Se alcanzó el máximo de intentos. Registro fallido.",
"using_browser": "Usando {navegador} navegador: {ruta}",
"could_not_track_processes": "No se pudo rastrear {navegador} procesos: {error}",
"try_install_browser": "Intente instalar el navegador con su administrador de paquetes",
"tempmail_plus_verification_started": "Iniciar proceso de verificación TempMailPlus",
"tempmail_plus_enabled": "TempMailPlus está habilitado",
"browser_path_invalid": "La ruta {navegador} no es válida, utilizando la ruta predeterminada",
"using_tempmail_plus": "Uso de TempMailPlus para la verificación de correo electrónico",
"tracking_processes": "Seguimiento {count} {navegador} procesos",
"tempmail_plus_epin_missing": "TempMailPlus Epin no está configurado",
"tempmail_plus_verification_failed": "Falló la verificación TempMailPlus: {Error}",
"using_browser_profile": "Usando {navegador} perfil desde: {user_data_dir}",
"tempmail_plus_verification_completed": "VERIFICACIÓN TEMPMAILPLUS completada con éxito",
"tempmail_plus_email_missing": "El correo electrónico de TempMailPlus no está configurado",
"tempmail_plus_init_failed": "No se pudo inicializar tempMailPlus: {error}",
"tempmail_plus_config_missing": "Falta la configuración de TempMailPlus",
"tempmail_plus_initialized": "TempMailPlus inicializado con éxito",
"tempmail_plus_disabled": "TempMailPlus está deshabilitado",
"no_new_processes_detected": "No hay nuevos procesos {navegador} detectados para rastrear",
"make_sure_browser_is_properly_installed": "Asegúrese de que {navegador} esté instalado correctamente"
},
"auth": {
"title": "Administrador de Autenticación de Cursor",
"checking_auth": "Verificando Archivo de Autenticación",
"auth_not_found": "Archivo de Autenticación No Encontrado",
"auth_file_error": "Error en Archivo de Autenticación: {error}",
"reading_auth": "Leyendo Archivo de Autenticación",
"updating_auth": "Actualizando Información de Autenticación",
"auth_updated": "Información de Autenticación Actualizada Exitosamente",
"auth_update_failed": "Falló la Actualización de Información de Autenticación: {error}",
"auth_file_created": "Archivo de Autenticación Creado",
"auth_file_create_failed": "Falló la Creación del Archivo de Autenticación: {error}",
"press_enter": "Presione Enter para Salir",
"reset_machine_id": "Restablecer ID de Máquina",
"database_connection_closed": "Conexión a la Base de Datos Cerrada",
"database_updated_successfully": "Base de Datos Actualizada Exitosamente",
"connected_to_database": "Conectado a la Base de Datos",
"updating_pair": "Actualizando Par Clave-Valor",
"db_not_found": "Archivo de base de datos no encontrado en: {path}",
"db_permission_error": "No se puede acceder al archivo de base de datos. Verifique los permisos",
"db_connection_error": "Falló la conexión a la base de datos: {error}"
},
"control": {
"generate_email": "Generando Nuevo Correo",
"blocked_domain": "Dominio Bloqueado",
"select_domain": "Seleccionando Dominio Aleatorio",
"copy_email": "Copiando Dirección de Correo",
"enter_mailbox": "Entrando al Buzón de Correo",
"refresh_mailbox": "Actualizando Buzón de Correo",
"check_verification": "Verificando Código de Verificación",
"verification_found": "Código de Verificación Encontrado",
"verification_not_found": "No se Encontró Código de Verificación",
"browser_error": "Error de Control del Navegador: {error}",
"navigation_error": "Error de Navegación: {error}",
"email_copy_error": "Error al Copiar Correo: {error}",
"mailbox_error": "Error en el Buzón de Correo: {error}",
"token_saved_to_file": "Token Guardado en cursor_tokens.txt",
"navigate_to": "Navegando a {url}",
"generate_email_success": "Generación de Correo Exitosa",
"select_email_domain": "Seleccionar Dominio de Correo",
"select_email_domain_success": "Selección de Dominio de Correo Exitosa",
"get_email_name": "Obtener Nombre de Correo",
"get_email_name_success": "Nombre de Correo Obtenido Exitosamente",
"get_email_address": "Obtener Dirección de Correo",
"get_email_address_success": "Dirección de Correo Obtenida Exitosamente",
"enter_mailbox_success": "Entrada al Buzón de Correo Exitosa",
"found_verification_code": "Código de Verificación Encontrado",
"get_cursor_session_token": "Obtener Token de Sesión de Cursor",
"get_cursor_session_token_success": "Token de Sesión de Cursor Obtenido Exitosamente",
"get_cursor_session_token_failed": "Falló al Obtener Token de Sesión de Cursor",
"save_token_failed": "Falló al Guardar Token",
"database_updated_successfully": "Base de Datos Actualizada Exitosamente",
"database_connection_closed": "Conexión a la Base de Datos Cerrada",
"no_valid_verification_code": "No Hay Código de Verificación Válido"
},
"email": {
"starting_browser": "Iniciando Navegador",
"visiting_site": "Visitando dominios de correo",
"create_success": "Correo Creado Exitosamente",
"create_failed": "Falló al Crear Correo",
"create_error": "Error en la Creación del Correo: {error}",
"refreshing": "Actualizando Correo",
"refresh_success": "Correo Actualizado Exitosamente",
"refresh_error": "Error al Actualizar Correo: {error}",
"refresh_button_not_found": "Botón de Actualización No Encontrado",
"verification_found": "Verificación Encontrada",
"verification_not_found": "Verificación No Encontrada",
"verification_error": "Error de Verificación: {error}",
"verification_code_found": "Código de Verificación Encontrado",
"verification_code_not_found": "Código de Verificación No Encontrado",
"verification_code_error": "Error en el Código de Verificación: {error}",
"address": "Dirección de Correo",
"all_domains_blocked": "Todos los Dominios Bloqueados, Cambiando Servicio",
"no_available_domains_after_filtering": "No Hay Dominios Disponibles Después del Filtrado",
"switching_service": "Cambiando al Servicio {service}",
"domains_list_error": "Falló al Obtener Lista de Dominios: {error}",
"failed_to_get_available_domains": "Falló al Obtener Dominios Disponibles",
"domains_excluded": "Dominios Excluidos: {domains}",
"failed_to_create_account": "Falló al Crear Cuenta",
"account_creation_error": "Error en la Creación de la Cuenta: {error}",
"blocked_domains": "Dominios Bloqueados: {domains}",
"blocked_domains_loaded": "Dominios Bloqueados Cargados: {count}",
"blocked_domains_loaded_error": "Error al Cargar Dominios Bloqueados: {error}",
"blocked_domains_loaded_success": "Dominios Bloqueados Cargados Exitosamente",
"blocked_domains_loaded_timeout": "Tiempo de Espera Agotado para Cargar Dominios Bloqueados: {timeout}s",
"blocked_domains_loaded_timeout_error": "Error de Tiempo de Espera al Cargar Dominios Bloqueados: {error}",
"available_domains_loaded": "Dominios Disponibles Cargados: {count}",
"domains_filtered": "Dominios Filtrados: {count}",
"trying_to_create_email": "Intentando crear correo: {email}",
"domain_blocked": "Dominio Bloqueado: {domain}",
"no_display_found": "No se encontró pantalla. Asegúrese de que X Server se esté ejecutando.",
"try_export_display": "Prueba: Exportar pantalla =: 0",
"try_install_chromium": "Prueba: Sudo Apt Instalar Chromium-Browser",
"extension_load_error": "Error de carga de extensión: {error}",
"make_sure_chrome_chromium_is_properly_installed": "Asegúrese de que el cromo/cromo esté instalado correctamente",
"using_chrome_profile": "Usando el perfil de Chrome de: {user_data_dir}"
},
"update": {
"title": "Deshabilitar Actualización Automática de Cursor",
"disable_success": "Actualización Automática Deshabilitada Exitosamente",
"disable_failed": "Falló al Deshabilitar Actualización Automática: {error}",
"press_enter": "Presione Enter para Salir",
"start_disable": "Comenzar a Deshabilitar Actualización Automática",
"killing_processes": "Terminando Procesos",
"processes_killed": "Procesos Terminados",
"removing_directory": "Eliminando Directorio",
"directory_removed": "Directorio Eliminado",
"creating_block_file": "Creando Archivo de Bloqueo",
"block_file_created": "Archivo de Bloqueo Creado",
"clearing_update_yml": "Limpiar el archivo Update.yml",
"update_yml_cleared": "Archivo de Update.yml claro",
"unsupported_os": "OS no compatible: {Sistema}",
"block_file_already_locked": "El archivo de bloque ya está bloqueado",
"yml_already_locked_error": "Update.yml File ya bloqueado Error: {Error}",
"update_yml_not_found": "Archivo de Update.yml no encontrado",
"yml_locked_error": "Update.yml Error bloqueado del archivo: {Error}",
"remove_directory_failed": "No se pudo eliminar el directorio: {error}",
"yml_already_locked": "El archivo Update.yml ya está bloqueado",
"create_block_file_failed": "No se pudo crear un archivo de bloque: {error}",
"block_file_locked_error": "Bloqueo Error bloqueado del archivo: {error}",
"directory_locked": "El directorio está bloqueado: {ruta}",
"block_file_already_locked_error": "Bloquee el archivo ya bloqueado Error: {Error}",
"clear_update_yml_failed": "No se pudo borrar el archivo Update.yml: {Error}",
"yml_locked": "El archivo de Update.yml está bloqueado",
"block_file_locked": "El archivo de bloque está bloqueado"
},
"updater": {
"checking": "Buscando actualizaciones...",
"new_version_available": "¡Nueva versión disponible! (Actual: {current}, Última: {latest})",
"updating": "Actualizando a la última versión. El programa se reiniciará automáticamente.",
"up_to_date": "Está utilizando la última versión.",
"check_failed": "Falló al verificar actualizaciones: {error}",
"continue_anyway": "Continuando con la versión actual...",
"update_confirm": "¿Desea actualizar a la última versión? (Y/n)",
"update_skipped": "Omitiendo actualización.",
"invalid_choice": "Elección inválida. Por favor ingrese 'Y' o 'n'.",
"development_version": "Versión de Desarrollo {current} > {latest}",
"changelog_title": "Registro de Cambios",
"rate_limit_exceeded": "Límite de velocidad de la API de GitHub excedido. Skinging actualización de actualización."
},
"totally_reset": {
"title": "Restablecer Cursor Completamente",
"checking_config": "Verificando Archivo de Configuración",
"config_not_found": "Archivo de Configuración No Encontrado",
"no_permission": "No se Puede Leer o Escribir el Archivo de Configuración, Verifique los Permisos",
"reading_config": "Leyendo Configuración Actual",
"creating_backup": "Creando Copia de Seguridad de la Configuración",
"backup_exists": "El Archivo de Respaldo ya Existe, Omitiendo Paso de Respaldo",
"generating_new_machine_id": "Generando Nuevo ID de Máquina",
"saving_new_config": "Guardando Nueva Configuración en JSON",
"success": "Cursor Restablecido Exitosamente",
"error": "Falló el Restablecimiento de Cursor: {error}",
"press_enter": "Presione Enter para Salir",
"reset_machine_id": "Restablecer ID de Máquina",
"database_connection_closed": "Conexión a la Base de Datos Cerrada",
"database_updated_successfully": "Base de Datos Actualizada Exitosamente",
"connected_to_database": "Conectado a la Base de Datos",
"updating_pair": "Actualizando Par Clave-Valor",
"db_not_found": "Archivo de base de datos no encontrado en: {path}",
"db_permission_error": "No se puede acceder al archivo de base de datos. Verifique los permisos",
"db_connection_error": "Falló la conexión a la base de datos: {error}",
"feature_title": "CARACTERÍSTICAS",
"feature_1": "Eliminación completa de configuraciones y ajustes de Cursor AI",
"feature_2": "Limpia todos los datos en caché incluyendo historial de IA y peticiones",
"feature_3": "Restablece el ID de máquina para evitar la detección de prueba",
"feature_4": "Crea nuevos identificadores de máquina aleatorios",
"feature_5": "Elimina extensiones personalizadas y preferencias",
"feature_6": "Restablece información de prueba y datos de activación",
"feature_7": "Escaneo profundo de archivos ocultos relacionados con licencias y pruebas",
"feature_8": "Preserva de forma segura archivos y aplicaciones que no son de Cursor",
"feature_9": "Compatible con Windows, macOS y Linux",
"disclaimer_title": "AVISO IMPORTANTE",
"disclaimer_1": "Esta herramienta eliminará permanentemente todas las configuraciones de Cursor AI,",
"disclaimer_2": "ajustes y datos en caché. Esta acción no se puede deshacer.",
"disclaimer_3": "Sus archivos de código NO se verán afectados, y la herramienta está diseñada",
"disclaimer_4": "para dirigirse solo a archivos del editor Cursor AI y mecanismos de detección de prueba.",
"disclaimer_5": "Otras aplicaciones en su sistema no se verán afectadas.",
"disclaimer_6": "Necesitará configurar Cursor AI nuevamente después de ejecutar esta herramienta.",
"disclaimer_7": "Use bajo su propio riesgo",
"confirm_title": "¿Está seguro de que desea continuar?",
"confirm_1": "Esta acción eliminará todas las configuraciones de Cursor AI,",
"confirm_2": "ajustes y datos en caché. Esta acción no se puede deshacer.",
"confirm_3": "Sus archivos de código NO se verán afectados, y la herramienta está diseñada",
"confirm_4": "para dirigirse solo a archivos del editor Cursor AI y mecanismos de detección de prueba.",
"confirm_5": "Otras aplicaciones en su sistema no se verán afectadas.",
"confirm_6": "Necesitará configurar Cursor AI nuevamente después de ejecutar esta herramienta.",
"confirm_7": "Use bajo su propio riesgo",
"invalid_choice": "Por favor ingrese 'Y' o 'n'",
"skipped_for_safety": "Omitido por seguridad (no relacionado con Cursor): {path}",
"deleted": "Eliminado: {path}",
"error_deleting": "Error al eliminar {path}: {error}",
"not_found": "Archivo no encontrado: {path}",
"resetting_machine_id": "Restableciendo identificadores de máquina para evitar la detección de prueba...",
"created_machine_id": "Creado nuevo ID de máquina: {path}",
"error_creating_machine_id": "Error al crear archivo de ID de máquina {path}: {error}",
"error_searching": "Error al buscar archivos en {path}: {error}",
"created_extended_trial_info": "Creada nueva información de prueba extendida: {path}",
"error_creating_trial_info": "Error al crear archivo de información de prueba {path}: {error}",
"resetting_cursor_ai_editor": "Restableciendo Editor Cursor AI... Por favor espere.",
"reset_cancelled": "Restablecimiento cancelado. Saliendo sin realizar cambios.",
"windows_machine_id_modification_skipped": "Modificación de ID de máquina de Windows omitida: {error}",
"linux_machine_id_modification_skipped": "Modificación de machine-id de Linux omitida: {error}",
"note_complete_machine_id_reset_may_require_running_as_administrator": "Nota: El restablecimiento completo del ID de máquina puede requerir ejecutar como administrador",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "Nota: El restablecimiento completo del machine-id del sistema puede requerir privilegios sudo",
"windows_registry_instructions": "📝 NOTA: Para un restablecimiento completo en Windows, es posible que también deba limpiar entradas del registro.",
"windows_registry_instructions_2": " Ejecute 'regedit' y busque claves que contengan 'Cursor' o 'CursorAI' bajo HKEY_CURRENT_USER\\Software\\ y elimínelas.",
"reset_log_1": "¡Cursor AI ha sido completamente restablecido y se ha evitado la detección de prueba!",
"reset_log_2": "Por favor reinicie su sistema para que los cambios surtan efecto.",
"reset_log_3": "Necesitará reinstalar Cursor AI y ahora debería tener un nuevo período de prueba.",
"reset_log_4": "Para mejores resultados, considere también:",
"reset_log_5": "Usar una dirección de correo diferente al registrarse para una nueva prueba",
"reset_log_6": "Si está disponible, usar una VPN para cambiar su dirección IP",
"reset_log_7": "Limpiar las cookies y caché de su navegador antes de visitar el sitio web de Cursor AI",
"reset_log_8": "Si los problemas persisten, intente instalar Cursor AI en una ubicación diferente",
"reset_log_9": "Si encuentra algún problema, vaya al Rastreador de Problemas de Github y cree un problema en https://github.com/yeongpin/cursor-free-vip/issues",
"unexpected_error": "Ocurrió un error inesperado: {error}",
"report_issue": "Por favor reporte este problema al Rastreador de Problemas de Github en https://github.com/yeongpin/cursor-free-vip/issues",
"keyboard_interrupt": "Proceso interrumpido por el usuario. Saliendo...",
"return_to_main_menu": "Volviendo al menú principal...",
"process_interrupted": "Proceso interrumpido. Saliendo...",
"press_enter_to_return_to_main_menu": "Presione Enter para volver al menú principal...",
"removing_known": "Eliminando archivos conocidos de prueba/licencia",
"performing_deep_scan": "Realizando escaneo profundo para archivos adicionales de prueba/licencia",
"found_additional_potential_license_trial_files": "Se encontraron {count} archivos potenciales adicionales de licencia/prueba",
"checking_for_electron_localstorage_files": "Verificando archivos de localStorage de Electron",
"no_additional_license_trial_files_found_in_deep_scan": "No se encontraron archivos adicionales de licencia/prueba en el escaneo profundo",
"removing_electron_localstorage_files": "Eliminando archivos de localStorage de Electron",
"electron_localstorage_files_removed": "Archivos de localStorage de Electron eliminados",
"electron_localstorage_files_removal_error": "Error al eliminar archivos de localStorage de Electron: {error}",
"removing_electron_localstorage_files_completed": "Eliminación de archivos de localStorage de Electron completada",
"warning_title": "ADVERTENCIA",
"warning_1": "Esta acción eliminará todas las configuraciones de Cursor AI,",
"warning_2": "ajustes y datos en caché. Esta acción no se puede deshacer.",
"warning_3": "Sus archivos de código NO se verán afectados, y la herramienta está diseñada",
"warning_4": "para dirigirse solo a archivos del editor Cursor AI y mecanismos de detección de prueba.",
"warning_5": "Otras aplicaciones en su sistema no se verán afectadas.",
"warning_6": "Necesitará configurar Cursor AI nuevamente después de ejecutar esta herramienta.",
"warning_7": "Use bajo su propio riesgo",
"removed": "Eliminado: {path}",
"failed_to_reset_machine_guid": "Falló al restablecer GUID de máquina",
"failed_to_remove": "Falló al eliminar: {path}",
"failed_to_delete_file": "Falló al eliminar archivo: {path}",
"failed_to_delete_directory": "Falló al eliminar directorio: {path}",
"failed_to_delete_file_or_directory": "Falló al eliminar archivo o directorio: {path}",
"deep_scanning": "Realizando escaneo profundo para archivos adicionales de prueba/licencia",
"resetting_cursor": "Restableciendo Editor Cursor AI... Por favor espere.",
"completed_in": "Completado en {time} segundos",
"cursor_reset_completed": "¡El Editor Cursor AI ha sido completamente restablecido y se ha evitado la detección de prueba!",
"cursor_reset_failed": "Falló el restablecimiento del Editor Cursor AI: {error}",
"cursor_reset_cancelled": "Restablecimiento del Editor Cursor AI cancelado. Saliendo sin realizar cambios.",
"operation_cancelled": "Operación cancelada. Saliendo sin realizar cambios.",
"direct_advanced_navigation": "Intentar la navegación directa a la pestaña avanzada",
"delete_input_error": "Error encontrar la entrada Eliminar: {error}",
"delete_input_not_found_continuing": "Eliminar la entrada de confirmación no encontrada, tratando de continuar de todos modos",
"advanced_tab_not_found": "Pestaña avanzada no encontrada después de múltiples intentos",
"advanced_tab_error": "Error al encontrar la pestaña avanzada: {error}",
"delete_input_not_found": "Eliminar la entrada de confirmación no encontrada después de múltiples intentos",
"delete_input_retry": "Eliminar entrada no encontrada, intento {intento}/{max_attempts}",
"login_redirect_failed": "Falló en la redirección de inicio de sesión, intentando la navegación directa ...",
"advanced_tab_retry": "Pestaña avanzada no encontrada, intento {intento}/{max_attempts}",
"advanced_tab_clicked": "Haga clic en la pestaña Avanzada",
"already_on_settings": "Ya en la página de configuración",
"found_danger_zone": "Sección de zona de peligro encontrado",
"delete_button_retry": "Botón Eliminar no encontrado, intento {intento}/{max_attempts}",
"delete_button_clicked": "Haga clic en el botón Eliminar la cuenta",
"delete_button_not_found": "Eliminar el botón de cuenta no se encuentra después de múltiples intentos",
"delete_button_error": "Error de encontrar el botón Eliminar: {error}",
"navigating_to_settings": "Navegar a la página de configuración ..."
},
"github_register": {
"title": "Automatización de Registro de GitHub + Cursor AI",
"features_header": "Características",
"feature1": "Genera un correo temporal usando 1secmail.",
"feature2": "Registra una nueva cuenta de GitHub con credenciales aleatorias.",
"feature3": "Verifica el correo de GitHub automáticamente.",
"feature4": "Inicia sesión en Cursor AI usando autenticación de GitHub.",
"feature5": "Restablece el ID de máquina para evitar la detección de prueba.",
"feature6": "Guarda todas las credenciales en un archivo.",
"warnings_header": "Advertencias",
"warning1": "Este script automatiza la creación de cuentas, lo que puede violar los términos de servicio de GitHub/Cursor.",
"warning2": "Requiere acceso a internet y privilegios administrativos.",
"warning3": "CAPTCHA o verificación adicional pueden interrumpir la automatización.",
"warning4": "Use responsablemente y bajo su propio riesgo.",
"confirm": "¿Está seguro de que desea continuar?",
"invalid_choice": "Elección inválida. Por favor ingrese 'yes' o 'no'",
"cancelled": "Operación cancelada",
"program_terminated": "Programa terminado por el usuario",
"starting_automation": "Iniciando automatización...",
"github_username": "Nombre de Usuario de GitHub",
"github_password": "Contraseña de GitHub",
"email_address": "Dirección de Correo",
"credentials_saved": "Estas credenciales han sido guardadas en github_cursor_accounts.txt",
"completed_successfully": "¡Registro de GitHub + Cursor completado exitosamente!",
"registration_encountered_issues": "El registro de GitHub + Cursor encontró problemas.",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Revise las ventanas del navegador para intervención manual o intente nuevamente más tarde."
},
"chrome_profile": {
"title": "Selección de Perfil de Chrome",
"select_profile": "Seleccione un perfil de Chrome para usar:",
"profile_list": "Perfiles disponibles:",
"default_profile": "Perfil Predeterminado",
"profile": "Perfil {number}",
"no_profiles": "No se encontraron perfiles de Chrome",
"error_loading": "Error al cargar perfiles de Chrome: {error}",
"profile_selected": "Perfil seleccionado: {profile}",
"invalid_selection": "Selección inválida. Por favor, intente de nuevo",
"warning_chrome_close": "Advertencia: Esto cerrará todos los procesos de Chrome en ejecución"
},
"restore": {
"title": "Restaurar ID de máquina desde copia de seguridad",
"starting": "Iniciando proceso de restauración de ID de máquina",
"no_backups_found": "No se encontraron copias de seguridad",
"available_backups": "Copias de seguridad disponibles",
"select_backup": "Seleccione una copia de seguridad para restaurar",
"to_cancel": "para cancelar",
"operation_cancelled": "Operación cancelada",
"invalid_selection": "Selección inválida",
"please_enter_number": "Por favor, introduzca un número válido",
"missing_id": "ID faltante: {id}",
"read_backup_failed": "Error al leer el archivo de copia de seguridad: {error}",
"current_file_not_found": "No se encontró el archivo de almacenamiento actual",
"current_backup_created": "Se creó una copia de seguridad del archivo de almacenamiento actual",
"storage_updated": "Archivo de almacenamiento actualizado con éxito",
"update_failed": "Error al actualizar el archivo de almacenamiento: {error}",
"sqlite_not_found": "No se encontró la base de datos SQLite",
"updating_sqlite": "Actualizando base de datos SQLite",
"updating_pair": "Actualizando par clave-valor",
"sqlite_updated": "Base de datos SQLite actualizada con éxito",
"sqlite_update_failed": "Error al actualizar la base de datos SQLite: {error}",
"machine_id_backup_created": "Se creó una copia de seguridad del archivo machineId",
"backup_creation_failed": "Error al crear la copia de seguridad: {error}",
"machine_id_updated": "Archivo machineId actualizado con éxito",
"machine_id_update_failed": "Error al actualizar el archivo machineId: {error}",
"updating_system_ids": "Actualizando IDs del sistema",
"system_ids_update_failed": "Error al actualizar los IDs del sistema: {error}",
"permission_denied": "Permiso denegado. Intente ejecutar como administrador",
"windows_machine_guid_updated": "GUID de máquina Windows actualizado con éxito",
"update_windows_machine_guid_failed": "Error al actualizar el GUID de máquina Windows: {error}",
"windows_machine_id_updated": "ID de máquina Windows actualizado con éxito",
"update_windows_machine_id_failed": "Error al actualizar el ID de máquina Windows: {error}",
"sqm_client_key_not_found": "No se encontró la clave de registro SQMClient",
"update_windows_system_ids_failed": "Error al actualizar los IDs del sistema Windows: {error}",
"macos_platform_uuid_updated": "UUID de plataforma macOS actualizado con éxito",
"failed_to_execute_plutil_command": "Error al ejecutar el comando plutil",
"update_macos_system_ids_failed": "Error al actualizar los IDs del sistema macOS: {error}",
"ids_to_restore": "IDs de máquina a restaurar",
"confirm": "¿Está seguro de que desea restaurar estos IDs?",
"success": "ID de máquina restaurado con éxito",
"process_error": "Error en el proceso de restauración: {error}",
"press_enter": "Presione Enter para continuar"
},
"oauth": {
"no_chrome_profiles_found": "No se encontraron perfiles de Chrome, utilizando el valor predeterminado",
"starting_new_authentication_process": "Iniciar nuevo proceso de autenticación ...",
"failed_to_delete_account": "No se pudo eliminar la cuenta: {error}",
"found_email": "Correo electrónico encontrado: {correo electrónico}",
"github_start": "Comienzo de Github",
"already_on_settings_page": "¡Ya en la página Configuración!",
"starting_github_authentication": "Comenzar la autenticación de Github ...",
"status_check_error": "Error de verificación de estado: {error}",
"account_is_still_valid": "La cuenta sigue siendo válida (uso: {uso})",
"authentication_timeout": "Tiempo de espera de autenticación",
"google_start": "Inicio de Google",
"usage_count": "Recuento de uso: {uso}",
"using_first_available_chrome_profile": "Usando el primer perfil de Chrome disponible: {perfil}",
"no_compatible_browser_found": "No se encontró un navegador compatible. Instale Google Chrome o Chromium.",
"authentication_successful_getting_account_info": "Autenticación exitosa, obteniendo información de cuenta ...",
"found_chrome_at": "Encontrado Chrome en: {ruta}",
"error_getting_user_data_directory": "Error al obtener directorio de datos de usuario: {error}",
"error_finding_chrome_profile": "Error de encontrar el perfil de Chrome, usando el valor predeterminado: {error}",
"auth_update_success": "El éxito de la actualización de la autenticación",
"authentication_successful": "Autenticación exitosa - correo electrónico: {correo electrónico}",
"authentication_failed": "La autenticación falló: {error}",
"warning_browser_close": "Advertencia: esto cerrará todos los procesos en ejecución {navegador}",
"supported_browsers": "Navegadores compatibles para {plataforma}",
"authentication_button_not_found": "Botón de autenticación no se encuentra",
"starting_new_google_authentication": "Iniciar nueva autenticación de Google ...",
"waiting_for_authentication": "Esperando la autenticación ...",
"found_default_chrome_profile": "Perfil de Chrome predeterminado encontrado encontrado",
"starting_browser": "Browser inicial en: {ruta}",
"token_extraction_error": "Error de extracción de token: {error}",
"could_not_check_usage_count": "No pudo verificar el recuento de uso: {error}",
"profile_selection_error": "Error durante la selección de perfil: {error}",
"warning_could_not_kill_existing_browser_processes": "ADVERTENCIA: No se pudo matar los procesos existentes del navegador: {Error}",
"browser_failed_to_start": "El navegador no pudo comenzar: {error}",
"redirecting_to_authenticator_cursor_sh": "Redirección a autenticador.cursor.sh ...",
"found_browser_data_directory": "Directorio de datos del navegador encontrado: {ruta}",
"browser_not_found_trying_chrome": "No pudo encontrar {navegador}, intentando Chrome en su lugar",
"starting_re_authentication_process": "Inicio del proceso de reautenticación ...",
"found_cookies": "Encontrado {Count} Cookies",
"auth_update_failed": "La actualización de la autenticación falló",
"browser_failed_to_start_fallback": "El navegador no pudo comenzar: {error}",
"failed_to_delete_expired_account": "No se pudo eliminar la cuenta vencida",
"navigating_to_authentication_page": "Navegar a la página de autenticación ...",
"browser_closed": "Navegador cerrado",
"failed_to_delete_account_or_re_authenticate": "No se pudo eliminar la cuenta o reautenticar: {error}",
"initializing_browser_setup": "Inicializar la configuración del navegador ...",
"failed_to_extract_auth_info": "No se pudo extraer información de autenticación: {error}",
"detected_platform": "Plataforma detectada: {plataforma}",
"starting_google_authentication": "Iniciar autenticación de Google ...",
"browser_failed": "El navegador no pudo comenzar: {error}",
"using_browser_profile": "Usando el perfil del navegador: {perfil}",
"consider_running_without_sudo": "Considere ejecutar el script sin sudo",
"try_running_without_sudo_admin": "Intente ejecutar sin privilegios de sudo/administrador",
"running_as_root_warning": "No se recomienda ejecutar la raíz para la automatización del navegador",
"page_changed_checking_auth": "Cambiado en la página, controlando la autenticación ...",
"please_select_your_google_account_to_continue": "Seleccione su cuenta de Google para continuar ...",
"browser_setup_failed": "Falló la configuración del navegador: {error}",
"missing_authentication_data": "Datos de autenticación faltantes: {datos}",
"using_configured_browser_path": "Uso de la ruta configurada {navegador}: {ruta}",
"could_not_find_usage_count": "No pudo encontrar el recuento de uso: {error}",
"killing_browser_processes": "Matar {navegador} procesos ...",
"browser_setup_completed": "Configuración del navegador completada con éxito",
"account_has_reached_maximum_usage": "La cuenta ha alcanzado el uso máximo, {eliminar}",
"could_not_find_email": "No pudo encontrar correo electrónico: {error}",
"user_data_dir_not_found": "{navegador} Directorio de datos de usuario que no se encuentra en {ruta}, intentará Chrome en su lugar",
"found_browser_user_data_dir": "Directorio de datos de usuario encontrado {navegador}: {ruta}",
"invalid_authentication_type": "Tipo de autenticación no válido"
},
"manual_auth": {
"auth_type_selected": "Tipo de autenticación seleccionado: {tipo}",
"proceed_prompt": "¿Proceder? (S/N):",
"auth_type_github": "Github",
"confirm_prompt": "Confirme la siguiente información:",
"invalid_token": "Token inválido. Autenticación abortada.",
"continue_anyway": "¿Continuar de todos modos? (S/N):",
"token_verified": "Token Verificado con éxito!",
"error": "Error: {error}",
"auth_update_failed": "No se pudo actualizar la información de autenticación",
"auth_type_prompt": "Seleccione Tipo de autenticación:",
"auth_type_auth0": "Auth_0 (predeterminado)",
"verifying_token": "Verificar la validez del token ...",
"auth_updated_successfully": "Información de autenticación actualizada con éxito!",
"email_prompt": "Ingrese el correo electrónico (deje en blanco para un correo electrónico aleatorio):",
"token_prompt": "Ingrese el token de su cursor (access_token/refresh_token):",
"title": "Autenticación del cursor manual",
"token_verification_skipped": "Verificación del token omitido (check_user_authorized.py no encontrado)",
"random_email_generated": "Correo electrónico aleatorio generado: {correo electrónico}",
"token_required": "Se requiere token",
"auth_type_google": "Google",
"operation_cancelled": "Operación cancelada",
"token_verification_error": "Error de verificación de token: {error}",
"updating_database": "Actualización de la base de datos de autenticación del cursor ..."
},
"auth_check": {
"token_length": "Longitud del token: {longitud} caracteres",
"usage_response_status": "Estado de respuesta de uso: {respuesta}",
"operation_cancelled": "Operación cancelada por el usuario",
"error_getting_token_from_db": "Error al obtener token de la base de datos: {error}",
"checking_usage_information": "Verificación de información de uso ...",
"usage_response": "Respuesta de uso: {respuesta}",
"authorization_failed": "¡Falló la autorización!",
"authorization_successful": "Autorización exitosa!",
"request_timeout": "Solicitar el tiempo de tiempo fuera",
"check_error": "Error de comprobación de autorización: {error}",
"connection_error": "Error de conexión",
"invalid_token": "Token inválido",
"check_usage_response": "Verifique el uso de la respuesta: {Respuesta}",
"enter_token": "Ingrese el token de su cursor:",
"token_found_in_db": "Token encontrado en la base de datos",
"user_unauthorized": "El usuario no está autorizado",
"checking_authorization": "Verificación de autorización ...",
"error_generating_checksum": "Error de generación de la suma de verificación: {error}",
"token_source": "¿Obtener token de la base de datos o la entrada manualmente? (D/M, predeterminado: D)",
"unexpected_error": "Error inesperado: {error}",
"user_authorized": "El usuario está autorizado",
"token_not_found_in_db": "Token no encontrado en la base de datos",
"jwt_token_warning": "El token parece estar en formato JWT, pero la comprobación de API devolvió un código de estado inesperado. El token puede ser válido, pero el acceso a la API está restringido.",
"unexpected_status_code": "Código de estado inesperado: {código}",
"getting_token_from_db": "Obtener token de la base de datos ...",
"cursor_acc_info_not_found": "cursor_acc_info.py no encontrado"
},
"account_delete": {
"delete_input_not_found": "Eliminar la entrada de confirmación no encontrada después de múltiples intentos",
"logging_in": "Iniciar sesión con Google ...",
"confirm_button_not_found": "Confirmar el botón no encontrado después de múltiples intentos",
"confirm_button_error": "Error de encontrar el botón Confirmar: {Error}",
"delete_button_clicked": "Haga clic en el botón Eliminar la cuenta",
"confirm_prompt": "¿Estás seguro de que quieres continuar? (S/N):",
"delete_button_error": "Error de encontrar el botón Eliminar: {error}",
"cancelled": "Eliminación de la cuenta cancelada.",
"error": "Error durante la eliminación de la cuenta: {error}",
"interrupted": "Proceso de eliminación de la cuenta interrumpido por el usuario.",
"delete_input_not_found_continuing": "Eliminar la entrada de confirmación no encontrada, tratando de continuar de todos modos",
"advanced_tab_retry": "Pestaña avanzada no encontrada, intento {intento}/{max_attempts}",
"waiting_for_auth": "Esperando la autenticación de Google ...",
"typed_delete": "\"Eliminar\" mecanografiado en el cuadro de confirmación",
"trying_settings": "Tratando de navegar a la página de configuración ...",
"delete_input_retry": "Eliminar entrada no encontrada, intento {intento}/{max_attempts}",
"email_not_found": "Correo electrónico no encontrado: {error}",
"delete_button_not_found": "Eliminar el botón de cuenta no se encuentra después de múltiples intentos",
"already_on_settings": "Ya en la página de configuración",
"failed": "El proceso de eliminación de la cuenta falló o fue cancelado.",
"warning": "Advertencia: esto eliminará permanentemente su cuenta de cursor. Esta acción no se puede deshacer.",
"direct_advanced_navigation": "Intentar la navegación directa a la pestaña avanzada",
"advanced_tab_not_found": "Pestaña avanzada no encontrada después de múltiples intentos",
"auth_timeout": "Tiempo de espera de autenticación, continuando de todos modos ...",
"select_google_account": "Seleccione su cuenta de Google ...",
"google_button_not_found": "El botón de inicio de sesión de Google no se encuentra",
"found_danger_zone": "Sección de zona de peligro encontrado",
"account_deleted": "Cuenta eliminada con éxito!",
"starting_process": "Proceso de eliminación de la cuenta inicial ...",
"advanced_tab_error": "Error al encontrar la pestaña avanzada: {error}",
"delete_button_retry": "Botón Eliminar no encontrado, intento {intento}/{max_attempts}",
"login_redirect_failed": "Falló en la redirección de inicio de sesión, intentando la navegación directa ...",
"unexpected_error": "Error inesperado: {error}",
"delete_input_error": "Error encontrar la entrada Eliminar: {error}",
"login_successful": "Iniciar sesión exitoso",
"advanced_tab_clicked": "Haga clic en la pestaña Avanzada",
"unexpected_page": "Página inesperada después del inicio de sesión: {URL}",
"found_email": "Correo electrónico encontrado: {correo electrónico}",
"title": "Herramienta de eliminación de la cuenta de cursor de Google",
"navigating_to_settings": "Navegar a la página de configuración ...",
"success": "¡Su cuenta de cursor se ha eliminado con éxito!",
"confirm_button_retry": "Confirmar el botón no encontrado, intento {intento}/{max_attempts}"
},
"token": {
"refreshing": "Refrescante token ...",
"extraction_error": "Error de extraer token: {error}",
"invalid_response": "Respuesta JSON no válida del servidor de actualización",
"no_access_token": "No hay token de acceso en respuesta",
"connection_error": "Error de conexión para actualizar el servidor",
"unexpected_error": "Error inesperado durante la actualización del token: {error}",
"server_error": "Actualizar el error del servidor: http {status}",
"refresh_success": "Token renovado con éxito! Válido para {días} días (expiras: {expirar})",
"request_timeout": "Solicitud para actualizar el horario del servidor",
"refresh_failed": "Falló en la actualización del token: {error}"
},
"browser_profile": {
"profile_selected": "Perfil seleccionado: {perfil}",
"default_profile": "Perfil predeterminado",
"no_profiles": "No se encontraron perfiles {navegador}",
"select_profile": "Seleccione el perfil {navegador} para usar:",
"error_loading": "Error de carga {navegador} perfiles: {error}",
"invalid_selection": "Selección no válida. Por favor intente de nuevo.",
"title": "Selección de perfil de navegador",
"profile": "Perfil {número}",
"profile_list": "Disponible {navegador} perfiles:"
},
"account_info": {
"subscription": "Suscripción",
"failed_to_get_account_info": "No se pudo obtener información de la cuenta",
"subscription_type": "Tipo de suscripción",
"pro": "Pro",
"failed_to_get_account": "No se pudo obtener información de la cuenta",
"config_not_found": "Configuración no encontrada.",
"premium_usage": "Uso de primas",
"failed_to_get_subscription": "No se pudo obtener información de suscripción",
"basic_usage": "Uso básico",
"premium": "De primera calidad",
"free": "Gratis",
"email_not_found": "Correo electrónico no encontrado",
"title": "Información de la cuenta",
"inactive": "Inactivo",
"remaining_trial": "Prueba restante",
"enterprise": "Empresa",
"lifetime_access_enabled": "Acceso de por vida habilitado",
"failed_to_get_usage": "No se pudo obtener información de uso",
"usage_not_found": "Uso no encontrado",
"days_remaining": "Días restantes",
"failed_to_get_token": "No se pudo hacer token",
"token": "Simbólico",
"subscription_not_found": "Información de suscripción no encontrada",
"days": "días",
"team": "Equipo",
"token_not_found": "Token no encontrado",
"pro_trial": "Prueba pro",
"email": "Correo electrónico",
"active": "Activo",
"failed_to_get_email": "No se pudo obtener la dirección de correo electrónico",
"trial_remaining": "Prueba profesional restante",
"usage": "Uso"
},
"config": {
"config_updated": "Configuración actualizada",
"configuration": "Configuración",
"file_owner": "Propietario del archivo: {propietario}",
"error_checking_linux_paths": "Error de comprobación de rutas de Linux: {error}",
"storage_file_is_empty": "El archivo de almacenamiento está vacío: {storage_path}",
"config_directory": "Directorio de configuración",
"documents_path_not_found": "Ruta de documentos no encontrado, utilizando el directorio actual",
"config_not_available": "Configuración no disponible",
"neither_cursor_nor_cursor_directory_found": "Ni el cursor ni el directorio cursor se encuentran en {config_base}",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Asegúrese de que el cursor esté instalado y se haya ejecutado al menos una vez",
"config_created": "Config creado: {config_file}",
"using_temp_dir": "Usando directorio temporal debido al error: {ruta} (error: {error})",
"storage_file_not_found": "Archivo de almacenamiento no encontrado: {storage_path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "El archivo puede estar dañado, reinstale el cursor",
"error_getting_file_stats": "Error al obtener estadísticas de archivo: {error}",
"enabled": "Activado",
"backup_created": "Copia de seguridad creada: {ruta}",
"file_permissions": "Permisos de archivo: {permisos}",
"config_setup_error": "Error de configuración de configuración: {error}",
"config_removed": "Archivo de configuración eliminado para la actualización forzada",
"config_force_update_enabled": "Actualización de la fuerza de archivo de configuración habilitada, realizando la actualización forzada",
"file_size": "Tamaño del archivo: {size} bytes",
"error_reading_storage_file": "Error al leer el archivo de almacenamiento: {error}",
"config_force_update_disabled": "Actualización de la fuerza de archivo de configuración deshabilitado, omitiendo la actualización forzada",
"config_dir_created": "Directorio de configuración creado: {ruta}",
"config_option_added": "Opción de configuración agregada: {opción}",
"file_group": "Grupo de archivos: {grupo}",
"and": "Y",
"backup_failed": "No se pudo hacer una copia de seguridad de la configuración: {error}",
"force_update_failed": "Falló de configuración de actualización de fuerza: {error}",
"storage_directory_not_found": "Directorio de almacenamiento no encontrado: {Storage_dir}",
"also_checked": "También verificado {ruta}",
"try_running": "Intente ejecutar: {comando}",
"disabled": "Desactivado",
"storage_file_found": "Archivo de almacenamiento encontrado: {storage_path}",
"storage_file_is_valid_and_contains_data": "El archivo de almacenamiento es válido y contiene datos",
"permission_denied": "Permiso denegado: {Storage_Path}"
},
"bypass": {
"found_product_json": "Product.json encontrado: {ruta}",
"starting": "Inicio de la versión del cursor Bypass ...",
"version_updated": "Versión actualizada de {Old} a {new}",
"menu_option": "Verificación de la versión del cursor de derivación",
"unsupported_os": "Sistema operativo no compatible: {Sistema}",
"backup_created": "Copia de seguridad creada: {ruta}",
"current_version": "Versión actual: {versión}",
"localappdata_not_found": "Variable de entorno LocalAppdata no encontrada",
"no_write_permission": "Sin permiso de escritura para el archivo: {ruta}",
"write_failed": "No se pudo escribir Product.json: {Error}",
"description": "Esta herramienta modifica el producto de cursor.json para evitar restricciones de versión",
"bypass_failed": "Versión Bypass falló: {error}",
"title": "Herramienta de derivación de la versión del cursor",
"no_update_needed": "No se necesita actualización. La versión actual {versión} ya es> = 0.46.0",
"read_failed": "No se pudo leer Product.json: {Error}",
"stack_trace": "Rastro de pila",
"product_json_not_found": "Product.json no se encuentra en las rutas de Linux comunes",
"file_not_found": "Archivo no encontrado: {ruta}"
},
"bypass_token_limit": {
"description": "Esta herramienta modifica el archivo workbench.desktop.main.js para evitar el límite del token",
"press_enter": "Presione Entrar para continuar ...",
"title": "Herramienta de límite de token de derivación"
},
"tempmail": {
"general_error": "Se produjo un error: {error}",
"config_error": "Error de archivo de configuración: {error}",
"no_email": "No se encuentra el correo electrónico de verificación del cursor",
"checking_email": "Comprobación del correo electrónico de verificación del cursor ...",
"configured_email": "Correo electrónico configurado: {correo electrónico}",
"extract_code_failed": "Extraer el código de verificación fallido: {error}",
"no_code": "No pudo obtener el código de verificación",
"check_email_failed": "Verifique el correo electrónico fallido: {error}",
"email_found": "Correo electrónico de verificación del cursor encontrado",
"verification_code": "Código de verificación: {código}"
}
}

878
locales/fr.json Normal file
View File

@ -0,0 +1,878 @@
{
"menu": {
"title": "Options Disponibles",
"exit": "Quitter le Programme",
"reset": "Réinitialiser l'ID Machine",
"register": "Enregistrer un Nouveau Compte Cursor",
"register_google": "S'inscrire avec un Compte Google",
"register_github": "S'inscrire avec un Compte GitHub",
"register_manual": "Enregistrer Cursor avec un E-mail Personnalisé",
"quit": "Fermer l'Application Cursor",
"select_language": "Changer de Langue",
"input_choice": "Veuillez entrer votre choix ({choices})",
"invalid_choice": "Sélection invalide. Veuillez entrer un numéro de {choices}",
"program_terminated": "Programme terminé par l'utilisateur",
"error_occurred": "Une erreur s'est produite : {error}. Veuillez réessayer",
"press_enter": "Appuyez sur Entrée pour quitter",
"disable_auto_update": "Désactiver la Mise à Jour Automatique de Cursor",
"lifetime_access_enabled": "ACCÈS À VIE ACTIVÉ",
"totally_reset": "Réinitialisation Complète de Cursor",
"outdate": "Obsolete",
"temp_github_register": "Inscription GitHub temporaire",
"coming_soon": "Bientôt",
"fixed_soon": "Bientôt Corrigé",
"contribute": "Contribuer au Projet",
"config": "Afficher la Configuration",
"delete_google_account": "Supprimer le Compte Google Cursor",
"continue_prompt": "Continuer ? (y/N) : ",
"operation_cancelled_by_user": "Opération annulée par l'utilisateur",
"exiting": "Fermeture ……",
"bypass_version_check": "Ignorer la Vérification de Version de Cursor",
"check_user_authorized": "Vérifier l'Autorisation de l'Utilisateur",
"bypass_token_limit": "Contourner la limite de tokens",
"restore_machine_id": "Restaurer l'ID de machine depuis une sauvegarde",
"select_chrome_profile": "Sélectionnez Chrome Profil",
"admin_required": "Exécution en tant qu'exécutable, les privilèges de l'administrateur requis.",
"language_config_saved": "Configuration du langage enregistré avec succès",
"lang_invalid_choice": "Choix non valide. Veuillez saisir l'une des options suivantes: ({Lang_Choices})",
"manual_custom_auth": "Auth personnalisé manuel",
"admin_required_continue": "Poursuivant sans privilèges d'administrateur."
},
"languages": {
"ar": "Arabe",
"en": "Anglais",
"zh_cn": "Chinois simplifié",
"zh_tw": "Chinois traditionnel",
"vi": "Vietnamien",
"nl": "Néerlandais",
"de": "Allemand",
"fr": "Français",
"pt": "Portugais",
"ru": "Russe",
"es": "Espagnol",
"tr": "Turc",
"bg": "Bulgare",
"it": "italien",
"ja": "japonais"
},
"quit_cursor": {
"start": "Début de la Fermeture de Cursor",
"no_process": "Aucun Processus Cursor en Cours",
"terminating": "Arrêt du Processus {pid}",
"waiting": "En Attente de la Fin du Processus",
"success": "Tous les Processus Cursor sont Fermés",
"timeout": "Délai d'Attente du Processus : {pids}",
"error": "Erreur Survenue : {error}"
},
"reset": {
"title": "Outil de Réinitialisation de l'ID Machine de Cursor",
"checking": "Vérification du Fichier de Configuration",
"not_found": "Fichier de Configuration Non Trouvé",
"no_permission": "Impossible de Lire ou d'Écrire le Fichier de Configuration, Veuillez Vérifier les Permissions",
"reading": "Lecture de la Configuration Actuelle",
"creating_backup": "Création d'une Sauvegarde de la Configuration",
"backup_exists": "Fichier de Sauvegarde Existe Déjà, Étape de Sauvegarde Ignorée",
"generating": "Génération d'un Nouvel ID Machine",
"saving_json": "Sauvegarde de la Nouvelle Configuration en JSON",
"success": "ID Machine Réinitialisé avec Succès",
"new_id": "Nouvel ID Machine",
"permission_error": "Erreur de Permission : {error}",
"run_as_admin": "Veuillez Essayer d'Exécuter ce Programme en tant qu'Administrateur",
"process_error": "Erreur de Processus de Réinitialisation : {error}",
"updating_sqlite": "Mise à Jour de la Base de Données SQLite",
"updating_pair": "Mise à Jour de la Paire Clé-Valeur",
"sqlite_success": "Base de Données SQLite Mise à Jour avec Succès",
"sqlite_error": "Échec de la Mise à Jour de la Base de Données SQLite : {error}",
"press_enter": "Appuyez sur Entrée pour Continuer",
"unsupported_os": "Système d'Exploitation Non Pris en Charge : {os}",
"linux_path_not_found": "Chemin Linux Non Trouvé",
"updating_system_ids": "Mise à Jour des IDs Système",
"system_ids_updated": "IDs Système Mis à Jour avec Succès",
"system_ids_update_failed": "Échec de la Mise à Jour des IDs Système : {error}",
"windows_guid_updated": "GUID Windows Mis à Jour avec Succès",
"windows_permission_denied": "Permission Windows Refusée",
"windows_guid_update_failed": "Échec de la Mise à Jour du GUID Windows",
"macos_uuid_updated": "UUID macOS Mis à Jour avec Succès",
"plutil_command_failed": "Commande plutil Échouée",
"start_patching": "Démarrage du Patching de getMachineId",
"macos_uuid_update_failed": "Échec de la Mise à Jour de l'UUID macOS",
"current_version": "Version Actuelle de Cursor : {version}",
"patch_completed": "Patching de getMachineId Terminé",
"patch_failed": "Échec du Patching de getMachineId : {error}",
"version_check_passed": "Vérification de la Version de Cursor Réussie",
"file_modified": "Fichier Modifié",
"version_less_than_0_45": "Version de Cursor < 0.45.0, Patching de getMachineId Ignoré",
"detecting_version": "Détection de la Version de Cursor",
"patching_getmachineid": "Patching de getMachineId",
"version_greater_than_0_45": "Version de Cursor >= 0.45.0, Patching de getMachineId",
"permission_denied": "Permission Refusée : {error}",
"backup_created": "Sauvegarde Créée",
"update_success": "Mise à Jour Réussie",
"update_failed": "Échec de la Mise à Jour : {error}",
"windows_machine_guid_updated": "GUID de la Machine Windows Mis à Jour avec Succès",
"reading_package_json": "Lecture du package.json {path}",
"invalid_json_object": "Objet JSON Invalide",
"no_version_field": "Aucun Champ de Version Trouvé dans le package.json",
"version_field_empty": "Champ de Version Vide",
"invalid_version_format": "Format de Version Invalide : {version}",
"found_version": "Version Trouvée : {version}",
"version_parse_error": "Erreur d'Analyse de la Version : {error}",
"package_not_found": "Package.json Non Trouvé : {path}",
"check_version_failed": "Échec de la Vérification de la Version : {error}",
"stack_trace": "Trace de la Pile",
"version_too_low": "Version de Cursor Trop Basse : {version} < 0.45.0",
"no_write_permission": "Pas de Permission d'Écriture : {path}",
"path_not_found": "Chemin Non Trouvé : {path}",
"modify_file_failed": "Échec de la Modification du Fichier : {error}",
"windows_machine_id_updated": "ID de la Machine Windows Mis à Jour avec Succès",
"update_windows_machine_id_failed": "Échec de la Mise à Jour de l'ID de la Machine Windows : {error}",
"update_windows_machine_guid_failed": "Échec de la Mise à Jour du GUID de la Machine Windows : {error}",
"file_not_found": "Fichier Non Trouvé : {path}"
},
"register": {
"title": "Outil d'Enregistrement de Cursor",
"start": "Démarrage du Processus d'Enregistrement...",
"handling_turnstile": "Traitement de la Vérification de Sécurité...",
"retry_verification": "Nouvelle Tentative de Vérification...",
"detect_turnstile": "Vérification de la Sécurité...",
"verification_success": "Vérification de Sécurité Réussie",
"starting_browser": "Ouverture du Navigateur...",
"form_success": "Formulaire Soumis avec Succès",
"browser_started": "Navigateur Ouvert avec Succès",
"waiting_for_second_verification": "En Attente de la Vérification par E-mail...",
"waiting_for_verification_code": "En Attente du Code de Vérification...",
"password_success": "Mot de Passe Défini avec Succès",
"password_error": "Impossible de Définir le Mot de Passe : {error}. Veuillez Réessayer",
"waiting_for_page_load": "Chargement de la Page...",
"first_verification_passed": "Première Vérification Réussie",
"mailbox": "Boîte de Réception Accédée avec Succès",
"register_start": "Démarrer l'Enregistrement",
"form_submitted": "Formulaire Soumis, Démarrage de la Vérification...",
"filling_form": "Remplissage du Formulaire",
"visiting_url": "Visite de l'URL",
"basic_info": "Informations de Base Soumises",
"handle_turnstile": "Traitement du Tourniquet",
"no_turnstile": "Aucun Tourniquet Détecté",
"turnstile_passed": "Tourniquet Réussi",
"verification_start": "Démarrage de l'Obtention du Code de Vérification",
"verification_timeout": "Délai d'Attente du Code de Vérification",
"verification_not_found": "Aucun Code de Vérification Trouvé",
"try_get_code": "Essayer | {attempt} d'Obtenir le Code de Vérification | Temps Restant : {time}s",
"get_account": "Obtention des Informations du Compte",
"get_token": "Obtention du Jeton de Session Cursor",
"token_success": "Jeton Obtenu avec Succès",
"token_attempt": "Essayer | {attempt} fois d'Obtenir le Jeton | Nouvelle Tentative dans {time}s",
"token_max_attempts": "Nombre Maximum de Tentatives Atteint ({max}) | Échec de l'Obtention du Jeton",
"token_failed": "Échec de l'Obtention du Jeton : {error}",
"account_error": "Échec de l'Obtention des Informations du Compte : {error}",
"press_enter": "Appuyez sur Entrée pour Continuer",
"browser_start": "Démarrage du Navigateur",
"open_mailbox": "Ouverture de la Page de la Boîte de Réception",
"email_error": "Échec de l'Obtention de l'Adresse E-mail",
"setup_error": "Erreur de Configuration de l'E-mail : {error}",
"start_getting_verification_code": "Démarrage de l'Obtention du Code de Vérification, Nouvelle Tentative dans 60s",
"get_verification_code_timeout": "Délai d'Attente de l'Obtention du Code de Vérification",
"get_verification_code_success": "Code de Vérification Obtenu avec Succès",
"try_get_verification_code": "Essayer | {attempt} d'Obtenir le Code de Vérification | Temps Restant : {remaining_time}s",
"verification_code_filled": "Code de Vérification Rempli",
"login_success_and_jump_to_settings_page": "Connexion Réussie et Accès à la Page des Paramètres",
"detect_login_page": "Détection de la Page de Connexion, Démarrage de la Connexion...",
"cursor_registration_completed": "Enregistrement de Cursor Terminé!",
"set_password": "Définir le Mot de Passe",
"basic_info_submitted": "Informations de Base Soumises",
"cursor_auth_info_updated": "Informations d'Authentification de Cursor Mises à Jour",
"cursor_auth_info_update_failed": "Échec de la Mise à Jour des Informations d'Authentification de Cursor",
"reset_machine_id": "Réinitialiser l'ID Machine",
"account_info_saved": "Informations du Compte Enregistrées",
"save_account_info_failed": "Échec de l'Enregistrement des Informations du Compte",
"get_email_address": "Obtenir l'Adresse E-mail",
"update_cursor_auth_info": "Mettre à Jour les Informations d'Authentification de Cursor",
"register_process_error": "Erreur du Processus d'Enregistrement : {error}",
"setting_password": "Définir le Mot de Passe",
"manual_code_input": "Saisie Manuelle du Code",
"manual_email_input": "Saisie Manuelle de l'E-mail",
"password": "Mot de Passe",
"first_name": "Prénom",
"last_name": "Nom de Famille",
"exit_signal": "Signal de Sortie",
"email_address": "Adresse E-mail",
"config_created": "Configuration Créée",
"verification_failed": "Échec de la Vérification",
"verification_error": "Erreur de Vérification : {error}",
"config_option_added": "Option de Configuration Ajoutée : {option}",
"config_updated": "Configuration Mise à Jour",
"password_submitted": "Mot de Passe Soumis",
"total_usage": "Utilisation Totale : {usage}",
"setting_on_password": "Définir le Mot de Passe",
"getting_code": "Obtention du Code de Vérification, Nouvelle Tentative dans 60s",
"using_browser": "Utilisation de {navigateur} navigateur: {path}",
"could_not_track_processes": "Impossible de suivre {Browser} Processus: {Erreur}",
"try_install_browser": "Essayez d'installer le navigateur avec votre gestionnaire de packages",
"tempmail_plus_verification_started": "Démarrage du processus de vérification TempmailPlus",
"max_retries_reached": "Tentatives de réessayer maximales atteintes. L'inscription a échoué.",
"tempmail_plus_enabled": "TempmailPlus est activé",
"browser_path_invalid": "{Browser} Le chemin n'est pas valide, en utilisant le chemin par défaut",
"human_verify_error": "Impossible de vérifier que l'utilisateur est humain. Réessayer ...",
"using_tempmail_plus": "Utilisation de TempmailPlus pour la vérification des e-mails",
"tracking_processes": "Processus de suivi {count} {Browser}",
"tempmail_plus_epin_missing": "Tempmailplus epin n'est pas configuré",
"tempmail_plus_verification_failed": "La vérification tempmailplus a échoué: {error}",
"using_browser_profile": "Utilisation du profil {Browser} de: {user_data_dir}",
"tempmail_plus_verification_completed": "La vérification TempmailPlus terminée avec succès",
"tempmail_plus_email_missing": "Le courrier électronique TempmailPlus n'est pas configuré",
"tempmail_plus_config_missing": "La configuration de tempmailplus est manquante",
"tempmail_plus_init_failed": "Échec de l'initialisation de tempmailplus: {error}",
"tempmail_plus_initialized": "TempmailPlus a initialisé avec succès",
"tempmail_plus_disabled": "TempmailPlus est désactivé",
"no_new_processes_detected": "Pas de nouveaux processus {navigateur} détectés pour suivre",
"make_sure_browser_is_properly_installed": "Assurez-vous que {Browser} est correctement installé"
},
"auth": {
"title": "Gestionnaire d'Authentification de Cursor",
"checking_auth": "Vérification du Fichier d'Authentification",
"auth_not_found": "Fichier d'Authentification Non Trouvé",
"auth_file_error": "Erreur du Fichier d'Authentification : {error}",
"reading_auth": "Lecture du Fichier d'Authentification",
"updating_auth": "Mise à Jour des Informations d'Authentification",
"auth_updated": "Informations d'Authentification Mises à Jour avec Succès",
"auth_update_failed": "Échec de la Mise à Jour des Informations d'Authentification : {error}",
"auth_file_created": "Fichier d'Authentification Créé",
"auth_file_create_failed": "Échec de la Création du Fichier d'Authentification : {error}",
"press_enter": "Appuyez sur Entrée pour Continuer",
"reset_machine_id": "Réinitialiser l'ID Machine",
"database_connection_closed": "Connexion à la Base de Données Fermée",
"database_updated_successfully": "Base de Données Mise à Jour avec Succès",
"connected_to_database": "Connecté à la Base de Données",
"updating_pair": "Mise à Jour de la Paire Clé-Valeur",
"db_not_found": "Fichier de Base de Données Non Trouvé à : {path}",
"db_permission_error": "Impossible d'Accéder au Fichier de Base de Données. Veuillez Vérifier les Permissions",
"db_connection_error": "Échec de la Connexion à la Base de Données : {error}"
},
"control": {
"generate_email": "Générer un Nouvel E-mail",
"blocked_domain": "Domaine Bloqué",
"select_domain": "Sélectionner un Domaine Aléatoire",
"copy_email": "Copier l'Adresse E-mail",
"enter_mailbox": "Entrer dans la Boîte de Réception",
"refresh_mailbox": "Actualiser la Boîte de Réception",
"check_verification": "Vérifier le Code de Vérification",
"verification_found": "Code de Vérification Trouvé",
"verification_not_found": "Aucun Code de Vérification Trouvé",
"browser_error": "Erreur de Contrôle du Navigateur : {error}",
"navigation_error": "Erreur de Navigation : {error}",
"email_copy_error": "Erreur de Copie de l'E-mail : {error}",
"mailbox_error": "Erreur de la Boîte de Réception : {error}",
"token_saved_to_file": "Jeton Enregistré dans cursor_tokens.txt",
"navigate_to": "Naviguer vers {url}",
"generate_email_success": "E-mail Généré avec Succès",
"select_email_domain": "Sélectionner le Domaine de l'E-mail",
"select_email_domain_success": "Domaine de l'E-mail Sélectionné avec Succès",
"get_email_name": "Obtenir le Nom de l'E-mail",
"get_email_name_success": "Nom de l'E-mail Obtenu avec Succès",
"get_email_address": "Obtenir l'Adresse E-mail",
"get_email_address_success": "Adresse E-mail Obtenue avec Succès",
"enter_mailbox_success": "Entrée dans la Boîte de Réception Réussie",
"found_verification_code": "Code de Vérification Trouvé",
"get_cursor_session_token": "Obtenir le Jeton de Session Cursor",
"get_cursor_session_token_success": "Jeton de Session Cursor Obtenu avec Succès",
"get_cursor_session_token_failed": "Échec de l'Obtention du Jeton de Session Cursor",
"save_token_failed": "Échec de l'Enregistrement du Jeton",
"database_updated_successfully": "Base de Données Mise à Jour avec Succès",
"database_connection_closed": "Connexion à la Base de Données Fermée",
"no_valid_verification_code": "Aucun Code de Vérification Valide"
},
"email": {
"starting_browser": "Démarrage du Navigateur",
"visiting_site": "Visite de mail domains",
"create_success": "E-mail Créé avec Succès",
"create_failed": "Échec de la Création de l'E-mail",
"create_error": "Erreur de Création de l'E-mail : {error}",
"refreshing": "Actualisation de l'E-mail",
"refresh_success": "E-mail Actualisé avec Succès",
"refresh_error": "Erreur d'Actualisation de l'E-mail : {error}",
"refresh_button_not_found": "Bouton d'Actualisation Non Trouvé",
"verification_found": "Vérification Trouvée",
"verification_not_found": "Vérification Non Trouvée",
"verification_error": "Erreur de Vérification : {error}",
"verification_code_found": "Code de Vérification Trouvé",
"verification_code_not_found": "Code de Vérification Non Trouvé",
"verification_code_error": "Erreur de Code de Vérification : {error}",
"address": "Adresse E-mail",
"all_domains_blocked": "Tous les Domaines Sont Bloqués, Changement de Service",
"no_available_domains_after_filtering": "Aucun Domaine Disponible Après Filtrage",
"switching_service": "Changement vers le Service {service}",
"domains_list_error": "Échec de l'Obtention de la Liste des Domaines : {error}",
"failed_to_get_available_domains": "Échec de l'Obtention des Domaines Disponibles",
"domains_excluded": "Domaines Exclus : {domains}",
"failed_to_create_account": "Échec de la Création du Compte",
"account_creation_error": "Erreur de Création du Compte : {error}",
"domain_blocked": "Domaine Bloqué : {domain}",
"no_display_found": "Aucun écran trouvé. Assurez-vous que X Server s'exécute.",
"try_export_display": "Essayez: Affichage d'exportation =: 0",
"try_install_chromium": "Essayez: sudo apt install chromium-browser",
"blocked_domains": "Domaines bloqués: {domaines}",
"blocked_domains_loaded_timeout_error": "Domaines bloqués Erreur de délai d'expiration: {Erreur}",
"blocked_domains_loaded_success": "Des domaines bloqués chargés avec succès",
"extension_load_error": "Erreur de chargement d'extension: {erreur}",
"available_domains_loaded": "Domaines disponibles chargés: {count}",
"blocked_domains_loaded_error": "Domaines bloqués Erreur chargée: {Erreur}",
"make_sure_chrome_chromium_is_properly_installed": "Assurez-vous que Chrome / Chromium est correctement installé",
"blocked_domains_loaded_timeout": "Domaines bloqués Timeout chargé: {délai d'expiration}",
"domains_filtered": "Domaines filtrés: {count}",
"trying_to_create_email": "Essayer de créer un e-mail: {email}",
"using_chrome_profile": "Utilisation du profil chrome de: {user_data_dir}",
"blocked_domains_loaded": "Domaines bloqués chargés: {count}"
},
"update": {
"title": "Désactivation de la Mise à Jour Automatique de Cursor",
"disable_success": "Mise à Jour Automatique Désactivée avec Succès",
"disable_failed": "Échec de la Désactivation de la Mise à Jour Automatique : {error}",
"press_enter": "Appuyez sur Entrée pour Continuer",
"start_disable": "Démarrage de la Désactivation de la Mise à Jour Automatique",
"killing_processes": "Tuer les Processus",
"processes_killed": "Processus Tuer",
"removing_directory": "Suppression du Dossier",
"directory_removed": "Dossier Supprimé",
"creating_block_file": "Création du Fichier de Blocage",
"block_file_created": "Fichier de Blocage Créé",
"clearing_update_yml": "Effacer le fichier update.yml",
"update_yml_cleared": "Fichier Update.yml effacé",
"unsupported_os": "OS non pris en charge: {System}",
"block_file_already_locked": "Le fichier de blocs est déjà verrouillé",
"yml_already_locked_error": "Update.yml Fichier Erreur déjà verrouillée: {erreur}",
"update_yml_not_found": "Fichier Update.yml introuvable",
"yml_locked_error": "Erreur de verrouillage du fichier Update.yml: {erreur}",
"remove_directory_failed": "Échec de la suppression du répertoire: {error}",
"yml_already_locked": "Le fichier update.yml est déjà verrouillé",
"create_block_file_failed": "Échec de la création du fichier de blocs: {error}",
"block_file_locked_error": "Bloquer Erreur verrouillée du fichier: {erreur}",
"directory_locked": "Le répertoire est verrouillé: {path}",
"block_file_already_locked_error": "Bloquer le fichier Erreur déjà verrouillée: {erreur}",
"clear_update_yml_failed": "Échec de l'effondrement du fichier Update.yml: {error}",
"yml_locked": "Le fichier update.yml est verrouillé",
"block_file_locked": "Le fichier de blocs est verrouillé"
},
"updater": {
"checking": "Vérification des mises à jour...",
"new_version_available": "Nouvelle version disponible! (Version actuelle: {current}, Version la plus récente: {latest})",
"updating": "Mise à jour vers la version la plus récente. Le programme redémarrera automatiquement.",
"up_to_date": "Vous utilisez la version la plus récente.",
"check_failed": "Échec de la vérification des mises à jour: {error}",
"continue_anyway": "Continuer avec la version actuelle...",
"update_confirm": "Voulez-vous mettre à jour vers la version la plus récente? (O/n)",
"update_skipped": "Mise à jour ignorée.",
"invalid_choice": "Choix invalide. Veuillez entrer 'O' ou 'n'.",
"development_version": "Version de Développement {current} > {latest}",
"changelog_title": "Journal des modifications",
"rate_limit_exceeded": "La limite de taux de l'API GitHub dépasse. Vérification de mise à jour de saut."
},
"totally_reset": {
"title": "Réinitialiser Complètement Cursor",
"checking_config": "Vérification du Fichier de Configuration",
"config_not_found": "Fichier de Configuration Non Trouvé",
"no_permission": "Impossible de Lire ou d'Écrire le Fichier de Configuration, Veuillez Vérifier les Permissions du Fichier",
"reading_config": "Lecture de la Configuration Actuelle",
"creating_backup": "Création de la Sauvegarde de la Configuration",
"backup_exists": "Fichier de Sauvegarde Déjà Existant, Passer à la Sauvegarde",
"generating_new_machine_id": "Génération d'un Nouvel ID Machine",
"saving_new_config": "Enregistrement de la Nouvelle Configuration dans JSON",
"success": "Réinitialisation de Cursor Réussie",
"error": "Réinitialisation de Cursor Échouée: {error}",
"press_enter": "Appuyez sur Entrée pour Continuer",
"reset_machine_id": "Réinitialiser l'ID Machine",
"database_connection_closed": "Connexion à la Base de Données Fermée",
"database_updated_successfully": "Base de Données Mise à Jour avec Succès",
"connected_to_database": "Connecté à la Base de Données",
"updating_pair": "Updating Key-Value Pair",
"db_not_found": "Database file not found at: {path}",
"db_permission_error": "Impossible d'Accéder au Fichier de Base de Données. Veuillez Vérifier les Permissions",
"db_connection_error": "Échec de la Connexion à la Base de Données : {error}",
"feature_title": "Fonctionnalités",
"feature_1": "Suppression complète des paramètres et configurations de Cursor AI",
"feature_2": "Efface tous les données mises en cache, y compris l'historique et les prompts",
"feature_3": "Réinitialise l'ID Machine pour contourner la détection de la période d'essai",
"feature_4": "Crée de nouveaux identifiants de machine aléatoires",
"feature_5": "Supprime les extensions personnalisées et les préférences",
"feature_6": "Réinitialise les informations de la période d'essai et les données d'activation",
"feature_7": "Analyse approfondie pour les fichiers cachés liés à la licence et à la période d'essai",
"feature_8": "Sauvegarde sécurisée des fichiers non liés à Cursor et applications",
"feature_9": "Compatible avec Windows, macOS et Linux",
"disclaimer_title": "DISCLAIMER",
"disclaimer_1": "Cet outil supprimera définitivement tous les paramètres et configurations de Cursor AI,",
"disclaimer_2": "configurations, et les données mises en cache. Cette action ne peut pas être annulée.",
"disclaimer_3": "Vos fichiers de code ne seront PAS affectés, et l'outil est conçu",
"disclaimer_4": "pour ne cibler que les fichiers de l'éditeur Cursor AI et les mécanismes de détection de la période d'essai.",
"disclaimer_5": "Les autres applications sur votre système ne seront PAS affectées.",
"disclaimer_6": "Vous devrez régler Cursor AI à nouveau après avoir exécuté cet outil.",
"disclaimer_7": "Utilisez à vos risques et périls",
"confirm_title": "Êtes-vous sûr de vouloir continuer?",
"confirm_1": "Cette action supprimera tous les paramètres et configurations de Cursor AI,",
"confirm_2": "configurations, et les données mises en cache. Cette action ne peut pas être annulée.",
"confirm_3": "Vos fichiers de code ne seront PAS affectés, et l'outil est conçu",
"confirm_4": "pour ne cibler que les fichiers de l'éditeur Cursor AI et les mécanismes de détection de la période d'essai.",
"confirm_5": "Les autres applications sur votre système ne seront PAS affectées.",
"confirm_6": "Vous devrez régler Cursor AI à nouveau après avoir exécuté cet outil.",
"confirm_7": "Utilisez à vos risques et périls",
"invalid_choice": "Veuillez entrer 'O' ou 'n'",
"skipped_for_safety": "Passé pour la sécurité (non lié à Cursor): {path}",
"deleted": "Supprimé: {path}",
"error_deleting": "Erreur de suppression de {path}: {error}",
"not_found": "Fichier non trouvé: {path}",
"resetting_machine_id": "Réinitialisation des identifiants de machine pour contourner la détection de la période d'essai...",
"created_machine_id": "Créé un nouvel ID machine: {path}",
"error_creating_machine_id": "Erreur de création du fichier ID machine {path}: {error}",
"error_searching": "Erreur de recherche dans {path}: {error}",
"created_extended_trial_info": "Créé un nouveau fichier d'informations de période d'essai étendue: {path}",
"error_creating_trial_info": "Erreur de création du fichier d'informations de période d'essai: {path}: {error}",
"resetting_cursor_ai_editor": "Réinitialisation de l'éditeur Cursor AI... Veuillez patienter.",
"reset_cancelled": "Réinitialisation annulée. Exiting sans faire de modifications.",
"windows_machine_id_modification_skipped": "Modification de l'ID machine Windows ignorée: {error}",
"linux_machine_id_modification_skipped": "Modification de l'ID machine Linux ignorée: {error}",
"note_complete_machine_id_reset_may_require_running_as_administrator": "Note: Réinitialisation complète de l'ID machine peut nécessiter d'exécuter en tant qu'administrateur",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "Note: Réinitialisation complète de l'ID machine peut nécessiter des privilèges sudo",
"windows_registry_instructions": "📝 NOTE: Pour la réinitialisation complète sur Windows, vous devrez peut-être également nettoyer les entrées du registre.",
"windows_registry_instructions_2": " Exécutez 'regedit' et recherchez les clés contenant 'Cursor' ou 'CursorAI' sous HKEY_CURRENT_USER\\Software\\ et supprimez-les.\n",
"reset_log_1": "Cursor AI a été complètement réinitialisé et la détection de la période d'essai a été contournée!",
"reset_log_2": "Veuillez redémarrer votre système pour que les modifications prennent effet.",
"reset_log_3": "Vous devrez réinstaller Cursor AI et devriez maintenant avoir une période d'essai fraîche.",
"reset_log_4": "Pour les meilleurs résultats, considérez également:",
"reset_log_5": "Utilisez une autre adresse e-mail lors de l'inscription pour une nouvelle période d'essai",
"reset_log_6": "Si disponible, utilisez un VPN pour changer votre adresse IP",
"reset_log_7": "Nettoyez les cookies et le cache de votre navigateur avant de visiter le site web de Cursor AI",
"reset_log_8": "Si les problèmes persistent, essayez d'installer Cursor AI dans un autre emplacement",
"reset_log_9": "Si vous rencontrez des problèmes, allez au suivi des problèmes Github et créez un problème à https://github.com/yeongpin/cursor-free-vip/issues",
"unexpected_error": "Une erreur inattendue est survenue: {error}",
"report_issue": "Veuillez signaler ce problème au suivi des problèmes Github à https://github.com/yeongpin/cursor-free-vip/issues",
"keyboard_interrupt": "Processus interrompu par l'utilisateur. Exiting...",
"return_to_main_menu": "Retour au menu principal...",
"process_interrupted": "Processus interrompu. Exiting...",
"press_enter_to_return_to_main_menu": "Appuyez sur Entrée pour retourner au menu principal...",
"removing_known": "Suppression des fichiers de période d'essai/licence connus",
"performing_deep_scan": "Exécution d'une analyse approfondie pour les fichiers de période d'essai/licence supplémentaires",
"found_additional_potential_license_trial_files": "Trouvé {count} fichiers de période d'essai/licence supplémentaires potentiels",
"checking_for_electron_localstorage_files": "Vérification des fichiers localStorage Electron",
"no_additional_license_trial_files_found_in_deep_scan": "Aucun fichier de licence/période d'essai supplémentaire trouvé dans l'analyse approfondie",
"removing_electron_localstorage_files": "Suppression des fichiers localStorage Electron",
"electron_localstorage_files_removed": "Fichiers localStorage Electron supprimés",
"electron_localstorage_files_removal_error": "Erreur de suppression des fichiers localStorage Electron: {error}",
"removing_electron_localstorage_files_completed": "Suppression des fichiers localStorage Electron terminée",
"warning_title": "AVERTISSEMENT",
"delete_input_error": "Erreur Rechercher la suppression de l'entrée: {erreur}",
"direct_advanced_navigation": "Essayer la navigation directe vers l'onglet avancé",
"delete_input_not_found_continuing": "Supprimer l'entrée de confirmation non trouvée, essayant de continuer de toute façon",
"advanced_tab_not_found": "Onglet avancé non trouvé après plusieurs tentatives",
"advanced_tab_error": "Erreur Recherche d'onglet Avancé: {Erreur}",
"delete_input_not_found": "Supprimer l'entrée de confirmation non trouvée après plusieurs tentatives",
"failed_to_delete_file": "Échec de la suppression du fichier: {path}",
"operation_cancelled": "Opération annulée. Sortant sans apporter de modifications.",
"removed": "Supprimé: {path}",
"warning_6": "Vous devrez à nouveau rétablir un curseur AI après avoir exécuté cet outil.",
"delete_input_retry": "Supprimer l'entrée introuvable, tentative {tentative} / {max_attempts}",
"warning_4": "Pour cibler uniquement les fichiers d'éditeur AI de curseur et les mécanismes de détection d'essai.",
"cursor_reset_failed": "Cursor AI Editor réinitialisation a échoué: {error}",
"login_redirect_failed": "La redirection de connexion a échoué, essayant la navigation directe ...",
"warning_5": "D'autres applications sur votre système ne seront pas affectées.",
"failed_to_delete_file_or_directory": "Échec de la suppression du fichier ou du répertoire: {path}",
"failed_to_delete_directory": "Échec de la suppression du répertoire: {path}",
"resetting_cursor": "Réinitialisation du curseur AI Editor ... Veuillez patienter.",
"cursor_reset_completed": "Le rédacteur en chef de Cursor AI a été entièrement réinitialisé et la détection d'essai contournée!",
"warning_3": "Vos fichiers de code ne seront pas affectés et l'outil est conçu",
"advanced_tab_retry": "Onglet avancé non trouvé, tentative {tentative} / {max_attempts}",
"advanced_tab_clicked": "Cliquez sur l'onglet avancé",
"completed_in": "Terminé en {temps} secondes",
"delete_button_retry": "Bouton de suppression introuvable, tentative {tentative} / {max_attempts}",
"already_on_settings": "Déjà sur la page des paramètres",
"found_danger_zone": "Section de la zone de danger trouvée",
"failed_to_remove": "Échec de la suppression: {path}",
"failed_to_reset_machine_guid": "Échec de la réinitialisation de la machine Guid",
"deep_scanning": "Effectuer une analyse profonde pour des fichiers d'essai / licence supplémentaires",
"delete_button_clicked": "Cliquez sur le bouton Supprimer le compte",
"warning_7": "Utiliser à vos risques et périls",
"delete_button_not_found": "Supprimer le bouton du compte introuvable après plusieurs tentatives",
"delete_button_error": "Erreur Recherche du bouton de suppression: {Erreur}",
"warning_1": "Cette action supprimera tous les paramètres de Cursor AI,",
"warning_2": "Configurations et données mises en cache. Cette action ne peut pas être annulée.",
"navigating_to_settings": "Navigation vers la page des paramètres ...",
"cursor_reset_cancelled": "Cursor AI Editor réinitialisé annulé. Sortant sans apporter de modifications."
},
"chrome_profile": {
"title": "Sélection du Profil Chrome",
"select_profile": "Sélectionnez un profil Chrome à utiliser :",
"profile_list": "Profils disponibles :",
"default_profile": "Profil par Défaut",
"profile": "Profil {number}",
"no_profiles": "Aucun profil Chrome trouvé",
"error_loading": "Erreur lors du chargement des profils Chrome : {error}",
"profile_selected": "Profil sélectionné : {profile}",
"invalid_selection": "Sélection invalide. Veuillez réessayer",
"warning_chrome_close": "Attention : Cela fermera tous les processus Chrome en cours d'exécution"
},
"restore": {
"title": "Restaurer l'ID de machine depuis une sauvegarde",
"starting": "Démarrage du processus de restauration de l'ID de machine",
"no_backups_found": "Aucune sauvegarde trouvée",
"available_backups": "Sauvegardes disponibles",
"select_backup": "Sélectionnez une sauvegarde à restaurer",
"to_cancel": "pour annuler",
"operation_cancelled": "Opération annulée",
"invalid_selection": "Sélection invalide",
"please_enter_number": "Veuillez entrer un numéro valide",
"missing_id": "ID manquant : {id}",
"read_backup_failed": "Échec de lecture du fichier de sauvegarde : {error}",
"current_file_not_found": "Fichier de stockage actuel introuvable",
"current_backup_created": "Sauvegarde du fichier de stockage actuel créée",
"storage_updated": "Fichier de stockage mis à jour avec succès",
"update_failed": "Échec de la mise à jour du fichier de stockage : {error}",
"sqlite_not_found": "Base de données SQLite introuvable",
"updating_sqlite": "Mise à jour de la base de données SQLite",
"updating_pair": "Mise à jour de la paire clé-valeur",
"sqlite_updated": "Base de données SQLite mise à jour avec succès",
"sqlite_update_failed": "Échec de la mise à jour de la base de données SQLite : {error}",
"machine_id_backup_created": "Sauvegarde du fichier machineId créée",
"backup_creation_failed": "Échec de création de la sauvegarde : {error}",
"machine_id_updated": "Fichier machineId mis à jour avec succès",
"machine_id_update_failed": "Échec de la mise à jour du fichier machineId : {error}",
"updating_system_ids": "Mise à jour des ID système",
"system_ids_update_failed": "Échec de la mise à jour des ID système : {error}",
"permission_denied": "Permission refusée. Veuillez essayer d'exécuter en tant qu'administrateur",
"windows_machine_guid_updated": "GUID de machine Windows mis à jour avec succès",
"update_windows_machine_guid_failed": "Échec de la mise à jour du GUID de machine Windows : {error}",
"windows_machine_id_updated": "ID de machine Windows mis à jour avec succès",
"update_windows_machine_id_failed": "Échec de la mise à jour de l'ID de machine Windows : {error}",
"sqm_client_key_not_found": "Clé de registre SQMClient introuvable",
"update_windows_system_ids_failed": "Échec de la mise à jour des ID système Windows : {error}",
"macos_platform_uuid_updated": "UUID de plateforme macOS mis à jour avec succès",
"failed_to_execute_plutil_command": "Échec d'exécution de la commande plutil",
"update_macos_system_ids_failed": "Échec de la mise à jour des ID système macOS : {error}",
"ids_to_restore": "ID de machine à restaurer",
"confirm": "Êtes-vous sûr de vouloir restaurer ces ID ?",
"success": "ID de machine restauré avec succès",
"process_error": "Erreur du processus de restauration : {error}",
"press_enter": "Appuyez sur Entrée pour continuer"
},
"oauth": {
"no_chrome_profiles_found": "Aucun profil chromé trouvé, en utilisant par défaut",
"failed_to_delete_account": "Échec de la suppression du compte: {error}",
"starting_new_authentication_process": "Démarrer un nouveau processus d'authentification ...",
"found_email": "Email trouvé: {email}",
"github_start": "Github Start",
"already_on_settings_page": "Déjà sur la page des paramètres!",
"starting_github_authentication": "Démarrage de l'authentification GitHub ...",
"status_check_error": "Erreur de vérification de l'état: {erreur}",
"account_is_still_valid": "Le compte est toujours valide (utilisation: {usage})",
"authentication_timeout": "Délai d'authentification",
"usage_count": "Compte d'utilisation: {Utilisation}",
"using_first_available_chrome_profile": "Utilisation du premier profil chrome disponible: {profil}",
"google_start": "Google Start",
"no_compatible_browser_found": "Aucun navigateur compatible trouvé. Veuillez installer Google Chrome ou Chromium.",
"authentication_successful_getting_account_info": "Authentification réussie, obtenir des informations de compte ...",
"found_chrome_at": "Trouvé chrome à: {path}",
"error_getting_user_data_directory": "Erreur d'obtention du répertoire des données utilisateur: {erreur}",
"error_finding_chrome_profile": "Erreur Recherche de profil Chrome, en utilisant la valeur par défaut: {Erreur}",
"auth_update_success": "Auth à jour le succès",
"authentication_successful": "Authentification réussie - Email: {e-mail}",
"authentication_failed": "Échec de l'authentification: {erreur}",
"warning_browser_close": "AVERTISSEMENT: cela fermera tous les processus exécutés {navigateur}",
"supported_browsers": "Navigateurs pris en charge pour {plate-forme}",
"authentication_button_not_found": "Bouton d'authentification introuvable",
"starting_new_google_authentication": "Démarrage de la nouvelle authentification Google ...",
"waiting_for_authentication": "En attente de l'authentification ...",
"found_default_chrome_profile": "Profil chromé par défaut",
"starting_browser": "Département du navigateur à: {Path}",
"could_not_check_usage_count": "Impossible de vérifier le nombre d'utilisation: {error}",
"token_extraction_error": "Erreur d'extraction de jeton: {erreur}",
"profile_selection_error": "Erreur pendant la sélection du profil: {erreur}",
"warning_could_not_kill_existing_browser_processes": "AVERTISSEMENT: Impossible de tuer les processus de navigateur existants: {Erreur}",
"browser_failed_to_start": "Le navigateur n'a pas réussi à démarrer: {error}",
"redirecting_to_authenticator_cursor_sh": "Redirection vers Authenticator.cursor.sh ...",
"starting_re_authentication_process": "Démarrage du processus de réauthentification ...",
"found_browser_data_directory": "Répertoire de données du navigateur trouvé: {path}",
"browser_not_found_trying_chrome": "Impossible de trouver {Browser}, essayant à la place Chrome",
"found_cookies": "Cookies trouvés {count}",
"auth_update_failed": "La mise à jour de l'authentique a échoué",
"browser_failed_to_start_fallback": "Le navigateur n'a pas réussi à démarrer: {error}",
"failed_to_delete_expired_account": "Échec de la suppression du compte expiré",
"navigating_to_authentication_page": "Navigation vers la page d'authentification ...",
"initializing_browser_setup": "Initialisation de la configuration du navigateur ...",
"browser_closed": "Navigateur fermé",
"failed_to_delete_account_or_re_authenticate": "Échec de la suppression du compte ou de la ré-authentification: {error}",
"detected_platform": "Plate-forme détectée: {plate-forme}",
"failed_to_extract_auth_info": "Échec de l'extraction d'informations sur l'authentification: {error}",
"starting_google_authentication": "Démarrage de l'authentification Google ...",
"browser_failed": "Le navigateur n'a pas réussi à démarrer: {error}",
"using_browser_profile": "Utilisation du profil du navigateur: {profil}",
"consider_running_without_sudo": "Envisagez d'exécuter le script sans sudo",
"try_running_without_sudo_admin": "Essayez de fonctionner sans privilèges sudo / administrateur",
"running_as_root_warning": "En fonctionnement comme racine n'est pas recommandé pour l'automatisation du navigateur",
"page_changed_checking_auth": "Page modifiée, vérifiant l'authentique ...",
"please_select_your_google_account_to_continue": "Veuillez sélectionner votre compte Google pour continuer ...",
"browser_setup_failed": "La configuration du navigateur a échoué: {erreur}",
"missing_authentication_data": "Données d'authentification manquantes: {data}",
"using_configured_browser_path": "Utilisation du chemin configuré {Browser}: {path}",
"could_not_find_usage_count": "Impossible de trouver le nombre d'utilisation: {error}",
"killing_browser_processes": "Tuer {Browser} Processus ...",
"account_has_reached_maximum_usage": "Le compte a atteint une utilisation maximale, {Suppression}",
"browser_setup_completed": "Configuration du navigateur terminé avec succès",
"could_not_find_email": "Impossible de trouver un e-mail: {error}",
"user_data_dir_not_found": "{Browser} Répertoire des données utilisateur introuvable sur {path}, essaiera à la place Chrome",
"found_browser_user_data_dir": "Found {Browser} Répertoire des données utilisateur: {path}",
"invalid_authentication_type": "Type d'authentification non valide"
},
"manual_auth": {
"auth_type_selected": "Type d'authentification sélectionné: {type}",
"proceed_prompt": "Procéder? (O / N):",
"auth_type_github": "Github",
"invalid_token": "Jeton non valide. Authentification abandonnée.",
"confirm_prompt": "Veuillez confirmer les informations suivantes:",
"continue_anyway": "Continuer de toute façon? (O / N):",
"token_verified": "Token vérifié avec succès!",
"error": "Erreur: {Erreur}",
"auth_update_failed": "Échec de la mise à jour des informations d'authentification",
"auth_type_prompt": "Sélectionnez le type d'authentification:",
"auth_type_auth0": "Auth_0 (par défaut)",
"verifying_token": "Vérification de la validité des jetons ...",
"auth_updated_successfully": "Informations sur l'authentification mises à jour avec succès!",
"email_prompt": "Entrez le courrier électronique (laissez en blanc pour un e-mail aléatoire):",
"token_prompt": "Entrez votre jeton de curseur (Access_token / Refresh_token):",
"title": "Authentification manuelle du curseur",
"token_verification_skipped": "Vérification des jetons sautés (Check_User_Authorized.py INTORST)",
"random_email_generated": "Email aléatoire généré: {email}",
"token_required": "Le jeton est requis",
"auth_type_google": "Google",
"operation_cancelled": "Opération annulée",
"token_verification_error": "Erreur Vérification du jeton: {Erreur}",
"updating_database": "Mise à jour de la base de données d'authentification du curseur ..."
},
"auth_check": {
"token_length": "Longueur de jeton: {longueur} caractères",
"usage_response_status": "État de la réponse d'utilisation: {réponse}",
"operation_cancelled": "Opération annulée par l'utilisateur",
"error_getting_token_from_db": "Erreur d'obtention de jetons à partir de la base de données: {erreur}",
"checking_usage_information": "Vérification des informations d'utilisation ...",
"usage_response": "Réponse d'utilisation: {réponse}",
"authorization_failed": "L'autorisation a échoué!",
"authorization_successful": "Autorisation réussie!",
"check_error": "Autorisation de vérification des erreurs: {erreur}",
"request_timeout": "Demande de chronométrage",
"connection_error": "Erreur de connexion",
"invalid_token": "Jeton non valide",
"enter_token": "Entrez votre jeton de curseur:",
"check_usage_response": "Vérifiez la réponse à l'utilisation: {réponse}",
"token_found_in_db": "Jeton trouvé dans la base de données",
"user_unauthorized": "L'utilisateur n'est pas autorisé",
"checking_authorization": "Vérification de l'autorisation ...",
"error_generating_checksum": "Erreur générant la somme de contrôle: {error}",
"unexpected_error": "Erreur inattendue: {erreur}",
"token_source": "Obtenir des jetons à partir de la base de données ou des entrées manuellement? (d / m, par défaut: d)",
"user_authorized": "L'utilisateur est autorisé",
"token_not_found_in_db": "Jeton introuvable dans la base de données",
"jwt_token_warning": "Le jeton semble être au format JWT, mais API Check a renvoyé un code d'état inattendu. Le jeton peut être valide mais l'accès à l'API est restreint.",
"unexpected_status_code": "Code d'état inattendu: {code}",
"getting_token_from_db": "Obtenir des jetons de la base de données ...",
"cursor_acc_info_not_found": "cursor_acc_info.py introuvable"
},
"account_delete": {
"delete_input_not_found": "Supprimer l'entrée de confirmation non trouvée après plusieurs tentatives",
"confirm_button_not_found": "Bouton de confirmation introuvable après plusieurs tentatives",
"logging_in": "Connexion avec Google ...",
"confirm_button_error": "Bouton de confirmation de recherche d'erreur: {erreur}",
"delete_button_clicked": "Cliquez sur le bouton Supprimer le compte",
"confirm_prompt": "Êtes-vous sûr de vouloir procéder? (O / N):",
"delete_button_error": "Erreur Recherche du bouton de suppression: {Erreur}",
"cancelled": "Suppression du compte annulé.",
"interrupted": "Processus de suppression du compte interrompu par l'utilisateur.",
"error": "Erreur pendant la suppression du compte: {erreur}",
"delete_input_not_found_continuing": "Supprimer l'entrée de confirmation non trouvée, essayant de continuer de toute façon",
"advanced_tab_retry": "Onglet avancé non trouvé, tentative {tentative} / {max_attempts}",
"waiting_for_auth": "En attendant l'authentification Google ...",
"typed_delete": "Typé \"Supprimer\" dans la boîte de confirmation",
"trying_settings": "Essayer de naviguer vers la page des paramètres ...",
"delete_input_retry": "Supprimer l'entrée introuvable, tentative {tentative} / {max_attempts}",
"email_not_found": "E-mail introuvable: {error}",
"delete_button_not_found": "Supprimer le bouton du compte introuvable après plusieurs tentatives",
"already_on_settings": "Déjà sur la page des paramètres",
"failed": "Le processus de suppression du compte a échoué ou a été annulé.",
"warning": "AVERTISSEMENT: Cela supprimera en permanence votre compte de curseur. Cette action ne peut pas être annulée.",
"direct_advanced_navigation": "Essayer la navigation directe vers l'onglet avancé",
"advanced_tab_not_found": "Onglet avancé non trouvé après plusieurs tentatives",
"auth_timeout": "Timeout d'authentification, continuant de toute façon ...",
"select_google_account": "Veuillez sélectionner votre compte Google ...",
"google_button_not_found": "Bouton de connexion Google introuvable",
"found_danger_zone": "Section de la zone de danger trouvée",
"account_deleted": "Compte supprimé avec succès!",
"starting_process": "Processus de suppression du compte de départ ...",
"advanced_tab_error": "Erreur Recherche d'onglet Avancé: {Erreur}",
"delete_button_retry": "Bouton de suppression introuvable, tentative {tentative} / {max_attempts}",
"login_redirect_failed": "La redirection de connexion a échoué, essayant la navigation directe ...",
"unexpected_error": "Erreur inattendue: {erreur}",
"login_successful": "Connectez-vous à succès",
"delete_input_error": "Erreur Rechercher la suppression de l'entrée: {erreur}",
"advanced_tab_clicked": "Cliquez sur l'onglet avancé",
"unexpected_page": "Page inattendue après la connexion: {URL}",
"found_email": "Email trouvé: {email}",
"title": "Outil de suppression du compte Google Cursor Google",
"navigating_to_settings": "Navigation vers la page des paramètres ...",
"success": "Votre compte Cursor a été supprimé avec succès!",
"confirm_button_retry": "Bouton de confirmation introuvable, tentative {tentative} / {max_attempts}"
},
"token": {
"refreshing": "Jeton rafraîchissant ...",
"extraction_error": "Erreur Extraction de jeton: {Erreur}",
"invalid_response": "Réponse JSON non valide du serveur de rafraîchissement",
"no_access_token": "Pas de jeton d'accès en réponse",
"connection_error": "Erreur de connexion pour actualiser le serveur",
"unexpected_error": "Erreur inattendue lors de la rafraîchissement du jeton: {erreur}",
"server_error": "Erreur de serveur de refrex: http {status}",
"refresh_success": "Jeton actualisé avec succès! VALIDE pour {jours} jours (expire: {expire})",
"request_timeout": "Demande de refrex sur le serveur",
"refresh_failed": "Un rafraîchissement du jeton a échoué: {error}"
},
"browser_profile": {
"profile_selected": "Profil sélectionné: {Profil}",
"default_profile": "Profil par défaut",
"no_profiles": "Non {Browser} Profils trouvés",
"select_profile": "Sélectionnez le profil {Browser} à utiliser:",
"error_loading": "Erreur Chargement {Browser} Profils: {Erreur}",
"invalid_selection": "Sélection non valide. Veuillez réessayer.",
"title": "Sélection de profil de navigateur",
"profile": "Profil {numéro}",
"profile_list": "Profils {Browser} disponibles:"
},
"github_register": {
"feature2": "Enregistre un nouveau compte GitHub avec des informations d'identification aléatoires.",
"feature6": "Enregistre toutes les informations d'identification dans un fichier.",
"starting_automation": "Automatisation de départ ...",
"feature1": "Génère un e-mail temporaire en utilisant 1secmail.",
"title": "GitHub + Cursor AI Enregistrement Automatisation",
"github_username": "Nom d'utilisateur github",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Vérifiez les fenêtres du navigateur pour une intervention manuelle ou réessayer plus tard.",
"warning1": "Ce script automatise la création de compte, qui peut violer les conditions d'utilisation GitHub / Cursor.",
"feature4": "Se connecte à Cursor AI à l'aide de l'authentification GitHub.",
"invalid_choice": "Choix non valide. Veuillez saisir «oui» ou «non»",
"completed_successfully": "L'enregistrement GitHub + Cursor s'est terminé avec succès!",
"warning2": "Nécessite l'accès à Internet et les privilèges administratifs.",
"registration_encountered_issues": "L'enregistrement GitHub + Cursor a rencontré des problèmes.",
"credentials_saved": "Ces informations d'identification ont été enregistrées sur github_cursor_accounts.txt",
"feature3": "Vérifie automatiquement l'e-mail GitHub.",
"github_password": "Mot de passe github",
"features_header": "Caractéristiques",
"feature5": "Réinitialise l'ID de la machine pour contourner la détection des essais.",
"warning4": "Utilisez de manière responsable et à vos risques et périls.",
"warning3": "Capcha ou vérification supplémentaire peut interrompre l'automatisation.",
"cancelled": "Opération annulée",
"warnings_header": "Avertissements",
"program_terminated": "Programme terminé par l'utilisateur",
"confirm": "Êtes-vous sûr de vouloir procéder?",
"email_address": "Adresse email"
},
"account_info": {
"subscription": "Abonnement",
"failed_to_get_account_info": "Échec de l'obtention des informations de compte",
"subscription_type": "Type d'abonnement",
"pro": "Pro",
"failed_to_get_account": "Échec de l'obtention des informations de compte",
"config_not_found": "Configuration introuvable.",
"premium_usage": "Utilisation premium",
"failed_to_get_subscription": "Échec de l'obtention d'informations d'abonnement",
"basic_usage": "Utilisation de base",
"premium": "Prime",
"free": "Gratuit",
"email_not_found": "E-mail introuvable",
"title": "Informations sur le compte",
"inactive": "Inactif",
"remaining_trial": "Essai restant",
"enterprise": "Entreprise",
"lifetime_access_enabled": "Accès à vie activé",
"usage_not_found": "Utilisation introuvable",
"failed_to_get_usage": "Échec de l'obtention des informations d'utilisation",
"days_remaining": "Jours restants",
"failed_to_get_token": "Échec du jeton",
"token": "Jeton",
"subscription_not_found": "Informations sur l'abonnement introuvables",
"days": "jours",
"team": "Équipe",
"token_not_found": "Jeton introuvable",
"active": "Actif",
"email": "E-mail",
"pro_trial": "Procès professionnel",
"failed_to_get_email": "Échec de l'adresse e-mail",
"trial_remaining": "Essai professionnel restant",
"usage": "Usage"
},
"config": {
"configuration": "Configuration",
"config_updated": "Configuration mise à jour",
"file_owner": "Propriétaire de fichier: {propriétaire}",
"error_checking_linux_paths": "Erreur Vérification des chemins Linux: {Erreur}",
"storage_file_is_empty": "Le fichier de stockage est vide: {Storage_Path}",
"config_directory": "Répertoire de configuration",
"documents_path_not_found": "Documents Path introuvable, en utilisant le répertoire actuel",
"config_not_available": "Configuration non disponible",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Veuillez vous assurer que le curseur est installé et a été exécuté au moins une fois",
"neither_cursor_nor_cursor_directory_found": "Ni le répertoire du curseur ni du curseur trouvé dans {config_base}",
"config_created": "Configré créé: {config_file}",
"using_temp_dir": "Utilisation du répertoire temporaire en raison de l'erreur: {path} (erreur: {erreur})",
"storage_file_not_found": "Fichier de stockage introuvable: {Storage_Path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "Le fichier peut être corrompu, veuillez réinstaller le curseur",
"error_getting_file_stats": "Erreur d'obtention des statistiques de fichiers: {erreur}",
"enabled": "Activé",
"backup_created": "Sauvegarde créée: {Path}",
"file_permissions": "Autorisations de fichiers: {autorisations}",
"config_setup_error": "Configuration de la configuration d'erreur: {erreur}",
"config_force_update_enabled": "Config File Force Update activé, effectuer une mise à jour forcée",
"config_removed": "Fichier de configuration supprimé pour la mise à jour forcée",
"file_size": "Taille du fichier: {taille} octets",
"error_reading_storage_file": "Erreur de lecture du fichier de stockage: {erreur}",
"config_force_update_disabled": "Config File Force Update désactivé, saut à la mise à jour forcée",
"config_dir_created": "Répertoire de configuration créé: {path}",
"config_option_added": "Option de configuration ajoutée: {Option}",
"file_group": "Groupe de fichiers: {groupe}",
"and": "Et",
"backup_failed": "Impossible de sauvegarder la configuration: {error}",
"force_update_failed": "Force la configuration de mise à jour défaillante: {error}",
"storage_directory_not_found": "Répertoire de stockage introuvable: {Storage_dir}",
"also_checked": "Également vérifié {path}",
"disabled": "Désactivé",
"storage_file_found": "Fichier de stockage trouvé: {Storage_Path}",
"try_running": "Essayez de courir: {Commande}",
"storage_file_is_valid_and_contains_data": "Le fichier de stockage est valide et contient des données",
"permission_denied": "Permission refusée: {Storage_Path}"
},
"bypass": {
"found_product_json": "Trouvé produit.json: {path}",
"starting": "Démarrage de la version du curseur Tytrass ...",
"version_updated": "Version mise à jour de {old} à {new}",
"menu_option": "Contourner la version de la version du curseur",
"unsupported_os": "Système d'exploitation non pris en charge: {Système}",
"backup_created": "Sauvegarde créée: {Path}",
"current_version": "Version actuelle: {version}",
"localappdata_not_found": "Variable d'environnement localappdata introuvable",
"no_write_permission": "Aucune autorisation d'écriture pour le fichier: {path}",
"write_failed": "Échec de l'écriture de produit.json: {error}",
"description": "Cet outil modifie le produit de Cursor.json pour contourner les restrictions de version",
"bypass_failed": "Version Bypass a échoué: {Erreur}",
"title": "Outil de contournement de la version du curseur",
"no_update_needed": "Aucune mise à jour nécessaire. La version actuelle {version} est déjà> = 0,46.0",
"read_failed": "Échec de la lecture de Product.json: {error}",
"stack_trace": "Trace de pile",
"product_json_not_found": "product.json introuvable dans les chemins linux communs",
"file_not_found": "Fichier introuvable: {Path}"
},
"bypass_token_limit": {
"description": "Cet outil modifie le fichier workbench.desktop.main.js pour contourner la limite de jeton",
"press_enter": "Appuyez sur Entrée pour continuer ...",
"title": "Outil de limite de jeton de contournement"
},
"tempmail": {
"no_email": "Aucun e-mail de vérification du curseur trouvé",
"general_error": "Une erreur s'est produite: {erreur}",
"config_error": "Erreur de fichier de configuration: {erreur}",
"configured_email": "Email configuré: {e-mail}",
"extract_code_failed": "Extraire le code de vérification a échoué: {error}",
"checking_email": "Vérification du courrier électronique de vérification du curseur ...",
"email_found": "Email de vérification du curseur trouvé",
"no_code": "Impossible d'obtenir le code de vérification",
"check_email_failed": "Vérifier l'échec de l'e-mail: {Erreur}",
"verification_code": "Code de vérification: {code}"
}
}

866
locales/it.json Normal file
View File

@ -0,0 +1,866 @@
{
"menu": {
"title": "Opzioni Disponibili",
"exit": "Esci dal Programma",
"reset": "Reimposta ID Macchina",
"register": "Registra Nuovo Account Cursor",
"register_google": "Registrati con il Tuo Account Google",
"register_github": "Registrati con il Tuo Account GitHub",
"register_manual": "Registra Cursor con Email Personalizzata",
"quit": "Chiudi Applicazione Cursor",
"select_language": "Cambia Lingua",
"select_chrome_profile": "Seleziona Profilo Chrome",
"input_choice": "Inserisci la tua scelta ({choices})",
"invalid_choice": "Selezione non valida. Inserisci un numero da {choices}",
"program_terminated": "Programma terminato dall'utente",
"error_occurred": "Si è verificato un errore: {error}. Riprova",
"press_enter": "Premi Invio per Uscire",
"disable_auto_update": "Disabilita Aggiornamento Automatico di Cursor",
"lifetime_access_enabled": "ACCESSO A VITA ABILITATO",
"totally_reset": "Reimposta Completamente Cursor",
"outdate": "Obsoleto",
"temp_github_register": "Registrazione GitHub Temporanea",
"admin_required": "Esecuzione come file eseguibile, richiesti privilegi di amministratore.",
"admin_required_continue": "Continua senza privilegi di amministratore.",
"coming_soon": "Prossimamente",
"fixed_soon": "Corretto Presto",
"contribute": "Contribuisci al Progetto",
"config": "Mostra Configurazione",
"delete_google_account": "Elimina Account Google di Cursor",
"continue_prompt": "Continuare? (y/N): ",
"operation_cancelled_by_user": "Operazione annullata dall'utente",
"exiting": "Uscita in corso...",
"bypass_version_check": "Ignora Controllo Versione Cursor",
"check_user_authorized": "Verifica Autorizzazione Utente",
"bypass_token_limit": "Ignora Limite Token",
"language_config_saved": "Configurazione lingua salvata con successo",
"lang_invalid_choice": "Scelta non valida. Inserisci una delle seguenti opzioni: ({lang_choices})",
"restore_machine_id": "Ripristina ID Macchina dal Backup",
"manual_custom_auth": "Auth personalizzato manuale"
},
"languages": {
"ar": "Arabo",
"en": "Inglese",
"zh_cn": "Cinese Semplificato",
"zh_tw": "Cinese Tradizionale",
"vi": "Vietnamita",
"nl": "Olandese",
"de": "Tedesco",
"fr": "Francese",
"pt": "Portoghese",
"ru": "Russo",
"tr": "Turco",
"bg": "Bulgaro",
"es": "Spagnolo",
"ja": "Giapponese",
"it": "Italiano"
},
"totally_reset": {
"warning_title": "AVVERTIMENTO",
"delete_input_error": "Errore Trovare Elimina Input: {Errore}",
"direct_advanced_navigation": "Provare la navigazione diretta alla scheda avanzata",
"delete_input_not_found_continuing": "Elimina l'input di conferma non trovato, cercando di continuare comunque",
"advanced_tab_not_found": "Scheda avanzata non trovata dopo più tentativi",
"feature_title": "CARATTERISTICHE",
"advanced_tab_error": "Errore Trovare la scheda avanzata: {errore}",
"disclaimer_title": "DISCLAIMER",
"delete_input_not_found": "Elimina l'input di conferma non trovato dopo più tentativi",
"disclaimer_6": "Dovrai impostare nuovamente l'intelligenza artificiale del cursore dopo aver eseguito questo strumento.",
"note_complete_machine_id_reset_may_require_running_as_administrator": "Nota: il ripristino ID completo della macchina potrebbe richiedere l'esecuzione come amministratore",
"failed_to_delete_file": "Impossibile eliminare il file: {Path}",
"no_permission": "Impossibile leggere o scrivere il file di configurazione, controlla le autorizzazioni del file",
"operation_cancelled": "Operazione annullata. Uscire senza apportare modifiche.",
"backup_exists": "Il file di backup esiste già, saltando il passaggio di backup",
"windows_registry_instructions_2": "Esegui \"regedit\" e cerca chiavi contenenti \"cursore\" o \"cursori\" sotto hkey_current_user \\ software \\ ed eliminali.",
"database_updated_successfully": "Database aggiornato correttamente",
"removed": "Rimosso: {Path}",
"warning_6": "Dovrai impostare nuovamente l'intelligenza artificiale del cursore dopo aver eseguito questo strumento.",
"delete_input_retry": "Elimina input non trovato, tentativo {tentativo}/{max_attempts}",
"disclaimer_3": "I file di codice non saranno interessati e lo strumento è progettato",
"removing_electron_localstorage_files": "Rimozione di file di stivalezione elettronica elettronica",
"creating_backup": "Creazione di backup di configurazione",
"reset_cancelled": "Ripristina cancellato. Uscire senza apportare modifiche.",
"resetting_machine_id": "Ripristina gli identificatori della macchina per bypassare il rilevamento della prova ...",
"error_searching": "Errore di ricerca per file in {Path}: {Errore}",
"keyboard_interrupt": "Processo interrotto dall'utente. Uscita ...",
"cursor_reset_failed": "Reset dell'editor AI del cursore non riuscito: {errore}",
"warning_4": "Per target solo i file dell'editor AI del cursore e i meccanismi di rilevamento delle prove.",
"skipped_for_safety": "Salta per sicurezza (non correlato al cursore): {Path}",
"checking_config": "Controllo del file di configurazione",
"feature_3": "Ripristina l'ID macchina per bypassare il rilevamento della prova",
"removing_electron_localstorage_files_completed": "Electron LocalStorage Files Rimozione completata",
"confirm_3": "I file di codice non saranno interessati e lo strumento è progettato",
"reset_log_9": "Se riscontri problemi, vai a GitHub Essument Tracker e crea un problema su https://github.com/yeongpin/cursor-free-vip/issues",
"disclaimer_2": "configurazioni e dati memorizzati nella cache. Questa azione non può essere annullata.",
"press_enter_to_return_to_main_menu": "Premere Invio per tornare al menu principale ...",
"login_redirect_failed": "Reindirizzamento di accesso non riuscito, provando la navigazione diretta ...",
"feature_7": "Scansione profonda per licenza nascosta e file relativi alla prova",
"linux_machine_id_modification_skipped": "Modifica della macchina Linux-ID saltata: {errore}",
"warning_5": "Altre applicazioni sul sistema non saranno interessate.",
"reading_config": "Leggendo la configurazione corrente",
"feature_6": "Ripristina le informazioni di prova e i dati di attivazione",
"reset_log_1": "Il cursore AI è stato completamente ripristinato e il rilevamento delle prove bypassato!",
"failed_to_delete_file_or_directory": "Impossibile eliminare file o directory: {Path}",
"connected_to_database": "Connesso al database",
"removing_known": "Rimozione di file di prova/licenza noti",
"return_to_main_menu": "Tornando al menu principale ...",
"found_additional_potential_license_trial_files": "Trovato {Conte} File di licenza/prova potenziali aggiuntivi",
"failed_to_delete_directory": "Impossibile eliminare la directory: {Path}",
"feature_9": "Compatibile con Windows, MacOS e Linux",
"resetting_cursor": "Ripristino dell'editor AI del cursore ... Attendi.",
"confirm_1": "Questa azione eliminerà tutte le impostazioni dell'intelligenza artificiale del cursore,",
"cursor_reset_completed": "L'editor AI Cursore è stato completamente ripristinato e il rilevamento di prove bypassato!",
"warning_3": "I file di codice non saranno interessati e lo strumento è progettato",
"advanced_tab_retry": "Scheda avanzata non trovata, tentativo {tentativo}/{max_attempts}",
"report_issue": "Si prega di segnalare questo problema a GitHub Issue Tracker all'indirizzo https://github.com/yeongpin/cursor-free-vip/issues",
"resetting_cursor_ai_editor": "Ripristino dell'editor AI del cursore ... Attendi.",
"electron_localstorage_files_removed": "I file di Electron LocalStorage rimossi",
"completed_in": "Completato in {time} secondi",
"reset_log_6": "Se disponibile, utilizzare una VPN per modificare il tuo indirizzo IP",
"advanced_tab_clicked": "Fare clic sulla scheda Advanced",
"delete_button_retry": "Pulsante Elimina non trovato, tentativo {tentativo}/{max_attempts}",
"already_on_settings": "Già sulla pagina delle impostazioni",
"created_machine_id": "Creato nuovo ID macchina: {Path}",
"reset_log_7": "Cancella i cookie e la cache del browser prima di visitare il sito Web del cursore AI",
"found_danger_zone": "Sezione di zona di pericolo trovata",
"db_not_found": "File di database non trovato su: {Path}",
"success": "Il cursore si ripristina correttamente",
"config_not_found": "File di configurazione non trovato",
"failed_to_remove": "Impossibile rimuovere: {Path}",
"performing_deep_scan": "Esecuzione di una scansione profonda per ulteriori file di prova/licenza",
"error_deleting": "Errore Eliminazione {Path}: {Errore}",
"disclaimer_1": "Questo strumento eliminerà permanentemente tutte le impostazioni dell'intelligenza artificiale del cursore,",
"reset_machine_id": "Ripristina ID macchina",
"disclaimer_4": "Per target solo i file dell'editor AI del cursore e i meccanismi di rilevamento delle prove.",
"disclaimer_7": "Usa a proprio rischio",
"windows_machine_id_modification_skipped": "Modifica ID macchina Windows Skipped: {Errore}",
"db_connection_error": "Impossibile connettersi al database: {errore}",
"reset_log_2": "Si prega di riavviare il sistema per le modifiche per avere effetto.",
"feature_2": "Cancella tutti i dati memorizzati nella cache, tra cui cronologia e istruzioni",
"windows_registry_instructions": "📝 Nota: per il ripristino completo su Windows, potrebbe anche essere necessario pulire le voci di registro.",
"feature_5": "Rimuove estensioni e preferenze personalizzate",
"updating_pair": "Aggiornamento della coppia di valore chiave",
"feature_4": "Crea nuovi identificatori di macchine randomizzate",
"reset_log_3": "Dovrai reinstallare l'intelligenza artificiale del cursore e ora dovresti avere un nuovo periodo di prova.",
"failed_to_reset_machine_guid": "Impossibile reimpostare Guid della macchina",
"deleted": "Eliminato: {Path}",
"error": "Il ripristino del cursore non riuscito: {errore}",
"created_extended_trial_info": "Creato nuove informazioni di prova estesa: {Path}",
"deep_scanning": "Esecuzione di una scansione profonda per ulteriori file di prova/licenza",
"delete_button_clicked": "Clicato sul pulsante Account Elimina",
"db_permission_error": "Impossibile accedere al file di database. Si prega di controllare le autorizzazioni",
"title": "Ripristina totalmente il cursore",
"no_additional_license_trial_files_found_in_deep_scan": "Nessun file di licenza/tentativi aggiuntivi trovati nella scansione profonda",
"process_interrupted": "Processo interrotto. Uscita ...",
"electron_localstorage_files_removal_error": "Errore Rimozione dei file di Electron LocalStorage: {Errore}",
"checking_for_electron_localstorage_files": "Controlla i file di Electron LocalStorage",
"reset_log_8": "Se i problemi persistono, prova a installare AI del cursore in una posizione diversa",
"warning_7": "Usa a proprio rischio",
"reset_log_5": "Utilizzare un indirizzo email diverso quando si registra per una nuova prova",
"press_enter": "Premere Invio per uscire",
"disclaimer_5": "Altre applicazioni sul sistema non saranno interessate.",
"generating_new_machine_id": "Generazione di un nuovo ID macchina",
"feature_1": "Rimozione completa delle impostazioni e delle configurazioni del cursore AI",
"error_creating_trial_info": "Errore creazione del file di informazioni di prova {path}: {errore}",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "Nota: il ripristino ID macchina completo di sistema può richiedere privilegi sudo",
"delete_button_not_found": "Elimina il pulsante dell'account non trovato dopo più tentativi",
"reset_log_4": "Per i migliori risultati, considera anche:",
"delete_button_error": "Errore Trovare il pulsante Elimina: {errore}",
"confirm_7": "Usa a proprio rischio",
"confirm_2": "configurazioni e dati memorizzati nella cache. Questa azione non può essere annullata.",
"unexpected_error": "Si è verificato un errore imprevisto: {errore}",
"feature_8": "Preserva in modo sicuro file e applicazioni non corsorio",
"confirm_title": "Sei sicuro di voler procedere?",
"saving_new_config": "Salvare la nuova configurazione su JSON",
"not_found": "File non trovato: {path}",
"warning_1": "Questa azione eliminerà tutte le impostazioni dell'intelligenza artificiale del cursore,",
"warning_2": "configurazioni e dati memorizzati nella cache. Questa azione non può essere annullata.",
"error_creating_machine_id": "Errore creazione del file ID macchina {Path}: {Errore}",
"confirm_4": "Per target solo i file dell'editor AI del cursore e i meccanismi di rilevamento delle prove.",
"confirm_5": "Altre applicazioni sul sistema non saranno interessate.",
"database_connection_closed": "Connessione del database chiuso",
"confirm_6": "Dovrai impostare nuovamente l'intelligenza artificiale del cursore dopo aver eseguito questo strumento.",
"navigating_to_settings": "Navigazione alla pagina delle impostazioni ...",
"invalid_choice": "Inserisci 'y' o 'n'",
"cursor_reset_cancelled": "Cursore Editor AI reset cancellato. Uscire senza apportare modifiche."
},
"oauth": {
"no_chrome_profiles_found": "Nessun profilo Chrome trovato, usando il valore predefinito",
"starting_new_authentication_process": "Avvio di un nuovo processo di autenticazione ...",
"failed_to_delete_account": "Impossibile eliminare l'account: {errore}",
"found_email": "Email trovata: {email}",
"github_start": "Github inizia",
"already_on_settings_page": "Già sulla pagina delle impostazioni!",
"starting_github_authentication": "Autenticazione GitHub iniziale ...",
"status_check_error": "Errore di controllo dello stato: {errore}",
"account_is_still_valid": "L'account è ancora valido (Utilizzo: {Utilizzo})",
"authentication_timeout": "Timeout di autenticazione",
"using_first_available_chrome_profile": "Utilizzando il primo profilo Chrome disponibile: {profilo}",
"google_start": "Google Start",
"usage_count": "Conteggio di utilizzo: {utilizzo}",
"no_compatible_browser_found": "Nessun browser compatibile trovato. Si prega di installare Google Chrome o Chromium.",
"authentication_successful_getting_account_info": "Autenticazione riuscita, ottenendo informazioni sull'account ...",
"found_chrome_at": "Trovato Chrome a: {Path}",
"error_getting_user_data_directory": "Errore per ottenere la directory dei dati dell'utente: {errore}",
"error_finding_chrome_profile": "Errore Trovare il profilo Chrome, usando impostazione predefinita: {errore}",
"auth_update_success": "AUTTH AGGIORNAMENTO SUCCESSO",
"authentication_successful": "Autenticazione riuscita - email: {email}",
"authentication_failed": "Autenticazione non riuscita: {errore}",
"warning_browser_close": "Avvertenza: questo chiuderà tutti i processi in esecuzione {browser}",
"supported_browsers": "Browser supportati per {piattaforma}",
"authentication_button_not_found": "Pulsante di autenticazione non trovato",
"starting_new_google_authentication": "Avvio di una nuova autenticazione di Google ...",
"waiting_for_authentication": "Aspettando l'autenticazione ...",
"found_default_chrome_profile": "Trovato Profilo Chrome predefinito",
"starting_browser": "Browser iniziale su: {path}",
"token_extraction_error": "Errore di estrazione token: {errore}",
"could_not_check_usage_count": "Impossibile controllare il conteggio dell'utilizzo: {errore}",
"profile_selection_error": "Errore durante la selezione del profilo: {errore}",
"warning_could_not_kill_existing_browser_processes": "ATTENZIONE: Impossibile uccidere i processi del browser esistenti: {errore}",
"browser_failed_to_start": "Il browser non è stato avviato: {errore}",
"redirecting_to_authenticator_cursor_sh": "Reindirizzamento ad Authenticator.cursor.sh ...",
"starting_re_authentication_process": "Avvio del processo di re-autenticazione ...",
"found_browser_data_directory": "Directory dei dati del browser trovata: {Path}",
"browser_not_found_trying_chrome": "Impossibile trovare {browser}, provando invece Chrome",
"found_cookies": "Trovati {Count} Cookies",
"auth_update_failed": "Aggiornamento dell'autenticazione non riuscita",
"browser_failed_to_start_fallback": "Il browser non è stato avviato: {errore}",
"failed_to_delete_expired_account": "Impossibile eliminare il conto scaduto",
"navigating_to_authentication_page": "Navigazione alla pagina di autenticazione ...",
"initializing_browser_setup": "Inizializzazione della configurazione del browser ...",
"browser_closed": "Browser chiuso",
"failed_to_delete_account_or_re_authenticate": "Impossibile eliminare l'account o ri-autenticato: {errore}",
"detected_platform": "Piattaforma rilevata: {piattaforma}",
"failed_to_extract_auth_info": "Impossibile estrarre le informazioni di autenticazione: {errore}",
"starting_google_authentication": "Avvio dell'autenticazione di Google ...",
"browser_failed": "Il browser non è stato avviato: {errore}",
"using_browser_profile": "Utilizzando il profilo del browser: {profilo}",
"consider_running_without_sudo": "Considera l'esecuzione dello script senza sudo",
"try_running_without_sudo_admin": "Prova a correre senza privilegi sudo/amministratore",
"page_changed_checking_auth": "Pagina cambiata, controllando l'auth ...",
"running_as_root_warning": "L'esecuzione come root non è consigliato per l'automazione del browser",
"please_select_your_google_account_to_continue": "Seleziona il tuo account Google per continuare ...",
"browser_setup_failed": "Impostazione del browser non riuscita: {errore}",
"missing_authentication_data": "Dati di autenticazione mancanti: {data}",
"using_configured_browser_path": "Utilizzando il percorso configurato {browser}: {path}",
"killing_browser_processes": "Uccidere {browser} processi ...",
"could_not_find_usage_count": "Impossibile trovare il conteggio degli utili: {errore}",
"browser_setup_completed": "Configurazione del browser completato correttamente",
"account_has_reached_maximum_usage": "L'account ha raggiunto il massimo utilizzo, {eliminazione}",
"could_not_find_email": "Impossibile trovare e -mail: {errore}",
"user_data_dir_not_found": "{browser} Directory di dati utente non trovata su {Path}, proverà invece Chrome",
"found_browser_user_data_dir": "Trovato {browser} directory dei dati utente: {Path}",
"invalid_authentication_type": "Tipo di autenticazione non valido"
},
"manual_auth": {
"auth_type_selected": "Tipo di autenticazione selezionato: {type}",
"proceed_prompt": "Procedere? (y/n):",
"auth_type_github": "Github",
"confirm_prompt": "Si prega di confermare le seguenti informazioni:",
"invalid_token": "Token non valido. L'autenticazione ha interrotto.",
"continue_anyway": "Continua comunque? (y/n):",
"token_verified": "Token ha verificato con successo!",
"error": "Errore: {errore}",
"auth_update_failed": "Impossibile aggiornare le informazioni di autenticazione",
"auth_type_prompt": "Seleziona Tipo di autenticazione:",
"auth_type_auth0": "Auth_0 (impostazione predefinita)",
"verifying_token": "Verificare la validità del segno ...",
"auth_updated_successfully": "Informazioni di autenticazione aggiornate con successo!",
"email_prompt": "Inserisci e -mail (lascia vuoto per e -mail casuale):",
"token_prompt": "Inserisci il token del cursore (Access_Token/Refrigera_Token):",
"title": "Autenticazione del cursore manuale",
"token_verification_skipped": "Verifica token Skipped (check_user_authorized.py non trovato)",
"random_email_generated": "Email casuale generata: {email}",
"token_required": "È richiesto il token",
"auth_type_google": "Google",
"operation_cancelled": "Operazione annullata",
"token_verification_error": "Errore Verifica del token: {errore}",
"updating_database": "Aggiornamento del database di autenticazione del cursore ..."
},
"reset": {
"version_parse_error": "Errore di analisi della versione: {errore}",
"sqlite_error": "Aggiornamento del database SQLite non riuscito: {errore}",
"patch_failed": "Patching getmachineid non riuscito: {errore}",
"version_too_low": "Versione del cursore troppo basso: {versione} <0.45.0",
"backup_exists": "Il file di backup esiste già, saltando il passaggio di backup",
"update_success": "Aggiorna il successo",
"update_windows_machine_id_failed": "Aggiorna ID macchina Windows non riuscito: {errore}",
"sqlite_success": "Database SQLite aggiornato correttamente",
"check_version_failed": "Controlla la versione non riuscita: {errore}",
"updating_pair": "Aggiornamento della coppia di valore chiave",
"windows_machine_guid_updated": "Windows Machine GUID aggiornato correttamente",
"file_modified": "File modificato",
"found_version": "Versione trovata: {versione}",
"start_patching": "Iniziare a patching getmachineid",
"updating_sqlite": "Aggiornamento del database SQLite",
"backup_created": "Backup creato",
"invalid_json_object": "Oggetto JSON non valido",
"detecting_version": "Rilevamento della versione del cursore",
"update_failed": "Aggiornamento non riuscito: {errore}",
"version_field_empty": "Il campo versione è vuoto",
"run_as_admin": "Prova a eseguire questo programma come amministratore",
"windows_permission_denied": "Autorizzazione di Windows Negata",
"saving_json": "Salvare la nuova configurazione su JSON",
"linux_path_not_found": "Percorso Linux non trovato",
"invalid_version_format": "Formato versione non valida: {versione}",
"path_not_found": "Percorso non trovato: {path}",
"windows_machine_id_updated": "ID macchina Windows Aggiornato correttamente",
"creating_backup": "Creazione di backup di configurazione",
"stack_trace": "Traccia dello stack",
"no_version_field": "Nessun campo versione trovato in pack.json",
"title": "Strumento di ripristino ID macchina cursore",
"system_ids_update_failed": "Aggiornamento IDS di sistema non riuscito: {errore}",
"plutil_command_failed": "comando plutil non riuscito",
"version_check_passed": "Controllo della versione del cursore Passato",
"updating_system_ids": "Aggiornamento degli ID di sistema",
"unsupported_os": "OS non supportato: {OS}",
"macos_uuid_update_failed": "Aggiornamento UUID macos non riuscito",
"windows_guid_updated": "Windows GUID aggiornato correttamente",
"windows_guid_update_failed": "Aggiornamento di Windows GUID non riuscito",
"no_permission": "Impossibile leggere o scrivere il file di configurazione, controlla le autorizzazioni del file",
"package_not_found": "Pacchetto.json non trovato: {path}",
"not_found": "File di configurazione non trovato",
"update_windows_machine_guid_failed": "Aggiorna Windows Machine GUID non riuscito: {errore}",
"system_ids_updated": "ID di sistema aggiornati correttamente",
"patch_completed": "Patching getmachineid completato",
"no_write_permission": "Nessuna autorizzazione di scrittura: {Path}",
"current_version": "Versione del cursore corrente: {versione}",
"patching_getmachineid": "Patching getmachineid",
"reading_package_json": "Lettura pacchetto.json {Path}",
"permission_error": "Errore di autorizzazione: {errore}",
"generating": "Generazione di un nuovo ID macchina",
"macos_uuid_updated": "macos uuid aggiornato correttamente",
"new_id": "Nuovo ID macchina",
"reading": "Leggendo la configurazione corrente",
"permission_denied": "Autorizzazione negata: {errore}",
"version_greater_than_0_45": "Versione del cursore> = 0.45.0, patching getmachineid",
"checking": "Controllo del file di configurazione",
"success": "ID macchina ripristina correttamente",
"press_enter": "Premere Invio per uscire",
"process_error": "Errore di processo di ripristino: {errore}",
"file_not_found": "File non trovato: {path}",
"version_less_than_0_45": "Versione del cursore <0,45,0, salta patching getmachineid",
"modify_file_failed": "Modifica il file non riuscito: {errore}"
},
"auth_check": {
"token_length": "Lunghezza token: {lunghezza} caratteri",
"usage_response_status": "Stato di risposta di utilizzo: {risposta}",
"operation_cancelled": "Operazione annullata dall'utente",
"error_getting_token_from_db": "Errore per ottenere token dal database: {errore}",
"checking_usage_information": "Controllo delle informazioni sull'utilizzo ...",
"usage_response": "Risposta di utilizzo: {risposta}",
"authorization_failed": "L'autorizzazione è fallita!",
"authorization_successful": "Autorizzazione di successo!",
"check_error": "Autorizzazione del controllo degli errori: {errore}",
"request_timeout": "Richiesta scaduta",
"connection_error": "Errore di connessione",
"invalid_token": "Token non valido",
"check_usage_response": "Controlla l'utilizzo di risposta: {risposta}",
"enter_token": "Inserisci il token del cursore:",
"user_unauthorized": "L'utente non è autorizzato",
"token_found_in_db": "Token trovato nel database",
"checking_authorization": "Controllo dell'autorizzazione ...",
"error_generating_checksum": "Errore che genera checksum: {errore}",
"token_source": "Ottieni il token dal database o dall'input manualmente? (d/m, impostazione predefinita: d)",
"unexpected_error": "Errore imprevisto: {errore}",
"user_authorized": "L'utente è autorizzato",
"token_not_found_in_db": "Token non trovato nel database",
"jwt_token_warning": "Il token sembra essere in formato JWT, ma il controllo API ha restituito un codice di stato imprevisto. Il token potrebbe essere valido ma l'accesso API è limitato.",
"unexpected_status_code": "Codice di stato imprevisto: {codice}",
"getting_token_from_db": "Ottenere il token dal database ...",
"cursor_acc_info_not_found": "CURSOR_ACC_INFO.PY non trovato"
},
"account_delete": {
"delete_input_not_found": "Elimina l'input di conferma non trovato dopo più tentativi",
"logging_in": "Accesso con Google ...",
"confirm_button_not_found": "Conferma il pulsante non trovato dopo più tentativi",
"confirm_button_error": "Errore Trovare il pulsante di conferma: {errore}",
"delete_button_clicked": "Clicato sul pulsante Account Elimina",
"confirm_prompt": "Sei sicuro di voler procedere? (y/n):",
"delete_button_error": "Errore Trovare il pulsante Elimina: {errore}",
"cancelled": "Eliminazione dell'account annullata.",
"interrupted": "Processo di eliminazione dell'account interrotto dall'utente.",
"error": "Errore durante la cancellazione dell'account: {errore}",
"delete_input_not_found_continuing": "Elimina l'input di conferma non trovato, cercando di continuare comunque",
"advanced_tab_retry": "Scheda avanzata non trovata, tentativo {tentativo}/{max_attempts}",
"waiting_for_auth": "Aspettando l'autenticazione di Google ...",
"typed_delete": "Digitato \"Elimina\" nella casella di conferma",
"trying_settings": "Cercando di navigare alla pagina delle impostazioni ...",
"delete_input_retry": "Elimina input non trovato, tentativo {tentativo}/{max_attempts}",
"email_not_found": "E -mail non trovata: {errore}",
"delete_button_not_found": "Elimina il pulsante dell'account non trovato dopo più tentativi",
"already_on_settings": "Già sulla pagina delle impostazioni",
"failed": "Processo di eliminazione dell'account non riuscito o è stato annullato.",
"warning": "ATTENZIONE: questo eliminerà permanentemente il tuo account cursore. Questa azione non può essere annullata.",
"direct_advanced_navigation": "Provare la navigazione diretta alla scheda avanzata",
"advanced_tab_not_found": "Scheda avanzata non trovata dopo più tentativi",
"auth_timeout": "Timeout di autenticazione, continuando comunque ...",
"select_google_account": "Seleziona il tuo account Google ...",
"google_button_not_found": "Pulsante di accesso Google non trovato",
"found_danger_zone": "Sezione di zona di pericolo trovata",
"account_deleted": "Account eliminato con successo!",
"starting_process": "Processo di eliminazione dell'account di avvio ...",
"advanced_tab_error": "Errore Trovare la scheda avanzata: {errore}",
"delete_button_retry": "Pulsante Elimina non trovato, tentativo {tentativo}/{max_attempts}",
"login_redirect_failed": "Reindirizzamento di accesso non riuscito, provando la navigazione diretta ...",
"unexpected_error": "Errore imprevisto: {errore}",
"delete_input_error": "Errore Trovare Elimina Input: {Errore}",
"login_successful": "Accedi di successo",
"advanced_tab_clicked": "Fare clic sulla scheda Advanced",
"unexpected_page": "Pagina imprevisto dopo l'accesso: {url}",
"found_email": "Email trovata: {email}",
"title": "Cursore Strumento di cancellazione dell'account Google",
"navigating_to_settings": "Navigazione alla pagina delle impostazioni ...",
"success": "Il tuo account Cursore è stato eliminato con successo!",
"confirm_button_retry": "Conferma il pulsante non trovato, tentativo {tentativo}/{max_attempts}"
},
"token": {
"refreshing": "Token rinfrescante ...",
"extraction_error": "Errore di estrazione del token: {errore}",
"invalid_response": "Risposta JSON non valida dal server di aggiornamento",
"no_access_token": "Nessun token di accesso in risposta",
"connection_error": "Errore di connessione per aggiornare il server",
"unexpected_error": "Errore imprevisto durante l'aggiornamento del token: {errore}",
"server_error": "Aggiorna errore del server: http {status}",
"refresh_failed": "Token Afto non riuscito: {errore}",
"refresh_success": "Token rinfrescato con successo! Valido per {giorni} giorni (scade: {scadere})",
"request_timeout": "Richiesta di aggiornare il server timed out"
},
"register": {
"cursor_auth_info_updated": "INFO AUTH CURSOR AGGIORNATE",
"no_turnstile": "Non rilevare il tornello",
"password_submitted": "Password inviata",
"using_browser": "Utilizzando {browser} browser: {Path}",
"could_not_track_processes": "Impossibile tracciare i processi {browser}: {errore}",
"total_usage": "Utilizzo totale: {utilizzo}",
"open_mailbox": "Apertura della pagina della cassetta postale",
"verification_timeout": "Ottieni timeout del codice di verifica",
"config_updated": "Configurazione aggiornata",
"form_submitted": "Modulo inviato, avvia verifica ...",
"verification_error": "Errore di verifica: {errore}",
"setting_password": "Impostazione della password",
"verification_code_filled": "Codice di verifica riempito",
"try_install_browser": "Prova a installare il browser con il tuo gestore di pacchetti",
"detect_turnstile": "Verifica della verifica della sicurezza ...",
"tempmail_plus_verification_started": "Avvio del processo di verifica TempMailPlus",
"account_error": "Ottieni informazioni sull'account non riuscita: {errore}",
"setting_on_password": "Impostazione della password",
"token_attempt": "Provare | {tentativo} volte per ottenere token | Ritteggerà in {time} s",
"start_getting_verification_code": "Inizia a ottenere il codice di verifica, proverò negli anni '60",
"max_retries_reached": "I tentativi di pensionamento massimi raggiunti. La registrazione non è riuscita.",
"starting_browser": "Browser di apertura ...",
"email_address": "Indirizzo e-mail",
"tempmail_plus_enabled": "TempmailPlus è abilitato",
"turnstile_passed": "Il Turnstile passò",
"manual_email_input": "Input e -mail manuale",
"filling_form": "Forma di riempimento",
"browser_path_invalid": "Il percorso {browser} non è valido, usando il percorso predefinito",
"get_email_address": "Ottieni indirizzo email",
"human_verify_error": "Non è possibile verificare che l'utente sia umano. Riprovare ...",
"update_cursor_auth_info": "Aggiorna le informazioni sull'auth del cursore",
"browser_started": "Il browser ha aperto con successo",
"try_get_code": "Provare | {tentativo} Ottieni codice di verifica | Tempo rimanente: {time} s",
"password_error": "Impossibile impostare la password: {errore}. Per favore riprova",
"manual_code_input": "Input del codice manuale",
"retry_verification": "Riprovare la verifica ...",
"token_max_attempts": "Reach Max Tentations ({max}) | Non è riuscito a ottenere il token",
"setup_error": "Errore di configurazione e -mail: {errore}",
"using_tempmail_plus": "Utilizzo di TempmailPlus per la verifica della posta elettronica",
"config_created": "Configurazione creata",
"try_get_verification_code": "Provare | {tentativo} Ottieni codice di verifica | Tempo rimanente: {restaning_time} s",
"cursor_registration_completed": "Registrazione del cursore completato!",
"verification_failed": "Verifica non riuscita",
"tracking_processes": "Tracciamento {count} {browser} processi",
"tempmail_plus_epin_missing": "TempmailPlus Epin non è configurato",
"visiting_url": "URL in visita",
"tempmail_plus_verification_failed": "Verifica tempmailplus non riuscita: {errore}",
"verification_success": "Verifica di sicurezza con successo",
"using_browser_profile": "Utilizzando il profilo {browser} da: {user_data_dir}",
"reset_machine_id": "Ripristina ID macchina",
"handling_turnstile": "Elaborazione della verifica della sicurezza ...",
"get_token": "Ottieni il token della sessione del cursore",
"login_success_and_jump_to_settings_page": "Accedi al successo e passa alla pagina delle impostazioni",
"tempmail_plus_verification_completed": "TempmailPlus Verification completata correttamente",
"waiting_for_second_verification": "In attesa di verifica della posta elettronica ...",
"basic_info": "Informazioni di base inviate",
"verification_start": "Inizia a ottenere il codice di verifica",
"password": "Password",
"title": "Strumento di registrazione del cursore",
"tempmail_plus_email_missing": "TempmailPlus Email non è configurato",
"browser_start": "Browser iniziale",
"tempmail_plus_config_missing": "Manca la configurazione TempmailPlus",
"waiting_for_page_load": "Pagina di caricamento ...",
"get_verification_code_success": "Ottieni il successo del codice di verifica",
"tempmail_plus_init_failed": "Impossibile inizializzare tempmailplus: {errore}",
"tempmail_plus_initialized": "TempmailPlus inizializzato correttamente",
"account_info_saved": "Informazioni sul conto salvate",
"token_success": "Ottieni il successo di token",
"register_start": "Inizia Registrati",
"cursor_auth_info_update_failed": "Cursore Aggiornamento Info Auth non riuscito",
"form_success": "Modulo inviato con successo",
"basic_info_submitted": "Informazioni di base inviate",
"tempmail_plus_disabled": "TempmailPlus è disabilitato",
"handle_turnstile": "Maneggiare il turno",
"config_option_added": "Opzione di configurazione aggiunta: {opzione}",
"start": "Processo di registrazione iniziale ...",
"get_verification_code_timeout": "Ottieni timeout del codice di verifica",
"detect_login_page": "Rileva la pagina di accesso, inizia l'accesso ...",
"register_process_error": "Errore di processo di registrazione: {errore}",
"no_new_processes_detected": "Nessun nuovo processo {browser} rilevati per tracciare",
"mailbox": "Accesso alla casella di posta elettronica accessibile correttamente",
"first_name": "Nome di battesimo",
"email_error": "Impossibile ottenere l'indirizzo e -mail",
"exit_signal": "Segnale di uscita",
"token_failed": "Ottieni token non riuscito: {errore}",
"verification_not_found": "Nessun codice di verifica trovato",
"save_account_info_failed": "Salva informazioni sull'account non riuscito",
"password_success": "Imposta password correttamente",
"getting_code": "Ottenere il codice di verifica, proverò negli anni '60",
"last_name": "Cognome",
"first_verification_passed": "Verifica iniziale riuscita",
"get_account": "Ottenere informazioni sull'account",
"press_enter": "Premere Invio per uscire",
"make_sure_browser_is_properly_installed": "Assicurati che {browser} sia installato correttamente",
"set_password": "Imposta password",
"waiting_for_verification_code": "In attesa del codice di verifica ..."
},
"quit_cursor": {
"timeout": "Timeout del processo: {pids}",
"error": "Si è verificato un errore: {errore}",
"start": "Inizia a smettere di cursore",
"terminating": "Processo di terminazione {pid}",
"success": "Tutti i processi del cursore sono chiusi",
"waiting": "Aspettando l'uscita del processo",
"no_process": "Nessun processo di cursore in esecuzione"
},
"browser_profile": {
"profile_selected": "Profilo selezionato: {profilo}",
"default_profile": "Profilo predefinito",
"no_profiles": "No {browser} profili trovati",
"select_profile": "Seleziona il profilo {browser} da utilizzare:",
"error_loading": "Errore Caricamento {Browser} Profili: {Errore}",
"invalid_selection": "Selezione non valida. Per favore riprova.",
"title": "Selezione del profilo del browser",
"profile": "Profilo {numero}",
"profile_list": "Disponibile {browser} Profili:"
},
"email": {
"refresh_error": "Errore di aggiornamento e -mail: {errore}",
"verification_code_found": "Codice di verifica trovata",
"no_display_found": "Nessun display trovato. Assicurati che X Server sia in esecuzione.",
"try_export_display": "Prova: display di esportazione =: 0",
"try_install_chromium": "Prova: sudo APT Installa il browser Chromium",
"blocked_domains": "Domini bloccati: {domini}",
"blocked_domains_loaded_timeout_error": "Domati bloccati Errore di timeout caricato: {errore}",
"create_failed": "Impossibile creare e -mail",
"switching_service": "Passa al servizio {Service}",
"refreshing": "Email rinfrescante",
"blocked_domains_loaded_success": "Domini bloccati caricati correttamente",
"verification_not_found": "Verifica non trovata",
"verification_error": "Errore di verifica: {errore}",
"starting_browser": "Browser iniziale",
"failed_to_get_available_domains": "Impossibile ottenere domini disponibili",
"domains_excluded": "Domini esclusi: {domini}",
"verification_found": "Verifica trovata",
"visiting_site": "Visitare i domini della posta",
"verification_code_not_found": "Codice di verifica non trovato",
"extension_load_error": "Errore di carico di estensione: {errore}",
"refresh_success": "Email aggiornata con successo",
"available_domains_loaded": "Domini disponibili caricati: {count}",
"blocked_domains_loaded_error": "Errore caricato domini bloccato: {errore}",
"create_success": "Email creata correttamente",
"make_sure_chrome_chromium_is_properly_installed": "Assicurati che Chrome/Chromium sia installato correttamente",
"blocked_domains_loaded_timeout": "Timeout caricato domini bloccato: {timeout} s",
"create_error": "Errore di creazione e -mail: {errore}",
"domains_filtered": "Domini filtrati: {count}",
"account_creation_error": "Errore di creazione dell'account: {errore}",
"domains_list_error": "Impossibile ottenere l'elenco dei domini: {errore}",
"no_available_domains_after_filtering": "Nessun domini disponibili dopo il filtro",
"trying_to_create_email": "Cercando di creare email: {email}",
"domain_blocked": "Dominio bloccato: {dominio}",
"failed_to_create_account": "Impossibile creare un account",
"refresh_button_not_found": "Pulsante di aggiornamento non trovato",
"address": "Indirizzo e-mail",
"using_chrome_profile": "Utilizzo del profilo Chrome da: {user_data_dir}",
"blocked_domains_loaded": "Domini bloccati caricati: {count}",
"verification_code_error": "Errore del codice di verifica: {errore}",
"all_domains_blocked": "Tutti i domini hanno bloccato il servizio di commutazione"
},
"github_register": {
"feature2": "Registra un nuovo account GitHub con credenziali casuali.",
"feature6": "Salva tutte le credenziali in un file.",
"starting_automation": "Automazione iniziale ...",
"feature1": "Genera un'e -mail temporanea utilizzando 1secmail.",
"title": "GitHub + Cursor AI Registration Automation",
"github_username": "GitHub Nome utente",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Controlla le finestre del browser per l'intervento manuale o riprova più tardi.",
"warning1": "Questo script automatizza la creazione di account, che può violare i termini di servizio GitHub/cursore.",
"feature4": "Accedi all'intelligenza artificiale del cursore usando l'autenticazione GitHub.",
"invalid_choice": "Scelta non valida. Inserisci 'sì' o 'no'",
"completed_successfully": "Registrazione del cursore GitHub + completato con successo!",
"warning2": "Richiede i privilegi di accesso a Internet e amministrativi.",
"registration_encountered_issues": "La registrazione del cursore GitHub + ha riscontrato problemi.",
"credentials_saved": "Queste credenziali sono state salvate su github_cursor_accounts.txt",
"feature3": "Verifica automaticamente l'e -mail GitHub.",
"github_password": "Password GitHub",
"features_header": "Caratteristiche",
"feature5": "Reimposta l'ID macchina per bypassare il rilevamento della prova.",
"warning4": "Usa in modo responsabile e a proprio rischio.",
"warning3": "CAPTCHA o una verifica aggiuntiva può interrompere l'automazione.",
"cancelled": "Operazione annullata",
"warnings_header": "Avvertimenti",
"program_terminated": "Programma terminato dall'utente",
"confirm": "Sei sicuro di voler procedere?",
"email_address": "Indirizzo e-mail"
},
"restore": {
"current_file_not_found": "File di archiviazione corrente non trovato",
"please_enter_number": "Inserisci un numero valido",
"starting": "Avvio del processo di ripristino dell'ID macchina",
"sqlite_not_found": "Database SQLite non trovato",
"machine_id_updated": "MachineID File aggiornato correttamente",
"update_failed": "Impossibile aggiornare il file di archiviazione: {errore}",
"updating_pair": "Aggiornamento della coppia di valore chiave",
"to_cancel": "per annullare",
"sqlite_update_failed": "Impossibile aggiornare il database SQLite: {errore}",
"read_backup_failed": "Impossibile leggere il file di backup: {errore}",
"invalid_selection": "Selezione non valida",
"system_ids_update_failed": "Impossibile aggiornare gli ID di sistema: {errore}",
"backup_creation_failed": "Impossibile creare backup: {errore}",
"updating_system_ids": "Aggiornamento degli ID di sistema",
"update_windows_machine_guid_failed": "Impossibile aggiornare Windows Machine Guid: {Errore}",
"update_windows_system_ids_failed": "Impossibile aggiornare gli ID di sistema di Windows: {errore}",
"sqlite_updated": "Database SQLite aggiornato correttamente",
"update_windows_machine_id_failed": "Impossibile aggiornare ID macchina Windows: {Errore}",
"storage_updated": "File di archiviazione aggiornato correttamente",
"missing_id": "ID mancante: {id}",
"success": "ID macchina ripristinato correttamente",
"machine_id_backup_created": "Backup creato del file MachineId",
"machine_id_update_failed": "Impossibile aggiornare il file machineid: {errore}",
"windows_machine_id_updated": "ID macchina Windows Aggiornato correttamente",
"ids_to_restore": "ID macchina per ripristinare",
"current_backup_created": "Creato backup del file di archiviazione corrente",
"select_backup": "Seleziona Backup per ripristinare",
"operation_cancelled": "Operazione annullata",
"press_enter": "Premere Invio per continuare",
"process_error": "Restore Errore del processo: {errore}",
"confirm": "Sei sicuro di voler ripristinare questi ID?",
"macos_platform_uuid_updated": "piattaforma macOS UUID aggiornata correttamente",
"failed_to_execute_plutil_command": "Impossibile eseguire il comando plutil",
"update_macos_system_ids_failed": "Impossibile aggiornare ID di sistema macOS: {errore}",
"sqm_client_key_not_found": "Chiave di registro sqmclient non trovata",
"title": "Ripristina ID macchina dal backup",
"windows_machine_guid_updated": "Windows Machine GUID aggiornato correttamente",
"permission_denied": "Permesso negato. Prova a correre come amministratore",
"no_backups_found": "Nessun file di backup trovato",
"available_backups": "File di backup disponibili",
"updating_sqlite": "Aggiornamento del database SQLite"
},
"account_info": {
"subscription": "Sottoscrizione",
"failed_to_get_account_info": "Impossibile ottenere le informazioni sull'account",
"subscription_type": "Tipo di abbonamento",
"pro": "Pro",
"failed_to_get_account": "Impossibile ottenere le informazioni sull'account",
"config_not_found": "Configurazione non trovata.",
"premium_usage": "Utilizzo premium",
"failed_to_get_subscription": "Impossibile ottenere informazioni sull'abbonamento",
"basic_usage": "Uso di base",
"premium": "Premium",
"free": "Gratuito",
"email_not_found": "E -mail non trovata",
"title": "Informazioni sull'account",
"inactive": "Inattivo",
"remaining_trial": "Prova rimanente",
"enterprise": "Impresa",
"lifetime_access_enabled": "Accesso a vita abilitato",
"failed_to_get_usage": "Impossibile ottenere informazioni sull'utilizzo",
"usage_not_found": "Utilizzo non trovato",
"days_remaining": "Giorni rimanenti",
"failed_to_get_token": "Non è riuscito a ottenere il token",
"token": "Gettone",
"subscription_not_found": "Informazioni di abbonamento non trovate",
"days": "giorni",
"team": "Squadra",
"token_not_found": "Token non trovato",
"pro_trial": "Prova pro",
"active": "Attivo",
"email": "E-mail",
"failed_to_get_email": "Impossibile ottenere l'indirizzo e -mail",
"trial_remaining": "Residente processo professionale",
"usage": "Utilizzo"
},
"updater": {
"development_version": "Versione di sviluppo {corrente}> {ultimo}",
"check_failed": "Impossibile verificare gli aggiornamenti: {errore}",
"update_skipped": "Saltare l'aggiornamento.",
"update_confirm": "Vuoi aggiornare all'ultima versione? (Y/n)",
"up_to_date": "Stai usando l'ultima versione.",
"changelog_title": "Changelog",
"new_version_available": "Nuova versione disponibile! (Corrente: {corrente}, ultimo: {ultimo})",
"updating": "Aggiornamento all'ultima versione. Il programma si riavvierà automaticamente.",
"rate_limit_exceeded": "Limite di tasso API GitHub superato. Stipping Aggiornamento Controllo.",
"invalid_choice": "Scelta non valida. Inserisci 'y' o 'n'.",
"checking": "Controllare gli aggiornamenti ...",
"continue_anyway": "Continuando con la versione attuale ..."
},
"update": {
"clearing_update_yml": "Cancellatura del file update.yml",
"press_enter": "Premere Invio per uscire",
"update_yml_cleared": "File aggiornato.yml cancellato",
"disable_success": "Aggiornamento automatico disabilitato correttamente",
"start_disable": "Inizia a disabilitare l'aggiornamento automatico",
"removing_directory": "Rimozione della directory",
"unsupported_os": "OS non supportato: {System}",
"block_file_already_locked": "Il file di blocco è già bloccato",
"yml_already_locked_error": "File aggiornato.yml Errore già bloccato: {errore}",
"update_yml_not_found": "File aggiornato.yml non trovato",
"block_file_created": "Blocca il file creato",
"yml_locked_error": "Errore bloccato del file update.yml: {errore}",
"remove_directory_failed": "Impossibile rimuovere la directory: {errore}",
"yml_already_locked": "Il file update.yml è già bloccato",
"create_block_file_failed": "Impossibile creare file block: {errore}",
"block_file_locked_error": "Blocca Errore bloccato del file: {errore}",
"killing_processes": "Uccidimento dei processi",
"directory_locked": "La directory è bloccata: {Path}",
"block_file_already_locked_error": "Blocca il file già bloccato errore: {errore}",
"creating_block_file": "Creazione di file di blocco",
"clear_update_yml_failed": "Impossibile cancellare il file update.yml: {errore}",
"yml_locked": "Il file update.yml è bloccato",
"block_file_locked": "Il file di blocco è bloccato",
"processes_killed": "Processi uccisi",
"title": "Disabilita aggiornamento automatico del cursore",
"disable_failed": "Disabilita l'aggiornamento automatico non riuscito: {errore}",
"directory_removed": "Directory rimosso"
},
"control": {
"get_email_name_success": "Ottieni il successo del nome e -mail",
"get_email_address": "Ottieni indirizzo email",
"blocked_domain": "Dominio bloccato",
"navigate_to": "Navigare a {url}",
"token_saved_to_file": "Token salvato su cursore_tokens.txt",
"get_cursor_session_token_success": "Ottieni il successo del token di sessione di cursore",
"no_valid_verification_code": "Nessun codice di verifica valido",
"verification_found": "Codice di verifica trovata",
"get_email_name": "Ottieni nome e -mail",
"get_email_address_success": "Ottieni il successo dell'indirizzo e -mail",
"verification_not_found": "Nessun codice di verifica trovato",
"copy_email": "Copia dell'indirizzo e -mail",
"select_domain": "Selezione del dominio casuale",
"select_email_domain": "Seleziona Dominio e -mail",
"found_verification_code": "Codice di verifica trovato",
"refresh_mailbox": "Casella di posta rinfrescante",
"generate_email_success": "Generare successo e -mail",
"enter_mailbox_success": "Immettere il successo della cassetta postale",
"database_connection_closed": "Connessione del database chiuso",
"browser_error": "Errore di controllo del browser: {errore}",
"select_email_domain_success": "Seleziona il successo del dominio e -mail",
"database_updated_successfully": "Database aggiornato correttamente",
"generate_email": "Generare una nuova e -mail",
"email_copy_error": "Errore di copia e -mail: {errore}",
"save_token_failed": "Salva token fallito",
"navigation_error": "Errore di navigazione: {errore}",
"get_cursor_session_token_failed": "Ottieni il token di sessione del cursore fallito",
"check_verification": "Controllo del codice di verifica",
"mailbox_error": "Errore della cassetta postale: {errore}",
"get_cursor_session_token": "Ottieni il token della sessione del cursore",
"enter_mailbox": "Entrando in cassetta postale"
},
"config": {
"config_updated": "Configurazione aggiornata",
"configuration": "Configurazione",
"file_owner": "Proprietario del file: {proprietario}",
"error_checking_linux_paths": "Errore che controlla i percorsi Linux: {errore}",
"storage_file_is_empty": "Il file di archiviazione è vuoto: {Storage_path}",
"config_directory": "Directory di configurazione",
"documents_path_not_found": "Percorso dei documenti non trovati, usando la directory corrente",
"config_not_available": "Configurazione non disponibile",
"neither_cursor_nor_cursor_directory_found": "Né la directory del cursore né del cursore trovato in {config_base}",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Assicurati che il cursore sia installato ed è stato eseguito almeno una volta",
"config_created": "Config create: {config_file}",
"using_temp_dir": "Utilizzando la directory temporanea a causa di errore: {path} (errore: {errore})",
"storage_file_not_found": "File di archiviazione non trovato: {Storage_path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "Il file potrebbe essere corrotto, si prega di reinstallare il cursore",
"error_getting_file_stats": "Errore per ottenere statistiche dei file: {errore}",
"enabled": "Abilitato",
"backup_created": "Backup Creato: {Path}",
"file_permissions": "Autorizzazioni di file: {autorizzazioni}",
"config_setup_error": "Errore Impostazione di configurazione: {errore}",
"config_force_update_enabled": "Aggiornamento della forza del file di configurazione abilitato, eseguendo l'aggiornamento forzato",
"config_removed": "File di configurazione rimosso per l'aggiornamento forzato",
"file_size": "Dimensione del file: {size} byte",
"error_reading_storage_file": "Errore il file di archiviazione di lettura: {errore}",
"config_force_update_disabled": "Aggiornamento della forza del file di configurazione disabilitato, saltando l'aggiornamento forzato",
"config_dir_created": "Directory config create: {path}",
"config_option_added": "Opzione di configurazione aggiunta: {opzione}",
"file_group": "File Group: {Group}",
"and": "E",
"backup_failed": "Impossibile backup Config: {Errore}",
"force_update_failed": "Forza aggiornamento config non riuscita: {errore}",
"storage_directory_not_found": "Directory di archiviazione non trovata: {Storage_dir}",
"also_checked": "Anche controllato {Path}",
"try_running": "Prova a eseguire: {comando}",
"storage_file_found": "File di archiviazione trovato: {Storage_path}",
"disabled": "Disabile",
"storage_file_is_valid_and_contains_data": "Il file di archiviazione è valido e contiene dati",
"permission_denied": "Autorizzazione negata: {Storage_path}"
},
"bypass": {
"found_product_json": "Trovato prodotto.json: {path}",
"starting": "Bypass della versione del cursore iniziale ...",
"version_updated": "Versione aggiornata da {old} a {new}",
"menu_option": "Controllo della versione del cursore di bypass",
"unsupported_os": "Sistema operativo non supportato: {System}",
"backup_created": "Backup Creato: {Path}",
"current_version": "Versione corrente: {versione}",
"localappdata_not_found": "LocalAppdata Environment Variable non trovata",
"no_write_permission": "Nessuna autorizzazione di scrittura per file: {path}",
"write_failed": "Impossibile scrivere Product.json: {Errore}",
"description": "Questo strumento modifica il prodotto del cursore.json per bypass le restrizioni della versione",
"bypass_failed": "Bypass della versione non riuscita: {errore}",
"title": "Strumento di bypass della versione del cursore",
"no_update_needed": "Nessun aggiornamento necessario. La versione corrente {versione} è già> = 0.46.0",
"read_failed": "Impossibile leggere Product.json: {errore}",
"stack_trace": "Traccia dello stack",
"product_json_not_found": "Product.json non trovato nei percorsi comuni di Linux",
"file_not_found": "File non trovato: {path}"
},
"auth": {
"press_enter": "Premere Invio per uscire",
"auth_update_failed": "Aggiornamento delle informazioni di autentica non riuscita: {errore}",
"auth_file_error": "Errore del file di auth: {errore}",
"checking_auth": "Controllo del file di auth",
"title": "Cursore Auth Manager",
"connected_to_database": "Connesso al database",
"db_not_found": "File di database non trovato su: {Path}",
"db_permission_error": "Impossibile accedere al file di database. Si prega di controllare le autorizzazioni",
"updating_pair": "Aggiornamento della coppia di valore chiave",
"reading_auth": "Leggendo il file di autenticazione",
"auth_updated": "Informazioni di autenticazione aggiornate correttamente",
"auth_not_found": "File di autentica non trovato",
"updating_auth": "Aggiornamento delle informazioni sull'auth",
"db_connection_error": "Impossibile connettersi al database: {errore}",
"auth_file_create_failed": "File di auth crea non riuscita: {errore}",
"database_updated_successfully": "Database aggiornato correttamente",
"reset_machine_id": "Ripristina ID macchina",
"database_connection_closed": "Connessione del database chiuso",
"auth_file_created": "File di auth creato"
},
"bypass_token_limit": {
"description": "Questo strumento modifica il file workbench.desktop.main.js per bypassare il limite token",
"press_enter": "Premere Invio per continuare ...",
"title": "Strumento di limite di bypass token"
},
"tempmail": {
"config_error": "Errore del file di configurazione: {errore}",
"no_email": "Nessuna e -mail di verifica del cursore trovato",
"general_error": "Si è verificato un errore: {errore}",
"extract_code_failed": "Extract Verifica Codice non riuscito: {errore}",
"configured_email": "Email configurata: {email}",
"no_code": "Impossibile ottenere il codice di verifica",
"checking_email": "Verificare la verifica della verifica del cursore ...",
"check_email_failed": "Controlla l'e -mail non riuscita: {errore}",
"email_found": "Email di verifica del cursore trovato",
"verification_code": "Codice di verifica: {codice}"
}
}

866
locales/ja.json Normal file
View File

@ -0,0 +1,866 @@
{
"menu": {
"title": "利用可能なオプション",
"exit": "プログラムを終了",
"reset": "マシンIDをリセット",
"register": "新しいCursorアカウントを登録",
"register_google": "Googleアカウントで登録",
"register_github": "GitHubアカウントで登録",
"register_manual": "カスタムメールでCursorを登録",
"quit": "Cursorアプリケーションを閉じる",
"select_language": "言語を変更",
"select_chrome_profile": "Chromeプロファイルを選択",
"input_choice": "選択肢を入力してください ({choices})",
"invalid_choice": "無効な選択です。{choices}から数字を入力してください",
"program_terminated": "プログラムはユーザーによって終了されました",
"error_occurred": "エラーが発生しました: {error}。もう一度お試しください",
"press_enter": "終了するにはEnterキーを押してください",
"disable_auto_update": "Cursorの自動更新を無効化",
"lifetime_access_enabled": "ライフタイムアクセスが有効化されました",
"totally_reset": "Cursorを完全にリセット",
"outdate": "期限切れ",
"temp_github_register": "一時的なGitHub登録",
"admin_required": "実行ファイルとして実行中、管理者権限が必要です。",
"admin_required_continue": "管理者権限なしで続行します。",
"coming_soon": "近日公開",
"fixed_soon": "近日修正予定",
"contribute": "プロジェクトに貢献",
"config": "設定を表示",
"delete_google_account": "CursorのGoogleアカウントを削除",
"continue_prompt": "続行しますか?(y/N): ",
"operation_cancelled_by_user": "操作はユーザーによってキャンセルされました",
"exiting": "終了中……",
"bypass_version_check": "Cursorのバージョンチェックをバイパス",
"check_user_authorized": "ユーザーの認証を確認",
"bypass_token_limit": "トークン制限をバイパス",
"language_config_saved": "言語設定が正常に保存されました",
"lang_invalid_choice": "無効な選択です。以下のオプションから選択してください: ({lang_choices})",
"restore_machine_id": "バックアップからマシンIDを復元",
"manual_custom_auth": "手動カスタム認証"
},
"languages": {
"ar": "アラビア語",
"en": "英語",
"zh_cn": "簡体字中国語",
"zh_tw": "繁体字中国語",
"vi": "ベトナム語",
"nl": "オランダ語",
"de": "ドイツ語",
"fr": "フランス語",
"pt": "ポルトガル語",
"ru": "ロシア語",
"tr": "トルコ語",
"bg": "ブルガリア語",
"es": "スペイン語",
"ja": "日本語",
"it": "イタリア語"
},
"register": {
"waiting_for_second_verification": "電子メールの確認を待っています...",
"browser_started": "ブラウザは正常にオープンしました",
"config_updated": "config updated",
"manual_email_input": "手動の電子メール入力",
"verification_start": "確認コードの取得を開始します",
"last_name": "苗字",
"press_enter": "Enterを押して終了します",
"get_verification_code_timeout": "検証コードタイムアウトを取得します",
"detect_turnstile": "セキュリティ検証の確認...",
"start_getting_verification_code": "確認コードの取得を開始し、60年代に試してみます",
"human_verify_error": "ユーザーが人間であることを確認できません。再試行...",
"token_failed": "トークンに失敗する:{エラー}",
"verification_not_found": "検証コードは見つかりません",
"getting_code": "検証コードを取得すると、60年代に試してみます",
"turnstile_passed": "ターンスタイルが通過しました",
"email_address": "電子メールアドレス",
"setting_on_password": "パスワードの設定",
"login_success_and_jump_to_settings_page": "成功をログインし、[設定]ページにジャンプします",
"register_start": "登録を開始します",
"verification_failed": "検証に失敗しました",
"title": "カーソル登録ツール",
"visiting_url": "訪問URL",
"try_get_code": "試してみてください| {pirch}検証コードを取得|残りの時間:{時間} s",
"try_get_verification_code": "試してみてください| {pirch}検証コードを取得|残りの時間:{resight_time} s",
"open_mailbox": "メールボックスページを開く",
"filling_form": "フォームに記入します",
"no_turnstile": "ターンスタイルを検出しないでください",
"set_password": "パスワードを設定します",
"waiting_for_page_load": "ページの読み込み...",
"browser_path_invalid": "{ブラウザー}パスは、デフォルトパスを使用して無効です",
"account_error": "アカウント情報が失敗します:{エラー}",
"detect_login_page": "ログインページを検出し、ログインを開始します...",
"manual_code_input": "手動コード入力",
"using_browser_profile": "{browser}プロファイルを使用:{user_data_dir}",
"verification_code_filled": "検証コードが記入されています",
"password_error": "パスワードを設定できませんでした:{エラー}。もう一度やり直してください",
"reset_machine_id": "マシンIDをリセットします",
"cursor_auth_info_updated": "カーソル認証情報が更新されました",
"form_submitted": "フォーム送信、検証を開始...",
"handling_turnstile": "セキュリティ検証の処理...",
"handle_turnstile": "ターンスタイルを処理します",
"password_submitted": "提出されたパスワード",
"email_error": "メールアドレスを取得できませんでした",
"cursor_auth_info_update_failed": "カーソル認証情報の更新は失敗しました",
"total_usage": "合計使用量:{使用}",
"exit_signal": "終了信号",
"make_sure_browser_is_properly_installed": "{ブラウザー}が適切にインストールされていることを確認してください",
"verification_error": "検証エラー:{エラー}",
"get_verification_code_success": "検証コードの成功を取得します",
"starting_browser": "オープニングブラウザ...",
"get_token": "カーソルセッショントークンを取得します",
"config_created": "作成された構成",
"register_process_error": "登録プロセスエラー:{エラー}",
"using_browser": "{browser}ブラウザの使用:{path}",
"tracking_processes": "追跡{count} {browser}プロセス",
"max_retries_reached": "最大再試行に達しました。登録に失敗しました。",
"browser_start": "起動ブラウザ",
"first_verification_passed": "最初の検証が成功しました",
"setting_password": "パスワードの設定",
"account_info_saved": "アカウント情報が保存されています",
"form_success": "フォームが正常に送信されました",
"get_account": "アカウント情報を取得します",
"get_email_address": "メールアドレスを取得します",
"verification_timeout": "検証コードタイムアウトを取得します",
"basic_info_submitted": "提出された基本情報",
"first_name": "ファーストネーム",
"setup_error": "電子メールのセットアップエラー:{エラー}",
"waiting_for_verification_code": "確認コードを待っています...",
"cursor_registration_completed": "カーソル登録が完了しました!",
"token_max_attempts": "到達最大試み({max}|トークンを取得できませんでした",
"save_account_info_failed": "アカウント情報の保存失敗",
"could_not_track_processes": "{browser}プロセスを追跡できませんでした:{エラー}",
"start": "登録プロセスの開始...",
"password_success": "パスワードを正常に設定します",
"password": "パスワード",
"no_new_processes_detected": "追跡するために検出された新しい{ブラウザー}プロセスはありません",
"basic_info": "提出された基本情報",
"verification_success": "セキュリティ検証は成功しました",
"config_option_added": "configオプション追加{オプション}",
"mailbox": "電子メールの受信トレイに正常にアクセスしました",
"token_attempt": "試してみてください| {Tirem} Times Token | {time}で再試行します",
"try_install_browser": "パッケージマネージャーと一緒にブラウザをインストールしてみてください",
"retry_verification": "検証を再試行...",
"update_cursor_auth_info": "カーソル認証情報を更新します",
"token_success": "トークンの成功を取得します",
"tempmail_plus_verification_completed": "tempmailplus検証は正常に完了しました",
"tempmail_plus_initialized": "TempMailplusは正常に初期化されました",
"tempmail_plus_epin_missing": "tempmailplus epinは構成されていません",
"using_tempmail_plus": "電子メール検証にtempmailplusを使用します",
"tempmail_plus_verification_failed": "tempmailplus検証が失敗しました{エラー}",
"tempmail_plus_email_missing": "tempmailplus電子メールは構成されていません",
"tempmail_plus_disabled": "tempmailplusは無効です",
"tempmail_plus_verification_started": "開始tempmailplus検証プロセス",
"tempmail_plus_enabled": "tempmailplusが有効になっています",
"tempmail_plus_config_missing": "tempmailplus構成がありません",
"tempmail_plus_init_failed": "tempmailplusの初期化に失敗しました{エラー}"
},
"config": {
"backup_failed": "configにバックアップに失敗しました{error}",
"enabled": "有効になっています",
"try_running": "実行してみてください:{コマンド}",
"permission_denied": "許可拒否:{Storage_Path}",
"neither_cursor_nor_cursor_directory_found": "{config_base}で見つかったカーソルもカーソルディレクトリもありません",
"storage_file_found": "見つかったストレージファイル:{Storage_Path}",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "カーソルがインストールされており、少なくとも1回は実行されていることを確認してください",
"file_group": "ファイルグループ:{グループ}",
"the_file_might_be_corrupted_please_reinstall_cursor": "ファイルが破損している可能性があります。カーソルを再インストールしてください",
"using_temp_dir": "エラーによる一時的なディレクトリの使用:{path}(エラー:{エラー}",
"documents_path_not_found": "現在のディレクトリを使用して、パスが見つかりません",
"and": "そして",
"storage_file_is_empty": "ストレージファイルは空です:{Storage_Path}",
"storage_directory_not_found": "ストレージディレクトリが見つかりません:{Storage_dir}",
"config_created": "構成作成:{config_file}",
"config_not_available": "構成は使用できません",
"file_size": "ファイルサイズ:{サイズ}バイト",
"also_checked": "{パス}もチェックしました",
"config_removed": "強制更新のために削除された構成ファイル",
"error_getting_file_stats": "エラーファイル統計の取得:{エラー}",
"force_update_failed": "フォースアップデート構成が失敗しました:{エラー}",
"disabled": "無効",
"config_force_update_enabled": "Config File Force Updateが有効になり、強制更新が実行されます",
"error_checking_linux_paths": "Linuxパスのエラーチェック{エラー}",
"backup_created": "作成されたバックアップ:{パス}",
"config_setup_error": "設定のエラー:{エラー}",
"config_directory": "構成ディレクトリ",
"file_owner": "ファイル所有者:{所有者}",
"config_force_update_disabled": "Config File Force Updateは無効になり、強制更新をスキップします",
"config_option_added": "configオプション追加{オプション}",
"config_updated": "config updated",
"config_dir_created": "作成された構成ディレクトリ:{path}",
"storage_file_is_valid_and_contains_data": "ストレージファイルは有効で、データが含まれています",
"error_reading_storage_file": "エラーストレージファイルの読み取り:{エラー}",
"storage_file_not_found": "Storageファイルが見つかりません{Storage_Path}",
"file_permissions": "ファイル許可:{permissions}",
"configuration": "構成"
},
"restore": {
"update_macos_system_ids_failed": "MacOSシステムIDの更新に失敗しました{エラー}",
"current_backup_created": "現在のストレージファイルのバックアップを作成しました",
"current_file_not_found": "現在のストレージファイルが見つかりません",
"windows_machine_guid_updated": "Windows Machine GUIDは正常に更新されました",
"please_enter_number": "有効な番号を入力してください",
"title": "バックアップからマシンIDを復元します",
"machine_id_updated": "MachineIDファイルは正常に更新されました",
"update_failed": "ストレージファイルの更新に失敗しました:{エラー}",
"sqlite_updated": "SQLiteデータベースは正常に更新されました",
"starting": "開始マシンID復元プロセス",
"select_backup": "バックアップを選択して復元します",
"sqm_client_key_not_found": "sqmclientレジストリキーが見つかりません",
"update_windows_system_ids_failed": "WindowsシステムIDの更新に失敗しました{エラー}",
"missing_id": "IDがありません{id}",
"sqlite_not_found": "SQLiteデータベースが見つかりません",
"updating_pair": "キー価値ペアの更新",
"to_cancel": "キャンセルします",
"storage_updated": "ストレージファイルが正常に更新されました",
"read_backup_failed": "バックアップファイルの読み取りに失敗しました:{エラー}",
"success": "マシンIDは正常に復元されました",
"permission_denied": "許可が拒否されました。管理者として実行してみてください",
"update_windows_machine_guid_failed": "WindowsマシンGUIDの更新に失敗しました{エラー}",
"operation_cancelled": "操作はキャンセルされました",
"updating_sqlite": "SQLiteデータベースの更新",
"sqlite_update_failed": "sqliteデータベースの更新に失敗しました{エラー}",
"failed_to_execute_plutil_command": "Plutilコマンドの実行に失敗しました",
"update_windows_machine_id_failed": "WindowsマシンIDの更新に失敗しました{エラー}",
"confirm": "これらのIDを復元したいですか",
"updating_system_ids": "システムIDの更新",
"system_ids_update_failed": "システムIDの更新に失敗しました{エラー}",
"machine_id_backup_created": "MachineIDファイルのバックアップを作成しました",
"machine_id_update_failed": "MachineIDファイルの更新に失敗しました{エラー}",
"invalid_selection": "無効な選択",
"ids_to_restore": "復元するマシンID",
"backup_creation_failed": "バックアップの作成に失敗しました:{エラー}",
"no_backups_found": "バックアップファイルは見つかりません",
"available_backups": "利用可能なバックアップファイル",
"macos_platform_uuid_updated": "MacOSプラットフォームUUIDは正常に更新されました",
"press_enter": "Enterを押して続行します",
"process_error": "プロセスエラーの復元:{エラー}",
"windows_machine_id_updated": "Windows Machine IDは正常に更新されました"
},
"totally_reset": {
"delete_button_error": "エラー検索削除ボタン:{エラー}",
"login_redirect_failed": "ログインリダイレクトが失敗し、直接ナビゲーションを試みます...",
"reset_log_3": "カーソルAIを再インストールする必要があり、これで新鮮な試用期間が必要です。",
"note_complete_machine_id_reset_may_require_running_as_administrator": "注完全なマシンIDリセットは、管理者として実行する必要がある場合があります",
"feature_2": "AIの履歴やプロンプトを含むすべてのキャッシュデータをクリアします",
"reset_log_7": "カーソルAIのウェブサイトにアクセスする前に、ブラウザのクッキーとキャッシュをクリアします",
"reset_log_9": "問題が発生した場合は、GitHub Issue Trackerにアクセスして、https//github.com/yeongpin/cursor-free-vip/issuesで問題を作成します",
"warning_4": "ターゲットカーソルAIエディターファイルと試行検出メカニズムのみをターゲットにします。",
"windows_registry_instructions_2": "「regedit」を実行し、hkey_current_user \\ software \\の下で「カーソル」または「cursorai」を含むキーを検索して削除します。",
"error": "カーソルリセットに失敗しました:{エラー}",
"navigating_to_settings": "[設定]ページへのナビゲート...",
"success": "カーソルリセットに正常にリセットされます",
"feature_9": "Windows、MacOS、Linuxと互換性があります",
"press_enter": "Enterを押して終了します",
"advanced_tab_not_found": "複数の試行後には高度なタブが見つかりません",
"deep_scanning": "追加のトライアル/ライセンスファイルのディープスキャンを実行します",
"warning_5": "システム上の他のアプリケーションは影響を受けません。",
"failed_to_delete_file_or_directory": "ファイルまたはディレクトリの削除に失敗しました:{path}",
"cursor_reset_failed": "カーソルAIエディターリセットに失敗しました{エラー}",
"feature_title": "特徴",
"reset_log_6": "利用可能な場合は、VPNを使用してIPアドレスを変更します",
"delete_input_error": "ERRORの検索入力の削除{エラー}",
"feature_3": "マシンIDをリセットして試験検出をバイパスします",
"db_connection_error": "データベースへの接続に失敗しました:{エラー}",
"error_creating_machine_id": "マシンIDファイルの作成エラー{PATH}{エラー}",
"process_interrupted": "中断されたプロセス。終了...",
"reset_log_5": "新しいトライアルに登録するときに別のメールアドレスを使用する",
"resetting_cursor": "カーソルAIエディターのリセット...待ってください。",
"reset_log_2": "変更を有効にするためにシステムを再起動してください。",
"title": "完全にカーソルをリセットします",
"cursor_reset_cancelled": "カーソルAIエディターリセットキャンセル。変更せずに終了します。",
"advanced_tab_clicked": "[詳細]タブをクリックしました",
"completed_in": "{時間}秒で完了します",
"confirm_6": "このツールを実行した後、再びカーソルAIをセットアップする必要があります。",
"connected_to_database": "データベースに接続されています",
"resetting_machine_id": "試行検出をバイパスするためにマシン識別子をリセット...",
"checking_for_electron_localstorage_files": "電子ローカルストレージファイルの確認",
"already_on_settings": "すでに設定ページにあります",
"delete_button_not_found": "複数の試行後にアカウントボタンを削除しません",
"disclaimer_title": "免責事項",
"linux_machine_id_modification_skipped": "Linux Machine-IDの変更スキップ{エラー}",
"keyboard_interrupt": "ユーザーが中断したプロセス。終了...",
"failed_to_reset_machine_guid": "マシンGUIDのリセットに失敗しました",
"confirm_4": "ターゲットカーソルAIエディターファイルと試行検出メカニズムのみをターゲットにします。",
"confirm_title": "先に進みたいですか?",
"warning_2": "構成、およびキャッシュデータ。このアクションを元に戻すことはできません。",
"reading_config": "現在の構成を読み取ります",
"updating_pair": "キー価値ペアの更新",
"found_additional_potential_license_trial_files": "{count}追加の潜在的なライセンス/トライアルファイルが見つかりました",
"failed_to_delete_file": "ファイルの削除に失敗しました:{path}",
"disclaimer_7": "あなた自身の責任で使用してください",
"performing_deep_scan": "追加のトライアル/ライセンスファイルのディープスキャンを実行します",
"database_connection_closed": "データベース接続が閉じられました",
"deleted": "削除:{パス}",
"feature_8": "非装飾用ファイルとアプリケーションを安全に保存します",
"unexpected_error": "予期しないエラーが発生しました:{エラー}",
"warning_7": "あなた自身の責任で使用してください",
"warning_3": "コードファイルは影響を受けず、ツールは設計されています",
"confirm_7": "あなた自身の責任で使用してください",
"delete_button_retry": "削除ボタンが見つかりません、{pirte}/{max_attempts}を削除します}",
"feature_4": "新しいランダム化されたマシン識別子を作成します",
"delete_input_not_found_continuing": "とにかく続行しようとしている確認の入力を削除します",
"not_found": "ファイルが見つかりません:{path}",
"advanced_tab_error": "ERRORINSING ADVANCED TAB{エラー}",
"reset_log_8": "問題が発生した場合は、別の場所にカーソルAIをインストールしてみてください",
"windows_machine_id_modification_skipped": "Windows Machine IDの変更スキップ{エラー}",
"press_enter_to_return_to_main_menu": "Enterを押してメインメニューに戻ります...",
"db_permission_error": "データベースファイルにアクセスできません。許可を確認してください",
"removing_electron_localstorage_files_completed": "Electron LocalStorageファイルの削除が完了しました",
"delete_input_retry": "入力が見つかっていない削除、{pirte}/{max_attempts}",
"confirm_2": "構成、およびキャッシュデータ。このアクションを元に戻すことはできません。",
"reset_log_4": "最良の結果については、考えてみてください。",
"saving_new_config": "JSONに新しい構成を保存します",
"invalid_choice": "「Y」または「n」を入力してください",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "注System Machine-IDリセットが必要になる場合は、SUDO特権が必要になる場合があります",
"electron_localstorage_files_removed": "Electron LocalStorageファイルが削除されました",
"config_not_found": "構成ファイルが見つかりません",
"no_permission": "構成ファイルの読み取りまたは書き込みはできません。ファイル許可を確認してください",
"confirm_1": "このアクションは、すべてのカーソルAI設定を削除します。",
"no_additional_license_trial_files_found_in_deep_scan": "ディープスキャンに追加のライセンス/試用ファイルは見つかりません",
"disclaimer_2": "構成、およびキャッシュデータ。このアクションを元に戻すことはできません。",
"checking_config": "構成ファイルの確認",
"disclaimer_4": "ターゲットカーソルAIエディターファイルと試行検出メカニズムのみをターゲットにします。",
"feature_7": "非表示ライセンスおよび試用関連ファイルのディープスキャン",
"warning_title": "警告",
"skipped_for_safety": "安全のためにスキップ(カーソル関連ではない):{パス}",
"disclaimer_3": "コードファイルは影響を受けず、ツールは設計されています",
"disclaimer_1": "このツールは、すべてのカーソルAI設定を永続的に削除します。",
"removed": "削除:{パス}",
"report_issue": "この問題をhttps://github.com/yeongpin/cursor-free-vip/issues",
"found_danger_zone": "Danger Zoneセクションが見つかりました",
"creating_backup": "構成バックアップの作成",
"cursor_reset_completed": "カーソルAIエディターは完全にリセットされ、試行検出がバイパスされました",
"operation_cancelled": "操作はキャンセルされました。変更せずに終了します。",
"direct_advanced_navigation": "[Advanced Tab]に直接ナビゲーションを試します",
"removing_electron_localstorage_files": "電子ローカルストレージファイルの削除",
"disclaimer_5": "システム上の他のアプリケーションは影響を受けません。",
"feature_6": "試行情報とアクティベーションデータをリセットします",
"created_extended_trial_info": "新しい拡張トライアル情報を作成した:{Path}",
"failed_to_remove": "削除に失敗しました:{path}",
"db_not_found": "データベースファイルが見つかりません:{path}",
"backup_exists": "バックアップファイルはすでに存在し、バックアップステップをスキップします",
"error_searching": "{path}でファイルを検索するエラー:{エラー}",
"feature_1": "カーソルAIの設定と構成の完全な削除",
"error_deleting": "エラー削除{path}{エラー}",
"error_creating_trial_info": "トライアル情報ファイルの作成エラー{path}{error}",
"delete_button_clicked": "[アカウントの削除]ボタンをクリックしました",
"reset_machine_id": "マシンIDをリセットします",
"generating_new_machine_id": "新しいマシンIDの生成",
"warning_1": "このアクションは、すべてのカーソルAI設定を削除します。",
"failed_to_delete_directory": "ディレクトリの削除に失敗しました:{path}",
"resetting_cursor_ai_editor": "カーソルAIエディターのリセット...待ってください。",
"windows_registry_instructions": "📝注Windowsで完全にリセットするには、レジストリエントリをクリーンする必要がある場合もあります。",
"feature_5": "カスタム拡張機能と設定を削除します",
"removing_known": "既知のトライアル/ライセンスファイルの削除",
"created_machine_id": "新しいマシンIDを作成しました{パス}",
"disclaimer_6": "このツールを実行した後、再びカーソルAIをセットアップする必要があります。",
"database_updated_successfully": "データベースは正常に更新されました",
"advanced_tab_retry": "高度なタブが見つかりません、試み{pirter}/{max_attempts}",
"return_to_main_menu": "メインメニューに戻る...",
"electron_localstorage_files_removal_error": "エラー電子localStorageファイルの削除エラー{エラー}",
"reset_log_1": "カーソルAIは完全にリセットされ、試行検出がバイパスされました",
"warning_6": "このツールを実行した後、再びカーソルAIをセットアップする必要があります。",
"confirm_5": "システム上の他のアプリケーションは影響を受けません。",
"confirm_3": "コードファイルは影響を受けず、ツールは設計されています",
"delete_input_not_found": "複数の試行後に確認されていない確認入力を削除します",
"reset_cancelled": "リセットキャンセル。変更せずに終了します。"
},
"updater": {
"up_to_date": "最新バージョンを使用しています。",
"update_skipped": "更新をスキップします。",
"new_version_available": "利用可能な新しいバージョン! (現在:{現在}、最新:{最新}",
"changelog_title": "Changelog",
"updating": "最新バージョンへの更新。プログラムは自動的に再起動します。",
"rate_limit_exceeded": "Github APIレート制限は超えました。更新チェックをスキップします。",
"invalid_choice": "無効な選択。 「Y」または「n」を入力してください。",
"development_version": "開発バージョン{current}> {最新}",
"update_confirm": "最新バージョンに更新しますか? y/n",
"check_failed": "更新の確認に失敗しました:{エラー}",
"continue_anyway": "現在のバージョンを続けています...",
"checking": "更新のチェック..."
},
"oauth": {
"no_chrome_profiles_found": "デフォルトを使用して、Chromeプロファイルは見つかりませんでした",
"found_browser_data_directory": "ブラウザデータディレクトリを見つけました:{path}",
"github_start": "githubスタート",
"using_browser_profile": "ブラウザプロファイルの使用:{プロファイル}",
"waiting_for_authentication": "認証を待っています...",
"error_finding_chrome_profile": "エラーChromeプロファイルの検索、デフォルトを使用{エラー}",
"browser_failed_to_start": "ブラウザが起動に失敗しました:{エラー}",
"starting_browser": "ブラウザの起動:{パス}",
"browser_setup_failed": "ブラウザのセットアップが失敗しました:{エラー}",
"page_changed_checking_auth": "ページが変更され、認証を確認してください...",
"user_data_dir_not_found": "{browser}ユーザーデータディレクトリ{path}で見つかりません、代わりにChromeを試してみます",
"warning_browser_close": "警告:これにより、すべての実行中の{ブラウザー}プロセスが閉じられます",
"initializing_browser_setup": "ブラウザのセットアップを初期化...",
"redirecting_to_authenticator_cursor_sh": "Authenticator.cursor.shへのリダイレクト...",
"missing_authentication_data": "認証データの欠落:{データ}",
"browser_closed": "ブラウザは閉じました",
"profile_selection_error": "プロフィール選択中のエラー:{エラー}",
"found_cookies": "{count}クッキーが見つかりました",
"authentication_failed": "認証が失敗した:{エラー}",
"using_first_available_chrome_profile": "最初に利用可能なChromeプロファイルを使用する{プロファイル}",
"auth_update_failed": "AUTHアップデートは失敗しました",
"failed_to_extract_auth_info": "認証情報の抽出に失敗しました:{エラー}",
"status_check_error": "ステータスチェックエラー:{エラー}",
"starting_new_google_authentication": "新しいGoogle認証を開始します...",
"starting_re_authentication_process": "再認証プロセスを開始...",
"could_not_find_usage_count": "使用量が見つかりませんでした:{エラー}",
"running_as_root_warning": "ルートとして実行することは、ブラウザの自動化には推奨されません",
"killing_browser_processes": "Killing {browser}プロセス...",
"could_not_check_usage_count": "使用量カウントを確認できませんでした:{エラー}",
"found_default_chrome_profile": "デフォルトのChromeプロファイルが見つかりました",
"auth_update_success": "AUTHアップデートの成功",
"authentication_successful": "認証成功 - 電子メール:{電子メール}",
"browser_not_found_trying_chrome": "代わりにChromeを試して、{ブラウザー}を見つけることができませんでした",
"starting_github_authentication": "GitHub認証を開始...",
"please_select_your_google_account_to_continue": "Googleアカウントを選択して続行してください...",
"warning_could_not_kill_existing_browser_processes": "警告:既存のブラウザプロセスを殺すことができませんでした:{エラー}",
"browser_failed": "ブラウザが起動に失敗しました:{エラー}",
"browser_failed_to_start_fallback": "ブラウザが起動に失敗しました:{エラー}",
"authentication_timeout": "認証タイムアウト",
"error_getting_user_data_directory": "ユーザーデータディレクトリの取得エラー:{エラー}",
"using_configured_browser_path": "configured {browser}パスを使用:{path}",
"could_not_find_email": "電子メールが見つかりませんでした:{エラー}",
"starting_google_authentication": "Google認証を開始...",
"google_start": "Google Start",
"browser_setup_completed": "ブラウザのセットアップが正常に完了しました",
"navigating_to_authentication_page": "認証ページへのナビゲート...",
"invalid_authentication_type": "無効な認証タイプ",
"try_running_without_sudo_admin": "Sudo/管理者の特権なしで実行してみてください",
"authentication_successful_getting_account_info": "認証は成功し、アカウント情報を取得します...",
"usage_count": "使用法数:{使用}",
"failed_to_delete_account": "アカウントの削除に失敗しました:{エラー}",
"already_on_settings_page": "すでに設定ページにあります!",
"authentication_button_not_found": "認証ボタンが見つかりません",
"consider_running_without_sudo": "Sudoなしでスクリプトを実行することを検討してください",
"detected_platform": "検出されたプラットフォーム:{プラットフォーム}",
"account_has_reached_maximum_usage": "アカウントは最大使用に達しました、{削除}",
"found_email": "メールを見つけた:{電子メール}",
"found_browser_user_data_dir": "見つかった{ブラウザー}ユーザーデータディレクトリ:{path}",
"failed_to_delete_account_or_re_authenticate": "アカウントを削除したり、再認証したりできませんでした:{エラー}",
"failed_to_delete_expired_account": "期限切れのアカウントを削除できませんでした",
"token_extraction_error": "トークン抽出エラー:{エラー}",
"supported_browsers": "{プラットフォーム}のサポートブラウザ",
"found_chrome_at": "クロムを見つけました:{path}",
"starting_new_authentication_process": "新しい認証プロセスを開始...",
"no_compatible_browser_found": "互換性のあるブラウザは見つかりません。 Google ChromeまたはChromiumをインストールしてください。",
"account_is_still_valid": "アカウントはまだ有効です(使用法:{使用}"
},
"github_register": {
"invalid_choice": "無効な選択。 「はい」または「いいえ」を入力してください",
"feature6": "すべての資格情報をファイルに保存します。",
"warning3": "Captchaまたは追加の検証は、自動化を中断する可能性があります。",
"starting_automation": "開始自動化...",
"feature1": "1セックスを使用して一時的な電子メールを生成します。",
"credentials_saved": "これらの資格情報は、github_cursor_accounts.txtに保存されています",
"warning1": "このスクリプトは、GitHub/Cursorのサービス条件に違反する可能性があるアカウント作成を自動化します。",
"completed_successfully": "GitHub +カーソル登録は正常に完了しました!",
"program_terminated": "ユーザーによって終了したプログラム",
"title": "Github + Cursor AI登録自動化",
"email_address": "電子メールアドレス",
"feature3": "GitHubメールを自動的に検証します。",
"feature2": "ランダムな資格情報を使用して、新しいGitHubアカウントを登録します。",
"features_header": "特徴",
"warning4": "責任を持って自分の責任で使用してください。",
"github_username": "githubユーザー名",
"feature5": "トライアル検出をバイパスするために、マシンIDをリセットします。",
"check_browser_windows_for_manual_intervention_or_try_again_later": "手動介入についてはブラウザのウィンドウを確認するか、後でもう一度やり直してください。",
"github_password": "githubパスワード",
"warning2": "インターネットアクセスと管理特権が必要です。",
"confirm": "先に進みたいですか?",
"registration_encountered_issues": "Github +カーソル登録に問題が発生しました。",
"cancelled": "操作はキャンセルされました",
"feature4": "GitHub認証を使用して、カーソルAIにログインします。",
"warnings_header": "警告"
},
"account_delete": {
"confirm_button_not_found": "複数の試行後に見つかっていない確認ボタンを確認してください",
"typed_delete": "確認ボックスに「削除」と入力されました",
"error": "アカウントの削除中のエラー:{エラー}",
"delete_input_retry": "入力が見つかっていない削除、{pirte}/{max_attempts}",
"starting_process": "アカウントの削除プロセスを開始...",
"advanced_tab_error": "ERRORINSING ADVANCED TAB{エラー}",
"delete_button_clicked": "[アカウントの削除]ボタンをクリックしました",
"auth_timeout": "認証タイムアウト、とにかく続行...",
"logging_in": "Googleでログインしています...",
"login_redirect_failed": "ログインリダイレクトが失敗し、直接ナビゲーションを試みます...",
"already_on_settings": "すでに設定ページにあります",
"delete_button_not_found": "複数の試行後にアカウントボタンを削除しません",
"delete_button_retry": "削除ボタンが見つかりません、{pirte}/{max_attempts}を削除します}",
"trying_settings": "[設定]ページに移動しようとしています...",
"delete_input_not_found_continuing": "とにかく続行しようとしている確認の入力を削除します",
"interrupted": "ユーザーが中断したアカウント削除プロセス。",
"email_not_found": "電子メールが見つかりません:{エラー}",
"delete_input_not_found": "複数の試行後に確認されていない確認入力を削除します",
"title": "カーソルGoogleアカウント削除ツール",
"waiting_for_auth": "Google認証を待っています...",
"google_button_not_found": "Googleログインボタンが見つかりません",
"navigating_to_settings": "[設定]ページへのナビゲート...",
"advanced_tab_clicked": "[詳細]タブをクリックしました",
"advanced_tab_not_found": "複数の試行後には高度なタブが見つかりません",
"cancelled": "アカウントの削除がキャンセルされました。",
"account_deleted": "アカウントが正常に削除されました!",
"warning": "警告:これにより、カーソルアカウントが永久に削除されます。このアクションを元に戻すことはできません。",
"delete_button_error": "エラー検索削除ボタン:{エラー}",
"delete_input_error": "ERRORの検索入力の削除{エラー}",
"found_danger_zone": "Danger Zoneセクションが見つかりました",
"confirm_button_error": "エラー検索確認ボタン:{エラー}",
"unexpected_error": "予期しないエラー:{エラー}",
"unexpected_page": "ログイン後の予期しないページ:{url}",
"confirm_prompt": "先に進みたいですか? y/n",
"found_email": "メールを見つけた:{電子メール}",
"login_successful": "ログインが成功します",
"direct_advanced_navigation": "[Advanced Tab]に直接ナビゲーションを試します",
"advanced_tab_retry": "高度なタブが見つかりません、試み{pirter}/{max_attempts}",
"select_google_account": "Googleアカウントを選択してください...",
"confirm_button_retry": "確認ボタンが見つかりません、{pirte}/{max_attempts}を確認します",
"failed": "アカウントの削除プロセスが失敗するか、キャンセルされました。",
"success": "カーソルアカウントが正常に削除されました!"
},
"browser_profile": {
"default_profile": "デフォルトのプロファイル",
"profile_selected": "選択したプロファイル:{プロフィール}",
"title": "ブラウザプロファイルの選択",
"invalid_selection": "無効な選択。もう一度やり直してください。",
"profile_list": "利用可能{ブラウザー}プロファイル:",
"error_loading": "エラーロード{ブラウザー}プロファイル:{エラー}",
"profile": "プロフィール{番号}",
"select_profile": "使用する{browser}プロファイルを選択します。",
"no_profiles": "{ブラウザー}プロファイルは見つかりません"
},
"account_info": {
"active": "アクティブ",
"team": "チーム",
"premium": "プレミアム",
"inactive": "非アクティブ",
"failed_to_get_account": "アカウント情報を取得できませんでした",
"lifetime_access_enabled": "Lifetimeアクセスが有効になっています",
"subscription_not_found": "サブスクリプション情報が見つかりません",
"usage": "使用法",
"failed_to_get_account_info": "アカウント情報を取得できませんでした",
"failed_to_get_token": "トークンを取得できませんでした",
"basic_usage": "基本的な使用法",
"failed_to_get_usage": "使用情報を取得できませんでした",
"subscription_type": "サブスクリプションタイプ",
"subscription": "サブスクリプション",
"trial_remaining": "残りのプロトライアル",
"token_not_found": "トークンが見つかりません",
"free": "無料",
"pro": "プロ",
"token": "トークン",
"days_remaining": "残りの日",
"usage_not_found": "使用は見つかりません",
"failed_to_get_subscription": "サブスクリプション情報を取得できませんでした",
"email": "メール",
"enterprise": "企業",
"failed_to_get_email": "メールアドレスを取得できませんでした",
"pro_trial": "プロトライアル",
"days": "日",
"remaining_trial": "残りの試験",
"title": "アカウント情報",
"email_not_found": "電子メールが見つかりません",
"config_not_found": "構成が見つかりません。",
"premium_usage": "プレミアム使用"
},
"reset": {
"version_check_passed": "カーソルバージョンチェックが合格しました",
"reading_package_json": "Package.jsonを読む{パス}",
"no_write_permission": "書き込み許可なし:{パス}",
"invalid_json_object": "無効なJSONオブジェクト",
"update_success": "成功を更新します",
"creating_backup": "構成バックアップの作成",
"updating_pair": "キー価値ペアの更新",
"system_ids_updated": "システムIDは正常に更新されました",
"version_field_empty": "バージョンフィールドは空です",
"sqlite_error": "sqliteデータベースの更新に失敗した{エラー}",
"update_windows_machine_guid_failed": "Windows Machine Guidの更新失敗{エラー}",
"update_windows_machine_id_failed": "WindowsマシンIDの更新失敗{エラー}",
"windows_permission_denied": "Windowsの許可は拒否されました",
"start_patching": "GetMachineIDのパッチを開始します",
"run_as_admin": "このプログラムを管理者として実行してみてください",
"permission_denied": "許可拒否:{エラー}",
"system_ids_update_failed": "システムIDの更新が失敗しました{エラー}",
"invalid_version_format": "無効なバージョン形式:{バージョン}",
"backup_exists": "バックアップファイルはすでに存在し、バックアップステップをスキップします",
"title": "カーソルマシンIDリセットツール",
"file_modified": "ファイルが変更されました",
"reading": "現在の構成を読み取ります",
"macos_uuid_update_failed": "MacOS UUIDアップデートは失敗しました",
"windows_guid_update_failed": "Windows GUIDの更新に失敗しました",
"update_failed": "更新が失敗しました:{エラー}",
"no_permission": "構成ファイルの読み取りまたは書き込みはできません。ファイル許可を確認してください",
"patch_completed": "GetMachineIDが完了しました",
"detecting_version": "カーソルバージョンの検出",
"generating": "新しいマシンIDの生成",
"version_greater_than_0_45": "カーソルバージョン> = 0.45.0、getMachineIDのパッチング",
"path_not_found": "パスが見つかりません:{パス}",
"process_error": "プロセスエラーのリセット:{エラー}",
"version_too_low": "カーソルバージョンが低すぎる:{バージョン} <0.45.0",
"patching_getmachineid": "getMachineidのパッチング",
"sqlite_success": "SQLiteデータベースは正常に更新されました",
"stack_trace": "スタックトレース",
"patch_failed": "getMachineIDが失敗したパッチング{エラー}",
"permission_error": "許可エラー:{エラー}",
"updating_system_ids": "システムIDの更新",
"press_enter": "Enterを押して終了します",
"updating_sqlite": "SQLiteデータベースの更新",
"windows_machine_guid_updated": "Windows Machine GUIDは正常に更新されました",
"windows_machine_id_updated": "Windows Machine IDは正常に更新されました",
"backup_created": "作成されたバックアップ",
"current_version": "現在のカーソルバージョン:{バージョン}",
"unsupported_os": "サポートされていないOS{os}",
"success": "マシンIDが正常にリセットされます",
"package_not_found": "package.jsonが見つかりません{path}",
"plutil_command_failed": "Plutilコマンドが失敗しました",
"not_found": "構成ファイルが見つかりません",
"found_version": "見つかったバージョン:{バージョン}",
"linux_path_not_found": "Linuxパスが見つかりません",
"version_parse_error": "バージョン解析エラー:{エラー}",
"macos_uuid_updated": "MacOS UUIDは正常に更新されました",
"new_id": "新しいマシンID",
"checking": "構成ファイルの確認",
"no_version_field": "package.jsonにあるバージョンフィールドはありません",
"check_version_failed": "バージョンに失敗したチェック:{エラー}",
"file_not_found": "ファイルが見つかりません:{path}",
"modify_file_failed": "ファイルに失敗した変更:{エラー}",
"saving_json": "JSONに新しい構成を保存します",
"windows_guid_updated": "Windows GUIDは正常に更新されました",
"version_less_than_0_45": "カーソルバージョン<0.45.0、getMachineidのパッチをスキップします"
},
"auth_check": {
"user_unauthorized": "ユーザーは不正です",
"jwt_token_warning": "トークンはJWT形式のように見えますが、APIチェックは予期しないステータスコードを返しました。トークンは有効かもしれませんが、APIアクセスは制限されています。",
"error_generating_checksum": "エラーチェックサムの生成:{エラー}",
"operation_cancelled": "操作はユーザーによってキャンセルされました",
"token_source": "データベースからトークンを取得するか、手動で入力しますか? D/M、デフォルトD",
"user_authorized": "ユーザーは承認されています",
"checking_authorization": "認可を確認...",
"token_length": "トークンの長さ:{長さ}文字",
"connection_error": "接続エラー",
"token_found_in_db": "データベースにあるトークン",
"check_error": "エラーチェック承認:{エラー}",
"usage_response_status": "使用率応答ステータス:{応答}",
"check_usage_response": "使用状況の応答を確認する:{応答}",
"request_timeout": "リクエストがタイムアウトします",
"unexpected_error": "予期しないエラー:{エラー}",
"enter_token": "カーソルトークンを入力してください:",
"invalid_token": "無効なトークン",
"cursor_acc_info_not_found": "cursor_acc_info.pyが見つかりません",
"authorization_failed": "承認は失敗しました!",
"usage_response": "使用率:{応答}",
"getting_token_from_db": "データベースからトークンを取得します...",
"unexpected_status_code": "予期しないステータスコード:{code}",
"checking_usage_information": "使用情報の確認...",
"authorization_successful": "承認は成功しました!",
"error_getting_token_from_db": "データベースからトークンの取得エラー:{エラー}",
"token_not_found_in_db": "データベースにはありません"
},
"update": {
"disable_failed": "自動更新の無効化失敗:{エラー}",
"block_file_locked_error": "ブロックファイルロックされたエラー:{エラー}",
"yml_locked_error": "update.ymlファイルロックされたエラー{エラー}",
"press_enter": "Enterを押して終了します",
"block_file_locked": "ブロックファイルがロックされています",
"removing_directory": "ディレクトリの削除",
"update_yml_not_found": "update.ymlファイルが見つかりません",
"directory_locked": "ディレクトリがロックされています:{path}",
"yml_already_locked_error": "update.ymlファイル既にロックされたエラー{エラー}",
"remove_directory_failed": "ディレクトリの削除に失敗しました:{エラー}",
"unsupported_os": "サポートされていないOS{システム}",
"block_file_already_locked_error": "ブロックファイル既にロックされたエラー:{エラー}",
"yml_locked": "update.ymlファイルがロックされています",
"yml_already_locked": "update.ymlファイルはすでにロックされています",
"start_disable": "自動更新の無効化を開始します",
"block_file_created": "作成されたブロックファイル",
"create_block_file_failed": "ブロックファイルの作成に失敗しました:{エラー}",
"directory_removed": "ディレクトリが削除されました",
"clearing_update_yml": "update.ymlファイルのクリア",
"title": "Cursor Auto Updateを無効にします",
"processes_killed": "殺されたプロセス",
"creating_block_file": "ブロックファイルの作成",
"killing_processes": "殺害プロセス",
"disable_success": "自動更新は無効になっています",
"block_file_already_locked": "ブロックファイルはすでにロックされています",
"update_yml_cleared": "update.ymlファイルがクリアされました",
"clear_update_yml_failed": "update.ymlファイルをクリアできなかった{エラー}"
},
"token": {
"refresh_success": "トークンは正常にリフレッシュしました! {Days} Days期限切れ{期限切れ})に有効",
"extraction_error": "トークンの抽出エラー:{エラー}",
"server_error": "サーバーエラーの更新http {status}",
"unexpected_error": "トークン更新中の予期しないエラー:{エラー}",
"connection_error": "サーバーを更新するための接続エラー",
"refreshing": "リフレッシュトークン...",
"no_access_token": "それに応じてアクセストークンはありません",
"invalid_response": "更新サーバーからの無効なJSON応答",
"refresh_failed": "トークンの更新失敗:{エラー}",
"request_timeout": "タイミングでサーバーを更新するリクエスト"
},
"email": {
"try_export_display": "試してくださいdisplay =0をエクスポートします",
"create_failed": "メールの作成に失敗しました",
"domains_list_error": "ドメインリストの取得に失敗しました:{エラー}",
"domains_excluded": "ドメインを除外する:{ドメイン}",
"blocked_domains_loaded_success": "ブロックされたドメインが正常にロードされました",
"no_available_domains_after_filtering": "フィルタリング後の利用可能なドメインはありません",
"make_sure_chrome_chromium_is_properly_installed": "Chrome/Chromiumが適切に取り付けられていることを確認してください",
"visiting_site": "メールドメインにアクセスします",
"create_success": "電子メールが正常に作成されました",
"trying_to_create_email": "電子メールを作成しようとしています:{電子メール}",
"starting_browser": "起動ブラウザ",
"refresh_error": "電子メールの更新エラー:{エラー}",
"refresh_button_not_found": "更新ボタンが見つかりません",
"blocked_domains_loaded_timeout_error": "ブロックされたドメインロードされたタイムアウトエラー:{エラー}",
"verification_error": "検証エラー:{エラー}",
"verification_found": "検証が見つかりました",
"refreshing": "更新されたメール",
"verification_code_found": "検証コードが見つかりました",
"extension_load_error": "拡張ロードエラー:{エラー}",
"domains_filtered": "フィルタリングされたドメイン:{count}",
"blocked_domains_loaded_timeout": "ブロックされたドメインがロードされたタイムアウト:{タイムアウト} s",
"address": "電子メールアドレス",
"all_domains_blocked": "すべてのドメインがブロックされ、スイッチングサービス",
"blocked_domains_loaded": "ロードされたブロックドメイン:{count}",
"account_creation_error": "アカウント作成エラー:{エラー}",
"create_error": "電子メールの作成エラー:{エラー}",
"verification_code_error": "検証コードエラー:{エラー}",
"switching_service": "{Service}サービスに切り替えます",
"failed_to_create_account": "アカウントの作成に失敗しました",
"blocked_domains_loaded_error": "ブロックされたドメインロードエラー:{エラー}",
"no_display_found": "ディスプレイは見つかりません。 Xサーバーが実行されていることを確認してください。",
"verification_code_not_found": "検証コードが見つかりません",
"refresh_success": "電子メールが正常に更新されました",
"using_chrome_profile": "クロムプロファイルの使用:{user_data_dir}",
"failed_to_get_available_domains": "利用可能なドメインを取得できませんでした",
"blocked_domains": "ブロックされたドメイン:{ドメイン}",
"verification_not_found": "検証が見つかりません",
"available_domains_loaded": "使用可能なドメインロード:{count}",
"try_install_chromium": "試してくださいsudo apt install chrom-browser",
"domain_blocked": "ブロックされたドメイン:{ドメイン}"
},
"control": {
"verification_not_found": "検証コードは見つかりません",
"found_verification_code": "検証コードが見つかりました",
"email_copy_error": "電子メールコピーエラー:{エラー}",
"generate_email_success": "電子メールの成功を生成します",
"copy_email": "メールアドレスのコピー",
"database_connection_closed": "データベース接続が閉じられました",
"navigate_to": "{url}に移動する",
"enter_mailbox_success": "メールボックスの成功を入力します",
"check_verification": "確認コードの確認",
"get_cursor_session_token_success": "カーソルセッショントークンの成功を取得します",
"navigation_error": "ナビゲーションエラー:{エラー}",
"database_updated_successfully": "データベースは正常に更新されました",
"token_saved_to_file": "cursor_tokens.txtに保存されたトークン",
"mailbox_error": "メールボックスエラー:{エラー}",
"no_valid_verification_code": "有効な検証コードはありません",
"save_token_failed": "保存トークンが失敗しました",
"get_cursor_session_token": "カーソルセッショントークンを取得します",
"enter_mailbox": "メールボックスを入力します",
"get_email_address_success": "メールアドレスの成功を取得します",
"get_email_name": "メール名を取得します",
"blocked_domain": "ブロックドメイン",
"get_email_address": "メールアドレスを取得します",
"refresh_mailbox": "更新されたメールボックス",
"get_cursor_session_token_failed": "カーソルセッショントークンを取得しました",
"browser_error": "ブラウザ制御エラー:{エラー}",
"select_domain": "ランダムドメインの選択",
"select_email_domain": "電子メールドメインを選択します",
"select_email_domain_success": "電子メールドメインの成功を選択します",
"verification_found": "検証コードが見つかりました",
"get_email_name_success": "電子メール名の成功を取得します",
"generate_email": "新しい電子メールの生成"
},
"bypass": {
"current_version": "現在のバージョン:{バージョン}",
"title": "カーソルバージョンバイパスツール",
"no_write_permission": "ファイルの書き込み許可はありません:{path}",
"write_failed": "Product.jsonの書き込みに失敗しました{エラー}",
"menu_option": "バイパスカーソルバージョンチェック",
"bypass_failed": "バージョンバイパスが失敗しました:{エラー}",
"starting": "カーソルバージョンバイパスを開始...",
"read_failed": "crods.jsonの読みに失敗しました{エラー}",
"unsupported_os": "サポートされていないオペレーティングシステム:{システム}",
"description": "このツールは、cursorのcrods.jsonをバージョンの制限をバイパスするように変更します",
"product_json_not_found": "Product.jsonは、一般的なLinuxパスにはありません",
"version_updated": "{old}から{new}に更新されたバージョン",
"no_update_needed": "更新は必要ありません。現在のバージョン{バージョン}はすでに> = 0.46.0です",
"file_not_found": "ファイルが見つかりません:{path}",
"backup_created": "作成されたバックアップ:{パス}",
"found_product_json": "FOUND PRODUCT.JSON{PATH}",
"stack_trace": "スタックトレース",
"localappdata_not_found": "LocalAppData環境変数が見つかりません"
},
"quit_cursor": {
"start": "カーソルの終了を開始します",
"terminating": "終了プロセス{pid}",
"error": "エラーが発生しました:{エラー}",
"waiting": "プロセスが終了するのを待っています",
"no_process": "実行中のカーソルプロセスはありません",
"timeout": "プロセスタイムアウト:{pids}",
"success": "すべてのカーソルプロセスは閉じられました"
},
"auth": {
"press_enter": "Enterを押して終了します",
"auth_file_create_failed": "AUTHファイルの作成失敗{エラー}",
"database_updated_successfully": "データベースは正常に更新されました",
"db_connection_error": "データベースへの接続に失敗しました:{エラー}",
"updating_auth": "認証情報の更新",
"auth_update_failed": "認証情報の更新失敗:{エラー}",
"connected_to_database": "データベースに接続されています",
"title": "カーソル認証マネージャー",
"updating_pair": "キー価値ペアの更新",
"database_connection_closed": "データベース接続が閉じられました",
"reading_auth": "認証ファイルを読み取ります",
"db_not_found": "データベースファイルが見つかりません:{path}",
"auth_updated": "AUTH情報は正常に更新されました",
"auth_not_found": "認証ファイルが見つかりません",
"checking_auth": "認証ファイルの確認",
"auth_file_error": "AUTHファイルエラー{エラー}",
"db_permission_error": "データベースファイルにアクセスできません。許可を確認してください",
"auth_file_created": "作成されたAUTHファイル",
"reset_machine_id": "マシンIDをリセットします"
},
"bypass_token_limit": {
"title": "バイパストークン制限ツール",
"press_enter": "Enterを押して続行します...",
"description": "このツールは、workbench.desktop.main.jsファイルを変更して、トークン制限をバイパスします"
},
"manual_auth": {
"proceed_prompt": "進む? y/n",
"auth_updated_successfully": "認証情報が正常に更新されました!",
"token_verification_skipped": "トークン検証がスキップされたcheck_user_authorized.pyが見つかりません",
"token_required": "トークンが必要です",
"auth_type_selected": "選択した認証タイプ:{タイプ}",
"auth_type_google": "グーグル",
"continue_anyway": "とにかく続行しますか? y/n",
"auth_type_github": "github",
"verifying_token": "トークンの妥当性の確認...",
"auth_type_prompt": "認証タイプを選択します。",
"error": "エラー:{エラー}",
"random_email_generated": "生成されたランダムメール:{email}",
"operation_cancelled": "操作はキャンセルされました",
"auth_type_auth0": "auth_0デフォルト",
"email_prompt": "電子メールを入力します(ランダム電子メールのために空白のままにしてください):",
"token_verification_error": "トークンの検証エラー:{エラー}",
"token_prompt": "カーソルトークンaccess_token/refresh_tokenを入力してください",
"token_verified": "トークンは正常に検証されました!",
"confirm_prompt": "次の情報を確認してください。",
"invalid_token": "無効なトークン。認証が中止されました。",
"title": "手動カーソル認証",
"updating_database": "カーソル認証データベースの更新...",
"auth_update_failed": "認証情報の更新に失敗しました"
},
"tempmail": {
"general_error": "エラーが発生しました:{エラー}",
"no_email": "カーソル検証メールは見つかりません",
"config_error": "構成ファイルエラー:{エラー}",
"checking_email": "カーソル検証メールの確認...",
"extract_code_failed": "検証コードが失敗した抽出:{エラー}",
"configured_email": "構成された電子メール:{電子メール}",
"email_found": "カーソル検証メールが見つかりました",
"no_code": "確認コードを取得できませんでした",
"check_email_failed": "電子メールの失敗を確認する:{エラー}",
"verification_code": "検証コード:{code}"
}
}

878
locales/nl.json Normal file
View File

@ -0,0 +1,878 @@
{
"menu": {
"title": "Beschikbare Opties",
"exit": "Programma Afsluiten",
"reset": "Machine ID Resetten",
"register": "Nieuw Cursor Account Registreren",
"register_google": "Registreren met Google Account",
"register_github": "Registreren met GitHub Account",
"register_manual": "Cursor Registreren met Aangepaste E-mail",
"quit": "Cursor Toepassing Sluiten",
"select_language": "Taal Wijzigen",
"select_chrome_profile": "Chrome Profiel Selecteren",
"input_choice": "Voer uw keuze in ({choices})",
"invalid_choice": "Ongeldige selectie. Voer een nummer in uit {choices}.",
"program_terminated": "Programma is beëindigd door de gebruiker",
"error_occurred": "Er is een fout opgetreden: {error}. Probeer het opnieuw.",
"press_enter": "Druk op Enter om door te gaan.",
"disable_auto_update": "Cursor automatische updates uitschakelen",
"lifetime_access_enabled": "Levenslange toegang ingeschakeld",
"totally_reset": "Cursor volledig resetten",
"outdate": "Verouderd",
"temp_github_register": "Tijdelijke GitHub-registratie",
"coming_soon": "Binnenkort",
"fixed_soon": "Binnenkort Opgelost",
"contribute": "Bijdragen aan het Project",
"config": "Configuratie Weergeven",
"delete_google_account": "Cursor Google Account Verwijderen",
"continue_prompt": "Doorgaan? (y/N): ",
"operation_cancelled_by_user": "Operatie geannuleerd door gebruiker",
"exiting": "Afsluiten ……",
"bypass_version_check": "Cursor Versiecontrole Overslaan",
"check_user_authorized": "Gebruikersautorisatie Controleren",
"bypass_token_limit": "Token-limiet omzeilen",
"restore_machine_id": "Machine-ID herstellen vanaf backup",
"admin_required": "Uitvoeren als uitvoerbaar, vereiste beheerdersrechten.",
"language_config_saved": "Taalconfiguratie met succes opgeslagen",
"lang_invalid_choice": "Ongeldige keuze. Voer een van de volgende opties in: ({lang_choices}))",
"manual_custom_auth": "Handmatige aangepaste auth",
"admin_required_continue": "Doorgaan zonder beheerdersrechten."
},
"languages": {
"ar": "Arabisch",
"en": "Engels",
"zh_cn": "Vereenvoudigd Chinees",
"zh_tw": "Traditioneel Chinees",
"vi": "Vietnamees",
"nl": "Nederlands",
"de": "Duits",
"fr": "Frans",
"pt": "Portugees",
"ru": "Russisch",
"es": "Spaans",
"bg": "Bulgaars",
"tr": "Turks",
"it": "Italiaans",
"ja": "Japanse"
},
"quit_cursor": {
"start": "Start met afsluiten van Cursor",
"no_process": "Geen actief Cursor-proces",
"terminating": "Proces beëindigen {pid}",
"waiting": "Wachten tot het proces is afgesloten",
"success": "Alle Cursor-processen gesloten",
"timeout": "Proces time-out: {pids}",
"error": "Fout opgetreden: {error}"
},
"reset": {
"title": "Cursor Machine-ID Reset Tool",
"checking": "Configuratiebestand controleren",
"not_found": "Configuratiebestand niet gevonden",
"no_permission": "Kan configuratiebestand niet lezen of schrijven, controleer de bestandsrechten",
"reading": "Huidige configuratie lezen",
"creating_backup": "Configuratieback-up maken",
"backup_exists": "Back-upbestand bestaat al, back-upstap overslaan",
"generating": "Nieuwe Machine-ID genereren",
"saving_json": "Nieuwe configuratie opslaan naar JSON",
"success": "Machine-ID succesvol gereset",
"new_id": "Nieuwe Machine-ID",
"permission_error": "Toestemmingsfout: {error}",
"run_as_admin": "Probeer dit programma als beheerder uit te voeren",
"process_error": "Resetprocesfout: {error}",
"updating_sqlite": "SQLite-database bijwerken",
"updating_pair": "Sleutel-waarde paar bijwerken",
"sqlite_success": "SQLite-database succesvol bijgewerkt",
"sqlite_error": "SQLite-database bijwerken mislukt: {error}",
"press_enter": "Druk op Enter om door te gaan",
"unsupported_os": "Niet-ondersteund besturingssysteem: {os}",
"linux_path_not_found": "Linux-pad niet gevonden",
"updating_system_ids": "Systeem-ID's bijwerken",
"system_ids_updated": "Systeem-ID's succesvol bijgewerkt",
"system_ids_update_failed": "Systeem-ID's bijwerken mislukt: {error}",
"windows_guid_updated": "Windows GUID succesvol bijgewerkt",
"windows_permission_denied": "Windows toestemming geweigerd",
"windows_guid_update_failed": "Windows GUID bijwerken mislukt",
"macos_uuid_updated": "macOS UUID succesvol bijgewerkt",
"plutil_command_failed": "plutil-opdracht mislukt",
"start_patching": "Patching getMachineId starten",
"macos_uuid_update_failed": "macOS UUID bijwerken mislukt",
"current_version": "Huidige Cursor-versie: {version}",
"patch_completed": "Patching getMachineId voltooid",
"patch_failed": "Patching getMachineId mislukt: {error}",
"version_check_passed": "Cursor-versiecontrole geslaagd",
"file_modified": "Bestand gewijzigd",
"version_less_than_0_45": "Cursor-versie < 0.45.0, patching getMachineId overslaan",
"detecting_version": "Cursor-versie detecteren",
"patching_getmachineid": "Patching getMachineId",
"version_greater_than_0_45": "Cursor-versie >= 0.45.0, patching getMachineId",
"permission_denied": "Toestemming geweigerd: {error}",
"backup_created": "Back-up gemaakt",
"update_success": "Update geslaagd",
"update_failed": "Update mislukt: {error}",
"windows_machine_guid_updated": "Windows Machine GUID succesvol bijgewerkt",
"reading_package_json": "package.json lezen {path}",
"invalid_json_object": "Ongeldig JSON-object",
"no_version_field": "Geen versieveld gevonden in package.json",
"version_field_empty": "Versieveld is leeg",
"invalid_version_format": "Ongeldig versieformaat: {version}",
"found_version": "Gevonden versie: {version}",
"version_parse_error": "Versie parse-fout: {error}",
"package_not_found": "Package.json niet gevonden: {path}",
"check_version_failed": "Versiecontrole mislukt: {error}",
"stack_trace": "Stack Trace",
"version_too_low": "Cursor-versie te laag: {version} < 0.45.0",
"no_write_permission": "Geen schrijfrechten: {path}",
"path_not_found": "Pad niet gevonden: {path}",
"modify_file_failed": "Bestand wijzigen mislukt: {error}",
"windows_machine_id_updated": "Windows Machine-ID succesvol bijgewerkt",
"update_windows_machine_id_failed": "Windows Machine-ID bijwerken mislukt: {error}",
"update_windows_machine_guid_failed": "Windows Machine GUID bijwerken mislukt: {error}",
"file_not_found": "Bestand niet gevonden: {path}"
},
"register": {
"title": "Cursor Registratietool",
"start": "Registratieproces starten...",
"handling_turnstile": "Beveiligingsverificatie verwerken...",
"retry_verification": "Verificatie opnieuw proberen...",
"detect_turnstile": "Beveiligingsverificatie controleren...",
"verification_success": "Beveiligingsverificatie geslaagd",
"starting_browser": "Browser openen...",
"form_success": "Formulier succesvol ingediend",
"browser_started": "Browser succesvol geopend",
"waiting_for_second_verification": "Wachten op e-mailverificatie...",
"waiting_for_verification_code": "Wachten op verificatiecode...",
"password_success": "Wachtwoord succesvol ingesteld",
"password_error": "Kon wachtwoord niet instellen: {error}. Probeer het opnieuw",
"waiting_for_page_load": "Pagina laden...",
"first_verification_passed": "Eerste verificatie geslaagd",
"mailbox": "E-mailinbox succesvol geopend",
"register_start": "Registratie starten",
"form_submitted": "Formulier ingediend, verificatie starten...",
"filling_form": "Formulier invullen",
"visiting_url": "URL bezoeken",
"basic_info": "Basisinformatie ingediend",
"handle_turnstile": "Turnstile verwerken",
"no_turnstile": "Geen Turnstile gedetecteerd",
"turnstile_passed": "Turnstile geslaagd",
"verification_start": "Verificatiecode verkrijgen starten",
"verification_timeout": "Verificatiecode time-out",
"verification_not_found": "Geen verificatiecode gevonden",
"try_get_code": "Probeer | {attempt} Verificatiecode verkrijgen | Tijd over: {time}s",
"get_account": "Accountinformatie verkrijgen",
"get_token": "Cursor-sessietoken verkrijgen",
"token_success": "Token succesvol verkregen",
"token_attempt": "Probeer | {attempt} keer om token te verkrijgen | Opnieuw proberen in {time}s",
"token_max_attempts": "Maximale pogingen bereikt ({max}) | Token verkrijgen mislukt",
"token_failed": "Token verkrijgen mislukt: {error}",
"account_error": "Accountinformatie verkrijgen mislukt: {error}",
"press_enter": "Druk op Enter om door te gaan",
"browser_start": "Browser starten",
"open_mailbox": "Mailboxpagina openen",
"email_error": "E-mailadres verkrijgen mislukt",
"setup_error": "E-mailinstelling fout: {error}",
"start_getting_verification_code": "Verificatiecode verkrijgen starten, opnieuw proberen in 60s",
"get_verification_code_timeout": "Verificatiecode verkrijgen time-out",
"get_verification_code_success": "Verificatiecode succesvol verkregen",
"try_get_verification_code": "Probeer | {attempt} Verificatiecode verkrijgen | Tijd over: {remaining_time}s",
"verification_code_filled": "Verificatiecode ingevuld",
"login_success_and_jump_to_settings_page": "Inloggen geslaagd en naar instellingenpagina springen",
"detect_login_page": "Inlogpagina detecteren, inloggen starten...",
"cursor_registration_completed": "Cursor-registratie voltooid!",
"set_password": "Wachtwoord instellen",
"basic_info_submitted": "Basisinformatie ingediend",
"cursor_auth_info_updated": "Cursor-authenticatie-informatie bijgewerkt",
"cursor_auth_info_update_failed": "Cursor-authenticatie-informatie bijwerken mislukt",
"reset_machine_id": "Machine-ID resetten",
"account_info_saved": "Accountinformatie opgeslagen",
"save_account_info_failed": "Accountinformatie opslaan mislukt",
"get_email_address": "E-mailadres verkrijgen",
"update_cursor_auth_info": "Cursor-authenticatie-informatie bijwerken",
"register_process_error": "Registratieprocesfout: {error}",
"setting_password": "Wachtwoord instellen",
"manual_code_input": "Handmatige code-invoer",
"manual_email_input": "Handmatige e-mailinvoer",
"password": "Wachtwoord",
"first_name": "Voornaam",
"last_name": "Achternaam",
"exit_signal": "Exit-signaal",
"email_address": "E-mailadres",
"config_created": "Configuratie aangemaakt",
"verification_failed": "Verificatie mislukt",
"verification_error": "Verificatiefout: {error}",
"config_option_added": "Configuratieoptie toegevoegd: {option}",
"config_updated": "Configuratie bijgewerkt",
"password_submitted": "Wachtwoord ingediend",
"total_usage": "Totaal gebruik: {usage}",
"setting_on_password": "Wachtwoord instellen",
"getting_code": "Verificatiecode verkrijgen, opnieuw proberen in 60s",
"using_browser": "Gebruik {browser} browser: {Path}",
"could_not_track_processes": "Kon {browser} processen niet volgen: {error}",
"try_install_browser": "Probeer de browser te installeren met uw pakketbeheerder",
"tempmail_plus_verification_started": "Het starten van TempMailplus -verificatieproces",
"max_retries_reached": "Maximale opnieuw proberen pogingen bereikt. Registratie is mislukt.",
"tempmail_plus_enabled": "TempMailplus is ingeschakeld",
"browser_path_invalid": "{browser} pad is ongeldig, met behulp van standaardpad",
"human_verify_error": "Kan niet controleren of de gebruiker menselijk is. Opnieuw proberen ...",
"using_tempmail_plus": "TempMailplus gebruiken voor e -mailverificatie",
"tracking_processes": "Tracking {count} {browser} processen",
"tempmail_plus_epin_missing": "TempMailplus Epin is niet geconfigureerd",
"tempmail_plus_verification_failed": "TempMailplus -verificatie is mislukt: {error}",
"using_browser_profile": "Gebruik {browser} profiel van: {user_data_dir}",
"tempmail_plus_verification_completed": "TempMailplus -verificatie met succes voltooid",
"tempmail_plus_email_missing": "TempMailplus -e -mail is niet geconfigureerd",
"tempmail_plus_config_missing": "TempMailplus -configuratie ontbreekt",
"tempmail_plus_init_failed": "Kan TempMailplus niet initialiseren: {error}",
"tempmail_plus_initialized": "Tempmailplus geïnitialiseerd met succes",
"tempmail_plus_disabled": "TempMailplus is uitgeschakeld",
"no_new_processes_detected": "Geen nieuwe {browser} processen gedetecteerd om te volgen",
"make_sure_browser_is_properly_installed": "Zorg ervoor dat {browser} correct is geïnstalleerd"
},
"auth": {
"title": "Cursor Authenticatiebeheer",
"checking_auth": "Authenticatiebestand controleren",
"auth_not_found": "Authenticatiebestand niet gevonden",
"auth_file_error": "Authenticatiebestandfout: {error}",
"reading_auth": "Authenticatiebestand lezen",
"updating_auth": "Authenticatie-informatie bijwerken",
"auth_updated": "Authenticatie-informatie succesvol bijgewerkt",
"auth_update_failed": "Authenticatie-informatie bijwerken mislukt: {error}",
"auth_file_created": "Authenticatiebestand aangemaakt",
"auth_file_create_failed": "Authenticatiebestand aanmaken mislukt: {error}",
"press_enter": "Druk op Enter om door te gaan",
"reset_machine_id": "Machine-ID resetten",
"database_connection_closed": "Databaseverbinding gesloten",
"database_updated_successfully": "Database succesvol bijgewerkt",
"connected_to_database": "Verbonden met database",
"updating_pair": "Sleutel-waarde paar bijwerken",
"db_not_found": "Databasebestand niet gevonden op: {path}",
"db_permission_error": "Kan geen toegang krijgen tot databasebestand. Controleer de rechten",
"db_connection_error": "Verbinding met database mislukt: {error}"
},
"control": {
"generate_email": "Nieuw e-mailadres genereren",
"blocked_domain": "Geblokkeerd domein",
"select_domain": "Willekeurig domein selecteren",
"copy_email": "E-mailadres kopiëren",
"enter_mailbox": "Mailbox betreden",
"refresh_mailbox": "Mailbox vernieuwen",
"check_verification": "Verificatiecode controleren",
"verification_found": "Verificatiecode gevonden",
"verification_not_found": "Geen verificatiecode gevonden",
"browser_error": "Browserbesturingsfout: {error}",
"navigation_error": "Navigatiefout: {error}",
"email_copy_error": "E-mailkopieerfout: {error}",
"mailbox_error": "Mailboxfout: {error}",
"token_saved_to_file": "Token opgeslagen in cursor_tokens.txt",
"navigate_to": "Navigeren naar {url}",
"generate_email_success": "E-mailadres succesvol gegenereerd",
"select_email_domain": "E-maildomein selecteren",
"select_email_domain_success": "E-maildomein succesvol geselecteerd",
"get_email_name": "E-mailnaam verkrijgen",
"get_email_name_success": "E-mailnaam succesvol verkregen",
"get_email_address": "E-mailadres verkrijgen",
"get_email_address_success": "E-mailadres succesvol verkregen",
"enter_mailbox_success": "Mailbox succesvol betreden",
"found_verification_code": "Verificatiecode gevonden",
"get_cursor_session_token": "Cursor-sessietoken verkrijgen",
"get_cursor_session_token_success": "Cursor-sessietoken succesvol verkregen",
"get_cursor_session_token_failed": "Cursor-sessietoken verkrijgen mislukt",
"save_token_failed": "Token opslaan mislukt",
"database_updated_successfully": "Database succesvol bijgewerkt",
"database_connection_closed": "Databaseverbinding gesloten",
"no_valid_verification_code": "Geen geldige verificatiecode"
},
"email": {
"starting_browser": "Browser starten",
"visiting_site": "Bezoek mail domains",
"create_success": "E-mail succesvol aangemaakt",
"create_failed": "E-mail aanmaken mislukt",
"create_error": "E-mail aanmaakfout: {error}",
"refreshing": "E-mail vernieuwen",
"refresh_success": "E-mail succesvol vernieuwd",
"refresh_error": "E-mail vernieuwingsfout: {error}",
"refresh_button_not_found": "Vernieuwknop niet gevonden",
"verification_found": "Verificatie gevonden",
"verification_not_found": "Verificatie niet gevonden",
"verification_error": "Verificatiefout: {error}",
"verification_code_found": "Verificatiecode gevonden",
"verification_code_not_found": "Verificatiecode niet gevonden",
"verification_code_error": "Verificatiecodefout: {error}",
"address": "E-mailadres",
"all_domains_blocked": "Alle domeinen geblokkeerd, service wisselen",
"no_available_domains_after_filtering": "Geen beschikbare domeinen na filteren",
"switching_service": "Wisselen naar {service} service",
"domains_list_error": "Domeinenlijst verkrijgen mislukt: {error}",
"failed_to_get_available_domains": "Verkrijgen van beschikbare domeinen mislukt",
"domains_excluded": "Uitgesloten domeinen: {domains}",
"failed_to_create_account": "Account aanmaken mislukt",
"account_creation_error": "Account aanmaakfout: {error}",
"domain_blocked": "Domein geblokkeerd: {domain}",
"no_display_found": "Geen display gevonden. Zorg ervoor dat X Server actief is.",
"try_export_display": "Probeer: exporteren display =: 0",
"try_install_chromium": "Probeer: sudo apt install chroom-browser",
"blocked_domains": "Geblokkeerde domeinen: {domains}",
"blocked_domains_loaded_timeout_error": "Geblokkeerde domeinen geladen time -outfout: {error}",
"blocked_domains_loaded_success": "Geblokkeerde domeinen met succes geladen",
"extension_load_error": "Extension load error: {error}",
"available_domains_loaded": "Beschikbare domeinen geladen: {count}",
"blocked_domains_loaded_error": "Geblokkeerde domeinen geladen fout: {error}",
"blocked_domains_loaded_timeout": "Geblokkeerde domeinen geladen time -out: {time -out} s",
"make_sure_chrome_chromium_is_properly_installed": "Zorg ervoor dat chroom/chroom correct is geïnstalleerd",
"domains_filtered": "Domeinen gefilterd: {count}",
"trying_to_create_email": "Proberen e -mail te maken: {e -mail}",
"using_chrome_profile": "Gebruik van Chrome Profiel van: {user_data_dir}",
"blocked_domains_loaded": "Geblokkeerde domeinen geladen: {count}"
},
"update": {
"title": "Cursor automatische update uitschakelen",
"disable_success": "Automatische update is uitgeschakeld",
"disable_failed": "Automatische update uitschakelen mislukt: {error}",
"press_enter": "Druk op Enter om door te gaan",
"start_disable": "Automatische update uitschakelen starten",
"killing_processes": "Processen verwijderen",
"processes_killed": "Processen verwijderd",
"removing_directory": "Map verwijderen",
"directory_removed": "Map verwijderd",
"creating_block_file": "Blokkeerbestand aanmaken",
"block_file_created": "Blokkeerbestand aangemaakt",
"clearing_update_yml": "Update.yml -bestand wissen",
"update_yml_cleared": "update.yml -bestand gewist",
"unsupported_os": "Niet -ondersteund OS: {System}",
"block_file_already_locked": "blokbestand is al vergrendeld",
"yml_already_locked_error": "update.yml -bestand al vergrendelde fout: {error}",
"update_yml_not_found": "update.yml -bestand niet gevonden",
"yml_locked_error": "update.yml -bestand vergrendelde fout: {error}",
"remove_directory_failed": "Kan map niet verwijderen: {error}",
"yml_already_locked": "Update.yml -bestand is al vergrendeld",
"create_block_file_failed": "Kan een blokbestand niet maken: {error}",
"block_file_locked_error": "Blokkeerbestandsfout: {error}",
"block_file_already_locked_error": "Blokkeerbestand al vergrendelde fout: {error}",
"directory_locked": "Directory is vergrendeld: {Path}",
"clear_update_yml_failed": "Kan update.yml -bestand niet wissen: {error}",
"yml_locked": "Update.yml -bestand is vergrendeld",
"block_file_locked": "blokbestand is vergrendeld"
},
"updater": {
"checking": "Controleren op updates...",
"new_version_available": "Er is een nieuwe versie beschikbaar! (Huidige versie: {current}, Laatste versie: {latest})",
"updating": "Aan het bijwerken naar de nieuwste versie. Het programma zal automatisch herstart worden.",
"up_to_date": "U gebruikt de nieuwste versie.",
"check_failed": "Controle op updates mislukt: {error}",
"continue_anyway": "Doorgaan met de huidige versie...",
"update_confirm": "Wil je de nieuwste versie gebruiken? (Y/n)",
"update_skipped": "Update overgeslagen.",
"invalid_choice": "Ongeldige keuze. Voer 'Y' of 'n' in.",
"development_version": "Ontwikkelversie {current} > {latest}",
"changelog_title": "Wijzigingslogboek",
"rate_limit_exceeded": "GitHub API -snelheidslimiet overschreden. Update check overslaan."
},
"totally_reset": {
"title": "Cursor volledig herstellen",
"checking_config": "Configuratiebestand controleren",
"config_not_found": "Configuratiebestand niet gevonden",
"no_permission": "Kan geen toegang krijgen tot configuratiebestand. Controleer de rechten",
"reading_config": "Huidige configuratie lezen",
"creating_backup": "Configuratie-back-up aanmaken",
"backup_exists": "Back-up bestand bestaat, back-up stap overgeslagen",
"generating_new_machine_id": "Nieuwe machine-ID genereren",
"saving_new_config": "Nieuwe configuratie opslaan als JSON",
"success": "Cursor succesvol hersteld",
"error": "Cursor herstellen mislukt: {error}",
"press_enter": "Druk op Enter om door te gaan",
"reset_machine_id": "Machine-ID resetten",
"database_connection_closed": "Databaseverbinding gesloten",
"database_updated_successfully": "Database succesvol bijgewerkt",
"connected_to_database": "Verbonden met database",
"updating_pair": "Sleutel-waarde paar bijwerken",
"db_not_found": "Databasebestand niet gevonden op: {path}",
"db_permission_error": "Kan geen toegang krijgen tot databasebestand. Controleer de rechten",
"db_connection_error": "Verbinding met database mislukt: {error}",
"feature_title": "Functiebeschrijving",
"feature_1": "Compleet verwijderen van Cursor AI-instellingen en configuratie",
"feature_2": "Alle cachegegevens, inclusief AI-geschiedenis en prompts",
"feature_3": "Machine-ID resetten om de proefperiode te omzeilen",
"feature_4": "Nieuwe willekeurige machine-ID maken",
"feature_5": "Aangepaste extensies en voorkeuren verwijderen",
"feature_6": "Proefperiode- en activatiegegevens resetten",
"feature_7": "Diepe scan voor verborgen licentie- en proefperiodebestanden",
"feature_8": "Beveiligde niet-Cursor-bestanden en -toepassingen behouden",
"feature_9": "Compatibel met Windows, macOS en Linux",
"disclaimer_title": "Disclaimer",
"disclaimer_1": "Deze tool verwijdert alle Cursor AI-instellingen,",
"disclaimer_2": "configuratie en cachegegevens. Deze actie is niet ongedaan te maken.",
"disclaimer_3": "Uw codebestanden **worden niet** beïnvloed, de tool is bedoeld om",
"disclaimer_4": "Alleen gericht op Cursor AI-editorbestanden en proefperiodecontrolemechanisme.",
"disclaimer_5": "Andere systemtoepassingen worden niet beïnvloed.",
"disclaimer_6": "Na het uitvoeren van deze tool moet u Cursor AI opnieuw instellen.",
"disclaimer_7": "U accepteert de risico's zelf.",
"confirm_title": "Weet u zeker dat u wilt doorgaan?",
"confirm_1": "Deze actie verwijdert alle Cursor AI-instellingen,",
"confirm_2": "configuratie en cachegegevens. Deze actie is niet ongedaan te maken.",
"confirm_3": "Uw codebestanden **worden niet** beïnvloed, de tool is bedoeld om",
"confirm_4": "Alleen gericht op Cursor AI-editorbestanden en proefperiodecontrolemechanisme.",
"confirm_5": "Andere systemtoepassingen worden niet beïnvloed.",
"confirm_6": "Na het uitvoeren van deze tool moet u Cursor AI opnieuw instellen.",
"confirm_7": "U accepteert de risico's zelf.",
"invalid_choice": "Ongeldige keuze. Voer 'Y' of 'n' in.",
"skipped_for_safety": "Uit veiligheidsoverwegingen overgeslagen (niet Cursor-gerelateerd): {path}",
"deleted": "Verwijderd: {path}",
"error_deleting": "Verwijdering van {path} mislukt: {error}",
"not_found": "Bestand niet gevonden: {path}",
"resetting_machine_id": "Machine-ID resetten om proefperiode te omzeilen...",
"created_machine_id": "Nieuwe machine-ID gemaakt: {path}",
"error_creating_machine_id": "Machine-ID-bestand {path} aanmaken mislukt: {error}",
"error_searching": "Fout bij het zoeken naar bestand {path}: {error}",
"created_extended_trial_info": "Nieuwe uitgebreide proefperiode-informatie gemaakt: {path}",
"error_creating_trial_info": "Fout bij het aanmaken van proefperiode-informatiebestand {path}: {error}",
"resetting_cursor_ai_editor": "Cursor AI-editor resetten... Wacht even.",
"reset_cancelled": "Reset geannuleerd, geen wijzigingen aangebracht.",
"windows_machine_id_modification_skipped": "Windows machine-ID-aanpassing overgeslagen: {error}",
"linux_machine_id_modification_skipped": "Linux machine-id-aanpassing overgeslagen: {error}",
"note_complete_machine_id_reset_may_require_running_as_administrator": "Opmerking: Compleet machine-ID-reset kan vereisen dat u als beheerder uitvoert",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "Opmerking: Compleet systeem machine-ID-reset kan vereisen dat u sudo-rechten hebt",
"windows_registry_instructions": "📝 Opmerking: Compleet machine-ID-reset kan vereisen dat u als beheerder uitvoert",
"windows_registry_instructions_2": " Run 'regedit' en zoek naar de sleutels 'Cursor' of 'CursorAI' in HKEY_CURRENT_USER\\Software\\ en verwijder ze.\n",
"reset_log_1": "Cursor AI is volledig hersteld en heeft de proefperiode omzeild!",
"reset_log_2": "Start het systeem opnieuw om de wijzigingen te activeren.",
"reset_log_3": "U moet Cursor AI opnieuw installeren, er zou nu een nieuwe proefperiode moeten zijn.",
"reset_log_4": "Voor de beste resultaten raden we aan ook:",
"reset_log_5": "Nieuwe proefperiode registreren met een ander e-mailadres",
"reset_log_6": "Als mogelijk, VPN gebruiken om IP-adres te wijzigen",
"reset_log_7": "Voordat u naar de Cursor AI-website gaat, verwijdert u de cookies en cache van uw browser",
"reset_log_8": "Als het nog steeds niet werkt, probeert u Cursor AI op een andere locatie te installeren",
"reset_log_9": "Als u eventuele problemen ondervindt, stuurt u een probleem naar de Github Issue Tracker: https://github.com/yeongpin/cursor-free-vip/issues",
"unexpected_error": "Onverwachte fout: {error}",
"report_issue": "Rapporteer dit probleem op de Github Issue Tracker: https://github.com/yeongpin/cursor-free-vip/issues",
"keyboard_interrupt": "Gebruiker heeft proces afgebroken, afsluiten...",
"return_to_main_menu": "Terug naar hoofdmenu...",
"process_interrupted": "Proces afgebroken, afsluiten...",
"press_enter_to_return_to_main_menu": "Druk op Enter om terug te gaan naar het hoofdmenu...",
"removing_known": "Het verwijderen van bekende proefperiode- en licentiebestanden...",
"performing_deep_scan": "Een diepe scan wordt uitgevoerd om andere proefperiode- en licentiebestanden te vinden...",
"found_additional_potential_license_trial_files": "Er zijn {count} andere potentiële proefperiode- en licentiebestanden gevonden",
"checking_for_electron_localstorage_files": "Controleren op Electron localStorage-bestanden...",
"no_additional_license_trial_files_found_in_deep_scan": "Geen andere proefperiode- of licentiebestanden gevonden in diepe scan",
"removing_electron_localstorage_files": "Het verwijderen van Electron localStorage-bestanden...",
"electron_localstorage_files_removed": "Electron localStorage-bestanden verwijderd",
"electron_localstorage_files_removal_error": "Fout bij het verwijderen van Electron localStorage-bestanden: {error}",
"removing_electron_localstorage_files_completed": "Electron localStorage-bestanden verwijderd",
"warning_title": "WAARSCHUWING",
"direct_advanced_navigation": "Directe navigatie proberen naar een geavanceerd tabblad",
"delete_input_error": "Fout bij het vinden van invoer verwijderen: {error}",
"delete_input_not_found_continuing": "Verwijder bevestigingsinvoer niet gevonden, maar probeer toch door te gaan",
"advanced_tab_not_found": "Advanced Tab niet gevonden na meerdere pogingen",
"advanced_tab_error": "Fout bij het vinden van een geavanceerd tabblad: {error}",
"delete_input_not_found": "Verwijder bevestigingsinvoer niet gevonden na meerdere pogingen",
"failed_to_delete_file": "File niet verwijderen: {Path}",
"operation_cancelled": "Bewerking geannuleerd. Verlaten zonder wijzigingen aan te brengen.",
"removed": "Verwijderd: {Path}",
"warning_6": "U moet Cursor AI opnieuw instellen na het uitvoeren van deze tool.",
"delete_input_retry": "Verwijder invoer niet gevonden, poging {poging}/{max_attempts}",
"warning_4": "om alleen Cursor AI -editorbestanden en proefdetectiemechanismen te richten.",
"cursor_reset_failed": "Cursor AI -editor Reset mislukt: {error}",
"login_redirect_failed": "Aanmeldingsomleiding is mislukt, directe navigatie uitproberen ...",
"warning_5": "Andere toepassingen op uw systeem worden niet beïnvloed.",
"failed_to_delete_file_or_directory": "File of Directory niet verwijderen: {Path}",
"failed_to_delete_directory": "Kan map niet verwijderen: {Path}",
"resetting_cursor": "Cursor AI -editor resetten ... Wacht alstublieft.",
"cursor_reset_completed": "Cursor AI -editor is volledig gereset en proefdetectie omzeild!",
"warning_3": "Uw codebestanden worden niet beïnvloed en de tool is ontworpen",
"advanced_tab_retry": "Geavanceerd tabblad niet gevonden, poging {poging}/{max_attempts}",
"completed_in": "Voltooid in {time} seconden",
"advanced_tab_clicked": "Klik op het tabblad Geavanceerd",
"already_on_settings": "Al op de instellingenpagina",
"found_danger_zone": "Gevonden gevarenzone -sectie",
"delete_button_retry": "Verwijderen knop niet gevonden, poging {poging}/{max_attempts}",
"failed_to_remove": "Kan niet worden verwijderd: {pad}",
"failed_to_reset_machine_guid": "Kan machinegewicht niet resetten",
"deep_scanning": "Diep scan uitvoeren voor extra proef-/licentiebestanden",
"delete_button_clicked": "Klik op de Account -knop Verwijderen",
"warning_7": "Gebruik op eigen risico",
"delete_button_not_found": "Verwijder Account -knop niet gevonden na meerdere pogingen",
"delete_button_error": "Fout bij het vinden van verwijderknop: {error}",
"warning_1": "Deze actie zal alle Cursor AI -instellingen verwijderen,",
"warning_2": "Configuraties en cache -gegevens. Deze actie kan niet ongedaan worden gemaakt.",
"navigating_to_settings": "Navigeren naar de instellingenpagina ...",
"cursor_reset_cancelled": "Cursor AI -editor Reset geannuleerd. Verlaten zonder wijzigingen aan te brengen."
},
"chrome_profile": {
"title": "Chrome Profiel Selectie",
"select_profile": "Selecteer een Chrome profiel om te gebruiken:",
"profile_list": "Beschikbare profielen:",
"default_profile": "Standaard Profiel",
"profile": "Profiel {number}",
"no_profiles": "Geen Chrome profielen gevonden",
"error_loading": "Fout bij laden van Chrome profielen: {error}",
"profile_selected": "Geselecteerd profiel: {profile}",
"invalid_selection": "Ongeldige selectie. Probeer het opnieuw",
"warning_chrome_close": "Waarschuwing: Dit zal alle actieve Chrome processen sluiten"
},
"restore": {
"title": "Machine-ID herstellen vanaf backup",
"starting": "Herstelproces van machine-ID starten",
"no_backups_found": "Geen backups gevonden",
"available_backups": "Beschikbare backups",
"select_backup": "Selecteer een backup om te herstellen",
"to_cancel": "om te annuleren",
"operation_cancelled": "Bewerking geannuleerd",
"invalid_selection": "Ongeldige selectie",
"please_enter_number": "Voer een geldig nummer in",
"missing_id": "Ontbrekende ID: {id}",
"read_backup_failed": "Lezen van backupbestand mislukt: {error}",
"current_file_not_found": "Huidig opslagbestand niet gevonden",
"current_backup_created": "Backup van huidig opslagbestand gemaakt",
"storage_updated": "Opslagbestand succesvol bijgewerkt",
"update_failed": "Bijwerken van opslagbestand mislukt: {error}",
"sqlite_not_found": "SQLite-database niet gevonden",
"updating_sqlite": "SQLite-database bijwerken",
"updating_pair": "Sleutel-waardepaar bijwerken",
"sqlite_updated": "SQLite-database succesvol bijgewerkt",
"sqlite_update_failed": "Bijwerken van SQLite-database mislukt: {error}",
"machine_id_backup_created": "Backup van machineId-bestand gemaakt",
"backup_creation_failed": "Maken van backup mislukt: {error}",
"machine_id_updated": "MachineId-bestand succesvol bijgewerkt",
"machine_id_update_failed": "Bijwerken van machineId-bestand mislukt: {error}",
"updating_system_ids": "Systeem-ID's bijwerken",
"system_ids_update_failed": "Bijwerken van systeem-ID's mislukt: {error}",
"permission_denied": "Toegang geweigerd. Probeer als administrator uit te voeren",
"windows_machine_guid_updated": "Windows machine-GUID succesvol bijgewerkt",
"update_windows_machine_guid_failed": "Bijwerken van Windows machine-GUID mislukt: {error}",
"windows_machine_id_updated": "Windows machine-ID succesvol bijgewerkt",
"update_windows_machine_id_failed": "Bijwerken van Windows machine-ID mislukt: {error}",
"sqm_client_key_not_found": "SQMClient registersleutel niet gevonden",
"update_windows_system_ids_failed": "Bijwerken van Windows systeem-ID's mislukt: {error}",
"macos_platform_uuid_updated": "macOS platform-UUID succesvol bijgewerkt",
"failed_to_execute_plutil_command": "Uitvoeren van plutil opdracht mislukt",
"update_macos_system_ids_failed": "Bijwerken van macOS systeem-ID's mislukt: {error}",
"ids_to_restore": "Te herstellen machine-ID's",
"confirm": "Weet u zeker dat u deze ID's wilt herstellen?",
"success": "Machine-ID succesvol hersteld",
"process_error": "Fout bij herstelproces: {error}",
"press_enter": "Druk op Enter om door te gaan"
},
"oauth": {
"no_chrome_profiles_found": "Geen chroomprofielen gevonden, met behulp van standaard",
"failed_to_delete_account": "Kan het account niet verwijderen: {error}",
"starting_new_authentication_process": "Het starten van een nieuw authenticatieproces ...",
"found_email": "E -mail gevonden: {e -mail}",
"github_start": "GitHub start",
"already_on_settings_page": "Al op de instellingenpagina!",
"starting_github_authentication": "GitHub -authenticatie starten ...",
"status_check_error": "Statuscontrolefout: {error}",
"account_is_still_valid": "Account is nog steeds geldig (gebruik: {gebruik})",
"authentication_timeout": "Verificatie time -out",
"using_first_available_chrome_profile": "Gebruik van het eerste beschikbare Chrome -profiel: {profiel}",
"usage_count": "Gebruik Count: {Usage}",
"google_start": "Google Start",
"no_compatible_browser_found": "Geen compatibele browser gevonden. Installeer Google Chrome of Chromium.",
"authentication_successful_getting_account_info": "Authenticatie succesvol, accountinformatie krijgen ...",
"found_chrome_at": "Chrome gevonden op: {Path}",
"error_getting_user_data_directory": "Fout bij het verkrijgen van gebruikersgegevens: {error}",
"error_finding_chrome_profile": "Fout bij het vinden van chroomprofiel, met standaard: {error}",
"auth_update_success": "Verzeker Succes bijwerken",
"authentication_successful": "Authenticatie succesvol - e -mail: {e -mail}",
"authentication_failed": "Authenticatie mislukt: {error}",
"warning_browser_close": "WAARSCHUWING: dit wordt alle running {browser} processen gesloten",
"supported_browsers": "Ondersteunde browsers voor {platform}",
"authentication_button_not_found": "Authenticatieknop niet gevonden",
"starting_new_google_authentication": "Nieuwe Google -authenticatie starten ...",
"waiting_for_authentication": "Wachten op authenticatie ...",
"found_default_chrome_profile": "Standaard Chrome -profiel gevonden",
"starting_browser": "Browser starten op: {path}",
"could_not_check_usage_count": "Kon het aantal gebruik niet controleren: {error}",
"token_extraction_error": "Token -extractiefout: {error}",
"profile_selection_error": "Fout tijdens profielselectie: {error}",
"warning_could_not_kill_existing_browser_processes": "Waarschuwing: kon bestaande browserprocessen niet doden: {error}",
"browser_failed_to_start": "Browser kon niet beginnen: {error}",
"starting_re_authentication_process": "Beginnen met her-authenticatieproces ...",
"redirecting_to_authenticator_cursor_sh": "Omleidend naar authenticator.cursor.sh ...",
"found_browser_data_directory": "BROWSER Data Directory gevonden: {Path}",
"browser_not_found_trying_chrome": "Kon {browser} niet vinden, in plaats daarvan chroom proberen",
"found_cookies": "Gevonden {count} cookies",
"auth_update_failed": "AUTH -update is mislukt",
"failed_to_delete_expired_account": "Kan de verlopen account niet verwijderen",
"browser_failed_to_start_fallback": "Browser kon niet beginnen: {error}",
"navigating_to_authentication_page": "Navigeren naar de authenticatiepagina ...",
"browser_closed": "Browser gesloten",
"initializing_browser_setup": "Initialiseren van browseropstelling ...",
"failed_to_delete_account_or_re_authenticate": "Kan de account niet verwijderen of opnieuw authenticeren: {error}",
"detected_platform": "Gedetecteerd platform: {platform}",
"failed_to_extract_auth_info": "Verificatie info niet extraheren: {error}",
"starting_google_authentication": "Google -authenticatie starten ...",
"browser_failed": "Browser kon niet beginnen: {error}",
"using_browser_profile": "Gebruik browserprofiel: {profiel}",
"consider_running_without_sudo": "Overweeg om het script zonder sudo uit te voeren",
"try_running_without_sudo_admin": "Probeer te rennen zonder sudo/beheerdersrechten",
"page_changed_checking_auth": "Pagina gewijzigd, auth -controle ...",
"running_as_root_warning": "Runnen als root wordt niet aanbevolen voor browserautomatisering",
"please_select_your_google_account_to_continue": "Selecteer uw Google -account om door te gaan ...",
"browser_setup_failed": "Browser -instelling is mislukt: {error}",
"missing_authentication_data": "Ontbrekende authenticatiegegevens: {data}",
"using_configured_browser_path": "Gebruik geconfigureerd {browser} pad: {Path}",
"could_not_find_usage_count": "Kon het aantal gebruik niet vinden: {error}",
"killing_browser_processes": "Doden {browser} processen ...",
"account_has_reached_maximum_usage": "Account heeft maximaal gebruik bereikt, {verwijderen}",
"browser_setup_completed": "Browser setup met succes voltooid",
"could_not_find_email": "Kon geen e -mail vinden: {error}",
"user_data_dir_not_found": "{Browser} Gebruikersgegevensdirectory die niet wordt gevonden op {Path}, zal in plaats daarvan Chrome proberen",
"found_browser_user_data_dir": "Gevonden {browser} gebruikersgegevens map: {Path}",
"invalid_authentication_type": "Ongeldig authenticatietype"
},
"manual_auth": {
"auth_type_selected": "Geselecteerd authenticatietype: {Type}",
"proceed_prompt": "Doorgaan? (J/N):",
"auth_type_github": "Gitub",
"confirm_prompt": "Bevestig de volgende informatie:",
"invalid_token": "Ongeldig token. Authenticatie afgebroken.",
"continue_anyway": "Blijf eigenlijk doorgaan? (J/N):",
"token_verified": "Token heeft met succes geverifieerd!",
"error": "Fout: {error}",
"auth_update_failed": "Verificatieinformatie niet bijwerken",
"auth_type_auth0": "Auth_0 (standaard)",
"auth_type_prompt": "Selecteer Authenticatietype:",
"verifying_token": "Het verifiëren van de validiteit van token ...",
"auth_updated_successfully": "Authenticatie -informatie met succes bijgewerkt!",
"email_prompt": "Voer e -mail in (laat leeg voor willekeurige e -mail):",
"token_prompt": "Voer uw cursor -token in (access_token/refresh_token):",
"title": "Handmatige cursorauthenticatie",
"token_verification_skipped": "Token verificatie overgeslagen (check_user_autorized.py niet gevonden)",
"random_email_generated": "Willekeurige e -mail gegenereerd: {e -mail}",
"token_required": "Token is vereist",
"auth_type_google": "Google",
"operation_cancelled": "Operatie geannuleerd",
"token_verification_error": "Fout bij het verifiëren van token: {error}",
"updating_database": "Cursor authenticatiedatabase bijwerken ..."
},
"account_delete": {
"delete_input_not_found": "Verwijder bevestigingsinvoer niet gevonden na meerdere pogingen",
"confirm_button_not_found": "Bevestig de knop niet gevonden na meerdere pogingen",
"logging_in": "Inloggen met Google ...",
"confirm_button_error": "Fout bij het vinden van bevestigen: {error}",
"delete_button_clicked": "Klik op de Account -knop Verwijderen",
"confirm_prompt": "Weet u zeker dat u verder wilt gaan? (J/N):",
"delete_button_error": "Fout bij het vinden van verwijderknop: {error}",
"cancelled": "Accountverwijdering geannuleerd.",
"error": "Fout tijdens het verwijderen van accounts: {error}",
"interrupted": "Accountverwijderingsproces onderbroken door de gebruiker.",
"delete_input_not_found_continuing": "Verwijder bevestigingsinvoer niet gevonden, maar probeer toch door te gaan",
"advanced_tab_retry": "Geavanceerd tabblad niet gevonden, poging {poging}/{max_attempts}",
"waiting_for_auth": "Wachten op Google -authenticatie ...",
"typed_delete": "Getypt \"verwijderen\" in bevestigingsvak",
"trying_settings": "Proberen naar de pagina Instellingen te navigeren ...",
"delete_input_retry": "Verwijder invoer niet gevonden, poging {poging}/{max_attempts}",
"email_not_found": "E -mail niet gevonden: {error}",
"delete_button_not_found": "Verwijder Account -knop niet gevonden na meerdere pogingen",
"already_on_settings": "Al op de instellingenpagina",
"failed": "Accountverwijderingsproces is mislukt of werd geannuleerd.",
"warning": "Waarschuwing: dit zal uw cursoraccount permanent verwijderen. Deze actie kan niet ongedaan worden gemaakt.",
"direct_advanced_navigation": "Directe navigatie proberen naar een geavanceerd tabblad",
"advanced_tab_not_found": "Advanced Tab niet gevonden na meerdere pogingen",
"auth_timeout": "Time -out van authenticatie, toch doorgaan ...",
"select_google_account": "Selecteer uw Google -account ...",
"google_button_not_found": "Google inlogknop niet gevonden",
"found_danger_zone": "Gevonden gevarenzone -sectie",
"account_deleted": "Account met succes verwijderd!",
"advanced_tab_error": "Fout bij het vinden van een geavanceerd tabblad: {error}",
"starting_process": "Beginnende accountverwijderingsproces ...",
"delete_button_retry": "Verwijderen knop niet gevonden, poging {poging}/{max_attempts}",
"login_redirect_failed": "Aanmeldingsomleiding is mislukt, directe navigatie uitproberen ...",
"unexpected_error": "Onverwachte fout: {error}",
"login_successful": "Log succesvol in",
"delete_input_error": "Fout bij het vinden van invoer verwijderen: {error}",
"advanced_tab_clicked": "Klik op het tabblad Geavanceerd",
"unexpected_page": "Onverwachte pagina na inloggen: {url}",
"found_email": "E -mail gevonden: {e -mail}",
"title": "Cursor Google Account Deletion Tool",
"navigating_to_settings": "Navigeren naar de instellingenpagina ...",
"success": "Uw cursoraccount is met succes verwijderd!",
"confirm_button_retry": "Bevestig knop niet gevonden, poging {poging}/{max_attempts}"
},
"auth_check": {
"token_length": "Tokenlengte: {lengte} tekens",
"usage_response_status": "Gebruiksresponsstatus: {response}",
"operation_cancelled": "Bewerking geannuleerd door gebruiker",
"error_getting_token_from_db": "Fout om uit database te komen: {error}",
"checking_usage_information": "Gebruiksinformatie controleren ...",
"usage_response": "Gebruiksrespons: {response}",
"authorization_failed": "Autorisatie is mislukt!",
"authorization_successful": "Autorisatie succesvol!",
"request_timeout": "Verzoek getimed uit",
"check_error": "Foutcontrole -autorisatie: {error}",
"connection_error": "Verbindingsfout",
"invalid_token": "Ongeldig token",
"check_usage_response": "Controleer gebruiksreactie: {response}",
"enter_token": "Voer uw cursor -token in:",
"token_found_in_db": "Token gevonden in database",
"user_unauthorized": "Gebruiker is ongeautoriseerd",
"checking_authorization": "Autorisatie controleren ...",
"error_generating_checksum": "Fout genereren controlesom: {error}",
"token_source": "Token uit de database of handmatig invoer? (D/M, standaard: D)",
"unexpected_error": "Onverwachte fout: {error}",
"user_authorized": "Gebruiker is geautoriseerd",
"token_not_found_in_db": "Token niet gevonden in database",
"jwt_token_warning": "Token lijkt in JWT -indeling te zijn, maar API -controle heeft een onverwachte statuscode geretourneerd. Het token kan geldig zijn, maar API -toegang is beperkt.",
"unexpected_status_code": "Onverwachte statuscode: {code}",
"getting_token_from_db": "Token uit de database ...",
"cursor_acc_info_not_found": "cursor_acc_info.py niet gevonden"
},
"token": {
"refreshing": "Verfrissend token ...",
"extraction_error": "Fout bij het extraheren van token: {error}",
"no_access_token": "Geen toegang token als reactie",
"invalid_response": "Ongeldige JSON -reactie van Refresh Server",
"connection_error": "Verbindingsfout om de server te vernieuwen",
"unexpected_error": "Onverwachte fout tijdens tokenvernieuwing: {error}",
"server_error": "Vernieuw de serverfout: http {status}",
"refresh_success": "Token met succes verfrist! Geldig voor {dagen} dagen (verloopt: {verlopen})",
"request_timeout": "Verzoek om de server te vernieuwen",
"refresh_failed": "Token Vernieuwen is mislukt: {error}"
},
"browser_profile": {
"profile_selected": "Geselecteerd profiel: {profiel}",
"default_profile": "Standaardprofiel",
"no_profiles": "Geen {browser} profielen gevonden",
"select_profile": "Selecteer {browser} profiel om te gebruiken:",
"error_loading": "Fout laden {browser} profielen: {error}",
"invalid_selection": "Ongeldige selectie. Probeer het opnieuw.",
"title": "Selectie van browserprofiel",
"profile": "Profiel {nummer}",
"profile_list": "Beschikbaar {browser} profielen:"
},
"github_register": {
"feature2": "Registreert een nieuw GitHub -account met willekeurige referenties.",
"feature6": "Slaat alle referenties op een bestand op.",
"starting_automation": "Automatisering starten ...",
"feature1": "Genereert een tijdelijke e -mail met 1SecMail.",
"title": "GitHub + Cursor AI Registratieautomatisering",
"github_username": "GitHub -gebruikersnaam",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Controleer browservensters op handmatige interventie of probeer het later opnieuw.",
"warning1": "Dit script automatiseert het maken van accounts, die GitHub/Cursor -servicevoorwaarden kan schenden.",
"feature4": "Logt aan bij Cursor AI met behulp van GitHub -authenticatie.",
"completed_successfully": "GitHub + Cursor -registratie is met succes voltooid!",
"invalid_choice": "Ongeldige keuze. Voer 'ja' of 'nee' in",
"warning2": "Vereist internettoegang en administratieve privileges.",
"registration_encountered_issues": "GitHub + Cursor -registratie ondervindt problemen.",
"credentials_saved": "Deze referenties zijn opgeslagen in github_cursor_accounts.txt",
"feature3": "Verifieert de GitHub -e -mail automatisch.",
"github_password": "GitHub -wachtwoord",
"features_header": "Functies",
"feature5": "Reset de machine -ID om proefdetectie te omzeilen.",
"warning4": "Gebruik verantwoord en op eigen risico.",
"warning3": "Captcha of aanvullende verificatie kan automatisering onderbreken.",
"cancelled": "Operatie geannuleerd",
"warnings_header": "Waarschuwingen",
"program_terminated": "Programma beëindigd door gebruiker",
"confirm": "Weet u zeker dat u verder wilt gaan?",
"email_address": "E -mailadres"
},
"account_info": {
"subscription": "Abonnement",
"failed_to_get_account_info": "Kan accountgegevens niet krijgen",
"subscription_type": "Type abonnement",
"pro": "Pro",
"failed_to_get_account": "Kan accountgegevens niet krijgen",
"config_not_found": "Configuratie niet gevonden.",
"premium_usage": "Premium gebruik",
"failed_to_get_subscription": "Kreef niet om abonnementsinformatie te krijgen",
"basic_usage": "Basisgebruik",
"premium": "Premie",
"free": "Vrij",
"email_not_found": "E -mail niet gevonden",
"title": "Accountinformatie",
"inactive": "Inactief",
"remaining_trial": "Resterende proef",
"enterprise": "Onderneming",
"usage_not_found": "Gebruik niet gevonden",
"failed_to_get_usage": "Kan geen gebruiksinformatie krijgen",
"lifetime_access_enabled": "Lifetime Access ingeschakeld",
"days_remaining": "Resterende dagen",
"failed_to_get_token": "Kan geen token krijgen",
"token": "Boord",
"subscription_not_found": "Abonnementsinformatie niet gevonden",
"days": "dagen",
"team": "Team",
"token_not_found": "Token niet gevonden",
"active": "Actief",
"email": "E -mail",
"failed_to_get_email": "Niet -e -mailadres ontvangen",
"pro_trial": "Pro -proef",
"trial_remaining": "Resterende pro -proef",
"usage": "Gebruik"
},
"config": {
"configuration": "Configuratie",
"config_updated": "Config bijgewerkt",
"file_owner": "Bestandseigenaar: {eigenaar}",
"error_checking_linux_paths": "Fout bij het controleren van Linux -paden: {error}",
"storage_file_is_empty": "Opslagbestand is leeg: {opslag_path}",
"config_directory": "Configuratiemirectory",
"documents_path_not_found": "Documentenpad niet gevonden, met behulp van de huidige map",
"config_not_available": "Configuratie niet beschikbaar",
"neither_cursor_nor_cursor_directory_found": "Cursor noch cursor directory gevonden in {config_base}",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Zorg ervoor dat de cursor is geïnstalleerd en is minstens één keer uitgevoerd",
"using_temp_dir": "Tijdelijke map gebruiken vanwege fout: {Path} (Error: {error})",
"config_created": "Config gemaakt: {config_file}",
"storage_file_not_found": "Opslagbestand niet gevonden: {storage_path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "Het bestand kan worden beschadigd, installeer de cursor opnieuw",
"error_getting_file_stats": "Fout bij het verkrijgen van bestandsstatistieken: {error}",
"enabled": "Ingeschakeld",
"backup_created": "Back -up gemaakt: {Path}",
"file_permissions": "Bestandsrechten: {machtigingen}",
"config_setup_error": "Foutinstelling Config: {error}",
"config_force_update_enabled": "Config File Force Update ingeschakeld, Forced Update uitvoeren",
"config_removed": "Config -bestand verwijderd voor gedwongen update",
"file_size": "Bestandsgrootte: {size} bytes",
"error_reading_storage_file": "Fout lezen opslagbestand: {error}",
"config_force_update_disabled": "Config File Force Update uitgeschakeld, overgeslagen update overslaan",
"config_dir_created": "Configuratiemirectory gemaakt: {Path}",
"config_option_added": "Configuratie Optie toegevoegd: {Option}",
"file_group": "Bestandsgroep: {Group}",
"and": "En",
"backup_failed": "Niet back -up van configuratie: {error}",
"force_update_failed": "Force Update Config mislukt: {error}",
"storage_directory_not_found": "Opslagmap niet gevonden: {storage_dir}",
"also_checked": "Ook gecontroleerd {pad}",
"disabled": "Gehandicapt",
"storage_file_found": "Opslagbestand gevonden: {opslag_path}",
"try_running": "Probeer te runnen: {command}",
"storage_file_is_valid_and_contains_data": "Opslagbestand is geldig en bevat gegevens",
"permission_denied": "Toestemming geweigerd: {storage_path}"
},
"bypass": {
"found_product_json": "Gevonden product.json: {Path}",
"starting": "Cursor -versie beginnen met bypass ...",
"version_updated": "Versie bijgewerkt van {Old} naar {nieuw}",
"menu_option": "Bypass cursorversie controle",
"unsupported_os": "Niet -ondersteund besturingssysteem: {System}",
"backup_created": "Back -up gemaakt: {Path}",
"current_version": "Huidige versie: {versie}",
"localappdata_not_found": "LocalAppData omgevingsvariabele niet gevonden",
"no_write_permission": "Geen toestemming voor het bestand: {Path}",
"write_failed": "Kan Product.json niet schrijven: {error}",
"description": "Deze tool wijzigt Cursor's Product.json om versiebeperkingen te omzeilen",
"bypass_failed": "Versie -bypass mislukt: {error}",
"title": "Cursorversie Bypass Tool",
"no_update_needed": "Geen update nodig. Huidige versie {versie} is al> = 0.46.0",
"read_failed": "Faalde om product.json te lezen: {error}",
"stack_trace": "Stapelspoor",
"product_json_not_found": "Product.json niet gevonden in gemeenschappelijke Linux -paden",
"file_not_found": "Bestand niet gevonden: {Path}"
},
"bypass_token_limit": {
"description": "Deze tool wijzigt het bestand Workbench.desktop.main.js om de tokenlimiet te omzeilen",
"press_enter": "Druk op Enter om door te gaan ...",
"title": "Omzeilen token limiet tool"
},
"tempmail": {
"no_email": "Geen cursorverificatie -e -mail gevonden",
"general_error": "Er is een fout opgetreden: {error}",
"config_error": "Config -bestandsfout: {error}",
"checking_email": "Controleren op cursorverificatie -e -mail ...",
"extract_code_failed": "Extract Verificatiecode mislukt: {error}",
"configured_email": "Geconfigureerd e -mail: {e -mail}",
"no_code": "Kon geen verificatiecode krijgen",
"email_found": "Cursor Verificatie -e -mail gevonden",
"check_email_failed": "Controleer e -mail mislukt: {error}",
"verification_code": "Verificatiecode: {code}"
}
}

878
locales/pt.json Normal file
View File

@ -0,0 +1,878 @@
{
"menu": {
"title": "Opções Disponíveis",
"exit": "Sair do Programa",
"reset": "Redefinir ID da Máquina",
"register": "Registrar Nova Conta no Cursor",
"register_google": "Registrar com Conta do Google",
"register_github": "Registrar com Conta do GitHub",
"register_manual": "Registrar Cursor com E-mail Personalizado",
"quit": "Fechar Cursor",
"select_language": "Alterar Idioma",
"input_choice": "Por favor, insira sua escolha ({choices})",
"invalid_choice": "Seleção inválida. Insira um número de {choices}",
"program_terminated": "Programa encerrado pelo usuário",
"error_occurred": "Ocorreu um erro: {error}. Por favor, tente novamente",
"press_enter": "Pressione Enter para Sair",
"disable_auto_update": "Desativar Atualização Automática do Cursor",
"lifetime_access_enabled": "ACESSO VITALÍCIO HABILITADO",
"totally_reset": "Redefinir Cursor Completamente",
"outdate": "Obsoleto",
"temp_github_register": "Registro temporário do GitHub",
"coming_soon": "Em breve",
"fixed_soon": "Será corrigido em breve",
"contribute": "Contribuir para o Projeto",
"config": "Mostrar Configuração",
"delete_google_account": "Excluir Conta Google do Cursor",
"continue_prompt": "Continuar? (y/N): ",
"operation_cancelled_by_user": "Operação cancelada pelo usuário",
"exiting": "Saindo ......",
"bypass_version_check": "Ignorar Verificação de Versão do Cursor",
"check_user_authorized": "Verificar Autorização do Usuário",
"bypass_token_limit": "Contornar Limite de Tokens",
"restore_machine_id": "Restaurar ID da Máquina do Backup",
"select_chrome_profile": "Selecione o perfil do Chrome",
"admin_required": "Em execução como executável, os privilégios do administrador são necessários.",
"language_config_saved": "Configuração do idioma economizou com sucesso",
"lang_invalid_choice": "Escolha inválida. Por favor, insira uma das seguintes opções: ({Lang_Choices})",
"manual_custom_auth": "Auth personalizado manual",
"admin_required_continue": "Continuando sem privilégios de administrador."
},
"languages": {
"ar": "Árabe",
"en": "Inglês",
"zh_cn": "Chinês Simplificado",
"zh_tw": "Chinês Tradicional",
"vi": "Vietnamita",
"nl": "Holandês",
"de": "Alemão",
"fr": "Francês",
"pt": "Português do Brasil",
"ru": "Russo",
"es": "Espanhol",
"bg": "búlgaro",
"tr": "turco",
"ja": "japonês",
"it": "italiano"
},
"quit_cursor": {
"start": "Iniciando fechamento do Cursor",
"no_process": "Nenhum processo do Cursor em execução",
"terminating": "Encerrando processo {pid}",
"waiting": "Aguardando o processo ser finalizado",
"success": "Todos os processos do Cursor foram encerrados",
"timeout": "Tempo limite do processo: {pids}",
"error": "Ocorreu um erro: {error}"
},
"reset": {
"title": "Ferramenta de Redefinição de ID da Máquina",
"checking": "Verificando arquivo de configuração",
"not_found": "Arquivo de configuração não encontrado",
"no_permission": "Não é possível ler ou escrever no arquivo de configuração. Verifique as permissões do arquivo",
"reading": "Lendo configuração atual",
"creating_backup": "Criando backup da configuração",
"backup_exists": "Arquivo de backup já existe, pulando etapa de backup",
"generating": "Gerando novo ID da máquina",
"saving_json": "Salvando nova configuração no JSON",
"success": "ID da Máquina redefinido com sucesso",
"new_id": "Novo ID da Máquina",
"permission_error": "Erro de permissão: {error}",
"run_as_admin": "Tente executar este programa como Administrador",
"process_error": "Erro no processo de redefinição: {error}",
"updating_sqlite": "Atualizando banco de dados SQLite",
"updating_pair": "Atualizando chave-valor",
"sqlite_success": "Banco de dados SQLite atualizado com sucesso",
"sqlite_error": "Falha na atualização do banco de dados SQLite: {error}",
"press_enter": "Pressione Enter para sair",
"unsupported_os": "Sistema operacional não suportado: {os}",
"linux_path_not_found": "Caminho do Linux não encontrado",
"updating_system_ids": "Atualizando IDs do sistema",
"system_ids_updated": "IDs do sistema atualizados com sucesso",
"system_ids_update_failed": "Falha na atualização dos IDs do sistema: {error}",
"windows_guid_updated": "GUID do Windows atualizado com sucesso",
"windows_permission_denied": "Permissão negada no Windows",
"windows_guid_update_failed": "Falha na atualização do GUID do Windows",
"macos_uuid_updated": "UUID do macOS atualizado com sucesso",
"plutil_command_failed": "Falha no comando plutil",
"start_patching": "Iniciando correção de getMachineId",
"macos_uuid_update_failed": "Falha na atualização do UUID do macOS",
"current_version": "Versão atual do Cursor: {version}",
"patch_completed": "Correção de getMachineId concluída",
"patch_failed": "Falha na correção de getMachineId: {error}",
"version_check_passed": "Verificação de versão do Cursor aprovada",
"file_modified": "Arquivo modificado",
"version_less_than_0_45": "Versão do Cursor < 0.45.0, pulando correção de getMachineId",
"detecting_version": "Detectando versão do Cursor",
"patching_getmachineid": "Corrigindo getMachineId",
"version_greater_than_0_45": "Versão do Cursor >= 0.45.0, corrigindo getMachineId",
"permission_denied": "Permissão negada: {error}",
"backup_created": "Backup criado",
"update_success": "Atualização concluída com sucesso",
"update_failed": "Falha na atualização: {error}",
"windows_machine_guid_updated": "GUID da máquina do Windows atualizado com sucesso",
"reading_package_json": "Lendo package.json {path}",
"invalid_json_object": "Objeto JSON inválido",
"no_version_field": "Campo de versão não encontrado no package.json",
"version_field_empty": "Campo de versão está vazio",
"invalid_version_format": "Formato de versão inválido: {version}",
"found_version": "Versão encontrada: {version}",
"version_parse_error": "Erro ao analisar versão: {error}",
"package_not_found": "Package.json não encontrado: {path}",
"check_version_failed": "Falha ao verificar versão: {error}",
"stack_trace": "Rastreamento de pilha",
"version_too_low": "Versão do Cursor muito baixa: {version} < 0.45.0",
"update_windows_machine_id_failed": "Atualizar o ID do Windows Machine falhou: {Error}",
"windows_machine_id_updated": "ID da máquina do Windows atualizado com sucesso",
"path_not_found": "Caminho não encontrado: {caminho}",
"update_windows_machine_guid_failed": "Atualizar o Windows Machine Guid falhou: {Error}",
"no_write_permission": "Sem permissão de gravação: {caminho}",
"file_not_found": "Arquivo não encontrado: {caminho}",
"modify_file_failed": "Modificar o arquivo falhado: {erro}"
},
"register": {
"title": "Ferramenta de Registro do Cursor",
"start": "Iniciando o processo de registro...",
"handling_turnstile": "Processando verificação de segurança...",
"retry_verification": "Tentando novamente a verificação...",
"detect_turnstile": "Verificando validação de segurança...",
"verification_success": "Verificação de segurança bem-sucedida",
"starting_browser": "Abrindo navegador...",
"form_success": "Formulário enviado com sucesso",
"browser_started": "Navegador aberto com sucesso",
"waiting_for_second_verification": "Aguardando verificação por e-mail...",
"waiting_for_verification_code": "Aguardando código de verificação...",
"password_success": "Senha definida com sucesso",
"password_error": "Não foi possível definir a senha: {error}. Por favor, tente novamente",
"waiting_for_page_load": "Carregando página...",
"first_verification_passed": "Verificação inicial bem-sucedida",
"mailbox": "Caixa de entrada de e-mail acessada com sucesso",
"register_start": "Iniciar Registro",
"form_submitted": "Formulário Enviado, Iniciando Verificação...",
"filling_form": "Preenchendo Formulário",
"visiting_url": "Visitando URL",
"basic_info": "Informações básicas enviadas",
"handle_turnstile": "Processar Turnstile",
"no_turnstile": "Turnstile Não Detectado",
"turnstile_passed": "Turnstile Passado",
"verification_start": "Iniciando Obtenção do Código de Verificação",
"verification_timeout": "Tempo Esgotado para Obter Código de Verificação",
"verification_not_found": "Nenhum Código de Verificação Encontrado",
"try_get_code": "Tentativa | {attempt} Obter Código de Verificação | Tempo Restante: {time}s",
"get_account": "Obtendo Informações da Conta",
"get_token": "Obtendo Token da Sessão do Cursor",
"token_success": "Token Obtido com Sucesso",
"token_attempt": "Tentativa | {attempt} de obter o Token | Tentando novamente em {time}s",
"token_max_attempts": "Número máximo de tentativas atingido ({max}) | Falha ao obter o Token",
"token_failed": "Falha ao Obter Token: {error}",
"account_error": "Falha ao Obter Informações da Conta: {error}",
"press_enter": "Pressione Enter para sair",
"browser_start": "Iniciando Navegador",
"open_mailbox": "Abrindo Página da Caixa de Entrada",
"email_error": "Falha ao obter endereço de e-mail",
"setup_error": "Erro de configuração do e-mail: {error}",
"start_getting_verification_code": "Iniciando obtenção do código de verificação, tentará em 60s",
"get_verification_code_timeout": "Tempo Esgotado para Obter Código de Verificação",
"get_verification_code_success": "Código de Verificação Obtido com Sucesso",
"try_get_verification_code": "Tentativa | {attempt} Obter Código de Verificação | Tempo Restante: {remaining_time}s",
"verification_code_filled": "Código de Verificação Preenchido",
"login_success_and_jump_to_settings_page": "Login bem-sucedido, indo para a página de configurações",
"detect_login_page": "Página de login detectada, iniciando login...",
"cursor_registration_completed": "Registro do Cursor Concluído!",
"set_password": "Definir Senha",
"basic_info_submitted": "Informações Básicas Enviadas",
"cursor_auth_info_updated": "Informações de Autenticação do Cursor Atualizadas",
"cursor_auth_info_update_failed": "Falha ao Atualizar Informações de Autenticação do Cursor",
"reset_machine_id": "Reiniciar ID da Máquina",
"account_info_saved": "Informações da Conta Salvas",
"save_account_info_failed": "Falha ao Salvar Informações da Conta",
"get_email_address": "Obtendo Endereço de E-mail",
"update_cursor_auth_info": "Atualizar Informações de Autenticação do Cursor",
"register_process_error": "Erro no Processo de Registro: {error}",
"setting_password": "Configurando Senha",
"manual_code_input": "Inserção Manual do Código",
"manual_email_input": "Inserção Manual de E-mail",
"password": "Senha",
"first_name": "Nome",
"last_name": "Sobrenome",
"exit_signal": "Sinal para Sair",
"email_address": "Endereço de E-mail",
"config_created": "Configuração Criada",
"verification_failed": "Falha na Verificação",
"verification_error": "Erro de Verificação: {error}",
"config_option_added": "Opção de Configuração Adicionada: {option}",
"config_updated": "Configuração Atualizada",
"password_submitted": "Senha Enviada",
"total_usage": "Uso Total: {usage}",
"setting_on_password": "Configurando Senha",
"getting_code": "Obtendo Código de Verificação, Tentará em 60s",
"using_browser": "Usando {navegador} navegador: {caminho}",
"could_not_track_processes": "Não foi possível rastrear {navegador} processos: {error}",
"try_install_browser": "Tente instalar o navegador com seu gerenciador de pacotes",
"tempmail_plus_verification_started": "Processo de verificação de tempmailplus inicial",
"max_retries_reached": "Tentativas máximas de repetição alcançadas. O registro falhou.",
"tempmail_plus_enabled": "Tempmailplus está ativado",
"browser_path_invalid": "{navegador} O caminho é inválido, usando o caminho padrão",
"human_verify_error": "Não é possível verificar se o usuário é humano. Representando ...",
"using_tempmail_plus": "Usando o tempmailplus para verificação de email",
"tracking_processes": "Rastreamento {count} {navegador} processos",
"tempmail_plus_epin_missing": "Tempmailplus epin não está configurado",
"tempmail_plus_verification_failed": "Verificação do tempmailplus falhou: {error}",
"using_browser_profile": "Usando {navegador} perfil de: {user_data_dir}",
"tempmail_plus_verification_completed": "Verificação de tempmailplus concluída com êxito",
"tempmail_plus_email_missing": "O e -mail tempmailplus não está configurado",
"tempmail_plus_config_missing": "Falta a configuração tempmailplus",
"tempmail_plus_init_failed": "Falha ao inicializar o tempmailplus: {error}",
"tempmail_plus_initialized": "Tempmailplus inicializou com sucesso",
"tempmail_plus_disabled": "Tempmailplus está desativado",
"no_new_processes_detected": "Nenhum novo {navegador} processos detectados para rastrear",
"make_sure_browser_is_properly_installed": "Verifique se {navegador} está instalado corretamente"
},
"auth": {
"title": "Gerenciador de Autenticação do Cursor",
"checking_auth": "Verificando arquivo de autenticação",
"auth_not_found": "Arquivo de autenticação não encontrado",
"auth_file_error": "Erro no arquivo de autenticação: {error}",
"reading_auth": "Lendo arquivo de autenticação",
"updating_auth": "Atualizando informações de autenticação",
"auth_updated": "Informações de autenticação atualizadas com sucesso",
"auth_update_failed": "Falha ao atualizar informações de autenticação: {error}",
"auth_file_created": "Arquivo de autenticação criado",
"auth_file_create_failed": "Falha ao criar arquivo de autenticação: {error}",
"press_enter": "Pressione Enter para sair",
"reset_machine_id": "Redefinir ID da máquina",
"database_connection_closed": "Conexão com o banco de dados fechada",
"database_updated_successfully": "Banco de dados atualizado com sucesso",
"connected_to_database": "Conectado ao banco de dados",
"updating_pair": "Atualizando par chave-valor",
"db_not_found": "Arquivo do banco de dados não encontrado em: {path}",
"db_permission_error": "Não é possível acessar o arquivo do banco de dados. Verifique as permissões",
"db_connection_error": "Falha ao conectar ao banco de dados: {error}"
},
"control": {
"generate_email": "Gerando novo e-mail",
"blocked_domain": "Domínio bloqueado",
"select_domain": "Selecionando domínio aleatório",
"copy_email": "Copiando endereço de e-mail",
"enter_mailbox": "Entrando na caixa de entrada",
"refresh_mailbox": "Atualizando caixa de entrada",
"check_verification": "Verificando código de verificação",
"verification_found": "Código de verificação encontrado",
"verification_not_found": "Nenhum código de verificação encontrado",
"browser_error": "Erro no controle do navegador: {error}",
"navigation_error": "Erro de navegação: {error}",
"email_copy_error": "Erro ao copiar e-mail: {error}",
"mailbox_error": "Erro na caixa de entrada: {error}",
"token_saved_to_file": "Token salvo em cursor_tokens.txt",
"navigate_to": "Navegando para {url}",
"generate_email_success": "E-mail gerado com sucesso",
"select_email_domain": "Selecionar domínio de e-mail",
"select_email_domain_success": "Domínio de e-mail selecionado com sucesso",
"get_email_name": "Obtendo nome do e-mail",
"get_email_name_success": "Nome do e-mail obtido com sucesso",
"get_email_address": "Obtendo endereço de e-mail",
"get_email_address_success": "Endereço de e-mail obtido com sucesso",
"enter_mailbox_success": "Entrada na caixa de entrada bem-sucedida",
"found_verification_code": "Código de verificação encontrado",
"get_cursor_session_token": "Obtendo token da sessão do Cursor",
"get_cursor_session_token_success": "Token da sessão do Cursor obtido com sucesso",
"get_cursor_session_token_failed": "Falha ao obter token da sessão do Cursor",
"save_token_failed": "Falha ao salvar o token",
"database_updated_successfully": "Banco de dados atualizado com sucesso",
"database_connection_closed": "Conexão com o banco de dados fechada",
"no_valid_verification_code": "Nenhum código de verificação válido"
},
"email": {
"starting_browser": "Iniciando navegador",
"visiting_site": "Visitando domínios de e-mail",
"create_success": "E-mail criado com sucesso",
"create_failed": "Falha ao criar e-mail",
"create_error": "Erro ao criar e-mail: {error}",
"refreshing": "Atualizando e-mail",
"refresh_success": "E-mail atualizado com sucesso",
"refresh_error": "Erro ao atualizar e-mail: {error}",
"refresh_button_not_found": "Botão de atualização não encontrado",
"verification_found": "Verificação encontrada",
"verification_not_found": "Verificação não encontrada",
"verification_error": "Erro na verificação: {error}",
"verification_code_found": "Código de verificação encontrado",
"verification_code_not_found": "Código de verificação não encontrado",
"verification_code_error": "Erro no código de verificação: {error}",
"address": "Endereço de e-mail",
"all_domains_blocked": "Todos os domínios bloqueados, alternando serviço",
"no_available_domains_after_filtering": "Nenhum domínio disponível após filtragem",
"switching_service": "Alternando para o serviço {service}",
"domains_list_error": "Falha ao obter lista de domínios: {error}",
"failed_to_get_available_domains": "Falha ao obter domínios disponíveis",
"domains_excluded": "Domínios excluídos: {domains}",
"failed_to_create_account": "Falha ao criar conta",
"account_creation_error": "Erro na criação da conta: {error}",
"blocked_domains": "Domínios bloqueados: {domains}",
"blocked_domains_loaded": "Domínios bloqueados carregados: {count}",
"blocked_domains_loaded_error": "Erro ao carregar domínios bloqueados: {error}",
"blocked_domains_loaded_success": "Domínios bloqueados carregados com sucesso",
"blocked_domains_loaded_timeout": "Tempo esgotado ao carregar domínios bloqueados: {timeout}s",
"blocked_domains_loaded_timeout_error": "Erro de tempo esgotado ao carregar domínios bloqueados: {error}",
"available_domains_loaded": "Domínios disponíveis carregados: {count}",
"domains_filtered": "Domínios filtrados: {count}",
"trying_to_create_email": "Tentando criar e-mail: {email}",
"domain_blocked": "Domínio bloqueado: {domain}",
"no_display_found": "Nenhuma tela encontrada. Verifique se o X servidor está em execução.",
"try_export_display": "Tente: exportar exibição =: 0",
"try_install_chromium": "Tente: sudo apt install-navegador de cromo",
"extension_load_error": "Erro de carga de extensão: {erro}",
"make_sure_chrome_chromium_is_properly_installed": "Verifique se o Chrome/Chromium está instalado corretamente",
"using_chrome_profile": "Usando o perfil do Chrome de: {user_data_dir}"
},
"update": {
"title": "Desativar atualização automática do Cursor",
"disable_success": "Atualização automática desativada com sucesso",
"disable_failed": "Falha ao desativar atualização automática: {error}",
"press_enter": "Pressione Enter para sair",
"start_disable": "Iniciando desativação da atualização automática",
"killing_processes": "Finalizando processos",
"processes_killed": "Processos finalizados",
"removing_directory": "Removendo diretório",
"directory_removed": "Diretório removido",
"creating_block_file": "Criando arquivo de bloqueio",
"block_file_created": "Arquivo de bloqueio criado",
"clearing_update_yml": "Limpeza update.yml arquivo",
"update_yml_cleared": "arquivo update.yml limpo",
"unsupported_os": "OS não suportado: {System}",
"block_file_already_locked": "O arquivo de bloco já está bloqueado",
"yml_already_locked_error": "arquivo update.yml já bloqueado erro: {error}",
"update_yml_not_found": "arquivo update.yml não encontrado",
"yml_locked_error": "Update.yml Arquivo Bloqueado Erro: {Error}",
"remove_directory_failed": "Falha ao remover o diretório: {error}",
"yml_already_locked": "o arquivo update.yml já está bloqueado",
"create_block_file_failed": "Falha ao criar o arquivo de bloco: {error}",
"block_file_locked_error": "Erro bloqueado do arquivo bloqueado: {error}",
"directory_locked": "O diretório está bloqueado: {caminho}",
"block_file_already_locked_error": "Bloco Arquivo já bloqueado Erro: {Error}",
"clear_update_yml_failed": "Falha ao limpar o arquivo update.yml: {error}",
"yml_locked": "o arquivo update.yml está bloqueado",
"block_file_locked": "O arquivo de bloco está bloqueado"
},
"updater": {
"checking": "Verificando atualizações...",
"new_version_available": "Nova versão disponível! (Atual: {current}, Última: {latest})",
"updating": "Atualizando para a última versão. O programa será reiniciado automaticamente.",
"up_to_date": "Você está usando a versão mais recente.",
"check_failed": "Falha ao verificar atualizações: {error}",
"continue_anyway": "Continuando com a versão atual...",
"update_confirm": "Deseja atualizar para a última versão? (Y/n)",
"update_skipped": "Atualização ignorada.",
"invalid_choice": "Escolha inválida. Por favor, digite 'Y' ou 'n'.",
"development_version": "Versão de desenvolvimento {current} > {latest}",
"changelog_title": "Registro de alterações",
"rate_limit_exceeded": "Limite de taxa de API do GitHub excedido. Saltando a verificação de atualização."
},
"totally_reset": {
"title": "Redefinir Cursor Completamente",
"checking_config": "Verificando Arquivo de Configuração",
"config_not_found": "Arquivo de Configuração Não Encontrado",
"no_permission": "Não é possível Ler ou Escrever o Arquivo de Configuração, Verifique as Permissões do Arquivo",
"reading_config": "Lendo Configuração Atual",
"creating_backup": "Criando Backup da Configuração",
"backup_exists": "Arquivo de Backup Já Existe, Pulando Etapa de Backup",
"generating_new_machine_id": "Gerando Novo ID da Máquina",
"saving_new_config": "Salvando Nova Configuração no JSON",
"success": "Cursor Redefinido com Sucesso",
"error": "Falha ao Redefinir Cursor: {error}",
"press_enter": "Pressione Enter para Sair",
"reset_machine_id": "Redefinir ID da Máquina",
"database_connection_closed": "Conexão com o Banco de Dados Fechada",
"database_updated_successfully": "Banco de Dados Atualizado com Sucesso",
"connected_to_database": "Conectado ao Banco de Dados",
"updating_pair": "Atualizando Par Chave-Valor",
"db_not_found": "Arquivo de banco de dados não encontrado em: {path}",
"db_permission_error": "Não é possível acessar o arquivo do banco de dados. Verifique as permissões",
"db_connection_error": "Falha ao conectar ao banco de dados: {error}",
"feature_title": "RECURSOS",
"feature_1": "Remoção completa das configurações e preferências do Cursor AI",
"feature_2": "Limpa todos os dados em cache, incluindo histórico e prompts de IA",
"feature_3": "Redefine o ID da máquina para contornar a detecção de período de teste",
"feature_4": "Cria novos identificadores de máquina aleatórios",
"feature_5": "Remove extensões e preferências personalizadas",
"feature_6": "Redefine informações de período de teste e dados de ativação",
"feature_7": "Varredura profunda por arquivos ocultos relacionados à licença e período de teste",
"feature_8": "Preserva com segurança arquivos e aplicativos não relacionados ao Cursor",
"feature_9": "Compatível com Windows, macOS e Linux",
"disclaimer_title": "AVISO",
"disclaimer_1": "Esta ferramenta excluirá permanentemente todas as configurações,",
"disclaimer_2": "preferências e dados em cache do Cursor AI. Essa ação não pode ser desfeita.",
"disclaimer_3": "Seus arquivos de código NÃO serão afetados, e a ferramenta é projetada",
"disclaimer_4": "para atingir somente os arquivos do editor Cursor AI e mecanismos de detecção de teste.",
"disclaimer_5": "Outros aplicativos em seu sistema não serão afetados.",
"disclaimer_6": "Será necessário configurar o Cursor AI novamente após executar esta ferramenta.",
"disclaimer_7": "Use por sua conta e risco",
"confirm_title": "Tem certeza que deseja prosseguir?",
"confirm_1": "Esta ação excluirá todas as configurações do Cursor AI,",
"confirm_2": "preferências e dados em cache. Essa ação não pode ser desfeita.",
"confirm_3": "Seus arquivos de código NÃO serão afetados, e a ferramenta é projetada",
"confirm_4": "para atingir somente os arquivos do editor Cursor AI e mecanismos de detecção de teste.",
"confirm_5": "Outros aplicativos em seu sistema não serão afetados.",
"confirm_6": "Será necessário configurar o Cursor AI novamente após executar esta ferramenta.",
"confirm_7": "Use por sua conta e risco",
"invalid_choice": "Por favor, digite 'Y' ou 'n'",
"skipped_for_safety": "Ignorado por segurança (não relacionado ao Cursor): {path}",
"deleted": "Excluído: {path}",
"error_deleting": "Erro ao excluir {path}: {error}",
"not_found": "Arquivo não encontrado: {path}",
"resetting_machine_id": "Redefinindo identificadores da máquina para contornar a detecção de período de teste...",
"created_machine_id": "Novo ID da máquina criado: {path}",
"error_creating_machine_id": "Erro ao criar arquivo de ID da máquina {path}: {error}",
"error_searching": "Erro ao procurar arquivos em {path}: {error}",
"created_extended_trial_info": "Novas informações de período de teste criadas: {path}",
"error_creating_trial_info": "Erro ao criar arquivo de informações de teste {path}: {error}",
"resetting_cursor_ai_editor": "Redefinindo Editor Cursor AI... Por favor, aguarde.",
"reset_cancelled": "Redefinição cancelada. Saindo sem realizar alterações.",
"windows_machine_id_modification_skipped": "Modificação de ID da máquina no Windows ignorada: {error}",
"linux_machine_id_modification_skipped": "Modificação do machine-id do Linux ignorada: {error}",
"note_complete_machine_id_reset_may_require_running_as_administrator": "Nota: Redefinir totalmente o ID da máquina pode exigir a execução como administrador",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "Nota: Redefinir totalmente o machine-id do sistema pode exigir privilégios sudo",
"windows_registry_instructions": "📝 NOTA: Para uma redefinição completa no Windows, talvez você precise também limpar entradas do registro.",
"windows_registry_instructions_2": " Execute 'regedit', pesquise chaves contendo 'Cursor' ou 'CursorAI' em HKEY_CURRENT_USER\\Software\\ e exclua-as.\n",
"reset_log_1": "Cursor AI foi completamente redefinido e a detecção de teste foi contornada!",
"reset_log_2": "Por favor, reinicie o sistema para que as alterações tenham efeito.",
"reset_log_3": "Você precisará reinstalar o Cursor AI e deverá ter um novo período de teste disponível.",
"reset_log_4": "Para melhores resultados, considere também:",
"reset_log_5": "Utilizar um endereço de e-mail diferente ao registrar um novo período de teste",
"reset_log_6": "Se disponível, utilizar uma VPN para alterar seu endereço IP",
"reset_log_7": "Limpar cookies e cache do navegador antes de acessar o site do Cursor AI",
"reset_log_8": "Se os problemas persistirem, tente instalar o Cursor AI em outro local",
"reset_log_9": "Se encontrar problemas, abra uma issue no Github em https://github.com/yeongpin/cursor-free-vip/issues",
"unexpected_error": "Ocorreu um erro inesperado: {error}",
"report_issue": "Por favor, relate este problema no Github em https://github.com/yeongpin/cursor-free-vip/issues",
"keyboard_interrupt": "Processo interrompido pelo usuário. Saindo...",
"return_to_main_menu": "Retornando ao menu principal...",
"process_interrupted": "Processo interrompido. Saindo...",
"press_enter_to_return_to_main_menu": "Pressione Enter para retornar ao menu principal...",
"removing_known": "Removendo arquivos conhecidos de teste/licença",
"performing_deep_scan": "Realizando varredura profunda por arquivos adicionais de teste/licença",
"found_additional_potential_license_trial_files": "{count} arquivos adicionais de licença/teste potencialmente encontrados",
"checking_for_electron_localstorage_files": "Verificando arquivos localStorage do Electron",
"no_additional_license_trial_files_found_in_deep_scan": "Nenhum arquivo adicional de licença/teste encontrado na varredura profunda",
"removing_electron_localstorage_files": "Removendo arquivos localStorage do Electron",
"electron_localstorage_files_removed": "Arquivos localStorage do Electron removidos",
"electron_localstorage_files_removal_error": "Erro ao remover arquivos localStorage do Electron: {error}",
"removing_electron_localstorage_files_completed": "Remoção dos arquivos localStorage do Electron concluída",
"warning_title": "AVISO",
"direct_advanced_navigation": "Tentando navegação direta para guia avançada",
"delete_input_error": "Erro a localização de exclusão de exclusão: {error}",
"delete_input_not_found_continuing": "Exclua a entrada de confirmação não encontrada, tentando continuar de qualquer maneira",
"advanced_tab_not_found": "Guia avançada não encontrada após várias tentativas",
"advanced_tab_error": "Erro a guia Avançado: {Error}",
"delete_input_not_found": "Excluir entrada de confirmação não encontrada após várias tentativas",
"failed_to_delete_file": "Falha ao excluir o arquivo: {Path}",
"operation_cancelled": "Operação cancelada. Sair sem fazer alterações.",
"removed": "Removido: {caminho}",
"warning_6": "Você precisará configurar o Cursor AI novamente após a execução desta ferramenta.",
"delete_input_retry": "Excluir a entrada não encontrada, Tent {Tent}/{max_attempts}",
"cursor_reset_failed": "Cursor AI Editor Redefinir falhou: {Error}",
"warning_4": "Para direcionar apenas arquivos do editor de IA do cursor e mecanismos de detecção de teste.",
"login_redirect_failed": "Redirecionamento de login falhou, tentando navegação direta ...",
"warning_5": "Outras aplicações no seu sistema não serão afetadas.",
"failed_to_delete_file_or_directory": "Falha ao excluir o arquivo ou diretório: {Path}",
"failed_to_delete_directory": "Falha ao excluir o Diretório: {Path}",
"resetting_cursor": "Redefinir o cursor AI Editor ... por favor, espere.",
"cursor_reset_completed": "O editor do cursor AI foi totalmente redefinido e detecção de teste ignorada!",
"warning_3": "Seus arquivos de código não serão afetados e a ferramenta foi projetada",
"advanced_tab_retry": "Guia Avançado não encontrado, Tente {Tent}/{max_attempts}",
"advanced_tab_clicked": "Clicou na guia avançada",
"completed_in": "Concluído em {time} segundos",
"already_on_settings": "Já na página Configurações",
"delete_button_retry": "Botão de exclusão não encontrado, tentativa {tentativa}/{max_attempts}",
"found_danger_zone": "Encontrou seção de zona de perigo",
"failed_to_remove": "Falha ao remover: {caminho}",
"failed_to_reset_machine_guid": "Falha ao redefinir a máquina guia",
"deep_scanning": "Executando a varredura profunda para obter arquivos de tentativa/licença adicionais",
"delete_button_clicked": "Clicou no botão Excluir conta",
"warning_7": "Use por sua conta e risco",
"delete_button_not_found": "Exclua o botão da conta não encontrado após várias tentativas",
"delete_button_error": "Erro a localizar o botão Excluir: {Error}",
"warning_1": "Esta ação excluirá todas as configurações do cursor ai,",
"warning_2": "configurações e dados em cache. Esta ação não pode ser desfeita.",
"navigating_to_settings": "Navegando para configurações da página ...",
"cursor_reset_cancelled": "Editor de cursor redefinido cancelado. Sair sem fazer alterações."
},
"chrome_profile": {
"title": "Seleção de Perfil do Chrome",
"select_profile": "Selecione um perfil do Chrome para usar:",
"profile_list": "Perfis disponíveis:",
"default_profile": "Perfil Padrão",
"profile": "Perfil {number}",
"no_profiles": "Nenhum perfil do Chrome encontrado",
"error_loading": "Erro ao carregar perfis do Chrome: {error}",
"profile_selected": "Perfil selecionado: {profile}",
"invalid_selection": "Seleção inválida. Por favor, tente novamente",
"warning_chrome_close": "Aviso: Isso fechará todos os processos do Chrome em execução"
},
"restore": {
"title": "Restaurar ID da Máquina do Backup",
"starting": "Iniciando processo de restauração de ID da máquina",
"no_backups_found": "Nenhum backup encontrado",
"available_backups": "Backups disponíveis",
"select_backup": "Selecione um backup para restaurar",
"to_cancel": "para cancelar",
"operation_cancelled": "Operação cancelada",
"invalid_selection": "Seleção inválida",
"please_enter_number": "Por favor, insira um número válido",
"missing_id": "ID ausente: {id}",
"read_backup_failed": "Falha ao ler arquivo de backup: {error}",
"current_file_not_found": "Arquivo de armazenamento atual não encontrado",
"current_backup_created": "Backup do arquivo de armazenamento atual criado",
"storage_updated": "Arquivo de armazenamento atualizado com sucesso",
"update_failed": "Falha ao atualizar arquivo de armazenamento: {error}",
"sqlite_not_found": "Banco de dados SQLite não encontrado",
"updating_sqlite": "Atualizando banco de dados SQLite",
"updating_pair": "Atualizando par chave-valor",
"sqlite_updated": "Banco de dados SQLite atualizado com sucesso",
"sqlite_update_failed": "Falha ao atualizar banco de dados SQLite: {error}",
"machine_id_backup_created": "Backup do arquivo machineId criado",
"backup_creation_failed": "Falha ao criar backup: {error}",
"machine_id_updated": "Arquivo machineId atualizado com sucesso",
"machine_id_update_failed": "Falha ao atualizar arquivo machineId: {error}",
"updating_system_ids": "Atualizando IDs do sistema",
"system_ids_update_failed": "Falha ao atualizar IDs do sistema: {error}",
"permission_denied": "Permissão negada. Tente executar como administrador",
"windows_machine_guid_updated": "GUID da máquina Windows atualizado com sucesso",
"update_windows_machine_guid_failed": "Falha ao atualizar GUID da máquina Windows: {error}",
"windows_machine_id_updated": "ID da máquina Windows atualizado com sucesso",
"update_windows_machine_id_failed": "Falha ao atualizar ID da máquina Windows: {error}",
"sqm_client_key_not_found": "Chave de registro SQMClient não encontrada",
"update_windows_system_ids_failed": "Falha ao atualizar IDs do sistema Windows: {error}",
"macos_platform_uuid_updated": "UUID da plataforma macOS atualizado com sucesso",
"failed_to_execute_plutil_command": "Falha ao executar comando plutil",
"update_macos_system_ids_failed": "Falha ao atualizar IDs do sistema macOS: {error}",
"ids_to_restore": "IDs da máquina para restaurar",
"confirm": "Tem certeza que deseja restaurar esses IDs?",
"success": "ID da máquina restaurado com sucesso",
"process_error": "Erro no processo de restauração: {error}",
"press_enter": "Pressione Enter para continuar"
},
"oauth": {
"no_chrome_profiles_found": "Não foram encontrados perfis de cromo, usando padrão",
"failed_to_delete_account": "Falha ao excluir a conta: {erro}",
"starting_new_authentication_process": "Iniciando novo processo de autenticação ...",
"found_email": "E -mail encontrado: {email}",
"github_start": "Github Start",
"already_on_settings_page": "Já na página Configurações!",
"starting_github_authentication": "Iniciando a autenticação do GitHub ...",
"account_is_still_valid": "A conta ainda é válida (uso: {USAGE})",
"status_check_error": "Verificação de status Erro: {erro}",
"authentication_timeout": "Timeout de autenticação",
"google_start": "Google Start",
"using_first_available_chrome_profile": "Usando o primeiro perfil Chrome disponível: {perfil}",
"no_compatible_browser_found": "Nenhum navegador compatível encontrado. Instale o Google Chrome ou Chromium.",
"usage_count": "Contagem de uso: {Uso}",
"authentication_successful_getting_account_info": "Autenticação bem -sucedida, obtendo informações da conta ...",
"found_chrome_at": "Encontrado Chrome em: {Path}",
"error_getting_user_data_directory": "Erro obtendo o diretório de dados do usuário: {erro}",
"error_finding_chrome_profile": "Erro a encontrar o perfil do Chrome, usando o padrão: {error}",
"auth_update_success": "Sucesso de atualização de autenticação",
"authentication_successful": "Autenticação bem -sucedida - email: {email}",
"authentication_failed": "Autenticação falhou: {erro}",
"warning_browser_close": "Aviso: isso fechará todos os processos de {navegador}",
"supported_browsers": "Navegadores suportados para {plataforma}",
"authentication_button_not_found": "Botão de autenticação não encontrado",
"starting_new_google_authentication": "Iniciando nova autenticação do Google ...",
"waiting_for_authentication": "Esperando por autenticação ...",
"found_default_chrome_profile": "Perfil do Chrome padrão encontrado",
"could_not_check_usage_count": "Não foi possível verificar a contagem de uso: {error}",
"starting_browser": "Navegador inicial em: {Path}",
"token_extraction_error": "Erro de extração de token: {error}",
"profile_selection_error": "Erro durante a seleção do perfil: {error}",
"warning_could_not_kill_existing_browser_processes": "Aviso: não foi possível matar processos existentes do navegador: {error}",
"browser_failed_to_start": "O navegador não conseguiu iniciar: {Error}",
"starting_re_authentication_process": "Iniciando o processo de re-autenticação ...",
"redirecting_to_authenticator_cursor_sh": "Redirecionando para autenticator.cursor.sh ...",
"found_browser_data_directory": "Diretório de dados do navegador encontrado: {caminho}",
"browser_not_found_trying_chrome": "Não foi possível encontrar {navegador}, tentando o Chrome em vez",
"found_cookies": "Encontrado {count} cookies",
"auth_update_failed": "Atualização de autenticação falhou",
"browser_failed_to_start_fallback": "O navegador não conseguiu iniciar: {Error}",
"failed_to_delete_expired_account": "Falha ao excluir a conta expirada",
"navigating_to_authentication_page": "Navegando para a página de autenticação ...",
"browser_closed": "Navegador fechado",
"initializing_browser_setup": "Inicializando a configuração do navegador ...",
"failed_to_delete_account_or_re_authenticate": "Falha ao excluir a conta ou re-autenticar: {Error}",
"detected_platform": "Plataforma detectada: {plataforma}",
"failed_to_extract_auth_info": "Falha ao extrair informações de autenticação: {error}",
"starting_google_authentication": "Iniciando a autenticação do Google ...",
"browser_failed": "O navegador não conseguiu iniciar: {Error}",
"using_browser_profile": "Usando o perfil do navegador: {perfil}",
"consider_running_without_sudo": "Considere executar o script sem sudo",
"try_running_without_sudo_admin": "Tente correr sem privilégios de sudo/administrador",
"page_changed_checking_auth": "Página alterada, verificando a autenticação ...",
"running_as_root_warning": "Correr como root não é recomendado para automação do navegador",
"please_select_your_google_account_to_continue": "Selecione sua conta do Google para continuar ...",
"browser_setup_failed": "Falha na configuração do navegador: {error}",
"missing_authentication_data": "Dados de autenticação ausentes: {dados}",
"using_configured_browser_path": "Usando o caminho configurado {navegador}: {caminho}",
"killing_browser_processes": "Matar {navegador} processos ...",
"could_not_find_usage_count": "Não foi possível encontrar contagem de uso: {error}",
"account_has_reached_maximum_usage": "A conta atingiu o máximo de uso, {excluindo}",
"browser_setup_completed": "A configuração do navegador concluiu com êxito",
"could_not_find_email": "Não foi possível encontrar email: {error}",
"found_browser_user_data_dir": "Encontrado {navegador} diretório de dados do usuário: {caminho}",
"user_data_dir_not_found": "{navegador} diretório de dados do usuário não encontrado em {path}, tentará o Chrome em vez",
"invalid_authentication_type": "Tipo de autenticação inválido"
},
"auth_check": {
"token_length": "Comprimento do token: {comprimento} caracteres",
"usage_response_status": "Estado de resposta de uso: {resposta}",
"operation_cancelled": "Operação cancelada pelo usuário",
"error_getting_token_from_db": "Erro de obter token do banco de dados: {error}",
"checking_usage_information": "Verificando informações de uso ...",
"usage_response": "Resposta de uso: {resposta}",
"authorization_failed": "Autorização falhou!",
"authorization_successful": "Autorização bem -sucedida!",
"request_timeout": "Solicitação cronometrada",
"check_error": "Autorização de verificação de erro: {error}",
"connection_error": "Erro de conexão",
"invalid_token": "Token inválido",
"check_usage_response": "Verifique a resposta de uso: {resposta}",
"enter_token": "Digite o seu token do cursor:",
"token_found_in_db": "Token encontrado no banco de dados",
"user_unauthorized": "O usuário não é autorizado",
"checking_authorization": "Verificando a autorização ...",
"error_generating_checksum": "Erro de geração de soma de verificação: {error}",
"unexpected_error": "Erro inesperado: {erro}",
"token_source": "Obter token do banco de dados ou entrada manualmente? (d/m, padrão: D)",
"user_authorized": "O usuário está autorizado",
"token_not_found_in_db": "Token não encontrado no banco de dados",
"unexpected_status_code": "Código de status inesperado: {code}",
"jwt_token_warning": "O token parece estar no formato JWT, mas a verificação da API retornou um código de status inesperado. O token pode ser válido, mas o acesso da API é restrito.",
"getting_token_from_db": "Obtendo token do banco de dados ...",
"cursor_acc_info_not_found": "cursor_acc_info.py não encontrado"
},
"account_delete": {
"delete_input_not_found": "Excluir entrada de confirmação não encontrada após várias tentativas",
"confirm_button_not_found": "Confirme o botão não encontrado após várias tentativas",
"logging_in": "Faça login com o Google ...",
"confirm_button_error": "Erro para encontrar o botão Confirmar: {Error}",
"delete_button_clicked": "Clicou no botão Excluir conta",
"confirm_prompt": "Tem certeza de que deseja prosseguir? (S/N):",
"delete_button_error": "Erro a localizar o botão Excluir: {Error}",
"interrupted": "Processo de exclusão de conta interrompido pelo usuário.",
"cancelled": "Exclusão de conta cancelada.",
"error": "Erro durante a exclusão da conta: {erro}",
"delete_input_not_found_continuing": "Exclua a entrada de confirmação não encontrada, tentando continuar de qualquer maneira",
"advanced_tab_retry": "Guia Avançado não encontrado, Tente {Tent}/{max_attempts}",
"waiting_for_auth": "Esperando pela autenticação do Google ...",
"typed_delete": "\"Excluir\" digitado na caixa de confirmação",
"trying_settings": "Tentando navegar para a página de configurações ...",
"delete_input_retry": "Excluir a entrada não encontrada, Tent {Tent}/{max_attempts}",
"email_not_found": "Email não encontrado: {erro}",
"delete_button_not_found": "Exclua o botão da conta não encontrado após várias tentativas",
"already_on_settings": "Já na página Configurações",
"failed": "O processo de exclusão da conta falhou ou foi cancelado.",
"warning": "Aviso: isso excluirá permanentemente sua conta do cursor. Esta ação não pode ser desfeita.",
"direct_advanced_navigation": "Tentando navegação direta para guia avançada",
"advanced_tab_not_found": "Guia avançada não encontrada após várias tentativas",
"auth_timeout": "Tempo limite de autenticação, continuando de qualquer maneira ...",
"select_google_account": "Selecione sua conta do Google ...",
"google_button_not_found": "Botão de login do google não encontrado",
"found_danger_zone": "Encontrou seção de zona de perigo",
"account_deleted": "Conta excluída com sucesso!",
"starting_process": "Processo de exclusão de conta inicial ...",
"advanced_tab_error": "Erro a guia Avançado: {Error}",
"delete_button_retry": "Botão de exclusão não encontrado, tentativa {tentativa}/{max_attempts}",
"login_redirect_failed": "Redirecionamento de login falhou, tentando navegação direta ...",
"unexpected_error": "Erro inesperado: {erro}",
"delete_input_error": "Erro a localização de exclusão de exclusão: {error}",
"login_successful": "Login bem -sucedido",
"advanced_tab_clicked": "Clicou na guia avançada",
"unexpected_page": "Página inesperada após login: {url}",
"found_email": "E -mail encontrado: {email}",
"title": "Ferramenta de exclusão de conta do cursor Google",
"navigating_to_settings": "Navegando para configurações da página ...",
"success": "Sua conta do cursor foi excluída com sucesso!",
"confirm_button_retry": "Confirme o botão não encontrado, Tent {Tent}/{max_attempts}"
},
"manual_auth": {
"auth_type_selected": "Tipo de autenticação selecionada: {type}",
"proceed_prompt": "Prosseguir? (S/N):",
"auth_type_github": "Github",
"confirm_prompt": "Confirme as seguintes informações:",
"invalid_token": "Token inválido. Autenticação abortada.",
"continue_anyway": "Continuar de qualquer maneira? (S/N):",
"token_verified": "Token Verificado com sucesso!",
"error": "Erro: {erro}",
"auth_update_failed": "Falha ao atualizar informações de autenticação",
"auth_type_prompt": "Selecione Tipo de autenticação:",
"auth_type_auth0": "Auth_0 (padrão)",
"verifying_token": "Verificando a validade do token ...",
"auth_updated_successfully": "Informações de autenticação são atualizadas com sucesso!",
"email_prompt": "Digite email (deixe em branco para o email aleatório):",
"token_prompt": "Digite seu token cursor (Access_Token/Refresh_Token):",
"title": "Autenticação do cursor manual",
"token_verification_skipped": "Verificação do token Saltada (check_user_authorized.py não encontrado)",
"random_email_generated": "Email aleatório gerado: {email}",
"auth_type_google": "Google",
"token_required": "É necessário token",
"operation_cancelled": "Operação cancelada",
"token_verification_error": "Erro verificando o token: {error}",
"updating_database": "Atualizando o banco de dados de autenticação do cursor ..."
},
"token": {
"refreshing": "Token refrescante ...",
"extraction_error": "Erro extraindo o token: {error}",
"invalid_response": "Resposta JSON inválida do servidor Refresh",
"no_access_token": "Sem token de acesso em resposta",
"connection_error": "Erro de conexão para atualizar o servidor",
"unexpected_error": "Erro inesperado durante a atualização do token: {error}",
"server_error": "Atualizar erro do servidor: http {status}",
"refresh_success": "Token atualizado com sucesso! Válido para {dias} dias (expira: {expire})",
"request_timeout": "Solicitação para atualizar o servidor cronometrado",
"refresh_failed": "A atualização do token falhou: {erro}"
},
"browser_profile": {
"profile_selected": "Perfil selecionado: {perfil}",
"default_profile": "Perfil padrão",
"no_profiles": "Não há perfis {navegador} encontrados",
"select_profile": "Selecione {navegador} perfil para usar:",
"error_loading": "Erro de carregamento {navegador} perfis: {error}",
"invalid_selection": "Seleção inválida. Por favor, tente novamente.",
"title": "Seleção de perfil do navegador",
"profile": "Perfil {número}",
"profile_list": "Disponível {navegador} perfis:"
},
"github_register": {
"feature2": "Registra uma nova conta do GitHub com credenciais aleatórias.",
"feature6": "Salva todas as credenciais em um arquivo.",
"starting_automation": "Automação inicial ...",
"feature1": "Gera um email temporário usando 1Secmail.",
"title": "Github + Cursor AI Automação de registro",
"github_username": "Nome de usuário do Github",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Verifique as janelas do navegador para intervenção manual ou tente novamente mais tarde.",
"warning1": "Este script automatiza a criação de contas, que pode violar os Termos de Serviço Github/Cursor.",
"feature4": "Faça login no cursor IA usando a autenticação do GitHub.",
"invalid_choice": "Escolha inválida. Por favor, digite 'sim' ou 'não'",
"completed_successfully": "Github + Registro do cursor concluído com êxito!",
"warning2": "Requer acesso à Internet e privilégios administrativos.",
"registration_encountered_issues": "O registro do Github + Cursor encontrou problemas.",
"credentials_saved": "Essas credenciais foram salvas para github_cursor_accounts.txt",
"feature3": "Verifica o email do GitHub automaticamente.",
"github_password": "Senha do github",
"features_header": "Características",
"feature5": "Redefina o ID da máquina para ignorar a detecção de teste.",
"warning4": "Use com responsabilidade e por sua conta e risco.",
"warning3": "CAPTCHA ou verificação adicional podem interromper a automação.",
"cancelled": "Operação cancelada",
"warnings_header": "Avisos",
"program_terminated": "Programa encerrado pelo usuário",
"confirm": "Tem certeza de que deseja prosseguir?",
"email_address": "Endereço de email"
},
"account_info": {
"subscription": "Subscrição",
"failed_to_get_account_info": "Falha ao obter informações da conta",
"subscription_type": "Tipo de assinatura",
"pro": "Pró",
"failed_to_get_account": "Falha ao obter informações da conta",
"config_not_found": "Configuração não encontrada.",
"premium_usage": "Uso premium",
"failed_to_get_subscription": "Falha ao obter informações de assinatura",
"basic_usage": "Uso básico",
"premium": "Premium",
"free": "Livre",
"email_not_found": "E -mail não encontrado",
"title": "Informações da conta",
"inactive": "Inativo",
"remaining_trial": "Teste restante",
"enterprise": "Empresa",
"lifetime_access_enabled": "Acesso ao longo da vida ativado",
"failed_to_get_usage": "Falha ao obter informações de uso",
"usage_not_found": "Uso não encontrado",
"days_remaining": "Dias restantes",
"failed_to_get_token": "Falhou em obter token",
"token": "Token",
"subscription_not_found": "Informações de assinatura não encontradas",
"days": "dias",
"team": "Equipe",
"token_not_found": "Token não encontrado",
"pro_trial": "Trial Pro",
"email": "E-mail",
"active": "Ativo",
"failed_to_get_email": "Falha ao obter endereço de e -mail",
"trial_remaining": "Trial profissional restante",
"usage": "Uso"
},
"config": {
"configuration": "Configuração",
"config_updated": "Config atualizado",
"file_owner": "Proprietário do arquivo: {proprietário}",
"error_checking_linux_paths": "Erro verificando os caminhos do Linux: {Error}",
"storage_file_is_empty": "O arquivo de armazenamento está vazio: {storage_path}",
"config_directory": "Diretório de configuração",
"documents_path_not_found": "Documentos Caminho não encontrado, usando o diretório atual",
"config_not_available": "Configuração não disponível",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Certifique -se de que o cursor esteja instalado e foi executado pelo menos uma vez",
"neither_cursor_nor_cursor_directory_found": "Nem o cursor nem o diretório cursor encontrados em {config_base}",
"config_created": "Config criado: {config_file}",
"using_temp_dir": "Usando o diretório temporário devido a erro: {path} (erro: {error})",
"storage_file_not_found": "Arquivo de armazenamento não encontrado: {storage_path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "O arquivo pode estar corrompido, reinstale o cursor",
"error_getting_file_stats": "Erro obtendo estatísticas de arquivo: {error}",
"enabled": "Habilitado",
"backup_created": "Backup criado: {Path}",
"file_permissions": "Permissões de arquivo: {permissões}",
"config_setup_error": "Erro Configuração de configuração: {error}",
"config_force_update_enabled": "Atualização de força de arquivo de configuração ativada, executando atualização forçada",
"config_removed": "Arquivo de configuração removido para atualização forçada",
"file_size": "Tamanho do arquivo: {size} bytes",
"error_reading_storage_file": "Erro ao ler Arquivo de armazenamento: {erro}",
"config_force_update_disabled": "Atualização de força de arquivo de configuração desativada, pulando a atualização forçada",
"config_dir_created": "Diretório de configuração criado: {caminho}",
"config_option_added": "Opção de configuração adicionada: {option}",
"file_group": "Grupo de arquivos: {grupo}",
"and": "E",
"backup_failed": "Falha ao fazer backup de configuração: {error}",
"force_update_failed": "Falha na atualização de força: {error}",
"also_checked": "Também verificado {caminho}",
"storage_directory_not_found": "Diretório de armazenamento não encontrado: {storage_dir}",
"storage_file_found": "Arquivo de armazenamento encontrado: {storage_path}",
"try_running": "Tente correr: {comando}",
"disabled": "Desabilitado",
"storage_file_is_valid_and_contains_data": "O arquivo de armazenamento é válido e contém dados",
"permission_denied": "Permissão negada: {storage_path}"
},
"bypass": {
"found_product_json": "Found Product.json: {Path}",
"starting": "Iniciando a versão do cursor ...",
"version_updated": "Versão atualizada de {Old} para {new}",
"menu_option": "Verificação da versão do cursor de desvio",
"unsupported_os": "Sistema operacional não suportado: {System}",
"backup_created": "Backup criado: {Path}",
"current_version": "Versão atual: {versão}",
"no_write_permission": "Nenhuma permissão de gravação para arquivo: {caminho}",
"localappdata_not_found": "Variável de ambiente localAppData não encontrada",
"write_failed": "Falha ao escrever o produto.json: {error}",
"description": "Esta ferramenta modifica o produto do cursor.json para ignorar as restrições da versão",
"bypass_failed": "Versão Bypass falhou: {error}",
"title": "Ferramenta de desvio da versão cursor",
"no_update_needed": "Nenhuma atualização necessária. Versão atual {versão} já está> = 0,46.0",
"read_failed": "Falha ao ler o produto.json: {error}",
"stack_trace": "Rastreamento da pilha",
"product_json_not_found": "Product.json não encontrado em caminhos comuns do Linux",
"file_not_found": "Arquivo não encontrado: {caminho}"
},
"bypass_token_limit": {
"description": "Esta ferramenta modifica o arquivo workbench.desktop.main.js para ignorar o limite do token",
"press_enter": "Pressione Enter para continuar ...",
"title": "Ipassue Token Limit Tool"
},
"tempmail": {
"config_error": "Erro de arquivo de configuração: {erro}",
"general_error": "Ocorreu um erro: {erro}",
"no_email": "Nenhum e -mail de verificação do cursor encontrado",
"extract_code_failed": "Código de verificação de extração falhou: {erro}",
"checking_email": "Verificando o e -mail de verificação do cursor ...",
"configured_email": "Email configurado: {email}",
"no_code": "Não foi possível obter o código de verificação",
"check_email_failed": "Verifique o e -mail falhado: {erro}",
"verification_code": "Código de verificação: {code}",
"email_found": "E -mail de verificação do cursor encontrado"
}
}

878
locales/ru.json Normal file
View File

@ -0,0 +1,878 @@
{
"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",
"outdate": "Устаревший",
"temp_github_register": "Временная регистрация GitHub",
"coming_soon": "Скоро",
"fixed_soon": "Скоро будет исправлено",
"contribute": "Внести вклад в проект",
"config": "Показать конфигурацию",
"delete_google_account": "Удалить Google аккаунт Cursor",
"continue_prompt": "Продолжить? (y/N): ",
"operation_cancelled_by_user": "Операция отменена пользователем",
"exiting": "Выход ......",
"bypass_version_check": "Пропустить проверку версии Cursor",
"check_user_authorized": "Проверить авторизацию пользователя",
"select_chrome_profile": "Выбрать профиль Chrome",
"bypass_token_limit": "Обход ограничения токенов",
"restore_machine_id": "Восстановить ID устройства из резервной копии",
"admin_required": "Запуск в качестве исполняемого файла требуются привилегии администратора.",
"language_config_saved": "Языковая конфигурация успешно сохранилась",
"lang_invalid_choice": "Неверный выбор. Пожалуйста, введите один из следующих вариантов: ({lang_choices})",
"manual_custom_auth": "Ручная пользовательская аут",
"admin_required_continue": "Продолжение без привилегий администратора."
},
"languages": {
"ar": "Арабский",
"en": "Английский",
"zh_cn": "Упрощенный китайский",
"zh_tw": "Традиционный китайский",
"vi": "Вьетнамский",
"nl": "Нидерландский",
"de": "Немецкий",
"fr": "Французский",
"pt": "Бразильский португальский",
"ru": "Русский",
"es": "Испанский",
"bg": "болгарский",
"tr": "турецкий",
"it": "Итальянский",
"ja": "Японский"
},
"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",
"update_windows_machine_id_failed": "Обновить идентификатор машины Windows Fail: {error}",
"path_not_found": "Путь не найден: {path}",
"windows_machine_id_updated": "Идентификатор машины Windows успешно обновлен",
"update_windows_machine_guid_failed": "Обновление Windows Machine Guide не удалось: {ошибка}",
"no_write_permission": "Нет разрешения на запись: {path}",
"file_not_found": "Файл не найден: {path}",
"modify_file_failed": "Изменить файл не удастся: {ошибка}"
},
"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с",
"using_browser": "Использование {браузер} браузер: {path}",
"could_not_track_processes": "Не удалось отслеживать {браузер} процессы: {ошибка}",
"try_install_browser": "Попробуйте установить браузер с помощью менеджера пакета",
"tempmail_plus_verification_started": "Начальный процесс проверки TempmailPlus",
"max_retries_reached": "Максимальные попытки повторения достигли. Регистрация не удалась.",
"tempmail_plus_enabled": "TempmailPlus включен",
"browser_path_invalid": "{браузер} путь недействителен, используя путь по умолчанию",
"human_verify_error": "Не могу проверить, что пользователь - это человек. Повторение ...",
"using_tempmail_plus": "Использование TempmailPlus для проверки электронной почты",
"tracking_processes": "Отслеживание {count} {браузер} процессы",
"tempmail_plus_epin_missing": "Tempmailplus epin не настроен",
"tempmail_plus_verification_failed": "TempmailPlus Проверка не удалась: {ошибка}",
"using_browser_profile": "Использование {браузер} профиль из: {user_data_dir}",
"tempmail_plus_verification_completed": "TempmailPlus проверка завершена успешно",
"tempmail_plus_email_missing": "Электронная почта TempmailPlus не настроена",
"tempmail_plus_config_missing": "Конфигурация TempmailPlus отсутствует",
"tempmail_plus_init_failed": "Не удалось инициализировать TempmailPlus: {ошибка}",
"tempmail_plus_initialized": "TempmailPlus инициализирован успешно",
"tempmail_plus_disabled": "TempmailPlus отключен",
"no_new_processes_detected": "Нет новых {браузер} процессов, обнаруженных для отслеживания",
"make_sure_browser_is_properly_installed": "Убедитесь, что {браузер} правильно установлен"
},
"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}",
"no_display_found": "Не найдено дисплея. Убедитесь, что X Server работает.",
"try_export_display": "Попробуйте: экспорт Display =: 0",
"try_install_chromium": "Попробуйте: Sudo Apt Установите Chromium-Browser",
"extension_load_error": "Ошибка загрузки расширения: {ошибка}",
"make_sure_chrome_chromium_is_properly_installed": "Убедитесь, что Chrome/Chromium правильно установлен",
"using_chrome_profile": "Использование Chrome Profile от: {user_data_dir}"
},
"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": "Файл блокировки создан",
"clearing_update_yml": "Очистка update.yml файл",
"update_yml_cleared": "update.yml файл очищен",
"unsupported_os": "Неподдерживаемая ОС: {Система}",
"block_file_already_locked": "Блок -файл уже заблокирован",
"yml_already_locked_error": "update.yml файл уже заблокированная ошибка: {error}",
"update_yml_not_found": "update.yml файл не найден",
"yml_locked_error": "update.yml -файл заблокирован ошибка: {error}",
"remove_directory_failed": "Не удалось удалить каталог: {ошибка}",
"yml_already_locked": "file update.yml уже заблокирован",
"create_block_file_failed": "Не удалось создать файл блока: {ошибка}",
"block_file_locked_error": "Блок -файл заблокирован ошибка: {ошибка}",
"directory_locked": "Каталог заблокирован: {path}",
"block_file_already_locked_error": "Блок -файл уже заблокированная ошибка: {ошибка}",
"clear_update_yml_failed": "Не удалось очистить файл update.yml: {error}",
"yml_locked": "file update.yml заблокирован",
"block_file_locked": "Заблокированный файл блока"
},
"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": "Список изменений",
"rate_limit_exceeded": "Предел ставки GitHub API превышен. Пропустить проверку обновления."
},
"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 завершено",
"warning_title": "ПРЕДУПРЕЖДЕНИЕ",
"direct_advanced_navigation": "Попытка прямой навигации к вкладке Advanced",
"delete_input_error": "Ошибка поиска Удаления ввода: {ошибка}",
"delete_input_not_found_continuing": "Удалить ввод подтверждения не найден, пытаясь продолжить в любом случае",
"advanced_tab_not_found": "Вкладка Advanced не найдена после нескольких попыток",
"advanced_tab_error": "Вкладка «Объединение ошибок»: {error}",
"delete_input_not_found": "Удалить вход подтверждения не найден после нескольких попыток",
"failed_to_delete_file": "Не удалось удалить файл: {path}",
"operation_cancelled": "Операция отменена. Выйдя без каких -либо изменений.",
"removed": "Удалено: {path}",
"warning_6": "Вам нужно будет снова настроить AI Cursor AI после запуска этого инструмента.",
"delete_input_retry": "Удалить вход не найден, попытка {попытка}/{max_attempts}",
"warning_4": "Нацеливаться только на файлы редактора Cursor AI и механизмы обнаружения испытаний.",
"cursor_reset_failed": "Cursor AI Редактор REDITOR RESET не удалось: {ошибка}",
"login_redirect_failed": "Перенаправление входа в систему не удалось, пробуя прямую навигацию ...",
"warning_5": "Другие приложения в вашей системе не будут затронуты.",
"failed_to_delete_file_or_directory": "Не удалось удалить файл или каталог: {path}",
"failed_to_delete_directory": "Не удалось удалить каталог: {path}",
"resetting_cursor": "Сброс редактора Cursor AI ... Пожалуйста, подождите.",
"cursor_reset_completed": "Курсор AI Редактор был полностью сброшен, и обнаружение испытаний обходится!",
"warning_3": "Ваши кодовые файлы не будут затронуты, а инструмент разработан",
"advanced_tab_retry": "Вкладка Advanced не найдена, попытка {попытка}/{max_attempts}",
"completed_in": "Завершено в {время} секунд",
"advanced_tab_clicked": "Нажал на вкладку «Дополнительно",
"already_on_settings": "Уже на странице настроек",
"delete_button_retry": "Кнопка удаления не найдена, попытка {попытка}/{max_attempts}",
"found_danger_zone": "Нашел раздел зоны опасности",
"failed_to_remove": "Не удалось удалить: {path}",
"failed_to_reset_machine_guid": "Не удалось сбросить машину",
"deep_scanning": "Выполнение глубокого сканирования для дополнительных судебных/лицензионных файлов",
"delete_button_clicked": "Нажал кнопку «Удалить учетную запись»",
"warning_7": "Используйте свой собственный риск",
"delete_button_not_found": "Удалить кнопку учетной записи не найдена после нескольких попыток",
"delete_button_error": "Кнопка «Удалить ошибку»: {ошибка}",
"warning_2": "конфигурации и кэшированные данные. Это действие не может быть отменено.",
"warning_1": "Это действие удалит все настройки AI курсора,",
"navigating_to_settings": "Навигация на страницу настроек ...",
"cursor_reset_cancelled": "Курсор AI Редактор сброс отменен. Выйдя без каких -либо изменений."
},
"chrome_profile": {
"title": "Выбор Профиля Chrome",
"select_profile": "Выберите профиль Chrome для использования:",
"profile_list": "Доступные профили:",
"default_profile": "Профиль по умолчанию",
"profile": "Профиль {number}",
"no_profiles": "Профили Chrome не найдены",
"error_loading": "Ошибка загрузки профилей Chrome: {error}",
"profile_selected": "Выбран профиль: {profile}",
"invalid_selection": "Неверный выбор. Пожалуйста, попробуйте снова",
"warning_chrome_close": "Предупреждение: Это закроет все запущенные процессы Chrome"
},
"restore": {
"title": "Восстановить ID устройства из резервной копии",
"starting": "Запуск процесса восстановления ID устройства",
"no_backups_found": "Резервные копии не найдены",
"available_backups": "Доступные резервные копии",
"select_backup": "Выберите резервную копию для восстановления",
"to_cancel": "для отмены",
"operation_cancelled": "Операция отменена",
"invalid_selection": "Неверный выбор",
"please_enter_number": "Пожалуйста, введите корректный номер",
"missing_id": "Отсутствует ID: {id}",
"read_backup_failed": "Не удалось прочитать файл резервной копии: {error}",
"current_file_not_found": "Текущий файл хранилища не найден",
"current_backup_created": "Создана резервная копия текущего файла хранилища",
"storage_updated": "Файл хранилища успешно обновлен",
"update_failed": "Не удалось обновить файл хранилища: {error}",
"sqlite_not_found": "База данных SQLite не найдена",
"updating_sqlite": "Обновление базы данных SQLite",
"updating_pair": "Обновление пары ключ-значение",
"sqlite_updated": "База данных SQLite успешно обновлена",
"sqlite_update_failed": "Не удалось обновить базу данных SQLite: {error}",
"machine_id_backup_created": "Создана резервная копия файла machineId",
"backup_creation_failed": "Не удалось создать резервную копию: {error}",
"machine_id_updated": "Файл machineId успешно обновлен",
"machine_id_update_failed": "Не удалось обновить файл machineId: {error}",
"updating_system_ids": "Обновление системных ID",
"system_ids_update_failed": "Не удалось обновить системные ID: {error}",
"permission_denied": "Доступ запрещен. Попробуйте запустить с правами администратора",
"windows_machine_guid_updated": "GUID устройства Windows успешно обновлен",
"update_windows_machine_guid_failed": "Не удалось обновить GUID устройства Windows: {error}",
"windows_machine_id_updated": "ID устройства Windows успешно обновлен",
"update_windows_machine_id_failed": "Не удалось обновить ID устройства Windows: {error}",
"sqm_client_key_not_found": "Ключ реестра SQMClient не найден",
"update_windows_system_ids_failed": "Не удалось обновить системные ID Windows: {error}",
"macos_platform_uuid_updated": "UUID платформы macOS успешно обновлен",
"failed_to_execute_plutil_command": "Не удалось выполнить команду plutil",
"update_macos_system_ids_failed": "Не удалось обновить системные ID macOS: {error}",
"ids_to_restore": "ID устройства для восстановления",
"confirm": "Вы уверены, что хотите восстановить эти ID?",
"success": "ID устройства успешно восстановлен",
"process_error": "Ошибка процесса восстановления: {error}",
"press_enter": "Нажмите Enter для продолжения"
},
"oauth": {
"no_chrome_profiles_found": "Профили хрома не обнаружены, используя по умолчанию",
"starting_new_authentication_process": "Запуск нового процесса аутентификации ...",
"failed_to_delete_account": "Не удалось удалить учетную запись: {ошибка}",
"found_email": "Найдено электронное письмо: {Электронная почта}",
"github_start": "GitHub Start",
"already_on_settings_page": "Уже на странице настроек!",
"starting_github_authentication": "Начальная аутентификация GitHub ...",
"account_is_still_valid": "Учетная запись все еще действительна (использование: {использование})",
"status_check_error": "Ошибка проверки состояния: {ошибка}",
"authentication_timeout": "Тайм -аут аутентификации",
"usage_count": "Количество использования: {использование}",
"using_first_available_chrome_profile": "Использование первого доступного Chrome Profile: {профиль}",
"google_start": "Google Start",
"no_compatible_browser_found": "Совместимый браузер не найден. Пожалуйста, установите Google Chrome или Chromium.",
"authentication_successful_getting_account_info": "Успешная аутентификация, получение информации об учетной записи ...",
"found_chrome_at": "Нашел хром в: {path}",
"error_getting_user_data_directory": "Ошибка",
"error_finding_chrome_profile": "Ошибка поиска хрома, используя по умолчанию: {error}",
"auth_update_success": "Успех обновления автоза",
"authentication_successful": "Успешная аутентификация - электронная почта: {электронная почта}",
"authentication_failed": "Аутентификация не удалась: {ошибка}",
"warning_browser_close": "Предупреждение: это закроет все запуск {браузер} процессов",
"supported_browsers": "Поддерживаемые браузеры для {платформы}",
"authentication_button_not_found": "Кнопка аутентификации не найдена",
"starting_new_google_authentication": "Начало новой аутентификации Google ...",
"waiting_for_authentication": "В ожидании аутентификации ...",
"found_default_chrome_profile": "Найденный хромированный профиль по умолчанию",
"starting_browser": "Начальный браузер на: {path}",
"token_extraction_error": "Ошибка извлечения токена: {ошибка}",
"could_not_check_usage_count": "Не удалось проверить количество использования: {ошибка}",
"profile_selection_error": "Ошибка во время выбора профиля: {ошибка}",
"warning_could_not_kill_existing_browser_processes": "Предупреждение: не удалось убить существующие процессы браузера: {ошибка}",
"browser_failed_to_start": "Браузер не смог запустить: {ошибка}",
"redirecting_to_authenticator_cursor_sh": "Передача на Authenticator.cursor.sh ...",
"starting_re_authentication_process": "Начало процесса повторной аутентификации ...",
"found_browser_data_directory": "Нашел каталог данных браузера: {path}",
"browser_not_found_trying_chrome": "Не удалось найти {браузер}, попробовать хром вместо этого",
"found_cookies": "Найдено {count} cookie",
"auth_update_failed": "Обновление ауты не удалось",
"browser_failed_to_start_fallback": "Браузер не смог запустить: {ошибка}",
"failed_to_delete_expired_account": "Не удалось удалить учетную запись с истекшим сроком действия",
"navigating_to_authentication_page": "Навигация на страницу аутентификации ...",
"initializing_browser_setup": "Инициализация настройки браузера ...",
"browser_closed": "Браузер закрыт",
"detected_platform": "Обнаруженная платформа: {платформа}",
"failed_to_delete_account_or_re_authenticate": "Не удалось удалить учетную запись или повторную аутентификацию: {ошибка}",
"failed_to_extract_auth_info": "Не удалось извлечь auth info: {error}",
"starting_google_authentication": "Начало аутентификации Google ...",
"using_browser_profile": "Использование профиля браузера: {профиль}",
"browser_failed": "Браузер не смог запустить: {ошибка}",
"consider_running_without_sudo": "Подумайте о запуске сценария без SUDO",
"try_running_without_sudo_admin": "Попробуйте запустить без привилегий Sudo/Administrator",
"page_changed_checking_auth": "Страница изменилась, проверяю аут ...",
"running_as_root_warning": "Запуск как root не рекомендуется для автоматизации браузера",
"please_select_your_google_account_to_continue": "Пожалуйста, выберите свою учетную запись Google, чтобы продолжить ...",
"browser_setup_failed": "Недостаточная настройка браузера: {ошибка}",
"missing_authentication_data": "Отсутствие данных аутентификации: {data}",
"using_configured_browser_path": "Использование Configured {Browser} Path: {path}",
"killing_browser_processes": "Убийство {браузер} процессы ...",
"could_not_find_usage_count": "Не удалось найти количество использования: {ошибка}",
"browser_setup_completed": "Настройка браузера завершена успешно",
"account_has_reached_maximum_usage": "Учетная запись достигла максимального использования, {удаление}",
"could_not_find_email": "Не удалось найти электронную почту: {ошибка}",
"found_browser_user_data_dir": "Нашел {браузер} каталог данных пользователей: {path}",
"user_data_dir_not_found": "{браузер} каталог пользовательских данных не найден в {path}, вместо этого попробую Chrome",
"invalid_authentication_type": "Неверный тип аутентификации"
},
"auth_check": {
"token_length": "Длина токена: {длина} символы",
"usage_response_status": "Статус ответа на использование: {ответ}",
"operation_cancelled": "Операция отменена пользователем",
"error_getting_token_from_db": "Ошибка получения токена из базы данных: {ошибка}",
"checking_usage_information": "Проверка информации об использовании ...",
"usage_response": "Ответ об использовании: {ответ}",
"authorization_failed": "Авторизация не удалась!",
"authorization_successful": "Авторизация успешно!",
"request_timeout": "Запросить время",
"check_error": "Проверка ошибок Авторизация: {ошибка}",
"connection_error": "Ошибка соединения",
"invalid_token": "Неверный токен",
"check_usage_response": "Проверьте ответ на использование: {ответ}",
"enter_token": "Введите токен курсора:",
"token_found_in_db": "Токен, найденный в базе данных",
"user_unauthorized": "Пользователь несанкционирован",
"checking_authorization": "Проверка авторизации ...",
"error_generating_checksum": "Контрольная сумма с генерированием ошибок: {ошибка}",
"token_source": "Получить токен из базы данных или ввода вручную? (D/M, по умолчанию: D)",
"unexpected_error": "Неожиданная ошибка: {ошибка}",
"user_authorized": "Пользователь авторизован",
"token_not_found_in_db": "Токен не найден в базе данных",
"unexpected_status_code": "Неожиданный код статуса: {код}",
"jwt_token_warning": "Токен, по -видимому, находится в формате JWT, но проверка API вернула неожиданный код состояния. Токен может быть действительным, но доступ к API ограничен.",
"getting_token_from_db": "Получение значения из базы данных ...",
"cursor_acc_info_not_found": "CURSOR_ACC_INFO.PY не найден"
},
"manual_auth": {
"auth_type_selected": "Выбранный тип аутентификации: {type}",
"proceed_prompt": "Продолжить? (Y/N):",
"auth_type_github": "GitHub",
"confirm_prompt": "Пожалуйста, подтвердите следующую информацию:",
"invalid_token": "Неверный токен. Аутентификация прервана.",
"continue_anyway": "В любом случае продолжить? (Y/N):",
"token_verified": "Токен проверил успешно!",
"error": "Ошибка: {ошибка}",
"auth_update_failed": "Не удалось обновить информацию о аутентификации",
"auth_type_auth0": "Auth_0 (по умолчанию)",
"auth_type_prompt": "Выберите Тип аутентификации:",
"verifying_token": "Проверка достоверности токена ...",
"auth_updated_successfully": "Информация об аутентификации успешно обновлена!",
"email_prompt": "Введите электронное письмо (оставьте пусто для случайной электронной почты):",
"token_prompt": "Введите токен курсора (access_token/represh_token):",
"title": "Ручная аутентификация курсора",
"random_email_generated": "Сгенерировано случайная электронная почта: {электронная почта}",
"token_verification_skipped": "Проверка токена пропустила (check_user_authorized.py не найдена)",
"token_required": "Токен требуется",
"auth_type_google": "Google",
"operation_cancelled": "Операция отменена",
"token_verification_error": "Проверка ошибки токен: {ошибка}",
"updating_database": "Обновление базы данных аутентификации курсора ..."
},
"account_delete": {
"delete_input_not_found": "Удалить вход подтверждения не найден после нескольких попыток",
"logging_in": "Вход в систему с Google ...",
"confirm_button_not_found": "Подтвердить кнопку не найдена после нескольких попыток",
"confirm_button_error": "Кнопка «Подтверждение ошибки»: {ошибка}",
"delete_button_clicked": "Нажал кнопку «Удалить учетную запись»",
"confirm_prompt": "Вы уверены, что хотите продолжить? (Y/N):",
"cancelled": "Удаление учетной записи отменено.",
"delete_button_error": "Кнопка «Удалить ошибку»: {ошибка}",
"interrupted": "Процесс удаления учетной записи прерван пользователем.",
"error": "Ошибка во время удаления учетной записи: {ошибка}",
"delete_input_not_found_continuing": "Удалить ввод подтверждения не найден, пытаясь продолжить в любом случае",
"advanced_tab_retry": "Вкладка Advanced не найдена, попытка {попытка}/{max_attempts}",
"waiting_for_auth": "В ожидании аутентификации Google ...",
"typed_delete": "Напечатано «Удалить» в поле подтверждения",
"trying_settings": "Попытка перейти на страницу настроек ...",
"delete_input_retry": "Удалить вход не найден, попытка {попытка}/{max_attempts}",
"email_not_found": "Электронная почта не найдена: {ошибка}",
"delete_button_not_found": "Удалить кнопку учетной записи не найдена после нескольких попыток",
"already_on_settings": "Уже на странице настроек",
"failed": "Процесс удаления учетной записи не удался или был отменен.",
"warning": "Предупреждение: это навсегда удалит вашу учетную запись курсора. Это действие не может быть отменено.",
"direct_advanced_navigation": "Попытка прямой навигации к вкладке Advanced",
"advanced_tab_not_found": "Вкладка Advanced не найдена после нескольких попыток",
"auth_timeout": "Тайм -аут аутентификации, все равно продолжая ...",
"select_google_account": "Пожалуйста, выберите свою учетную запись Google ...",
"google_button_not_found": "Кнопка входа в систему Google не найдена",
"found_danger_zone": "Нашел раздел зоны опасности",
"account_deleted": "Учебный счет удален успешно!",
"advanced_tab_error": "Вкладка «Объединение ошибок»: {error}",
"starting_process": "Начальный процесс удаления учетной записи ...",
"delete_button_retry": "Кнопка удаления не найдена, попытка {попытка}/{max_attempts}",
"login_redirect_failed": "Перенаправление входа в систему не удалось, пробуя прямую навигацию ...",
"unexpected_error": "Неожиданная ошибка: {ошибка}",
"login_successful": "Вход успешно",
"delete_input_error": "Ошибка поиска Удаления ввода: {ошибка}",
"advanced_tab_clicked": "Нажал на вкладку «Дополнительно",
"unexpected_page": "Неожиданная страница после входа в систему: {url}",
"found_email": "Найдено электронное письмо: {Электронная почта}",
"title": "Курсор Google инструмент удаления учетной записи",
"navigating_to_settings": "Навигация на страницу настроек ...",
"success": "Ваша учетная запись курсора была успешно удалена!",
"confirm_button_retry": "Кнопка подтверждения не найдена, попытка {попытка}/{max_attempts}"
},
"token": {
"refreshing": "Освежающий токен ...",
"extraction_error": "Ошибка извлечения токена: {ошибка}",
"invalid_response": "Неверный ответ JSON с сервера обновления",
"no_access_token": "Нет токена доступа в ответ",
"connection_error": "Ошибка соединения, чтобы обновить сервер",
"unexpected_error": "Неожиданная ошибка во время обновления токена: {ошибка}",
"server_error": "Ошибка обновления сервера: http {status}",
"refresh_success": "Токен успешно обновлен! Действительно для {дней} дней (истекает: {истекает})",
"request_timeout": "Запрос на обновления сервера",
"refresh_failed": "Производительное обновление токена: {ошибка}"
},
"browser_profile": {
"profile_selected": "Выбранный профиль: {профиль}",
"default_profile": "Профиль по умолчанию",
"no_profiles": "Нет {браузер} профили найдены",
"select_profile": "Выберите {браузер} Профиль для использования:",
"error_loading": "Ошибка загрузки {браузер} профили: {ошибка}",
"invalid_selection": "Неверный выбор. Пожалуйста, попробуйте еще раз.",
"title": "Выбор профиля браузера",
"profile": "Профиль {номер}",
"profile_list": "Доступны профили {браузер}:"
},
"github_register": {
"feature2": "Регистрирует новую учетную запись GitHub со случайными учетными данными.",
"feature6": "Сохраняет все учетные данные в файл.",
"starting_automation": "Начальная автоматизация ...",
"feature1": "Генерирует временное электронное письмо с помощью 1Secmail.",
"title": "GitHub + Cursor AI Автоматизация регистрации",
"github_username": "GitHub username",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Проверьте окна браузера для ручного вмешательства или попробуйте еще раз позже.",
"warning1": "Этот скрипт автоматизирует создание учетной записи, что может нарушать условия обслуживания GitHub/Cursor.",
"feature4": "Войдет в AI Cursor AI, используя аутентификацию GitHub.",
"completed_successfully": "Github + cursor Регистрация завершена успешно!",
"invalid_choice": "Неверный выбор. Пожалуйста, введите «да» или «нет»",
"warning2": "Требуется доступ в Интернет и административные привилегии.",
"registration_encountered_issues": "GitHub + Регистрация курсора столкнулась с проблемами.",
"credentials_saved": "Эти учетные данные были сохранены на github_cursor_accounts.txt",
"feature3": "Проверяет электронную почту GitHub автоматически.",
"github_password": "GitHub пароль",
"features_header": "Функции",
"feature5": "Сбрасывает идентификатор машины, чтобы обойти пробное обнаружение.",
"warning4": "Используйте ответственно и на ваш собственный риск.",
"warning3": "CAPTCHA или дополнительная проверка может прервать автоматизацию.",
"cancelled": "Операция отменена",
"warnings_header": "Предупреждения",
"program_terminated": "Программа завершена пользователем",
"confirm": "Вы уверены, что хотите продолжить?",
"email_address": "Адрес электронной почты"
},
"account_info": {
"subscription": "Подписка",
"failed_to_get_account_info": "Не удалось получить информацию об учетной записи",
"subscription_type": "Тип подписки",
"pro": "Профиль",
"failed_to_get_account": "Не удалось получить информацию об учетной записи",
"config_not_found": "Конфигурация не найдена.",
"premium_usage": "Использование премиум -класса",
"failed_to_get_subscription": "Не удалось получить информацию о подписке",
"basic_usage": "Основное использование",
"premium": "Премиум",
"free": "Бесплатно",
"email_not_found": "Электронная почта не найдена",
"title": "Информация об учетной записи",
"remaining_trial": "Оставшееся испытание",
"inactive": "Неактивный",
"enterprise": "Предприятие",
"failed_to_get_usage": "Не удалось получить информацию об использовании",
"usage_not_found": "Использование не найдено",
"lifetime_access_enabled": "Доступ к жизни включен",
"days_remaining": "Дни остаются",
"failed_to_get_token": "Не удалось получить токен",
"token": "Токен",
"subscription_not_found": "Информация о подписке не найдена",
"days": "дни",
"team": "Команда",
"token_not_found": "Токен не найден",
"active": "Активный",
"email": "Электронная почта",
"pro_trial": "PRO TREAD",
"failed_to_get_email": "Не удалось получить адрес электронной почты",
"trial_remaining": "Оставшиеся профессиональное испытание",
"usage": "Использование"
},
"config": {
"configuration": "Конфигурация",
"config_updated": "Конфигурация обновлена",
"file_owner": "Владелец файла: {владелец}",
"error_checking_linux_paths": "Проверка ошибок путей Linux: {ошибка}",
"storage_file_is_empty": "Файл хранения пуст: {storage_path}",
"config_directory": "Справочник конфигурации",
"config_not_available": "Конфигурация недоступна",
"documents_path_not_found": "Документы не найдены, используя текущий каталог",
"neither_cursor_nor_cursor_directory_found": "Ни курсор, ни курсора, найденный в {config_base}",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Пожалуйста, убедитесь, что курсор установлен и запускается хотя бы один раз",
"config_created": "Конфигурация создана: {config_file}",
"using_temp_dir": "Использование временного каталога из -за ошибки: {path} (error: {error})",
"storage_file_not_found": "Файл хранения не найден: {storage_path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "Файл может быть поврежден, пожалуйста, переустановите курсор",
"error_getting_file_stats": "Ошибка Получение статистики файла: {ошибка}",
"enabled": "Включено",
"backup_created": "Резервное копирование создано: {path}",
"file_permissions": "Разрешения на файл: {разрешения}",
"config_setup_error": "Ошибка настройки config: {error}",
"config_force_update_enabled": "Включено обновление силы файла конфигурации, выполнение принудительного обновления",
"config_removed": "Файл конфигурации удален для принудительного обновления",
"file_size": "Размер файла: {размер} байты",
"error_reading_storage_file": "Файл хранения ошибок: {ошибка}",
"config_force_update_disabled": "Обновление файла файла конфигурации отключено, пропуская принудительное обновление",
"config_dir_created": "Справочник конфигурации создан: {path}",
"config_option_added": "Вариант конфигурации добавлена: {опция}",
"file_group": "Группа файлов: {группа}",
"and": "И",
"backup_failed": "Не удалось сделать резервное копирование config: {error}",
"force_update_failed": "Не удалось конфигурация обновления силы: {ошибка}",
"storage_directory_not_found": "Каталог хранилища не найден: {storam_dir}",
"also_checked": "Также проверено {path}",
"try_running": "Попробуйте запустить: {Команда}",
"disabled": "Неполноценный",
"storage_file_found": "Найден файл хранилища: {storage_path}",
"storage_file_is_valid_and_contains_data": "Файл хранения действителен и содержит данные",
"permission_denied": "Разрешение отказано: {storage_path}"
},
"bypass": {
"found_product_json": "Нашел продукт.json: {path}",
"starting": "Запуск курсора обход версии ...",
"version_updated": "Версия обновлена ​​от {old} до {new}",
"menu_option": "Проверка версии курсора обходного курса",
"unsupported_os": "Неподдерживаемая операционная система: {System}",
"backup_created": "Резервное копирование создано: {path}",
"current_version": "Текущая версия: {версия}",
"no_write_permission": "Нет разрешения на запись для файла: {path}",
"localappdata_not_found": "Локальная переменная среды не найдена",
"write_failed": "Не удалось написать product.json: {error}",
"description": "Этот инструмент изменяет Cursor's Product.json, чтобы обходить ограничения версий",
"bypass_failed": "Ошибка обхода версии: {ошибка}",
"title": "Инструмент обхода версии курсора",
"no_update_needed": "Обновление не требуется. Текущая версия {версия} уже> = 0,46,0",
"read_failed": "Не удалось прочитать product.json: {error}",
"stack_trace": "Стек трассировки",
"product_json_not_found": "Product.json не найден в обычных путях Linux",
"file_not_found": "Файл не найден: {path}"
},
"bypass_token_limit": {
"description": "Этот инструмент изменяет файл workbench.desktop.main.js, чтобы обойти предел токена",
"press_enter": "Нажмите Enter, чтобы продолжить ...",
"title": "Инструмент ограничения обхода токена"
},
"tempmail": {
"no_email": "Электронное письмо с проверкой курсора не найдено",
"config_error": "Ошибка файла конфигурации: {ошибка}",
"extract_code_failed": "Установка кода извлечения проверки: {ошибка}",
"general_error": "Произошла ошибка: {ошибка}",
"no_code": "Не удалось получить код проверки",
"checking_email": "Проверка на проверку курсора по электронной почте ...",
"configured_email": "Настройка электронной почты: {электронная почта}",
"check_email_failed": "Проверка по электронной почте не удастся: {ошибка}",
"verification_code": "Код проверки: {код}",
"email_found": "Найдено электронное письмо с проверкой курсора"
}
}

878
locales/tr.json Normal file
View File

@ -0,0 +1,878 @@
{
"menu": {
"title": "Mevcut Seçenekler",
"exit": "Programdan Çık",
"reset": "Makine Kimliğini Sıfırla",
"register": "Yeni Cursor Hesabı Kaydet",
"register_google": "Google Hesabı ile Kayıt Ol",
"register_github": "GitHub Hesabı ile Kayıt Ol",
"register_manual": "Cursor'ı Özel E-posta ile Kaydet",
"quit": "Cursor Uygulamasını Kapat",
"select_language": "Dili Değiştir",
"select_chrome_profile": "Chrome Profilini Seç",
"input_choice": "Lütfen seçiminizi girin ({choices})",
"invalid_choice": "Geçersiz seçim. Lütfen {choices} arasından bir sayı girin",
"program_terminated": "Program kullanıcı tarafından sonlandırıldı",
"error_occurred": "Bir hata oluştu: {error}. Lütfen tekrar deneyin",
"press_enter": ıkmak için Enter'a Basın",
"disable_auto_update": "Cursor Otomatik Güncellemeyi Devre Dışı Bırak",
"lifetime_access_enabled": "ÖMÜR BOYU ERİŞİM ETKİNLEŞTİRİLDİ",
"totally_reset": "Cursor'ı Tamamen Sıfırla",
"outdate": "güncel değil",
"temp_github_register": "Geçici GitHub Kaydı",
"admin_required": "Running as executable, administrator privileges required.",
"admin_required_continue": "Continuing without administrator privileges.",
"coming_soon": "Yakında",
"fixed_soon": "Yakında Düzeltilecek",
"contribute": "Projeye Katkıda Bulun",
"config": "Yapılandırmayı Göster",
"delete_google_account": "Cursor Google Hesabını Sil",
"continue_prompt": "Devam et? (y/N): ",
"operation_cancelled_by_user": "İşlem kullanıcı tarafından iptal edildi",
"exiting": ıkılıyor ......",
"bypass_version_check": "Cursor Sürüm Kontrolünü Atla",
"check_user_authorized": "Kullanıcı Yetkilendirmesini Kontrol Et",
"bypass_token_limit": "Token Limitini Atla",
"restore_machine_id": "Makine Kimliğini Yedekten Geri Yükle",
"language_config_saved": "Dil yapılandırması başarıyla kaydedildi",
"lang_invalid_choice": "Geçersiz seçim. Lütfen aşağıdaki seçeneklerden birini girin: ({Lang_choices}))",
"manual_custom_auth": "Manuel Özel Auth"
},
"languages": {
"ar": "Arapça",
"en": "English",
"zh_cn": "简体中文",
"zh_tw": "繁體中文",
"vi": "Vietnamese",
"nl": "Dutch",
"de": "German",
"fr": "French",
"pt": "Portuguese",
"ru": "Russian",
"tr": "Turkish",
"es": "Spanish",
"bg": "Bulgarca",
"ja": "Japonca",
"it": "İtalyan"
},
"quit_cursor": {
"start": "Cursor'dan Çıkış Başlatılıyor",
"no_process": "Çalışan Cursor İşlemi Yok",
"terminating": "İşlem Sonlandırılıyor {pid}",
"waiting": "İşlemin Çıkması Bekleniyor",
"success": "Tüm Cursor İşlemleri Kapatıldı",
"timeout": "İşlem Zaman Aşımı: {pids}",
"error": "Hata Oluştu: {error}"
},
"reset": {
"title": "Cursor Makine Kimliği Sıfırlama Aracı",
"checking": "Yapılandırma Dosyası Kontrol Ediliyor",
"not_found": "Yapılandırma Dosyası Bulunamadı",
"no_permission": "Yapılandırma Dosyası Okunamıyor veya Yazılamıyor, Lütfen Dosya İzinlerini Kontrol Edin",
"reading": "Mevcut Yapılandırma Okunuyor",
"creating_backup": "Yapılandırma Yedeği Oluşturuluyor",
"backup_exists": "Yedek Dosya Zaten Mevcut, Yedekleme Adımı Atlanıyor",
"generating": "Yeni Makine Kimliği Oluşturuluyor",
"saving_json": "Yeni Yapılandırma JSON'a Kaydediliyor",
"success": "Makine Kimliği Başarıyla Sıfırlandı",
"new_id": "Yeni Makine Kimliği",
"permission_error": "İzin Hatası: {error}",
"run_as_admin": "Lütfen Bu Programı Yönetici Olarak Çalıştırmayı Deneyin",
"process_error": "Sıfırlama İşlemi Hatası: {error}",
"updating_sqlite": "SQLite Veritabanı Güncelleniyor",
"updating_pair": "Anahtar-Değer Çifti Güncelleniyor",
"sqlite_success": "SQLite Veritabanı Başarıyla Güncellendi",
"sqlite_error": "SQLite Veritabanı Güncellemesi Başarısız: {error}",
"press_enter": ıkmak için Enter'a Basın",
"unsupported_os": "Desteklenmeyen İşletim Sistemi: {os}",
"linux_path_not_found": "Linux Yolu Bulunamadı",
"updating_system_ids": "Sistem Kimlikleri Güncelleniyor",
"system_ids_updated": "Sistem Kimlikleri Başarıyla Güncellendi",
"system_ids_update_failed": "Sistem Kimlikleri Güncellemesi Başarısız: {error}",
"windows_guid_updated": "Windows GUID Başarıyla Güncellendi",
"windows_permission_denied": "Windows İzni Reddedildi",
"windows_guid_update_failed": "Windows GUID Güncellemesi Başarısız",
"macos_uuid_updated": "macOS UUID Başarıyla Güncellendi",
"plutil_command_failed": "plutil Komutu Başarısız",
"start_patching": "getMachineId Yamalanması Başlatılıyor",
"macos_uuid_update_failed": "macOS UUID Güncellemesi Başarısız",
"current_version": "Mevcut Cursor Sürümü: {version}",
"patch_completed": "getMachineId Yamalama Tamamlandı",
"patch_failed": "getMachineId Yamalama Başarısız: {error}",
"version_check_passed": "Cursor Sürüm Kontrolü Geçildi",
"file_modified": "Dosya Değiştirildi",
"version_less_than_0_45": "Cursor Sürümü < 0.45.0, getMachineId Yamalama Atlanıyor",
"detecting_version": "Cursor Sürümü Tespit Ediliyor",
"patching_getmachineid": "getMachineId Yamalanıyor",
"version_greater_than_0_45": "Cursor Sürümü >= 0.45.0, getMachineId Yamalanıyor",
"permission_denied": "İzin Reddedildi: {error}",
"backup_created": "Yedek Oluşturuldu",
"update_success": "Güncelleme Başarılı",
"update_failed": "Güncelleme Başarısız: {error}",
"windows_machine_guid_updated": "Windows Makine GUID'si Başarıyla Güncellendi",
"reading_package_json": "package.json Okunuyor {path}",
"invalid_json_object": "Geçersiz JSON Nesnesi",
"no_version_field": "package.json İçinde Sürüm Alanı Bulunamadı",
"version_field_empty": "Sürüm Alanı Boş",
"invalid_version_format": "Geçersiz Sürüm Formatı: {version}",
"found_version": "Sürüm Bulundu: {version}",
"version_parse_error": "Sürüm Ayrıştırma Hatası: {error}",
"package_not_found": "Package.json Bulunamadı: {path}",
"check_version_failed": "Sürüm Kontrolü Başarısız: {error}",
"stack_trace": "Yığın İzleme",
"version_too_low": "Cursor Sürümü Çok Düşük: {version} < 0.45.0",
"update_windows_machine_id_failed": "Windows Machine Kimliğini Güncelle Başarısız: {Hata}",
"windows_machine_id_updated": "Windows Machine Kimliği başarıyla güncellendi",
"path_not_found": "Yol bulunamadı: {yol}",
"update_windows_machine_guid_failed": "Windows Machine Guid'i güncelleyin Başarısız: {hata}",
"no_write_permission": "Yazma İzni Yok: {Path}",
"file_not_found": "Dosya bulunamadı: {yol}",
"modify_file_failed": "Dosyayı Değerlendirme Başarısız: {Hata}"
},
"register": {
"title": "Cursor Kayıt Aracı",
"start": "Kayıt işlemi başlatılıyor...",
"handling_turnstile": "Güvenlik doğrulaması işleniyor...",
"retry_verification": "Doğrulama tekrar deneniyor...",
"detect_turnstile": "Güvenlik doğrulaması kontrol ediliyor...",
"verification_success": "Güvenlik doğrulaması başarılı",
"starting_browser": "Tarayıcıılıyor...",
"form_success": "Form başarıyla gönderildi",
"browser_started": "Tarayıcı başarıyla açıldı",
"waiting_for_second_verification": "E-posta doğrulaması bekleniyor...",
"waiting_for_verification_code": "Doğrulama kodu bekleniyor...",
"password_success": "Şifre başarıyla ayarlandı",
"password_error": "Şifre ayarlanamadı: {error}. Lütfen tekrar deneyin",
"waiting_for_page_load": "Sayfa yükleniyor...",
"first_verification_passed": "İlk doğrulama başarılı",
"mailbox": "E-posta gelen kutusuna başarıyla erişildi",
"register_start": "Kayıt Başlat",
"form_submitted": "Form Gönderildi, Doğrulama Başlatılıyor...",
"filling_form": "Form Dolduruluyor",
"visiting_url": "URL Ziyaret Ediliyor",
"basic_info": "Temel Bilgiler Gönderildi",
"handle_turnstile": "Turnstile İşleniyor",
"no_turnstile": "Turnstile Algılanmadı",
"turnstile_passed": "Turnstile Geçildi",
"verification_start": "Doğrulama Kodu Alma Başlatılıyor",
"verification_timeout": "Doğrulama Kodu Alma Zaman Aşımı",
"verification_not_found": "Doğrulama Kodu Bulunamadı",
"try_get_code": "Deneme | {attempt} Doğrulama Kodu Al | Kalan Süre: {time}s",
"get_account": "Hesap Bilgileri Alınıyor",
"get_token": "Cursor Oturum Jetonu Alınıyor",
"token_success": "Jeton Başarıyla Alındı",
"token_attempt": "Deneme | {attempt} kez Jeton alma denemesi | {time}s içinde tekrar denenecek",
"token_max_attempts": "Maksimum Deneme Sayısına Ulaşıldı ({max}) | Jeton alınamadı",
"token_failed": "Jeton Alma Başarısız: {error}",
"account_error": "Hesap Bilgisi Alma Başarısız: {error}",
"press_enter": ıkmak için Enter'a Basın",
"browser_start": "Tarayıcı Başlatılıyor",
"open_mailbox": "Posta Kutusu Sayfasıılıyor",
"email_error": "E-posta Adresi Alınamadı",
"setup_error": "E-posta Kurulum Hatası: {error}",
"start_getting_verification_code": "Doğrulama Kodu Alma Başlatılıyor, 60 saniye içinde denenecek",
"get_verification_code_timeout": "Doğrulama Kodu Alma Zaman Aşımı",
"get_verification_code_success": "Doğrulama Kodu Alma Başarılı",
"try_get_verification_code": "Deneme | {attempt} Doğrulama Kodu Al | Kalan Süre: {remaining_time}s",
"verification_code_filled": "Doğrulama Kodu Dolduruldu",
"login_success_and_jump_to_settings_page": "Giriş Başarılı ve Ayarlar Sayfasına Yönlendiriliyor",
"detect_login_page": "Giriş Sayfası Algılandı, Giriş Başlatılıyor...",
"cursor_registration_completed": "Cursor Kaydı Tamamlandı!",
"set_password": "Şifre Belirle",
"basic_info_submitted": "Temel Bilgiler Gönderildi",
"cursor_auth_info_updated": "Cursor Kimlik Bilgileri Güncellendi",
"cursor_auth_info_update_failed": "Cursor Kimlik Bilgileri Güncellemesi Başarısız",
"reset_machine_id": "Makine Kimliğini Sıfırla",
"account_info_saved": "Hesap Bilgileri Kaydedildi",
"save_account_info_failed": "Hesap Bilgilerini Kaydetme Başarısız",
"get_email_address": "E-posta Adresi Al",
"update_cursor_auth_info": "Cursor Kimlik Bilgilerini Güncelle",
"register_process_error": "Kayıt İşlemi Hatası: {error}",
"setting_password": "Şifre Ayarlanıyor",
"manual_code_input": "Manuel Kod Girişi",
"manual_email_input": "Manuel E-posta Girişi",
"password": "Şifre",
"first_name": "Ad",
"last_name": "Soyad",
"exit_signal": ıkış Sinyali",
"email_address": "E-posta Adresi",
"config_created": "Yapılandırma Oluşturuldu",
"verification_failed": "Doğrulama Başarısız",
"verification_error": "Doğrulama Hatası: {error}",
"config_option_added": "Yapılandırma Seçeneği Eklendi: {option}",
"config_updated": "Yapılandırma Güncellendi",
"password_submitted": "Şifre Gönderildi",
"total_usage": "Toplam Kullanım: {usage}",
"setting_on_password": "Şifre Ayarlanıyor",
"getting_code": "Doğrulama Kodu Alınıyor, 60 saniye içinde denenecek",
"human_verify_error": "Kullanıcının insan olduğu doğrulanamıyor. Tekrar deneniyor...",
"max_retries_reached": "Maksimum deneme sayısına ulaşıldı. Kayıt başarısız.",
"using_browser": "{Tarayıcı} tarayıcı kullanma: {yol}",
"could_not_track_processes": "{Tarayıcı} işlemleri izlemedi: {hata}",
"try_install_browser": "Tarayıcıyı paket yöneticinizle yüklemeyi deneyin",
"tempmail_plus_verification_started": "Başlangıç TempmailPlus doğrulama işlemi",
"tempmail_plus_enabled": "Tempmailplus etkinleştirildi",
"browser_path_invalid": "{tarayıcı} yolu geçersiz, varsayılan yolu kullanılarak",
"using_tempmail_plus": "E -posta doğrulaması için tempmailplus kullanma",
"tracking_processes": "İzleme {Count} {tarayıcı} işlemleri",
"tempmail_plus_epin_missing": "Tempmailplus epin yapılandırılmamış",
"tempmail_plus_verification_failed": "Tempmailplus doğrulaması başarısız oldu: {hata}",
"using_browser_profile": "{Tarayıcı} profilini kullanma: {user_data_dir}",
"tempmail_plus_verification_completed": "Tempmailplus doğrulaması başarıyla tamamlandı",
"tempmail_plus_email_missing": "Tempmailplus e -posta yapılandırılmadı",
"tempmail_plus_init_failed": "Tempmailplus'u başlatılamadı: {hata}",
"tempmail_plus_config_missing": "Tempmailplus yapılandırması eksik",
"tempmail_plus_initialized": "Tempmailplus başarıyla başlatıldı",
"tempmail_plus_disabled": "Tempmailplus devre dışı bırakıldı",
"no_new_processes_detected": "İzlemek için yeni {tarayıcı} işlemi tespit edilmedi",
"make_sure_browser_is_properly_installed": "{Tarayıcı} 'nın düzgün yüklü olduğundan emin olun"
},
"auth": {
"title": "Cursor Kimlik Yöneticisi",
"checking_auth": "Kimlik Dosyası Kontrol Ediliyor",
"auth_not_found": "Kimlik Dosyası Bulunamadı",
"auth_file_error": "Kimlik Dosyası Hatası: {error}",
"reading_auth": "Kimlik Dosyası Okunuyor",
"updating_auth": "Kimlik Bilgileri Güncelleniyor",
"auth_updated": "Kimlik Bilgileri Başarıyla Güncellendi",
"auth_update_failed": "Kimlik Bilgileri Güncellemesi Başarısız: {error}",
"auth_file_created": "Kimlik Dosyası Oluşturuldu",
"auth_file_create_failed": "Kimlik Dosyası Oluşturma Başarısız: {error}",
"press_enter": ıkmak için Enter'a Basın",
"reset_machine_id": "Makine Kimliğini Sıfırla",
"database_connection_closed": "Veritabanı Bağlantısı Kapatıldı",
"database_updated_successfully": "Veritabanı Başarıyla Güncellendi",
"connected_to_database": "Veritabanına Bağlanıldı",
"updating_pair": "Anahtar-Değer Çifti Güncelleniyor",
"db_not_found": "Veritabanı dosyası bulunamadı: {path}",
"db_permission_error": "Veritabanı dosyasına erişilemiyor. Lütfen izinleri kontrol edin",
"db_connection_error": "Veritabanına bağlantı başarısız: {error}"
},
"control": {
"generate_email": "Yeni E-posta Oluşturuluyor",
"blocked_domain": "Engellenmiş Alan Adı",
"select_domain": "Rastgele Alan Adı Seçiliyor",
"copy_email": "E-posta Adresi Kopyalanıyor",
"enter_mailbox": "Posta Kutusuna Giriliyor",
"refresh_mailbox": "Posta Kutusu Yenileniyor",
"check_verification": "Doğrulama Kodu Kontrol Ediliyor",
"verification_found": "Doğrulama Kodu Bulundu",
"verification_not_found": "Doğrulama Kodu Bulunamadı",
"browser_error": "Tarayıcı Kontrol Hatası: {error}",
"navigation_error": "Gezinme Hatası: {error}",
"email_copy_error": "E-posta Kopyalama Hatası: {error}",
"mailbox_error": "Posta Kutusu Hatası: {error}",
"token_saved_to_file": "Jeton cursor_tokens.txt dosyasına kaydedildi",
"navigate_to": "{url} adresine gidiliyor",
"generate_email_success": "E-posta Oluşturma Başarılı",
"select_email_domain": "E-posta Alan Adı Seç",
"select_email_domain_success": "E-posta Alan Adı Seçimi Başarılı",
"get_email_name": "E-posta Adı Al",
"get_email_name_success": "E-posta Adı Alma Başarılı",
"get_email_address": "E-posta Adresi Al",
"get_email_address_success": "E-posta Adresi Alma Başarılı",
"enter_mailbox_success": "Posta Kutusuna Giriş Başarılı",
"found_verification_code": "Doğrulama Kodu Bulundu",
"get_cursor_session_token": "Cursor Oturum Jetonu Al",
"get_cursor_session_token_success": "Cursor Oturum Jetonu Alma Başarılı",
"get_cursor_session_token_failed": "Cursor Oturum Jetonu Alma Başarısız",
"save_token_failed": "Jeton Kaydetme Başarısız",
"database_updated_successfully": "Veritabanı Başarıyla Güncellendi",
"database_connection_closed": "Veritabanı Bağlantısı Kapatıldı",
"no_valid_verification_code": "Geçerli Doğrulama Kodu Yok"
},
"email": {
"starting_browser": "Tarayıcı Başlatılıyor",
"visiting_site": "E-posta alan adları ziyaret ediliyor",
"create_success": "E-posta Başarıyla Oluşturuldu",
"create_failed": "E-posta Oluşturma Başarısız",
"create_error": "E-posta Oluşturma Hatası: {error}",
"refreshing": "E-posta Yenileniyor",
"refresh_success": "E-posta Başarıyla Yenilendi",
"refresh_error": "E-posta Yenileme Hatası: {error}",
"refresh_button_not_found": "Yenileme Düğmesi Bulunamadı",
"verification_found": "Doğrulama Bulundu",
"verification_not_found": "Doğrulama Bulunamadı",
"verification_error": "Doğrulama Hatası: {error}",
"verification_code_found": "Doğrulama Kodu Bulundu",
"verification_code_not_found": "Doğrulama Kodu Bulunamadı",
"verification_code_error": "Doğrulama Kodu Hatası: {error}",
"address": "E-posta Adresi",
"all_domains_blocked": "Tüm Alan Adları Engellendi, Servis Değiştiriliyor",
"no_available_domains_after_filtering": "Filtrelemeden Sonra Kullanılabilir Alan Adı Yok",
"switching_service": "{service} Servisine Geçiliyor",
"domains_list_error": "Alan Adları Listesi Alınamadı: {error}",
"failed_to_get_available_domains": "Kullanılabilir Alan Adları Alınamadı",
"domains_excluded": "Hariç Tutulan Alan Adları: {domains}",
"failed_to_create_account": "Hesap Oluşturma Başarısız",
"account_creation_error": "Hesap Oluşturma Hatası: {error}",
"blocked_domains": "Engellenen Alan Adları: {domains}",
"blocked_domains_loaded": "Engellenen Alan Adları Yüklendi: {count}",
"blocked_domains_loaded_error": "Engellenen Alan Adları Yükleme Hatası: {error}",
"blocked_domains_loaded_success": "Engellenen Alan Adları Başarıyla Yüklendi",
"blocked_domains_loaded_timeout": "Engellenen Alan Adları Yükleme Zaman Aşımı: {timeout}s",
"blocked_domains_loaded_timeout_error": "Engellenen Alan Adları Yükleme Zaman Aşımı Hatası: {error}",
"available_domains_loaded": "Kullanılabilir Alan Adları Yüklendi: {count}",
"domains_filtered": "Filtrelenen Alan Adları: {count}",
"trying_to_create_email": "E-posta oluşturulmaya çalışılıyor: {email}",
"domain_blocked": "Alan Adı Engellendi: {domain}",
"no_display_found": "Ekran bulunamadı. X sunucusunun çalıştığından emin olun.",
"try_export_display": "Deneyin: Dışa aktarma ekranı =: 0",
"try_install_chromium": "Deneyin: sudo apt Krom tarayıcısını yükleyin",
"extension_load_error": "Uzatma yükü hatası: {hata}",
"make_sure_chrome_chromium_is_properly_installed": "Krom/kromun düzgün takıldığından emin olun",
"using_chrome_profile": "Chrome Profilini Kullanma: {USER_DATA_DIR}"
},
"update": {
"title": "Cursor Otomatik Güncellemeyi Devre Dışı Bırak",
"disable_success": "Otomatik Güncelleme Başarıyla Devre Dışı Bırakıldı",
"disable_failed": "Otomatik Güncellemeyi Devre Dışı Bırakma Başarısız: {error}",
"press_enter": ıkmak için Enter'a Basın",
"start_disable": "Otomatik Güncellemeyi Devre Dışı Bırakma Başlatılıyor",
"killing_processes": "İşlemler Sonlandırılıyor",
"processes_killed": "İşlemler Sonlandırıldı",
"removing_directory": "Dizin Kaldırılıyor",
"directory_removed": "Dizin Kaldırıldı",
"creating_block_file": "Engelleme Dosyası Oluşturuluyor",
"block_file_created": "Engelleme Dosyası Oluşturuldu",
"clearing_update_yml": "Update.yml dosyasını temizleme",
"update_yml_cleared": "update.yml dosyası temizlendi",
"unsupported_os": "Desteklenmemiş işletim sistemi: {System}",
"block_file_already_locked": "Blok dosyası zaten kilitlendi",
"yml_already_locked_error": "update.yml dosyası zaten kilitli hata: {hata}",
"update_yml_not_found": "update.yml dosyası bulunamadı",
"yml_locked_error": "update.yml dosyası kilitli hata: {error}",
"remove_directory_failed": "Dizin kaldırılamadı: {hata}",
"create_block_file_failed": "Blok dosyası oluşturulamadı: {error}",
"yml_already_locked": "update.yml dosyası zaten kilitli",
"block_file_locked_error": "Blok Dosya Kilitli Hata: {hata}",
"directory_locked": "Dizin kilitli: {yol}",
"block_file_already_locked_error": "Blok dosyası zaten kilitli hata: {hata}",
"clear_update_yml_failed": "Update.yml dosyasını temizleyemedi: {error}",
"yml_locked": "update.yml dosyası kilitlendi",
"block_file_locked": "Blok dosyası kilitlendi"
},
"updater": {
"checking": "Güncellemeler kontrol ediliyor...",
"new_version_available": "Yeni sürüm mevcut! (Mevcut: {current}, En son: {latest})",
"updating": "En son sürüme güncelleniyor. Program otomatik olarak yeniden başlatılacak.",
"up_to_date": "En son sürümü kullanıyorsunuz.",
"check_failed": "Güncellemeler kontrol edilemedi: {error}",
"continue_anyway": "Mevcut sürümle devam ediliyor...",
"update_confirm": "En son sürüme güncellemek istiyor musunuz? (Y/n)",
"update_skipped": "Güncelleme atlanıyor.",
"invalid_choice": "Geçersiz seçim. Lütfen 'Y' veya 'n' girin.",
"development_version": "Geliştirme Sürümü {current} > {latest}",
"changelog_title": "Değişiklik günlüğü",
"rate_limit_exceeded": "GitHub API oranı sınırı aştı. Güncelleme kontrolünü atlama."
},
"totally_reset": {
"title": "Cursor'ı Tamamen Sıfırla",
"checking_config": "Yapılandırma Dosyası Kontrol Ediliyor",
"config_not_found": "Yapılandırma Dosyası Bulunamadı",
"no_permission": "Yapılandırma Dosyası Okunamıyor veya Yazılamıyor, Lütfen Dosya İzinlerini Kontrol Edin",
"reading_config": "Mevcut Yapılandırma Okunuyor",
"creating_backup": "Yapılandırma Yedeği Oluşturuluyor",
"backup_exists": "Yedek Dosya Zaten Mevcut, Yedekleme Adımı Atlanıyor",
"generating_new_machine_id": "Yeni Makine Kimliği Oluşturuluyor",
"saving_new_config": "Yeni Yapılandırma JSON'a Kaydediliyor",
"success": "Cursor Başarıyla Sıfırlandı",
"error": "Cursor Sıfırlama Başarısız: {error}",
"press_enter": ıkmak için Enter'a Basın",
"reset_machine_id": "Makine Kimliğini Sıfırla",
"database_connection_closed": "Veritabanı Bağlantısı Kapatıldı",
"database_updated_successfully": "Veritabanı Başarıyla Güncellendi",
"connected_to_database": "Veritabanına Bağlanıldı",
"updating_pair": "Anahtar-Değer Çifti Güncelleniyor",
"db_not_found": "Veritabanı dosyası bulunamadı: {path}",
"db_permission_error": "Veritabanı dosyasına erişilemiyor. Lütfen izinleri kontrol edin",
"db_connection_error": "Veritabanına bağlantı başarısız: {error}",
"feature_title": "ÖZELLİKLER",
"feature_1": "Cursor AI ayarları ve yapılandırmalarının tamamen kaldırılması",
"feature_2": "AI geçmişi ve komutları dahil tüm önbelleğe alınmış verileri temizler",
"feature_3": "Deneme süresini aşma tespitini atlatmak için makine kimliğini sıfırlar",
"feature_4": "Rastgele yeni makine tanımlayıcıları oluşturur",
"feature_5": "Özel uzantıları ve tercihleri kaldırır",
"feature_6": "Deneme süresi bilgilerini ve aktivasyon verilerini sıfırlar",
"feature_7": "Gizli lisans ve deneme süresiyle ilgili dosyalar için derin tarama",
"feature_8": "Cursor olmayan dosyaları ve uygulamaları güvenle korur",
"feature_9": "Windows, macOS ve Linux ile uyumludur",
"disclaimer_title": "YASAL UYARI",
"disclaimer_1": "Bu araç, tüm Cursor AI ayarlarını,",
"disclaimer_2": "yapılandırmalarını ve önbelleğe alınmış verileri kalıcı olarak silecektir. Bu işlem geri alınamaz.",
"disclaimer_3": "Kod dosyalarınız ETKİLENMEYECEK ve bu araç",
"disclaimer_4": "yalnızca Cursor AI editör dosyalarını ve deneme süresi algılama mekanizmalarını hedef almak için tasarlanmıştır.",
"disclaimer_5": "Sisteminizde bulunan diğer uygulamalar etkilenmeyecektir.",
"disclaimer_6": "Bu aracı çalıştırdıktan sonra Cursor AI'yi yeniden kurmanız gerekecektir.",
"disclaimer_7": "Kullanım sorumluluğu size aittir",
"confirm_title": "Devam etmek istediğinizden emin misiniz?",
"confirm_1": "Bu işlem, tüm Cursor AI ayarlarını,",
"confirm_2": "yapılandırmalarını ve önbelleğe alınmış verileri silecektir. Bu işlem geri alınamaz.",
"confirm_3": "Kod dosyalarınız ETKİLENMEYECEK ve bu araç",
"confirm_4": "yalnızca Cursor AI editör dosyalarını ve deneme süresi algılama mekanizmalarını hedef almak için tasarlanmıştır.",
"confirm_5": "Sisteminizde bulunan diğer uygulamalar etkilenmeyecektir.",
"confirm_6": "Bu aracı çalıştırdıktan sonra Cursor AI'yi yeniden kurmanız gerekecektir.",
"confirm_7": "Kullanım sorumluluğu size aittir",
"invalid_choice": "Lütfen 'Y' veya 'n' girin",
"skipped_for_safety": "Güvenlik için atlandı (Cursor ile ilgili değil): {path}",
"deleted": "Silindi: {path}",
"error_deleting": "{path} silinirken hata: {error}",
"not_found": "Dosya bulunamadı: {path}",
"resetting_machine_id": "Deneme süresi algılamasını atlatmak için makine tanımlayıcıları sıfırlanıyor...",
"created_machine_id": "Yeni makine kimliği oluşturuldu: {path}",
"error_creating_machine_id": "Makine kimliği dosyası oluşturulurken hata {path}: {error}",
"error_searching": "{path} içindeki dosyalar aranırken hata: {error}",
"created_extended_trial_info": "Yeni genişletilmiş deneme bilgisi oluşturuldu: {path}",
"error_creating_trial_info": "Deneme bilgisi dosyası oluşturulurken hata {path}: {error}",
"resetting_cursor_ai_editor": "Cursor AI Editor sıfırlanıyor... Lütfen bekleyin.",
"reset_cancelled": "Sıfırlama iptal edildi. Herhangi bir değişiklik yapmadan çıkılıyor.",
"windows_machine_id_modification_skipped": "Windows makine kimliği değişikliği atlandı: {error}",
"linux_machine_id_modification_skipped": "Linux machine-id değişikliği atlandı: {error}",
"note_complete_machine_id_reset_may_require_running_as_administrator": "Not: Tam makine kimliği sıfırlaması yönetici olarak çalıştırmayı gerektirebilir",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "Not: Tam sistem machine-id sıfırlaması sudo ayrıcalıkları gerektirebilir",
"windows_registry_instructions": "📝 NOT: Windows'ta tam sıfırlama için kayıt defteri girdilerini de temizlemeniz gerekebilir.",
"windows_registry_instructions_2": " 'regedit' çalıştırın ve HKEY_CURRENT_USER\\Software\\ altında 'Cursor' veya 'CursorAI' içeren anahtarları arayıp silin.\n",
"reset_log_1": "Cursor AI tamamen sıfırlandı ve deneme süresi algılaması atlatıldı!",
"reset_log_2": "Değişikliklerin etkili olması için lütfen sisteminizi yeniden başlatın.",
"reset_log_3": "Cursor AI'yi yeniden kurmanız gerekecek ve şimdi yeni bir deneme süreniz olmalı.",
"reset_log_4": "En iyi sonuçlar için şunları da düşünün:",
"reset_log_5": "Yeni bir deneme süresi için kaydolurken farklı bir e-posta adresi kullanın",
"reset_log_6": "Mümkünse, IP adresinizi değiştirmek için VPN kullanın",
"reset_log_7": "Cursor AI'nin web sitesini ziyaret etmeden önce tarayıcı çerezlerinizi ve önbelleği temizleyin",
"reset_log_8": "Sorunlar devam ederse, Cursor AI'yi farklı bir konuma kurmayı deneyin",
"reset_log_9": "Herhangi bir sorunla karşılaşırsanız, Github Sorun Takibine gidin ve https://github.com/yeongpin/cursor-free-vip/issues adresinde bir sorun oluşturun",
"unexpected_error": "Beklenmeyen bir hata oluştu: {error}",
"report_issue": "Lütfen bu sorunu https://github.com/yeongpin/cursor-free-vip/issues adresindeki Github Sorun Takibine bildirin",
"keyboard_interrupt": "İşlem kullanıcı tarafından kesildi. Çıkılıyor...",
"return_to_main_menu": "Ana menüye dönülüyor...",
"process_interrupted": "İşlem kesildi. Çıkılıyor...",
"press_enter_to_return_to_main_menu": "Ana menüye dönmek için Enter'a basın...",
"removing_known": "Bilinen deneme/lisans dosyaları kaldırılıyor",
"performing_deep_scan": "Ek deneme/lisans dosyaları için derin tarama yapılıyor",
"found_additional_potential_license_trial_files": "{count} ek potansiyel lisans/deneme dosyası bulundu",
"checking_for_electron_localstorage_files": "Electron localStorage dosyaları kontrol ediliyor",
"no_additional_license_trial_files_found_in_deep_scan": "Derin taramada ek lisans/deneme dosyası bulunamadı",
"removing_electron_localstorage_files": "Electron localStorage dosyaları kaldırılıyor",
"electron_localstorage_files_removed": "Electron localStorage dosyaları kaldırıldı",
"electron_localstorage_files_removal_error": "Electron localStorage dosyaları kaldırılırken hata: {error}",
"removing_electron_localstorage_files_completed": "Electron localStorage dosyaları kaldırma işlemi tamamlandı",
"warning_title": "UYARI",
"direct_advanced_navigation": "Gelişmiş sekmede doğrudan gezinmeyi denemek",
"delete_input_error": "Girdi silme hatası: {hata}",
"delete_input_not_found_continuing": "Onay girişini sil, yine de devam etmeye çalışıyor",
"advanced_tab_not_found": "Gelişmiş sekme birden fazla denemeden sonra bulunamadı",
"advanced_tab_error": "Gelişmiş sekme bulma hatası: {hata}",
"delete_input_not_found": "Birden fazla denemeden sonra bulunmayan onay girişini silme",
"failed_to_delete_file": "Dosyayı silemedi: {yol}",
"operation_cancelled": "İşlem iptal edildi. Herhangi bir değişiklik yapmadan çıkmak.",
"removed": "Kaldırıldı: {yol}",
"warning_6": "Bu aracı çalıştırdıktan sonra İmleç AI'sını tekrar ayarlamanız gerekecektir.",
"delete_input_retry": "Girdi Sil bulunamadı, {deneme}/{max_attempts} dene",
"warning_4": "Yalnızca imleci AI düzenleyici dosyaları ve deneme algılama mekanizmalarını hedeflemek.",
"cursor_reset_failed": "İmleç AI Editör Sıfırlama Başarısız: {Hata}",
"login_redirect_failed": "Giriş yeniden yönlendirme başarısız oldu, doğrudan gezinmeyi deniyor ...",
"warning_5": "Sisteminizdeki diğer uygulamalar etkilenmeyecektir.",
"failed_to_delete_file_or_directory": "Dosyayı veya dizinini silmemedi: {Path}",
"failed_to_delete_directory": "Dizin silinmemesi: {yol}",
"resetting_cursor": "İmleç AI düzenleyicisini sıfırlama ... Lütfen bekleyin.",
"cursor_reset_completed": "İmleç AI editörü tamamen sıfırlandı ve deneme algılama atlandı!",
"warning_3": "Kod dosyalarınız etkilenmeyecek ve araç tasarlandı",
"advanced_tab_retry": "Gelişmiş sekme bulunamadı, {deneme}/{max_attempts} deneme",
"completed_in": "{Zaman} saniyelerde tamamlandı",
"advanced_tab_clicked": "Gelişmiş sekmesine tıklandı",
"already_on_settings": "Zaten Ayarlar Sayfasında",
"delete_button_retry": "Sil düğmesi bulunamadı, {deneme}/{max_attempts} dene",
"found_danger_zone": "Bulunan Tehlike Bölgesi Bölümü",
"failed_to_remove": "Kaldırılamadı: {yol}",
"failed_to_reset_machine_guid": "Makine kılavuzunu sıfırlayamadı",
"deep_scanning": "Ek deneme/lisans dosyaları için derin tarama yapmak",
"delete_button_clicked": "Hesabı Sil düğmesine tıklandı",
"warning_7": "Kendi sorumluluğunuzda kullanın",
"delete_button_not_found": "Birden çok denemeden sonra bulunamadı Hesap düğmesini Sil düğmesi",
"delete_button_error": "Sil düğmesini bulma hatası: {hata}",
"warning_2": "yapılandırmalar ve önbelleğe alınmış veriler. Bu eylem geri alınamaz.",
"warning_1": "Bu eylem tüm imleci AI ayarlarını siler,",
"navigating_to_settings": "Ayarlar sayfasına gitmek ...",
"cursor_reset_cancelled": "İmleç AI Editör Sıfırlandı İptal edildi. Herhangi bir değişiklik yapmadan çıkmak."
},
"chrome_profile": {
"title": "Chrome Profil Seçimi",
"select_profile": "Kullanılacak Chrome profilini seçin:",
"profile_list": "Mevcut profiller:",
"default_profile": "Varsayılan Profil",
"profile": "Profil {number}",
"no_profiles": "Chrome profili bulunamadı",
"error_loading": "Chrome profilleri yüklenirken hata: {error}",
"profile_selected": "Seçilen profil: {profile}",
"invalid_selection": "Geçersiz seçim. Lütfen tekrar deneyin",
"warning_chrome_close": "Uyarı: Bu işlem tüm çalışan Chrome işlemlerini kapatacaktır"
},
"restore": {
"title": "Makine Kimliğini Yedekten Geri Yükle",
"starting": "Makine kimliği geri yükleme işlemi başlatılıyor",
"no_backups_found": "Yedek bulunamadı",
"available_backups": "Mevcut yedekler",
"select_backup": "Geri yüklemek için bir yedek seçin",
"to_cancel": "iptal etmek için",
"operation_cancelled": "İşlem iptal edildi",
"invalid_selection": "Geçersiz seçim",
"please_enter_number": "Lütfen geçerli bir numara girin",
"missing_id": "Eksik kimlik: {id}",
"read_backup_failed": "Yedek dosyası okunamadı: {error}",
"current_file_not_found": "Mevcut depolama dosyası bulunamadı",
"current_backup_created": "Mevcut depolama dosyasının yedeği oluşturuldu",
"storage_updated": "Depolama dosyası başarıyla güncellendi",
"update_failed": "Depolama dosyası güncellenemedi: {error}",
"sqlite_not_found": "SQLite veritabanı bulunamadı",
"updating_sqlite": "SQLite veritabanı güncelleniyor",
"updating_pair": "Anahtar-değer çifti güncelleniyor",
"sqlite_updated": "SQLite veritabanı başarıyla güncellendi",
"sqlite_update_failed": "SQLite veritabanı güncellenemedi: {error}",
"machine_id_backup_created": "MachineId dosyasının yedeği oluşturuldu",
"backup_creation_failed": "Yedek oluşturulamadı: {error}",
"machine_id_updated": "MachineId dosyası başarıyla güncellendi",
"machine_id_update_failed": "MachineId dosyası güncellenemedi: {error}",
"updating_system_ids": "Sistem kimlikleri güncelleniyor",
"system_ids_update_failed": "Sistem kimlikleri güncellenemedi: {error}",
"permission_denied": "İzin reddedildi. Yönetici olarak çalıştırmayı deneyin",
"windows_machine_guid_updated": "Windows makine GUID'i başarıyla güncellendi",
"update_windows_machine_guid_failed": "Windows makine GUID'i güncellenemedi: {error}",
"windows_machine_id_updated": "Windows makine kimliği başarıyla güncellendi",
"update_windows_machine_id_failed": "Windows makine kimliği güncellenemedi: {error}",
"sqm_client_key_not_found": "SQMClient kayıt anahtarı bulunamadı",
"update_windows_system_ids_failed": "Windows sistem kimlikleri güncellenemedi: {error}",
"macos_platform_uuid_updated": "macOS platform UUID'si başarıyla güncellendi",
"failed_to_execute_plutil_command": "plutil komutu yürütülemedi",
"update_macos_system_ids_failed": "macOS sistem kimlikleri güncellenemedi: {error}",
"ids_to_restore": "Geri yüklenecek makine kimlikleri",
"confirm": "Bu kimlikleri geri yüklemek istediğinizden emin misiniz?",
"success": "Makine kimliği başarıyla geri yüklendi",
"process_error": "Geri yükleme işlemi hatası: {error}",
"press_enter": "Devam etmek için Enter tuşuna basın"
},
"oauth": {
"no_chrome_profiles_found": "Varsayılan kullanarak krom profil bulunamadı",
"failed_to_delete_account": "Hesabı silemedi: {hata}",
"starting_new_authentication_process": "Yeni Kimlik Doğrulama İşlemine Başlamak ...",
"found_email": "E -posta bulundu: {e -posta}",
"github_start": "Github Başlangıç",
"already_on_settings_page": "Zaten Ayarlar sayfasında!",
"starting_github_authentication": "Başlangıç Github Kimlik Doğrulaması ...",
"account_is_still_valid": "Hesap hala geçerlidir (kullanım: {kullanım})",
"status_check_error": "Durum kontrol hatası: {hata}",
"authentication_timeout": "Kimlik Doğrulama Zaman Aşımı",
"using_first_available_chrome_profile": "İlk kullanılabilir krom profilini kullanma: {profil}",
"no_compatible_browser_found": "Uyumlu tarayıcı bulunamadı. Lütfen Google Chrome veya Chromium'u yükleyin.",
"usage_count": "Kullanım Sayısı: {Kullanım}",
"google_start": "Google Start",
"authentication_successful_getting_account_info": "Kimlik doğrulama başarılı, hesap bilgileri almak ...",
"found_chrome_at": "Chrome'da bulundu: {yol}",
"error_getting_user_data_directory": "Hata kullanıcı veri dizinini alır: {hata}",
"error_finding_chrome_profile": "Krom profilini bulma hatası, varsayılan: {hata}",
"auth_update_success": "Yetkilendirme Başarısı Güncelle",
"authentication_successful": "Kimlik Doğrulama Başarılı - E -posta: {E -posta}",
"authentication_failed": "Kimlik doğrulama başarısız oldu: {hata}",
"warning_browser_close": "Uyarı: Bu, tüm çalışan {tarayıcı} işlemlerini kapatacaktır",
"supported_browsers": "{Platform} için desteklenen tarayıcılar",
"authentication_button_not_found": "Kimlik Doğrulama düğmesi bulunamadı",
"starting_new_google_authentication": "Yeni Google Kimlik Doğrulamasına Başlamak ...",
"waiting_for_authentication": "Kimlik doğrulamasını bekliyorum ...",
"found_default_chrome_profile": "Varsayılan Chrome Profili Bulundu",
"could_not_check_usage_count": "Kullanım sayısını kontrol edemedi: {hata}",
"starting_browser": "Tarayıcı Başlangıç: {Path}",
"token_extraction_error": "Jeton Çıkarma Hatası: {Hata}",
"profile_selection_error": "Profil seçimi sırasında hata: {hata}",
"warning_could_not_kill_existing_browser_processes": "Uyarı: Mevcut tarayıcı işlemlerini öldüremedi: {hata}",
"browser_failed_to_start": "Tarayıcı başlayamadı: {hata}",
"redirecting_to_authenticator_cursor_sh": "Authenticator.cursor.sh'a yönlendirme ...",
"starting_re_authentication_process": "Yeniden kimlik doğrulama sürecine başlama ...",
"found_browser_data_directory": "Bulunan Tarayıcı Veri Dizini: {Path}",
"browser_not_found_trying_chrome": "Bunun yerine Chrome'u denemek {tarayıcı} bulamadım",
"found_cookies": "Bulundu {Count} Çerezler",
"auth_update_failed": "Auth güncellemesi başarısız oldu",
"browser_failed_to_start_fallback": "Tarayıcı başlayamadı: {hata}",
"failed_to_delete_expired_account": "Süresi dolmuş hesabı silemedi",
"navigating_to_authentication_page": "Kimlik doğrulama sayfasına gitmek ...",
"initializing_browser_setup": "Tarayıcı kurulumunu başlatma ...",
"browser_closed": "Tarayıcı kapalı",
"failed_to_delete_account_or_re_authenticate": "Hesabı silmemedi veya yeniden kimlik doğrulanmadı: {hata}",
"detected_platform": "Tespit edilen platform: {platform}",
"failed_to_extract_auth_info": "Yetkilendirme Bilgisi Çıkarılamadı: {Hata}",
"starting_google_authentication": "Google Kimlik Doğrulamasını Başlat ...",
"browser_failed": "Tarayıcı başlayamadı: {hata}",
"using_browser_profile": "Tarayıcı Profilini Kullanma: {Profil}",
"consider_running_without_sudo": "Senaryoyu sudo olmadan çalıştırmayı düşünün",
"try_running_without_sudo_admin": "Sudo/yönetici ayrıcalıkları olmadan çalışmayı deneyin",
"page_changed_checking_auth": "Sayfa değişti, kimlik doğrulama ...",
"running_as_root_warning": "Tarayıcı Otomasyonu için Kök Olarak Koşu Önermez",
"please_select_your_google_account_to_continue": "Lütfen devam etmek için Google hesabınızı seçin ...",
"browser_setup_failed": "Tarayıcı kurulumu başarısız oldu: {hata}",
"missing_authentication_data": "Eksik Kimlik Doğrulama Verileri: {Data}",
"using_configured_browser_path": "Yapılandırılmış {tarayıcı} yolu kullanma: {yol}",
"killing_browser_processes": "{Tarayıcı} süreçlerini öldürmek ...",
"could_not_find_usage_count": "Kullanım sayımı bulamadım: {hata}",
"browser_setup_completed": "Tarayıcı kurulumu başarıyla tamamlandı",
"account_has_reached_maximum_usage": "Hesap maksimum kullanıma ulaştı, {silme}",
"could_not_find_email": "E -posta bulamadım: {hata}",
"found_browser_user_data_dir": "Bulundu {tarayıcı} Kullanıcı Veri Dizini: {Path}",
"user_data_dir_not_found": "{Browser} Kullanıcı Veri Dizini {Path} adresinde bulunamadı, bunun yerine Chrome'u deneyecek",
"invalid_authentication_type": "Geçersiz kimlik doğrulama türü"
},
"account_delete": {
"delete_input_not_found": "Birden fazla denemeden sonra bulunmayan onay girişini silme",
"logging_in": "Google ile oturum açma ...",
"confirm_button_not_found": "Birden fazla denemeden sonra bulunamadı düğmesini onaylayın",
"confirm_button_error": "Hata Bulma Onay düğmesi: {hata}",
"delete_button_clicked": "Hesabı Sil düğmesine tıklandı",
"confirm_prompt": "Devam etmek istediğinden emin misin? (E/H):",
"cancelled": "Hesap silme iptal edildi.",
"delete_button_error": "Sil düğmesini bulma hatası: {hata}",
"interrupted": "Hesap silme işlemi kullanıcı tarafından kesintiye uğradı.",
"error": "Hesap silme sırasında hata: {hata}",
"delete_input_not_found_continuing": "Onay girişini sil, yine de devam etmeye çalışıyor",
"advanced_tab_retry": "Gelişmiş sekme bulunamadı, {deneme}/{max_attempts} deneme",
"waiting_for_auth": "Google kimlik doğrulamasını bekliyorum ...",
"typed_delete": "Onay kutusunda yazılan \"Sil\"",
"trying_settings": "Ayarlar sayfasında gezinmeye çalışıyorum ...",
"delete_input_retry": "Girdi Sil bulunamadı, {deneme}/{max_attempts} dene",
"email_not_found": "E -posta bulunamadı: {hata}",
"delete_button_not_found": "Birden çok denemeden sonra bulunamadı Hesap düğmesini Sil düğmesi",
"already_on_settings": "Zaten Ayarlar Sayfasında",
"failed": "Hesap silme işlemi başarısız oldu veya iptal edildi.",
"warning": "Uyarı: Bu, imleç hesabınızı kalıcı olarak silecektir. Bu eylem geri alınamaz.",
"direct_advanced_navigation": "Gelişmiş sekmede doğrudan gezinmeyi denemek",
"advanced_tab_not_found": "Gelişmiş sekme birden fazla denemeden sonra bulunamadı",
"auth_timeout": "Kimlik doğrulama zaman aşımı, yine de devam ediyor ...",
"select_google_account": "Lütfen Google hesabınızı seçin ...",
"google_button_not_found": "Google Giriş Düğmesi bulunamadı",
"found_danger_zone": "Bulunan Tehlike Bölgesi Bölümü",
"account_deleted": "Hesap başarıyla silindi!",
"starting_process": "Hesap silme işlemine başlama ...",
"advanced_tab_error": "Gelişmiş sekme bulma hatası: {hata}",
"delete_button_retry": "Sil düğmesi bulunamadı, {deneme}/{max_attempts} dene",
"login_redirect_failed": "Giriş yeniden yönlendirme başarısız oldu, doğrudan gezinmeyi deniyor ...",
"unexpected_error": "Beklenmedik hata: {hata}",
"delete_input_error": "Girdi silme hatası: {hata}",
"login_successful": "Giriş başarılı",
"advanced_tab_clicked": "Gelişmiş sekmesine tıklandı",
"unexpected_page": "Girişten sonra beklenmedik sayfa: {url}",
"found_email": "E -posta bulundu: {e -posta}",
"title": "İmleç Google Hesap Silme Aracı",
"navigating_to_settings": "Ayarlar sayfasına gitmek ...",
"success": "İmleç hesabınız başarıyla silindi!",
"confirm_button_retry": "Onayı Bulunamadı, Deneme {deneme}/{max_attempts}"
},
"auth_check": {
"token_length": "Jeton uzunluğu: {uzunluk} karakterler",
"usage_response_status": "Kullanım Yanıt Durumu: {yanıt}",
"operation_cancelled": "Kullanıcı tarafından iptal edildi işlem",
"error_getting_token_from_db": "Veritabanından jeton alma hatası: {hata}",
"checking_usage_information": "Kullanım bilgilerini kontrol etmek ...",
"usage_response": "Kullanım yanıtı: {yanıt}",
"authorization_failed": "Yetkilendirme başarısız oldu!",
"authorization_successful": "Yetkilendirme başarılı!",
"request_timeout": "İstek zaman aşımına uğramış",
"check_error": "Hata Kontrolü Yetkilendirme: {hata}",
"connection_error": "Bağlantı hatası",
"invalid_token": "Geçersiz jeton",
"enter_token": "İmleç jetonunuzu girin:",
"check_usage_response": "Kullanım yanıtını kontrol edin: {yanıt}",
"user_unauthorized": "Kullanıcı yetkisiz",
"token_found_in_db": "Veritabanında bulundu jeton",
"checking_authorization": "Yetkilendirme kontrolü ...",
"error_generating_checksum": "Hata Oluşturma Noktası: {hata}",
"unexpected_error": "Beklenmedik hata: {hata}",
"token_source": "Veritabanından jeton veya manuel olarak girdi mi? (D/M, Varsayılan: D)",
"user_authorized": "Kullanıcı yetkili",
"token_not_found_in_db": "Token veritabanında bulunamadı",
"jwt_token_warning": "Token JWT formatında gibi görünüyor, ancak API Check beklenmedik bir durum kodu döndürdü. Jeton geçerli olabilir, ancak API erişimi kısıtlanmıştır.",
"unexpected_status_code": "Beklenmedik durum kodu: {code}",
"getting_token_from_db": "Veritabanından jeton almak ...",
"cursor_acc_info_not_found": "Cursor_acc_info.py bulunamadı"
},
"manual_auth": {
"auth_type_selected": "Seçilen Kimlik Doğrulama Türü: {Type}",
"proceed_prompt": "İlerlemek? (E/H):",
"auth_type_github": "Gitithub",
"confirm_prompt": "Lütfen aşağıdaki bilgileri onaylayın:",
"invalid_token": "Geçersiz jeton. Kimlik doğrulama iptal edildi.",
"continue_anyway": "Yine de devam et? (E/H):",
"token_verified": "Token başarıyla doğrulandı!",
"error": "Hata: {hata}",
"auth_update_failed": "Kimlik doğrulama bilgilerini güncelleyemedi",
"auth_type_auth0": "Auth_0 (varsayılan)",
"auth_type_prompt": "Kimlik Doğrulama Türünü seçin:",
"verifying_token": "Token geçerliliğini doğrulamak ...",
"auth_updated_successfully": "Kimlik doğrulama bilgileri başarıyla güncellendi!",
"email_prompt": "E -posta girin (rastgele e -posta için boş bırakın):",
"token_prompt": "İmleç jetonunuzu girin (Access_token/Refresh_token):",
"title": "Manuel imleç kimlik doğrulaması",
"token_verification_skipped": "Token doğrulaması atlandı (check_user_authorized.py bulunamadı)",
"random_email_generated": "Oluşturulan rastgele e -posta: {e -posta}",
"token_required": "Jeton gerekli",
"auth_type_google": "Google",
"operation_cancelled": "Operasyon iptal edildi",
"token_verification_error": "Hata Doğrulama Jetonu: {Hata}",
"updating_database": "İmleç Kimlik Doğrulama Veritabanını Güncelleme ..."
},
"token": {
"refreshing": "Serinletici jeton ...",
"extraction_error": "Hata Çıkarma jetonu: {hata}",
"invalid_response": "Yenileme Sunucusundan Geçersiz JSON Yanıtı",
"no_access_token": "Yanıt olarak erişim belirteci yok",
"connection_error": "Sunucuyu yenilemek için bağlantı hatası",
"unexpected_error": "Jeton Yenileme Sırasında Beklenmedik Hata: {Hata}",
"server_error": "Sunucu Hatası Yenile: HTTP {Durum}",
"refresh_success": "Token başarıyla yenilendi! {Days} günleri için geçerlidir (süresi dolar: {süresi sona erer})",
"request_timeout": "Sunucuyu yenileme isteği zaman aşımına uğramış",
"refresh_failed": "Token Yenileme Başarısız: {Hata}"
},
"browser_profile": {
"profile_selected": "Seçilen profil: {profil}",
"default_profile": "Varsayılan profil",
"no_profiles": "Yok {tarayıcı} profilleri bulunamadı",
"select_profile": "Kullanılmak üzere {tarayıcı} profilini seçin:",
"error_loading": "Hata Yükleme {tarayıcı} Profiller: {hata}",
"invalid_selection": "Geçersiz seçim. Lütfen tekrar deneyin.",
"title": "Tarayıcı Profil Seçimi",
"profile": "Profil {numara}",
"profile_list": "Kullanılabilir {tarayıcı} profiller:"
},
"github_register": {
"feature2": "Rastgele kimlik bilgileriyle yeni bir GitHub hesabı kaydeder.",
"feature6": "Tüm kimlik bilgilerini bir dosyaya kaydeder.",
"starting_automation": "Başlangıç Otomasyonu ...",
"feature1": "1secmail kullanarak geçici bir e -posta oluşturur.",
"title": "GitHub + İmleç AI Kayıt Otomasyonu",
"github_username": "Github kullanıcı adı",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Manuel müdahale için tarayıcı pencerelerini kontrol edin veya daha sonra tekrar deneyin.",
"warning1": "Bu komut dosyası, GitHub/Cursor Hizmet Şartlarını ihlal edebilecek hesap oluşturmayı otomatikleştirir.",
"feature4": "GitHub Kimlik Doğrulaması kullanarak imleç AI'da günlükler.",
"invalid_choice": "Geçersiz seçim. Lütfen 'Evet' veya 'hayır' girin",
"completed_successfully": "GitHub + imleç kaydı başarıyla tamamlandı!",
"warning2": "İnternet erişimi ve idari ayrıcalıklar gerektirir.",
"registration_encountered_issues": "GitHub + imleç kaydı sorunlarla karşılaştı.",
"credentials_saved": "Bu kimlik bilgileri github_cursor_accounts.txt adresine kaydedildi",
"feature3": "GitHub e -postasını otomatik olarak doğrular.",
"github_password": "Github şifresi",
"features_header": "Özellikler",
"feature5": "Deneme algılamasını atlamak için makine kimliğini sıfırlar.",
"warning4": "Sorumlu ve kendi sorumluluğunuzda kullanın.",
"warning3": "Captcha veya ek doğrulama otomasyonu kesintiye uğratabilir.",
"cancelled": "Operasyon iptal edildi",
"warnings_header": "Uyarı",
"program_terminated": "Kullanıcı tarafından feshedilen program",
"confirm": "Devam etmek istediğinden emin misin?",
"email_address": "E -posta adresi"
},
"account_info": {
"subscription": "Abonelik",
"failed_to_get_account_info": "Hesap bilgileri alamadı",
"subscription_type": "Abonelik türü",
"pro": "Profesyonel",
"failed_to_get_account": "Hesap bilgileri alamadı",
"config_not_found": "Yapılandırma bulunamadı.",
"premium_usage": "Premium kullanım",
"failed_to_get_subscription": "Abonelik bilgileri alamadı",
"basic_usage": "Temel Kullanım",
"premium": "Prim",
"free": "Özgür",
"email_not_found": "E -posta bulunamadı",
"title": "Hesap bilgileri",
"inactive": "Aktif olmayan",
"remaining_trial": "Kalan Yargılama",
"enterprise": "Girişim",
"failed_to_get_usage": "Kullanım bilgisi alamadı",
"lifetime_access_enabled": "Yaşam Boyu Erişim Etkin",
"usage_not_found": "Kullanım bulunamadı",
"days_remaining": "Kalan günler",
"failed_to_get_token": "Jeton alamadı",
"token": "Jeton",
"subscription_not_found": "Abonelik bilgileri bulunamadı",
"days": "günler",
"team": "Takım",
"token_not_found": "Jeton bulunamadı",
"active": "Aktif",
"email": "E -posta",
"pro_trial": "Profesyonel deneme",
"failed_to_get_email": "E -posta adresi alamadı",
"trial_remaining": "Kalan profesyonel deneme",
"usage": "Kullanım"
},
"config": {
"config_updated": "Yapılandırma Güncellendi",
"configuration": "Konfigürasyon",
"file_owner": "Dosya sahibi: {sahibi}",
"error_checking_linux_paths": "Linux yollarını kontrol etme hatası: {hata}",
"storage_file_is_empty": "Depolama dosyası boş: {storage_path}",
"config_directory": "Yapılandırma Dizini",
"documents_path_not_found": "Mevcut dizini kullanarak bulunmayan belgeler yolu",
"config_not_available": "Yapılandırma mevcut değil",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Lütfen imlecin kurulduğundan ve en az bir kez çalıştırıldığından emin olun",
"neither_cursor_nor_cursor_directory_found": "{Config_base}",
"config_created": "Config Oluşturuldu: {config_file}",
"using_temp_dir": "Hata nedeniyle geçici dizin kullanma: {yol} (hata: {error})",
"storage_file_not_found": "Depolama dosyası bulunamadı: {storage_path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "Dosya bozuk olabilir, lütfen imleci yeniden yükleyin",
"error_getting_file_stats": "Dosya İstatistikleri Alma Hatası: {hata}",
"enabled": "Etkinleştirilmiş",
"backup_created": "Yedekleme Oluşturuldu: {Path}",
"file_permissions": "Dosya İzinleri: {İzinler}",
"config_setup_error": "Hata Ayarlama Yapılandırma: {hata}",
"config_force_update_enabled": "Yapılandırma Dosya Korumu Güncellemesi Etkin, Zorla Güncellemeyi Gerçekleştirerek",
"config_removed": "Yapılandırma dosyası zorla güncelleme için kaldırıldı",
"file_size": "Dosya Boyutu: {boyut} bayt",
"error_reading_storage_file": "Hata Okurken Depolama Dosyası: {hata}",
"config_force_update_disabled": "Yapılandırma Dosya Kuvveti Güncellemesi Devre Dışı, Zorunlu Güncellemeyi Atlama",
"config_dir_created": "Config dizin oluşturuldu: {yol}",
"config_option_added": "Yapılandırma seçeneği eklendi: {option}",
"file_group": "Dosya Grubu: {Group}",
"and": "Ve",
"backup_failed": "Yapılandırılamadı Yapılandırma: {hata}",
"force_update_failed": "Koruma Güncelleme Yapılandırması Başarısız: {Hata}",
"storage_directory_not_found": "Depolama Dizini bulunamadı: {depolama_dir}",
"also_checked": "Ayrıca kontrol edildi {yol}",
"try_running": "Koşmayı deneyin: {command}",
"storage_file_found": "Depolama dosyası bulundu: {storage_path}",
"disabled": "Engelli",
"storage_file_is_valid_and_contains_data": "Depolama dosyası geçerlidir ve veri içerir",
"permission_denied": "İzin Reddedildi: {Storage_Path}"
},
"bypass": {
"found_product_json": "Bulunan ürün.json: {yol}",
"starting": "İmleç Sürümü Bypass'ı Başlat ...",
"version_updated": "{Eski} 'dan {new}' e güncellenen sürüm",
"menu_option": "Bypass imleç sürüm kontrolü",
"unsupported_os": "Desteklenmemiş işletim sistemi: {System}",
"backup_created": "Yedekleme Oluşturuldu: {Path}",
"current_version": "Geçerli sürüm: {sürüm}",
"no_write_permission": "Dosya için yazma izni yok: {yol}",
"localappdata_not_found": "LocalAppdata Çevre Değişkeni bulunamadı",
"write_failed": "Ürün yazılamadı.json: {hata}",
"description": "Bu araç, sürüm kısıtlamalarını atlamak için imlecin ürününü değiştirir.",
"bypass_failed": "Sürüm bypass başarısız oldu: {hata}",
"title": "İmleç Versiyonu Bypass Aracı",
"no_update_needed": "Güncellemeye gerek yok. Geçerli sürüm {sürüm} zaten> = 0.46.0",
"read_failed": "Ürün okuyamadı.json: {hata}",
"stack_trace": "Stack Trace",
"product_json_not_found": "ürün.json ortak linux yollarında bulunamadı",
"file_not_found": "Dosya bulunamadı: {yol}"
},
"bypass_token_limit": {
"description": "Bu araç, jeton sınırını atlamak için workbench.desktop.main.js dosyasını değiştirir",
"press_enter": "Devam etmek için Enter tuşuna basın ...",
"title": "Baypas Token Limit Aracı"
},
"tempmail": {
"general_error": "Bir hata oluştu: {hata}",
"no_email": "İmleç doğrulama e -postası bulunamadı",
"config_error": "Yapılandırma dosya hatası: {error}",
"extract_code_failed": ıkarma Doğrulama Kodu Başarısız: {Hata}",
"configured_email": "Yapılandırılmış e -posta: {e -posta}",
"checking_email": "İmleç doğrulama e -postasını kontrol etmek ...",
"check_email_failed": "E -postanın başarısız olduğunu kontrol edin: {hata}",
"no_code": "Doğrulama kodu alamadı",
"email_found": "İmleç doğrulama e -postası bulundu",
"verification_code": "Doğrulama kodu: {kod}"
}
}

879
locales/vi.json Normal file
View File

@ -0,0 +1,879 @@
{
"menu": {
"title": "Các Tùy Chọn",
"exit": "Thoát Chương Trình",
"reset": "Đặt Lại ID Máy",
"register": "Đăng Ký Tài Khoản Cursor Mới",
"register_google": "Đăng Ký Bằng Tài Khoản Google",
"register_github": "Đăng Ký Bằng Tài Khoản GitHub",
"register_manual": "Đăng Ký Cursor Với Email Tùy Chỉnh",
"quit": "Đóng Ứng Dụng Cursor",
"select_language": "Thay Đổi Ngôn Ngữ",
"select_chrome_profile": "Chọn Hồ Sơ Chrome",
"input_choice": "Vui lòng nhập lựa chọn của bạn ({choices})",
"invalid_choice": "Lựa chọn không hợp lệ. Vui lòng nhập một số từ {choices}",
"program_terminated": "Chương trình đã bị người dùng chấm dứt",
"error_occurred": "Đã xảy ra lỗi: {error}. Vui lòng thử lại",
"press_enter": "Nhấn Enter để Thoát",
"disable_auto_update": "Tắt tự động cập nhật Cursor",
"lifetime_access_enabled": "ĐÃ BẬT TRUY CẬP TRỌN ĐỜI",
"totally_reset": "Đặt lại hoàn toàn Cursor",
"outdate": "Quá cũ",
"temp_github_register": "Đăng ký GitHub tạm thời",
"admin_required": "Đang chạy dưới dạng tệp thực thi, yêu cầu quyền quản trị.",
"admin_required_continue": "Tiếp tục mà không có quyền quản trị.",
"coming_soon": "Sắp ra mắt",
"fixed_soon": "Sẽ Sớm Được Sửa",
"contribute": "Đóng Góp Cho Dự Án",
"config": "Hiển Thị Cấu Hình",
"delete_google_account": "Xóa Tài Khoản Google Cursor",
"continue_prompt": "Tiếp tục? (y/N): ",
"operation_cancelled_by_user": "Thao tác đã bị người dùng hủy",
"exiting": "Đang thoát ……",
"bypass_version_check": "Bỏ qua Kiểm tra Phiên bản Cursor",
"check_user_authorized": "Kiểm tra Quyền Người dùng",
"bypass_token_limit": "Bỏ qua giới hạn Token",
"language_config_saved": "Đổi ngôn ngữ thành công",
"lang_invalid_choice": "Lựa chọn không hợp lệ. Vui lòng nhập một số từ ({lang_choices})",
"restore_machine_id": "Khôi phục ID máy từ bản sao lưu",
"manual_custom_auth": "Thủ công tùy chỉnh auth"
},
"languages": {
"ar": "Tiếng Ả Rập",
"en": "Tiếng Anh",
"zh_cn": "Tiếng Trung Giản Thể",
"zh_tw": "Tiếng Trung Phồn Thể",
"vi": "Tiếng Việt",
"tr": "Tiếng Thổ Nhĩ Kỳ",
"bg": "Tiếng Bulgaria",
"nl": "Tiếng Hà Lan",
"de": "Tiếng Đức",
"fr": "Tiếng Pháp",
"pt": "Tiếng Bồ Đào Nha",
"ru": "Tiếng Nga",
"es": "Tiếng Tây Ban Nha",
"it": "Ý",
"ja": "Nhật Bản"
},
"quit_cursor": {
"start": "Bắt Đầu Thoát Cursor",
"no_process": "Không Có Tiến Trình Cursor Đang Chạy",
"terminating": "Đang Chấm Dứt Tiến Trình {pid}",
"waiting": "Đang Chờ Tiến Trình Thoát",
"success": "Tất Cả Tiến Trình Cursor Đã Đóng",
"timeout": "Tiến Trình Hết Thời Gian: {pids}",
"error": "Đã Xảy Ra Lỗi: {error}"
},
"reset": {
"title": "Công Cụ Đặt Lại ID Máy Cursor",
"checking": "Đang Kiểm Tra Tệp Cấu Hình",
"not_found": "Không Tìm Thấy Tệp Cấu Hình",
"no_permission": "Không Thể Đọc Hoặc Ghi Tệp Cấu Hình, Vui Lòng Kiểm Tra Quyền Tệp",
"reading": "Đang Đọc Cấu Hình Hiện Tại",
"creating_backup": "Đang Tạo Bản Sao Lưu Cấu Hình",
"backup_exists": "Tệp Sao Lưu Đã Tồn Tại, Bỏ Qua Bước Sao Lưu",
"generating": "Đang Tạo ID Máy Mới",
"saving_json": "Đang Lưu Cấu Hình Mới Vào JSON",
"success": "Đặt Lại ID Máy Thành Công",
"new_id": "ID Máy Mới",
"permission_error": "Lỗi Quyền: {error}",
"run_as_admin": "Vui Lòng Thử Chạy Chương Trình Này Với Quyền Quản Trị",
"process_error": "Lỗi Quá Trình Đặt Lại: {error}",
"updating_sqlite": "Đang Cập Nhật Cơ Sở Dữ Liệu SQLite",
"updating_pair": "Đang Cập Nhật Cặp Khóa-Giá Trị",
"sqlite_success": "Cập Nhật Cơ Sở Dữ Liệu SQLite Thành Công",
"sqlite_error": "Cập Nhật Cơ Sở Dữ Liệu SQLite Thất Bại: {error}",
"press_enter": "Nhấn Enter để Thoát",
"unsupported_os": "Hệ Điều Hành Không Được Hỗ Trợ: {os}",
"linux_path_not_found": "Không Tìm Thấy Đường Dẫn Linux",
"updating_system_ids": "Đang Cập Nhật ID Hệ Thống",
"system_ids_updated": "Cập Nhật ID Hệ Thống Thành Công",
"system_ids_update_failed": "Cập Nhật ID Hệ Thống Thất Bại: {error}",
"windows_guid_updated": "Cập Nhật GUID Windows Thành Công",
"windows_permission_denied": "Windows Từ Chối Quyền",
"windows_guid_update_failed": "Cập Nhật GUID Windows Thất Bại",
"macos_uuid_updated": "Cập Nhật UUID macOS Thành Công",
"plutil_command_failed": "Lệnh plutil Thất Bại",
"start_patching": "Bắt Đầu Vá getMachineId",
"macos_uuid_update_failed": "Cập Nhật UUID macOS Thất Bại",
"current_version": "Phiên Bản Cursor Hiện Tại: {version}",
"patch_completed": "Vá getMachineId Hoàn Tất",
"patch_failed": "Vá getMachineId Thất Bại: {error}",
"version_check_passed": "Kiểm Tra Phiên Bản Cursor Đã Qua",
"file_modified": "Tệp Đã Được Sửa Đổi",
"version_less_than_0_45": "Phiên Bản Cursor < 0.45.0, Bỏ Qua Vá getMachineId",
"detecting_version": "Đang Phát Hiện Phiên Bản Cursor",
"patching_getmachineid": "Đang Vá getMachineId",
"version_greater_than_0_45": "Phiên Bản Cursor >= 0.45.0, Đang Vá getMachineId",
"permission_denied": "Từ Chối Quyền: {error}",
"backup_created": "Đã Tạo Bản Sao Lưu",
"update_success": "Cập Nhật Thành Công",
"update_failed": "Cập Nhật Thất Bại: {error}",
"windows_machine_guid_updated": "Cập Nhật GUID Máy Windows Thành Công",
"reading_package_json": "Đang Đọc package.json {path}",
"invalid_json_object": "Đối Tượng JSON Không Hợp Lệ",
"no_version_field": "Không Tìm Thấy Trường Phiên Bản Trong package.json",
"version_field_empty": "Trường Phiên Bản Trống",
"invalid_version_format": "Định Dạng Phiên Bản Không Hợp Lệ: {version}",
"found_version": "Đã Tìm Thấy Phiên Bản: {version}",
"version_parse_error": "Lỗi Phân Tích Phiên Bản: {error}",
"package_not_found": "Không Tìm Thấy Package.json: {path}",
"check_version_failed": "Kiểm Tra Phiên Bản Thất Bại: {error}",
"stack_trace": "Dấu Vết Ngăn Xếp",
"version_too_low": "Phiên Bản Cursor Quá Thấp: {version} < 0.45.0",
"no_write_permission": "Không Có Quyền Ghi: {path}",
"path_not_found": "Không Tìm Thấy Đường Dẫn: {path}",
"modify_file_failed": "Sửa Đổi Tệp Thất Bại: {error}",
"windows_machine_id_updated": "Cập Nhật ID Máy Windows Thành Công",
"update_windows_machine_id_failed": "Cập Nhật ID Máy Windows Thất Bại: {error}",
"update_windows_machine_guid_failed": "Cập Nhật GUID Máy Windows Thất Bại: {error}",
"file_not_found": "Không Tìm Thấy Tệp: {path}"
},
"register": {
"title": "Công Cụ Đăng Ký Cursor",
"start": "Bắt đầu quá trình đăng ký...",
"handling_turnstile": "Đang xử lý xác minh bảo mật...",
"retry_verification": "Đang thử lại xác minh...",
"detect_turnstile": "Đang kiểm tra xác minh bảo mật...",
"verification_success": "Xác minh bảo mật thành công",
"starting_browser": "Đang mở trình duyệt...",
"form_success": "Biểu mẫu đã được gửi thành công",
"browser_started": "Trình duyệt đã được mở thành công",
"waiting_for_second_verification": "Đang chờ xác minh email...",
"waiting_for_verification_code": "Đang chờ mã xác minh...",
"password_success": "Đặt mật khẩu thành công",
"password_error": "Không thể đặt mật khẩu: {error}. Vui lòng thử lại",
"waiting_for_page_load": "Đang tải trang...",
"first_verification_passed": "Xác minh ban đầu thành công",
"mailbox": "Đã truy cập hộp thư đến thành công",
"register_start": "Bắt Đầu Đăng Ký",
"form_submitted": "Biểu Mẫu Đã Gửi, Bắt Đầu Xác Minh...",
"filling_form": "Điền Biểu Mẫu",
"visiting_url": "Đang Truy Cập URL",
"basic_info": "Thông Tin Cơ Bản Đã Gửi",
"handle_turnstile": "Xử Lý Turnstile",
"no_turnstile": "Không Phát Hiện Turnstile",
"turnstile_passed": "Đã Vượt Qua Turnstile",
"verification_start": "Bắt Đầu Lấy Mã Xác Minh",
"verification_timeout": "Lấy Mã Xác Minh Hết Thời Gian",
"verification_not_found": "Không Tìm Thấy Mã Xác Minh",
"try_get_code": "Thử | {attempt} Lấy Mã Xác Minh | Thời Gian Còn Lại: {time}s",
"get_account": "Đang Lấy Thông Tin Tài Khoản",
"get_token": "Lấy Token Phiên Cursor",
"token_success": "Lấy Token Thành Công",
"token_attempt": "Thử | {attempt} lần để lấy Token | Sẽ thử lại sau {time}s",
"token_max_attempts": "Đạt Số Lần Thử Tối Đa ({max}) | Không Thể Lấy Token",
"token_failed": "Lấy Token Thất Bại: {error}",
"account_error": "Lấy Thông Tin Tài Khoản Thất Bại: {error}",
"press_enter": "Nhấn Enter để Thoát",
"browser_start": "Đang Khởi Động Trình Duyệt",
"open_mailbox": "Đang Mở Trang Hộp Thư",
"email_error": "Không Thể Lấy Địa Chỉ Email",
"setup_error": "Lỗi Thiết Lập Email: {error}",
"start_getting_verification_code": "Bắt Đầu Lấy Mã Xác Minh, Sẽ Thử Trong 60s",
"get_verification_code_timeout": "Lấy Mã Xác Minh Hết Thời Gian",
"get_verification_code_success": "Lấy Mã Xác Minh Thành Công",
"try_get_verification_code": "Thử | {attempt} Lấy Mã Xác Minh | Thời Gian Còn Lại: {remaining_time}s",
"verification_code_filled": "Đã Điền Mã Xác Minh",
"login_success_and_jump_to_settings_page": "Đăng Nhập Thành Công và Chuyển Đến Trang Cài Đặt",
"detect_login_page": "Phát Hiện Trang Đăng Nhập, Bắt Đầu Đăng Nhập...",
"cursor_registration_completed": "Đăng Ký Cursor Hoàn Tất!",
"set_password": "Đặt Mật Khẩu",
"basic_info_submitted": "Thông Tin Cơ Bản Đã Gửi",
"cursor_auth_info_updated": "Thông Tin Xác Thực Cursor Đã Cập Nhật",
"cursor_auth_info_update_failed": "Cập Nhật Thông Tin Xác Thực Cursor Thất Bại",
"reset_machine_id": "Đặt Lại ID Máy",
"account_info_saved": "Thông Tin Tài Khoản Đã Lưu",
"save_account_info_failed": "Lưu Thông Tin Tài Khoản Thất Bại",
"get_email_address": "Lấy Địa Chỉ Email",
"update_cursor_auth_info": "Cập Nhật Thông Tin Xác Thực Cursor",
"register_process_error": "Lỗi Quá Trình Đăng Ký: {error}",
"setting_password": "Đang Đặt Mật Khẩu",
"manual_code_input": "Nhập Mã Thủ Công",
"manual_email_input": "Nhập Email Thủ Công",
"password": "Mật Khẩu",
"first_name": "Tên",
"last_name": "Họ",
"exit_signal": "Tín Hiệu Thoát",
"email_address": "Địa Chỉ Email",
"config_created": "Đã Tạo Cấu Hình",
"verification_failed": "Xác Minh Thất Bại",
"verification_error": "Lỗi Xác Minh: {error}",
"config_option_added": "Đã Thêm Tùy Chọn Cấu Hình: {option}",
"config_updated": "Đã Cập Nhật Cấu Hình",
"password_submitted": "Đã Gửi Mật Khẩu",
"total_usage": "Tổng Sử Dụng: {usage}",
"setting_on_password": "Đang Đặt Mật Khẩu",
"getting_code": "Đang Lấy Mã Xác Minh, Sẽ Thử Trong 60s",
"human_verify_error": "Không thể xác minh người dùng. Đang thử lại...",
"max_retries_reached": "Đã đạt số lần thử tối đa. Đăng ký thất bại.",
"using_tempmail_plus": "Sử dụng Tempmailplus để xác minh email",
"tempmail_plus_disabled": "Tempmailplus bị vô hiệu hóa",
"tempmail_plus_enabled": "Tempmailplus được bật",
"using_browser": "Sử dụng trình duyệt {Browser}: {path}",
"tempmail_plus_epin_missing": "Tempmailplus epin không được cấu hình",
"tempmail_plus_verification_failed": "TempMailplus Xác minh không thành công: {error}",
"tracking_processes": "Theo dõi {Count} {trình duyệt}",
"no_new_processes_detected": "Không có quy trình {trình duyệt} mới nào được phát hiện để theo dõi",
"browser_path_invalid": "{browser} đường dẫn không hợp lệ, sử dụng đường dẫn mặc định",
"using_browser_profile": "Sử dụng {Browser} cấu hình từ: {user_data_dir}",
"could_not_track_processes": "Không thể theo dõi {Browser} Quy trình: {error}",
"tempmail_plus_verification_completed": "Tempmailplus Xác minh đã hoàn thành thành công",
"tempmail_plus_email_missing": "Email Tempmailplus không được cấu hình",
"tempmail_plus_config_missing": "Cấu hình Tempmailplus bị thiếu",
"tempmail_plus_init_failed": "Không thể khởi tạo TempMailplus: {Error}",
"try_install_browser": "Thử cài đặt trình duyệt với trình quản lý gói của bạn",
"tempmail_plus_initialized": "Tempmailplus khởi tạo thành công",
"make_sure_browser_is_properly_installed": "Đảm bảo {trình duyệt} được cài đặt đúng cách",
"tempmail_plus_verification_started": "Bắt đầu quy trình xác minh Tempmailplus"
},
"auth": {
"title": "Quản Lý Xác Thực Cursor",
"checking_auth": "Đang Kiểm Tra Tệp Xác Thực",
"auth_not_found": "Không Tìm Thấy Tệp Xác Thực",
"auth_file_error": "Lỗi Tệp Xác Thực: {error}",
"reading_auth": "Đang Đọc Tệp Xác Thực",
"updating_auth": "Đang Cập Nhật Thông Tin Xác Thực",
"auth_updated": "Cập Nhật Thông Tin Xác Thực Thành Công",
"auth_update_failed": "Cập Nhật Thông Tin Xác Thực Thất Bại: {error}",
"auth_file_created": "Đã Tạo Tệp Xác Thực",
"auth_file_create_failed": "Tạo Tệp Xác Thực Thất Bại: {error}",
"press_enter": "Nhấn Enter để Thoát",
"reset_machine_id": "Đặt Lại ID Máy",
"database_connection_closed": "Đã Đóng Kết Nối Cơ Sở Dữ Liệu",
"database_updated_successfully": "Cập Nhật Cơ Sở Dữ Liệu Thành Công",
"connected_to_database": "Đã Kết Nối Đến Cơ Sở Dữ Liệu",
"updating_pair": "Đang Cập Nhật Cặp Khóa-Giá Trị",
"db_not_found": "Không tìm thấy tệp cơ sở dữ liệu tại: {path}",
"db_permission_error": "Không thể truy cập tệp cơ sở dữ liệu. Vui lòng kiểm tra quyền",
"db_connection_error": "Không thể kết nối đến cơ sở dữ liệu: {error}"
},
"control": {
"generate_email": "Đang Tạo Email Mới",
"blocked_domain": "Tên Miền Bị Chặn",
"select_domain": "Đang Chọn Tên Miền Ngẫu Nhiên",
"copy_email": "Đang Sao Chép Địa Chỉ Email",
"enter_mailbox": "Đang Vào Hộp Thư",
"refresh_mailbox": "Đang Làm Mới Hộp Thư",
"check_verification": "Đang Kiểm Tra Mã Xác Minh",
"verification_found": "Đã Tìm Thấy Mã Xác Minh",
"verification_not_found": "Không Tìm Thấy Mã Xác Minh",
"browser_error": "Lỗi Điều Khiển Trình Duyệt: {error}",
"navigation_error": "Lỗi Điều Hướng: {error}",
"email_copy_error": "Lỗi Sao Chép Email: {error}",
"mailbox_error": "Lỗi Hộp Thư: {error}",
"token_saved_to_file": "Token Đã Được Lưu Vào cursor_tokens.txt",
"navigate_to": "Đang Điều Hướng Đến {url}",
"generate_email_success": "Tạo Email Thành Công",
"select_email_domain": "Chọn Tên Miền Email",
"select_email_domain_success": "Chọn Tên Miền Email Thành Công",
"get_email_name": "Lấy Tên Email",
"get_email_name_success": "Lấy Tên Email Thành Công",
"get_email_address": "Lấy Địa Chỉ Email",
"get_email_address_success": "Lấy Địa Chỉ Email Thành Công",
"enter_mailbox_success": "Vào Hộp Thư Thành Công",
"found_verification_code": "Đã Tìm Thấy Mã Xác Minh",
"get_cursor_session_token": "Lấy Token Phiên Cursor",
"get_cursor_session_token_success": "Lấy Token Phiên Cursor Thành Công",
"get_cursor_session_token_failed": "Lấy Token Phiên Cursor Thất Bại",
"save_token_failed": "Lưu Token Thất Bại",
"database_updated_successfully": "Cập Nhật Cơ Sở Dữ Liệu Thành Công",
"database_connection_closed": "Đã Đóng Kết Nối Cơ Sở Dữ Liệu",
"no_valid_verification_code": "Không Có Mã Xác Minh Hợp Lệ"
},
"email": {
"starting_browser": "Đang Khởi Động Trình Duyệt",
"visiting_site": "Đang Truy Cập Tên Miền Mail",
"create_success": "Tạo Email Thành Công",
"create_failed": "Tạo Email Thất Bại",
"create_error": "Lỗi Tạo Email: {error}",
"refreshing": "Đang Làm Mới Email",
"refresh_success": "Làm Mới Email Thành Công",
"refresh_error": "Lỗi Làm Mới Email: {error}",
"refresh_button_not_found": "Không Tìm Thấy Nút Làm Mới",
"verification_found": "Đã Tìm Thấy Xác Minh",
"verification_not_found": "Không Tìm Thấy Xác Minh",
"verification_error": "Lỗi Xác Minh: {error}",
"verification_code_found": "Đã Tìm Thấy Mã Xác Minh",
"verification_code_not_found": "Không Tìm Thấy Mã Xác Minh",
"verification_code_error": "Lỗi Mã Xác Minh: {error}",
"address": "Địa Chỉ Email",
"all_domains_blocked": "Tất Cả Tên Miền Bị Chặn, Đang Chuyển Dịch Vụ",
"no_available_domains_after_filtering": "Không Có Tên Miền Khả Dụng Sau Khi Lọc",
"switching_service": "Đang Chuyển Sang Dịch Vụ {service}",
"domains_list_error": "Không Thể Lấy Danh Sách Tên Miền: {error}",
"failed_to_get_available_domains": "Không Thể Lấy Tên Miền Khả Dụng",
"domains_excluded": "Tên Miền Bị Loại Trừ: {domains}",
"failed_to_create_account": "Không Thể Tạo Tài Khoản",
"account_creation_error": "Lỗi Tạo Tài Khoản: {error}",
"blocked_domains": "Tên Miền Bị Chặn: {domains}",
"blocked_domains_loaded": "Đã Tải Tên Miền Bị Chặn: {count}",
"blocked_domains_loaded_error": "Lỗi Tải Tên Miền Bị Chặn: {error}",
"blocked_domains_loaded_success": "Tải Tên Miền Bị Chặn Thành Công",
"blocked_domains_loaded_timeout": "Hết Thời Gian Tải Tên Miền Bị Chặn: {timeout}s",
"blocked_domains_loaded_timeout_error": "Lỗi Hết Thời Gian Tải Tên Miền Bị Chặn: {error}",
"available_domains_loaded": "Đã Tải Tên Miền Khả Dụng: {count}",
"domains_filtered": "Đã Lọc Tên Miền: {count}",
"trying_to_create_email": "Đang Thử Tạo Email: {email}",
"domain_blocked": "Tên Miền Bị Chặn: {domain}",
"using_chrome_profile": "Đang Sử Dụng Hồ Sơ Chrome từ: {user_data_dir}",
"no_display_found": "Không Tìm Thấy Màn Hình. Đảm Bảo X Server Đang Chạy.",
"try_export_display": "Thử: export DISPLAY=:0",
"extension_load_error": "Lỗi Tải Tiện Ích Mở Rộng: {error}",
"make_sure_chrome_chromium_is_properly_installed": "Đảm Bảo Chrome/Chromium Được Cài Đặt Đúng Cách",
"try_install_chromium": "Thử: sudo apt install chromium-browser"
},
"update": {
"title": "Tắt Tự Động Cập Nhật Cursor",
"disable_success": "Đã Tắt Tự Động Cập Nhật Thành Công",
"disable_failed": "Tắt Tự Động Cập Nhật Thất Bại: {error}",
"press_enter": "Nhấn Enter để Thoát",
"start_disable": "Bắt Đầu Tắt Tự Động Cập Nhật",
"killing_processes": "Đang Kết Thúc Các Tiến Trình",
"processes_killed": "Đã Kết Thúc Các Tiến Trình",
"removing_directory": "Đang Xóa Thư Mục",
"directory_removed": "Đã Xóa Thư Mục",
"creating_block_file": "Đang Tạo Tệp Chặn",
"block_file_created": "Đã Tạo Tệp Chặn",
"clearing_update_yml": "Đang Xóa Tệp update.yml",
"update_yml_cleared": "Đã Xóa Tệp update.yml",
"update_yml_not_found": "Không Tìm Thấy Tệp update.yml",
"clear_update_yml_failed": "Xóa Tệp update.yml Thất Bại: {error}",
"unsupported_os": "Hệ Điều Hành Không Được Hỗ Trợ: {system}",
"remove_directory_failed": "Xóa Thư Mục Thất Bại: {error}",
"create_block_file_failed": "Tạo Tệp Chặn Thất Bại: {error}",
"directory_locked": "Thư Mục Bị Khóa: {path}",
"yml_locked": "Tệp update.yml Bị Khóa",
"block_file_locked": "Tệp Chặn Bị Khóa",
"yml_already_locked": "Tệp update.yml Đã Bị Khóa",
"block_file_already_locked": "Tệp Chặn Đã Bị Khóa",
"block_file_locked_error": "Lỗi Khóa Tệp Chặn: {error}",
"yml_locked_error": "Lỗi Khóa Tệp update.yml: {error}",
"block_file_already_locked_error": "Lỗi Tệp Chặn Đã Bị Khóa: {error}",
"yml_already_locked_error": "Lỗi Tệp update.yml Đã Bị Khóa: {error}"
},
"updater": {
"checking": "Đang Kiểm Tra Cập Nhật...",
"new_version_available": "Có phiên bản mới! (Hiện tại: {current}, Mới nhất: {latest})",
"updating": "Đang cập nhật lên phiên bản mới nhất. Chương trình sẽ tự động khởi động lại.",
"up_to_date": "Bạn đang sử dụng phiên bản mới nhất.",
"check_failed": "Kiểm tra cập nhật thất bại: {error}",
"continue_anyway": "Tiếp tục với phiên bản hiện tại...",
"update_confirm": "Bạn có muốn cập nhật lên phiên bản mới nhất không? (Y/n)",
"update_skipped": "Bỏ qua cập nhật.",
"invalid_choice": "Lựa chọn không hợp lệ. Vui lòng nhập 'Y' hoặc 'n'.",
"development_version": "Phiên Bản Phát Triển {current} > {latest}",
"changelog_title": "Nhật Ký Thay Đổi",
"rate_limit_exceeded": "Đã vượt quá giới hạn API GitHub. Bỏ qua kiểm tra cập nhật."
},
"totally_reset": {
"title": "Đặt Lại Hoàn Toàn Cursor",
"checking_config": "Đang Kiểm Tra Tệp Cấu Hình",
"config_not_found": "Không Tìm Thấy Tệp Cấu Hình",
"no_permission": "Không Thể Đọc Hoặc Ghi Tệp Cấu Hình, Vui Lòng Kiểm Tra Quyền Tệp",
"reading_config": "Đang Đọc Cấu Hình Hiện Tại",
"creating_backup": "Đang Tạo Bản Sao Lưu Cấu Hình",
"backup_exists": "Tệp Sao Lưu Đã Tồn Tại, Bỏ Qua Bước Sao Lưu",
"generating_new_machine_id": "Đang Tạo ID Máy Mới",
"saving_new_config": "Đang Lưu Cấu Hình Mới Vào JSON",
"success": "Đặt Lại Cursor Thành Công",
"error": "Đặt Lại Cursor Thất Bại: {error}",
"press_enter": "Nhấn Enter để Thoát",
"reset_machine_id": "Đặt Lại ID Máy",
"database_connection_closed": "Đã Đóng Kết Nối Cơ Sở Dữ Liệu",
"database_updated_successfully": "Cập Nhật Cơ Sở Dữ Liệu Thành Công",
"connected_to_database": "Đã Kết Nối Đến Cơ Sở Dữ Liệu",
"updating_pair": "Đang Cập Nhật Cặp Khóa-Giá Trị",
"db_not_found": "Không tìm thấy tệp cơ sở dữ liệu tại: {path}",
"db_permission_error": "Không thể truy cập tệp cơ sở dữ liệu. Vui lòng kiểm tra quyền",
"db_connection_error": "Không thể kết nối đến cơ sở dữ liệu: {error}",
"feature_title": "TÍNH NĂNG",
"feature_1": "Xóa hoàn toàn cài đặt và cấu hình của Cursor AI",
"feature_2": "Xóa tất cả dữ liệu đã lưu trong bộ nhớ cache bao gồm lịch sử AI và lời nhắc",
"feature_3": "Đặt lại ID máy để bỏ qua phát hiện dùng thử",
"feature_4": "Tạo định danh máy mới ngẫu nhiên",
"feature_5": "Xóa tiện ích mở rộng và tùy chọn tùy chỉnh",
"feature_6": "Đặt lại thông tin dùng thử và dữ liệu kích hoạt",
"feature_7": "Quét sâu các tệp giấy phép và dùng thử ẩn",
"feature_8": "Bảo toàn an toàn các tệp và ứng dụng không phải của Cursor",
"feature_9": "Tương thích với Windows, macOS và Linux",
"disclaimer_title": "TUYÊN BỐ MIỄN TRỪ",
"disclaimer_1": "Công cụ này sẽ xóa vĩnh viễn tất cả cài đặt Cursor AI,",
"disclaimer_2": "cấu hình và dữ liệu đã lưu trong bộ nhớ cache. Hành động này không thể hoàn tác.",
"disclaimer_3": "Các tệp mã của bạn sẽ KHÔNG bị ảnh hưởng, và công cụ được thiết kế",
"disclaimer_4": "chỉ nhắm vào các tệp trình soạn thảo Cursor AI và cơ chế phát hiện dùng thử.",
"disclaimer_5": "Các ứng dụng khác trên hệ thống của bạn sẽ không bị ảnh hưởng.",
"disclaimer_6": "Bạn sẽ cần thiết lập lại Cursor AI sau khi chạy công cụ này.",
"disclaimer_7": "Sử dụng với rủi ro của riêng bạn",
"confirm_title": "Bạn có chắc chắn muốn tiếp tục không?",
"confirm_1": "Hành động này sẽ xóa tất cả cài đặt Cursor AI,",
"confirm_2": "cấu hình và dữ liệu đã lưu trong bộ nhớ cache. Hành động này không thể hoàn tác.",
"confirm_3": "Các tệp mã của bạn sẽ KHÔNG bị ảnh hưởng, và công cụ được thiết kế",
"confirm_4": "chỉ nhắm vào các tệp trình soạn thảo Cursor AI và cơ chế phát hiện dùng thử.",
"confirm_5": "Các ứng dụng khác trên hệ thống của bạn sẽ không bị ảnh hưởng.",
"confirm_6": "Bạn sẽ cần thiết lập lại Cursor AI sau khi chạy công cụ này.",
"confirm_7": "Sử dụng với rủi ro của riêng bạn",
"invalid_choice": "Vui lòng nhập 'Y' hoặc 'n'",
"skipped_for_safety": "Đã bỏ qua vì an toàn (không liên quan đến Cursor): {path}",
"deleted": "Đã Xóa: {path}",
"error_deleting": "Lỗi xóa {path}: {error}",
"not_found": "Không tìm thấy tệp: {path}",
"resetting_machine_id": "Đang đặt lại định danh máy để bỏ qua phát hiện dùng thử...",
"created_machine_id": "Đã tạo ID máy mới: {path}",
"error_creating_machine_id": "Lỗi tạo tệp ID máy {path}: {error}",
"error_searching": "Lỗi tìm kiếm tệp trong {path}: {error}",
"created_extended_trial_info": "Đã tạo thông tin dùng thử mở rộng mới: {path}",
"error_creating_trial_info": "Lỗi tạo tệp thông tin dùng thử {path}: {error}",
"resetting_cursor_ai_editor": "Đang đặt lại Trình soạn thảo Cursor AI... Vui lòng đợi.",
"reset_cancelled": "Đã hủy đặt lại. Thoát mà không thay đổi gì.",
"windows_machine_id_modification_skipped": "Đã bỏ qua sửa đổi ID máy Windows: {error}",
"linux_machine_id_modification_skipped": "Đã bỏ qua sửa đổi machine-id Linux: {error}",
"note_complete_machine_id_reset_may_require_running_as_administrator": "Lưu ý: Đặt lại ID máy hoàn toàn có thể yêu cầu chạy với quyền quản trị",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "Lưu ý: Đặt lại machine-id hệ thống hoàn toàn có thể yêu cầu quyền sudo",
"windows_registry_instructions": "📝 LƯU Ý: Để đặt lại hoàn toàn trên Windows, bạn có thể cần xóa các mục đăng ký.",
"windows_registry_instructions_2": " Chạy 'regedit' và tìm kiếm các khóa chứa 'Cursor' hoặc 'CursorAI' trong HKEY_CURRENT_USER\\Software\\ và xóa chúng.",
"reset_log_1": "Cursor AI đã được đặt lại hoàn toàn và bỏ qua phát hiện dùng thử!",
"reset_log_2": "Vui lòng khởi động lại hệ thống để các thay đổi có hiệu lực.",
"reset_log_3": "Bạn sẽ cần cài đặt lại Cursor AI và bây giờ sẽ có một giai đoạn dùng thử mới.",
"reset_log_4": "Để có kết quả tốt nhất, hãy xem xét:",
"reset_log_5": "Sử dụng một địa chỉ email khác khi đăng ký dùng thử mới",
"reset_log_6": "Nếu có thể, sử dụng VPN để thay đổi địa chỉ IP của bạn",
"reset_log_7": "Xóa cookie và bộ nhớ cache trình duyệt trước khi truy cập trang web Cursor AI",
"reset_log_8": "Nếu vấn đề vẫn còn, hãy thử cài đặt Cursor AI ở một vị trí khác",
"reset_log_9": "Nếu bạn gặp bất kỳ vấn đề nào, hãy truy cập Github Issue Tracker và tạo một vấn đề tại https://github.com/yeongpin/cursor-free-vip/issues",
"unexpected_error": "Đã xảy ra lỗi không mong đợi: {error}",
"report_issue": "Vui lòng báo cáo vấn đề này tới Github Issue Tracker tại https://github.com/yeongpin/cursor-free-vip/issues",
"keyboard_interrupt": "Quá trình bị người dùng ngắt. Đang thoát...",
"return_to_main_menu": "Đang trở về menu chính...",
"process_interrupted": "Quá trình bị ngắt. Đang thoát...",
"press_enter_to_return_to_main_menu": "Nhấn Enter để trở về menu chính...",
"removing_known": "Đang xóa các tệp dùng thử/giấy phép đã biết",
"performing_deep_scan": "Đang thực hiện quét sâu để tìm thêm tệp dùng thử/giấy phép",
"found_additional_potential_license_trial_files": "Đã tìm thấy {count} tệp giấy phép/dùng thử tiềm năng bổ sung",
"checking_for_electron_localstorage_files": "Đang kiểm tra các tệp localStorage của Electron",
"no_additional_license_trial_files_found_in_deep_scan": "Không tìm thấy tệp giấy phép/dùng thử bổ sung trong quét sâu",
"removing_electron_localstorage_files": "Đang xóa các tệp localStorage của Electron",
"electron_localstorage_files_removed": "Đã xóa các tệp localStorage của Electron",
"electron_localstorage_files_removal_error": "Lỗi xóa các tệp localStorage của Electron: {error}",
"electron_localstorage_files_removal_completed": "Hoàn tất xóa các tệp localStorage của Electron",
"warning_title": "CẢNH BÁO",
"warning_1": "Hành động này sẽ xóa tất cả cài đặt Cursor AI,",
"warning_2": "cấu hình và dữ liệu đã lưu trong bộ nhớ cache. Hành động này không thể hoàn tác.",
"warning_3": "Các tệp mã của bạn sẽ KHÔNG bị ảnh hưởng, và công cụ được thiết kế",
"warning_4": "chỉ nhắm vào các tệp trình soạn thảo Cursor AI và cơ chế phát hiện dùng thử.",
"warning_5": "Các ứng dụng khác trên hệ thống của bạn sẽ không bị ảnh hưởng.",
"warning_6": "Bạn sẽ cần thiết lập lại Cursor AI sau khi chạy công cụ này.",
"warning_7": "Sử dụng với rủi ro của riêng bạn",
"removed": "Đã Xóa: {path}",
"failed_to_reset_machine_guid": "Không thể đặt lại GUID máy",
"failed_to_remove": "Không thể xóa: {path}",
"failed_to_delete_file": "Không thể xóa tệp: {path}",
"failed_to_delete_directory": "Không thể xóa thư mục: {path}",
"failed_to_delete_file_or_directory": "Không thể xóa tệp hoặc thư mục: {path}",
"deep_scanning": "Đang thực hiện quét sâu để tìm thêm tệp dùng thử/giấy phép",
"resetting_cursor": "Đang đặt lại Trình soạn thảo Cursor AI... Vui lòng đợi.",
"completed_in": "Hoàn thành trong {time} giây",
"cursor_reset_completed": "Trình soạn thảo Cursor AI đã được đặt lại hoàn toàn và bỏ qua phát hiện dùng thử!",
"cursor_reset_failed": "Đặt lại Trình soạn thảo Cursor AI thất bại: {error}",
"cursor_reset_cancelled": "Đã hủy đặt lại Trình soạn thảo Cursor AI. Thoát mà không thay đổi gì.",
"operation_cancelled": "Đã hủy thao tác. Thoát mà không thay đổi gì.",
"navigating_to_settings": "Đang điều hướng đến trang cài đặt...",
"already_on_settings": "Đã ở trang cài đặt",
"login_redirect_failed": "Chuyển hướng đăng nhập thất bại, đang thử điều hướng trực tiếp...",
"advanced_tab_not_found": "Không tìm thấy tab Nâng cao sau nhiều lần thử",
"advanced_tab_retry": "Không tìm thấy tab Nâng cao, lần thử {attempt}/{max_attempts}",
"advanced_tab_error": "Lỗi tìm tab Nâng cao: {error}",
"advanced_tab_clicked": "Đã nhấp vào tab Nâng cao",
"direct_advanced_navigation": "Đang thử điều hướng trực tiếp đến tab nâng cao",
"delete_button_not_found": "Không tìm thấy nút Xóa Tài khoản sau nhiều lần thử",
"delete_button_retry": "Không tìm thấy nút Xóa, lần thử {attempt}/{max_attempts}",
"delete_button_error": "Lỗi tìm nút Xóa: {error}",
"delete_button_clicked": "Đã nhấp vào nút Xóa Tài khoản",
"found_danger_zone": "Đã tìm thấy phần Vùng Nguy hiểm",
"delete_input_not_found": "Không tìm thấy ô nhập xác nhận xóa sau nhiều lần thử",
"delete_input_retry": "Không tìm thấy ô nhập xóa, lần thử {attempt}/{max_attempts}",
"delete_input_error": "Lỗi tìm ô nhập Xóa: {error}",
"delete_input_not_found_continuing": "Không tìm thấy ô nhập xác nhận xóa, đang thử tiếp tục",
"removing_electron_localstorage_files_completed": "Đã hoàn thành việc loại bỏ các tệp địa phương của Electron"
},
"github_register": {
"title": "Tự Động Hóa Đăng Ký GitHub + Cursor AI",
"features_header": "Tính Năng",
"feature1": "Tạo email tạm thời sử dụng 1secmail.",
"feature2": "Đăng ký tài khoản GitHub mới với thông tin ngẫu nhiên.",
"feature3": "Tự động xác minh email GitHub.",
"feature4": "Đăng nhập vào Cursor AI sử dụng xác thực GitHub.",
"feature5": "Đặt lại ID máy để bỏ qua phát hiện dùng thử.",
"feature6": "Lưu tất cả thông tin đăng nhập vào tệp.",
"warnings_header": "Cảnh Báo",
"warning1": "Script này tự động hóa việc tạo tài khoản, có thể vi phạm điều khoản dịch vụ của GitHub/Cursor.",
"warning2": "Yêu cầu truy cập internet và quyền quản trị.",
"warning3": "CAPTCHA hoặc xác minh bổ sung có thể làm gián đoạn tự động hóa.",
"warning4": "Sử dụng có trách nhiệm và tự chịu rủi ro.",
"confirm": "Bạn có chắc chắn muốn tiếp tục không?",
"invalid_choice": "Lựa chọn không hợp lệ. Vui lòng nhập 'yes' hoặc 'no'",
"cancelled": "Đã hủy thao tác",
"program_terminated": "Chương trình bị người dùng chấm dứt",
"starting_automation": "Bắt đầu tự động hóa...",
"github_username": "Tên Người Dùng GitHub",
"github_password": "Mật Khẩu GitHub",
"email_address": "Địa Chỉ Email",
"credentials_saved": "Các thông tin đăng nhập này đã được lưu vào github_cursor_accounts.txt",
"completed_successfully": "Đăng ký GitHub + Cursor hoàn tất thành công!",
"registration_encountered_issues": "Đăng ký GitHub + Cursor gặp vấn đề.",
"check_browser_windows_for_manual_intervention_or_try_again_later": "Kiểm tra cửa sổ trình duyệt để can thiệp thủ công hoặc thử lại sau."
},
"account_info": {
"subscription": "Gói Đăng Ký",
"trial_remaining": "Thời Gian Dùng Thử Pro Còn Lại",
"days": "ngày",
"subscription_not_found": "Không tìm thấy thông tin đăng ký",
"email_not_found": "Không tìm thấy email",
"failed_to_get_account": "Không thể lấy thông tin tài khoản",
"config_not_found": "Không tìm thấy cấu hình.",
"failed_to_get_usage": "Không thể lấy thông tin sử dụng",
"failed_to_get_subscription": "Không thể lấy thông tin đăng ký",
"failed_to_get_email": "Không thể lấy địa chỉ email",
"failed_to_get_token": "Không thể lấy token",
"failed_to_get_account_info": "Không thể lấy thông tin tài khoản",
"title": "Thông Tin Tài Khoản",
"email": "Email",
"token": "Token",
"usage": "Sử Dụng",
"subscription_type": "Loại Đăng Ký",
"remaining_trial": "Thời Gian Dùng Thử Còn Lại",
"days_remaining": "Số Ngày Còn Lại",
"premium": "Premium",
"pro": "Pro",
"pro_trial": "Dùng Thử Pro",
"team": "Team",
"enterprise": "Enterprise",
"free": "Miễn Phí",
"active": "Đang Hoạt Động",
"inactive": "Không Hoạt Động",
"premium_usage": "Sử Dụng Premium",
"basic_usage": "Sử Dụng Cơ Bản",
"usage_not_found": "Không tìm thấy thông tin sử dụng",
"lifetime_access_enabled": "Đã Bật Truy Cập Trọn Đời",
"token_not_found": "Không tìm thấy token"
},
"config": {
"config_not_available": "Không có sẵn cấu hình",
"configuration": "Cấu Hình",
"enabled": "Đã Bật",
"disabled": "Đã Tắt",
"config_directory": "Thư Mục Cấu Hình",
"neither_cursor_nor_cursor_directory_found": "Không tìm thấy Cursor hoặc thư mục Cursor trong {config_base}",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "Vui lòng đảm bảo Cursor đã được cài đặt và đã chạy ít nhất một lần",
"storage_directory_not_found": "Không tìm thấy thư mục lưu trữ: {storage_dir}",
"storage_file_found": "Đã tìm thấy tệp lưu trữ: {storage_path}",
"file_size": "Kích thước tệp: {size} bytes",
"file_permissions": "Quyền tệp: {permissions}",
"file_owner": "Chủ sở hữu tệp: {owner}",
"file_group": "Nhóm tệp: {group}",
"error_getting_file_stats": "Lỗi lấy thông tin tệp: {error}",
"permission_denied": "Từ chối quyền: {storage_path}",
"try_running": "Thử chạy: {command}",
"and": "Và",
"storage_file_is_empty": "Tệp lưu trữ trống: {storage_path}",
"the_file_might_be_corrupted_please_reinstall_cursor": "Tệp có thể bị hỏng, vui lòng cài đặt lại Cursor",
"storage_file_not_found": "Không tìm thấy tệp lưu trữ: {storage_path}",
"error_checking_linux_paths": "Lỗi kiểm tra đường dẫn Linux: {error}",
"config_option_added": "Đã thêm tùy chọn cấu hình: {option}",
"config_updated": "Đã cập nhật cấu hình",
"config_created": "Đã tạo cấu hình: {config_file}",
"config_setup_error": "Lỗi thiết lập cấu hình: {error}",
"storage_file_is_valid_and_contains_data": "Tệp lưu trữ hợp lệ và chứa dữ liệu",
"error_reading_storage_file": "Lỗi đọc tệp lưu trữ: {error}",
"also_checked": "Cũng đã kiểm tra {path}",
"backup_created": "Đã tạo bản sao lưu: {path}",
"config_removed": "Đã xóa tệp cấu hình để cập nhật bắt buộc",
"backup_failed": "Sao lưu cấu hình thất bại: {error}",
"force_update_failed": "Cập nhật bắt buộc cấu hình thất bại: {error}",
"config_force_update_disabled": "Đã tắt cập nhật bắt buộc tệp cấu hình, bỏ qua cập nhật bắt buộc",
"config_force_update_enabled": "Đã bật cập nhật bắt buộc tệp cấu hình, thực hiện cập nhật bắt buộc",
"documents_path_not_found": "Đường dẫn tài liệu không được tìm thấy, sử dụng thư mục hiện tại",
"using_temp_dir": "Sử dụng thư mục tạm thời do lỗi: {path} (lỗi: {error})",
"config_dir_created": "Thư mục cấu hình đã tạo: {path}"
},
"oauth": {
"authentication_button_not_found": "Không tìm thấy nút xác thực",
"authentication_failed": "Xác thực thất bại: {error}",
"found_cookies": "Đã tìm thấy {count} cookie",
"token_extraction_error": "Lỗi trích xuất token: {error}",
"authentication_successful": "Xác thực thành công - Email: {email}",
"missing_authentication_data": "Thiếu dữ liệu xác thực: {data}",
"failed_to_delete_account": "Không thể xóa tài khoản: {error}",
"invalid_authentication_type": "Loại xác thực không hợp lệ",
"auth_update_success": "Cập nhật xác thực thành công",
"browser_closed": "Đã đóng trình duyệt",
"auth_update_failed": "Cập nhật xác thực thất bại",
"google_start": "Bắt đầu Google",
"github_start": "Bắt đầu Github",
"usage_count": "Số lần sử dụng: {usage}",
"account_has_reached_maximum_usage": "Tài khoản đã đạt số lần sử dụng tối đa, {deleting}",
"starting_new_authentication_process": "Bắt đầu quá trình xác thực mới...",
"failed_to_delete_expired_account": "Không thể xóa tài khoản hết hạn",
"could_not_check_usage_count": "Không thể kiểm tra số lần sử dụng: {error}",
"found_email": "Đã tìm thấy email: {email}",
"could_not_find_email": "Không thể tìm thấy email: {error}",
"could_not_find_usage_count": "Không thể tìm thấy số lần sử dụng: {error}",
"already_on_settings_page": "Đã ở trang cài đặt!",
"failed_to_extract_auth_info": "Không thể trích xuất thông tin xác thực: {error}",
"no_chrome_profiles_found": "Không tìm thấy hồ sơ Chrome, sử dụng Mặc định",
"found_default_chrome_profile": "Đã tìm thấy hồ sơ Chrome Mặc định",
"using_first_available_chrome_profile": "Sử dụng hồ sơ Chrome khả dụng đầu tiên: {profile}",
"error_finding_chrome_profile": "Lỗi tìm hồ sơ Chrome, sử dụng Mặc định: {error}",
"initializing_browser_setup": "Đang khởi tạo thiết lập trình duyệt...",
"detected_platform": "Đã phát hiện nền tảng: {platform}",
"running_as_root_warning": "Chạy với quyền root không được khuyến nghị cho tự động hóa trình duyệt",
"consider_running_without_sudo": "Hãy xem xét chạy script mà không cần sudo",
"no_compatible_browser_found": "Không tìm thấy trình duyệt tương thích. Vui lòng cài đặt Google Chrome hoặc Chromium.",
"supported_browsers": "Trình duyệt được hỗ trợ cho {platform}",
"using_browser_profile": "Đang sử dụng hồ sơ trình duyệt: {profile}",
"starting_browser": "Đang khởi động trình duyệt tại: {path}",
"browser_setup_completed": "Thiết lập trình duyệt hoàn tất thành công",
"browser_setup_failed": "Thiết lập trình duyệt thất bại: {error}",
"try_running_without_sudo_admin": "Thử chạy mà không cần quyền sudo/quản trị",
"redirecting_to_authenticator_cursor_sh": "Đang chuyển hướng đến authenticator.cursor.sh...",
"starting_google_authentication": "Bắt đầu xác thực Google...",
"starting_github_authentication": "Bắt đầu xác thực GitHub...",
"waiting_for_authentication": "Đang chờ xác thực...",
"page_changed_checking_auth": "Trang đã thay đổi, đang kiểm tra xác thực...",
"status_check_error": "Lỗi kiểm tra trạng thái: {error}",
"authentication_timeout": "Hết thời gian xác thực",
"account_is_still_valid": "Tài khoản vẫn còn hợp lệ (Sử dụng: {usage})",
"starting_re_authentication_process": "Bắt đầu quá trình xác thực lại...",
"starting_new_google_authentication": "Bắt đầu xác thực Google mới...",
"failed_to_delete_account_or_re_authenticate": "Không thể xóa tài khoản hoặc xác thực lại: {error}",
"navigating_to_authentication_page": "Đang điều hướng đến trang xác thực...",
"please_select_your_google_account_to_continue": "Vui lòng chọn tài khoản Google của bạn để tiếp tục...",
"found_browser_data_directory": "Đã tìm thấy thư mục dữ liệu trình duyệt: {path}",
"authentication_successful_getting_account_info": "Xác thực thành công, đang lấy thông tin tài khoản...",
"warning_could_not_kill_existing_browser_processes": "Cảnh báo: Không thể kết thúc các tiến trình trình duyệt hiện có: {error}",
"browser_failed_to_start": "Trình duyệt không thể khởi động: {error}",
"browser_failed": "Trình duyệt không thể khởi động: {error}",
"browser_failed_to_start_fallback": "Trình duyệt không thể khởi động: {error}",
"warning_browser_close": "CẢNH BÁO: Điều này sẽ đóng tất cả các quy trình đang chạy {trình duyệt}",
"profile_selection_error": "Lỗi trong quá trình lựa chọn hồ sơ: {error}",
"using_configured_browser_path": "Sử dụng cấu hình {Browser} đường dẫn: {path}",
"found_chrome_at": "Tìm thấy Chrome tại: {path}",
"killing_browser_processes": "Giết {trình duyệt} quy trình ...",
"browser_not_found_trying_chrome": "Không thể tìm thấy {trình duyệt}, thay vào đó thử Chrome",
"error_getting_user_data_directory": "Lỗi nhận được thư mục dữ liệu người dùng: {error}",
"found_browser_user_data_dir": "Tìm thấy {Browser} Thư mục dữ liệu người dùng: {Path}",
"user_data_dir_not_found": "{Browser} thư mục dữ liệu người dùng không tìm thấy tại {path}, thay vào đó sẽ thử Chrome"
},
"chrome_profile": {
"title": "Chọn Hồ Sơ Chrome",
"select_profile": "Chọn một hồ sơ Chrome để sử dụng:",
"profile_list": "Hồ sơ khả dụng:",
"default_profile": "Hồ Sơ Mặc Định",
"profile": "Hồ Sơ {number}",
"no_profiles": "Không tìm thấy hồ sơ Chrome",
"error_loading": "Lỗi tải hồ sơ Chrome: {error}",
"profile_selected": "Đã chọn hồ sơ: {profile}",
"invalid_selection": "Lựa chọn không hợp lệ. Vui lòng thử lại",
"warning_chrome_close": "Cảnh báo: Điều này sẽ đóng tất cả các tiến trình Chrome đang chạy"
},
"account_delete": {
"title": "Công Cụ Xóa Tài Khoản Google Cursor",
"warning": "CẢNH BÁO: Điều này sẽ xóa vĩnh viễn tài khoản Cursor của bạn. Hành động này không thể hoàn tác.",
"cancelled": "Đã hủy xóa tài khoản.",
"starting_process": "Bắt đầu quá trình xóa tài khoản...",
"google_button_not_found": "Không tìm thấy nút đăng nhập Google",
"logging_in": "Đang đăng nhập bằng Google...",
"waiting_for_auth": "Đang chờ xác thực Google...",
"login_successful": "Đăng nhập thành công",
"unexpected_page": "Trang không mong đợi sau khi đăng nhập: {url}",
"trying_settings": "Đang thử điều hướng đến trang cài đặt...",
"select_google_account": "Vui lòng chọn tài khoản Google của bạn...",
"auth_timeout": "Hết thời gian xác thực, vẫn tiếp tục...",
"navigating_to_settings": "Đang điều hướng đến trang cài đặt...",
"already_on_settings": "Đã ở trang cài đặt",
"login_redirect_failed": "Chuyển hướng đăng nhập thất bại, đang thử điều hướng trực tiếp...",
"advanced_tab_not_found": "Không tìm thấy tab Nâng cao sau nhiều lần thử",
"advanced_tab_retry": "Không tìm thấy tab Nâng cao, lần thử {attempt}/{max_attempts}",
"advanced_tab_error": "Lỗi tìm tab Nâng cao: {error}",
"advanced_tab_clicked": "Đã nhấp vào tab Nâng cao",
"direct_advanced_navigation": "Đang thử điều hướng trực tiếp đến tab nâng cao",
"delete_button_not_found": "Không tìm thấy nút Xóa Tài khoản sau nhiều lần thử",
"delete_button_retry": "Không tìm thấy nút Xóa, lần thử {attempt}/{max_attempts}",
"delete_button_error": "Lỗi tìm nút Xóa: {error}",
"delete_button_clicked": "Đã nhấp vào nút Xóa Tài khoản",
"found_danger_zone": "Đã tìm thấy phần Vùng Nguy hiểm",
"delete_input_not_found": "Không tìm thấy ô nhập xác nhận xóa sau nhiều lần thử",
"delete_input_retry": "Không tìm thấy ô nhập xóa, lần thử {attempt}/{max_attempts}",
"delete_input_error": "Lỗi tìm ô nhập Xóa: {error}",
"delete_input_not_found_continuing": "Không tìm thấy ô nhập xác nhận xóa, đang thử tiếp tục",
"typed_delete": "Đã nhập \"Delete\" vào ô xác nhận",
"confirm_button_not_found": "Không tìm thấy nút Xác nhận sau nhiều lần thử",
"confirm_button_retry": "Không tìm thấy nút Xác nhận, lần thử {attempt}/{max_attempts}",
"confirm_button_error": "Lỗi tìm nút Xác nhận: {error}",
"account_deleted": "Đã xóa tài khoản thành công!",
"error": "Lỗi trong quá trình xóa tài khoản: {error}",
"success": "Tài khoản Cursor của bạn đã được xóa thành công!",
"failed": "Quá trình xóa tài khoản thất bại hoặc đã bị hủy.",
"interrupted": "Quá trình xóa tài khoản bị người dùng ngắt.",
"unexpected_error": "Lỗi không mong đợi: {error}",
"found_email": "Đã tìm thấy email: {email}",
"email_not_found": "Không tìm thấy email: {error}",
"confirm_prompt": "Bạn có chắc chắn muốn tiếp tục không? (y/N): "
},
"bypass": {
"starting": "Bắt đầu bỏ qua phiên bản Cursor...",
"found_product_json": "Đã tìm thấy product.json: {path}",
"no_write_permission": "Không có quyền ghi cho tệp: {path}",
"read_failed": "Không thể đọc product.json: {error}",
"current_version": "Phiên bản hiện tại: {version}",
"backup_created": "Đã tạo bản sao lưu: {path}",
"version_updated": "Đã cập nhật phiên bản từ {old} lên {new}",
"write_failed": "Không thể ghi product.json: {error}",
"no_update_needed": "Không cần cập nhật. Phiên bản hiện tại {version} đã >= 0.46.0",
"bypass_failed": "Bỏ qua phiên bản thất bại: {error}",
"stack_trace": "Dấu vết ngăn xếp",
"localappdata_not_found": "Không tìm thấy biến môi trường LOCALAPPDATA",
"product_json_not_found": "Không tìm thấy product.json trong các đường dẫn Linux thông thường",
"unsupported_os": "Hệ điều hành không được hỗ trợ: {system}",
"file_not_found": "Không tìm thấy tệp: {path}",
"title": "Công Cụ Bỏ Qua Phiên Bản Cursor",
"description": "Công cụ này sửa đổi product.json của Cursor để bỏ qua hạn chế phiên bản",
"menu_option": "Bỏ Qua Kiểm Tra Phiên Bản Cursor"
},
"auth_check": {
"checking_authorization": "Đang kiểm tra quyền...",
"token_source": "Lấy token từ cơ sở dữ liệu hay nhập thủ công? (d/m, mặc định: d)",
"getting_token_from_db": "Đang lấy token từ cơ sở dữ liệu...",
"token_found_in_db": "Đã tìm thấy token trong cơ sở dữ liệu",
"token_not_found_in_db": "Không tìm thấy token trong cơ sở dữ liệu",
"cursor_acc_info_not_found": "Không tìm thấy cursor_acc_info.py",
"error_getting_token_from_db": "Lỗi lấy token từ cơ sở dữ liệu: {error}",
"enter_token": "Nhập token Cursor của bạn: ",
"token_length": "Độ dài token: {length} ký tự",
"usage_response_status": "Trạng thái phản hồi sử dụng: {response}",
"unexpected_status_code": "Mã trạng thái không mong đợi: {code}",
"jwt_token_warning": "Token có vẻ ở định dạng JWT, nhưng kiểm tra API trả về mã trạng thái không mong đợi. Token có thể hợp lệ nhưng truy cập API bị hạn chế.",
"invalid_token": "Token không hợp lệ",
"user_authorized": "Người dùng được ủy quyền",
"user_unauthorized": "Người dùng không được ủy quyền",
"request_timeout": "Yêu cầu hết thời gian",
"connection_error": "Lỗi kết nối",
"check_error": "Lỗi kiểm tra quyền: {error}",
"authorization_successful": "Ủy quyền thành công!",
"authorization_failed": "Ủy quyền thất bại!",
"operation_cancelled": "Thao tác bị người dùng hủy",
"unexpected_error": "Lỗi không mong đợi: {error}",
"error_generating_checksum": "Lỗi tạo checksum: {error}",
"checking_usage_information": "Đang kiểm tra thông tin sử dụng...",
"check_usage_response": "Phản hồi kiểm tra sử dụng: {response}",
"usage_response": "Phản hồi sử dụng: {response}"
},
"restore": {
"title": "Khôi phục ID máy từ bản sao lưu",
"starting": "Bắt đầu quá trình khôi phục ID máy",
"no_backups_found": "Không tìm thấy bản sao lưu nào",
"available_backups": "Các bản sao lưu có sẵn",
"select_backup": "Chọn bản sao lưu để khôi phục",
"to_cancel": "để hủy",
"operation_cancelled": "Đã hủy thao tác",
"invalid_selection": "Lựa chọn không hợp lệ",
"please_enter_number": "Vui lòng nhập một số hợp lệ",
"missing_id": "Thiếu ID: {id}",
"read_backup_failed": "Không thể đọc tệp sao lưu: {error}",
"current_file_not_found": "Không tìm thấy tệp lưu trữ hiện tại",
"current_backup_created": "Đã tạo bản sao lưu của tệp lưu trữ hiện tại",
"storage_updated": "Tệp lưu trữ đã được cập nhật thành công",
"update_failed": "Không thể cập nhật tệp lưu trữ: {error}",
"sqlite_not_found": "Không tìm thấy cơ sở dữ liệu SQLite",
"updating_sqlite": "Đang cập nhật cơ sở dữ liệu SQLite",
"updating_pair": "Đang cập nhật cặp khóa-giá trị",
"sqlite_updated": "Cơ sở dữ liệu SQLite đã được cập nhật thành công",
"sqlite_update_failed": "Không thể cập nhật cơ sở dữ liệu SQLite: {error}",
"machine_id_backup_created": "Đã tạo bản sao lưu của tệp machineId",
"backup_creation_failed": "Không thể tạo bản sao lưu: {error}",
"machine_id_updated": "Tệp machineId đã được cập nhật thành công",
"machine_id_update_failed": "Không thể cập nhật tệp machineId: {error}",
"updating_system_ids": "Đang cập nhật ID hệ thống",
"system_ids_update_failed": "Không thể cập nhật ID hệ thống: {error}",
"permission_denied": "Quyền truy cập bị từ chối. Vui lòng thử chạy với quyền quản trị",
"windows_machine_guid_updated": "GUID máy Windows đã được cập nhật thành công",
"update_windows_machine_guid_failed": "Không thể cập nhật GUID máy Windows: {error}",
"windows_machine_id_updated": "ID máy Windows đã được cập nhật thành công",
"update_windows_machine_id_failed": "Không thể cập nhật ID máy Windows: {error}",
"sqm_client_key_not_found": "Không tìm thấy khóa đăng ký SQMClient",
"update_windows_system_ids_failed": "Không thể cập nhật ID hệ thống Windows: {error}",
"macos_platform_uuid_updated": "UUID nền tảng macOS đã được cập nhật thành công",
"failed_to_execute_plutil_command": "Không thể thực thi lệnh plutil",
"update_macos_system_ids_failed": "Không thể cập nhật ID hệ thống macOS: {error}",
"ids_to_restore": "ID máy cần khôi phục",
"confirm": "Bạn có chắc chắn muốn khôi phục những ID này không?",
"success": "ID máy đã được khôi phục thành công",
"process_error": "Lỗi quá trình khôi phục: {error}",
"press_enter": "Nhấn Enter để tiếp tục"
},
"manual_auth": {
"auth_type_selected": "Loại xác thực đã chọn: {type}",
"verifying_token": "Xác minh tính hợp lệ của mã thông báo ...",
"token_prompt": "Nhập mã thông báo con trỏ của bạn (access_token/refresh_token):",
"title": "Xác thực con trỏ thủ công",
"proceed_prompt": "Tiếp tục? (y/n):",
"auth_updated_successfully": "Thông tin xác thực được cập nhật thành công!",
"continue_anyway": "Tiếp tục dù sao? (y/n):",
"token_verified": "Mã thông báo đã xác minh thành công!",
"email_prompt": "Nhập email (để trống cho email ngẫu nhiên):",
"token_verification_skipped": "Xác minh mã thông báo đã bỏ qua (Check_user_authorized.py không tìm thấy)",
"auth_type_github": "GitHub",
"random_email_generated": "Email ngẫu nhiên được tạo: {email}",
"error": "Lỗi: {lỗi}",
"confirm_prompt": "Vui lòng xác nhận thông tin sau:",
"invalid_token": "Mã thông báo không hợp lệ. Xác thực bị hủy bỏ.",
"auth_update_failed": "Không cập nhật thông tin xác thực",
"token_required": "Mã thông báo là bắt buộc",
"auth_type_google": "Google",
"auth_type_prompt": "Chọn Loại xác thực:",
"operation_cancelled": "Hoạt động bị hủy bỏ",
"auth_type_auth0": "Auth_0 (mặc định)",
"token_verification_error": "Lỗi xác minh mã thông báo: {error}",
"updating_database": "Cập nhật cơ sở dữ liệu xác thực con trỏ ..."
},
"token": {
"refreshing": "Làm mới mã thông báo ...",
"extraction_error": "Trích xuất lỗi mã thông báo: {error}",
"request_timeout": "Yêu cầu làm mới máy chủ đã hết thời gian",
"connection_error": "Lỗi kết nối để làm mới máy chủ",
"unexpected_error": "Lỗi không mong muốn trong quá trình làm mới mã thông báo: {error}",
"server_error": "Làm mới lỗi máy chủ: http {status}",
"invalid_response": "Phản hồi JSON không hợp lệ từ máy chủ làm mới",
"no_access_token": "Không có mã thông báo truy cập để đáp ứng",
"refresh_failed": "Làm mới mã thông báo không thành công: {error}",
"refresh_success": "Mã thông báo làm mới thành công! Hợp lệ cho {ngày} ngày (hết hạn: {hết hạn})"
},
"bypass_token_limit": {
"press_enter": "Nhấn Enter để tiếp tục ...",
"title": "Bỏ qua công cụ giới hạn mã thông báo",
"description": "Công cụ này sửa đổi tệp workbench.desktop.main.js để bỏ qua giới hạn mã thông báo"
},
"browser_profile": {
"profile_selected": "Hồ sơ đã chọn: {hồ sơ}",
"default_profile": "Hồ sơ mặc định",
"no_profiles": "Không tìm thấy {trình duyệt}",
"select_profile": "Chọn {Browser} Hồ sơ để sử dụng:",
"error_loading": "Tải lỗi {Browser} Cấu hình: {error}",
"title": "Lựa chọn hồ sơ trình duyệt",
"profile": "Hồ sơ {Number}",
"profile_list": "Có sẵn {trình duyệt} Hồ sơ:",
"invalid_selection": "Lựa chọn không hợp lệ. Hãy thử lại."
},
"tempmail": {
"config_error": "Lỗi tệp cấu hình: {error}",
"general_error": "Đã xảy ra lỗi: {lỗi}",
"no_email": "Không tìm thấy email xác minh con trỏ",
"checking_email": "Kiểm tra email xác minh con trỏ ...",
"configured_email": "Email được định cấu hình: {email}",
"extract_code_failed": "Trích xuất mã xác minh không thành công: {error}",
"no_code": "Không thể nhận mã xác minh",
"check_email_failed": "Kiểm tra email không thành công: {lỗi}",
"email_found": "Tìm thấy email xác minh con trỏ",
"verification_code": "Mã xác minh: {code}"
}
}

View File

@ -2,20 +2,58 @@
"menu": {
"title": "可用选项",
"exit": "退出程序",
"reset": "重置机器标识",
"register": "注册 Cursor",
"quit": "退出 Cursor",
"select_language": "选择语言",
"input_choice": "输入选择 ({choices})",
"invalid_choice": "无效选择,请重试",
"program_terminated": "程序被用户终止",
"error_occurred": "发生错误: {error}",
"press_enter": "按回车键退出"
"reset": "重置机器ID",
"register": "注册新的Cursor账户",
"register_google": "使用自己的Google账户注册",
"register_github": "使用自己的GitHub账户注册",
"register_manual": "使用自定义邮箱注册Cursor",
"quit": "关闭Cursor应用",
"select_language": "更改语言",
"select_chrome_profile": "选择Chrome配置文件",
"input_choice": "请输入您的选择 ({choices})",
"invalid_choice": "选择无效,请输入 {choices} 范围内的数字",
"program_terminated": "程序已被用户终止",
"error_occurred": "发生错误:{error},请重试",
"press_enter": "按回车键退出",
"disable_auto_update": "禁用 Cursor 自动更新",
"lifetime_access_enabled": "永久订阅",
"totally_reset": "完全重置 Cursor",
"outdate": "过时",
"temp_github_register": "临时GitHub注册",
"admin_required": "运行可执行文件,需要管理员权限",
"admin_required_continue": "继续使用当前版本...",
"coming_soon": "即将推出",
"fixed_soon": "即将修复",
"contribute": "贡献项目",
"config": "显示配置",
"delete_google_account": "删除 Cursor Google 账号",
"continue_prompt": "继续?(y/N): ",
"operation_cancelled_by_user": "操作被用户取消",
"exiting": "退出中 ……",
"bypass_version_check": "绕过 Cursor 版本检查",
"check_user_authorized": "检查用户授权",
"bypass_token_limit": "绕过 Token 限制",
"language_config_saved": "语言配置保存成功",
"lang_invalid_choice": "选择无效。请输入以下选项之一:({lang_choices})",
"restore_machine_id": "从备份恢复机器ID",
"manual_custom_auth": "手动自定义验证"
},
"languages": {
"en": "English",
"ar": "阿拉伯语",
"en": "英语",
"zh_cn": "简体中文",
"zh_tw": "繁體中文"
"zh_tw": "繁体中文",
"vi": "越南语",
"nl": "荷兰语",
"de": "德语",
"fr": "法语",
"pt": "葡萄牙语",
"ru": "俄语",
"tr": "土耳其语",
"bg": "保加利亚语",
"es": "西班牙语",
"it": "意大利语",
"ja": "日语"
},
"quit_cursor": {
"start": "开始退出 Cursor",
@ -62,29 +100,56 @@
"patch_completed": "getMachineId修补完成",
"patch_failed": "getMachineId修补失败: {error}",
"version_check_passed": "Cursor版本检查通过",
"file_modified": "文件已修改"
"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机器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",
"no_write_permission": "没有写入权限: {path}",
"path_not_found": "路径未找到: {path}",
"modify_file_failed": "修改文件失败: {error}",
"windows_machine_id_updated": "Windows机器ID更新成功",
"update_windows_machine_id_failed": "更新Windows机器ID失败: {error}",
"update_windows_machine_guid_failed": "更新Windows机器GUID失败: {error}",
"file_not_found": "文件未找到: {path}"
},
"register": {
"title": "Cursor 注册工具",
"start": "开始注册流程",
"browser_started": "浏览器已启动",
"password_success": "密码设置完成",
"password_error": "密码设置失败: {error}",
"waiting_for_page_load": "等待页面加载",
"mailbox": "成功进入邮箱",
"waiting_for_second_verification": "等待第二阶段验证",
"waiting_for_verification_code": "等待验证码",
"first_verification_passed": "第一阶段验证通过",
"start": "正在启动注册流程...",
"browser_started": "浏览器已成功打开",
"password_success": "密码设置",
"password_error": "无法设置密码:{error},请重试",
"waiting_for_page_load": "页面加载中...",
"mailbox": "已成功访问邮箱",
"waiting_for_second_verification": "等待邮箱验证...",
"waiting_for_verification_code": "等待验证码...",
"first_verification_passed": "初始验证通过",
"register_start": "开始注册流程",
"form_submitted": "表单已提交,开始验证...",
"filling_form": "填写注册信息",
"visiting_url": "访问URL",
"basic_info": "基本信息提交完成",
"handling_turnstile": "处理 Turnstile 验证",
"retry_verification": "重试验证",
"detect_turnstile": "检测 Turnstile 验证",
"verification_success": "验证成功",
"starting_browser": "启动浏览器",
"handling_turnstile": "正在处理安全验证...",
"retry_verification": "正在重试验证...",
"detect_turnstile": "正在检查安全验证...",
"verification_success": "安全验证通过",
"starting_browser": "正在打开浏览器...",
"form_success": "表单提交成功",
"handle_turnstile": "处理 Turnstile 验证",
"no_turnstile": "未检测到 Turnstile 验证",
@ -123,7 +188,46 @@
"get_email_address": "获取邮箱地址",
"register_process_error": "注册流程错误: {error}",
"update_cursor_auth_info": "更新Cursor认证信息",
"setting_password": "设置密码"
"setting_password": "设置密码",
"manual_code_input": "手动输入验证码",
"manual_email_input": "手动输入邮箱",
"suggest_email": "推荐邮箱地址: {suggested_email}",
"use_suggested_email_or_enter": "输入\"yes\"使用此邮箱或直接输入您想使用的邮箱地址:",
"password": "密码",
"first_name": "名字",
"last_name": "姓氏",
"exit_signal": "退出信号",
"email_address": "邮箱地址",
"config_created": "配置已创建",
"verification_failed": "验证失败",
"verification_error": "验证错误: {error}",
"config_option_added": "配置项已添加: {option}",
"config_updated": "配置已更新",
"password_submitted": "密码已提交",
"total_usage": "总使用量: {usage}",
"setting_on_password": "设置密码",
"getting_code": "获取验证码将在60秒内尝试...",
"browser_path_invalid": "{browser} 路径无效,使用默认路径",
"using_browser": "正在使用 {browser} 浏览器: {path}",
"using_browser_profile": "使用 {browser} 配置文件: {user_data_dir}",
"make_sure_browser_is_properly_installed": "确保 {browser} 已正确安装",
"try_install_browser": "尝试使用包管理器安装浏览器",
"tracking_processes": "正在跟踪 {count} 个 {browser} 进程",
"no_new_processes_detected": "未检测到新的 {browser} 进程",
"could_not_track_processes": "无法跟踪 {browser} 进程: {error}",
"human_verify_error": "无法验证用户是人类,正在重试...",
"max_retries_reached": "已达到最大重试次数,注册失败。",
"using_tempmail_plus": "使用TempMailPlus进行邮箱验证",
"tempmail_plus_enabled": "TempMailPlus已启用",
"tempmail_plus_disabled": "TempMailPlus已禁用",
"tempmail_plus_config_missing": "TempMailPlus配置缺失",
"tempmail_plus_email_missing": "未配置TempMailPlus邮箱",
"tempmail_plus_epin_missing": "未配置TempMailPlus epin",
"tempmail_plus_initialized": "TempMailPlus初始化成功",
"tempmail_plus_init_failed": "TempMailPlus初始化失败{error}",
"tempmail_plus_verification_started": "开始TempMailPlus验证流程",
"tempmail_plus_verification_completed": "TempMailPlus验证成功完成",
"tempmail_plus_verification_failed": "TempMailPlus验证失败{error}"
},
"auth": {
"title": "Cursor 认证管理器",
@ -140,7 +244,11 @@
"connected_to_database": "已连接到数据库",
"database_updated_successfully": "数据库更新成功",
"database_connection_closed": "数据库连接已关闭",
"updating_pair": "更新键值对"
"updating_pair": "更新键值对",
"db_not_found": "未找到数据库文件:{path}",
"db_permission_error": "无法访问数据库文件,请检查权限",
"db_connection_error": "连接数据库失败:{error}",
"reset_machine_id": "重置机ID"
},
"control": {
"generate_email": "生成新邮箱",
@ -171,11 +279,13 @@
"get_cursor_session_token_success": "获取Cursor Session Token成功",
"get_cursor_session_token_failed": "获取Cursor Session Token失败",
"save_token_failed": "保存Token失败",
"no_valid_verification_code": "没有有效的验证码"
"no_valid_verification_code": "没有有效的验证码",
"database_updated_successfully": "数据库成功更新",
"database_connection_closed": "数据库连接关闭"
},
"email": {
"starting_browser": "启动浏览器",
"visiting_site": "访问 smailpro.com",
"visiting_site": "访问 邮箱服务网站",
"create_success": "邮箱创建成功",
"create_failed": "邮箱创建失败",
"create_error": "邮箱创建错误: {error}",
@ -189,6 +299,574 @@
"verification_code_found": "找到验证码",
"verification_code_not_found": "未找到验证码",
"verification_code_error": "验证码错误: {error}",
"address": "邮箱地址"
"address": "邮箱地址",
"all_domains_blocked": "所有域名都被屏蔽了,切换服务",
"no_available_domains_after_filtering": "过滤后没有可用域名",
"switching_service": "切换到 {service} 服务",
"domains_list_error": "获取域名列表失败: {error}",
"failed_to_get_available_domains": "获取可用域名失败",
"blocked_domains_loaded": "加载了 {count} 个被屏蔽的域名",
"domains_excluded": "排除了 {domains} 个被屏蔽的域名",
"failed_to_create_account": "创建账户失败",
"account_creation_error": "账户创建错误: {error}",
"blocked_domains": "被屏蔽的域名: {domains}",
"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}",
"domain_blocked": "域名被屏蔽: {domain}",
"using_chrome_profile": "使用 Chrome 配置文件: {user_data_dir}",
"no_display_found": "未找到显示器。确保 X 服务器正在运行。",
"try_export_display": "尝试: export DISPLAY=:0",
"extension_load_error": "加载插件失败: {error}",
"make_sure_chrome_chromium_is_properly_installed": "确保 Chrome/Chromium 已正确安装",
"try_install_chromium": "尝试: sudo apt install chromium-browser"
},
"update": {
"title": "禁用 Cursor 自动更新",
"disable_success": "自动更新禁用成功",
"disable_failed": "禁用自动更新失败: {error}",
"press_enter": "按回车键退出",
"start_disable": "开始禁用自动更新",
"killing_processes": "杀死进程",
"processes_killed": "进程已杀死",
"removing_directory": "删除目录",
"directory_removed": "目录已删除",
"creating_block_file": "创建阻止文件",
"block_file_created": "阻止文件已创建",
"clearing_update_yml": "清空 update.yml 文件",
"update_yml_cleared": "update.yml 文件已清空",
"update_yml_not_found": "update.yml 文件未找到",
"clear_update_yml_failed": "清空 update.yml 文件失败: {error}",
"unsupported_os": "不支持的操作系统: {system}",
"remove_directory_failed": "删除目录失败: {error}",
"create_block_file_failed": "创建阻止文件失败: {error}",
"directory_locked": "目录被锁定: {path}",
"yml_locked": "update.yml 文件被锁定",
"block_file_locked": "阻止文件被锁定",
"yml_already_locked": "update.yml 文件已锁定",
"block_file_already_locked": "阻止文件已锁定",
"block_file_locked_error": "阻止文件锁定错误: {error}",
"yml_locked_error": "update.yml 文件锁定错误: {error}",
"block_file_already_locked_error": "阻止文件已锁定错误: {error}",
"yml_already_locked_error": "update.yml 文件已锁定错误: {error}"
},
"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": "更新日志",
"rate_limit_exceeded": "GitHub API 速率限制超过。跳过更新检查。"
},
"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": "按回车键退出",
"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": "正在重置机器 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": "跳过 Windows 机器 ID 修改:{error}",
"linux_machine_id_modification_skipped": "跳过 Linux machine-id 修改:{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' 并搜索 HKEY_CURRENT_USER\\Software\\ 下包含 'Cursor' 或 'CursorAI' 的键并删除它们。\n",
"reset_log_1": "Cursor AI 已完全重置并绕过试用检测!",
"reset_log_2": "请重启系统以使更改生效。",
"reset_log_3": "您需要重新安装 Cursor AI现在应该有一个新的试用期。",
"reset_log_4": "为了获得最佳效果,建议还可以:",
"reset_log_5": "注册新试用时使用不同的邮箱地址",
"reset_log_6": "如果可能,使用 VPN 更改 IP 地址",
"reset_log_7": "访问 Cursor AI 网站前清除浏览器的 Cookie 和缓存",
"reset_log_8": "如果仍有问题,尝试将 Cursor AI 安装到不同位置",
"reset_log_9": "如遇到任何问题,请到 Github Issue Tracker 提交问题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": "按回车键返回主菜单...",
"removing_known": "正在移除已知的试用/授权文件",
"performing_deep_scan": "正在进行深度扫描以查找其他试用/授权文件",
"found_additional_potential_license_trial_files": "发现 {count} 个其他潜在的试用/授权文件",
"checking_for_electron_localstorage_files": "正在检查 Electron localStorage 文件",
"no_additional_license_trial_files_found_in_deep_scan": "深度扫描中未发现其他试用/授权文件",
"removing_electron_localstorage_files": "正在移除 Electron localStorage 文件",
"electron_localstorage_files_removed": "Electron localStorage 文件已移除",
"electron_localstorage_files_removal_error": "移除 Electron localStorage 文件时出错:{error}",
"removing_electron_localstorage_files_completed": "Electron localStorage 文件移除完成",
"warning_title": "警告",
"warning_1": "此操作将删除所有 Cursor AI 设置、",
"warning_2": "配置和缓存数据。此操作无法撤销。",
"warning_3": "您的代码文件 **不会** 受到影响,工具设计为",
"warning_4": "仅针对 Cursor AI 编辑器文件和试用检测机制。",
"warning_5": "系统中的其他应用程序不会受到影响。",
"warning_6": "运行此工具后,您需要重新设置 Cursor AI。",
"warning_7": "请自行承担风险",
"removed": "已删除:{path}",
"failed_to_reset_machine_guid": "无法重置机器 GUID",
"failed_to_remove": "无法删除:{path}",
"failed_to_delete_file": "无法删除文件:{path}",
"failed_to_delete_directory": "无法删除目录:{path}",
"failed_to_delete_file_or_directory": "无法删除文件或目录:{path}",
"deep_scanning": "正在进行深度扫描以查找其他试用/授权文件",
"resetting_cursor": "正在重置 Cursor AI 编辑器... 请稍候。",
"completed_in": "完成时间:{time} 秒",
"cursor_reset_completed": "Cursor AI 编辑器已完全重置且绕过试用检测!",
"cursor_reset_failed": "Cursor AI 编辑器重置失败:{error}",
"cursor_reset_cancelled": "Cursor AI 编辑器重置已取消,未进行任何更改。",
"operation_cancelled": "操作已取消,未进行任何更改。",
"advanced_tab_error": "错误查找高级选项卡:{错误}",
"already_on_settings": "已经在设置页面上",
"advanced_tab_retry": "找不到高级选项卡,尝试{尝试}/{max_attempts}",
"navigating_to_settings": "导航到设置页面...",
"advanced_tab_not_found": "多次尝试后找不到高级标签",
"login_redirect_failed": "登录重定向失败,尝试直接导航...",
"delete_input_error": "错误查找删除输入:{error}",
"delete_button_clicked": "单击删除帐户按钮",
"direct_advanced_navigation": "尝试直接导航到高级选项卡",
"delete_input_retry": "删除未找到输入,尝试{尝试}/{max_attempts}",
"delete_input_not_found_continuing": "找不到删除确认输入,试图继续继续",
"delete_button_retry": "找不到删除按钮,尝试{尝试}/{max_attempts}",
"advanced_tab_clicked": "单击高级选项卡",
"found_danger_zone": "发现的危险区域部分",
"delete_input_not_found": "多次尝试后找不到删除确认输入",
"delete_button_not_found": "多次尝试后找不到帐户按钮",
"delete_button_error": "错误查找删除按钮:{错误}"
},
"github_register": {
"title": "GitHub + Cursor AI 注册自动化",
"features_header": "功能",
"feature1": "使用 1secmail 生成临时邮箱",
"feature2": "使用随机凭证注册新的 GitHub 账户",
"feature3": "自动验证 GitHub 邮箱",
"feature4": "使用 GitHub 认证登录 Cursor AI",
"feature5": "重置机器 ID 以绕过试用检测",
"feature6": "保存所有凭证到文件",
"warnings_header": "警告",
"warning1": "此脚本自动化账户创建,可能违反 GitHub/Cursor 服务条款",
"warning2": "需要互联网访问和管理员权限",
"warning3": "CAPTCHA 或额外验证可能会中断自动化",
"warning4": "请负责任地使用,风险自负",
"confirm": "您确定要继续吗?",
"invalid_choice": "无效选择。请输入 'yes' 或 'no'",
"cancelled": "操作已取消",
"program_terminated": "程序已由用户终止",
"starting_automation": "开始自动化...",
"github_username": "GitHub 用户名",
"github_password": "GitHub 密码",
"email_address": "邮箱地址",
"credentials_saved": "这些凭证已保存到 github_cursor_accounts.txt",
"completed_successfully": "GitHub + Cursor 注册成功",
"registration_encountered_issues": "GitHub + Cursor 注册遇到问题",
"check_browser_windows_for_manual_intervention_or_try_again_later": "检查浏览器窗口进行手动干预或稍后再试"
},
"account_info": {
"subscription": "订阅",
"trial_remaining": "剩余试用",
"days": "天",
"subscription_not_found": "订阅信息未找到",
"email_not_found": "邮箱未找到",
"failed_to_get_account": "获取账户信息失败",
"config_not_found": "配置未找到。",
"failed_to_get_usage": "获取使用信息失败",
"failed_to_get_subscription": "获取订阅信息失败",
"failed_to_get_email": "获取邮箱地址失败",
"failed_to_get_token": "获取 token 失败",
"failed_to_get_account_info": "获取账户信息失败",
"title": "账户信息",
"email": "邮箱",
"token": "Token",
"usage": "使用量",
"subscription_type": "订阅类型",
"remaining_trial": "剩余试用",
"days_remaining": "剩余天数",
"premium": "高级",
"pro": "专业",
"pro_trial": "专业试用",
"team": "团队",
"enterprise": "企业",
"free": "免费",
"active": "活跃",
"inactive": "非活跃",
"premium_usage": "高级使用量",
"basic_usage": "基础使用量",
"usage_not_found": "使用量未找到",
"lifetime_access_enabled": "永久访问已启用",
"token_not_found": "Token 未找到"
},
"config": {
"config_not_available": "配置未找到。",
"configuration": "配置",
"enabled": "已启用",
"disabled": "已禁用",
"config_directory": "配置目录",
"neither_cursor_nor_cursor_directory_found": "未找到 Cursor 或 Cursor 目录",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "请确保 Cursor 已安装并至少运行一次",
"storage_directory_not_found": "未找到存储目录",
"storage_file_found": "找到存储文件",
"file_size": "文件大小",
"file_permissions": "文件权限",
"file_owner": "文件所有者",
"file_group": "文件组",
"error_getting_file_stats": "获取文件统计信息时出错",
"permission_denied": "权限拒绝",
"try_running": "尝试运行: {command}",
"and": "和",
"storage_file_is_empty": "存储文件为空",
"the_file_might_be_corrupted_please_reinstall_cursor": "文件可能已损坏,请重新安装 Cursor",
"storage_file_not_found": "未找到存储文件",
"error_checking_linux_paths": "检查 Linux 路径时出错",
"config_option_added": "添加配置选项",
"config_updated": "配置更新",
"config_created": "配置已创建",
"config_setup_error": "配置设置错误",
"storage_file_is_valid_and_contains_data": "存储文件有效且包含数据",
"error_reading_storage_file": "读取存储文件时出错",
"also_checked": "也检查了 {path}",
"backup_created": "备份创建: {path}",
"config_removed": "配置文件已删除用于强制更新",
"backup_failed": "备份失败: {error}",
"force_update_failed": "强制更新配置失败: {error}",
"config_force_update_disabled": "配置文件强制更新已禁用,跳过强制更新",
"config_force_update_enabled": "配置文件强制更新已启用,正在执行强制更新",
"documents_path_not_found": "找不到文档路径,使用当前目录",
"config_dir_created": "已创建配置目录: {path}",
"using_temp_dir": "由于错误使用临时目录: {path} (错误: {error})"
},
"oauth": {
"authentication_button_not_found": "未找到认证按钮",
"authentication_failed": "认证失败: {error}",
"found_cookies": "找到 {count} 个 Cookie",
"token_extraction_error": "Token 提取错误: {error}",
"authentication_successful": "认证成功 - 邮箱: {email}",
"missing_authentication_data": "缺少认证数据: {data}",
"failed_to_delete_account": "删除账户失败: {error}",
"invalid_authentication_type": "无效的认证类型",
"auth_update_success": "认证更新成功",
"browser_closed": "浏览器已关闭",
"auth_update_failed": "认证更新失败",
"google_start": "Google 开始",
"github_start": "Github 开始",
"usage_count": "使用次数: {usage}",
"account_has_reached_maximum_usage": "账户已达到最大使用量, {deleting}",
"starting_new_authentication_process": "开始新的认证过程...",
"failed_to_delete_expired_account": "删除过期账户失败",
"could_not_check_usage_count": "无法检查使用次数: {error}",
"found_email": "找到邮箱: {email}",
"could_not_find_email": "未找到邮箱: {error}",
"could_not_find_usage_count": "未找到使用次数: {error}",
"already_on_settings_page": "已处于设置页面",
"failed_to_extract_auth_info": "提取认证信息失败: {error}",
"no_chrome_profiles_found": "未找到 Chrome 配置文件, 使用默认配置文件",
"found_default_chrome_profile": "找到默认 Chrome 配置文件",
"using_first_available_chrome_profile": "使用第一个可用的 Chrome 配置文件: {profile}",
"error_finding_chrome_profile": "找不到 Chrome 配置文件, 使用默认配置文件: {error}",
"initializing_browser_setup": "初始化浏览器设置...",
"detected_platform": "检测平台: {platform}",
"running_as_root_warning": "以 root 运行不推荐用于浏览器自动化",
"consider_running_without_sudo": "考虑不使用 sudo 运行脚本",
"no_compatible_browser_found": "未找到兼容的浏览器。请安装 Google Chrome 或 Chromium。",
"supported_browsers": "支持的浏览器: {platform}",
"using_browser_profile": "使用浏览器配置文件: {profile}",
"starting_browser": "正在启动浏览器: {path}",
"browser_setup_completed": "浏览器设置完成",
"browser_setup_failed": "浏览器设置失败: {error}",
"try_running_without_sudo_admin": "尝试不使用 sudo/管理员权限运行",
"redirecting_to_authenticator_cursor_sh": "重定向到 authenticator.cursor.sh...",
"starting_google_authentication": "开始 Google 认证...",
"starting_github_authentication": "开始 Github 认证...",
"waiting_for_authentication": "等待认证...",
"page_changed_checking_auth": "页面改变, 检查认证...",
"status_check_error": "状态检查错误: {error}",
"authentication_timeout": "认证超时",
"account_is_still_valid": "账户仍然有效 (使用量: {usage})",
"starting_re_authentication_process": "开始重新认证过程...",
"starting_new_google_authentication": "开始新的 Google 认证...",
"failed_to_delete_account_or_re_authenticate": "删除账户或重新认证失败: {error}",
"navigating_to_authentication_page": "正在导航到认证页面...",
"please_select_your_google_account_to_continue": "请选择您的 Google 账户以继续...",
"found_browser_data_directory": "找到浏览器数据目录: {path}",
"authentication_successful_getting_account_info": "认证成功, 获取账户信息...",
"warning_could_not_kill_existing_browser_processes": "警告: 无法杀死现有浏览器进程: {error}",
"browser_failed_to_start": "浏览器启动失败: {error}",
"browser_failed": "浏览器启动失败: {error}",
"browser_failed_to_start_fallback": "浏览器启动失败: {error}",
"user_data_dir_not_found": "{browser} 用户数据目录未找到:{path},将尝试使用 Chrome",
"error_getting_user_data_directory": "获取用户数据目录出错:{error}",
"warning_browser_close": "警告:这将关闭所有正在运行的 {browser} 进程",
"killing_browser_processes": "正在关闭 {browser} 进程...",
"profile_selection_error": "配置文件选择过程中出错: {error}",
"using_configured_browser_path": "使用配置的 {browser} 路径: {path}",
"browser_not_found_trying_chrome": "未找到 {browser},尝试使用 Chrome 代替",
"found_chrome_at": "找到 Chrome: {path}",
"found_browser_user_data_dir": "找到 {browser} 用户数据目录: {path}",
"select_profile": "选择要使用的 {browser} 配置文件:",
"profile_list": "可用 {browser} 配置文件:",
"chrome_permissions_fixed": "已修复 Chrome 用户数据目录权限",
"chrome_permissions_fix_failed": "修复 Chrome 权限失败: {error}"
},
"browser_profile": {
"title": "浏览器配置文件选择",
"select_profile": "选择要使用的{browser}配置文件:",
"profile_list": "可用{browser}配置文件:",
"default_profile": "默认配置文件",
"profile": "配置文件 {number}",
"no_profiles": "未找到{browser}配置文件",
"error_loading": "加载{browser}配置文件时出错:{error}",
"profile_selected": "已选择配置文件:{profile}",
"invalid_selection": "选择无效。请重试"
},
"account_delete": {
"title": "Cursor Google 账号删除工具",
"warning": "警告:这将永久删除您的 Cursor 账号。此操作无法撤销。",
"cancelled": "账号删除已取消。",
"starting_process": "开始账号删除过程...",
"google_button_not_found": "未找到 Google 登录按钮",
"logging_in": "正在使用 Google 登录...",
"waiting_for_auth": "等待 Google 验证...",
"login_successful": "登录成功",
"unexpected_page": "登录后页面异常:{url}",
"trying_settings": "尝试导航到设置页面...",
"select_google_account": "请选择您的 Google 账号...",
"auth_timeout": "认证超时,继续执行...",
"navigating_to_settings": "正在导航到设置页面...",
"already_on_settings": "已在设置页面",
"login_redirect_failed": "登录重定向失败,尝试直接导航...",
"advanced_tab_not_found": "多次尝试后未找到高级选项卡",
"advanced_tab_retry": "未找到高级选项卡,尝试 {attempt}/{max_attempts}",
"advanced_tab_error": "查找高级选项卡时出错:{error}",
"advanced_tab_clicked": "已点击高级选项卡",
"direct_advanced_navigation": "尝试直接导航到高级选项卡",
"delete_button_not_found": "多次尝试后未找到删除账号按钮",
"delete_button_retry": "未找到删除按钮,尝试 {attempt}/{max_attempts}",
"delete_button_error": "查找删除按钮时出错:{error}",
"delete_button_clicked": "已点击删除账号按钮",
"delete_input_not_found": "多次尝试后未找到删除确认输入框",
"delete_input_retry": "未找到删除输入框,尝试 {attempt}/{max_attempts}",
"delete_input_error": "查找删除输入框时出错:{error}",
"delete_input_not_found_continuing": "未找到删除确认输入框,尝试继续执行...",
"typed_delete": "已在确认框中输入\"Delete\"",
"confirm_button_not_found": "多次尝试后未找到确认按钮",
"confirm_button_retry": "未找到确认按钮,尝试 {attempt}/{max_attempts}",
"confirm_button_error": "查找确认按钮时出错:{error}",
"account_deleted": "账号删除成功!",
"error": "账号删除过程中出错:{error}",
"success": "您的 Cursor 账号已成功删除!",
"failed": "账号删除过程失败或已取消。",
"interrupted": "账号删除过程被用户中断。",
"unexpected_error": "意外错误:{error}",
"found_email": "找到邮箱:{email}",
"email_not_found": "未找到邮箱: {error}",
"found_danger_zone": "已找到危险区域部分",
"confirm_prompt": "您确定要继续吗?(y/N): "
},
"bypass": {
"starting": "开始绕过 Cursor 版本限制...",
"found_product_json": "找到 product.json: {path}",
"no_write_permission": "没有写入权限: {path}",
"read_failed": "读取 product.json 失败: {error}",
"current_version": "当前版本: {version}",
"backup_created": "备份创建: {path}",
"version_updated": "版本从 {old} 更新到 {new}",
"write_failed": "写入 product.json 失败: {error}",
"no_update_needed": "不需要更新。当前版本 {version} 已 >= 0.46.0",
"bypass_failed": "绕过版本限制失败: {error}",
"stack_trace": "堆栈跟踪",
"localappdata_not_found": "LOCALAPPDATA 环境变量未找到",
"product_json_not_found": "product.json 未在常见 Linux 路径中找到",
"unsupported_os": "不支持的操作系统: {system}",
"file_not_found": "文件未找到: {path}",
"title": "Cursor 版本绕过工具",
"description": "此工具修改 Cursor 的 product.json 以绕过版本限制",
"menu_option": "绕过 Cursor 版本检查"
},
"auth_check": {
"checking_authorization": "检查授权...",
"token_source": "从数据库获取 token 或手动输入d/m, 默认: d",
"getting_token_from_db": "从数据库获取 token...",
"token_found_in_db": "在数据库中找到 token",
"token_not_found_in_db": "在数据库中未找到 token",
"cursor_acc_info_not_found": "cursor_acc_info.py 未找到",
"error_getting_token_from_db": "从数据库获取 token 时出错: {error}",
"enter_token": "请输入您的 Cursor token: ",
"token_length": "token 长度: {length}",
"usage_response_status": "使用情况响应状态: {response}",
"unexpected_status_code": "意外状态码: {code}",
"jwt_token_warning": "token 似乎是 JWT 格式,但 API 检查返回意外状态码。token 可能有效但 API 访问受限。",
"invalid_token": "无效的 token",
"user_authorized": "用户已授权",
"user_unauthorized": "用户未授权",
"request_timeout": "请求超时",
"connection_error": "连接错误",
"check_error": "检查授权时出错: {error}",
"authorization_successful": "授权成功",
"authorization_failed": "授权失败",
"operation_cancelled": "操作已取消",
"unexpected_error": "意外错误: {error}",
"error_generating_checksum": "生成校验和时出错: {error}",
"checking_usage_information": "检查使用情况...",
"check_usage_response": "检查使用情况响应: {response}",
"usage_response": "使用情况响应: {response}"
},
"bypass_token_limit": {
"title": "绕过 Token 限制工具",
"description": "此工具修改 workbench.desktop.main.js 文件以绕过 token 限制",
"press_enter": "按回车键继续..."
},
"token": {
"refreshing": "正在刷新令牌...",
"refresh_success": "令牌刷新成功!有效期 {days} 天(到期时间: {expire}",
"no_access_token": "响应中没有访问令牌",
"refresh_failed": "令牌刷新失败: {error}",
"invalid_response": "刷新服务器返回无效的 JSON 响应",
"server_error": "刷新服务器错误: HTTP {status}",
"request_timeout": "刷新服务器请求超时",
"connection_error": "连接刷新服务器错误",
"unexpected_error": "令牌刷新过程中出现意外错误: {error}",
"extraction_error": "提取令牌时出错: {error}"
},
"restore": {
"title": "从备份恢复机器ID",
"starting": "正在启动机器ID恢复进程",
"no_backups_found": "未找到备份文件",
"available_backups": "可用的备份文件",
"select_backup": "选择要恢复的备份",
"to_cancel": "取消操作",
"operation_cancelled": "操作已取消",
"invalid_selection": "选择无效",
"please_enter_number": "请输入有效的数字",
"missing_id": "缺少ID: {id}",
"read_backup_failed": "读取备份文件失败: {error}",
"current_file_not_found": "未找到当前存储文件",
"current_backup_created": "已创建当前存储文件的备份",
"storage_updated": "存储文件已成功更新",
"update_failed": "更新存储文件失败: {error}",
"sqlite_not_found": "未找到SQLite数据库",
"updating_sqlite": "正在更新SQLite数据库",
"updating_pair": "正在更新键值对",
"sqlite_updated": "SQLite数据库已成功更新",
"sqlite_update_failed": "更新SQLite数据库失败: {error}",
"machine_id_backup_created": "已创建machineId文件的备份",
"backup_creation_failed": "创建备份失败: {error}",
"machine_id_updated": "machineId文件已成功更新",
"machine_id_update_failed": "更新machineId文件失败: {error}",
"updating_system_ids": "正在更新系统ID",
"system_ids_update_failed": "更新系统ID失败: {error}",
"permission_denied": "权限被拒绝。请尝试以管理员身份运行",
"windows_machine_guid_updated": "Windows机器GUID已成功更新",
"update_windows_machine_guid_failed": "更新Windows机器GUID失败: {error}",
"windows_machine_id_updated": "Windows机器ID已成功更新",
"update_windows_machine_id_failed": "更新Windows机器ID失败: {error}",
"sqm_client_key_not_found": "未找到SQMClient注册表项",
"update_windows_system_ids_failed": "更新Windows系统ID失败: {error}",
"macos_platform_uuid_updated": "macOS平台UUID已成功更新",
"failed_to_execute_plutil_command": "执行plutil命令失败",
"update_macos_system_ids_failed": "更新macOS系统ID失败: {error}",
"ids_to_restore": "要恢复的机器ID",
"confirm": "您确定要恢复这些ID吗",
"success": "机器ID已成功恢复",
"process_error": "恢复过程错误: {error}",
"press_enter": "按Enter键继续"
},
"manual_auth": {
"token_verification_skipped": "跳过令牌验证Check_user_authorized.py找不到",
"auth_updated_successfully": "身份验证信息成功更新了!",
"auth_type_selected": "选定的身份验证类型:{type}",
"proceed_prompt": "继续? y/n",
"token_required": "需要令牌",
"continue_anyway": "无论如何继续? y/n",
"auth_type_google": "谷歌",
"auth_type_github": "github",
"random_email_generated": "生成的随机电子邮件:{电子邮件}",
"verifying_token": "验证令牌有效性...",
"auth_type_prompt": "选择身份验证类型:",
"operation_cancelled": "操作取消了",
"error": "错误:{错误}",
"email_prompt": "输入电子邮件(留空白以获取随机电子邮件):",
"auth_type_auth0": "auth_0默认",
"token_verification_error": "错误验证令牌:{error}",
"token_prompt": "输入光标令牌access_token/refresh_token",
"invalid_token": "无效的令牌。身份验证中止。",
"confirm_prompt": "请确认以下信息:",
"auth_update_failed": "无法更新身份验证信息",
"title": "手动Cursor身份验证",
"token_verified": "令牌成功验证了!",
"updating_database": "更新Cursor身份验证数据库..."
},
"tempmail": {
"general_error": "发生错误:{error}",
"no_email": "找不到Cursor验证电子邮件",
"configured_email": "配置的电子邮件:{email}",
"config_error": "配置文件错误:{error}",
"extract_code_failed": "提取验证代码失败:{error}",
"no_code": "无法获得验证代码",
"check_email_failed": "检查电子邮件失败:{error}",
"checking_email": "检查Cursor验证电子邮件...",
"email_found": "找到Cursor验证电子邮件",
"verification_code": "验证代码:{code}"
}
}
}

View File

@ -1,21 +1,59 @@
{
"menu": {
"title": "可用選項",
"exit": "退出程序",
"reset": "重置機器標識",
"register": "註冊 Cursor",
"quit": "退出 Cursor",
"select_language": "選擇語言",
"input_choice": "輸入選擇 ({choices})",
"invalid_choice": "無效選擇,請重試",
"program_terminated": "程序被用戶終止",
"error_occurred": "發生錯誤: {error}",
"press_enter": "按回車鍵退出"
"exit": "退出程式",
"reset": "重置機器ID",
"register": "註冊新的Cursor帳戶",
"register_google": "使用自己的Google帳戶註冊",
"register_github": "使用自己的GitHub帳戶註冊",
"register_manual": "使用自定義郵箱註冊Cursor",
"quit": "關閉Cursor應用",
"select_language": "更改語言",
"select_chrome_profile": "選擇Chrome配置檔案",
"input_choice": "請輸入您的選擇 ({choices})",
"invalid_choice": "選擇無效,請輸入 {choices} 範圍內的數字",
"program_terminated": "程式已被使用者終止",
"error_occurred": "發生錯誤:{error},請重試",
"press_enter": "按返回鍵退出",
"disable_auto_update": "禁用 Cursor 自動更新",
"lifetime_access_enabled": "終身訪問已啟用",
"totally_reset": "完全重置 Cursor",
"outdate": "過時",
"temp_github_register": "臨時GitHub註冊",
"admin_required": "運行可執行文件,需要管理員權限",
"admin_required_continue": "繼續使用當前版本...",
"coming_soon": "即將推出",
"fixed_soon": "即將修復",
"contribute": "貢獻項目",
"config": "顯示配置",
"delete_google_account": "刪除 Cursor Google 帳號",
"continue_prompt": "繼續?(y/N): ",
"operation_cancelled_by_user": "操作被使用者取消",
"exiting": "退出中 ……",
"bypass_version_check": "繞過 Cursor 版本檢查",
"check_user_authorized": "檢查用戶授權",
"bypass_token_limit": "繞過 Token 限制",
"language_config_saved": "語言配置保存成功",
"lang_invalid_choice": "選擇無效。請輸入以下選項之一:({lang_choices})",
"restore_machine_id": "從備份恢復機器ID",
"manual_custom_auth": "手動自定義驗證"
},
"languages": {
"en": "English",
"zh_cn": "简体中文",
"zh_tw": "繁體中文"
"ar": "阿拉伯語",
"en": "英文",
"zh_cn": "簡體中文",
"zh_tw": "繁體中文",
"vi": "越南文",
"nl": "荷蘭文",
"de": "德文",
"fr": "法文",
"pt": "葡萄牙文",
"ru": "俄文",
"tr": "土耳其文",
"bg": "保加利亞文",
"es": "西班牙文",
"ja": "日文",
"it": "義大利文"
},
"quit_cursor": {
"start": "開始退出 Cursor",
@ -62,47 +100,71 @@
"patch_completed": "getMachineId修補完成",
"patch_failed": "getMachineId修補失敗: {error}",
"version_check_passed": "Cursor版本檢查通過",
"file_modified": "文件已修改"
"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機器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",
"no_write_permission": "沒有寫入權限: {path}",
"path_not_found": "路徑未找到: {path}",
"modify_file_failed": "修改文件失敗: {error}",
"windows_machine_id_updated": "Windows機器ID更新成功",
"update_windows_machine_id_failed": "更新Windows機器ID失敗: {error}",
"update_windows_machine_guid_failed": "更新Windows機器GUID失敗: {error}",
"file_not_found": "文件未找到: {path}"
},
"register": {
"title": "Cursor 註冊工具",
"start": "開始註冊流程",
"mailbox": "成功進入郵箱",
"browser_started": "瀏覽器已啟動",
"waiting_for_page_load": "等待頁面加載",
"password_success": "密碼設置完成",
"password_error": "密碼設置失敗: {error}",
"start": "正在啟動註冊流程...",
"handling_turnstile": "正在處理安全驗證...",
"retry_verification": "正在重試驗證...",
"detect_turnstile": "正在檢查安全驗證...",
"verification_success": "安全驗證通過",
"starting_browser": "正在開啟瀏覽器...",
"form_success": "表單提交成功",
"browser_started": "瀏覽器已成功開啟",
"waiting_for_second_verification": "等待郵箱驗證...",
"waiting_for_verification_code": "等待驗證碼...",
"password_success": "密碼設定成功",
"password_error": "無法設定密碼:{error},請重試",
"waiting_for_page_load": "頁面載入中...",
"first_verification_passed": "初始驗證通過",
"mailbox": "已成功存取郵箱",
"visiting_url": "訪問URL",
"first_verification_passed": "第一階段驗證通過",
"register_start": "開始註冊流程",
"form_submitted": "表單已提交,開始驗證...",
"waiting_for_second_verification": "等待第二階段驗證",
"filling_form": "填寫註冊信息",
"basic_info": "基本信息提交完成",
"handle_turnstile": "處理 Turnstile 驗證",
"no_turnstile": "未檢測到 Turnstile 驗證",
"turnstile_passed": "驗證通過",
"verification_start": "開始獲取驗證碼",
"waiting_for_verification_code": "等待驗證碼",
"handling_turnstile": "處理 Turnstile 驗證",
"retry_verification": "重試驗證",
"detect_turnstile": "檢測 Turnstile 驗證",
"verification_success": "驗證成功",
"starting_browser": "啟動瀏覽器",
"form_success": "表單提交成功",
"verification_timeout": "獲取驗證碼超時",
"verification_not_found": "未找到驗證碼",
"try_get_code": "第 {attempt} 次嘗試獲取驗證碼 | 剩餘時間: {time}秒",
"get_account": "獲取戶信息",
"get_account": "獲取帳戶信息",
"get_token": "獲取 Cursor Session Token",
"token_success": "Token 獲取成功",
"token_attempt": "第 {attempt} 次嘗試未獲取到 Token{time}秒後重試",
"token_max_attempts": "已達到最大嘗試次數({max}),獲取 Token 失敗",
"token_failed": "獲取 Token 失敗: {error}",
"account_error": "獲取賬戶信息失敗: {error}",
"press_enter": "按回車鍵退出",
"browser_start": "正在啟動瀏覽器",
"open_mailbox": "正在打開郵箱頁面",
"account_error": "獲取帳戶信息失敗: {error}",
"email_error": "獲取郵箱地址失敗",
"setup_error": "郵箱設置出錯: {error}",
"start_getting_verification_code": "開始獲取驗證碼將在60秒內嘗試...",
@ -123,7 +185,49 @@
"get_email_address": "獲取郵箱地址",
"register_process_error": "註冊流程錯誤: {error}",
"update_cursor_auth_info": "更新Cursor認證信息",
"setting_password": "設置密碼"
"setting_password": "設置密碼",
"manual_code_input": "手動輸入驗證碼",
"manual_email_input": "手動輸入郵箱地址",
"suggest_email": "推薦郵箱地址: {suggested_email}",
"use_suggested_email_or_enter": "輸入\"yes\"使用此郵箱或直接輸入您想使用的郵箱地址:",
"password": "密碼",
"first_name": "名字",
"last_name": "姓氏",
"exit_signal": "退出信號",
"email_address": "郵箱地址",
"config_created": "配置已創建",
"verification_failed": "驗證失敗",
"verification_error": "驗證錯誤: {error}",
"config_option_added": "配置項已添加: {option}",
"config_updated": "配置已更新",
"password_submitted": "密碼已提交",
"total_usage": "總使用量: {usage}",
"setting_on_password": "設置密碼",
"getting_code": "正在獲取驗證碼將在60秒內嘗試...",
"using_browser": "使用{瀏覽器}瀏覽器:{path}",
"press_enter": "按Enter退出",
"try_install_browser": "嘗試使用您的軟件包管理器安裝瀏覽器",
"open_mailbox": "打開郵箱頁面",
"browser_path_invalid": "{瀏覽器}路徑無效,使用默認路徑",
"make_sure_browser_is_properly_installed": "確保正確安裝{瀏覽器}",
"using_browser_profile": "使用{browser} profile來自{user_data_dir}",
"no_new_processes_detected": "未檢測到跟踪的新{瀏覽器}進程",
"browser_start": "啟動瀏覽器",
"max_retries_reached": "達到了最大的重試嘗試。註冊失敗。",
"could_not_track_processes": "無法跟踪{瀏覽器}進程:{error}",
"human_verify_error": "無法驗證用戶是人類。重試...",
"tracking_processes": "跟踪{count} {瀏覽器}進程",
"using_tempmail_plus": "使用TempMailPlus進行郵箱驗證",
"tempmail_plus_enabled": "TempMailPlus已啟用",
"tempmail_plus_disabled": "TempMailPlus已禁用",
"tempmail_plus_config_missing": "TempMailPlus配置缺失",
"tempmail_plus_email_missing": "未配置TempMailPlus郵箱",
"tempmail_plus_epin_missing": "未配置TempMailPlus epin",
"tempmail_plus_initialized": "TempMailPlus初始化成功",
"tempmail_plus_init_failed": "TempMailPlus初始化失敗{error}",
"tempmail_plus_verification_started": "開始TempMailPlus驗證流程",
"tempmail_plus_verification_completed": "TempMailPlus驗證成功完成",
"tempmail_plus_verification_failed": "TempMailPlus驗證失敗{error}"
},
"auth": {
"title": "Cursor 認證管理器",
@ -140,7 +244,11 @@
"connected_to_database": "已連接到數據庫",
"database_updated_successfully": "數據庫更新成功",
"database_connection_closed": "數據庫連接已關閉",
"updating_pair": "更新鍵值對"
"updating_pair": "更新鍵值對",
"db_not_found": "未找到數據庫文件:{path}",
"db_permission_error": "無法訪問數據庫文件,請檢查權限",
"db_connection_error": "連接數據庫失敗:{error}",
"reset_machine_id": "重置機ID"
},
"control": {
"generate_email": "生成新郵箱",
@ -171,11 +279,13 @@
"get_cursor_session_token_failed": "獲取Cursor Session Token失敗",
"save_token_failed": "保存Token失敗",
"blocked_domain": "被屏蔽的域名",
"no_valid_verification_code": "沒有有效的驗證碼"
"no_valid_verification_code": "沒有有效的驗證碼",
"database_updated_successfully": "數據庫成功更新",
"database_connection_closed": "數據庫連接關閉"
},
"email": {
"starting_browser": "啟動瀏覽器",
"visiting_site": "訪問 smailpro.com",
"visiting_site": "訪問 郵箱網站",
"create_success": "郵箱創建成功",
"create_failed": "郵箱創建失敗",
"create_error": "郵箱創建錯誤: {error}",
@ -189,7 +299,589 @@
"verification_code_found": "找到驗證碼",
"verification_code_not_found": "未找到驗證碼",
"verification_code_error": "驗證碼錯誤: {error}",
"address": "郵箱地址"
}
}
"address": "郵箱地址",
"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": "加載被屏蔽的域名: {domains}",
"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}",
"domain_blocked": "域名被屏蔽: {domain}",
"using_chrome_profile": "使用 Chrome 配置文件: {user_data_dir}",
"no_display_found": "未找到顯示器。確保 X 伺服器正在運行。",
"try_export_display": "嘗試: export DISPLAY=:0",
"extension_load_error": "加載插件失敗: {error}",
"make_sure_chrome_chromium_is_properly_installed": "確保 Chrome/Chromium 已正確安裝",
"try_install_chromium": "嘗試: sudo apt install chromium-browser"
},
"update": {
"title": "禁用 Cursor 自动更新",
"disable_success": "自動更新禁用成功",
"disable_failed": "禁用自動更新失敗: {error}",
"press_enter": "按回車鍵退出",
"start_disable": "開始禁用自動更新",
"killing_processes": "殺死進程",
"processes_killed": "進程已殺死",
"removing_directory": "刪除目錄",
"directory_removed": "目錄已刪除",
"creating_block_file": "創建阻止文件",
"block_file_created": "阻止文件已創建",
"clearing_update_yml": "清空 update.yml 文件",
"update_yml_cleared": "update.yml 文件已清空",
"update_yml_not_found": "update.yml 文件未找到",
"clear_update_yml_failed": "清空 update.yml 文件失败: {error}",
"unsupported_os": "不支持的操作系统: {system}",
"remove_directory_failed": "刪除目錄失败: {error}",
"create_block_file_failed": "創建阻止文件失败: {error}",
"directory_locked": "目錄被鎖定: {path}",
"yml_locked": "update.yml 文件被鎖定",
"block_file_locked": "阻止文件被鎖定",
"yml_already_locked": "update.yml 文件已鎖定",
"block_file_already_locked": "阻止文件已鎖定",
"block_file_locked_error": "阻止文件锁定错误: {error}",
"yml_locked_error": "update.yml 文件锁定错误: {error}",
"block_file_already_locked_error": "阻止文件已锁定错误: {error}",
"yml_already_locked_error": "update.yml 文件已锁定错误: {error}"
},
"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": "更新日誌",
"rate_limit_exceeded": "GitHub API 速率限制超過。跳過更新檢查。"
},
"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": "正在重置機器 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": "跳過 Windows 機器 ID 修改:{error}",
"linux_machine_id_modification_skipped": "跳過 Linux machine-id 修改:{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' 並搜尋 HKEY_CURRENT_USER\\Software\\ 下包含 'Cursor' 或 'CursorAI' 的鍵並刪除它們。\n",
"reset_log_1": "Cursor AI 已完全重置並繞過試用偵測!",
"reset_log_2": "請重新啟動系統以使更改生效。",
"reset_log_3": "您需要重新安裝 Cursor AI現在應該有全新的試用期。",
"reset_log_4": "為獲得最佳效果,建議還可以:",
"reset_log_5": "註冊新試用時使用不同的電子郵件地址",
"reset_log_6": "若有可能,使用 VPN 變更 IP 地址",
"reset_log_7": "在造訪 Cursor AI 網站前清除瀏覽器的 Cookie 與快取",
"reset_log_8": "若仍有問題,嘗試將 Cursor AI 安裝到不同位置",
"reset_log_9": "若遇到任何問題,請到 Github Issue Tracker 提交問題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": "正在檢查 Electron localStorage 檔案",
"no_additional_license_trial_files_found_in_deep_scan": "深度掃描中未發現其他試用/授權檔案",
"removing_electron_localstorage_files": "正在移除 Electron localStorage 檔案",
"electron_localstorage_files_removed": "已移除 Electron localStorage 檔案",
"electron_localstorage_files_removal_error": "移除 Electron localStorage 檔案時出錯:{error}",
"removing_electron_localstorage_files_completed": "Electron localStorage 檔案移除完成",
"warning_title": "警告",
"warning_1": "此操作將刪除所有 Cursor AI 設定、",
"warning_2": "配置與快取資料。此操作無法還原。",
"warning_3": "您的程式碼檔案將 **不會** 受到影響,且此工具僅針對",
"warning_4": "Cursor AI 編輯器檔案與試用偵測機制。",
"warning_5": "系統中的其他應用程式不會受到影響。",
"warning_6": "執行此工具後,您需要重新設定 Cursor AI。",
"warning_7": "請自行承擔風險",
"removed": "已刪除:{path}",
"failed_to_reset_machine_guid": "無法重置機器 GUID",
"failed_to_remove": "無法刪除:{path}",
"failed_to_delete_file": "無法刪除檔案:{path}",
"failed_to_delete_directory": "無法刪除目錄:{path}",
"failed_to_delete_file_or_directory": "無法刪除檔案或目錄:{path}",
"deep_scanning": "正在進行深度掃描以查找其他試用/授權檔案",
"resetting_cursor": "正在重置 Cursor AI 編輯器... 請稍候。",
"completed_in": "完成時間:{time} 秒",
"cursor_reset_completed": "Cursor AI 編輯器已完全重置且繞過試用偵測!",
"cursor_reset_failed": "Cursor AI 編輯器重置失敗:{error}",
"cursor_reset_cancelled": "Cursor AI 編輯器重置已取消,未進行任何更改。",
"operation_cancelled": "操作已取消,未進行任何更改。",
"delete_button_clicked": "單擊刪除帳戶按鈕",
"advanced_tab_clicked": "單擊高級選項卡",
"found_danger_zone": "發現的危險區域部分",
"advanced_tab_not_found": "多次嘗試後找不到高級標籤",
"delete_input_not_found": "多次嘗試後找不到刪除確認輸入",
"navigating_to_settings": "導航到設置頁面...",
"advanced_tab_error": "錯誤查找高級選項卡:{錯誤}",
"delete_input_retry": "刪除未找到輸入,嘗試{嘗試}/{max_attempts}",
"direct_advanced_navigation": "嘗試直接導航到高級選項卡",
"advanced_tab_retry": "找不到高級選項卡,嘗試{嘗試}/{max_attempts}",
"already_on_settings": "已經在設置頁面上",
"delete_input_error": "錯誤查找刪除輸入:{error}",
"delete_button_retry": "找不到刪除按鈕,嘗試{嘗試}/{max_attempts}",
"delete_button_not_found": "多次嘗試後找不到帳戶按鈕",
"delete_button_error": "錯誤查找刪除按鈕:{錯誤}",
"delete_input_not_found_continuing": "找不到刪除確認輸入,試圖繼續繼續",
"login_redirect_failed": "登錄重定向失敗,嘗試直接導航..."
},
"github_register": {
"title": "GitHub + Cursor AI 注册自动化",
"features_header": "功能",
"feature1": "使用 1secmail 生成临时邮箱",
"feature2": "使用随机凭证注册新的 GitHub 账户",
"feature3": "自动验证 GitHub 邮箱",
"feature4": "使用 GitHub 认证登录 Cursor AI",
"feature5": "重置机器 ID 以绕过试用检测",
"feature6": "保存所有凭证到文件",
"warnings_header": "警告",
"warning1": "此脚本自动化账户创建,可能违反 GitHub/Cursor 服务条款",
"warning2": "需要互联网访问和管理员权限",
"warning3": "CAPTCHA 或额外验证可能会中断自动化",
"warning4": "请负责任地使用,风险自负",
"confirm": "您确定要继续吗?",
"invalid_choice": "无效选择。请输入 'yes' 或 'no'",
"cancelled": "操作已取消",
"program_terminated": "程序已由用户终止",
"starting_automation": "開始自動化...",
"github_username": "GitHub 用戶名",
"github_password": "GitHub 密碼",
"email_address": "郵箱地址",
"credentials_saved": "這些憑證已保存到 github_cursor_accounts.txt",
"completed_successfully": "GitHub + Cursor 註冊成功",
"registration_encountered_issues": "GitHub + Cursor 註冊遇到問題",
"check_browser_windows_for_manual_intervention_or_try_again_later": "檢查瀏覽器視窗進行手動干預或稍後再試"
},
"account_info": {
"subscription": "訂閱",
"trial_remaining": "剩餘試用",
"days": "天",
"subscription_not_found": "訂閱信息未找到",
"email_not_found": "郵箱未找到",
"failed_to_get_account": "獲取帳戶信息失敗",
"config_not_found": "配置未找到。",
"failed_to_get_usage": "獲取使用信息失敗",
"failed_to_get_subscription": "獲取訂閱信息失敗",
"failed_to_get_email": "獲取郵箱地址失敗",
"failed_to_get_token": "獲取 token 失敗",
"failed_to_get_account_info": "獲取帳戶信息失敗",
"title": "帳戶信息",
"email": "郵箱",
"token": "Token",
"usage": "使用量",
"subscription_type": "訂閱類型",
"remaining_trial": "剩餘試用",
"days_remaining": "剩餘天數",
"premium": "高級",
"pro": "專業",
"pro_trial": "專業試用",
"team": "團隊",
"enterprise": "企業",
"free": "免費",
"active": "活躍",
"inactive": "非活躍",
"premium_usage": "高級使用量",
"basic_usage": "基礎使用量",
"usage_not_found": "使用量未找到",
"lifetime_access_enabled": "永久訪問已啟用",
"token_not_found": "Token 未找到"
},
"config": {
"config_not_available": "配置未找到。",
"configuration": "配置",
"enabled": "已啟用",
"disabled": "已禁用",
"config_directory": "配置目錄",
"neither_cursor_nor_cursor_directory_found": "未找到 Cursor 或 Cursor 目錄",
"please_make_sure_cursor_is_installed_and_has_been_run_at_least_once": "請確保 Cursor 已安裝並至少運行一次",
"storage_directory_not_found": "未找到儲存目錄",
"storage_file_found": "找到儲存文件",
"file_size": "文件大小",
"file_permissions": "文件權限",
"file_owner": "文件所有者",
"file_group": "文件組",
"error_getting_file_stats": "獲取文件統計信息時出錯",
"permission_denied": "權限拒絕",
"try_running": "嘗試運行: {command}",
"and": "和",
"storage_file_is_empty": "儲存文件為空",
"the_file_might_be_corrupted_please_reinstall_cursor": "文件可能已損壞,請重新安裝 Cursor",
"storage_file_not_found": "未找到儲存文件",
"error_checking_linux_paths": "檢查 Linux 路徑時出錯",
"config_option_added": "添加配置選項",
"config_updated": "配置更新",
"config_created": "配置已創建",
"config_setup_error": "配置設置錯誤",
"storage_file_is_valid_and_contains_data": "儲存文件有效且包含數據",
"error_reading_storage_file": "讀取儲存文件時出錯",
"also_checked": "也檢查了 {path}",
"backup_created": "備份已創建: {path}",
"config_removed": "配置文件已刪除用於強制更新",
"backup_failed": "備份失敗: {error}",
"force_update_failed": "強制更新配置失敗: {error}",
"config_force_update_disabled": "配置文件強制更新已禁用,跳過強制更新",
"config_force_update_enabled": "配置文件強制更新已啟用,正在執行強制更新",
"documents_path_not_found": "使用當前目錄找不到文檔路徑",
"config_dir_created": "配置目錄創建:{path}",
"using_temp_dir": "由於錯誤而使用臨時目錄:{path}(錯誤:{error}"
},
"oauth": {
"authentication_button_not_found": "未找到認證按鈕",
"authentication_failed": "認證失敗: {error}",
"found_cookies": "找到 {count} 個 Cookie",
"token_extraction_error": "Token 提取錯誤: {error}",
"authentication_successful": "認證成功 - 郵箱: {email}",
"missing_authentication_data": "缺少認證數據: {data}",
"failed_to_delete_account": "刪除帳戶失敗: {error}",
"invalid_authentication_type": "無效的認證類型",
"auth_update_success": "認證更新成功",
"browser_closed": "瀏覽器已關閉",
"auth_update_failed": "認證更新失敗",
"google_start": "Google 開始",
"github_start": "Github 開始",
"usage_count": "使用量: {usage}",
"account_has_reached_maximum_usage": "帳戶已達到最大使用量, {deleting}",
"starting_new_authentication_process": "開始新的認證過程...",
"failed_to_delete_expired_account": "刪除過期帳戶失敗",
"could_not_check_usage_count": "無法檢查使用量: {error}",
"found_email": "找到郵箱: {email}",
"could_not_find_email": "未找到郵箱: {error}",
"could_not_find_usage_count": "未找到使用量: {erro r}",
"already_on_settings_page": "已處於設置頁面",
"failed_to_extract_auth_info": "提取認證信息失敗: {error}",
"no_chrome_profiles_found": "未找到 Chrome 配置文件, 使用默認配置文件",
"found_default_chrome_profile": "找到默認 Chrome 配置文件",
"using_first_available_chrome_profile": "使用第一個可用的 Chrome 配置文件: {profile}",
"error_finding_chrome_profile": "找不到 Chrome 配置文件, 使用默認配置文件: {error}",
"initializing_browser_setup": "初始化瀏覽器設置...",
"detected_platform": "檢測平台: {platform}",
"running_as_root_warning": "以 root 運行不推薦用於瀏覽器自動化",
"consider_running_without_sudo": "考慮不使用 sudo 運行腳本",
"no_compatible_browser_found": "未找到兼容的瀏覽器。請安裝 Google Chrome 或 Chromium。",
"supported_browsers": "支持的瀏覽器: {platform}",
"using_browser_profile": "使用瀏覽器配置文件: {profile}",
"starting_browser": "正在啟動瀏覽器: {path}",
"browser_setup_completed": "瀏覽器設置完成成功",
"browser_setup_failed": "瀏覽器設置失敗: {error}",
"try_running_without_sudo_admin": "嘗試不使用 sudo/管理員權限運行",
"redirecting_to_authenticator_cursor_sh": "重定向到 authenticator.cursor.sh...",
"starting_github_authentication": "開始 Github 認證...",
"waiting_for_authentication": "等待認證...",
"page_changed_checking_auth": "頁面改變, 檢查認證...",
"status_check_error": "狀態檢查錯誤: {error}",
"authentication_timeout": "認證超時",
"account_is_still_valid": "帳戶仍然有效 (使用量: {usage})",
"starting_re_authentication_process": "開始重新認證過程...",
"starting_new_google_authentication": "開始新的 Google 認證...",
"failed_to_delete_account_or_re_authenticate": "刪除帳戶或重新認證失敗: {error}",
"navigating_to_authentication_page": "正在導航到認證頁面...",
"please_select_your_google_account_to_continue": "請選擇您的 Google 帳戶以繼續...",
"found_browser_data_directory": "找到瀏覽器數據目錄: {path}",
"authentication_successful_getting_account_info": "認證成功, 獲取帳戶信息...",
"warning_could_not_kill_existing_browser_processes": "警告: 無法殺死現有瀏覽器進程: {error}",
"browser_failed_to_start": "瀏覽器啟動失敗: {error}",
"browser_failed": "瀏覽器啟動失敗: {error}",
"browser_failed_to_start_fallback": "瀏覽器啟動失敗: {error}",
"using_configured_browser_path": "使用配置的 {browser} 路徑: {path}",
"found_browser_user_data_dir": "找到 {browser} 用戶數據目錄: {path}",
"warning_browser_close": "警告:這將關閉所有正在執行的 {browser} 進程",
"killing_browser_processes": "正在關閉 {browser} 進程...",
"profile_selection_error": "配置文件選擇過程中出錯: {error}",
"select_profile": "選擇要使用的 {browser} 配置文件:",
"profile_list": "可用 {browser} 配置文件:",
"no_profiles": "未找到 {browser} 配置文件",
"error_loading": "載入 {browser} 配置文件時出錯:{error}",
"profile_selected": "已選擇配置文件:{profile}",
"invalid_selection": "選擇無效。請重試",
"starting_google_authentication": "開始Google身份驗證...",
"found_chrome_at": "在:{path}中找到鉻",
"browser_not_found_trying_chrome": "找不到{瀏覽器}而是嘗試chrome",
"error_getting_user_data_directory": "錯誤獲取用戶數據目錄:{error}",
"user_data_dir_not_found": "{瀏覽器}用戶數據目錄在{path}上找不到而是嘗試Chrome"
},
"chrome_profile": {
"title": "Chrome配置檔案選擇",
"select_profile": "選擇要使用的Chrome配置檔案",
"profile_list": "可用配置檔案:",
"default_profile": "預設配置檔案",
"profile": "配置檔案 {number}",
"no_profiles": "未找到Chrome配置檔案",
"error_loading": "載入Chrome配置檔案時出錯{error}",
"profile_selected": "已選擇配置檔案:{profile}",
"invalid_selection": "選擇無效。請重試",
"warning_chrome_close": "警告這將關閉所有正在執行的Chrome程序"
},
"account_delete": {
"title": "Cursor Google 帳號刪除工具",
"warning": "警告:這將永久刪除您的 Cursor 帳號。此操作無法撤銷。",
"cancelled": "帳號刪除已取消。",
"starting_process": "開始帳號刪除過程...",
"google_button_not_found": "未找到 Google 登錄按鈕",
"logging_in": "正在使用 Google 登錄...",
"waiting_for_auth": "等待 Google 驗證...",
"login_successful": "登錄成功",
"unexpected_page": "登錄後頁面異常:{url}",
"trying_settings": "嘗試導航到設置頁面...",
"select_google_account": "請選擇您的 Google 帳號...",
"auth_timeout": "認證超時,繼續執行...",
"navigating_to_settings": "正在導航到設置頁面...",
"already_on_settings": "已在設置頁面",
"login_redirect_failed": "登錄重定向失敗,嘗試直接導航...",
"advanced_tab_not_found": "多次嘗試後未找到高級選項卡",
"advanced_tab_retry": "未找到高級選項卡,嘗試 {attempt}/{max_attempts}",
"advanced_tab_error": "查找高級選項卡時出錯:{error}",
"advanced_tab_clicked": "已點擊高級選項卡",
"direct_advanced_navigation": "嘗試直接導航到高級選項卡",
"delete_button_not_found": "多次嘗試後未找到刪除帳號按鈕",
"delete_button_retry": "未找到刪除按鈕,嘗試 {attempt}/{max_attempts}",
"delete_button_error": "查找刪除按鈕時出錯:{error}",
"delete_button_clicked": "已點擊刪除帳號按鈕",
"delete_input_not_found": "多次嘗試後未找到刪除確認輸入框",
"delete_input_retry": "未找到刪除輸入框,嘗試 {attempt}/{max_attempts}",
"delete_input_error": "查找刪除輸入框時出錯:{error}",
"delete_input_not_found_continuing": "未找到刪除確認輸入框,嘗試繼續執行...",
"typed_delete": "已在確認框中輸入\"Delete\"",
"confirm_button_not_found": "多次嘗試後未找到確認按鈕",
"confirm_button_retry": "未找到確認按鈕,嘗試 {attempt}/{max_attempts}",
"confirm_button_error": "查找確認按鈕時出錯:{error}",
"account_deleted": "帳號刪除成功!",
"error": "帳號刪除過程中出錯:{error}",
"success": "您的 Cursor 帳號已成功刪除!",
"failed": "帳號刪除過程失敗或已取消。",
"interrupted": "帳號刪除過程被用戶中斷。",
"unexpected_error": "意外錯誤:{error}",
"found_email": "找到郵箱:{email}",
"email_not_found": "未找到郵箱: {error}",
"found_danger_zone": "已找到危險區域部分",
"confirm_prompt": "您確定要繼續嗎?(y/N): ",
"typed_delete_js": "已使用 JavaScript 輸入\"Delete\""
},
"bypass": {
"starting": "開始繞過 Cursor 版本限制...",
"found_product_json": "找到 product.json: {path}",
"no_write_permission": "沒有寫入權限: {path}",
"read_failed": "讀取 product.json 失敗: {error}",
"current_version": "當前版本: {version}",
"backup_created": "備份已創建: {path}",
"version_updated": "版本從 {old} 更新到 {new}",
"write_failed": "寫入 product.json 失敗: {error}",
"no_update_needed": "不需要更新。當前版本 {version} 已 >= 0.46.0",
"bypass_failed": "繞過版本限制失敗: {error}",
"stack_trace": "堆疊跟踪",
"localappdata_not_found": "LOCALAPPDATA 環境變量未找到",
"product_json_not_found": "product.json 未在常見 Linux 路徑中找到",
"unsupported_os": "不支持的操作系統: {system}",
"file_not_found": "文件未找到: {path}",
"title": "Cursor 版本繞過工具",
"description": "此工具修改 Cursor 的 product.json 以繞過版本限制",
"menu_option": "繞過 Cursor 版本檢查"
},
"auth_check": {
"checking_authorization": "檢查授權...",
"token_source": "從資料庫獲取 token 或手動輸入d/m, 預設: d",
"getting_token_from_db": "從資料庫獲取 token...",
"token_found_in_db": "在資料庫中找到 token",
"token_not_found_in_db": "在資料庫中未找到 token",
"cursor_acc_info_not_found": "cursor_acc_info.py 未找到",
"usage_response_status": "使用情況響應狀態: {response}",
"unexpected_status_code": "意外狀態碼: {code}",
"jwt_token_warning": "token 似乎是 JWT 格式,但 API 檢查返回意外狀態碼。token 可能有效但 API 訪問受限。",
"error_getting_token_from_db": "從資料庫獲取 token 時出錯: {error}",
"enter_token": "請輸入您的 Cursor token: ",
"token_length": "token 長度: {length}",
"invalid_token": "無效的 token",
"user_authorized": "用戶已授權",
"user_unauthorized": "用戶未授權",
"request_timeout": "請求超時",
"connection_error": "連接錯誤",
"check_error": "檢查授權時出錯: {error}",
"authorization_successful": "授權成功",
"authorization_failed": "授權失敗",
"operation_cancelled": "操作已取消",
"unexpected_error": "意外錯誤: {error}",
"error_generating_checksum": "生成校驗和時出錯: {error}",
"checking_usage_information": "檢查使用情況...",
"check_usage_response": "檢查使用情況響應: {response}",
"usage_response": "使用情況響應: {response}"
},
"bypass_token_limit": {
"title": "繞過 Token 限制工具",
"description": "此工具修改 workbench.desktop.main.js 文件以繞過 token 限制",
"press_enter": "按回車鍵繼續..."
},
"restore": {
"title": "從備份恢復機器ID",
"starting": "正在啟動機器ID恢復進程",
"no_backups_found": "未找到備份文件",
"available_backups": "可用的備份文件",
"select_backup": "選擇要恢復的備份",
"to_cancel": "取消操作",
"operation_cancelled": "操作已取消",
"invalid_selection": "選擇無效",
"please_enter_number": "請輸入有效的數字",
"missing_id": "缺少ID: {id}",
"read_backup_failed": "讀取備份文件失敗: {error}",
"current_file_not_found": "未找到當前存儲文件",
"current_backup_created": "已創建當前存儲文件的備份",
"storage_updated": "存儲文件已成功更新",
"update_failed": "更新存儲文件失敗: {error}",
"sqlite_not_found": "未找到SQLite數據庫",
"updating_sqlite": "正在更新SQLite數據庫",
"updating_pair": "正在更新鍵值對",
"sqlite_updated": "SQLite數據庫已成功更新",
"sqlite_update_failed": "更新SQLite數據庫失敗: {error}",
"machine_id_backup_created": "已創建machineId文件的備份",
"backup_creation_failed": "創建備份失敗: {error}",
"machine_id_updated": "machineId文件已成功更新",
"machine_id_update_failed": "更新machineId文件失敗: {error}",
"updating_system_ids": "正在更新系統ID",
"system_ids_update_failed": "更新系統ID失敗: {error}",
"permission_denied": "權限被拒絕。請嘗試以管理員身份運行",
"windows_machine_guid_updated": "Windows機器GUID已成功更新",
"update_windows_machine_guid_failed": "更新Windows機器GUID失敗: {error}",
"windows_machine_id_updated": "Windows機器ID已成功更新",
"update_windows_machine_id_failed": "更新Windows機器ID失敗: {error}",
"sqm_client_key_not_found": "未找到SQMClient註冊表項",
"update_windows_system_ids_failed": "更新Windows系統ID失敗: {error}",
"macos_platform_uuid_updated": "macOS平台UUID已成功更新",
"failed_to_execute_plutil_command": "執行plutil命令失敗",
"update_macos_system_ids_failed": "更新macOS系統ID失敗: {error}",
"ids_to_restore": "要恢復的機器ID",
"confirm": "您確定要恢復這些ID嗎",
"success": "機器ID已成功恢復",
"process_error": "恢復過程錯誤: {error}",
"press_enter": "按Enter鍵繼續"
},
"browser_profile": {
"invalid_selection": "無效的選擇。請重試。",
"profile_list": "可用{瀏覽器}配置文件:",
"profile_selected": "選定的個人資料:{配置文件}",
"error_loading": "錯誤加載{瀏覽器} profiles{error}",
"default_profile": "默認配置文件",
"no_profiles": "找不到{瀏覽器}配置文件",
"select_profile": "選擇要使用的{瀏覽器}配置文件:",
"profile": "個人資料{數字}",
"title": "瀏覽器配置文件選擇"
},
"token": {
"refresh_failed": "令牌刷新失敗:{error}",
"refreshing": "刷新的代幣...",
"connection_error": "連接錯誤刷新服務器",
"refresh_success": "令牌成功刷新了!有效{天}天(到期:{expire}",
"extraction_error": "錯誤提取令牌:{error}",
"request_timeout": "要求刷新服務器的要求",
"unexpected_error": "令牌刷新期間的意外錯誤:{error}",
"server_error": "刷新服務器錯誤http {status}",
"no_access_token": "沒有訪問令牌",
"invalid_response": "刷新服務器的JSON響應無效"
},
"manual_auth": {
"proceed_prompt": "繼續? y/n",
"token_verification_skipped": "跳過令牌驗證Check_user_authorized.py找不到",
"auth_updated_successfully": "身份驗證信息成功更新了!",
"auth_type_google": "Google",
"continue_anyway": "無論如何繼續? y/n",
"auth_type_selected": "選定的身份驗證類型:{type}",
"auth_type_github": "github",
"token_required": "需要令牌",
"random_email_generated": "生成的隨機電子郵件:{電子郵件}",
"verifying_token": "驗證令牌有效性...",
"operation_cancelled": "操作取消了",
"error": "錯誤:{錯誤}",
"auth_type_prompt": "選擇身份驗證類型:",
"email_prompt": "輸入電子郵件(留空白以獲取隨機電子郵件):",
"auth_type_auth0": "auth_0默認",
"token_verification_error": "錯誤驗證令牌:{error}",
"token_verified": "令牌成功驗證了!",
"confirm_prompt": "請確認以下信息:",
"token_prompt": "輸入光標令牌access_token/refresh_token",
"invalid_token": "無效的令牌。身份驗證中止。",
"title": "手動Cursor身份驗證",
"updating_database": "更新Cursor身份驗證數據庫...",
"auth_update_failed": "無法更新身份驗證信息"
},
"tempmail": {
"general_error": "發生錯誤:{error}",
"config_error": "配置文件錯誤:{error}",
"no_email": "找不到Cursor驗證電子郵件",
"checking_email": "檢查Cursor驗證電子郵件...",
"extract_code_failed": "提取驗證代碼失敗:{error}",
"configured_email": "配置的電子郵件:{email}",
"no_code": "無法獲得驗證代碼",
"check_email_failed": "檢查電子郵件失敗:{error}",
"email_found": "找到Cursor驗證電子郵件",
"verification_code": "驗證代碼:{code}"
}
}

94
logo.py
View File

@ -1,39 +1,101 @@
from colorama import Fore, Style, init
from dotenv import load_dotenv
import os
import shutil
import re
# 獲取當前腳本所在目錄
# Get the current script directory
current_dir = os.path.dirname(os.path.abspath(__file__))
# 構建.env文件的完整路徑
# Build the full path to the .env file
env_path = os.path.join(current_dir, '.env')
# 加載環境變量,指定.env文件路徑
# Load environment variables, specifying the .env file path
load_dotenv(env_path)
# 獲取版本號,如果未找到則使用默認值
# Get the version number, using the default value if not found
version = os.getenv('VERSION', '1.0.0')
# 初始化 colorama
# Initialize colorama
init()
CURSOR_LOGO = f"""
{Fore.CYAN}
# get terminal width
def get_terminal_width():
try:
columns, _ = shutil.get_terminal_size()/2
return columns
except:
return 80 # default width
# center display text (not handling Chinese characters)
def center_multiline_text(text, handle_chinese=False):
width = get_terminal_width()
lines = text.split('\n')
centered_lines = []
for line in lines:
# calculate actual display width (remove ANSI color codes)
clean_line = line
for color in [Fore.CYAN, Fore.YELLOW, Fore.GREEN, Fore.RED, Fore.BLUE, Style.RESET_ALL]:
clean_line = clean_line.replace(color, '')
# remove all ANSI escape sequences to get the actual length
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
clean_line = ansi_escape.sub('', clean_line)
# calculate display width
if handle_chinese:
# consider Chinese characters occupying two positions
display_width = 0
for char in clean_line:
if ord(char) > 127: # non-ASCII characters
display_width += 2
else:
display_width += 1
else:
# not handling Chinese characters
display_width = len(clean_line)
# calculate the number of spaces to add
padding = max(0, (width - display_width) // 2)
centered_lines.append(' ' * padding + line)
return '\n'.join(centered_lines)
# original LOGO text
LOGO_TEXT = f"""{Fore.CYAN}
{Fore.YELLOW}
Pro Version Activator v{version}
{Fore.GREEN}
Author: Pin Studios | yeongpin
{Fore.RED}
Press 4 to change language | 按下 4 键切换语言
{Style.RESET_ALL}
"""
{Style.RESET_ALL}"""
DESCRIPTION_TEXT = f"""{Fore.YELLOW}
Pro Version Activator v{version}{Fore.GREEN}
Author: Pin Studios (yeongpin)"""
CONTRIBUTORS_TEXT = f"""{Fore.BLUE}
Contributors:
BasaiCorp aliensb handwerk2016 Nigel1992
UntaDotMy RenjiYuusei imbajin ahmed98Osama
bingoohuang mALIk-sHAHId MFaiqKhan httpmerak
muhammedfurkan plamkatawe Lucaszmv
"""
OTHER_INFO_TEXT = f"""{Fore.YELLOW}
Github: https://github.com/yeongpin/cursor-free-vip{Fore.RED}
Press 4 to change language | 按下 4 键切换语言{Style.RESET_ALL}"""
# center display LOGO and DESCRIPTION
CURSOR_LOGO = center_multiline_text(LOGO_TEXT, handle_chinese=False)
CURSOR_DESCRIPTION = center_multiline_text(DESCRIPTION_TEXT, handle_chinese=False)
CURSOR_CONTRIBUTORS = center_multiline_text(CONTRIBUTORS_TEXT, handle_chinese=False)
CURSOR_OTHER_INFO = center_multiline_text(OTHER_INFO_TEXT, handle_chinese=True)
def print_logo():
print(CURSOR_LOGO)
print(CURSOR_DESCRIPTION)
# print(CURSOR_CONTRIBUTORS)
print(CURSOR_OTHER_INFO)
if __name__ == "__main__":
print_logo()
print_logo()

806
main.py
View File

@ -3,13 +3,35 @@
import os
import sys
import json
from logo import print_logo
from logo import print_logo, version
from colorama import Fore, Style, init
import locale
import platform
import requests
import subprocess
from config import get_config, force_update_config
import shutil
import re
from utils import get_user_documents_path
# 初始化colorama
# Add these imports for Arabic support
try:
import arabic_reshaper
from bidi.algorithm import get_display
except ImportError:
arabic_reshaper = None
get_display = None
# Only import windll on Windows systems
if platform.system() == 'Windows':
import ctypes
# Only import windll on Windows systems
from ctypes import windll
# Initialize colorama
init()
# 定义emoji和颜色常量
# Define emoji and color constants
EMOJI = {
"FILE": "📄",
"BACKUP": "💾",
@ -19,125 +41,765 @@ EMOJI = {
"RESET": "🔄",
"MENU": "📋",
"ARROW": "",
"LANG": "🌐"
"LANG": "🌐",
"UPDATE": "🔄",
"ADMIN": "🔐",
"AIRDROP": "💰",
"ROCKET": "🚀",
"STAR": "",
"SUN": "🌟",
"CONTRIBUTE": "🤝",
"SETTINGS": "⚙️"
}
# Function to check if running as frozen executable
def is_frozen():
"""Check if the script is running as a frozen executable."""
return getattr(sys, 'frozen', False)
# Function to check admin privileges (Windows only)
def is_admin():
"""Check if the script is running with admin privileges (Windows only)."""
if platform.system() == 'Windows':
try:
return ctypes.windll.shell32.IsUserAnAdmin() != 0
except Exception:
return False
# Always return True for non-Windows to avoid changing behavior
return True
# Function to restart with admin privileges
def run_as_admin():
"""Restart the current script with admin privileges (Windows only)."""
if platform.system() != 'Windows':
return False
try:
args = [sys.executable] + sys.argv
# Request elevation via ShellExecute
print(f"{Fore.YELLOW}{EMOJI['ADMIN']} Requesting administrator privileges...{Style.RESET_ALL}")
ctypes.windll.shell32.ShellExecuteW(None, "runas", args[0], " ".join('"' + arg + '"' for arg in args[1:]), None, 1)
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to restart with admin privileges: {e}{Style.RESET_ALL}")
return False
class Translator:
def __init__(self):
self.current_language = 'zh_tw' # 默认语言
self.translations = {}
self.config = get_config()
# Create language cache directory if it doesn't exist
if self.config and self.config.has_section('Language'):
self.language_cache_dir = self.config.get('Language', 'language_cache_dir')
os.makedirs(self.language_cache_dir, exist_ok=True)
else:
self.language_cache_dir = None
# Set fallback language from config if available
self.fallback_language = 'en'
if self.config and self.config.has_section('Language') and self.config.has_option('Language', 'fallback_language'):
self.fallback_language = self.config.get('Language', 'fallback_language')
# Load saved language from config if available, otherwise detect system language
if self.config and self.config.has_section('Language') and self.config.has_option('Language', 'current_language'):
saved_language = self.config.get('Language', 'current_language')
if saved_language and saved_language.strip():
self.current_language = saved_language
else:
self.current_language = self.detect_system_language()
# Save detected language to config
if self.config.has_section('Language'):
self.config.set('Language', 'current_language', self.current_language)
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
with open(config_file, 'w', encoding='utf-8') as f:
self.config.write(f)
else:
self.current_language = self.detect_system_language()
self.load_translations()
def load_translations(self):
"""加载所有可用的翻译"""
locales_dir = os.path.join(os.path.dirname(__file__), 'locales')
if hasattr(sys, '_MEIPASS'):
locales_dir = os.path.join(sys._MEIPASS, 'locales')
def detect_system_language(self):
"""Detect system language and return corresponding language code"""
try:
system = platform.system()
for file in os.listdir(locales_dir):
if file.endswith('.json'):
lang_code = file[:-5] # 移除 .json
with open(os.path.join(locales_dir, file), 'r', encoding='utf-8') as f:
self.translations[lang_code] = json.load(f)
if system == 'Windows':
return self._detect_windows_language()
else:
return self._detect_unix_language()
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['INFO']} Failed to detect system language: {e}{Style.RESET_ALL}")
return 'en'
def _detect_windows_language(self):
"""Detect language on Windows systems"""
try:
# Ensure we are on Windows
if platform.system() != 'Windows':
return 'en'
# Get keyboard layout
user32 = ctypes.windll.user32
hwnd = user32.GetForegroundWindow()
threadid = user32.GetWindowThreadProcessId(hwnd, 0)
layout_id = user32.GetKeyboardLayout(threadid) & 0xFFFF
# Map language ID to our language codes using match-case
match layout_id:
case 0x0409:
return 'en' # English
case 0x0404:
return 'zh_tw' # Traditional Chinese
case 0x0804:
return 'zh_cn' # Simplified Chinese
case 0x0422:
return 'vi' # Vietnamese
case 0x0419:
return 'ru' # Russian
case 0x0415:
return 'tr' # Turkish
case 0x0402:
return 'bg' # Bulgarian
case 0x0401:
return 'ar' # Arabic
case _:
return 'en' # Default to English
except:
return self._detect_unix_language()
def _detect_unix_language(self):
"""Detect language on Unix-like systems (Linux, macOS)"""
try:
# Get the system locale
locale.setlocale(locale.LC_ALL, '')
system_locale = locale.getlocale()[0]
if not system_locale:
return 'en'
system_locale = system_locale.lower()
# Map locale to our language codes using match-case
match system_locale:
case s if s.startswith('zh_tw') or s.startswith('zh_hk'):
return 'zh_tw'
case s if s.startswith('zh_cn'):
return 'zh_cn'
case s if s.startswith('en'):
return 'en'
case s if s.startswith('vi'):
return 'vi'
case s if s.startswith('nl'):
return 'nl'
case s if s.startswith('de'):
return 'de'
case s if s.startswith('fr'):
return 'fr'
case s if s.startswith('pt'):
return 'pt'
case s if s.startswith('ru'):
return 'ru'
case s if s.startswith('tr'):
return 'tr'
case s if s.startswith('bg'):
return 'bg'
case s if s.startswith('ar'):
return 'ar'
case _:
# Try to get language from LANG environment variable as fallback
env_lang = os.getenv('LANG', '').lower()
match env_lang:
case s if 'tw' in s or 'hk' in s:
return 'zh_tw'
case s if 'cn' in s:
return 'zh_cn'
case s if 'vi' in s:
return 'vi'
case s if 'nl' in s:
return 'nl'
case s if 'de' in s:
return 'de'
case s if 'fr' in s:
return 'fr'
case s if 'pt' in s:
return 'pt'
case s if 'ru' in s:
return 'ru'
case s if 'tr' in s:
return 'tr'
case s if 'bg' in s:
return 'bg'
case s if 'ar' in s:
return 'ar'
case _:
return 'en'
except:
return 'en'
def download_language_file(self, lang_code):
"""Method kept for compatibility but now returns False as language files are integrated"""
print(f"{Fore.YELLOW}{EMOJI['INFO']} Languages are now integrated into the package, no need to download.{Style.RESET_ALL}")
return False
def load_translations(self):
"""Load all available translations from the integrated package"""
try:
# Collection of languages we've successfully loaded
loaded_languages = set()
locales_paths = []
# Check for PyInstaller bundle first
if hasattr(sys, '_MEIPASS'):
locales_paths.append(os.path.join(sys._MEIPASS, 'locales'))
# Check script directory next
script_dir = os.path.dirname(os.path.abspath(__file__))
locales_paths.append(os.path.join(script_dir, 'locales'))
# Also check current working directory
locales_paths.append(os.path.join(os.getcwd(), 'locales'))
for locales_dir in locales_paths:
if os.path.exists(locales_dir) and os.path.isdir(locales_dir):
for file in os.listdir(locales_dir):
if file.endswith('.json'):
lang_code = file[:-5] # Remove .json
try:
with open(os.path.join(locales_dir, file), 'r', encoding='utf-8') as f:
self.translations[lang_code] = json.load(f)
loaded_languages.add(lang_code)
loaded_any = True
except (json.JSONDecodeError, UnicodeDecodeError) as e:
print(f"{Fore.RED}{EMOJI['ERROR']} Error loading {file}: {e}{Style.RESET_ALL}")
continue
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to load translations: {e}{Style.RESET_ALL}")
# Create at least minimal English translations for basic functionality
self.translations['en'] = {"menu": {"title": "Menu", "exit": "Exit", "invalid_choice": "Invalid choice"}}
def fix_arabic(self, text):
if self.current_language == 'ar' and arabic_reshaper and get_display:
try:
reshaped_text = arabic_reshaper.reshape(text)
bidi_text = get_display(reshaped_text)
return bidi_text
except Exception:
return text
return text
def get(self, key, **kwargs):
"""获取翻译文本"""
"""Get translated text with fallback support"""
try:
# Try current language
result = self._get_translation(self.current_language, key)
if result == key and self.current_language != self.fallback_language:
# Try fallback language if translation not found
result = self._get_translation(self.fallback_language, key)
formatted = result.format(**kwargs) if kwargs else result
return self.fix_arabic(formatted)
except Exception:
return key
def _get_translation(self, lang_code, key):
"""Get translation for a specific language"""
try:
keys = key.split('.')
value = self.translations.get(self.current_language, {})
value = self.translations.get(lang_code, {})
for k in keys:
if isinstance(value, dict):
value = value.get(k, key)
else:
return key # 如果中間值不是字典返回原始key
return value.format(**kwargs) if kwargs else value
return key
return value
except Exception:
return key # 出現任何錯誤時返回原始key
return key
def set_language(self, lang_code):
"""设置当前语言"""
"""Set current language with validation"""
if lang_code in self.translations:
self.current_language = lang_code
return True
return False
# 创建翻译器实例
def get_available_languages(self):
"""Get list of available languages"""
# Get currently loaded languages
available_languages = list(self.translations.keys())
# Sort languages alphabetically for better display
return sorted(available_languages)
# Create translator instance
translator = Translator()
def print_menu():
"""打印菜单选项"""
"""Print menu options"""
try:
config = get_config()
if config.getboolean('Utils', 'enabled_account_info'):
import cursor_acc_info
cursor_acc_info.display_account_info(translator)
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('menu.account_info_error', error=str(e))}{Style.RESET_ALL}")
print(f"\n{Fore.CYAN}{EMOJI['MENU']} {translator.get('menu.title')}:{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{'' * 40}{Style.RESET_ALL}")
print(f"{Fore.GREEN}0{Style.RESET_ALL}. {EMOJI['ERROR']} {translator.get('menu.exit')}")
print(f"{Fore.GREEN}1{Style.RESET_ALL}. {EMOJI['RESET']} {translator.get('menu.reset')}")
print(f"{Fore.GREEN}2{Style.RESET_ALL}. {EMOJI['SUCCESS']} {translator.get('menu.register')}")
print(f"{Fore.GREEN}3{Style.RESET_ALL}. {EMOJI['ERROR']} {translator.get('menu.quit')}")
print(f"{Fore.GREEN}4{Style.RESET_ALL}. {EMOJI['LANG']} {translator.get('menu.select_language')}")
print(f"{Fore.YELLOW}{'' * 40}{Style.RESET_ALL}")
if translator.current_language == 'zh_cn' or translator.current_language == 'zh_tw':
print(f"{Fore.YELLOW}{'' * 70}{Style.RESET_ALL}")
else:
print(f"{Fore.YELLOW}{'' * 110}{Style.RESET_ALL}")
# Get terminal width
try:
terminal_width = shutil.get_terminal_size().columns
except:
terminal_width = 80 # Default width
# Define all menu items
menu_items = {
0: f"{Fore.GREEN}0{Style.RESET_ALL}. {EMOJI['ERROR']} {translator.get('menu.exit')}",
1: f"{Fore.GREEN}1{Style.RESET_ALL}. {EMOJI['RESET']} {translator.get('menu.reset')}",
2: f"{Fore.GREEN}2{Style.RESET_ALL}. {EMOJI['SUCCESS']} {translator.get('menu.register_manual')}",
3: f"{Fore.GREEN}3{Style.RESET_ALL}. {EMOJI['ERROR']} {translator.get('menu.quit')}",
4: f"{Fore.GREEN}4{Style.RESET_ALL}. {EMOJI['LANG']} {translator.get('menu.select_language')}",
5: f"{Fore.GREEN}5{Style.RESET_ALL}. {EMOJI['SUN']} {translator.get('menu.register_google')}",
6: f"{Fore.GREEN}6{Style.RESET_ALL}. {EMOJI['STAR']} {translator.get('menu.register_github')}",
7: f"{Fore.GREEN}7{Style.RESET_ALL}. {EMOJI['UPDATE']} {translator.get('menu.disable_auto_update')}",
8: f"{Fore.GREEN}8{Style.RESET_ALL}. {EMOJI['RESET']} {translator.get('menu.totally_reset')}",
9: f"{Fore.GREEN}9{Style.RESET_ALL}. {EMOJI['CONTRIBUTE']} {translator.get('menu.contribute')}",
10: f"{Fore.GREEN}10{Style.RESET_ALL}. {EMOJI['SETTINGS']} {translator.get('menu.config')}",
11: f"{Fore.GREEN}11{Style.RESET_ALL}. {EMOJI['UPDATE']} {translator.get('menu.bypass_version_check')}",
12: f"{Fore.GREEN}12{Style.RESET_ALL}. {EMOJI['UPDATE']} {translator.get('menu.check_user_authorized')}",
13: f"{Fore.GREEN}13{Style.RESET_ALL}. {EMOJI['UPDATE']} {translator.get('menu.bypass_token_limit')}",
14: f"{Fore.GREEN}14{Style.RESET_ALL}. {EMOJI['BACKUP']} {translator.get('menu.restore_machine_id')}",
15: f"{Fore.GREEN}15{Style.RESET_ALL}. {EMOJI['ERROR']} {translator.get('menu.delete_google_account')}",
16: f"{Fore.GREEN}16{Style.RESET_ALL}. {EMOJI['SETTINGS']} {translator.get('menu.select_chrome_profile')}",
17: f"{Fore.GREEN}17{Style.RESET_ALL}. {EMOJI['UPDATE']} {translator.get('menu.manual_custom_auth')}"
}
# Automatically calculate the number of menu items in the left and right columns
total_items = len(menu_items)
left_column_count = (total_items + 1) // 2 # The number of options displayed on the left (rounded up)
# Build left and right columns of menus
sorted_indices = sorted(menu_items.keys())
left_menu = [menu_items[i] for i in sorted_indices[:left_column_count]]
right_menu = [menu_items[i] for i in sorted_indices[left_column_count:]]
# Calculate the maximum display width of left menu items
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
def get_display_width(s):
"""Calculate the display width of a string, considering Chinese characters and emojis"""
# Remove ANSI color codes
clean_s = ansi_escape.sub('', s)
width = 0
for c in clean_s:
# Chinese characters and some emojis occupy two character widths
if ord(c) > 127:
width += 2
else:
width += 1
return width
max_left_width = 0
for item in left_menu:
width = get_display_width(item)
max_left_width = max(max_left_width, width)
# Set the starting position of right menu
fixed_spacing = 4 # Fixed spacing
right_start = max_left_width + fixed_spacing
# Calculate the number of spaces needed for right menu items
spaces_list = []
for i in range(len(left_menu)):
if i < len(left_menu):
left_item = left_menu[i]
left_width = get_display_width(left_item)
spaces = right_start - left_width
spaces_list.append(spaces)
# Print menu items
max_rows = max(len(left_menu), len(right_menu))
for i in range(max_rows):
# Print left menu items
if i < len(left_menu):
left_item = left_menu[i]
print(left_item, end='')
# Use pre-calculated spaces
spaces = spaces_list[i]
else:
# If left side has no items, print only spaces
spaces = right_start
print('', end='')
# Print right menu items
if i < len(right_menu):
print(' ' * spaces + right_menu[i])
else:
print() # Change line
if translator.current_language == 'zh_cn' or translator.current_language == 'zh_tw':
print(f"{Fore.YELLOW}{'' * 70}{Style.RESET_ALL}")
else:
print(f"{Fore.YELLOW}{'' * 110}{Style.RESET_ALL}")
def select_language():
"""语言选择菜单"""
"""Language selection menu"""
print(f"\n{Fore.CYAN}{EMOJI['LANG']} {translator.get('menu.select_language')}:{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{'' * 40}{Style.RESET_ALL}")
languages = translator.get('languages')
for i, (code, name) in enumerate(languages.items()):
print(f"{Fore.GREEN}{i}{Style.RESET_ALL}. {name}")
# Get available languages either from local directory or GitHub
languages = translator.get_available_languages()
languages_count = len(languages)
# Display all available languages with proper indices
for i, lang in enumerate(languages):
lang_name = translator.get(f"languages.{lang}", fallback=lang)
print(f"{Fore.GREEN}{i}{Style.RESET_ALL}. {lang_name}")
try:
choice = input(f"\n{EMOJI['ARROW']} {Fore.CYAN}{translator.get('menu.input_choice', choices='0-' + str(len(languages)-1))}: {Style.RESET_ALL}")
if choice.isdigit() and 0 <= int(choice) < len(languages):
lang_code = list(languages.keys())[int(choice)]
translator.set_language(lang_code)
# Use the actual number of languages in the prompt
choice = input(f"\n{EMOJI['ARROW']} {Fore.CYAN}{translator.get('menu.input_choice', choices=f'0-{languages_count-1}')}: {Style.RESET_ALL}")
if choice.isdigit() and 0 <= int(choice) < languages_count:
selected_language = languages[int(choice)]
translator.set_language(selected_language)
# Save selected language to config
config = get_config()
if config and config.has_section('Language'):
config.set('Language', 'current_language', selected_language)
# Get config path from user documents
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
# Write updated config
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('menu.language_config_saved', language=translator.get(f'languages.{selected_language}', fallback=selected_language))}{Style.RESET_ALL}")
return True
except (ValueError, IndexError):
pass
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.invalid_choice')}{Style.RESET_ALL}")
return False
else:
# Show invalid choice message with the correct range
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.lang_invalid_choice', lang_choices=f'0-{languages_count-1}')}{Style.RESET_ALL}")
return False
except (ValueError, IndexError) as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.lang_invalid_choice', lang_choices=f'0-{languages_count-1}')}{Style.RESET_ALL}")
return False
def check_latest_version():
"""Check if current version matches the latest release version"""
try:
print(f"\n{Fore.CYAN}{EMOJI['UPDATE']} {translator.get('updater.checking')}{Style.RESET_ALL}")
# First try GitHub API
headers = {
'Accept': 'application/vnd.github.v3+json',
'User-Agent': 'CursorFreeVIP-Updater'
}
latest_version = None
github_error = None
# Try GitHub API first
try:
github_response = requests.get(
"https://api.github.com/repos/yeongpin/cursor-free-vip/releases/latest",
headers=headers,
timeout=10
)
# Check if rate limit exceeded
if github_response.status_code == 403 and "rate limit exceeded" in github_response.text.lower():
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('updater.rate_limit_exceeded', fallback='GitHub API rate limit exceeded. Trying backup API...')}{Style.RESET_ALL}")
raise Exception("Rate limit exceeded")
# Check if response is successful
if github_response.status_code != 200:
raise Exception(f"GitHub API returned status code {github_response.status_code}")
github_data = github_response.json()
if "tag_name" not in github_data:
raise Exception("No version tag found in GitHub response")
latest_version = github_data["tag_name"].lstrip('v')
except Exception as e:
github_error = str(e)
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('updater.github_api_failed', fallback='GitHub API failed, trying backup API...')}{Style.RESET_ALL}")
# If GitHub API fails, try backup API
try:
backup_headers = {
'Accept': 'application/json',
'User-Agent': 'CursorFreeVIP-Updater'
}
backup_response = requests.get(
"https://pinnumber.rr.nu/badges/release/yeongpin/cursor-free-vip",
headers=backup_headers,
timeout=10
)
# Check if response is successful
if backup_response.status_code != 200:
raise Exception(f"Backup API returned status code {backup_response.status_code}")
backup_data = backup_response.json()
if "message" not in backup_data:
raise Exception("No version tag found in backup API response")
latest_version = backup_data["message"].lstrip('v')
except Exception as backup_e:
# If both APIs fail, raise the original GitHub error
raise Exception(f"Both APIs failed. GitHub error: {github_error}, Backup error: {str(backup_e)}")
# Validate version format
if not latest_version:
raise Exception("Invalid version format received")
# Parse versions for proper comparison
def parse_version(version_str):
"""Parse version string into tuple for proper comparison"""
try:
return tuple(map(int, version_str.split('.')))
except ValueError:
# Fallback to string comparison if parsing fails
return version_str
current_version_tuple = parse_version(version)
latest_version_tuple = parse_version(latest_version)
# Compare versions properly
is_newer_version_available = False
if isinstance(current_version_tuple, tuple) and isinstance(latest_version_tuple, tuple):
is_newer_version_available = current_version_tuple < latest_version_tuple
else:
# Fallback to string comparison
is_newer_version_available = version != latest_version
if is_newer_version_available:
print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('updater.new_version_available', current=version, latest=latest_version)}{Style.RESET_ALL}")
# get and show changelog
try:
changelog_url = "https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/CHANGELOG.md"
changelog_response = requests.get(changelog_url, timeout=10)
if changelog_response.status_code == 200:
changelog_content = changelog_response.text
# get latest version changelog
latest_version_pattern = f"## v{latest_version}"
changelog_sections = changelog_content.split("## v")
latest_changes = None
for section in changelog_sections:
if section.startswith(latest_version):
latest_changes = section
break
if latest_changes:
print(f"\n{Fore.CYAN}{'' * 40}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{translator.get('updater.changelog_title')}:{Style.RESET_ALL}")
# show changelog content (max 10 lines)
changes_lines = latest_changes.strip().split('\n')
for i, line in enumerate(changes_lines[1:11]): # skip version number line, max 10 lines
if line.strip():
print(f"{Fore.WHITE}{line.strip()}{Style.RESET_ALL}")
# if changelog more than 10 lines, show ellipsis
if len(changes_lines) > 11:
print(f"{Fore.WHITE}...{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'' * 40}{Style.RESET_ALL}")
except Exception as changelog_error:
# get changelog failed
pass
# Ask user if they want to update
while True:
choice = input(f"\n{EMOJI['ARROW']} {Fore.CYAN}{translator.get('updater.update_confirm', choices='Y/n')}: {Style.RESET_ALL}").lower()
if choice in ['', 'y', 'yes']:
break
elif choice in ['n', 'no']:
print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('updater.update_skipped')}{Style.RESET_ALL}")
return
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.invalid_choice')}{Style.RESET_ALL}")
try:
# Execute update command based on platform
if platform.system() == 'Windows':
update_command = 'irm https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/scripts/install.ps1 | iex'
subprocess.run(['powershell', '-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', update_command], check=True)
else:
# For Linux/Mac, download and execute the install script
install_script_url = 'https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/scripts/install.sh'
# First verify the script exists
script_response = requests.get(install_script_url, timeout=5)
if script_response.status_code != 200:
raise Exception("Installation script not found")
# Save and execute the script
with open('install.sh', 'wb') as f:
f.write(script_response.content)
os.chmod('install.sh', 0o755) # Make executable
subprocess.run(['./install.sh'], check=True)
# Clean up
if os.path.exists('install.sh'):
os.remove('install.sh')
print(f"\n{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('updater.updating')}{Style.RESET_ALL}")
sys.exit(0)
except Exception as update_error:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('updater.update_failed', error=str(update_error))}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('updater.manual_update_required')}{Style.RESET_ALL}")
return
else:
# If current version is newer or equal to latest version
if current_version_tuple > latest_version_tuple:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('updater.development_version', current=version, latest=latest_version)}{Style.RESET_ALL}")
else:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('updater.up_to_date')}{Style.RESET_ALL}")
except requests.exceptions.RequestException as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('updater.network_error', error=str(e))}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('updater.continue_anyway')}{Style.RESET_ALL}")
return
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('updater.check_failed', error=str(e))}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('updater.continue_anyway')}{Style.RESET_ALL}")
return
def main():
# Check for admin privileges if running as executable on Windows only
if platform.system() == 'Windows' and is_frozen() and not is_admin():
print(f"{Fore.YELLOW}{EMOJI['ADMIN']} {translator.get('menu.admin_required')}{Style.RESET_ALL}")
if run_as_admin():
sys.exit(0) # Exit after requesting admin privileges
else:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('menu.admin_required_continue')}{Style.RESET_ALL}")
print_logo()
# Initialize configuration
config = get_config(translator)
if not config:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.config_init_failed')}{Style.RESET_ALL}")
return
force_update_config(translator)
if config.getboolean('Utils', 'enabled_update_check'):
check_latest_version() # Add version check before showing menu
print_menu()
while True:
try:
choice = input(f"\n{EMOJI['ARROW']} {Fore.CYAN}{translator.get('menu.input_choice', choices='0-4')}: {Style.RESET_ALL}")
choice_num = 17
choice = input(f"\n{EMOJI['ARROW']} {Fore.CYAN}{translator.get('menu.input_choice', choices=f'0-{choice_num}')}: {Style.RESET_ALL}")
if choice == "0":
print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('menu.exit')}...{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'' * 50}{Style.RESET_ALL}")
return
elif choice == "1":
import reset_machine_manual
reset_machine_manual.run(translator)
break
elif choice == "2":
import cursor_register
cursor_register.main(translator)
break
elif choice == "3":
import quit_cursor
quit_cursor.quit_cursor(translator)
break
elif choice == "4":
if select_language():
match choice:
case "0":
print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('menu.exit')}...{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'' * 50}{Style.RESET_ALL}")
return
case "1":
import reset_machine_manual
reset_machine_manual.run(translator)
print_menu()
case "2":
import cursor_register_manual
cursor_register_manual.main(translator)
print_menu()
case "3":
import quit_cursor
quit_cursor.quit_cursor(translator)
print_menu()
case "4":
if select_language():
print_menu()
continue
case "5":
from oauth_auth import main as oauth_main
oauth_main('google',translator)
print_menu()
case "6":
from oauth_auth import main as oauth_main
oauth_main('github',translator)
print_menu()
case "7":
import disable_auto_update
disable_auto_update.run(translator)
print_menu()
case "8":
import totally_reset_cursor
totally_reset_cursor.run(translator)
# print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('menu.fixed_soon')}{Style.RESET_ALL}")
print_menu()
case "9":
import logo
print(logo.CURSOR_CONTRIBUTORS)
print_menu()
case "10":
from config import print_config
print_config(get_config(), translator)
print_menu()
case "11":
import bypass_version
bypass_version.main(translator)
print_menu()
case "12":
import check_user_authorized
check_user_authorized.main(translator)
print_menu()
case "13":
import bypass_token_limit
bypass_token_limit.run(translator)
print_menu()
case "14":
import restore_machine_id
restore_machine_id.run(translator)
print_menu()
case "15":
import delete_cursor_google
delete_cursor_google.main(translator)
print_menu()
case "16":
from oauth_auth import OAuthHandler
oauth = OAuthHandler(translator)
oauth._select_profile()
print_menu()
case "17":
import manual_custom_auth
manual_custom_auth.main(translator)
print_menu()
case _:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.invalid_choice')}{Style.RESET_ALL}")
print_menu()
continue
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.invalid_choice')}{Style.RESET_ALL}")
print_menu()
except KeyboardInterrupt:
print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('menu.program_terminated')}{Style.RESET_ALL}")
print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('menu.program_terminated')}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'' * 50}{Style.RESET_ALL}")
return
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.error_occurred', error=str(e))}{Style.RESET_ALL}")
break
print(f"\n{Fore.CYAN}{'' * 50}{Style.RESET_ALL}")
input(f"{EMOJI['INFO']} {translator.get('menu.press_enter')}...{Style.RESET_ALL}")
print_menu()
if __name__ == "__main__":
main()
main()

132
manual_custom_auth.py Normal file
View File

@ -0,0 +1,132 @@
"""
Manual Custom Auth for Cursor AI
This script allows users to manually input access token and email to authenticate with Cursor AI.
"""
import os
import sys
import random
import string
from colorama import Fore, Style, init
from cursor_auth import CursorAuth
# Initialize colorama
init(autoreset=True)
# Define emoji and color constants
EMOJI = {
'DB': '🗄️',
'UPDATE': '🔄',
'SUCCESS': '',
'ERROR': '',
'WARN': '⚠️',
'INFO': '',
'FILE': '📄',
'KEY': '🔐'
}
def generate_random_email():
"""Generate a random Cursor email address"""
random_string = ''.join(random.choices(string.ascii_lowercase + string.digits, k=8))
return f"cursor_{random_string}@cursor.ai"
def main(translator=None):
"""Main function to handle manual authentication"""
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
print(f"{Fore.CYAN}Manual Cursor Authentication{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
# Get token from user
print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('manual_auth.token_prompt') if translator else 'Enter your Cursor token (access_token/refresh_token):'}{Style.RESET_ALL}")
token = input(f"{Fore.CYAN}> {Style.RESET_ALL}").strip()
if not token:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('manual_auth.token_required') if translator else 'Token is required'}{Style.RESET_ALL}")
return False
# Verify token validity
try:
from check_user_authorized import check_user_authorized
print(f"\n{Fore.CYAN}{EMOJI['INFO']} {translator.get('manual_auth.verifying_token') if translator else 'Verifying token validity...'}{Style.RESET_ALL}")
is_valid = check_user_authorized(token, translator)
if not is_valid:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('manual_auth.invalid_token') if translator else 'Invalid token. Authentication aborted.'}{Style.RESET_ALL}")
return False
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('manual_auth.token_verified') if translator else 'Token verified successfully!'}{Style.RESET_ALL}")
except ImportError:
print(f"{Fore.YELLOW}{EMOJI['WARN']} {translator.get('manual_auth.token_verification_skipped') if translator else 'Token verification skipped (check_user_authorized.py not found)'}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['WARN']} {translator.get('manual_auth.token_verification_error', error=str(e)) if translator else f'Error verifying token: {str(e)}'}{Style.RESET_ALL}")
# Ask user if they want to continue despite verification error
continue_anyway = input(f"{Fore.YELLOW}{translator.get('manual_auth.continue_anyway') if translator else 'Continue anyway? (y/N): '}{Style.RESET_ALL}").strip().lower()
if continue_anyway not in ["y", "yes"]:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('manual_auth.operation_cancelled') if translator else 'Operation cancelled'}{Style.RESET_ALL}")
return False
# Get email (or generate random one)
print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('manual_auth.email_prompt') if translator else 'Enter email (leave blank for random email):'}{Style.RESET_ALL}")
email = input(f"{Fore.CYAN}> {Style.RESET_ALL}").strip()
if not email:
email = generate_random_email()
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('manual_auth.random_email_generated', email=email) if translator else f'Random email generated: {email}'}{Style.RESET_ALL}")
# Get auth type
print(f"\n{Fore.YELLOW}{EMOJI['INFO']} {translator.get('manual_auth.auth_type_prompt') if translator else 'Select authentication type:'}{Style.RESET_ALL}")
print(f"{Fore.CYAN}1. {translator.get('manual_auth.auth_type_auth0') if translator else 'Auth_0 (Default)'}{Style.RESET_ALL}")
print(f"{Fore.CYAN}2. {translator.get('manual_auth.auth_type_google') if translator else 'Google'}{Style.RESET_ALL}")
print(f"{Fore.CYAN}3. {translator.get('manual_auth.auth_type_github') if translator else 'GitHub'}{Style.RESET_ALL}")
auth_choice = input(f"{Fore.CYAN}> {Style.RESET_ALL}").strip()
if auth_choice == "2":
auth_type = "Google"
elif auth_choice == "3":
auth_type = "GitHub"
else:
auth_type = "Auth_0"
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('manual_auth.auth_type_selected', type=auth_type) if translator else f'Selected authentication type: {auth_type}'}{Style.RESET_ALL}")
# Confirm before proceeding
print(f"\n{Fore.YELLOW}{EMOJI['WARN']} {translator.get('manual_auth.confirm_prompt') if translator else 'Please confirm the following information:'}{Style.RESET_ALL}")
print(f"{Fore.CYAN}Token: {token[:10]}...{token[-10:] if len(token) > 20 else token[10:]}{Style.RESET_ALL}")
print(f"{Fore.CYAN}Email: {email}{Style.RESET_ALL}")
print(f"{Fore.CYAN}Auth Type: {auth_type}{Style.RESET_ALL}")
confirm = input(f"\n{Fore.YELLOW}{translator.get('manual_auth.proceed_prompt') if translator else 'Proceed? (y/N): '}{Style.RESET_ALL}").strip().lower()
if confirm not in ["y", "yes"]:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('manual_auth.operation_cancelled') if translator else 'Operation cancelled'}{Style.RESET_ALL}")
return False
# Initialize CursorAuth and update the database
print(f"\n{Fore.CYAN}{EMOJI['UPDATE']} {translator.get('manual_auth.updating_database') if translator else 'Updating Cursor authentication database...'}{Style.RESET_ALL}")
try:
cursor_auth = CursorAuth(translator)
result = cursor_auth.update_auth(
email=email,
access_token=token,
refresh_token=token,
auth_type=auth_type
)
if result:
print(f"\n{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('manual_auth.auth_updated_successfully') if translator else 'Authentication information updated successfully!'}{Style.RESET_ALL}")
return True
else:
print(f"\n{Fore.RED}{EMOJI['ERROR']} {translator.get('manual_auth.auth_update_failed') if translator else 'Failed to update authentication information'}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"\n{Fore.RED}{EMOJI['ERROR']} {translator.get('manual_auth.error', error=str(e)) if translator else f'Error: {str(e)}'}{Style.RESET_ALL}")
return False
if __name__ == "__main__":
# force to run with None
main(None)

View File

@ -4,20 +4,41 @@ import os
import signal
import random
from colorama import Fore, Style
import configparser
from pathlib import Path
import sys
from config import get_config
from utils import get_default_browser_path as utils_get_default_browser_path
# 在文件开头添加全局变量
# Add global variable at the beginning of the file
_translator = None
# Add global variable to track our Chrome processes
_chrome_process_ids = []
def cleanup_chrome_processes(translator=None):
"""清理所有Chrome相关进程"""
print("\n正在清理Chrome进程...")
"""Clean only Chrome processes launched by this script"""
global _chrome_process_ids
if not _chrome_process_ids:
print("\nNo Chrome processes to clean...")
return
print("\nCleaning Chrome processes launched by this script...")
try:
if os.name == 'nt':
os.system('taskkill /F /IM chrome.exe /T 2>nul')
os.system('taskkill /F /IM chromedriver.exe /T 2>nul')
for pid in _chrome_process_ids:
try:
os.system(f'taskkill /F /PID {pid} /T 2>nul')
except:
pass
else:
os.system('pkill -f chrome')
os.system('pkill -f chromedriver')
for pid in _chrome_process_ids:
try:
os.kill(pid, signal.SIGTERM)
except:
pass
_chrome_process_ids = [] # Reset the list after cleanup
except Exception as e:
if translator:
print(f"{Fore.RED}{translator.get('register.cleanup_error', error=str(e))}{Style.RESET_ALL}")
@ -25,7 +46,7 @@ def cleanup_chrome_processes(translator=None):
print(f"清理进程时出错: {e}")
def signal_handler(signum, frame):
"""处理Ctrl+C信号"""
"""Handle Ctrl+C signal"""
global _translator
if _translator:
print(f"{Fore.CYAN}{_translator.get('register.exit_signal')}{Style.RESET_ALL}")
@ -34,107 +55,240 @@ def signal_handler(signum, frame):
cleanup_chrome_processes(_translator)
os._exit(0)
def simulate_human_input(page, url, translator=None):
"""访问网址"""
def simulate_human_input(page, url, config, translator=None):
"""Visit URL"""
if translator:
print(f"{Fore.CYAN}🚀 {translator.get('register.visiting_url')}: {url}{Style.RESET_ALL}")
else:
print("正在访问网址...")
# 先访问空白页面
# First visit blank page
page.get('about:blank')
time.sleep(random.uniform(1.0, 2.0))
time.sleep(get_random_wait_time(config, 'page_load_wait'))
# 访问目标页面
# Visit target page
page.get(url)
time.sleep(random.uniform(2.0, 3.0)) # 等待页面加载
time.sleep(get_random_wait_time(config, 'page_load_wait'))
def fill_signup_form(page, first_name, last_name, email, translator=None):
"""填写注册表单"""
def fill_signup_form(page, first_name, last_name, email, config, translator=None):
"""Fill signup form"""
try:
if translator:
print(f"{Fore.CYAN}📧 {translator.get('register.filling_form')}{Style.RESET_ALL}")
else:
print("\n正在填写注册表单...")
# 填写名字
# Fill first name
first_name_input = page.ele("@name=first_name")
if first_name_input:
first_name_input.input(first_name)
time.sleep(random.uniform(0.5, 1.0))
time.sleep(get_random_wait_time(config, 'input_wait'))
# 填写姓氏
# Fill last name
last_name_input = page.ele("@name=last_name")
if last_name_input:
last_name_input.input(last_name)
time.sleep(random.uniform(0.5, 1.0))
time.sleep(get_random_wait_time(config, 'input_wait'))
# 填写邮箱
# Fill email
email_input = page.ele("@name=email")
if email_input:
email_input.input(email)
time.sleep(random.uniform(0.5, 1.0))
time.sleep(get_random_wait_time(config, 'input_wait'))
# 点击提交按钮
# Click submit button
submit_button = page.ele("@type=submit")
if submit_button:
submit_button.click()
time.sleep(random.uniform(2.0, 3.0))
time.sleep(get_random_wait_time(config, 'submit_wait'))
if translator:
print(f"{Fore.GREEN}{translator.get('register.form_success')}{Style.RESET_ALL}")
else:
print("表单填写完成")
print("Form filled successfully")
return True
except Exception as e:
if translator:
print(f"{Fore.RED}{translator.get('register.form_error', error=str(e))}{Style.RESET_ALL}")
else:
print(f"填写表单时出错: {e}")
print(f"Error filling form: {e}")
return False
def get_user_documents_path():
"""Get user Documents folder path"""
if sys.platform == "win32":
try:
import winreg
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders") as key:
documents_path, _ = winreg.QueryValueEx(key, "Personal")
return documents_path
except Exception as e:
# fallback
return os.path.join(os.path.expanduser("~"), "Documents")
elif sys.platform == "darwin":
return os.path.join(os.path.expanduser("~"), "Documents")
else: # Linux
# Get actual user's home directory
sudo_user = os.environ.get('SUDO_USER')
if sudo_user:
return os.path.join("/home", sudo_user, "Documents")
return os.path.join(os.path.expanduser("~"), "Documents")
def get_random_wait_time(config, timing_type='page_load_wait'):
"""
Get random wait time from config
Args:
config: ConfigParser object
timing_type: Type of timing to get (page_load_wait, input_wait, submit_wait)
Returns:
float: Random wait time or fixed time
"""
try:
if not config.has_section('Timing'):
return random.uniform(0.1, 0.8) # Default value
if timing_type == 'random':
min_time = float(config.get('Timing', 'min_random_time', fallback='0.1'))
max_time = float(config.get('Timing', 'max_random_time', fallback='0.8'))
return random.uniform(min_time, max_time)
time_value = config.get('Timing', timing_type, fallback='0.1-0.8')
# Check if it's a fixed time value
if '-' not in time_value and ',' not in time_value:
return float(time_value) # Return fixed time
# Process range time
min_time, max_time = map(float, time_value.split('-' if '-' in time_value else ','))
return random.uniform(min_time, max_time)
except:
return random.uniform(0.1, 0.8) # Return default value when error
def setup_driver(translator=None):
"""设置浏览器驱动"""
co = ChromiumOptions()
# 使用无痕模式
co.set_argument("--incognito")
co.set_argument("--headless=new")
# 设置随机端口
co.auto_port()
# 使用有头模式
co.headless(False)
"""Setup browser driver"""
global _chrome_process_ids
try:
# 加载插件
extension_path = os.path.join(os.getcwd(), "turnstilePatch")
if os.path.exists(extension_path):
co.set_argument("--allow-extensions-in-incognito")
co.add_extension(extension_path)
# Get config
config = get_config(translator)
# Get browser type and path
browser_type = config.get('Browser', 'default_browser', fallback='chrome')
browser_path = config.get('Browser', f'{browser_type}_path', fallback=utils_get_default_browser_path(browser_type))
if not browser_path or not os.path.exists(browser_path):
if translator:
print(f"{Fore.YELLOW}⚠️ {browser_type} {translator.get('register.browser_path_invalid')}{Style.RESET_ALL}")
browser_path = utils_get_default_browser_path(browser_type)
# For backward compatibility, also check Chrome path
if browser_type == 'chrome':
chrome_path = config.get('Chrome', 'chromepath', fallback=None)
if chrome_path and os.path.exists(chrome_path):
browser_path = chrome_path
# Set browser options
co = ChromiumOptions()
# Set browser path
co.set_browser_path(browser_path)
# Use incognito mode
co.set_argument("--incognito")
if sys.platform == "linux":
# Set Linux specific options
co.set_argument("--no-sandbox")
# Set random port
co.auto_port()
# Use headless mode (must be set to False, simulate human operation)
co.headless(False)
# Log browser info
if translator:
print(f"{Fore.CYAN}🌐 {translator.get('register.using_browser', browser=browser_type, path=browser_path)}{Style.RESET_ALL}")
try:
# Load extension
extension_path = os.path.join(os.getcwd(), "turnstilePatch")
if os.path.exists(extension_path):
co.set_argument("--allow-extensions-in-incognito")
co.add_extension(extension_path)
except Exception as e:
if translator:
print(f"{Fore.RED}{translator.get('register.extension_load_error', error=str(e))}{Style.RESET_ALL}")
else:
print(f"Error loading extension: {e}")
if translator:
print(f"{Fore.CYAN}🚀 {translator.get('register.starting_browser')}{Style.RESET_ALL}")
else:
print("Starting browser...")
# Record Chrome processes before launching
before_pids = []
try:
import psutil
browser_process_names = {
'chrome': ['chrome', 'chromium'],
'edge': ['msedge', 'edge'],
'firefox': ['firefox'],
'brave': ['brave', 'brave-browser']
}
process_names = browser_process_names.get(browser_type, ['chrome'])
before_pids = [p.pid for p in psutil.process_iter() if any(name in p.name().lower() for name in process_names)]
except:
pass
# Launch browser
page = ChromiumPage(co)
# Wait a moment for browser to fully launch
time.sleep(1)
# Record browser processes after launching and find new ones
try:
import psutil
process_names = browser_process_names.get(browser_type, ['chrome'])
after_pids = [p.pid for p in psutil.process_iter() if any(name in p.name().lower() for name in process_names)]
# Find new browser processes
new_pids = [pid for pid in after_pids if pid not in before_pids]
_chrome_process_ids.extend(new_pids)
if _chrome_process_ids:
print(f"{translator.get('register.tracking_processes', count=len(_chrome_process_ids), browser=browser_type)}")
else:
print(f"{Fore.YELLOW}Warning: {translator.get('register.no_new_processes_detected', browser=browser_type)}{Style.RESET_ALL}")
except Exception as e:
print(f"{translator.get('register.could_not_track_processes', browser=browser_type, error=str(e))}")
return config, page
except Exception as e:
if translator:
print(f"{Fore.RED}{translator.get('register.extension_load_error', error=str(e))}{Style.RESET_ALL}")
print(f"{Fore.RED}{translator.get('register.browser_setup_error', error=str(e))}{Style.RESET_ALL}")
else:
print(f"加载插件失败: {e}")
if translator:
print(f"{Fore.CYAN}🚀 {translator.get('register.starting_browser')}{Style.RESET_ALL}")
else:
print("正在启动浏览器...")
page = ChromiumPage(co)
return page
print(f"Error setting up browser: {e}")
raise
def handle_turnstile(page, translator=None):
"""处理 Turnstile 验证"""
def handle_turnstile(page, config, translator=None):
"""Handle Turnstile verification"""
try:
if translator:
print(f"{Fore.CYAN}🔄 {translator.get('register.handling_turnstile')}{Style.RESET_ALL}")
else:
print("\n正在处理 Turnstile 验证...")
print("\nHandling Turnstile verification...")
# from config
turnstile_time = float(config.get('Turnstile', 'handle_turnstile_time', fallback='2'))
random_time_str = config.get('Turnstile', 'handle_turnstile_random_time', fallback='1-3')
# Parse random time range
try:
min_time, max_time = map(float, random_time_str.split('-'))
except:
min_time, max_time = 1, 3 # Default value
max_retries = 2
retry_count = 0
@ -144,14 +298,14 @@ def handle_turnstile(page, translator=None):
if translator:
print(f"{Fore.CYAN}🔄 {translator.get('register.retry_verification', attempt=retry_count)}{Style.RESET_ALL}")
else:
print(f"{retry_count} 次尝试验证...")
print(f"Attempt {retry_count} of verification...")
try:
# 尝试重置 turnstile
# Try to reset turnstile
page.run_js("try { turnstile.reset() } catch(e) { }")
time.sleep(2)
time.sleep(turnstile_time) # from config
# 定位验证框元素
# Locate verification box element
challenge_check = (
page.ele("@id=cf-turnstile", timeout=2)
.child()
@ -164,61 +318,61 @@ def handle_turnstile(page, translator=None):
if translator:
print(f"{Fore.CYAN}🔄 {translator.get('register.detect_turnstile')}{Style.RESET_ALL}")
else:
print("检测到验证框...")
print("Detected verification box...")
# 随机延时后点击验证
time.sleep(random.uniform(1, 3))
# from config
time.sleep(random.uniform(min_time, max_time))
challenge_check.click()
time.sleep(2)
time.sleep(turnstile_time) # from config
# 检查验证结果
# check verification result
if check_verification_success(page, translator):
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
else:
print("验证通过!")
print("Verification successful!")
return True
except Exception as e:
if translator:
print(f"{Fore.RED}{translator.get('register.verification_failed')}{Style.RESET_ALL}")
else:
print(f"验证尝试失败: {e}")
print(f"Verification attempt failed: {e}")
# 检查是否已经验证成功
# Check if verification has been successful
if check_verification_success(page, translator):
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
else:
print("验证通过!")
print("Verification successful!")
return True
time.sleep(random.uniform(1, 2))
time.sleep(random.uniform(min_time, max_time))
if translator:
print(f"{Fore.RED}{translator.get('register.verification_failed')}{Style.RESET_ALL}")
else:
print("超出最大重试次数")
print("Exceeded maximum retry attempts")
return False
except Exception as e:
if translator:
print(f"{Fore.RED}{translator.get('register.verification_error', error=str(e))}{Style.RESET_ALL}")
else:
print(f"验证过程出错: {e}")
print(f"Error in verification process: {e}")
return False
def check_verification_success(page, translator=None):
"""检查验证是否成功"""
"""Check if verification is successful"""
try:
# 检查是否存在后续表单元素,这表示验证已通过
# Check if there is a subsequent form element, indicating verification has passed
if (page.ele("@name=password", timeout=0.5) or
page.ele("@name=email", timeout=0.5) or
page.ele("@data-index=0", timeout=0.5) or
page.ele("Account Settings", timeout=0.5)):
return True
# 检查是否出现错误消息
# Check if there is an error message
error_messages = [
'xpath://div[contains(text(), "Can\'t verify the user is human")]',
'xpath://div[contains(text(), "Error: 600010")]',
@ -234,232 +388,235 @@ def check_verification_success(page, translator=None):
return False
def generate_password(length=12):
"""生成随机密码"""
"""Generate random password"""
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*"
return ''.join(random.choices(chars, k=length))
def fill_password(page, password, translator=None):
"""填写密码"""
def fill_password(page, password: str, config, translator=None):
"""
Fill password form
"""
try:
if translator:
print(f"{Fore.CYAN}🔑 {translator.get('register.setting_password')}{Style.RESET_ALL}")
else:
print("\n正在设置密码...")
print(f"{Fore.CYAN}🔑 {translator.get('register.setting_password') if translator else 'Setting password'}{Style.RESET_ALL}")
# Fill password
password_input = page.ele("@name=password")
print(f"{Fore.CYAN}🔑 {translator.get('register.setting_on_password')}: {password}{Style.RESET_ALL}")
if password_input:
password_input.input(password)
time.sleep(random.uniform(0.5, 1.0))
submit_button = page.ele("@type=submit")
if submit_button:
submit_button.click()
time.sleep(random.uniform(2.0, 3.0))
if translator:
print(f"{Fore.GREEN}{translator.get('register.password_success')}{Style.RESET_ALL}")
else:
print(f"密码设置完成: {password}")
return True
# Click submit button
submit_button = page.ele("@type=submit")
if submit_button:
submit_button.click()
time.sleep(get_random_wait_time(config, 'submit_wait'))
print(f"{Fore.GREEN}{translator.get('register.password_submitted') if translator else 'Password submitted'}{Style.RESET_ALL}")
return True
except Exception as e:
if translator:
print(f"{Fore.RED}{translator.get('register.password_error', error=str(e))}{Style.RESET_ALL}")
else:
print(f"设置密码时出错: {e}")
print(f"{Fore.RED}{translator.get('register.password_error', error=str(e)) if translator else f'Error setting password: {str(e)}'}{Style.RESET_ALL}")
return False
def handle_verification_code(browser_tab, email_tab, controller, email, password, translator=None):
"""处理验证码"""
def handle_verification_code(browser_tab, email_tab, controller, config, translator=None):
"""Handle verification code"""
try:
if translator:
print(f"\n{Fore.CYAN}{translator.get('register.waiting_for_verification_code')}{Style.RESET_ALL}")
else:
print("\n等待并获取验证码...")
print(f"\n{Fore.CYAN}🔄 {translator.get('register.waiting_for_verification_code')}{Style.RESET_ALL}")
# 添加调试信息
print(f"\n{Fore.CYAN}DEBUG: email_tab exists: {email_tab is not None}{Style.RESET_ALL}")
time.sleep(5) # 等待验证码邮件
# 使用已有的 email_tab 刷新邮箱
email_tab.refresh_inbox()
time.sleep(3)
# 检查邮箱是否有验证码邮件
if email_tab.check_for_cursor_email():
verification_code = email_tab.get_verification_code()
if verification_code:
# 在注册页面填写验证码
for i, digit in enumerate(verification_code):
browser_tab.ele(f"@data-index={i}").input(digit)
time.sleep(random.uniform(0.1, 0.3))
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
else:
print("验证码填写完成")
time.sleep(3)
# 处理最后一次 Turnstile 验证
if handle_turnstile(browser_tab, translator):
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
else:
print("最后一次验证通过!")
time.sleep(2)
# 访问设置页面
if translator:
print(f"{Fore.CYAN}🔑 {translator.get('register.visiting_url')}: https://www.cursor.com/settings{Style.RESET_ALL}")
else:
print("访问设置页面...")
browser_tab.get("https://www.cursor.com/settings")
time.sleep(3) # 等待页面加载
return True
else:
print("最后一次验证失败")
return False
return False
# 获取验证码,设置超时
verification_code = None
max_attempts = 20
retry_interval = 10
start_time = time.time()
timeout = 160
if translator:
print(f"{Fore.CYAN}{translator.get('register.start_getting_verification_code')}{Style.RESET_ALL}")
else:
print("开始获取验证码...")
for attempt in range(max_attempts):
# 检查是否超时
if time.time() - start_time > timeout:
if translator:
print(f"{Fore.RED}{translator.get('register.verification_timeout')}{Style.RESET_ALL}")
else:
print("获取验证码超时...")
break
# Check if using manual input verification code
if hasattr(controller, 'get_verification_code') and email_tab is None: # Manual mode
verification_code = controller.get_verification_code()
if verification_code:
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
else:
print(f"成功获取验证码: {verification_code}")
break
# Fill verification code in registration page
for i, digit in enumerate(verification_code):
browser_tab.ele(f"@data-index={i}").input(digit)
time.sleep(get_random_wait_time(config, 'verification_code_input'))
remaining_time = int(timeout - (time.time() - start_time))
if translator:
print(f"{Fore.CYAN}{translator.get('register.try_get_code', attempt=attempt + 1, time=remaining_time)}{Style.RESET_ALL}")
else:
print(f"{attempt + 1} 次尝试获取验证码,剩余时间: {remaining_time}秒...")
# 刷新邮箱
print(f"{translator.get('register.verification_success')}")
time.sleep(get_random_wait_time(config, 'verification_success_wait'))
# Handle last Turnstile verification
if handle_turnstile(browser_tab, config, translator):
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
time.sleep(get_random_wait_time(config, 'verification_retry_wait'))
# Visit settings page
print(f"{Fore.CYAN}🔑 {translator.get('register.visiting_url')}: https://www.cursor.com/settings{Style.RESET_ALL}")
browser_tab.get("https://www.cursor.com/settings")
time.sleep(get_random_wait_time(config, 'settings_page_load_wait'))
return True, browser_tab
return False, None
# Automatic verification code logic
elif email_tab:
print(f"{Fore.CYAN}🔄 {translator.get('register.waiting_for_verification_code')}{Style.RESET_ALL}")
time.sleep(get_random_wait_time(config, 'email_check_initial_wait'))
# Use existing email_tab to refresh email
email_tab.refresh_inbox()
time.sleep(retry_interval)
if verification_code:
# 在注册页面填写验证码
for i, digit in enumerate(verification_code):
browser_tab.ele(f"@data-index={i}").input(digit)
time.sleep(random.uniform(0.1, 0.3))
time.sleep(get_random_wait_time(config, 'email_refresh_wait'))
# Check if there is a verification code email
if email_tab.check_for_cursor_email():
verification_code = email_tab.get_verification_code()
if verification_code:
# Fill verification code in registration page
for i, digit in enumerate(verification_code):
browser_tab.ele(f"@data-index={i}").input(digit)
time.sleep(get_random_wait_time(config, 'verification_code_input'))
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
time.sleep(get_random_wait_time(config, 'verification_success_wait'))
# Handle last Turnstile verification
if handle_turnstile(browser_tab, config, translator):
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
time.sleep(get_random_wait_time(config, 'verification_retry_wait'))
# Visit settings page
if translator:
print(f"{Fore.CYAN}🔑 {translator.get('register.visiting_url')}: https://www.cursor.com/settings{Style.RESET_ALL}")
browser_tab.get("https://www.cursor.com/settings")
time.sleep(get_random_wait_time(config, 'settings_page_load_wait'))
return True, browser_tab
else:
if translator:
print(f"{Fore.RED}{translator.get('register.verification_failed')}{Style.RESET_ALL}")
else:
print("最后一次验证失败")
return False, None
# Get verification code, set timeout
verification_code = None
max_attempts = 20
retry_interval = get_random_wait_time(config, 'retry_interval') # Use get_random_wait_time
start_time = time.time()
timeout = float(config.get('Timing', 'max_timeout', fallback='160')) # This can be kept unchanged because it is a fixed value
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
else:
print("验证码填写完成")
time.sleep(3)
print(f"{Fore.CYAN}{translator.get('register.start_getting_verification_code')}{Style.RESET_ALL}")
# 处理最后一次 Turnstile 验证
if handle_turnstile(browser_tab, translator):
for attempt in range(max_attempts):
# Check if timeout
if time.time() - start_time > timeout:
if translator:
print(f"{Fore.RED}{translator.get('register.verification_timeout')}{Style.RESET_ALL}")
break
verification_code = controller.get_verification_code()
if verification_code:
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
break
remaining_time = int(timeout - (time.time() - start_time))
if translator:
print(f"{Fore.CYAN}{translator.get('register.try_get_code', attempt=attempt + 1, time=remaining_time)}{Style.RESET_ALL}")
# Refresh email
email_tab.refresh_inbox()
time.sleep(retry_interval) # Use get_random_wait_time
if verification_code:
# Fill verification code in registration page
for i, digit in enumerate(verification_code):
browser_tab.ele(f"@data-index={i}").input(digit)
time.sleep(get_random_wait_time(config, 'verification_code_input'))
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
else:
print("最后一次验证通过!")
time.sleep(2)
time.sleep(get_random_wait_time(config, 'verification_success_wait'))
# 直接访问设置页面
if translator:
print(f"{Fore.CYAN}{translator.get('register.visiting_url')}: https://www.cursor.com/settings{Style.RESET_ALL}")
# Handle last Turnstile verification
if handle_turnstile(browser_tab, config, translator):
if translator:
print(f"{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
time.sleep(get_random_wait_time(config, 'verification_retry_wait'))
# Visit settings page
if translator:
print(f"{Fore.CYAN}{translator.get('register.visiting_url')}: https://www.cursor.com/settings{Style.RESET_ALL}")
browser_tab.get("https://www.cursor.com/settings")
time.sleep(get_random_wait_time(config, 'settings_page_load_wait'))
# Return success directly, let cursor_register.py handle account information acquisition
return True, browser_tab
else:
print("访问设置页面...")
browser_tab.get("https://www.cursor.com/settings")
time.sleep(3) # 等待页面加载
if translator:
print(f"{Fore.RED}{translator.get('register.verification_failed')}{Style.RESET_ALL}")
return False, None
# 直接返回成功,让 cursor_register.py 处理账户信息获取
return True
else:
if translator:
print(f"{Fore.RED}{translator.get('register.verification_failed')}{Style.RESET_ALL}")
else:
print("最后一次验证失败")
return False
return False, None
return False
except Exception as e:
if translator:
print(f"{Fore.RED}{translator.get('register.verification_error', error=str(e))}{Style.RESET_ALL}")
else:
print(f"处理验证码时出错: {e}")
return False
return False, None
def handle_sign_in(browser_tab, email, password, translator=None):
"""处理登录流程"""
"""Handle login process"""
try:
# 检查是否在登录页面
# Check if on login page
sign_in_header = browser_tab.ele('xpath://h1[contains(text(), "Sign in")]')
if not sign_in_header:
return True # 如果不是登录页面,说明已经登录成功
return True # If not on login page, it means login is successful
print(f"{Fore.CYAN}检测到登录页面,开始登录...{Style.RESET_ALL}")
# 填写邮箱
# Fill email
email_input = browser_tab.ele('@name=email')
if email_input:
email_input.input(email)
time.sleep(1)
# 点击 Continue
# Click Continue
continue_button = browser_tab.ele('xpath://button[contains(@class, "BrandedButton") and text()="Continue"]')
if continue_button:
continue_button.click()
time.sleep(2)
# 处理 Turnstile 验证
# Handle Turnstile verification
if handle_turnstile(browser_tab, translator):
# 填写密码
# Fill password
password_input = browser_tab.ele('@name=password')
if password_input:
password_input.input(password)
time.sleep(1)
# 点击 Sign in
# Click Sign in
sign_in_button = browser_tab.ele('xpath://button[@name="intent" and @value="password"]')
if sign_in_button:
sign_in_button.click()
time.sleep(2)
# 处理最后一次 Turnstile 验证
# Handle last Turnstile verification
if handle_turnstile(browser_tab, translator):
print(f"{Fore.GREEN}登录成功!{Style.RESET_ALL}")
print(f"{Fore.GREEN}Login successful!{Style.RESET_ALL}")
time.sleep(3)
return True
print(f"{Fore.RED}登录失败{Style.RESET_ALL}")
print(f"{Fore.RED}Login failed{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}登录过程出错: {str(e)}{Style.RESET_ALL}")
print(f"{Fore.RED}Login process error: {str(e)}{Style.RESET_ALL}")
return False
def main(email=None, password=None, first_name=None, last_name=None, email_tab=None, controller=None, translator=None):
"""主函数,可以接收账号信息、邮箱标签页和翻译器"""
"""Main function, can receive account information, email tab, and translator"""
global _translator
_translator = translator # 保存到全局变量
global _chrome_process_ids
_translator = translator # Save to global variable
_chrome_process_ids = [] # Reset the process IDs list
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
@ -467,84 +624,63 @@ def main(email=None, password=None, first_name=None, last_name=None, email_tab=N
page = None
success = False
try:
page = setup_driver(translator)
config, page = setup_driver(translator)
if translator:
print(f"{Fore.CYAN}🚀 {translator.get('register.browser_started')}{Style.RESET_ALL}")
else:
print("浏览器已启动")
# 访问注册页面
# Visit registration page
url = "https://authenticator.cursor.sh/sign-up"
if translator:
print(f"\n{Fore.CYAN}{translator.get('register.visiting_url')}: {url}{Style.RESET_ALL}")
else:
print(f"\n正在访问: {url}")
# 访问页面
simulate_human_input(page, url, translator)
# Visit page
simulate_human_input(page, url, config, translator)
if translator:
print(f"{Fore.CYAN}{translator.get('register.waiting_for_page_load')}{Style.RESET_ALL}")
else:
print("等待页面加载...")
time.sleep(5)
print(f"{Fore.CYAN}🔄 {translator.get('register.waiting_for_page_load')}{Style.RESET_ALL}")
time.sleep(get_random_wait_time(config, 'page_load_wait'))
# 如果没有提供账号信息,则生成随机信息
# If account information is not provided, generate random information
if not all([email, password, first_name, last_name]):
first_name = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz', k=6)).capitalize()
last_name = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz', k=6)).capitalize()
email = f"{first_name.lower()}{random.randint(100,999)}@example.com"
password = generate_password()
# 保存账号信息
# Save account information
with open('test_accounts.txt', 'a', encoding='utf-8') as f:
f.write(f"\n{'='*50}\n")
f.write(f"Email: {email}\n")
f.write(f"Password: {password}\n")
f.write(f"{'='*50}\n")
# 填写表单
if fill_signup_form(page, first_name, last_name, email, translator):
# Fill form
if fill_signup_form(page, first_name, last_name, email, config, translator):
if translator:
print(f"\n{Fore.GREEN}{translator.get('register.form_submitted')}{Style.RESET_ALL}")
else:
print("\n表单已提交,开始验证...")
print(f"\n{Fore.GREEN}{translator.get('register.form_submitted')}{Style.RESET_ALL}")
# 处理第一次 Turnstile 验证
if handle_turnstile(page, translator):
# Handle first Turnstile verification
if handle_turnstile(page, config, translator):
if translator:
print(f"\n{Fore.GREEN}{translator.get('register.first_verification_passed')}{Style.RESET_ALL}")
else:
print("\n第一阶段验证通过!")
print(f"\n{Fore.GREEN}{translator.get('register.first_verification_passed')}{Style.RESET_ALL}")
# 填写密码
if fill_password(page, password, translator):
# Fill password
if fill_password(page, password, config, translator):
if translator:
print(f"\n{Fore.CYAN}{translator.get('register.waiting_for_second_verification')}{Style.RESET_ALL}")
else:
print("\n等待第二次验证...")
time.sleep(2)
# 处理第二次 Turnstile 验证
if handle_turnstile(page, translator):
print(f"\n{Fore.CYAN}🔄 {translator.get('register.waiting_for_second_verification')}{Style.RESET_ALL}")
# Handle second Turnstile verification
if handle_turnstile(page, config, translator):
if translator:
print(f"\n{Fore.CYAN}{translator.get('register.waiting_for_verification_code')}{Style.RESET_ALL}")
else:
print("\n开始处理验证码...")
if handle_verification_code(page, email_tab, controller, email, password, translator):
if translator:
print(f"\n{Fore.GREEN}{translator.get('register.verification_success')}{Style.RESET_ALL}")
else:
print("\n注册流程完成!")
print(f"\n{Fore.CYAN}🔄 {translator.get('register.waiting_for_verification_code')}{Style.RESET_ALL}")
if handle_verification_code(page, email_tab, controller, config, translator):
success = True
return True, page # 返回成功状态和浏览器实例
return True, page
else:
print("\n验证码处理失败")
print(f"\n{Fore.RED}{translator.get('register.verification_code_processing_failed') if translator else 'Verification code processing failed'}{Style.RESET_ALL}")
else:
print("\n第二次验证失败")
print(f"\n{Fore.RED}{translator.get('register.second_verification_failed') if translator else 'Second verification failed'}{Style.RESET_ALL}")
else:
print("\n密码设置失败")
print(f"\n{Fore.RED}{translator.get('register.second_verification_failed') if translator else 'Second verification failed'}{Style.RESET_ALL}")
else:
print("\n第一次验证失败")
print(f"\n{Fore.RED}{translator.get('register.first_verification_failed') if translator else 'First verification failed'}{Style.RESET_ALL}")
return False, None
@ -552,7 +688,7 @@ def main(email=None, password=None, first_name=None, last_name=None, email_tab=N
print(f"发生错误: {e}")
return False, None
finally:
if page and not success: # 只在失败时清理
if page and not success: # Only clean up when failed
try:
page.quit()
except:
@ -560,4 +696,4 @@ def main(email=None, password=None, first_name=None, last_name=None, email_tab=N
cleanup_chrome_processes(translator)
if __name__ == "__main__":
main() # 直接运行时不传参数,使用随机生成的信息
main() # Run without parameters, use randomly generated information

View File

@ -1,226 +0,0 @@
from DrissionPage import ChromiumPage, ChromiumOptions
import time
import os
import sys
from colorama import Fore, Style, init
# 初始化 colorama
init()
class NewTempEmail:
def __init__(self, translator=None):
self.translator = translator
self.page = None
self.setup_browser()
def get_extension_block(self):
"""获取插件路径"""
root_dir = os.getcwd()
extension_path = os.path.join(root_dir, "uBlock0.chromium")
if hasattr(sys, "_MEIPASS"):
extension_path = os.path.join(sys._MEIPASS, "uBlock0.chromium")
if not os.path.exists(extension_path):
raise FileNotFoundError(f"插件不存在: {extension_path}")
return extension_path
def setup_browser(self):
"""设置浏览器"""
try:
if self.translator:
print(f"{Fore.CYAN} {self.translator.get('email.starting_browser')}{Style.RESET_ALL}")
else:
print(f"{Fore.CYAN} 正在启动浏览器...{Style.RESET_ALL}")
# 创建浏览器选项
co = ChromiumOptions()
co.set_argument("--headless=new")
co.auto_port() # 自动设置端口
# 加载 uBlock 插件
try:
extension_path = self.get_extension_block()
co.set_argument("--allow-extensions-in-incognito")
co.add_extension(extension_path)
except Exception as e:
if self.translator:
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.extension_load_error')}: {str(e)}{Style.RESET_ALL}")
else:
print(f"{Fore.YELLOW}⚠️ 加载插件失败: {str(e)}{Style.RESET_ALL}")
self.page = ChromiumPage(co)
return True
except Exception as e:
if self.translator:
print(f"{Fore.RED}{self.translator.get('email.browser_start_error')}: {str(e)}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}❌ 启动浏览器失败: {str(e)}{Style.RESET_ALL}")
return False
def create_email(self):
"""创建临时邮箱"""
try:
if self.translator:
print(f"{Fore.CYAN} {self.translator.get('email.visiting_site')}{Style.RESET_ALL}")
else:
print(f"{Fore.CYAN} 正在访问 smailpro.com...{Style.RESET_ALL}")
# 访问网站
self.page.get("https://smailpro.com/")
time.sleep(2)
# 点击创建邮箱按钮
create_button = self.page.ele('xpath://button[@title="Create temporary email"]')
if create_button:
create_button.click()
time.sleep(1)
# 点击弹窗中的 Create 按钮
modal_create_button = self.page.ele('xpath://button[contains(text(), "Create")]')
if modal_create_button:
modal_create_button.click()
time.sleep(2)
# 获取邮箱地址 - 修改选择器
email_div = self.page.ele('xpath://div[@class="text-base sm:text-lg md:text-xl text-gray-700"]')
if email_div:
email = email_div.text.strip()
if '@' in email: # 验证是否是有效的邮箱地址
if self.translator:
print(f"{Fore.GREEN}{self.translator.get('email.create_success')}: {email}{Style.RESET_ALL}")
else:
print(f"{Fore.GREEN}✅ 创建邮箱成功: {email}{Style.RESET_ALL}")
return email
if self.translator:
print(f"{Fore.RED}{self.translator.get('email.create_failed')}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}❌ 创建邮箱失败{Style.RESET_ALL}")
return None
except Exception as e:
if self.translator:
print(f"{Fore.RED}{self.translator.get('email.create_error')}: {str(e)}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}❌ 创建邮箱出错: {str(e)}{Style.RESET_ALL}")
return None
def close(self):
"""关闭浏览器"""
if self.page:
self.page.quit()
def refresh_inbox(self):
"""刷新邮箱"""
try:
if self.translator:
print(f"{Fore.CYAN}🔄 {self.translator.get('email.refreshing')}{Style.RESET_ALL}")
else:
print(f"{Fore.CYAN}🔄 正在刷新邮箱...{Style.RESET_ALL}")
# 点击刷新按钮
refresh_button = self.page.ele('xpath://button[@id="refresh"]')
if refresh_button:
refresh_button.click()
time.sleep(2) # 等待刷新完成
if self.translator:
print(f"{Fore.GREEN}{self.translator.get('email.refresh_success')}{Style.RESET_ALL}")
else:
print(f"{Fore.GREEN}✅ 邮箱刷新成功{Style.RESET_ALL}")
return True
if self.translator:
print(f"{Fore.RED}{self.translator.get('email.refresh_button_not_found')}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}❌ 未找到刷新按钮{Style.RESET_ALL}")
return False
except Exception as e:
if self.translator:
print(f"{Fore.RED}{self.translator.get('email.refresh_error')}: {str(e)}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}❌ 刷新邮箱出错: {str(e)}{Style.RESET_ALL}")
return False
def check_for_cursor_email(self):
"""检查是否有 Cursor 的验证邮件"""
try:
# 查找验证邮件 - 使用更精确的选择器
email_div = self.page.ele('xpath://div[contains(@class, "p-2") and contains(@class, "cursor-pointer") and contains(@class, "bg-white") and contains(@class, "shadow") and .//b[text()="no-reply@cursor.sh"] and .//span[text()="Verify your email address"]]')
if email_div:
if self.translator:
print(f"{Fore.GREEN}{self.translator.get('email.verification_found')}{Style.RESET_ALL}")
else:
print(f"{Fore.GREEN}✅ 找到验证邮件{Style.RESET_ALL}")
# 使用 JavaScript 点击元素
self.page.run_js('arguments[0].click()', email_div)
time.sleep(2) # 等待邮件内容加载
return True
if self.translator:
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.verification_not_found')}{Style.RESET_ALL}")
else:
print(f"{Fore.YELLOW}⚠️ 未找到验证邮件{Style.RESET_ALL}")
return False
except Exception as e:
if self.translator:
print(f"{Fore.RED}{self.translator.get('email.verification_error')}: {str(e)}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}❌ 检查验证邮件出错: {str(e)}{Style.RESET_ALL}")
return False
def get_verification_code(self):
"""获取验证码"""
try:
# 查找验证码元素
code_element = self.page.ele('xpath://td//div[contains(@style, "font-size:28px") and contains(@style, "letter-spacing:2px")]')
if code_element:
code = code_element.text.strip()
if code.isdigit() and len(code) == 6:
if self.translator:
print(f"{Fore.GREEN}{self.translator.get('email.verification_code_found')}: {code}{Style.RESET_ALL}")
else:
print(f"{Fore.GREEN}✅ 获取验证码成功: {code}{Style.RESET_ALL}")
return code
if self.translator:
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.verification_code_not_found')}{Style.RESET_ALL}")
else:
print(f"{Fore.YELLOW}⚠️ 未找到有效的验证码{Style.RESET_ALL}")
return None
except Exception as e:
if self.translator:
print(f"{Fore.RED}{self.translator.get('email.verification_code_error')}: {str(e)}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}❌ 获取验证码出错: {str(e)}{Style.RESET_ALL}")
return None
def main(translator=None):
temp_email = NewTempEmail(translator)
try:
email = temp_email.create_email()
if email:
if translator:
print(f"\n{Fore.CYAN}📧 {translator.get('email.address')}: {email}{Style.RESET_ALL}")
else:
print(f"\n{Fore.CYAN}📧 临时邮箱地址: {email}{Style.RESET_ALL}")
# 测试刷新功能
while True:
if translator:
choice = input(f"\n{translator.get('email.refresh_prompt')}: ").lower()
else:
choice = input("\n按 R 刷新邮箱,按 Q 退出: ").lower()
if choice == 'r':
temp_email.refresh_inbox()
elif choice == 'q':
break
finally:
temp_email.close()
if __name__ == "__main__":
main()

1077
oauth_auth.py Normal file

File diff suppressed because it is too large Load Diff

View File

@ -4,10 +4,10 @@ from colorama import Fore, Style, init
import sys
import os
# 初始化colorama
# Initialize colorama
init()
# 定义emoji常量
# Define emoji constants
EMOJI = {
"PROCESS": "⚙️",
"SUCCESS": "",
@ -19,15 +19,15 @@ EMOJI = {
class CursorQuitter:
def __init__(self, timeout=5, translator=None):
self.timeout = timeout
self.translator = translator # 使用传入的翻译器
self.translator = translator # Use the passed translator
def quit_cursor(self):
"""温和地关闭 Cursor 进程"""
"""Gently close Cursor processes"""
try:
print(f"{Fore.CYAN}{EMOJI['PROCESS']} {self.translator.get('quit_cursor.start')}...{Style.RESET_ALL}")
cursor_processes = []
# 收集所有 Cursor 进程
# Collect all Cursor processes
for proc in psutil.process_iter(['pid', 'name']):
try:
if proc.info['name'].lower() in ['cursor.exe', 'cursor']:
@ -39,7 +39,7 @@ class CursorQuitter:
print(f"{Fore.GREEN}{EMOJI['INFO']} {self.translator.get('quit_cursor.no_process')}{Style.RESET_ALL}")
return True
# 温和地请求进程终止
# Gently request processes to terminate
for proc in cursor_processes:
try:
if proc.is_running():
@ -48,7 +48,7 @@ class CursorQuitter:
except (psutil.NoSuchProcess, psutil.AccessDenied):
continue
# 等待进程自然终止
# Wait for processes to terminate naturally
print(f"{Fore.CYAN}{EMOJI['WAIT']} {self.translator.get('quit_cursor.waiting')}...{Style.RESET_ALL}")
start_time = time.time()
while time.time() - start_time < self.timeout:
@ -66,7 +66,7 @@ class CursorQuitter:
time.sleep(0.5)
# 如果超时后仍有进程在运行
# If processes are still running after timeout
if still_running:
process_list = ", ".join([str(p.pid) for p in still_running])
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('quit_cursor.timeout', pids=process_list)}{Style.RESET_ALL}")
@ -79,11 +79,11 @@ class CursorQuitter:
return False
def quit_cursor(translator=None, timeout=5):
"""便捷函数,用于直接调用退出功能"""
"""Convenient function for directly calling the quit function"""
quitter = CursorQuitter(timeout, translator)
return quitter.quit_cursor()
if __name__ == "__main__":
# 如果直接运行,使用默认翻译器
# If run directly, use the default translator
from main import translator as main_translator
quit_cursor(main_translator)

View File

@ -1,22 +0,0 @@
{
"manifest_version": 3,
"name": "Recaptcha Blocker",
"version": "1.0",
"description": "Blocks reCAPTCHA from loading",
"content_scripts": [
{
"matches": ["*://yopmail.com/zh/wm*"],
"js": ["script.js"],
"run_at": "document_start",
"all_frames": true
}
],
"permissions": [
"webNavigation",
"activeTab"
],
"host_permissions": [
"*://yopmail.com/*",
"*://*.google.com/*"
]
}

View File

@ -1,123 +0,0 @@
// Debug logging function
function log(message) {
console.log(`[reCAPTCHA Bypass] ${new Date().toISOString()}: ${message}`);
}
// Function to get element by selector
function qSelector(selector) {
return document.querySelector(selector);
}
// Constants
const MAX_ATTEMPTS = 1;
const SELECTORS = {
CHECK_BOX: ".recaptcha-checkbox-border",
AUDIO_BUTTON: "#recaptcha-audio-button",
PLAY_BUTTON: ".rc-audiochallenge-play-button .rc-button-default",
AUDIO_SOURCE: "#audio-source",
IMAGE_SELECT: "#rc-imageselect",
RESPONSE_FIELD: ".rc-audiochallenge-response-field",
AUDIO_ERROR_MESSAGE: ".rc-audiochallenge-error-message",
AUDIO_RESPONSE: "#audio-response",
RELOAD_BUTTON: "#recaptcha-reload-button",
RECAPTCHA_STATUS: "#recaptcha-accessible-status",
DOSCAPTCHA: ".rc-doscaptcha-body",
VERIFY_BUTTON: "#recaptcha-verify-button"
};
// Function to check if element is hidden
function isHidden(el) {
return (el.offsetParent === null);
}
// Function to handle the bypass process
async function bypassRecaptcha() {
try {
log('Starting bypass process...');
log('Waiting 3 seconds before starting...');
await new Promise(resolve => setTimeout(resolve, 3000));
let solved = false;
let checkBoxClicked = false;
let requestCount = 0;
const recaptchaInitialStatus = qSelector(SELECTORS.RECAPTCHA_STATUS) ?
qSelector(SELECTORS.RECAPTCHA_STATUS).innerText : "";
log('Initial reCAPTCHA status: ' + recaptchaInitialStatus);
// Main bypass logic
try {
if (!checkBoxClicked && qSelector(SELECTORS.CHECK_BOX) &&
!isHidden(qSelector(SELECTORS.CHECK_BOX))) {
log('Clicking checkbox...');
qSelector(SELECTORS.CHECK_BOX).click();
checkBoxClicked = true;
}
// Check if the captcha is solved
if (qSelector(SELECTORS.RECAPTCHA_STATUS) &&
(qSelector(SELECTORS.RECAPTCHA_STATUS).innerText != recaptchaInitialStatus)) {
solved = true;
log('SOLVED!');
}
if (requestCount > MAX_ATTEMPTS) {
log('Attempted Max Retries. Stopping the solver');
solved = true;
}
// Stop solving when Automated queries message is shown
if (qSelector(SELECTORS.DOSCAPTCHA) &&
qSelector(SELECTORS.DOSCAPTCHA).innerText.length > 0) {
log('Automated Queries Detected');
}
} catch (err) {
log(`Error in main bypass logic: ${err.message}`);
}
log('Bypass process completed');
// If not solved, retry after delay
if (!solved && requestCount < MAX_ATTEMPTS) {
requestCount++;
log(`Retrying... Attempt ${requestCount} of ${MAX_ATTEMPTS}`);
setTimeout(bypassRecaptcha, 2000);
}
} catch (e) {
log(`Bypass failed: ${e.message}`);
}
}
// Create a MutationObserver to watch for reCAPTCHA elements
log('Setting up MutationObserver...');
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1 && // Element node
((node.tagName === 'SCRIPT' && node.src && node.src.includes('recaptcha')) ||
(node.tagName === 'IFRAME' && node.src && node.src.includes('recaptcha')))) {
log(`Detected new reCAPTCHA element: ${node.tagName} - ${node.src}`);
bypassRecaptcha();
}
});
});
});
// Start observing
observer.observe(document, {
childList: true,
subtree: true
});
log('MutationObserver started');
// Run on page load
if (document.readyState === 'loading') {
log('Document still loading, waiting for DOMContentLoaded');
document.addEventListener('DOMContentLoaded', bypassRecaptcha);
} else {
log('Document already loaded, starting bypass process');
bypassRecaptcha();
}

View File

@ -5,4 +5,9 @@ requests
psutil>=5.8.0
pywin32; platform_system == "Windows"
pyinstaller
DrissionPage>=4.0.0
DrissionPage>=4.0.0
selenium
webdriver_manager
arabic-reshaper
python-bidi
faker

View File

@ -8,13 +8,18 @@ import sqlite3
import platform
import re
import tempfile
import glob
from colorama import Fore, Style, init
from typing import Tuple
import configparser
import traceback
from config import get_config
from datetime import datetime
# 初始化colorama
# Initialize colorama
init()
# 定义emoji常量
# Define emoji constants
EMOJI = {
"FILE": "📄",
"BACKUP": "💾",
@ -22,50 +27,240 @@ EMOJI = {
"ERROR": "",
"INFO": "",
"RESET": "🔄",
"WARNING": "⚠️",
}
def get_user_documents_path():
"""Get user Documents folder path"""
if sys.platform == "win32":
try:
import winreg
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders") as key:
documents_path, _ = winreg.QueryValueEx(key, "Personal")
return documents_path
except Exception as e:
# fallback
return os.path.join(os.path.expanduser("~"), "Documents")
elif sys.platform == "darwin":
return os.path.join(os.path.expanduser("~"), "Documents")
else: # Linux
# Get actual user's home directory
sudo_user = os.environ.get('SUDO_USER')
if sudo_user:
return os.path.join("/home", sudo_user, "Documents")
return os.path.join(os.path.expanduser("~"), "Documents")
def get_cursor_paths(translator=None) -> Tuple[str, str]:
"""根据不同操作系统获取 Cursor 相关路径"""
""" Get Cursor related paths"""
system = platform.system()
# Read config file
config = configparser.ConfigParser()
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
# Create config directory if it doesn't exist
if not os.path.exists(config_dir):
os.makedirs(config_dir)
# Default paths for different systems
default_paths = {
"Darwin": "/Applications/Cursor.app/Contents/Resources/app",
"Windows": os.path.join(os.getenv("LOCALAPPDATA", ""), "Programs", "Cursor", "resources", "app"),
"Linux": ["/opt/Cursor/resources/app", "/usr/share/cursor/resources/app", os.path.expanduser("~/.local/share/cursor/resources/app"), "/usr/lib/cursor/app/"]
}
if system == "Linux":
# Look for extracted AppImage with correct usr structure
extracted_usr_paths = glob.glob(os.path.expanduser("~/squashfs-root/usr/share/cursor/resources/app"))
# Also check current directory for extraction without home path prefix
current_dir_paths = glob.glob("squashfs-root/usr/share/cursor/resources/app")
# Add any found paths to the Linux paths list
default_paths["Linux"].extend(extracted_usr_paths)
default_paths["Linux"].extend(current_dir_paths)
# Print debug information
print(f"{Fore.CYAN}{EMOJI['INFO']} Available paths found:{Style.RESET_ALL}")
for path in default_paths["Linux"]:
if os.path.exists(path):
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {path} (exists){Style.RESET_ALL}")
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {path} (not found){Style.RESET_ALL}")
# If config doesn't exist, create it with default paths
if not os.path.exists(config_file):
for section in ['MacPaths', 'WindowsPaths', 'LinuxPaths']:
if not config.has_section(section):
config.add_section(section)
if system == "Darwin":
config.set('MacPaths', 'cursor_path', default_paths["Darwin"])
elif system == "Windows":
config.set('WindowsPaths', 'cursor_path', default_paths["Windows"])
elif system == "Linux":
# For Linux, try to find the first existing path
for path in default_paths["Linux"]:
if os.path.exists(path):
config.set('LinuxPaths', 'cursor_path', path)
break
else:
# If no path exists, use the first one as default
config.set('LinuxPaths', 'cursor_path', default_paths["Linux"][0])
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
else:
config.read(config_file, encoding='utf-8')
# Get path based on system
if system == "Darwin":
section = 'MacPaths'
elif system == "Windows":
section = 'WindowsPaths'
elif system == "Linux":
section = 'LinuxPaths'
else:
raise OSError(translator.get('reset.unsupported_os', system=system) if translator else f"不支持的操作系统: {system}")
if not config.has_section(section) or not config.has_option(section, 'cursor_path'):
raise OSError(translator.get('reset.path_not_configured') if translator else "未配置 Cursor 路徑")
base_path = config.get(section, 'cursor_path')
# For Linux, try to find the first existing path if the configured one doesn't exist
if system == "Linux" and not os.path.exists(base_path):
for path in default_paths["Linux"]:
if os.path.exists(path):
base_path = path
# Update config with the found path
config.set(section, 'cursor_path', path)
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
break
if not os.path.exists(base_path):
raise OSError(translator.get('reset.path_not_found', path=base_path) if translator else f"找不到 Cursor 路徑: {base_path}")
pkg_path = os.path.join(base_path, "package.json")
main_path = os.path.join(base_path, "out/main.js")
# Check if files exist
if not os.path.exists(pkg_path):
raise OSError(translator.get('reset.package_not_found', path=pkg_path) if translator else f"找不到 package.json: {pkg_path}")
if not os.path.exists(main_path):
raise OSError(translator.get('reset.main_not_found', path=main_path) if translator else f"找不到 main.js: {main_path}")
return (pkg_path, main_path)
def get_cursor_machine_id_path(translator=None) -> str:
"""
Get Cursor machineId file path based on operating system
Returns:
str: Path to machineId file
"""
# Read configuration
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if os.path.exists(config_file):
config.read(config_file)
if sys.platform == "win32": # Windows
if not config.has_section('WindowsPaths'):
config.add_section('WindowsPaths')
config.set('WindowsPaths', 'machine_id_path',
os.path.join(os.getenv("APPDATA"), "Cursor", "machineId"))
return config.get('WindowsPaths', 'machine_id_path')
elif sys.platform == "linux": # Linux
if not config.has_section('LinuxPaths'):
config.add_section('LinuxPaths')
config.set('LinuxPaths', 'machine_id_path',
os.path.expanduser("~/.config/cursor/machineid"))
return config.get('LinuxPaths', 'machine_id_path')
elif sys.platform == "darwin": # macOS
if not config.has_section('MacPaths'):
config.add_section('MacPaths')
config.set('MacPaths', 'machine_id_path',
os.path.expanduser("~/Library/Application Support/Cursor/machineId"))
return config.get('MacPaths', 'machine_id_path')
else:
raise OSError(f"Unsupported operating system: {sys.platform}")
# Save any changes to config file
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
def get_workbench_cursor_path(translator=None) -> str:
"""Get Cursor workbench.desktop.main.js path"""
system = platform.system()
# Read configuration
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if os.path.exists(config_file):
config.read(config_file)
paths_map = {
"Darwin": {
"Darwin": { # macOS
"base": "/Applications/Cursor.app/Contents/Resources/app",
"package": "package.json",
"main": "out/main.js",
"main": "out/vs/workbench/workbench.desktop.main.js"
},
"Windows": {
"base": os.path.join(
os.getenv("LOCALAPPDATA", ""), "Programs", "Cursor", "resources", "app"
),
"package": "package.json",
"main": "out/main.js",
"main": "out\\vs\\workbench\\workbench.desktop.main.js"
},
"Linux": {
"bases": ["/opt/Cursor/resources/app", "/usr/share/cursor/resources/app"],
"package": "package.json",
"main": "out/main.js",
},
"bases": ["/opt/Cursor/resources/app", "/usr/share/cursor/resources/app", "/usr/lib/cursor/app/"],
"main": "out/vs/workbench/workbench.desktop.main.js"
}
}
if system == "Linux":
# Add extracted AppImage with correct usr structure
extracted_usr_paths = glob.glob(os.path.expanduser("~/squashfs-root/usr/share/cursor/resources/app"))
paths_map["Linux"]["bases"].extend(extracted_usr_paths)
if system not in paths_map:
raise OSError(translator.get('reset.unsupported_os', system=system) if translator else f"不支持的操作系统: {system}")
if system == "Linux":
for base in paths_map["Linux"]["bases"]:
pkg_path = os.path.join(base, paths_map["Linux"]["package"])
if os.path.exists(pkg_path):
return (pkg_path, os.path.join(base, paths_map["Linux"]["main"]))
raise OSError(translator.get('reset.linux_path_not_found') if translator else "在 Linux 系统上未找到 Cursor 安装路径")
main_path = os.path.join(base, paths_map["Linux"]["main"])
print(f"{Fore.CYAN}{EMOJI['INFO']} Checking path: {main_path}{Style.RESET_ALL}")
if os.path.exists(main_path):
return main_path
base_path = paths_map[system]["base"]
return (
os.path.join(base_path, paths_map[system]["package"]),
os.path.join(base_path, paths_map[system]["main"]),
)
if system == "Windows":
base_path = config.get('WindowsPaths', 'cursor_path')
elif system == "Darwin":
base_path = paths_map[system]["base"]
if config.has_section('MacPaths') and config.has_option('MacPaths', 'cursor_path'):
base_path = config.get('MacPaths', 'cursor_path')
else: # Linux
# For Linux, we've already checked all bases in the loop above
# If we're here, it means none of the bases worked, so we'll use the first one
base_path = paths_map[system]["bases"][0]
if config.has_section('LinuxPaths') and config.has_option('LinuxPaths', 'cursor_path'):
base_path = config.get('LinuxPaths', 'cursor_path')
main_path = os.path.join(base_path, paths_map[system]["main"])
if not os.path.exists(main_path):
raise OSError(translator.get('reset.file_not_found', path=main_path) if translator else f"未找到 Cursor main.js 文件: {main_path}")
return main_path
def version_check(version: str, min_version: str = "", max_version: str = "", translator=None) -> bool:
"""版本号检查"""
"""Version number check"""
version_pattern = r"^\d+\.\d+\.\d+$"
try:
if not re.match(version_pattern, version):
@ -92,18 +287,141 @@ def version_check(version: str, min_version: str = "", max_version: str = "", tr
return False
def check_cursor_version(translator) -> bool:
"""检查 Cursor 版本"""
"""Check Cursor version"""
try:
pkg_path, _ = get_cursor_paths(translator)
with open(pkg_path, "r", encoding="utf-8") as f:
version = json.load(f)["version"]
return version_check(version, min_version="0.45.0", translator=translator)
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('reset.reading_package_json', path=pkg_path)}{Style.RESET_ALL}")
try:
with open(pkg_path, "r", encoding="utf-8") as f:
data = json.load(f)
except UnicodeDecodeError:
# If UTF-8 reading fails, try other encodings
with open(pkg_path, "r", encoding="latin-1") as f:
data = json.load(f)
if not isinstance(data, dict):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.invalid_json_object')}{Style.RESET_ALL}")
return False
if "version" not in data:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.no_version_field')}{Style.RESET_ALL}")
return False
version = str(data["version"]).strip()
if not version:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.version_field_empty')}{Style.RESET_ALL}")
return False
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('reset.found_version', version=version)}{Style.RESET_ALL}")
# Check version format
if not re.match(r"^\d+\.\d+\.\d+$", version):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.invalid_version_format', version=version)}{Style.RESET_ALL}")
return False
# Compare versions
try:
current = tuple(map(int, version.split(".")))
min_ver = (0, 45, 0) # Use tuple directly instead of string
if current >= min_ver:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.version_check_passed', version=version, min_version='0.45.0')}{Style.RESET_ALL}")
return True
else:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('reset.version_too_low', version=version, min_version='0.45.0')}{Style.RESET_ALL}")
return False
except ValueError as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.version_parse_error', error=str(e))}{Style.RESET_ALL}")
return False
except FileNotFoundError as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.package_not_found', path=pkg_path)}{Style.RESET_ALL}")
return False
except json.JSONDecodeError as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.invalid_json_object')}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.check_version_failed', error=str(e))}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('reset.stack_trace')}: {traceback.format_exc()}{Style.RESET_ALL}")
return False
def modify_workbench_js(file_path: str, translator=None) -> bool:
"""
Modify file content
"""
try:
# Save original file permissions
original_stat = os.stat(file_path)
original_mode = original_stat.st_mode
original_uid = original_stat.st_uid
original_gid = original_stat.st_gid
# Create temporary file
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", errors="ignore", delete=False) as tmp_file:
# Read original content
with open(file_path, "r", encoding="utf-8", errors="ignore") as main_file:
content = main_file.read()
patterns = {
# 通用按钮替换模式
r'B(k,D(Ln,{title:"Upgrade to Pro",size:"small",get codicon(){return A.rocket},get onClick(){return t.pay}}),null)': r'B(k,D(Ln,{title:"yeongpin GitHub",size:"small",get codicon(){return A.github},get onClick(){return function(){window.open("https://github.com/yeongpin/cursor-free-vip","_blank")}}}),null)',
# Windows/Linux/Mac 通用按钮替换模式
r'M(x,I(as,{title:"Upgrade to Pro",size:"small",get codicon(){return $.rocket},get onClick(){return t.pay}}),null)': r'M(x,I(as,{title:"yeongpin GitHub",size:"small",get codicon(){return $.rocket},get onClick(){return function(){window.open("https://github.com/yeongpin/cursor-free-vip","_blank")}}}),null)',
# Badge 替换
r'<div>Pro Trial': r'<div>Pro',
r'py-1">Auto-select': r'py-1">Bypass-Version-Pin',
#
r'async getEffectiveTokenLimit(e){const n=e.modelName;if(!n)return 2e5;':r'async getEffectiveTokenLimit(e){return 9000000;const n=e.modelName;if(!n)return 9e5;',
# Pro
r'var DWr=ne("<div class=settings__item_description>You are currently signed in with <strong></strong>.");': r'var DWr=ne("<div class=settings__item_description>You are currently signed in with <strong></strong>. <h1>Pro</h1>");',
# Toast 替换
r'notifications-toasts': r'notifications-toasts hidden'
}
# 使用patterns进行替换
for old_pattern, new_pattern in patterns.items():
content = content.replace(old_pattern, new_pattern)
# Write to temporary file
tmp_file.write(content)
tmp_path = tmp_file.name
# Backup original file with timestamp
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{file_path}.backup.{timestamp}"
shutil.copy2(file_path, backup_path)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.backup_created', path=backup_path)}{Style.RESET_ALL}")
# Move temporary file to original position
if os.path.exists(file_path):
os.remove(file_path)
shutil.move(tmp_path, file_path)
# Restore original permissions
os.chmod(file_path, original_mode)
if os.name != "nt": # Not Windows
os.chown(file_path, original_uid, original_gid)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.file_modified')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.modify_file_failed', error=str(e))}{Style.RESET_ALL}")
if "tmp_path" in locals():
try:
os.unlink(tmp_path)
except:
pass
return False
def modify_main_js(main_path: str, translator) -> bool:
"""修改 main.js 文件"""
"""Modify main.js file"""
try:
original_stat = os.stat(main_path)
original_mode = original_stat.st_mode
@ -125,7 +443,10 @@ def modify_main_js(main_path: str, translator) -> bool:
tmp_file.write(content)
tmp_path = tmp_file.name
shutil.copy2(main_path, main_path + ".old")
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{main_path}.old.{timestamp}"
shutil.copy2(main_path, backup_path)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.backup_created', path=backup_path)}{Style.RESET_ALL}")
shutil.move(tmp_path, main_path)
os.chmod(main_path, original_mode)
@ -142,14 +463,14 @@ def modify_main_js(main_path: str, translator) -> bool:
return False
def patch_cursor_get_machine_id(translator) -> bool:
"""修补 Cursor getMachineId 函数"""
"""Patch Cursor getMachineId function"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('reset.start_patching')}...{Style.RESET_ALL}")
# 获取路径
# Get paths
pkg_path, main_path = get_cursor_paths(translator)
# 检查文件权限
# Check file permissions
for file_path in [pkg_path, main_path]:
if not os.path.isfile(file_path):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.file_not_found', path=file_path)}{Style.RESET_ALL}")
@ -158,7 +479,7 @@ def patch_cursor_get_machine_id(translator) -> bool:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.no_write_permission', path=file_path)}{Style.RESET_ALL}")
return False
# 获取版本号
# Get version number
try:
with open(pkg_path, "r", encoding="utf-8") as f:
version = json.load(f)["version"]
@ -167,20 +488,21 @@ def patch_cursor_get_machine_id(translator) -> bool:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.read_version_failed', error=str(e))}{Style.RESET_ALL}")
return False
# 检查版本
# Check version
if not version_check(version, min_version="0.45.0", translator=translator):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.version_not_supported')}{Style.RESET_ALL}")
return False
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('reset.version_check_passed')}{Style.RESET_ALL}")
# 备份文件
backup_path = main_path + ".bak"
# Backup file
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{main_path}.bak.{timestamp}"
if not os.path.exists(backup_path):
shutil.copy2(main_path, backup_path)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.backup_created', path=backup_path)}{Style.RESET_ALL}")
# 修改文件
# Modify file
if not modify_main_js(main_path, translator):
return False
@ -195,58 +517,99 @@ class MachineIDResetter:
def __init__(self, translator=None):
self.translator = translator
# 判断操作系统
# Read configuration
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if not os.path.exists(config_file):
raise FileNotFoundError(f"Config file not found: {config_file}")
config.read(config_file, encoding='utf-8')
# Check operating system
if sys.platform == "win32": # Windows
appdata = os.getenv("APPDATA")
if appdata is None:
raise EnvironmentError("APPDATA Environment Variable Not Set")
self.db_path = os.path.join(
appdata, "Cursor", "User", "globalStorage", "storage.json"
)
self.sqlite_path = os.path.join(
appdata, "Cursor", "User", "globalStorage", "state.vscdb"
)
if not config.has_section('WindowsPaths'):
config.add_section('WindowsPaths')
config.set('WindowsPaths', 'storage_path', os.path.join(
appdata, "Cursor", "User", "globalStorage", "storage.json"
))
config.set('WindowsPaths', 'sqlite_path', os.path.join(
appdata, "Cursor", "User", "globalStorage", "state.vscdb"
))
self.db_path = config.get('WindowsPaths', 'storage_path')
self.sqlite_path = config.get('WindowsPaths', 'sqlite_path')
elif sys.platform == "darwin": # macOS
self.db_path = os.path.abspath(os.path.expanduser(
"~/Library/Application Support/Cursor/User/globalStorage/storage.json"
))
self.sqlite_path = os.path.abspath(os.path.expanduser(
"~/Library/Application Support/Cursor/User/globalStorage/state.vscdb"
))
if not config.has_section('MacPaths'):
config.add_section('MacPaths')
config.set('MacPaths', 'storage_path', os.path.abspath(os.path.expanduser(
"~/Library/Application Support/Cursor/User/globalStorage/storage.json"
)))
config.set('MacPaths', 'sqlite_path', os.path.abspath(os.path.expanduser(
"~/Library/Application Support/Cursor/User/globalStorage/state.vscdb"
)))
self.db_path = config.get('MacPaths', 'storage_path')
self.sqlite_path = config.get('MacPaths', 'sqlite_path')
elif sys.platform == "linux": # Linux
self.db_path = os.path.abspath(os.path.expanduser(
"~/.config/Cursor/User/globalStorage/storage.json"
))
self.sqlite_path = os.path.abspath(os.path.expanduser(
"~/.config/Cursor/User/globalStorage/state.vscdb"
))
if not config.has_section('LinuxPaths'):
config.add_section('LinuxPaths')
# Get actual user's home directory
sudo_user = os.environ.get('SUDO_USER')
actual_home = f"/home/{sudo_user}" if sudo_user else os.path.expanduser("~")
config.set('LinuxPaths', 'storage_path', os.path.abspath(os.path.join(
actual_home,
".config/cursor/User/globalStorage/storage.json"
)))
config.set('LinuxPaths', 'sqlite_path', os.path.abspath(os.path.join(
actual_home,
".config/cursor/User/globalStorage/state.vscdb"
)))
self.db_path = config.get('LinuxPaths', 'storage_path')
self.sqlite_path = config.get('LinuxPaths', 'sqlite_path')
else:
raise NotImplementedError(f"Not Supported OS: {sys.platform}")
# Save any changes to config file
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
def generate_new_ids(self):
"""生成新的机器ID"""
# 生成新的UUID
"""Generate new machine ID"""
# Generate new UUID
dev_device_id = str(uuid.uuid4())
# 生成新的machineId (64个字符的十六进制)
# Generate new machineId (64 characters of hexadecimal)
machine_id = hashlib.sha256(os.urandom(32)).hexdigest()
# 生成新的macMachineId (128个字符的十六进制)
# Generate new macMachineId (128 characters of hexadecimal)
mac_machine_id = hashlib.sha512(os.urandom(64)).hexdigest()
# 生成新的sqmId
# Generate new sqmId
sqm_id = "{" + str(uuid.uuid4()).upper() + "}"
self.update_machine_id_file(dev_device_id)
return {
"telemetry.devDeviceId": dev_device_id,
"telemetry.macMachineId": mac_machine_id,
"telemetry.machineId": machine_id,
"telemetry.sqmId": sqm_id,
"storage.serviceMachineId": dev_device_id, # 添加 storage.serviceMachineId
"storage.serviceMachineId": dev_device_id, # Add storage.serviceMachineId
}
def update_sqlite_db(self, new_ids):
"""更新 SQLite 数据库中的机器ID"""
"""Update machine ID in SQLite database"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.updating_sqlite')}...{Style.RESET_ALL}")
@ -281,12 +644,13 @@ class MachineIDResetter:
return False
def update_system_ids(self, new_ids):
"""更新系统级别的ID"""
"""Update system-level IDs"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.updating_system_ids')}...{Style.RESET_ALL}")
if sys.platform.startswith("win"):
self._update_windows_machine_guid()
self._update_windows_machine_id()
elif sys.platform == "darwin":
self._update_macos_platform_uuid(new_ids)
@ -297,7 +661,7 @@ class MachineIDResetter:
return False
def _update_windows_machine_guid(self):
"""更新Windows MachineGuid"""
"""Update Windows MachineGuid"""
try:
import winreg
key = winreg.OpenKey(
@ -309,32 +673,71 @@ class MachineIDResetter:
new_guid = str(uuid.uuid4())
winreg.SetValueEx(key, "MachineGuid", 0, winreg.REG_SZ, new_guid)
winreg.CloseKey(key)
print("Windows MachineGuid updated successfully")
except PermissionError:
print("Permission denied: Run as administrator to update Windows MachineGuid")
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.windows_machine_guid_updated')}{Style.RESET_ALL}")
except PermissionError as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.permission_denied', error=str(e))}{Style.RESET_ALL}")
raise
except Exception as e:
print(f"Failed to update Windows MachineGuid: {e}")
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.update_windows_machine_guid_failed', error=str(e))}{Style.RESET_ALL}")
raise
def _update_windows_machine_id(self):
"""Update Windows MachineId in SQMClient registry"""
try:
import winreg
# 1. Generate new GUID
new_guid = "{" + str(uuid.uuid4()).upper() + "}"
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.new_machine_id')}: {new_guid}{Style.RESET_ALL}")
# 2. Open the registry key
try:
key = winreg.OpenKey(
winreg.HKEY_LOCAL_MACHINE,
r"SOFTWARE\Microsoft\SQMClient",
0,
winreg.KEY_WRITE | winreg.KEY_WOW64_64KEY
)
except FileNotFoundError:
# If the key does not exist, create it
key = winreg.CreateKey(
winreg.HKEY_LOCAL_MACHINE,
r"SOFTWARE\Microsoft\SQMClient"
)
# 3. Set MachineId value
winreg.SetValueEx(key, "MachineId", 0, winreg.REG_SZ, new_guid)
winreg.CloseKey(key)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.windows_machine_id_updated')}{Style.RESET_ALL}")
return True
except PermissionError:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.permission_denied')}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('reset.run_as_admin')}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.update_windows_machine_id_failed', error=str(e))}{Style.RESET_ALL}")
return False
def _update_macos_platform_uuid(self, new_ids):
"""更新macOS Platform UUID"""
"""Update macOS Platform UUID"""
try:
uuid_file = "/var/root/Library/Preferences/SystemConfiguration/com.apple.platform.uuid.plist"
if os.path.exists(uuid_file):
# 使用sudo来执行plutil命令
# Use sudo to execute plutil command
cmd = f'sudo plutil -replace "UUID" -string "{new_ids["telemetry.macMachineId"]}" "{uuid_file}"'
result = os.system(cmd)
if result == 0:
print("macOS Platform UUID updated successfully")
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.macos_platform_uuid_updated')}{Style.RESET_ALL}")
else:
raise Exception("Failed to execute plutil command")
raise Exception(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.failed_to_execute_plutil_command')}{Style.RESET_ALL}")
except Exception as e:
print(f"Failed to update macOS Platform UUID: {e}")
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.update_macos_platform_uuid_failed', error=str(e))}{Style.RESET_ALL}")
raise
def reset_machine_ids(self):
"""重置机器ID并备份原文件"""
"""Reset machine ID and backup original file"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.checking')}...{Style.RESET_ALL}")
@ -350,36 +753,40 @@ class MachineIDResetter:
with open(self.db_path, "r", encoding="utf-8") as f:
config = json.load(f)
backup_path = self.db_path + ".bak"
if not os.path.exists(backup_path):
print(f"{Fore.YELLOW}{EMOJI['BACKUP']} {self.translator.get('reset.creating_backup')}: {backup_path}{Style.RESET_ALL}")
shutil.copy2(self.db_path, backup_path)
else:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.backup_exists')}{Style.RESET_ALL}")
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{self.db_path}.bak.{timestamp}"
print(f"{Fore.YELLOW}{EMOJI['BACKUP']} {self.translator.get('reset.creating_backup')}: {backup_path}{Style.RESET_ALL}")
shutil.copy2(self.db_path, backup_path)
print(f"{Fore.CYAN}{EMOJI['RESET']} {self.translator.get('reset.generating')}...{Style.RESET_ALL}")
new_ids = self.generate_new_ids()
# 更新配置文件
# Update configuration file
config.update(new_ids)
print(f"{Fore.CYAN}{EMOJI['FILE']} {self.translator.get('reset.saving_json')}...{Style.RESET_ALL}")
with open(self.db_path, "w", encoding="utf-8") as f:
json.dump(config, f, indent=4)
# 更新SQLite数据库
# Update SQLite database
self.update_sqlite_db(new_ids)
# 更新系统ID
# Update system IDs
self.update_system_ids(new_ids)
# 检查 Cursor 版本并执行相应的操作
# Modify workbench.desktop.main.js
workbench_path = get_workbench_cursor_path(self.translator)
modify_workbench_js(workbench_path, self.translator)
# Check Cursor version and perform corresponding actions
greater_than_0_45 = check_cursor_version(self.translator)
if greater_than_0_45:
print(f"{Fore.CYAN}{EMOJI['INFO']} 检测到 Cursor 版本 >= 0.45.0,正在修补 getMachineId...{Style.RESET_ALL}")
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.detecting_version')} >= 0.45.0{self.translator.get('reset.patching_getmachineid')}{Style.RESET_ALL}")
patch_cursor_get_machine_id(self.translator)
else:
print(f"{Fore.YELLOW}{EMOJI['INFO']} Cursor 版本 < 0.45.0,跳过 getMachineId 修补{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.version_less_than_0_45')}{Style.RESET_ALL}")
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.success')}{Style.RESET_ALL}")
print(f"\n{Fore.CYAN}{self.translator.get('reset.new_id')}:{Style.RESET_ALL}")
@ -396,13 +803,54 @@ class MachineIDResetter:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.process_error', error=str(e))}{Style.RESET_ALL}")
return False
def update_machine_id_file(self, machine_id: str) -> bool:
"""
Update machineId file with new machine_id
Args:
machine_id (str): New machine ID to write
Returns:
bool: True if successful, False otherwise
"""
try:
# Get the machineId file path
machine_id_path = get_cursor_machine_id_path()
# Create directory if it doesn't exist
os.makedirs(os.path.dirname(machine_id_path), exist_ok=True)
# Create backup if file exists
if os.path.exists(machine_id_path):
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{machine_id_path}.backup.{timestamp}"
try:
shutil.copy2(machine_id_path, backup_path)
print(f"{Fore.GREEN}{EMOJI['INFO']} {self.translator.get('reset.backup_created', path=backup_path) if self.translator else f'Backup created at: {backup_path}'}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.backup_creation_failed', error=str(e)) if self.translator else f'Could not create backup: {str(e)}'}{Style.RESET_ALL}")
# Write new machine ID to file
with open(machine_id_path, "w", encoding="utf-8") as f:
f.write(machine_id)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.update_success') if self.translator else 'Successfully updated machineId file'}{Style.RESET_ALL}")
return True
except Exception as e:
error_msg = f"Failed to update machineId file: {str(e)}"
if self.translator:
error_msg = self.translator.get('reset.update_failed', error=str(e))
print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}")
return False
def run(translator=None):
"""便捷函数,用于直接调用重置功能"""
config = get_config(translator)
if not config:
return False
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{EMOJI['RESET']} {translator.get('reset.title')}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
resetter = MachineIDResetter(translator) # 正確傳遞 translator
resetter = MachineIDResetter(translator) # Correctly pass translator
resetter.reset_machine_ids()
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
@ -410,4 +858,4 @@ def run(translator=None):
if __name__ == "__main__":
from main import translator as main_translator
run(main_translator)
run(main_translator)

406
restore_machine_id.py Normal file
View File

@ -0,0 +1,406 @@
import os
import sys
import json
import uuid
import hashlib
import shutil
import sqlite3
import platform
import re
import glob
import tempfile
from colorama import Fore, Style, init
from typing import Tuple
import configparser
import traceback
from config import get_config
from datetime import datetime
# 导入共享函数
from reset_machine_manual import get_cursor_machine_id_path, get_user_documents_path
# 初始化 colorama
init()
# 定义表情符号常量
EMOJI = {
"FILE": "📄",
"BACKUP": "💾",
"SUCCESS": "",
"ERROR": "",
"INFO": "",
"RESET": "🔄",
"WARNING": "⚠️",
}
class ConfigError(Exception):
"""配置错误异常"""
pass
class MachineIDRestorer:
def __init__(self, translator=None):
self.translator = translator
# 读取配置
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if not os.path.exists(config_file):
raise FileNotFoundError(f"Config file not found: {config_file}")
config.read(config_file, encoding='utf-8')
# 根据操作系统获取路径
if sys.platform == "win32": # Windows
appdata = os.getenv("APPDATA")
if appdata is None:
raise EnvironmentError("APPDATA Environment Variable Not Set")
if not config.has_section('WindowsPaths'):
raise ConfigError("WindowsPaths section not found in config")
self.db_path = config.get('WindowsPaths', 'storage_path')
self.sqlite_path = config.get('WindowsPaths', 'sqlite_path')
elif sys.platform == "darwin": # macOS
if not config.has_section('MacPaths'):
raise ConfigError("MacPaths section not found in config")
self.db_path = config.get('MacPaths', 'storage_path')
self.sqlite_path = config.get('MacPaths', 'sqlite_path')
elif sys.platform == "linux": # Linux
if not config.has_section('LinuxPaths'):
raise ConfigError("LinuxPaths section not found in config")
self.db_path = config.get('LinuxPaths', 'storage_path')
self.sqlite_path = config.get('LinuxPaths', 'sqlite_path')
else:
raise NotImplementedError(f"Not Supported OS: {sys.platform}")
def find_backups(self):
"""查找可用的备份文件"""
db_dir = os.path.dirname(self.db_path)
db_name = os.path.basename(self.db_path)
# 查找格式为 {db_name}.bak.{timestamp} 的文件
backup_pattern = f"{db_name}.bak.*"
backups = glob.glob(os.path.join(db_dir, backup_pattern))
# 按创建时间排序(最新的在前)
backups.sort(key=os.path.getctime, reverse=True)
return backups
def list_backups(self):
"""列出所有可用备份"""
backups = self.find_backups()
if not backups:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('restore.no_backups_found')}{Style.RESET_ALL}")
return None
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('restore.available_backups')}:{Style.RESET_ALL}")
for i, backup in enumerate(backups, 1):
# 获取备份文件信息
timestamp_str = backup.split('.')[-1]
try:
# 尝试解析时间戳(如果格式为 YYYYmmdd_HHMMSS
timestamp = datetime.strptime(timestamp_str, "%Y%m%d_%H%M%S")
date_str = timestamp.strftime("%Y-%m-%d %H:%M:%S")
except ValueError:
date_str = "未知日期"
# 获取文件大小
size = os.path.getsize(backup)
size_str = f"{size / 1024:.1f} KB"
print(f"{i}. {Fore.GREEN}{os.path.basename(backup)}{Style.RESET_ALL} ({date_str}, {size_str})")
return backups
def select_backup(self):
"""让用户选择要恢复的备份"""
backups = self.list_backups()
if not backups:
return None
while True:
try:
choice = input(f"{EMOJI['INFO']} {self.translator.get('restore.select_backup')} (1-{len(backups)}, 0 {self.translator.get('restore.to_cancel')}): ")
if choice.strip() == '0':
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('restore.operation_cancelled')}{Style.RESET_ALL}")
return None
index = int(choice) - 1
if 0 <= index < len(backups):
return backups[index]
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.invalid_selection')}{Style.RESET_ALL}")
except ValueError:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.please_enter_number')}{Style.RESET_ALL}")
def extract_ids_from_backup(self, backup_path):
"""从备份文件中提取机器ID"""
try:
with open(backup_path, "r", encoding="utf-8") as f:
backup_data = json.load(f)
# 提取需要恢复的ID
ids = {
"telemetry.devDeviceId": backup_data.get("telemetry.devDeviceId", ""),
"telemetry.macMachineId": backup_data.get("telemetry.macMachineId", ""),
"telemetry.machineId": backup_data.get("telemetry.machineId", ""),
"telemetry.sqmId": backup_data.get("telemetry.sqmId", ""),
"storage.serviceMachineId": backup_data.get("storage.serviceMachineId",
backup_data.get("telemetry.devDeviceId", ""))
}
# 确保所有ID都存在
for key, value in ids.items():
if not value:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('restore.missing_id', id=key)}{Style.RESET_ALL}")
return ids
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.read_backup_failed', error=str(e))}{Style.RESET_ALL}")
return None
def update_current_file(self, ids):
"""更新当前的storage.json文件"""
try:
if not os.path.exists(self.db_path):
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.current_file_not_found')}: {self.db_path}{Style.RESET_ALL}")
return False
# 读取当前文件
with open(self.db_path, "r", encoding="utf-8") as f:
current_data = json.load(f)
# 创建当前文件的备份
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{self.db_path}.restore_bak.{timestamp}"
shutil.copy2(self.db_path, backup_path)
print(f"{Fore.GREEN}{EMOJI['BACKUP']} {self.translator.get('restore.current_backup_created')}: {backup_path}{Style.RESET_ALL}")
# 更新ID
current_data.update(ids)
# 保存更新后的文件
with open(self.db_path, "w", encoding="utf-8") as f:
json.dump(current_data, f, indent=4)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('restore.storage_updated')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.update_failed', error=str(e))}{Style.RESET_ALL}")
return False
def update_sqlite_db(self, ids):
"""更新SQLite数据库中的ID"""
try:
if not os.path.exists(self.sqlite_path):
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.sqlite_not_found')}: {self.sqlite_path}{Style.RESET_ALL}")
return False
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('restore.updating_sqlite')}...{Style.RESET_ALL}")
conn = sqlite3.connect(self.sqlite_path)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS ItemTable (
key TEXT PRIMARY KEY,
value TEXT
)
""")
for key, value in ids.items():
cursor.execute("""
INSERT OR REPLACE INTO ItemTable (key, value)
VALUES (?, ?)
""", (key, value))
print(f"{EMOJI['INFO']} {Fore.CYAN} {self.translator.get('restore.updating_pair')}: {key}{Style.RESET_ALL}")
conn.commit()
conn.close()
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('restore.sqlite_updated')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.sqlite_update_failed', error=str(e))}{Style.RESET_ALL}")
return False
def update_machine_id_file(self, dev_device_id):
"""更新machineId文件"""
try:
machine_id_path = get_cursor_machine_id_path(self.translator)
# 创建目录(如果不存在)
os.makedirs(os.path.dirname(machine_id_path), exist_ok=True)
# 备份当前文件(如果存在)
if os.path.exists(machine_id_path):
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{machine_id_path}.restore_bak.{timestamp}"
try:
shutil.copy2(machine_id_path, backup_path)
print(f"{Fore.GREEN}{EMOJI['INFO']} {self.translator.get('restore.machine_id_backup_created')}: {backup_path}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('restore.backup_creation_failed', error=str(e))}{Style.RESET_ALL}")
# 写入新的ID
with open(machine_id_path, "w", encoding="utf-8") as f:
f.write(dev_device_id)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('restore.machine_id_updated')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.machine_id_update_failed', error=str(e))}{Style.RESET_ALL}")
return False
def update_system_ids(self, ids):
"""更新系统级ID特定于操作系统"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('restore.updating_system_ids')}...{Style.RESET_ALL}")
if sys.platform.startswith("win"):
self._update_windows_system_ids(ids)
elif sys.platform == "darwin":
self._update_macos_system_ids(ids)
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.system_ids_update_failed', error=str(e))}{Style.RESET_ALL}")
return False
def _update_windows_system_ids(self, ids):
"""更新Windows系统ID"""
try:
import winreg
# 更新MachineGuid
guid = ids.get("telemetry.devDeviceId", "")
if guid:
try:
key = winreg.OpenKey(
winreg.HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Cryptography",
0,
winreg.KEY_WRITE | winreg.KEY_WOW64_64KEY
)
winreg.SetValueEx(key, "MachineGuid", 0, winreg.REG_SZ, guid)
winreg.CloseKey(key)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('restore.windows_machine_guid_updated')}{Style.RESET_ALL}")
except PermissionError:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.permission_denied')}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.update_windows_machine_guid_failed', error=str(e))}{Style.RESET_ALL}")
# 更新SQMClient MachineId
sqm_id = ids.get("telemetry.sqmId", "")
if sqm_id:
try:
key = winreg.OpenKey(
winreg.HKEY_LOCAL_MACHINE,
r"SOFTWARE\Microsoft\SQMClient",
0,
winreg.KEY_WRITE | winreg.KEY_WOW64_64KEY
)
winreg.SetValueEx(key, "MachineId", 0, winreg.REG_SZ, sqm_id)
winreg.CloseKey(key)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('restore.windows_machine_id_updated')}{Style.RESET_ALL}")
except FileNotFoundError:
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('restore.sqm_client_key_not_found')}{Style.RESET_ALL}")
except PermissionError:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.permission_denied')}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.update_windows_machine_id_failed', error=str(e))}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.update_windows_system_ids_failed', error=str(e))}{Style.RESET_ALL}")
def _update_macos_system_ids(self, ids):
"""更新macOS系统ID"""
try:
uuid_file = "/var/root/Library/Preferences/SystemConfiguration/com.apple.platform.uuid.plist"
if os.path.exists(uuid_file):
mac_id = ids.get("telemetry.macMachineId", "")
if mac_id:
cmd = f'sudo plutil -replace "UUID" -string "{mac_id}" "{uuid_file}"'
result = os.system(cmd)
if result == 0:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('restore.macos_platform_uuid_updated')}{Style.RESET_ALL}")
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.failed_to_execute_plutil_command')}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.update_macos_system_ids_failed', error=str(e))}{Style.RESET_ALL}")
def restore_machine_ids(self):
"""恢复之前备份的机器ID"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('restore.starting')}...{Style.RESET_ALL}")
# 选择要恢复的备份
backup_path = self.select_backup()
if not backup_path:
return False
# 从备份中提取ID
ids = self.extract_ids_from_backup(backup_path)
if not ids:
return False
# 显示将要恢复的ID
print(f"\n{Fore.CYAN}{self.translator.get('restore.ids_to_restore')}:{Style.RESET_ALL}")
for key, value in ids.items():
print(f"{EMOJI['INFO']} {key}: {Fore.GREEN}{value}{Style.RESET_ALL}")
# 确认恢复
confirm = input(f"\n{EMOJI['WARNING']} {self.translator.get('restore.confirm')} (y/n): ")
if confirm.lower() != 'y':
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('restore.operation_cancelled')}{Style.RESET_ALL}")
return False
# 更新当前文件
if not self.update_current_file(ids):
return False
# 更新SQLite数据库
self.update_sqlite_db(ids)
# 更新machineId文件
self.update_machine_id_file(ids.get("telemetry.devDeviceId", ""))
# 更新系统ID
self.update_system_ids(ids)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('restore.success')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('restore.process_error', error=str(e))}{Style.RESET_ALL}")
return False
def run(translator=None):
"""恢复机器ID的主函数"""
config = get_config(translator)
if not config:
return False
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{EMOJI['RESET']} {translator.get('restore.title')}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
restorer = MachineIDRestorer(translator)
restorer.restore_machine_ids()
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
input(f"{EMOJI['INFO']} {translator.get('restore.press_enter')}...")
if __name__ == "__main__":
from main import translator as main_translator
run(main_translator)

View File

@ -1,4 +1,4 @@
# 設置顏色主題
# set color theme
$Theme = @{
Primary = 'Cyan'
Success = 'Green'
@ -17,7 +17,7 @@ $Logo = @"
"@
# 美化輸出函數
# Beautiful Output Function
function Write-Styled {
param (
[string]$Message,
@ -40,7 +40,7 @@ function Write-Styled {
}
}
# 獲取版本號函數
# Get version number function
function Get-LatestVersion {
try {
$latestRelease = Invoke-RestMethod -Uri "https://api.github.com/repos/yeongpin/cursor-free-vip/releases/latest"
@ -54,28 +54,28 @@ function Get-LatestVersion {
}
}
# 顯示 Logo
# Show Logo
Write-Host $Logo -ForegroundColor $Theme.Primary
$releaseInfo = Get-LatestVersion
$version = $releaseInfo.Version
Write-Host "Version $version" -ForegroundColor $Theme.Info
Write-Host "Created by YeongPin`n" -ForegroundColor $Theme.Info
# 設置 TLS 1.2
# Set TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# 主安裝函數
# Main installation function
function Install-CursorFreeVIP {
Write-Styled "Start downloading Cursor Free VIP" -Color $Theme.Primary -Prefix "Download"
try {
# 獲取最新版本
# Get latest version
Write-Styled "Checking latest version..." -Color $Theme.Primary -Prefix "Update"
$releaseInfo = Get-LatestVersion
$version = $releaseInfo.Version
Write-Styled "Found latest version: $version" -Color $Theme.Success -Prefix "Version"
# 查找對應的資源
# Find corresponding resources
$asset = $releaseInfo.Assets | Where-Object { $_.name -eq "CursorFreeVIP_${version}_windows.exe" }
if (!$asset) {
Write-Styled "File not found: CursorFreeVIP_${version}_windows.exe" -Color $Theme.Error -Prefix "Error"
@ -86,22 +86,100 @@ function Install-CursorFreeVIP {
throw "Cannot find target file"
}
# 下載到Downloads文件夾
# Check if Downloads folder already exists for the corresponding version
$DownloadsPath = [Environment]::GetFolderPath("UserProfile") + "\Downloads"
$downloadPath = Join-Path $DownloadsPath "CursorFreeVIP.exe"
$downloadPath = Join-Path $DownloadsPath "CursorFreeVIP_${version}_windows.exe"
Write-Styled "Downloading to Downloads folder..." -Color $Theme.Primary -Prefix "Download"
$webClient = New-Object System.Net.WebClient
$webClient.Headers.Add("User-Agent", "PowerShell Script")
$webClient.DownloadFile($asset.browser_download_url, $downloadPath)
if (Test-Path $downloadPath) {
Write-Styled "Found existing installation file" -Color $Theme.Success -Prefix "Found"
Write-Styled "Location: $downloadPath" -Color $Theme.Info -Prefix "Location"
# Check if running with administrator privileges
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) {
Write-Styled "Requesting administrator privileges..." -Color $Theme.Warning -Prefix "Admin"
# Create new process with administrator privileges
$startInfo = New-Object System.Diagnostics.ProcessStartInfo
$startInfo.FileName = $downloadPath
$startInfo.UseShellExecute = $true
$startInfo.Verb = "runas"
try {
[System.Diagnostics.Process]::Start($startInfo)
Write-Styled "Program started with admin privileges" -Color $Theme.Success -Prefix "Launch"
return
}
catch {
Write-Styled "Failed to start with admin privileges. Starting normally..." -Color $Theme.Warning -Prefix "Warning"
Start-Process $downloadPath
return
}
}
# If already running with administrator privileges, start directly
Start-Process $downloadPath
return
}
Write-Styled "No existing installation file found, starting download..." -Color $Theme.Primary -Prefix "Download"
# Use HttpWebRequest for chunked download with real-time progress bar
$url = $asset.browser_download_url
$outputFile = $downloadPath
Write-Styled "Downloading from: $url" -Color $Theme.Info -Prefix "URL"
Write-Styled "Saving to: $outputFile" -Color $Theme.Info -Prefix "Path"
$request = [System.Net.HttpWebRequest]::Create($url)
$request.UserAgent = "PowerShell Script"
$response = $request.GetResponse()
$totalLength = $response.ContentLength
$responseStream = $response.GetResponseStream()
$fileStream = [System.IO.File]::OpenWrite($outputFile)
$buffer = New-Object byte[] 8192
$bytesRead = 0
$totalRead = 0
$lastProgress = -1
$startTime = Get-Date
try {
do {
$bytesRead = $responseStream.Read($buffer, 0, $buffer.Length)
if ($bytesRead -gt 0) {
$fileStream.Write($buffer, 0, $bytesRead)
$totalRead += $bytesRead
$progress = [math]::Round(($totalRead / $totalLength) * 100, 1)
if ($progress -ne $lastProgress) {
$elapsed = (Get-Date) - $startTime
$speed = if ($elapsed.TotalSeconds -gt 0) { $totalRead / $elapsed.TotalSeconds } else { 0 }
$speedDisplay = if ($speed -gt 1MB) {
"{0:N2} MB/s" -f ($speed / 1MB)
} elseif ($speed -gt 1KB) {
"{0:N2} KB/s" -f ($speed / 1KB)
} else {
"{0:N2} B/s" -f $speed
}
$downloadedMB = [math]::Round($totalRead / 1MB, 2)
$totalMB = [math]::Round($totalLength / 1MB, 2)
Write-Progress -Activity "Downloading CursorFreeVIP" -Status "$downloadedMB MB / $totalMB MB ($progress%) - $speedDisplay" -PercentComplete $progress
$lastProgress = $progress
}
}
} while ($bytesRead -gt 0)
} finally {
$fileStream.Close()
$responseStream.Close()
$response.Close()
}
Write-Progress -Activity "Downloading CursorFreeVIP" -Completed
# Check file exists and is not zero size
if (!(Test-Path $outputFile) -or ((Get-Item $outputFile).Length -eq 0)) {
throw "Download failed or file is empty."
}
Write-Styled "Download completed!" -Color $Theme.Success -Prefix "Complete"
Write-Styled "File location: $downloadPath" -Color $Theme.Info -Prefix "Location"
Write-Styled "File location: $outputFile" -Color $Theme.Info -Prefix "Location"
Write-Styled "Starting program..." -Color $Theme.Primary -Prefix "Launch"
# 運行程序
Start-Process $downloadPath
Start-Process $outputFile
}
catch {
Write-Styled $_.Exception.Message -Color $Theme.Error -Prefix "Error"
@ -109,7 +187,7 @@ function Install-CursorFreeVIP {
}
}
# 執行安裝
# Execute installation
try {
Install-CursorFreeVIP
}
@ -120,4 +198,4 @@ catch {
finally {
Write-Host "`nPress any key to exit..." -ForegroundColor $Theme.Info
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
}
}

154
scripts/install.sh Normal file → Executable file
View File

@ -1,6 +1,6 @@
#!/bin/bash
# 顏色定義
# Color definitions
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
@ -22,7 +22,7 @@ EOF
echo -e "${NC}"
}
# 获取下载文件夹路径
# Get download folder path
get_downloads_dir() {
if [[ "$(uname)" == "Darwin" ]]; then
echo "$HOME/Downloads"
@ -36,59 +36,157 @@ get_downloads_dir() {
fi
}
# 獲取最新版本
# Get latest version
get_latest_version() {
echo -e "${CYAN} 正在檢查最新版本...${NC}"
local latest_release
latest_release=$(curl -s https://api.github.com/repos/yeongpin/cursor-free-vip/releases/latest)
if [ $? -ne 0 ]; then
echo -e "${RED}❌ 無法獲取最新版本信息${NC}"
echo -e "${CYAN} Checking latest version...${NC}"
latest_release=$(curl -s https://api.github.com/repos/yeongpin/cursor-free-vip/releases/latest) || {
echo -e "${RED}❌ Cannot get latest version information${NC}"
exit 1
fi
}
VERSION=$(echo "$latest_release" | grep -o '"tag_name": ".*"' | cut -d'"' -f4 | tr -d 'v')
echo -e "${GREEN}✅ 找到最新版本: ${VERSION}${NC}"
if [ -z "$VERSION" ]; then
echo -e "${RED}❌ Failed to parse version from GitHub API response:\n${latest_release}"
exit 1
fi
echo -e "${GREEN}✅ Found latest version: ${VERSION}${NC}"
}
# 檢測系統類型
# Detect system type and architecture
detect_os() {
if [[ "$(uname)" == "Darwin" ]]; then
OS="mac"
# Detect macOS architecture
ARCH=$(uname -m)
if [[ "$ARCH" == "arm64" ]]; then
OS="mac_arm64"
echo -e "${CYAN} Detected macOS ARM64 architecture${NC}"
else
OS="mac_intel"
echo -e "${CYAN} Detected macOS Intel architecture${NC}"
fi
elif [[ "$(uname)" == "Linux" ]]; then
# Detect Linux architecture
ARCH=$(uname -m)
if [[ "$ARCH" == "aarch64" || "$ARCH" == "arm64" ]]; then
OS="linux_arm64"
echo -e "${CYAN} Detected Linux ARM64 architecture${NC}"
else
OS="linux_x64"
echo -e "${CYAN} Detected Linux x64 architecture${NC}"
fi
else
OS="linux"
# Assume Windows
OS="windows"
echo -e "${CYAN} Detected Windows system${NC}"
fi
}
# 下載並安裝
# Install and download
install_cursor_free_vip() {
local downloads_dir=$(get_downloads_dir)
local binary_name="CursorFreeVIP_${VERSION}_${OS}"
local binary_path="${downloads_dir}/cursor-free-vip"
local binary_path="${downloads_dir}/${binary_name}"
local download_url="https://github.com/yeongpin/cursor-free-vip/releases/download/v${VERSION}/${binary_name}"
echo -e "${CYAN} 正在下載到 ${downloads_dir}...${NC}"
# Check if file already exists
if [ -f "${binary_path}" ]; then
echo -e "${GREEN}✅ Found existing installation file${NC}"
echo -e "${CYAN} Location: ${binary_path}${NC}"
# Check if running as root
if [ "$EUID" -ne 0 ]; then
echo -e "${YELLOW}⚠️ Requesting administrator privileges...${NC}"
if command -v sudo >/dev/null 2>&1; then
echo -e "${CYAN} Starting program with sudo...${NC}"
sudo chmod +x "${binary_path}"
sudo "${binary_path}"
else
echo -e "${YELLOW}⚠️ sudo not found, trying to run normally...${NC}"
chmod +x "${binary_path}"
"${binary_path}"
fi
else
# Already running as root
echo -e "${CYAN} Already running as root, starting program...${NC}"
chmod +x "${binary_path}"
"${binary_path}"
fi
return
fi
echo -e "${CYAN} No existing installation file found, starting download...${NC}"
echo -e "${CYAN} Downloading to ${downloads_dir}...${NC}"
echo -e "${CYAN} Download link: ${download_url}${NC}"
# Check if file exists
if curl --output /dev/null --silent --head --fail "$download_url"; then
echo -e "${GREEN}✅ File exists, starting download...${NC}"
else
echo -e "${RED}❌ Download link does not exist: ${download_url}${NC}"
echo -e "${YELLOW}⚠️ Trying without architecture...${NC}"
# Try without architecture
if [[ "$OS" == "mac_arm64" || "$OS" == "mac_intel" ]]; then
OS="mac"
binary_name="CursorFreeVIP_${VERSION}_${OS}"
download_url="https://github.com/yeongpin/cursor-free-vip/releases/download/v${VERSION}/${binary_name}"
echo -e "${CYAN} New download link: ${download_url}${NC}"
if ! curl --output /dev/null --silent --head --fail "$download_url"; then
echo -e "${RED}❌ New download link does not exist${NC}"
exit 1
fi
elif [[ "$OS" == "linux_x64" || "$OS" == "linux_arm64" ]]; then
OS="linux"
binary_name="CursorFreeVIP_${VERSION}_${OS}"
download_url="https://github.com/yeongpin/cursor-free-vip/releases/download/v${VERSION}/${binary_name}"
echo -e "${CYAN} New download link: ${download_url}${NC}"
if ! curl --output /dev/null --silent --head --fail "$download_url"; then
echo -e "${RED}❌ New download link does not exist${NC}"
exit 1
fi
else
exit 1
fi
fi
# Download file
if ! curl -L -o "${binary_path}" "$download_url"; then
echo -e "${RED}❌ 下載失敗${NC}"
echo -e "${RED}Download failed${NC}"
exit 1
fi
echo -e "${CYAN} 正在設置執行權限...${NC}"
chmod +x "${binary_path}"
# Check downloaded file size
local file_size=$(stat -f%z "${binary_path}" 2>/dev/null || stat -c%s "${binary_path}" 2>/dev/null)
echo -e "${CYAN} Downloaded file size: ${file_size} bytes${NC}"
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 安裝完成!${NC}"
echo -e "${CYAN} 程序已下載到: ${binary_path}${NC}"
echo -e "${CYAN} 正在啟動程序...${NC}"
# If file is too small, it might be an error message
if [ "$file_size" -lt 1000 ]; then
echo -e "${YELLOW}⚠️ Warning: Downloaded file is too small, possibly not a valid executable file${NC}"
echo -e "${YELLOW}⚠️ File content:${NC}"
cat "${binary_path}"
echo ""
echo -e "${RED}❌ Download failed, please check version and operating system${NC}"
exit 1
fi
echo -e "${CYAN} Setting executable permissions...${NC}"
if chmod +x "${binary_path}"; then
echo -e "${GREEN}✅ Installation completed!${NC}"
echo -e "${CYAN} Program downloaded to: ${binary_path}${NC}"
echo -e "${CYAN} Starting program...${NC}"
# 直接运行程序
# Run program directly
"${binary_path}"
else
echo -e "${RED}❌ 安裝失敗${NC}"
echo -e "${RED}Installation failed${NC}"
exit 1
fi
}
# 主程序
# Main program
main() {
print_logo
get_latest_version
@ -96,5 +194,5 @@ main() {
install_cursor_free_vip
}
# 運行主程序
main
# Run main program
main

853
totally_reset_cursor.py Normal file
View File

@ -0,0 +1,853 @@
import os
import sys
import json
import uuid
import hashlib
import shutil
import sqlite3
import platform
import re
import tempfile
from colorama import Fore, Style, init
from typing import Tuple
import configparser
import traceback
from config import get_config
import glob
# Initialize colorama
init()
# Define emoji constants
EMOJI = {
"FILE": "📄",
"BACKUP": "💾",
"SUCCESS": "",
"ERROR": "",
"INFO": "",
"RESET": "🔄",
"WARNING": "⚠️",
}
def get_user_documents_path():
"""Get user Documents folder path"""
if sys.platform == "win32":
try:
import winreg
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders") as key:
documents_path, _ = winreg.QueryValueEx(key, "Personal")
return documents_path
except Exception as e:
return os.path.join(os.path.expanduser("~"), "Documents")
elif sys.platform == "darwin":
return os.path.join(os.path.expanduser("~"), "Documents")
else: # Linux
# Get actual user's home directory
sudo_user = os.environ.get('SUDO_USER')
if sudo_user:
return os.path.join("/home", sudo_user, "Documents")
return os.path.join(os.path.expanduser("~"), "Documents")
def get_cursor_paths(translator=None) -> Tuple[str, str]:
""" Get Cursor related paths"""
system = platform.system()
# Read config file
config = configparser.ConfigParser()
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
# Create config directory if it doesn't exist
if not os.path.exists(config_dir):
os.makedirs(config_dir)
# Default paths for different systems
default_paths = {
"Darwin": "/Applications/Cursor.app/Contents/Resources/app",
"Windows": os.path.join(os.getenv("LOCALAPPDATA", ""), "Programs", "Cursor", "resources", "app"),
"Linux": ["/opt/Cursor/resources/app", "/usr/share/cursor/resources/app", os.path.expanduser("~/.local/share/cursor/resources/app")]
}
if system == "Linux":
# Look for extracted AppImage directories - with usr structure
extracted_usr_paths = glob.glob(os.path.expanduser("~/squashfs-root/usr/share/cursor/resources/app"))
# Check current directory for extraction without home path prefix
current_dir_paths = glob.glob("squashfs-root/usr/share/cursor/resources/app")
# Add all paths to the Linux paths list
default_paths["Linux"].extend(extracted_usr_paths)
default_paths["Linux"].extend(current_dir_paths)
# Print debug info for troubleshooting
print(f"{Fore.CYAN}{EMOJI['INFO']} Available paths found:{Style.RESET_ALL}")
for path in default_paths["Linux"]:
if os.path.exists(path):
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {path} (exists){Style.RESET_ALL}")
else:
print(f"{Fore.RED}{EMOJI['ERROR']} {path} (not found){Style.RESET_ALL}")
# If config doesn't exist, create it with default paths
if not os.path.exists(config_file):
for section in ['MacPaths', 'WindowsPaths', 'LinuxPaths']:
if not config.has_section(section):
config.add_section(section)
if system == "Darwin":
config.set('MacPaths', 'cursor_path', default_paths["Darwin"])
elif system == "Windows":
config.set('WindowsPaths', 'cursor_path', default_paths["Windows"])
elif system == "Linux":
# For Linux, try to find the first existing path
for path in default_paths["Linux"]:
if os.path.exists(path):
config.set('LinuxPaths', 'cursor_path', path)
break
else:
# If no path exists, use the first one as default
config.set('LinuxPaths', 'cursor_path', default_paths["Linux"][0])
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
else:
config.read(config_file, encoding='utf-8')
# Get path based on system
if system == "Darwin":
section = 'MacPaths'
elif system == "Windows":
section = 'WindowsPaths'
elif system == "Linux":
section = 'LinuxPaths'
else:
raise OSError(translator.get('reset.unsupported_os', system=system) if translator else f"不支持的操作系统: {system}")
if not config.has_section(section) or not config.has_option(section, 'cursor_path'):
raise OSError(translator.get('reset.path_not_configured') if translator else "未配置 Cursor 路徑")
base_path = config.get(section, 'cursor_path')
# For Linux, try to find the first existing path if the configured one doesn't exist
if system == "Linux" and not os.path.exists(base_path):
for path in default_paths["Linux"]:
if os.path.exists(path):
base_path = path
# Update config with the found path
config.set(section, 'cursor_path', path)
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
break
if not os.path.exists(base_path):
raise OSError(translator.get('reset.path_not_found', path=base_path) if translator else f"找不到 Cursor 路徑: {base_path}")
pkg_path = os.path.join(base_path, "package.json")
main_path = os.path.join(base_path, "out/main.js")
# Check if files exist
if not os.path.exists(pkg_path):
raise OSError(translator.get('reset.package_not_found', path=pkg_path) if translator else f"找不到 package.json: {pkg_path}")
if not os.path.exists(main_path):
raise OSError(translator.get('reset.main_not_found', path=main_path) if translator else f"找不到 main.js: {main_path}")
return (pkg_path, main_path)
def get_cursor_machine_id_path(translator=None) -> str:
"""
Get Cursor machineId file path based on operating system
Returns:
str: Path to machineId file
"""
# Read configuration
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if os.path.exists(config_file):
config.read(config_file)
if sys.platform == "win32": # Windows
if not config.has_section('WindowsPaths'):
config.add_section('WindowsPaths')
config.set('WindowsPaths', 'machine_id_path',
os.path.join(os.getenv("APPDATA"), "Cursor", "machineId"))
return config.get('WindowsPaths', 'machine_id_path')
elif sys.platform == "linux": # Linux
if not config.has_section('LinuxPaths'):
config.add_section('LinuxPaths')
config.set('LinuxPaths', 'machine_id_path',
os.path.expanduser("~/.config/cursor/machineid"))
return config.get('LinuxPaths', 'machine_id_path')
elif sys.platform == "darwin": # macOS
if not config.has_section('MacPaths'):
config.add_section('MacPaths')
config.set('MacPaths', 'machine_id_path',
os.path.expanduser("~/Library/Application Support/Cursor/machineId"))
return config.get('MacPaths', 'machine_id_path')
else:
raise OSError(f"Unsupported operating system: {sys.platform}")
# Save any changes to config file
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
def get_workbench_cursor_path(translator=None) -> str:
"""Get Cursor workbench.desktop.main.js path"""
system = platform.system()
# Read configuration
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if os.path.exists(config_file):
config.read(config_file)
paths_map = {
"Darwin": { # macOS
"base": "/Applications/Cursor.app/Contents/Resources/app",
"main": "out/vs/workbench/workbench.desktop.main.js"
},
"Windows": {
"main": "out\\vs\\workbench\\workbench.desktop.main.js"
},
"Linux": {
"bases": ["/opt/Cursor/resources/app", "/usr/share/cursor/resources/app"],
"main": "out/vs/workbench/workbench.desktop.main.js"
}
}
if system == "Linux":
# Look for extracted AppImage with correct usr structure
extracted_usr_paths = glob.glob(os.path.expanduser("~/squashfs-root/usr/share/cursor/resources/app"))
# Check current directory for extraction
current_dir_paths = glob.glob("squashfs-root/usr/share/cursor/resources/app")
paths_map["Linux"]["bases"].extend(extracted_usr_paths)
paths_map["Linux"]["bases"].extend(current_dir_paths)
for base in paths_map["Linux"]["bases"]:
main_path = os.path.join(base, paths_map["Linux"]["main"])
if os.path.exists(main_path):
return main_path
raise OSError(translator.get('reset.linux_path_not_found') if translator else "在 Linux 系统上未找到 Cursor 安装路径")
if system == "Windows":
base_path = config.get('WindowsPaths', 'cursor_path')
elif system == "Darwin":
base_path = paths_map[system]["base"]
if config.has_section('MacPaths') and config.has_option('MacPaths', 'cursor_path'):
base_path = config.get('MacPaths', 'cursor_path')
else: # Linux
# For Linux, we've already checked all bases in the loop above
# If we're here, it means none of the bases worked, so we'll use the first one
base_path = paths_map[system]["bases"][0]
if config.has_section('LinuxPaths') and config.has_option('LinuxPaths', 'cursor_path'):
base_path = config.get('LinuxPaths', 'cursor_path')
# Get the main path for non-Linux systems or if Linux path wasn't found in the loop
main_path = os.path.join(base_path, paths_map[system]["main"])
if not os.path.exists(main_path):
raise OSError(translator.get('reset.file_not_found', path=main_path) if translator else f"未找到 Cursor main.js 文件: {main_path}")
return main_path
def version_check(version: str, min_version: str = "", max_version: str = "", translator=None) -> bool:
"""Version number check"""
version_pattern = r"^\d+\.\d+\.\d+$"
try:
if not re.match(version_pattern, version):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.invalid_version_format', version=version)}{Style.RESET_ALL}")
return False
def parse_version(ver: str) -> Tuple[int, ...]:
return tuple(map(int, ver.split(".")))
current = parse_version(version)
if min_version and current < parse_version(min_version):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.version_too_low', version=version, min_version=min_version)}{Style.RESET_ALL}")
return False
if max_version and current > parse_version(max_version):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.version_too_high', version=version, max_version=max_version)}{Style.RESET_ALL}")
return False
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.version_check_error', error=str(e))}{Style.RESET_ALL}")
return False
def check_cursor_version(translator) -> bool:
"""Check Cursor version"""
try:
pkg_path, _ = get_cursor_paths(translator)
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('reset.reading_package_json', path=pkg_path)}{Style.RESET_ALL}")
try:
with open(pkg_path, "r", encoding="utf-8") as f:
data = json.load(f)
except UnicodeDecodeError:
# If UTF-8 reading fails, try other encodings
with open(pkg_path, "r", encoding="latin-1") as f:
data = json.load(f)
if not isinstance(data, dict):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.invalid_json_object')}{Style.RESET_ALL}")
return False
if "version" not in data:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.no_version_field')}{Style.RESET_ALL}")
return False
version = str(data["version"]).strip()
if not version:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.version_field_empty')}{Style.RESET_ALL}")
return False
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('reset.found_version', version=version)}{Style.RESET_ALL}")
# Check version format
if not re.match(r"^\d+\.\d+\.\d+$", version):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.invalid_version_format', version=version)}{Style.RESET_ALL}")
return False
# Compare versions
try:
current = tuple(map(int, version.split(".")))
min_ver = (0, 45, 0) # Use tuple directly instead of string
if current >= min_ver:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.version_check_passed', version=version, min_version='0.45.0')}{Style.RESET_ALL}")
return True
else:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('reset.version_too_low', version=version, min_version='0.45.0')}{Style.RESET_ALL}")
return False
except ValueError as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.version_parse_error', error=str(e))}{Style.RESET_ALL}")
return False
except FileNotFoundError as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.package_not_found', path=pkg_path)}{Style.RESET_ALL}")
return False
except json.JSONDecodeError as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.invalid_json_object')}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.check_version_failed', error=str(e))}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('reset.stack_trace')}: {traceback.format_exc()}{Style.RESET_ALL}")
return False
def modify_workbench_js(file_path: str, translator=None) -> bool:
"""
Modify file content
"""
try:
# Save original file permissions
original_stat = os.stat(file_path)
original_mode = original_stat.st_mode
original_uid = original_stat.st_uid
original_gid = original_stat.st_gid
# Create temporary file
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", errors="ignore", delete=False) as tmp_file:
# Read original content
with open(file_path, "r", encoding="utf-8", errors="ignore") as main_file:
content = main_file.read()
if sys.platform == "win32":
# Define replacement patterns
CButton_old_pattern = r'$(k,E(Ks,{title:"Upgrade to Pro",size:"small",get codicon(){return F.rocket},get onClick(){return t.pay}}),null)'
CButton_new_pattern = r'$(k,E(Ks,{title:"yeongpin GitHub",size:"small",get codicon(){return F.rocket},get onClick(){return function(){window.open("https://github.com/yeongpin/cursor-free-vip","_blank")}}}),null)'
elif sys.platform == "linux":
CButton_old_pattern = r'$(k,E(Ks,{title:"Upgrade to Pro",size:"small",get codicon(){return F.rocket},get onClick(){return t.pay}}),null)'
CButton_new_pattern = r'$(k,E(Ks,{title:"yeongpin GitHub",size:"small",get codicon(){return F.rocket},get onClick(){return function(){window.open("https://github.com/yeongpin/cursor-free-vip","_blank")}}}),null)'
elif sys.platform == "darwin":
CButton_old_pattern = r'M(x,I(as,{title:"Upgrade to Pro",size:"small",get codicon(){return $.rocket},get onClick(){return t.pay}}),null)'
CButton_new_pattern = r'M(x,I(as,{title:"yeongpin GitHub",size:"small",get codicon(){return $.rocket},get onClick(){return function(){window.open("https://github.com/yeongpin/cursor-free-vip","_blank")}}}),null)'
CBadge_old_pattern = r'<div>Pro Trial'
CBadge_new_pattern = r'<div>Pro'
CToast_old_pattern = r'notifications-toasts'
CToast_new_pattern = r'notifications-toasts hidden'
# Replace content
content = content.replace(CButton_old_pattern, CButton_new_pattern)
content = content.replace(CBadge_old_pattern, CBadge_new_pattern)
content = content.replace(CToast_old_pattern, CToast_new_pattern)
# Write to temporary file
tmp_file.write(content)
tmp_path = tmp_file.name
# Backup original file
backup_path = file_path + ".backup"
if os.path.exists(backup_path):
os.remove(backup_path)
shutil.copy2(file_path, backup_path)
# Move temporary file to original position
if os.path.exists(file_path):
os.remove(file_path)
shutil.move(tmp_path, file_path)
# Restore original permissions
os.chmod(file_path, original_mode)
if os.name != "nt": # Not Windows
os.chown(file_path, original_uid, original_gid)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.file_modified')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.modify_file_failed', error=str(e))}{Style.RESET_ALL}")
if "tmp_path" in locals():
try:
os.unlink(tmp_path)
except:
pass
return False
def modify_main_js(main_path: str, translator) -> bool:
"""Modify main.js file"""
try:
original_stat = os.stat(main_path)
original_mode = original_stat.st_mode
original_uid = original_stat.st_uid
original_gid = original_stat.st_gid
with tempfile.NamedTemporaryFile(mode="w", delete=False) as tmp_file:
with open(main_path, "r", encoding="utf-8") as main_file:
content = main_file.read()
patterns = {
r"async getMachineId\(\)\{return [^??]+\?\?([^}]+)\}": r"async getMachineId(){return \1}",
r"async getMacMachineId\(\)\{return [^??]+\?\?([^}]+)\}": r"async getMacMachineId(){return \1}",
}
for pattern, replacement in patterns.items():
content = re.sub(pattern, replacement, content)
tmp_file.write(content)
tmp_path = tmp_file.name
shutil.copy2(main_path, main_path + ".old")
shutil.move(tmp_path, main_path)
os.chmod(main_path, original_mode)
if os.name != "nt":
os.chown(main_path, original_uid, original_gid)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.file_modified')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.modify_file_failed', error=str(e))}{Style.RESET_ALL}")
if "tmp_path" in locals():
os.unlink(tmp_path)
return False
def patch_cursor_get_machine_id(translator) -> bool:
"""Patch Cursor getMachineId function"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('reset.start_patching')}...{Style.RESET_ALL}")
# Get paths
pkg_path, main_path = get_cursor_paths(translator)
# Check file permissions
for file_path in [pkg_path, main_path]:
if not os.path.isfile(file_path):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.file_not_found', path=file_path)}{Style.RESET_ALL}")
return False
if not os.access(file_path, os.W_OK):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.no_write_permission', path=file_path)}{Style.RESET_ALL}")
return False
# Get version number
try:
with open(pkg_path, "r", encoding="utf-8") as f:
version = json.load(f)["version"]
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('reset.current_version', version=version)}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.read_version_failed', error=str(e))}{Style.RESET_ALL}")
return False
# Check version
if not version_check(version, min_version="0.45.0", translator=translator):
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.version_not_supported')}{Style.RESET_ALL}")
return False
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('reset.version_check_passed')}{Style.RESET_ALL}")
# Backup file
backup_path = main_path + ".bak"
if not os.path.exists(backup_path):
shutil.copy2(main_path, backup_path)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.backup_created', path=backup_path)}{Style.RESET_ALL}")
# Modify file
if not modify_main_js(main_path, translator):
return False
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('reset.patch_completed')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('reset.patch_failed', error=str(e))}{Style.RESET_ALL}")
return False
class MachineIDResetter:
def __init__(self, translator=None):
self.translator = translator
# Read configuration
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if not os.path.exists(config_file):
raise FileNotFoundError(f"Config file not found: {config_file}")
config.read(config_file, encoding='utf-8')
# Check operating system
if sys.platform == "win32": # Windows
appdata = os.getenv("APPDATA")
if appdata is None:
raise EnvironmentError("APPDATA Environment Variable Not Set")
if not config.has_section('WindowsPaths'):
config.add_section('WindowsPaths')
config.set('WindowsPaths', 'storage_path', os.path.join(
appdata, "Cursor", "User", "globalStorage", "storage.json"
))
config.set('WindowsPaths', 'sqlite_path', os.path.join(
appdata, "Cursor", "User", "globalStorage", "state.vscdb"
))
self.db_path = config.get('WindowsPaths', 'storage_path')
self.sqlite_path = config.get('WindowsPaths', 'sqlite_path')
elif sys.platform == "darwin": # macOS
if not config.has_section('MacPaths'):
config.add_section('MacPaths')
config.set('MacPaths', 'storage_path', os.path.abspath(os.path.expanduser(
"~/Library/Application Support/Cursor/User/globalStorage/storage.json"
)))
config.set('MacPaths', 'sqlite_path', os.path.abspath(os.path.expanduser(
"~/Library/Application Support/Cursor/User/globalStorage/state.vscdb"
)))
self.db_path = config.get('MacPaths', 'storage_path')
self.sqlite_path = config.get('MacPaths', 'sqlite_path')
elif sys.platform == "linux": # Linux
if not config.has_section('LinuxPaths'):
config.add_section('LinuxPaths')
# Get actual user's home directory
sudo_user = os.environ.get('SUDO_USER')
actual_home = f"/home/{sudo_user}" if sudo_user else os.path.expanduser("~")
config.set('LinuxPaths', 'storage_path', os.path.abspath(os.path.join(
actual_home,
".config/cursor/User/globalStorage/storage.json"
)))
config.set('LinuxPaths', 'sqlite_path', os.path.abspath(os.path.join(
actual_home,
".config/cursor/User/globalStorage/state.vscdb"
)))
self.db_path = config.get('LinuxPaths', 'storage_path')
self.sqlite_path = config.get('LinuxPaths', 'sqlite_path')
else:
raise NotImplementedError(f"Not Supported OS: {sys.platform}")
# Save any changes to config file
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
def generate_new_ids(self):
"""Generate new machine ID"""
# Generate new UUID
dev_device_id = str(uuid.uuid4())
# Generate new machineId (64 characters of hexadecimal)
machine_id = hashlib.sha256(os.urandom(32)).hexdigest()
# Generate new macMachineId (128 characters of hexadecimal)
mac_machine_id = hashlib.sha512(os.urandom(64)).hexdigest()
# Generate new sqmId
sqm_id = "{" + str(uuid.uuid4()).upper() + "}"
self.update_machine_id_file(dev_device_id)
return {
"telemetry.devDeviceId": dev_device_id,
"telemetry.macMachineId": mac_machine_id,
"telemetry.machineId": machine_id,
"telemetry.sqmId": sqm_id,
"storage.serviceMachineId": dev_device_id, # Add storage.serviceMachineId
}
def update_sqlite_db(self, new_ids):
"""Update machine ID in SQLite database"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.updating_sqlite')}...{Style.RESET_ALL}")
conn = sqlite3.connect(self.sqlite_path)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS ItemTable (
key TEXT PRIMARY KEY,
value TEXT
)
""")
updates = [
(key, value) for key, value in new_ids.items()
]
for key, value in updates:
cursor.execute("""
INSERT OR REPLACE INTO ItemTable (key, value)
VALUES (?, ?)
""", (key, value))
print(f"{EMOJI['INFO']} {Fore.CYAN} {self.translator.get('reset.updating_pair')}: {key}{Style.RESET_ALL}")
conn.commit()
conn.close()
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.sqlite_success')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.sqlite_error', error=str(e))}{Style.RESET_ALL}")
return False
def update_system_ids(self, new_ids):
"""Update system-level IDs"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.updating_system_ids')}...{Style.RESET_ALL}")
if sys.platform.startswith("win"):
self._update_windows_machine_guid()
self._update_windows_machine_id()
elif sys.platform == "darwin":
self._update_macos_platform_uuid(new_ids)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.system_ids_updated')}{Style.RESET_ALL}")
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.system_ids_update_failed', error=str(e))}{Style.RESET_ALL}")
return False
def _update_windows_machine_guid(self):
"""Update Windows MachineGuid"""
try:
import winreg
key = winreg.OpenKey(
winreg.HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Cryptography",
0,
winreg.KEY_WRITE | winreg.KEY_WOW64_64KEY
)
new_guid = str(uuid.uuid4())
winreg.SetValueEx(key, "MachineGuid", 0, winreg.REG_SZ, new_guid)
winreg.CloseKey(key)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.windows_machine_guid_updated')}{Style.RESET_ALL}")
except PermissionError:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.permission_denied')}{Style.RESET_ALL}")
raise
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.update_windows_machine_guid_failed', error=str(e))}{Style.RESET_ALL}")
raise
def _update_windows_machine_id(self):
"""Update Windows MachineId in SQMClient registry"""
try:
import winreg
# 1. Generate new GUID
new_guid = "{" + str(uuid.uuid4()).upper() + "}"
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.new_machine_id')}: {new_guid}{Style.RESET_ALL}")
# 2. Open the registry key
try:
key = winreg.OpenKey(
winreg.HKEY_LOCAL_MACHINE,
r"SOFTWARE\Microsoft\SQMClient",
0,
winreg.KEY_WRITE | winreg.KEY_WOW64_64KEY
)
except FileNotFoundError:
# If the key does not exist, create it
key = winreg.CreateKey(
winreg.HKEY_LOCAL_MACHINE,
r"SOFTWARE\Microsoft\SQMClient"
)
# 3. Set MachineId value
winreg.SetValueEx(key, "MachineId", 0, winreg.REG_SZ, new_guid)
winreg.CloseKey(key)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.windows_machine_id_updated')}{Style.RESET_ALL}")
return True
except PermissionError:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.permission_denied')}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('reset.run_as_admin')}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.update_windows_machine_id_failed', error=str(e))}{Style.RESET_ALL}")
return False
def _update_macos_platform_uuid(self, new_ids):
"""Update macOS Platform UUID"""
try:
uuid_file = "/var/root/Library/Preferences/SystemConfiguration/com.apple.platform.uuid.plist"
if os.path.exists(uuid_file):
# Use sudo to execute plutil command
cmd = f'sudo plutil -replace "UUID" -string "{new_ids["telemetry.macMachineId"]}" "{uuid_file}"'
result = os.system(cmd)
if result == 0:
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.macos_platform_uuid_updated')}{Style.RESET_ALL}")
else:
raise Exception(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.failed_to_execute_plutil_command')}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.update_macos_platform_uuid_failed', error=str(e))}{Style.RESET_ALL}")
raise
def reset_machine_ids(self):
"""Reset machine ID and backup original file"""
try:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.checking')}...{Style.RESET_ALL}")
if not os.path.exists(self.db_path):
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.not_found')}: {self.db_path}{Style.RESET_ALL}")
return False
if not os.access(self.db_path, os.R_OK | os.W_OK):
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.no_permission')}{Style.RESET_ALL}")
return False
print(f"{Fore.CYAN}{EMOJI['FILE']} {self.translator.get('reset.reading')}...{Style.RESET_ALL}")
with open(self.db_path, "r", encoding="utf-8") as f:
config = json.load(f)
backup_path = self.db_path + ".bak"
if not os.path.exists(backup_path):
print(f"{Fore.YELLOW}{EMOJI['BACKUP']} {self.translator.get('reset.creating_backup')}: {backup_path}{Style.RESET_ALL}")
shutil.copy2(self.db_path, backup_path)
else:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.backup_exists')}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{EMOJI['RESET']} {self.translator.get('reset.generating')}...{Style.RESET_ALL}")
new_ids = self.generate_new_ids()
# Update configuration file
config.update(new_ids)
print(f"{Fore.CYAN}{EMOJI['FILE']} {self.translator.get('reset.saving_json')}...{Style.RESET_ALL}")
with open(self.db_path, "w", encoding="utf-8") as f:
json.dump(config, f, indent=4)
# Update SQLite database
self.update_sqlite_db(new_ids)
# Update system IDs
self.update_system_ids(new_ids)
# Modify workbench.desktop.main.js
workbench_path = get_workbench_cursor_path(self.translator)
modify_workbench_js(workbench_path, self.translator)
# Check Cursor version and perform corresponding actions
greater_than_0_45 = check_cursor_version(self.translator)
if greater_than_0_45:
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.detecting_version')} >= 0.45.0{self.translator.get('reset.patching_getmachineid')}{Style.RESET_ALL}")
patch_cursor_get_machine_id(self.translator)
else:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.version_less_than_0_45')}{Style.RESET_ALL}")
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.success')}{Style.RESET_ALL}")
print(f"\n{Fore.CYAN}{self.translator.get('reset.new_id')}:{Style.RESET_ALL}")
for key, value in new_ids.items():
print(f"{EMOJI['INFO']} {key}: {Fore.GREEN}{value}{Style.RESET_ALL}")
return True
except PermissionError as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.permission_error', error=str(e))}{Style.RESET_ALL}")
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.run_as_admin')}{Style.RESET_ALL}")
return False
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('reset.process_error', error=str(e))}{Style.RESET_ALL}")
return False
def update_machine_id_file(self, machine_id: str) -> bool:
"""
Update machineId file with new machine_id
Args:
machine_id (str): New machine ID to write
Returns:
bool: True if successful, False otherwise
"""
try:
# Get the machineId file path
machine_id_path = get_cursor_machine_id_path()
# Create directory if it doesn't exist
os.makedirs(os.path.dirname(machine_id_path), exist_ok=True)
# Create backup if file exists
if os.path.exists(machine_id_path):
backup_path = machine_id_path + ".backup"
try:
shutil.copy2(machine_id_path, backup_path)
print(f"{Fore.GREEN}{EMOJI['INFO']} {self.translator.get('reset.backup_created', path=backup_path) if self.translator else f'Backup created at: {backup_path}'}{Style.RESET_ALL}")
except Exception as e:
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.backup_creation_failed', error=str(e)) if self.translator else f'Could not create backup: {str(e)}'}{Style.RESET_ALL}")
# Write new machine ID to file
with open(machine_id_path, "w", encoding="utf-8") as f:
f.write(machine_id)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.update_success') if self.translator else 'Successfully updated machineId file'}{Style.RESET_ALL}")
return True
except Exception as e:
error_msg = f"Failed to update machineId file: {str(e)}"
if self.translator:
error_msg = self.translator.get('reset.update_failed', error=str(e))
print(f"{Fore.RED}{EMOJI['ERROR']} {error_msg}{Style.RESET_ALL}")
return False
def run(translator=None):
config = get_config(translator)
if not config:
return False
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{EMOJI['RESET']} {translator.get('reset.title')}{Style.RESET_ALL}")
print(f"{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
resetter = MachineIDResetter(translator) # Correctly pass translator
resetter.reset_machine_ids()
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
input(f"{EMOJI['INFO']} {translator.get('reset.press_enter')}...")
if __name__ == "__main__":
from main import translator as main_translator
run(main_translator)

View File

@ -1,18 +0,0 @@
{
"manifest_version": 3,
"name": "Turnstile Patcher",
"version": "2.1",
"content_scripts": [
{
"js": [
"./script.js"
],
"matches": [
"<all_urls>"
],
"run_at": "document_start",
"all_frames": true,
"world": "MAIN"
}
]
}

View File

@ -1,50 +0,0 @@
function qSelector(selector) {
return document.querySelector(selector);
}
(function() {
'use strict';
var solved = false;
var checkBoxClicked = false;
var requestCount = 0;
const MAX_ATTEMPTS = 1;
const CHECK_BOX = ".recaptcha-checkbox-border";
const AUDIO_BUTTON = "#recaptcha-audio-button";
const PLAY_BUTTON = ".rc-audiochallenge-play-button .rc-button-default";
const AUDIO_SOURCE = "#audio-source";
const IMAGE_SELECT = "#rc-imageselect";
const RESPONSE_FIELD = ".rc-audiochallenge-response-field";
const AUDIO_ERROR_MESSAGE = ".rc-audiochallenge-error-message";
const AUDIO_RESPONSE = "#audio-response";
const RELOAD_BUTTON = "#recaptcha-reload-button";
const RECAPTCHA_STATUS = "#recaptcha-accessible-status";
const DOSCAPTCHA = ".rc-doscaptcha-body";
const VERIFY_BUTTON = "#recaptcha-verify-button";
var recaptchaInitialStatus = qSelector(RECAPTCHA_STATUS) ? qSelector(RECAPTCHA_STATUS).innerText : ""
function isHidden(el) {
return(el.offsetParent === null)
}
try {
if(!checkBoxClicked && qSelector(CHECK_BOX) && !isHidden(qSelector(CHECK_BOX))) {
//console.log("checkbox clicked");
qSelector(CHECK_BOX).click();
checkBoxClicked = true;
}
//Check if the captcha is solved
if(qSelector(RECAPTCHA_STATUS) && (qSelector(RECAPTCHA_STATUS).innerText != recaptchaInitialStatus)) {
solved = true;
console.log("SOLVED");
}
if(requestCount > MAX_ATTEMPTS) {
console.log("Attempted Max Retries. Stopping the solver");
solved = true;
}
//Stop solving when Automated queries message is shown
if(qSelector(DOSCAPTCHA) && qSelector(DOSCAPTCHA).innerText.length > 0) {
console.log("Automated Queries Detected");
}
} catch(err) {
console.log(err.message);
console.log("An error occurred while solving. Stopping the solver.");
}
})();

View File

@ -1,12 +0,0 @@
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
// old method wouldn't work on 4k screens
let screenX = getRandomInt(800, 1200);
let screenY = getRandomInt(400, 600);
Object.defineProperty(MouseEvent.prototype, 'screenX', { value: screenX });
Object.defineProperty(MouseEvent.prototype, 'screenY', { value: screenY });

View File

@ -1,69 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>uBlock — Your filters</title>
<link rel="stylesheet" href="lib/codemirror/lib/codemirror.css">
<link rel="stylesheet" href="lib/codemirror/addon/hint/show-hint.css">
<link rel="stylesheet" href="lib/codemirror/addon/search/matchesonscrollbar.css">
<link rel="stylesheet" href="css/themes/default.css">
<link rel="stylesheet" href="css/common.css">
<link rel="stylesheet" href="css/fa-icons.css">
<link rel="stylesheet" href="css/dashboard-common.css">
<link rel="stylesheet" href="css/cloud-ui.css">
<link rel="stylesheet" href="css/1p-filters.css">
<link rel="stylesheet" href="css/codemirror.css">
</head>
<body>
<div class="body">
<div id="cloudWidget" class="hide" data-cloud-entry="myFiltersPane"></div>
<p>
<button id="userFiltersApply" class="preferred iconified" type="button" disabled><span class="fa-icon">check</span><span data-i18n="1pApplyChanges">_</span><span class="hover"></span></button>
<button id="userFiltersRevert" class="iconified" type="button" disabled><span class="fa-icon">undo</span><span data-i18n="genericRevert">_</span><span class="hover"></span></button>
&emsp;
<button id="importUserFiltersFromFile" class="iconified" type="button"><span class="fa-icon">download-alt</span><span data-i18n="1pImport">_</span><span class="hover"></span></button>
<button id="exportUserFiltersToFile" class="iconified" type="button"><span class="fa-icon">upload-alt</span><span data-i18n="1pExport">_</span><span class="hover"></span></button>
</p>
<p data-i18n="1pTrustWarning"></p>
<div class="li"><label><span id="enableMyFilters" class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span data-i18n="1pEnableMyFiltersLabel"></span></label></div>
<div id="trustMyFilters" class="li"><label><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span data-i18n="1pTrustMyFiltersLabel"></span></label></div>
</div>
<div id="userFilters" class="codeMirrorContainer codeMirrorBreakAll cm-theme-override" spellcheck="false"></div>
<div class="hidden">
<input id="importFilePicker" type="file" accept="text/plain">
</div>
<script src="lib/codemirror/lib/codemirror.js"></script>
<script src="lib/codemirror/addon/comment/comment.js"></script>
<script src="lib/codemirror/addon/display/panel.js"></script>
<script src="lib/codemirror/addon/edit/closebrackets.js"></script>
<script src="lib/codemirror/addon/edit/matchbrackets.js"></script>
<script src="lib/codemirror/addon/fold/foldcode.js"></script>
<script src="lib/codemirror/addon/hint/show-hint.js"></script>
<script src="lib/codemirror/addon/scroll/annotatescrollbar.js"></script>
<script src="lib/codemirror/addon/search/searchcursor.js"></script>
<script src="lib/codemirror/addon/selection/active-line.js"></script>
<script src="lib/diff/swatinem_diff.js"></script>
<script src="lib/hsluv/hsluv-0.1.0.min.js"></script>
<script src="js/vapi.js"></script>
<script src="js/vapi-common.js"></script>
<script src="js/vapi-client.js"></script>
<script src="js/codemirror/search.js" type="module"></script>
<script src="js/codemirror/search-thread.js"></script>
<script src="js/fa-icons.js" type="module"></script>
<script src="js/theme.js" type="module"></script>
<script src="js/i18n.js" type="module"></script>
<script src="js/dashboard-common.js" type="module"></script>
<script src="js/cloud-ui.js" type="module"></script>
<script src="js/1p-filters.js" type="module"></script>
</body>
</html>

View File

@ -1,117 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<title>uBlock — Filter lists</title>
<link rel="stylesheet" type="text/css" href="css/themes/default.css">
<link rel="stylesheet" type="text/css" href="css/common.css">
<link rel="stylesheet" type="text/css" href="css/fa-icons.css">
<link rel="stylesheet" type="text/css" href="css/dashboard-common.css">
<link rel="stylesheet" type="text/css" href="css/cloud-ui.css">
<link rel="stylesheet" type="text/css" href="css/3p-filters.css">
</head>
<body>
<div class="body">
<div id="cloudWidget" class="hide" data-cloud-entry="tpFiltersPane"></div>
<p id="actions">
<button id="buttonApply" class="preferred disabled iconified dontshrink" type="button" data-i18n-title="3pApplyChanges"><span class="fa-icon">check</span><span data-i18n="3pApplyChanges">_</span><span class="hover"></span></button>
<button id="buttonUpdate" class="preferred disabled iconified" type="button" data-i18n-title="3pUpdateNow"><span class="fa-icon">refresh</span><span data-i18n="3pUpdateNow">_</span><span class="hover"></span></button>
</p>
<div>
<div class="li">
<label><span class="input checkbox"><input type="checkbox" id="autoUpdate"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span data-i18n="3pAutoUpdatePrompt1"></span></label>
</div>
<div class="li">
<label><span class="input checkbox"><input type="checkbox" id="suspendUntilListsAreLoaded"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span data-i18n="3pSuspendUntilListsAreLoaded"></span></label>
</div>
<div class="li">
<label><span class="input checkbox"><input type="checkbox" id="parseCosmeticFilters"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span><span data-i18n="3pParseAllABPHideFiltersPrompt1"></span>&nbsp;<span class="fa-icon info" data-i18n-title="3pParseAllABPHideFiltersInfo">question-circle</span></span></label>
</div>
<div class="li">
<label><span class="input checkbox"><input type="checkbox" id="ignoreGenericCosmeticFilters"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span><span data-i18n="3pIgnoreGenericCosmeticFilters"></span>&nbsp;<span class="fa-icon info" data-i18n-title="3pIgnoreGenericCosmeticFiltersInfo">question-circle</span></span></label>
</div>
</div>
<div>
</div>
<div id="lists">
<div class="rootstats expandable" data-key="*">
<span class="fa-icon listExpander">angle-up</span><span id="listsOfBlockedHostsPrompt"></span>
</div>
<div class="searchfield"><input type="search" spellcheck="false" placeholder="" /><span class="fa-icon">search</span></div>
<div class="listEntries"></div>
<div class="li listEntry expandable" data-role="import">
<span class="detailbar">
<label><span class="fa-icon listExpander">angle-up</span><span class="listname" data-i18n="3pImport"></span></label>
<a class="fa-icon info towiki" href="https://github.com/gorhill/uBlock/wiki/Filter-lists-from-around-the-web" target="_blank">info-circle</a>
</span>
<textarea dir="ltr" spellcheck="false" placeholder="3pExternalListsHint"></textarea>
</div>
</div>
</div>
<div id="templates" style="display: none;">
<div class="listEntries"></div>
<div class="li listEntry" data-role="leaf">
<span class="detailbar">
<label><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span><span class="listname forinput"></span>
</span></label>
<span class="iconbar"><!--
--><a class="fa-icon content" href="#" type="text/plain" target="_blank" data-i18n-title="3pViewContent">eye-open</a><!--
--><a class="fa-icon support" href="#" target="_blank">home</a><!--
--><span class="fa-icon remove">trash-o</span><!--
--><a class="fa-icon mustread" href="#" target="_blank">info-circle</a><!--
--><span class="fa-icon status unsecure" title="http">unlock-alt</span><!--
--><span class="fa-icon status obsolete" data-i18n-title="3pExternalListObsolete">exclamation-triangle</span><!--
--><span class="fa-icon status cache">clock-o</span><!--
--><span class="fa-icon status updating" data-i18n-title="3pUpdating">spinner</span><!--
--><span class="fa-icon status failed" data-i18n-title="3pNetworkError">unlink</span>
</span>
<span class="leafstats"></span>
</span>
</div>
<div class="li listEntry expandable" data-role="node">
<span class="detailbar">
<label><span class="input checkbox"><input type="checkbox"><svg viewBox="0 0 24 24"><path d="M1.73,12.91 8.1,19.28 22.79,4.59"/></svg></span><span class="listname forinput"></span></label>
<span class="nodestats"></span>
<span class="fa-icon listExpander">angle-up</span>
<span class="iconbar"><!--
--><a class="fa-icon support" href="#" target="_blank">home</a><!--
--><a class="fa-icon mustread" href="#" target="_blank">info-circle</a><!--
--><span class="fa-icon status obsolete" data-i18n-title="3pExternalListObsolete">exclamation-triangle</span><!--
--><span class="fa-icon status cache">clock-o</span><!--
--><span class="fa-icon status updating" data-i18n-title="3pUpdating">spinner</span><!--
--><span class="fa-icon status failed" data-i18n-title="3pNetworkError">unlink</span>
</span>
<span class="leafstats"></span>
</span>
</div>
<div class="li listEntry expandable" data-parent="root" data-role="node">
<span class="detailbar">
<label><span class="fa-icon listExpander">angle-up</span><span class="listname"></span></label>
<span class="nodestats"></span>
</span>
</div>
</div>
<script src="lib/hsluv/hsluv-0.1.0.min.js"></script>
<script src="js/fa-icons.js" type="module"></script>
<script src="js/vapi.js"></script>
<script src="js/vapi-common.js"></script>
<script src="js/vapi-client.js"></script>
<script src="js/theme.js" type="module"></script>
<script src="js/i18n.js" type="module"></script>
<script src="js/dashboard-common.js" type="module"></script>
<script src="js/cloud-ui.js" type="module"></script>
<script src="js/3p-filters.js" type="module"></script>
</body>
</html>

View File

@ -1,674 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. {http://fsf.org/}
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{{project}} Copyright (C) {{year}} {{fullname}}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
{http://www.gnu.org/licenses/}.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
{http://www.gnu.org/philosophy/why-not-lgpl.html}.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More