Compare commits

...

15 Commits

Author SHA1 Message Date
Pin Studios
5d3439a7d8 Update logo.py 2025-03-20 17:24:52 +08:00
Pin Studios
684323e328 Update CHANGELOG.md 2025-03-20 17:24:06 +08:00
Pin Studios
8115a0b397 Merge pull request #327 from httpmerak/main
feat: Add Brazilian Portuguese language
2025-03-20 16:35:53 +08:00
Pin Studios
cca8ba1ae7 Update .env 2025-03-20 16:33:41 +08:00
Pin Studios
a392c8cc27 Update CHANGELOG.md 2025-03-20 16:33:14 +08:00
Ricardo Negreiros
63209d6ed6 feat: Add Brazilian Portuguese language 2025-03-20 05:25:29 -03:00
Pin Studios
cbdd4fae4a Merge pull request #321 from Nigel1992/fix-github-reset
fix: Add GitHub account reset functionality and maintain Google OAuth…
2025-03-20 16:21:38 +08:00
Nigel1992
414b5a7837 fix: Add GitHub account reset functionality and maintain Google OAuth reset 2025-03-19 22:36:00 +01:00
Pin Studios
cba470344f Update block_domain.txt 2025-03-20 03:31:08 +08:00
Pin Studios
12a3a522be Merge pull request #298 from MFaiqKhan/patch-1
Update block_domain.txt
2025-03-19 10:31:26 +08:00
Muhammad Faiq Khan
6346059916 Update block_domain.txt 2025-03-18 11:13:23 -07:00
Pin Studios
ab8489cdb9 Update block_domain.txt 2025-03-19 00:46:02 +08:00
Pin Studios
bcb3565b9e Update block_domain.txt 2025-03-19 00:44:53 +08:00
Pin Studios
c30e7dc3df Update block_domain.txt 2025-03-19 00:43:10 +08:00
yeongpin
aad19d89e4 Update README.md to replace image with a new version and add the new image file for better visual representation. 2025-03-19 00:21:05 +08:00
15 changed files with 486 additions and 17 deletions

4
.env
View File

@@ -1,2 +1,2 @@
version=1.7.12
VERSION=1.7.12
version=1.7.13
VERSION=1.7.13

View File

@@ -1,5 +1,28 @@
# Change Log
## v1.7.13
1. Added _delete_current_account method to handle account deletion via API 新增 _delete_current_account 方法,透過 API 處理帳號刪除
2. Updated account reset logic to use the appropriate auth method based on auth_type 更新帳號重置邏輯,根據 auth_type 選擇適當的驗證方式
3. Maintained existing Google OAuth reset functionality 維持現有的 Google OAuth 重置功能
4. Added proper error handling for account deletion failures 新增帳號刪除失敗時的錯誤處理
5. Ensures GitHub authentication maintains its flow when resetting accounts 確保 GitHub 認證在帳號重置時保持正常流程
6. The _delete_current_account method makes a POST request to https://www.cursor.com/api/dashboard/delete-account
_delete_current_account 方法會發送 POST 請求至 https://www.cursor.com/api/dashboard/delete-account
7. After successful deletion, redirects back to the authentication page 刪除成功後,會導回驗證頁面
8. Uses Promise-based JavaScript for reliable API communication 使用 Promise-based JavaScript確保 API 通訊穩定
9. Includes proper error handling and logging 包含適當的錯誤處理與日誌記錄
10. Add Brazilian Portuguese language 新增巴西葡萄牙語
## v1.7.12
1. Add: Changelog Show in Menu | 增加更新日志在菜單中
2. Remake Create Mail Logic | 重做創建郵箱邏輯

View File

@@ -21,7 +21,7 @@ Cursor's configuration.
這是一個自動化工具,自動註冊,支持 Windows 和 macOS 系統,完成 Auth 驗證,重置 Cursor 的配置。
<p align="center">
<img src="./images/new_2025-02-27_10-42-44.png" alt="new" width="400" style="border-radius: 6px;"/><br>
<img src="./images/new_2025-03-19_00-19-09.png" alt="new" width="400" 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/)

View File

@@ -6,4 +6,13 @@ teihu.com
raleigh-construction.com
pastryofistanbul.com
linshiyouxiang.net
Mohmal.com
Mohmal.com
pusmail.com
questtechsystems.com
ikomail.com
ofanda.com
pusmail.com
ikomail.com
mailpull.com
drewzen.com
begemail.com

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View File

@@ -25,7 +25,8 @@
"vi": "Tiếng Việt",
"nl": "Nederlands",
"de": "Deutsch",
"fr": "Français"
"fr": "Français",
"pt": "Brazilian Portuguese"
},
"quit_cursor": {
"start": "Beginne Cursor zu Beenden",

View File

@@ -25,7 +25,8 @@
"vi": "Tiếng Việt",
"nl": "Nederlands",
"de": "Deutsch",
"fr": "Français"
"fr": "Français",
"pt": "Brazilian Portuguese"
},
"quit_cursor": {
"start": "Début de la Fermeture de Cursor",

View File

@@ -25,7 +25,8 @@
"vi": "Tiếng Việt",
"nl": "Nederlands",
"de": "Deutsch",
"fr": "Français"
"fr": "Français",
"pt": "Brazilian Portuguese"
},
"quit_cursor": {
"start": "Start met afsluiten van Cursor",

382
locales/pt.json Normal file
View File

@@ -0,0 +1,382 @@
{
"menu": {
"title": "Opções Disponíveis",
"exit": "Sair do Programa",
"reset": "Redefinir ID da Máquina",
"register": "Registrar Nova Conta no Cursor",
"register_google": "Registrar com Conta do Google",
"register_github": "Registrar com Conta do GitHub",
"register_manual": "Registrar Cursor com E-mail Personalizado",
"quit": "Fechar Cursor",
"select_language": "Alterar Idioma",
"input_choice": "Por favor, insira sua escolha ({choices})",
"invalid_choice": "Seleção inválida. Insira um número de {choices}",
"program_terminated": "Programa encerrado pelo usuário",
"error_occurred": "Ocorreu um erro: {error}. Por favor, tente novamente",
"press_enter": "Pressione Enter para Sair",
"disable_auto_update": "Desativar Atualização Automática do Cursor",
"lifetime_access_enabled": "ACESSO VITALÍCIO HABILITADO",
"totally_reset": "Redefinir Cursor Completamente"
},
"languages": {
"en": "Inglês",
"zh_cn": "Chinês Simplificado",
"zh_tw": "Chinês Tradicional",
"vi": "Vietnamita",
"nl": "Holandês",
"de": "Alemão",
"fr": "Francês",
"pt": "Português do Brasil"
},
"quit_cursor": {
"start": "Iniciando fechamento do Cursor",
"no_process": "Nenhum processo do Cursor em execução",
"terminating": "Encerrando processo {pid}",
"waiting": "Aguardando o processo ser finalizado",
"success": "Todos os processos do Cursor foram encerrados",
"timeout": "Tempo limite do processo: {pids}",
"error": "Ocorreu um erro: {error}"
},
"reset": {
"title": "Ferramenta de Redefinição de ID da Máquina",
"checking": "Verificando arquivo de configuração",
"not_found": "Arquivo de configuração não encontrado",
"no_permission": "Não é possível ler ou escrever no arquivo de configuração. Verifique as permissões do arquivo",
"reading": "Lendo configuração atual",
"creating_backup": "Criando backup da configuração",
"backup_exists": "Arquivo de backup já existe, pulando etapa de backup",
"generating": "Gerando novo ID da máquina",
"saving_json": "Salvando nova configuração no JSON",
"success": "ID da Máquina redefinido com sucesso",
"new_id": "Novo ID da Máquina",
"permission_error": "Erro de permissão: {error}",
"run_as_admin": "Tente executar este programa como Administrador",
"process_error": "Erro no processo de redefinição: {error}",
"updating_sqlite": "Atualizando banco de dados SQLite",
"updating_pair": "Atualizando chave-valor",
"sqlite_success": "Banco de dados SQLite atualizado com sucesso",
"sqlite_error": "Falha na atualização do banco de dados SQLite: {error}",
"press_enter": "Pressione Enter para sair",
"unsupported_os": "Sistema operacional não suportado: {os}",
"linux_path_not_found": "Caminho do Linux não encontrado",
"updating_system_ids": "Atualizando IDs do sistema",
"system_ids_updated": "IDs do sistema atualizados com sucesso",
"system_ids_update_failed": "Falha na atualização dos IDs do sistema: {error}",
"windows_guid_updated": "GUID do Windows atualizado com sucesso",
"windows_permission_denied": "Permissão negada no Windows",
"windows_guid_update_failed": "Falha na atualização do GUID do Windows",
"macos_uuid_updated": "UUID do macOS atualizado com sucesso",
"plutil_command_failed": "Falha no comando plutil",
"start_patching": "Iniciando correção de getMachineId",
"macos_uuid_update_failed": "Falha na atualização do UUID do macOS",
"current_version": "Versão atual do Cursor: {version}",
"patch_completed": "Correção de getMachineId concluída",
"patch_failed": "Falha na correção de getMachineId: {error}",
"version_check_passed": "Verificação de versão do Cursor aprovada",
"file_modified": "Arquivo modificado",
"version_less_than_0_45": "Versão do Cursor < 0.45.0, pulando correção de getMachineId",
"detecting_version": "Detectando versão do Cursor",
"patching_getmachineid": "Corrigindo getMachineId",
"version_greater_than_0_45": "Versão do Cursor >= 0.45.0, corrigindo getMachineId",
"permission_denied": "Permissão negada: {error}",
"backup_created": "Backup criado",
"update_success": "Atualização concluída com sucesso",
"update_failed": "Falha na atualização: {error}",
"windows_machine_guid_updated": "GUID da máquina do Windows atualizado com sucesso",
"reading_package_json": "Lendo package.json {path}",
"invalid_json_object": "Objeto JSON inválido",
"no_version_field": "Campo de versão não encontrado no package.json",
"version_field_empty": "Campo de versão está vazio",
"invalid_version_format": "Formato de versão inválido: {version}",
"found_version": "Versão encontrada: {version}",
"version_parse_error": "Erro ao analisar versão: {error}",
"package_not_found": "Package.json não encontrado: {path}",
"check_version_failed": "Falha ao verificar versão: {error}",
"stack_trace": "Rastreamento de pilha",
"version_too_low": "Versão do Cursor muito baixa: {version} < 0.45.0"
},
"register": {
"title": "Ferramenta de Registro do Cursor",
"start": "Iniciando o processo de registro...",
"handling_turnstile": "Processando verificação de segurança...",
"retry_verification": "Tentando novamente a verificação...",
"detect_turnstile": "Verificando validação de segurança...",
"verification_success": "Verificação de segurança bem-sucedida",
"starting_browser": "Abrindo navegador...",
"form_success": "Formulário enviado com sucesso",
"browser_started": "Navegador aberto com sucesso",
"waiting_for_second_verification": "Aguardando verificação por e-mail...",
"waiting_for_verification_code": "Aguardando código de verificação...",
"password_success": "Senha definida com sucesso",
"password_error": "Não foi possível definir a senha: {error}. Por favor, tente novamente",
"waiting_for_page_load": "Carregando página...",
"first_verification_passed": "Verificação inicial bem-sucedida",
"mailbox": "Caixa de entrada de e-mail acessada com sucesso",
"register_start": "Iniciar Registro",
"form_submitted": "Formulário Enviado, Iniciando Verificação...",
"filling_form": "Preenchendo Formulário",
"visiting_url": "Visitando URL",
"basic_info": "Informações básicas enviadas",
"handle_turnstile": "Processar Turnstile",
"no_turnstile": "Turnstile Não Detectado",
"turnstile_passed": "Turnstile Passado",
"verification_start": "Iniciando Obtenção do Código de Verificação",
"verification_timeout": "Tempo Esgotado para Obter Código de Verificação",
"verification_not_found": "Nenhum Código de Verificação Encontrado",
"try_get_code": "Tentativa | {attempt} Obter Código de Verificação | Tempo Restante: {time}s",
"get_account": "Obtendo Informações da Conta",
"get_token": "Obtendo Token da Sessão do Cursor",
"token_success": "Token Obtido com Sucesso",
"token_attempt": "Tentativa | {attempt} de obter o Token | Tentando novamente em {time}s",
"token_max_attempts": "Número máximo de tentativas atingido ({max}) | Falha ao obter o Token",
"token_failed": "Falha ao Obter Token: {error}",
"account_error": "Falha ao Obter Informações da Conta: {error}",
"press_enter": "Pressione Enter para sair",
"browser_start": "Iniciando Navegador",
"open_mailbox": "Abrindo Página da Caixa de Entrada",
"email_error": "Falha ao obter endereço de e-mail",
"setup_error": "Erro de configuração do e-mail: {error}",
"start_getting_verification_code": "Iniciando obtenção do código de verificação, tentará em 60s",
"get_verification_code_timeout": "Tempo Esgotado para Obter Código de Verificação",
"get_verification_code_success": "Código de Verificação Obtido com Sucesso",
"try_get_verification_code": "Tentativa | {attempt} Obter Código de Verificação | Tempo Restante: {remaining_time}s",
"verification_code_filled": "Código de Verificação Preenchido",
"login_success_and_jump_to_settings_page": "Login bem-sucedido, indo para a página de configurações",
"detect_login_page": "Página de login detectada, iniciando login...",
"cursor_registration_completed": "Registro do Cursor Concluído!",
"set_password": "Definir Senha",
"basic_info_submitted": "Informações Básicas Enviadas",
"cursor_auth_info_updated": "Informações de Autenticação do Cursor Atualizadas",
"cursor_auth_info_update_failed": "Falha ao Atualizar Informações de Autenticação do Cursor",
"reset_machine_id": "Reiniciar ID da Máquina",
"account_info_saved": "Informações da Conta Salvas",
"save_account_info_failed": "Falha ao Salvar Informações da Conta",
"get_email_address": "Obtendo Endereço de E-mail",
"update_cursor_auth_info": "Atualizar Informações de Autenticação do Cursor",
"register_process_error": "Erro no Processo de Registro: {error}",
"setting_password": "Configurando Senha",
"manual_code_input": "Inserção Manual do Código",
"manual_email_input": "Inserção Manual de E-mail",
"password": "Senha",
"first_name": "Nome",
"last_name": "Sobrenome",
"exit_signal": "Sinal para Sair",
"email_address": "Endereço de E-mail",
"config_created": "Configuração Criada",
"verification_failed": "Falha na Verificação",
"verification_error": "Erro de Verificação: {error}",
"config_option_added": "Opção de Configuração Adicionada: {option}",
"config_updated": "Configuração Atualizada",
"password_submitted": "Senha Enviada",
"total_usage": "Uso Total: {usage}",
"setting_on_password": "Configurando Senha",
"getting_code": "Obtendo Código de Verificação, Tentará em 60s"
},
"auth": {
"title": "Gerenciador de Autenticação do Cursor",
"checking_auth": "Verificando arquivo de autenticação",
"auth_not_found": "Arquivo de autenticação não encontrado",
"auth_file_error": "Erro no arquivo de autenticação: {error}",
"reading_auth": "Lendo arquivo de autenticação",
"updating_auth": "Atualizando informações de autenticação",
"auth_updated": "Informações de autenticação atualizadas com sucesso",
"auth_update_failed": "Falha ao atualizar informações de autenticação: {error}",
"auth_file_created": "Arquivo de autenticação criado",
"auth_file_create_failed": "Falha ao criar arquivo de autenticação: {error}",
"press_enter": "Pressione Enter para sair",
"reset_machine_id": "Redefinir ID da máquina",
"database_connection_closed": "Conexão com o banco de dados fechada",
"database_updated_successfully": "Banco de dados atualizado com sucesso",
"connected_to_database": "Conectado ao banco de dados",
"updating_pair": "Atualizando par chave-valor",
"db_not_found": "Arquivo do banco de dados não encontrado em: {path}",
"db_permission_error": "Não é possível acessar o arquivo do banco de dados. Verifique as permissões",
"db_connection_error": "Falha ao conectar ao banco de dados: {error}"
},
"control": {
"generate_email": "Gerando novo e-mail",
"blocked_domain": "Domínio bloqueado",
"select_domain": "Selecionando domínio aleatório",
"copy_email": "Copiando endereço de e-mail",
"enter_mailbox": "Entrando na caixa de entrada",
"refresh_mailbox": "Atualizando caixa de entrada",
"check_verification": "Verificando código de verificação",
"verification_found": "Código de verificação encontrado",
"verification_not_found": "Nenhum código de verificação encontrado",
"browser_error": "Erro no controle do navegador: {error}",
"navigation_error": "Erro de navegação: {error}",
"email_copy_error": "Erro ao copiar e-mail: {error}",
"mailbox_error": "Erro na caixa de entrada: {error}",
"token_saved_to_file": "Token salvo em cursor_tokens.txt",
"navigate_to": "Navegando para {url}",
"generate_email_success": "E-mail gerado com sucesso",
"select_email_domain": "Selecionar domínio de e-mail",
"select_email_domain_success": "Domínio de e-mail selecionado com sucesso",
"get_email_name": "Obtendo nome do e-mail",
"get_email_name_success": "Nome do e-mail obtido com sucesso",
"get_email_address": "Obtendo endereço de e-mail",
"get_email_address_success": "Endereço de e-mail obtido com sucesso",
"enter_mailbox_success": "Entrada na caixa de entrada bem-sucedida",
"found_verification_code": "Código de verificação encontrado",
"get_cursor_session_token": "Obtendo token da sessão do Cursor",
"get_cursor_session_token_success": "Token da sessão do Cursor obtido com sucesso",
"get_cursor_session_token_failed": "Falha ao obter token da sessão do Cursor",
"save_token_failed": "Falha ao salvar o token",
"database_updated_successfully": "Banco de dados atualizado com sucesso",
"database_connection_closed": "Conexão com o banco de dados fechada",
"no_valid_verification_code": "Nenhum código de verificação válido"
},
"email": {
"starting_browser": "Iniciando navegador",
"visiting_site": "Visitando domínios de e-mail",
"create_success": "E-mail criado com sucesso",
"create_failed": "Falha ao criar e-mail",
"create_error": "Erro ao criar e-mail: {error}",
"refreshing": "Atualizando e-mail",
"refresh_success": "E-mail atualizado com sucesso",
"refresh_error": "Erro ao atualizar e-mail: {error}",
"refresh_button_not_found": "Botão de atualização não encontrado",
"verification_found": "Verificação encontrada",
"verification_not_found": "Verificação não encontrada",
"verification_error": "Erro na verificação: {error}",
"verification_code_found": "Código de verificação encontrado",
"verification_code_not_found": "Código de verificação não encontrado",
"verification_code_error": "Erro no código de verificação: {error}",
"address": "Endereço de e-mail",
"all_domains_blocked": "Todos os domínios bloqueados, alternando serviço",
"no_available_domains_after_filtering": "Nenhum domínio disponível após filtragem",
"switching_service": "Alternando para o serviço {service}",
"domains_list_error": "Falha ao obter lista de domínios: {error}",
"failed_to_get_available_domains": "Falha ao obter domínios disponíveis",
"domains_excluded": "Domínios excluídos: {domains}",
"failed_to_create_account": "Falha ao criar conta",
"account_creation_error": "Erro na criação da conta: {error}",
"blocked_domains": "Domínios bloqueados: {domains}",
"blocked_domains_loaded": "Domínios bloqueados carregados: {count}",
"blocked_domains_loaded_error": "Erro ao carregar domínios bloqueados: {error}",
"blocked_domains_loaded_success": "Domínios bloqueados carregados com sucesso",
"blocked_domains_loaded_timeout": "Tempo esgotado ao carregar domínios bloqueados: {timeout}s",
"blocked_domains_loaded_timeout_error": "Erro de tempo esgotado ao carregar domínios bloqueados: {error}",
"available_domains_loaded": "Domínios disponíveis carregados: {count}",
"domains_filtered": "Domínios filtrados: {count}",
"trying_to_create_email": "Tentando criar e-mail: {email}",
"domain_blocked": "Domínio bloqueado: {domain}"
},
"update": {
"title": "Desativar atualização automática do Cursor",
"disable_success": "Atualização automática desativada com sucesso",
"disable_failed": "Falha ao desativar atualização automática: {error}",
"press_enter": "Pressione Enter para sair",
"start_disable": "Iniciando desativação da atualização automática",
"killing_processes": "Finalizando processos",
"processes_killed": "Processos finalizados",
"removing_directory": "Removendo diretório",
"directory_removed": "Diretório removido",
"creating_block_file": "Criando arquivo de bloqueio",
"block_file_created": "Arquivo de bloqueio criado"
},
"updater": {
"checking": "Verificando atualizações...",
"new_version_available": "Nova versão disponível! (Atual: {current}, Última: {latest})",
"updating": "Atualizando para a última versão. O programa será reiniciado automaticamente.",
"up_to_date": "Você está usando a versão mais recente.",
"check_failed": "Falha ao verificar atualizações: {error}",
"continue_anyway": "Continuando com a versão atual...",
"update_confirm": "Deseja atualizar para a última versão? (Y/n)",
"update_skipped": "Atualização ignorada.",
"invalid_choice": "Escolha inválida. Por favor, digite 'Y' ou 'n'.",
"development_version": "Versão de desenvolvimento {current} > {latest}",
"changelog_title": "Registro de mudanças"
},
"totally_reset": {
"title": "Redefinir Cursor Completamente",
"checking_config": "Verificando Arquivo de Configuração",
"config_not_found": "Arquivo de Configuração Não Encontrado",
"no_permission": "Não é possível Ler ou Escrever o Arquivo de Configuração, Verifique as Permissões do Arquivo",
"reading_config": "Lendo Configuração Atual",
"creating_backup": "Criando Backup da Configuração",
"backup_exists": "Arquivo de Backup Já Existe, Pulando Etapa de Backup",
"generating_new_machine_id": "Gerando Novo ID da Máquina",
"saving_new_config": "Salvando Nova Configuração no JSON",
"success": "Cursor Redefinido com Sucesso",
"error": "Falha ao Redefinir Cursor: {error}",
"press_enter": "Pressione Enter para Sair",
"reset_machine_id": "Redefinir ID da Máquina",
"database_connection_closed": "Conexão com o Banco de Dados Fechada",
"database_updated_successfully": "Banco de Dados Atualizado com Sucesso",
"connected_to_database": "Conectado ao Banco de Dados",
"updating_pair": "Atualizando Par Chave-Valor",
"db_not_found": "Arquivo de banco de dados não encontrado em: {path}",
"db_permission_error": "Não é possível acessar o arquivo do banco de dados. Verifique as permissões",
"db_connection_error": "Falha ao conectar ao banco de dados: {error}",
"feature_title": "RECURSOS",
"feature_1": "Remoção completa das configurações e preferências do Cursor AI",
"feature_2": "Limpa todos os dados em cache, incluindo histórico e prompts de IA",
"feature_3": "Redefine o ID da máquina para contornar a detecção de período de teste",
"feature_4": "Cria novos identificadores de máquina aleatórios",
"feature_5": "Remove extensões e preferências personalizadas",
"feature_6": "Redefine informações de período de teste e dados de ativação",
"feature_7": "Varredura profunda por arquivos ocultos relacionados à licença e período de teste",
"feature_8": "Preserva com segurança arquivos e aplicativos não relacionados ao Cursor",
"feature_9": "Compatível com Windows, macOS e Linux",
"disclaimer_title": "AVISO",
"disclaimer_1": "Esta ferramenta excluirá permanentemente todas as configurações,",
"disclaimer_2": "preferências e dados em cache do Cursor AI. Essa ação não pode ser desfeita.",
"disclaimer_3": "Seus arquivos de código NÃO serão afetados, e a ferramenta é projetada",
"disclaimer_4": "para atingir somente os arquivos do editor Cursor AI e mecanismos de detecção de teste.",
"disclaimer_5": "Outros aplicativos em seu sistema não serão afetados.",
"disclaimer_6": "Será necessário configurar o Cursor AI novamente após executar esta ferramenta.",
"disclaimer_7": "Use por sua conta e risco",
"confirm_title": "Tem certeza que deseja prosseguir?",
"confirm_1": "Esta ação excluirá todas as configurações do Cursor AI,",
"confirm_2": "preferências e dados em cache. Essa ação não pode ser desfeita.",
"confirm_3": "Seus arquivos de código NÃO serão afetados, e a ferramenta é projetada",
"confirm_4": "para atingir somente os arquivos do editor Cursor AI e mecanismos de detecção de teste.",
"confirm_5": "Outros aplicativos em seu sistema não serão afetados.",
"confirm_6": "Será necessário configurar o Cursor AI novamente após executar esta ferramenta.",
"confirm_7": "Use por sua conta e risco",
"invalid_choice": "Por favor, digite 'Y' ou 'n'",
"skipped_for_safety": "Ignorado por segurança (não relacionado ao Cursor): {path}",
"deleted": "Excluído: {path}",
"error_deleting": "Erro ao excluir {path}: {error}",
"not_found": "Arquivo não encontrado: {path}",
"resetting_machine_id": "Redefinindo identificadores da máquina para contornar a detecção de período de teste...",
"created_machine_id": "Novo ID da máquina criado: {path}",
"error_creating_machine_id": "Erro ao criar arquivo de ID da máquina {path}: {error}",
"error_searching": "Erro ao procurar arquivos em {path}: {error}",
"created_extended_trial_info": "Novas informações de período de teste criadas: {path}",
"error_creating_trial_info": "Erro ao criar arquivo de informações de teste {path}: {error}",
"resetting_cursor_ai_editor": "Redefinindo Editor Cursor AI... Por favor, aguarde.",
"reset_cancelled": "Redefinição cancelada. Saindo sem realizar alterações.",
"windows_machine_id_modification_skipped": "Modificação de ID da máquina no Windows ignorada: {error}",
"linux_machine_id_modification_skipped": "Modificação do machine-id do Linux ignorada: {error}",
"note_complete_machine_id_reset_may_require_running_as_administrator": "Nota: Redefinir totalmente o ID da máquina pode exigir a execução como administrador",
"note_complete_system_machine_id_reset_may_require_sudo_privileges": "Nota: Redefinir totalmente o machine-id do sistema pode exigir privilégios sudo",
"windows_registry_instructions": "📝 NOTA: Para uma redefinição completa no Windows, talvez você precise também limpar entradas do registro.",
"windows_registry_instructions_2": " Execute 'regedit', pesquise chaves contendo 'Cursor' ou 'CursorAI' em HKEY_CURRENT_USER\\Software\\ e exclua-as.\n",
"reset_log_1": "Cursor AI foi completamente redefinido e a detecção de teste foi contornada!",
"reset_log_2": "Por favor, reinicie o sistema para que as alterações tenham efeito.",
"reset_log_3": "Você precisará reinstalar o Cursor AI e deverá ter um novo período de teste disponível.",
"reset_log_4": "Para melhores resultados, considere também:",
"reset_log_5": "Utilizar um endereço de e-mail diferente ao registrar um novo período de teste",
"reset_log_6": "Se disponível, utilizar uma VPN para alterar seu endereço IP",
"reset_log_7": "Limpar cookies e cache do navegador antes de acessar o site do Cursor AI",
"reset_log_8": "Se os problemas persistirem, tente instalar o Cursor AI em outro local",
"reset_log_9": "Se encontrar problemas, abra uma issue no Github em https://github.com/yeongpin/cursor-free-vip/issues",
"unexpected_error": "Ocorreu um erro inesperado: {error}",
"report_issue": "Por favor, relate este problema no Github em https://github.com/yeongpin/cursor-free-vip/issues",
"keyboard_interrupt": "Processo interrompido pelo usuário. Saindo...",
"return_to_main_menu": "Retornando ao menu principal...",
"process_interrupted": "Processo interrompido. Saindo...",
"press_enter_to_return_to_main_menu": "Pressione Enter para retornar ao menu principal...",
"removing_known": "Removendo arquivos conhecidos de teste/licença",
"performing_deep_scan": "Realizando varredura profunda por arquivos adicionais de teste/licença",
"found_additional_potential_license_trial_files": "{count} arquivos adicionais de licença/teste potencialmente encontrados",
"checking_for_electron_localstorage_files": "Verificando arquivos localStorage do Electron",
"no_additional_license_trial_files_found_in_deep_scan": "Nenhum arquivo adicional de licença/teste encontrado na varredura profunda",
"removing_electron_localstorage_files": "Removendo arquivos localStorage do Electron",
"electron_localstorage_files_removed": "Arquivos localStorage do Electron removidos",
"electron_localstorage_files_removal_error": "Erro ao remover arquivos localStorage do Electron: {error}",
"removing_electron_localstorage_files_completed": "Remoção dos arquivos localStorage do Electron concluída"
}
}

View File

@@ -23,7 +23,8 @@
"vi": "Tiếng Việt",
"nl": "Dutch",
"de": "Germa",
"fr": "French"
"fr": "French",
"pt": "Brazilian Portuguese"
},
"quit_cursor": {
"start": "Bắt Đầu Thoát Cursor",

View File

@@ -25,7 +25,8 @@
"vi": "Vietnamese",
"nl": "Dutch",
"de": "German",
"fr": "French"
"fr": "French",
"pt": "Brazilian Portuguese"
},
"quit_cursor": {
"start": "开始退出 Cursor",

View File

@@ -23,7 +23,8 @@
"vi": "Vietnamese",
"nl": "Dutch",
"de": "German",
"fr": "French"
"fr": "French",
"pt": "Brazilian Portuguese"
},
"quit_cursor": {
"start": "開始退出 Cursor",

View File

@@ -30,7 +30,7 @@ CURSOR_LOGO = f"""
Github: https://github.com/yeongpin/cursor-free-vip
{Fore.RED}
Press 5 to change language | 按下 5 键切换语言
Press 7 to change language | 按下 7 键切换语言 | Pressione 7 para alterar o idioma
{Style.RESET_ALL}
"""

View File

@@ -139,6 +139,8 @@ class Translator:
return 'de'
elif system_locale.startswith('fr'):
return 'fr'
elif system_locale.startswith('pt'):
return 'pt'
@@ -156,6 +158,8 @@ class Translator:
return 'de'
elif 'fr' in env_lang:
return 'fr'
elif 'pt' in env_lang:
return 'pt'
return 'en'
except:

View File

@@ -378,9 +378,12 @@ class OAuthHandler:
# Delete current account
if self._delete_current_account():
# Start new authentication
# Start new authentication based on auth type
print(f"{Fore.CYAN}{EMOJI['INFO']} Starting new authentication process...{Style.RESET_ALL}")
return self.handle_google_auth()
if auth_type == "google":
return self.handle_google_auth()
else: # github
return self.handle_github_auth()
else:
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to delete expired account{Style.RESET_ALL}")
@@ -573,7 +576,7 @@ class OAuthHandler:
print(f"{Fore.CYAN}{EMOJI['INFO']} Usage count: {usage_text}{Style.RESET_ALL}")
# Check if account is expired
if usage_text.strip() == "150 / 150": # Changed back to actual condition
if usage_text.strip() == "150 / 150":
print(f"{Fore.YELLOW}{EMOJI['INFO']} Account has reached maximum usage, deleting...{Style.RESET_ALL}")
delete_js = """
@@ -610,8 +613,8 @@ class OAuthHandler:
print(f"{Fore.CYAN}{EMOJI['INFO']} Redirecting to authenticator.cursor.sh...{Style.RESET_ALL}")
# Explicitly navigate to the authentication page
#self.browser.get("https://authenticator.cursor.sh/sign-up")
# time.sleep(get_random_wait_time(self.config, 'page_load_wait'))
self.browser.get("https://authenticator.cursor.sh/sign-up")
time.sleep(get_random_wait_time(self.config, 'page_load_wait'))
# Call handle_google_auth again to repeat the entire process
print(f"{Fore.CYAN}{EMOJI['INFO']} Starting new Google authentication...{Style.RESET_ALL}")
@@ -659,7 +662,7 @@ class OAuthHandler:
print(f"{Fore.CYAN}{EMOJI['INFO']} Usage count: {usage_text}{Style.RESET_ALL}")
# Check if account is expired
if usage_text.strip() == "150 / 150": # Changed back to actual condition
if usage_text.strip() == "150 / 150":
print(f"{Fore.YELLOW}{EMOJI['INFO']} Account has reached maximum usage, deleting...{Style.RESET_ALL}")
delete_js = """
@@ -787,6 +790,48 @@ class OAuthHandler:
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to extract auth info: {str(e)}{Style.RESET_ALL}")
return False, None
def _delete_current_account(self):
"""Delete the current account using the API"""
try:
delete_js = """
function deleteAccount() {
return new Promise((resolve, reject) => {
fetch('https://www.cursor.com/api/dashboard/delete-account', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
credentials: 'include'
})
.then(response => {
if (response.status === 200) {
resolve('Account deleted successfully');
} else {
reject('Failed to delete account: ' + response.status);
}
})
.catch(error => {
reject('Error: ' + error);
});
});
}
return deleteAccount();
"""
result = self.browser.run_js(delete_js)
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} Delete account result: {result}{Style.RESET_ALL}")
# Navigate back to auth page
print(f"{Fore.CYAN}{EMOJI['INFO']} Redirecting to authenticator.cursor.sh...{Style.RESET_ALL}")
self.browser.get("https://authenticator.cursor.sh/sign-up")
time.sleep(get_random_wait_time(self.config, 'page_load_wait'))
return True
except Exception as e:
print(f"{Fore.RED}{EMOJI['ERROR']} Failed to delete account: {str(e)}{Style.RESET_ALL}")
return False
def main(auth_type, translator=None):
"""Main function to handle OAuth authentication