diff --git a/app/components/settings.tsx b/app/components/settings.tsx index eb9bc6d..c68d5aa 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -220,6 +220,10 @@ export function Settings(props: { closeSettings: () => void }) { + + diff --git a/app/locales/cn.ts b/app/locales/cn.ts index 32185f3..bed6d22 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -45,8 +45,9 @@ const cn = { Lang: { Name: "Language", Options: { - cn: "中文", + cn: "简体中文", en: "English", + tw: "繁體中文", }, }, Avatar: "头像", diff --git a/app/locales/en.ts b/app/locales/en.ts index 5401cda..81f1396 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -49,8 +49,9 @@ const en: LocaleType = { Lang: { Name: "语言", Options: { - cn: "中文", + cn: "简体中文", en: "English", + tw: "繁體中文", }, }, Avatar: "Avatar", diff --git a/app/locales/index.ts b/app/locales/index.ts index e0a0921..bb6b0de 100644 --- a/app/locales/index.ts +++ b/app/locales/index.ts @@ -1,9 +1,10 @@ import CN from './cn' import EN from './en' +import TW from './tw' export type { LocaleType } from './cn' -type Lang = 'en' | 'cn' +type Lang = 'en' | 'cn' | 'tw' const LANG_KEY = 'lang' @@ -32,7 +33,7 @@ function getLanguage() { export function getLang(): Lang { const savedLang = getItem(LANG_KEY) - if (['en', 'cn'].includes(savedLang ?? '')) { + if (['en', 'cn', 'tw'].includes(savedLang ?? '')) { return savedLang as Lang } @@ -40,6 +41,8 @@ export function getLang(): Lang { if (lang.includes('zh') || lang.includes('cn')) { return 'cn' + } else if (lang.includes('tw')) { + return 'tw' } else { return 'en' } @@ -50,4 +53,4 @@ export function changeLang(lang: Lang) { location.reload() } -export default { en: EN, cn: CN }[getLang()] \ No newline at end of file +export default { en: EN, cn: CN, tw: TW }[getLang()] \ No newline at end of file diff --git a/app/locales/tw.ts b/app/locales/tw.ts new file mode 100644 index 0000000..514c31a --- /dev/null +++ b/app/locales/tw.ts @@ -0,0 +1,120 @@ +import type { LocaleType } from "./index"; + +const tw: LocaleType = { + WIP: "該功能仍在開發中……", + Error: { + Unauthorized: "現在是未授權狀態,請在設置頁填寫授權碼。", + }, + ChatItem: { + ChatItemCount: (count: number) => `${count} 條對話`, + }, + Chat: { + SubTitle: (count: number) => `與 ChatGPT 的 ${count} 條對話`, + Actions: { + ChatList: "查看消息列表", + CompressedHistory: "查看壓縮後的歷史 Prompt", + Export: "導出聊天記錄", + Copy: "複製", + Stop: "停止", + Retry: "重試", + }, + Typing: "正在輸入…", + Input: (submitKey: string) => `輸入消息,${submitKey} 發送`, + Send: "發送", + }, + Export: { + Title: "導出聊天記錄為 Markdown", + Copy: "全部複製", + Download: "下載文件", + }, + Memory: { + Title: "上下文記憶 Prompt", + EmptyContent: "尚未記憶", + Copy: "全部複製", + }, + Home: { + NewChat: "新的聊天", + DeleteChat: "確認刪除選中的對話?", + }, + Settings: { + Title: "設置", + SubTitle: "設置選項", + Actions: { + ClearAll: "清除所有數據", + ResetAll: "重置所有選項", + Close: "關閉", + }, + Lang: { + Name: "語言", + Options: { + cn: "简体中文", + en: "English", + tw: "繁體中文", + }, + }, + Avatar: "頭像", + Update: { + Version: (x: string) => `當前版本:${x}`, + IsLatest: "已是最新版本", + CheckUpdate: "檢查更新", + IsChecking: "正在檢查更新...", + FoundUpdate: (x: string) => `發現新版本:${x}`, + GoToUpdate: "前往更新", + }, + SendKey: "發送鍵", + Theme: "主題", + TightBorder: "緊湊邊框", + HistoryCount: { + Title: "附帶歷史消息數", + SubTitle: "每次請求攜帶的歷史消息數", + }, + CompressThreshold: { + Title: "歷史消息長度壓縮閾值", + SubTitle: "當未壓縮的歷史消息超過該值時,將進行壓縮", + }, + Token: { + Title: "API Key", + SubTitle: "使用自己的 Key 可繞過受控訪問限制", + Placeholder: "OpenAI API Key", + }, + AccessCode: { + Title: "訪問碼", + SubTitle: "現在是受控訪問狀態", + Placeholder: "請輸入訪問碼", + }, + Model: "模型 (model)", + Temperature: { + Title: "隨機性 (temperature)", + SubTitle: "值越大,回復越隨機", + }, + MaxTokens: { + Title: "單次回復限制 (max_tokens)", + SubTitle: "單次交互所用的最大 Token 數", + }, + PresencePenlty: { + Title: "話題新鮮度 (presence_penalty)", + SubTitle: "值越大,越有可能擴展到新話題", + }, + }, + Store: { + DefaultTopic: "新的聊天", + BotHello: "有什麼可以幫你的嗎", + Error: "出錯了,稍後重試吧", + Prompt: { + History: (content: string) => + "這是 ai 和用戶的歷史聊天總結作為前情提要:" + content, + Topic: + "直接返回這句話的簡要主題,不要解釋,如果沒有主題,請直接返回「閒聊」", + Summarize: + "簡要總結一下你和用戶的對話,用作後續的上下文提示 prompt,控制在 50 字以內", + }, + ConfirmClearAll: "確認清除所有聊天、設置數據?", + }, + Copy: { + Success: "已寫入剪切板", + Failed: "複製失敗,請賦予剪切板權限", + }, +}; + +export default tw; +