Merge branch 'main' into feature/add-disable-autoscroll-option

This commit is contained in:
Alexey Bogomolov
2025-04-15 14:22:48 +03:00
committed by GitHub
252 changed files with 33634 additions and 4192 deletions

View File

@@ -1,16 +1,46 @@
import { getClientConfig } from "../config/client";
import { SubmitKey } from "../store/config";
import type { PartialLocaleType } from "./index";
import { SAAS_CHAT_UTM_URL } from "@/app/constant";
const isApp = !!getClientConfig()?.isApp;
const tw: PartialLocaleType = {
WIP: "功能仍在開發中……",
const tw = {
WIP: "功能仍在開發中……",
Error: {
Unauthorized: "目前您的狀態是未授權,請前往[設定頁面](/#/auth)輸入授權碼。",
Unauthorized: isApp
? `😆 對話遇到了一些問題,不用慌:
\\ 1⃣ 想要無須設定開箱即用,[點選這裡立刻開啟對話 🚀](${SAAS_CHAT_UTM_URL})
\\ 2⃣ 如果你想消耗自己的 OpenAI 資源,點選[這裡](/#/settings)修改設定 ⚙️`
: `😆 對話遇到了一些問題,不用慌:
\ 1⃣ 想要無須設定開箱即用,[點選這裡立刻開啟對話 🚀](${SAAS_CHAT_UTM_URL})
\ 2⃣ 如果你正在使用私有部署版本,點選[這裡](/#/auth)輸入存取金鑰 🔑
\ 3⃣ 如果你想消耗自己的 OpenAI 資源,點選[這裡](/#/settings)修改設定 ⚙️
`,
},
Auth: {
Title: "需要密碼",
Tips: "管理員開啟了密碼驗證,請在下方填入存取密碼",
SubTips: "或者輸入你的 OpenAI 或 Google API 金鑰",
Input: "在此處填寫存取密碼",
Confirm: "確認",
Later: "稍候再說",
Return: "返回",
SaasTips: "設定太麻煩,想要立即使用",
TopTips:
"🥳 NextChat AI 首發優惠,立刻解鎖 OpenAI o1, GPT-4o, Claude-3.5 等最新的大型語言模型",
},
ChatItem: {
ChatItemCount: (count: number) => `${count} 則對話`,
},
Chat: {
SubTitle: (count: number) => `您已經與 ChatGPT 進行了 ${count} 則對話`,
EditMessage: {
Title: "編輯訊息記錄",
Topic: {
Title: "聊天主題",
SubTitle: "更改目前聊天主題",
},
},
Actions: {
ChatList: "檢視訊息列表",
CompressedHistory: "檢視壓縮後的歷史 Prompt",
@@ -18,7 +48,35 @@ const tw: PartialLocaleType = {
Copy: "複製",
Stop: "停止",
Retry: "重試",
Pin: "固定",
PinToastContent: "已將 1 條對話固定至預設提示詞",
PinToastAction: "檢視",
Delete: "刪除",
Edit: "編輯",
RefreshTitle: "重新整理標題",
RefreshToast: "已傳送重新整理標題請求",
},
Commands: {
new: "新建聊天",
newm: "從角色範本新建聊天",
next: "下一個聊天",
prev: "上一個聊天",
clear: "清除上下文",
del: "刪除聊天",
},
InputActions: {
Stop: "停止回應",
ToBottom: "移至最新",
Theme: {
auto: "自動主題",
light: "亮色模式",
dark: "深色模式",
},
Prompt: "快捷指令",
Masks: "所有角色範本",
Clear: "清除聊天",
Settings: "對話設定",
UploadImage: "上傳圖片",
},
Rename: "重新命名對話",
Typing: "正在輸入…",
@@ -34,13 +92,46 @@ const tw: PartialLocaleType = {
Reset: "重設",
SaveAs: "另存新檔",
},
IsContext: "預設提示詞",
ShortcutKey: {
Title: "鍵盤快捷方式",
newChat: "開啟新聊天",
focusInput: "聚焦輸入框",
copyLastMessage: "複製最後一個回覆",
copyLastCode: "複製最後一個程式碼區塊",
showShortcutKey: "顯示快捷方式",
clearContext: "清除上下文",
},
},
Export: {
Title: "將聊天記錄匯出為 Markdown",
Copy: "複製全部",
Download: "下載檔案",
Share: "分享到 ShareGPT",
MessageFromYou: "來自您的訊息",
MessageFromChatGPT: "來自 ChatGPT 的訊息",
Format: {
Title: "匯出格式",
SubTitle: "可以匯出 Markdown 文字檔或者 PNG 圖片",
},
IncludeContext: {
Title: "包含角色範本上下文",
SubTitle: "是否在訊息中顯示角色範本上下文",
},
Steps: {
Select: "選取",
Preview: "預覽",
},
Image: {
Toast: "正在產生截圖",
Modal: "長按或按右鍵儲存圖片",
},
},
Select: {
Search: "查詢訊息",
All: "選取全部",
Latest: "最近幾條",
Clear: "清除選取",
},
Memory: {
Title: "上下文記憶 Prompt",
@@ -51,7 +142,7 @@ const tw: PartialLocaleType = {
ResetConfirm: "重設後將清除目前對話記錄以及歷史記憶,確認重設?",
},
Home: {
NewChat: "新對話",
NewChat: "新對話",
DeleteChat: "確定要刪除選取的對話嗎?",
DeleteToast: "已刪除對話",
Revert: "撤銷",
@@ -60,6 +151,20 @@ const tw: PartialLocaleType = {
Title: "設定",
SubTitle: "設定選項",
Danger: {
Reset: {
Title: "重設所有設定",
SubTitle: "重設所有設定項回預設值",
Action: "立即重設",
Confirm: "確認重設所有設定?",
},
Clear: {
Title: "清除所有資料",
SubTitle: "清除所有聊天、設定資料",
Action: "立即清除",
Confirm: "確認清除所有聊天、設定資料?",
},
},
Lang: {
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
All: "所有語言",
@@ -69,10 +174,20 @@ const tw: PartialLocaleType = {
Title: "字型大小",
SubTitle: "聊天內容的字型大小",
},
FontFamily: {
Title: "聊天字型",
SubTitle: "聊天內容的字型,若留空則套用全域預設字型",
Placeholder: "字型名稱",
},
InjectSystemPrompts: {
Title: "匯入系統提示",
SubTitle: "強制在每個請求的訊息列表開頭新增一個模擬 ChatGPT 的系統提示",
},
InputTemplate: {
Title: "使用者輸入預處理",
SubTitle: "使用者最新的一則訊息會填充到此範本",
},
Update: {
Version: (x: string) => `目前版本:${x}`,
IsLatest: "已是最新版本",
@@ -92,10 +207,61 @@ const tw: PartialLocaleType = {
Title: "自動滾動回覆",
SubTitle: "回覆時滾動訊息",
},
AutoGenerateTitle: {
Title: "自動產生標題",
SubTitle: "根據對話內容產生合適的標題",
},
Sync: {
CloudState: "雲端資料",
NotSyncYet: "還沒有進行過同步",
Success: "同步成功",
Fail: "同步失敗",
Config: {
Modal: {
Title: "設定雲端同步",
Check: "檢查可用性",
},
SyncType: {
Title: "同步類型",
SubTitle: "選擇偏好的同步伺服器",
},
Proxy: {
Title: "啟用代理伺服器",
SubTitle: "在瀏覽器中同步時,啟用代理伺服器以避免跨域限制",
},
ProxyUrl: {
Title: "代理伺服器位置",
SubTitle: "僅適用於本專案內建的跨域代理",
},
WebDav: {
Endpoint: "WebDAV 位置",
UserName: "使用者名稱",
Password: "密碼",
},
UpStash: {
Endpoint: "UpStash Redis REST Url",
UserName: "備份名稱",
Password: "UpStash Redis REST Token",
},
},
LocalState: "本機資料",
Overview: (overview: any) => {
return `${overview.chat} 次對話,${overview.message} 則訊息,${overview.prompt} 條提示詞,${overview.mask} 個角色範本`;
},
ImportFailed: "匯入失敗",
},
Mask: {
Splash: {
Title: "面具啟動頁面",
SubTitle: "新增聊天時,呈現面具啟動頁面",
Title: "角色範本啟動頁面",
SubTitle: "新增聊天時,呈現角色範本啟動頁面",
},
Builtin: {
Title: "隱藏內建角色範本",
SubTitle: "在所有角色範本列表中隱藏內建角色範本",
},
},
Prompt: {
@@ -103,13 +269,13 @@ const tw: PartialLocaleType = {
Title: "停用提示詞自動補齊",
SubTitle: "在輸入框開頭輸入 / 即可觸發自動補齊",
},
List: "自定義提示詞列表",
List: "自提示詞列表",
ListCount: (builtin: number, custom: number) =>
`內建 ${builtin} 條,使用者定義 ${custom}`,
`內建 ${builtin} 條,使用者自訂 ${custom}`,
Edit: "編輯",
Modal: {
Title: "提示詞列表",
Add: "新增一",
Add: "新增一",
Search: "搜尋提示詞",
},
EditModal: {
@@ -135,11 +301,110 @@ const tw: PartialLocaleType = {
NoAccess: "輸入 API Key 檢視餘額",
},
Access: {
SaasStart: {
Title: "使用 NextChat AI",
Label: "(性價比最高的方案)",
SubTitle:
"由 NextChat 官方維護,無須設定開箱即用,支援 OpenAI o1、GPT-4o、Claude-3.5 等最新的大型語言模型",
ChatNow: "立刻開始對話",
},
AccessCode: {
Title: "存取密碼",
SubTitle: "管理員已開啟加密存取",
Placeholder: "請輸入存取密碼",
},
CustomEndpoint: {
Title: "自訂 API 端點 (Endpoint)",
SubTitle: "是否使用自訂 Azure 或 OpenAI 服務",
},
Provider: {
Title: "模型供應商",
SubTitle: "切換不同的服務供應商",
},
OpenAI: {
ApiKey: {
Title: "API Key",
SubTitle: "使用自訂 OpenAI Key 繞過密碼存取限制",
Placeholder: "OpenAI API Key",
},
Endpoint: {
Title: "API 端點 (Endpoint) 位址",
SubTitle: "除預設位址外,必須包含 http(s)://",
},
},
Azure: {
ApiKey: {
Title: "API 金鑰",
SubTitle: "使用自訂 Azure Key 繞過密碼存取限制",
Placeholder: "Azure API Key",
},
Endpoint: {
Title: "API 端點 (Endpoint) 位址",
SubTitle: "範例:",
},
ApiVerion: {
Title: "API 版本 (azure api version)",
SubTitle: "指定一個特定的 API 版本",
},
},
Anthropic: {
ApiKey: {
Title: "API 金鑰",
SubTitle: "從 Anthropic AI 取得您的 API 金鑰",
Placeholder: "Anthropic API Key",
},
Endpoint: {
Title: "端點位址",
SubTitle: "範例:",
},
ApiVerion: {
Title: "API 版本 (claude api version)",
SubTitle: "指定一個特定的 API 版本",
},
},
Google: {
ApiKey: {
Title: "API 金鑰",
SubTitle: "從 Google AI 取得您的 API 金鑰",
Placeholder: "輸入您的 Google AI Studio API 金鑰",
},
Endpoint: {
Title: "端點位址",
SubTitle: "範例:",
},
ApiVersion: {
Title: "API 版本(僅適用於 gemini-pro",
SubTitle: "選擇一個特定的 API 版本",
},
},
CustomModel: {
Title: "自訂模型名稱",
SubTitle: "增加自訂模型可選擇項目,使用英文逗號隔開",
},
},
Model: "模型 (model)",
CompressModel: {
Title: "壓縮模型",
SubTitle: "用於壓縮歷史記錄的模型",
},
Temperature: {
Title: "隨機性 (temperature)",
SubTitle: "值越大,回應越隨機",
},
TopP: {
Title: "核心採樣 (top_p)",
SubTitle: "與隨機性類似,但不要和隨機性一起更改",
},
MaxTokens: {
Title: "單次回應限制 (max_tokens)",
SubTitle: "單次互動所用的最大 Token 數",
@@ -170,19 +435,25 @@ const tw: PartialLocaleType = {
Success: "已複製到剪貼簿中",
Failed: "複製失敗,請賦予剪貼簿權限",
},
Download: {
Success: "內容已下載到您的目錄。",
Failed: "下載失敗。",
},
Context: {
Toast: (x: any) => `已設定 ${x} 條前置上下文`,
Edit: "前置上下文和歷史記憶",
Add: "新增一",
Add: "新增一",
Clear: "上下文已清除",
Revert: "恢復上下文",
},
Plugin: { Name: "外掛" },
FineTuned: { Sysmessage: "你是一個助手" },
Mask: {
Name: "面具",
Name: "角色範本",
Page: {
Title: "預設角色面具",
Title: "預設角色角色範本",
SubTitle: (count: number) => `${count} 個預設角色定義`,
Search: "搜尋角色面具",
Search: "搜尋角色角色範本",
Create: "新增",
},
Item: {
@@ -195,23 +466,56 @@ const tw: PartialLocaleType = {
},
EditModal: {
Title: (readonly: boolean) =>
`編輯預設面具 ${readonly ? "讀)" : ""}`,
Download: "下載預設",
Clone: "複製預設",
`編輯預設角色範本 ${readonly ? "讀)" : ""}`,
Download: "下載預設",
Clone: "以此預設值建立副本",
},
Config: {
Avatar: "角色頭像",
Name: "角色名稱",
Sync: {
Title: "使用全域設定",
SubTitle: "目前對話是否使用全域模型設定",
Confirm: "目前對話的自訂設定將會被自動覆蓋,確認啟用全域設定?",
},
HideContext: {
Title: "隱藏預設對話",
SubTitle: "隱藏後預設對話不會出現在聊天介面",
},
Share: {
Title: "分享此角色範本",
SubTitle: "產生此角色範本的直達連結",
Action: "複製連結",
},
},
},
SearchChat: {
Name: "搜尋聊天記錄",
Page: {
Title: "搜尋聊天記錄",
Search: "輸入搜尋關鍵詞",
NoResult: "沒有找到結果",
NoData: "沒有資料",
Loading: "載入中",
SubTitle: (count: number) => `找到 ${count} 條結果`,
},
Item: {
View: "檢視",
},
},
NewChat: {
Return: "返回",
Skip: "跳過",
Title: "挑選一個面具",
SubTitle: "現在開始,與面具背後的靈魂思維碰撞",
More: "搜尋更多",
NotShow: "不再呈現",
NotShow: "不再顯示",
ConfirmNoShow: "確認停用?停用後可以隨時在設定中重新啟用。",
Title: "挑選一個角色範本",
SubTitle: "現在開始,與角色範本背後的靈魂思維碰撞",
More: "搜尋更多",
},
URLCommand: {
Code: "偵測到連結中已經包含存取密碼,是否自動填入?",
Settings: "偵測到連結中包含了預設設定,是否自動填入?",
},
UI: {
Confirm: "確認",
@@ -219,8 +523,15 @@ const tw: PartialLocaleType = {
Close: "關閉",
Create: "新增",
Edit: "編輯",
Export: "匯出",
Import: "匯入",
Sync: "同步",
Config: "設定",
},
Exporter: {
Description: {
Title: "只有清除上下文之後的訊息會被顯示",
},
Model: "模型",
Messages: "訊息",
Topic: "主題",
@@ -228,4 +539,14 @@ const tw: PartialLocaleType = {
},
};
type DeepPartial<T> = T extends object
? {
[P in keyof T]?: DeepPartial<T[P]>;
}
: T;
export type LocaleType = typeof tw;
export type PartialLocaleType = DeepPartial<typeof tw>;
export default tw;
// Translated by @chunkiuuu, feel free the submit new pr if there are typo/incorrect translations :D