forked from mirrors/cursor-free-vip
Compare commits
155 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
50c3d0e522 | ||
|
|
2aae59a905 | ||
|
|
c9a294af0b | ||
|
|
d3d73798f6 | ||
|
|
5b091bfaf1 | ||
|
|
0e4d91843f | ||
|
|
f39435f2de | ||
|
|
a1588c7e00 | ||
|
|
8e94fa4e46 | ||
|
|
8d7407c72e | ||
|
|
d365e86952 | ||
|
|
7c2ac9b734 | ||
|
|
f5b0f4f9ea | ||
|
|
1158068a31 | ||
|
|
dee6a788bb | ||
|
|
4286b94a86 | ||
|
|
60bd46f192 | ||
|
|
63d84e0f4d | ||
|
|
23036da768 | ||
|
|
1002c9ca11 | ||
|
|
809dac091d | ||
|
|
da5bff5994 | ||
|
|
296a69bf73 | ||
|
|
5ca6c97d96 | ||
|
|
fb52888f9c | ||
|
|
8e6df1d1f8 | ||
|
|
be5a17c861 | ||
|
|
ca496ea53f | ||
|
|
52eaecd040 | ||
|
|
5fac4d6e45 | ||
|
|
271d5d9db9 | ||
|
|
c2af657c88 | ||
|
|
cf55c91117 | ||
|
|
9abf4f4899 | ||
|
|
a78b1160c2 | ||
|
|
c5453a4374 | ||
|
|
8c497d7639 | ||
|
|
c0c2cd6120 | ||
|
|
e36f6d986e | ||
|
|
0b547c0542 | ||
|
|
ef17ba8803 | ||
|
|
31bf75e4de | ||
|
|
63e4e72ec7 | ||
|
|
b51d9c7a74 | ||
|
|
4aba849cf1 | ||
|
|
1489357328 | ||
|
|
243c47adb4 | ||
|
|
b571356fbf | ||
|
|
615c3ea2db | ||
|
|
cffde7066e | ||
|
|
73a8b23257 | ||
|
|
6d182fda55 | ||
|
|
c243e9f2f6 | ||
|
|
caf996864f | ||
|
|
ce9411dcda | ||
|
|
1c10750c2b | ||
|
|
5aa8dbb614 | ||
|
|
30df4d9ad1 | ||
|
|
4a533436eb | ||
|
|
b271166247 | ||
|
|
75825fe3fe | ||
|
|
56f9a86e7a | ||
|
|
bdb7fa4ddf | ||
|
|
51ac969f76 | ||
|
|
da9d4a3648 | ||
|
|
33a497bf52 | ||
|
|
c392e287fe | ||
|
|
ea4cfaa7ab | ||
|
|
24c1acc562 | ||
|
|
43eea92f21 | ||
|
|
631f8be5e4 | ||
|
|
c8fa00589e | ||
|
|
a3dff87da9 | ||
|
|
861f258ce4 | ||
|
|
ab9202fe48 | ||
|
|
d60c46bac6 | ||
|
|
4757f9777a | ||
|
|
caecbd4c8d | ||
|
|
105b5d4517 | ||
|
|
f325690e32 | ||
|
|
3de2db74b2 | ||
|
|
6153041607 | ||
|
|
6eba95c055 | ||
|
|
21535104a6 | ||
|
|
b42b4b01b9 | ||
|
|
4b9c465dd5 | ||
|
|
b98059a476 | ||
|
|
56882f0663 | ||
|
|
0852472746 | ||
|
|
d867f5cfe9 | ||
|
|
e69e500e8d | ||
|
|
2f012b9dc5 | ||
|
|
d3c6bf227b | ||
|
|
f697b71755 | ||
|
|
5863891f4b | ||
|
|
7e0da4a0cb | ||
|
|
1cdb543ea9 | ||
|
|
5dad4f35a6 | ||
|
|
34a23a69a1 | ||
|
|
3cca2e3b17 | ||
|
|
ee287b91f2 | ||
|
|
96704e9f38 | ||
|
|
f541bc40b4 | ||
|
|
a730b145a1 | ||
|
|
1e72e59985 | ||
|
|
7d355f126c | ||
|
|
abcc3a84fa | ||
|
|
d8f1cbfc3b | ||
|
|
431550e4a9 | ||
|
|
dde25cba02 | ||
|
|
0466421823 | ||
|
|
aa4177d5ec | ||
|
|
75b17bb515 | ||
|
|
80a76b507a | ||
|
|
84b77e8b13 | ||
|
|
f471450e12 | ||
|
|
9f81f94957 | ||
|
|
b423779d04 | ||
|
|
5203634f0a | ||
|
|
1a73ec0a32 | ||
|
|
92263013f2 | ||
|
|
3edb69e831 | ||
|
|
271fc818b1 | ||
|
|
61803031dc | ||
|
|
9a56bc5f7e | ||
|
|
32fea2c82b | ||
|
|
45f10a6da8 | ||
|
|
a4692d11dc | ||
|
|
43a58db339 | ||
|
|
bc55000668 | ||
|
|
84358805fc | ||
|
|
82e2625dfe | ||
|
|
d5404e8f57 | ||
|
|
fb3e532058 | ||
|
|
a7c4631ea4 | ||
|
|
5b64e54e90 | ||
|
|
f667da64b3 | ||
|
|
26a8e8da28 | ||
|
|
3862176867 | ||
|
|
5adc598661 | ||
|
|
5e6651bb32 | ||
|
|
bdc606ce2d | ||
|
|
564e421288 | ||
|
|
dce359dc33 | ||
|
|
ff79fae77b | ||
|
|
db3a2032dc | ||
|
|
e2a33d178d | ||
|
|
42d97cfa87 | ||
|
|
c42d7d5422 | ||
|
|
c7a84ca59f | ||
|
|
4746af7ce9 | ||
|
|
9f51ba8128 | ||
|
|
9aa09c436e | ||
|
|
1e3e9c99eb | ||
|
|
3f9cbc3d08 |
21
.SRCINFO
Normal file
21
.SRCINFO
Normal 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
|
||||
2
.github/ISSUE_TEMPLATE/cn_bug_report.yml
vendored
2
.github/ISSUE_TEMPLATE/cn_bug_report.yml
vendored
@@ -43,7 +43,7 @@ body:
|
||||
attributes:
|
||||
label: 版本
|
||||
description: 您正在运行的 Cursor Free Vip 版本是什么?
|
||||
placeholder: 例如 v1.0.0
|
||||
placeholder: 例如 v1.0.0 ( 不是 Cursor AI 版本 )
|
||||
validations:
|
||||
required: true
|
||||
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/en_bug_report.yml
vendored
2
.github/ISSUE_TEMPLATE/en_bug_report.yml
vendored
@@ -43,7 +43,7 @@ body:
|
||||
attributes:
|
||||
label: Version
|
||||
description: What version of Cursor Free Vip are you running?
|
||||
placeholder: For example v1.0.0
|
||||
placeholder: For example v1.0.0 ( Not Cursor AI Version )
|
||||
validations:
|
||||
required: true
|
||||
|
||||
|
||||
153
.github/workflows/build.yml
vendored
153
.github/workflows/build.yml
vendored
@@ -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.8.09'
|
||||
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: |
|
||||
@@ -66,7 +108,7 @@ jobs:
|
||||
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: |
|
||||
@@ -99,7 +141,7 @@ jobs:
|
||||
path: dist/CursorFreeVIP_${{ env.VERSION }}_mac_arm64
|
||||
|
||||
build-linux-x64:
|
||||
needs: create-tag
|
||||
needs: [determine-version, create-tag]
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
@@ -112,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: |
|
||||
@@ -136,7 +178,7 @@ jobs:
|
||||
path: dist/CursorFreeVIP_${{ env.VERSION }}_linux_x64
|
||||
|
||||
build-linux-arm64:
|
||||
needs: create-tag
|
||||
needs: [determine-version, create-tag]
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
@@ -149,11 +191,11 @@ 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: Build in ARM64 Docker container
|
||||
run: |
|
||||
docker run --rm --platform linux/arm64 -v ${{ github.workspace }}:/app -w /app arm64v8/python:3.9-slim bash -c "
|
||||
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
|
||||
@@ -171,7 +213,7 @@ jobs:
|
||||
path: dist/CursorFreeVIP_${{ env.VERSION }}_linux_arm64
|
||||
|
||||
build-macos-intel:
|
||||
needs: create-tag
|
||||
needs: [determine-version, create-tag]
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
@@ -184,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: |
|
||||
@@ -207,31 +249,82 @@ jobs:
|
||||
path: dist/CursorFreeVIP_${{ env.VERSION }}_mac_intel
|
||||
|
||||
create-release:
|
||||
needs: [build-windows, build-macos-arm64, build-linux-x64, build-linux-arm64, 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
|
||||
echo "Contents of artifacts directory:"
|
||||
ls -la
|
||||
echo "Contents of subdirectories:"
|
||||
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/CursorFreeVIP_${{ env.VERSION }}_windows.exe
|
||||
artifacts/CursorFreeVIP_${{ env.VERSION }}_mac_arm64/CursorFreeVIP_${{ env.VERSION }}_mac_arm64
|
||||
|
||||
116
CHANGELOG.md
116
CHANGELOG.md
@@ -1,5 +1,119 @@
|
||||
# Change Log
|
||||
|
||||
## v1.11.02
|
||||
1. Fill: Missing Translations(ar, 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. Add:Bypass Claude Limit 30000 set to 900000(9e5) | 繞過 Claude 使用限制 30000 設置為 900000(9e5)
|
||||
@@ -263,7 +377,7 @@ These changes make the application more user-friendly by only requesting admin p
|
||||
1. Fix: Cursor Auth | 修復 Cursor Auth
|
||||
2. Add: Create Account Maximum Retry | 增加創建賬號最大重試次數
|
||||
3. Fix: Cursor Auth Error | 修復 Cursor Auth 錯誤
|
||||
4. Fix: Update Curl Faild | 修復更新 Curl 失敗
|
||||
4. Fix: Update Curl Failed | 修復更新 Curl 失敗
|
||||
|
||||
## v1.5.03
|
||||
1. HOTFIX: Stuck on starting browser | 修復啟動瀏覽器卡住問題
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
// Import the contents of your other files
|
||||
importScripts('default_filters.js', 'block.js');
|
||||
|
||||
// Your service worker initialization code can go here
|
||||
console.log('Service worker initialized');
|
||||
129
PBlock/block.js
129
PBlock/block.js
@@ -1,129 +0,0 @@
|
||||
/**
|
||||
* All the actual functionality of the extension; loads as part of the background page.
|
||||
*
|
||||
* Active ingredient is enable(), which sets up the webRequest callbacks.
|
||||
*
|
||||
* */
|
||||
|
||||
let blockingEnabled = false;
|
||||
let allFilters = null;
|
||||
let webRTCPrivacy = null;
|
||||
|
||||
function setFilters(newFilters) {
|
||||
allFilters = newFilters;
|
||||
chrome.storage.local.set({"filters": newFilters});
|
||||
if (blockingEnabled) {
|
||||
refreshFilters();
|
||||
}
|
||||
}
|
||||
|
||||
// Convert URL patterns to declarativeNetRequest rule format
|
||||
function createRules(filters) {
|
||||
return filters.map((filter, index) => ({
|
||||
id: index + 1,
|
||||
priority: 1,
|
||||
action: {
|
||||
type: "block"
|
||||
},
|
||||
condition: {
|
||||
urlFilter: filter.replace("*://", "*"),
|
||||
resourceTypes: [
|
||||
"main_frame", "sub_frame", "stylesheet", "script", "image",
|
||||
"font", "object", "xmlhttprequest", "ping", "media", "websocket"
|
||||
]
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
async function enable(icon = true) {
|
||||
if (blockingEnabled) return;
|
||||
|
||||
if (allFilters && allFilters.length > 0) {
|
||||
const rules = createRules(allFilters);
|
||||
await chrome.declarativeNetRequest.updateDynamicRules({
|
||||
removeRuleIds: rules.map(rule => rule.id),
|
||||
addRules: rules
|
||||
});
|
||||
}
|
||||
|
||||
blockingEnabled = true;
|
||||
if (icon) {
|
||||
chrome.action.setIcon({
|
||||
path: {
|
||||
"16": "enabled16.png",
|
||||
"48": "enabled48.png"
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function disable(icon = true) {
|
||||
if (!blockingEnabled) return;
|
||||
|
||||
const rules = await chrome.declarativeNetRequest.getDynamicRules();
|
||||
await chrome.declarativeNetRequest.updateDynamicRules({
|
||||
removeRuleIds: rules.map(rule => rule.id),
|
||||
addRules: []
|
||||
});
|
||||
|
||||
blockingEnabled = false;
|
||||
if (icon) {
|
||||
chrome.action.setIcon({
|
||||
path: {
|
||||
"16": "disabled.png",
|
||||
"32": "disabled.png"
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function refreshFilters() {
|
||||
await disable(false);
|
||||
await enable(true);
|
||||
}
|
||||
|
||||
async function toggleEnabled() {
|
||||
if (blockingEnabled) {
|
||||
await disable();
|
||||
} else {
|
||||
await enable();
|
||||
}
|
||||
}
|
||||
|
||||
function setWebRTCPrivacy(flag, store = true) {
|
||||
webRTCPrivacy = flag;
|
||||
const privacySetting = flag ? "default_public_interface_only" : "default";
|
||||
chrome.privacy.network.webRTCIPHandlingPolicy.set({value: privacySetting});
|
||||
if (store) {
|
||||
chrome.storage.local.set({"webrtc_privacy": flag});
|
||||
}
|
||||
}
|
||||
|
||||
// Initialization
|
||||
chrome.storage.local.get("filters",
|
||||
function(result) {
|
||||
if (result["filters"] == undefined) {
|
||||
console.log("Initializing filters to defaults.");
|
||||
setFilters(defaultFilters);
|
||||
} else {
|
||||
setFilters(result["filters"]);
|
||||
allFilters = result["filters"];
|
||||
}
|
||||
|
||||
// toggle blocking on-off via the extension icon
|
||||
chrome.action.onClicked.addListener(toggleEnabled);
|
||||
// initialize blocking
|
||||
enable();
|
||||
}
|
||||
);
|
||||
|
||||
chrome.storage.local.get("webrtc_privacy",
|
||||
function(result) {
|
||||
if (result["webrtc_privacy"] == undefined) {
|
||||
console.log("Initializing WebRTC privacy to default.");
|
||||
setWebRTCPrivacy(false, true);
|
||||
} else {
|
||||
setWebRTCPrivacy(result["webrtc_privacy"], false);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -1,14 +0,0 @@
|
||||
defaultFilters = [
|
||||
// personally, I can't stand the like box
|
||||
//"http://www.facebook.com/plugins/likebox.php?*",
|
||||
"*://*.doubleclick.net/*",
|
||||
"*://partner.googleadservices.com/*",
|
||||
"*://*.googlesyndication.com/*",
|
||||
"*://*.google-analytics.com/*",
|
||||
"*://creative.ak.fbcdn.net/*",
|
||||
"*://*.adbrite.com/*",
|
||||
"*://*.exponential.com/*",
|
||||
"*://*.quantserve.com/*",
|
||||
"*://*.scorecardresearch.com/*",
|
||||
"*://*.zedo.com/*",
|
||||
]
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 850 B |
Binary file not shown.
|
Before Width: | Height: | Size: 3.4 KiB |
@@ -1,29 +0,0 @@
|
||||
{
|
||||
"name": "PBlock",
|
||||
"version": "0.1",
|
||||
"manifest_version": 3,
|
||||
"author": "yeongpin",
|
||||
"url": "https://github.com/yeongpin/PBlock",
|
||||
"description": "Just a simple blocker.",
|
||||
"action": {
|
||||
"default_icon": "enabled48.png"
|
||||
},
|
||||
"background": {
|
||||
"service_worker": "background.js"
|
||||
},
|
||||
"icons": {
|
||||
"16": "enabled16.png",
|
||||
"48": "enabled48.png"
|
||||
},
|
||||
"permissions": [
|
||||
"declarativeNetRequest",
|
||||
"storage",
|
||||
"privacy"
|
||||
],
|
||||
"host_permissions": [
|
||||
"http://*/*",
|
||||
"https://*/*",
|
||||
"ws://*/*",
|
||||
"wss://*/*"
|
||||
]
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"id": "ruleset_1",
|
||||
"version": "1.0",
|
||||
"rules": []
|
||||
}
|
||||
34
PKGBUILD
Normal file
34
PKGBUILD
Normal 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"
|
||||
}
|
||||
113
README.md
113
README.md
@@ -7,33 +7,44 @@
|
||||
|
||||
<p align="center">
|
||||
|
||||
[](https://github.com/yeongpin/cursor-free-vip/releases/latest)
|
||||
[](https://github.com/yeongpin/cursor-free-vip/releases/latest)
|
||||
[](https://creativecommons.org/licenses/by-nc-nd/4.0/)
|
||||
[](https://github.com/yeongpin/cursor-free-vip/stargazers)
|
||||
[](https://github.com/yeongpin/cursor-free-vip/releases/latest)
|
||||
[](https://github.com/yeongpin/cursor-free-vip/stargazers)
|
||||
[](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.48.x Version | 支持最新 0.48.x 版本</h4>
|
||||
|
||||
This tool registers accounts with custom emails, support Google and GitHub account registrations, temporary GitHub account registration, kills all Cursor's running processes, resets and wipes Cursor data and hardware info.
|
||||
|
||||
<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.
|
||||
|
||||
Always clean your browser's cache and cookies. If possible, use a VPN to create new accounts.
|
||||
這是一款用於學習和研究的工具,目前 repo 沒有違反任何法律。請支持原作者。
|
||||
這款工具不會生成任何假的電子郵件帳戶和 OAuth 訪問。
|
||||
|
||||
支持 Windows、macOS 和 Linux。
|
||||
|
||||
對於最佳性能,請以管理員身份運行並始終保持最新。
|
||||
|
||||
這是一個自動化工具,自動註冊,支持 Windows 和 macOS 系統,完成 Auth 驗證,重置 Cursor 的配置。
|
||||
|
||||
<p align="center">
|
||||
<img src="./images/pro_2025-04-05_18-47-56.png" alt="new" width="800" style="border-radius: 6px;"/><br>
|
||||
<img src="./images/product_2025-04-16_10-40-21.png" alt="new" width="800" style="border-radius: 6px;"/><br>
|
||||
</p>
|
||||
|
||||
##### If you don't 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/)下載
|
||||
|
||||
</div>
|
||||
|
||||
## 🔄 Change Log | 更新日志
|
||||
@@ -42,42 +53,40 @@ Always clean your browser's cache and cookies. If possible, use a VPN to create
|
||||
|
||||
## ✨ Features | 功能特點
|
||||
|
||||
* 🌟 Google OAuth Authentication with Lifetime Access<br>使用 Google OAuth 認證(終身訪問)<br>
|
||||
|
||||
* ⭐ GitHub OAuth Authentication with Lifetime Access<br>使用 GitHub OAuth 認證(終身訪問)<br>
|
||||
|
||||
* Automatically register Cursor membership<br>自動註冊 Cursor 會員<br>
|
||||
|
||||
* Support Windows and macOS systems<br>支持 Windows 和 macOS 系統<br>
|
||||
|
||||
* Complete Auth verification<br>完成 Auth 驗證<br>
|
||||
* Support Windows macOS and Linux systems<br>支持 Windows、macOS 和 Linux 系統<br>
|
||||
|
||||
* Reset Cursor's configuration<br>重置 Cursor 的配置<br>
|
||||
|
||||
* Delete Cursor Google Account<br>删除 Cursor Google 账号<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
|
||||
@@ -85,23 +94,6 @@ irm https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/scripts/inst
|
||||
|
||||
</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>
|
||||
|
||||
If you want to stop the script, please press Ctrl+C<br>要停止腳本,請按 Ctrl+C
|
||||
|
||||
## ❗ Note | 注意事項
|
||||
@@ -166,6 +158,33 @@ max_timeout = 160
|
||||
check_update = True
|
||||
# Show Account Info | 顯示賬號信息
|
||||
show_account_info = True
|
||||
|
||||
[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>
|
||||
|
||||
@@ -1,83 +1,134 @@
|
||||
oakon.com
|
||||
famamail.com
|
||||
2925.com
|
||||
indigobook.com
|
||||
teihu.com
|
||||
raleigh-construction.com
|
||||
pastryofistanbul.com
|
||||
linshiyouxiang.net
|
||||
Mohmal.com
|
||||
pusmail.com
|
||||
questtechsystems.com
|
||||
ikomail.com
|
||||
ofanda.com
|
||||
pusmail.com
|
||||
ikomail.com
|
||||
mailpull.com
|
||||
drewzen.com
|
||||
begemail.com
|
||||
dugmail.com
|
||||
solerbe.net
|
||||
corhash.net
|
||||
mailshou.com
|
||||
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
|
||||
zippymail.info
|
||||
20
build.spec
20
build.spec
@@ -23,29 +23,13 @@ a = Analysis(
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[
|
||||
('turnstilePatch', 'turnstilePatch'),
|
||||
('PBlock', 'PBlock'),
|
||||
('locales', 'locales'),
|
||||
('cursor_auth.py', '.'),
|
||||
('reset_machine_manual.py', '.'),
|
||||
('cursor_register.py', '.'),
|
||||
('new_signup.py', '.'),
|
||||
('new_tempemail.py', '.'),
|
||||
('quit_cursor.py', '.'),
|
||||
('cursor_register_manual.py', '.'),
|
||||
('oauth_auth.py', '.'),
|
||||
('utils.py', '.'),
|
||||
('.env', '.'),
|
||||
('block_domain.txt', '.')
|
||||
('.env', '.')
|
||||
],
|
||||
hiddenimports=[
|
||||
'cursor_auth',
|
||||
'reset_machine_manual',
|
||||
'new_signup',
|
||||
'new_tempemail',
|
||||
'quit_cursor',
|
||||
'cursor_register_manual',
|
||||
'oauth_auth',
|
||||
'utils'
|
||||
],
|
||||
hookspath=[],
|
||||
@@ -69,7 +53,7 @@ exe = EXE(
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx=False,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=True,
|
||||
|
||||
194
bypass_token_limit.py
Normal file
194
bypass_token_limit.py
Normal file
@@ -0,0 +1,194 @@
|
||||
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":
|
||||
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)
|
||||
@@ -50,6 +50,8 @@ def get_product_json_path(translator=None):
|
||||
|
||||
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
|
||||
|
||||
214
check_user_authorized.py
Normal file
214
check_user_authorized.py
Normal 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()
|
||||
81
config.py
81
config.py
@@ -2,7 +2,7 @@ import os
|
||||
import sys
|
||||
import configparser
|
||||
from colorama import Fore, Style
|
||||
from utils import get_user_documents_path, get_default_chrome_path, get_linux_cursor_path
|
||||
from utils import get_user_documents_path, get_linux_cursor_path, get_default_driver_path, get_default_browser_path
|
||||
import shutil
|
||||
import datetime
|
||||
|
||||
@@ -18,19 +18,59 @@ EMOJI = {
|
||||
"SETTINGS": "⚙️"
|
||||
}
|
||||
|
||||
# global config cache
|
||||
_config_cache = None
|
||||
|
||||
def setup_config(translator=None):
|
||||
"""Setup configuration file and return config object"""
|
||||
try:
|
||||
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
|
||||
config_file = os.path.join(config_dir, "config.ini")
|
||||
os.makedirs(config_dir, exist_ok=True)
|
||||
# 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 = {
|
||||
'Chrome': {
|
||||
'chromepath': get_default_chrome_path()
|
||||
'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',
|
||||
@@ -54,8 +94,23 @@ def setup_config(translator=None):
|
||||
},
|
||||
'Utils': {
|
||||
'enabled_update_check': 'True',
|
||||
'enabled_force_update': '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")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,6 +249,13 @@ def setup_config(translator=None):
|
||||
'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')
|
||||
@@ -312,4 +374,7 @@ def force_update_config(translator=None):
|
||||
|
||||
def get_config(translator=None):
|
||||
"""Get existing config or create new one"""
|
||||
return setup_config(translator)
|
||||
global _config_cache
|
||||
if _config_cache is None:
|
||||
_config_cache = setup_config(translator)
|
||||
return _config_cache
|
||||
@@ -60,22 +60,22 @@ class CursorAuth:
|
||||
|
||||
# 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)}{Style.RESET_ALL}")
|
||||
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')}{Style.RESET_ALL}")
|
||||
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')}{Style.RESET_ALL}")
|
||||
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))}{Style.RESET_ALL}")
|
||||
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):
|
||||
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
|
||||
@@ -100,7 +100,7 @@ class CursorAuth:
|
||||
|
||||
# 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
|
||||
@@ -111,7 +111,7 @@ class CursorAuth:
|
||||
# Set the key-value pairs to update
|
||||
updates = []
|
||||
|
||||
updates.append(("cursorAuth/cachedSignUpType", "Auth_0"))
|
||||
updates.append(("cursorAuth/cachedSignUpType", auth_type))
|
||||
|
||||
if email is not None:
|
||||
updates.append(("cursorAuth/cachedEmail", email))
|
||||
@@ -137,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:
|
||||
@@ -148,12 +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}")
|
||||
@@ -1,263 +0,0 @@
|
||||
import os
|
||||
from colorama import Fore, Style, init
|
||||
import time
|
||||
import random
|
||||
from cursor_auth import CursorAuth
|
||||
from reset_machine_manual import MachineIDResetter
|
||||
|
||||
os.environ["PYTHONVERBOSE"] = "0"
|
||||
os.environ["PYINSTALLER_VERBOSE"] = "0"
|
||||
|
||||
# Initialize colorama
|
||||
init()
|
||||
|
||||
# Define emoji constants
|
||||
EMOJI = {
|
||||
'START': '🚀',
|
||||
'FORM': '📝',
|
||||
'VERIFY': '🔄',
|
||||
'PASSWORD': '🔑',
|
||||
'CODE': '📱',
|
||||
'DONE': '✨',
|
||||
'ERROR': '❌',
|
||||
'WAIT': '⏳',
|
||||
'SUCCESS': '✅',
|
||||
'MAIL': '📧',
|
||||
'KEY': '🔐',
|
||||
'UPDATE': '🔄',
|
||||
'INFO': 'ℹ️'
|
||||
}
|
||||
|
||||
class CursorRegistration:
|
||||
def __init__(self, translator=None):
|
||||
self.translator = translator
|
||||
# Set to display mode
|
||||
os.environ['BROWSER_HEADLESS'] = 'False'
|
||||
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
|
||||
|
||||
# Account information
|
||||
self.password = self._generate_password()
|
||||
# Generate first name and last name separately
|
||||
first_name = random.choice([
|
||||
"James", "John", "Robert", "Michael", "William", "David", "Joseph", "Thomas",
|
||||
"Emma", "Olivia", "Ava", "Isabella", "Sophia", "Mia", "Charlotte", "Amelia",
|
||||
"Liam", "Noah", "Oliver", "Elijah", "Lucas", "Mason", "Logan", "Alexander"
|
||||
])
|
||||
self.last_name = random.choice([
|
||||
"Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis",
|
||||
"Anderson", "Wilson", "Taylor", "Thomas", "Moore", "Martin", "Jackson", "Lee",
|
||||
"Thompson", "White", "Harris", "Clark", "Lewis", "Walker", "Hall", "Young"
|
||||
])
|
||||
|
||||
# Modify first letter of first name
|
||||
new_first_letter = random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
||||
self.first_name = new_first_letter + 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 setup_email(self):
|
||||
"""Setup Email"""
|
||||
try:
|
||||
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.browser_start')}...{Style.RESET_ALL}")
|
||||
|
||||
# Create a temporary email using new_tempemail, passing translator
|
||||
from new_tempemail import NewTempEmail
|
||||
self.temp_email = NewTempEmail(self.translator) # Pass translator
|
||||
|
||||
# Create a temporary email
|
||||
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}")
|
||||
return False
|
||||
|
||||
# Save email address
|
||||
self.email_address = email_address
|
||||
self.email_tab = self.temp_email # Pass NewTempEmail instance
|
||||
|
||||
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 register_cursor(self):
|
||||
"""注册 Cursor"""
|
||||
browser_tab = None
|
||||
try:
|
||||
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.register_start')}...{Style.RESET_ALL}")
|
||||
|
||||
# Directly use new_signup.py to sign up
|
||||
from new_signup import main as new_signup_main
|
||||
|
||||
# Execute the 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,
|
||||
translator=self.translator
|
||||
)
|
||||
|
||||
if result:
|
||||
# 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()
|
||||
except:
|
||||
pass
|
||||
|
||||
return success
|
||||
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
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()
|
||||
except:
|
||||
pass
|
||||
|
||||
def _get_account_info(self):
|
||||
"""Get Account Information and Token"""
|
||||
try:
|
||||
self.signup_tab.get(self.settings_url)
|
||||
time.sleep(2)
|
||||
|
||||
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.signup_tab.ele(usage_selector)
|
||||
total_usage = "未知"
|
||||
if usage_ele:
|
||||
total_usage = usage_ele.text.split("/")[-1].strip()
|
||||
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('register.total_usage', usage=total_usage)}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}{EMOJI['WAIT']} {self.translator.get('register.get_token')}...{Style.RESET_ALL}")
|
||||
max_attempts = 30
|
||||
retry_interval = 2
|
||||
attempts = 0
|
||||
|
||||
while attempts < max_attempts:
|
||||
try:
|
||||
cookies = self.signup_tab.cookies()
|
||||
for cookie in cookies:
|
||||
if cookie.get("name") == "WorkosCursorSessionToken":
|
||||
token = cookie["value"].split("%3A%3A")[1]
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('register.token_success')}{Style.RESET_ALL}")
|
||||
self._save_account_info(token, total_usage)
|
||||
return True
|
||||
|
||||
attempts += 1
|
||||
if attempts < max_attempts:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WAIT']} {self.translator.get('register.token_attempt', attempt=attempts, time=retry_interval)}{Style.RESET_ALL}")
|
||||
time.sleep(retry_interval)
|
||||
else:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.token_max_attempts', max=max_attempts)}{Style.RESET_ALL}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.token_failed', error=str(e))}{Style.RESET_ALL}")
|
||||
attempts += 1
|
||||
if attempts < max_attempts:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WAIT']} {self.translator.get('register.token_attempt', attempt=attempts, time=retry_interval)}{Style.RESET_ALL}")
|
||||
time.sleep(retry_interval)
|
||||
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.account_error', error=str(e))}{Style.RESET_ALL}")
|
||||
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):
|
||||
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}")
|
||||
|
||||
# Reset machine ID
|
||||
print(f"{Fore.CYAN}{EMOJI['UPDATE']} {self.translator.get('register.reset_machine_id')}...{Style.RESET_ALL}")
|
||||
resetter = MachineIDResetter(self.translator) # Pass translator when creating instance
|
||||
if not resetter.reset_machine_ids(): # Call reset_machine_ids method directly
|
||||
raise Exception("Failed to reset machine ID")
|
||||
|
||||
# Save account information to file
|
||||
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
|
||||
|
||||
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():
|
||||
print(f"\n{Fore.GREEN}{EMOJI['DONE']} {self.translator.get('register.cursor_registration_completed')}...{Style.RESET_ALL}")
|
||||
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):
|
||||
"""Update Cursor Auth Info"""
|
||||
auth_manager = CursorAuth(translator=self.translator)
|
||||
return auth_manager.update_auth(email, access_token, refresh_token)
|
||||
|
||||
def main(translator=None):
|
||||
"""Main function to be called from main.py"""
|
||||
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}{EMOJI['START']} {translator.get('register.title')}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
|
||||
|
||||
registration = CursorRegistration(translator)
|
||||
registration.start()
|
||||
|
||||
print(f"\n{Fore.CYAN}{'='*50}{Style.RESET_ALL}")
|
||||
input(f"{EMOJI['INFO']} {translator.get('register.press_enter')}...")
|
||||
|
||||
if __name__ == "__main__":
|
||||
from main import translator as main_translator
|
||||
main(main_translator)
|
||||
@@ -1,5 +0,0 @@
|
||||
from oauth_auth import main as oauth_main
|
||||
|
||||
def main(translator=None):
|
||||
"""Handle GitHub OAuth registration"""
|
||||
oauth_main('github', translator)
|
||||
@@ -1,5 +0,0 @@
|
||||
from oauth_auth import main as oauth_main
|
||||
|
||||
def main(translator=None):
|
||||
"""Handle Google OAuth registration"""
|
||||
oauth_main('google', translator)
|
||||
@@ -2,8 +2,11 @@ import os
|
||||
from colorama import Fore, Style, init
|
||||
import time
|
||||
import random
|
||||
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
|
||||
|
||||
os.environ["PYTHONVERBOSE"] = "0"
|
||||
os.environ["PYINSTALLER_VERBOSE"] = "0"
|
||||
@@ -41,32 +44,25 @@ class CursorRegistration:
|
||||
self.signup_tab = None
|
||||
self.email_tab = None
|
||||
|
||||
# Generate account information
|
||||
self.password = self._generate_password()
|
||||
# Generate first name and last name separately
|
||||
first_name = random.choice([
|
||||
"James", "John", "Robert", "Michael", "William", "David", "Joseph", "Thomas",
|
||||
"Emma", "Olivia", "Ava", "Isabella", "Sophia", "Mia", "Charlotte", "Amelia",
|
||||
"Liam", "Noah", "Oliver", "Elijah", "Lucas", "Mason", "Logan", "Alexander"
|
||||
])
|
||||
self.last_name = random.choice([
|
||||
"Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis",
|
||||
"Anderson", "Wilson", "Taylor", "Thomas", "Moore", "Martin", "Jackson", "Lee",
|
||||
"Thompson", "White", "Harris", "Clark", "Lewis", "Walker", "Hall", "Young"
|
||||
])
|
||||
# initialize Faker instance
|
||||
self.faker = Faker()
|
||||
|
||||
# Modify first letter of first name
|
||||
# generate account information
|
||||
self.password = self._generate_password()
|
||||
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 + first_name[1:]
|
||||
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))
|
||||
"""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"""
|
||||
@@ -78,7 +74,7 @@ class CursorRegistration:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('register.invalid_email') if self.translator else '无效的邮箱地址'}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
print(f"{Fore.CYAN}{EMOJI['MAIL']} {self.translator.get('register.email_address')}: {self.email_address}\n{Style.RESET_ALL}")
|
||||
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:
|
||||
@@ -107,6 +103,18 @@ class CursorRegistration:
|
||||
try:
|
||||
print(f"{Fore.CYAN}{EMOJI['START']} {self.translator.get('register.register_start')}...{Style.RESET_ALL}")
|
||||
|
||||
# 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)
|
||||
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
|
||||
|
||||
@@ -116,7 +124,7 @@ class CursorRegistration:
|
||||
password=self.password,
|
||||
first_name=self.first_name,
|
||||
last_name=self.last_name,
|
||||
email_tab=None, # No email tab needed
|
||||
email_tab=email_tab, # Pass email_tab if tempmail_plus is enabled
|
||||
controller=self, # Pass self instead of self.controller
|
||||
translator=self.translator
|
||||
)
|
||||
@@ -175,7 +183,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
|
||||
@@ -205,7 +213,7 @@ class CursorRegistration:
|
||||
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}")
|
||||
@@ -248,10 +256,10 @@ class CursorRegistration:
|
||||
except:
|
||||
pass
|
||||
|
||||
def update_cursor_auth(self, email=None, access_token=None, refresh_token=None):
|
||||
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"""
|
||||
|
||||
@@ -247,11 +247,11 @@ class CursorGoogleAccountDeleter(OAuthHandler):
|
||||
except:
|
||||
# Try direct JavaScript input as fallback
|
||||
try:
|
||||
self.browser.run_js(f"""
|
||||
self.browser.run_js(r"""
|
||||
arguments[0].value = "Delete";
|
||||
const event = new Event('input', {{ bubbles: true }});
|
||||
const event = new Event('input', { bubbles: true });
|
||||
arguments[0].dispatchEvent(event);
|
||||
const changeEvent = new Event('change', {{ bubbles: true }});
|
||||
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}")
|
||||
|
||||
27
email_tabs/email_tab_interface.py
Normal file
27
email_tabs/email_tab_interface.py
Normal file
@@ -0,0 +1,27 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
class EmailTabInterface(ABC):
|
||||
"""Email tab interface for handling email verification"""
|
||||
|
||||
@abstractmethod
|
||||
def refresh_inbox(self) -> None:
|
||||
"""Refresh the email inbox"""
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def check_for_cursor_email(self) -> bool:
|
||||
"""Check if there is a verification email from Cursor
|
||||
|
||||
Returns:
|
||||
bool: True if verification email exists, False otherwise
|
||||
"""
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_verification_code(self) -> str:
|
||||
"""Get the verification code from the email
|
||||
|
||||
Returns:
|
||||
str: The verification code if found, empty string otherwise
|
||||
"""
|
||||
pass
|
||||
109
email_tabs/tempmail_plus_tab.py
Normal file
109
email_tabs/tempmail_plus_tab.py
Normal file
@@ -0,0 +1,109 @@
|
||||
import requests
|
||||
import re
|
||||
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):
|
||||
"""Initialize TempMailPlusTab
|
||||
|
||||
Args:
|
||||
email: The email address to check
|
||||
epin: The epin token for authentication
|
||||
"""
|
||||
self.email = email
|
||||
self.epin = epin
|
||||
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 # 缓存mail_id
|
||||
|
||||
def refresh_inbox(self) -> None:
|
||||
"""Refresh the email inbox"""
|
||||
pass
|
||||
|
||||
def check_for_cursor_email(self) -> bool:
|
||||
"""Check if there is a verification email from Cursor
|
||||
|
||||
Returns:
|
||||
bool: True if verification email exists, 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'):
|
||||
for mail in data['mail_list']:
|
||||
if 'cursor.sh' in mail.get('from_mail', '') and mail.get('is_new') == True:
|
||||
self._cached_mail_id = mail.get('mail_id') # 缓存mail_id
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"检查Cursor邮件失败: {str(e)}")
|
||||
return False
|
||||
|
||||
def get_verification_code(self) -> str:
|
||||
"""Get the verification code from the email
|
||||
|
||||
Returns:
|
||||
str: The verification code if found, empty string otherwise
|
||||
"""
|
||||
try:
|
||||
# 如果没有缓存的mail_id,先检查是否有新邮件
|
||||
if not self._cached_mail_id:
|
||||
if not self.check_for_cursor_email():
|
||||
return ""
|
||||
|
||||
# 使用缓存的mail_id获取邮件内容
|
||||
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 ""
|
||||
|
||||
# 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"获取验证码失败: {str(e)}")
|
||||
return ""
|
||||
361
fill_missing_translations.py
Normal file
361
fill_missing_translations.py
Normal 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
112
get_user_token.py
Normal 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
|
||||
@@ -1,701 +0,0 @@
|
||||
import os
|
||||
import time
|
||||
import uuid
|
||||
import json
|
||||
import random
|
||||
import string
|
||||
import requests
|
||||
from selenium import webdriver
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.chrome.service import Service
|
||||
from selenium.webdriver.chrome.options import Options
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
from webdriver_manager.chrome import ChromeDriverManager
|
||||
import logging
|
||||
import platform
|
||||
from colorama import Fore, Style, init
|
||||
from selenium.common.exceptions import TimeoutException, WebDriverException, NoSuchElementException
|
||||
import shutil
|
||||
|
||||
# Initialize colorama
|
||||
init()
|
||||
|
||||
# Set up logging
|
||||
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
|
||||
|
||||
# Define emoji constants
|
||||
EMOJI = {
|
||||
'START': '🚀',
|
||||
'FORM': '📝',
|
||||
'VERIFY': '🔄',
|
||||
'PASSWORD': '🔑',
|
||||
'CODE': '📱',
|
||||
'DONE': '✨',
|
||||
'ERROR': '❌',
|
||||
'WAIT': '⏳',
|
||||
'SUCCESS': '✅',
|
||||
'MAIL': '📧',
|
||||
'KEY': '🔐',
|
||||
'UPDATE': '🔄',
|
||||
'INFO': 'ℹ️',
|
||||
'EMAIL': '📧',
|
||||
'REFRESH': '🔄',
|
||||
'LINK': '🔗',
|
||||
'WARNING': '⚠️'
|
||||
}
|
||||
|
||||
class GitHubCursorRegistration:
|
||||
def __init__(self, translator=None):
|
||||
self.translator = translator
|
||||
# Set browser to visible mode
|
||||
os.environ['BROWSER_HEADLESS'] = 'False'
|
||||
self.browser = None
|
||||
self.email_address = None
|
||||
|
||||
# Generate random credentials
|
||||
self.github_username = ''.join(random.choices(string.ascii_lowercase + string.digits, k=10))
|
||||
self.github_password = ''.join(random.choices(string.ascii_letters + string.digits + string.punctuation, k=16))
|
||||
|
||||
def setup_browser(self):
|
||||
"""Setup and configure the web browser"""
|
||||
try:
|
||||
print(f"{Fore.CYAN}{EMOJI['START']} Setting up browser...{Style.RESET_ALL}")
|
||||
|
||||
options = Options()
|
||||
options.add_argument('--incognito')
|
||||
options.add_argument('--no-sandbox')
|
||||
options.add_argument('--disable-dev-shm-usage')
|
||||
options.add_argument('--window-size=1920,1080')
|
||||
options.add_argument('--disable-notifications')
|
||||
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36')
|
||||
|
||||
self.browser = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
|
||||
self.browser.set_page_load_timeout(30)
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to setup browser: {str(e)}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
def get_temp_email(self):
|
||||
"""Get a temporary email address using YOPmail"""
|
||||
try:
|
||||
if not self.browser:
|
||||
if not self.setup_browser():
|
||||
return False
|
||||
|
||||
print(f"{Fore.CYAN}{EMOJI['MAIL']} Generating temporary email address...{Style.RESET_ALL}")
|
||||
self.browser.get("https://yopmail.com/")
|
||||
time.sleep(2)
|
||||
|
||||
# Generate a realistic username
|
||||
first_names = ["john", "sara", "michael", "emma", "david", "jennifer", "robert", "lisa"]
|
||||
last_names = ["smith", "johnson", "williams", "brown", "jones", "miller", "davis", "garcia"]
|
||||
|
||||
random_first = random.choice(first_names)
|
||||
random_last = random.choice(last_names)
|
||||
random_num = random.randint(100, 999)
|
||||
|
||||
username = f"{random_first}.{random_last}{random_num}"
|
||||
|
||||
# Enter the username and check inbox
|
||||
email_field = self.browser.find_element(By.XPATH, "//input[@id='login']")
|
||||
if email_field:
|
||||
email_field.clear()
|
||||
email_field.send_keys(username)
|
||||
time.sleep(1)
|
||||
|
||||
# Click the check button
|
||||
check_button = self.browser.find_element(By.XPATH, "//button[@title='Check Inbox' or @class='sbut' or contains(@onclick, 'ver')]")
|
||||
if check_button:
|
||||
check_button.click()
|
||||
time.sleep(2)
|
||||
self.email_address = f"{username}@yopmail.com"
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Temp email created: {self.email_address}{Style.RESET_ALL}")
|
||||
return True
|
||||
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to create YOPmail address{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Error getting temporary email: {str(e)}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
def register_github(self):
|
||||
"""Register a new GitHub account"""
|
||||
if not self.email_address:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} No email address available{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
if not self.browser:
|
||||
if not self.setup_browser():
|
||||
return False
|
||||
|
||||
try:
|
||||
print(f"{Fore.CYAN}{EMOJI['FORM']} Registering GitHub account...{Style.RESET_ALL}")
|
||||
self.browser.get("https://github.com/join")
|
||||
time.sleep(3)
|
||||
|
||||
# Fill in the registration form
|
||||
WebDriverWait(self.browser, 15).until(EC.visibility_of_element_located((By.ID, "user_login")))
|
||||
self.browser.find_element(By.ID, "user_login").send_keys(self.github_username)
|
||||
self.browser.find_element(By.ID, "user_email").send_keys(self.email_address)
|
||||
self.browser.find_element(By.ID, "user_password").send_keys(self.github_password)
|
||||
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} GitHub username: {self.github_username}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} GitHub password: {self.github_password}{Style.RESET_ALL}")
|
||||
|
||||
# Check for any notice or popup and handle it
|
||||
try:
|
||||
signup_button = self.browser.find_element(By.ID, "signup_button")
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} Clicking sign up button...{Style.RESET_ALL}")
|
||||
signup_button.click()
|
||||
except NoSuchElementException:
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Signup button not found, trying alternative selector{Style.RESET_ALL}")
|
||||
buttons = self.browser.find_elements(By.TAG_NAME, "button")
|
||||
for button in buttons:
|
||||
if "Sign up" in button.text:
|
||||
button.click()
|
||||
break
|
||||
|
||||
# Wait for page transition and check for CAPTCHA
|
||||
time.sleep(5)
|
||||
|
||||
# Check if registration was successful or if CAPTCHA appeared
|
||||
current_url = self.browser.current_url
|
||||
|
||||
# Look for CAPTCHA in URL or on page
|
||||
if "captcha" in current_url.lower() or "are you a robot" in self.browser.page_source.lower():
|
||||
print(f"{Fore.YELLOW}{EMOJI['WAIT']} CAPTCHA detected, please complete it manually{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} You have 60 seconds to solve the CAPTCHA...{Style.RESET_ALL}")
|
||||
|
||||
# Wait for user to solve CAPTCHA (60 seconds max)
|
||||
for i in range(60):
|
||||
current_url = self.browser.current_url
|
||||
if "captcha" not in current_url.lower() and "are you a robot" not in self.browser.page_source.lower():
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} CAPTCHA completed successfully{Style.RESET_ALL}")
|
||||
break
|
||||
time.sleep(1)
|
||||
if i % 10 == 0 and i > 0:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WAIT']} Still waiting for CAPTCHA completion... {60-i} seconds remaining{Style.RESET_ALL}")
|
||||
|
||||
# Check if CAPTCHA was solved after waiting
|
||||
if "captcha" in self.browser.current_url.lower() or "are you a robot" in self.browser.page_source.lower():
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} CAPTCHA not solved within time limit{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Do you want more time to solve the CAPTCHA? (yes/no){Style.RESET_ALL}")
|
||||
response = input().lower().strip()
|
||||
if response in ['yes', 'y']:
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Press Enter when you've completed the CAPTCHA...{Style.RESET_ALL}")
|
||||
input()
|
||||
if "captcha" in self.browser.current_url.lower() or "are you a robot" in self.browser.page_source.lower():
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} CAPTCHA still not solved{Style.RESET_ALL}")
|
||||
return False
|
||||
else:
|
||||
return False
|
||||
|
||||
# Wait for registration to complete
|
||||
time.sleep(5)
|
||||
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} GitHub account registered{Style.RESET_ALL}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to register GitHub account: {str(e)}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
def check_email_verification(self):
|
||||
"""Check for GitHub verification email and click the verification link"""
|
||||
if not self.email_address or not self.browser:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Email or browser not available{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
try:
|
||||
print(f"{Fore.CYAN}{EMOJI['EMAIL']} Checking for verification email...{Style.RESET_ALL}")
|
||||
|
||||
# Extract username from email for YOPmail
|
||||
username = self.email_address.split('@')[0]
|
||||
|
||||
max_attempts = 10
|
||||
for attempt in range(1, max_attempts + 1):
|
||||
print(f"{Fore.CYAN}{EMOJI['REFRESH']} Checking YOPmail inbox (attempt {attempt}/{max_attempts})...{Style.RESET_ALL}")
|
||||
|
||||
# Go to YOPmail inbox
|
||||
self.browser.get(f"https://yopmail.com/en/wm")
|
||||
time.sleep(2)
|
||||
|
||||
# Enter email address
|
||||
try:
|
||||
email_input = WebDriverWait(self.browser, 10).until(
|
||||
EC.presence_of_element_located((By.ID, "login"))
|
||||
)
|
||||
email_input.clear()
|
||||
email_input.send_keys(username)
|
||||
|
||||
# Click the check inbox button
|
||||
check_button = self.browser.find_element(By.CSS_SELECTOR, "button[onclick='verif()']")
|
||||
check_button.click()
|
||||
time.sleep(3)
|
||||
|
||||
# Switch to inbox frame
|
||||
iframe = WebDriverWait(self.browser, 10).until(
|
||||
EC.presence_of_element_located((By.ID, "ifinbox"))
|
||||
)
|
||||
self.browser.switch_to.frame(iframe)
|
||||
|
||||
# Look for GitHub email
|
||||
emails = self.browser.find_elements(By.CSS_SELECTOR, "div.m")
|
||||
github_email = None
|
||||
|
||||
for email in emails:
|
||||
if "github" in email.text.lower():
|
||||
github_email = email
|
||||
break
|
||||
|
||||
if github_email:
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} GitHub verification email found{Style.RESET_ALL}")
|
||||
github_email.click()
|
||||
time.sleep(2)
|
||||
|
||||
# Switch back to default content
|
||||
self.browser.switch_to.default_content()
|
||||
|
||||
# Switch to email content frame
|
||||
iframe = WebDriverWait(self.browser, 10).until(
|
||||
EC.presence_of_element_located((By.ID, "ifmail"))
|
||||
)
|
||||
self.browser.switch_to.frame(iframe)
|
||||
|
||||
# Find verification link
|
||||
try:
|
||||
# Look for the verification button or link
|
||||
verification_elements = self.browser.find_elements(By.XPATH, "//a[contains(text(), 'Verify') or contains(text(), 'verify') or contains(@href, 'verify')]")
|
||||
|
||||
if verification_elements:
|
||||
verification_link = verification_elements[0].get_attribute('href')
|
||||
print(f"{Fore.CYAN}{EMOJI['LINK']} Found verification link{Style.RESET_ALL}")
|
||||
|
||||
# Open the verification link in the same window
|
||||
self.browser.get(verification_link)
|
||||
time.sleep(5)
|
||||
|
||||
# Check if verification was successful
|
||||
if "verified" in self.browser.page_source.lower() or "successful" in self.browser.page_source.lower():
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Email verified successfully{Style.RESET_ALL}")
|
||||
return True
|
||||
else:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} Email verification page loaded but success not confirmed{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Please check if verification was successful manually and press Enter to continue...{Style.RESET_ALL}")
|
||||
input()
|
||||
return True
|
||||
else:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} No verification link found in email{Style.RESET_ALL}")
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Error extracting verification link: {str(e)}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WAIT']} No GitHub verification email yet, waiting... ({attempt}/{max_attempts}){Style.RESET_ALL}")
|
||||
time.sleep(15) # Wait before checking again
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Error checking email: {str(e)}{Style.RESET_ALL}")
|
||||
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} No verification email received after {max_attempts} attempts{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Do you want to check manually? (yes/no){Style.RESET_ALL}")
|
||||
response = input().lower().strip()
|
||||
if response in ['yes', 'y']:
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Please check your YOPmail inbox manually at: https://yopmail.com/en/wm")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Username: {username}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Press Enter when you've verified the email...{Style.RESET_ALL}")
|
||||
input()
|
||||
return True
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to check verification email: {str(e)}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
def register_cursor(self):
|
||||
"""Register with Cursor using GitHub"""
|
||||
if not self.browser:
|
||||
if not self.setup_browser():
|
||||
return False
|
||||
|
||||
try:
|
||||
print(f"{Fore.CYAN}{EMOJI['KEY']} Registering with Cursor using GitHub...{Style.RESET_ALL}")
|
||||
|
||||
# Navigate to Cursor login page
|
||||
self.browser.get("https://cursor.sh/login")
|
||||
time.sleep(3)
|
||||
|
||||
try:
|
||||
# Look for GitHub login button
|
||||
github_buttons = WebDriverWait(self.browser, 15).until(
|
||||
EC.presence_of_all_elements_located((By.XPATH, "//button[contains(., 'GitHub') or contains(@class, 'github')]"))
|
||||
)
|
||||
|
||||
if not github_buttons:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} GitHub login button not found{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
# Click the first GitHub button
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} Clicking GitHub login button...{Style.RESET_ALL}")
|
||||
github_buttons[0].click()
|
||||
time.sleep(5)
|
||||
|
||||
# Check if we're redirected to GitHub login
|
||||
current_url = self.browser.current_url
|
||||
if "github.com" in current_url:
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} Redirected to GitHub login{Style.RESET_ALL}")
|
||||
|
||||
# Check if we need to log in to GitHub
|
||||
if "login" in current_url:
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} Logging into GitHub...{Style.RESET_ALL}")
|
||||
|
||||
try:
|
||||
# Enter GitHub credentials
|
||||
username_field = WebDriverWait(self.browser, 10).until(
|
||||
EC.presence_of_element_located((By.ID, "login_field"))
|
||||
)
|
||||
username_field.send_keys(self.github_username)
|
||||
|
||||
password_field = self.browser.find_element(By.ID, "password")
|
||||
password_field.send_keys(self.github_password)
|
||||
|
||||
# Click sign in
|
||||
signin_button = self.browser.find_element(By.CSS_SELECTOR, "input[type='submit']")
|
||||
signin_button.click()
|
||||
time.sleep(5)
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Error during GitHub login: {str(e)}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
# Check if we're on the authorization page
|
||||
if "authorize" in self.browser.current_url:
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} Authorizing Cursor app...{Style.RESET_ALL}")
|
||||
|
||||
try:
|
||||
# Look for authorization button
|
||||
auth_buttons = self.browser.find_elements(By.XPATH, "//button[contains(., 'Authorize') or contains(@class, 'btn-primary')]")
|
||||
|
||||
if auth_buttons:
|
||||
auth_buttons[0].click()
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Cursor authorized with GitHub{Style.RESET_ALL}")
|
||||
time.sleep(5)
|
||||
else:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} No authorization button found, GitHub may be already authorized{Style.RESET_ALL}")
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Error during GitHub authorization: {str(e)}{Style.RESET_ALL}")
|
||||
|
||||
# Wait for Cursor dashboard to load
|
||||
timeout = 30
|
||||
start_time = time.time()
|
||||
while time.time() - start_time < timeout:
|
||||
if "cursor.sh" in self.browser.current_url and not "login" in self.browser.current_url:
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Successfully logged into Cursor{Style.RESET_ALL}")
|
||||
break
|
||||
time.sleep(1)
|
||||
|
||||
if "login" in self.browser.current_url:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to log into Cursor after {timeout} seconds{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
# Wait for dashboard elements to load
|
||||
time.sleep(3)
|
||||
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Cursor registered with GitHub successfully{Style.RESET_ALL}")
|
||||
|
||||
# Now reset the machine ID
|
||||
return self.reset_machine_id()
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Error during Cursor registration: {str(e)}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to register with Cursor: {str(e)}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
def reset_machine_id(self):
|
||||
"""Reset the Cursor machine ID to bypass limitations"""
|
||||
try:
|
||||
print(f"{Fore.CYAN}{EMOJI['UPDATE']} Resetting Cursor machine ID...{Style.RESET_ALL}")
|
||||
|
||||
# Find Cursor app data location based on platform
|
||||
cursor_data_dir = None
|
||||
if platform.system() == "Windows":
|
||||
appdata = os.getenv('APPDATA')
|
||||
if appdata:
|
||||
cursor_data_dir = os.path.join(appdata, "cursor", "Local Storage", "leveldb")
|
||||
elif platform.system() == "Darwin": # macOS
|
||||
home = os.path.expanduser("~")
|
||||
cursor_data_dir = os.path.join(home, "Library", "Application Support", "cursor", "Local Storage", "leveldb")
|
||||
elif platform.system() == "Linux":
|
||||
home = os.path.expanduser("~")
|
||||
cursor_data_dir = os.path.join(home, ".config", "cursor", "Local Storage", "leveldb")
|
||||
|
||||
if not cursor_data_dir or not os.path.exists(cursor_data_dir):
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} Cursor data directory not found at: {cursor_data_dir}{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} You may need to reset the machine ID manually{Style.RESET_ALL}")
|
||||
|
||||
# Try to find the Cursor data directory
|
||||
if platform.system() == "Linux":
|
||||
possible_paths = [
|
||||
os.path.join(os.path.expanduser("~"), ".config", "cursor"),
|
||||
os.path.join(os.path.expanduser("~"), ".cursor")
|
||||
]
|
||||
for path in possible_paths:
|
||||
if os.path.exists(path):
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Found Cursor directory at: {path}{Style.RESET_ALL}")
|
||||
# Look for Local Storage subfolder
|
||||
for root, dirs, files in os.walk(path):
|
||||
if "Local Storage" in dirs:
|
||||
cursor_data_dir = os.path.join(root, "Local Storage", "leveldb")
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Found Cursor data directory at: {cursor_data_dir}{Style.RESET_ALL}")
|
||||
break
|
||||
break
|
||||
|
||||
if cursor_data_dir and os.path.exists(cursor_data_dir):
|
||||
# Generate a new UUID
|
||||
new_machine_id = str(uuid.uuid4())
|
||||
print(f"{Fore.CYAN}{EMOJI['KEY']} New machine ID: {new_machine_id}{Style.RESET_ALL}")
|
||||
|
||||
# Ask for permission to modify files
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} This operation will modify Cursor app data files{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Do you want to continue? (yes/no){Style.RESET_ALL}")
|
||||
response = input().lower().strip()
|
||||
if response not in ['yes', 'y']:
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Machine ID reset aborted{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
# Backup the directory
|
||||
backup_dir = cursor_data_dir + "_backup_" + time.strftime("%Y%m%d%H%M%S")
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} Creating backup of data directory to: {backup_dir}{Style.RESET_ALL}")
|
||||
try:
|
||||
shutil.copytree(cursor_data_dir, backup_dir)
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Backup created successfully{Style.RESET_ALL}")
|
||||
except Exception as e:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} Failed to create backup: {str(e)}{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} Continuing without backup...{Style.RESET_ALL}")
|
||||
|
||||
# Find and modify files containing the machine ID
|
||||
modified = False
|
||||
for filename in os.listdir(cursor_data_dir):
|
||||
if filename.endswith(".log") or filename.endswith(".ldb"):
|
||||
file_path = os.path.join(cursor_data_dir, filename)
|
||||
try:
|
||||
with open(file_path, "rb") as f:
|
||||
content = f.read()
|
||||
|
||||
# Look for patterns that might contain machine ID
|
||||
if b"machineId" in content:
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} Found machineId reference in: {filename}{Style.RESET_ALL}")
|
||||
modified = True
|
||||
|
||||
# For safety, don't modify the binary files directly
|
||||
# Instead, instruct user to uninstall and reinstall Cursor
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} Binary files found that may contain machine ID{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} For best results, please:{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} 1. Close Cursor if it's running{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} 2. Uninstall Cursor completely{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} 3. Reinstall Cursor{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} 4. Login with your new GitHub account{Style.RESET_ALL}")
|
||||
break
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} Error processing file {filename}: {str(e)}{Style.RESET_ALL}")
|
||||
|
||||
if not modified:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} No machine ID references found in data files{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} You may need to reinstall Cursor for a complete reset{Style.RESET_ALL}")
|
||||
|
||||
# Save credentials before returning
|
||||
self.save_credentials()
|
||||
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Machine ID reset process completed{Style.RESET_ALL}")
|
||||
return True
|
||||
else:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} Cursor data directory not found{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} You may need to manually reset the machine ID by reinstalling Cursor{Style.RESET_ALL}")
|
||||
|
||||
# Still save credentials
|
||||
self.save_credentials()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to reset machine ID: {str(e)}{Style.RESET_ALL}")
|
||||
# Still save credentials even if machine ID reset fails
|
||||
self.save_credentials()
|
||||
return False
|
||||
|
||||
def save_credentials(self):
|
||||
"""Save the generated credentials to a file"""
|
||||
try:
|
||||
if not self.email_address or not self.github_username or not self.github_password:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} No credentials to save{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
output_file = "github_cursor_accounts.txt"
|
||||
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
credentials = {
|
||||
"timestamp": timestamp,
|
||||
"github_username": self.github_username,
|
||||
"github_password": self.github_password,
|
||||
"email": self.email_address
|
||||
}
|
||||
|
||||
credentials_json = json.dumps(credentials)
|
||||
|
||||
# Check if file exists and create if not
|
||||
file_exists = os.path.exists(output_file)
|
||||
|
||||
with open(output_file, "a") as f:
|
||||
if not file_exists:
|
||||
f.write("# GitHub + Cursor AI Accounts\n")
|
||||
f.write("# Format: JSON with timestamp, github_username, github_password, email\n\n")
|
||||
|
||||
f.write(credentials_json + "\n")
|
||||
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Credentials saved to: {output_file}{Style.RESET_ALL}")
|
||||
|
||||
# Print a summary
|
||||
print(f"\n{Fore.GREEN}{EMOJI['SUCCESS']} Registration Summary:{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN} • GitHub Username: {self.github_username}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN} • GitHub Password: {self.github_password}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN} • Email Address: {self.email_address}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN} • Saved to: {output_file}{Style.RESET_ALL}\n")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to save credentials: {str(e)}{Style.RESET_ALL}")
|
||||
print(f"\n{Fore.YELLOW}{EMOJI['WARNING']} Make sure to copy these credentials manually:{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN} • GitHub Username: {self.github_username}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN} • GitHub Password: {self.github_password}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN} • Email Address: {self.email_address}{Style.RESET_ALL}\n")
|
||||
return False
|
||||
|
||||
def cleanup(self):
|
||||
"""Clean up resources"""
|
||||
if self.browser:
|
||||
try:
|
||||
self.browser.quit()
|
||||
except:
|
||||
pass
|
||||
|
||||
def start_registration(self):
|
||||
"""Start the GitHub Cursor registration process"""
|
||||
try:
|
||||
# Step 1: Get temporary email
|
||||
if not self.get_temp_email():
|
||||
return False
|
||||
|
||||
# Step 2: Register GitHub account
|
||||
if not self.register_github():
|
||||
return False
|
||||
|
||||
# Step 3: Check and verify email
|
||||
if not self.check_email_verification():
|
||||
return False
|
||||
|
||||
# Step 4: Register Cursor with GitHub
|
||||
if not self.register_cursor():
|
||||
return False
|
||||
|
||||
# Step 5: Reset machine ID
|
||||
self.reset_machine_id()
|
||||
|
||||
return True
|
||||
finally:
|
||||
self.cleanup()
|
||||
|
||||
def display_features_and_warnings(translator=None):
|
||||
"""Display features and warnings before proceeding"""
|
||||
if translator:
|
||||
print(f"\n🚀 {translator.get('github_register.title')}")
|
||||
print("=====================================")
|
||||
print(f"{translator.get('github_register.features_header')}:")
|
||||
print(f" - {translator.get('github_register.feature1')}")
|
||||
print(f" - {translator.get('github_register.feature2')}")
|
||||
print(f" - {translator.get('github_register.feature3')}")
|
||||
print(f" - {translator.get('github_register.feature4')}")
|
||||
print(f" - {translator.get('github_register.feature5')}")
|
||||
print(f" - {translator.get('github_register.feature6')}")
|
||||
print(f"\n⚠️ {translator.get('github_register.warnings_header')}:")
|
||||
print(f" - {translator.get('github_register.warning1')}")
|
||||
print(f" - {translator.get('github_register.warning2')}")
|
||||
print(f" - {translator.get('github_register.warning3')}")
|
||||
print(f" - {translator.get('github_register.warning4')}")
|
||||
print("=====================================\n")
|
||||
else:
|
||||
print("\n🚀 GitHub + Cursor AI Registration Automation")
|
||||
print("=====================================")
|
||||
print("Features:")
|
||||
print(" - Creates a temporary email using YOPmail")
|
||||
print(" - Registers a new GitHub account with random credentials")
|
||||
print(" - Verifies the GitHub email automatically")
|
||||
print(" - Logs into Cursor AI using GitHub authentication")
|
||||
print(" - Resets the machine ID to bypass trial detection")
|
||||
print(" - Saves all credentials to a file")
|
||||
print("\n⚠️ Warnings:")
|
||||
print(" - This script automates account creation, which may violate GitHub/Cursor terms of service")
|
||||
print(" - Requires internet access and administrative privileges")
|
||||
print(" - CAPTCHA or additional verification may interrupt automation")
|
||||
print(" - Use responsibly and at your own risk")
|
||||
print("=====================================\n")
|
||||
|
||||
def get_user_confirmation(translator=None):
|
||||
"""Prompt the user for confirmation to proceed"""
|
||||
while True:
|
||||
if translator:
|
||||
response = input(f"{translator.get('github_register.confirm')} (yes/no): ").lower().strip()
|
||||
else:
|
||||
response = input("Do you want to proceed with GitHub + Cursor AI registration? (yes/no): ").lower().strip()
|
||||
|
||||
if response in ['yes', 'y']:
|
||||
return True
|
||||
elif response in ['no', 'n']:
|
||||
if translator:
|
||||
print(f"❌ {translator.get('github_register.cancelled')}")
|
||||
else:
|
||||
print("❌ Operation cancelled.")
|
||||
return False
|
||||
else:
|
||||
if translator:
|
||||
print(f"{translator.get('github_register.invalid_choice')}")
|
||||
else:
|
||||
print("Please enter 'yes' or 'no'.")
|
||||
|
||||
def main(translator=None):
|
||||
"""Main function to run the GitHub Cursor registration process"""
|
||||
logging.info(f"{Fore.CYAN} {translator.get('github_register.starting_automation')}{Style.RESET_ALL}")
|
||||
|
||||
# Display features and warnings
|
||||
display_features_and_warnings(translator)
|
||||
|
||||
# Get user confirmation
|
||||
if not get_user_confirmation(translator):
|
||||
return
|
||||
|
||||
# Start registration process
|
||||
registration = GitHubCursorRegistration(translator)
|
||||
success = registration.start_registration()
|
||||
|
||||
# Display final message
|
||||
if success:
|
||||
print(f"\n{Fore.GREEN}{EMOJI['DONE']} {translator.get('github_register.completed_successfully')}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('github_register.github_username')}: {registration.github_username}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('github_register.github_password')}: {registration.github_password}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {translator.get('github_register.email')}: {registration.email_address}{Style.RESET_ALL}")
|
||||
print(f"\n{Fore.CYAN}{EMOJI['INFO']} {translator.get('github_register.credentials_saved')}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"\n{Fore.RED}{EMOJI['ERROR']} {translator.get('github_register.registration_encountered_issues')}{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('github_register.check_browser_windows_for_manual_intervention_or_try_again_later')}{Style.RESET_ALL}")
|
||||
|
||||
# Wait for user acknowledgment
|
||||
if translator:
|
||||
input(f"\n{EMOJI['INFO']} {translator.get('register.press_enter')}...")
|
||||
else:
|
||||
input(f"\n{EMOJI['INFO']} Press Enter to continue...")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
BIN
images/product_2025-04-16_10-40-21.png
Normal file
BIN
images/product_2025-04-16_10-40-21.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 170 KiB |
854
locales/ar.json
Normal file
854
locales/ar.json
Normal file
@@ -0,0 +1,854 @@
|
||||
{
|
||||
"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": "فشل في تحديث معلومات المصادقة"
|
||||
}
|
||||
}
|
||||
479
locales/bg.json
479
locales/bg.json
@@ -20,9 +20,27 @@
|
||||
"totally_reset": "Нулирайте изцяло Курсор",
|
||||
"outdate": "Изтекъл срок",
|
||||
"temp_github_register": "Временно регистриране с GitHub",
|
||||
"coming_soon": "Очаквайте скоро"
|
||||
"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": "繁體中文",
|
||||
@@ -34,7 +52,9 @@
|
||||
"ru": "Russian",
|
||||
"tr": "Turkish",
|
||||
"bg": "Bulgarian",
|
||||
"es": "Spanish"
|
||||
"es": "Spanish",
|
||||
"it": "Италиански",
|
||||
"ja": "Японски"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "Започни излизането от Курсор",
|
||||
@@ -101,7 +121,14 @@
|
||||
"package_not_found": "Package.json не беше намерен: {path}",
|
||||
"check_version_failed": "Грешка при проверка на версията: {error}",
|
||||
"stack_trace": "Проследяване на стека",
|
||||
"version_too_low": "Версията на Курсор е твърде ниска: {version} < 0.45.0"
|
||||
"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": "Инструмент за регистрация в Курсор",
|
||||
@@ -180,7 +207,26 @@
|
||||
"setting_on_password": "Задаване на парола",
|
||||
"getting_code": "Получаване на код за потвърждение, ще бъде опит след 60 секунди",
|
||||
"human_verify_error": "Не може да се потвърди, че потребителят е човек. Опитва се отново...",
|
||||
"max_retries_reached": "Достигнат максимален брой опити. Регистрацията беше неуспешна."
|
||||
"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": "Управление на удостоверяването на Курсор",
|
||||
@@ -270,7 +316,13 @@
|
||||
"available_domains_loaded": "Налични домейни са заредени: {count}",
|
||||
"domains_filtered": "Филтрирани домейни: {count}",
|
||||
"trying_to_create_email": "Опит за създаване на имейл: {email}",
|
||||
"domain_blocked": "Домейнът е блокиран: {domain}"
|
||||
"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": "Деактивиране на автоматичните актуализации на Курсор",
|
||||
@@ -283,7 +335,23 @@
|
||||
"removing_directory": "Премахване на директория",
|
||||
"directory_removed": "Директорията беше премахната",
|
||||
"creating_block_file": "Създаване на блокиращ файл",
|
||||
"block_file_created": "Блокиращият файл беше създаден"
|
||||
"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": "Проверка за актуализации...",
|
||||
@@ -296,7 +364,8 @@
|
||||
"update_skipped": "Актуализацията беше пропусната.",
|
||||
"invalid_choice": "Невалиден избор. Моля, въведете 'Y' или 'n'.",
|
||||
"development_version": "Версия за разработка {current} > {latest}",
|
||||
"changelog_title": "Списък с промени"
|
||||
"changelog_title": "Списък с промени",
|
||||
"rate_limit_exceeded": "Превишена граница на скоростта на API на GitHub. Проверка на актуализацията на пропускане."
|
||||
},
|
||||
"totally_reset": {
|
||||
"title": "Пълно нулиране на Курсор",
|
||||
@@ -387,7 +456,45 @@
|
||||
"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 файлове беше завършено"
|
||||
"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 Профил",
|
||||
@@ -400,5 +507,361 @@
|
||||
"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": "Актуализиране на базата данни за удостоверяване на курсора ..."
|
||||
}
|
||||
}
|
||||
489
locales/de.json
489
locales/de.json
@@ -22,9 +22,24 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -34,7 +49,11 @@
|
||||
"fr": "Französisch",
|
||||
"pt": "Portugiesisch",
|
||||
"ru": "Russisch",
|
||||
"es": "Spanisch"
|
||||
"es": "Spanisch",
|
||||
"tr": "Türkisch",
|
||||
"bg": "Bulgarisch",
|
||||
"ja": "japanisch",
|
||||
"it": "Italienisch"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "Beginne Cursor zu Beenden",
|
||||
@@ -101,7 +120,14 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -178,7 +204,28 @@
|
||||
"password_submitted": "Passwort Eingereicht",
|
||||
"total_usage": "Gesamtnutzung: {usage}",
|
||||
"setting_on_password": "Passwort Einstellen",
|
||||
"getting_code": "Verifizierungscode Erhalten, Erneut Versuchen in 60s"
|
||||
"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",
|
||||
@@ -259,7 +306,22 @@
|
||||
"domains_excluded": "Ausgeschlossene Domains: {domains}",
|
||||
"failed_to_create_account": "Konto Erstellen Fehlgeschlagen",
|
||||
"account_creation_error": "Konto-Erstellungsfehler: {error}",
|
||||
"domain_blocked": "Domain Blocked: {domain}"
|
||||
"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",
|
||||
@@ -272,7 +334,23 @@
|
||||
"removing_directory": "Verzeichnis Entfernen",
|
||||
"directory_removed": "Verzeichnis Entfernt",
|
||||
"creating_block_file": "Block-Datei Erstellen",
|
||||
"block_file_created": "Block-Datei Erstellt"
|
||||
"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...",
|
||||
@@ -285,7 +363,8 @@
|
||||
"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"
|
||||
"changelog_title": "Changelog",
|
||||
"rate_limit_exceeded": "Die Github -API -Ratengrenze überschritten. Überspringen Sie Update -Check."
|
||||
},
|
||||
"totally_reset": {
|
||||
"title": "Cursor Vollständig Zurücksetzen",
|
||||
@@ -376,7 +455,45 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -389,5 +506,361 @@
|
||||
"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"
|
||||
}
|
||||
}
|
||||
186
locales/en.json
186
locales/en.json
@@ -4,8 +4,8 @@
|
||||
"exit": "Exit Program",
|
||||
"reset": "Reset Machine ID",
|
||||
"register": "Register New Cursor Account",
|
||||
"register_google": "Register with Google Account",
|
||||
"register_github": "Register with GitHub 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",
|
||||
@@ -30,9 +30,16 @@
|
||||
"continue_prompt": "Continue? (y/N): ",
|
||||
"operation_cancelled_by_user": "Operation cancelled by user",
|
||||
"exiting": "Exiting ……",
|
||||
"bypass_version_check": "Bypass Cursor Version Check"
|
||||
"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": "繁體中文",
|
||||
@@ -44,7 +51,9 @@
|
||||
"ru": "Russian",
|
||||
"tr": "Turkish",
|
||||
"bg": "Bulgarian",
|
||||
"es": "Spanish"
|
||||
"es": "Spanish",
|
||||
"ja": "Japanese",
|
||||
"it": "Italian"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "Start Quitting Cursor",
|
||||
@@ -197,7 +206,26 @@
|
||||
"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."
|
||||
"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",
|
||||
@@ -562,7 +590,10 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -621,19 +652,27 @@
|
||||
"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}"
|
||||
"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}"
|
||||
},
|
||||
"chrome_profile": {
|
||||
"title": "Chrome Profile Selection",
|
||||
"select_profile": "Select a Chrome profile to use:",
|
||||
"profile_list": "Available profiles:",
|
||||
"default_profile": "Default Profile",
|
||||
"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 Chrome profiles found",
|
||||
"error_loading": "Error loading Chrome profiles: {error}",
|
||||
"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",
|
||||
"warning_chrome_close": "Warning: This will close all running Chrome processes"
|
||||
"invalid_selection": "Invalid selection. Please try again."
|
||||
},
|
||||
"account_delete": {
|
||||
"title": "Cursor Google Account Deletion Tool",
|
||||
@@ -698,5 +737,118 @@
|
||||
"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}"
|
||||
}
|
||||
}
|
||||
}
|
||||
431
locales/es.json
431
locales/es.json
@@ -22,9 +22,24 @@
|
||||
"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"
|
||||
"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": "繁體中文",
|
||||
@@ -36,7 +51,9 @@
|
||||
"ru": "Ruso",
|
||||
"tr": "Turco",
|
||||
"bg": "Búlgaro",
|
||||
"es": "Español"
|
||||
"es": "Español",
|
||||
"it": "italiano",
|
||||
"ja": "japonés"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "Comenzando a Cerrar Cursor",
|
||||
@@ -103,8 +120,14 @@
|
||||
"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"
|
||||
|
||||
"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",
|
||||
@@ -183,7 +206,26 @@
|
||||
"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."
|
||||
"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",
|
||||
@@ -273,7 +315,13 @@
|
||||
"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}"
|
||||
"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",
|
||||
@@ -286,7 +334,23 @@
|
||||
"removing_directory": "Eliminando Directorio",
|
||||
"directory_removed": "Directorio Eliminado",
|
||||
"creating_block_file": "Creando Archivo de Bloqueo",
|
||||
"block_file_created": "Archivo de Bloqueo Creado"
|
||||
"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...",
|
||||
@@ -299,7 +363,8 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -411,7 +476,24 @@
|
||||
"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."
|
||||
"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",
|
||||
@@ -451,5 +533,334 @@
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
492
locales/fr.json
492
locales/fr.json
@@ -19,9 +19,27 @@
|
||||
"totally_reset": "Réinitialisation Complète de Cursor",
|
||||
"outdate": "Obsolete",
|
||||
"temp_github_register": "Inscription GitHub temporaire",
|
||||
"coming_soon": "Bientôt"
|
||||
"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",
|
||||
@@ -31,7 +49,11 @@
|
||||
"fr": "Français",
|
||||
"pt": "Portugais",
|
||||
"ru": "Russe",
|
||||
"es": "Espagnol"
|
||||
"es": "Espagnol",
|
||||
"tr": "Turc",
|
||||
"bg": "Bulgare",
|
||||
"it": "italien",
|
||||
"ja": "japonais"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "Début de la Fermeture de Cursor",
|
||||
@@ -98,7 +120,14 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -175,7 +204,28 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -256,7 +306,22 @@
|
||||
"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}"
|
||||
"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",
|
||||
@@ -269,7 +334,23 @@
|
||||
"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éé"
|
||||
"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...",
|
||||
@@ -282,7 +363,8 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -373,7 +455,45 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -386,5 +506,361 @@
|
||||
"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"
|
||||
}
|
||||
}
|
||||
854
locales/it.json
Normal file
854
locales/it.json
Normal file
@@ -0,0 +1,854 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
854
locales/ja.json
Normal file
854
locales/ja.json
Normal file
@@ -0,0 +1,854 @@
|
||||
{
|
||||
"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": "認証情報の更新に失敗しました"
|
||||
}
|
||||
}
|
||||
493
locales/nl.json
493
locales/nl.json
@@ -20,9 +20,26 @@
|
||||
"totally_reset": "Cursor volledig resetten",
|
||||
"outdate": "Verouderd",
|
||||
"temp_github_register": "Tijdelijke GitHub-registratie",
|
||||
"coming_soon": "Binnenkort"
|
||||
"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",
|
||||
@@ -32,7 +49,11 @@
|
||||
"fr": "Frans",
|
||||
"pt": "Portugees",
|
||||
"ru": "Russisch",
|
||||
"es": "Spaans"
|
||||
"es": "Spaans",
|
||||
"bg": "Bulgaars",
|
||||
"tr": "Turks",
|
||||
"it": "Italiaans",
|
||||
"ja": "Japanse"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "Start met afsluiten van Cursor",
|
||||
@@ -99,7 +120,14 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -176,7 +204,28 @@
|
||||
"password_submitted": "Wachtwoord ingediend",
|
||||
"total_usage": "Totaal gebruik: {usage}",
|
||||
"setting_on_password": "Wachtwoord instellen",
|
||||
"getting_code": "Verificatiecode verkrijgen, opnieuw proberen in 60s"
|
||||
"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",
|
||||
@@ -257,7 +306,22 @@
|
||||
"domains_excluded": "Uitgesloten domeinen: {domains}",
|
||||
"failed_to_create_account": "Account aanmaken mislukt",
|
||||
"account_creation_error": "Account aanmaakfout: {error}",
|
||||
"domain_blocked": "Domein geblokkeerd: {domain}"
|
||||
"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",
|
||||
@@ -270,7 +334,23 @@
|
||||
"removing_directory": "Map verwijderen",
|
||||
"directory_removed": "Map verwijderd",
|
||||
"creating_block_file": "Blokkeerbestand aanmaken",
|
||||
"block_file_created": "Blokkeerbestand aangemaakt"
|
||||
"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...",
|
||||
@@ -283,7 +363,8 @@
|
||||
"update_skipped": "Update overgeslagen.",
|
||||
"invalid_choice": "Ongeldige keuze. Voer 'Y' of 'n' in.",
|
||||
"development_version": "Ontwikkelversie {current} > {latest}",
|
||||
"changelog_title": "Wijzigingslogboek"
|
||||
"changelog_title": "Wijzigingslogboek",
|
||||
"rate_limit_exceeded": "GitHub API -snelheidslimiet overschreden. Update check overslaan."
|
||||
},
|
||||
"totally_reset": {
|
||||
"title": "Cursor volledig herstellen",
|
||||
@@ -374,7 +455,45 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -387,5 +506,361 @@
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
485
locales/pt.json
485
locales/pt.json
@@ -19,9 +19,27 @@
|
||||
"totally_reset": "Redefinir Cursor Completamente",
|
||||
"outdate": "Obsoleto",
|
||||
"temp_github_register": "Registro temporário do GitHub",
|
||||
"coming_soon": "Em breve"
|
||||
"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",
|
||||
@@ -31,7 +49,11 @@
|
||||
"fr": "Francês",
|
||||
"pt": "Português do Brasil",
|
||||
"ru": "Russo",
|
||||
"es": "Espanhol"
|
||||
"es": "Espanhol",
|
||||
"bg": "búlgaro",
|
||||
"tr": "turco",
|
||||
"ja": "japonês",
|
||||
"it": "italiano"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "Iniciando fechamento do Cursor",
|
||||
@@ -98,7 +120,14 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -175,7 +204,28 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -265,7 +315,13 @@
|
||||
"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}"
|
||||
"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",
|
||||
@@ -278,7 +334,23 @@
|
||||
"removing_directory": "Removendo diretório",
|
||||
"directory_removed": "Diretório removido",
|
||||
"creating_block_file": "Criando arquivo de bloqueio",
|
||||
"block_file_created": "Arquivo de bloqueio criado"
|
||||
"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...",
|
||||
@@ -291,7 +363,8 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -382,7 +455,45 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -395,5 +506,361 @@
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
485
locales/ru.json
485
locales/ru.json
@@ -19,9 +19,27 @@
|
||||
"totally_reset": "Полностью сбросить Cursor",
|
||||
"outdate": "Устаревший",
|
||||
"temp_github_register": "Временная регистрация GitHub",
|
||||
"coming_soon": "Скоро"
|
||||
"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": "Традиционный китайский",
|
||||
@@ -31,7 +49,11 @@
|
||||
"fr": "Французский",
|
||||
"pt": "Бразильский португальский",
|
||||
"ru": "Русский",
|
||||
"es": "Испанский"
|
||||
"es": "Испанский",
|
||||
"bg": "болгарский",
|
||||
"tr": "турецкий",
|
||||
"it": "Итальянский",
|
||||
"ja": "Японский"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "Начало закрытия Cursor",
|
||||
@@ -98,7 +120,14 @@
|
||||
"package_not_found": "Package.json не найден: {path}",
|
||||
"check_version_failed": "Ошибка проверки версии: {error}",
|
||||
"stack_trace": "Трассировка стека",
|
||||
"version_too_low": "Версия Cursor слишком низкая: {version} < 0.45.0"
|
||||
"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",
|
||||
@@ -175,7 +204,28 @@
|
||||
"password_submitted": "Пароль отправлен",
|
||||
"total_usage": "Общее использование: {usage}",
|
||||
"setting_on_password": "Установка пароля",
|
||||
"getting_code": "Получение кода подтверждения, попытка через 60с"
|
||||
"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",
|
||||
@@ -265,7 +315,13 @@
|
||||
"available_domains_loaded": "Загружены доступные домены: {count}",
|
||||
"domains_filtered": "Отфильтрованы домены: {count}",
|
||||
"trying_to_create_email": "Попытка создания email: {email}",
|
||||
"domain_blocked": "Домен заблокирован: {domain}"
|
||||
"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",
|
||||
@@ -278,7 +334,23 @@
|
||||
"removing_directory": "Удаление директории",
|
||||
"directory_removed": "Директория удалена",
|
||||
"creating_block_file": "Создание файла блокировки",
|
||||
"block_file_created": "Файл блокировки создан"
|
||||
"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": "Проверка обновлений...",
|
||||
@@ -291,7 +363,8 @@
|
||||
"update_skipped": "Обновление пропущено.",
|
||||
"invalid_choice": "Неверный выбор. Пожалуйста, введите 'Y' или 'n'.",
|
||||
"development_version": "Версия разработки {current} > {latest}",
|
||||
"changelog_title": "Список изменений"
|
||||
"changelog_title": "Список изменений",
|
||||
"rate_limit_exceeded": "Предел ставки GitHub API превышен. Пропустить проверку обновления."
|
||||
},
|
||||
"totally_reset": {
|
||||
"title": "Полный сброс Cursor",
|
||||
@@ -382,7 +455,45 @@
|
||||
"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 завершено"
|
||||
"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",
|
||||
@@ -395,5 +506,361 @@
|
||||
"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": "Инструмент ограничения обхода токена"
|
||||
}
|
||||
}
|
||||
}
|
||||
482
locales/tr.json
482
locales/tr.json
@@ -9,6 +9,7 @@
|
||||
"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ı",
|
||||
@@ -19,9 +20,26 @@
|
||||
"totally_reset": "Cursor'ı Tamamen Sıfırla",
|
||||
"outdate": "güncel değil",
|
||||
"temp_github_register": "Geçici GitHub Kaydı",
|
||||
"coming_soon": "Yakında"
|
||||
"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": "繁體中文",
|
||||
@@ -32,7 +50,10 @@
|
||||
"pt": "Portuguese",
|
||||
"ru": "Russian",
|
||||
"tr": "Turkish",
|
||||
"es": "Spanish"
|
||||
"es": "Spanish",
|
||||
"bg": "Bulgarca",
|
||||
"ja": "Japonca",
|
||||
"it": "İtalyan"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "Cursor'dan Çıkış Başlatılıyor",
|
||||
@@ -99,7 +120,14 @@
|
||||
"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"
|
||||
"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ı",
|
||||
@@ -178,7 +206,26 @@
|
||||
"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."
|
||||
"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",
|
||||
@@ -268,7 +315,13 @@
|
||||
"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}"
|
||||
"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",
|
||||
@@ -281,7 +334,23 @@
|
||||
"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"
|
||||
"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...",
|
||||
@@ -294,7 +363,8 @@
|
||||
"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üğü"
|
||||
"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",
|
||||
@@ -385,7 +455,45 @@
|
||||
"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ı"
|
||||
"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",
|
||||
@@ -398,5 +506,361 @@
|
||||
"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ı"
|
||||
}
|
||||
}
|
||||
}
|
||||
667
locales/vi.json
667
locales/vi.json
@@ -20,19 +20,40 @@
|
||||
"totally_reset": "Đặt lại hoàn toàn Cursor",
|
||||
"outdate": "Quá cũ",
|
||||
"temp_github_register": "Đăng ký GitHub tạm thời",
|
||||
"coming_soon": "Sắp ra mắt"
|
||||
"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"
|
||||
"es": "Tiếng Tây Ban Nha",
|
||||
"it": "Ý",
|
||||
"ja": "Nhật Bản"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "Bắt Đầu Thoát Cursor",
|
||||
@@ -99,7 +120,14 @@
|
||||
"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"
|
||||
"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",
|
||||
@@ -176,10 +204,31 @@
|
||||
"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"
|
||||
"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": "Trình Quản Lý Xác Thực Cursor",
|
||||
"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}",
|
||||
@@ -191,7 +240,7 @@
|
||||
"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": "Kết Nối Cơ Sở Dữ Liệu Đã Đóng",
|
||||
"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ị",
|
||||
@@ -213,7 +262,7 @@
|
||||
"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 Đã Lưu Vào cursor_tokens.txt",
|
||||
"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",
|
||||
@@ -229,12 +278,12 @@
|
||||
"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": "Kết Nối Cơ Sở Dữ Liệu Đã Đó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 mail domains",
|
||||
"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}",
|
||||
@@ -261,16 +310,22 @@
|
||||
"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": "Tải Tên Miền Bị Chặn Hết Thời Gian: {timeout}s",
|
||||
"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": "Tên Miền Đã Lọc: {count}",
|
||||
"trying_to_create_email": "Đang cố gắng tạo email: {email}",
|
||||
"domain_blocked": "Tên Miền Bị Chặn: {domain}"
|
||||
"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_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",
|
||||
@@ -279,122 +334,534 @@
|
||||
"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"
|
||||
"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": "Không Thể Kiểm Tra Cập Nhật: {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'.",
|
||||
"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"
|
||||
"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": "Kết nối cơ sở dữ liệu đã đóng",
|
||||
"database_updated_successfully": "Cập nhật cơ sở dữ liệu thành công",
|
||||
"connected_to_database": "Đã kết nối với cơ sở dữ liệu",
|
||||
"updating_pair": "Đang cập nhật cặp khóa-giá trị",
|
||||
"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": "Kết nối cơ sở dữ liệu thất bại: {error}",
|
||||
"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ác cài đặt và cấu hình của Cursor AI",
|
||||
"feature_2": "Xóa tất cả dữ liệu bộ nhớ đệm bao gồm lịch sử và gợi ý AI",
|
||||
"feature_3": "Đặt lại ID máy để vượt qua kiểm tra dùng thử",
|
||||
"feature_4": "Tạo định danh máy ngẫu nhiên mới",
|
||||
"feature_5": "Xóa tiện ích mở rộng và tùy chỉnh",
|
||||
"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 ẩn liên quan đến giấy phép và dùng thử",
|
||||
"feature_8": "Bảo toàn các tệp và ứng dụng không liên quan đến Cursor",
|
||||
"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": "LƯU Ý",
|
||||
"disclaimer_1": "Công cụ này sẽ xóa vĩnh viễn tất cả cài đặt,",
|
||||
"disclaimer_2": "cấu hình và dữ liệu bộ nhớ đệm của Cursor AI. Thao tác này không thể hoàn tác.",
|
||||
"disclaimer_3": "Tệp mã nguồn của bạn sẽ KHÔNG bị ảnh hưởng, công cụ chỉ nhắm đến",
|
||||
"disclaimer_4": "các tệp chỉnh sửa Cursor AI và cơ chế kiểm tra dùng thử.",
|
||||
"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 dưới sự tự chịu trách nhiệm",
|
||||
"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,",
|
||||
"confirm_2": "cấu hình và dữ liệu bộ nhớ đệm của Cursor AI. Hành động này không thể hoàn tác.",
|
||||
"confirm_3": "Tệp mã nguồn của bạn sẽ KHÔNG bị ảnh hưởng, công cụ chỉ nhắm đến",
|
||||
"confirm_4": "các tệp chỉnh sửa Cursor AI và cơ chế kiểm tra dùng thử.",
|
||||
"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 dưới sự tự chịu trách nhiệm",
|
||||
"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 khi xóa {path}: {error}",
|
||||
"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 ID máy để vượt qua kiểm tra dùng thử...",
|
||||
"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 khi tạo tệp ID máy {path}: {error}",
|
||||
"error_searching": "Lỗi khi tìm kiếm tệp trong {path}: {error}",
|
||||
"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 khi tạo tệp thông tin dùng thử {path}: {error}",
|
||||
"resetting_cursor_ai_editor": "Đang đặt lại Cursor AI Editor... Vui lòng chờ.",
|
||||
"reset_cancelled": "Đã hủy đặt lại. Thoát mà không thực hiện thay đổi nào.",
|
||||
"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 dưới quyền quản trị viên",
|
||||
"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 dọn dẹp các mục registry.",
|
||||
"windows_registry_instructions_2": " Chạy 'regedit' và tìm kiếm khóa chứa 'Cursor' hoặc 'CursorAI' dưới HKEY_CURRENT_USER\\Software\\ và xóa chúng.\n",
|
||||
"reset_log_1": "Cursor AI đã được đặt lại hoàn toàn và vượt qua kiểm tra dùng thử!",
|
||||
"reset_log_2": "Vui lòng khởi động lại hệ thống để thay đổi có hiệu lực.",
|
||||
"reset_log_3": "Bạn cần cài đặt lại Cursor AI và sẽ có kỳ dùng thử mới.",
|
||||
"reset_log_4": "Để có kết quả tốt nhất, bạn có thể cân nhắc:",
|
||||
"reset_log_5": "Sử dụng đị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",
|
||||
"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 gặp sự cố, hãy thử cài Cursor AI vào vị trí khác",
|
||||
"reset_log_9": "Nếu gặp bất kỳ vấn đề nào, hãy truy cập Github Issue Tracker và tạo issue tại https://github.com/yeongpin/cursor-free-vip/issues",
|
||||
"unexpected_error": "Đã xảy ra lỗi không mong muốn: {error}",
|
||||
"report_issue": "Vui lòng báo cáo sự cố này tại Github Issue Tracker: https://github.com/yeongpin/cursor-free-vip/issues",
|
||||
"keyboard_interrupt": "Quá trình bị người dùng hủy. Đang thoát...",
|
||||
"return_to_main_menu": "Trở về menu chính...",
|
||||
"process_interrupted": "Quá trình bị gián đoạn. Đang thoát...",
|
||||
"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 thử nghiệm/giấy phép đã biết",
|
||||
"performing_deep_scan": "Đang quét sâu để tìm thêm tệp thử nghiệm/giấy phép",
|
||||
"found_additional_potential_license_trial_files": "Đã tìm thấy {count} tệp thử nghiệm/giấy phép tiềm năng bổ sung",
|
||||
"checking_for_electron_localstorage_files": "Đang kiểm tra các tệp Electron localStorage",
|
||||
"no_additional_license_trial_files_found_in_deep_scan": "Không tìm thấy thêm tệp thử nghiệm/giấy phép nào trong quá trình quét sâu",
|
||||
"removing_electron_localstorage_files": "Đang xóa các tệp Electron localStorage",
|
||||
"electron_localstorage_files_removed": "Đã xóa các tệp Electron localStorage",
|
||||
"electron_localstorage_files_removal_error": "Lỗi khi xóa các tệp Electron localStorage: {error}",
|
||||
"removing_electron_localstorage_files_completed": "Đã hoàn tất việc xóa các tệp Electron localStorage"
|
||||
"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 hồ sơ Chrome để sử dụng:",
|
||||
"profile_list": "Các hồ sơ có sẵn:",
|
||||
"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 khi tải hồ sơ Chrome: {error}",
|
||||
"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."
|
||||
}
|
||||
}
|
||||
@@ -4,8 +4,8 @@
|
||||
"exit": "退出程序",
|
||||
"reset": "重置机器ID",
|
||||
"register": "注册新的Cursor账户",
|
||||
"register_google": "使用Google账户注册",
|
||||
"register_github": "使用GitHub账户注册",
|
||||
"register_google": "使用自己的Google账户注册",
|
||||
"register_github": "使用自己的GitHub账户注册",
|
||||
"register_manual": "使用自定义邮箱注册Cursor",
|
||||
"quit": "关闭Cursor应用",
|
||||
"select_language": "更改语言",
|
||||
@@ -30,9 +30,16 @@
|
||||
"continue_prompt": "继续?(y/N): ",
|
||||
"operation_cancelled_by_user": "操作被用户取消",
|
||||
"exiting": "退出中 ……",
|
||||
"bypass_version_check": "绕过 Cursor 版本检查"
|
||||
"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": {
|
||||
"ar": "阿拉伯语",
|
||||
"en": "英语",
|
||||
"zh_cn": "简体中文",
|
||||
"zh_tw": "繁体中文",
|
||||
@@ -44,7 +51,9 @@
|
||||
"ru": "俄语",
|
||||
"tr": "土耳其语",
|
||||
"bg": "保加利亚语",
|
||||
"es": "西班牙语"
|
||||
"es": "西班牙语",
|
||||
"it": "意大利语",
|
||||
"ja": "日语"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "开始退出 Cursor",
|
||||
@@ -195,7 +204,28 @@
|
||||
"password_submitted": "密码已提交",
|
||||
"total_usage": "总使用量: {usage}",
|
||||
"setting_on_password": "设置密码",
|
||||
"getting_code": "获取验证码,将在60秒内尝试..."
|
||||
"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 认证管理器",
|
||||
@@ -215,7 +245,8 @@
|
||||
"updating_pair": "更新键值对",
|
||||
"db_not_found": "未找到数据库文件:{path}",
|
||||
"db_permission_error": "无法访问数据库文件,请检查权限",
|
||||
"db_connection_error": "连接数据库失败:{error}"
|
||||
"db_connection_error": "连接数据库失败:{error}",
|
||||
"reset_machine_id": "重置机ID"
|
||||
},
|
||||
"control": {
|
||||
"generate_email": "生成新邮箱",
|
||||
@@ -246,7 +277,9 @@
|
||||
"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": "启动浏览器",
|
||||
@@ -443,7 +476,24 @@
|
||||
"cursor_reset_completed": "Cursor AI 编辑器已完全重置且绕过试用检测!",
|
||||
"cursor_reset_failed": "Cursor AI 编辑器重置失败:{error}",
|
||||
"cursor_reset_cancelled": "Cursor AI 编辑器重置已取消,未进行任何更改。",
|
||||
"operation_cancelled": "操作已取消,未进行任何更改。"
|
||||
"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 注册自动化",
|
||||
@@ -540,7 +590,10 @@
|
||||
"backup_failed": "备份失败: {error}",
|
||||
"force_update_failed": "强制更新配置失败: {error}",
|
||||
"config_force_update_disabled": "配置文件强制更新已禁用,跳过强制更新",
|
||||
"config_force_update_enabled": "配置文件强制更新已启用,正在执行强制更新"
|
||||
"config_force_update_enabled": "配置文件强制更新已启用,正在执行强制更新",
|
||||
"documents_path_not_found": "找不到文档路径,使用当前目录",
|
||||
"config_dir_created": "已创建配置目录: {path}",
|
||||
"using_temp_dir": "由于错误使用临时目录: {path} (错误: {error})"
|
||||
},
|
||||
"oauth": {
|
||||
"authentication_button_not_found": "未找到认证按钮",
|
||||
@@ -599,19 +652,31 @@
|
||||
"warning_could_not_kill_existing_browser_processes": "警告: 无法杀死现有浏览器进程: {error}",
|
||||
"browser_failed_to_start": "浏览器启动失败: {error}",
|
||||
"browser_failed": "浏览器启动失败: {error}",
|
||||
"browser_failed_to_start_fallback": "浏览器启动失败: {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}"
|
||||
},
|
||||
"chrome_profile": {
|
||||
"title": "Chrome配置文件选择",
|
||||
"select_profile": "选择要使用的Chrome配置文件:",
|
||||
"profile_list": "可用配置文件:",
|
||||
"browser_profile": {
|
||||
"title": "浏览器配置文件选择",
|
||||
"select_profile": "选择要使用的{browser}配置文件:",
|
||||
"profile_list": "可用{browser}配置文件:",
|
||||
"default_profile": "默认配置文件",
|
||||
"profile": "配置文件 {number}",
|
||||
"no_profiles": "未找到Chrome配置文件",
|
||||
"error_loading": "加载Chrome配置文件时出错:{error}",
|
||||
"no_profiles": "未找到{browser}配置文件",
|
||||
"error_loading": "加载{browser}配置文件时出错:{error}",
|
||||
"profile_selected": "已选择配置文件:{profile}",
|
||||
"invalid_selection": "选择无效。请重试",
|
||||
"warning_chrome_close": "警告:这将关闭所有正在运行的Chrome进程"
|
||||
"invalid_selection": "选择无效。请重试"
|
||||
},
|
||||
"account_delete": {
|
||||
"title": "Cursor Google 账号删除工具",
|
||||
@@ -676,5 +741,118 @@
|
||||
"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身份验证数据库..."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,8 +4,8 @@
|
||||
"exit": "退出程式",
|
||||
"reset": "重置機器ID",
|
||||
"register": "註冊新的Cursor帳戶",
|
||||
"register_google": "使用Google帳戶註冊",
|
||||
"register_github": "使用GitHub帳戶註冊",
|
||||
"register_google": "使用自己的Google帳戶註冊",
|
||||
"register_github": "使用自己的GitHub帳戶註冊",
|
||||
"register_manual": "使用自定義郵箱註冊Cursor",
|
||||
"quit": "關閉Cursor應用",
|
||||
"select_language": "更改語言",
|
||||
@@ -30,9 +30,16 @@
|
||||
"continue_prompt": "繼續?(y/N): ",
|
||||
"operation_cancelled_by_user": "操作被使用者取消",
|
||||
"exiting": "退出中 ……",
|
||||
"bypass_version_check": "繞過 Cursor 版本檢查"
|
||||
"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": {
|
||||
"ar": "阿拉伯語",
|
||||
"en": "英文",
|
||||
"zh_cn": "簡體中文",
|
||||
"zh_tw": "繁體中文",
|
||||
@@ -44,7 +51,9 @@
|
||||
"ru": "俄文",
|
||||
"tr": "土耳其文",
|
||||
"bg": "保加利亞文",
|
||||
"es": "西班牙文"
|
||||
"es": "西班牙文",
|
||||
"ja": "日文",
|
||||
"it": "義大利文"
|
||||
},
|
||||
"quit_cursor": {
|
||||
"start": "開始退出 Cursor",
|
||||
@@ -120,7 +129,6 @@
|
||||
"update_windows_machine_guid_failed": "更新Windows機器GUID失敗: {error}",
|
||||
"file_not_found": "文件未找到: {path}"
|
||||
},
|
||||
|
||||
"register": {
|
||||
"title": "Cursor 註冊工具",
|
||||
"start": "正在啟動註冊流程...",
|
||||
@@ -147,6 +155,22 @@
|
||||
"no_turnstile": "未檢測到 Turnstile 驗證",
|
||||
"turnstile_passed": "驗證通過",
|
||||
"verification_start": "開始獲取驗證碼",
|
||||
"verification_timeout": "獲取驗證碼超時",
|
||||
"verification_not_found": "未找到驗證碼",
|
||||
"try_get_code": "第 {attempt} 次嘗試獲取驗證碼 | 剩餘時間: {time}秒",
|
||||
"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}",
|
||||
"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": "檢測到登錄頁面,開始登錄...",
|
||||
@@ -177,7 +201,31 @@
|
||||
"password_submitted": "密碼已提交",
|
||||
"total_usage": "總使用量: {usage}",
|
||||
"setting_on_password": "設置密碼",
|
||||
"getting_code": "正在獲取驗證碼,將在60秒內嘗試..."
|
||||
"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 認證管理器",
|
||||
@@ -197,7 +245,8 @@
|
||||
"updating_pair": "更新鍵值對",
|
||||
"db_not_found": "未找到數據庫文件:{path}",
|
||||
"db_permission_error": "無法訪問數據庫文件,請檢查權限",
|
||||
"db_connection_error": "連接數據庫失敗:{error}"
|
||||
"db_connection_error": "連接數據庫失敗:{error}",
|
||||
"reset_machine_id": "重置機ID"
|
||||
},
|
||||
"control": {
|
||||
"generate_email": "生成新郵箱",
|
||||
@@ -228,7 +277,9 @@
|
||||
"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": "啟動瀏覽器",
|
||||
@@ -425,7 +476,24 @@
|
||||
"cursor_reset_completed": "Cursor AI 編輯器已完全重置且繞過試用偵測!",
|
||||
"cursor_reset_failed": "Cursor AI 編輯器重置失敗:{error}",
|
||||
"cursor_reset_cancelled": "Cursor AI 編輯器重置已取消,未進行任何更改。",
|
||||
"operation_cancelled": "操作已取消,未進行任何更改。"
|
||||
"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 注册自动化",
|
||||
@@ -522,7 +590,10 @@
|
||||
"backup_failed": "備份失敗: {error}",
|
||||
"force_update_failed": "強制更新配置失敗: {error}",
|
||||
"config_force_update_disabled": "配置文件強制更新已禁用,跳過強制更新",
|
||||
"config_force_update_enabled": "配置文件強制更新已啟用,正在執行強制更新"
|
||||
"config_force_update_enabled": "配置文件強制更新已啟用,正在執行強制更新",
|
||||
"documents_path_not_found": "使用當前目錄找不到文檔路徑",
|
||||
"config_dir_created": "配置目錄創建:{path}",
|
||||
"using_temp_dir": "由於錯誤而使用臨時目錄:{path}(錯誤:{error})"
|
||||
},
|
||||
"oauth": {
|
||||
"authentication_button_not_found": "未找到認證按鈕",
|
||||
@@ -580,7 +651,23 @@
|
||||
"warning_could_not_kill_existing_browser_processes": "警告: 無法殺死現有瀏覽器進程: {error}",
|
||||
"browser_failed_to_start": "瀏覽器啟動失敗: {error}",
|
||||
"browser_failed": "瀏覽器啟動失敗: {error}",
|
||||
"browser_failed_to_start_fallback": "瀏覽器啟動失敗: {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配置檔案選擇",
|
||||
@@ -658,5 +745,129 @@
|
||||
"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": "無法更新身份驗證信息"
|
||||
}
|
||||
}
|
||||
}
|
||||
2
logo.py
2
logo.py
@@ -83,7 +83,7 @@ muhammedfurkan plamkatawe Lucaszmv
|
||||
"""
|
||||
OTHER_INFO_TEXT = f"""{Fore.YELLOW}
|
||||
Github: https://github.com/yeongpin/cursor-free-vip{Fore.RED}
|
||||
Press 8 to change language | 按下 8 键切换语言{Style.RESET_ALL}"""
|
||||
Press 4 to change language | 按下 4 键切换语言{Style.RESET_ALL}"""
|
||||
|
||||
# center display LOGO and DESCRIPTION
|
||||
CURSOR_LOGO = center_multiline_text(LOGO_TEXT, handle_chinese=False)
|
||||
|
||||
541
main.py
541
main.py
@@ -12,6 +12,15 @@ import subprocess
|
||||
from config import get_config, force_update_config
|
||||
import shutil
|
||||
import re
|
||||
from utils import get_user_documents_path
|
||||
|
||||
# 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':
|
||||
@@ -79,8 +88,37 @@ def run_as_admin():
|
||||
class Translator:
|
||||
def __init__(self):
|
||||
self.translations = {}
|
||||
self.current_language = self.detect_system_language() # Use correct method name
|
||||
self.fallback_language = 'en' # Fallback language if translation is missing
|
||||
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 detect_system_language(self):
|
||||
@@ -110,18 +148,26 @@ class Translator:
|
||||
threadid = user32.GetWindowThreadProcessId(hwnd, 0)
|
||||
layout_id = user32.GetKeyboardLayout(threadid) & 0xFFFF
|
||||
|
||||
# Map language ID to our language codes
|
||||
language_map = {
|
||||
0x0409: 'en', # English
|
||||
0x0404: 'zh_tw', # Traditional Chinese
|
||||
0x0804: 'zh_cn', # Simplified Chinese
|
||||
0x0422: 'vi', # Vietnamese
|
||||
0x0419: 'ru', # Russian
|
||||
0x0415: 'tr', # Turkish
|
||||
0x0402: 'bg', # Bulgarian
|
||||
}
|
||||
|
||||
return language_map.get(layout_id, 'en')
|
||||
# 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()
|
||||
|
||||
@@ -129,85 +175,123 @@ class Translator:
|
||||
"""Detect language on Unix-like systems (Linux, macOS)"""
|
||||
try:
|
||||
# Get the system locale
|
||||
system_locale = locale.getdefaultlocale()[0]
|
||||
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
|
||||
if system_locale.startswith('zh_tw') or system_locale.startswith('zh_hk'):
|
||||
return 'zh_tw'
|
||||
elif system_locale.startswith('zh_cn'):
|
||||
return 'zh_cn'
|
||||
elif system_locale.startswith('en'):
|
||||
return 'en'
|
||||
elif system_locale.startswith('vi'):
|
||||
return 'vi'
|
||||
elif system_locale.startswith('nl'):
|
||||
return 'nl'
|
||||
elif system_locale.startswith('de'):
|
||||
return 'de'
|
||||
elif system_locale.startswith('fr'):
|
||||
return 'fr'
|
||||
elif system_locale.startswith('pt'):
|
||||
return 'pt'
|
||||
elif system_locale.startswith('ru'):
|
||||
return 'ru'
|
||||
elif system_locale.startswith('tr'):
|
||||
return 'tr'
|
||||
elif system_locale.startswith('bg'):
|
||||
return 'bg'
|
||||
# Try to get language from LANG environment variable as fallback
|
||||
env_lang = os.getenv('LANG', '').lower()
|
||||
if 'tw' in env_lang or 'hk' in env_lang:
|
||||
return 'zh_tw'
|
||||
elif 'cn' in env_lang:
|
||||
return 'zh_cn'
|
||||
elif 'vi' in env_lang:
|
||||
return 'vi'
|
||||
elif 'nl' in env_lang:
|
||||
return 'nl'
|
||||
elif 'de' in env_lang:
|
||||
return 'de'
|
||||
elif 'fr' in env_lang:
|
||||
return 'fr'
|
||||
elif 'pt' in env_lang:
|
||||
return 'pt'
|
||||
elif 'ru' in env_lang:
|
||||
return 'ru'
|
||||
elif 'tr' in env_lang:
|
||||
return 'tr'
|
||||
elif 'bg' in env_lang:
|
||||
return 'bg'
|
||||
|
||||
return 'en'
|
||||
# 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 load_translations(self):
|
||||
"""Load all available translations"""
|
||||
try:
|
||||
locales_dir = os.path.join(os.path.dirname(__file__), 'locales')
|
||||
if hasattr(sys, '_MEIPASS'):
|
||||
locales_dir = os.path.join(sys._MEIPASS, 'locales')
|
||||
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
|
||||
|
||||
if not os.path.exists(locales_dir):
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Locales directory not found{Style.RESET_ALL}")
|
||||
return
|
||||
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
|
||||
|
||||
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)
|
||||
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:
|
||||
@@ -216,7 +300,8 @@ class Translator:
|
||||
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)
|
||||
return result.format(**kwargs) if kwargs else result
|
||||
formatted = result.format(**kwargs) if kwargs else result
|
||||
return self.fix_arabic(formatted)
|
||||
except Exception:
|
||||
return key
|
||||
|
||||
@@ -243,7 +328,11 @@ class Translator:
|
||||
|
||||
def get_available_languages(self):
|
||||
"""Get list of available languages"""
|
||||
return list(self.translations.keys())
|
||||
# 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()
|
||||
@@ -274,20 +363,22 @@ def print_menu():
|
||||
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')} ({Fore.RED}{translator.get('menu.outdate')}{Style.RESET_ALL})",
|
||||
3: f"{Fore.GREEN}3{Style.RESET_ALL}. {EMOJI['SUN']} {translator.get('menu.register_google')} {EMOJI['ROCKET']} ({Fore.YELLOW}{translator.get('menu.lifetime_access_enabled')}{Style.RESET_ALL})",
|
||||
4: f"{Fore.GREEN}4{Style.RESET_ALL}. {EMOJI['STAR']} {translator.get('menu.register_github')} {EMOJI['ROCKET']} ({Fore.YELLOW}{translator.get('menu.lifetime_access_enabled')}{Style.RESET_ALL})",
|
||||
5: f"{Fore.GREEN}5{Style.RESET_ALL}. {EMOJI['SUCCESS']} {translator.get('menu.register_manual')}",
|
||||
6: f"{Fore.GREEN}6{Style.RESET_ALL}. {EMOJI['RESET']} {translator.get('menu.temp_github_register')}",
|
||||
7: f"{Fore.GREEN}7{Style.RESET_ALL}. {EMOJI['ERROR']} {translator.get('menu.quit')}",
|
||||
8: f"{Fore.GREEN}8{Style.RESET_ALL}. {EMOJI['LANG']} {translator.get('menu.select_language')}",
|
||||
9: f"{Fore.GREEN}9{Style.RESET_ALL}. {EMOJI['UPDATE']} {translator.get('menu.disable_auto_update')}",
|
||||
10: f"{Fore.GREEN}10{Style.RESET_ALL}. {EMOJI['RESET']} {translator.get('menu.totally_reset')}",
|
||||
11: f"{Fore.GREEN}11{Style.RESET_ALL}. {EMOJI['CONTRIBUTE']} {translator.get('menu.contribute')}",
|
||||
12: f"{Fore.GREEN}12{Style.RESET_ALL}. {EMOJI['SETTINGS']} {translator.get('menu.config')}",
|
||||
13: f"{Fore.GREEN}13{Style.RESET_ALL}. {EMOJI['SETTINGS']} {translator.get('menu.select_chrome_profile')}",
|
||||
14: f"{Fore.GREEN}14{Style.RESET_ALL}. {EMOJI['ERROR']} {translator.get('menu.delete_google_account', fallback='Delete Cursor Google Account')}",
|
||||
15: f"{Fore.GREEN}15{Style.RESET_ALL}. {EMOJI['UPDATE']} {translator.get('menu.bypass_version_check', fallback='Bypass Cursor Version Check')}"
|
||||
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
|
||||
@@ -364,21 +455,45 @@ def select_language():
|
||||
print(f"\n{Fore.CYAN}{EMOJI['LANG']} {translator.get('menu.select_language')}:{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}{'─' * 40}{Style.RESET_ALL}")
|
||||
|
||||
# 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}")
|
||||
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=f'0-{len(languages)-1}')}: {Style.RESET_ALL}")
|
||||
if choice.isdigit() and 0 <= int(choice) < len(languages):
|
||||
translator.set_language(languages[int(choice)])
|
||||
# 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
|
||||
else:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.invalid_choice')}{Style.RESET_ALL}")
|
||||
# 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):
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {translator.get('menu.invalid_choice')}{Style.RESET_ALL}")
|
||||
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():
|
||||
@@ -386,31 +501,67 @@ def check_latest_version():
|
||||
try:
|
||||
print(f"\n{Fore.CYAN}{EMOJI['UPDATE']} {translator.get('updater.checking')}{Style.RESET_ALL}")
|
||||
|
||||
# Get latest version from GitHub API with timeout and proper headers
|
||||
# First try GitHub API
|
||||
headers = {
|
||||
'Accept': 'application/vnd.github.v3+json',
|
||||
'User-Agent': 'CursorFreeVIP-Updater'
|
||||
}
|
||||
response = requests.get(
|
||||
"https://api.github.com/repos/yeongpin/cursor-free-vip/releases/latest",
|
||||
headers=headers,
|
||||
timeout=10
|
||||
)
|
||||
|
||||
# Check if rate limit exceeded
|
||||
if response.status_code == 403 and "rate limit exceeded" in response.text.lower():
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('updater.rate_limit_exceeded', fallback='GitHub API rate limit exceeded. Skipping update check.')}{Style.RESET_ALL}")
|
||||
return
|
||||
latest_version = None
|
||||
github_error = None
|
||||
|
||||
# Check if response is successful
|
||||
if response.status_code != 200:
|
||||
raise Exception(f"GitHub API returned status code {response.status_code}")
|
||||
# Try GitHub API first
|
||||
try:
|
||||
github_response = requests.get(
|
||||
"https://api.github.com/repos/yeongpin/cursor-free-vip/releases/latest",
|
||||
headers=headers,
|
||||
timeout=10
|
||||
)
|
||||
|
||||
response_data = response.json()
|
||||
if "tag_name" not in response_data:
|
||||
raise Exception("No version tag found in GitHub response")
|
||||
# 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')
|
||||
|
||||
latest_version = response_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:
|
||||
@@ -560,82 +711,90 @@ def main():
|
||||
|
||||
while True:
|
||||
try:
|
||||
choice_num = 15
|
||||
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)
|
||||
print_menu()
|
||||
elif choice == "2":
|
||||
import cursor_register
|
||||
cursor_register.main(translator)
|
||||
print_menu()
|
||||
elif choice == "3":
|
||||
import cursor_register_google
|
||||
cursor_register_google.main(translator)
|
||||
print_menu()
|
||||
elif choice == "4":
|
||||
import cursor_register_github
|
||||
cursor_register_github.main(translator)
|
||||
print_menu()
|
||||
elif choice == "5":
|
||||
import cursor_register_manual
|
||||
cursor_register_manual.main(translator)
|
||||
print_menu()
|
||||
elif choice == "6":
|
||||
import github_cursor_register
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {translator.get('menu.coming_soon')}{Style.RESET_ALL}")
|
||||
# github_cursor_register.main(translator)
|
||||
print_menu()
|
||||
elif choice == "7":
|
||||
import quit_cursor
|
||||
quit_cursor.quit_cursor(translator)
|
||||
print_menu()
|
||||
elif choice == "8":
|
||||
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
|
||||
elif choice == "9":
|
||||
import disable_auto_update
|
||||
disable_auto_update.run(translator)
|
||||
print_menu()
|
||||
elif choice == "10":
|
||||
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()
|
||||
elif choice == "11":
|
||||
import logo
|
||||
print(logo.CURSOR_CONTRIBUTORS)
|
||||
print_menu()
|
||||
elif choice == "12":
|
||||
from config import print_config
|
||||
print_config(get_config(), translator)
|
||||
print_menu()
|
||||
elif choice == "13":
|
||||
from oauth_auth import OAuthHandler
|
||||
oauth = OAuthHandler(translator)
|
||||
oauth._select_profile()
|
||||
print_menu()
|
||||
elif choice == "14":
|
||||
import delete_cursor_google
|
||||
delete_cursor_google.main(translator)
|
||||
print_menu()
|
||||
elif choice == "15":
|
||||
import bypass_version
|
||||
bypass_version.main(translator)
|
||||
print_menu()
|
||||
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:
|
||||
|
||||
132
manual_custom_auth.py
Normal file
132
manual_custom_auth.py
Normal 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)
|
||||
@@ -8,6 +8,7 @@ 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
|
||||
@@ -112,29 +113,6 @@ def fill_signup_form(page, first_name, last_name, email, config, translator=None
|
||||
print(f"Error filling form: {e}")
|
||||
return False
|
||||
|
||||
def get_default_chrome_path():
|
||||
"""Get default Chrome path"""
|
||||
if sys.platform == "win32":
|
||||
paths = [
|
||||
os.path.join(os.environ.get('PROGRAMFILES', ''), 'Google/Chrome/Application/chrome.exe'),
|
||||
os.path.join(os.environ.get('PROGRAMFILES(X86)', ''), 'Google/Chrome/Application/chrome.exe'),
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Google/Chrome/Application/chrome.exe')
|
||||
]
|
||||
elif sys.platform == "darwin":
|
||||
paths = [
|
||||
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
|
||||
]
|
||||
else: # Linux
|
||||
paths = [
|
||||
"/usr/bin/google-chrome",
|
||||
"/usr/bin/google-chrome-stable"
|
||||
]
|
||||
|
||||
for path in paths:
|
||||
if os.path.exists(path):
|
||||
return path
|
||||
return ""
|
||||
|
||||
def get_user_documents_path():
|
||||
"""Get user Documents folder path"""
|
||||
if sys.platform == "win32":
|
||||
@@ -186,25 +164,32 @@ def setup_driver(translator=None):
|
||||
# Get config
|
||||
config = get_config(translator)
|
||||
|
||||
# Get Chrome path
|
||||
chrome_path = config.get('Chrome', 'chromepath', fallback=get_default_chrome_path())
|
||||
# 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 chrome_path or not os.path.exists(chrome_path):
|
||||
if not browser_path or not os.path.exists(browser_path):
|
||||
if translator:
|
||||
print(f"{Fore.YELLOW}⚠️ {translator.get('register.chrome_path_invalid') if translator else 'Chrome路径无效,使用默认路径'}{Style.RESET_ALL}")
|
||||
chrome_path = get_default_chrome_path()
|
||||
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 Chrome path
|
||||
co.set_browser_path(chrome_path)
|
||||
# Set browser path
|
||||
co.set_browser_path(browser_path)
|
||||
|
||||
# Use incognito mode
|
||||
co.set_argument("--incognito")
|
||||
|
||||
if sys.platform == "linux":
|
||||
# Set random port
|
||||
# Set Linux specific options
|
||||
co.set_argument("--no-sandbox")
|
||||
|
||||
# Set random port
|
||||
@@ -213,6 +198,10 @@ def setup_driver(translator=None):
|
||||
# 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")
|
||||
@@ -234,30 +223,38 @@ def setup_driver(translator=None):
|
||||
before_pids = []
|
||||
try:
|
||||
import psutil
|
||||
before_pids = [p.pid for p in psutil.process_iter() if 'chrome' in p.name().lower()]
|
||||
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 Chrome to fully launch
|
||||
# Wait a moment for browser to fully launch
|
||||
time.sleep(1)
|
||||
|
||||
# Record Chrome processes after launching and find new ones
|
||||
# Record browser processes after launching and find new ones
|
||||
try:
|
||||
import psutil
|
||||
after_pids = [p.pid for p in psutil.process_iter() if 'chrome' in p.name().lower()]
|
||||
# Find new Chrome processes
|
||||
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"Tracking {len(_chrome_process_ids)} Chrome processes")
|
||||
print(f"{translator.get('register.tracking_processes', count=len(_chrome_process_ids), browser=browser_type)}")
|
||||
else:
|
||||
print(f"{Fore.YELLOW}Warning: No new Chrome processes detected to track{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}Warning: {translator.get('register.no_new_processes_detected', browser=browser_type)}{Style.RESET_ALL}")
|
||||
except Exception as e:
|
||||
print(f"Warning: Could not track Chrome processes: {e}")
|
||||
print(f"{translator.get('register.could_not_track_processes', browser=browser_type, error=str(e))}")
|
||||
|
||||
return config, page
|
||||
|
||||
|
||||
337
new_tempemail.py
337
new_tempemail.py
@@ -1,337 +0,0 @@
|
||||
from DrissionPage import ChromiumPage, ChromiumOptions
|
||||
import time
|
||||
import os
|
||||
import sys
|
||||
from colorama import Fore, Style, init
|
||||
import requests
|
||||
import random
|
||||
import string
|
||||
from utils import get_random_wait_time
|
||||
|
||||
# Initialize colorama
|
||||
init()
|
||||
|
||||
class NewTempEmail:
|
||||
def __init__(self, translator=None):
|
||||
self.translator = translator
|
||||
self.page = None
|
||||
self.setup_browser()
|
||||
|
||||
def get_blocked_domains(self):
|
||||
"""Get blocked domains list"""
|
||||
try:
|
||||
block_url = "https://raw.githubusercontent.com/yeongpin/cursor-free-vip/main/block_domain.txt"
|
||||
response = requests.get(block_url, timeout=5)
|
||||
if response.status_code == 200:
|
||||
# Split text and remove empty lines
|
||||
domains = [line.strip() for line in response.text.split('\n') if line.strip()]
|
||||
if self.translator:
|
||||
print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.blocked_domains_loaded', count=len(domains))}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.CYAN}ℹ️ 已加载 {len(domains)} 个被屏蔽的域名{Style.RESET_ALL}")
|
||||
return domains
|
||||
return self._load_local_blocked_domains()
|
||||
except Exception as e:
|
||||
if self.translator:
|
||||
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.blocked_domains_error', error=str(e))}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.YELLOW}⚠️ 获取被屏蔽域名列表失败: {str(e)}{Style.RESET_ALL}")
|
||||
return self._load_local_blocked_domains()
|
||||
|
||||
def _load_local_blocked_domains(self):
|
||||
"""Load blocked domains from local file as fallback"""
|
||||
try:
|
||||
local_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "block_domain.txt")
|
||||
if os.path.exists(local_path):
|
||||
with open(local_path, 'r', encoding='utf-8') as f:
|
||||
domains = [line.strip() for line in f.readlines() if line.strip()]
|
||||
if self.translator:
|
||||
print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.local_blocked_domains_loaded', count=len(domains))}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.CYAN}ℹ️ 已从本地加载 {len(domains)} 个被屏蔽的域名{Style.RESET_ALL}")
|
||||
return domains
|
||||
else:
|
||||
if self.translator:
|
||||
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.local_blocked_domains_not_found')}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.YELLOW}⚠️ 本地被屏蔽域名文件不存在{Style.RESET_ALL}")
|
||||
return []
|
||||
except Exception as e:
|
||||
if self.translator:
|
||||
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.local_blocked_domains_error', error=str(e))}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.YELLOW}⚠️ 读取本地被屏蔽域名文件失败: {str(e)}{Style.RESET_ALL}")
|
||||
return []
|
||||
|
||||
def exclude_blocked_domains(self, domains):
|
||||
"""Exclude blocked domains"""
|
||||
if not self.blocked_domains:
|
||||
return domains
|
||||
|
||||
filtered_domains = []
|
||||
for domain in domains:
|
||||
if domain['domain'] not in self.blocked_domains:
|
||||
filtered_domains.append(domain)
|
||||
|
||||
excluded_count = len(domains) - len(filtered_domains)
|
||||
if excluded_count > 0:
|
||||
if self.translator:
|
||||
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.domains_excluded', domains=excluded_count)}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.YELLOW}⚠️ 已排除 {excluded_count} 个被屏蔽的域名{Style.RESET_ALL}")
|
||||
|
||||
return filtered_domains
|
||||
|
||||
|
||||
def get_extension_block(self):
|
||||
"""获取插件路径"""
|
||||
root_dir = os.getcwd()
|
||||
extension_path = os.path.join(root_dir, "PBlock")
|
||||
|
||||
if hasattr(sys, "_MEIPASS"):
|
||||
extension_path = os.path.join(sys._MEIPASS, "PBlock")
|
||||
|
||||
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()
|
||||
|
||||
# Only use headless for non-OAuth operations
|
||||
if not hasattr(self, 'auth_type') or self.auth_type != 'oauth':
|
||||
co.set_argument("--headless=new")
|
||||
|
||||
if sys.platform == "linux":
|
||||
# Check if DISPLAY is set when not in headless mode
|
||||
if not co.arguments.get("--headless=new") and not os.environ.get('DISPLAY'):
|
||||
print(f"{Fore.RED}❌ {self.translator.get('email.no_display_found') if self.translator else 'No display found. Make sure X server is running.'}{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}ℹ️ {self.translator.get('email.try_export_display') if self.translator else 'Try: export DISPLAY=:0'}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
co.set_argument("--no-sandbox")
|
||||
co.set_argument("--disable-dev-shm-usage")
|
||||
co.set_argument("--disable-gpu")
|
||||
|
||||
# If running as root, try to use actual user's Chrome profile
|
||||
if os.geteuid() == 0:
|
||||
sudo_user = os.environ.get('SUDO_USER')
|
||||
if sudo_user:
|
||||
actual_home = f"/home/{sudo_user}"
|
||||
user_data_dir = os.path.join(actual_home, ".config", "google-chrome")
|
||||
if os.path.exists(user_data_dir):
|
||||
print(f"{Fore.CYAN}ℹ️ {self.translator.get('email.using_chrome_profile', user_data_dir=user_data_dir) if self.translator else f'Using Chrome profile from: {user_data_dir}'}{Style.RESET_ALL}")
|
||||
co.set_argument(f"--user-data-dir={user_data_dir}")
|
||||
|
||||
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}")
|
||||
|
||||
if sys.platform == "linux":
|
||||
print(f"{Fore.YELLOW}ℹ️ {self.translator.get('email.make_sure_chrome_chromium_is_properly_installed') if self.translator else 'Make sure Chrome/Chromium is properly installed'}{Style.RESET_ALL}")
|
||||
print(f"{Fore.YELLOW}ℹ️ {self.translator.get('email.try_install_chromium') if self.translator else 'Try: sudo apt install chromium-browser'}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
def create_email(self):
|
||||
"""create temporary email"""
|
||||
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}")
|
||||
|
||||
# load blocked domains list
|
||||
self.blocked_domains = self.get_blocked_domains()
|
||||
|
||||
# visit website
|
||||
self.page.get("https://smailpro.com/")
|
||||
time.sleep(2)
|
||||
|
||||
# click create email button
|
||||
create_button = self.page.ele('xpath://button[@title="Create temporary email"]')
|
||||
if create_button:
|
||||
create_button.click()
|
||||
time.sleep(1)
|
||||
|
||||
# click Create button in popup
|
||||
modal_create_button = self.page.ele('xpath://button[contains(text(), "Create")]')
|
||||
if modal_create_button:
|
||||
modal_create_button.click()
|
||||
time.sleep(2)
|
||||
|
||||
# get email address - modify selector
|
||||
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: # check if it's a valid email address
|
||||
# check if domain is blocked
|
||||
domain = email.split('@')[1]
|
||||
if self.blocked_domains and domain in self.blocked_domains:
|
||||
if self.translator:
|
||||
print(f"{Fore.YELLOW}⚠️ {self.translator.get('email.domain_blocked')}: {domain}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.YELLOW}⚠️ 域名已被屏蔽: {domain},尝试重新创建邮箱{Style.RESET_ALL}")
|
||||
# create email again
|
||||
return self.create_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):
|
||||
"""close browser"""
|
||||
if self.page:
|
||||
self.page.quit()
|
||||
|
||||
def refresh_inbox(self):
|
||||
"""refresh inbox"""
|
||||
try:
|
||||
if self.translator:
|
||||
print(f"{Fore.CYAN}🔄 {self.translator.get('email.refreshing')}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.CYAN}🔄 正在刷新邮箱...{Style.RESET_ALL}")
|
||||
|
||||
# click refresh button
|
||||
refresh_button = self.page.ele('xpath://button[@id="refresh"]')
|
||||
if refresh_button:
|
||||
refresh_button.click()
|
||||
time.sleep(2) # wait for refresh to complete
|
||||
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:
|
||||
# find verification email - use more accurate selector
|
||||
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}")
|
||||
# use JavaScript to click element
|
||||
self.page.run_js('arguments[0].click()', email_div)
|
||||
time.sleep(2) # wait for email content to load
|
||||
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:
|
||||
# find verification code element
|
||||
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}")
|
||||
|
||||
# test refresh function
|
||||
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()
|
||||
518
oauth_auth.py
518
oauth_auth.py
@@ -1,3 +1,4 @@
|
||||
# oauth_auth.py
|
||||
import os
|
||||
from colorama import Fore, Style, init
|
||||
import time
|
||||
@@ -7,9 +8,10 @@ import sys
|
||||
import json
|
||||
from DrissionPage import ChromiumPage, ChromiumOptions
|
||||
from cursor_auth import CursorAuth
|
||||
from utils import get_random_wait_time, get_default_chrome_path
|
||||
from utils import get_random_wait_time, get_default_browser_path
|
||||
from config import get_config
|
||||
import platform
|
||||
from get_user_token import get_token_from_cookie
|
||||
|
||||
# Initialize colorama
|
||||
init()
|
||||
@@ -29,7 +31,7 @@ class OAuthHandler:
|
||||
def __init__(self, translator=None, auth_type=None):
|
||||
self.translator = translator
|
||||
self.config = get_config(translator)
|
||||
self.auth_type = auth_type # make sure the auth_type is not None
|
||||
self.auth_type = auth_type
|
||||
os.environ['BROWSER_HEADLESS'] = 'False'
|
||||
self.browser = None
|
||||
self.selected_profile = None
|
||||
@@ -63,41 +65,100 @@ class OAuthHandler:
|
||||
return []
|
||||
|
||||
def _select_profile(self):
|
||||
"""Select a Chrome profile to use"""
|
||||
"""Allow user to select a browser profile to use"""
|
||||
try:
|
||||
# Get available profiles
|
||||
profiles = self._get_available_profiles(self._get_user_data_directory())
|
||||
if not profiles:
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('chrome_profile.no_profiles') if self.translator else 'No Chrome profiles found'}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
# Display available profiles
|
||||
print(f"\n{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('chrome_profile.select_profile') if self.translator else 'Select a Chrome profile to use:'}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}{self.translator.get('chrome_profile.profile_list') if self.translator else 'Available profiles:'}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}0. {self.translator.get('menu.exit') if self.translator else 'Exit'}{Style.RESET_ALL}")
|
||||
for i, (dir_name, display_name) in enumerate(profiles, 1):
|
||||
print(f"{Fore.CYAN}{i}. {display_name} ({dir_name}){Style.RESET_ALL}")
|
||||
|
||||
# Get user selection
|
||||
while True:
|
||||
try:
|
||||
choice = int(input(f"\n{Fore.CYAN}{self.translator.get('menu.input_choice', choices=f'0-{len(profiles)}') if self.translator else f'Please enter your choice (0-{len(profiles)}): '}{Style.RESET_ALL}"))
|
||||
if choice == 0: # Add quit
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('menu.exiting') if self.translator else 'Exiting profile selection...'}{Style.RESET_ALL}")
|
||||
return False
|
||||
elif 1 <= choice <= len(profiles):
|
||||
self.selected_profile = profiles[choice - 1][0]
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('chrome_profile.profile_selected', profile=self.selected_profile) if self.translator else f'Selected profile: {self.selected_profile}'}{Style.RESET_ALL}")
|
||||
return True
|
||||
# 从配置中获取浏览器类型
|
||||
config = get_config(self.translator)
|
||||
browser_type = config.get('Browser', 'default_browser', fallback='chrome')
|
||||
browser_type_display = browser_type.capitalize()
|
||||
|
||||
if self.translator:
|
||||
# 动态使用浏览器类型
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.select_profile', browser=browser_type_display)}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}{self.translator.get('oauth.profile_list', browser=browser_type_display)}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} Select {browser_type_display} profile to use:{Style.RESET_ALL}")
|
||||
print(f"Available {browser_type_display} profiles:")
|
||||
|
||||
# Get the user data directory for the browser type
|
||||
user_data_dir = self._get_user_data_directory()
|
||||
|
||||
# Load available profiles from the selected browser type
|
||||
try:
|
||||
local_state_file = os.path.join(user_data_dir, "Local State")
|
||||
if os.path.exists(local_state_file):
|
||||
with open(local_state_file, 'r', encoding='utf-8') as f:
|
||||
state_data = json.load(f)
|
||||
profiles_data = state_data.get('profile', {}).get('info_cache', {})
|
||||
|
||||
# Create a list of available profiles
|
||||
profiles = []
|
||||
for profile_id, profile_info in profiles_data.items():
|
||||
name = profile_info.get('name', profile_id)
|
||||
# Mark the default profile
|
||||
if profile_id.lower() == 'default':
|
||||
name = f"{name} (Default)"
|
||||
profiles.append((profile_id, name))
|
||||
|
||||
# Sort profiles by name
|
||||
profiles.sort(key=lambda x: x[1])
|
||||
|
||||
# Show available profiles
|
||||
if self.translator:
|
||||
print(f"{Fore.CYAN}0. {self.translator.get('menu.exit')}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('chrome_profile.invalid_selection') if self.translator else 'Invalid selection. Please try again.'}{Style.RESET_ALL}")
|
||||
except ValueError:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('chrome_profile.invalid_selection') if self.translator else 'Invalid selection. Please try again.'}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}0. Exit{Style.RESET_ALL}")
|
||||
|
||||
for i, (profile_id, name) in enumerate(profiles, 1):
|
||||
print(f"{Fore.CYAN}{i}. {name}{Style.RESET_ALL}")
|
||||
|
||||
# Get user's choice
|
||||
max_choice = len(profiles)
|
||||
choice_str = input(f"\n{Fore.CYAN}{self.translator.get('menu.input_choice', choices=f'0-{max_choice}') if self.translator else f'Please enter your choice (0-{max_choice})'}{Style.RESET_ALL}")
|
||||
|
||||
try:
|
||||
choice = int(choice_str)
|
||||
if choice == 0:
|
||||
return False
|
||||
elif 1 <= choice <= max_choice:
|
||||
selected_profile = profiles[choice-1][0]
|
||||
self.selected_profile = selected_profile
|
||||
|
||||
if self.translator:
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('oauth.profile_selected', profile=selected_profile)}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Selected profile: {selected_profile}{Style.RESET_ALL}")
|
||||
return True
|
||||
else:
|
||||
if self.translator:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.invalid_selection')}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Invalid selection. Please try again.{Style.RESET_ALL}")
|
||||
return self._select_profile()
|
||||
except ValueError:
|
||||
if self.translator:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.invalid_selection')}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} Invalid selection. Please try again.{Style.RESET_ALL}")
|
||||
return self._select_profile()
|
||||
else:
|
||||
# No Local State file, use Default profile
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('oauth.no_profiles', browser=browser_type_display) if self.translator else f'No {browser_type_display} profiles found'}{Style.RESET_ALL}")
|
||||
self.selected_profile = "Default"
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
# Error loading profiles, use Default profile
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.error_loading', error=str(e), browser=browser_type_display) if self.translator else f'Error loading {browser_type_display} profiles: {str(e)}'}{Style.RESET_ALL}")
|
||||
self.selected_profile = "Default"
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('chrome_profile.error_loading', error=str(e)) if self.translator else f'Error loading Chrome profiles: {e}'}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
# General error, use Default profile
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.profile_selection_error', error=str(e)) if self.translator else f'Error during profile selection: {str(e)}'}{Style.RESET_ALL}")
|
||||
self.selected_profile = "Default"
|
||||
return True
|
||||
|
||||
def setup_browser(self):
|
||||
"""Setup browser for OAuth flow using selected profile"""
|
||||
try:
|
||||
@@ -107,20 +168,35 @@ class OAuthHandler:
|
||||
platform_name = platform.system().lower()
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.detected_platform', platform=platform_name) if self.translator else f'Detected platform: {platform_name}'}{Style.RESET_ALL}")
|
||||
|
||||
# 从配置中获取浏览器类型
|
||||
config = get_config(self.translator)
|
||||
browser_type = config.get('Browser', 'default_browser', fallback='chrome')
|
||||
|
||||
# Get browser paths and user data directory
|
||||
user_data_dir = self._get_user_data_directory()
|
||||
chrome_path = self._get_browser_path()
|
||||
browser_path = self._get_browser_path()
|
||||
|
||||
if not chrome_path:
|
||||
raise Exception(f"{self.translator.get('oauth.no_compatible_browser_found') if self.translator else 'No compatible browser found. Please install Google Chrome or Chromium.'}\n{self.translator.get('oauth.supported_browsers', platform=platform_name)}\n" +
|
||||
"- Windows: Google Chrome, Chromium\n" +
|
||||
"- macOS: Google Chrome, Chromium\n" +
|
||||
"- Linux: Google Chrome, Chromium, chromium-browser")
|
||||
if not browser_path:
|
||||
error_msg = (
|
||||
f"{self.translator.get('oauth.no_compatible_browser_found') if self.translator else 'No compatible browser found. Please install Google Chrome or Chromium.'}" +
|
||||
"\n" +
|
||||
f"{self.translator.get('oauth.supported_browsers', platform=platform_name)}\n" +
|
||||
"- Windows: Google Chrome, Chromium\n" +
|
||||
"- macOS: Google Chrome, Chromium\n" +
|
||||
"- Linux: Google Chrome, Chromium, google-chrome-stable"
|
||||
)
|
||||
raise Exception(error_msg)
|
||||
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.found_browser_data_directory', path=user_data_dir) if self.translator else f'Found browser data directory: {user_data_dir}'}{Style.RESET_ALL}")
|
||||
|
||||
# Show warning about closing Chrome first
|
||||
print(f"\n{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('chrome_profile.warning_chrome_close') if self.translator else 'Warning: This will close all running Chrome processes'}{Style.RESET_ALL}")
|
||||
# Show warning about closing browser first - 使用动态提示
|
||||
if self.translator:
|
||||
warning_msg = self.translator.get('oauth.warning_browser_close', browser=browser_type)
|
||||
else:
|
||||
warning_msg = f'Warning: This will close all running {browser_type} processes'
|
||||
|
||||
print(f"\n{Fore.YELLOW}{EMOJI['WARNING']} {warning_msg}{Style.RESET_ALL}")
|
||||
|
||||
choice = input(f"{Fore.YELLOW} {self.translator.get('menu.continue_prompt', choices='y/N')} {Style.RESET_ALL}").lower()
|
||||
if choice != 'y':
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('menu.operation_cancelled_by_user') if self.translator else 'Operation cancelled by user'}{Style.RESET_ALL}")
|
||||
@@ -135,14 +211,14 @@ class OAuthHandler:
|
||||
return False
|
||||
|
||||
# Configure browser options
|
||||
co = self._configure_browser_options(chrome_path, user_data_dir, self.selected_profile)
|
||||
co = self._configure_browser_options(browser_path, user_data_dir, self.selected_profile)
|
||||
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.starting_browser', path=chrome_path) if self.translator else f'Starting browser at: {chrome_path}'}{Style.RESET_ALL}")
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.starting_browser', path=browser_path) if self.translator else f'Starting browser at: {browser_path}'}{Style.RESET_ALL}")
|
||||
self.browser = ChromiumPage(co)
|
||||
|
||||
# Verify browser launched successfully
|
||||
if not self.browser:
|
||||
raise Exception(f"{self.translator.get('oauth.browser_failed_to_start') if self.translator else 'Failed to initialize browser instance'}")
|
||||
raise Exception(f"{self.translator.get('oauth.browser_failed_to_start', error=str(e)) if self.translator else 'Failed to initialize browser instance'}")
|
||||
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('oauth.browser_setup_completed') if self.translator else 'Browser setup completed successfully'}{Style.RESET_ALL}")
|
||||
return True
|
||||
@@ -158,14 +234,61 @@ class OAuthHandler:
|
||||
return False
|
||||
|
||||
def _kill_browser_processes(self):
|
||||
"""Kill existing browser processes based on platform"""
|
||||
"""Kill existing browser processes based on platform and browser type"""
|
||||
try:
|
||||
# 从配置中获取浏览器类型
|
||||
config = get_config(self.translator)
|
||||
browser_type = config.get('Browser', 'default_browser', fallback='chrome')
|
||||
browser_type = browser_type.lower()
|
||||
|
||||
# 根据浏览器类型和平台定义要关闭的进程
|
||||
browser_processes = {
|
||||
'chrome': {
|
||||
'win': ['chrome.exe', 'chromium.exe'],
|
||||
'linux': ['chrome', 'chromium', 'chromium-browser', 'google-chrome-stable'],
|
||||
'mac': ['Chrome', 'Chromium']
|
||||
},
|
||||
'brave': {
|
||||
'win': ['brave.exe'],
|
||||
'linux': ['brave', 'brave-browser'],
|
||||
'mac': ['Brave Browser']
|
||||
},
|
||||
'edge': {
|
||||
'win': ['msedge.exe'],
|
||||
'linux': ['msedge'],
|
||||
'mac': ['Microsoft Edge']
|
||||
},
|
||||
'firefox': {
|
||||
'win': ['firefox.exe'],
|
||||
'linux': ['firefox'],
|
||||
'mac': ['Firefox']
|
||||
},
|
||||
'opera': {
|
||||
'win': ['opera.exe', 'launcher.exe'],
|
||||
'linux': ['opera'],
|
||||
'mac': ['Opera']
|
||||
}
|
||||
}
|
||||
|
||||
# 获取平台类型
|
||||
if os.name == 'nt':
|
||||
platform_type = 'win'
|
||||
elif sys.platform == 'darwin':
|
||||
platform_type = 'mac'
|
||||
else:
|
||||
platform_type = 'linux'
|
||||
|
||||
# 获取要关闭的进程列表
|
||||
processes = browser_processes.get(browser_type, browser_processes['chrome']).get(platform_type, [])
|
||||
|
||||
if self.translator:
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.killing_browser_processes', browser=browser_type) if self.translator else f'Killing {browser_type} processes...'}{Style.RESET_ALL}")
|
||||
|
||||
# 根据平台关闭进程
|
||||
if os.name == 'nt': # Windows
|
||||
processes = ['chrome.exe', 'chromium.exe']
|
||||
for proc in processes:
|
||||
os.system(f'taskkill /f /im {proc} >nul 2>&1')
|
||||
else: # Linux/Mac
|
||||
processes = ['chrome', 'chromium', 'chromium-browser']
|
||||
for proc in processes:
|
||||
os.system(f'pkill -f {proc} >/dev/null 2>&1')
|
||||
|
||||
@@ -174,83 +297,155 @@ class OAuthHandler:
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('oauth.warning_could_not_kill_existing_browser_processes', error=str(e)) if self.translator else f'Warning: Could not kill existing browser processes: {e}'}{Style.RESET_ALL}")
|
||||
|
||||
def _get_user_data_directory(self):
|
||||
"""Get the appropriate user data directory based on platform"""
|
||||
"""Get the default user data directory based on browser type and platform"""
|
||||
try:
|
||||
# 从配置中获取浏览器类型
|
||||
config = get_config(self.translator)
|
||||
browser_type = config.get('Browser', 'default_browser', fallback='chrome')
|
||||
browser_type = browser_type.lower()
|
||||
|
||||
# 根据操作系统和浏览器类型获取用户数据目录
|
||||
if os.name == 'nt': # Windows
|
||||
possible_paths = [
|
||||
os.path.expandvars(r'%LOCALAPPDATA%\Google\Chrome\User Data'),
|
||||
os.path.expandvars(r'%LOCALAPPDATA%\Chromium\User Data')
|
||||
]
|
||||
user_data_dirs = {
|
||||
'chrome': os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Google', 'Chrome', 'User Data'),
|
||||
'brave': os.path.join(os.environ.get('LOCALAPPDATA', ''), 'BraveSoftware', 'Brave-Browser', 'User Data'),
|
||||
'edge': os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Microsoft', 'Edge', 'User Data'),
|
||||
'firefox': os.path.join(os.environ.get('APPDATA', ''), 'Mozilla', 'Firefox', 'Profiles'),
|
||||
'opera': os.path.join(os.environ.get('APPDATA', ''), 'Opera Software', 'Opera Stable'),
|
||||
'operagx': os.path.join(os.environ.get('APPDATA', ''), 'Opera Software', 'Opera GX Stable')
|
||||
}
|
||||
elif sys.platform == 'darwin': # macOS
|
||||
possible_paths = [
|
||||
os.path.expanduser('~/Library/Application Support/Google/Chrome'),
|
||||
os.path.expanduser('~/Library/Application Support/Chromium')
|
||||
]
|
||||
user_data_dirs = {
|
||||
'chrome': os.path.expanduser('~/Library/Application Support/Google/Chrome'),
|
||||
'brave': os.path.expanduser('~/Library/Application Support/BraveSoftware/Brave-Browser'),
|
||||
'edge': os.path.expanduser('~/Library/Application Support/Microsoft Edge'),
|
||||
'firefox': os.path.expanduser('~/Library/Application Support/Firefox/Profiles'),
|
||||
'opera': os.path.expanduser('~/Library/Application Support/com.operasoftware.Opera'),
|
||||
'operagx': os.path.expanduser('~/Library/Application Support/com.operasoftware.OperaGX')
|
||||
}
|
||||
else: # Linux
|
||||
possible_paths = [
|
||||
os.path.expanduser('~/.config/google-chrome'),
|
||||
os.path.expanduser('~/.config/chromium'),
|
||||
'/usr/bin/google-chrome',
|
||||
'/usr/bin/chromium-browser'
|
||||
]
|
||||
user_data_dirs = {
|
||||
'chrome': os.path.expanduser('~/.config/google-chrome'),
|
||||
'brave': os.path.expanduser('~/.config/BraveSoftware/Brave-Browser'),
|
||||
'edge': os.path.expanduser('~/.config/microsoft-edge'),
|
||||
'firefox': os.path.expanduser('~/.mozilla/firefox'),
|
||||
'opera': os.path.expanduser('~/.config/opera'),
|
||||
'operagx': os.path.expanduser('~/.config/opera-gx')
|
||||
}
|
||||
|
||||
# Try each possible path
|
||||
for path in possible_paths:
|
||||
if os.path.exists(path):
|
||||
return path
|
||||
# 获取选定浏览器的用户数据目录,如果找不到则使用 Chrome 的
|
||||
user_data_dir = user_data_dirs.get(browser_type)
|
||||
|
||||
# Create temporary profile if no existing profile found
|
||||
temp_profile = os.path.join(os.path.expanduser('~'), '.cursor_temp_profile')
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('oauth.creating_temporary_profile', path=temp_profile) if self.translator else f'Creating temporary profile at: {temp_profile}'}{Style.RESET_ALL}")
|
||||
os.makedirs(temp_profile, exist_ok=True)
|
||||
return temp_profile
|
||||
if user_data_dir and os.path.exists(user_data_dir):
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('oauth.found_browser_user_data_dir', browser=browser_type, path=user_data_dir) if self.translator else f'Found {browser_type} user data directory: {user_data_dir}'}{Style.RESET_ALL}")
|
||||
return user_data_dir
|
||||
else:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('oauth.user_data_dir_not_found', browser=browser_type, path=user_data_dir) if self.translator else f'{browser_type} user data directory not found at {user_data_dir}, will try Chrome instead'}{Style.RESET_ALL}")
|
||||
return user_data_dirs['chrome'] # 回退到 Chrome 目录
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.error_getting_user_data_directory', error=str(e)) if self.translator else f'Error getting user data directory: {e}'}{Style.RESET_ALL}")
|
||||
raise
|
||||
# 在出错时提供一个默认目录
|
||||
if os.name == 'nt':
|
||||
return os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Google', 'Chrome', 'User Data')
|
||||
elif sys.platform == 'darwin':
|
||||
return os.path.expanduser('~/Library/Application Support/Google/Chrome')
|
||||
else:
|
||||
return os.path.expanduser('~/.config/google-chrome')
|
||||
|
||||
def _get_browser_path(self):
|
||||
"""Get the browser executable path based on platform"""
|
||||
"""Get appropriate browser path based on platform and selected browser type"""
|
||||
try:
|
||||
# Try default path first
|
||||
chrome_path = get_default_chrome_path()
|
||||
if chrome_path and os.path.exists(chrome_path):
|
||||
return chrome_path
|
||||
# 从配置中获取浏览器类型
|
||||
config = get_config(self.translator)
|
||||
browser_type = config.get('Browser', 'default_browser', fallback='chrome')
|
||||
browser_type = browser_type.lower()
|
||||
|
||||
# 首先检查配置中是否有明确指定的浏览器路径
|
||||
browser_path = config.get('Browser', f'{browser_type}_path', fallback=None)
|
||||
if browser_path and os.path.exists(browser_path):
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('oauth.using_configured_browser_path', browser=browser_type, path=browser_path) if self.translator else f'Using configured {browser_type} path: {browser_path}'}{Style.RESET_ALL}")
|
||||
return browser_path
|
||||
|
||||
# 尝试获取默认路径
|
||||
browser_path = get_default_browser_path(browser_type)
|
||||
if browser_path and os.path.exists(browser_path):
|
||||
return browser_path
|
||||
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('oauth.searching_for_alternative_browser_installations') if self.translator else 'Searching for alternative browser installations...'}{Style.RESET_ALL}")
|
||||
|
||||
# Platform-specific paths
|
||||
# 如果未找到配置中指定的浏览器,则尝试查找其他兼容浏览器
|
||||
if os.name == 'nt': # Windows
|
||||
alt_paths = [
|
||||
r'C:\Program Files\Google\Chrome\Application\chrome.exe',
|
||||
r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe',
|
||||
r'C:\Program Files\Chromium\Application\chrome.exe',
|
||||
os.path.expandvars(r'%ProgramFiles%\Google\Chrome\Application\chrome.exe'),
|
||||
os.path.expandvars(r'%ProgramFiles(x86)%\Google\Chrome\Application\chrome.exe')
|
||||
]
|
||||
possible_paths = []
|
||||
if browser_type == 'brave':
|
||||
possible_paths = [
|
||||
os.path.join(os.environ.get('PROGRAMFILES', ''), 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe'),
|
||||
os.path.join(os.environ.get('PROGRAMFILES(X86)', ''), 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe'),
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'BraveSoftware', 'Brave-Browser', 'Application', 'brave.exe')
|
||||
]
|
||||
elif browser_type == 'edge':
|
||||
possible_paths = [
|
||||
os.path.join(os.environ.get('PROGRAMFILES', ''), 'Microsoft', 'Edge', 'Application', 'msedge.exe'),
|
||||
os.path.join(os.environ.get('PROGRAMFILES(X86)', ''), 'Microsoft', 'Edge', 'Application', 'msedge.exe')
|
||||
]
|
||||
elif browser_type == 'firefox':
|
||||
possible_paths = [
|
||||
os.path.join(os.environ.get('PROGRAMFILES', ''), 'Mozilla Firefox', 'firefox.exe'),
|
||||
os.path.join(os.environ.get('PROGRAMFILES(X86)', ''), 'Mozilla Firefox', 'firefox.exe')
|
||||
]
|
||||
elif browser_type == 'opera':
|
||||
possible_paths = [
|
||||
os.path.join(os.environ.get('PROGRAMFILES', ''), 'Opera', 'opera.exe'),
|
||||
os.path.join(os.environ.get('PROGRAMFILES(X86)', ''), 'Opera', 'opera.exe'),
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Programs', 'Opera', 'launcher.exe'),
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Programs', 'Opera', 'opera.exe'),
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Programs', 'Opera GX', 'launcher.exe'),
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Programs', 'Opera GX', 'opera.exe')
|
||||
]
|
||||
else: # 默认为 Chrome
|
||||
possible_paths = [
|
||||
os.path.join(os.environ.get('PROGRAMFILES', ''), 'Google', 'Chrome', 'Application', 'chrome.exe'),
|
||||
os.path.join(os.environ.get('PROGRAMFILES(X86)', ''), 'Google', 'Chrome', 'Application', 'chrome.exe'),
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Google', 'Chrome', 'Application', 'chrome.exe')
|
||||
]
|
||||
|
||||
elif sys.platform == 'darwin': # macOS
|
||||
alt_paths = [
|
||||
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
||||
'/Applications/Chromium.app/Contents/MacOS/Chromium',
|
||||
'~/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
||||
'~/Applications/Chromium.app/Contents/MacOS/Chromium'
|
||||
]
|
||||
possible_paths = []
|
||||
if browser_type == 'brave':
|
||||
possible_paths = ['/Applications/Brave Browser.app/Contents/MacOS/Brave Browser']
|
||||
elif browser_type == 'edge':
|
||||
possible_paths = ['/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge']
|
||||
elif browser_type == 'firefox':
|
||||
possible_paths = ['/Applications/Firefox.app/Contents/MacOS/firefox']
|
||||
else: # 默认为 Chrome
|
||||
possible_paths = ['/Applications/Google Chrome.app/Contents/MacOS/Google Chrome']
|
||||
|
||||
else: # Linux
|
||||
alt_paths = [
|
||||
'/usr/bin/google-chrome',
|
||||
'/usr/bin/chromium-browser',
|
||||
'/usr/bin/chromium',
|
||||
'/snap/bin/chromium',
|
||||
'/usr/local/bin/chrome',
|
||||
'/usr/local/bin/chromium'
|
||||
]
|
||||
possible_paths = []
|
||||
if browser_type == 'brave':
|
||||
possible_paths = ['/usr/bin/brave-browser', '/usr/bin/brave']
|
||||
elif browser_type == 'edge':
|
||||
possible_paths = ['/usr/bin/microsoft-edge']
|
||||
elif browser_type == 'firefox':
|
||||
possible_paths = ['/usr/bin/firefox']
|
||||
else: # 默认为 Chrome
|
||||
possible_paths = [
|
||||
'/usr/bin/google-chrome-stable', # 优先检查 google-chrome-stable
|
||||
'/usr/bin/google-chrome',
|
||||
'/usr/bin/chromium',
|
||||
'/usr/bin/chromium-browser'
|
||||
]
|
||||
|
||||
# 检查每个可能的路径
|
||||
for path in possible_paths:
|
||||
if os.path.exists(path):
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('oauth.found_browser_at', path=path) if self.translator else f'Found browser at: {path}'}{Style.RESET_ALL}")
|
||||
return path
|
||||
|
||||
# Try each alternative path
|
||||
for path in alt_paths:
|
||||
expanded_path = os.path.expanduser(path)
|
||||
if os.path.exists(expanded_path):
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('oauth.found_browser_at', path=expanded_path) if self.translator else f'Found browser at: {expanded_path}'}{Style.RESET_ALL}")
|
||||
return expanded_path
|
||||
# 如果找不到指定浏览器,则尝试使用 Chrome
|
||||
if browser_type != 'chrome':
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('oauth.browser_not_found_trying_chrome', browser=browser_type) if self.translator else f'Could not find {browser_type}, trying Chrome instead'}{Style.RESET_ALL}")
|
||||
return self._get_chrome_path()
|
||||
|
||||
return None
|
||||
|
||||
@@ -258,17 +453,18 @@ class OAuthHandler:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.error_finding_browser_path', error=str(e)) if self.translator else f'Error finding browser path: {e}'}{Style.RESET_ALL}")
|
||||
return None
|
||||
|
||||
def _configure_browser_options(self, chrome_path, user_data_dir, active_profile):
|
||||
def _configure_browser_options(self, browser_path, user_data_dir, active_profile):
|
||||
"""Configure browser options based on platform"""
|
||||
try:
|
||||
co = ChromiumOptions()
|
||||
co.set_paths(browser_path=chrome_path, user_data_path=user_data_dir)
|
||||
co.set_paths(browser_path=browser_path, user_data_path=user_data_dir)
|
||||
co.set_argument(f'--profile-directory={active_profile}')
|
||||
|
||||
# Basic options
|
||||
co.set_argument('--no-first-run')
|
||||
co.set_argument('--no-default-browser-check')
|
||||
co.set_argument('--disable-gpu')
|
||||
co.set_argument('--remote-debugging-port=9222') # 明确指定调试端口
|
||||
|
||||
# Platform-specific options
|
||||
if sys.platform.startswith('linux'):
|
||||
@@ -287,6 +483,25 @@ class OAuthHandler:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.error_configuring_browser_options', error=str(e)) if self.translator else f'Error configuring browser options: {e}'}{Style.RESET_ALL}")
|
||||
raise
|
||||
|
||||
def _fix_chrome_permissions(self, user_data_dir):
|
||||
"""Fix permissions for Chrome user data directory"""
|
||||
try:
|
||||
if sys.platform == 'darwin': # macOS
|
||||
import subprocess
|
||||
import pwd
|
||||
|
||||
# Get current user
|
||||
current_user = pwd.getpwuid(os.getuid()).pw_name
|
||||
|
||||
# Fix permissions for Chrome directory
|
||||
chrome_dir = os.path.expanduser('~/Library/Application Support/Google/Chrome')
|
||||
if os.path.exists(chrome_dir):
|
||||
subprocess.run(['chmod', '-R', 'u+rwX', chrome_dir])
|
||||
subprocess.run(['chown', '-R', f'{current_user}:staff', chrome_dir])
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('oauth.chrome_permissions_fixed') if self.translator else 'Fixed Chrome user data directory permissions'}{Style.RESET_ALL}")
|
||||
except Exception as e:
|
||||
print(f"{Fore.YELLOW}{EMOJI['WARNING']} {self.translator.get('oauth.chrome_permissions_fix_failed', error=str(e)) if self.translator else f'Failed to fix Chrome permissions: {str(e)}'}{Style.RESET_ALL}")
|
||||
|
||||
def handle_google_auth(self):
|
||||
"""Handle Google OAuth authentication"""
|
||||
try:
|
||||
@@ -297,6 +512,9 @@ class OAuthHandler:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.browser_failed') if self.translator else 'Browser failed to initialize'}{Style.RESET_ALL}")
|
||||
return False, None
|
||||
|
||||
# Get user data directory for later use
|
||||
user_data_dir = self._get_user_data_directory()
|
||||
|
||||
# Navigate to auth URL
|
||||
try:
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.navigating_to_authentication_page') if self.translator else 'Navigating to authentication page...'}{Style.RESET_ALL}")
|
||||
@@ -330,13 +548,19 @@ class OAuthHandler:
|
||||
# Check if we're on account selection page
|
||||
if "accounts.google.com" in self.browser.url:
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.please_select_your_google_account_to_continue') if self.translator else 'Please select your Google account to continue...'}{Style.RESET_ALL}")
|
||||
alert_message = self.translator.get('oauth.please_select_your_google_account_to_continue') if self.translator else 'Please select your Google account to continue with Cursor authentication'
|
||||
try:
|
||||
self.browser.run_js(f"""
|
||||
alert('{alert_message}');
|
||||
""")
|
||||
except:
|
||||
pass # Alert is optional
|
||||
|
||||
# 获取配置中是否启用 alert 选项
|
||||
config = get_config(self.translator)
|
||||
show_alert = config.getboolean('OAuth', 'show_selection_alert', fallback=False)
|
||||
|
||||
if show_alert:
|
||||
alert_message = self.translator.get('oauth.please_select_your_google_account_to_continue') if self.translator else 'Please select your Google account to continue with Cursor authentication'
|
||||
try:
|
||||
self.browser.run_js(f"""
|
||||
alert('{alert_message}');
|
||||
""")
|
||||
except:
|
||||
pass # Alert is optional
|
||||
|
||||
# Wait for authentication to complete
|
||||
auth_info = self._wait_for_auth()
|
||||
@@ -354,6 +578,8 @@ class OAuthHandler:
|
||||
try:
|
||||
if self.browser:
|
||||
self.browser.quit()
|
||||
# Fix Chrome permissions after browser is closed
|
||||
self._fix_chrome_permissions(user_data_dir)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -378,13 +604,7 @@ class OAuthHandler:
|
||||
for cookie in cookies:
|
||||
if cookie.get("name") == "WorkosCursorSessionToken":
|
||||
value = cookie.get("value", "")
|
||||
token = None
|
||||
|
||||
if "::" in value:
|
||||
token = value.split("::")[-1]
|
||||
elif "%3A%3A" in value:
|
||||
token = value.split("%3A%3A")[-1]
|
||||
|
||||
token = get_token_from_cookie(value, self.translator)
|
||||
if token:
|
||||
# Get email from settings page
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.authentication_successful_getting_account_info') if self.translator else 'Authentication successful, getting account info...'}{Style.RESET_ALL}")
|
||||
@@ -420,7 +640,6 @@ class OAuthHandler:
|
||||
|
||||
if check_usage_limits(usage_text):
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('oauth.account_has_reached_maximum_usage', deleting='deleting') if self.translator else 'Account has reached maximum usage, deleting...'}{Style.RESET_ALL}")
|
||||
|
||||
if self._delete_current_account():
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.starting_new_authentication_process') if self.translator else 'Starting new authentication process...'}{Style.RESET_ALL}")
|
||||
if self.auth_type == "google":
|
||||
@@ -459,7 +678,7 @@ class OAuthHandler:
|
||||
|
||||
# Setup browser
|
||||
if not self.setup_browser():
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.browser_failed')}{Style.RESET_ALL}")
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.browser_failed', error=str(e)) if self.translator else 'Browser failed to initialize'}{Style.RESET_ALL}")
|
||||
return False, None
|
||||
|
||||
# Navigate to auth URL
|
||||
@@ -590,11 +809,7 @@ class OAuthHandler:
|
||||
for cookie in cookies:
|
||||
if cookie.get("name") == "WorkosCursorSessionToken":
|
||||
value = cookie.get("value", "")
|
||||
if "::" in value:
|
||||
token = value.split("::")[-1]
|
||||
elif "%3A%3A" in value:
|
||||
token = value.split("%3A%3A")[-1]
|
||||
|
||||
token = get_token_from_cookie(value, self.translator)
|
||||
if token:
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('oauth.authentication_successful') if self.translator else 'Authentication successful!'}{Style.RESET_ALL}")
|
||||
# Navigate to settings page
|
||||
@@ -632,7 +847,6 @@ class OAuthHandler:
|
||||
|
||||
if check_usage_limits(usage_text):
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('oauth.account_has_reached_maximum_usage', deleting='deleting') if self.translator else 'Account has reached maximum usage, deleting...'}{Style.RESET_ALL}")
|
||||
|
||||
if self._delete_current_account():
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.starting_new_authentication_process') if self.translator else 'Starting new authentication process...'}{Style.RESET_ALL}")
|
||||
if self.auth_type == "google":
|
||||
@@ -658,10 +872,7 @@ class OAuthHandler:
|
||||
for cookie in cookies:
|
||||
if cookie.get("name") == "WorkosCursorSessionToken":
|
||||
value = cookie.get("value", "")
|
||||
if "::" in value:
|
||||
token = value.split("::")[-1]
|
||||
elif "%3A%3A" in value:
|
||||
token = value.split("%3A%3A")[-1]
|
||||
token = get_token_from_cookie(value, self.translator)
|
||||
if token:
|
||||
# Get email and check usage here too
|
||||
try:
|
||||
@@ -691,19 +902,18 @@ class OAuthHandler:
|
||||
except:
|
||||
return False
|
||||
|
||||
if check_usage_limits(usage_text):
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('oauth.account_has_reached_maximum_usage', deleting='deleting') if self.translator else 'Account has reached maximum usage, deleting...'}{Style.RESET_ALL}")
|
||||
|
||||
if self._delete_current_account():
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.starting_new_authentication_process') if self.translator else 'Starting new authentication process...'}{Style.RESET_ALL}")
|
||||
if self.auth_type == "google":
|
||||
return self.handle_google_auth()
|
||||
else:
|
||||
return self.handle_github_auth()
|
||||
if check_usage_limits(usage_text):
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('oauth.account_has_reached_maximum_usage', deleting='deleting') if self.translator else 'Account has reached maximum usage, deleting...'}{Style.RESET_ALL}")
|
||||
if self._delete_current_account():
|
||||
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('oauth.starting_new_authentication_process') if self.translator else 'Starting new authentication process...'}{Style.RESET_ALL}")
|
||||
if self.auth_type == "google":
|
||||
return self.handle_google_auth()
|
||||
else:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.failed_to_delete_expired_account') if self.translator else 'Failed to delete expired account'}{Style.RESET_ALL}")
|
||||
return self.handle_github_auth()
|
||||
else:
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('oauth.account_is_still_valid', usage=usage_text) if self.translator else f'Account is still valid (Usage: {usage_text})'}{Style.RESET_ALL}")
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.failed_to_delete_expired_account') if self.translator else 'Failed to delete expired account'}{Style.RESET_ALL}")
|
||||
else:
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('oauth.account_is_still_valid', usage=usage_text) if self.translator else f'Account is still valid (Usage: {usage_text})'}{Style.RESET_ALL}")
|
||||
except Exception as e:
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('oauth.could_not_check_usage_count', error=str(e)) if self.translator else f'Could not check usage count: {str(e)}'}{Style.RESET_ALL}")
|
||||
|
||||
@@ -759,12 +969,10 @@ class OAuthHandler:
|
||||
if name == "WorkosCursorSessionToken":
|
||||
try:
|
||||
value = cookie.get("value", "")
|
||||
if "::" in value:
|
||||
token = value.split("::")[-1]
|
||||
elif "%3A%3A" in value:
|
||||
token = value.split("%3A%3A")[-1]
|
||||
token = get_token_from_cookie(value, self.translator)
|
||||
except Exception as e:
|
||||
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('oauth.token_extraction_error', error=str(e)) if self.translator else f'Token extraction error: {str(e)}'}{Style.RESET_ALL}")
|
||||
error_message = f'Failed to extract auth info: {str(e)}' if not self.translator else self.translator.get('oauth.failed_to_extract_auth_info', error=str(e))
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {error_message}{Style.RESET_ALL}")
|
||||
elif name == "cursor_email":
|
||||
email = cookie.get("value")
|
||||
|
||||
@@ -777,11 +985,13 @@ class OAuthHandler:
|
||||
missing.append("email")
|
||||
if not token:
|
||||
missing.append("token")
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.missing_authentication_data', data=', '.join(missing)) if self.translator else f'Missing authentication data: {", ".join(missing)}'}{Style.RESET_ALL}")
|
||||
error_message = f"Missing authentication data: {', '.join(missing)}" if not self.translator else self.translator.get('oauth.missing_authentication_data', data=', '.join(missing))
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {error_message}{Style.RESET_ALL}")
|
||||
return False, None
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.failed_to_extract_auth_info', error=str(e)) if self.translator else f'Failed to extract auth info: {str(e)}'}{Style.RESET_ALL}")
|
||||
error_message = f'Failed to extract auth info: {str(e)}' if not self.translator else self.translator.get('oauth.failed_to_extract_auth_info', error=str(e))
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {error_message}{Style.RESET_ALL}")
|
||||
return False, None
|
||||
|
||||
def _delete_current_account(self):
|
||||
@@ -823,7 +1033,8 @@ class OAuthHandler:
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('oauth.failed_to_delete_account', error=str(e)) if self.translator else f'Failed to delete account: {str(e)}'}{Style.RESET_ALL}")
|
||||
error_message = f'Failed to delete account: {str(e)}' if not self.translator else self.translator.get('oauth.failed_to_delete_account', error=str(e))
|
||||
print(f"{Fore.RED}{EMOJI['ERROR']} {error_message}{Style.RESET_ALL}")
|
||||
return False
|
||||
|
||||
def main(auth_type, translator=None):
|
||||
@@ -851,7 +1062,8 @@ def main(auth_type, translator=None):
|
||||
if auth_manager.update_auth(
|
||||
email=auth_info["email"],
|
||||
access_token=auth_info["token"],
|
||||
refresh_token=auth_info["token"]
|
||||
refresh_token=auth_info["token"],
|
||||
auth_type=auth_type
|
||||
):
|
||||
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {translator.get('oauth.auth_update_success') if translator else 'Auth update success'}{Style.RESET_ALL}")
|
||||
# Close the browser after successful authentication
|
||||
|
||||
@@ -8,3 +8,6 @@ pyinstaller
|
||||
DrissionPage>=4.0.0
|
||||
selenium
|
||||
webdriver_manager
|
||||
arabic-reshaper
|
||||
python-bidi
|
||||
faker
|
||||
@@ -12,7 +12,6 @@ import glob
|
||||
from colorama import Fore, Style, init
|
||||
from typing import Tuple
|
||||
import configparser
|
||||
from new_signup import get_user_documents_path
|
||||
import traceback
|
||||
from config import get_config
|
||||
from datetime import datetime
|
||||
@@ -31,6 +30,20 @@ EMOJI = {
|
||||
"WARNING": "⚠️",
|
||||
}
|
||||
|
||||
def get_user_documents_path():
|
||||
"""Get user Documents folder path"""
|
||||
if sys.platform == "win32":
|
||||
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()
|
||||
@@ -221,8 +234,16 @@ def get_workbench_cursor_path(translator=None) -> str:
|
||||
|
||||
if system == "Windows":
|
||||
base_path = config.get('WindowsPaths', 'cursor_path')
|
||||
else:
|
||||
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"])
|
||||
|
||||
|
||||
406
restore_machine_id.py
Normal file
406
restore_machine_id.py
Normal 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)
|
||||
@@ -11,7 +11,6 @@ import tempfile
|
||||
from colorama import Fore, Style, init
|
||||
from typing import Tuple
|
||||
import configparser
|
||||
from new_signup import get_user_documents_path
|
||||
import traceback
|
||||
from config import get_config
|
||||
import glob
|
||||
@@ -30,6 +29,20 @@ EMOJI = {
|
||||
"WARNING": "⚠️",
|
||||
}
|
||||
|
||||
def get_user_documents_path():
|
||||
"""Get user Documents folder path"""
|
||||
if sys.platform == "win32":
|
||||
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()
|
||||
@@ -178,15 +191,22 @@ def get_cursor_machine_id_path(translator=None) -> str:
|
||||
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": {
|
||||
"base": os.path.join(os.getenv("LOCALAPPDATA", ""), "Programs", "Cursor", "resources", "app"),
|
||||
"main": "out/vs/workbench/workbench.desktop.main.js"
|
||||
"main": "out\\vs\\workbench\\workbench.desktop.main.js"
|
||||
},
|
||||
"Linux": {
|
||||
"bases": ["/opt/Cursor/resources/app", "/usr/share/cursor/resources/app"],
|
||||
@@ -210,7 +230,20 @@ def get_workbench_cursor_path(translator=None) -> str:
|
||||
return main_path
|
||||
raise OSError(translator.get('reset.linux_path_not_found') if translator else "在 Linux 系统上未找到 Cursor 安装路径")
|
||||
|
||||
base_path = paths_map[system]["base"]
|
||||
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):
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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.");
|
||||
}
|
||||
})();
|
||||
@@ -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 });
|
||||
181
utils.py
181
utils.py
@@ -9,24 +9,171 @@ def get_user_documents_path():
|
||||
return os.path.expanduser("~\\Documents")
|
||||
else:
|
||||
return os.path.expanduser("~/Documents")
|
||||
|
||||
def get_default_chrome_path():
|
||||
"""Get default Chrome path"""
|
||||
if sys.platform == "win32":
|
||||
# Trying to find chrome in PATH
|
||||
try:
|
||||
import shutil
|
||||
chrome_in_path = shutil.which("chrome")
|
||||
if chrome_in_path:
|
||||
return chrome_in_path
|
||||
except:
|
||||
pass
|
||||
# Going to default path
|
||||
return r"C:\Program Files\Google\Chrome\Application\chrome.exe"
|
||||
elif sys.platform == "darwin":
|
||||
return "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
|
||||
|
||||
def get_default_driver_path(browser_type='chrome'):
|
||||
"""Get default driver path based on browser type"""
|
||||
browser_type = browser_type.lower()
|
||||
if browser_type == 'chrome':
|
||||
return get_default_chrome_driver_path()
|
||||
elif browser_type == 'edge':
|
||||
return get_default_edge_driver_path()
|
||||
elif browser_type == 'firefox':
|
||||
return get_default_firefox_driver_path()
|
||||
elif browser_type == 'brave':
|
||||
# Brave 使用 Chrome 的 driver
|
||||
return get_default_chrome_driver_path()
|
||||
else:
|
||||
return "/usr/bin/google-chrome"
|
||||
# Default to Chrome if browser type is unknown
|
||||
return get_default_chrome_driver_path()
|
||||
|
||||
def get_default_chrome_driver_path():
|
||||
"""Get default Chrome driver path"""
|
||||
if sys.platform == "win32":
|
||||
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "drivers", "chromedriver.exe")
|
||||
elif sys.platform == "darwin":
|
||||
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "drivers", "chromedriver")
|
||||
else:
|
||||
return "/usr/local/bin/chromedriver"
|
||||
|
||||
def get_default_edge_driver_path():
|
||||
"""Get default Edge driver path"""
|
||||
if sys.platform == "win32":
|
||||
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "drivers", "msedgedriver.exe")
|
||||
elif sys.platform == "darwin":
|
||||
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "drivers", "msedgedriver")
|
||||
else:
|
||||
return "/usr/local/bin/msedgedriver"
|
||||
|
||||
def get_default_firefox_driver_path():
|
||||
"""Get default Firefox driver path"""
|
||||
if sys.platform == "win32":
|
||||
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "drivers", "geckodriver.exe")
|
||||
elif sys.platform == "darwin":
|
||||
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "drivers", "geckodriver")
|
||||
else:
|
||||
return "/usr/local/bin/geckodriver"
|
||||
|
||||
def get_default_brave_driver_path():
|
||||
"""Get default Brave driver path (uses Chrome driver)"""
|
||||
# Brave 浏览器基于 Chromium,所以使用相同的 chromedriver
|
||||
return get_default_chrome_driver_path()
|
||||
|
||||
def get_default_browser_path(browser_type='chrome'):
|
||||
"""Get default browser executable path"""
|
||||
browser_type = browser_type.lower()
|
||||
|
||||
if sys.platform == "win32":
|
||||
if browser_type == 'chrome':
|
||||
# 尝试在 PATH 中找到 Chrome
|
||||
try:
|
||||
import shutil
|
||||
chrome_in_path = shutil.which("chrome")
|
||||
if chrome_in_path:
|
||||
return chrome_in_path
|
||||
except:
|
||||
pass
|
||||
# 使用默认路径
|
||||
return r"C:\Program Files\Google\Chrome\Application\chrome.exe"
|
||||
elif browser_type == 'edge':
|
||||
return r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
|
||||
elif browser_type == 'firefox':
|
||||
return r"C:\Program Files\Mozilla Firefox\firefox.exe"
|
||||
elif browser_type == 'opera':
|
||||
# 尝试多个可能的 Opera 路径
|
||||
opera_paths = [
|
||||
r"C:\Program Files\Opera\opera.exe",
|
||||
r"C:\Program Files (x86)\Opera\opera.exe",
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Programs', 'Opera', 'launcher.exe'),
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Programs', 'Opera', 'opera.exe')
|
||||
]
|
||||
for path in opera_paths:
|
||||
if os.path.exists(path):
|
||||
return path
|
||||
return opera_paths[0] # 返回第一个路径,即使它不存在
|
||||
elif browser_type == 'operagx':
|
||||
# 尝试多个可能的 Opera GX 路径
|
||||
operagx_paths = [
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Programs', 'Opera GX', 'launcher.exe'),
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Programs', 'Opera GX', 'opera.exe'),
|
||||
r"C:\Program Files\Opera GX\opera.exe",
|
||||
r"C:\Program Files (x86)\Opera GX\opera.exe"
|
||||
]
|
||||
for path in operagx_paths:
|
||||
if os.path.exists(path):
|
||||
return path
|
||||
return operagx_paths[0] # 返回第一个路径,即使它不存在
|
||||
elif browser_type == 'brave':
|
||||
# Brave 浏览器的默认安装路径
|
||||
paths = [
|
||||
os.path.join(os.environ.get('PROGRAMFILES', ''), 'BraveSoftware/Brave-Browser/Application/brave.exe'),
|
||||
os.path.join(os.environ.get('PROGRAMFILES(X86)', ''), 'BraveSoftware/Brave-Browser/Application/brave.exe'),
|
||||
os.path.join(os.environ.get('LOCALAPPDATA', ''), 'BraveSoftware/Brave-Browser/Application/brave.exe')
|
||||
]
|
||||
for path in paths:
|
||||
if os.path.exists(path):
|
||||
return path
|
||||
return paths[0] # 返回第一个路径,即使它不存在
|
||||
|
||||
elif sys.platform == "darwin":
|
||||
if browser_type == 'chrome':
|
||||
return "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
|
||||
elif browser_type == 'edge':
|
||||
return "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"
|
||||
elif browser_type == 'firefox':
|
||||
return "/Applications/Firefox.app/Contents/MacOS/firefox"
|
||||
elif browser_type == 'brave':
|
||||
return "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser"
|
||||
elif browser_type == 'opera':
|
||||
return "/Applications/Opera.app/Contents/MacOS/Opera"
|
||||
elif browser_type == 'operagx':
|
||||
return "/Applications/Opera GX.app/Contents/MacOS/Opera"
|
||||
|
||||
else: # Linux
|
||||
if browser_type == 'chrome':
|
||||
# 尝试多种可能的名称
|
||||
chrome_names = ["google-chrome", "chrome", "chromium", "chromium-browser"]
|
||||
for name in chrome_names:
|
||||
try:
|
||||
import shutil
|
||||
path = shutil.which(name)
|
||||
if path:
|
||||
return path
|
||||
except:
|
||||
pass
|
||||
return "/usr/bin/google-chrome"
|
||||
elif browser_type == 'edge':
|
||||
return "/usr/bin/microsoft-edge"
|
||||
elif browser_type == 'firefox':
|
||||
return "/usr/bin/firefox"
|
||||
elif browser_type == 'opera':
|
||||
return "/usr/bin/opera"
|
||||
elif browser_type == 'operagx':
|
||||
# 尝试常见的 Opera GX 路径
|
||||
operagx_names = ["opera-gx"]
|
||||
for name in operagx_names:
|
||||
try:
|
||||
import shutil
|
||||
path = shutil.which(name)
|
||||
if path:
|
||||
return path
|
||||
except:
|
||||
pass
|
||||
return "/usr/bin/opera-gx"
|
||||
elif browser_type == 'brave':
|
||||
# 尝试常见的 Brave 路径
|
||||
brave_names = ["brave", "brave-browser"]
|
||||
for name in brave_names:
|
||||
try:
|
||||
import shutil
|
||||
path = shutil.which(name)
|
||||
if path:
|
||||
return path
|
||||
except:
|
||||
pass
|
||||
return "/usr/bin/brave-browser"
|
||||
|
||||
# 如果找不到指定的浏览器类型,则返回 Chrome 的路径
|
||||
return get_default_browser_path('chrome')
|
||||
|
||||
def get_linux_cursor_path():
|
||||
"""Get Linux Cursor path"""
|
||||
|
||||
Reference in New Issue
Block a user