mirror of
https://github.com/Yidadaa/ChatGPT-Next-Web.git
synced 2025-09-25 13:49:18 +08:00
feat: support i18n
This commit is contained in:
71
app/locales/cn.ts
Normal file
71
app/locales/cn.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
|
||||
const cn = {
|
||||
ChatItem: {
|
||||
ChatItemCount: (count: number) => `${count} 条对话`,
|
||||
},
|
||||
Chat: {
|
||||
SubTitle: (count: number) => `与 ChatGPT 的 ${count} 条对话`,
|
||||
Actions: {
|
||||
ChatList: '查看消息列表',
|
||||
CompressedHistory: '查看压缩后的历史 Prompt',
|
||||
Export: '导出聊天记录',
|
||||
},
|
||||
Typing: '正在输入…',
|
||||
Input: (submitKey: string) => `输入消息,${submitKey} 发送`,
|
||||
Send: '发送',
|
||||
},
|
||||
Export: {
|
||||
Title: '导出聊天记录为 Markdown',
|
||||
Copy: '全部复制',
|
||||
Download: '下载文件',
|
||||
},
|
||||
Memory: {
|
||||
Title: '上下文记忆 Prompt',
|
||||
EmptyContent: '尚未记忆',
|
||||
Copy: '全部复制',
|
||||
},
|
||||
Home: {
|
||||
NewChat: '新的聊天',
|
||||
},
|
||||
Settings: {
|
||||
Title: '设置',
|
||||
SubTitle: '设置选项',
|
||||
Actions: {
|
||||
ClearAll: '清除所有数据',
|
||||
ResetAll: '重置所有选项',
|
||||
Close: '关闭',
|
||||
},
|
||||
Lang: {
|
||||
Name: 'Language',
|
||||
Options: {
|
||||
cn: '中文',
|
||||
en: 'English'
|
||||
}
|
||||
},
|
||||
Avatar: '头像',
|
||||
SendKey: '发送键',
|
||||
Theme: '主题',
|
||||
TightBorder: '紧凑边框',
|
||||
HistoryCount: '附带历史消息数',
|
||||
CompressThreshold: '历史消息长度压缩阈值',
|
||||
},
|
||||
Store: {
|
||||
DefaultTopic: '新的聊天',
|
||||
BotHello: '有什么可以帮你的吗',
|
||||
Error: '出错了,稍后重试吧',
|
||||
Prompt: {
|
||||
History: (content: string) => '这是 ai 和用户的历史聊天总结作为前情提要:' + content,
|
||||
Topic: "直接返回这句话的简要主题,不要解释,如果没有主题,请直接返回“闲聊”",
|
||||
Summarize: '简要总结一下你和用户的对话,用作后续的上下文提示 prompt,控制在 50 字以内',
|
||||
},
|
||||
ConfirmClearAll: '确认清除所有聊天、设置数据?',
|
||||
},
|
||||
Copy: {
|
||||
Success: '已写入剪切板',
|
||||
Failed: '复制失败,请赋予剪切板权限',
|
||||
}
|
||||
}
|
||||
|
||||
export type LocaleType = typeof cn;
|
||||
|
||||
export default cn;
|
70
app/locales/en.ts
Normal file
70
app/locales/en.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import type { LocaleType } from './index'
|
||||
|
||||
const en: LocaleType = {
|
||||
ChatItem: {
|
||||
ChatItemCount: (count: number) => `${count} messages`,
|
||||
},
|
||||
Chat: {
|
||||
SubTitle: (count: number) => `${count} messages with ChatGPT`,
|
||||
Actions: {
|
||||
ChatList: 'Go To Chat List',
|
||||
CompressedHistory: 'Compressed History Memory Prompt',
|
||||
Export: 'Export All Messages as Markdown',
|
||||
},
|
||||
Typing: 'Typing…',
|
||||
Input: (submitKey: string) => `Type something and press ${submitKey} to send`,
|
||||
Send: 'Send',
|
||||
},
|
||||
Export: {
|
||||
Title: 'All Messages',
|
||||
Copy: 'Copy All',
|
||||
Download: 'Download',
|
||||
},
|
||||
Memory: {
|
||||
Title: 'Memory Prompt',
|
||||
EmptyContent: 'Nothing yet.',
|
||||
Copy: 'Copy All',
|
||||
},
|
||||
Home: {
|
||||
NewChat: 'New Chat',
|
||||
},
|
||||
Settings: {
|
||||
Title: 'Settings',
|
||||
SubTitle: 'All Settings',
|
||||
Actions: {
|
||||
ClearAll: 'Clear All Data',
|
||||
ResetAll: 'Reset All Settings',
|
||||
Close: 'Close',
|
||||
},
|
||||
Lang: {
|
||||
Name: '语言',
|
||||
Options: {
|
||||
cn: '中文',
|
||||
en: 'English'
|
||||
}
|
||||
},
|
||||
Avatar: 'Avatar',
|
||||
SendKey: 'Send Key',
|
||||
Theme: 'Theme',
|
||||
TightBorder: 'Tight Border',
|
||||
HistoryCount: 'History Message Count',
|
||||
CompressThreshold: 'Message Compression Threshold',
|
||||
},
|
||||
Store: {
|
||||
DefaultTopic: 'New Conversation',
|
||||
BotHello: 'Hello! How can I assist you today?',
|
||||
Error: 'Something went wrong, please try again later.',
|
||||
Prompt: {
|
||||
History: (content: string) => 'This is a summary of the chat history between the AI and the user as a recap: ' + content,
|
||||
Topic: "Provide a brief topic of the sentence without explanation. If there is no topic, return 'Chitchat'.",
|
||||
Summarize: 'Summarize our discussion briefly in 50 characters or less to use as a prompt for future context.',
|
||||
},
|
||||
ConfirmClearAll: 'Confirm to clear all chat and setting data?',
|
||||
},
|
||||
Copy: {
|
||||
Success: 'Copied to clipboard',
|
||||
Failed: 'Copy failed, please grant permission to access clipboard',
|
||||
}
|
||||
}
|
||||
|
||||
export default en;
|
30
app/locales/index.ts
Normal file
30
app/locales/index.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import CN from './cn'
|
||||
import EN from './en'
|
||||
|
||||
export type { LocaleType } from './cn'
|
||||
|
||||
type Lang = 'en' | 'cn'
|
||||
|
||||
const LANG_KEY = 'lang'
|
||||
export function getLang(): Lang {
|
||||
const savedLang = localStorage?.getItem(LANG_KEY)
|
||||
|
||||
if (['en', 'cn'].includes(savedLang ?? '')) {
|
||||
return savedLang as Lang
|
||||
}
|
||||
|
||||
const lang = navigator.language.toLowerCase()
|
||||
|
||||
if (lang.includes('zh') || lang.includes('cn')) {
|
||||
return 'cn'
|
||||
} else {
|
||||
return 'en'
|
||||
}
|
||||
}
|
||||
|
||||
export function changeLang(lang: Lang) {
|
||||
localStorage.setItem(LANG_KEY, lang)
|
||||
location.reload()
|
||||
}
|
||||
|
||||
export default { en: EN, cn: CN }[getLang()]
|
Reference in New Issue
Block a user