2026-07-10 05:10:31 +00:00
import type { AppLocale } from "./types" ;
/** 扁平 key → 字串;{name} 可插值 */
export type MessageDict = Record < string , string > ;
export const zhTW : MessageDict = {
"app.name" : "巡樓" ,
"app.nameEn" : "Lapras" ,
"app.nameZh" : "巡樓" ,
"app.tagline" : "Threads 海巡好幫手" ,
"app.taglineEn" : "Patrol Threads with ease" ,
"nav.today" : "今日" ,
"nav.crew" : "帳號" ,
"nav.studio" : "創作" ,
2026-08-03 05:52:02 +00:00
/** 每日自動需求名單( vs 海巡=手動掃一輪) */
"nav.radar" : "商機" ,
"nav.crm" : "名單" ,
/** 手動掃場外展( vs 商機=訂閱後每天自動) */
2026-08-06 14:16:49 +00:00
"nav.scout" : "探索" ,
2026-07-10 05:10:31 +00:00
"nav.outbox" : "發送" ,
"nav.jobs" : "任務" ,
"nav.brands" : "品牌" ,
2026-07-23 05:56:42 +00:00
"nav.playbooks" : "市集" ,
"nav.insights" : "成效" ,
"nav.benchmark" : "基準" ,
"nav.utm" : "追蹤" ,
2026-07-10 05:10:31 +00:00
"nav.more" : "更多" ,
"nav.moreTitle" : "更多功能" ,
"nav.users" : "島民管理" ,
"nav.usage" : "用量與方案" ,
"nav.profile" : "會員資料" ,
2026-07-10 12:54:45 +00:00
"nav.invite" : "邀請關係" ,
2026-07-10 05:10:31 +00:00
"nav.settings" : "系統設定" ,
"nav.logout" : "登出" ,
"nav.navigate" : "導覽" ,
2026-07-23 05:56:42 +00:00
"navGroup.workflow" : "主流程" ,
"navGroup.accounts" : "帳號品牌" ,
"navGroup.growth" : "成長工具" ,
"workspace.label" : "工作區" ,
"workspace.default" : "預設" ,
"workspace.new" : "+ 新增工作區" ,
"workspace.newPrompt" : "新工作區名稱" ,
2026-07-10 05:10:31 +00:00
"common.save" : "儲存" ,
2026-08-03 05:52:02 +00:00
"common.saving" : "儲存中…" ,
2026-07-10 05:10:31 +00:00
"common.cancel" : "取消" ,
2026-08-03 05:52:02 +00:00
"common.close" : "關閉" ,
2026-07-10 05:10:31 +00:00
"common.loading" : "載入中…" ,
2026-07-28 06:33:51 +00:00
"common.retry" : "重試" ,
2026-07-10 05:10:31 +00:00
"common.back" : "返回" ,
"common.delete" : "刪除" ,
"common.edit" : "編輯" ,
"common.search" : "搜尋" ,
"common.confirm" : "確定" ,
"common.optional" : "選填" ,
"common.success" : "已儲存" ,
"common.error" : "發生錯誤" ,
"common.yes" : "是" ,
"common.no" : "否" ,
2026-08-03 05:52:02 +00:00
// 本頁說明(頂欄抽屜,不進頁面正文)
"help.open" : "說明" ,
"help.kicker" : "本頁說明" ,
"help.section.what" : "這頁在做什麼" ,
"help.section.how" : "怎麼用" ,
"help.section.tips" : "小提醒" ,
"help.section.related" : "相關頁面" ,
"help.shortcutHint" : "入口在頁面標題旁的「?」。快捷鍵:? 開關; Esc 關閉。" ,
"help.page.generic.title" : "巡樓主控台" ,
"help.page.generic.what" : "這是巡樓的工作桌面。左側(或手機底欄)切換功能,頂欄可看用量、通知與本頁說明。" ,
"help.page.generic.step1" : "從側欄選你要做的事(海巡、雷達、發送等)。" ,
"help.page.generic.step2" : "需要幫助時點頂欄「說明」或按 ?。" ,
"help.page.generic.step3" : "設定、帳號與方案在右上角選單。" ,
"help.page.generic.tips" : "說明不會改你的資料,可隨時開關。" ,
"help.page.today.title" : "今日" ,
"help.page.today.what" : "今日儀表板:一眼看商機、海巡待回、發送與帳號脈動,決定今天先做哪件事。" ,
"help.page.today.step1" : "看「今日商機」摘要,有名單就點進雷達處理。" ,
"help.page.today.step2" : "海巡待回區處理需要回覆的貼文。" ,
"help.page.today.step3" : "發送失敗或進行中的 Outbox 可從這裡追蹤。" ,
"help.page.today.tips" : "沒有商機時摘要會引導你去填服務檔案或訂閱關鍵字。" ,
"help.page.crew.title" : "帳號( Crew) " ,
"help.page.crew.what" : "管理已連結的 Threads 帳號、健康度與可用性,發文/外展都從這裡的帳號出發。" ,
"help.page.crew.step1" : "用 OAuth 連結至少一個可用帳號。" ,
"help.page.crew.step2" : "確認連線狀態與健康度( throttle 時勿硬送)。" ,
"help.page.crew.step3" : "需要時到設定頁調整 AI 與開發選項。" ,
"help.page.crew.tips" : "帳號健康偏黃/限速時,公開留言自動送出會被擋,請改手動。" ,
"help.page.studio.title" : "創作" ,
"help.page.studio.what" : "寫貼文、做人設、靈感與劇本;完成後送進 Outbox 排程發送。" ,
"help.page.studio.step1" : "選人設或品牌語氣後開始草稿。" ,
"help.page.studio.step2" : "用靈感/仿寫輔助,再人工改到可發。" ,
"help.page.studio.step3" : "送出到發送匣,到 Outbox 確認排程。" ,
"help.page.studio.tips" : "創作頁不直接等同已發佈;真正送出在 Outbox。" ,
"help.page.scout.title" : "海巡(手動掃場)" ,
2026-08-03 07:58:07 +00:00
"help.page.scout.what" : "先練關鍵字、確認後再搜:找痛點/話題對話、寫草稿、回完就結。不是「每天自動來名單」——那是側欄「商機」。" ,
"help.page.scout.step1" : "寫意圖(可選產品),按「產出關鍵字」檢視/增刪 query。" ,
"help.page.scout.step2" : "確認後「用這些詞開始搜」,在佇列依發文時間處理。" ,
2026-08-03 05:52:02 +00:00
"help.page.scout.step3" : "值得長期跟進的,按「收進商機」複製到每日商機/名單(不影響這則海巡狀態)。" ,
2026-08-03 07:58:07 +00:00
"help.page.scout.tips" : "海巡=出擊掃場;商機=訂閱後每天自動收「正在找你的人」。兩者可並用。關鍵字要寫「對方的困擾」,不要寫產品賣點。" ,
2026-08-03 05:52:02 +00:00
"help.page.radar_today.title" : "今日商機(自動名單)" ,
"help.page.radar_today.what" : "依你訂的關鍵字,系統每天自動整理的需求名單(高/中/低意向)。和海巡不同:不用每次手動掃。" ,
"help.page.radar_today.step1" : "先看統計; 0 筆時依原因去「商機訂閱」或服務檔案。" ,
"help.page.radar_today.step2" : "從高意向開始:開原文 → 產生回覆 → 加入名單或略過。" ,
"help.page.radar_today.step3" : "低意向預設收合;需要長期跟進的進「名單」看板。" ,
"help.page.radar_today.tips" : "想臨時掃痛點/話題用「海巡」;想每天穩收需求用這裡的訂閱。" ,
"help.page.radar_watches.title" : "商機訂閱" ,
"help.page.radar_watches.what" : "設定常駐關鍵字後,系統每日自動巡並寫入今日商機。這不是海巡的「按一次掃一次」。" ,
"help.page.radar_watches.step1" : "先在品牌頁填服務檔案(沒檔案不能啟用)。" ,
"help.page.radar_watches.step2" : "新增訂閱:客人會搜的關鍵字、排除詞、可選地區。" ,
"help.page.radar_watches.step3" : "啟用後等每日排程,或按「立即巡」補一輪。" ,
"help.page.radar_watches.tips" : "啟用數有方案上限;滿了要先暫停或封存一組。" ,
"help.page.crm_board.title" : "名單看板" ,
"help.page.crm_board.what" : "從「今日商機」加入後的聯絡人看板:七階段+待追蹤,可備註、成交與看時間軸。" ,
"help.page.crm_board.step1" : "在今日商機按「加入名單」後,人會出現在「新發現」。" ,
"help.page.crm_board.step2" : "點聯絡人推進階段、加備註或標記待追蹤。" ,
"help.page.crm_board.step3" : "成交時用回報成交(金額可留空)。" ,
"help.page.crm_board.tips" : "待追蹤是並存標記,不是第八個階段。" ,
"help.page.crm_followups.title" : "待追蹤" ,
"help.page.crm_followups.what" : "到期要回訪的清單:完成、延後、或產生 AI 追蹤草稿。" ,
"help.page.crm_followups.step1" : "看到期日與狀態(含需升級處理)。" ,
"help.page.crm_followups.step2" : "需要文案時用 AI 草稿,再手動複製送出。" ,
"help.page.crm_followups.step3" : "做完按完成,或延後 3 天。" ,
"help.page.crm_followups.tips" : "系統不會替你自動傳訊;草稿僅供複製。" ,
"help.page.crm_stats.title" : "轉換統計" ,
"help.page.crm_stats.what" : "從關鍵字、回覆版本、來源看轉換;樣本不足時不下結論。" ,
"help.page.crm_stats.step1" : "先看各表的絕對數。" ,
"help.page.crm_stats.step2" : "標「樣本不足」的列不要拿來排名。" ,
"help.page.crm_stats.step3" : "回到看板或雷達調整關鍵字與回覆策略。" ,
"help.page.crm_stats.tips" : "樣本少時比率會隱藏,這是刻意設計。" ,
"help.page.outbox.title" : "發送" ,
"help.page.outbox.what" : "排程與發送佇列:草稿真正送上 Threads 前的最後一站。" ,
"help.page.outbox.step1" : "檢查待發送與失敗項目。" ,
"help.page.outbox.step2" : "失敗可看原因後重試或改草稿。" ,
"help.page.outbox.step3" : "進行中任務也可在任務中心追蹤。" ,
"help.page.outbox.tips" : "帳號健康限速時自動送出會被擋。" ,
"help.page.jobs.title" : "任務" ,
"help.page.jobs.what" : "背景工作(掃描、巡檢、分析等)的進度與結果。" ,
"help.page.jobs.step1" : "列表看狀態:排隊/執行中/成功/失敗。" ,
"help.page.jobs.step2" : "點進詳情看進度摘要。" ,
"help.page.jobs.step3" : "失敗時依摘要回對應功能重試。" ,
"help.page.jobs.tips" : "雷達「立即巡」會在這裡產生 radar_sweep 任務。" ,
"help.page.brands.title" : "品牌" ,
"help.page.brands.what" : "品牌/產品資料,以及雷達用的服務檔案(價格、地區、禁語、案例)。" ,
"help.page.brands.step1" : "維護品牌與產品基本資料。" ,
"help.page.brands.step2" : "填服務檔案:服務項目、地區、禁語。" ,
"help.page.brands.step3" : "存檔後再去開雷達訂閱。" ,
"help.page.brands.tips" : "服務檔案越具體,商機判定與回覆越準。" ,
"help.page.playbooks.title" : "市集( Playbooks) " ,
"help.page.playbooks.what" : "分享或引用海巡 brief、人設與劇本模板。" ,
"help.page.playbooks.step1" : "瀏覽可用模板。" ,
"help.page.playbooks.step2" : "引用到你的工作區後再編輯。" ,
"help.page.playbooks.step3" : "回到海巡或創作實際使用。" ,
"help.page.playbooks.tips" : "模板是起點,發文前請依你的品牌改寫。" ,
"help.page.insights.title" : "成效" ,
"help.page.insights.what" : "貼文與互動成效管線,用來複盤什麼內容有效。" ,
"help.page.insights.step1" : "同步或整理近期貼文成效。" ,
"help.page.insights.step2" : "對照高表現內容調整創作。" ,
"help.page.insights.step3" : "需要全站基準可看基準頁。" ,
"help.page.insights.tips" : "數據延遲取決於平台同步,非即時秒級。" ,
"help.page.benchmark.title" : "基準" ,
"help.page.benchmark.what" : "全站匿名聚合中位數,樣本足夠才顯示,用來對照自己的水準。" ,
"help.page.benchmark.step1" : "查看有樣本的指標。" ,
"help.page.benchmark.step2" : "樣本不足的項目不要過度解讀。" ,
"help.page.benchmark.step3" : "回到成效與創作調整策略。" ,
"help.page.benchmark.tips" : "通常樣本 ≥ 5 才顯示有意義的中位數。" ,
"help.page.utm.title" : "追蹤( UTM) " ,
"help.page.utm.what" : "建立帶 UTM 的連結,方便之後看流量來源。" ,
"help.page.utm.step1" : "填活動與來源參數。" ,
"help.page.utm.step2" : "產生連結後用於貼文或私訊。" ,
"help.page.utm.step3" : "在分析工具對照成效。" ,
"help.page.utm.tips" : "參數命名保持一致,後續報表才好彙總。" ,
"help.page.settings.title" : "系統設定" ,
"help.page.settings.what" : "AI 供應商、開發模式、Session 等系統級選項。" ,
"help.page.settings.step1" : "確認 AI 與金鑰(平台或 BYOK) 。" ,
"help.page.settings.step2" : "開發模式僅在需要時開啟。" ,
"help.page.settings.step3" : "改完後回業務頁驗證。" ,
"help.page.settings.tips" : "錯誤的金鑰會讓生成與掃描失敗,訊息多在用量或任務裡。" ,
"help.page.profile.title" : "會員資料" ,
"help.page.profile.what" : "你的帳號資料、密碼與基本偏好。" ,
"help.page.profile.step1" : "更新顯示名稱等基本資料。" ,
"help.page.profile.step2" : "需要時修改密碼。" ,
"help.page.profile.step3" : "語言/主題可在介面偏好調整。" ,
"help.page.profile.tips" : "這是會員層設定,與 Threads 連帳不同(連帳在帳號頁)。" ,
"help.page.invite.title" : "邀請關係" ,
"help.page.invite.what" : "邀請連結、下線關係與獎勵相關資訊。" ,
"help.page.invite.step1" : "複製邀請連結分享。" ,
"help.page.invite.step2" : "查看已建立的邀請關係。" ,
"help.page.invite.step3" : "獎勵規則以產品內標示為準。" ,
"help.page.invite.tips" : "請勿濫發邀請;違規可能被停權。" ,
"help.page.usage.title" : "用量與方案" ,
"help.page.usage.what" : "看點數、分項用量與目前方案額度。" ,
"help.page.usage.step1" : "對照各 meter 的使用量。" ,
"help.page.usage.step2" : "接近上限時考慮升級或 BYOK。" ,
"help.page.usage.step3" : "方案細節在方案頁。" ,
"help.page.usage.tips" : "BYOK 通常只計呼叫次數,不占平台點數(以頁面標示為準)。" ,
"help.page.usage_plans.title" : "方案" ,
"help.page.usage_plans.what" : "比較與選擇付費方案。" ,
"help.page.usage_plans.step1" : "比較額度與功能。" ,
"help.page.usage_plans.step2" : "選方案進入結帳。" ,
"help.page.usage_plans.step3" : "完成後回用量頁確認。" ,
"help.page.usage_plans.tips" : "價格與額度以結帳當下標示為準。" ,
"help.page.usage_checkout.title" : "結帳" ,
"help.page.usage_checkout.what" : "完成方案購買的付款流程。" ,
"help.page.usage_checkout.step1" : "確認方案與金額。" ,
"help.page.usage_checkout.step2" : "依指示完成付款。" ,
"help.page.usage_checkout.step3" : "成功後回用量確認額度。" ,
"help.page.usage_checkout.tips" : "付款異常請保留單號並聯絡支援。" ,
"help.page.admin_users.title" : "島民管理" ,
"help.page.admin_users.what" : "管理員維護會員帳號、停權與角色。" ,
"help.page.admin_users.step1" : "搜尋或瀏覽會員。" ,
"help.page.admin_users.step2" : "調整狀態或角色(慎用)。" ,
"help.page.admin_users.step3" : "重大操作保留紀錄與原因。" ,
"help.page.admin_users.tips" : "僅管理員可見;誤操作可能影響他人登入。" ,
2026-07-10 12:54:45 +00:00
// 後端 envelope code( apps/backend response + middleware)
"api.err.unknown" : "操作失敗,請稍後再試" ,
2026-07-13 01:15:30 +00:00
"api.err.studioValidation" : "資料不符合規則,請檢查後再試" ,
"api.err.crawlerSession" : "開發模式需先同步 Chrome Session( 設定頁) " ,
2026-07-10 12:54:45 +00:00
"api.err.network" : "無法連線後端,請確認網路或服務是否啟動" ,
"api.err.400001" : "請求格式不正確" ,
// 與後端 400003 / ValidatePasswordPolicy 同一句(勿各寫各的)
"api.err.400003" : "密碼須至少 12 碼,且含大寫、小寫、數字與符號" ,
"password.policy.hint" : "密碼須至少 12 碼,且含大寫、小寫、數字與符號" ,
"password.policy.minLen" : "密碼須至少 12 碼,且含大寫、小寫、數字與符號" ,
"password.policy.needUpper" : "密碼須至少 12 碼,且含大寫、小寫、數字與符號" ,
"password.policy.needLower" : "密碼須至少 12 碼,且含大寫、小寫、數字與符號" ,
"password.policy.needDigit" : "密碼須至少 12 碼,且含大寫、小寫、數字與符號" ,
"password.policy.needSymbol" : "密碼須至少 12 碼,且含大寫、小寫、數字與符號" ,
"api.err.400004" : "驗證碼無效或已過期" ,
"api.err.400020" : "不能停權自己的帳號" ,
"api.err.400021" : "不能移除或停權最後一位管理員" ,
2026-07-28 06:33:51 +00:00
"auth.unreachable" : "連不上伺服器,無法確認登入狀態。請檢查網路後重試。" ,
2026-07-10 12:54:45 +00:00
"api.err.401001" : "請先登入" ,
"api.err.401002" : "登入已失效,請重新登入" ,
"api.err.401003" : "找不到會員資料,請重新登入" ,
"api.err.401010" : "Email 或密碼錯誤" ,
"api.err.403001" : "帳號已停權" ,
"api.err.403002" : "需要管理員權限" ,
"api.err.404001" : "找不到資料" ,
"api.err.404002" : "查無此信箱,請確認後再試" ,
"api.err.409001" : "此 Email 已被註冊" ,
2026-07-13 03:18:08 +00:00
"api.err.402001" : "本月平台點數已用完,請升級方案或下月再試" ,
"usage.err.meterCap" : "此功能本月點數已達上限,請改用其他功能或升級方案" ,
"usage.err.platformCapacity" : "平台 AI/ 搜尋目前忙碌或已限流。可稍後再試, 或到設定填入自己的 API Key( BYOK) 繼續使用" ,
2026-07-10 12:54:45 +00:00
"api.err.500000" : "伺服器發生錯誤,請稍後再試" ,
2026-07-13 01:15:30 +00:00
"api.err.timeoutAI" : "AI 回應逾時(模型思考太久)。可縮短結構備註後再試,或到設定換較快的模型" ,
2026-07-10 12:54:45 +00:00
"api.err.501000" : "此功能尚未實作" ,
2026-08-03 05:52:02 +00:00
"api.err.501010" : "這個功能還沒開通,之後的版本會補上" ,
"api.err.400100" : "填寫內容不符合規則,請檢查後再送出" ,
2026-07-10 12:54:45 +00:00
// 後端 data.message 成功文案
"api.ok.verifySent" : "驗證碼已寄出,請查收信箱" ,
"api.ok.verifyIssued" : "驗證碼已產生" ,
"api.ok.resetSent" : "重設信已寄出,請查收信箱" ,
"api.ok.passwordUpdated" : "密碼已更新" ,
"api.ok.loggedOut" : "已登出" ,
"api.ok.unbound" : "已解除綁定" ,
2026-07-10 05:10:31 +00:00
"topbar.notifications" : "通知" ,
"topbar.unread" : "{n} 未讀" ,
"topbar.markAllRead" : "全已讀" ,
"topbar.noNotifications" : "目前沒有通知" ,
"topbar.jobsCenter" : "任務中心" ,
"topbar.moreOlder" : "還有 {n} 則較舊" ,
"topbar.account" : "帳號選單" ,
"role.admin" : "管理員" ,
"role.member" : "一般會員" ,
"role.verified" : "已驗證" ,
"role.unverified" : "未驗證" ,
"login.title" : "登入巡樓" ,
"login.email" : "Email" ,
"login.password" : "密碼" ,
"login.submit" : "登入" ,
"login.submitting" : "登入中…" ,
"login.forgot" : "忘記密碼?" ,
"login.mockHint" : "管理員 demo@harbor.local / demo · 一般會員 alice@harbor.local / alice" ,
2026-07-10 12:54:45 +00:00
"login.liveHint" : "Live 後端: admin@haixun.local / admin123( gateway :8888) " ,
2026-07-10 05:10:31 +00:00
"forgot.title" : "忘記密碼" ,
"forgot.submit" : "寄送重設連結" ,
"forgot.submitting" : "送出中…" ,
"forgot.back" : "返回登入" ,
2026-07-10 12:54:45 +00:00
"forgot.hint" : "輸入註冊用 Email, 我們會寄送重設連結與驗證碼。" ,
2026-07-10 05:10:31 +00:00
"forgot.mockMail" : "重設信" ,
2026-07-10 12:54:45 +00:00
"forgot.openReset" : "前往輸入驗證碼/重設密碼" ,
2026-07-10 05:10:31 +00:00
"forgot.retry" : "再試一次" ,
2026-07-10 12:54:45 +00:00
"forgot.nextStep" : "請查收信箱中的驗證碼或連結,再到重設頁完成新密碼。" ,
2026-07-10 05:10:31 +00:00
"reset.title" : "設定新密碼" ,
2026-07-10 12:54:45 +00:00
"reset.hint" : "請輸入信箱、驗證碼(信內 6 碼或連結參數)與新密碼。" ,
"reset.code" : "驗證碼" ,
"reset.codePh" : "信內 6 位數字" ,
"reset.needEmail" : "請輸入 Email" ,
"reset.needCode" : "請輸入驗證碼" ,
2026-07-10 05:10:31 +00:00
"reset.newPassword" : "新密碼" ,
"reset.confirm" : "確認新密碼" ,
"reset.submit" : "更新密碼" ,
"reset.submitting" : "更新中…" ,
"reset.missingToken" : "連結缺少 token。請從「忘記密碼」重新申請。" ,
"verify.title" : "驗證信箱" ,
"verify.pending" : "尚未驗證" ,
"verify.body" : "帳號已開通登入,但信箱未驗證前無法使用功能。請輸入寄到你信箱的 6 位驗證碼。" ,
"verify.code" : "驗證碼" ,
"verify.submit" : "完成驗證" ,
"verify.submitting" : "驗證中…" ,
"verify.resend" : "重新寄送驗證碼" ,
"verify.sending" : "寄送中…" ,
"verify.logout" : "登出" ,
"verify.mockMail" : "驗證信" ,
"verify.mockHint" : "請輸入驗證碼:" ,
"verify.after" : "驗證完成後即可使用今日、創作、海巡等功能。" ,
"settings.title" : "設定" ,
2026-07-28 06:33:51 +00:00
"settings.loadFail" : "載入設定失敗,請重新整理再試" ,
2026-07-10 05:10:31 +00:00
"settings.localeCurrency" : "語言與幣別" ,
"settings.locale" : "介面語言" ,
"settings.currency" : "顯示幣別" ,
2026-07-13 03:18:08 +00:00
"settings.currencyHint" : "金額顯示用;方案計費仍以台幣為準。" ,
2026-07-10 05:10:31 +00:00
"settings.localeSaved" : "語言與幣別已更新" ,
"settings.appearance" : "外觀" ,
"settings.theme" : "主題" ,
"settings.themeLight" : "淺色" ,
"settings.themeDark" : "深色" ,
"settings.themeSystem" : "跟隨系統" ,
2026-07-13 03:18:08 +00:00
"settings.themeHint" : "可選淺色、深色,或跟隨系統外觀。" ,
2026-07-10 05:10:31 +00:00
"settings.themeSaved" : "主題已更新" ,
"settings.themeToLight" : "切換成淺色" ,
"settings.themeToDark" : "切換成深色" ,
"settings.dataSource" : "資料來源" ,
2026-07-10 12:54:45 +00:00
"settings.dataSourceHint" :
2026-07-13 01:15:30 +00:00
"業務資料一律走 live API。Mock 僅保留邀請關係等少數本機模組;請維持 Live 並連 gateway。" ,
"settings.dataSourceMock" : "Mock( 已縮) " ,
2026-07-10 12:54:45 +00:00
"settings.dataSourceLive" : "Live( 後端 API) " ,
"settings.dataSourceCurrent" : "目前" ,
"settings.dataSourceSwitchedLive" : "已切到 Live — 請用後端帳號重新登入( admin@haixun.local / admin123) " ,
2026-07-13 01:15:30 +00:00
"settings.dataSourceSwitchedMock" : "已切回 Mock( 邀請外仍打 live) " ,
2026-07-10 12:54:45 +00:00
"settings.dataSourceLiveNeedGateway" : "需 gateway 在 :8888( 或 Vite proxy /api) " ,
2026-07-10 05:10:31 +00:00
"settings.ai" : "AI" ,
"settings.search" : "搜尋" ,
2026-07-13 01:15:30 +00:00
"settings.threads" : "Threads 連帳(平台)" ,
"settings.threadsHint" :
"App ID/ Secret 在 gateway 平台設定( yaml/ env) , Secret 不會顯示。請把 Callback 貼到 Meta 後台,並用 https 公開站連帳。" ,
"settings.threadsProvider" : "目前模式" ,
"settings.threadsProviderFake" : "Fake( 開發/ 本機可測 OAuth 流程)" ,
"settings.threadsProviderMeta" : "Meta 正式" ,
"settings.threadsConfigured" : "App 憑證" ,
"settings.threadsConfiguredYes" : "已設定" ,
"settings.threadsConfiguredNo" : "未設定" ,
"settings.threadsCallback" : "OAuth Callback URL( redirect_uri) " ,
"settings.threadsCallbackHint" : "Meta App → Valid OAuth Redirect URIs 請貼這一整行(必須 https) " ,
"settings.threadsCopy" : "複製" ,
"settings.threadsCopied" : "已複製 Callback URL" ,
"settings.threadsCopyFail" : "複製失敗,請手動選取" ,
"settings.threadsPublicWeb" : "公開站 origin" ,
"settings.threadsGoCrew" : "前往 Crew 連帳" ,
2026-07-10 05:10:31 +00:00
"settings.member" : "會員與登入" ,
"settings.usageCard" : "AI/ 搜尋額度" ,
2026-07-13 03:18:08 +00:00
"settings.usageCardHint" : "平台代付點數與方案上限;自備 Key 不占平台點。" ,
2026-07-10 05:10:31 +00:00
"settings.viewUsage" : "查看用量" ,
"settings.editProfile" : "編輯會員資料" ,
"settings.mockLogin" : "demo@harbor.local / demo" ,
2026-07-13 03:18:08 +00:00
"settings.memberHint" : "登入帳號、顯示名稱與通知偏好。" ,
2026-07-10 05:10:31 +00:00
"usage.title" : "用量與方案" ,
2026-07-13 03:18:08 +00:00
"usage.desc" : "查看本月平台點數、分項用量,並變更方案。" ,
2026-07-10 05:10:31 +00:00
"usage.creditsUsed" : "本月已用點數" ,
"usage.remaining" : "剩餘 {n} 點" ,
"usage.percentUsed" : "{n}% 已使用" ,
"usage.breakdown" : "分項用量" ,
"usage.plans" : "方案" ,
"usage.current" : "目前" ,
"usage.inUse" : "使用中" ,
"usage.switchMock" : "切換方案" ,
"usage.perMonth" : "點/月" ,
"usage.ledger" : "最近使用紀錄" ,
"usage.emptyTitle" : "本月還沒有扣點" ,
2026-07-13 03:18:08 +00:00
"usage.emptyDesc" : "開始創作、海巡或生圖後,這裡會出現扣點紀錄。" ,
"usage.planNote" : "自然月重置;未用完點數不累積至下月。" ,
2026-07-10 05:10:31 +00:00
"usage.switched" : "已切換為 {name}" ,
"usage.meter.times" : "{count} 次 · {credits} 點" ,
2026-07-13 03:18:08 +00:00
"usage.meter.timesShort" : "{n} 次" ,
"usage.meter.pt" : "點" ,
"usage.meter.over" : "已超出" ,
"usage.meter.locked" : "已鎖" ,
"usage.meter.cap" : "單項上限 {credits}/{cap} 點" ,
"usage.side.aiCredits" : "AI 相關已用點數(文案+研究+生圖)" ,
"usage.side.searchCredits" : "搜尋已用點數" ,
2026-07-15 15:23:59 +00:00
"usage.byok.title" : "自備 Key 用量" ,
"usage.byok.hint" : "只計呼叫次數,不占平台點數與分項進度。" ,
2026-07-13 03:18:08 +00:00
"usage.plan.free.blurb" : "夠用試用,體驗完整創作流程" ,
2026-07-10 05:10:31 +00:00
"usage.plan.starter.blurb" : "小團隊日常發文與海巡" ,
"usage.plan.pro.blurb" : "多帳、重度 AI 與研究" ,
"profile.title" : "會員資料" ,
2026-07-13 03:18:08 +00:00
"profile.desc" : "管理顯示名稱、頭像與密碼。" ,
2026-07-10 05:10:31 +00:00
"profile.accountStatus" : "帳號開通狀態" ,
"profile.basic" : "基本資料" ,
"profile.avatar" : "頭像" ,
"profile.avatarUpload" : "上傳頭像" ,
"profile.avatarRemove" : "移除頭像" ,
2026-07-10 12:54:45 +00:00
"profile.avatarHint" : "JPG/ PNG/ WebP, 5MB 內。選圖後按「儲存基本資料」寫入;「移除頭像」會立刻清除。" ,
2026-07-10 05:10:31 +00:00
"profile.avatarSaved" : "頭像已更新" ,
"profile.avatarCleared" : "已移除頭像" ,
"profile.avatarFail" : "無法讀取圖片" ,
"profile.displayName" : "顯示名稱" ,
"profile.bio" : "簡介(選填)" ,
"profile.timezone" : "時區" ,
"profile.notifyEmail" : "Email 通知" ,
"profile.password" : "變更密碼(選填)" ,
"profile.currentPassword" : "目前密碼" ,
"profile.newPassword" : "新密碼" ,
"profile.confirmPassword" : "確認新密碼" ,
"profile.emailVerified" : "信箱已驗證" ,
"profile.emailUnverified" : "信箱未驗證" ,
"profile.roleAdmin" : "管理員" ,
"profile.roleMember" : "一般會員" ,
"profile.loginEmail" : "登入信箱:{email}" ,
"profile.verifiedAt" : " · 驗證於 {time}" ,
"profile.goVerify" : "去驗證信箱" ,
"profile.roleTags" : "權限標籤:{labels}" ,
"profile.roleNote" : "角色由系統指派;改信箱後需重新驗證。" ,
"profile.saveBasic" : "儲存基本資料" ,
"profile.updatePassword" : "更新密碼" ,
"profile.saved" : "會員資料已儲存" ,
"profile.savedUnverified" : "資料已儲存。信箱尚未驗證或已變更,請完成驗證後才能繼續使用功能。" ,
"profile.saveFail" : "儲存失敗" ,
"profile.needNewPassword" : "請輸入新密碼" ,
"profile.passwordMismatch" : "兩次新密碼不一致" ,
"profile.needCurrentPassword" : "請輸入目前密碼" ,
2026-07-10 12:54:45 +00:00
"profile.wrongCurrentPassword" : "目前密碼不正確" ,
2026-07-10 05:10:31 +00:00
"profile.passwordUpdated" : "密碼已更新" ,
"profile.passwordFail" : "變更密碼失敗" ,
"profile.listJoin" : "、" ,
"profile.tenantUid" : " · tenant {tenant} · uid {uid}" ,
2026-07-10 12:54:45 +00:00
"profile.inviteBadge" : "邀請碼" ,
"profile.inviteHint" : "分享給朋友加入;日後活動可依邀請關係計算。" ,
"profile.gotoInvite" : "查看邀請關係" ,
"invite.title" : "邀請關係" ,
"invite.desc" : "邀請碼與邀請關係;管理端為樹狀結構。" ,
"invite.tabs" : "邀請檢視" ,
"invite.tab.mine" : "我的邀請" ,
"invite.tab.tree" : "關係樹" ,
"invite.myCode" : "我的邀請碼" ,
"invite.codeLabel" : "邀請碼" ,
"invite.copyCode" : "複製" ,
"invite.copied" : "已複製" ,
"invite.copyFail" : "複製失敗" ,
"invite.stats" : "直邀 {direct} · 延伸 {total}" ,
2026-07-23 05:56:42 +00:00
"invite.rewards.summary" : "邀請贈點累計 {total} · 本月 {month} /上限 {cap}" ,
"invite.rewards.title" : "邀請回饋紀錄" ,
2026-07-10 12:54:45 +00:00
"invite.upline" : "邀請人" ,
"invite.downlines" : "直邀成員 · {n}" ,
"invite.noUpline" : "無邀請人" ,
"invite.noDownline" : "尚無直邀" ,
"invite.directN" : "直邀 {n}" ,
"invite.claimHint" : "若註冊時沒填,可在此補上邀請人的邀請碼(綁定後不可自行更改)。" ,
"invite.claimLabel" : "邀請碼" ,
"invite.claimPh" : "例如 HX-DEMO01" ,
"invite.claimSubmit" : "確認綁定" ,
"invite.claimOk" : "已綁定邀請人:{name}" ,
"invite.claimOkGeneric" : "已綁定邀請人" ,
"invite.claimFail" : "綁定失敗" ,
"invite.claimLocked" : "已綁定,如需調整請聯絡管理員。" ,
"invite.loadFail" : "載入失敗" ,
"invite.treeEmpty" : "尚無資料" ,
"invite.treeSearch" : "搜尋" ,
"invite.treeSearchPh" : "名稱 / Email / 邀請碼" ,
"invite.treeCount" : "{n} 人" ,
"invite.treeMatchCount" : "命中 {n} · 共 {total}" ,
"invite.treeNoMatch" : "沒有符合的島民" ,
"invite.treeNoMatchHint" : "換個關鍵字試試" ,
"invite.clearSearch" : "清除" ,
"invite.moveTitle" : "調整歸屬" ,
"invite.newParent" : "邀請人" ,
"invite.root" : "(無 · 獨立)" ,
"invite.confirmMove" : "確認" ,
"invite.moved" : "已調整「{name}」→「{parent}」" ,
"invite.moveFail" : "調整失敗" ,
"invite.openFromAdmin" : "邀請關係" ,
"invite.parentField" : "邀請人" ,
"invite.orgPickRoot" : "選一個起點(含無人邀請、自己進來的)" ,
"invite.orgRoots" : "起點" ,
"invite.orgPath" : "路徑" ,
"invite.orgChainN" : "延伸 {n}" ,
"invite.orgFocusStats" : "直邀 {direct} · 延伸 {total}" ,
"invite.orgDirects" : "直邀成員 · {n}" ,
"invite.orgNoDirects" : "沒有直邀成員" ,
"invite.err.notFound" : "找不到會員" ,
"invite.err.notLoggedIn" : "尚未登入" ,
"invite.err.needAdmin" : "需要管理員權限" ,
"invite.err.memberNotFound" : "找不到島民" ,
"invite.err.selfParent" : "不能把自己設為邀請人" ,
"invite.err.parentNotFound" : "找不到指定的邀請人" ,
"invite.err.cycle" : "不可掛到自己邀請鏈的下層(會形成環)" ,
"invite.err.repoMissing" : "邀請資料層尚未載入,請重新整理頁面" ,
"invite.err.alreadyBound" : "你已有邀請人,無法再補填" ,
"invite.err.codeRequired" : "請輸入邀請碼" ,
"invite.err.codeNotFound" : "找不到此邀請碼" ,
"invite.err.codeSelf" : "不能填自己的邀請碼" ,
2026-07-10 05:10:31 +00:00
"admin.users.title" : "島民管理" ,
2026-07-13 03:18:08 +00:00
"admin.users.desc" : "管理島民帳號、權限、方案與不擋額度。" ,
2026-07-10 05:10:31 +00:00
"admin.users.needAdmin" : "需要管理員權限" ,
"admin.users.list" : "島民列表 · {n}" ,
"admin.users.detail" : "島民詳情" ,
"admin.users.pick" : "選擇島民" ,
"admin.users.search" : "搜尋名稱 / uid" ,
"admin.users.searchPh" : "島民名稱、Email 或 uid" ,
"admin.users.create" : "新增島民" ,
"admin.users.suspend" : "停權" ,
"admin.users.unsuspend" : "復權" ,
"admin.users.suspended" : "已停權" ,
"admin.users.active" : "正常" ,
"crew.title" : "帳號" ,
"crew.tab.accounts" : "帳號" ,
"crew.tab.personas" : "人設" ,
"crew.connect" : "連接帳號" ,
2026-07-13 01:15:30 +00:00
"crew.connecting" : "連線中…" ,
"crew.tokenRenewHint" : "Token 由背景任務自動延長(約第 30 天),可在「任務」查看;無需手動刷新。" ,
2026-07-10 05:10:31 +00:00
"crew.empty" : "尚無帳號" ,
2026-07-28 06:33:51 +00:00
"crew.loadFail" : "載入帳號失敗" ,
2026-07-10 05:10:31 +00:00
"crew.unusable" : "不可用" ,
2026-07-13 01:15:30 +00:00
"crew.expires" : "到期 {time}" ,
"crew.lastRefresh" : "上次延長 {time}" ,
"crew.refreshSession" : "延長 token" ,
"crew.refreshSessionHint" : "用已存授權換新 token, 不開授權頁; 失敗請「連接帳號」重授權" ,
"crew.session.ok" : "token 有效" ,
2026-07-10 05:10:31 +00:00
"crew.session.soon" : "即將到期" ,
2026-07-13 01:15:30 +00:00
"crew.session.expired" : "token 已過期" ,
"crew.session.unknown" : "未記錄到期" ,
"crew.connection.connected" : "已連線" ,
"crew.connection.error" : "異常" ,
"crew.connection.disconnected" : "已斷開" ,
"crew.connection.unknown" : "未知" ,
"crew.health.needsReconnect" : "需重新連帳" ,
"crew.health.needsReconnectHint" : "token 無法使用,請按「連接帳號」重新授權(不是延長 token) " ,
"crew.health.disconnectedHint" : "已解除綁定" ,
"crew.health.expiredHint" : "請延長 token 或重新連帳" ,
2026-07-23 05:56:42 +00:00
"crew.opHealthScore" : "操作 {n}" ,
2026-07-13 01:15:30 +00:00
"crew.msg.refreshed" : "@{user} 已用現有授權延長 token( 約 60 天)" ,
"crew.msg.refreshedAll" : "已用現有授權延長 {n} 個帳號 token" ,
"crew.msg.refreshFail" : "延長失敗( token 失效時請重新「連接帳號」)" ,
"crew.msg.oauthOk" : "Threads 帳號已連線;已排程約 30 天後自動延長 token( 見任務) " ,
"crew.msg.oauthFail" : "OAuth 連線失敗" ,
2026-07-13 03:18:08 +00:00
"crew.msg.oauthUrlFail" : "無法取得授權網址,請稍後再試或檢查平台 Threads 設定" ,
"crew.msg.deleted" : "已移除 @{user}" ,
2026-07-10 05:10:31 +00:00
"crew.confirmDelete" : "確定刪除帳號 @{user}? \n刪除後無法再選為 lead / cast。" ,
"today.findTopic" : "找話題" ,
2026-07-13 03:18:08 +00:00
"today.refreshTopics" : "刷新話題" ,
"today.reload" : "重新整理" ,
"today.loadFail" : "無法載入今日資料" ,
"today.trendsFail" : "無法刷新話題(可能額度不足或搜尋未設定)" ,
2026-07-23 05:56:42 +00:00
"today.trendsUpdated" : "已更新 {n} 個話題" ,
2026-07-13 03:18:08 +00:00
"today.syncPosts" : "同步已發文" ,
"today.syncPostsFail" : "同步貼文失敗" ,
"today.needAccount" : "請先連接 Threads 帳號" ,
2026-07-23 05:56:42 +00:00
"today.outcome.title" : "本週成果" ,
"today.outcome.reach" : "觸達" ,
"today.outcome.conversations" : "對話" ,
"today.outcome.follows" : "追蹤" ,
"today.outcome.followsHint" : "可能相關,尚無強訊號" ,
"today.outcome.followsConfirmedHint" : "/確定 {n}" ,
"today.outcome.conversions" : "成交" ,
"today.outcome.emptyHint" : "本週還沒有海巡外展成果,去海巡試試身手?" ,
"today.checkup.empty" : "尚未產生本週健檢,將於下週一(依你的時區)自動產生。" ,
"today.checkup.prefix" : "健檢:" ,
2026-07-10 05:10:31 +00:00
"today.pendingReplies" : "待回覆" ,
"today.pendingRepliesN" : "待回覆 · {n}" ,
2026-07-13 03:18:08 +00:00
"today.newThread" : "寫一則" ,
2026-07-10 05:10:31 +00:00
"today.metricsAria" : "今日數值" ,
"today.metric.pending" : "待回" ,
"today.metric.pendingHint" : "海巡佇列" ,
"today.metric.doneGoal" : "已回/目標" ,
2026-07-13 03:18:08 +00:00
"today.metric.doneGoalHint" : "今日海巡完成數/目標(海巡標記已發會累加)" ,
2026-07-10 05:10:31 +00:00
"today.metric.sentToday" : "今日已發" ,
"today.metric.running" : "進行中 {n}" ,
"today.metric.sentDone" : "完成的發送" ,
"today.metric.failed" : "發送異常" ,
"today.metric.needAction" : "需處理" ,
"today.metric.ok" : "正常" ,
2026-07-13 03:18:08 +00:00
"today.metric.mentions" : "提及" ,
"today.metric.mentionsHint" : "待回提及" ,
"today.pending.title" : "海巡待回 · {n}" ,
"today.pending.empty" : "目前沒有待回,去海巡掃一輪" ,
2026-07-10 05:10:31 +00:00
"today.goScout" : "去海巡" ,
"today.pending.more" : "還有 {n} 則 →" ,
"today.pending.handle" : "海巡處理" ,
"today.pending.start" : "開始處理" ,
"today.topics.title" : "找話題" ,
2026-07-13 03:18:08 +00:00
"today.topics.empty" : "還沒有話題,按「刷新話題」抓一輪" ,
"today.goStudio" : "去靈感" ,
2026-07-10 05:10:31 +00:00
"today.heat" : "熱度 {n}" ,
"today.topicAngle" : "可當開場角度" ,
"today.moreInspire" : "更多靈感" ,
2026-07-13 03:18:08 +00:00
"today.useTopic" : "用話題發想" ,
2026-07-10 05:10:31 +00:00
"today.outbox.title" : "今日發送" ,
"today.outbox.empty" : "還沒有今日發送。可先" ,
"today.outbox.emptyMid" : ",完成後會出現在" ,
"today.outbox.emptyEnd" : "。" ,
"today.outbox.summary" : "已完成 {sent} · 進行中 {running} · 異常 {failed}" ,
"today.badge.failed" : "失敗" ,
"today.badge.scheduling" : "排程" ,
"today.badge.sending" : "發送中" ,
2026-07-13 03:18:08 +00:00
"today.badge.drafted" : "已草稿" ,
2026-07-10 05:10:31 +00:00
"today.openOutbox" : "開啟發送" ,
"today.accounts.title" : "帳號成效" ,
2026-07-13 03:18:08 +00:00
"today.accounts.empty" : "尚無成效資料,可先同步已發文" ,
2026-07-10 05:10:31 +00:00
"today.postsCount" : "{n} 則貼文" ,
"today.views" : "瀏覽" ,
"today.likes" : "讚" ,
"today.repliesShort" : "回" ,
"today.fullInsights" : "完整成效 · 月比圖" ,
"today.viewPosts" : "看已發文" ,
"today.manageAccounts" : "管理帳號" ,
2026-07-13 03:18:08 +00:00
2026-07-10 05:10:31 +00:00
"outbox.title" : "發送" ,
"outbox.tabsAria" : "發送分頁" ,
"outbox.tab.active" : "進行中" ,
"outbox.tab.history" : "歷史" ,
"outbox.empty" : "尚無發送" ,
"outbox.activeEmpty" : "進行中是空的" ,
"outbox.historyEmpty" : "尚無歷史" ,
"outbox.historyN" : "歷史({n}) " ,
"outbox.backActive" : "回進行中({n}) " ,
"outbox.progress" : "進度 {progress}" ,
"outbox.detail" : "詳情" ,
"outbox.deleting" : "刪除中…" ,
"outbox.confirmDelete" : "刪除發送項目「{title}」?\n無法復原。" ,
"outbox.deleted" : "已刪除「{title}」" ,
"outbox.deleteFail" : "刪除失敗" ,
2026-07-15 15:23:59 +00:00
"outbox.loadFail" : "載入發送列表失敗" ,
2026-07-10 05:10:31 +00:00
"outbox.status.scheduling" : "排程中" ,
"outbox.status.active" : "發送中" ,
"outbox.status.completed" : "已完成" ,
"outbox.status.partial_failed" : "部分失敗" ,
"outbox.status.cancelled" : "已取消" ,
"outbox.detail.missingId" : "缺少 id" ,
"outbox.detail.notFound" : "找不到發送" ,
2026-07-28 06:33:51 +00:00
"outbox.detail.loadFail" : "載入發送內容失敗" ,
2026-07-13 01:15:30 +00:00
"outbox.detail.loading" : "載入中…" ,
"outbox.detail.sendingHint" : "正在發到 Threads( 通常 10~ 30 秒),頁面會自動更新…" ,
"outbox.detail.doneHint" : "已成功發到 Threads。" ,
2026-07-10 05:10:31 +00:00
"outbox.detail.markAllOk" : "標記全部成功" ,
"outbox.detail.markRootFail" : "標記主貼失敗" ,
"outbox.detail.processing" : "處理中…" ,
"outbox.detail.delete" : "刪除這筆" ,
"outbox.detail.back" : "返回列表" ,
"outbox.detail.root" : "主貼" ,
"outbox.detail.replyN" : "回覆 {n}" ,
"outbox.detail.retry" : "重試" ,
"outbox.detail.opFail" : "操作失敗" ,
2026-07-13 01:15:30 +00:00
"outbox.step.published" : "已發佈" ,
"outbox.step.failed" : "失敗" ,
"outbox.step.publishing" : "發佈中…" ,
"outbox.step.scheduled" : "排程中" ,
"outbox.step.blocked" : "已阻擋" ,
2026-07-10 05:10:31 +00:00
"studio.title" : "創作" ,
"studio.account" : "帳號" ,
"studio.persona" : "人設" ,
"studio.personaReady" : "人設 ready" ,
"studio.personaNotReady" : "人設未就緒" ,
"studio.tab.posts" : "我的貼文" ,
"studio.tab.mentions" : "提及 @" ,
"studio.tab.compose" : "寫一則" ,
"studio.tab.plays" : "互回方案" ,
"studio.tab.inspire" : "靈感" ,
"studio.tab.insights" : "成效" ,
"mentions.hint" : "誰 @ 你。待回 {n} 則。每則可改帳號/人設(預設用頂部)。" ,
"mentions.scoutLink" : "海巡外展" ,
"mentions.empty" : "尚無提及" ,
2026-07-13 01:15:30 +00:00
"mentions.emptyHint" : "按「從 Threads 同步」拉取別人 @ 你的貼文/回覆/引用。若權限不足請到設定重新連帳。" ,
"mentions.needAccount" : "請先在頂部選 Threads 帳號" ,
"mentions.sync" : "從 Threads 同步" ,
"mentions.syncing" : "同步中…" ,
"mentions.syncDone" : "已同步 {n} 則提及" ,
"mentions.syncFail" : "同步失敗:請確認已連帳,且 OAuth 含 threads_manage_mentions( 可能需重新連帳) " ,
"mentions.openThread" : "開原文" ,
2026-07-10 05:10:31 +00:00
"mentions.status.pending" : "待回" ,
"mentions.status.replied" : "已回" ,
"mentions.status.skipped" : "略過" ,
"mentions.reply" : "回覆" ,
"mentions.skip" : "略過" ,
"mentions.draftLabel" : "回覆草稿" ,
"mentions.repliedPrefix" : "已回:{text}" ,
"mentions.needPersona" : "請選 ready 人設再 AI 產文" ,
"mentions.fail" : "失敗" ,
2026-07-15 15:23:59 +00:00
"mentions.marked" : "已將這則提及標記為已回覆" ,
"mentions.markReplied" : "標記為已回覆" ,
"mentions.markingReplied" : "標記中…" ,
2026-07-10 05:10:31 +00:00
"mentions.withImages" : " · 附圖 {n}" ,
2026-07-13 01:15:30 +00:00
"compose.hint" : "純發文:寫正文後送出 Outbox( 非串場) 。互回請用" ,
2026-07-10 05:10:31 +00:00
"compose.hintEnd" : "。" ,
"compose.playsLink" : "串場" ,
"compose.personaOff" : "人設未 ready: 仿寫/ 分析等 AI 工具停用。" ,
"compose.title" : "標題(選填)" ,
"compose.titlePh" : "方便在 Outbox 辨識" ,
"compose.body" : "正文" ,
"compose.bodyPh" : "寫下這則貼文…" ,
2026-07-20 06:33:14 +00:00
"compose.bodyCount" : "{n} 字" ,
"compose.bodyLongWarning" : "完整草稿已保留,但可能超過 Threads 單則可發布長度" ,
2026-07-13 01:15:30 +00:00
"compose.topicTag" : "話題標籤( Threads tag) " ,
"compose.topicTagPh" : "例如 寵物展(可不加 #) " ,
"compose.topicTagHint" : "Threads 話題標籤, 每則最多一個; 1~ 50 字,勿含 . 或 &。也可在正文寫 #標籤。" ,
2026-07-10 05:10:31 +00:00
"compose.tool.mimic" : "仿寫" ,
"compose.tool.viral" : "爆紅分析" ,
"compose.tool.research" : "上網補資料" ,
"compose.tool.image" : "產圖" ,
"compose.mimic.title" : "仿寫別人貼文" ,
"compose.mimic.source" : "參考全文" ,
"compose.mimic.sourcePh" : "貼上想仿寫的貼文…" ,
2026-07-20 06:33:14 +00:00
"compose.mimic.direction" : "新主題/新角度(可留空)" ,
"compose.mimic.directionPh" : "例如:改寫成『功能越少,產品反而越好用』的觀點…" ,
"compose.mimic.directionHint" : "這是新貼文真正要談的內容。留空時 AI 會從參考文延伸不同角度,不會照原文換句話說。" ,
2026-07-13 01:15:30 +00:00
"compose.mimic.structureNotes" : "結構分析(會帶進仿寫)" ,
"compose.mimic.structureNotesPh" : "可從「我的貼文 → 分析結構」帶入;或手動貼鉤子/結構/可複製點…" ,
2026-07-20 06:33:14 +00:00
"compose.mimic.structureNotesHint" : "只借用敘事骨架、轉折與情緒曲線;內容依新方向重寫,語氣使用目前選擇的人設。" ,
2026-07-13 01:15:30 +00:00
"compose.mimic.broughtAnalysis" : "已帶入參考貼文 + 結構分析,可直接仿寫或再改備註" ,
"compose.mimic.broughtSource" : "已帶入參考貼文(尚未有結構分析;可先回我的貼文按「分析結構」)" ,
"compose.mimic.running" : "仿寫中(背景任務,可離開本頁)…" ,
2026-07-10 05:10:31 +00:00
"compose.mimic.run" : "依人設仿寫到正文" ,
2026-07-13 01:15:30 +00:00
"compose.mimic.queued" : "已排程仿寫任務,完成後會自動填入正文" ,
2026-07-10 05:10:31 +00:00
"compose.mimic.done" : "仿寫完成,可再改" ,
2026-07-13 01:15:30 +00:00
"compose.mimic.doneWithStructure" : "仿寫完成(已套用結構分析骨架),可再改" ,
"compose.mimic.jobFail" : "仿寫任務失敗:{err}" ,
2026-07-10 05:10:31 +00:00
"compose.viral.title" : "爆紅分析" ,
"compose.viral.hint" : "分析參考文或目前正文的鉤子/結構/可複製點。" ,
"compose.viral.source" : "分析對象(可空=用正文)" ,
"compose.viral.running" : "分析中…" ,
"compose.viral.run" : "開始分析" ,
"compose.viral.result" : "分析結果" ,
"compose.viral.done" : "爆紅分析完成" ,
"compose.viral.needText" : "請貼參考文或先寫正文" ,
"compose.research.title" : "上網補專業資料" ,
"compose.research.q" : "關鍵字" ,
"compose.research.qPh" : "例如:無香洗劑 敏感肌" ,
"compose.research.running" : "搜尋中…" ,
"compose.research.insert" : "插入勾選內容到正文" ,
"compose.research.inserted" : "已插入 {n} 條補充" ,
"compose.image.title" : "產圖" ,
"compose.image.prompt" : "畫面描述" ,
"compose.image.promptPh" : "可空=從正文摘要" ,
"compose.image.running" : "產圖中…" ,
"compose.image.run" : "產生圖片" ,
"compose.image.done" : "已產圖" ,
2026-07-10 12:54:45 +00:00
"compose.scheduleAt" : "預計發送時間" ,
2026-07-13 01:15:30 +00:00
"compose.scheduleHint" : "到點後由 Outbox 依序送出;不可早於現在。" ,
"compose.scheduleHintNow" : "立即發送(到點=現在,送出時以當下為準)。" ,
"compose.schedulePast" : "預計發送時間已過期,請改為現在或未來時間。" ,
2026-07-10 12:54:45 +00:00
"compose.scheduleNow" : "設為現在" ,
2026-07-10 05:10:31 +00:00
"compose.publish" : "送出到 Outbox" ,
"compose.publishing" : "送出中…" ,
2026-07-13 01:15:30 +00:00
"compose.uploadingImages" : "上傳圖片 {n}/{total}…" ,
"compose.uploadImageFail" : "圖片上傳失敗, 請重試或換較小的圖( ≤5MB) " ,
"compose.waitImageUpload" : "圖片還在上傳,請稍候再送出。" ,
"compose.waitImageUploadBtn" : "圖片上傳中…" ,
"compose.imageUploadNeedRetry" : "有圖片上傳失敗,請點縮圖上的重試後再送出。" ,
2026-07-10 05:10:31 +00:00
"compose.publishFail" : "送出失敗" ,
"compose.fail" : "失敗" ,
"compose.attachN" : "附圖 {n}" ,
"compose.personaStatus" : "人設:{status}" ,
"compose.ready" : "ready" ,
"compose.notReady" : "未就緒" ,
"posts.sync" : "重新同步 Threads" ,
"posts.syncing" : "同步中…" ,
"posts.syncedAt" : "同步 {time}" ,
"posts.notSynced" : "未同步" ,
2026-07-13 01:15:30 +00:00
"posts.syncDone" : "已從 Threads 同步 {n} 則貼文(含成效與留言)" ,
"posts.syncFail" : "同步失敗,請確認已連帳且權限足夠(可能需重新 OAuth) " ,
"posts.loadingReplies" : "載入留言中…" ,
"posts.loadRepliesFail" : "載入留言失敗" ,
2026-07-10 05:10:31 +00:00
"posts.empty" : "尚無貼文" ,
"posts.openThreads" : "開 Threads" ,
"posts.insight" : "分析洞察:{text}" ,
"posts.review" : "覆盤:{text}" ,
"posts.formulaResult" : "結構分析結果" ,
2026-07-13 01:15:30 +00:00
"posts.analyzedBadge" : "已分析" ,
"posts.noText" : "(此則無文字/純媒體)" ,
2026-07-10 05:10:31 +00:00
"posts.collapseReplies" : "收合留言" ,
"posts.repliesBtn" : "留言({total})· 未回 {pending}" ,
"posts.replyRoot" : "回主貼" ,
"posts.analyzing" : "分析中…" ,
"posts.reanalyze" : "重新分析結構" ,
"posts.analyze" : "分析結構" ,
"posts.mimicThis" : "仿寫這則" ,
"posts.rootDraft" : "回主貼草稿" ,
"posts.filter.pending" : "未回覆({n}) " ,
"posts.filter.replied" : "已回覆({n}) " ,
"posts.filter.all" : "全部({n}) " ,
"posts.noPending" : "沒有未回覆留言" ,
"posts.noReplied" : "還沒有已回覆留言" ,
"posts.noReplies" : "尚無留言" ,
"posts.status.pending" : "未回覆" ,
"posts.status.replied" : "已回覆" ,
"posts.likesN" : "讚 {n}" ,
"posts.childCount" : "{n} 則子留言" ,
"posts.mine" : "我方" ,
"posts.replyThis" : "回這則" ,
"posts.replyAgain" : "再回一則" ,
"posts.replyTo" : "回 @{user}" ,
"posts.replyAgainTo" : "再回 @{user}" ,
"posts.needPersona" : "請先選 ready 人設再 AI 產文" ,
"posts.genFail" : "生成失敗" ,
"posts.needText" : "請先產生或輸入回覆" ,
2026-07-13 01:15:30 +00:00
"posts.needAccount" : "請選擇要送出的 Threads 帳號" ,
"posts.sending" : "送出到 Threads 中…" ,
"posts.sent" : "已用 @{user} 發到 Threads" ,
2026-07-10 05:10:31 +00:00
"posts.sentImages" : "(附圖 {n}) " ,
"posts.accountFallback" : "帳號" ,
"posts.sendFail" : "發送失敗" ,
"posts.analyzeDone" : "結構分析完成(手動觸發)" ,
"posts.analyzeFail" : "分析失敗" ,
"wizard.newTitle" : "編互回劇本" ,
"wizard.editTitle" : "編輯互回劇本" ,
"wizard.prev" : "上一步" ,
"wizard.next" : "下一步" ,
"wizard.err.topic" : "請填主題" ,
"wizard.err.lead" : "請選擇主帳號" ,
"wizard.err.leadUnusable" : "主帳號不可用" ,
"wizard.submitFail" : "提交失敗" ,
"wizard.unnamedPlay" : "未命名串場" ,
"wizard.step.topic" : "聊什麼" ,
"wizard.step.crew" : "誰出場" ,
"wizard.step.script" : "誰說什麼" ,
"wizard.step.preview" : "預覽" ,
"wizard.step.schedule" : "何時發" ,
"wizard.step.submit" : "送出" ,
"wizard.stepperAria" : "wizard 步驟" ,
"wizard.topic.title" : "1. 這串要聊什麼" ,
"wizard.topic.name" : "標題(可選)" ,
"wizard.topic.namePh" : "例如:週末咖啡" ,
"wizard.topic.topic" : "主題一句話" ,
"wizard.topic.topicPh" : "這串文想聊什麼?" ,
"wizard.topic.aiView" : "AI 視角" ,
"wizard.topic.personaNotReady" : "人設未就緒" ,
"wizard.topic.quickFill" : "快速填入" ,
"wizard.topic.sampleTitle" : "週末咖啡話題" ,
"wizard.topic.sampleTopic" : "週末想找間不踩雷的咖啡店,插座要多、能坐久。" ,
"wizard.crew.title" : "2. 出場" ,
"wizard.crew.lead" : "主帳" ,
"wizard.crew.noUsable" : "尚無可用帳號" ,
"wizard.crew.unusable" : "不可用" ,
"wizard.crew.cast" : "配角" ,
"wizard.script.title" : "3. 台詞" ,
"wizard.script.persona" : "人設" ,
"wizard.script.personaNotReady" : "人設未就緒" ,
"wizard.script.root" : "主貼" ,
"wizard.script.replyN" : "回覆 {n}" ,
"wizard.script.generating" : "生成中…" ,
"wizard.script.ai" : "AI 產文" ,
"wizard.script.account" : "帳號:{name}" ,
"wizard.script.noLead" : "(未選 lead) " ,
"wizard.script.speaker" : "發言帳號" ,
"wizard.script.leadTag" : "( lead) " ,
"wizard.script.text" : "文案" ,
"wizard.script.rootPh" : "主貼內容…" ,
"wizard.script.replyPh" : "回覆內容…" ,
"wizard.script.addReply" : "新增回覆步驟" ,
"wizard.preview.title" : "4. 預覽這段對話" ,
"wizard.preview.unknown" : "未知" ,
"wizard.preview.unknownAccount" : "未知帳號" ,
"wizard.preview.root" : "主貼" ,
"wizard.preview.leadTalk" : "lead 接話" ,
"wizard.preview.empty" : "(空白)" ,
"wizard.schedule.title" : "5. 何時發出去" ,
"wizard.schedule.start" : "第一則(主貼)時間" ,
"wizard.schedule.interval" : "回覆間隔(分鐘)" ,
2026-07-13 01:15:30 +00:00
"wizard.schedule.intervalHint" : "相對上一步;送出後後端會加隨機抖動,避免節奏太精準" ,
2026-07-10 05:10:31 +00:00
"wizard.submit.title" : "6. 送出排程" ,
"wizard.submit.body" : "確認後會把「{title}」這串互回(共 {n} 步)送進 Outbox, 依序用各帳號發出。" ,
"wizard.submit.unnamed" : "未命名" ,
"wizard.submit.root" : "主貼" ,
"wizard.submit.replyN" : "回覆 {n}" ,
"wizard.submit.submitting" : "提交中…" ,
"wizard.submit.run" : "提交到 Outbox" ,
"reply.account" : "用哪個帳號回" ,
"reply.persona" : "用人設" ,
"reply.notReady" : "此人設未 ready, 無法 AI 產文(仍可手打後發送)。" ,
"reply.draft" : "回覆草稿" ,
"reply.attach" : "附圖" ,
"reply.generating" : "生成中…" ,
"reply.ai" : "AI 產文" ,
"reply.sending" : "發送中…" ,
"reply.send" : "發送" ,
"image.attach" : "附圖" ,
"image.attachFail" : "附圖失敗" ,
"image.attachedAria" : "已附圖片" ,
"image.alt" : "附圖" ,
"image.named" : "附圖 {n}" ,
"image.remove" : "移除圖片" ,
"image.full" : "已滿 {max} 張" ,
"image.more" : "再附圖({n}/{max}) " ,
2026-07-13 01:15:30 +00:00
"image.uploading" : "上傳中" ,
"image.uploadingN" : "正在上傳 {n} 張圖…" ,
"image.uploadFail" : "上傳失敗" ,
"image.uploadBadUrl" : "上傳回應無效" ,
"image.retry" : "重試" ,
2026-07-10 05:10:31 +00:00
"metrics.aria" : "貼文成效" ,
"metrics.like" : "讚" ,
"metrics.reply" : "回覆" ,
"metrics.repost" : "轉發" ,
"metrics.quote" : "引用" ,
"metrics.view" : "瀏覽" ,
"metrics.share" : "分享" ,
"metrics.type.quote" : "引用貼" ,
"metrics.type.reply" : "回覆貼" ,
"metrics.type.image" : "圖片" ,
"metrics.type.video" : "影片" ,
"metrics.type.carousel" : "輪播" ,
"metrics.type.repost" : "轉發" ,
"metrics.type.text" : "文字" ,
"metrics.type.post" : "貼文" ,
"jobs.title" : "任務" ,
2026-07-13 03:18:08 +00:00
"jobs.desc" : "背景任務分三區:執行中、定期排程、歷史。每頁可調筆數,不會一次拉完全部。" ,
2026-07-13 01:15:30 +00:00
"jobs.startDemo" : "產生測試任務" ,
"jobs.demoHint" : "需 worker 執行;狀態會自動輪詢更新。" ,
"jobs.demoLabel" : "Demo 測試任務" ,
"jobs.demoCreated" : "已建立測試任務 {id}…,等待 worker 領取" ,
"jobs.demoFail" : "無法建立測試任務" ,
"jobs.template.tokenRenew" : "Threads Token 定期延長(約每 30 天)" ,
"jobs.template.tokenRenewCadence" : "約每 30 天自動執行一次 · 無需手動操作" ,
"jobs.template.tokenRenewBadge" : "定期 · 每 30 天" ,
"jobs.template.personaAnalyzeAccount" : "人設分析 · 爬取公開貼文" ,
"jobs.template.personaAnalyzeText" : "人設分析 · 文字來源" ,
"jobs.template.composeMimic" : "仿寫貼文" ,
"jobs.template.playGenerateScript" : "劇本一次產全文" ,
"jobs.template.unknown" : "其他任務" ,
"jobs.stripMore" : "還有 {n} 個進行中…" ,
"jobs.nextRun" : "下次執行:{time}" ,
"jobs.status.pending" : "待處理" ,
"jobs.status.queued" : "已排程" ,
"jobs.status.running" : "執行中" ,
"jobs.status.succeeded" : "已完成" ,
"jobs.status.failed" : "失敗" ,
"jobs.status.cancelled" : "已取消" ,
"jobs.status.cancel_requested" : "取消中" ,
"jobs.loadFail" : "無法載入任務列表" ,
2026-07-10 05:10:31 +00:00
"jobs.empty" : "尚無任務" ,
2026-07-13 03:18:08 +00:00
"jobs.empty.active" : "目前沒有執行中或待領取的任務" ,
"jobs.empty.recurring" : "尚無定期/遠期排程任務" ,
"jobs.empty.history" : "尚無歷史紀錄(已完成/失敗/取消)" ,
"jobs.tabsAria" : "任務分類" ,
"jobs.tab.active" : "執行中" ,
"jobs.tab.recurring" : "定期任務" ,
"jobs.tab.history" : "歷史已執行" ,
"jobs.recurringHint" : "尚未到期的排程(例如 Token 約 30 天延長)。到期後會出現在「執行中」。" ,
2026-07-10 05:10:31 +00:00
"jobs.total" : "共 {n} 筆" ,
"jobs.showing" : " · 顯示前 {n}" ,
"jobs.detail" : "詳情" ,
"jobs.loadMore" : "載入更多(還有 {n}) " ,
"jobs.notFound" : "找不到任務" ,
2026-07-28 06:33:51 +00:00
"jobs.detailLoadFail" : "載入任務失敗" ,
2026-07-10 05:10:31 +00:00
"jobs.progress" : "進度 {n}%" ,
"jobs.updated" : "更新 {time}" ,
"jobs.backList" : "返回列表" ,
2026-07-13 01:15:30 +00:00
"jobs.backCompose" : "回寫一則" ,
"jobs.mimicApplyCompose" : "套用到寫一則" ,
"jobs.mimicApplyHint" : "仿寫已完成。按下方按鈕回到單篇發文,正文會自動帶入。" ,
"jobs.mimicNoResult" : "找不到仿寫結果,請再跑一次仿寫" ,
"jobs.mimicApplyFail" : "套用失敗" ,
"jobs.delete" : "刪除" ,
"jobs.deleteConfirm" : "確定刪除「{name}」?此操作無法復原。" ,
"jobs.deleted" : "已刪除任務" ,
"jobs.deleteFail" : "無法刪除任務" ,
"jobs.deleteRunningHint" : "執行中的任務無法刪除,請稍候完成。" ,
"jobs.retentionHint" : "終態任務約保留 2 天後自動清除" ,
2026-07-10 05:10:31 +00:00
"plans.title" : "變更方案" ,
"plans.current" : "目前方案" ,
"plans.perMonth" : "/月" ,
"plans.monthlyCredits" : "每月 {n} 點" ,
"plans.usageLink" : "用量" ,
"plans.inUse" : "使用中" ,
"plans.recommended" : "推薦" ,
"plans.creditsPerMonth" : "每月 {n} 點" ,
2026-07-15 15:23:59 +00:00
"plans.manage" : "管理訂閱" ,
"plans.loadFail" : "無法載入訂閱方案" ,
2026-07-10 05:10:31 +00:00
"plan.cta.current" : "目前方案" ,
"plan.cta.upgrade" : "升級" ,
"plan.cta.downgrade" : "降級" ,
"plan.cta.switch" : "切換" ,
2026-07-13 03:18:08 +00:00
"plan.free.headline" : "夠用試用,體驗完整流程" ,
"plan.free.bullet1" : "每月 {n} 點(約 2~ 3 週輕度日常)" ,
"plan.free.bullet2" : "完整功能:創作、海巡、發送、生圖" ,
"plan.free.bullet3" : "用得出價值再升級 Starter" ,
"plan.free.bullet4" : "平台忙碌時可改填自己的 Key" ,
2026-07-10 05:10:31 +00:00
"plan.free.right1" : "可使用完整功能:帳號、創作、海巡、發送、任務與靈感。" ,
2026-07-13 03:18:08 +00:00
"plan.free.right2" : "點數夠你真實試跑文案、搜尋與幾次生圖,不是空殼 demo。" ,
"plan.free.right3" : "達上限後升級 Starter 繼續;或設定自備 Key( BYOK) 不占平台點。" ,
2026-07-10 05:10:31 +00:00
"plan.free.quota1" : "每月配給 {n} 點。" ,
2026-07-15 15:23:59 +00:00
"plan.free.note1" : "Free 使用者無需付款;付費使用者請由帳務入口管理取消。" ,
"plan.free.note2" : "取消付費訂閱後,方案依帳務入口顯示的日期切換。" ,
2026-07-10 05:10:31 +00:00
"plan.starter.headline" : "小團隊日常發文與海巡" ,
2026-07-13 03:18:08 +00:00
"plan.starter.bullet1" : "每月 {n} 點(約 5× Free) " ,
2026-07-10 05:10:31 +00:00
"plan.starter.bullet2" : "穩定發文、回覆、海巡" ,
2026-07-13 03:18:08 +00:00
"plan.starter.bullet3" : "適合 1~ 3 人節奏 · 付費主力" ,
2026-07-10 05:10:31 +00:00
"plan.starter.bullet4" : "付款成功立即生效" ,
"plan.starter.right1" : "付款成功後本帳改為 Starter, 當月依新額度計算。" ,
"plan.starter.right2" : "點數支撐固定發文、回覆草稿與定期海巡。" ,
2026-07-13 03:18:08 +00:00
"plan.starter.right3" : "功能與 Free 相同,差在能用多久;日常節奏建議由此開始。" ,
2026-07-10 05:10:31 +00:00
"plan.starter.quota1" : "每月 {n} 點 · {price}。" ,
"plan.starter.note1" : "需付款成功才變更方案。" ,
"plan.starter.note2" : "自然月重置,未用完點數不累積至下月。" ,
"plan.pro.headline" : "多帳、重度 AI 與研究" ,
2026-07-13 03:18:08 +00:00
"plan.pro.bullet1" : "每月 {n} 點(約 3× Starter) " ,
"plan.pro.bullet2" : "高頻文案/研究/生圖 · 重度天花板" ,
2026-07-10 05:10:31 +00:00
"plan.pro.bullet3" : "適合代理與多品牌" ,
"plan.pro.bullet4" : "付款成功立即生效" ,
"plan.pro.right1" : "付款成功後本帳改為 Pro, 當月依 Pro 額度計算。" ,
"plan.pro.right2" : "適合多帳、大量回覆與深研究,減少中途額度見底。" ,
2026-07-13 03:18:08 +00:00
"plan.pro.right3" : "功能相同;買的是容量。再高可改 BYOK, 平台限流時也不中斷。" ,
2026-07-10 05:10:31 +00:00
"plan.pro.quota1" : "每月 {n} 點 · {price}。" ,
"plan.pro.note1" : "付款失敗不會改方案。" ,
"plan.pro.note2" : "付款完成後可於帳務紀錄查詢收據。" ,
2026-07-13 03:18:08 +00:00
"plan.quota2" : "分項點數:文案 {copy}(約 {copyCalls} 次)、研究 {research}(約 {researchCalls} 次)、搜尋 {search}(約 {searchCalls} 次)、生圖 {image}(約 {imageCalls} 張)。" ,
"plan.softCapsLine" : "分項點數:文案 {copy} · 研究 {research} · 搜尋 {search} · 生圖 {image}" ,
"plan.approxCallsLine" : "約 {copyCalls} 次文案 · {researchCalls} 次研究 · {searchCalls} 次搜尋 · {imageCalls} 張圖" ,
2026-07-10 05:10:31 +00:00
"checkout.title" : "確認方案" ,
"checkout.pickFirst" : "請先選擇方案。" ,
"checkout.viewPlans" : "看方案" ,
"checkout.fail" : "無法完成" ,
"checkout.confirmFree" : "確認切換至 Free" ,
"checkout.payAndAction" : "{action}並付款 {price}" ,
"checkout.subscribe" : "訂閱" ,
"checkout.perMonth" : "/月" ,
"checkout.monthlyCredits" : "每月 {n} 點" ,
"checkout.youGet" : "你會得到" ,
"checkout.quota" : "額度" ,
"checkout.notes" : "注意" ,
"checkout.amountDue" : "應付金額" ,
"checkout.billedMonthly" : "{name} · 按月計費" ,
"checkout.already" : "已是此方案" ,
"checkout.processing" : "處理中…" ,
"checkout.currentPlan" : "目前方案" ,
"checkout.pickOther" : "改選其他方案" ,
"checkout.cancel" : "取消" ,
2026-07-15 15:23:59 +00:00
"checkout.invalidUrl" : "付款服務回傳了不安全的網址,未進行跳轉。" ,
"checkout.redirecting" : "正在前往 Stripe 安全付款頁面…" ,
"checkout.redirectingPortal" : "正在前往 Stripe 訂閱管理頁面…" ,
"checkout.redirectFailed" : "無法開啟 Stripe 頁面。請檢查瀏覽器或網路設定後再試一次。" ,
"checkout.networkError" : "無法連線至帳務服務。請檢查網路後再試一次。" ,
"checkout.unavailable" : "帳務服務目前尚未啟用或暫時無法使用,請稍後再試。" ,
"checkout.sessionExpired" : "登入狀態已失效,請重新登入後再試。" ,
"checkout.portalUnavailable" : "目前沒有可管理的 Stripe 訂閱。請先選擇付費方案。" ,
"checkout.verifying" : "正在確認付款與方案生效狀態…" ,
"checkout.pollFail" : "無法查詢付款狀態,請重試。" ,
"checkout.missingId" : "缺少結帳編號,無法確認付款結果。" ,
"checkout.terminalFail" : "結帳未完成({status})。你可以重新選擇方案再試一次。" ,
"checkout.timeout" : "付款可能仍在處理中,但方案尚未於 30 秒內生效。請重試查詢;請勿重複付款。" ,
"checkout.retry" : "重試查詢" ,
"checkout.canceledTitle" : "已取消結帳" ,
"checkout.canceledBody" : "未變更方案,也未執行任何扣款操作。" ,
"checkout.manageInstead" : "此方案異動請在帳務入口管理,避免建立重複訂閱。" ,
2026-07-10 05:10:31 +00:00
"usage.widget.titleUsed" : "{name} · 已用 {used}/ {cap} 點" ,
"usage.widget.titleUnlimited" : "{name} · 不擋額度" ,
"usage.widget.ariaUsed" : "已用 {used} 點,共 {cap} 點" ,
"usage.widget.dialog" : "方案與用量" ,
"usage.widget.currentPlan" : "目前方案" ,
"usage.widget.unlimited" : "不擋額度" ,
"usage.widget.perMonth" : "/月" ,
"usage.widget.monthUsage" : "本月用量" ,
"usage.widget.remaining" : "還剩 {n} 點" ,
"usage.widget.leftShort" : "還剩 {n}" ,
2026-07-13 03:18:08 +00:00
"usage.widget.usedOfCap" : "{used}/{cap}" ,
2026-07-10 05:10:31 +00:00
"usage.widget.overShort" : "已超額" ,
"usage.widget.upgradeShort" : "升級" ,
"usage.widget.upgrade" : "升級方案" ,
"usage.widget.includes" : "這個方案包含" ,
"usage.widget.nudge" : "本月額度快用完了,升級可立刻加大點數。" ,
"usage.widget.changePlan" : "變更方案" ,
"usage.widget.usageDetail" : "用量明細" ,
"usage.meter.ai_copy" : "AI 文案" ,
"usage.meter.ai_research" : "AI 研究" ,
"usage.meter.web_search" : "搜尋" ,
"usage.meter.ai_image" : "AI 生圖" ,
2026-07-13 03:18:08 +00:00
"usage.meter.barAria" : "{label} 已用 {credits} 點/上限 {cap} 點({count} 次)" ,
2026-07-10 05:10:31 +00:00
"usage.ledger.costAria" : "消耗 {n} 點" ,
2026-07-13 01:15:30 +00:00
"usage.event.keyMode.platform" : "平台點數" ,
"usage.event.keyMode.byok" : "自備 Key" ,
"usage.event.cost.credits" : "− {n}" ,
"usage.event.cost.byok" : "自備" ,
"usage.event.cost.byokAria" : "使用自備 Key, 不扣平台點" ,
"usage.event.label.unknown" : "使用紀錄" ,
"usage.event.label.genericAi" : "AI 呼叫" ,
"usage.event.label.personaAnalyzeText" : "人設分析 · 文字" ,
"usage.event.label.personaAnalyzeAccount" : "人設分析 · 公開帳號" ,
"usage.event.label.composeMimic" : "仿寫貼文" ,
"usage.event.label.composeViral" : "爆紅分析" ,
"usage.event.label.personaPreview" : "人設試產" ,
"usage.event.label.ownPostReply" : "自己貼文 · 回覆草稿" ,
"usage.event.label.mentionReply" : "提及 · 回覆草稿" ,
"usage.event.label.inspireChat" : "靈感聊天" ,
"usage.event.label.researchSearch" : "研究搜尋" ,
"usage.event.label.generateImage" : "產生圖片" ,
"usage.event.label.search" : "網頁搜尋" ,
"usage.event.label.aiComplete" : "AI 補全" ,
"usage.event.source.personaAnalyzeText" : "人設分析 · 文字" ,
"usage.event.source.personaAnalyzeAccount" : "人設分析 · 公開帳號" ,
"usage.event.source.composeMimic" : "仿寫貼文" ,
"usage.event.source.composeViral" : "爆紅分析" ,
"usage.event.source.personaPreview" : "人設試產" ,
"usage.event.source.ownPostAnalyze" : "自己貼文 · 結構分析" ,
"usage.event.source.ownPostReply" : "自己貼文 · 回覆草稿" ,
"usage.event.source.mentionReply" : "提及 · 回覆草稿" ,
"usage.event.source.inspireChat" : "靈感聊天" ,
"usage.event.source.researchSearch" : "研究搜尋" ,
"usage.event.source.generateImage" : "產生圖片" ,
"usage.event.source.proxySearch" : "網頁搜尋" ,
"usage.event.source.proxyAi" : "AI 補全" ,
2026-07-10 05:10:31 +00:00
"usage.chart.period" : "區間" ,
"usage.chart.allocated" : "配給" ,
"usage.chart.consumed" : "消耗" ,
"usage.chart.pctTitle" : "消耗佔配給比例" ,
"usage.chart.aria" : "配給與消耗" ,
"usage.chart.colAria" : "{label} 配給 {purchased} 消耗 {consumed}" ,
2026-07-10 12:54:45 +00:00
"settings.provider" : "Provider" ,
"settings.model" : "模型" ,
"settings.aiUnifiedHint" : "文案、研究、延伸全部使用同一 provider 與模型。" ,
2026-07-10 05:10:31 +00:00
"settings.fetchModels" : "取得模型" ,
"settings.fetchingModels" : "讀取中…" ,
2026-07-10 12:54:45 +00:00
"settings.apiKey" : "API Key" ,
2026-07-10 05:10:31 +00:00
"settings.configured" : "已設定" ,
"settings.notConfigured" : "未設定" ,
2026-07-13 01:15:30 +00:00
"settings.platformKeyOk" : "可用平台 key( 可改填自己的) " ,
"settings.modelsHint" : "模型清單" ,
"settings.modelsCached" : "模型清單來自快取(約 5 分鐘)" ,
2026-07-10 05:10:31 +00:00
"settings.modelsLoaded" : "已取得 {provider} 模型清單" ,
"settings.aiSaved" : "AI 設定已儲存" ,
"settings.searchSaved" : "搜尋設定已儲存" ,
2026-07-15 15:23:59 +00:00
"settings.clearAiKey" : "清除自備 AI Key" ,
"settings.aiKeyCleared" : "自備 AI Key 已清除" ,
"settings.clearExaKey" : "清除 Exa Key" ,
"settings.exaKeyCleared" : "Exa Key 已清除" ,
2026-07-10 12:54:45 +00:00
"settings.searchProvider" : "搜尋 Provider" ,
"settings.expand" : "延伸策略" ,
"settings.exaKey" : "Exa API Key" ,
"settings.devMode" : "開發模式(爬蟲測試海巡)" ,
"settings.devModeHint" : "開啟後測試海巡可走 Chrome 爬蟲;正式發文/留言仍走 API。請下載擴充以同步 Threads 登入態。" ,
"settings.ext.title" : "Chrome 擴充套件" ,
2026-07-13 01:15:30 +00:00
"settings.ext.desc" : "開發模式需安裝此擴充( v1.2.0+),才能從 Chrome 同步 Threads session 到巡樓。" ,
2026-07-10 12:54:45 +00:00
"settings.ext.step1" : "下載並解壓縮 ZIP, 得到 haixun-threads-sync 資料夾" ,
"settings.ext.step2" : "Chrome 開啟 chrome://extensions, 開啟「開發人員模式」" ,
2026-07-13 01:15:30 +00:00
"settings.ext.step3" : "點「載入未封裝項目」,選擇解壓後的資料夾(已安裝則按「重新載入」)" ,
"settings.ext.step4" : "在擴充選項填入此站網址(與網址列一致),再重新整理巡樓頁" ,
2026-07-10 12:54:45 +00:00
"settings.ext.download" : "下載擴充套件( ZIP) " ,
2026-07-13 01:15:30 +00:00
"settings.ext.sessionTitle" : "Chrome Session( 測試海巡) " ,
"settings.ext.sessionHint" : "從已登入的 Threads 分頁收集 cookies, 寫入巡樓爬蟲 session。正式發文仍走 API。" ,
"settings.ext.pageOrigin" : "目前分頁:{origin}" ,
"settings.ext.detected" : "擴充已偵測" ,
"settings.ext.notReady" : "尚未偵測擴充" ,
"settings.ext.synced" : "Session 已同步" ,
"settings.ext.notSynced" : "Session 未同步" ,
"settings.ext.syncBtn" : "從 Chrome 同步 Session" ,
"settings.ext.recheck" : "重新偵測" ,
"settings.ext.syncOk" : "Chrome session 已同步到巡樓爬蟲" ,
"settings.ext.syncFail" : "Chrome session 同步失敗" ,
"settings.ext.needLogin" : "尚未登入,請先登入巡樓後再同步。" ,
"settings.ext.notDetected" : "找不到巡樓 Chrome 擴充(頁面 {origin})。請用 v1.2.1+: chrome://extensions 重新載入 → 擴充選項填入同一網址並儲存 → 回此頁 F5。" ,
"settings.ext.reloadHint" : "安裝或更新擴充後請重新載入擴充,再按 F5 刷新此頁。" ,
"settings.ext.detectSteps" : "裝好了卻偵測不到?請依序:① chrome://extensions 確認「巡樓 Threads Session 同步」已啟用並按「重新載入」(需 v1.2.1)② 擴充「詳細資料/選項」把 Server URL 設成 {origin} 並儲存(彈窗按允許)③ 回此分頁硬重新整理( F5) 。本機請勿混用 localhost 與 127.0.0.1。" ,
2026-07-10 05:10:31 +00:00
"forgot.fail" : "送出失敗" ,
"forgot.mockHint" : "正式環境會寄到信箱;此處直接給連結:" ,
2026-07-10 12:54:45 +00:00
"forgot.checkInbox" : "請檢查信箱(含垃圾郵件)。" ,
2026-07-10 05:10:31 +00:00
"reset.mismatch" : "兩次密碼不一致" ,
"reset.fail" : "重設失敗" ,
"reset.cardTitle" : "重設密碼" ,
"reset.redirecting" : "即將前往登入頁…" ,
"reset.loginNow" : "立即登入" ,
2026-07-10 12:54:45 +00:00
"reset.passwordPh" : "密碼須至少 12 碼,且含大寫、小寫、數字與符號" ,
"reset.forgotLink" : "重新申請重設" ,
2026-07-10 05:10:31 +00:00
"verify.sendFail" : "寄送失敗" ,
"verify.fail" : "驗證失敗" ,
"verify.success" : "信箱已驗證,可以使用巡樓了。" ,
"verify.codePh" : "6 位數字" ,
"verify.currentAccount" : "目前帳號:{email}" ,
"login.brandTitle" : "巡樓 · Lapras" ,
2026-07-31 08:30:46 +00:00
"home.navLabel" : "公開導覽" ,
"public.localeLabel" : "介面語言" ,
2026-08-03 05:52:02 +00:00
"home.heroTitle" : "在 Threads 找到客戶,一路跟到成交" ,
"home.heroLead" : "每天自動整理需求名單,回覆與跟進都在同一張工作台。" ,
"home.outcomesTitle" : "能做到什麼" ,
"home.outcome.find.title" : "找到正在找你的人" ,
"home.outcome.find.body" : "關鍵字訂閱每天自動掃;需要時也可手動掃一輪。" ,
"home.outcome.reply.title" : "回得出、說得準" ,
"home.outcome.reply.body" : "依你的服務與口吻產草稿,禁語不會亂講。" ,
"home.outcome.close.title" : "跟得到成交" ,
"home.outcome.close.body" : "同一人收斂成名單,階段與待追蹤不靠記憶。" ,
"home.productTitle" : "主打功能" ,
"home.productLead" : "從找需求到發送,都在同一張工作台。" ,
"home.preview.radar.title" : "今日商機" ,
"home.preview.radar.caption" : "訂閱關鍵字,每天自動整理需求名單" ,
"home.preview.scout.title" : "海巡掃場" ,
"home.preview.scout.caption" : "手動掃一輪,立刻鎖定可回覆貼文" ,
"home.preview.studio.title" : "回覆與創作" ,
"home.preview.studio.caption" : "依服務與口吻產草稿,禁語不亂講" ,
"home.preview.crm.title" : "名單與階段" ,
"home.preview.crm.caption" : "同一人收斂成一張卡,跟進不靠記憶" ,
2026-07-31 08:30:46 +00:00
"home.preview.outbox.title" : "發送佇列" ,
2026-08-03 05:52:02 +00:00
"home.preview.outbox.caption" : "排程、待送、已送一覽" ,
"home.preview.mock.radar.badge" : "今日 · 高匹配" ,
"home.preview.mock.radar.meta" : "3 則新需求" ,
"home.preview.mock.radar.row1" : "台北|徵求搬家報價" ,
"home.preview.mock.radar.row2" : "有人在問居家清潔方案" ,
"home.preview.mock.radar.row3" : "接案設計 · 預算已備" ,
"home.preview.mock.scout.badge" : "關鍵字掃描" ,
"home.preview.mock.scout.hit" : "求推:有推薦的會計師嗎" ,
"home.preview.mock.scout.snippet" : "想找能處理小型公司報稅的…" ,
"home.preview.mock.scout.hit2" : "有人用過某某 SaaS 嗎" ,
"home.preview.mock.studio.tab1" : "靈感" ,
"home.preview.mock.studio.tab2" : "回覆" ,
"home.preview.mock.studio.tab3" : "排程" ,
"home.preview.mock.studio.draft1" : "嗨,我看到你在找搬家協助——" ,
"home.preview.mock.studio.draft2" : "我們主要服務大台北,可先估趟次與箱數。" ,
"home.preview.mock.studio.draft3" : "(依你的服務檔與禁語產生)" ,
"home.preview.mock.crm.col1" : "新線索" ,
"home.preview.mock.crm.col2" : "洽談中" ,
"home.preview.mock.crm.col3" : "成交" ,
"home.preview.mock.crm.foot" : "待追蹤與到期提醒" ,
"home.preview.mock.outbox.r1" : "回覆 · 今晚 20:00" ,
"home.preview.mock.outbox.r2" : "主貼 · 待確認" ,
"home.preview.mock.outbox.r3" : "已送 · 成效同步中" ,
"home.pricingTitle" : "方案" ,
"home.pricingLead" : "功能相同,差在每月平台點數。" ,
"home.pricingHoverHint" : "把游標移到「每月點數」可看各方案能做什麼。" ,
2026-07-31 08:30:46 +00:00
"home.ctaLogin" : "登入" ,
"home.privacyLink" : "隱私權政策" ,
"home.termsLink" : "服務條款" ,
"home.dataDeletionLink" : "資料刪除說明" ,
"legal.footerNav" : "法律與政策連結" ,
"privacy.navLabel" : "隱私權政策導覽" ,
"privacy.title" : "隱私權政策" ,
"privacy.updated" : "最後更新: 2026-07-31" ,
"privacy.intro" :
2026-08-03 05:52:02 +00:00
"本隱私權政策說明巡樓( Lapras, 以下稱「本服務」或「我們」) 如何蒐集、使用、儲存、分享與刪除你的個人資料與 Meta/ Threads 平台資料。本政策適用於巡樓網頁主控台、公開工具頁,以及你透過 OAuth 連結之 Threads 帳號相關處理。使用本服務即表示你知悉本政策。" ,
2026-07-31 08:30:46 +00:00
"privacy.section.overview.title" : "1. 控管者與適用範圍" ,
"privacy.section.overview.body" :
"本服務由巡樓( Lapras) 營運方作為個人資料控管者。\n本政策涵蓋: 會員帳號、工作區內容、用量與付款識別、以及你授權本服務自 Meta/ Threads API 取得之平台資料。\n若你透過邀請加入他人工作區, 工作區擁有者可能另有內部規範, 但不取代本政策對平台層與會員層資料之說明。\n本政策為我們自有政策, 非 Meta、Threads 或 Instagram 之政策; Meta 如何處理其產品內資料,請另見 Meta 隱私中心。" ,
"privacy.section.collect.title" : "2. 我們蒐集哪些資料" ,
"privacy.section.collect.body" :
"( A) 你直接提供的資料\n• 帳號: Email、顯示名稱、密碼雜湊( 不保存明文密碼) 、角色與信箱驗證狀態。\n• 你輸入的內容: 人設、品牌、海巡意圖/ 關鍵字、創作草稿、回覆文案、Outbox 內容、工作區設定與上傳之媒體(若有)。\n• 支援與個資請求:你寄給我們的 Email 與請求內容。\n\n( B) 自動蒐集\n• 登入 session、IP、基本瀏覽器/ 裝置資訊( 安全、除錯、防濫用) 。\n• 介面偏好(語言、主題)。\n• 功能用量與任務日誌(方案額度、錯誤診斷)。\n\n( C) 來自 Meta/ Threads 的平台資料(僅在你授權連結後)\n• Threads 使用者識別(例如 user id、username) 、公開或授權範圍內的個人檔摘要。\n• 你授權範圍內的貼文、回覆、媒體中繼資料、以及為完成發送/讀取/成效所需之 API 回應。\n• 存取權杖( access token/ refresh 相關憑證):僅用於代你呼叫 Threads API, 與會員登入 JWT 分開存放。\n\n( D) 付款( 若啟用) \n• 方案等級、點數用量、金流交易識別(細節依金流供應商;我們不儲存完整卡號)。\n\n我們不會以一般使用為條件要求無關的政府身分證件。" ,
"privacy.section.use.title" : "3. 處理目的與方式" ,
"privacy.section.use.body" :
"我們處理上述資料的目的包括:\n• 提供帳號、工作區、權限與登入安全。\n• 執行核心功能:海巡掃描/外展、創作與 AI 輔助、Outbox 排程與發送、帳號與貼文同步、成效與用量計量。\n• 以你授權的 Threads token 代表你呼叫 Meta/ Threads API( 讀取授權內容、發布你確認之內容等, 以實際 scope 為準)。\n• 寄送驗證碼、密碼重設與服務通知。\n• 防止濫用、保障服務穩定、除錯與產品改善(儘量去識別化)。\n• 遵守法律義務或回應合法請求。\n\n我們不會將 Meta/ Threads 平台資料出售給資料掮客,也不會將該等資料用於與提供本服務無關的獨立行銷檔案建置。" ,
2026-08-03 05:52:02 +00:00
"privacy.section.threads.title" : "4. Threads/ Meta 平台資料" ,
2026-07-31 08:30:46 +00:00
"privacy.section.threads.body" :
2026-08-03 05:52:02 +00:00
"連結方式:你透過 Meta OAuth 授權本服務存取 Threads。我們僅請求並使用完成產品功能所需之權限, 例如讀取基本檔案、內容發布等; 實際清單以授權畫面為準。\n\n用途限制: 自 Meta 取得的平台資料,僅用於提供、維護與改善你所使用的巡樓功能(例如綁定帳號、同步貼文、排程/發送回覆或貼文、顯示狀態與除錯),不會轉售,亦不會用於與你授權無關的廣告定向。\n\n儲存與隔離: Threads 授權憑證與會員登入憑證分開管理;工作區與帳號層級有權限控管。\n\n你可隨時: \n• 在本服務解除 Threads 綁定;及/或\n• 在 Meta/ Threads/ Instagram 設定中撤銷本 App 授權。\n解除後我們停止新的 API 存取,並依第 8 節處理刪除或匿名化。\n\nMeta/ Threads 自身如何處理資料,受 Meta 隱私政策與 Threads 補充條款拘束;本服務無法控制 Meta 端行為。" ,
2026-07-31 08:30:46 +00:00
"privacy.section.share.title" : "5. 資料分享與處理者" ,
"privacy.section.share.body" :
"我們可能在下列情況分享或由處理者代為處理資料:\n• 基礎設施:雲端主機、資料庫、物件儲存、電子郵件發送、監控與日誌服務(僅為營運本服務)。\n• AI/ 搜尋供應商: 當你使用靈感、分析、建議文案等功能時, 必要提示與內容片段可能傳送至供應商( 見第 6 節)。\n• 金流供應商:處理付款時。\n• 法律要求:法院、主管機關之合法要求。\n• 業務承繼:合併、收購等情形下,依適用法律與通知處理。\n\n我們要求處理者僅依指示處理, 並採取合理安全措施。我們不會出售個人資料。" ,
"privacy.section.ai.title" : "6. AI 與自動化處理" ,
"privacy.section.ai.body" :
"部分功能會將你提供的提示、貼文樣本、結構化備註或授權同步之公開內容摘要送至 AI/ 搜尋供應商, 以產生建議文案、風格分析或檢索結果。\n你可使用平台預設供應商, 或自行設定 BYOK( Bring Your Own Key) ; BYOK 時請求導向你指定的供應商,請同時閱讀其條款。\n我們不會在未經你另行同意下, 把你的內容當作對外行銷素材或公開訓練語料宣傳。" ,
"privacy.section.retention.title" : "7. 保存期間" ,
"privacy.section.retention.body" :
"• 帳號與工作區資料:於帳號有效期間保存,以維持服務。\n• Threads token: 於綁定有效期間保存; 解除綁定或刪除請求後失效/ 移除。\n• 任務日誌、用量與安全紀錄:依營運、爭議處理與法令需要保存合理期間後刪除或匿名化。\n• 備份:可能在輪替週期內短暫殘留,期滿清除。\n詳細刪除步驟見第 8 節與「資料刪除說明」頁。" ,
2026-08-03 05:52:02 +00:00
"privacy.section.deletion.title" : "8. 如何請求刪除資料" ,
2026-07-31 08:30:46 +00:00
"privacy.section.deletion.body" :
2026-08-03 05:52:02 +00:00
"你可依下列方式請求刪除我們所持有、與你相關的個人資料與平台資料:\n\n方式一( 建議) : 登入巡樓 → 會員/設定相關頁面解除 Threads 綁定,並依介面指示提出帳號或資料刪除(若已提供自助刪除)。\n\n方式二: 寄信至本服務營運方, 使用你註冊之 Email 寄出,主旨註明「資料刪除請求」或 Data Deletion Request, 並提供: \n• 註冊 Email\n• 若知悉: Threads username 或本服務內顯示之帳號識別\n• 欲刪除範圍(全部帳號/僅 Threads 連線資料/特定工作區)\n\n方式三: 在 Meta 移除本 App 並請求刪除時,依 Meta 流程處理;我們也會依平台回呼(若有)處理對應資料,否則請仍依方式二聯絡我們。\n\n更完整的步驟見本站「資料刪除說明」頁( /data-deletion) 。\n我們於核對身分後, 將在合理期間( 通常 30 日內,法令另有規定從其規定)刪除或匿名化,法令要求保留者除外。" ,
2026-07-31 08:30:46 +00:00
"privacy.section.rights.title" : "9. 你的權利" ,
"privacy.section.rights.body" :
"在適用法律允許範圍內,你可要求:查詢、更正、下載(可攜)、刪除、限制或反對特定處理。你可隨時登出、修改個人資料、解除 Threads 綁定或停止使用。行使權利請依第 12 節聯絡我們;我們可能需驗證身分。" ,
"privacy.section.security.title" : "10. 安全措施" ,
"privacy.section.security.body" :
"我們採取合理技術與組織措施,包括 HTTPS 傳輸、密碼雜湊、權限隔離、會員憑證與 Threads token 分離存放、以及存取控管。無系統可保證絕對安全;若發生可能影響你權益之資安事件,我們將依法或依政策通知。" ,
"privacy.section.children.title" : "11. 兒童與未成年人" ,
"privacy.section.children.body" :
"本服務面向內容經營與商業/創作者使用,不以兒童為對象。我們不故意蒐集未滿適用年齡(例如 13 歲,或你所在地更高門檻)者之個人資料。若你認為兒童資料被誤收,請依第 12 節聯絡,我們將儘速刪除。" ,
"privacy.section.contact.title" : "12. 聯絡我們" ,
"privacy.section.contact.body" :
2026-08-03 05:52:02 +00:00
"隱私權、個資查詢、更正或刪除請求,請使用你註冊之 Email 與本服務營運方聯繫, 主旨註明「Privacy/ Data Request」, 並說明帳號 Email 與請求內容,以便核對身分。\n你亦可先登入後於會員/ 設定頁依指示操作。" ,
2026-07-31 08:30:46 +00:00
"privacy.section.updates.title" : "13. 政策更新" ,
"privacy.section.updates.body" :
"我們可能因功能、Meta 平台規則或法令更新本政策。更新後會修改「最後更新」日期;重大變更時可能以站內通知或 Email 告知。在法律允許範圍內,更新後繼續使用表示你知悉修訂內容。" ,
"privacy.backHome" : "回到介紹首頁" ,
"terms.navLabel" : "服務條款導覽" ,
"terms.title" : "服務條款" ,
"terms.updated" : "最後更新: 2026-07-31" ,
"terms.intro" :
"歡迎使用巡樓( Lapras) 。本服務條款( Terms of Service) 規範你與本服務營運方之間就使用網頁主控台、公開工具與相關功能之約定。使用本服務即表示你同意本條款; 若不同意, 請勿使用。" ,
"terms.section.acceptance.title" : "1. 接受條款" ,
"terms.section.acceptance.body" :
"你必須具備締結合約之法定能力,並遵守所在地法律。若你代表公司或組織使用,你保證有權使該組織受本條款拘束。" ,
"terms.section.service.title" : "2. 服務說明" ,
"terms.section.service.body" :
"巡樓提供 Threads 內容經營相關工具,包括但不限於帳號綁定、海巡與外展、創作與發送、人設/品牌、用量與方案等。功能可能隨版本調整;我們得基於維護、安全或法規暫停或變更部分功能。" ,
"terms.section.accounts.title" : "3. 帳號與安全" ,
"terms.section.accounts.body" :
"你應提供正確資料、妥善保管登入憑證,並對帳號下之行為負責。發現未授權使用應立即通知我們。我們得因安全、濫用或違規而限制或停權帳號。" ,
"terms.section.threads.title" : "4. Threads/ Meta 連線" ,
"terms.section.threads.body" :
"部分功能需你透過 Meta OAuth 授權連結 Threads。你保證有權連結該帳號, 並遵守 Meta、Threads、Instagram 之平台條款與社群規範。\n你應自行確保發送內容合法、不侵權、不違反平台政策。因你的內容或帳號行為導致平台處罰、API 拒絕或第三方主張,由你自行負責;本服務僅提供工具,不保證平台審核結果或觸及成效。\n你可以隨時解除綁定或撤銷 Meta 授權;解除後部分功能將無法使用。" ,
"terms.section.content.title" : "5. 你的內容" ,
"terms.section.content.body" :
"你保留對自己上傳或產生內容之權利。你授予我們為提供服務所需之非專屬、全球、免權利金授權(儲存、處理、傳輸、顯示給你與你授權之工作區成員、以及呼叫必要之第三方 API) 。你保證內容不違法、不侵權。" ,
"terms.section.acceptable.title" : "6. 禁止行為" ,
"terms.section.acceptable.body" :
"禁止:濫用 API 或自動化干擾他人;散布垃圾、詐騙、仇恨或違法內容;規避用量或安全機制;逆向工程或未經授權存取系統;將服務用於違反 Meta 平台政策之行為;侵害他人隱私或智慧財產。" ,
"terms.section.billing.title" : "7. 方案與用量" ,
"terms.section.billing.body" :
"付費方案、點數與限制以產品內標示為準。未付款、超額或濫用可能導致功能降級或暫停。退款政策依購買時說明與適用法律。" ,
"terms.section.disclaimer.title" : "8. 免責與責任限制" ,
"terms.section.disclaimer.body" :
"服務依「現況」提供。在法律允許最大範圍內,我們不保證無中斷、無錯誤,或第三方平台(含 Threads/ Meta/ AI 供應商)持續可用。對間接、附隨、逸失利益等損害,除法律強制規定外不負責任;我們對你的總責任以你於事故前十二個月內就本服務已付費用為上限(若為免費使用則為零),法律禁止限制者除外。" ,
"terms.section.termination.title" : "9. 終止" ,
"terms.section.termination.body" :
"你可隨時停止使用並依隱私權政策請求刪除資料。我們得因違約、濫用、法律要求或停止營運而終止或暫停服務。終止後依隱私權政策處理資料。" ,
"terms.section.contact.title" : "10. 聯絡與準據" ,
"terms.section.contact.body" :
"條款相關問題請透過註冊 Email 聯絡營運方。準據法與管轄,除強制規定外,以本服務主要營運地之法律為準。隱私處理見 /privacy; 資料刪除見 /data-deletion。" ,
"deletion.navLabel" : "資料刪除說明導覽" ,
"deletion.title" : "使用者資料刪除說明" ,
"deletion.updated" : "最後更新: 2026-07-31" ,
"deletion.intro" :
2026-08-03 05:52:02 +00:00
"本頁說明如何請求巡樓( Lapras) 刪除與你相關的個人資料與 Threads 平台資料。" ,
2026-07-31 08:30:46 +00:00
"deletion.section.summary.title" : "1. 摘要" ,
"deletion.section.summary.body" :
"當你不再使用本服務,或自 Meta 移除本 App 並希望刪除我們所持資料時,請依下列步驟提出請求。我們會在核對身分後刪除或匿名化可刪除之資料(法令或正當利益需保留者除外)。" ,
"deletion.section.steps.title" : "2. 如何提出刪除請求" ,
"deletion.section.steps.body" :
2026-08-03 05:52:02 +00:00
"步驟 1: 若仍可登入, 先至巡樓解除所有 Threads 帳號綁定(設定/帳號相關頁)。\n步驟 2: 使用你註冊本服務時的 Email 寄信給營運方。\n步驟 3: 主旨請寫: 「資料刪除請求」或 Data Deletion Request。\n步驟 4: 信中請提供: \n• 註冊 Email( 必填) \n• 顯示名稱或會員識別(若知悉)\n• Threads username 或本服務內帳號 id( 若曾連結) \n• 刪除範圍:整個帳號/僅 Threads 連線與同步資料/特定工作區\n步驟 5: 我們回覆確認後開始處理; 完成後以 Email 告知結果(若該信箱仍可用)。" ,
2026-07-31 08:30:46 +00:00
"deletion.section.threads.title" : "3. 與 Threads/ Meta 授權的關係" ,
"deletion.section.threads.body" :
2026-08-03 05:52:02 +00:00
"刪除本服務資料不會自動刪除你在 Threads/ Instagram/ Meta 上的貼文或帳號。\n請同時在 Meta/ Threads 設定中撤銷對本 App 的授權,以停止 Meta 端的授權狀態。\n若平台端另有刪除回呼, 我們會一併處理對應資料; 否則請依本頁 Email 流程提出請求。" ,
2026-07-31 08:30:46 +00:00
"deletion.section.scope.title" : "4. 會刪除什麼" ,
"deletion.section.scope.body" :
"在合理可行範圍內,我們將刪除或匿名化:\n• 會員個人資料與登入憑證\n• 工作區內由你建立之內容(人設、草稿、海巡與 Outbox 等,依請求範圍)\n• Threads 連線識別、token 與同步快取\n• 非必要之任務與分析紀錄\n\n可能暫時或依法保留: \n• 法令要求之交易/帳務紀錄\n• 安全與防濫用日誌(有限期間)\n• 備份輪替中尚未到期之副本" ,
"deletion.section.timeline.title" : "5. 處理時程" ,
"deletion.section.timeline.body" :
"我們通常在收到可核對之請求後 30 日內完成刪除或匿名化。若需更長時間(例如複雜工作區或法遵審查),我們會告知預估時程。備份清除可能隨後完成。" ,
"deletion.section.contact.title" : "6. 聯絡" ,
"deletion.section.contact.body" :
"請使用註冊 Email 聯絡本服務營運方, 主旨「Data Deletion Request」。完整隱私說明見 /privacy; 服務條款見 /terms。" ,
2026-07-10 05:10:31 +00:00
"common.listSep" : "、" ,
"common.dash" : "—" ,
2026-08-06 14:16:49 +00:00
"scout.title" : "手動探索" ,
2026-08-03 05:52:02 +00:00
"scout.today" : "今日出擊" ,
2026-07-10 05:10:31 +00:00
"scout.purposeValue" : "痛點回覆" ,
2026-08-06 14:16:49 +00:00
"scout.purposeDemand" : "找需求痛點" ,
"scout.purposeProvider" : "解法媒合" ,
2026-07-10 05:10:31 +00:00
"scout.purposeActivity" : "活躍短回" ,
"scout.goal" : "今日目標(則)" ,
"scout.progress" : "進度 {done}/{goal}" ,
"scout.intent" : "我想找/回應" ,
"scout.keyword" : "關鍵字" ,
"scout.intentPh" : "例:換季頭皮刺癢、真的無香、週末有插座" ,
"scout.keywordPh" : "例:週末 咖啡 遠端" ,
"scout.productOptional" : "產品(選填)" ,
2026-08-06 14:16:49 +00:00
"scout.productRequired" : "要解決的產品(必填)" ,
"scout.selectProduct" : "選擇產品" ,
2026-07-10 05:10:31 +00:00
"scout.noProduct" : "不帶產品" ,
"scout.brandFallback" : "品牌" ,
"scout.placement" : "置入:{label}" ,
2026-08-06 14:16:49 +00:00
"scout.providerProduct" : "產品:{label}" ,
2026-07-10 05:10:31 +00:00
"scout.painPart" : " · 痛點「{pain}」" ,
"scout.noProductsBefore" : "尚無產品,可到" ,
"scout.noProductsAfter" : "新增。" ,
"scout.start" : "開始" ,
"scout.startMore" : "再撈一批" ,
"scout.fetching" : "撈取中…" ,
2026-08-03 07:58:07 +00:00
"scout.planKeywords" : "產出關鍵字" ,
"scout.planning" : "整理關鍵字…" ,
"scout.workshop" : "搜尋關鍵字(可改)" ,
"scout.workshopHint" : "確認後才會搜尋。每條是一組獨立 query; 刪掉不準的、加上你知道有效的說法。" ,
"scout.workshopEmpty" : "至少保留一條關鍵字才能搜尋" ,
"scout.addTerm" : "新增" ,
"scout.addTermPh" : "再加一條搜尋關鍵字" ,
"scout.removeTerm" : "移除" ,
"scout.confirmScan" : "用這些詞開始搜" ,
"scout.replan" : "重新產出" ,
"scout.clearWorkshop" : "取消" ,
"scout.termsReady" : "已產出 {n} 條關鍵字,請確認後再搜。" ,
2026-07-10 05:10:31 +00:00
"scout.runs" : "海巡批次" ,
"scout.runCount" : "批次({n}) " ,
"scout.runSelectAria" : "切換海巡批次" ,
"scout.runPending" : "待回 {n} · " ,
"scout.runDone" : "已清完 · " ,
"scout.runTotal" : "( {n} 則)" ,
"scout.deleteRun" : "刪除這一批" ,
"scout.deleting" : "刪除中…" ,
"scout.now" : "現在這一則" ,
2026-08-03 05:52:02 +00:00
"scout.emptyBatch" : "這一批沒有待回。想每天自動收需求名單?用側欄「商機」訂閱關鍵字。" ,
2026-07-10 05:10:31 +00:00
"scout.draft" : "回覆草稿" ,
"scout.draftPhActivity" : "短回…" ,
"scout.draftPhValue" : "共感 → 建議…" ,
"scout.sendAccount" : "用哪個帳號送" ,
"scout.noAccount" : "無可用帳號" ,
"scout.personaForRegen" : "人設(再產用)" ,
"scout.notReady" : "(未就緒)" ,
"scout.skip" : "略過" ,
"scout.regen" : "再產" ,
"scout.send" : "發送" ,
2026-07-20 06:33:14 +00:00
"scout.openThreadsReply" : "開啟 Threads 留言" ,
"scout.markManualDone" : "已留言,標記完成" ,
"scout.manualReplyHint" : "先確認草稿,開啟 Threads 後直接在原文底下留言;草稿會嘗試自動複製。完成後回到這裡標記完成。" ,
"scout.openedAndCopied" : "已開啟 Threads, 草稿也已複製; 貼上留言後再回來標記完成。" ,
"scout.openedManual" : "已開啟 Threads; 留言完成後請回來標記完成。" ,
"scout.noPermalink" : "這筆命中沒有可開啟的 Threads 原文連結。" ,
"scout.manualDone" : "已標記人工留言完成 · 今日 {done}/{goal}" ,
"scout.manualDoneFail" : "標記人工留言完成失敗" ,
2026-07-13 08:59:13 +00:00
"scout.resend" : "重新送出" ,
2026-07-10 05:10:31 +00:00
"scout.sending" : "發送中…" ,
"scout.needAccountBefore" : "請先到" ,
"scout.needAccountAfter" : "連線可用帳號。" ,
"scout.loadingKnowledge" : "正在整理周邊知識…" ,
"scout.product" : "產品" ,
2026-07-13 08:59:13 +00:00
"scout.queue" : "命中紀錄 · {n}" ,
"scout.valueQueue" : "痛點/產品接話 · {n}" ,
2026-08-06 14:16:49 +00:00
"scout.providerQueue" : "解法提供者 · {n}" ,
"scout.demandQueue" : "需求痛點 · {n}" ,
2026-07-13 08:59:13 +00:00
"scout.activityQueue" : "活躍短回 · {n}" ,
"scout.noMatchesInQueue" : "這個佇列暫無命中" ,
2026-07-10 05:10:31 +00:00
"scout.collapseQueue" : "收合佇列" ,
"scout.expandQueue" : "展開佇列" ,
"scout.noOtherPending" : "沒有其他待回" ,
"scout.unnamedRun" : "未命名批次" ,
"scout.thisRun" : "此批次" ,
"scout.confirmDeleteRun" : "刪除海巡批次「{label}」?\\n會一併刪除這批命中與周邊知識, 無法復原。" ,
"scout.deletedRun" : "已刪除批次「{label}」" ,
"scout.deleteRunFail" : "刪除批次失敗" ,
"scout.needKeyword" : "先填關鍵字" ,
"scout.needIntent" : "先寫這次要找什麼" ,
"scout.productMissing" : "所選產品不在列表中,請重新選擇" ,
2026-08-06 14:16:49 +00:00
"scout.providerSetupRequired" : "解法媒合需要產品的痛點與至少一個標籤或解法能力詞;請到品牌頁補齊後再試。" ,
2026-07-10 05:10:31 +00:00
"scout.defaultLabel" : "海巡" ,
"scout.newRunActivity" : "新批次「{label}」· {n} 則待回" ,
"scout.newRunValue" : "新批次「{label}」· {n} 則 · 請處理「現在這一則」" ,
"scout.knowledgeReady" : "「{label}」周邊知識已備好 · {n} 則可學" ,
"scout.patrolFail" : "這輪海巡失敗" ,
2026-07-13 08:59:13 +00:00
"scout.loadFail" : "海巡資料載入失敗,請重新整理後再試。" ,
"scout.scanQueued" : "已建立海巡任務「{label}」,完成後會自動載入命中。" ,
"scout.workerWaiting" : "海巡任務仍在等待 worker。請確認 apps/backend worker 正在執行。" ,
"scout.scanReady" : "海巡完成,找到 {n} 則待回。" ,
"scout.queued" : "已交由 @{who} 的 Outbox 發送佇列處理 · 今日 {done}/{goal}" ,
"scout.scanJob" : "海巡任務" ,
"scout.scanInProgress" : "正在掃描" ,
"scout.crawlerSessionRequired" : "海巡爬蟲需要有效的 Chrome session。請在設定頁同步已登入 Threads 分頁的 session。" ,
"scout.openSettings" : "開啟設定" ,
"scout.source" : "來源:{source}" ,
"scout.classification" : "分類:{classification}" ,
"scout.createdAt" : "建立於 {time}" ,
"scout.openPermalink" : "開啟原文" ,
2026-07-10 05:10:31 +00:00
"scout.draftFail" : "產草稿失敗" ,
"scout.skipped" : "已略過" ,
2026-07-13 08:59:13 +00:00
"scout.status.new" : "待處理" ,
"scout.status.drafted" : "已起草" ,
"scout.status.queued" : "發送佇列中" ,
"scout.status.published" : "已發送" ,
"scout.status.skipped" : "已略過" ,
2026-07-10 05:10:31 +00:00
"scout.noDraft" : "沒有可發送的草稿" ,
"scout.accountFallback" : "帳號" ,
"scout.sent" : "已發送(@{who})· 今日 {done}/{goal}" ,
"scout.sendFail" : "發送失敗" ,
"scout.confirmDeletePost" : "刪除這則命中?" ,
2026-07-13 08:59:13 +00:00
"scout.deletedPost" : "已刪除這則命中" ,
2026-07-10 05:10:31 +00:00
"scout.stanceActivity" : "短回 · 養活躍" ,
2026-08-06 14:16:49 +00:00
"scout.stanceDemand" : "需求痛點 · 可回應" ,
"scout.stanceProvider" : "解法媒合 · 不推產品" ,
"scout.demandHint" : "這是正在求助或比較解法的需求貼文。先閱讀原文,再以有幫助的方式回應。" ,
"scout.providerHint" : "這是解法提供者候選名單。請先看原文與能力證據,再自行決定是否聯絡。" ,
2026-07-10 05:10:31 +00:00
"scout.stanceProduct" : "共感 · 可輕帶產品" ,
"scout.stanceRelation" : "接話 · 建關係" ,
"brands.title" : "品牌" ,
"brands.railAria" : "品牌列表" ,
"brands.railLabel" : "你的牌子" ,
"brands.add" : "新增" ,
"brands.brandName" : "品牌名稱" ,
"brands.brandNamePh" : "例如:自家品牌" ,
"brands.creating" : "建立中…" ,
"brands.createBrand" : "建立品牌" ,
"brands.searchAria" : "搜尋品牌" ,
"brands.searchPh" : "搜尋品牌…" ,
"brands.empty" : "尚無品牌" ,
"brands.noMatch" : "無符合" ,
"brands.selectAria" : "選擇品牌" ,
"brands.pickOne" : "選一個品牌" ,
"brands.inUseHint" : "使用中 · 海巡與創作會套用此牌" ,
"brands.inUse" : "使用中" ,
2026-08-03 05:52:02 +00:00
"brands.tabBrands" : "品牌庫" ,
2026-07-10 05:10:31 +00:00
"brands.tabInfo" : "牌子資料" ,
"brands.tabProducts" : "產品" ,
"brands.tabProductsN" : "產品({n}) " ,
"brands.displayName" : "名稱" ,
"brands.brief" : "摘要" ,
"brands.briefPh" : "一句話說明這個牌子" ,
"brands.audience" : "受眾" ,
"brands.audiencePh" : "誰會在意、為什麼" ,
"brands.goals" : "目標" ,
"brands.goalsPh" : "想在 Threads 達成什麼" ,
"brands.saving" : "儲存中…" ,
"brands.deleteBrand" : "刪除品牌" ,
"brands.searchProductAria" : "搜尋產品" ,
"brands.searchProductPh" : "搜尋產品…" ,
"brands.addProduct" : "新增產品" ,
"brands.noProducts" : "尚無產品" ,
"brands.hasLink" : "有連結" ,
"brands.painLabel" : "痛點 " ,
"brands.editProduct" : "編輯產品" ,
"brands.newProduct" : "新增產品" ,
"brands.importFromUrl" : "從商品連結帶入" ,
"brands.fetching" : "抓取中…" ,
"brands.fetch" : "抓取" ,
"brands.pains" : "痛點" ,
"brands.painsPh" : "一列一個" ,
"brands.tags" : "標籤" ,
"brands.tagsPh" : "逗號分隔" ,
"brands.intro" : "介紹" ,
2026-08-06 14:16:49 +00:00
"brands.providerCapabilities" : "可解決痛點的能力/服務" ,
"brands.providerCapabilitiesPh" : "例如:皮膚科、過敏原檢測、敏感肌諮詢" ,
"brands.providerExcludes" : "同類型排除詞" ,
"brands.providerExcludesPh" : "例如:洗髮精、護髮產品" ,
2026-07-10 05:10:31 +00:00
"brands.link" : "連結" ,
"brands.update" : "更新" ,
"brands.createItem" : "新增" ,
"brands.needName" : "請輸入名稱" ,
"brands.created" : "已建立「{name}」" ,
"brands.createFail" : "建立失敗" ,
"brands.saved" : "已儲存" ,
"brands.saveFail" : "儲存失敗" ,
"brands.confirmDelete" : "確定刪除「{name}」?" ,
"brands.deleted" : "已刪除" ,
"brands.deleteFail" : "刪除失敗" ,
"brands.fetchFail" : "抓取失敗" ,
"brands.needLabelContext" : "名稱與介紹為必填" ,
"brands.productUpdated" : "已更新" ,
"brands.productAdded" : "已新增" ,
"brands.confirmDeleteProduct" : "刪除此產品?" ,
"insights.title" : "帳號成效" ,
"insights.account" : "帳號" ,
"insights.noAccount" : "尚無帳號" ,
"insights.syncing" : "同步中…" ,
"insights.syncPosts" : "同步貼文" ,
"insights.myPosts" : "我的貼文" ,
"insights.pickAccount" : "選擇帳號" ,
"insights.goAccounts" : "帳號" ,
"insights.kpiMonth" : "本月指標" ,
"insights.monthViews" : "本月瀏覽" ,
"insights.monthLikes" : "本月讚" ,
"insights.monthReplies" : "本月回覆" ,
"insights.engRate" : "互動率" ,
"insights.vsPrev" : "vs 上月" ,
"insights.avgNear" : "近帖均 {rate}" ,
"insights.trendTitle" : "趨勢與分析 · @{user}" ,
"insights.metricViews" : "瀏覽" ,
"insights.metricLikes" : "讚" ,
"insights.metricReplies" : "回覆" ,
"insights.metricPosts" : "貼文" ,
"insights.metricPostsFull" : "貼文數" ,
"insights.chartMetrics" : "圖表指標" ,
"insights.barsAria" : "近月{metric},點柱查看該月分析" ,
"insights.barsLabel" : "{metric} · 近 {n} 個月" ,
"insights.clickBar" : " · 點柱看分析" ,
"insights.pickMonthAria" : "選擇月份" ,
"insights.barTitle" : "{label}: {value}{est} · 點看分析" ,
"insights.est" : "(估)" ,
"insights.monthSuffix" : "{m}月" ,
"insights.sparkAria" : "趨勢折線,點節點可選月" ,
"insights.analysisOf" : "{label} 分析" ,
"insights.producedAt" : "產出於 {time}" ,
"insights.hasEstimate" : " · 含估測數據" ,
"insights.viewsVsPrev" : " · 瀏覽 vs 前月 {delta}" ,
"insights.statPosts" : "貼文" ,
"insights.statViews" : "瀏覽" ,
"insights.statLikes" : "讚" ,
"insights.statReplies" : "回" ,
"insights.conclusions" : "結論" ,
"insights.recommendations" : "建議" ,
"insights.highlights" : "當月亮點" ,
"insights.findTopics" : "找話題" ,
"insights.goScout" : "去探查" ,
"insights.selectMonth" : "選擇月份" ,
"insights.topPosts" : "表現較佳貼文" ,
"insights.noPosts" : "尚無貼文" ,
"insights.postStats" : "瀏覽 {views} · 讚 {likes} · 回 {replies}" ,
"insights.openThreads" : "開啟 Threads" ,
"insights.zeroPct" : "0%" ,
2026-07-13 03:18:08 +00:00
"insights.panelHint" : "依「我的貼文」同步數據聚合本月成效與近月趨勢" ,
"insights.lastSynced" : "上次同步 {time}" ,
"insights.neverSynced" : "尚未同步" ,
"insights.emptyTitle" : "尚無貼文數據" ,
"insights.emptyDesc" : "先按「同步貼文」從 Threads 拉入你的貼文與成效,再看月比圖與分析。" ,
"insights.syncDone" : "已同步 {n} 則貼文,成效已更新" ,
"insights.syncFail" : "同步失敗" ,
"insights.loadFail" : "載入貼文失敗" ,
"insights.zeroViewsHint" : "已有貼文但瀏覽多為 0: 可能 Insights 權限不足或尚未產出,可再按一次同步。" ,
"insights.postsInMonth" : "{n} 則" ,
"insights.kpiForMonth" : "{label} 指標" ,
"insights.topPostsOfMonth" : "{label} · 表現較佳貼文" ,
"insights.noPostsInMonth" : "{label} 尚無貼文" ,
"insights.pastMonthEmptyHint" : "該月沒有已同步的貼文(過去月份只會自動補抓一次)。可手動同步或改選其他月。" ,
"insights.pastBackfillDone" : "已補抓歷史貼文 {n} 則(過去月份只抓一次)" ,
"insights.autoRefreshDone" : "本月成效已更新({n} 則)" ,
"insights.noDataNoAnalysis" : "{label} 沒有貼文數據,不產生結論。" ,
"insights.noAnalysisYet" : "{label} 尚無可寫的結論(需有已同步貼文)。" ,
2026-07-10 05:10:31 +00:00
"plays.tabOwn" : "我的貼文" ,
"plays.tabLink" : "Threads 連結" ,
"plays.noPosts" : "尚無貼文" ,
"plays.targetPost" : "目標貼文" ,
"plays.likesSuffix" : " (讚{n}) " ,
"plays.linkCard" : "貼 Threads 連結" ,
"plays.postLink" : "貼文連結" ,
"plays.resolving" : "解析中…" ,
"plays.resolve" : "解析連結" ,
"plays.resolveHint" : "解析後可排自家帳號在該則下面回覆。" ,
"plays.targetOwn" : "目標貼文(自己的)" ,
"plays.openThreads" : "開 Threads" ,
"plays.external" : "外站貼" ,
"plays.addScheme" : "新增方案" ,
"plays.schemeCount" : "此目標目前 {n} 個方案" ,
"plays.noSchemes" : "尚無方案" ,
"plays.replyCount" : "{n} 則留言" ,
"plays.editTitle" : "編輯:{title}" ,
"plays.schemeName" : "方案名稱" ,
"plays.schemeNamePh" : "例如:方案 A · 溫和接話" ,
"plays.speakersOwn" : "可出場帳號(貼主帳固定可回)" ,
"plays.speakers" : "可出場帳號" ,
"plays.postOwner" : "(貼文主帳)" ,
"plays.noAccounts" : "沒有可用帳號,請先到設定連線 Threads。" ,
"plays.interval" : "間隔(分)" ,
"plays.applyInterval" : "套用間隔" ,
"plays.aiEmpty" : "空白則 AI" ,
"plays.aiBusy" : "產文中…" ,
2026-07-13 01:15:30 +00:00
"plays.aiFail" : "AI 產文失敗" ,
"plays.aiStepDone" : "已產好此步,可再改" ,
"plays.aiNoneFilled" : "沒有可產的空白步驟(或人設未就緒)" ,
"plays.needPersonaForStep" : "此步請先選就緒人設,才能 AI 產文" ,
"plays.aiEmptyResult" : "AI 回傳空白,請重試或換較快的模型" ,
"plays.saveBeforeAi" : "請先「儲存方案」,再一次產全文(背景任務需要 play id) " ,
"plays.scriptJobQueued" : "已排程一次產全文(背景任務,可離開;完成後步驟會自動填上)" ,
"plays.scriptJobDone" : "劇本產文完成,已填入各步驟(可再改)" ,
"plays.scriptJobDoneReload" : "劇本產文完成,請重新開啟方案查看" ,
2026-07-10 05:10:31 +00:00
"plays.replies" : "留言({n}) " ,
"plays.stepN" : "第 {n} 則" ,
"plays.who" : "誰留" ,
"plays.personaOpt" : "人設(選填)" ,
"plays.brandOpt" : "品牌(選填)" ,
"plays.reply" : "留言" ,
"plays.attach" : "附圖" ,
"plays.addOne" : "加一則" ,
"plays.saving" : "儲存中…" ,
"plays.saveScheme" : "儲存方案" ,
"plays.submitting" : "送出中…" ,
"plays.submitOutbox" : "送出到 Outbox" ,
"plays.closeEdit" : "關閉編輯" ,
"plays.noTarget" : "還沒有目標貼文" ,
"plays.resolved" : "已解析連結" ,
"plays.resolveFail" : "解析失敗" ,
"plays.filled" : "已產 {n} 則" ,
"plays.needTarget" : "請先選定目標貼文" ,
"plays.saved" : "方案已儲存" ,
"plays.saveFail" : "儲存失敗" ,
"plays.submitted" : "已送進 Outbox" ,
"plays.submitFail" : "送出失敗" ,
"plays.confirmDelete" : "刪除此方案?" ,
"plays.accountFallback" : "帳號" ,
"inspire.loading" : "載入中…" ,
2026-07-13 01:15:30 +00:00
"inspire.trendsAria" : "話題靈感" ,
"inspire.trendsLabel" : "話題靈感" ,
"inspire.trendsHint" : "網搜彙整,非官方熱搜 · 找靈感會扣搜尋點數" ,
"inspire.trendsSeed" : "示意" ,
2026-07-13 03:18:08 +00:00
"inspire.topicSeed" : "想寫跟「{topic}」有關的 Threads, 幫我發想開場與角度。" ,
2026-07-13 01:15:30 +00:00
"inspire.trendsEmpty" : "點「找靈感」才會搜尋(扣點)" ,
"inspire.refreshConfirm" : "找靈感會消耗 1 次「搜尋」點數,確定?" ,
"inspire.refreshOk" : "已更新 {n} 則話題靈感" ,
"inspire.refreshFail" : "找靈感失敗(點數不足或搜尋失敗)" ,
"inspire.refresh" : "找靈感" ,
"inspire.clearChat" : "新對話" ,
"inspire.clearedNewSession" : "已開新對話" ,
"inspire.sessionsAria" : "靈感對話列表" ,
"inspire.session" : "對話" ,
"inspire.sessionNew" : "新對話" ,
"inspire.newSession" : "+ 新對話" ,
"inspire.newSessionOk" : "已開新對話(舊的還在列表)" ,
"inspire.deleteSession" : "刪除目前對話" ,
"inspire.deleteSessionShort" : "刪除" ,
"inspire.confirmDeleteSession" : "刪除目前對話?此則聊天會永久移除。" ,
"inspire.deletedSession" : "已刪除,已切到其他對話" ,
2026-07-10 05:10:31 +00:00
"inspire.pinAsElement" : "套用為元素" ,
"inspire.you" : "你" ,
"inspire.ai" : "AI" ,
"inspire.system" : "系統" ,
"inspire.useDraft" : "用這則寫" ,
"inspire.openPlay" : "開串場" ,
"inspire.thinking" : "思考中…" ,
2026-07-28 06:33:51 +00:00
"inspire.stop" : "停止產生" ,
"inspire.stopped" : "已停止產生" ,
2026-07-13 01:15:30 +00:00
"inspire.pinnedAria" : "本輪參考(給 AI 看)" ,
"inspire.pinned" : "本輪參考" ,
"inspire.pinnedCount" : "· {n}" ,
2026-07-15 15:23:59 +00:00
"inspire.pinsLocalShort" : "本次工作階段" ,
"inspire.pinsSessionLocal" : "參考項目只套用於本次工作階段;送出訊息時會一併帶入。" ,
2026-07-13 01:15:30 +00:00
"inspire.pickRight" : "右側點選=掛給 AI; 點名稱可插入輸入" ,
"inspire.unpinTitle" : "取消參考" ,
"inspire.insertPinTitle" : "插入主輸入" ,
"inspire.insertBrand" : "聊聊「{name}」" ,
"inspire.insertedPin" : "已插入「{name}」到輸入框" ,
"inspire.flowStep1" : "備料/參考" ,
"inspire.flowStep2" : "聊天發想" ,
"inspire.flowStep3" : "用人設定稿" ,
"inspire.emptyTitle" : "先聊清楚,再用人設定稿" ,
"inspire.emptyDesc" : "選一條路開始。不需要先懂全部按鈕。" ,
"inspire.entryTopic" : "從一句話開始發想" ,
"inspire.entryPaste" : "已有草稿,直接用人設改寫" ,
"inspire.startTopicHint" : "在下方輸入主題或想法, Enter 送出" ,
"inspire.pasteDraftHint" : "把草稿貼進「待改寫內容」,再按用人設改寫" ,
"inspire.needMaterialOrPaste" : "沒有聊天素材時,請直接貼上要改寫的文字" ,
2026-07-20 06:33:14 +00:00
"inspire.flowOneLiner" : "先聊清楚;需要資料時開啟查資料,最後一鍵整理成貼文。" ,
2026-07-13 01:15:30 +00:00
"inspire.showTopics" : "找題材" ,
"inspire.hideTopics" : "收起題材" ,
"inspire.showLibrary" : "參考庫" ,
"inspire.hideLibrary" : "收起庫" ,
"inspire.showAdvanced" : "進階" ,
"inspire.hideAdvanced" : "收起進階" ,
"inspire.readyToWrite" : "已聊 {n} 輪,可以定稿了" ,
2026-07-10 05:10:31 +00:00
"inspire.inputAria" : "跟 AI 說" ,
2026-07-13 01:15:30 +00:00
"inspire.inputPh" : "想發想什麼? Enter 送出 · Shift+Enter 換行" ,
2026-07-10 05:10:31 +00:00
"inspire.send" : "送出" ,
2026-07-20 06:33:14 +00:00
"inspire.generate" : "整理成貼文" ,
"inspire.generateHint" : "根據整段對話、人設聲紋與高互動寫法整理成可發布正文" ,
"inspire.webSearch" : "查資料" ,
"inspire.webSearchOn" : "查資料:開" ,
"inspire.webSearchHint" : "開啟後,下一則訊息會先用 Exa 查資料再交給 AI 討論" ,
"inspire.needConversation" : "先聊一句你的想法,再整理成貼文。" ,
"inspire.needReadyPersona" : "請先選擇已完成分析的人設。" ,
2026-07-13 01:15:30 +00:00
"inspire.generating" : "改寫中…" ,
"inspire.generateOk" : "已依人設改寫成草稿" ,
"inspire.materialTitle" : "鎖定要寫的內容" ,
"inspire.materialHint" : "產文只會改寫這段(可編輯),不會另起新主題。聊天負責發想,這裡負責定稿。" ,
"inspire.materialLabel" : "待改寫內容" ,
"inspire.materialPh" : "從對話整理出的重點、角度、想講的事…" ,
"inspire.rewriteNotes" : "改寫指示(可選)" ,
"inspire.rewriteNotesPh" : "例如:短一點、更口語、加問句" ,
"inspire.rewriteDefault" : "用人設寫成 Threads 正文" ,
"inspire.confirmRewrite" : "用人設改寫" ,
"inspire.needMaterial" : "先聊出一些內容,或在素材框貼上要改寫的文字" ,
2026-07-10 05:10:31 +00:00
"inspire.library" : "元素庫" ,
"inspire.addNew" : "+ 新增" ,
"inspire.kind" : "類型" ,
"inspire.kindRole" : "角色指令" ,
"inspire.kindSnippet" : "片段" ,
"inspire.kindTrendNote" : "熱點備註" ,
"inspire.kindBrand" : "品牌" ,
"inspire.kindTrend" : "熱點" ,
"inspire.name" : "名稱" ,
"inspire.namePh" : "例如:專業 Threads 寫手" ,
"inspire.body" : "內容(會進 prompt) " ,
"inspire.bodyPh" : "你是一位…" ,
"inspire.saveElement" : "存進元素庫" ,
"inspire.citeBrand" : "引用品牌" ,
"inspire.applied" : "已套用" ,
"inspire.clickApply" : "點擊套用" ,
"inspire.noBrands" : "尚無品牌" ,
"inspire.appliedToggle" : "已套用 · 再點取消" ,
"inspire.deleteAria" : "刪除" ,
2026-07-13 01:15:30 +00:00
"inspire.needInput" : "先輸入你想聊的方向" ,
2026-07-10 05:10:31 +00:00
"inspire.fail" : "失敗" ,
"inspire.wantWrite" : "想寫關於 {label}: {summary}" ,
"inspire.trendBody" : "主題:{label}。{summary}" ,
"inspire.pinnedTrend" : "已套用熱點 {label}" ,
"inspire.needTitleBody" : "請填名稱與內容" ,
"inspire.added" : "已加入元素庫" ,
"inspire.addFail" : "新增失敗" ,
"inspire.confirmRemove" : "從元素庫移除此項?" ,
2026-07-13 01:15:30 +00:00
"inspire.confirmClear" : "開新對話?(舊對話會保留在列表)" ,
"inspire.genMessage" : "用人設寫成 Threads 正文" ,
"inspire.previewTitle" : "本輪會送出的完整內容" ,
"inspire.previewPrompt" : "完整 prompt( 人設/ 品牌產品/ 元素/ 對話, 與送 AI 相同)" ,
"inspire.previewSections" : "已帶入段落" ,
"inspire.previewPinnedCount" : "套用元素 {n} 個" ,
"inspire.previewNoPins" : "目前沒有套用元素(右側可點選)" ,
"inspire.runes" : "字" ,
"inspire.copyAll" : "複製全文" ,
"inspire.copied" : "已複製完整 prompt" ,
"inspire.copyFail" : "複製失敗" ,
"inspire.rawPrompt" : "送給 AI 的原文(一字不差)" ,
"inspire.verifyHow" : "怎麼確認一致:先按 ? 看 fingerprint → 不改內容直接送出 → 狀態列顯示「與預覽一致」。" ,
"inspire.verifyHowShort" : "先輸入文字 → 按 ? → 不改內容按送出 → 應一致。對話不會整包重送:只帶前情摘要 + 最近幾則。" ,
"inspire.previewModeNote" : "此為 mode={mode} 的實際組裝(與同 mode 送出相同)。" ,
"inspire.lastSentFp" : "剛送出指紋" ,
"inspire.matchOk" : "與上次送出一致 ✓" ,
"inspire.matchBad" : "與預覽不一致( 輸入/ pin/ 人設/ mode 不同)" ,
"inspire.matchBadShort" : "≠ 上次送出 {sent}" ,
"inspire.fpMatch" : "送出指紋 {fp} 與預覽一致" ,
"inspire.fpMismatch" : "指紋不同:預覽 {preview} ≠ 送出 {sent}( 是否改過字/ mode? ) " ,
"inspire.fpSent" : "送出指紋 {fp}" ,
"inspire.viewSent" : "看剛送出的全文" ,
"inspire.viewSentShort" : "剛送" ,
"inspire.sentPrompt" : "剛送出的完整 prompt" ,
"inspire.sentPromptNote" : "後端實際丟給 AI 的 prompt( stream done 回傳)。" ,
2026-07-10 05:10:31 +00:00
"persona.add" : "新增人設" ,
"persona.empty" : "尚無人設" ,
"persona.emptyDesc" : "新增後做分析即可用於產文。" ,
"persona.statusReady" : "ready" ,
"persona.statusAnalyzing" : "分析中" ,
"persona.statusPending" : "待分析" ,
"persona.default" : "預設" ,
"persona.backList" : "← 人設列表" ,
"persona.tabOverview" : "概要" ,
"persona.tabAnalyze" : "分析" ,
"persona.tabFingerprint" : "指紋" ,
"persona.tabPreview" : "試產" ,
"persona.name" : "名稱" ,
"persona.brief" : "定位 brief" ,
"persona.briefPh" : "是誰、對誰說、核心訊息…" ,
"persona.avoid" : "護欄 · 禁止詞(逗號分隔)" ,
"persona.guardChars" : "{n} 字" ,
"persona.banAi" : " · 禁 AI 腔" ,
"persona.notReadySuffix" : " · 未就緒" ,
"persona.setDefault" : "設為預設" ,
"persona.modeAccount" : "公開帳號" ,
"persona.modeText" : "貼文字" ,
"persona.username" : "Threads username" ,
"persona.fromBound" : "從已綁帳號帶入" ,
"persona.select" : "選擇…" ,
"persona.crawlAnalyze" : "爬公開貼文並分析" ,
"persona.crawlBusy" : "爬取/分析中…" ,
"persona.refText" : "參考文字(--- 分隔多篇)" ,
"persona.refTextPh" : "第一段…\n\n---\n\n第二段…" ,
"persona.sourceLabel" : "來源說明(選填)" ,
"persona.sourcePh" : "自己的舊文" ,
"persona.analyzeText" : "從文字分析" ,
"persona.analyzeBusy" : "分析中…" ,
"persona.sampleMeta" : "樣本 {n}" ,
"persona.sourceManual" : "貼文" ,
"persona.analyzeHint" : "完成分析後會顯示 8D 摘要。" ,
"persona.fingerprintHint" : "產文主體。可改口頭禪、節奏、禁忌;儲存後 Studio/ 回覆會吃這份。" ,
"persona.fingerprint" : "語言指紋" ,
"persona.fingerprintPh" : "分析後自動填入…" ,
"persona.saveFingerprint" : "儲存指紋" ,
"persona.tryGen" : "試產主貼 + 回覆" ,
2026-07-13 01:15:30 +00:00
"persona.previewHint" : "依目前指紋寫一則可能的主貼與回文;會嘗試用即時新聞當話題靈感(轉成這個人的口吻,不是新聞稿)。" ,
"persona.previewRunning" : "產文中…" ,
"persona.previewDone" : "試產完成 · 話題:{topic}( {source}) " ,
"persona.previewFail" : "試產失敗,請再試一次" ,
"persona.previewTopicLabel" : "話題靈感:{topic} · {source}" ,
"persona.topicNews" : "即時新聞" ,
"persona.topicManual" : "手動" ,
"persona.topicFallback" : "生活靈感" ,
2026-07-10 05:10:31 +00:00
"persona.notReadyMsg" : "人設未就緒" ,
"persona.rootPost" : "主貼" ,
"persona.reply" : "回覆" ,
"persona.hidePrompt" : "隱藏 prompt block" ,
"persona.showPrompt" : "顯示注入的 prompt" ,
"persona.promptBlock" : "prompt block( post) " ,
"persona.pickOne" : "選一個人設" ,
"persona.pickDesc" : "或按新增開始分析。" ,
"persona.created" : "已建立,請到「分析」完成帳號爬取或貼文字" ,
"persona.saved" : "已儲存" ,
"persona.textDone" : "文字分析完成 · {n} 段 → ready" ,
"persona.analyzeFail" : "分析失敗" ,
"persona.reading" : "正在讀取公開貼文…" ,
"persona.accountDone" : "@{user} · {n} 則 → ready" ,
2026-07-13 01:15:30 +00:00
"persona.jobQueued" : "已排入背景任務 · 可離開此頁,完成後自動存檔" ,
"persona.jobQueuedCrawl" : "已排入爬取/分析任務 · 可離開此頁,完成後自動寫入人設" ,
"persona.jobRunning" : "背景分析中… 完成後會自動更新(也可到「任務」查看進度)" ,
"persona.jobDone" : "背景分析完成 · 已寫入指紋/範本" ,
"persona.jobFailed" : "背景分析失敗,請到任務頁查看錯誤或重試" ,
2026-07-28 06:33:51 +00:00
"persona.loadFail" : "載入人設失敗" ,
2026-07-13 01:15:30 +00:00
"persona.openJob" : "開啟任務詳情" ,
2026-07-10 05:10:31 +00:00
"persona.setDefaultMsg" : "「{name}」已設為預設" ,
"persona.confirmDelete" : "確定刪除人設「{name}」?" ,
"persona.deleted" : "人設已刪除" ,
"persona.needReady" : "請先完成分析( ready) " ,
"persona.dim.d1Tone" : "D1 語氣人格" ,
"persona.dim.d2Structure" : "D2 結構模板" ,
"persona.dim.d3Interaction" : "D3 互動方式" ,
"persona.dim.d4Topics" : "D4 主題分布" ,
"persona.dim.d5Rhythm" : "D5 發文節奏" ,
"persona.dim.d6Visual" : "D6 視覺語法" ,
"persona.dim.d7Conversion" : "D7 轉換方式" ,
"persona.dim.d8Risk" : "D8 風險紅線" ,
"admin.users.loadFail" : "載入失敗" ,
"admin.users.created" : "已新增島民「{name}」· 請複製下方密碼" ,
"admin.users.createFail" : "新增失敗" ,
"admin.users.unlimitedOn" : "「{name}」已設不擋額度(用量仍計算)" ,
"admin.users.unlimitedOff" : "「{name}」已改回依方案擋額度" ,
"admin.users.updateFail" : "更新失敗" ,
"admin.users.planSet" : "「{name}」方案 → {plan}" ,
"admin.users.confirmSuspend" : "確定停權「{name}」?\\n停權後無法登入。" ,
"admin.users.confirmUnsuspend" : "確定復權「{name}」?\\n復權後可重新登入。" ,
"admin.users.didSuspend" : "已停權「{name}」" ,
"admin.users.didUnsuspend" : "已復權「{name}」" ,
"admin.users.suspendFail" : "停權失敗" ,
"admin.users.unsuspendFail" : "復權失敗" ,
"admin.users.markedVerified" : "已將 {name} 標為信箱已驗證" ,
"admin.users.markedUnverified" : "已將 {name} 標為未驗證" ,
"admin.users.rolesUpdated" : "已更新 {name} 的權限:{roles}" ,
"admin.users.rolesFail" : "權限更新失敗" ,
"admin.users.confirmReset" : "確定幫「{name}」重設密碼?\\n臨時密碼會固定顯示直到你按關閉( 可重整) 。" ,
"admin.users.resetDone" : "已重設 {name} 的密碼(下方可持續顯示,請複製後再關閉)" ,
"admin.users.resetFail" : "重設失敗" ,
"admin.users.copied" : "已複製到剪貼簿" ,
"admin.users.copyFail" : "複製失敗,請手動選取密碼" ,
"admin.users.confirmDismissTemp" : "關閉後此頁將不再顯示這組臨時密碼(若尚未複製請先複製)。確定關閉?" ,
"admin.users.tempPwNew" : "新島民臨時密碼" ,
"admin.users.tempPw" : "臨時密碼" ,
"admin.users.tempPwPersist" : "(持續顯示 · 可重整)" ,
"admin.users.copyPw" : "複製密碼" ,
"admin.users.close" : "關閉" ,
"admin.users.createTitle" : "新增島民" ,
"admin.users.memberName" : "島民名稱" ,
"admin.users.displayNamePh" : "顯示名稱" ,
"admin.users.email" : "Email" ,
"admin.users.initPassword" : "初始密碼(選填)" ,
2026-07-10 12:54:45 +00:00
"admin.users.initPasswordPh" : "空白則自動產生;若填寫須符合密碼政策" ,
2026-07-10 05:10:31 +00:00
"admin.users.markVerifiedCheck" : "信箱標為已驗證(可直接使用)" ,
"admin.users.alsoAdmin" : "同時設為管理員" ,
"admin.users.creating" : "建立中…" ,
"admin.users.createSubmit" : "建立島民" ,
"admin.users.clear" : "清除" ,
"admin.users.searchActive" : "搜尋「{query}」· 可匹配名稱、Email、uid" ,
"admin.users.noMatch" : "無符合" ,
"admin.users.none" : "尚無島民" ,
"admin.users.you" : "這是你" ,
"admin.users.status" : "狀態" ,
"admin.users.role" : "角色" ,
"admin.users.emailVerify" : "信箱驗證" ,
"admin.users.bio" : "簡介" ,
"admin.users.timezone" : "時區" ,
"admin.users.notifyEmail" : "Email 通知" ,
"admin.users.on" : "開" ,
"admin.users.off" : "關" ,
"admin.users.createdAt" : "建立" ,
"admin.users.updatedAt" : "更新" ,
"admin.users.accountStatus" : "帳號狀態" ,
"admin.users.updating" : "更新中…" ,
"admin.users.usageTitle" : "用量與方案" ,
2026-07-10 12:54:45 +00:00
"admin.users.usageLiveSkip" : "方案/額度屬 Usage 域, live 後端尚未接上( M3) ; 此區僅 mock 可改。" ,
2026-07-10 05:10:31 +00:00
"admin.users.plan" : "方案" ,
"admin.users.planOption" : "{name}( {credits} 點/月)" ,
"admin.users.unlimited" : "不擋額度" ,
"admin.users.byPlan" : "依方案" ,
"admin.users.setUnlimited" : "設為不擋額度" ,
"admin.users.setLimited" : "改回擋額度" ,
"admin.users.unlimitedHint" : "不擋額度: 達方案上限仍可繼續用; AI/ Search 次數與點數照樣計算。" ,
"admin.users.loadingUsage" : "載入用量設定…" ,
"admin.users.assignRoles" : "指派權限" ,
"admin.users.memberBase" : "{role}(基底,不可關閉)" ,
"admin.users.adminDesc" : "{role} — 可管理島民與系統" ,
"admin.users.saving" : "儲存中…" ,
"admin.users.saveRoles" : "儲存權限" ,
"admin.users.markUnverifiedBtn" : "標為未驗證" ,
"admin.users.markVerifiedBtn" : "標為已驗證" ,
"admin.users.resetting" : "重設中…" ,
"admin.users.resetTemp" : "重設密碼(產生臨時)" ,
"admin.users.customPw" : "或指定新密碼(選填)" ,
2026-07-10 12:54:45 +00:00
"admin.users.customPwPh" : "密碼須至少 12 碼,且含大寫、小寫、數字與符號" ,
2026-07-10 05:10:31 +00:00
"admin.users.resetWithCustom" : "用指定密碼重設" ,
"usage.tabMine" : "我的用量" ,
"usage.tabTenant" : "全體用量" ,
"usage.currentPlan" : "目前方案" ,
"usage.planMeta" : "/月 · 每月 {n} 點額度" ,
"usage.changePlan" : "變更方案" ,
2026-07-13 03:18:08 +00:00
"usage.upgradePlan" : "升級方案" ,
2026-07-23 05:56:42 +00:00
"usage.outcome.title" : "本月成果" ,
"usage.outcome.summary" : "觸達 {reach} · 對話 {conversations} · 成交 {conversions}" ,
"usage.outcome.amount" : "(約 ${amount}) " ,
"usage.outcome.emptyHint" : "本月還沒有可歸因的成果,去海巡或發文試試。" ,
2026-07-13 03:18:08 +00:00
"usage.warn.unlimitedOver" : "本月已用 {used} 點(方案 {cap},不擋額度,仍可繼續)。" ,
"usage.warn.exhausted" : "本月點數已用完。可升級方案或等待下月重置。" ,
"usage.warn.high" : "本月已用 {pct}% 點數。" ,
"usage.warn.meterNear" : "{label} 接近單項上限({credits}/{cap} 點)。" ,
2026-07-10 05:10:31 +00:00
"usage.usedThisMonth" : "本月已用" ,
"usage.remainLabel" : "剩餘" ,
"usage.ledgerToggle" : "使用紀錄" ,
"usage.collapse" : "收合" ,
"usage.eventsCount" : "{n} 筆" ,
"usage.granularity" : "粒度" ,
"usage.day" : "日" ,
"usage.monthUnit" : "月" ,
"usage.year" : "年" ,
"usage.from" : "起" ,
"usage.to" : "迄" ,
"usage.callCounts" : "呼叫次數" ,
"usage.noMembers" : "尚無會員" ,
"usage.planAria" : "{name} 方案" ,
"usage.unlimitedTitle" : "不擋額度" ,
"usage.setLimited" : "改回擋額度" ,
"usage.setUnlimited" : "設為不擋額度" ,
"usage.limitShort" : "擋" ,
"usage.subscribed" : "已訂閱 {name}" ,
"usage.unlimitedSet" : "已設不擋額度" ,
"usage.limitedSet" : "已改回擋額度" ,
"usage.planUpdated" : "已更新方案 {name}" ,
"usage.fail" : "失敗" ,
"currency.TWD" : "新台幣 (TWD)" ,
"currency.USD" : "美元 (USD)" ,
"currency.JPY" : "日圓 (JPY)" ,
"currency.EUR" : "歐元 (EUR)" ,
"currency.HKD" : "港幣 (HKD)" ,
"locale.zh-TW" : "繁體中文" ,
"locale.en" : "English" ,
"pager.nav" : "分頁" ,
"pager.pageSize" : "每頁筆數" ,
"pager.perPage" : "{n}/頁" ,
"pager.prev" : "上一頁" ,
"pager.next" : "下一頁" ,
"plays.defaultTitle" : "新方案" ,
"plays.topicOnPost" : "掛在:{snippet}" ,
"plays.topicOnExternal" : "掛在:{label} · {snippet}" ,
"plays.externalFallback" : "外站貼" ,
"persona.newName" : "新人設" ,
"persona.previewTopic" : "週末想找能坐久的咖啡店" ,
"persona.previewReplySample" : "大安那間還行但人很多" ,
"inspire.playTitle" : "靈感串場" ,
"play.err.needLead" : "請選擇主帳號" ,
"play.err.needRoot" : "請至少有一則主貼" ,
"play.err.firstMustRoot" : "第一則必須是主貼" ,
"play.err.rootMustLead" : "主貼必須使用主帳" ,
"play.err.rootEmpty" : "主貼文案不可空白" ,
"play.err.replyAccount" : "回覆只能用主帳或已選配角" ,
"play.err.replyEmpty" : "回覆文案不可空白" ,
"play.err.needTarget" : "請選擇自己的貼文,或貼上 Threads 連結" ,
"play.err.needReplies" : "請至少排 1 則留言" ,
"play.err.needReplyAccounts" : "請至少選一個可回覆帳號" ,
"play.err.stepAccount" : "每則留言都要指定可用帳號" ,
"play.err.stepEmpty" : "留言內容不可空白" ,
"play.err.notFound" : "找不到互回方案" ,
"time.justNow" : "剛剛" ,
"time.minAgo" : "{n} 分前" ,
"time.hourAgo" : "{n} 小時前" ,
"time.dayAgo" : "{n} 天前" ,
"time.min" : "{n} 分鐘" ,
"time.hour" : "{n} 小時" ,
"time.day" : "{n} 天" ,
"time.expired" : "已過期 {span}" ,
"time.remaining" : "剩餘 {span}" ,
2026-07-13 01:15:30 +00:00
"time.sessionUnknown" : "未記錄到期時間" ,
"time.sessionExpired" : "Token 已過期 · {absolute}" ,
"time.sessionSoon" : "即將到期 · {relative}( {absolute}) " ,
"time.sessionOk" : "有效 · {relative}( {absolute}) " ,
2026-08-03 05:52:02 +00:00
// demand-radar: 服務檔案( 每會員一份, 判定與回覆都讀它)
"radar.profile.title" : "服務檔案" ,
"radar.profile.subtitle" : "雷達用這份資料判斷商機是否值得回,回覆也照這裡的價格與口吻寫。" ,
"radar.profile.firstTimeHint" : "先填服務檔案,才能開啟雷達訂閱。內容越具體,判定與回覆越準。" ,
"radar.profile.updatedAt" : "上次更新:{at}" ,
"radar.profile.saved" : "服務檔案已儲存" ,
"radar.profile.services" : "服務與價格" ,
"radar.profile.servicesHint" : "至少填一項。價格留空代表面議,填了就會出現在回覆裡。" ,
"radar.profile.serviceName" : "服務名稱" ,
"radar.profile.serviceNamePh" : "例:室內設計丈量規劃" ,
"radar.profile.priceMin" : "價格下限" ,
"radar.profile.priceMax" : "價格上限" ,
"radar.profile.addService" : "+ 新增服務" ,
"radar.profile.areas" : "服務區域" ,
"radar.profile.areasHint" : "選你實際接得到的縣市;地區不合的商機會被降分。可遠端就勾下面那項。" ,
"radar.profile.remoteOk" : "可遠端服務(不限地區)" ,
"radar.profile.forbidden" : "禁語" ,
"radar.profile.forbiddenHint" : "一行一條。這些字不會出現在任何生成的回覆裡。" ,
"radar.profile.forbiddenPh" : "保證\n最便宜\n第一名" ,
"radar.profile.cases" : "案例" ,
"radar.profile.casesHint" : "選填。回覆需要舉證時會引用,沒有就不引用。" ,
"radar.profile.caseTitle" : "案例標題" ,
"radar.profile.caseSummary" : "一句話說明" ,
"radar.profile.addCase" : "+ 新增案例" ,
"radar.profile.faq" : "常見問答" ,
"radar.profile.faqHint" : "選填。對方問到類似問題時,回覆會照這裡的答案講。" ,
"radar.profile.faqQuestion" : "問題" ,
"radar.profile.faqAnswer" : "回答" ,
"radar.profile.addFaq" : "+ 新增問答" ,
"radar.profile.availability" : "可接案時間" ,
"radar.profile.availabilityHint" : "例:兩週內可開工、只接週末" ,
"radar.profile.toneNote" : "口吻備註" ,
"radar.profile.toneNoteHint" : "例:講話直接不客套、不用驚嘆號" ,
// demand-radar: 商機訂閱( 每日自動; 對照海巡= 手動掃場)
"radar.watches.title" : "商機訂閱" ,
"radar.watches.subtitle" : "訂好關鍵字後每天自動巡,整理成「今日商機」。和海巡「按一次掃一輪」不同。" ,
"radar.watches.needProfile" : "先填服務檔案,才能開商機訂閱" ,
"radar.watches.needProfileHint" : "系統靠服務檔案判斷需求適不適合你;沒有它會誤判。" ,
"radar.watches.goProfile" : "去填服務檔案" ,
"radar.watches.quota" : "啟用中 {used} / {max}" ,
"radar.watches.quotaFull" : "已達方案上限,要新增請先暫停或封存一個" ,
"radar.watches.add" : "+ 新增訂閱" ,
"radar.watches.newTitle" : "新增商機訂閱" ,
"radar.watches.editTitle" : "編輯商機訂閱" ,
"radar.watches.terms" : "關鍵字" ,
"radar.watches.termsHint" : "一行一個,也可用逗號分隔。客人會搜的說法,命中後進意向判定。" ,
"radar.watches.termsPh" : "推薦室內設計\n找設計師" ,
"radar.watches.excludeTerms" : "排除詞" ,
"radar.watches.excludeHint" : "命中這些字就整筆跳過,例如同業自我推銷、抽獎文。" ,
"radar.watches.excludePh" : "徵才\n抽獎" ,
"radar.watches.regionsHint" : "地區留空=沿用服務檔案的服務區域;只有這個訂閱要縮小範圍時才選。" ,
"radar.watches.regionsFromProfile" : "地區沿用服務檔案" ,
"radar.watches.enableNow" : "建立後立刻啟用(會佔用啟用配額)" ,
"radar.watches.filterStatus" : "狀態" ,
"radar.watches.statusAll" : "全部" ,
"radar.watches.status.active" : "啟用中" ,
"radar.watches.status.paused" : "已暫停" ,
"radar.watches.status.archived" : "已封存" ,
"radar.watches.pause" : "暫停" ,
"radar.watches.resume" : "恢復" ,
"radar.watches.archive" : "封存" ,
"radar.watches.confirmArchive" : "封存後不會再巡,也不能恢復。要繼續嗎?" ,
"radar.watches.created" : "訂閱已建立" ,
"radar.watches.updated" : "訂閱已更新" ,
"radar.watches.paused" : "訂閱已暫停" ,
"radar.watches.resumed" : "訂閱已恢復" ,
"radar.watches.archived" : "訂閱已封存" ,
"radar.watches.lastSwept" : "上次巡:{at}" ,
"radar.watches.neverSwept" : "還沒巡過" ,
"radar.watches.empty" : "還沒有商機訂閱" ,
"radar.watches.emptyHint" : "加客人會用的說法(例如「推薦室內設計」),系統會每天自動幫你巡。若要現在手動掃痛點/話題,用側欄「海巡」。" ,
"radar.watches.emptyFiltered" : "這個狀態下沒有訂閱" ,
"radar.watches.sweepNow" : "立即補巡" ,
"radar.watches.sweepQueued" : "已排入商機巡檢" ,
"radar.watches.sweepStarted" : "商機巡檢已開始(任務 {job}…)" ,
"today.radar.title" : "今日商機" ,
"today.radar.total" : "找到" ,
"today.radar.high" : "高" ,
"today.radar.mid" : "中" ,
"today.radar.low" : "低" ,
"today.radar.open" : "查看今日商機" ,
"today.radar.empty" : "還沒有今日商機。訂閱關鍵字後會每天自動更新(與海巡手動掃場不同)。" ,
"today.radar.goProfile" : "先填服務檔案" ,
"today.radar.goWatches" : "去訂閱關鍵字" ,
"radar.suggest.title" : "關鍵字建議" ,
"radar.suggest.hint" : "依你的服務檔案想幾個客人真的會打的字,逐條或全部採用;採用後仍要按儲存才會建立。" ,
"radar.suggest.ask" : "取得建議" ,
"radar.suggest.again" : "再想幾個" ,
"radar.suggest.asking" : "想關鍵字中…" ,
"radar.suggest.adopt" : "採用" ,
"radar.suggest.adopted" : "已採用" ,
"radar.suggest.adoptAll" : "全部採用" ,
"radar.suggest.include" : "關鍵字" ,
"radar.suggest.exclude" : "排除詞" ,
"radar.suggest.none" : "這次沒想出可用的字,請把服務檔案寫具體一點再試。" ,
// demand-radar: 今日商機( 自動名單)
"radar.today.title" : "今日商機" ,
"radar.today.subtitle" : "訂閱後每天自動整理的需求名單(不是海巡那一輪手動掃)。" ,
"radar.today.link.watches" : "商機訂閱" ,
"radar.today.link.crm" : "名單看板" ,
"radar.today.stats.total" : "今日找到" ,
"radar.today.stats.high" : "高意向" ,
"radar.today.stats.mid" : "中意向" ,
"radar.today.stats.low" : "低意向" ,
"radar.today.truncated" : "已達今日上限,{n} 筆較低意向未收錄" ,
"radar.today.lastSwept" : "上次巡檢:{at}" ,
"radar.today.band.high" : "高" ,
"radar.today.band.mid" : "中" ,
"radar.today.band.low" : "低" ,
"radar.today.status.accepted" : "已加入名單" ,
"radar.today.status.dismissed" : "已略過" ,
"radar.today.status.qualified" : "待處理" ,
"radar.today.status.rejected" : "已否決" ,
"radar.today.status.judging" : "判定中" ,
"radar.today.regionUnknown" : "地區不明" ,
"radar.today.group.high" : "高意向" ,
"radar.today.group.mid" : "中意向" ,
"radar.today.group.low" : "低意向" ,
"radar.today.group.empty" : "這一組目前沒有" ,
"radar.today.group.expand" : "展開" ,
"radar.today.group.collapse" : "收合" ,
"radar.today.action.open" : "原文" ,
"radar.today.action.accept" : "加入名單" ,
"radar.today.action.dismiss" : "略過" ,
"radar.today.action.reply" : "產生回覆" ,
"radar.today.action.hideReply" : "收合回覆" ,
"radar.today.action.reasons" : "判定理由" ,
"radar.today.action.hideReasons" : "收合理由" ,
"radar.today.action.override" : "覆寫分級" ,
"radar.today.reply.hint" : "選一個版本產生草稿;私訊版只提供複製,不會自動送出。" ,
"radar.today.reply.copy" : "複製草稿" ,
"radar.today.reply.variant.public_comment" : "公開留言" ,
"radar.today.reply.variant.dm" : "私訊" ,
"radar.today.reply.variant.no_sales" : "不銷售" ,
"radar.today.reply.variant.professional" : "專業" ,
"radar.today.reply.variant.humorous" : "輕鬆" ,
"radar.today.dim.authenticity" : "真實性" ,
"radar.today.dim.intent" : "意圖" ,
"radar.today.dim.region" : "地區" ,
"radar.today.dim.freshness" : "新鮮度" ,
"radar.today.dim.fit" : "服務匹配" ,
"radar.today.empty.title" : "目前沒有今日商機" ,
"radar.today.empty.fallback" : "稍後再回來,或先檢查商機訂閱與服務檔案。" ,
"radar.today.empty.goProfile" : "去填服務檔案" ,
"radar.today.empty.goWatches" : "去訂閱關鍵字" ,
"radar.today.empty.reason.no_profile" : "還沒有服務檔案,無法判定需求適不適合你。" ,
"radar.today.empty.reason.no_watch" : "還沒有商機訂閱;建立關鍵字後才會每天自動巡(不是海巡那一輪手動掃)。" ,
"radar.today.empty.reason.all_watches_paused" : "訂閱都暫停了,恢復一組才會繼續自動巡。" ,
"radar.today.empty.reason.not_swept_yet" : "今日自動巡還沒跑完,也可在商機訂閱頁按「立即補巡」。" ,
"radar.today.empty.reason.sweep_failed" : "這輪自動巡失敗,請到商機訂閱頁查看或重試。" ,
"radar.today.empty.reason.no_hit" : "有巡但沒有符合的需求,可放寬關鍵字或排除詞。" ,
"radar.today.msg.accepted" : "已加入名單" ,
"radar.today.msg.dismissed" : "已略過" ,
"radar.today.msg.replyReady" : "回覆草稿已產生" ,
"radar.today.msg.overridden" : "分級已更新" ,
"radar.today.msg.copied" : "已複製到剪貼簿" ,
"radar.today.msg.copyFail" : "無法複製,請手動選取文字" ,
"radar.today.msg.marked" : "已標記為已送出/已複製" ,
"radar.today.msg.needReply" : "請先產生回覆草稿" ,
"radar.today.reply.markCopy" : "標記已複製送出" ,
"radar.today.reply.markOutbox" : "標記經發送管道" ,
"radar.today.reply.used" : "已標記使用" ,
"scout.promote" : "收進商機" ,
"scout.promoted" : "已複製進今日商機({band} · {score}),可到側欄「商機」跟進" ,
"scout.promoteFail" : "收進商機失敗" ,
"crm.board.title" : "名單看板" ,
"crm.board.subtitle" : "七階段+待追蹤;從商機加入後在這裡推進。" ,
"crm.board.link.today" : "今日商機" ,
"crm.board.link.followups" : "待追蹤" ,
"crm.board.link.stats" : "轉換統計" ,
"crm.board.empty" : "還沒有聯絡人" ,
"crm.board.emptyHint" : "在今日商機按「加入名單」就會出現在這裡。" ,
"crm.board.oppCount" : "筆商機" ,
"crm.board.conversion" : "成交回報" ,
"crm.board.amount" : "金額(可留空)" ,
"crm.board.reportWon" : "回報成交" ,
"crm.board.notes" : "備註" ,
"crm.board.noteLabel" : "新增備註" ,
"crm.board.addNote" : "儲存備註" ,
"crm.board.timeline" : "時間軸" ,
"crm.board.timelineEmpty" : "還沒有接觸紀錄" ,
"crm.board.opps" : "相關商機" ,
"crm.board.markFollowUp" : "標記待追蹤" ,
"crm.board.clearFollowUp" : "取消待追蹤" ,
"crm.board.msg.stage" : "階段已更新" ,
"crm.board.msg.followUp" : "待追蹤已更新" ,
"crm.board.msg.won" : "已回報成交" ,
"crm.board.msg.note" : "備註已新增" ,
"crm.stage.new_found" : "新發現" ,
"crm.stage.engaged" : "已接觸" ,
"crm.stage.dm_sent" : "已私訊" ,
"crm.stage.replied" : "已回覆" ,
"crm.stage.quoted" : "已報價" ,
"crm.stage.won" : "成交" ,
"crm.stage.lost" : "流失" ,
"crm.stage.needs_follow_up" : "待追蹤" ,
"crm.followups.title" : "待追蹤" ,
"crm.followups.subtitle" : "到期回訪、延後與 AI 草稿。" ,
"crm.followups.link.board" : "名單看板" ,
"crm.followups.link.stats" : "轉換統計" ,
"crm.followups.empty" : "目前沒有待追蹤" ,
"crm.followups.emptyHint" : "標記聯絡人待追蹤或送出回覆後會出現在這裡。" ,
"crm.followups.due" : "到期" ,
"crm.followups.openContact" : "開啟聯絡人" ,
"crm.followups.aiMessage" : "AI 追蹤草稿" ,
"crm.followups.done" : "完成" ,
"crm.followups.snooze" : "延後 3 天" ,
"crm.followups.escalatedHint" : "已提醒兩次仍無動作,建議考慮轉未成交。" ,
"crm.followups.status.scheduled" : "排程中" ,
"crm.followups.status.notified" : "已通知" ,
"crm.followups.status.done" : "已完成" ,
"crm.followups.status.snoozed" : "已延後" ,
"crm.followups.status.escalated" : "需升級處理" ,
"crm.followups.msg.done" : "已完成" ,
"crm.followups.msg.snoozed" : "已延後 3 天" ,
"crm.followups.msg.drafted" : "追蹤草稿已產生" ,
"crm.stats.title" : "轉換統計" ,
"crm.stats.subtitle" : "關鍵字、回覆版本與來源。樣本不足不下結論。" ,
"crm.stats.terms" : "關鍵字轉換" ,
"crm.stats.variants" : "回覆版本成功率" ,
"crm.stats.sources" : "成交來源" ,
"crm.stats.emptyDim" : "尚無足夠資料" ,
"crm.stats.insufficient" : "樣本不足" ,
"crm.stats.col.term" : "關鍵字" ,
"crm.stats.col.variant" : "版本" ,
"crm.stats.col.source" : "來源" ,
"crm.stats.col.accepted" : "加入" ,
"crm.stats.col.replied" : "回覆" ,
"crm.stats.col.won" : "成交" ,
"crm.stats.col.used" : "使用" ,
"crm.stats.col.rate" : "比率" ,
2026-07-10 05:10:31 +00:00
} ;
export const en : MessageDict = {
"app.name" : "Lapras" ,
"app.nameEn" : "Lapras" ,
"app.nameZh" : "巡樓" ,
"app.tagline" : "Patrol Threads with ease" ,
"app.taglineEn" : "Patrol Threads with ease" ,
"nav.today" : "Today" ,
"nav.crew" : "Accounts" ,
"nav.studio" : "Studio" ,
2026-08-03 05:52:02 +00:00
"nav.radar" : "Demand" ,
"nav.crm" : "CRM" ,
2026-08-06 14:16:49 +00:00
"nav.scout" : "Discover" ,
2026-07-10 05:10:31 +00:00
"nav.outbox" : "Outbox" ,
"nav.jobs" : "Jobs" ,
"nav.brands" : "Brands" ,
2026-07-23 05:56:42 +00:00
"nav.playbooks" : "Playbooks" ,
"nav.insights" : "Insights" ,
"nav.benchmark" : "Benchmark" ,
"nav.utm" : "UTM" ,
2026-07-10 05:10:31 +00:00
"nav.more" : "More" ,
"nav.moreTitle" : "More" ,
"nav.users" : "Islanders" ,
"nav.usage" : "Usage & plans" ,
"nav.profile" : "Profile" ,
2026-07-10 12:54:45 +00:00
"nav.invite" : "Invites" ,
2026-07-10 05:10:31 +00:00
"nav.settings" : "Settings" ,
"nav.logout" : "Log out" ,
"nav.navigate" : "Navigate" ,
2026-07-23 05:56:42 +00:00
"navGroup.workflow" : "Workflow" ,
"navGroup.accounts" : "Accounts & brands" ,
"navGroup.growth" : "Growth tools" ,
"workspace.label" : "Workspace" ,
"workspace.default" : "Default" ,
"workspace.new" : "+ New workspace" ,
"workspace.newPrompt" : "New workspace name" ,
2026-07-10 05:10:31 +00:00
"common.save" : "Save" ,
2026-08-03 05:52:02 +00:00
"common.saving" : "Saving…" ,
2026-07-10 05:10:31 +00:00
"common.cancel" : "Cancel" ,
2026-08-03 05:52:02 +00:00
"common.close" : "Close" ,
2026-07-10 05:10:31 +00:00
"common.loading" : "Loading…" ,
2026-07-28 06:33:51 +00:00
"common.retry" : "Retry" ,
2026-07-10 05:10:31 +00:00
"common.back" : "Back" ,
"common.delete" : "Delete" ,
"common.edit" : "Edit" ,
"common.search" : "Search" ,
"common.confirm" : "Confirm" ,
"common.optional" : "Optional" ,
"common.success" : "Saved" ,
"common.error" : "Something went wrong" ,
"common.yes" : "Yes" ,
"common.no" : "No" ,
2026-08-03 05:52:02 +00:00
"help.open" : "Help" ,
"help.kicker" : "This page" ,
"help.section.what" : "What this page is for" ,
"help.section.how" : "How to use it" ,
"help.section.tips" : "Tips" ,
"help.section.related" : "Related" ,
"help.shortcutHint" : "Open via the “?” next to the page title. Shortcut: ? toggles; Esc closes." ,
"help.page.generic.title" : "Lapras console" ,
"help.page.generic.what" : "Your work desk. Use the sidebar (or mobile dock) to switch features; the top bar has usage, notifications, and this help." ,
"help.page.generic.step1" : "Pick a task from the nav (patrol, radar, outbox, …)." ,
"help.page.generic.step2" : "Open Help from the top bar or press ? when you need context." ,
"help.page.generic.step3" : "Settings, profile, and plans live in the account menu." ,
"help.page.generic.tips" : "Help never changes your data; open and close anytime." ,
"help.page.today.title" : "Today" ,
"help.page.today.what" : "Daily dashboard: opportunities, patrol queue, outbox pulse, and account health so you know what to do first." ,
"help.page.today.step1" : "Check the opportunities summary; open Radar if there are leads." ,
"help.page.today.step2" : "Clear pending patrol replies." ,
"help.page.today.step3" : "Track failed or active Outbox items from here." ,
"help.page.today.tips" : "When there are no opportunities, the summary guides you to the service profile or watches." ,
"help.page.crew.title" : "Accounts (Crew)" ,
"help.page.crew.what" : "Connected Threads accounts, health, and usability. Publishing and outreach start from accounts here." ,
"help.page.crew.step1" : "Connect at least one usable account via OAuth." ,
"help.page.crew.step2" : "Check connection and health (avoid auto-send on throttle)." ,
"help.page.crew.step3" : "Tune AI and dev options under Settings if needed." ,
"help.page.crew.tips" : "Warn/throttle health blocks automatic public sends; copy manually instead." ,
"help.page.studio.title" : "Studio" ,
"help.page.studio.what" : "Draft posts, personas, inspiration, and plays; finished work goes to Outbox to publish." ,
"help.page.studio.step1" : "Pick a persona or brand voice, then draft." ,
"help.page.studio.step2" : "Use inspiration/mimic tools, then edit by hand." ,
"help.page.studio.step3" : "Send to Outbox and confirm the schedule there." ,
"help.page.studio.tips" : "Studio drafts are not published until Outbox succeeds." ,
"help.page.scout.title" : "Patrol (manual sweep)" ,
2026-08-03 07:58:07 +00:00
"help.page.scout.what" : "Plan keywords first, confirm, then search: find pain/topic threads, draft, reply, done. Not the daily auto list — that is Demand in the nav." ,
"help.page.scout.step1" : "Write your intent (optional product), generate keywords, then edit the queries." ,
"help.page.scout.step2" : "Confirm search, then work the queue sorted by post time." ,
2026-08-03 05:52:02 +00:00
"help.page.scout.step3" : "Worth long-term follow-up? Use “Save to Demand” to copy into today’ s opportunities (scout status stays unchanged)." ,
2026-08-03 07:58:07 +00:00
"help.page.scout.tips" : "Patrol = one-off sortie. Demand = subscribed keywords, refreshed every day. Keywords should describe their problem, not your product pitch." ,
2026-08-03 05:52:02 +00:00
"help.page.radar_today.title" : "Today's demand (auto list)" ,
"help.page.radar_today.what" : "A daily demand list from your keyword watches, scored high/mid/low. Unlike Patrol, you don’ t re-scan by hand each time." ,
"help.page.radar_today.step1" : "Check stats; if empty, open Demand watches or the service profile." ,
"help.page.radar_today.step2" : "Start high intent: open original → draft reply → add to CRM or dismiss." ,
"help.page.radar_today.step3" : "Low intent is collapsed; long-term follow-up lives on the CRM board." ,
"help.page.radar_today.tips" : "Need a one-off pain/topic sweep? Use Patrol. Want a steady daily list? Stay on Demand watches." ,
"help.page.radar_watches.title" : "Demand watches" ,
"help.page.radar_watches.what" : "Always-on keywords swept daily into Today’ s demand. This is not Patrol’ s “run once” scan." ,
"help.page.radar_watches.step1" : "Fill the service profile on Brands first." ,
"help.page.radar_watches.step2" : "Add a watch: terms buyers type, excludes, optional regions." ,
"help.page.radar_watches.step3" : "Stay active for the daily job, or hit “Sweep now” for an extra pass." ,
"help.page.radar_watches.tips" : "Active slots are plan-capped; pause or archive to free one." ,
"help.page.crm_board.title" : "CRM board" ,
"help.page.crm_board.what" : "Contacts after you accept from Today’ s demand: seven stages plus follow-up, notes, wins, and timeline." ,
"help.page.crm_board.step1" : "On Today’ s demand, hit Add to CRM; people land in New." ,
"help.page.crm_board.step2" : "Open a contact to move stage, note, or flag follow-up." ,
"help.page.crm_board.step3" : "Report a win when you close (amount optional)." ,
"help.page.crm_board.tips" : "Follow-up is a flag alongside stages, not an eighth column stage value." ,
"help.page.crm_followups.title" : "Follow-ups" ,
"help.page.crm_followups.what" : "Due revisits: done, snooze, or AI draft for a manual message." ,
"help.page.crm_followups.step1" : "Check due date and status (including escalated)." ,
"help.page.crm_followups.step2" : "Generate an AI draft if you need copy, then send yourself." ,
"help.page.crm_followups.step3" : "Mark done or snooze three days." ,
"help.page.crm_followups.tips" : "Nothing is auto-messaged; drafts are for copy only." ,
"help.page.crm_stats.title" : "Conversion stats" ,
"help.page.crm_stats.what" : "Conversion by term, reply variant, and source. No ranking when samples are thin." ,
"help.page.crm_stats.step1" : "Read absolute counts first." ,
"help.page.crm_stats.step2" : "Ignore ranking on “insufficient sample” rows." ,
"help.page.crm_stats.step3" : "Tune watches and reply style from what you learn." ,
"help.page.crm_stats.tips" : "Rates stay hidden on small samples on purpose." ,
"help.page.outbox.title" : "Outbox" ,
"help.page.outbox.what" : "Schedule and send queue — last stop before Threads publish." ,
"help.page.outbox.step1" : "Review pending and failed items." ,
"help.page.outbox.step2" : "Retry failures or edit the draft." ,
"help.page.outbox.step3" : "Track long jobs under Jobs as well." ,
"help.page.outbox.tips" : "Health throttle blocks automatic send." ,
"help.page.jobs.title" : "Jobs" ,
"help.page.jobs.what" : "Background work (scans, sweeps, analysis) with progress and outcomes." ,
"help.page.jobs.step1" : "Scan status: queued / running / success / failed." ,
"help.page.jobs.step2" : "Open a job for the progress summary." ,
"help.page.jobs.step3" : "On failure, retry from the related feature." ,
"help.page.jobs.tips" : "Radar “Sweep now” creates a radar_sweep job here." ,
"help.page.brands.title" : "Brands" ,
"help.page.brands.what" : "Brand/product data and the service profile radar uses for scoring and replies." ,
"help.page.brands.step1" : "Maintain brand and product basics." ,
"help.page.brands.step2" : "Fill the service profile: services, areas, forbidden words." ,
"help.page.brands.step3" : "Save, then enable radar watches." ,
"help.page.brands.tips" : "Richer profiles mean better scoring and safer replies." ,
"help.page.playbooks.title" : "Playbooks" ,
"help.page.playbooks.what" : "Share or adopt patrol briefs, personas, and play templates." ,
"help.page.playbooks.step1" : "Browse templates." ,
"help.page.playbooks.step2" : "Adopt into your workspace and edit." ,
"help.page.playbooks.step3" : "Use them in Patrol or Studio." ,
"help.page.playbooks.tips" : "Templates are starting points — rewrite for your brand." ,
"help.page.insights.title" : "Insights" ,
"help.page.insights.what" : "Post and engagement performance so you can double down on what works." ,
"help.page.insights.step1" : "Sync or review recent post metrics." ,
"help.page.insights.step2" : "Feed winners back into Studio." ,
"help.page.insights.step3" : "Compare with Benchmark when available." ,
"help.page.insights.tips" : "Sync lag depends on the platform; not second-level live." ,
"help.page.benchmark.title" : "Benchmark" ,
"help.page.benchmark.what" : "Anonymous site-wide medians when sample size is enough." ,
"help.page.benchmark.step1" : "Read metrics that have samples." ,
"help.page.benchmark.step2" : "Don’ t over-read thin samples." ,
"help.page.benchmark.step3" : "Adjust content strategy from the gap." ,
"help.page.benchmark.tips" : "Meaningful medians usually need sample size ≥ 5." ,
"help.page.utm.title" : "UTM" ,
"help.page.utm.what" : "Build UTM links so you can attribute traffic later." ,
"help.page.utm.step1" : "Fill campaign and source params." ,
"help.page.utm.step2" : "Use the link in posts or DMs." ,
"help.page.utm.step3" : "Match results in your analytics tool." ,
"help.page.utm.tips" : "Keep naming consistent for clean reports." ,
"help.page.settings.title" : "Settings" ,
"help.page.settings.what" : "AI providers, dev mode, session, and other system options." ,
"help.page.settings.step1" : "Confirm AI keys (platform or BYOK)." ,
"help.page.settings.step2" : "Turn on dev mode only when needed." ,
"help.page.settings.step3" : "Return to a feature page and verify." ,
"help.page.settings.tips" : "Bad keys show up as generation/scan failures in usage or jobs." ,
"help.page.profile.title" : "Profile" ,
"help.page.profile.what" : "Your member account, password, and basic prefs." ,
"help.page.profile.step1" : "Update display name and basics." ,
"help.page.profile.step2" : "Change password if needed." ,
"help.page.profile.step3" : "Language/theme live in UI prefs." ,
"help.page.profile.tips" : "Member profile is separate from Threads connections (Crew)." ,
"help.page.invite.title" : "Invites" ,
"help.page.invite.what" : "Invite links, downline relations, and rewards info." ,
"help.page.invite.step1" : "Copy and share your invite link." ,
"help.page.invite.step2" : "Review established relations." ,
"help.page.invite.step3" : "Rewards follow in-product rules." ,
"help.page.invite.tips" : "Don’ t spam invites; abuse can suspend accounts." ,
"help.page.usage.title" : "Usage & plan" ,
"help.page.usage.what" : "Credits, meter usage, and plan caps." ,
"help.page.usage.step1" : "Check each meter." ,
"help.page.usage.step2" : "Near limits, upgrade or use BYOK." ,
"help.page.usage.step3" : "Plan details are on the Plans page." ,
"help.page.usage.tips" : "BYOK usually counts calls only (see on-page labels)." ,
"help.page.usage_plans.title" : "Plans" ,
"help.page.usage_plans.what" : "Compare and choose a paid plan." ,
"help.page.usage_plans.step1" : "Compare caps and features." ,
"help.page.usage_plans.step2" : "Start checkout for a plan." ,
"help.page.usage_plans.step3" : "Confirm entitlements under Usage." ,
"help.page.usage_plans.tips" : "Price and caps are those shown at checkout." ,
"help.page.usage_checkout.title" : "Checkout" ,
"help.page.usage_checkout.what" : "Pay for the selected plan." ,
"help.page.usage_checkout.step1" : "Confirm plan and amount." ,
"help.page.usage_checkout.step2" : "Complete payment." ,
"help.page.usage_checkout.step3" : "Return to Usage to verify." ,
"help.page.usage_checkout.tips" : "Keep the receipt if payment fails and contact support." ,
"help.page.admin_users.title" : "Members admin" ,
"help.page.admin_users.what" : "Admin tools for members, suspend, and roles." ,
"help.page.admin_users.step1" : "Search or browse members." ,
"help.page.admin_users.step2" : "Change status or role carefully." ,
"help.page.admin_users.step3" : "Record reasons for sensitive actions." ,
"help.page.admin_users.tips" : "Admins only; mistakes can lock others out." ,
2026-07-10 12:54:45 +00:00
"api.err.unknown" : "Something went wrong. Please try again." ,
2026-07-13 01:15:30 +00:00
"api.err.studioValidation" : "Invalid data. Please check and try again." ,
"api.err.crawlerSession" : "Dev mode needs a Chrome session sync (Settings)." ,
2026-07-10 12:54:45 +00:00
"api.err.network" : "Cannot reach the server. Check your network or if the API is running." ,
"api.err.400001" : "Invalid request" ,
// Same sentence as backend 400003 / ValidatePasswordPolicy
"api.err.400003" : "Password must be at least 12 characters with upper, lower, digit, and symbol" ,
"password.policy.hint" : "Password must be at least 12 characters with upper, lower, digit, and symbol" ,
"password.policy.minLen" : "Password must be at least 12 characters with upper, lower, digit, and symbol" ,
"password.policy.needUpper" : "Password must be at least 12 characters with upper, lower, digit, and symbol" ,
"password.policy.needLower" : "Password must be at least 12 characters with upper, lower, digit, and symbol" ,
"password.policy.needDigit" : "Password must be at least 12 characters with upper, lower, digit, and symbol" ,
"password.policy.needSymbol" : "Password must be at least 12 characters with upper, lower, digit, and symbol" ,
"api.err.400004" : "Invalid or expired verification code" ,
"api.err.400020" : "You cannot suspend your own account" ,
"api.err.400021" : "Cannot demote or suspend the last active admin" ,
2026-07-28 06:33:51 +00:00
"auth.unreachable" : "Can't reach the server, so your sign-in state is unknown. Check your connection and retry." ,
2026-07-10 12:54:45 +00:00
"api.err.401001" : "Please sign in" ,
"api.err.401002" : "Session expired. Please sign in again." ,
"api.err.401003" : "Account not found. Please sign in again." ,
"api.err.401010" : "Invalid email or password" ,
"api.err.403001" : "Account suspended" ,
"api.err.403002" : "Admin access required" ,
"api.err.404001" : "Not found" ,
"api.err.404002" : "This email is not registered" ,
"api.err.409001" : "This email is already registered" ,
2026-07-13 03:18:08 +00:00
"api.err.402001" : "Monthly platform credits exhausted. Upgrade or wait for next month." ,
"usage.err.meterCap" : "This feature hit its monthly credit cap. Try another feature or upgrade." ,
"usage.err.platformCapacity" : "Platform AI/search is busy or rate-limited. Try again later, or add your own API key (BYOK) in Settings." ,
2026-07-10 12:54:45 +00:00
"api.err.500000" : "Server error. Please try again later." ,
2026-07-13 01:15:30 +00:00
"api.err.timeoutAI" : "AI timed out. Shorten structure notes, or pick a faster model in Settings" ,
2026-07-10 12:54:45 +00:00
"api.err.501000" : "This feature is not implemented yet" ,
2026-08-03 05:52:02 +00:00
"api.err.501010" : "This capability is not available yet; a later release will ship it" ,
"api.err.400100" : "Some fields do not meet the rules. Please review and resubmit" ,
2026-07-10 12:54:45 +00:00
"api.ok.verifySent" : "Verification code sent. Please check your email." ,
"api.ok.verifyIssued" : "Verification code issued" ,
"api.ok.resetSent" : "Reset email sent. Please check your inbox." ,
"api.ok.passwordUpdated" : "Password updated" ,
"api.ok.loggedOut" : "Signed out" ,
"api.ok.unbound" : "Unbound" ,
2026-07-10 05:10:31 +00:00
"topbar.notifications" : "Notifications" ,
"topbar.unread" : "{n} unread" ,
"topbar.markAllRead" : "Mark all read" ,
"topbar.noNotifications" : "No notifications" ,
"topbar.jobsCenter" : "Job center" ,
"topbar.moreOlder" : "{n} older" ,
"topbar.account" : "Account menu" ,
"role.admin" : "Admin" ,
"role.member" : "Member" ,
"role.verified" : "Verified" ,
"role.unverified" : "Unverified" ,
"login.title" : "Sign in to Lapras" ,
"login.email" : "Email" ,
"login.password" : "Password" ,
"login.submit" : "Sign in" ,
"login.submitting" : "Signing in…" ,
"login.forgot" : "Forgot password?" ,
"login.mockHint" : "Admin demo@harbor.local / demo · member alice@harbor.local / alice" ,
2026-07-10 12:54:45 +00:00
"login.liveHint" : "Live backend: admin@haixun.local / admin123 (gateway :8888)" ,
2026-07-10 05:10:31 +00:00
"forgot.title" : "Forgot password" ,
"forgot.submit" : "Send reset link" ,
"forgot.submitting" : "Sending…" ,
"forgot.back" : "Back to sign in" ,
2026-07-10 12:54:45 +00:00
"forgot.hint" : "Enter your registered email. We'll send a reset link and code." ,
2026-07-10 05:10:31 +00:00
"forgot.mockMail" : "Reset email" ,
2026-07-10 12:54:45 +00:00
"forgot.openReset" : "Enter code / reset password" ,
2026-07-10 05:10:31 +00:00
"forgot.retry" : "Try again" ,
2026-07-10 12:54:45 +00:00
"forgot.nextStep" : "Check your email for the code or link, then open the reset page to set a new password." ,
2026-07-10 05:10:31 +00:00
"reset.title" : "Set new password" ,
2026-07-10 12:54:45 +00:00
"reset.hint" : "Enter email, verification code (from the email), and a new password." ,
"reset.code" : "Verification code" ,
"reset.codePh" : "6-digit code from email" ,
"reset.needEmail" : "Email is required" ,
"reset.needCode" : "Verification code is required" ,
2026-07-10 05:10:31 +00:00
"reset.newPassword" : "New password" ,
"reset.confirm" : "Confirm password" ,
"reset.submit" : "Update password" ,
"reset.submitting" : "Updating…" ,
"reset.missingToken" : "Missing token. Please request a new reset link." ,
"verify.title" : "Verify email" ,
"verify.pending" : "Not verified" ,
"verify.body" : "You're signed in, but features stay locked until you verify your email with the 6-digit code." ,
"verify.code" : "Verification code" ,
"verify.submit" : "Verify" ,
"verify.submitting" : "Verifying…" ,
"verify.resend" : "Resend code" ,
"verify.sending" : "Sending…" ,
"verify.logout" : "Log out" ,
"verify.mockMail" : "Verification email" ,
"verify.mockHint" : "Enter the code:" ,
"verify.after" : "After verification you can use Today, Studio, Patrol, and more." ,
"settings.title" : "Settings" ,
2026-07-28 06:33:51 +00:00
"settings.loadFail" : "Could not load settings. Refresh to try again." ,
2026-07-10 05:10:31 +00:00
"settings.localeCurrency" : "Language & currency" ,
"settings.locale" : "Interface language" ,
"settings.currency" : "Display currency" ,
2026-07-13 03:18:08 +00:00
"settings.currencyHint" : "Display only; plan billing stays in TWD." ,
2026-07-10 05:10:31 +00:00
"settings.localeSaved" : "Language and currency updated" ,
"settings.appearance" : "Appearance" ,
"settings.theme" : "Theme" ,
"settings.themeLight" : "Light" ,
"settings.themeDark" : "Dark" ,
"settings.themeSystem" : "System" ,
2026-07-13 03:18:08 +00:00
"settings.themeHint" : "Light, dark, or follow system appearance." ,
2026-07-10 05:10:31 +00:00
"settings.themeSaved" : "Theme updated" ,
"settings.themeToLight" : "Switch to light" ,
"settings.themeToDark" : "Switch to dark" ,
"settings.dataSource" : "Data source" ,
2026-07-10 12:54:45 +00:00
"settings.dataSourceHint" :
2026-07-13 01:15:30 +00:00
"Business data always uses live API. Mock keeps only a few local modules (e.g. invite). Prefer Live + gateway." ,
"settings.dataSourceMock" : "Mock (reduced)" ,
2026-07-10 12:54:45 +00:00
"settings.dataSourceLive" : "Live (backend API)" ,
"settings.dataSourceCurrent" : "Current" ,
"settings.dataSourceSwitchedLive" :
"Switched to Live — re-login with backend account (admin@haixun.local / admin123)" ,
2026-07-13 01:15:30 +00:00
"settings.dataSourceSwitchedMock" : "Switched back to Mock (non-invite still hits live)" ,
2026-07-10 12:54:45 +00:00
"settings.dataSourceLiveNeedGateway" : "Requires gateway on :8888 (or Vite proxy /api)" ,
2026-07-10 05:10:31 +00:00
"settings.ai" : "AI" ,
"settings.search" : "Search" ,
2026-07-13 01:15:30 +00:00
"settings.threads" : "Threads OAuth (platform)" ,
"settings.threadsHint" :
"App ID/Secret live in gateway platform config (yaml/env); Secret is never shown. Paste Callback into Meta app settings and connect via the public https site." ,
"settings.threadsProvider" : "Mode" ,
"settings.threadsProviderFake" : "Fake (dev OAuth flow)" ,
"settings.threadsProviderMeta" : "Meta production" ,
"settings.threadsConfigured" : "App credentials" ,
"settings.threadsConfiguredYes" : "Configured" ,
"settings.threadsConfiguredNo" : "Not set" ,
"settings.threadsCallback" : "OAuth Callback URL (redirect_uri)" ,
"settings.threadsCallbackHint" : "Paste this exact URL into Meta App → Valid OAuth Redirect URIs (https required)" ,
"settings.threadsCopy" : "Copy" ,
"settings.threadsCopied" : "Callback URL copied" ,
"settings.threadsCopyFail" : "Copy failed — select manually" ,
"settings.threadsPublicWeb" : "Public site origin" ,
"settings.threadsGoCrew" : "Open Crew to connect" ,
2026-07-10 05:10:31 +00:00
"settings.member" : "Account & sign-in" ,
"settings.usageCard" : "AI / search quota" ,
2026-07-13 03:18:08 +00:00
"settings.usageCardHint" : "Platform credits and plan caps; BYOK does not use platform credits." ,
2026-07-10 05:10:31 +00:00
"settings.viewUsage" : "View usage" ,
"settings.editProfile" : "Edit profile" ,
"settings.mockLogin" : "demo@harbor.local / demo" ,
2026-07-13 03:18:08 +00:00
"settings.memberHint" : "Sign-in account, display name, and notification prefs." ,
2026-07-10 05:10:31 +00:00
"usage.title" : "Usage & plans" ,
2026-07-13 03:18:08 +00:00
"usage.desc" : "See platform credits this month, per-feature usage, and change plans." ,
2026-07-10 05:10:31 +00:00
"usage.creditsUsed" : "Credits used this month" ,
"usage.remaining" : "{n} left" ,
"usage.percentUsed" : "{n}% used" ,
"usage.breakdown" : "Breakdown" ,
"usage.plans" : "Plans" ,
"usage.current" : "Current" ,
"usage.inUse" : "Active" ,
"usage.switchMock" : "Switch plan" ,
"usage.perMonth" : "credits / mo" ,
"usage.ledger" : "Recent usage" ,
"usage.emptyTitle" : "No usage this month" ,
2026-07-13 03:18:08 +00:00
"usage.emptyDesc" : "After you create, patrol, or generate images, usage events show up here." ,
"usage.planNote" : "Resets each calendar month; unused credits do not roll over." ,
2026-07-10 05:10:31 +00:00
"usage.switched" : "Switched to {name}" ,
"usage.meter.times" : "{count} runs · {credits} credits" ,
2026-07-13 03:18:08 +00:00
"usage.meter.timesShort" : "{n} runs" ,
"usage.meter.pt" : "pt" ,
"usage.meter.over" : "over" ,
"usage.meter.locked" : "locked" ,
"usage.meter.cap" : "Cap {credits}/{cap} credits" ,
"usage.side.aiCredits" : "AI credits used (copy + research + image)" ,
"usage.side.searchCredits" : "Search credits used" ,
2026-07-15 15:23:59 +00:00
"usage.byok.title" : "BYOK usage" ,
"usage.byok.hint" : "Calls only; does not affect platform credits or progress bars." ,
2026-07-13 03:18:08 +00:00
"usage.plan.free.blurb" : "Enough to try the full creation flow" ,
2026-07-10 05:10:31 +00:00
"usage.plan.starter.blurb" : "Small teams posting and patrolling daily" ,
"usage.plan.pro.blurb" : "Multi-account, heavy AI and research" ,
"profile.title" : "Profile" ,
2026-07-13 03:18:08 +00:00
"profile.desc" : "Manage display name, avatar, and password." ,
2026-07-10 05:10:31 +00:00
"profile.accountStatus" : "Account status" ,
"profile.basic" : "Basics" ,
"profile.avatar" : "Avatar" ,
"profile.avatarUpload" : "Upload avatar" ,
"profile.avatarRemove" : "Remove avatar" ,
2026-07-10 12:54:45 +00:00
"profile.avatarHint" : "JPG / PNG / WebP, up to 5MB. Pick a file then Save basic info; Remove clears immediately." ,
2026-07-10 05:10:31 +00:00
"profile.avatarSaved" : "Avatar updated" ,
"profile.avatarCleared" : "Avatar removed" ,
"profile.avatarFail" : "Could not read image" ,
"profile.displayName" : "Display name" ,
"profile.bio" : "Bio (optional)" ,
"profile.timezone" : "Timezone" ,
"profile.notifyEmail" : "Email notifications" ,
"profile.password" : "Change password (optional)" ,
"profile.currentPassword" : "Current password" ,
"profile.newPassword" : "New password" ,
"profile.confirmPassword" : "Confirm new password" ,
"profile.emailVerified" : "Email verified" ,
"profile.emailUnverified" : "Email not verified" ,
"profile.roleAdmin" : "Admin" ,
"profile.roleMember" : "Member" ,
"profile.loginEmail" : "Sign-in email: {email}" ,
"profile.verifiedAt" : " · verified {time}" ,
"profile.goVerify" : "Verify email" ,
"profile.roleTags" : "Role tags: {labels}" ,
"profile.roleNote" : "Roles are assigned by the system; re-verify after changing email." ,
"profile.saveBasic" : "Save profile" ,
"profile.updatePassword" : "Update password" ,
"profile.saved" : "Profile saved" ,
"profile.savedUnverified" : "Saved. Verify your email before using features." ,
"profile.saveFail" : "Could not save" ,
"profile.needNewPassword" : "Enter a new password" ,
"profile.passwordMismatch" : "New passwords do not match" ,
"profile.needCurrentPassword" : "Enter your current password" ,
2026-07-10 12:54:45 +00:00
"profile.wrongCurrentPassword" : "Current password is incorrect" ,
2026-07-10 05:10:31 +00:00
"profile.passwordUpdated" : "Password updated" ,
"profile.passwordFail" : "Could not change password" ,
"profile.listJoin" : ", " ,
"profile.tenantUid" : " · tenant {tenant} · uid {uid}" ,
2026-07-10 12:54:45 +00:00
"profile.inviteBadge" : "Invite code" ,
"profile.inviteHint" : "Share with friends to join; later events can use invite relations." ,
"profile.gotoInvite" : "View invites" ,
"invite.title" : "Invites" ,
"invite.desc" : "Invite codes and relations; admin view is a tree." ,
"invite.tabs" : "Invite views" ,
"invite.tab.mine" : "My invites" ,
"invite.tab.tree" : "Tree" ,
"invite.myCode" : "My invite code" ,
"invite.codeLabel" : "Invite code" ,
"invite.copyCode" : "Copy" ,
"invite.copied" : "Copied" ,
"invite.copyFail" : "Copy failed" ,
"invite.stats" : "{direct} direct · {total} in chain" ,
2026-07-23 05:56:42 +00:00
"invite.rewards.summary" : "Reward points total {total} · this month {month} / cap {cap}" ,
"invite.rewards.title" : "Reward history" ,
2026-07-10 12:54:45 +00:00
"invite.upline" : "Invited by" ,
"invite.downlines" : "Direct invites · {n}" ,
"invite.noUpline" : "No inviter" ,
"invite.noDownline" : "None yet" ,
"invite.directN" : "{n} direct" ,
"invite.claimHint" : "If you didn’ t enter a code at signup, add your inviter’ s code here (cannot change later)." ,
"invite.claimLabel" : "Invite code" ,
"invite.claimPh" : "e.g. HX-DEMO01" ,
"invite.claimSubmit" : "Bind" ,
"invite.claimOk" : "Bound to {name}" ,
"invite.claimOkGeneric" : "Inviter bound" ,
"invite.claimFail" : "Could not bind" ,
"invite.claimLocked" : "Already bound. Contact an admin to change." ,
"invite.loadFail" : "Failed to load" ,
"invite.treeEmpty" : "No data" ,
"invite.treeSearch" : "Search" ,
"invite.treeSearchPh" : "Name / email / code" ,
"invite.treeCount" : "{n} people" ,
"invite.treeMatchCount" : "{n} matches · {total} total" ,
"invite.treeNoMatch" : "No matches" ,
"invite.treeNoMatchHint" : "Try another keyword" ,
"invite.clearSearch" : "Clear" ,
"invite.moveTitle" : "Reassign" ,
"invite.newParent" : "Inviter" ,
"invite.root" : "(None · standalone)" ,
"invite.confirmMove" : "Confirm" ,
"invite.moved" : "Reassigned “{name}” → “{parent}”" ,
"invite.moveFail" : "Failed" ,
"invite.openFromAdmin" : "Invites" ,
"invite.parentField" : "Invited by" ,
"invite.orgPickRoot" : "Pick a starting root (includes self-joined)" ,
"invite.orgRoots" : "Roots" ,
"invite.orgPath" : "Path" ,
"invite.orgChainN" : "{n} in chain" ,
"invite.orgFocusStats" : "{direct} direct · {total} in chain" ,
"invite.orgDirects" : "Direct invites · {n}" ,
"invite.orgNoDirects" : "No direct invites" ,
"invite.err.notFound" : "Member not found" ,
"invite.err.notLoggedIn" : "Not signed in" ,
"invite.err.needAdmin" : "Admin access required" ,
"invite.err.memberNotFound" : "Islander not found" ,
"invite.err.selfParent" : "Cannot set yourself as inviter" ,
"invite.err.parentNotFound" : "Inviter not found" ,
"invite.err.cycle" : "Cannot place under your own invite chain (would create a cycle)" ,
"invite.err.repoMissing" : "Invite data layer not loaded — please refresh the page" ,
"invite.err.alreadyBound" : "You already have an inviter" ,
"invite.err.codeRequired" : "Enter an invite code" ,
"invite.err.codeNotFound" : "Invite code not found" ,
"invite.err.codeSelf" : "You can’ t use your own code" ,
2026-07-10 05:10:31 +00:00
"admin.users.title" : "Islanders" ,
2026-07-13 03:18:08 +00:00
"admin.users.desc" : "Manage islander accounts, roles, plans, and unlimited flags." ,
2026-07-10 05:10:31 +00:00
"admin.users.needAdmin" : "Admin access required" ,
"admin.users.list" : "Islanders · {n}" ,
"admin.users.detail" : "Islander detail" ,
"admin.users.pick" : "Select an islander" ,
"admin.users.search" : "Search name / uid" ,
"admin.users.searchPh" : "Name, email, or uid" ,
"admin.users.create" : "Add islander" ,
"admin.users.suspend" : "Suspend" ,
"admin.users.unsuspend" : "Restore" ,
"admin.users.suspended" : "Suspended" ,
"admin.users.active" : "Active" ,
"crew.title" : "Accounts" ,
"crew.tab.accounts" : "Accounts" ,
"crew.tab.personas" : "Personas" ,
"crew.connect" : "Connect account" ,
2026-07-13 01:15:30 +00:00
"crew.connecting" : "Connecting…" ,
"crew.tokenRenewHint" : "Tokens auto-renew via background jobs (~day 30). Check Jobs; no manual refresh." ,
2026-07-10 05:10:31 +00:00
"crew.empty" : "No accounts yet" ,
2026-07-28 06:33:51 +00:00
"crew.loadFail" : "Could not load accounts" ,
2026-07-10 05:10:31 +00:00
"crew.unusable" : "Unavailable" ,
"crew.expires" : "Expires {time}" ,
2026-07-13 01:15:30 +00:00
"crew.lastRefresh" : "Last extended {time}" ,
"crew.refreshSession" : "Extend token" ,
"crew.refreshSessionHint" : "Uses stored auth to refresh the token — no OAuth page. On failure, reconnect." ,
"crew.session.ok" : "Token valid" ,
2026-07-10 05:10:31 +00:00
"crew.session.soon" : "Expiring soon" ,
2026-07-13 01:15:30 +00:00
"crew.session.expired" : "Token expired" ,
"crew.session.unknown" : "Expiry unknown" ,
"crew.connection.connected" : "Connected" ,
"crew.connection.error" : "Error" ,
"crew.connection.disconnected" : "Disconnected" ,
"crew.connection.unknown" : "Unknown" ,
"crew.health.needsReconnect" : "Reconnect required" ,
"crew.health.needsReconnectHint" : "Token unusable — use Connect account (not Extend token)" ,
"crew.health.disconnectedHint" : "Unlinked" ,
"crew.health.expiredHint" : "Extend token or reconnect" ,
2026-07-23 05:56:42 +00:00
"crew.opHealthScore" : "Health {n}" ,
2026-07-13 01:15:30 +00:00
"crew.msg.refreshed" : "@{user} token extended with stored auth (~60 days)" ,
"crew.msg.refreshedAll" : "Extended {n} account tokens with stored auth" ,
"crew.msg.refreshFail" : "Extend failed (reconnect if token is invalid)" ,
"crew.msg.oauthOk" : "Threads connected; token renew scheduled ~day 30 (see Jobs)" ,
"crew.msg.oauthFail" : "OAuth connection failed" ,
2026-07-13 03:18:08 +00:00
"crew.msg.oauthUrlFail" : "Could not get authorize URL. Try again or check platform Threads settings." ,
"crew.msg.deleted" : "Removed @{user}" ,
2026-07-10 05:10:31 +00:00
"crew.confirmDelete" : "Delete account @{user}?\nIt can no longer be used as lead / cast." ,
"today.findTopic" : "Find topics" ,
2026-07-13 03:18:08 +00:00
"today.refreshTopics" : "Refresh topics" ,
"today.reload" : "Reload" ,
"today.loadFail" : "Could not load Today" ,
"today.trendsFail" : "Could not refresh topics (quota or search not set)" ,
2026-07-23 05:56:42 +00:00
"today.trendsUpdated" : "Updated {n} topics" ,
2026-07-13 03:18:08 +00:00
"today.syncPosts" : "Sync own posts" ,
"today.syncPostsFail" : "Could not sync posts" ,
"today.needAccount" : "Connect a Threads account first" ,
2026-07-23 05:56:42 +00:00
"today.outcome.title" : "This week's outcomes" ,
"today.outcome.reach" : "Reach" ,
"today.outcome.conversations" : "Conversations" ,
"today.outcome.follows" : "Follows" ,
"today.outcome.followsHint" : "Possibly related, no strong signal yet" ,
"today.outcome.followsConfirmedHint" : " / confirmed {n}" ,
"today.outcome.conversions" : "Conversions" ,
"today.outcome.emptyHint" : "No patrol outreach outcomes this week yet — go give patrol a try?" ,
"today.checkup.empty" : "This week's checkup hasn't been generated yet. It runs automatically next Monday in your timezone." ,
"today.checkup.prefix" : "Checkup: " ,
2026-07-10 05:10:31 +00:00
"today.pendingReplies" : "Pending replies" ,
"today.pendingRepliesN" : "Pending · {n}" ,
2026-07-13 03:18:08 +00:00
"today.newThread" : "Compose" ,
2026-07-10 05:10:31 +00:00
"today.metricsAria" : "Today metrics" ,
"today.metric.pending" : "Pending" ,
"today.metric.pendingHint" : "Patrol queue" ,
"today.metric.doneGoal" : "Done / goal" ,
2026-07-13 03:18:08 +00:00
"today.metric.doneGoalHint" : "Patrol completions today / goal (mark published counts)" ,
2026-07-10 05:10:31 +00:00
"today.metric.sentToday" : "Sent today" ,
"today.metric.running" : "{n} in progress" ,
"today.metric.sentDone" : "Completed sends" ,
"today.metric.failed" : "Send issues" ,
"today.metric.needAction" : "Needs action" ,
"today.metric.ok" : "All good" ,
2026-07-13 03:18:08 +00:00
"today.metric.mentions" : "Mentions" ,
"today.metric.mentionsHint" : "Pending mentions" ,
"today.pending.title" : "Patrol pending · {n}" ,
"today.pending.empty" : "Nothing pending — run a patrol" ,
2026-07-10 05:10:31 +00:00
"today.goScout" : "Go patrol" ,
"today.pending.more" : "{n} more →" ,
"today.pending.handle" : "Handle in patrol" ,
"today.pending.start" : "Start handling" ,
"today.topics.title" : "Find topics" ,
2026-07-13 03:18:08 +00:00
"today.topics.empty" : "No topics yet — tap Refresh topics" ,
"today.goStudio" : "Open inspire" ,
2026-07-10 05:10:31 +00:00
"today.heat" : "Heat {n}" ,
"today.topicAngle" : "Good opening angle" ,
"today.moreInspire" : "More inspiration" ,
2026-07-13 03:18:08 +00:00
"today.useTopic" : "Brainstorm topic" ,
2026-07-10 05:10:31 +00:00
"today.outbox.title" : "Today's outbox" ,
"today.outbox.empty" : "No sends today. Try" ,
"today.outbox.emptyMid" : ", then check" ,
"today.outbox.emptyEnd" : "." ,
"today.outbox.summary" : "Done {sent} · In progress {running} · Issues {failed}" ,
"today.badge.failed" : "Failed" ,
"today.badge.scheduling" : "Scheduled" ,
"today.badge.sending" : "Sending" ,
2026-07-13 03:18:08 +00:00
"today.badge.drafted" : "Drafted" ,
2026-07-10 05:10:31 +00:00
"today.openOutbox" : "Open outbox" ,
"today.accounts.title" : "Account performance" ,
2026-07-13 03:18:08 +00:00
"today.accounts.empty" : "No stats yet — sync own posts" ,
2026-07-10 05:10:31 +00:00
"today.postsCount" : "{n} posts" ,
"today.views" : "Views" ,
"today.likes" : "Likes" ,
"today.repliesShort" : "Replies" ,
"today.fullInsights" : "Full insights · MoM charts" ,
"today.viewPosts" : "View posts" ,
"today.manageAccounts" : "Manage accounts" ,
2026-07-13 03:18:08 +00:00
2026-07-10 05:10:31 +00:00
"outbox.title" : "Outbox" ,
"outbox.tabsAria" : "Outbox tabs" ,
"outbox.tab.active" : "Active" ,
"outbox.tab.history" : "History" ,
"outbox.empty" : "No outbox items" ,
"outbox.activeEmpty" : "Nothing in progress" ,
"outbox.historyEmpty" : "No history yet" ,
"outbox.historyN" : "History ({n})" ,
"outbox.backActive" : "Back to active ({n})" ,
"outbox.progress" : "Progress {progress}" ,
"outbox.detail" : "Details" ,
"outbox.deleting" : "Deleting…" ,
"outbox.confirmDelete" : "Delete outbox item “{title}”?\nThis cannot be undone." ,
"outbox.deleted" : "Deleted “{title}”" ,
"outbox.deleteFail" : "Delete failed" ,
2026-07-15 15:23:59 +00:00
"outbox.loadFail" : "Failed to load outbox" ,
2026-07-10 05:10:31 +00:00
"outbox.status.scheduling" : "Scheduling" ,
"outbox.status.active" : "Sending" ,
"outbox.status.completed" : "Completed" ,
"outbox.status.partial_failed" : "Partial failure" ,
"outbox.status.cancelled" : "Cancelled" ,
"outbox.detail.missingId" : "Missing id" ,
"outbox.detail.notFound" : "Outbox item not found" ,
2026-07-28 06:33:51 +00:00
"outbox.detail.loadFail" : "Could not load this outbox item" ,
2026-07-13 01:15:30 +00:00
"outbox.detail.loading" : "Loading…" ,
"outbox.detail.sendingHint" : "Publishing to Threads (often 10– 30s). This page updates automatically…" ,
"outbox.detail.doneHint" : "Published to Threads successfully." ,
2026-07-10 05:10:31 +00:00
"outbox.detail.markAllOk" : "Mark all success" ,
"outbox.detail.markRootFail" : "Mark root failed" ,
"outbox.detail.processing" : "Working…" ,
"outbox.detail.delete" : "Delete this" ,
"outbox.detail.back" : "Back to list" ,
"outbox.detail.root" : "Root post" ,
"outbox.detail.replyN" : "Reply {n}" ,
"outbox.detail.retry" : "Retry" ,
"outbox.detail.opFail" : "Action failed" ,
2026-07-13 01:15:30 +00:00
"outbox.step.published" : "Published" ,
"outbox.step.failed" : "Failed" ,
"outbox.step.publishing" : "Publishing…" ,
"outbox.step.scheduled" : "Scheduled" ,
"outbox.step.blocked" : "Blocked" ,
2026-07-10 05:10:31 +00:00
"studio.title" : "Studio" ,
"studio.account" : "Account" ,
"studio.persona" : "Persona" ,
"studio.personaReady" : "Persona ready" ,
"studio.personaNotReady" : "Persona not ready" ,
"studio.tab.posts" : "My posts" ,
"studio.tab.mentions" : "Mentions @" ,
"studio.tab.compose" : "Compose" ,
"studio.tab.plays" : "Plays" ,
"studio.tab.inspire" : "Inspire" ,
"studio.tab.insights" : "Insights" ,
"mentions.hint" : "Who @ you. {n} pending. You can change account/persona per item (defaults from top bar)." ,
"mentions.scoutLink" : "Patrol outreach" ,
"mentions.empty" : "No mentions" ,
2026-07-13 01:15:30 +00:00
"mentions.emptyHint" : "Click “Sync from Threads” to pull posts/replies/quotes that @ you. Re-connect if missing threads_manage_mentions." ,
"mentions.needAccount" : "Select a Threads account in the top bar first" ,
"mentions.sync" : "Sync from Threads" ,
"mentions.syncing" : "Syncing…" ,
"mentions.syncDone" : "Synced {n} mentions" ,
"mentions.syncFail" : "Sync failed — reconnect Threads with threads_manage_mentions scope" ,
"mentions.openThread" : "Open post" ,
2026-07-10 05:10:31 +00:00
"mentions.status.pending" : "Pending" ,
"mentions.status.replied" : "Replied" ,
"mentions.status.skipped" : "Skipped" ,
"mentions.reply" : "Reply" ,
"mentions.skip" : "Skip" ,
"mentions.draftLabel" : "Reply draft" ,
"mentions.repliedPrefix" : "Replied: {text}" ,
"mentions.needPersona" : "Pick a ready persona before AI draft" ,
"mentions.fail" : "Failed" ,
2026-07-15 15:23:59 +00:00
"mentions.marked" : "Mention marked as replied" ,
"mentions.markReplied" : "Mark as replied" ,
"mentions.markingReplied" : "Marking…" ,
2026-07-10 05:10:31 +00:00
"mentions.withImages" : " · {n} images" ,
2026-07-13 01:15:30 +00:00
"compose.hint" : "Publish only: write body and send to Outbox (not a play). For multi-account threads use" ,
2026-07-10 05:10:31 +00:00
"compose.hintEnd" : "." ,
"compose.playsLink" : "Plays" ,
"compose.personaOff" : "Persona not ready: AI tools (mimic / analyze) disabled." ,
"compose.title" : "Title (optional)" ,
"compose.titlePh" : "Helps identify in Outbox" ,
"compose.body" : "Body" ,
"compose.bodyPh" : "Write your post…" ,
2026-07-20 06:33:14 +00:00
"compose.bodyCount" : "{n} characters" ,
"compose.bodyLongWarning" : "The full draft is preserved, but it may exceed the Threads single-post limit" ,
2026-07-13 01:15:30 +00:00
"compose.topicTag" : "Topic tag (Threads)" ,
"compose.topicTagPh" : "e.g. petshow (optional #)" ,
"compose.topicTagHint" : "One topic tag per post, 1– 50 chars, no . or &. You can also put #tag in the body." ,
2026-07-10 05:10:31 +00:00
"compose.tool.mimic" : "Mimic" ,
"compose.tool.viral" : "Viral analysis" ,
"compose.tool.research" : "Research" ,
"compose.tool.image" : "Image" ,
"compose.mimic.title" : "Mimic another post" ,
"compose.mimic.source" : "Source text" ,
"compose.mimic.sourcePh" : "Paste the post to mimic…" ,
2026-07-20 06:33:14 +00:00
"compose.mimic.direction" : "New topic or angle (optional)" ,
"compose.mimic.directionPh" : "e.g. Fewer features can make a product easier to use…" ,
"compose.mimic.directionHint" : "This drives the new post. Leave it blank and AI will choose a related but distinctly different angle." ,
2026-07-13 01:15:30 +00:00
"compose.mimic.structureNotes" : "Structure notes (used in mimic)" ,
"compose.mimic.structureNotesPh" : "From Own posts → Analyze, or paste hooks/structure…" ,
2026-07-20 06:33:14 +00:00
"compose.mimic.structureNotesHint" : "Only the narrative skeleton, turns, and emotional arc are reused; content follows the new direction and selected persona." ,
2026-07-13 01:15:30 +00:00
"compose.mimic.broughtAnalysis" : "Loaded source + structure analysis — mimic or edit notes" ,
"compose.mimic.broughtSource" : "Loaded source (no structure yet — analyze on Own posts first)" ,
"compose.mimic.running" : "Mimicking in background (you can leave)…" ,
2026-07-10 05:10:31 +00:00
"compose.mimic.run" : "Mimic into body" ,
2026-07-13 01:15:30 +00:00
"compose.mimic.queued" : "Mimic job queued — will fill the body when done" ,
2026-07-10 05:10:31 +00:00
"compose.mimic.done" : "Mimic done — edit as needed" ,
2026-07-13 01:15:30 +00:00
"compose.mimic.doneWithStructure" : "Mimic done (structure applied) — edit as needed" ,
"compose.mimic.jobFail" : "Mimic job failed: {err}" ,
2026-07-10 05:10:31 +00:00
"compose.viral.title" : "Viral analysis" ,
"compose.viral.hint" : "Hooks, structure, and copyable patterns from source or body." ,
"compose.viral.source" : "Target (empty = use body)" ,
"compose.viral.running" : "Analyzing…" ,
"compose.viral.run" : "Analyze" ,
"compose.viral.result" : "Analysis" ,
"compose.viral.done" : "Viral analysis done" ,
"compose.viral.needText" : "Paste a reference or write the body first" ,
"compose.research.title" : "Research notes" ,
"compose.research.q" : "Keywords" ,
"compose.research.qPh" : "e.g. fragrance-free detergent sensitive skin" ,
"compose.research.running" : "Searching…" ,
"compose.research.insert" : "Insert selected into body" ,
"compose.research.inserted" : "Inserted {n} notes" ,
"compose.image.title" : "Generate image" ,
"compose.image.prompt" : "Scene description" ,
"compose.image.promptPh" : "Empty = summarize from body" ,
"compose.image.running" : "Generating…" ,
"compose.image.run" : "Generate image" ,
"compose.image.done" : "Image added" ,
2026-07-10 12:54:45 +00:00
"compose.scheduleAt" : "Publish at" ,
2026-07-13 01:15:30 +00:00
"compose.scheduleHint" : "Outbox sends at this time; must not be in the past." ,
"compose.scheduleHintNow" : "Send immediately (timestamp taken at submit)." ,
"compose.schedulePast" : "Scheduled time is in the past. Set to now or a future time." ,
2026-07-10 12:54:45 +00:00
"compose.scheduleNow" : "Now" ,
2026-07-10 05:10:31 +00:00
"compose.publish" : "Send to Outbox" ,
"compose.publishing" : "Sending…" ,
2026-07-13 01:15:30 +00:00
"compose.uploadingImages" : "Uploading image {n}/{total}…" ,
"compose.uploadImageFail" : "Image upload failed — retry or use a smaller file (≤5MB)" ,
"compose.waitImageUpload" : "Images still uploading — wait a moment." ,
"compose.waitImageUploadBtn" : "Uploading images…" ,
"compose.imageUploadNeedRetry" : "Some images failed — tap retry on the thumbnail." ,
2026-07-10 05:10:31 +00:00
"compose.publishFail" : "Send failed" ,
"compose.fail" : "Failed" ,
"compose.attachN" : "{n} images" ,
"compose.personaStatus" : "Persona: {status}" ,
"compose.ready" : "ready" ,
"compose.notReady" : "not ready" ,
"posts.sync" : "Resync Threads" ,
"posts.syncing" : "Syncing…" ,
"posts.syncedAt" : "Synced {time}" ,
"posts.notSynced" : "Not synced" ,
2026-07-13 01:15:30 +00:00
"posts.syncDone" : "Synced {n} posts from Threads (metrics + replies)" ,
"posts.syncFail" : "Sync failed — reconnect Threads if permissions are missing" ,
"posts.loadingReplies" : "Loading replies…" ,
"posts.loadRepliesFail" : "Could not load replies" ,
2026-07-10 05:10:31 +00:00
"posts.empty" : "No posts yet" ,
"posts.openThreads" : "Open Threads" ,
"posts.insight" : "Insight: {text}" ,
"posts.review" : "Review: {text}" ,
"posts.formulaResult" : "Structure analysis" ,
2026-07-13 01:15:30 +00:00
"posts.analyzedBadge" : "Analyzed" ,
"posts.noText" : "(No text / media-only)" ,
2026-07-10 05:10:31 +00:00
"posts.collapseReplies" : "Collapse replies" ,
"posts.repliesBtn" : "Replies ({total}) · pending {pending}" ,
"posts.replyRoot" : "Reply to post" ,
"posts.analyzing" : "Analyzing…" ,
"posts.reanalyze" : "Re-analyze structure" ,
"posts.analyze" : "Analyze structure" ,
"posts.mimicThis" : "Mimic this" ,
"posts.rootDraft" : "Root reply draft" ,
"posts.filter.pending" : "Pending ({n})" ,
"posts.filter.replied" : "Replied ({n})" ,
"posts.filter.all" : "All ({n})" ,
"posts.noPending" : "No pending replies" ,
"posts.noReplied" : "No replied items yet" ,
"posts.noReplies" : "No replies yet" ,
"posts.status.pending" : "Pending" ,
"posts.status.replied" : "Replied" ,
"posts.likesN" : "{n} likes" ,
"posts.childCount" : "{n} child replies" ,
"posts.mine" : "Ours" ,
"posts.replyThis" : "Reply" ,
"posts.replyAgain" : "Reply again" ,
"posts.replyTo" : "Reply to @{user}" ,
"posts.replyAgainTo" : "Reply again to @{user}" ,
"posts.needPersona" : "Pick a ready persona before AI draft" ,
"posts.genFail" : "Generate failed" ,
"posts.needText" : "Generate or type a reply first" ,
2026-07-13 01:15:30 +00:00
"posts.needAccount" : "Pick a Threads account to send" ,
"posts.sending" : "Publishing to Threads…" ,
"posts.sent" : "Sent to Threads as @{user}" ,
2026-07-10 05:10:31 +00:00
"posts.sentImages" : " ({n} images)" ,
"posts.accountFallback" : "account" ,
"posts.sendFail" : "Send failed" ,
"posts.analyzeDone" : "Structure analysis done (manual)" ,
"posts.analyzeFail" : "Analyze failed" ,
"wizard.newTitle" : "New play" ,
"wizard.editTitle" : "Edit play" ,
"wizard.prev" : "Back" ,
"wizard.next" : "Next" ,
"wizard.err.topic" : "Enter a topic" ,
"wizard.err.lead" : "Select a lead account" ,
"wizard.err.leadUnusable" : "Lead account unavailable" ,
"wizard.submitFail" : "Submit failed" ,
"wizard.unnamedPlay" : "Untitled play" ,
"wizard.step.topic" : "Topic" ,
"wizard.step.crew" : "Cast" ,
"wizard.step.script" : "Script" ,
"wizard.step.preview" : "Preview" ,
"wizard.step.schedule" : "Schedule" ,
"wizard.step.submit" : "Submit" ,
"wizard.stepperAria" : "Wizard steps" ,
"wizard.topic.title" : "1. What is this thread about?" ,
"wizard.topic.name" : "Title (optional)" ,
"wizard.topic.namePh" : "e.g. Weekend coffee" ,
"wizard.topic.topic" : "One-line topic" ,
"wizard.topic.topicPh" : "What should this thread discuss?" ,
"wizard.topic.aiView" : "AI persona view" ,
"wizard.topic.personaNotReady" : "Persona not ready" ,
"wizard.topic.quickFill" : "Quick fill" ,
"wizard.topic.sampleTitle" : "Weekend coffee chat" ,
"wizard.topic.sampleTopic" : "Looking for a reliable café this weekend — lots of outlets, stay-all-day friendly." ,
"wizard.crew.title" : "2. Cast" ,
"wizard.crew.lead" : "Lead" ,
"wizard.crew.noUsable" : "No usable accounts" ,
"wizard.crew.unusable" : "Unavailable" ,
"wizard.crew.cast" : "Supporting" ,
"wizard.script.title" : "3. Lines" ,
"wizard.script.persona" : "Persona" ,
"wizard.script.personaNotReady" : "Persona not ready" ,
"wizard.script.root" : "Root post" ,
"wizard.script.replyN" : "Reply {n}" ,
"wizard.script.generating" : "Generating…" ,
"wizard.script.ai" : "AI draft" ,
"wizard.script.account" : "Account: {name}" ,
"wizard.script.noLead" : "(no lead)" ,
"wizard.script.speaker" : "Speaker" ,
"wizard.script.leadTag" : "(lead)" ,
"wizard.script.text" : "Copy" ,
"wizard.script.rootPh" : "Root post text…" ,
"wizard.script.replyPh" : "Reply text…" ,
"wizard.script.addReply" : "Add reply step" ,
"wizard.preview.title" : "4. Preview the thread" ,
"wizard.preview.unknown" : "Unknown" ,
"wizard.preview.unknownAccount" : "Unknown account" ,
"wizard.preview.root" : "Root" ,
"wizard.preview.leadTalk" : "lead reply" ,
"wizard.preview.empty" : "(empty)" ,
"wizard.schedule.title" : "5. When to send" ,
"wizard.schedule.start" : "First post (root) time" ,
"wizard.schedule.interval" : "Reply interval (minutes)" ,
2026-07-13 01:15:30 +00:00
"wizard.schedule.intervalHint" : "Relative to previous step; backend adds random jitter so timing is less robotic" ,
2026-07-10 05:10:31 +00:00
"wizard.submit.title" : "6. Submit schedule" ,
"wizard.submit.body" : "Confirm to send “{title}” ({n} steps) to Outbox and publish in order." ,
"wizard.submit.unnamed" : "Untitled" ,
"wizard.submit.root" : "Root" ,
"wizard.submit.replyN" : "Reply {n}" ,
"wizard.submit.submitting" : "Submitting…" ,
"wizard.submit.run" : "Submit to Outbox" ,
"reply.account" : "Reply as" ,
"reply.persona" : "Persona" ,
"reply.notReady" : "This persona is not ready for AI draft (you can still type and send)." ,
"reply.draft" : "Reply draft" ,
"reply.attach" : "Attach" ,
"reply.generating" : "Generating…" ,
"reply.ai" : "AI draft" ,
"reply.sending" : "Sending…" ,
"reply.send" : "Send" ,
"image.attach" : "Attach" ,
"image.attachFail" : "Attach failed" ,
"image.attachedAria" : "Attached images" ,
"image.alt" : "Attachment" ,
"image.named" : "Image {n}" ,
"image.remove" : "Remove image" ,
"image.full" : "Full ({max})" ,
"image.more" : "Add more ({n}/{max})" ,
2026-07-13 01:15:30 +00:00
"image.uploading" : "Uploading" ,
"image.uploadingN" : "Uploading {n} image(s)…" ,
"image.uploadFail" : "Upload failed" ,
"image.uploadBadUrl" : "Invalid upload response" ,
"image.retry" : "Retry" ,
2026-07-10 05:10:31 +00:00
"metrics.aria" : "Post metrics" ,
"metrics.like" : "Likes" ,
"metrics.reply" : "Replies" ,
"metrics.repost" : "Reposts" ,
"metrics.quote" : "Quotes" ,
"metrics.view" : "Views" ,
"metrics.share" : "Shares" ,
"metrics.type.quote" : "Quote" ,
"metrics.type.reply" : "Reply" ,
"metrics.type.image" : "Image" ,
"metrics.type.video" : "Video" ,
"metrics.type.carousel" : "Carousel" ,
"metrics.type.repost" : "Repost" ,
"metrics.type.text" : "Text" ,
"metrics.type.post" : "Post" ,
"jobs.title" : "Jobs" ,
2026-07-13 03:18:08 +00:00
"jobs.desc" : "Jobs in three tabs: active, scheduled, and history. Paginated so we never load everything at once." ,
2026-07-13 01:15:30 +00:00
"jobs.startDemo" : "Create test job" ,
"jobs.demoHint" : "Requires worker; list auto-refreshes while jobs are active." ,
"jobs.demoLabel" : "Demo test job" ,
"jobs.demoCreated" : "Test job {id}… created — waiting for worker" ,
"jobs.demoFail" : "Could not create test job" ,
"jobs.template.tokenRenew" : "Threads token renew (~every 30 days)" ,
"jobs.template.tokenRenewCadence" : "Runs about every 30 days · no manual action needed" ,
"jobs.template.tokenRenewBadge" : "Recurring · every 30 days" ,
"jobs.template.personaAnalyzeAccount" : "Persona analyze · crawl public posts" ,
"jobs.template.personaAnalyzeText" : "Persona analyze · from text" ,
"jobs.template.composeMimic" : "Mimic post" ,
"jobs.template.playGenerateScript" : "Play full-script AI" ,
"jobs.template.unknown" : "Other job" ,
"jobs.stripMore" : "+{n} more running…" ,
"jobs.nextRun" : "Next run: {time}" ,
"jobs.status.pending" : "Pending" ,
"jobs.status.queued" : "Scheduled" ,
"jobs.status.running" : "Running" ,
"jobs.status.succeeded" : "Succeeded" ,
"jobs.status.failed" : "Failed" ,
"jobs.status.cancelled" : "Cancelled" ,
"jobs.status.cancel_requested" : "Cancel requested" ,
"jobs.loadFail" : "Could not load jobs" ,
2026-07-10 05:10:31 +00:00
"jobs.empty" : "No jobs yet" ,
2026-07-13 03:18:08 +00:00
"jobs.empty.active" : "No running or ready-to-claim jobs" ,
"jobs.empty.recurring" : "No scheduled / recurring jobs yet" ,
"jobs.empty.history" : "No history yet (succeeded / failed / cancelled)" ,
"jobs.tabsAria" : "Job categories" ,
"jobs.tab.active" : "Active" ,
"jobs.tab.recurring" : "Scheduled" ,
"jobs.tab.history" : "History" ,
"jobs.recurringHint" : "Future schedules (e.g. token renew in ~30 days). When due, they appear under Active." ,
2026-07-10 05:10:31 +00:00
"jobs.total" : "{n} total" ,
"jobs.showing" : " · showing first {n}" ,
"jobs.detail" : "Details" ,
"jobs.loadMore" : "Load more ({n} more)" ,
"jobs.notFound" : "Job not found" ,
2026-07-28 06:33:51 +00:00
"jobs.detailLoadFail" : "Could not load this job" ,
2026-07-10 05:10:31 +00:00
"jobs.progress" : "Progress {n}%" ,
"jobs.updated" : "Updated {time}" ,
"jobs.backList" : "Back to list" ,
2026-07-13 01:15:30 +00:00
"jobs.backCompose" : "Back to compose" ,
"jobs.mimicApplyCompose" : "Apply to compose" ,
"jobs.mimicApplyHint" : "Mimic finished. Use the button below to return to single-post compose with the draft filled in." ,
"jobs.mimicNoResult" : "No mimic result found — run mimic again" ,
"jobs.mimicApplyFail" : "Could not apply result" ,
"jobs.delete" : "Delete" ,
"jobs.deleteConfirm" : "Delete “{name}”? This cannot be undone." ,
"jobs.deleted" : "Job deleted" ,
"jobs.deleteFail" : "Could not delete job" ,
"jobs.deleteRunningHint" : "Running jobs cannot be deleted. Wait until they finish." ,
"jobs.retentionHint" : "Terminal jobs are auto-removed after about 2 days" ,
2026-07-10 05:10:31 +00:00
"plans.title" : "Change plan" ,
"plans.current" : "Current plan" ,
"plans.perMonth" : "/mo" ,
"plans.monthlyCredits" : "{n} credits / month" ,
"plans.usageLink" : "Usage" ,
"plans.inUse" : "Active" ,
"plans.recommended" : "Recommended" ,
"plans.creditsPerMonth" : "{n} credits / month" ,
2026-07-15 15:23:59 +00:00
"plans.manage" : "Manage subscription" ,
"plans.loadFail" : "Could not load your subscription" ,
2026-07-10 05:10:31 +00:00
"plan.cta.current" : "Current plan" ,
"plan.cta.upgrade" : "Upgrade" ,
"plan.cta.downgrade" : "Downgrade" ,
"plan.cta.switch" : "Switch" ,
2026-07-13 03:18:08 +00:00
"plan.free.headline" : "Enough to try the full product" ,
"plan.free.bullet1" : "{n} credits / month (~2– 3 weeks light use)" ,
"plan.free.bullet2" : "Full product: Studio, Patrol, Outbox, images" ,
"plan.free.bullet3" : "Feel the value, then upgrade to Starter" ,
"plan.free.bullet4" : "When platform is busy, add your own key" ,
2026-07-10 05:10:31 +00:00
"plan.free.right1" : "Full access to accounts, Studio, Patrol, Outbox, jobs, and inspiration." ,
2026-07-13 03:18:08 +00:00
"plan.free.right2" : "Enough credits for real copy, search, and a few images—not a hollow demo." ,
"plan.free.right3" : "After the cap, upgrade to Starter—or set BYOK so you don't use platform credits." ,
2026-07-10 05:10:31 +00:00
"plan.free.quota1" : "{n} credits allocated each month." ,
2026-07-15 15:23:59 +00:00
"plan.free.note1" : "Free requires no payment; paid subscribers manage cancellation in the billing portal." ,
"plan.free.note2" : "After cancellation, the plan changes on the date shown in the billing portal." ,
2026-07-10 05:10:31 +00:00
"plan.starter.headline" : "Small teams posting and patrolling daily" ,
2026-07-13 03:18:08 +00:00
"plan.starter.bullet1" : "{n} credits / month (about 5× Free)" ,
2026-07-10 05:10:31 +00:00
"plan.starter.bullet2" : "Steady posting, replies, and patrol" ,
2026-07-13 03:18:08 +00:00
"plan.starter.bullet3" : "Fits a 1– 3 person cadence · main paid tier" ,
2026-07-10 05:10:31 +00:00
"plan.starter.bullet4" : "Takes effect right after payment" ,
"plan.starter.right1" : "After payment this account becomes Starter; the month uses the new quota." ,
"plan.starter.right2" : "Credits support regular posts, reply drafts, and scheduled patrol." ,
2026-07-13 03:18:08 +00:00
"plan.starter.right3" : "Same features as Free; you buy more headroom. Best starting paid plan." ,
2026-07-10 05:10:31 +00:00
"plan.starter.quota1" : "{n} credits / month · {price}." ,
"plan.starter.note1" : "Plan changes only after successful payment." ,
"plan.starter.note2" : "Resets on calendar month; unused credits do not roll over." ,
"plan.pro.headline" : "Multi-account, heavy AI and research" ,
2026-07-13 03:18:08 +00:00
"plan.pro.bullet1" : "{n} credits / month (about 3× Starter)" ,
"plan.pro.bullet2" : "High-volume copy, research, and images · heavy ceiling" ,
2026-07-10 05:10:31 +00:00
"plan.pro.bullet3" : "Built for agencies and multi-brand work" ,
"plan.pro.bullet4" : "Takes effect right after payment" ,
"plan.pro.right1" : "After payment this account becomes Pro; the month uses Pro quota." ,
"plan.pro.right2" : "Fits multi-account replies and deep research with less risk of running out mid-month." ,
2026-07-13 03:18:08 +00:00
"plan.pro.right3" : "Same features; you buy capacity. Beyond this, use BYOK—still works when platform is limited." ,
2026-07-10 05:10:31 +00:00
"plan.pro.quota1" : "{n} credits / month · {price}." ,
"plan.pro.note1" : "Failed payment does not change your plan." ,
"plan.pro.note2" : "After payment you can find receipts in billing history." ,
2026-07-13 03:18:08 +00:00
"plan.quota2" : "Per-feature credits: copy {copy} (~{copyCalls} uses), research {research} (~{researchCalls}), search {search} (~{searchCalls}), image {image} (~{imageCalls} images)." ,
"plan.softCapsLine" : "Credits: copy {copy} · research {research} · search {search} · image {image}" ,
"plan.approxCallsLine" : "About {copyCalls} copy · {researchCalls} research · {searchCalls} search · {imageCalls} images" ,
2026-07-10 05:10:31 +00:00
"checkout.title" : "Confirm plan" ,
"checkout.pickFirst" : "Please choose a plan first." ,
"checkout.viewPlans" : "View plans" ,
"checkout.fail" : "Could not complete" ,
"checkout.confirmFree" : "Confirm switch to Free" ,
"checkout.payAndAction" : "{action} and pay {price}" ,
"checkout.subscribe" : "Subscription" ,
"checkout.perMonth" : "/mo" ,
"checkout.monthlyCredits" : "{n} credits per month" ,
"checkout.youGet" : "What you get" ,
"checkout.quota" : "Quota" ,
"checkout.notes" : "Notes" ,
"checkout.amountDue" : "Amount due" ,
"checkout.billedMonthly" : "{name} · billed monthly" ,
"checkout.already" : "Already on this plan" ,
"checkout.processing" : "Processing…" ,
"checkout.currentPlan" : "Current plan" ,
"checkout.pickOther" : "Choose another plan" ,
"checkout.cancel" : "Cancel" ,
2026-07-15 15:23:59 +00:00
"checkout.invalidUrl" : "The billing service returned an unsafe URL. No redirect was made." ,
"checkout.redirecting" : "Taking you to Stripe's secure checkout…" ,
"checkout.redirectingPortal" : "Taking you to the Stripe subscription portal…" ,
"checkout.redirectFailed" : "Stripe could not be opened. Check your browser or network settings and try again." ,
"checkout.networkError" : "Could not connect to the billing service. Check your network and try again." ,
"checkout.unavailable" : "Billing is not enabled or is temporarily unavailable. Please try again later." ,
"checkout.sessionExpired" : "Your session has expired. Sign in again and retry." ,
"checkout.portalUnavailable" : "There is no Stripe subscription to manage yet. Choose a paid plan first." ,
"checkout.verifying" : "Confirming payment and plan activation…" ,
"checkout.pollFail" : "Could not check the payment status. Please retry." ,
"checkout.missingId" : "The checkout ID is missing, so the payment result cannot be verified." ,
"checkout.terminalFail" : "Checkout did not complete ({status}). Choose a plan and try again." ,
"checkout.timeout" : "Payment may still be processing, but the plan was not activated within 30 seconds. Retry the status check; do not pay again." ,
"checkout.retry" : "Retry status check" ,
"checkout.canceledTitle" : "Checkout canceled" ,
"checkout.canceledBody" : "Your plan was not changed and no payment action was performed." ,
"checkout.manageInstead" : "Manage this change in the billing portal to avoid a duplicate subscription." ,
2026-07-10 05:10:31 +00:00
"usage.widget.titleUsed" : "{name} · used {used}/{cap} credits" ,
"usage.widget.titleUnlimited" : "{name} · unlimited" ,
"usage.widget.ariaUsed" : "Used {used} of {cap} credits" ,
"usage.widget.dialog" : "Plan and usage" ,
"usage.widget.currentPlan" : "Current plan" ,
"usage.widget.unlimited" : "Unlimited" ,
"usage.widget.perMonth" : "/mo" ,
"usage.widget.monthUsage" : "This month" ,
"usage.widget.remaining" : "{n} credits left" ,
"usage.widget.leftShort" : "{n} left" ,
2026-07-13 03:18:08 +00:00
"usage.widget.usedOfCap" : "{used}/{cap}" ,
2026-07-10 05:10:31 +00:00
"usage.widget.overShort" : "Over" ,
"usage.widget.upgradeShort" : "Upgrade" ,
"usage.widget.upgrade" : "Upgrade" ,
"usage.widget.includes" : "This plan includes" ,
"usage.widget.nudge" : "You're running low this month. Upgrade for more credits right away." ,
"usage.widget.changePlan" : "Change plan" ,
"usage.widget.usageDetail" : "Usage details" ,
"usage.meter.ai_copy" : "AI copy" ,
"usage.meter.ai_research" : "AI research" ,
"usage.meter.web_search" : "Search" ,
"usage.meter.ai_image" : "AI image" ,
2026-07-13 03:18:08 +00:00
"usage.meter.barAria" : "{label} {credits}/{cap} credits ({count} runs)" ,
2026-07-10 05:10:31 +00:00
"usage.ledger.costAria" : "Used {n} credits" ,
2026-07-13 01:15:30 +00:00
"usage.event.keyMode.platform" : "Platform credits" ,
"usage.event.keyMode.byok" : "Your own key" ,
"usage.event.cost.credits" : "− {n}" ,
"usage.event.cost.byok" : "BYOK" ,
"usage.event.cost.byokAria" : "Own key — no platform credits charged" ,
"usage.event.label.unknown" : "Usage" ,
"usage.event.label.genericAi" : "AI call" ,
"usage.event.label.personaAnalyzeText" : "Persona analyze · text" ,
"usage.event.label.personaAnalyzeAccount" : "Persona analyze · account" ,
"usage.event.label.composeMimic" : "Mimic post" ,
"usage.event.label.composeViral" : "Viral analysis" ,
"usage.event.label.personaPreview" : "Persona preview" ,
"usage.event.label.ownPostReply" : "Own post · reply draft" ,
"usage.event.label.mentionReply" : "Mention · reply draft" ,
"usage.event.label.inspireChat" : "Inspire chat" ,
"usage.event.label.researchSearch" : "Research search" ,
"usage.event.label.generateImage" : "Generate image" ,
"usage.event.label.search" : "Web search" ,
"usage.event.label.aiComplete" : "AI complete" ,
"usage.event.source.personaAnalyzeText" : "Persona analyze · text" ,
"usage.event.source.personaAnalyzeAccount" : "Persona analyze · account" ,
"usage.event.source.composeMimic" : "Mimic post" ,
"usage.event.source.composeViral" : "Viral analysis" ,
"usage.event.source.personaPreview" : "Persona preview" ,
"usage.event.source.ownPostAnalyze" : "Own post · structure analysis" ,
"usage.event.source.ownPostReply" : "Own post · reply draft" ,
"usage.event.source.mentionReply" : "Mention · reply draft" ,
"usage.event.source.inspireChat" : "Inspire chat" ,
"usage.event.source.researchSearch" : "Research search" ,
"usage.event.source.generateImage" : "Generate image" ,
"usage.event.source.proxySearch" : "Web search" ,
"usage.event.source.proxyAi" : "AI complete" ,
2026-07-10 05:10:31 +00:00
"usage.chart.period" : "Period" ,
"usage.chart.allocated" : "Allocated" ,
"usage.chart.consumed" : "Used" ,
"usage.chart.pctTitle" : "Usage as share of allocation" ,
"usage.chart.aria" : "Allocation and usage" ,
"usage.chart.colAria" : "{label}: allocated {purchased}, used {consumed}" ,
2026-07-10 12:54:45 +00:00
"settings.provider" : "Provider" ,
"settings.model" : "Model" ,
"settings.aiUnifiedHint" : "Copy, research, and expand all share one provider and model." ,
2026-07-10 05:10:31 +00:00
"settings.fetchModels" : "Fetch models" ,
"settings.fetchingModels" : "Loading…" ,
2026-07-10 12:54:45 +00:00
"settings.apiKey" : "API key" ,
2026-07-10 05:10:31 +00:00
"settings.configured" : "Configured" ,
"settings.notConfigured" : "Not set" ,
2026-07-13 01:15:30 +00:00
"settings.platformKeyOk" : "Platform key available (optional override)" ,
"settings.modelsHint" : "Models" ,
"settings.modelsCached" : "Models from cache (~5 min)" ,
2026-07-10 05:10:31 +00:00
"settings.modelsLoaded" : "Loaded models for {provider}" ,
"settings.aiSaved" : "AI settings saved" ,
"settings.searchSaved" : "Search settings saved" ,
2026-07-15 15:23:59 +00:00
"settings.clearAiKey" : "Clear personal AI key" ,
"settings.aiKeyCleared" : "Personal AI key cleared" ,
"settings.clearExaKey" : "Clear Exa key" ,
"settings.exaKeyCleared" : "Exa key cleared" ,
2026-07-10 12:54:45 +00:00
"settings.searchProvider" : "Search provider" ,
"settings.expand" : "Expand strategy" ,
"settings.exaKey" : "Exa API key" ,
"settings.devMode" : "Developer mode (crawler test patrol)" ,
"settings.devModeHint" : "When on, test patrol can use the Chrome crawler; live publish/replies still use the API. Download the extension to sync Threads session." ,
"settings.ext.title" : "Chrome extension" ,
2026-07-13 01:15:30 +00:00
"settings.ext.desc" : "Developer mode needs this extension (v1.2.0+) to sync Threads session from Chrome into Lapras." ,
2026-07-10 12:54:45 +00:00
"settings.ext.step1" : "Download and unzip to get the haixun-threads-sync folder" ,
"settings.ext.step2" : "Open chrome://extensions and enable Developer mode" ,
2026-07-13 01:15:30 +00:00
"settings.ext.step3" : "Load unpacked (or click Reload if already installed)" ,
"settings.ext.step4" : "Set this site’ s URL in extension options (must match address bar), then refresh Lapras" ,
2026-07-10 12:54:45 +00:00
"settings.ext.download" : "Download extension (ZIP)" ,
2026-07-13 01:15:30 +00:00
"settings.ext.sessionTitle" : "Chrome session (test patrol)" ,
"settings.ext.sessionHint" : "Collect cookies from a logged-in Threads tab into the crawler session. Live publish still uses the API." ,
"settings.ext.pageOrigin" : "This tab: {origin}" ,
"settings.ext.detected" : "Extension detected" ,
"settings.ext.notReady" : "Extension not detected" ,
"settings.ext.synced" : "Session synced" ,
"settings.ext.notSynced" : "Session not synced" ,
"settings.ext.syncBtn" : "Sync session from Chrome" ,
"settings.ext.recheck" : "Recheck" ,
"settings.ext.syncOk" : "Chrome session synced to crawler" ,
"settings.ext.syncFail" : "Chrome session sync failed" ,
"settings.ext.needLogin" : "Please sign in to Lapras before syncing." ,
"settings.ext.notDetected" : "Chrome extension not found on {origin}. Use v1.2.1+: reload in chrome://extensions → set Options Server URL to the same origin and Save → F5 this tab." ,
"settings.ext.reloadHint" : "After install/update, reload the extension and press F5 on this page." ,
"settings.ext.detectSteps" : "Installed but not detected? ① chrome://extensions → enable and Reload (v1.2.1+) ② Extension Options → set Server URL to {origin} and Save (Allow) ③ Hard-refresh this tab (F5). Do not mix localhost and 127.0.0.1." ,
2026-07-10 05:10:31 +00:00
"forgot.fail" : "Request failed" ,
"forgot.mockHint" : "In production this goes to email; here is a direct link:" ,
2026-07-10 12:54:45 +00:00
"forgot.checkInbox" : "Please check your inbox (and spam)." ,
2026-07-10 05:10:31 +00:00
"reset.mismatch" : "Passwords do not match" ,
"reset.fail" : "Reset failed" ,
"reset.cardTitle" : "Reset password" ,
"reset.redirecting" : "Redirecting to sign in…" ,
"reset.loginNow" : "Sign in now" ,
2026-07-10 12:54:45 +00:00
"reset.passwordPh" : "Password must be at least 12 characters with upper, lower, digit, and symbol" ,
"reset.forgotLink" : "Request a new reset" ,
2026-07-10 05:10:31 +00:00
"verify.sendFail" : "Could not send" ,
"verify.fail" : "Verification failed" ,
"verify.success" : "Email verified. You can use Lapras now." ,
"verify.codePh" : "6-digit code" ,
"verify.currentAccount" : "Account: {email}" ,
"login.brandTitle" : "巡樓 · Lapras" ,
2026-07-31 08:30:46 +00:00
"home.navLabel" : "Public navigation" ,
"public.localeLabel" : "Language" ,
2026-08-03 05:52:02 +00:00
"home.heroTitle" : "Find clients on Threads. Follow through to a win." ,
"home.heroLead" : "Daily demand lists, replies, and follow-ups on one desk." ,
"home.outcomesTitle" : "What you get" ,
"home.outcome.find.title" : "People looking for you" ,
"home.outcome.find.body" : "Keyword watches refresh daily; run a manual patrol when you need it." ,
"home.outcome.reply.title" : "Replies that fit" ,
"home.outcome.reply.body" : "Drafts follow your services and tone; forbidden words stay out." ,
"home.outcome.close.title" : "Follow-ups that close" ,
"home.outcome.close.body" : "One contact per person, with stages and reminders." ,
"home.productTitle" : "What you’ ll use" ,
"home.productLead" : "Demand, patrol, replies, CRM, and send — one desk." ,
"home.preview.radar.title" : "Today’ s demand" ,
"home.preview.radar.caption" : "Keyword watches refresh a daily list of needs" ,
"home.preview.scout.title" : "Patrol" ,
"home.preview.scout.caption" : "Run a manual sweep when you want hits now" ,
"home.preview.studio.title" : "Replies & Studio" ,
"home.preview.studio.caption" : "Drafts match your services and tone" ,
"home.preview.crm.title" : "Pipeline" ,
"home.preview.crm.caption" : "One contact card per person — stages and follow-ups" ,
"home.preview.outbox.title" : "Outbox" ,
"home.preview.outbox.caption" : "Scheduled, ready, and sent in one queue" ,
"home.preview.mock.radar.badge" : "Today · high match" ,
"home.preview.mock.radar.meta" : "3 new needs" ,
"home.preview.mock.radar.row1" : "Taipei · moving quote" ,
"home.preview.mock.radar.row2" : "Looking for home cleaning" ,
"home.preview.mock.radar.row3" : "Freelance design · budget ready" ,
"home.preview.mock.scout.badge" : "Keyword scan" ,
"home.preview.mock.scout.hit" : "Anyone recommend an accountant?" ,
"home.preview.mock.scout.snippet" : "Need someone for small-company tax…" ,
"home.preview.mock.scout.hit2" : "Has anyone tried that SaaS?" ,
"home.preview.mock.studio.tab1" : "Inspire" ,
"home.preview.mock.studio.tab2" : "Reply" ,
"home.preview.mock.studio.tab3" : "Schedule" ,
"home.preview.mock.studio.draft1" : "Hi — saw you’ re looking for movers." ,
"home.preview.mock.studio.draft2" : "We cover metro Taipei; happy to estimate first." ,
"home.preview.mock.studio.draft3" : "(From your service profile & forbidden words)" ,
"home.preview.mock.crm.col1" : "New" ,
"home.preview.mock.crm.col2" : "Talking" ,
"home.preview.mock.crm.col3" : "Won" ,
"home.preview.mock.crm.foot" : "Due follow-ups & reminders" ,
"home.preview.mock.outbox.r1" : "Reply · tonight 20:00" ,
"home.preview.mock.outbox.r2" : "Post · needs review" ,
"home.preview.mock.outbox.r3" : "Sent · syncing metrics" ,
"home.pricingTitle" : "Plans" ,
"home.pricingLead" : "Same features; monthly credits differ." ,
"home.pricingHoverHint" : "Hover the credit line to see what each plan covers." ,
2026-07-31 08:30:46 +00:00
"home.ctaLogin" : "Sign in" ,
2026-08-03 05:52:02 +00:00
"home.privacyLink" : "Privacy" ,
"home.termsLink" : "Terms" ,
2026-07-31 08:30:46 +00:00
"home.dataDeletionLink" : "Data deletion" ,
"legal.footerNav" : "Legal links" ,
"privacy.navLabel" : "Privacy policy navigation" ,
"privacy.title" : "Privacy Policy" ,
"privacy.updated" : "Last updated: 2026-07-31" ,
"privacy.intro" :
"This Privacy Policy explains how Lapras (巡樓, “the Service”, “we”) collects, uses, stores, shares, and deletes your personal data and Meta/Threads platform data. It covers the Lapras web console, public tools, and processing related to Threads accounts you connect via OAuth. Using the Service means you acknowledge this policy." ,
"privacy.section.overview.title" : "1. Controller and scope" ,
"privacy.section.overview.body" :
"The Lapras operator is the controller of personal data described here.\nThis policy covers: member accounts, workspace content, usage and payment identifiers, and platform data we obtain from Meta/Threads APIs after you authorize us.\nIf you join someone else’ s workspace, that owner may have extra rules; they do not replace this notice for platform- and member-level data.\nThis is our own policy, not Meta’ s, Threads’ , or Instagram’ s. See Meta’ s Privacy Center for how Meta processes data in its products." ,
"privacy.section.collect.title" : "2. What information we collect" ,
"privacy.section.collect.body" :
"(A) Data you provide\n• Account: email, display name, password hash (never plaintext passwords), role, email verification status.\n• Content you enter: personas, brands, patrol intents/keywords, drafts, reply copy, Outbox items, workspace settings, and uploaded media if any.\n• Support/privacy requests: emails and request details you send us.\n\n(B) Data collected automatically\n• Login sessions, IP, basic browser/device metadata (security, debugging, abuse prevention).\n• UI preferences (language, theme).\n• Feature usage and job logs (quotas, diagnostics).\n\n(C) Meta/Threads platform data (only after you connect)\n• Threads user identifiers (e.g. user id, username) and profile summary within granted scopes.\n• Posts, replies, media metadata, and API responses needed to read/send/insights within granted permissions.\n• Access tokens (and related refresh credentials) used only to call Threads APIs on your behalf; stored separately from member JWTs.\n\n(D) Billing (if enabled)\n• Plan tier, quota usage, payment transaction identifiers (we do not store full card numbers).\n\nWe do not require unrelated government ID for ordinary use." ,
"privacy.section.use.title" : "3. How we use data and why" ,
"privacy.section.use.body" :
"We process data to:\n• Provide accounts, workspaces, permissions, and sign-in security.\n• Run core features: patrol/outreach, create and AI assist, Outbox schedule/send, account and post sync, insights and metering.\n• Call Meta/Threads APIs with your tokens (read authorized content, publish content you confirm, etc., subject to granted scopes).\n• Send verification codes, password resets, and service notices.\n• Prevent abuse, keep the Service reliable, debug and improve (de-identified where practical).\n• Comply with law or valid legal requests.\n\nWe do not sell Meta/Threads platform data to data brokers, and we do not use that data to build independent marketing profiles unrelated to providing the Service." ,
2026-08-03 05:52:02 +00:00
"privacy.section.threads.title" : "4. Threads / Meta platform data" ,
2026-07-31 08:30:46 +00:00
"privacy.section.threads.body" :
2026-08-03 05:52:02 +00:00
"Connection: you authorize Lapras via Meta OAuth for Threads. We request and use only permissions needed for product features (e.g. basic profile, content publish, and other scopes shown in the authorization UI).\n\nUse limits: Platform Data from Meta is used only to provide, maintain, and improve Lapras features you use (connect accounts, sync posts, schedule/send replies or posts, show status, debug). We do not sell Platform Data or use it for advertising targeting unrelated to your authorization.\n\nStorage: Threads credentials are kept separate from member sign-in credentials; access is permission-controlled by workspace/account.\n\nYou may at any time:\n• Disconnect Threads inside Lapras; and/or\n• Revoke the app in Meta/Threads/Instagram settings.\nAfter disconnect we stop new API access and handle deletion/anonymization under Section 8.\n\nMeta’ s own processing is governed by Meta’ s policies; we do not control Meta’ s systems." ,
2026-07-31 08:30:46 +00:00
"privacy.section.share.title" : "5. Sharing and processors" ,
"privacy.section.share.body" :
"We may share data with or have it processed by:\n• Infrastructure: hosting, databases, object storage, email delivery, monitoring/logs (to run the Service).\n• AI/search providers: when you use inspire, analysis, or suggestion features (see Section 6).\n• Payment processors: when billing is enabled.\n• Legal: when required by law or valid authority.\n• Business transfers: merger/acquisition under applicable law and notice.\n\nProcessors may only process under our instructions with reasonable security. We do not sell personal data." ,
"privacy.section.ai.title" : "6. AI and automated processing" ,
"privacy.section.ai.body" :
"Some features send prompts, post samples, structured notes, or summaries of authorized public content to AI/search providers for suggestions, style analysis, or retrieval.\nYou may use platform defaults or BYOK keys; with BYOK, requests go to your provider—read their terms too.\nWe do not use your content as public marketing or advertised training material without separate consent." ,
"privacy.section.retention.title" : "7. Retention" ,
"privacy.section.retention.body" :
"• Account and workspace data: while the account is active.\n• Threads tokens: while connected; invalidated/removed after disconnect or deletion requests.\n• Job logs, usage, security records: for a reasonable period for operations, disputes, and law, then delete or anonymize.\n• Backups: may retain residual copies until rotation completes.\nSee Section 8 and the Data deletion page for how to request deletion." ,
2026-08-03 05:52:02 +00:00
"privacy.section.deletion.title" : "8. How to request deletion of your data" ,
2026-07-31 08:30:46 +00:00
"privacy.section.deletion.body" :
2026-08-03 05:52:02 +00:00
"You can request deletion of personal data and platform data we hold about you as follows:\n\nOption 1 (recommended): Sign in to Lapras → disconnect Threads in account/settings, then use any in-product account/data deletion flow if available.\n\nOption 2: Email the Service operator from your registered email address. Subject: “Data Deletion Request”. Include:\n• Registered email\n• Threads username or in-app account id if known\n• Scope (entire account / Threads connection data only / specific workspace)\n\nOption 3: If you remove our app in Meta and request deletion, follow Meta’ s flow. We also process platform deletion callbacks when provided; otherwise still use Option 2.\n\nFull steps are on the Data deletion page (/data-deletion).\nAfter identity verification we delete or anonymize within a reasonable period (typically 30 days, or sooner/later if law requires), except records we must retain by law." ,
2026-07-31 08:30:46 +00:00
"privacy.section.rights.title" : "9. Your rights" ,
"privacy.section.rights.body" :
"Where applicable law allows, you may request access, correction, portability, deletion, restriction, or objection to certain processing. You may sign out, edit profile data, disconnect Threads, or stop using the Service. Contact us per Section 12; we may need to verify identity." ,
"privacy.section.security.title" : "10. Security" ,
"privacy.section.security.body" :
"We use reasonable technical and organizational measures, including HTTPS, password hashing, permission isolation, and separating member credentials from Threads tokens. No system is perfectly secure; we notify of incidents as required by law or policy." ,
"privacy.section.children.title" : "11. Children" ,
"privacy.section.children.body" :
"The Service is intended for creators and business operators, not children. We do not knowingly collect personal data from children under the applicable age (e.g. 13, or a higher age where required). Contact us under Section 12 if you believe we collected a child’ s data; we will delete it promptly." ,
"privacy.section.contact.title" : "12. Contact us" ,
"privacy.section.contact.body" :
2026-08-03 05:52:02 +00:00
"For privacy questions or access/correction/deletion requests, contact the Service operator using your registered email. Subject: “Privacy / Data Request”. Include your account email and details so we can verify identity.\nYou may also use in-product profile/settings after sign-in." ,
2026-07-31 08:30:46 +00:00
"privacy.section.updates.title" : "13. Updates" ,
"privacy.section.updates.body" :
"We may update this policy for features, Meta platform rules, or law. We change the “Last updated” date; for material changes we may also notify in-product or by email. Continued use after an update means you acknowledge the revised policy to the extent permitted by law." ,
"privacy.backHome" : "Back to intro" ,
"terms.navLabel" : "Terms of service navigation" ,
"terms.title" : "Terms of Service" ,
"terms.updated" : "Last updated: 2026-07-31" ,
"terms.intro" :
"Welcome to Lapras (巡樓). These Terms of Service govern your use of the web console, public tools, and related features. By using the Service you agree to these Terms. If you do not agree, do not use the Service." ,
"terms.section.acceptance.title" : "1. Acceptance" ,
"terms.section.acceptance.body" :
"You must have legal capacity to contract and comply with applicable law. If you use the Service for an organization, you represent you have authority to bind that organization." ,
"terms.section.service.title" : "2. The Service" ,
"terms.section.service.body" :
"Lapras provides Threads operations tooling, including account linking, patrol/outreach, create and send, personas/brands, usage and plans. Features may change. We may suspend or modify features for maintenance, security, or legal reasons." ,
"terms.section.accounts.title" : "3. Accounts and security" ,
"terms.section.accounts.body" :
"Provide accurate information, protect credentials, and you are responsible for activity under your account. Notify us of unauthorized use. We may limit or suspend accounts for security, abuse, or violations." ,
"terms.section.threads.title" : "4. Threads / Meta connection" ,
"terms.section.threads.body" :
"Some features require Meta OAuth to connect Threads. You must have the right to connect that account and must comply with Meta, Threads, and Instagram terms and community standards.\nYou are responsible for lawful, non-infringing content and for following platform rules. Platform enforcement, API denials, or third-party claims arising from your content or account use are your responsibility. Lapras is a tool and does not guarantee platform approval or performance outcomes.\nYou may disconnect or revoke Meta authorization at any time; some features will stop working after disconnect." ,
"terms.section.content.title" : "5. Your content" ,
"terms.section.content.body" :
"You retain rights in content you upload or create. You grant us a non-exclusive, worldwide, royalty-free license to store, process, transmit, and display content as needed to provide the Service to you and authorized workspace members, including calling necessary third-party APIs. You warrant content is lawful and non-infringing." ,
"terms.section.acceptable.title" : "6. Acceptable use" ,
"terms.section.acceptable.body" :
"You may not: abuse APIs or automate harm to others; spam, fraud, hate, or illegal content; bypass quotas or security; reverse engineer or access systems without authorization; use the Service in ways that violate Meta platform policies; or infringe others’ privacy or IP." ,
"terms.section.billing.title" : "7. Plans and usage" ,
"terms.section.billing.body" :
"Paid plans, credits, and limits are as shown in product. Non-payment, overuse, or abuse may reduce or suspend features. Refunds follow the purchase terms and applicable law." ,
"terms.section.disclaimer.title" : "8. Disclaimers and liability" ,
"terms.section.disclaimer.body" :
"The Service is provided “as is”. To the fullest extent permitted by law, we do not warrant uninterrupted or error-free operation, or continued availability of third platforms (including Threads/Meta/AI providers). We are not liable for indirect, incidental, or lost-profit damages except where liability cannot be limited. Our aggregate liability is capped at fees you paid for the Service in the twelve months before the claim (or zero if free), except where law forbids the cap." ,
"terms.section.termination.title" : "9. Termination" ,
"terms.section.termination.body" :
"You may stop using the Service and request deletion under the Privacy Policy. We may suspend or terminate for breach, abuse, legal requirements, or if we discontinue the Service. Data handling after termination follows the Privacy Policy." ,
"terms.section.contact.title" : "10. Contact and governing law" ,
"terms.section.contact.body" :
"Contact the operator via your registered email for terms questions. Governing law and venue are those of our primary place of operation unless mandatory law says otherwise. Privacy: /privacy. Data deletion: /data-deletion." ,
"deletion.navLabel" : "Data deletion navigation" ,
"deletion.title" : "User Data Deletion Instructions" ,
"deletion.updated" : "Last updated: 2026-07-31" ,
"deletion.intro" :
2026-08-03 05:52:02 +00:00
"This page explains how to ask Lapras (巡樓) to delete personal data and Threads platform data associated with you." ,
2026-07-31 08:30:46 +00:00
"deletion.section.summary.title" : "1. Summary" ,
"deletion.section.summary.body" :
"If you stop using the Service, or remove our app in Meta and want us to delete data we hold, follow the steps below. After identity verification we delete or anonymize deletable data, except where law or legitimate retention requires keeping records." ,
"deletion.section.steps.title" : "2. How to request deletion" ,
"deletion.section.steps.body" :
"Step 1: If you can still sign in, disconnect all Threads accounts in Lapras (settings/accounts).\nStep 2: Email the Service operator from your registered email address.\nStep 3: Subject line: “Data Deletion Request”.\nStep 4: Include:\n• Registered email (required)\n• Display name or member id if known\n• Threads username or in-app account id if you connected Threads\n• Scope: entire account / Threads connection + synced data only / a specific workspace\nStep 5: We confirm receipt, process the request, and email completion when possible." ,
"deletion.section.threads.title" : "3. Threads / Meta authorization" ,
"deletion.section.threads.body" :
2026-08-03 05:52:02 +00:00
"Deleting Lapras data does not delete your posts or account on Threads/Instagram/Meta.\nAlso revoke our app in Meta/Threads settings to clear authorization on Meta’ s side.\nIf the platform sends us a deletion callback, we process matching data; otherwise use the email process on this page." ,
2026-07-31 08:30:46 +00:00
"deletion.section.scope.title" : "4. What we delete" ,
"deletion.section.scope.body" :
"Where reasonably possible we delete or anonymize:\n• Member personal data and credentials\n• Workspace content you created (personas, drafts, patrol, Outbox, etc., per request scope)\n• Threads connection identifiers, tokens, and sync caches\n• Non-essential job and analytics records\n\nWe may retain for a limited time or by law:\n• Transaction/billing records required by law\n• Security and anti-abuse logs (limited period)\n• Backup copies until rotation completes" ,
"deletion.section.timeline.title" : "5. Timeline" ,
"deletion.section.timeline.body" :
"We typically complete deletion or anonymization within 30 days after a verifiable request. If more time is needed (complex workspaces or legal review), we will communicate an estimate. Backup purge may finish afterward." ,
"deletion.section.contact.title" : "6. Contact" ,
"deletion.section.contact.body" :
"Email the Service operator from your registered address with subject “Data Deletion Request”. Full privacy policy: /privacy. Terms: /terms." ,
2026-07-10 05:10:31 +00:00
"common.listSep" : ", " ,
"common.dash" : "—" ,
2026-08-06 14:16:49 +00:00
"scout.title" : "Manual discovery" ,
2026-08-03 05:52:02 +00:00
"scout.today" : "Today's sortie" ,
2026-07-10 05:10:31 +00:00
"scout.purposeValue" : "Pain-point replies" ,
2026-08-06 14:16:49 +00:00
"scout.purposeDemand" : "Find demand pains" ,
"scout.purposeProvider" : "Find solution providers" ,
2026-07-10 05:10:31 +00:00
"scout.purposeActivity" : "Activity short replies" ,
"scout.goal" : "Daily goal (posts)" ,
"scout.progress" : "Progress {done}/{goal}" ,
"scout.intent" : "What to find / reply to" ,
"scout.keyword" : "Keywords" ,
"scout.intentPh" : "e.g. seasonal scalp itch, truly fragrance-free, outlets on weekends" ,
"scout.keywordPh" : "e.g. weekend coffee remote" ,
"scout.productOptional" : "Product (optional)" ,
2026-08-06 14:16:49 +00:00
"scout.productRequired" : "Product to solve (required)" ,
"scout.selectProduct" : "Select a product" ,
2026-07-10 05:10:31 +00:00
"scout.noProduct" : "No product" ,
"scout.brandFallback" : "Brand" ,
"scout.placement" : "Placement: {label}" ,
2026-08-06 14:16:49 +00:00
"scout.providerProduct" : "Product: {label}" ,
2026-07-10 05:10:31 +00:00
"scout.painPart" : " · pain “{pain}”" ,
"scout.noProductsBefore" : "No products yet. Add some under" ,
"scout.noProductsAfter" : "." ,
"scout.start" : "Start" ,
"scout.startMore" : "Fetch more" ,
"scout.fetching" : "Fetching…" ,
2026-08-03 07:58:07 +00:00
"scout.planKeywords" : "Generate keywords" ,
"scout.planning" : "Planning keywords…" ,
"scout.workshop" : "Search keywords (editable)" ,
"scout.workshopHint" : "Search runs only after you confirm. Each line is its own query — remove weak ones and add phrases that work." ,
"scout.workshopEmpty" : "Keep at least one keyword to search" ,
"scout.addTerm" : "Add" ,
"scout.addTermPh" : "Add another search phrase" ,
"scout.removeTerm" : "Remove" ,
"scout.confirmScan" : "Search with these" ,
"scout.replan" : "Regenerate" ,
"scout.clearWorkshop" : "Cancel" ,
"scout.termsReady" : "{n} keywords ready — review before searching." ,
2026-07-10 05:10:31 +00:00
"scout.runs" : "Patrol batches" ,
"scout.runCount" : "Batch ({n})" ,
"scout.runSelectAria" : "Switch patrol batch" ,
"scout.runPending" : "{n} pending · " ,
"scout.runDone" : "Cleared · " ,
"scout.runTotal" : " ({n} posts)" ,
"scout.deleteRun" : "Delete this batch" ,
"scout.deleting" : "Deleting…" ,
"scout.now" : "Now this post" ,
2026-08-03 05:52:02 +00:00
"scout.emptyBatch" : "Nothing pending in this batch. Want a daily auto demand list? Open Demand and add keyword watches." ,
2026-07-10 05:10:31 +00:00
"scout.draft" : "Reply draft" ,
"scout.draftPhActivity" : "Short reply…" ,
"scout.draftPhValue" : "Empathize → suggest…" ,
"scout.sendAccount" : "Send from account" ,
"scout.noAccount" : "No usable accounts" ,
"scout.personaForRegen" : "Persona (for regen)" ,
"scout.notReady" : " (not ready)" ,
"scout.skip" : "Skip" ,
"scout.regen" : "Regen" ,
"scout.send" : "Send" ,
2026-07-20 06:33:14 +00:00
"scout.openThreadsReply" : "Open Threads to reply" ,
"scout.markManualDone" : "Replied, mark complete" ,
"scout.manualReplyHint" : "Review the draft, open the original Threads post, and reply there. The draft will be copied when possible. Return here to mark it complete." ,
"scout.openedAndCopied" : "Threads opened and the draft was copied. Paste the reply, then return to mark it complete." ,
"scout.openedManual" : "Threads opened. Return here after replying to mark it complete." ,
"scout.noPermalink" : "This result has no Threads permalink to open." ,
"scout.manualDone" : "Manual reply marked complete · today {done}/{goal}" ,
"scout.manualDoneFail" : "Failed to mark the manual reply complete" ,
2026-07-13 08:59:13 +00:00
"scout.resend" : "Resend" ,
2026-07-10 05:10:31 +00:00
"scout.sending" : "Sending…" ,
"scout.needAccountBefore" : "Connect a usable account under" ,
"scout.needAccountAfter" : "first." ,
"scout.loadingKnowledge" : "Preparing related knowledge…" ,
"scout.product" : "Product" ,
2026-07-13 08:59:13 +00:00
"scout.queue" : "Matches · {n}" ,
"scout.valueQueue" : "Value replies · {n}" ,
2026-08-06 14:16:49 +00:00
"scout.providerQueue" : "Solution providers · {n}" ,
"scout.demandQueue" : "Demand pains · {n}" ,
2026-07-13 08:59:13 +00:00
"scout.activityQueue" : "Activity short replies · {n}" ,
"scout.noMatchesInQueue" : "No matches in this queue" ,
2026-07-10 05:10:31 +00:00
"scout.collapseQueue" : "Collapse queue" ,
"scout.expandQueue" : "Expand queue" ,
"scout.noOtherPending" : "No other pending" ,
"scout.unnamedRun" : "Unnamed batch" ,
"scout.thisRun" : "this batch" ,
"scout.confirmDeleteRun" : "Delete patrol batch “{label}”?\\nHits and related knowledge will be removed. This cannot be undone." ,
"scout.deletedRun" : "Deleted batch “{label}”" ,
"scout.deleteRunFail" : "Failed to delete batch" ,
"scout.needKeyword" : "Enter keywords first" ,
"scout.needIntent" : "Write what you're looking for" ,
"scout.productMissing" : "Selected product is not in the list. Please reselect." ,
2026-08-06 14:16:49 +00:00
"scout.providerSetupRequired" : "Solution matching needs pain points and at least one tag or provider capability term. Complete them on the Brands page first." ,
2026-07-10 05:10:31 +00:00
"scout.defaultLabel" : "Patrol" ,
"scout.newRunActivity" : "New batch “{label}” · {n} pending" ,
"scout.newRunValue" : "New batch “{label}” · {n} posts · handle “Now this post”" ,
"scout.knowledgeReady" : "“{label}” knowledge ready · {n} notes" ,
"scout.patrolFail" : "This patrol failed" ,
2026-07-13 08:59:13 +00:00
"scout.loadFail" : "Scout data could not be loaded. Refresh and try again." ,
"scout.scanQueued" : "Patrol job “{label}” queued. Matches will load automatically when it completes." ,
"scout.workerWaiting" : "The patrol job is still waiting for a worker. Check that apps/backend worker is running." ,
"scout.scanReady" : "Patrol complete. Found {n} pending replies." ,
"scout.queued" : "Queued in @{who}'s Outbox for delivery · today {done}/{goal}" ,
"scout.scanJob" : "Patrol job" ,
"scout.scanInProgress" : "Scanning" ,
"scout.crawlerSessionRequired" : "The patrol crawler needs a valid Chrome session. Sync the session from a signed-in Threads tab in Settings." ,
"scout.openSettings" : "Open Settings" ,
"scout.source" : "Source: {source}" ,
"scout.classification" : "Class: {classification}" ,
"scout.createdAt" : "Created {time}" ,
"scout.openPermalink" : "Open original" ,
2026-07-10 05:10:31 +00:00
"scout.draftFail" : "Draft failed" ,
"scout.skipped" : "Skipped" ,
2026-07-13 08:59:13 +00:00
"scout.status.new" : "To handle" ,
"scout.status.drafted" : "Drafted" ,
"scout.status.queued" : "Queued" ,
"scout.status.published" : "Sent" ,
"scout.status.skipped" : "Skipped" ,
2026-07-10 05:10:31 +00:00
"scout.noDraft" : "No draft to send" ,
"scout.accountFallback" : "account" ,
"scout.sent" : "Sent (@{who}) · today {done}/{goal}" ,
"scout.sendFail" : "Send failed" ,
"scout.confirmDeletePost" : "Delete this hit?" ,
2026-07-13 08:59:13 +00:00
"scout.deletedPost" : "Deleted this hit" ,
2026-07-10 05:10:31 +00:00
"scout.stanceActivity" : "Short reply · activity" ,
2026-08-06 14:16:49 +00:00
"scout.stanceDemand" : "Demand pain · replyable" ,
"scout.stanceProvider" : "Solution matching · no product promotion" ,
"scout.demandHint" : "These posts show people seeking help or comparing solutions. Read the original post before responding helpfully." ,
"scout.providerHint" : "These are solution-provider candidates. Review the original post and proof of capability before contacting them." ,
2026-07-10 05:10:31 +00:00
"scout.stanceProduct" : "Empathy · soft product" ,
"scout.stanceRelation" : "Engage · build rapport" ,
"brands.title" : "Brands" ,
"brands.railAria" : "Brand list" ,
"brands.railLabel" : "Your brands" ,
"brands.add" : "Add" ,
"brands.brandName" : "Brand name" ,
"brands.brandNamePh" : "e.g. your brand" ,
"brands.creating" : "Creating…" ,
"brands.createBrand" : "Create brand" ,
"brands.searchAria" : "Search brands" ,
"brands.searchPh" : "Search brands…" ,
"brands.empty" : "No brands yet" ,
"brands.noMatch" : "No matches" ,
"brands.selectAria" : "Select brand" ,
"brands.pickOne" : "Pick a brand" ,
"brands.inUseHint" : "Active · used for patrol and studio" ,
"brands.inUse" : "Active" ,
2026-08-03 05:52:02 +00:00
"brands.tabBrands" : "Brands" ,
2026-07-10 05:10:31 +00:00
"brands.tabInfo" : "Brand info" ,
"brands.tabProducts" : "Products" ,
"brands.tabProductsN" : "Products ({n})" ,
"brands.displayName" : "Name" ,
"brands.brief" : "Summary" ,
"brands.briefPh" : "One line about this brand" ,
"brands.audience" : "Audience" ,
"brands.audiencePh" : "Who cares and why" ,
"brands.goals" : "Goals" ,
"brands.goalsPh" : "What you want on Threads" ,
"brands.saving" : "Saving…" ,
"brands.deleteBrand" : "Delete brand" ,
"brands.searchProductAria" : "Search products" ,
"brands.searchProductPh" : "Search products…" ,
"brands.addProduct" : "Add product" ,
"brands.noProducts" : "No products yet" ,
"brands.hasLink" : "Has link" ,
"brands.painLabel" : "Pains " ,
"brands.editProduct" : "Edit product" ,
"brands.newProduct" : "New product" ,
"brands.importFromUrl" : "Import from product URL" ,
"brands.fetching" : "Fetching…" ,
"brands.fetch" : "Fetch" ,
"brands.pains" : "Pain points" ,
"brands.painsPh" : "One per line" ,
"brands.tags" : "Tags" ,
"brands.tagsPh" : "Comma-separated" ,
"brands.intro" : "Description" ,
2026-08-06 14:16:49 +00:00
"brands.providerCapabilities" : "Capabilities / services that solve the pain" ,
"brands.providerCapabilitiesPh" : "e.g. dermatology, allergen testing, sensitive-skin consultation" ,
"brands.providerExcludes" : "Same-category exclusions" ,
"brands.providerExcludesPh" : "e.g. shampoo, hair-care products" ,
2026-07-10 05:10:31 +00:00
"brands.link" : "Link" ,
"brands.update" : "Update" ,
"brands.createItem" : "Add" ,
"brands.needName" : "Enter a name" ,
"brands.created" : "Created “{name}”" ,
"brands.createFail" : "Create failed" ,
"brands.saved" : "Saved" ,
"brands.saveFail" : "Save failed" ,
"brands.confirmDelete" : "Delete “{name}”?" ,
"brands.deleted" : "Deleted" ,
"brands.deleteFail" : "Delete failed" ,
"brands.fetchFail" : "Fetch failed" ,
"brands.needLabelContext" : "Name and description are required" ,
"brands.productUpdated" : "Updated" ,
"brands.productAdded" : "Added" ,
"brands.confirmDeleteProduct" : "Delete this product?" ,
"insights.title" : "Account performance" ,
"insights.account" : "Account" ,
"insights.noAccount" : "No accounts" ,
"insights.syncing" : "Syncing…" ,
"insights.syncPosts" : "Sync posts" ,
"insights.myPosts" : "My posts" ,
"insights.pickAccount" : "Select an account" ,
"insights.goAccounts" : "Accounts" ,
"insights.kpiMonth" : "This month" ,
"insights.monthViews" : "Views this month" ,
"insights.monthLikes" : "Likes this month" ,
"insights.monthReplies" : "Replies this month" ,
"insights.engRate" : "Engagement" ,
"insights.vsPrev" : "vs last month" ,
"insights.avgNear" : "Recent avg {rate}" ,
"insights.trendTitle" : "Trends & analysis · @{user}" ,
"insights.metricViews" : "Views" ,
"insights.metricLikes" : "Likes" ,
"insights.metricReplies" : "Replies" ,
"insights.metricPosts" : "Posts" ,
"insights.metricPostsFull" : "Posts" ,
"insights.chartMetrics" : "Chart metric" ,
"insights.barsAria" : "Recent months {metric}; click a bar for analysis" ,
"insights.barsLabel" : "{metric} · last {n} months" ,
"insights.clickBar" : " · click bar for analysis" ,
"insights.pickMonthAria" : "Select month" ,
"insights.barTitle" : "{label}: {value}{est} · click for analysis" ,
"insights.est" : " (est.)" ,
"insights.monthSuffix" : "{m}" ,
"insights.sparkAria" : "Trend line; click a node to select month" ,
"insights.analysisOf" : "{label} analysis" ,
"insights.producedAt" : "Generated {time}" ,
"insights.hasEstimate" : " · includes estimates" ,
"insights.viewsVsPrev" : " · views vs prev {delta}" ,
"insights.statPosts" : "Posts" ,
"insights.statViews" : "Views" ,
"insights.statLikes" : "Likes" ,
"insights.statReplies" : "Replies" ,
"insights.conclusions" : "Takeaways" ,
"insights.recommendations" : "Recommendations" ,
"insights.highlights" : "Month highlights" ,
"insights.findTopics" : "Find topics" ,
"insights.goScout" : "Go patrol" ,
"insights.selectMonth" : "Select a month" ,
"insights.topPosts" : "Top posts" ,
"insights.noPosts" : "No posts yet" ,
"insights.postStats" : "Views {views} · likes {likes} · replies {replies}" ,
"insights.openThreads" : "Open Threads" ,
"insights.zeroPct" : "0%" ,
2026-07-13 03:18:08 +00:00
"insights.panelHint" : "Aggregates metrics from synced “My posts”" ,
"insights.lastSynced" : "Last sync {time}" ,
"insights.neverSynced" : "Not synced yet" ,
"insights.emptyTitle" : "No post data yet" ,
"insights.emptyDesc" : "Tap “Sync posts” to pull your Threads posts and insights, then review charts and analysis." ,
"insights.syncDone" : "Synced {n} posts · insights updated" ,
"insights.syncFail" : "Sync failed" ,
"insights.loadFail" : "Failed to load posts" ,
"insights.zeroViewsHint" : "Posts found but views are mostly 0 — Insights scope may be missing, or stats not ready. Try sync again." ,
"insights.postsInMonth" : "{n} posts" ,
"insights.kpiForMonth" : "{label} metrics" ,
"insights.topPostsOfMonth" : "{label} · top posts" ,
"insights.noPostsInMonth" : "No posts in {label}" ,
"insights.pastMonthEmptyHint" : "No synced posts for this month (past months are fetched once). Sync manually or pick another month." ,
"insights.pastBackfillDone" : "Backfilled {n} posts (past months fetch once)" ,
"insights.autoRefreshDone" : "Current month refreshed ({n} posts)" ,
"insights.noDataNoAnalysis" : "No posts in {label} — no analysis." ,
"insights.noAnalysisYet" : "No analysis for {label} yet (need synced posts)." ,
2026-07-10 05:10:31 +00:00
"plays.tabOwn" : "My posts" ,
"plays.tabLink" : "Threads link" ,
"plays.noPosts" : "No posts yet" ,
"plays.targetPost" : "Target post" ,
"plays.likesSuffix" : " ({n} likes)" ,
"plays.linkCard" : "Paste Threads link" ,
"plays.postLink" : "Post URL" ,
"plays.resolving" : "Resolving…" ,
"plays.resolve" : "Resolve link" ,
"plays.resolveHint" : "After resolve, schedule your accounts to reply under that post." ,
"plays.targetOwn" : "Target post (yours)" ,
"plays.openThreads" : "Open Threads" ,
"plays.external" : "External post" ,
"plays.addScheme" : "New scheme" ,
"plays.schemeCount" : "{n} schemes for this target" ,
"plays.noSchemes" : "No schemes yet" ,
"plays.replyCount" : "{n} replies" ,
"plays.editTitle" : "Edit: {title}" ,
"plays.schemeName" : "Scheme name" ,
"plays.schemeNamePh" : "e.g. Scheme A · soft engage" ,
"plays.speakersOwn" : "Accounts (post owner always included)" ,
"plays.speakers" : "Accounts" ,
"plays.postOwner" : " (post owner)" ,
"plays.noAccounts" : "No usable accounts. Connect Threads first." ,
"plays.interval" : "Interval (min)" ,
"plays.applyInterval" : "Apply interval" ,
"plays.aiEmpty" : "AI fill empty" ,
"plays.aiBusy" : "Generating…" ,
2026-07-13 01:15:30 +00:00
"plays.aiFail" : "AI generate failed" ,
"plays.aiStepDone" : "Step filled — edit as needed" ,
"plays.aiNoneFilled" : "No empty steps to fill (or persona not ready)" ,
"plays.needPersonaForStep" : "Pick a ready persona on this step first" ,
"plays.aiEmptyResult" : "AI returned empty — retry or pick a faster model" ,
"plays.saveBeforeAi" : "Save the play first, then generate the full script (needs play id)" ,
"plays.scriptJobQueued" : "Full-script job queued — you can leave; steps fill when done" ,
"plays.scriptJobDone" : "Script generated — steps filled (edit as needed)" ,
"plays.scriptJobDoneReload" : "Script done — reopen the play to see steps" ,
2026-07-10 05:10:31 +00:00
"plays.replies" : "Replies ({n})" ,
"plays.stepN" : "Reply {n}" ,
"plays.who" : "Who" ,
"plays.personaOpt" : "Persona (optional)" ,
"plays.brandOpt" : "Brand (optional)" ,
"plays.reply" : "Reply" ,
"plays.attach" : "Images" ,
"plays.addOne" : "Add one" ,
"plays.saving" : "Saving…" ,
"plays.saveScheme" : "Save scheme" ,
"plays.submitting" : "Submitting…" ,
"plays.submitOutbox" : "Submit to Outbox" ,
"plays.closeEdit" : "Close editor" ,
"plays.noTarget" : "No target post yet" ,
"plays.resolved" : "Link resolved" ,
"plays.resolveFail" : "Resolve failed" ,
"plays.filled" : "Generated {n}" ,
"plays.needTarget" : "Select a target post first" ,
"plays.saved" : "Scheme saved" ,
"plays.saveFail" : "Save failed" ,
"plays.submitted" : "Sent to Outbox" ,
"plays.submitFail" : "Submit failed" ,
"plays.confirmDelete" : "Delete this scheme?" ,
"plays.accountFallback" : "account" ,
"inspire.loading" : "Loading…" ,
2026-07-13 01:15:30 +00:00
"inspire.trendsAria" : "Topic ideas" ,
"inspire.trendsLabel" : "Topic ideas" ,
"inspire.trendsHint" : "Web-sourced ideas · costs a search credit" ,
"inspire.trendsSeed" : "sample" ,
2026-07-13 03:18:08 +00:00
"inspire.topicSeed" : "I want a Threads post about “{topic}”. Help me with openings and angles." ,
2026-07-13 01:15:30 +00:00
"inspire.trendsEmpty" : "Tap “Find ideas” to search (uses credits)" ,
"inspire.refreshConfirm" : "Finding ideas costs 1 search credit. Continue?" ,
"inspire.refreshOk" : "Updated {n} topic ideas" ,
"inspire.refreshFail" : "Could not find ideas (quota or search failed)" ,
"inspire.refresh" : "Find ideas" ,
"inspire.clearChat" : "New chat" ,
"inspire.clearedNewSession" : "New chat started" ,
"inspire.sessionsAria" : "Inspiration chats" ,
"inspire.session" : "Chat" ,
"inspire.sessionNew" : "New chat" ,
"inspire.newSession" : "+ New" ,
"inspire.newSessionOk" : "New chat started (previous kept in list)" ,
"inspire.deleteSession" : "Delete current chat" ,
"inspire.deleteSessionShort" : "Delete" ,
"inspire.confirmDeleteSession" : "Delete this chat permanently?" ,
"inspire.deletedSession" : "Deleted — switched to another chat" ,
2026-07-10 05:10:31 +00:00
"inspire.pinAsElement" : "Apply as element" ,
"inspire.you" : "You" ,
"inspire.ai" : "AI" ,
"inspire.system" : "System" ,
"inspire.useDraft" : "Use this draft" ,
"inspire.openPlay" : "Open play" ,
"inspire.thinking" : "Thinking…" ,
2026-07-28 06:33:51 +00:00
"inspire.stop" : "Stop generating" ,
"inspire.stopped" : "Generation stopped" ,
2026-07-13 01:15:30 +00:00
"inspire.pinnedAria" : "This-round references (for the AI)" ,
"inspire.pinned" : "References" ,
"inspire.pinnedCount" : "· {n}" ,
2026-07-15 15:23:59 +00:00
"inspire.pinsLocalShort" : "this session" ,
"inspire.pinsSessionLocal" : "References apply to this session only and will be included with your next message." ,
2026-07-13 01:15:30 +00:00
"inspire.pickRight" : "Pick on the right = pin for AI; click name to insert" ,
"inspire.unpinTitle" : "Remove reference" ,
"inspire.insertPinTitle" : "Insert into input" ,
"inspire.insertBrand" : "Talk about “{name}”" ,
"inspire.insertedPin" : "Inserted “{name}” into the input" ,
"inspire.flowStep1" : "Prep" ,
"inspire.flowStep2" : "Ideate" ,
"inspire.flowStep3" : "Persona draft" ,
"inspire.emptyTitle" : "Ideate first, then draft in persona" ,
"inspire.emptyDesc" : "Pick a path. You don’ t need every control." ,
"inspire.entryTopic" : "Start from a topic" ,
"inspire.entryPaste" : "I have a draft — rewrite in persona" ,
"inspire.startTopicHint" : "Type a topic below and press Enter" ,
"inspire.pasteDraftHint" : "Paste your draft into the box, then rewrite" ,
"inspire.needMaterialOrPaste" : "No chat material yet — paste text to rewrite" ,
2026-07-20 06:33:14 +00:00
"inspire.flowOneLiner" : "Talk it through, search when needed, then turn the conversation into a post." ,
2026-07-13 01:15:30 +00:00
"inspire.showTopics" : "Topics" ,
"inspire.hideTopics" : "Hide topics" ,
"inspire.showLibrary" : "Library" ,
"inspire.hideLibrary" : "Hide library" ,
"inspire.showAdvanced" : "Advanced" ,
"inspire.hideAdvanced" : "Hide advanced" ,
"inspire.readyToWrite" : "{n} turns in — ready to draft" ,
2026-07-10 05:10:31 +00:00
"inspire.inputAria" : "Talk to AI" ,
2026-07-13 01:15:30 +00:00
"inspire.inputPh" : "What to explore? Enter to send · Shift+Enter newline" ,
"inspire.previewTitle" : "Full payload that will be sent" ,
"inspire.previewPrompt" : "Full prompt (persona / brands / pins / chat — same as AI)" ,
"inspire.previewSections" : "Included sections" ,
"inspire.previewPinnedCount" : "{n} pinned elements" ,
"inspire.previewNoPins" : "No pinned elements yet" ,
"inspire.runes" : "chars" ,
"inspire.copyAll" : "Copy all" ,
"inspire.copied" : "Full prompt copied" ,
"inspire.copyFail" : "Copy failed" ,
"inspire.rawPrompt" : "Raw text sent to AI" ,
"inspire.verifyHow" : "To verify: open ? for fingerprint → send without changes → status says match." ,
"inspire.verifyHowShort" : "Type → ? (previews Send path) → send unchanged → should match. Generate uses different mode (fingerprint will differ)." ,
"inspire.previewModeNote" : "Assembled for mode={mode} (same as sending with that mode)." ,
"inspire.lastSentFp" : "Last sent fingerprint" ,
"inspire.matchOk" : "Matches last send ✓" ,
"inspire.matchBad" : "Differs from preview (input/pins/persona/mode)" ,
"inspire.matchBadShort" : "≠ last sent {sent}" ,
"inspire.fpMatch" : "Sent fingerprint {fp} matches preview" ,
"inspire.fpMismatch" : "Different: preview {preview} ≠ sent {sent} (text/mode changed?)" ,
"inspire.fpSent" : "Sent fingerprint {fp}" ,
"inspire.viewSent" : "View sent prompt" ,
"inspire.viewSentShort" : "Sent" ,
"inspire.sentPrompt" : "Prompt actually sent" ,
"inspire.sentPromptNote" : "Exact prompt the backend sent to the AI (from stream done)." ,
2026-07-10 05:10:31 +00:00
"inspire.send" : "Send" ,
2026-07-20 06:33:14 +00:00
"inspire.generate" : "Turn into post" ,
"inspire.generateHint" : "Turn the whole conversation into a publish-ready post using the selected persona and strong engagement principles" ,
"inspire.webSearch" : "Search web" ,
"inspire.webSearchOn" : "Web search: on" ,
"inspire.webSearchHint" : "The next message will search Exa before AI responds" ,
"inspire.needConversation" : "Share one thought first, then turn it into a post." ,
"inspire.needReadyPersona" : "Select a persona that has finished analysis first." ,
2026-07-13 01:15:30 +00:00
"inspire.generating" : "Rewriting…" ,
"inspire.generateOk" : "Draft rewritten in persona" ,
"inspire.materialTitle" : "Lock content to write" ,
"inspire.materialHint" : "Generate only rewrites this block (editable). Chat is for ideation; this is for the final voice." ,
"inspire.materialLabel" : "Content to rewrite" ,
"inspire.materialPh" : "Key points, angle, what you want to say…" ,
"inspire.rewriteNotes" : "Rewrite notes (optional)" ,
"inspire.rewriteNotesPh" : "e.g. shorter, more casual, end with a question" ,
"inspire.rewriteDefault" : "Rewrite as a Threads post in persona voice" ,
"inspire.confirmRewrite" : "Rewrite in persona" ,
"inspire.needMaterial" : "Chat a bit first, or paste text to rewrite" ,
2026-07-10 05:10:31 +00:00
"inspire.library" : "Element library" ,
"inspire.addNew" : "+ Add" ,
"inspire.kind" : "Type" ,
"inspire.kindRole" : "Role prompt" ,
"inspire.kindSnippet" : "Snippet" ,
"inspire.kindTrendNote" : "Trend note" ,
"inspire.kindBrand" : "Brand" ,
"inspire.kindTrend" : "Trend" ,
"inspire.name" : "Name" ,
"inspire.namePh" : "e.g. pro Threads writer" ,
"inspire.body" : "Content (goes into prompt)" ,
"inspire.bodyPh" : "You are a…" ,
"inspire.saveElement" : "Save to library" ,
"inspire.citeBrand" : "Cite brand" ,
"inspire.applied" : "Applied" ,
"inspire.clickApply" : "Click to apply" ,
"inspire.noBrands" : "No brands yet" ,
"inspire.appliedToggle" : "Applied · click again to remove" ,
"inspire.deleteAria" : "Delete" ,
2026-07-13 01:15:30 +00:00
"inspire.needInput" : "Type what you want to explore" ,
2026-07-10 05:10:31 +00:00
"inspire.fail" : "Failed" ,
"inspire.wantWrite" : "Want to write about {label}: {summary}" ,
"inspire.trendBody" : "Topic: {label}. {summary}" ,
"inspire.pinnedTrend" : "Applied trend {label}" ,
"inspire.needTitleBody" : "Name and content required" ,
"inspire.added" : "Added to library" ,
"inspire.addFail" : "Add failed" ,
"inspire.confirmRemove" : "Remove this from the library?" ,
2026-07-13 01:15:30 +00:00
"inspire.confirmClear" : "Start a new chat? (previous chats stay in the list)" ,
"inspire.genMessage" : "Rewrite as a Threads post in persona voice" ,
2026-07-10 05:10:31 +00:00
"persona.add" : "New persona" ,
"persona.empty" : "No personas yet" ,
"persona.emptyDesc" : "Add one and analyze it for drafting." ,
"persona.statusReady" : "ready" ,
"persona.statusAnalyzing" : "analyzing" ,
"persona.statusPending" : "pending" ,
"persona.default" : "Default" ,
"persona.backList" : "← Personas" ,
"persona.tabOverview" : "Overview" ,
"persona.tabAnalyze" : "Analyze" ,
"persona.tabFingerprint" : "Fingerprint" ,
"persona.tabPreview" : "Preview" ,
"persona.name" : "Name" ,
"persona.brief" : "Brief" ,
"persona.briefPh" : "Who, for whom, core message…" ,
"persona.avoid" : "Guardrails · banned words (comma-separated)" ,
"persona.guardChars" : "{n} chars" ,
"persona.banAi" : " · ban AI tone" ,
"persona.notReadySuffix" : " · not ready" ,
"persona.setDefault" : "Set as default" ,
"persona.modeAccount" : "Public account" ,
"persona.modeText" : "Paste text" ,
"persona.username" : "Threads username" ,
"persona.fromBound" : "From linked account" ,
"persona.select" : "Select…" ,
"persona.crawlAnalyze" : "Crawl public posts & analyze" ,
"persona.crawlBusy" : "Crawling / analyzing…" ,
"persona.refText" : "Reference text (--- separates posts)" ,
"persona.refTextPh" : "First post…\n\n---\n\nSecond post…" ,
"persona.sourceLabel" : "Source note (optional)" ,
"persona.sourcePh" : "My old posts" ,
"persona.analyzeText" : "Analyze from text" ,
"persona.analyzeBusy" : "Analyzing…" ,
"persona.sampleMeta" : "Samples {n}" ,
"persona.sourceManual" : "Pasted" ,
"persona.analyzeHint" : "After analysis, 8D summaries appear here." ,
"persona.fingerprintHint" : "Main voice for drafting. Edit catchphrases, rhythm, bans; Studio/replies use this." ,
"persona.fingerprint" : "Language fingerprint" ,
"persona.fingerprintPh" : "Filled after analysis…" ,
"persona.saveFingerprint" : "Save fingerprint" ,
"persona.tryGen" : "Preview root + reply" ,
2026-07-13 01:15:30 +00:00
"persona.previewHint" : "Write a sample root post and reply in this fingerprint style. Uses a live news headline as inspiration (rewritten in-character, not a news dump)." ,
"persona.previewRunning" : "Generating…" ,
"persona.previewDone" : "Preview done · topic: {topic} ({source})" ,
"persona.previewFail" : "Preview failed — try again" ,
"persona.previewTopicLabel" : "Topic seed: {topic} · {source}" ,
"persona.topicNews" : "live news" ,
"persona.topicManual" : "manual" ,
"persona.topicFallback" : "everyday seed" ,
2026-07-10 05:10:31 +00:00
"persona.notReadyMsg" : "Persona not ready" ,
"persona.rootPost" : "Root post" ,
"persona.reply" : "Reply" ,
"persona.hidePrompt" : "Hide prompt block" ,
"persona.showPrompt" : "Show injected prompt" ,
"persona.promptBlock" : "prompt block (post)" ,
"persona.pickOne" : "Pick a persona" ,
"persona.pickDesc" : "Or add one to start analyzing." ,
"persona.created" : "Created — finish account crawl or paste text under Analyze" ,
"persona.saved" : "Saved" ,
"persona.textDone" : "Text analysis done · {n} segments → ready" ,
"persona.analyzeFail" : "Analysis failed" ,
"persona.reading" : "Reading public posts…" ,
"persona.accountDone" : "@{user} · {n} posts → ready" ,
2026-07-13 01:15:30 +00:00
"persona.jobQueued" : "Queued as a background job · you can leave; results save automatically" ,
"persona.jobQueuedCrawl" : "Crawl + analyze job queued · you can leave; persona updates when done" ,
"persona.jobRunning" : "Analyzing in background… will refresh when ready (see Jobs for progress)" ,
"persona.jobDone" : "Background analysis finished · fingerprint saved" ,
"persona.jobFailed" : "Background analysis failed — check Jobs for the error or retry" ,
2026-07-28 06:33:51 +00:00
"persona.loadFail" : "Could not load personas" ,
2026-07-13 01:15:30 +00:00
"persona.openJob" : "Open job details" ,
2026-07-10 05:10:31 +00:00
"persona.setDefaultMsg" : "“{name}” set as default" ,
"persona.confirmDelete" : "Delete persona “{name}”?" ,
"persona.deleted" : "Persona deleted" ,
"persona.needReady" : "Finish analysis first (ready)" ,
"persona.dim.d1Tone" : "D1 Tone" ,
"persona.dim.d2Structure" : "D2 Structure" ,
"persona.dim.d3Interaction" : "D3 Interaction" ,
"persona.dim.d4Topics" : "D4 Topics" ,
"persona.dim.d5Rhythm" : "D5 Rhythm" ,
"persona.dim.d6Visual" : "D6 Visual" ,
"persona.dim.d7Conversion" : "D7 Conversion" ,
"persona.dim.d8Risk" : "D8 Risk" ,
"admin.users.loadFail" : "Load failed" ,
"admin.users.created" : "Added islander “{name}” · copy the password below" ,
"admin.users.createFail" : "Create failed" ,
"admin.users.unlimitedOn" : "“{name}” set to unlimited (usage still counted)" ,
"admin.users.unlimitedOff" : "“{name}” back to plan limits" ,
"admin.users.updateFail" : "Update failed" ,
"admin.users.planSet" : "“{name}” plan → {plan}" ,
"admin.users.confirmSuspend" : "Suspend “{name}”?\\nThey will not be able to sign in." ,
"admin.users.confirmUnsuspend" : "Restore “{name}”?\\nThey can sign in again." ,
"admin.users.didSuspend" : "Suspended “{name}”" ,
"admin.users.didUnsuspend" : "Restored “{name}”" ,
"admin.users.suspendFail" : "Suspend failed" ,
"admin.users.unsuspendFail" : "Restore failed" ,
"admin.users.markedVerified" : "Marked {name} as email verified" ,
"admin.users.markedUnverified" : "Marked {name} as unverified" ,
"admin.users.rolesUpdated" : "Updated roles for {name}: {roles}" ,
"admin.users.rolesFail" : "Role update failed" ,
"admin.users.confirmReset" : "Reset password for “{name}”?\\nTemp password stays visible until you close it (survives refresh)." ,
"admin.users.resetDone" : "Reset password for {name} (shown below — copy then close)" ,
"admin.users.resetFail" : "Reset failed" ,
"admin.users.copied" : "Copied to clipboard" ,
"admin.users.copyFail" : "Copy failed — select the password manually" ,
"admin.users.confirmDismissTemp" : "After close, this temp password won't show again (copy first if needed). Close?" ,
"admin.users.tempPwNew" : "New islander temp password" ,
"admin.users.tempPw" : "Temp password" ,
"admin.users.tempPwPersist" : "(stays visible · survives refresh)" ,
"admin.users.copyPw" : "Copy password" ,
"admin.users.close" : "Close" ,
"admin.users.createTitle" : "Add islander" ,
"admin.users.memberName" : "Display name" ,
"admin.users.displayNamePh" : "Display name" ,
"admin.users.email" : "Email" ,
"admin.users.initPassword" : "Initial password (optional)" ,
2026-07-10 12:54:45 +00:00
"admin.users.initPasswordPh" : "Leave blank to auto-generate; if set, must meet policy" ,
2026-07-10 05:10:31 +00:00
"admin.users.markVerifiedCheck" : "Mark email verified (usable immediately)" ,
"admin.users.alsoAdmin" : "Also make admin" ,
"admin.users.creating" : "Creating…" ,
"admin.users.createSubmit" : "Create islander" ,
"admin.users.clear" : "Clear" ,
"admin.users.searchActive" : "Search “{query}” · matches name, email, uid" ,
"admin.users.noMatch" : "No matches" ,
"admin.users.none" : "No islanders yet" ,
"admin.users.you" : "You" ,
"admin.users.status" : "Status" ,
"admin.users.role" : "Roles" ,
"admin.users.emailVerify" : "Email verification" ,
"admin.users.bio" : "Bio" ,
"admin.users.timezone" : "Timezone" ,
"admin.users.notifyEmail" : "Email notifications" ,
"admin.users.on" : "On" ,
"admin.users.off" : "Off" ,
"admin.users.createdAt" : "Created" ,
"admin.users.updatedAt" : "Updated" ,
"admin.users.accountStatus" : "Account status" ,
"admin.users.updating" : "Updating…" ,
"admin.users.usageTitle" : "Usage & plan" ,
2026-07-10 12:54:45 +00:00
"admin.users.usageLiveSkip" : "Plan/quota are Usage domain — not on live backend yet (M3). Editable in mock only." ,
2026-07-10 05:10:31 +00:00
"admin.users.plan" : "Plan" ,
"admin.users.planOption" : "{name} ({credits} credits / mo)" ,
"admin.users.unlimited" : "Unlimited" ,
"admin.users.byPlan" : "By plan" ,
"admin.users.setUnlimited" : "Set unlimited" ,
"admin.users.setLimited" : "Enforce plan limits" ,
"admin.users.unlimitedHint" : "Unlimited: can keep using past plan cap; AI/Search counts and credits still track." ,
"admin.users.loadingUsage" : "Loading usage prefs…" ,
"admin.users.assignRoles" : "Assign roles" ,
"admin.users.memberBase" : "{role} (base, always on)" ,
"admin.users.adminDesc" : "{role} — manage islanders and system" ,
"admin.users.saving" : "Saving…" ,
"admin.users.saveRoles" : "Save roles" ,
"admin.users.markUnverifiedBtn" : "Mark unverified" ,
"admin.users.markVerifiedBtn" : "Mark verified" ,
"admin.users.resetting" : "Resetting…" ,
"admin.users.resetTemp" : "Reset password (temp)" ,
"admin.users.customPw" : "Or set a password (optional)" ,
2026-07-10 12:54:45 +00:00
"admin.users.customPwPh" : "Password must be at least 12 characters with upper, lower, digit, and symbol" ,
2026-07-10 05:10:31 +00:00
"admin.users.resetWithCustom" : "Reset with this password" ,
"usage.tabMine" : "My usage" ,
"usage.tabTenant" : "All usage" ,
"usage.currentPlan" : "Current plan" ,
"usage.planMeta" : "/ mo · {n} credits monthly" ,
"usage.changePlan" : "Change plan" ,
2026-07-13 03:18:08 +00:00
"usage.upgradePlan" : "Upgrade plan" ,
2026-07-23 05:56:42 +00:00
"usage.outcome.title" : "This month's outcomes" ,
"usage.outcome.summary" : "Reach {reach} · Conversations {conversations} · Conversions {conversions}" ,
"usage.outcome.amount" : " (~${amount})" ,
"usage.outcome.emptyHint" : "No attributable outcomes this month yet — try patrol or posting." ,
2026-07-13 03:18:08 +00:00
"usage.warn.unlimitedOver" : "Used {used} credits this month (plan {cap}; limits off — you can continue)." ,
"usage.warn.exhausted" : "Monthly credits are used up. Upgrade or wait for next month." ,
"usage.warn.high" : "You've used {pct}% of monthly credits." ,
"usage.warn.meterNear" : "{label} is near its cap ({credits}/{cap} credits)." ,
2026-07-10 05:10:31 +00:00
"usage.usedThisMonth" : "Used this month" ,
"usage.remainLabel" : "Remaining" ,
"usage.ledgerToggle" : "Usage log" ,
"usage.collapse" : "Collapse" ,
"usage.eventsCount" : "{n} events" ,
"usage.granularity" : "Granularity" ,
"usage.day" : "Day" ,
"usage.monthUnit" : "Month" ,
"usage.year" : "Year" ,
"usage.from" : "From" ,
"usage.to" : "To" ,
"usage.callCounts" : "Call counts" ,
"usage.noMembers" : "No members yet" ,
"usage.planAria" : "{name} plan" ,
"usage.unlimitedTitle" : "Unlimited" ,
"usage.setLimited" : "Enforce limits" ,
"usage.setUnlimited" : "Set unlimited" ,
"usage.limitShort" : "Cap" ,
"usage.subscribed" : "Subscribed to {name}" ,
"usage.unlimitedSet" : "Set unlimited" ,
"usage.limitedSet" : "Limits enforced" ,
"usage.planUpdated" : "Plan updated to {name}" ,
"usage.fail" : "Failed" ,
"currency.TWD" : "New Taiwan Dollar (TWD)" ,
"currency.USD" : "US Dollar (USD)" ,
"currency.JPY" : "Japanese Yen (JPY)" ,
"currency.EUR" : "Euro (EUR)" ,
"currency.HKD" : "Hong Kong Dollar (HKD)" ,
"locale.zh-TW" : "繁體中文" ,
"locale.en" : "English" ,
"pager.nav" : "Pagination" ,
"pager.pageSize" : "Items per page" ,
"pager.perPage" : "{n}/page" ,
"pager.prev" : "Previous" ,
"pager.next" : "Next" ,
"plays.defaultTitle" : "New play" ,
"plays.topicOnPost" : "On: {snippet}" ,
"plays.topicOnExternal" : "On: {label} · {snippet}" ,
"plays.externalFallback" : "External post" ,
"persona.newName" : "New persona" ,
"persona.previewTopic" : "Looking for a café I can sit in for hours" ,
"persona.previewReplySample" : "The one in Da’ an is fine but crowded" ,
"inspire.playTitle" : "Inspired thread" ,
"play.err.needLead" : "Pick a lead account" ,
"play.err.needRoot" : "Add at least one root post" ,
"play.err.firstMustRoot" : "The first step must be the root post" ,
"play.err.rootMustLead" : "Root post must use the lead account" ,
"play.err.rootEmpty" : "Root post text cannot be empty" ,
"play.err.replyAccount" : "Replies can only use lead or selected cast accounts" ,
"play.err.replyEmpty" : "Reply text cannot be empty" ,
"play.err.needTarget" : "Pick one of your posts, or paste a Threads link" ,
"play.err.needReplies" : "Add at least one reply" ,
"play.err.needReplyAccounts" : "Pick at least one reply account" ,
"play.err.stepAccount" : "Every reply needs a usable account" ,
"play.err.stepEmpty" : "Reply text cannot be empty" ,
"play.err.notFound" : "Play not found" ,
"time.justNow" : "Just now" ,
"time.minAgo" : "{n}m ago" ,
"time.hourAgo" : "{n}h ago" ,
"time.dayAgo" : "{n}d ago" ,
"time.min" : "{n} min" ,
"time.hour" : "{n} hr" ,
"time.day" : "{n} day" ,
"time.expired" : "Expired {span}" ,
"time.remaining" : "{span} left" ,
"time.sessionUnknown" : "Session not recorded" ,
"time.sessionExpired" : "Session expired · {absolute}" ,
"time.sessionSoon" : "Session expiring · {relative} ({absolute})" ,
"time.sessionOk" : "Session OK · {relative} ({absolute})" ,
2026-08-03 05:52:02 +00:00
"radar.profile.title" : "Service profile" ,
"radar.profile.subtitle" :
"The radar uses this to judge whether an opportunity is worth answering, and replies quote these prices and tone." ,
"radar.profile.firstTimeHint" :
"Fill this in before turning on a radar watch. The more specific it is, the better the scoring and replies." ,
"radar.profile.updatedAt" : "Last updated: {at}" ,
"radar.profile.saved" : "Service profile saved" ,
"radar.profile.services" : "Services and pricing" ,
"radar.profile.servicesHint" :
"At least one. Leave prices empty to mean negotiable; if filled they show up in replies." ,
"radar.profile.serviceName" : "Service name" ,
"radar.profile.serviceNamePh" : "e.g. Interior measuring and layout" ,
"radar.profile.priceMin" : "Price from" ,
"radar.profile.priceMax" : "Price to" ,
"radar.profile.addService" : "+ Add service" ,
"radar.profile.areas" : "Service areas" ,
"radar.profile.areasHint" :
"Pick the cities you can actually serve; mismatched leads score lower. Tick remote below if location does not matter." ,
"radar.profile.remoteOk" : "Remote work is fine (any location)" ,
"radar.profile.forbidden" : "Forbidden words" ,
"radar.profile.forbiddenHint" : "One per line. These never appear in any generated reply." ,
"radar.profile.forbiddenPh" : "guaranteed\ncheapest\nnumber one" ,
"radar.profile.cases" : "Case studies" ,
"radar.profile.casesHint" : "Optional. Replies cite these when proof helps; if empty they cite nothing." ,
"radar.profile.caseTitle" : "Case title" ,
"radar.profile.caseSummary" : "One-line summary" ,
"radar.profile.addCase" : "+ Add case" ,
"radar.profile.faq" : "FAQ" ,
"radar.profile.faqHint" : "Optional. Replies follow these answers when a similar question comes up." ,
"radar.profile.faqQuestion" : "Question" ,
"radar.profile.faqAnswer" : "Answer" ,
"radar.profile.addFaq" : "+ Add FAQ" ,
"radar.profile.availability" : "Availability" ,
"radar.profile.availabilityHint" : "e.g. Can start within two weeks, weekends only" ,
"radar.profile.toneNote" : "Tone note" ,
"radar.profile.toneNoteHint" : "e.g. Be direct, skip pleasantries, no exclamation marks" ,
"radar.watches.title" : "Demand watches" ,
"radar.watches.subtitle" :
"Subscribe to keywords for a daily auto list. Unlike Patrol, you don’ t re-run a manual scan each time." ,
"radar.watches.needProfile" : "Fill in the service profile before enabling demand watches" ,
"radar.watches.needProfileHint" :
"Scoring needs your service profile; without it every judgment is a guess." ,
"radar.watches.goProfile" : "Go to service profile" ,
"radar.watches.quota" : "Active {used} / {max}" ,
"radar.watches.quotaFull" : "Plan limit reached — pause or archive one to add another" ,
"radar.watches.add" : "+ New watch" ,
"radar.watches.newTitle" : "New demand watch" ,
"radar.watches.editTitle" : "Edit demand watch" ,
"radar.watches.terms" : "Terms" ,
"radar.watches.termsHint" : "One per line, commas work too. Phrases buyers type; hits go to intent scoring." ,
"radar.watches.termsPh" : "interior designer recommendation\nlooking for a designer" ,
"radar.watches.excludeTerms" : "Exclude terms" ,
"radar.watches.excludeHint" : "A hit here skips the post entirely, e.g. job ads or giveaways." ,
"radar.watches.excludePh" : "hiring\ngiveaway" ,
"radar.watches.regionsHint" :
"Leave regions empty to reuse the service profile areas; only narrow it down for this watch." ,
"radar.watches.regionsFromProfile" : "Regions from service profile" ,
"radar.watches.enableNow" : "Activate right away (uses an active slot)" ,
"radar.watches.filterStatus" : "Status" ,
"radar.watches.statusAll" : "All" ,
"radar.watches.status.active" : "Active" ,
"radar.watches.status.paused" : "Paused" ,
"radar.watches.status.archived" : "Archived" ,
"radar.watches.pause" : "Pause" ,
"radar.watches.resume" : "Resume" ,
"radar.watches.archive" : "Archive" ,
"radar.watches.confirmArchive" : "Archived watches stop sweeping and cannot be restored. Continue?" ,
"radar.watches.created" : "Watch created" ,
"radar.watches.updated" : "Watch updated" ,
"radar.watches.paused" : "Watch paused" ,
"radar.watches.resumed" : "Watch resumed" ,
"radar.watches.archived" : "Watch archived" ,
"radar.watches.lastSwept" : "Last sweep: {at}" ,
"radar.watches.neverSwept" : "Never swept" ,
"radar.watches.empty" : "No demand watches yet" ,
"radar.watches.emptyHint" :
"Add phrases buyers type (e.g. “looking for a designer”); the system sweeps daily. For a one-off pain/topic sortie, use Patrol." ,
"radar.watches.emptyFiltered" : "No watches in this status" ,
"radar.watches.sweepNow" : "Sweep now" ,
"radar.watches.sweepQueued" : "Demand sweep queued" ,
"radar.watches.sweepStarted" : "Demand sweep started (job {job}…)" ,
"today.radar.title" : "Today's demand" ,
"today.radar.total" : "Found" ,
"today.radar.high" : "High" ,
"today.radar.mid" : "Mid" ,
"today.radar.low" : "Low" ,
"today.radar.open" : "Open today's demand" ,
"today.radar.empty" : "No demand yet. Add keyword watches for a daily auto list (different from Patrol’ s manual scan)." ,
"today.radar.goProfile" : "Fill service profile" ,
"today.radar.goWatches" : "Add keyword watches" ,
"radar.suggest.title" : "Term suggestions" ,
"radar.suggest.hint" :
"Terms drawn from your service profile. Adopt them one by one or all at once; you still need to save to create the watch." ,
"radar.suggest.ask" : "Get suggestions" ,
"radar.suggest.again" : "Suggest more" ,
"radar.suggest.asking" : "Thinking…" ,
"radar.suggest.adopt" : "Adopt" ,
"radar.suggest.adopted" : "Adopted" ,
"radar.suggest.adoptAll" : "Adopt all" ,
"radar.suggest.include" : "Term" ,
"radar.suggest.exclude" : "Exclude" ,
"radar.suggest.none" : "Nothing usable came back. Make the service profile more specific and try again." ,
"radar.today.title" : "Today's demand" ,
"radar.today.subtitle" : "Daily auto list from your watches (not Patrol’ s one-off scan)." ,
"radar.today.link.watches" : "Demand watches" ,
"radar.today.link.crm" : "CRM board" ,
"radar.today.stats.total" : "Found today" ,
"radar.today.stats.high" : "High intent" ,
"radar.today.stats.mid" : "Mid intent" ,
"radar.today.stats.low" : "Low intent" ,
"radar.today.truncated" : "Daily cap reached; {n} lower-intent leads were not listed" ,
"radar.today.lastSwept" : "Last sweep: {at}" ,
"radar.today.band.high" : "High" ,
"radar.today.band.mid" : "Mid" ,
"radar.today.band.low" : "Low" ,
"radar.today.status.accepted" : "Added to CRM" ,
"radar.today.status.dismissed" : "Dismissed" ,
"radar.today.status.qualified" : "Open" ,
"radar.today.status.rejected" : "Rejected" ,
"radar.today.status.judging" : "Judging" ,
"radar.today.regionUnknown" : "Region unknown" ,
"radar.today.group.high" : "High intent" ,
"radar.today.group.mid" : "Mid intent" ,
"radar.today.group.low" : "Low intent" ,
"radar.today.group.empty" : "None in this band" ,
"radar.today.group.expand" : "Expand" ,
"radar.today.group.collapse" : "Collapse" ,
"radar.today.action.open" : "Original" ,
"radar.today.action.accept" : "Add to CRM" ,
"radar.today.action.dismiss" : "Dismiss" ,
"radar.today.action.reply" : "Generate reply" ,
"radar.today.action.hideReply" : "Hide reply" ,
"radar.today.action.reasons" : "Why this score" ,
"radar.today.action.hideReasons" : "Hide reasons" ,
"radar.today.action.override" : "Override band" ,
"radar.today.reply.hint" : "Pick a variant. DM is copy-only — never auto-sent." ,
"radar.today.reply.copy" : "Copy draft" ,
"radar.today.reply.variant.public_comment" : "Public comment" ,
"radar.today.reply.variant.dm" : "DM" ,
"radar.today.reply.variant.no_sales" : "No-sales" ,
"radar.today.reply.variant.professional" : "Professional" ,
"radar.today.reply.variant.humorous" : "Light" ,
"radar.today.dim.authenticity" : "Authenticity" ,
"radar.today.dim.intent" : "Intent" ,
"radar.today.dim.region" : "Region" ,
"radar.today.dim.freshness" : "Freshness" ,
"radar.today.dim.fit" : "Fit" ,
"radar.today.empty.title" : "No demand for today yet" ,
"radar.today.empty.fallback" : "Check back later, or review demand watches and the service profile." ,
"radar.today.empty.goProfile" : "Fill service profile" ,
"radar.today.empty.goWatches" : "Add keyword watches" ,
"radar.today.empty.reason.no_profile" : "No service profile yet — fit cannot be scored." ,
"radar.today.empty.reason.no_watch" : "No demand watches yet; create keywords for daily auto sweeps (not Patrol’ s manual scan)." ,
"radar.today.empty.reason.all_watches_paused" : "All watches are paused. Resume one to keep daily sweeps." ,
"radar.today.empty.reason.not_swept_yet" : "Today’ s auto sweep isn’ t done; you can also hit Sweep now on watches." ,
"radar.today.empty.reason.sweep_failed" : "This auto sweep failed — check demand watches and retry." ,
"radar.today.empty.reason.no_hit" : "Swept but no matching demand. Loosen terms or exclusions." ,
"radar.today.msg.accepted" : "Added to CRM" ,
"radar.today.msg.dismissed" : "Dismissed" ,
"radar.today.msg.replyReady" : "Reply draft ready" ,
"radar.today.msg.overridden" : "Band updated" ,
"radar.today.msg.copied" : "Copied to clipboard" ,
"radar.today.msg.copyFail" : "Could not copy — select the text manually" ,
"radar.today.msg.marked" : "Marked as sent/copied" ,
"radar.today.msg.needReply" : "Generate a reply draft first" ,
"radar.today.reply.markCopy" : "Mark as copied & sent" ,
"radar.today.reply.markOutbox" : "Mark via outbox path" ,
"radar.today.reply.used" : "Already marked used" ,
"scout.promote" : "Save to Demand" ,
"scout.promoted" : "Copied into Today’ s demand ({band} · {score}) — follow up under Demand" ,
"scout.promoteFail" : "Could not save to Demand" ,
"crm.board.title" : "CRM board" ,
"crm.board.subtitle" : "Seven stages plus follow-up. Contacts land here after you accept an opportunity." ,
"crm.board.link.today" : "Today's opportunities" ,
"crm.board.link.followups" : "Follow-ups" ,
"crm.board.link.stats" : "Conversion stats" ,
"crm.board.empty" : "No contacts yet" ,
"crm.board.emptyHint" : "Accept an opportunity on the radar to add someone here." ,
"crm.board.oppCount" : "opportunities" ,
"crm.board.conversion" : "Conversion" ,
"crm.board.amount" : "Amount (optional)" ,
"crm.board.reportWon" : "Report won" ,
"crm.board.notes" : "Notes" ,
"crm.board.noteLabel" : "Add a note" ,
"crm.board.addNote" : "Save note" ,
"crm.board.timeline" : "Timeline" ,
"crm.board.timelineEmpty" : "No touches yet" ,
"crm.board.opps" : "Related opportunities" ,
"crm.board.markFollowUp" : "Mark follow-up" ,
"crm.board.clearFollowUp" : "Clear follow-up" ,
"crm.board.msg.stage" : "Stage updated" ,
"crm.board.msg.followUp" : "Follow-up updated" ,
"crm.board.msg.won" : "Conversion reported" ,
"crm.board.msg.note" : "Note added" ,
"crm.stage.new_found" : "New" ,
"crm.stage.engaged" : "Engaged" ,
"crm.stage.dm_sent" : "DM sent" ,
"crm.stage.replied" : "Replied" ,
"crm.stage.quoted" : "Quoted" ,
"crm.stage.won" : "Won" ,
"crm.stage.lost" : "Lost" ,
"crm.stage.needs_follow_up" : "Follow-up" ,
"crm.followups.title" : "Follow-ups" ,
"crm.followups.subtitle" : "Due visits, snooze, and AI drafts." ,
"crm.followups.link.board" : "CRM board" ,
"crm.followups.link.stats" : "Conversion stats" ,
"crm.followups.empty" : "Nothing due" ,
"crm.followups.emptyHint" : "Mark a contact for follow-up or send a reply to create one." ,
"crm.followups.due" : "Due" ,
"crm.followups.openContact" : "Open contact" ,
"crm.followups.aiMessage" : "AI follow-up draft" ,
"crm.followups.done" : "Done" ,
"crm.followups.snooze" : "Snooze 3 days" ,
"crm.followups.escalatedHint" : "Notified twice with no action — consider marking lost." ,
"crm.followups.status.scheduled" : "Scheduled" ,
"crm.followups.status.notified" : "Notified" ,
"crm.followups.status.done" : "Done" ,
"crm.followups.status.snoozed" : "Snoozed" ,
"crm.followups.status.escalated" : "Escalated" ,
"crm.followups.msg.done" : "Done" ,
"crm.followups.msg.snoozed" : "Snoozed 3 days" ,
"crm.followups.msg.drafted" : "Follow-up draft ready" ,
"crm.stats.title" : "Conversion stats" ,
"crm.stats.subtitle" : "Terms, reply variants, and sources. No ranking when samples are thin." ,
"crm.stats.terms" : "Term conversion" ,
"crm.stats.variants" : "Variant success" ,
"crm.stats.sources" : "Win sources" ,
"crm.stats.emptyDim" : "Not enough data yet" ,
"crm.stats.insufficient" : "Insufficient sample" ,
"crm.stats.col.term" : "Term" ,
"crm.stats.col.variant" : "Variant" ,
"crm.stats.col.source" : "Source" ,
"crm.stats.col.accepted" : "Accepted" ,
"crm.stats.col.replied" : "Replied" ,
"crm.stats.col.won" : "Won" ,
"crm.stats.col.used" : "Used" ,
"crm.stats.col.rate" : "Rate" ,
2026-07-10 05:10:31 +00:00
} ;
const catalogs : Record < AppLocale , MessageDict > = {
"zh-TW" : zhTW ,
en ,
} ;
export function getCatalog ( locale : AppLocale ) : MessageDict {
return catalogs [ locale ] || zhTW ;
}
export function translate (
locale : AppLocale ,
key : string ,
params? : Record < string , string | number > ,
) : string {
const dict = getCatalog ( locale ) ;
let s = dict [ key ] ? ? zhTW [ key ] ? ? key ;
if ( params ) {
for ( const [ k , v ] of Object . entries ( params ) ) {
s = s . replace ( new RegExp ( ` \\ { ${ k } \\ } ` , "g" ) , String ( v ) ) ;
}
}
return s ;
}