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;