feat: account management overhaul + 7 issue resolutions (#147)

- Add smart JSON export/import with schema validation and deduplication
- Add per-account proxy configurations (Issue #79)
- Add advanced account sorting engine (Issues #126 & #99)
- Add compact horizontal layout, AI credits, inline model visibility (Issues #145 & #134)
- Add desktop push notifications for low quota (Issue #53)
- Fix Arch Linux AUR process detection bug (Issue #117)
- Default theme set to Dark Mode (it's better)
- UI Polishing: Improved sort dropdown and symmetrical dialog layouts
- Dev Mode: Resolved port conflicts and single-instance locks
- Updated README and README.zh-CN with new features
This commit is contained in:
vd authored and GitHub committed 2026-04-06 20:32:42 +08:00
1 parent 50a325be11
commit ed0dd811a8
37 files changed
+1989 -455

No files matched your search

+128
View File
@@ -118,6 +118,14 @@ i18n
restart_note:
'Changes to error reporting will take effect after restarting the application.',
},
notifications: {
title: 'Notifications',
description: 'Configure desktop alerts for account events.',
quotaAlert: 'Low Quota Alerts',
quotaAlertDesc: 'Get notified when a model quota drops below the set threshold',
quotaThreshold: 'Alert Threshold',
quotaThresholdDesc: 'Percentage below which to trigger an alert',
},
proxy: {
title: 'Upstream Proxy',
description: 'Configure a proxy for outgoing requests to Google/Gemini APIs.',
@@ -258,6 +266,7 @@ i18n
twoCol: '2 Columns',
threeCol: '3 Columns',
list: 'List',
compact: 'Compact',
},
authDialog: {
title: 'Add Google Account',
@@ -289,6 +298,13 @@ i18n
gemini3Ready: 'Gemini 3 Ready',
groupGoogleGemini: 'Google Gemini',
groupAnthropicClaude: 'Anthropic Claude',
proxy: 'Proxy',
proxyPlaceholder: 'e.g. http://127.0.0.1:7890',
proxySaved: 'Proxy saved',
noProxy: 'No proxy',
aiCredits: 'AI Credits',
creditsExpiry: 'expires {{date}}',
modelVisibility: 'Model Visibility',
},
identity: {
title: 'Identity Profile',
@@ -357,6 +373,32 @@ i18n
clear: 'Clear Selection',
confirmDelete: 'Are you sure you want to delete {{count}} accounts?',
},
sort: {
recentlyUsed: 'Recently Used',
quotaOverall: 'Overall Quota',
quotaClaude: 'Claude Quota',
quotaPro3: 'Pro3 Quota',
quotaFlash: 'Flash Quota',
},
exportImport: {
export: 'Export',
import: 'Import',
exportTitle: 'Export Accounts',
exportDesc: 'Choose whether to include authentication tokens in the export file.',
includeTokens: 'Include tokens (less secure)',
stripTokens: 'Strip tokens (safer for sharing)',
exportSuccess: 'Accounts exported successfully',
importTitle: 'Import Accounts',
importDesc: 'Select a previously exported JSON file.',
importStrategy: 'Import Strategy',
strategyMerge: 'Merge - Update existing, add new',
strategyOverwrite: 'Overwrite - Replace all existing data',
strategySkip: 'Skip - Only add new accounts',
importSuccess: 'Imported {{imported}}, updated {{updated}}, skipped {{skipped}}',
importErrors: 'Import completed with {{count}} error(s)',
selectFile: 'Select File',
importing: 'Importing...',
},
},
proxy: {
title: 'API Proxy',
@@ -504,6 +546,14 @@ i18n
error_reporting_desc: '发送匿名错误报告以帮助我们改进应用。不收集个人数据。',
restart_note: '错误上报设置会在重启应用后生效。',
},
notifications: {
title: '通知',
description: '配置账号事件的桌面提醒。',
quotaAlert: '低配额提醒',
quotaAlertDesc: '当模型配额低于设定阈值时收到提醒',
quotaThreshold: '提醒阈值',
quotaThresholdDesc: '触发提醒的百分比阈值',
},
proxy: {
title: '上游代理',
description: '为发往 Google/Gemini API 的请求配置代理。',
@@ -642,6 +692,7 @@ i18n
twoCol: '2 列',
threeCol: '3 列',
list: '列表',
compact: '紧凑',
},
authDialog: {
title: '添加 Google 账号',
@@ -672,6 +723,13 @@ i18n
gemini3Ready: 'Gemini 3 就绪',
groupGoogleGemini: 'Google Gemini',
groupAnthropicClaude: 'Anthropic Claude',
proxy: '代理',
proxyPlaceholder: '例如 http://127.0.0.1:7890',
proxySaved: '代理已保存',
noProxy: '无代理',
aiCredits: 'AI 积分',
creditsExpiry: '{{date}} 过期',
modelVisibility: '模型可见性',
},
identity: {
title: '身份配置',
@@ -740,6 +798,32 @@ i18n
clear: '取消选择',
confirmDelete: '确定要删除选中的 {{count}} 个账号吗?',
},
sort: {
recentlyUsed: '最近使用',
quotaOverall: '总体配额',
quotaClaude: 'Claude 配额',
quotaPro3: 'Pro3 配额',
quotaFlash: 'Flash 配额',
},
exportImport: {
export: '导出',
import: '导入',
exportTitle: '导出账号',
exportDesc: '选择是否在导出文件中包含认证令牌。',
includeTokens: '包含令牌(安全性较低)',
stripTokens: '移除令牌(适合分享)',
exportSuccess: '账号导出成功',
importTitle: '导入账号',
importDesc: '选择之前导出的 JSON 文件。',
importStrategy: '导入策略',
strategyMerge: '合并 - 更新已有,添加新账号',
strategyOverwrite: '覆盖 - 替换所有已有数据',
strategySkip: '跳过 - 仅添加新账号',
importSuccess: '导入 {{imported}},更新 {{updated}},跳过 {{skipped}}',
importErrors: '导入完成,但有 {{count}} 个错误',
selectFile: '选择文件',
importing: '导入中...',
},
},
proxy: {
title: 'API 反代',
@@ -889,6 +973,15 @@ i18n
restart_note:
'Изменения в отчетах об ошибках вступят в силу после перезапуска приложения.',
},
notifications: {
title: 'Уведомления',
description: 'Настройте уведомления о событиях аккаунтов.',
quotaAlert: 'Уведомления о низкой квоте',
quotaAlertDesc:
'Получайте уведомления, когда квота модели падает ниже установленного порога',
quotaThreshold: 'Порог уведомления',
quotaThresholdDesc: 'Процент, ниже которого срабатывает уведомление',
},
proxy: {
title: 'Верхнеуровневый прокси',
description: 'Настроить прокси для исходящих запросов к Google/Gemini API.',
@@ -1028,6 +1121,7 @@ i18n
twoCol: '2 колонки',
threeCol: '3 колонки',
list: 'Список',
compact: 'Компактный',
},
authDialog: {
title: 'Добавить Google Аккаунт',
@@ -1059,6 +1153,13 @@ i18n
gemini3Ready: 'Gemini 3 готов',
groupGoogleGemini: 'Google Gemini',
groupAnthropicClaude: 'Anthropic Claude',
proxy: 'Прокси',
proxyPlaceholder: 'напр. http://127.0.0.1:7890',
proxySaved: 'Прокси сохранён',
noProxy: 'Без прокси',
aiCredits: 'AI Кредиты',
creditsExpiry: 'истекает {{date}}',
modelVisibility: 'Видимость моделей',
},
identity: {
title: 'Профиль идентичности',
@@ -1127,6 +1228,33 @@ i18n
clear: 'Снять выделение',
confirmDelete: 'Вы уверены, что хотите удалить {{count}} аккаунтов?',
},
sort: {
recentlyUsed: 'Недавние',
quotaOverall: 'Общая квота',
quotaClaude: 'Квота Claude',
quotaPro3: 'Квота Pro3',
quotaFlash: 'Квота Flash',
},
exportImport: {
export: 'Экспорт',
import: 'Импорт',
exportTitle: 'Экспорт аккаунтов',
exportDesc: 'Выберите, включать ли токены аутентификации в файл экспорта.',
includeTokens: 'Включить токены (менее безопасно)',
stripTokens: 'Удалить токены (безопаснее для обмена)',
exportSuccess: 'Аккаунты успешно экспортированы',
importTitle: 'Импорт аккаунтов',
importDesc: 'Выберите ранее экспортированный JSON файл.',
importStrategy: 'Стратегия импорта',
strategyMerge: 'Объединить - Обновить существующие, добавить новые',
strategyOverwrite: 'Перезаписать - Заменить все существующие данные',
strategySkip: 'Пропустить - Добавить только новые аккаунты',
importSuccess:
'Импортировано {{imported}}, обновлено {{updated}}, пропущено {{skipped}}',
importErrors: 'Импорт завершён с {{count}} ошибкой(ами)',
selectFile: 'Выбрать файл',
importing: 'Импорт...',
},
},
proxy: {
title: 'API Прокси',