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;
+