export type Lang = "zh" | "en"; export const translations = { zh: { appName: "星光工坊", navCreate: "創作", navHistory: "歷史記錄", navSettings: "API 設定", navApiKeys: "API 金鑰", navSignIn: "登入", navSignOut: "登出", navAdmin: "後台", canvasTitle: "創作畫布", canvasSubtitle: "輸入您的靈感,讓AI為您呈現。", promptLabel: "輸入描述", promptPlaceholder: "描述您想看到的畫面...", modelLabel: "選擇模型", modelPlaceholder: "選擇模型", styleLabel: "圖片風格", stylePlaceholder: "選擇風格", ratioLabel: "比例", ratioPlaceholder: "選擇比例", refImageLabel: "參考圖片(圖生圖)", refImageBadge: "可選", refImageDrop: "拖曳或點擊上傳參考圖", refImageFormats: "JPG / PNG / WebP", refImageRemove: "移除", btnGenerate: "生成圖片", btnImg2Img: "圖生圖", btnGenerating: "生成中...", emptyTitle: "等待您的靈感", emptySubtitle: "選擇模型後輸入描述,點擊生成", loadingTitle: "正在施展魔法...", loadingSubtitle: "模型生成中,約需 30-60 秒", errorFormatTitle: "格式錯誤", errorFormatDesc: "請上傳圖片檔案", errorGenTitle: "生成失敗", errorGenDesc: "請稍後再試或確認 Token 是否有效", debugTitle: "API 輸出分析", debugFallback: "備用模式", debugReal: "真實 API", debugEndpoint: "端點", debugMethod: "方法", debugStatus: "狀態", debugDuration: "耗時", debugReason: "原因", debugSectionInfo: "API 資訊", debugSectionRequest: "請求內容", debugSectionResponse: "響應內容", debugNoResponse: "未收到響應", debugMs: "毫秒", debugHeaders: "Headers", debugBody: "Body", settingsTitle: "API 設定", settingsStatus: "Token 已設定", settingsNoToken: "尚未設定 Token,API 呼叫將失敗", settingsAccessLabel: "Access Token(必填)", settingsAccessPlaceholder: "貼上 access_token...", settingsRefreshLabel: "Refresh Token(選填,用於自動續期)", settingsRefreshPlaceholder: "貼上 refresh_token...", settingsSave: "儲存 Token", settingsSaving: "儲存中...", settingsHowTitle: "如何取得 Token?", settingsStep1Pre: "前往", settingsStep1Post: "並登入帳號", settingsStep2: "按下 F12 開啟開發者工具", settingsStep3: "選擇「應用程式」→「本機儲存空間」→ geminigen.ai", settingsStep4Pre: "複製", settingsStep4Mid: "的值(必填)", settingsStep5Pre: "同樣複製", settingsStep5Mid: "的值(選填,可自動續期)", settingsHint: "⚡ 建議同時填入 refresh_token,系統可以在 access_token 過期時自動續期,無需手動更新。", settingsSavedTitle: "Token 已儲存", settingsSavedDesc: "API Token 設定成功,系統將自動刷新", settingsSaveError: "儲存失敗", settingsSaveErrorDesc: "請稍後再試", settingsRemovedTitle: "Token 已移除", resolutionLabel: "輸出解析度", resolutionPlaceholder: "選擇解析度", resolutionDesc1K: "1K — 標準品質 (1024px)", resolutionDesc2K: "2K — 高品質 (2048px)", resolutionDesc4K: "4K — 超高清 (4096px)", resolutionHint: "此選項僅支援 Nano Banana 系列模型", apiKeysTitle: "API 金鑰管理", apiKeysSubtitle: "使用 OpenAI 相容格式,透過 API 金鑰存取星光工坊生圖服務", apiKeysCreate: "建立新金鑰", apiKeysCreateName: "金鑰名稱", apiKeysCreateNamePlaceholder: "例:我的應用程式", apiKeysCreateBtn: "建立", apiKeysCreating: "建立中...", apiKeysCopyHint: "請立即複製金鑰,離開後將無法再次查看", apiKeysCopied: "已複製", apiKeysCopy: "複製", apiKeysRevoke: "撤銷", apiKeysRevoking: "撤銷中...", apiKeysEmpty: "尚無 API 金鑰", apiKeysEmptyHint: "點擊「建立新金鑰」開始使用", apiKeysLastUsed: "最後使用", apiKeysNeverUsed: "尚未使用", apiKeysCreatedAt: "建立時間", apiKeysDocsTitle: "API 文件", apiKeysBaseUrl: "Base URL", apiKeysEndpointsTitle: "可用端點", apiKeysModelsDesc: "取得可用模型列表", apiKeysGenerateDesc: "生成圖片(OpenAI 相容格式)", apiKeysExampleTitle: "使用範例", apiKeysSignInRequired: "請先登入以管理 API 金鑰", apiKeysSignIn: "前往登入", authSignIn: "登入", authSignUp: "註冊", authEmail: "電子郵件", authEmailPlaceholder: "your@email.com", authPassword: "密碼", authPasswordPlaceholder: "輸入密碼", authPasswordMinHint: "至少 6 個字元", authDisplayName: "暱稱(選填)", authDisplayNamePlaceholder: "您的名字", authLoading: "處理中...", authError: "發生錯誤,請再試一次", authNoAccount: "還沒有帳號?", authHasAccount: "已有帳號?", adminTitle: "後台管理", adminSubtitle: "管理使用者、系統設定與 API 配置", adminForbiddenTitle: "無存取權限", adminForbiddenDesc: "您沒有管理員權限,無法存取此頁面。", adminBackHome: "回首頁", adminTabUsers: "使用者管理", adminTabConfig: "系統設定", adminStatUsers: "總使用者", adminStatImages: "已生成圖片", adminStatApiKeys: "API 金鑰", adminYou: "你", adminGrantAdmin: "設為管理員", adminRevokeAdmin: "撤銷管理員", adminDeleteUser: "刪除帳號", adminResetPass: "重設密碼", adminNewPassPlaceholder: "輸入新密碼(至少6字元)", adminResetPassBtn: "確認重設", adminUserUpdated: "使用者已更新", adminUserDeleted: "使用者已刪除", adminPassReset: "密碼已重設", adminPassTooShort: "密碼至少需要 6 個字元", adminDeleteConfirm: "確定要刪除此使用者?此操作無法復原。", adminError: "操作失敗,請再試一次", adminNoUsers: "目前沒有使用者", adminConfigEmpty: "目前沒有系統設定", adminConfigUpdated: "最後更新", adminConfigNewValue: "輸入新值", adminConfigSaveBtn: "儲存", adminConfigSaved: "設定已儲存", adminGuideTitle: "如何取得 Refresh Token?", adminGuideSubtitle: "從 geminigen.ai 擷取 Token,貼入下方欄位即可啟用服務。", adminGuideShow: "查看教學", adminGuideHide: "收起教學", adminGuideSteps: [ "開啟 geminigen.ai,先登入您的帳號。", "按下 F12 開啟瀏覽器開發者工具(或右鍵 → 檢查)。", "點選上方 Application(應用程式)分頁。", "在左側展開 Local Storage,點選 https://geminigen.ai。", "在右側找到 authStore 這一行,雙擊展開 JSON 值。", "找到 refresh_token 欄位,只複製引號裡面那段長字串(例如:eyJ... 開頭),不要複製整個 JSON。", ], adminGuideNote: "※ Token 有效期間約數天到數週,過期後需重新取得。Access Token 由系統每 4 分鐘自動更新,不需手動設定。", poolTitle: "🔄 Token 帳戶池", poolDesc: "多帳戶輪替生圖,系統自動挑選最近最少使用(LRU)的帳戶,避免單一帳號被限速。", poolEmpty: "尚未加入任何帳戶", poolEmptyDesc: "點下方「新增帳戶」開始設定", poolNeverUsed: "從未使用", poolLRUNote: "輪替策略:最近最少使用(LRU)", poolAddTitle: "新增帳戶", poolBtnConsole: "Console 同步", poolBtnConsoleDesc: "Google 帳號適用", poolBtnBookmark: "書籤同步", poolBtnBookmarkDesc: "一鍵拖曳書籤", poolBtnManual: "手動輸入", poolBtnManualDesc: "直接貼 Token", poolModeConsole: "Console 方式", poolModeBookmark: "書籤方式", poolAccountLabel: "帳戶名稱(加入 Token 池用)", poolAccountPlaceholder: "例:Google 帳號 A", poolGenerating: "產生代碼中...", poolGenerate: "產生同步代碼", poolExpiryPrefix: "代碼有效:約", poolExpirySuffix: "分鐘", poolRegenerate: "重新產生", poolStepsLabel: "操作步驟:", poolConsoleStep1: "開啟 geminigen.ai 並用 Google 帳號登入", poolConsoleStep2: "按 F12 開啟開發者工具 → 點「Console」分頁", poolConsoleStep3: "複製下方代碼,貼到 Console 後按 Enter", poolConsoleStep4: "看到「✅ Token 已成功同步到星光工坊!」即完成", poolCopyCode: "複製代碼", poolCopied: "已複製", poolCopyBtn: "複製代碼到剪貼簿", poolCopiedBtn: "已複製!", poolBookmarkStep1: "把下方按鈕拖曳到瀏覽器書籤列", poolBookmarkStep2: "開啟 geminigen.ai 並用 Google 帳號登入", poolBookmarkStep3: "點書籤列的「同步到星光工坊」", poolBookmarkBtnText: "同步到星光工坊", poolBookmarkDragHint: "⬆ 長按並拖曳到書籤列", poolManualTitle: "手動輸入 Bearer Token", poolManualNamePlaceholder: "帳戶名稱(例:Google 帳號 A)", poolManualBearerPlaceholder: "Bearer Token(eyJ...)*必填", poolManualRefreshPlaceholder: "Refresh Token(選填)", poolManualAddBtn: "加入 Token 池", poolCancel: "取消", poolUnnamed: "未命名", poolHasRefresh: "有 Refresh", poolDisable: "停用", poolEnable: "啟用", poolDelete: "刪除", poolAddSuccess: "✅ 帳戶已加入 Token 池", poolDeleteSuccess: "帳戶已移除", poolGenFailed: "產生失敗", poolCopySuccess: "✅ 已複製!前往 geminigen.ai 貼到 Console 執行", poolCopyFailed: "複製失敗,請手動選取代碼", poolDragToast: "請拖曳此按鈕到書籤列,不要直接點擊", renewalTitle: "✅ 自動更新已啟用", renewalSetupTitle: "⚡ 設定自動更新(推薦)", renewalActiveDesc: "系統將使用儲存的 geminigen.ai 帳號自動重新登入,Token 永不失效。", renewalInactiveDesc: "輸入 geminigen.ai 的帳號密碼,Token 過期時系統自動重新登入,無需手動操作。", renewalRemove: "移除", renewalEmailPlaceholder: "geminigen.ai 帳號(Email)", renewalPassPlaceholder: "geminigen.ai 密碼", renewalSecureNote: "密碼以 AES-256 加密儲存在你的資料庫,不會洩漏。", renewalSaveBtn: "儲存帳號並啟用自動更新", renewalSaving: "儲存中...", renewalSuccess: "✅ 憑證已儲存!系統將在有可用的驗證碼求解器時自動登入。", renewalFailed: "儲存失敗", renewalClearedCreds: "已移除自動登入憑證", renewalRequireFields: "請輸入帳號和密碼", renewalManualTitle: "手動更新 Refresh Token(備用方案)", renewalManualDesc: "若不想儲存帳號密碼,可手動從 geminigen.ai 複製 refresh_token 貼入:", renewalManualPlaceholder: "eyJ... 開頭的 refresh_token", renewalManualBtn: "更新", renewalManualSuccess: "✅ Refresh Token 已更新。", renewalManualInvalid: "請貼入完整的 refresh_token 值(eyJ... 開頭的長字串)", renewalManualFailed: "儲存失敗", setupTitle: "初始設定", setupSubtitle: "首次使用需要設定 Refresh Token,才能啟動 AI 生圖功能。", setupPasteLabel: "貼上 Refresh Token", setupPastePlaceholder: "eyJ... 開頭的長字串(只貼 Token 值,不含引號或 JSON)", setupPasteHint: "⚠️ 請確認只貼入 token 值本身(eyJ 開頭的長字串),不要貼整個 JSON 或含引號。Token 儲存後系統自動刷新,設定一次可長期使用。", setupConfirm: "確認儲存", setupSaving: "儲存中...", setupSuccess: "Token 已儲存!系統將於數分鐘內自動啟用 AI 生圖功能。", setupError: "儲存失敗,請確認貼入的是正確的 Token 值。", styles: { none: "無風格", realistic: "寫實", anime: "動漫", artistic: "藝術", cartoon: "卡通", sketch: "素描", oil_painting: "油畫", watercolor: "水彩", digital_art: "數位藝術", }, privateLabel: "私人記錄", publicLabel: "公開記錄", privateDesc: "僅您本人可見", publicDesc: "所有人可見", ratios: { "1:1": "正方形", "16:9": "橫版", "9:16": "直版", "4:3": "標準", "3:4": "直橫", "3:2": "相機", "2:3": "海報", }, models: { grok: { label: "Grok", desc: "xAI 出品,創意強", badge: "快速" }, meta: { label: "Meta AI", desc: "Meta Llama 生圖模型", badge: "免費" }, "imagen-pro": { label: "Imagen 3 Pro", desc: "Google 高品質模型", badge: "Pro" }, "imagen-4": { label: "Imagen 4", desc: "Google 最新一代模型", badge: "新" }, "imagen-flash": { label: "Imagen Flash", desc: "Google 閃電快速版", badge: "快速" }, "nano-banana-pro": { label: "Nano Banana Pro", desc: "全新 Banana 模型,免費開放", badge: "免費" }, "nano-banana-2": { label: "Nano Banana 2", desc: "Banana 第二代升級版本", badge: "免費" }, }, historyImages: "圖片", historyVideos: "影片", historyTabAll: "全部", historyTabPublic: "公開", historyTabPrivate: "私人", historyEmptyImages: "尚未生成任何圖片", historyEmptyImagesDesc: "這裡空空如也。前往創作區輸入您的靈感,開始您的藝術之旅吧。", historyEmptyVideos: "尚未生成任何影片", historyEmptyVideosDesc: "前往影片生成頁面,讓 AI 為您創作精彩影片。", historyNoItemsInFilter: "此分類尚無項目", historyDeleteImgTitle: "確認刪除圖片?", historyDeleteImgDesc: "此操作無法復原,確定要刪除這張圖片嗎?", historyDeleteVidTitle: "確認刪除影片?", historyDeleteVidDesc: "此操作無法復原,確定要刪除這部影片嗎?", historyDeletedImg: "圖片已刪除", historyDeletedVid: "影片已刪除", historyDeleteFailed: "刪除失敗,請稍後再試", historyConfirmDelete: "確認刪除", historyDownload: "下載", historyLoadingVideos: "載入影片記錄中...", navVideo: "影片生成", videoTitle: "影片生成", videoSubtitle: "描述您想要的畫面,讓 AI 生成 6 秒短片", videoModel: "模型", videoModelValue: "Grok-3 Video", videoDuration: "時長", videoDurationValue: "6 秒", videoPromptLabel: "輸入描述", videoPromptPlaceholder: "描述您想要的影片內容,例如:一隻貓咪在草地上玩耍...", videoBtnGenerate: "生成影片", videoBtnGenerating: "生成中...", videoEmptyTitle: "等待您的靈感", videoEmptySubtitle: "輸入描述後點擊生成", videoLoadingTitle: "正在生成影片...", videoLoadingSubtitle: "Grok-3 影片生成約需 1-3 分鐘", videoErrorTitle: "生成失敗", videoErrorDesc: "請確認 Token 有效或稍後再試", videoHistoryTitle: "影片歷史記錄", videoHistoryEmpty: "目前沒有影片記錄", videoDelete: "刪除", videoDownload: "下載", videoDeleteSuccess: "影片已刪除", videoDeleteFailed: "刪除失敗", videoGenSuccess: "影片生成成功!", videoGenFailed: "影片生成失敗", videoPrivateLabel: "私人", videoPublicLabel: "公開", videoRefImageLabel: "參考圖片(圖生影片)", videoRefImageBadge: "可選", videoRefImageDrop: "拖曳或點擊上傳參考圖", videoRefImageFormats: "JPG / PNG / WebP", videoRefImageRemove: "移除", videoModeText: "文字生影片", videoModeImage: "圖生影片", videoPhaseSubmitting: "正在提交任務...", videoPhaseGettingCaptcha: "正在取得驗證碼...", videoPhaseConnecting: "連接生成服務...", videoPhaseGenerating: "AI 正在生成影片", videoPhaseProcessing: "處理中...", videoDone: "影片生成完成!", videoGeneratingHint: "影片生成通常需要 1–5 分鐘,請耐心等候。視窗關閉不影響生成。", videoConnectionFailed: "連線中斷,請確認 Token 是否有效後重試", videoPhaseSubmitLabel: "提交", videoPhaseTurnstileLabel: "驗證碼", videoPhaseConnectLabel: "連接", videoPhaseGenerateLabel: "生成", videoModelGrokSub: "xAI · 最快", videoModelGrokDesc: "最長 6s · 最高 720p", videoModelVeoSub: "Google · 高品質", videoModelVeoDesc: "固定 8s · 16:9 / 9:16", videoVeoTimingNote: "Veo 3.1 Fast 生成需要約 2–4 分鐘,比 Grok-3 稍長", videoVeoNotSupported: "Veo 不支援", videoGrokNotSupported: "Grok-3 不支援", videoGrokMaxTime: "Grok-3 最長 6 秒", videoVeoFixedTime: "Veo 固定 8 秒", videoGrokMaxRes: "Grok-3 最高 720p", videoAdvanced: "進階設定", videoNegativePromptLabel: "負面提示詞", videoEnhancePromptLabel: "AI 增強提示詞", videoClose: "關閉", videoComplete: "影片生成完成", videoElapsed: "耗時", tokenExpiredTitle: "Refresh Token 已過期,無法生成圖片", tokenExpiredDesc: "請重新登入 geminigen.ai 取得新的 refresh_token,然後到", tokenExpiredLink: "管理員設定", tokenExpiredSuffix: "→ 系統設定 分頁更新 Token。", tokenExpiredFallback: "Token 已過期", tokenErrorTitle: "圖片生成失敗", adminTokenTitle: "更新 geminigen.ai Access Token", adminTokenDesc: "Token 過期時(影片生成出現 \"Token has been expired\"),貼上從 geminigen.ai 取得的新 Bearer Token", adminTokenHowTo: "取得方式:登入 geminigen.ai → F12 → Network → 任意請求 → Headers → 複製", adminTokenUpdate: "更新", adminTokenSuccess: "✅ Access Token 已更新!影片生成應恢復正常。", adminPlaywrightTitle: "自建 Playwright 求解器(免費 · 優先使用)", adminPlaywrightDesc: "部署自建 Turnstile 求解服務到 Vercel 後填入 URL,免費自動求解,優先於 CapSolver 使用。", adminPlaywrightStepsLabel: "部署步驟:", adminPlaywrightStep1: "將專案 artifacts/turnstile-solver/ 目錄上傳到 GitHub", adminPlaywrightStep2: "在 Vercel 建立新項目,匯入該 repo", adminPlaywrightStep3: "部署完成後複製 URL(如 https://xxx.vercel.app)", adminPlaywrightStep4: "在下方填入 https://xxx.vercel.app/api/solve", adminPlaywrightSecretPlaceholder: "SOLVER_SECRET(選填,若 Vercel 環境變數有設定)", adminTestConn: "測試連線", adminSave: "儲存", adminPlaywrightSuccess: "✅ Playwright 求解器 URL 已設定!", adminYesCaptchaTitle: "YesCaptcha API Key(有免費額度)", adminYesCaptchaDesc: "新帳號有免費額度,支援 Cloudflare Turnstile。費用約 $1 / 1000 次,比 CapSolver 便宜。", adminYesCaptchaHowTo: "取得方式:前往 yescaptcha.com 註冊 → 控制台 → API 密鑰", adminYesCaptchaSet: "設定", adminYesCaptchaSuccess: "✅ YesCaptcha API Key 已設定!", adminCapSolverTitle: "CapSolver API Key(付費備援)", adminCapSolverDesc: "當 YesCaptcha 失敗時自動切換到 CapSolver。費用約 $2 / 1000 次。", adminCapSolverHowTo: "取得方式:前往 capsolver.com 註冊 → Dashboard → API Key", adminCapSolverSet: "設定", adminCapSolverSuccess: "✅ CapSolver API Key 已設定!影片 Turnstile 驗證將自動解決。", adminSaveFailed: "更新失敗", adminTestSuccess: "測試成功!Token 開頭", adminTestFailed: "測試失敗", adminConnectFailed: "連接失敗", }, en: { appName: "StarForge", navCreate: "Create", navHistory: "History", navSettings: "Settings", navApiKeys: "API Keys", navSignIn: "Sign In", navSignOut: "Sign Out", navAdmin: "Admin", canvasTitle: "Creative Canvas", canvasSubtitle: "Describe your vision and let AI bring it to life.", promptLabel: "Description", promptPlaceholder: "Describe the image you want to see...", modelLabel: "Select Model", modelPlaceholder: "Choose a model", styleLabel: "Image Style", stylePlaceholder: "Choose style", ratioLabel: "Aspect Ratio", ratioPlaceholder: "Choose ratio", refImageLabel: "Reference Image (img2img)", refImageBadge: "Optional", refImageDrop: "Drag or click to upload reference image", refImageFormats: "JPG / PNG / WebP", refImageRemove: "Remove", btnGenerate: "Generate Image", btnImg2Img: "Image to Image", btnGenerating: "Generating...", emptyTitle: "Awaiting Your Vision", emptySubtitle: "Select a model, enter a description, then click generate", loadingTitle: "Casting magic...", loadingSubtitle: "Generating with model, approx. 30–60 seconds", errorFormatTitle: "Invalid Format", errorFormatDesc: "Please upload an image file", errorGenTitle: "Generation Failed", errorGenDesc: "Please try again or check if your token is valid", debugTitle: "API Debug Info", debugFallback: "Fallback Mode", debugReal: "Real API", debugEndpoint: "Endpoint", debugMethod: "Method", debugStatus: "Status", debugDuration: "Duration", debugReason: "Reason", debugSectionInfo: "API Info", debugSectionRequest: "Request", debugSectionResponse: "Response", debugNoResponse: "No response received", debugMs: "ms", debugHeaders: "Headers", debugBody: "Body", settingsTitle: "API Settings", settingsStatus: "Token Configured", settingsNoToken: "No token set — API calls will fail", settingsAccessLabel: "Access Token (required)", settingsAccessPlaceholder: "Paste access_token...", settingsRefreshLabel: "Refresh Token (optional, enables auto-renewal)", settingsRefreshPlaceholder: "Paste refresh_token...", settingsSave: "Save Token", settingsSaving: "Saving...", settingsHowTitle: "How to get your token?", settingsStep1Pre: "Go to", settingsStep1Post: "and log in", settingsStep2: "Press F12 to open DevTools", settingsStep3: "Go to Application → Local Storage → geminigen.ai", settingsStep4Pre: "Copy the value of", settingsStep4Mid: "(required)", settingsStep5Pre: "Also copy the value of", settingsStep5Mid: "(optional, enables auto-renewal)", settingsHint: "⚡ Including the refresh_token lets the system auto-renew your access_token when it expires — no manual updates needed.", settingsSavedTitle: "Token Saved", settingsSavedDesc: "API token configured. The system will auto-refresh it.", settingsSaveError: "Save Failed", settingsSaveErrorDesc: "Please try again", settingsRemovedTitle: "Token Removed", resolutionLabel: "Output Resolution", resolutionPlaceholder: "Select resolution", resolutionDesc1K: "1K — Standard quality (1024px)", resolutionDesc2K: "2K — High quality (2048px)", resolutionDesc4K: "4K — Ultra HD (4096px)", resolutionHint: "This option is only available for Nano Banana series models", apiKeysTitle: "API Key Management", apiKeysSubtitle: "Access StarForge image generation via API keys in OpenAI-compatible format", apiKeysCreate: "Create New Key", apiKeysCreateName: "Key Name", apiKeysCreateNamePlaceholder: "e.g. My Application", apiKeysCreateBtn: "Create", apiKeysCreating: "Creating...", apiKeysCopyHint: "Copy your key now — it won't be shown again", apiKeysCopied: "Copied", apiKeysCopy: "Copy", apiKeysRevoke: "Revoke", apiKeysRevoking: "Revoking...", apiKeysEmpty: "No API keys yet", apiKeysEmptyHint: "Click \"Create New Key\" to get started", apiKeysLastUsed: "Last used", apiKeysNeverUsed: "Never used", apiKeysCreatedAt: "Created", apiKeysDocsTitle: "API Documentation", apiKeysBaseUrl: "Base URL", apiKeysEndpointsTitle: "Available Endpoints", apiKeysModelsDesc: "List available models", apiKeysGenerateDesc: "Generate images (OpenAI-compatible)", apiKeysExampleTitle: "Example Usage", apiKeysSignInRequired: "Please sign in to manage API keys", apiKeysSignIn: "Sign In", authSignIn: "Sign In", authSignUp: "Sign Up", authEmail: "Email", authEmailPlaceholder: "your@email.com", authPassword: "Password", authPasswordPlaceholder: "Enter password", authPasswordMinHint: "At least 6 characters", authDisplayName: "Display Name (optional)", authDisplayNamePlaceholder: "Your name", authLoading: "Processing...", authError: "Something went wrong, please try again", authNoAccount: "Don't have an account?", authHasAccount: "Already have an account?", adminTitle: "Admin Panel", adminSubtitle: "Manage users, system settings and API configuration", adminForbiddenTitle: "Access Denied", adminForbiddenDesc: "You don't have admin privileges to access this page.", adminBackHome: "Back to Home", adminTabUsers: "User Management", adminTabConfig: "System Config", adminStatUsers: "Total Users", adminStatImages: "Images Generated", adminStatApiKeys: "API Keys", adminYou: "You", adminGrantAdmin: "Grant Admin", adminRevokeAdmin: "Revoke Admin", adminDeleteUser: "Delete Account", adminResetPass: "Reset Password", adminNewPassPlaceholder: "New password (min 6 chars)", adminResetPassBtn: "Reset", adminUserUpdated: "User updated", adminUserDeleted: "User deleted", adminPassReset: "Password reset", adminPassTooShort: "Password must be at least 6 characters", adminDeleteConfirm: "Are you sure you want to delete this user? This cannot be undone.", adminError: "Operation failed, please try again", adminNoUsers: "No users yet", adminConfigEmpty: "No system config found", adminConfigUpdated: "Last updated", adminConfigNewValue: "Enter new value", adminConfigSaveBtn: "Save", adminConfigSaved: "Config saved", adminGuideTitle: "How to get your Refresh Token", adminGuideSubtitle: "Extract the token from geminigen.ai and paste it below to activate the service.", adminGuideShow: "View Guide", adminGuideHide: "Hide Guide", adminGuideSteps: [ "Open geminigen.ai and log in to your account.", "Press F12 to open Chrome DevTools (or right-click → Inspect).", "Click the Application tab at the top.", "In the left panel, expand Local Storage and click https://geminigen.ai.", "On the right, find the authStore row and double-click to expand the JSON value.", "Find refresh_token and copy only the string inside the quotes (it starts with eyJ...). Do NOT copy the entire JSON object.", ], adminGuideNote: "※ The token typically lasts days to weeks. When it expires, repeat these steps. The Access Token is auto-refreshed every 4 minutes — no manual action needed.", poolTitle: "🔄 Token Account Pool", poolDesc: "Multi-account rotation for image generation. The system picks the least-recently-used (LRU) account to avoid rate limits.", poolEmpty: "No accounts added yet", poolEmptyDesc: "Click 'Add Account' below to get started", poolNeverUsed: "Never used", poolLRUNote: "Rotation: Least Recently Used (LRU)", poolAddTitle: "Add Account", poolBtnConsole: "Console Sync", poolBtnConsoleDesc: "For Google accounts", poolBtnBookmark: "Bookmarklet", poolBtnBookmarkDesc: "Drag to bookmarks", poolBtnManual: "Manual Input", poolBtnManualDesc: "Paste token directly", poolModeConsole: "Console Method", poolModeBookmark: "Bookmarklet Method", poolAccountLabel: "Account Name (for Token Pool)", poolAccountPlaceholder: "e.g. Google Account A", poolGenerating: "Generating code...", poolGenerate: "Generate Sync Code", poolExpiryPrefix: "Code valid: ~", poolExpirySuffix: "min", poolRegenerate: "Regenerate", poolStepsLabel: "Steps:", poolConsoleStep1: "Open geminigen.ai and log in with your Google account", poolConsoleStep2: "Press F12 to open DevTools → click the Console tab", poolConsoleStep3: "Copy the code below, paste it into the Console, then press Enter", poolConsoleStep4: "When you see \"✅ Token synced to StarForge!\" you're done", poolCopyCode: "Copy Code", poolCopied: "Copied", poolCopyBtn: "Copy Code to Clipboard", poolCopiedBtn: "Copied!", poolBookmarkStep1: "Drag the button below to your browser bookmark bar", poolBookmarkStep2: "Open geminigen.ai and log in with your Google account", poolBookmarkStep3: "Click the bookmarklet \"Sync to StarForge\"", poolBookmarkBtnText: "Sync to StarForge", poolBookmarkDragHint: "⬆ Long-press and drag to your bookmark bar", poolManualTitle: "Enter Bearer Token Manually", poolManualNamePlaceholder: "Account name (e.g. Google Account A)", poolManualBearerPlaceholder: "Bearer Token (eyJ...) *required", poolManualRefreshPlaceholder: "Refresh Token (optional)", poolManualAddBtn: "Add to Token Pool", poolCancel: "Cancel", poolUnnamed: "Unnamed", poolHasRefresh: "Has Refresh", poolDisable: "Disable", poolEnable: "Enable", poolDelete: "Delete", poolAddSuccess: "✅ Account added to Token Pool", poolDeleteSuccess: "Account removed", poolGenFailed: "Failed to generate code", poolCopySuccess: "✅ Copied! Go to geminigen.ai, paste in Console and press Enter", poolCopyFailed: "Copy failed — please select the code manually", poolDragToast: "Please drag this button to your bookmark bar — don't click it", renewalTitle: "✅ Auto-Renewal Enabled", renewalSetupTitle: "⚡ Set Up Auto-Renewal (Recommended)", renewalActiveDesc: "The system will auto re-login using your saved geminigen.ai credentials. Token never expires.", renewalInactiveDesc: "Enter your geminigen.ai credentials. When the token expires, the system auto re-logins — no manual action needed.", renewalRemove: "Remove", renewalEmailPlaceholder: "geminigen.ai account (Email)", renewalPassPlaceholder: "geminigen.ai password", renewalSecureNote: "Password is stored with AES-256 encryption in your database. Never exposed.", renewalSaveBtn: "Save Credentials & Enable Auto-Renewal", renewalSaving: "Saving...", renewalSuccess: "✅ Credentials saved! System will auto-login when a captcha solver is available.", renewalFailed: "Save failed", renewalClearedCreds: "Auto-login credentials removed", renewalRequireFields: "Please enter email and password", renewalManualTitle: "Manual Refresh Token Update (Fallback)", renewalManualDesc: "If you prefer not to store credentials, paste your refresh_token manually from geminigen.ai:", renewalManualPlaceholder: "refresh_token starting with eyJ...", renewalManualBtn: "Update", renewalManualSuccess: "✅ Refresh Token updated.", renewalManualInvalid: "Please paste a valid refresh_token (starting with eyJ...)", renewalManualFailed: "Save failed", setupTitle: "Initial Setup", setupSubtitle: "A Refresh Token is required to activate AI image generation.", setupPasteLabel: "Paste your Refresh Token", setupPastePlaceholder: "eyJ... (paste only the token value, no quotes or JSON)", setupPasteHint: "⚠️ Paste only the token string itself (starts with eyJ...), not the entire JSON object or surrounding quotes. The token is saved immediately and the system activates within a few minutes.", setupConfirm: "Save & Activate", setupSaving: "Saving...", setupSuccess: "Token saved! The system will activate AI image generation within a few minutes.", setupError: "Failed to save. Please check that you pasted the correct token value.", styles: { none: "No Style", realistic: "Realistic", anime: "Anime", artistic: "Artistic", cartoon: "Cartoon", sketch: "Sketch", oil_painting: "Oil Painting", watercolor: "Watercolor", digital_art: "Digital Art", }, privateLabel: "Private", publicLabel: "Public", privateDesc: "Only visible to you", publicDesc: "Visible to everyone", ratios: { "1:1": "Square", "16:9": "Landscape", "9:16": "Portrait", "4:3": "Standard", "3:4": "Portrait", "3:2": "Camera", "2:3": "Poster", }, models: { grok: { label: "Grok", desc: "By xAI — fast and highly creative", badge: "Fast" }, meta: { label: "Meta AI", desc: "Meta Llama image generation model", badge: "Free" }, "imagen-pro": { label: "Imagen 3 Pro", desc: "Google high-quality image model", badge: "Pro" }, "imagen-4": { label: "Imagen 4", desc: "Google's latest generation model", badge: "New" }, "imagen-flash": { label: "Imagen Flash", desc: "Google ultra-fast version", badge: "Fast" }, "nano-banana-pro": { label: "Nano Banana Pro", desc: "New Banana model — free for all users", badge: "Free" }, "nano-banana-2": { label: "Nano Banana 2", desc: "Banana 2nd generation — upgraded", badge: "Free" }, }, historyImages: "Images", historyVideos: "Videos", historyTabAll: "All", historyTabPublic: "Public", historyTabPrivate: "Private", historyEmptyImages: "No images generated yet", historyEmptyImagesDesc: "Nothing here yet. Go to the creation page, enter your ideas, and start your artistic journey.", historyEmptyVideos: "No videos generated yet", historyEmptyVideosDesc: "Head to the video generation page and let AI create amazing videos for you.", historyNoItemsInFilter: "No items in this category", historyDeleteImgTitle: "Delete image?", historyDeleteImgDesc: "This cannot be undone. Are you sure you want to delete this image?", historyDeleteVidTitle: "Delete video?", historyDeleteVidDesc: "This cannot be undone. Are you sure you want to delete this video?", historyDeletedImg: "Image deleted", historyDeletedVid: "Video deleted", historyDeleteFailed: "Delete failed, please try again", historyConfirmDelete: "Confirm Delete", historyDownload: "Download", historyLoadingVideos: "Loading video history...", navVideo: "Video", videoTitle: "Video Generation", videoSubtitle: "Describe your scene and let AI generate a 6-second clip", videoModel: "Model", videoModelValue: "Grok-3 Video", videoDuration: "Duration", videoDurationValue: "6 sec", videoPromptLabel: "Description", videoPromptPlaceholder: "Describe the video you want, e.g.: a cat playing in a meadow...", videoBtnGenerate: "Generate Video", videoBtnGenerating: "Generating...", videoEmptyTitle: "Waiting for your idea", videoEmptySubtitle: "Enter a description and click generate", videoLoadingTitle: "Generating video...", videoLoadingSubtitle: "Grok-3 video generation takes about 1–3 minutes", videoErrorTitle: "Generation Failed", videoErrorDesc: "Please verify your token is valid or try again later", videoHistoryTitle: "Video History", videoHistoryEmpty: "No videos yet", videoDelete: "Delete", videoDownload: "Download", videoDeleteSuccess: "Video deleted", videoDeleteFailed: "Delete failed", videoGenSuccess: "Video generated successfully!", videoGenFailed: "Video generation failed", videoPrivateLabel: "Private", videoPublicLabel: "Public", videoRefImageLabel: "Reference Image (Image-to-Video)", videoRefImageBadge: "Optional", videoRefImageDrop: "Drag & drop or click to upload", videoRefImageFormats: "JPG / PNG / WebP", videoRefImageRemove: "Remove", videoModeText: "Text-to-Video", videoModeImage: "Image-to-Video", videoPhaseSubmitting: "Submitting task...", videoPhaseGettingCaptcha: "Getting captcha...", videoPhaseConnecting: "Connecting to service...", videoPhaseGenerating: "AI is generating video", videoPhaseProcessing: "Processing...", videoDone: "Video generation complete!", videoGeneratingHint: "Video generation usually takes 1–5 minutes. Closing this window won't stop generation.", videoConnectionFailed: "Connection lost. Please verify your token is valid and try again.", videoPhaseSubmitLabel: "Submit", videoPhaseTurnstileLabel: "Captcha", videoPhaseConnectLabel: "Connect", videoPhaseGenerateLabel: "Generate", videoModelGrokSub: "xAI · Fastest", videoModelGrokDesc: "Up to 6s · Up to 720p", videoModelVeoSub: "Google · High Quality", videoModelVeoDesc: "Fixed 8s · 16:9 / 9:16", videoVeoTimingNote: "Veo 3.1 Fast takes about 2–4 minutes — slightly longer than Grok-3", videoVeoNotSupported: "Not supported by Veo", videoGrokNotSupported: "Not supported by Grok-3", videoGrokMaxTime: "Grok-3 max 6 sec", videoVeoFixedTime: "Veo fixed 8 sec", videoGrokMaxRes: "Grok-3 max 720p", videoAdvanced: "Advanced Settings", videoNegativePromptLabel: "Negative Prompt", videoEnhancePromptLabel: "Enhance Prompt with AI", videoClose: "Close", videoComplete: "Video generation complete", videoElapsed: "Elapsed", tokenExpiredTitle: "Refresh Token expired — image generation unavailable", tokenExpiredDesc: "Please log in to geminigen.ai again to get a new refresh_token, then go to", tokenExpiredLink: "Admin Settings", tokenExpiredSuffix: "→ System Config to update the token.", tokenExpiredFallback: "Token expired", tokenErrorTitle: "Image generation failed", adminTokenTitle: "Update geminigen.ai Access Token", adminTokenDesc: "When the token expires (video generation shows \"Token has been expired\"), paste a new Bearer Token from geminigen.ai.", adminTokenHowTo: "How to get it: Log in to geminigen.ai → F12 → Network → any request → Headers → copy the value after", adminTokenUpdate: "Update", adminTokenSuccess: "✅ Access Token updated! Video generation should be working again.", adminPlaywrightTitle: "Self-hosted Playwright Solver (Free · Priority)", adminPlaywrightDesc: "Deploy a Turnstile solver to Vercel and enter the URL below. Free — takes priority over CapSolver.", adminPlaywrightStepsLabel: "Deployment steps:", adminPlaywrightStep1: "Upload artifacts/turnstile-solver/ to a GitHub repository", adminPlaywrightStep2: "Create a new project on Vercel and import the repo", adminPlaywrightStep3: "After deployment, copy the URL (e.g. https://xxx.vercel.app)", adminPlaywrightStep4: "Enter https://xxx.vercel.app/api/solve below", adminPlaywrightSecretPlaceholder: "SOLVER_SECRET (optional, if set as a Vercel env var)", adminTestConn: "Test Connection", adminSave: "Save", adminPlaywrightSuccess: "✅ Playwright solver URL saved!", adminYesCaptchaTitle: "YesCaptcha API Key (free credits)", adminYesCaptchaDesc: "New accounts get free credits. Supports Cloudflare Turnstile. Price ~$1 / 1,000 solves — cheaper than CapSolver.", adminYesCaptchaHowTo: "How to get it: Sign up at yescaptcha.com → Dashboard → API Key", adminYesCaptchaSet: "Set", adminYesCaptchaSuccess: "✅ YesCaptcha API Key saved!", adminCapSolverTitle: "CapSolver API Key (paid fallback)", adminCapSolverDesc: "Automatically falls back to CapSolver when YesCaptcha fails. Price ~$2 / 1,000 solves.", adminCapSolverHowTo: "How to get it: Sign up at capsolver.com → Dashboard → API Key", adminCapSolverSet: "Set", adminCapSolverSuccess: "✅ CapSolver API Key saved! Turnstile will now be auto-solved.", adminSaveFailed: "Update failed", adminTestSuccess: "Test passed! Token prefix", adminTestFailed: "Test failed", adminConnectFailed: "Connection failed", }, } as const; export type Translations = typeof translations.zh;