Commit
·
61c59c3
1
Parent(s):
8449d3f
Upload 135 files
Browse files- index.html +1 -1
- package-lock.json +2 -2
- src/hooks/useLanguage.ts +5 -7
- src/locales/en-US.ts +2 -0
- src/locales/vi-VN.ts +2 -0
- src/store/modules/app/helper.ts +9 -1
- src/store/modules/chat/helper.ts +2 -1
- src/store/modules/chat/index.ts +3 -2
- src/store/modules/settings/helper.ts +1 -1
- src/store/modules/user/helper.ts +1 -1
- src/views/chat/components/Message/Text.vue +2 -2
- src/views/chat/components/Message/index.vue +2 -2
- src/views/chat/index.vue +1 -1
- src/views/chat/layout/sider/index.vue +1 -1
index.html
CHANGED
|
@@ -7,7 +7,7 @@
|
|
| 7 |
<link rel="apple-touch-icon" href="https://pnghive.com/core/images/full/chat-gpt-logo-png-1680406057.png">
|
| 8 |
<meta name="viewport"
|
| 9 |
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
|
| 10 |
-
<title>
|
| 11 |
</head>
|
| 12 |
|
| 13 |
<body class="dark:bg-black">
|
|
|
|
| 7 |
<link rel="apple-touch-icon" href="https://pnghive.com/core/images/full/chat-gpt-logo-png-1680406057.png">
|
| 8 |
<meta name="viewport"
|
| 9 |
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
|
| 10 |
+
<title>ChatGPT</title>
|
| 11 |
</head>
|
| 12 |
|
| 13 |
<body class="dark:bg-black">
|
package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
| 1 |
{
|
| 2 |
"name": "chatgpt-web",
|
| 3 |
-
"version": "2.
|
| 4 |
"lockfileVersion": 2,
|
| 5 |
"requires": true,
|
| 6 |
"packages": {
|
| 7 |
"": {
|
| 8 |
"name": "chatgpt-web",
|
| 9 |
-
"version": "2.
|
| 10 |
"dependencies": {
|
| 11 |
"@traptitech/markdown-it-katex": "^3.6.0",
|
| 12 |
"@vueuse/core": "^9.13.0",
|
|
|
|
| 1 |
{
|
| 2 |
"name": "chatgpt-web",
|
| 3 |
+
"version": "2.11.1",
|
| 4 |
"lockfileVersion": 2,
|
| 5 |
"requires": true,
|
| 6 |
"packages": {
|
| 7 |
"": {
|
| 8 |
"name": "chatgpt-web",
|
| 9 |
+
"version": "2.11.1",
|
| 10 |
"dependencies": {
|
| 11 |
"@traptitech/markdown-it-katex": "^3.6.0",
|
| 12 |
"@vueuse/core": "^9.13.0",
|
src/hooks/useLanguage.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
import { computed } from 'vue'
|
| 2 |
-
import {
|
| 3 |
import { useAppStore } from '@/store'
|
| 4 |
import { setLocale } from '@/locales'
|
| 5 |
|
|
@@ -7,18 +7,16 @@ export function useLanguage() {
|
|
| 7 |
const appStore = useAppStore()
|
| 8 |
|
| 9 |
const language = computed(() => {
|
|
|
|
| 10 |
switch (appStore.language) {
|
| 11 |
-
case 'vi-VN':
|
| 12 |
-
setLocale('vi-VN')
|
| 13 |
-
return viVN
|
| 14 |
case 'en-US':
|
| 15 |
-
setLocale('en-US')
|
| 16 |
return enUS
|
|
|
|
|
|
|
| 17 |
default:
|
| 18 |
-
setLocale('en-US')
|
| 19 |
return enUS
|
| 20 |
}
|
| 21 |
})
|
| 22 |
|
| 23 |
return { language }
|
| 24 |
-
}
|
|
|
|
| 1 |
import { computed } from 'vue'
|
| 2 |
+
import { enUS, viVN } from 'naive-ui'
|
| 3 |
import { useAppStore } from '@/store'
|
| 4 |
import { setLocale } from '@/locales'
|
| 5 |
|
|
|
|
| 7 |
const appStore = useAppStore()
|
| 8 |
|
| 9 |
const language = computed(() => {
|
| 10 |
+
setLocale(appStore.language)
|
| 11 |
switch (appStore.language) {
|
|
|
|
|
|
|
|
|
|
| 12 |
case 'en-US':
|
|
|
|
| 13 |
return enUS
|
| 14 |
+
case 'vi-VN':
|
| 15 |
+
return viVN
|
| 16 |
default:
|
|
|
|
| 17 |
return enUS
|
| 18 |
}
|
| 19 |
})
|
| 20 |
|
| 21 |
return { language }
|
| 22 |
+
}
|
src/locales/en-US.ts
CHANGED
|
@@ -30,11 +30,13 @@ export default {
|
|
| 30 |
},
|
| 31 |
chat: {
|
| 32 |
newChatButton: 'New Chat',
|
|
|
|
| 33 |
placeholder: 'Ask me anything...(Shift + Enter = line break, "/" to trigger prompts)',
|
| 34 |
placeholderMobile: 'Ask me anything...',
|
| 35 |
copy: 'Copy',
|
| 36 |
copied: 'Copied',
|
| 37 |
copyCode: 'Copy Code',
|
|
|
|
| 38 |
clearChat: 'Clear Chat',
|
| 39 |
clearChatConfirm: 'Are you sure to clear this chat?',
|
| 40 |
exportImage: 'Export Image',
|
|
|
|
| 30 |
},
|
| 31 |
chat: {
|
| 32 |
newChatButton: 'New Chat',
|
| 33 |
+
newChatTitle: 'New conversation',
|
| 34 |
placeholder: 'Ask me anything...(Shift + Enter = line break, "/" to trigger prompts)',
|
| 35 |
placeholderMobile: 'Ask me anything...',
|
| 36 |
copy: 'Copy',
|
| 37 |
copied: 'Copied',
|
| 38 |
copyCode: 'Copy Code',
|
| 39 |
+
copyFailed: 'Copy Failed',
|
| 40 |
clearChat: 'Clear Chat',
|
| 41 |
clearChatConfirm: 'Are you sure to clear this chat?',
|
| 42 |
exportImage: 'Export Image',
|
src/locales/vi-VN.ts
CHANGED
|
@@ -30,11 +30,13 @@ export default {
|
|
| 30 |
},
|
| 31 |
chat: {
|
| 32 |
newChatButton: 'Cuộc trò truyện mới',
|
|
|
|
| 33 |
placeholder: 'Hỏi tôi bất cứ điều gì...(Shift + Enter = ngắt dòng, "/" để kích hoạt lời nhắc)',
|
| 34 |
placeholderMobile: 'Hỏi tôi điều gì đó...',
|
| 35 |
copy: 'Sao chép',
|
| 36 |
copied: 'Đã sao chép',
|
| 37 |
copyCode: 'Sao chép mã',
|
|
|
|
| 38 |
clearChat: 'Xóa Chat',
|
| 39 |
clearChatConfirm: 'Bạn có chắc chắn muốn xóa chat này?',
|
| 40 |
exportImage: 'Xuất Ảnh',
|
|
|
|
| 30 |
},
|
| 31 |
chat: {
|
| 32 |
newChatButton: 'Cuộc trò truyện mới',
|
| 33 |
+
newChatTitle: 'Hội thoại mới',
|
| 34 |
placeholder: 'Hỏi tôi bất cứ điều gì...(Shift + Enter = ngắt dòng, "/" để kích hoạt lời nhắc)',
|
| 35 |
placeholderMobile: 'Hỏi tôi điều gì đó...',
|
| 36 |
copy: 'Sao chép',
|
| 37 |
copied: 'Đã sao chép',
|
| 38 |
copyCode: 'Sao chép mã',
|
| 39 |
+
copyFailed: 'Sao chép thất bại',
|
| 40 |
clearChat: 'Xóa Chat',
|
| 41 |
clearChatConfirm: 'Bạn có chắc chắn muốn xóa chat này?',
|
| 42 |
exportImage: 'Xuất Ảnh',
|
src/store/modules/app/helper.ts
CHANGED
|
@@ -6,6 +6,13 @@ export type Theme = 'light' | 'dark' | 'auto'
|
|
| 6 |
|
| 7 |
export type Language = 'en-US' | 'vi-VN'
|
| 8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
export interface AppState {
|
| 10 |
siderCollapsed: boolean
|
| 11 |
theme: Theme
|
|
@@ -13,7 +20,8 @@ export interface AppState {
|
|
| 13 |
}
|
| 14 |
|
| 15 |
export function defaultSetting(): AppState {
|
| 16 |
-
|
|
|
|
| 17 |
}
|
| 18 |
|
| 19 |
export function getLocalSetting(): AppState {
|
|
|
|
| 6 |
|
| 7 |
export type Language = 'en-US' | 'vi-VN'
|
| 8 |
|
| 9 |
+
const languageMap: { [key: string]: Language } = {
|
| 10 |
+
'en': 'en-US',
|
| 11 |
+
'en-US': 'en-US',
|
| 12 |
+
'vi': 'vi-VN',
|
| 13 |
+
'vi-VN': 'vi-VN',
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
export interface AppState {
|
| 17 |
siderCollapsed: boolean
|
| 18 |
theme: Theme
|
|
|
|
| 20 |
}
|
| 21 |
|
| 22 |
export function defaultSetting(): AppState {
|
| 23 |
+
const language = languageMap[navigator.language]
|
| 24 |
+
return { siderCollapsed: false, theme: 'light', language }
|
| 25 |
}
|
| 26 |
|
| 27 |
export function getLocalSetting(): AppState {
|
src/store/modules/chat/helper.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
import { ss } from '@/utils/storage'
|
|
|
|
| 2 |
|
| 3 |
const LOCAL_NAME = 'chatStorage'
|
| 4 |
|
|
@@ -7,7 +8,7 @@ export function defaultState(): Chat.ChatState {
|
|
| 7 |
return {
|
| 8 |
active: uuid,
|
| 9 |
usingContext: true,
|
| 10 |
-
history: [{ uuid, title: '
|
| 11 |
chat: [{ uuid, data: [] }],
|
| 12 |
}
|
| 13 |
}
|
|
|
|
| 1 |
import { ss } from '@/utils/storage'
|
| 2 |
+
import { t } from '@/locales'
|
| 3 |
|
| 4 |
const LOCAL_NAME = 'chatStorage'
|
| 5 |
|
|
|
|
| 8 |
return {
|
| 9 |
active: uuid,
|
| 10 |
usingContext: true,
|
| 11 |
+
history: [{ uuid, title: t('chat.newChatTitle'), isEdit: false }],
|
| 12 |
chat: [{ uuid, data: [] }],
|
| 13 |
}
|
| 14 |
}
|
src/store/modules/chat/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
| 1 |
import { defineStore } from 'pinia'
|
| 2 |
import { defaultState, getLocalState, setLocalState } from './helper'
|
| 3 |
import { router } from '@/router'
|
|
|
|
| 4 |
|
| 5 |
export const useChatStore = defineStore('chat-store', {
|
| 6 |
state: (): Chat.ChatState => getLocalState(),
|
|
@@ -103,7 +104,7 @@ export const useChatStore = defineStore('chat-store', {
|
|
| 103 |
}
|
| 104 |
else {
|
| 105 |
this.chat[0].data.push(chat)
|
| 106 |
-
if (this.history[0].title === '
|
| 107 |
this.history[0].title = chat.text
|
| 108 |
this.recordState()
|
| 109 |
}
|
|
@@ -112,7 +113,7 @@ export const useChatStore = defineStore('chat-store', {
|
|
| 112 |
const index = this.chat.findIndex(item => item.uuid === uuid)
|
| 113 |
if (index !== -1) {
|
| 114 |
this.chat[index].data.push(chat)
|
| 115 |
-
if (this.history[index].title === '
|
| 116 |
this.history[index].title = chat.text
|
| 117 |
this.recordState()
|
| 118 |
}
|
|
|
|
| 1 |
import { defineStore } from 'pinia'
|
| 2 |
import { defaultState, getLocalState, setLocalState } from './helper'
|
| 3 |
import { router } from '@/router'
|
| 4 |
+
import { t } from '@/locales'
|
| 5 |
|
| 6 |
export const useChatStore = defineStore('chat-store', {
|
| 7 |
state: (): Chat.ChatState => getLocalState(),
|
|
|
|
| 104 |
}
|
| 105 |
else {
|
| 106 |
this.chat[0].data.push(chat)
|
| 107 |
+
if (this.history[0].title === t('chat.newChatTitle'))
|
| 108 |
this.history[0].title = chat.text
|
| 109 |
this.recordState()
|
| 110 |
}
|
|
|
|
| 113 |
const index = this.chat.findIndex(item => item.uuid === uuid)
|
| 114 |
if (index !== -1) {
|
| 115 |
this.chat[index].data.push(chat)
|
| 116 |
+
if (this.history[index].title === t('chat.newChatTitle'))
|
| 117 |
this.history[index].title = chat.text
|
| 118 |
this.recordState()
|
| 119 |
}
|
src/store/modules/settings/helper.ts
CHANGED
|
@@ -10,7 +10,7 @@ export interface SettingsState {
|
|
| 10 |
|
| 11 |
export function defaultSetting(): SettingsState {
|
| 12 |
return {
|
| 13 |
-
systemMessage: 'You are
|
| 14 |
temperature: 0.8,
|
| 15 |
top_p: 1,
|
| 16 |
}
|
|
|
|
| 10 |
|
| 11 |
export function defaultSetting(): SettingsState {
|
| 12 |
return {
|
| 13 |
+
systemMessage: 'You are ChatGPT, a large language model trained by OpenAI. Follow the user\'s instructions carefully. Respond using markdown.',
|
| 14 |
temperature: 0.8,
|
| 15 |
top_p: 1,
|
| 16 |
}
|
src/store/modules/user/helper.ts
CHANGED
|
@@ -16,7 +16,7 @@ export function defaultSetting(): UserState {
|
|
| 16 |
return {
|
| 17 |
userInfo: {
|
| 18 |
avatar: 'https://pnghive.com/core/images/full/chat-gpt-logo-png-1680406057.png',
|
| 19 |
-
name: '
|
| 20 |
description: 'AI assistant',
|
| 21 |
},
|
| 22 |
}
|
|
|
|
| 16 |
return {
|
| 17 |
userInfo: {
|
| 18 |
avatar: 'https://pnghive.com/core/images/full/chat-gpt-logo-png-1680406057.png',
|
| 19 |
+
name: 'ChatGPT',
|
| 20 |
description: 'AI assistant',
|
| 21 |
},
|
| 22 |
}
|
src/views/chat/components/Message/Text.vue
CHANGED
|
@@ -70,9 +70,9 @@ function addCopyEvents() {
|
|
| 70 |
const code = btn.parentElement?.nextElementSibling?.textContent
|
| 71 |
if (code) {
|
| 72 |
copyToClip(code).then(() => {
|
| 73 |
-
btn.textContent = '
|
| 74 |
setTimeout(() => {
|
| 75 |
-
btn.textContent = '
|
| 76 |
}, 1000)
|
| 77 |
})
|
| 78 |
}
|
|
|
|
| 70 |
const code = btn.parentElement?.nextElementSibling?.textContent
|
| 71 |
if (code) {
|
| 72 |
copyToClip(code).then(() => {
|
| 73 |
+
btn.textContent = t('chat.copied')
|
| 74 |
setTimeout(() => {
|
| 75 |
+
btn.textContent = t('chat.copyCode')
|
| 76 |
}, 1000)
|
| 77 |
})
|
| 78 |
}
|
src/views/chat/components/Message/index.vue
CHANGED
|
@@ -84,10 +84,10 @@ function handleRegenerate() {
|
|
| 84 |
async function handleCopy() {
|
| 85 |
try {
|
| 86 |
await copyToClip(props.text || '')
|
| 87 |
-
message.success('
|
| 88 |
}
|
| 89 |
catch {
|
| 90 |
-
message.error('
|
| 91 |
}
|
| 92 |
}
|
| 93 |
</script>
|
|
|
|
| 84 |
async function handleCopy() {
|
| 85 |
try {
|
| 86 |
await copyToClip(props.text || '')
|
| 87 |
+
message.success(t('chat.copied'))
|
| 88 |
}
|
| 89 |
catch {
|
| 90 |
+
message.error(t('chat.copyFailed'))
|
| 91 |
}
|
| 92 |
}
|
| 93 |
</script>
|
src/views/chat/index.vue
CHANGED
|
@@ -481,7 +481,7 @@ onUnmounted(() => {
|
|
| 481 |
<template v-if="!dataSources.length">
|
| 482 |
<div class="flex items-center justify-center mt-4 text-center text-neutral-300">
|
| 483 |
<SvgIcon icon="ri:bubble-chart-fill" class="mr-2 text-3xl" />
|
| 484 |
-
<span>
|
| 485 |
</div>
|
| 486 |
</template>
|
| 487 |
<template v-else>
|
|
|
|
| 481 |
<template v-if="!dataSources.length">
|
| 482 |
<div class="flex items-center justify-center mt-4 text-center text-neutral-300">
|
| 483 |
<SvgIcon icon="ri:bubble-chart-fill" class="mr-2 text-3xl" />
|
| 484 |
+
<span>{{ t('chat.newChatTitle') }}</span>
|
| 485 |
</div>
|
| 486 |
</template>
|
| 487 |
<template v-else>
|
src/views/chat/layout/sider/index.vue
CHANGED
|
@@ -20,7 +20,7 @@ const show = ref(false)
|
|
| 20 |
const collapsed = computed(() => appStore.siderCollapsed)
|
| 21 |
|
| 22 |
function handleAdd() {
|
| 23 |
-
chatStore.addHistory({ title: '
|
| 24 |
if (isMobile.value)
|
| 25 |
appStore.setSiderCollapsed(true)
|
| 26 |
}
|
|
|
|
| 20 |
const collapsed = computed(() => appStore.siderCollapsed)
|
| 21 |
|
| 22 |
function handleAdd() {
|
| 23 |
+
chatStore.addHistory({ title: t('chat.newChatTitle'), uuid: Date.now(), isEdit: false })
|
| 24 |
if (isMobile.value)
|
| 25 |
appStore.setSiderCollapsed(true)
|
| 26 |
}
|