Browse Source

Merge branch 'main' of https://github.com/Yidadaa/ChatGPT-Next-Web

GH Action - Upstream Sync 1 year ago
parent
commit
d1bdf4a292

+ 2 - 2
README.md

@@ -31,7 +31,7 @@ One-Click to deploy well-designed ChatGPT web UI on Vercel.
 - New in v2: create, share and debug your chat tools with prompt templates (mask)
 - Awesome prompts powered by [awesome-chatgpt-prompts-zh](https://github.com/PlexPt/awesome-chatgpt-prompts-zh) and [awesome-chatgpt-prompts](https://github.com/f/awesome-chatgpt-prompts)
 - Automatically compresses chat history to support long conversations while also saving your tokens
-- I18n: English, 简体中文, 繁体中文, 日本語, Español, Italiano, Türkçe, Deutsch
+- I18n: English, 简体中文, 繁体中文, 日本語, Español, Italiano, Türkçe, Deutsch, Tiếng Việt, Русский, Čeština
 
 ## Roadmap
 
@@ -62,7 +62,7 @@ One-Click to deploy well-designed ChatGPT web UI on Vercel.
 - 预制角色功能(面具),方便地创建、分享和调试你的个性化对话
 - 海量的内置 prompt 列表,来自[中文](https://github.com/PlexPt/awesome-chatgpt-prompts-zh)和[英文](https://github.com/f/awesome-chatgpt-prompts)
 - 自动压缩上下文聊天记录,在节省 Token 的同时支持超长对话
-- 多国语言支持:English, 简体中文, 繁体中文, 日本語, Español, Italiano, Türkçe, Deutsch
+- 多国语言支持:English, 简体中文, 繁体中文, 日本語, Español, Italiano, Türkçe, Deutsch, Tiếng Việt, Русский, Čeština
 - 拥有自己的域名?好上加好,绑定后即可在任何地方**无障碍**快速访问
 
 ## 开发计划

+ 13 - 1
app/components/chat-list.tsx

@@ -16,6 +16,7 @@ import { Link, useNavigate } from "react-router-dom";
 import { Path } from "../constant";
 import { MaskAvatar } from "./mask";
 import { Mask } from "../store/mask";
+import { useRef, useEffect } from "react";
 
 export function ChatItem(props: {
   onClick?: () => void;
@@ -29,6 +30,14 @@ export function ChatItem(props: {
   narrow?: boolean;
   mask: Mask;
 }) {
+  const draggableRef = useRef<HTMLDivElement | null>(null);
+  useEffect(() => {
+    if (props.selected && draggableRef.current) {
+      draggableRef.current?.scrollIntoView({
+        block: "center",
+      });
+    }
+  }, [props.selected]);
   return (
     <Draggable draggableId={`${props.id}`} index={props.index}>
       {(provided) => (
@@ -37,7 +46,10 @@ export function ChatItem(props: {
             props.selected && styles["chat-item-selected"]
           }`}
           onClick={props.onClick}
-          ref={provided.innerRef}
+          ref={(ele) => {
+            draggableRef.current = ele;
+            provided.innerRef(ele);
+          }}
           {...provided.draggableProps}
           {...provided.dragHandleProps}
           title={`${props.title}\n${Locale.ChatItem.ChatItemCount(

+ 3 - 3
app/components/home.tsx

@@ -64,17 +64,17 @@ export function useSwitchTheme() {
     }
 
     const metaDescriptionDark = document.querySelector(
-      'meta[name="theme-color"][media]',
+      'meta[name="theme-color"][media*="dark"]',
     );
     const metaDescriptionLight = document.querySelector(
-      'meta[name="theme-color"]:not([media])',
+      'meta[name="theme-color"][media*="light"]',
     );
 
     if (config.theme === "auto") {
       metaDescriptionDark?.setAttribute("content", "#151515");
       metaDescriptionLight?.setAttribute("content", "#fafafa");
     } else {
-      const themeColor = getCSSVar("--themeColor");
+      const themeColor = getCSSVar("--theme-color");
       metaDescriptionDark?.setAttribute("content", themeColor);
       metaDescriptionLight?.setAttribute("content", themeColor);
     }

+ 2 - 2
app/components/settings.tsx

@@ -573,9 +573,9 @@ export function Settings() {
         <List>
           <ModelConfigList
             modelConfig={config.modelConfig}
-            updateConfig={(upater) => {
+            updateConfig={(updater) => {
               const modelConfig = { ...config.modelConfig };
-              upater(modelConfig);
+              updater(modelConfig);
               config.update((config) => (config.modelConfig = modelConfig));
             }}
           />

+ 10 - 12
app/layout.tsx

@@ -9,11 +9,19 @@ const buildConfig = getBuildConfig();
 export const metadata = {
   title: "ChatGPT Next Web",
   description: "Your personal ChatGPT Chat Bot.",
+  viewport: {
+    width: "device-width",
+    initialScale: 1,
+    maximumScale: 1,
+  },
+  themeColor: [
+    { media: "(prefers-color-scheme: light)", color: "#fafafa" },
+    { media: "(prefers-color-scheme: dark)", color: "#151515" },
+  ],
   appleWebApp: {
     title: "ChatGPT Next Web",
     statusBarStyle: "default",
   },
-  viewport: "width=device-width, initial-scale=1, maximum-scale=1",
 };
 
 export default function RootLayout({
@@ -24,22 +32,12 @@ export default function RootLayout({
   return (
     <html lang="en">
       <head>
-        <meta
-          name="theme-color"
-          content="#fafafa"
-          media="(prefers-color-scheme: light)"
-        />
-        <meta
-          name="theme-color"
-          content="#151515"
-          media="(prefers-color-scheme: dark)"
-        />
         <meta name="version" content={buildConfig.commitId} />
         <link rel="manifest" href="/site.webmanifest"></link>
         <link rel="preconnect" href="https://fonts.proxy.ustclug.org"></link>
         <link
-          href="https://fonts.proxy.ustclug.org/css2?family=Noto+Sans+SC:wght@300;400;700;900&display=swap"
           rel="stylesheet"
+          href="https://fonts.proxy.ustclug.org/css2?family=Noto+Sans+SC:wght@300;400;700;900&display=swap"
         ></link>
         <script src="/serviceWorkerRegister.js" defer></script>
       </head>

+ 1 - 1
app/locales/cn.ts

@@ -78,7 +78,7 @@ const cn = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },

+ 7 - 8
app/locales/cs.ts

@@ -70,8 +70,8 @@ const cs: LocaleType = {
     },
     Lang: {
       Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-        All: "Všechny jazyky",
-        Options: {
+      All: "Všechny jazyky",
+      Options: {
         cn: "简体中文",
         en: "English",
         tw: "繁體中文",
@@ -80,7 +80,7 @@ const cs: LocaleType = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },
@@ -166,8 +166,7 @@ const cs: LocaleType = {
     },
     PresencePenlty: {
       Title: "Přítomnostní korekce",
-      SubTitle:
-        "Větší hodnota zvyšuje pravděpodobnost nových témat.",
+      SubTitle: "Větší hodnota zvyšuje pravděpodobnost nových témat.",
     },
   },
   Store: {
@@ -182,7 +181,7 @@ const cs: LocaleType = {
         "Vytvořte prosím název o čtyřech až pěti slovech vystihující průběh našeho rozhovoru bez jakýchkoli úvodních slov, interpunkčních znamének, uvozovek, teček, symbolů nebo dalšího textu. Odstraňte uvozovky.",
       Summarize:
         "Krátce shrň naši diskusi v rozsahu do 200 slov a použij ji jako podnět pro budoucí kontext.",
-      },
+    },
   },
   Copy: {
     Success: "Zkopírováno do schránky",
@@ -231,7 +230,7 @@ const cs: LocaleType = {
     More: "Najít více",
     NotShow: "Nezobrazovat znovu",
     ConfirmNoShow: "Potvrdit zakázání?Můžete jej povolit později v nastavení.",
-},
+  },
 
   UI: {
     Confirm: "Potvrdit",
@@ -239,7 +238,7 @@ const cs: LocaleType = {
     Close: "Zavřít",
     Create: "Vytvořit",
     Edit: "Upravit",
-  }
+  },
 };
 
 export default cs;

+ 1 - 1
app/locales/de.ts

@@ -81,7 +81,7 @@ const de: LocaleType = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },

+ 1 - 1
app/locales/en.ts

@@ -80,7 +80,7 @@ const en: LocaleType = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },

+ 1 - 1
app/locales/es.ts

@@ -80,7 +80,7 @@ const es: LocaleType = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },

+ 1 - 1
app/locales/it.ts

@@ -80,7 +80,7 @@ const it: LocaleType = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },

+ 1 - 1
app/locales/jp.ts

@@ -80,7 +80,7 @@ const jp: LocaleType = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },

+ 51 - 46
app/locales/ru.ts

@@ -80,56 +80,57 @@ const ru: LocaleType = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },
     },
-      Avatar: "Аватар",
-      FontSize: {
-        Title: "Размер шрифта",
-        SubTitle: "Настроить размер шрифта контента чата",
-      },
-      Update: {
-        Version: (x: string) => `Версия: ${x}`,
-        IsLatest: "Последняя версия",
-        CheckUpdate: "Проверить обновление",
-        IsChecking: "Проверка обновления...",
-        FoundUpdate: (x: string) => `Найдена новая версия: ${x}`,
-        GoToUpdate: "Обновить",
-      },
-      SendKey: "Клавиша отправки",
-      Theme: "Тема",
-      TightBorder: "Узкая граница",
-      SendPreviewBubble: {
-        Title: "Отправить предпросмотр",
-        SubTitle: "Предварительный просмотр markdown в пузыре",
+    Avatar: "Аватар",
+    FontSize: {
+      Title: "Размер шрифта",
+      SubTitle: "Настроить размер шрифта контента чата",
+    },
+    Update: {
+      Version: (x: string) => `Версия: ${x}`,
+      IsLatest: "Последняя версия",
+      CheckUpdate: "Проверить обновление",
+      IsChecking: "Проверка обновления...",
+      FoundUpdate: (x: string) => `Найдена новая версия: ${x}`,
+      GoToUpdate: "Обновить",
+    },
+    SendKey: "Клавиша отправки",
+    Theme: "Тема",
+    TightBorder: "Узкая граница",
+    SendPreviewBubble: {
+      Title: "Отправить предпросмотр",
+      SubTitle: "Предварительный просмотр markdown в пузыре",
+    },
+    Mask: {
+      Title: "Экран заставки маски",
+      SubTitle: "Показывать экран заставки маски перед началом нового чата",
+    },
+    Prompt: {
+      Disable: {
+        Title: "Отключить автозаполнение",
+        SubTitle: "Ввод / для запуска автозаполнения",
       },
-      Mask: {
-        Title: "Экран заставки маски",
-        SubTitle: "Показывать экран заставки маски перед началом нового чата",
+      List: "Список подсказок",
+      ListCount: (builtin: number, custom: number) =>
+        `${builtin} встроенных, ${custom} пользовательских`,
+      Edit: "Редактировать",
+      Modal: {
+        Title: "Список подсказок",
+        Add: "Добавить",
+        Search: "Поиск подсказок",
       },
-      Prompt: {
-        Disable: {
-          Title: "Отключить автозаполнение",
-          SubTitle: "Ввод / для запуска автозаполнения",
-        },
-        List: "Список подсказок",
-        ListCount: (builtin: number, custom: number) =>
-          `${builtin} встроенных, ${custom} пользовательских`,
-        Edit: "Редактировать",
-        Modal: {
-          Title: "Список подсказок",
-          Add: "Добавить",
-          Search: "Поиск подсказок",
-        },
-        EditModal: {
-          Title: "Редактировать подсказку",
-        },
+      EditModal: {
+        Title: "Редактировать подсказку",
       },
-      HistoryCount: {
-        Title: "Количество прикрепляемых сообщений",
-        SubTitle: "Количество отправляемых сообщений, прикрепляемых к каждому запросу",
+    },
+    HistoryCount: {
+      Title: "Количество прикрепляемых сообщений",
+      SubTitle:
+        "Количество отправляемых сообщений, прикрепляемых к каждому запросу",
     },
     CompressThreshold: {
       Title: "Порог сжатия истории",
@@ -186,7 +187,8 @@ const ru: LocaleType = {
   },
   Copy: {
     Success: "Скопировано в буфер обмена",
-    Failed: "Не удалось скопировать, пожалуйста, предоставьте разрешение на доступ к буферу обмена",
+    Failed:
+      "Не удалось скопировать, пожалуйста, предоставьте разрешение на доступ к буферу обмена",
   },
   Context: {
     Toast: (x: any) => `С ${x} контекстными подсказками`,
@@ -214,7 +216,9 @@ const ru: LocaleType = {
     },
     EditModal: {
       Title: (readonly: boolean) =>
-        `Редактирование шаблона подсказки ${readonly ? "(только для чтения)" : ""}`,
+        `Редактирование шаблона подсказки ${
+          readonly ? "(только для чтения)" : ""
+        }`,
       Download: "Скачать",
       Clone: "Клонировать",
     },
@@ -230,7 +234,8 @@ const ru: LocaleType = {
     SubTitle: "Общайтесь с душой за маской",
     More: "Найти еще",
     NotShow: "Не показывать снова",
-    ConfirmNoShow: "Подтвердите отключение? Вы можете включить это позже в настройках.",
+    ConfirmNoShow:
+      "Подтвердите отключение? Вы можете включить это позже в настройках.",
   },
 
   UI: {

+ 1 - 1
app/locales/tr.ts

@@ -80,7 +80,7 @@ const tr: LocaleType = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },

+ 1 - 1
app/locales/tw.ts

@@ -78,7 +78,7 @@ const tw: LocaleType = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },

+ 2 - 2
app/locales/vi.ts

@@ -2,7 +2,7 @@ import { SubmitKey } from "../store/config";
 import type { LocaleType } from "./index";
 
 const vi: LocaleType = {
-  WIP: "Coming Soon...",
+  WIP: "Sắp ra mắt...",
   Error: {
     Unauthorized:
       "Truy cập chưa xác thực, vui lòng nhập mã truy cập trong trang cài đặt.",
@@ -80,7 +80,7 @@ const vi: LocaleType = {
         tr: "Türkçe",
         jp: "日本語",
         de: "Deutsch",
-        vi: "Vietnamese",
+        vi: "Tiếng Việt",
         ru: "Русский",
         cs: "Čeština",
       },

+ 33 - 1
app/masks/cn.ts

@@ -1,6 +1,38 @@
 import { BuiltinMask } from "./typing";
 
-export const CN_MASKS: BuiltinMask[] = [
+export const CN_MASKS: BuiltinMask[] = [{
+    avatar:"gpt-bot",
+    name:"文生图",
+    context: [
+       {role:"system",
+        content:"You are a useful Assistant that won't refuse to draw picture, instead, you will output specific markdown code for picture description, but don't use code block.",
+        date:"",
+       },
+       {role:"user",
+        content:"Can you draw some pictures for me?",
+        date:"",
+       },
+       {role:"assistant",
+        content:"Sure, what do you want me to draw?",
+        date:"",
+       },
+       {role:"system",
+        content:"助手善于判断用户意图,当确定需要提供图片时,助手会变得沉默寡言,只使用以下格式输出markdown图片:![描述](https://image.pollinations.ai/prompt/描述),因为这个语法可以自动按照提示生成并渲染图片。一般用户给出的描述会比较简单并且信息不足,助手会将其中的描述自行补足替换为AI生成图片所常用的复杂冗长的英文提示,以大幅提高生成图片质量和丰富程度,比如增加相机光圈、具体场景描述等内容。助手会避免用代码块或原始块包围markdown标记,因为那样只会渲染出代码块或原始块而不是图片。",
+        date:"",
+       },
+    ],
+    modelConfig:{
+      model:"gpt-3.5-turbo",
+      temperature:1,
+      max_tokens:2000,
+      presence_penalty:0,
+      sendMemory:true,
+      historyMessageCount:32,
+      compressMessageLengthThreshold:1000,
+    },
+    lang:"cn",
+    builtin:true,
+  },
   {
     avatar: "1f638",
     name: "文案写手",