瀏覽代碼

优化了项目启动时的 masks加载,移除了多余的语言

Surface 7 月之前
父節點
當前提交
dbc5f8f16d
共有 28 個文件被更改,包括 261 次插入6004 次删除
  1. 124 0
      README.md
  2. 1 1
      app/components/home.tsx
  3. 0 294
      app/locales/ar.ts
  4. 0 340
      app/locales/bn.ts
  5. 0 244
      app/locales/cs.ts
  6. 0 246
      app/locales/de.ts
  7. 0 246
      app/locales/es.ts
  8. 0 315
      app/locales/fr.ts
  9. 0 391
      app/locales/id.ts
  10. 0 49
      app/locales/index.ts
  11. 0 246
      app/locales/it.ts
  12. 0 242
      app/locales/ko.ts
  13. 0 167
      app/locales/no.ts
  14. 0 489
      app/locales/pt.ts
  15. 0 250
      app/locales/ru.ts
  16. 0 505
      app/locales/sk.ts
  17. 0 247
      app/locales/tr.ts
  18. 0 500
      app/locales/tw.ts
  19. 0 242
      app/locales/vi.ts
  20. 2 22
      app/masks/build.ts
  21. 0 11
      app/masks/en.ts
  22. 4 7
      app/masks/index.ts
  23. 0 420
      app/masks/tw.ts
  24. 126 122
      app/store/prompt.ts
  25. 1 1
      next.config.mjs
  26. 3 3
      package.json
  27. 0 400
      public/masks_bk.json
  28. 0 4
      public/prompts_bk.json

+ 124 - 0
README.md

@@ -0,0 +1,124 @@
+
+# 建科·小智客户端项目概述
+
+## 业务目标
+1. 提供统一的多AI平台接入能力
+2. 实现企业级智能问答解决方案
+3. 支持文档辅助分析和知识检索
+4. 优化招聘流程中的信息交互
+
+## 核心功能
+### 多AI平台集成
+- 支持BigModel和DeepSeek双引擎
+- 可扩展的AI服务提供商接入架构
+- 统一API代理层实现
+
+### 智能对话系统
+- 多轮对话上下文管理
+- 自动会话摘要生成
+- 智能问题推荐
+- 流式消息处理
+
+### 企业级特性
+- 招聘信息智能问答
+- 文档辅助分析
+- 多语言支持(20+语言)
+- 响应式设计适配多端
+
+## 技术架构
+### 前端架构
+```
+┌───────────────────────────────────────────────┐
+│                    UI层                      │
+│  ┌─────────────┐ ┌─────────────┐ ┌────────┐ │
+│  │  聊天组件   │ │  设置面板   │ │ 导出  │ │
+│  └─────────────┘ └─────────────┘ └────────┘ │
+├───────────────────────────────────────────────┤
+│                  状态管理层                   │
+│  ┌─────────────────────────────────────────┐ │
+│  │                Zustand Store            │ │
+│  │  ┌────────┐ ┌────────┐ ┌──────────────┐ │ │
+│  │  │ 聊天状态│ │ 配置状态│ │ 全局状态    │ │ │
+│  │  └────────┘ └────────┘ └──────────────┘ │ │
+│  └─────────────────────────────────────────┘ │
+├───────────────────────────────────────────────┤
+│                  服务层                      │
+│  ┌─────────────────────────────────────────┐ │
+│  │               API代理层                  │ │
+│  │  ┌───────┐ ┌───────┐ ┌────────────────┐ │ │
+│  │  │阿里云 │ │OpenAI │ │ 自定义大模型    │ │ │
+│  │  └───────┘ └───────┘ └────────────────┘ │ │
+│  └─────────────────────────────────────────┘ │
+└───────────────────────────────────────────────┘
+```
+
+### 技术栈
+- **前端框架**: Next.js 14 + React 18
+- **状态管理**: Zustand
+- **UI组件库**: Ant Design
+- **构建工具**: Webpack 5
+- **桌面端**: Tauri集成
+- **样式**: SCSS模块化
+
+## 数据实体
+### 核心数据模型
+```mermaid
+classDiagram
+    class ChatSession {
+        +String id
+        +String topic
+        +ChatMessage[] messages
+        +ChatStat stat
+        +Mask mask
+        +Date lastUpdate
+    }
+
+    class ChatMessage {
+        +String id
+        +String role
+        +String content
+        +Date date
+        +Boolean streaming
+        +String model
+    }
+
+    class Mask {
+        +String name
+        +String avatar
+        +ModelConfig modelConfig
+        +String[] context
+    }
+
+    ChatSession "1" *-- "many" ChatMessage
+    ChatSession "1" -- "1" Mask
+```
+
+## 业务流程
+### 典型用户交互流程
+```mermaid
+sequenceDiagram
+    participant 用户
+    participant UI组件
+    participant 状态管理
+    participant API服务
+
+    用户->>UI组件: 输入问题
+    UI组件->>状态管理: 更新输入状态
+    用户->>UI组件: 提交问题
+    UI组件->>API服务: 发送请求
+    API服务->>状态管理: 流式返回响应
+    状态管理->>UI组件: 实时更新消息
+    UI组件->>用户: 显示AI回复
+    状态管理->>状态管理: 自动生成会话摘要
+```
+
+## 部署架构
+- 支持三种构建模式:
+  1. **Standalone**: 独立部署模式
+  2. **Export**: 静态导出模式
+  3. **默认模式**: 完整服务端渲染
+
+## 扩展能力
+1. **插件系统**: 支持功能模块动态扩展
+2. **配置中心**: 运行时配置热更新
+3. **多模型路由**: 根据请求自动路由到最优AI服务

+ 1 - 1
app/components/home.tsx

@@ -295,7 +295,7 @@ function Screen() {
   return (
     <div
       className={`${styles.container} ${shouldTightBorder ? styles["tight-container"] : styles.container
-        } ${getLang() === "ar" ? styles["rtl-screen"] : ""}`}
+        }`}
     >
       {renderContent()}
     </div>

+ 0 - 294
app/locales/ar.ts

@@ -1,294 +0,0 @@
-import { SubmitKey } from "../store/config";
-import type { PartialLocaleType } from "./index";
-
-const ar: PartialLocaleType = {
-  WIP: "قريبًا...",
-  Error: {
-    Unauthorized:
-      "غير مصرح بالوصول، يرجى إدخال رمز الوصول [auth](/#/auth) في صفحة المصادقة.",
-  },
-  Auth: {
-    Title: "تحتاج إلى رمز الوصول",
-    Tips: "يرجى إدخال رمز الوصول أدناه",
-    SubTips: "أو أدخل مفتاح واجهة برمجة تطبيقات OpenAI الخاص بك",
-    Input: "رمز الوصول",
-    Confirm: "تأكيد",
-    Later: "لاحقًا",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} رسائل`,
-  },
-  Chat: {
-    SubTitle: (count: number) => ` ${count} رسائل مع ChatGPT`,
-    Actions: {
-      ChatList: "الانتقال إلى قائمة الدردشة",
-      CompressedHistory: "ملخص ضغط ذاكرة التاريخ",
-      Export: "تصدير جميع الرسائل كـ Markdown",
-      Copy: "نسخ",
-      Stop: "توقف",
-      Retry: "إعادة المحاولة",
-      Delete: "حذف",
-    },
-    InputActions: {
-      Stop: "توقف",
-      ToBottom: "إلى آخر",
-      Theme: {
-        auto: "تلقائي",
-        light: "نمط فاتح",
-        dark: "نمط داكن",
-      },
-      Prompt: "الاقتراحات",
-      Masks: "الأقنعة",
-      Clear: "مسح السياق",
-      Settings: "الإعدادات",
-    },
-    Rename: "إعادة تسمية الدردشة",
-    Typing: "كتابة...",
-    Input: (submitKey: string) => {
-      var inputHints = ` اضغط على ${submitKey} للإرسال`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += "، Shift + Enter للإنشاء";
-      }
-      return inputHints + "، / للبحث في الاقتراحات";
-    },
-    Send: "إرسال",
-    Config: {
-      Reset: "إعادة التعيين إلى الإعدادات الافتراضية",
-      SaveAs: "حفظ كأقنعة",
-    },
-  },
-  Export: {
-    Title: "تصدير الرسائل",
-    Copy: "نسخ الكل",
-    Download: "تنزيل",
-    MessageFromYou: "رسالة منك",
-    MessageFromChatGPT: "رسالة من ChatGPT",
-    Share: "مشاركة على ShareGPT",
-    Format: {
-      Title: "صيغة التصدير",
-      SubTitle: "Markdown أو صورة PNG",
-    },
-    IncludeContext: {
-      Title: "تضمين السياق",
-      SubTitle: "تصدير اقتراحات السياق في الأقنعة أم لا",
-    },
-    Steps: {
-      Select: "تحديد",
-      Preview: "معاينة",
-    },
-  },
-  Select: {
-    Search: "بحث",
-    All: "تحديد الكل",
-    Latest: "تحديد أحدث",
-    Clear: "مسح",
-  },
-  Memory: {
-    Title: "اقتراحات الذاكرة",
-    EmptyContent: "لا شيء حتى الآن.",
-    Send: "إرسال الذاكرة",
-    Copy: "نسخ الذاكرة",
-    Reset: "إعادة التعيين",
-    ResetConfirm:
-      "سيؤدي إعادة التعيين إلى مسح سجل المحادثة الحالي والذاكرة التاريخية. هل أنت متأكد أنك تريد الاستمرار؟",
-  },
-  Home: {
-    NewChat: "دردشة جديدة",
-    DeleteChat: "هل تريد تأكيد حذف المحادثة المحددة؟",
-    DeleteToast: "تم حذف الدردشة",
-    Revert: "التراجع",
-  },
-  Settings: {
-    Title: "الإعدادات",
-    SubTitle: "جميع الإعدادات",
-
-    Lang: {
-      Name: "Language", // تنبيه: إذا كنت ترغب في إضافة ترجمة جديدة، يرجى عدم ترجمة هذه القيمة وتركها "Language"
-      All: "كل اللغات",
-    },
-    Avatar: "الصورة الرمزية",
-    FontSize: {
-      Title: "حجم الخط",
-      SubTitle: "ضبط حجم الخط لمحتوى الدردشة",
-    },
-    FontFamily: {
-      Title: "خط الدردشة",
-      SubTitle: "خط محتوى الدردشة، اتركه فارغًا لتطبيق الخط الافتراضي العالمي",
-      Placeholder: "اسم الخط",
-    },
-    InjectSystemPrompts: {
-      Title: "حقن تلميحات النظام",
-      SubTitle:
-        "قم بإضافة تلميحة نظام محاكاة ChatGPT إلى بداية قائمة الرسائل المُطلَبة في كل طلب",
-    },
-    InputTemplate: {
-      Title: "نموذج الإدخال",
-      SubTitle: "سيتم ملء أحدث رسالة في هذا النموذج",
-    },
-    Update: {
-      Version: (x: string) => ` الإصدار: ${x}`,
-      IsLatest: "أحدث إصدار",
-      CheckUpdate: "التحقق من التحديث",
-      IsChecking: "جارٍ التحقق من التحديث...",
-      FoundUpdate: (x: string) => ` تم العثور على إصدار جديد: ${x}`,
-      GoToUpdate: "التحديث",
-    },
-    SendKey: "مفتاح الإرسال",
-    Theme: "السمة",
-    TightBorder: "حدود ضيقة",
-    SendPreviewBubble: {
-      Title: "عرض معاينة الـ Send",
-      SubTitle: "معاينة Markdown في فقاعة",
-    },
-    Mask: {
-      Splash: {
-        Title: "شاشة تظهر الأقنعة",
-        SubTitle: "عرض شاشة تظهر الأقنعة قبل بدء الدردشة الجديدة",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "تعطيل الاكتمال التلقائي",
-        SubTitle: "اكتب / لتشغيل الاكتمال التلقائي",
-      },
-      List: "قائمة الاقتراحات",
-      ListCount: (builtin: number, custom: number) => `
-${builtin} مدمجة، ${custom} تم تعريفها من قبل المستخدم`,
-      Edit: "تعديل",
-      Modal: {
-        Title: "قائمة الاقتراحات",
-        Add: "إضافة واحدة",
-        Search: "البحث في الاقتراحات",
-      },
-      EditModal: {
-        Title: "تحرير الاقتراح",
-      },
-    },
-    HistoryCount: {
-      Title: "عدد الرسائل المرفقة",
-      SubTitle: "عدد الرسائل المرسلة المرفقة في كل طلب",
-    },
-    CompressThreshold: {
-      Title: "حد الضغط للتاريخ",
-      SubTitle: "سيتم الضغط إذا تجاوزت طول الرسائل غير المضغوطة الحد المحدد",
-    },
-
-    Usage: {
-      Title: "رصيد الحساب",
-      SubTitle(used: any, total: any) {
-        return `تم استخدام $${used} من هذا الشهر، الاشتراك ${total}`;
-      },
-      IsChecking: "جارٍ التحقق...",
-      Check: "التحقق",
-      NoAccess: "أدخل مفتاح API للتحقق من الرصيد",
-    },
-
-    Model: "النموذج",
-    Temperature: {
-      Title: "الحرارة",
-      SubTitle: "قيمة أكبر تجعل الإخراج أكثر عشوائية",
-    },
-    MaxTokens: {
-      Title: "الحد الأقصى للرموز",
-      SubTitle: "الحد الأقصى لعدد الرموز المدخلة والرموز المُنشأة",
-    },
-    PresencePenalty: {
-      Title: "تأثير الوجود",
-      SubTitle: "قيمة أكبر تزيد من احتمالية التحدث عن مواضيع جديدة",
-    },
-    FrequencyPenalty: {
-      Title: "تأثير التكرار",
-      SubTitle: "قيمة أكبر تقلل من احتمالية تكرار نفس السطر",
-    },
-  },
-  Store: {
-    DefaultTopic: "محادثة جديدة",
-    BotHello: "مرحبًا! كيف يمكنني مساعدتك اليوم؟",
-    Error: "حدث خطأ ما، يرجى المحاولة مرة أخرى في وقت لاحق.",
-    Prompt: {
-      History: (content: string) => "هذا ملخص لسجل الدردشة كمراجعة: " + content,
-      Topic:
-        "يرجى إنشاء عنوان يتكون من أربع إلى خمس كلمات يلخص محادثتنا دون أي مقدمة أو ترقيم أو علامات ترقيم أو نقاط أو رموز إضافية. قم بإزالة علامات التنصيص المحيطة.",
-      Summarize:
-        "قم بتلخيص النقاش بشكل موجز في 200 كلمة أو أقل لاستخدامه كاقتراح للسياق في المستقبل.",
-    },
-  },
-  Copy: {
-    Success: "تم النسخ إلى الحافظة",
-    Failed: "فشلت عملية النسخ، يرجى منح الإذن للوصول إلى الحافظة",
-  },
-  Context: {
-    Toast: (x: any) => `مع ${x} اقتراحًا ذا سياق`,
-    Edit: "الاقتراحات السياقية والذاكرة",
-    Add: "إضافة اقتراح",
-    Clear: "مسح السياق",
-    Revert: "التراجع",
-  },
-  Plugin: {
-    Name: "المكوّن الإضافي",
-  },
-  FineTuned: {
-    Sysmessage: "أنت مساعد ي",
-  },
-  Mask: {
-    Name: "الأقنعة",
-    Page: {
-      Title: "قالب الاقتراح",
-      SubTitle: (count: number) => `${count} قوالب الاقتراح`,
-      Search: "البحث في القوالب",
-      Create: "إنشاء",
-    },
-    Item: {
-      Info: (count: number) => `${count} اقتراحات`,
-      Chat: "الدردشة",
-      View: "عرض",
-      Edit: "تعديل",
-      Delete: "حذف",
-      DeleteConfirm: "تأكيد الحذف؟",
-    },
-    EditModal: {
-      Title: (readonly: boolean) => `
-تعديل قالب الاقتراح ${readonly ? "(للقراءة فقط)" : ""}`,
-      Download: "تنزيل",
-      Clone: "استنساخ",
-    },
-    Config: {
-      Avatar: "صورة الروبوت",
-      Name: "اسم الروبوت",
-      Sync: {
-        Title: "استخدام الإعدادات العامة",
-        SubTitle: "استخدام الإعدادات العامة في هذه الدردشة",
-        Confirm: "تأكيد الاستبدال بالإعدادات المخصصة بالإعدادات العامة؟",
-      },
-      HideContext: {
-        Title: "إخفاء اقتراحات السياق",
-        SubTitle: "عدم عرض اقتراحات السياق في الدردشة",
-      },
-    },
-  },
-  NewChat: {
-    Return: "العودة",
-    Skip: "ابدأ فقط",
-    Title: "اختيار قناع",
-    SubTitle: "دردشة مع الروح وراء القناع",
-    More: "المزيد",
-    NotShow: "عدم العرض مرة أخرى",
-    ConfirmNoShow: "تأكيد تعطيله؟ يمكنك تمكينه في الإعدادات لاحقًا.",
-  },
-
-  UI: {
-    Confirm: "تأكيد",
-    Cancel: "إلغاء",
-    Close: "إغلاق",
-    Create: "إنشاء",
-    Edit: "تعديل",
-  },
-  Exporter: {
-    Model: "النموذج",
-    Messages: "الرسائل",
-    Topic: "الموضوع",
-    Time: "الوقت",
-  },
-};
-
-export default ar;

+ 0 - 340
app/locales/bn.ts

@@ -1,340 +0,0 @@
-import { SubmitKey } from "../store/config";
-import { PartialLocaleType } from "./index";
-
-const bn: PartialLocaleType = {
-  WIP: "শীঘ্রই আসছে...",
-  Error: {
-    Unauthorized:
-      "অননুমোদিত অ্যাক্সেস, অনুগ্রহ করে [অথোরাইজশন](/#/auth) পৃষ্ঠায় অ্যাক্সেস কোড ইনপুট করুন।",
-  },
-  Auth: {
-    Title: "একটি অ্যাক্সেস কোড প্রয়োজন",
-    Tips: "নীচে অ্যাক্সেস কোড ইনপুট করুন",
-    SubTips: "অথবা আপনার OpenAI API কী প্রবেশ করুন",
-    Input: "অ্যাক্সেস কোড",
-    Confirm: "নিশ্চিত করুন",
-    Later: "পরে",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} টি বার্তা`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} টি বার্তা`,
-    Actions: {
-      ChatList: "চ্যাট তালিকায় যান",
-      CompressedHistory: "সংক্ষিপ্ত ইতিহাস মেমোরি প্রম্পট",
-      Export: "সমস্ত বার্তা মার্কডাউন হিসাবে রপ্তানি করুন",
-      Copy: "কপি",
-      Stop: "বন্ধ করুন",
-      Retry: "পুনরায় চেষ্টা করুন",
-      Pin: "পিন করুন",
-      PinToastContent: "পিন করা হয়েছে ২টি বার্তা প্রম্পটে",
-      PinToastAction: "দেখুন",
-      Delete: "মুছে ফেলুন",
-      Edit: "সম্পাদন করুন",
-    },
-    Commands: {
-      new: "নতুন চ্যাট শুরু করুন",
-      newm: "মাস্ক সহ নতুন চ্যাট শুরু করুন",
-      next: "পরবর্তী চ্যাট",
-      prev: "পূর্ববর্তী চ্যাট",
-      clear: "সংশ্লিষ্টতাবদ্ধকরণ পরিষ্কার করুন",
-      del: "চ্যাট মুছুন",
-    },
-    InputActions: {
-      Stop: "বন্ধ করুন",
-      ToBottom: "সর্বশেষতম দিকে",
-      Theme: {
-        auto: "অটো",
-        light: "হালকা থিম",
-        dark: "ডার্ক থিম",
-      },
-      Prompt: "প্রম্পটগুলিতে",
-      Masks: "মাস্কগুলি",
-      Clear: "সংশ্লিষ্টতাবদ্ধকরণ পরিষ্কার করুন",
-      Settings: "সেটিংস",
-    },
-    Rename: "চ্যাট পুনঃনামকরণ করুন",
-    Typing: "টাইপিং...",
-    Input: (submitKey: string) => {
-      var inputHints = `${submitKey} to send`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Shift + Enter to wrap";
-      }
-      return inputHints + ", / to search prompts, : to use commands";
-    },
-    Send: "প্রেরণ করুন",
-    Config: {
-      Reset: "ডিফল্টে রিসেট করুন",
-      SaveAs: "মাস্ক হিসাবে সংরক্ষণ করুন",
-    },
-  },
-  Export: {
-    Title: "বার্তা রপ্তানিকরণ",
-    Copy: "সমস্তটি কপি করুন",
-    Download: "ডাউনলোড করুন",
-    MessageFromYou: "আপনার বার্তা",
-    MessageFromChatGPT: "চ্যাটজিপিটির বার্তা",
-    Share: "শেয়ার করুন শেয়ারজিপিটি তে",
-    Format: {
-      Title: "রপ্তানি ফরম্যাট",
-      SubTitle: "মার্কডাউন বা পিএনজি চিত্র",
-    },
-    IncludeContext: {
-      Title: "মাস্ক অন্তর্ভুক্ত করুন",
-      SubTitle: "মাস্কগুলি সংরক্ষণ করবেন না কি",
-    },
-    Steps: {
-      Select: "নির্বাচন করুন",
-      Preview: "প্রিভিউ করুন",
-    },
-  },
-  Select: {
-    Search: "অনুসন্ধান করুন",
-    All: "সমস্তটি নির্বাচন করুন",
-    Latest: "সর্বশেষতমটি নির্বাচন করুন",
-    Clear: "পরিষ্কার করুন",
-  },
-  Memory: {
-    Title: "মেমোরি প্রম্পট",
-    EmptyContent: "এখনও কিছুই নেই।",
-    Send: "মেমোরি প্রেরণ করুন",
-    Copy: "মেমোরি কপি করুন",
-    Reset: "পুনরায় নিশ্চিত করুন",
-    ResetConfirm:
-      "রিসেট করলে বর্তমান চ্যাট ইতিহাস এবং ঐতিহাসিক মেমোরি মুছে যাবে। পুনরায় নির্দিষ্ট করতে চান তা নিশ্চিত করতে চান?",
-  },
-  Home: {
-    NewChat: "নতুন চ্যাট",
-    DeleteChat: "নির্বাচিত সংলাপটি মুছতে নিশ্চিত করুন?",
-    DeleteToast: "চ্যাটটি মুছেছেন",
-    Revert: "পুনরায়",
-  },
-  Settings: {
-    Title: "সেটিংস",
-    SubTitle: "সমস্ত সেটিংস",
-    Danger: {
-      Reset: {
-        Title: "সমস্ত সেটিংস পুনঃনির্দেশ দিন",
-        SubTitle: "সকল সেটিংস ডিফল্টে পুনঃনির্দেশ দিতে",
-        Action: "পুনঃনির্দেশ দিন",
-        Confirm: "সমস্ত সেটিংস ডিফল্টে পুনঃনির্দেশ করতে নিশ্চিত করতে?",
-      },
-      Clear: {
-        Title: "সমস্ত তথ্য মুছুন",
-        SubTitle: "সমস্ত বার্তা এবং সেটিংস মুছুন",
-        Action: "মুছুন",
-        Confirm: "সমস্ত বার্তা এবং সেটিংস মুছে ফেলতে নিশ্চিত করতে?",
-      },
-    },
-    Lang: {
-      Name: "বাংলা", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-      All: "সমস্ত ভাষা",
-    },
-    Avatar: "অবতার",
-    FontSize: {
-      Title: "ফন্ট সাইজ",
-      SubTitle: "চ্যাট সামগ্রীর ফন্ট সাইজ সংশোধন করুন",
-    },
-    FontFamily: {
-      Title: "চ্যাট ফন্ট",
-      SubTitle:
-        "চ্যাট সামগ্রীর ফন্ট, বিশ্বব্যাপী ডিফল্ট ফন্ট প্রয়োগ করতে খালি রাখুন",
-      Placeholder: "ফন্টের নাম",
-    },
-    InjectSystemPrompts: {
-      Title: "حقن تلميحات النظام",
-      SubTitle:
-        "قم بإضافة تلميحة نظام محاكاة ChatGPT إلى بداية قائمة الرسائل المُطلَبة في كل طلب",
-    },
-    InputTemplate: {
-      Title: "ইনপুট টেমপ্লেট",
-      SubTitle: "নতুনতম বার্তা এই টেমপ্লেটে পূরণ হবে",
-    },
-
-    Update: {
-      Version: (x: string) => `Version: ${x}`,
-      IsLatest: "Latest version",
-      CheckUpdate: "Check Update",
-      IsChecking: "Checking update...",
-      FoundUpdate: (x: string) => `Found new version: ${x}`,
-      GoToUpdate: "Update",
-    },
-    SendKey: "প্রেরণ চাবি",
-    Theme: "থিম",
-    TightBorder: "সঙ্গতি সীমা",
-    SendPreviewBubble: {
-      Title: "প্রিভিউ বুলবুল প্রেরণ করুন",
-      SubTitle: "বুলবুলে মার্কডাউন প্রিভিউ করুন",
-    },
-    Mask: {
-      Splash: {
-        Title: "মাস্ক স্প্ল্যাশ স্ক্রিন",
-        SubTitle:
-          "নতুন চ্যাট শুরু করার আগে মাস্ক স্প্ল্যাশ স্ক্রিন প্রদর্শন করুন",
-      },
-      Builtin: {
-        Title: "মূলত মাস্ক গোপন করুন",
-        SubTitle: "মাস্ক তালিকা থেকে মূলত মাস্কগুলি লুকান",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "অটো-সম্পূর্ণতা নিষ্ক্রিয় করুন",
-        SubTitle: "অটো-সম্পূর্ণতা চালু করতে / ইনপুট করুন",
-      },
-      List: "প্রম্পট তালিকা",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} built-in, ${custom} user-defined`,
-      Edit: "সম্পাদন করুন",
-      Modal: {
-        Title: "প্রম্পট তালিকা",
-        Add: "একটি যোগ করুন",
-        Search: "সন্ধান প্রম্পট",
-      },
-      EditModal: {
-        Title: "সম্পাদন করুন প্রম্পট",
-      },
-    },
-    HistoryCount: {
-      Title: "সংযুক্ত বার্তা সংখ্যা",
-      SubTitle: "প্রতি অনুরোধে প্রেরণ করা গেলে প্রেরণ করা হবে",
-    },
-    CompressThreshold: {
-      Title: "ইতিহাস সঙ্কুচিত করার সীমা",
-      SubTitle:
-        "নকুল বার্তা দৈর্ঘ্য সীমা অতিক্রান্ত হলে ঐ বার্তাটি সঙ্কুচিত হবে",
-    },
-
-    Usage: {
-      Title: "একাউন্ট ব্যালেন্স",
-      SubTitle(used: any, total: any) {
-        return `এই মাসে ব্যবহৃত $${used}, সাবস্ক্রিপশন $${total}`;
-      },
-      IsChecking: "চেক করা হচ্ছে...",
-      Check: "চেক",
-      NoAccess: "ব্যালেন্স চেক করতে অ্যাপি কী ইনপুট করুন",
-    },
-
-    Model: "মডেল",
-    Temperature: {
-      Title: "তাপমাত্রা",
-      SubTitle: "আরতি মান বেশি করলে বেশি এলোমেলো আউটপুট হবে",
-    },
-    TopP: {
-      Title: "শীর্ষ পি",
-      SubTitle: "তাপমাত্রা সঙ্গে এই মান পরিবর্তন করবেন না",
-    },
-    MaxTokens: {
-      Title: "সর্বাধিক টোকেন",
-      SubTitle: "ইনপুট টোকেন এবং উৎপাদিত টোকেনের সর্বাধিক দৈর্ঘ্য",
-    },
-    PresencePenalty: {
-      Title: "উপস্থিতির জরিমানা",
-      SubTitle: "আরতি মান বেশি করলে নতুন বিষয়গুলি সম্ভাব্যতা বাড়াতে পারে",
-    },
-    FrequencyPenalty: {
-      Title: "ফ্রিকুয়েন্সি জরিমানা",
-      SubTitle:
-        "আরতি মান বাড়ালে একই লাইন পুনরায় ব্যাবহার করার সম্ভাবনা হ্রাস পায়",
-    },
-  },
-  Store: {
-    DefaultTopic: "নতুন সংলাপ",
-    BotHello: "হ্যালো! আজকে আপনাকে কিভাবে সাহায্য করতে পারি?",
-    Error: "কিছু নিয়ে ভুল হয়েছে, পরে আবার চেষ্টা করুন।",
-    Prompt: {
-      History: (content: string) =>
-        "এটি চ্যাট ইতিহাসের সংক্ষিপ্ত সংকলনের মতো: " + content,
-      Topic:
-        "আমাদের সংলাপটির চার থেকে পাঁচ শব্দের একটি শিরোনাম তৈরি করুন যা আমাদের আলাপের সংক্ষিপ্তসার হিসাবে যোগ হবে না, যেমন অভিবৃত্তি, বিন্যাস, উদ্ধৃতি, পূর্বচালক চিহ্ন, পূর্বরোবক্তির যেকোনো চিহ্ন বা অতিরিক্ত পাঠ। মেয়াদশেষ উদ্ধৃতি চেষ্টা করুন।",
-      Summarize:
-        "২০০ শব্দের লম্বা হয়ে মুহূর্তে আলোচনা সংক্ষেপের রপ্তানি করুন, যেটি ভবিষ্যতের প্রম্পট হিসাবে ব্যবহার করবেন।",
-    },
-  },
-  Copy: {
-    Success: "ক্লিপবোর্ডে কপি করা হয়েছে",
-    Failed: "কপি ব্যর্থ, অনুমতি প্রদান করার জন্য অনুমতি প্রদান করুন",
-  },
-  Context: {
-    Toast: (x: any) => `With ${x} contextual prompts`,
-    Edit: "বর্তমান চ্যাট সেটিংস",
-    Add: "একটি প্রম্পট যোগ করুন",
-    Clear: "সঙ্গতি পরিস্কার করুন",
-    Revert: "পূর্ববর্তী অবস্থানে ফিরে যান",
-  },
-  Plugin: {
-    Name: "প্লাগইন",
-  },
-  FineTuned: {
-    Sysmessage: "আপনি একটি সহকারী যা",
-  },
-  Mask: {
-    Name: "মাস্ক",
-    Page: {
-      Title: "প্রম্পট টেমপ্লেট",
-      SubTitle: (count: number) => `${count} টি প্রম্পট টেমপ্লেট`,
-      Search: "টেমপ্লেট অনুসন্ধান করুন",
-      Create: "তৈরি করুন",
-    },
-    Item: {
-      Info: (count: number) => `${count} প্রম্পট`,
-      Chat: "চ্যাট",
-      View: "দেখুন",
-      Edit: "সম্পাদন করুন",
-      Delete: "মুছে ফেলুন",
-      DeleteConfirm: "মুছে ফেলতে নিশ্চিত করুন?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `প্রম্পট টেমপ্লেট সম্পাদন করুন ${readonly ? "(readonly)" : ""}`,
-      Download: "ডাউনলোড করুন",
-      Clone: "ক্লোন করুন",
-    },
-    Config: {
-      Avatar: "বট অবতার",
-      Name: "বটের নাম",
-      Sync: {
-        Title: "গ্লোবাল কনফিগ ব্যবহার করুন",
-        SubTitle: "এই চ্যাটে গ্লোবাল কনফিগ ব্যবহার করুন",
-        Confirm:
-          "গ্লোবাল কনফিগ দ্বারা কাস্টম কনফিগ ওভাররাইড করতে নিশ্চিত করতে?",
-      },
-      HideContext: {
-        Title: "সংশ্লিষ্টতা প্রম্পটগুলি লুকান",
-        SubTitle: "চ্যাটে সংশ্লিষ্টতা প্রম্পটগুলি দেখাবেন না",
-      },
-      Share: {
-        Title: "এই মাস্কটি শেয়ার করুন",
-        SubTitle: "এই মাস্কের একটি লিঙ্ক তৈরি করুন",
-        Action: "লিঙ্ক কপি করুন",
-      },
-    },
-  },
-  NewChat: {
-    Return: "ফিরে যান",
-    Skip: "শুরু করুন",
-    Title: "মাস্ক নির্বাচন করুন",
-    SubTitle: "মাস্কের পিছনে আত্মার সঙ্গে চ্যাট করুন",
-    More: "আরো খুঁজুন",
-    NotShow: "এখনও দেখাবেন না",
-    ConfirmNoShow:
-      "নিষ্ক্রিয় করতে নিশ্চিত করুন? পরে আপনি এটি সেটিংসে সক্ষম করতে পারবেন।",
-  },
-
-  UI: {
-    Confirm: "নিশ্চিত করুন",
-    Cancel: "বাতিল করুন",
-    Close: "বন্ধ করুন",
-    Create: "তৈরি করুন",
-    Edit: "সম্পাদন করুন",
-  },
-  Exporter: {
-    Model: "মডেল",
-    Messages: "বার্তা",
-    Topic: "টপিক",
-    Time: "সময়",
-  },
-};
-
-export default bn;

+ 0 - 244
app/locales/cs.ts

@@ -1,244 +0,0 @@
-import { SubmitKey } from "../store/config";
-import type { PartialLocaleType } from "./index";
-
-const cs: PartialLocaleType = {
-  WIP: "V přípravě...",
-  Error: {
-    Unauthorized:
-      "Neoprávněný přístup, zadejte přístupový kód na [stránce](/#/auth) nastavení.",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} zpráv`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} zpráv s ChatGPT`,
-    Actions: {
-      ChatList: "Přejít na seznam chatů",
-      CompressedHistory: "Pokyn z komprimované paměti historie",
-      Export: "Exportovat všechny zprávy jako Markdown",
-      Copy: "Kopírovat",
-      Stop: "Zastavit",
-      Retry: "Zopakovat",
-      Delete: "Smazat",
-    },
-    Rename: "Přejmenovat chat",
-    Typing: "Píše...",
-    Input: (submitKey: string) => {
-      var inputHints = `${submitKey} pro odeslání`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Shift + Enter pro řádkování";
-      }
-      return inputHints + ", / pro vyhledávání pokynů";
-    },
-    Send: "Odeslat",
-    Config: {
-      Reset: "Obnovit výchozí",
-      SaveAs: "Uložit jako Masku",
-    },
-  },
-  Export: {
-    Title: "Všechny zprávy",
-    Copy: "Kopírovat vše",
-    Download: "Stáhnout",
-    MessageFromYou: "Zpráva od vás",
-    MessageFromChatGPT: "Zpráva z ChatGPT",
-  },
-  Memory: {
-    Title: "Pokyn z paměti",
-    EmptyContent: "Zatím nic.",
-    Send: "Odeslat paměť",
-    Copy: "Kopírovat paměť",
-    Reset: "Obnovit relaci",
-    ResetConfirm:
-      "Resetováním se vymaže historie aktuálních konverzací i paměť historie pokynů. Opravdu chcete provést obnovu?",
-  },
-  Home: {
-    NewChat: "Nový chat",
-    DeleteChat: "Potvrzujete smazání vybrané konverzace?",
-    DeleteToast: "Chat smazán",
-    Revert: "Zvrátit",
-  },
-  Settings: {
-    Title: "Nastavení",
-    SubTitle: "Všechna nastavení",
-
-    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",
-    },
-    Avatar: "Avatar",
-    FontSize: {
-      Title: "Velikost písma",
-      SubTitle: "Nastavení velikosti písma obsahu chatu",
-    },
-    FontFamily: {
-      Title: "Chatové Písmo",
-      SubTitle:
-        "Písmo obsahu chatu, ponechejte prázdné pro použití globálního výchozího písma",
-      Placeholder: "Název Písma",
-    },
-    InjectSystemPrompts: {
-      Title: "Vložit systémové prompty",
-      SubTitle:
-        "Vynutit přidání simulovaného systémového promptu ChatGPT na začátek seznamu zpráv každého požadavku",
-    },
-    Update: {
-      Version: (x: string) => `Verze: ${x}`,
-      IsLatest: "Aktuální verze",
-      CheckUpdate: "Zkontrolovat aktualizace",
-      IsChecking: "Kontrola aktualizace...",
-      FoundUpdate: (x: string) => `Nalezena nová verze: ${x}`,
-      GoToUpdate: "Aktualizovat",
-    },
-    SendKey: "Odeslat klíč",
-    Theme: "Téma",
-    TightBorder: "Těsné ohraničení",
-    SendPreviewBubble: {
-      Title: "Odesílat chatovací bublinu s náhledem",
-      SubTitle: "Zobrazit v náhledu bubliny",
-    },
-    Mask: {
-      Splash: {
-        Title: "Úvodní obrazovka Masek",
-        SubTitle: "Před zahájením nového chatu zobrazte úvodní obrazovku Masek",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Deaktivovat automatické dokončování",
-        SubTitle: "Zadejte / pro spuštění automatického dokončování",
-      },
-      List: "Seznam pokynů",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} vestavěných, ${custom} uživatelských`,
-      Edit: "Upravit",
-      Modal: {
-        Title: "Seznam pokynů",
-        Add: "Přidat pokyn",
-        Search: "Hledat pokyny",
-      },
-      EditModal: {
-        Title: "Editovat pokyn",
-      },
-    },
-    HistoryCount: {
-      Title: "Počet připojených zpráv",
-      SubTitle: "Počet odeslaných připojených zpráv na žádost",
-    },
-    CompressThreshold: {
-      Title: "Práh pro kompresi historie",
-      SubTitle:
-        "Komprese proběhne, pokud délka nekomprimovaných zpráv přesáhne tuto hodnotu",
-    },
-
-    Usage: {
-      Title: "Stav účtu",
-      SubTitle(used: any, total: any) {
-        return `Použito tento měsíc $${used}, předplaceno $${total}`;
-      },
-      IsChecking: "Kontroluji...",
-      Check: "Zkontrolovat",
-      NoAccess: "Pro kontrolu zůstatku zadejte klíč API",
-    },
-
-    Model: "Model",
-    Temperature: {
-      Title: "Teplota",
-      SubTitle: "Větší hodnota činí výstup náhodnějším",
-    },
-    MaxTokens: {
-      Title: "Max. počet tokenů",
-      SubTitle: "Maximální délka vstupního tokenu a generovaných tokenů",
-    },
-    PresencePenalty: {
-      Title: "Přítomnostní korekce",
-      SubTitle: "Větší hodnota zvyšuje pravděpodobnost nových témat.",
-    },
-    FrequencyPenalty: {
-      Title: "Frekvenční penalizace",
-      SubTitle:
-        "Větší hodnota snižující pravděpodobnost opakování stejného řádku",
-    },
-  },
-  Store: {
-    DefaultTopic: "Nová konverzace",
-    BotHello: "Ahoj! Jak mohu dnes pomoci?",
-    Error: "Něco se pokazilo, zkuste to prosím později.",
-    Prompt: {
-      History: (content: string) =>
-        "Toto je shrnutí historie chatu mezi umělou inteligencí a uživatelem v podobě rekapitulace: " +
-        content,
-      Topic:
-        "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",
-    Failed: "Kopírování selhalo, prosím, povolte přístup ke schránce",
-  },
-  Context: {
-    Toast: (x: any) => `Použití ${x} kontextových pokynů`,
-    Edit: "Kontextové a paměťové pokyny",
-    Add: "Přidat pokyn",
-  },
-  Plugin: {
-    Name: "Plugin",
-  },
-  FineTuned: {
-    Sysmessage: "Jste asistent, který",
-  },
-  Mask: {
-    Name: "Maska",
-    Page: {
-      Title: "Šablona pokynu",
-      SubTitle: (count: number) => `${count} šablon pokynů`,
-      Search: "Hledat v šablonách",
-      Create: "Vytvořit",
-    },
-    Item: {
-      Info: (count: number) => `${count} pokynů`,
-      Chat: "Chat",
-      View: "Zobrazit",
-      Edit: "Upravit",
-      Delete: "Smazat",
-      DeleteConfirm: "Potvrdit smazání?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Editovat šablonu pokynu ${readonly ? "(pouze ke čtení)" : ""}`,
-      Download: "Stáhnout",
-      Clone: "Duplikovat",
-    },
-    Config: {
-      Avatar: "Avatar Bota",
-      Name: "Jméno Bota",
-    },
-  },
-  NewChat: {
-    Return: "Zpět",
-    Skip: "Přeskočit",
-    Title: "Vyberte Masku",
-    SubTitle: "Chatovat s duší za Maskou",
-    More: "Najít více",
-    NotShow: "Nezobrazovat znovu",
-    ConfirmNoShow: "Potvrdit zakázání?Můžete jej povolit později v nastavení.",
-  },
-
-  UI: {
-    Confirm: "Potvrdit",
-    Cancel: "Zrušit",
-    Close: "Zavřít",
-    Create: "Vytvořit",
-    Edit: "Upravit",
-  },
-  Exporter: {
-    Model: "Model",
-    Messages: "Zprávy",
-    Topic: "Téma",
-    Time: "Čas",
-  },
-};
-
-export default cs;

+ 0 - 246
app/locales/de.ts

@@ -1,246 +0,0 @@
-import { SubmitKey } from "../store/config";
-import type { PartialLocaleType } from "./index";
-
-const de: PartialLocaleType = {
-  WIP: "In Bearbeitung...",
-  Error: {
-    Unauthorized:
-      "Unbefugter Zugriff, bitte geben Sie den Zugangscode auf der [Einstellungsseite](/#/auth) ein.",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} Nachrichten`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} Nachrichten mit ChatGPT`,
-    Actions: {
-      ChatList: "Zur Chat-Liste gehen",
-      CompressedHistory: "Komprimierter Gedächtnis-Prompt",
-      Export: "Alle Nachrichten als Markdown exportieren",
-      Copy: "Kopieren",
-      Stop: "Stop",
-      Retry: "Wiederholen",
-      Delete: "Delete",
-    },
-    Rename: "Chat umbenennen",
-    Typing: "Tippen...",
-    Input: (submitKey: string) => {
-      var inputHints = `${submitKey} um zu Senden`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Umschalt + Eingabe für Zeilenumbruch";
-      }
-      return inputHints + ", / zum Durchsuchen von Prompts";
-    },
-    Send: "Senden",
-    Config: {
-      Reset: "Reset to Default",
-      SaveAs: "Save as Mask",
-    },
-  },
-  Export: {
-    Title: "Alle Nachrichten",
-    Copy: "Alles kopieren",
-    Download: "Herunterladen",
-    MessageFromYou: "Deine Nachricht",
-    MessageFromChatGPT: "Nachricht von ChatGPT",
-  },
-  Memory: {
-    Title: "Gedächtnis-Prompt",
-    EmptyContent: "Noch nichts.",
-    Send: "Gedächtnis senden",
-    Copy: "Gedächtnis kopieren",
-    Reset: "Sitzung zurücksetzen",
-    ResetConfirm:
-      "Das Zurücksetzen löscht den aktuellen Gesprächsverlauf und das Langzeit-Gedächtnis. Möchten Sie wirklich zurücksetzen?",
-  },
-  Home: {
-    NewChat: "Neuer Chat",
-    DeleteChat: "Bestätigen Sie, um das ausgewählte Gespräch zu löschen?",
-    DeleteToast: "Chat gelöscht",
-    Revert: "Zurücksetzen",
-  },
-  Settings: {
-    Title: "Einstellungen",
-    SubTitle: "Alle Einstellungen",
-
-    Lang: {
-      Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-      All: "Alle Sprachen",
-    },
-    Avatar: "Avatar",
-    FontSize: {
-      Title: "Schriftgröße",
-      SubTitle: "Schriftgröße des Chat-Inhalts anpassen",
-    },
-    FontFamily: {
-      Title: "Chat-Schriftart",
-      SubTitle:
-        "Schriftart des Chat-Inhalts, leer lassen, um die globale Standardschriftart anzuwenden",
-      Placeholder: "Schriftartname",
-    },
-    InjectSystemPrompts: {
-      Title: "System-Prompts einfügen",
-      SubTitle:
-        "Erzwingt das Hinzufügen eines simulierten systemweiten Prompts von ChatGPT am Anfang der Nachrichtenliste bei jeder Anfrage",
-    },
-    Update: {
-      Version: (x: string) => `Version: ${x}`,
-      IsLatest: "Neueste Version",
-      CheckUpdate: "Update prüfen",
-      IsChecking: "Update wird geprüft...",
-      FoundUpdate: (x: string) => `Neue Version gefunden: ${x}`,
-      GoToUpdate: "Aktualisieren",
-    },
-    SendKey: "Senden-Taste",
-    Theme: "Erscheinungsbild",
-    TightBorder: "Enger Rahmen",
-    SendPreviewBubble: {
-      Title: "Vorschau-Bubble senden",
-      SubTitle: "Preview markdown in bubble",
-    },
-    Mask: {
-      Splash: {
-        Title: "Mask Splash Screen",
-        SubTitle: "Show a mask splash screen before starting new chat",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Autovervollständigung deaktivieren",
-        SubTitle: "Autovervollständigung mit / starten",
-      },
-      List: "Prompt-Liste",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} integriert, ${custom} benutzerdefiniert`,
-      Edit: "Bearbeiten",
-      Modal: {
-        Title: "Prompt List",
-        Add: "Add One",
-        Search: "Search Prompts",
-      },
-      EditModal: {
-        Title: "Edit Prompt",
-      },
-    },
-    HistoryCount: {
-      Title: "Anzahl der angehängten Nachrichten",
-      SubTitle: "Anzahl der pro Anfrage angehängten gesendeten Nachrichten",
-    },
-    CompressThreshold: {
-      Title: "Schwellenwert für Verlaufskomprimierung",
-      SubTitle:
-        "Komprimierung, wenn die Länge der unkomprimierten Nachrichten den Wert überschreitet",
-    },
-
-    Usage: {
-      Title: "Kontostand",
-      SubTitle(used: any, total: any) {
-        return `Diesen Monat ausgegeben $${used}, Abonnement $${total}`;
-      },
-      IsChecking: "Wird überprüft...",
-      Check: "Erneut prüfen",
-      NoAccess: "API-Schlüssel eingeben, um den Kontostand zu überprüfen",
-    },
-    Model: "Modell",
-    Temperature: {
-      Title: "Temperature", //Temperatur
-      SubTitle: "Ein größerer Wert führt zu zufälligeren Antworten",
-    },
-    MaxTokens: {
-      Title: "Max Tokens", //Maximale Token
-      SubTitle: "Maximale Anzahl der Anfrage- plus Antwort-Token",
-    },
-    PresencePenalty: {
-      Title: "Presence Penalty", //Anwesenheitsstrafe
-      SubTitle:
-        "Ein größerer Wert erhöht die Wahrscheinlichkeit, dass über neue Themen gesprochen wird",
-    },
-    FrequencyPenalty: {
-      Title: "Frequency Penalty", // HäufigkeitStrafe
-      SubTitle:
-        "Ein größerer Wert, der die Wahrscheinlichkeit verringert, dass dieselbe Zeile wiederholt wird",
-    },
-  },
-  Store: {
-    DefaultTopic: "Neues Gespräch",
-    BotHello: "Hallo! Wie kann ich Ihnen heute helfen?",
-    Error:
-      "Etwas ist schief gelaufen, bitte versuchen Sie es später noch einmal.",
-    Prompt: {
-      History: (content: string) =>
-        "Dies ist eine Zusammenfassung des Chatverlaufs zwischen dem KI und dem Benutzer als Rückblick: " +
-        content,
-      Topic:
-        "Bitte erstellen Sie einen vier- bis fünfwörtigen Titel, der unser Gespräch zusammenfasst, ohne Einleitung, Zeichensetzung, Anführungszeichen, Punkte, Symbole oder zusätzlichen Text. Entfernen Sie Anführungszeichen.",
-      Summarize:
-        "Fassen Sie unsere Diskussion kurz in 200 Wörtern oder weniger zusammen, um sie als Pronpt für zukünftige Gespräche zu verwenden.",
-    },
-  },
-  Copy: {
-    Success: "In die Zwischenablage kopiert",
-    Failed:
-      "Kopieren fehlgeschlagen, bitte geben Sie die Berechtigung zum Zugriff auf die Zwischenablage frei",
-  },
-  Context: {
-    Toast: (x: any) => `Mit ${x} Kontext-Prompts`,
-    Edit: "Kontext- und Gedächtnis-Prompts",
-    Add: "Hinzufügen",
-  },
-  Plugin: {
-    Name: "Plugin",
-  },
-  FineTuned: {
-    Sysmessage: "Du bist ein Assistent, der",
-  },
-  Mask: {
-    Name: "Mask",
-    Page: {
-      Title: "Prompt Template",
-      SubTitle: (count: number) => `${count} prompt templates`,
-      Search: "Search Templates",
-      Create: "Create",
-    },
-    Item: {
-      Info: (count: number) => `${count} prompts`,
-      Chat: "Chat",
-      View: "View",
-      Edit: "Edit",
-      Delete: "Delete",
-      DeleteConfirm: "Confirm to delete?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Edit Prompt Template ${readonly ? "(readonly)" : ""}`,
-      Download: "Download",
-      Clone: "Clone",
-    },
-    Config: {
-      Avatar: "Bot Avatar",
-      Name: "Bot Name",
-    },
-  },
-  NewChat: {
-    Return: "Return",
-    Skip: "Skip",
-    Title: "Pick a Mask",
-    SubTitle: "Chat with the Soul behind the Mask",
-    More: "Find More",
-    NotShow: "Not Show Again",
-    ConfirmNoShow: "Confirm to disable?You can enable it in settings later.",
-  },
-
-  UI: {
-    Confirm: "Confirm",
-    Cancel: "Cancel",
-    Close: "Close",
-    Create: "Create",
-    Edit: "Edit",
-  },
-  Exporter: {
-    Model: "Modell",
-    Messages: "Nachrichten",
-    Topic: "Thema",
-    Time: "Zeit",
-  },
-};
-
-export default de;

+ 0 - 246
app/locales/es.ts

@@ -1,246 +0,0 @@
-import { SubmitKey } from "../store/config";
-import type { PartialLocaleType } from "./index";
-
-const es: PartialLocaleType = {
-  WIP: "En construcción...",
-  Error: {
-    Unauthorized:
-      "Acceso no autorizado, por favor ingrese el código de acceso en la [página](/#/auth) de configuración.",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} mensajes`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} mensajes con ChatGPT`,
-    Actions: {
-      ChatList: "Ir a la lista de chats",
-      CompressedHistory: "Historial de memoria comprimido",
-      Export: "Exportar todos los mensajes como Markdown",
-      Copy: "Copiar",
-      Stop: "Detener",
-      Retry: "Reintentar",
-      Delete: "Delete",
-    },
-    Rename: "Renombrar chat",
-    Typing: "Escribiendo...",
-    Input: (submitKey: string) => {
-      var inputHints = `Escribe algo y presiona ${submitKey} para enviar`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", presiona Shift + Enter para nueva línea";
-      }
-      return inputHints;
-    },
-    Send: "Enviar",
-    Config: {
-      Reset: "Reset to Default",
-      SaveAs: "Save as Mask",
-    },
-  },
-  Export: {
-    Title: "Todos los mensajes",
-    Copy: "Copiar todo",
-    Download: "Descargar",
-    MessageFromYou: "Mensaje de ti",
-    MessageFromChatGPT: "Mensaje de ChatGPT",
-  },
-  Memory: {
-    Title: "Historial de memoria",
-    EmptyContent: "Aún no hay nada.",
-    Copy: "Copiar todo",
-    Send: "Send Memory",
-    Reset: "Reset Session",
-    ResetConfirm:
-      "Resetting will clear the current conversation history and historical memory. Are you sure you want to reset?",
-  },
-  Home: {
-    NewChat: "Nuevo chat",
-    DeleteChat: "¿Confirmar eliminación de la conversación seleccionada?",
-    DeleteToast: "Chat Deleted",
-    Revert: "Revert",
-  },
-  Settings: {
-    Title: "Configuración",
-    SubTitle: "Todas las configuraciones",
-
-    Lang: {
-      Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-      All: "Todos los idiomas",
-    },
-    Avatar: "Avatar",
-    FontSize: {
-      Title: "Tamaño de fuente",
-      SubTitle: "Ajustar el tamaño de fuente del contenido del chat",
-    },
-    FontFamily: {
-      Title: "Fuente del Chat",
-      SubTitle:
-        "Fuente del contenido del chat, dejar vacío para aplicar la fuente predeterminada global",
-      Placeholder: "Nombre de la Fuente",
-    },
-    InjectSystemPrompts: {
-      Title: "Inyectar Prompts del Sistema",
-      SubTitle:
-        "Agregar forzosamente un prompt de sistema simulado de ChatGPT al comienzo de la lista de mensajes en cada solicitud",
-    },
-    Update: {
-      Version: (x: string) => `Versión: ${x}`,
-      IsLatest: "Última versión",
-      CheckUpdate: "Buscar actualizaciones",
-      IsChecking: "Buscando actualizaciones...",
-      FoundUpdate: (x: string) => `Se encontró una nueva versión: ${x}`,
-      GoToUpdate: "Actualizar",
-    },
-    SendKey: "Tecla de envío",
-    Theme: "Tema",
-    TightBorder: "Borde ajustado",
-    SendPreviewBubble: {
-      Title: "Enviar burbuja de vista previa",
-      SubTitle: "Preview markdown in bubble",
-    },
-    Mask: {
-      Splash: {
-        Title: "Mask Splash Screen",
-        SubTitle: "Show a mask splash screen before starting new chat",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Desactivar autocompletado",
-        SubTitle: "Escribe / para activar el autocompletado",
-      },
-      List: "Lista de autocompletado",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} incorporado, ${custom} definido por el usuario`,
-      Edit: "Editar",
-      Modal: {
-        Title: "Prompt List",
-        Add: "Add One",
-        Search: "Search Prompts",
-      },
-      EditModal: {
-        Title: "Edit Prompt",
-      },
-    },
-    HistoryCount: {
-      Title: "Cantidad de mensajes adjuntos",
-      SubTitle: "Número de mensajes enviados adjuntos por solicitud",
-    },
-    CompressThreshold: {
-      Title: "Umbral de compresión de historial",
-      SubTitle:
-        "Se comprimirán los mensajes si la longitud de los mensajes no comprimidos supera el valor",
-    },
-
-    Usage: {
-      Title: "Saldo de la cuenta",
-      SubTitle(used: any, total: any) {
-        return `Usado $${used}, subscription $${total}`;
-      },
-      IsChecking: "Comprobando...",
-      Check: "Comprobar de nuevo",
-      NoAccess: "Introduzca la clave API para comprobar el saldo",
-    },
-
-    Model: "Modelo",
-    Temperature: {
-      Title: "Temperatura",
-      SubTitle: "Un valor mayor genera una salida más aleatoria",
-    },
-    MaxTokens: {
-      Title: "Máximo de tokens",
-      SubTitle: "Longitud máxima de tokens de entrada y tokens generados",
-    },
-    PresencePenalty: {
-      Title: "Penalización de presencia",
-      SubTitle:
-        "Un valor mayor aumenta la probabilidad de hablar sobre nuevos temas",
-    },
-    FrequencyPenalty: {
-      Title: "Penalización de frecuencia",
-      SubTitle:
-        "Un valor mayor que disminuye la probabilidad de repetir la misma línea",
-    },
-  },
-  Store: {
-    DefaultTopic: "Nueva conversación",
-    BotHello: "¡Hola! ¿Cómo puedo ayudarte hoy?",
-    Error: "Algo salió mal, por favor intenta nuevamente más tarde.",
-    Prompt: {
-      History: (content: string) =>
-        "Este es un resumen del historial del chat entre la IA y el usuario como recapitulación: " +
-        content,
-      Topic:
-        "Por favor, genera un título de cuatro a cinco palabras que resuma nuestra conversación sin ningún inicio, puntuación, comillas, puntos, símbolos o texto adicional. Elimina las comillas que lo envuelven.",
-      Summarize:
-        "Resuma nuestra discusión brevemente en 200 caracteres o menos para usarlo como un recordatorio para futuros contextos.",
-    },
-  },
-  Copy: {
-    Success: "Copiado al portapapeles",
-    Failed:
-      "La copia falló, por favor concede permiso para acceder al portapapeles",
-  },
-  Context: {
-    Toast: (x: any) => `With ${x} contextual prompts`,
-    Edit: "Contextual and Memory Prompts",
-    Add: "Add One",
-  },
-  Plugin: {
-    Name: "Plugin",
-  },
-  FineTuned: {
-    Sysmessage: "Eres un asistente que",
-  },
-  Mask: {
-    Name: "Mask",
-    Page: {
-      Title: "Prompt Template",
-      SubTitle: (count: number) => `${count} prompt templates`,
-      Search: "Search Templates",
-      Create: "Create",
-    },
-    Item: {
-      Info: (count: number) => `${count} prompts`,
-      Chat: "Chat",
-      View: "View",
-      Edit: "Edit",
-      Delete: "Delete",
-      DeleteConfirm: "Confirm to delete?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Edit Prompt Template ${readonly ? "(readonly)" : ""}`,
-      Download: "Download",
-      Clone: "Clone",
-    },
-    Config: {
-      Avatar: "Bot Avatar",
-      Name: "Bot Name",
-    },
-  },
-  NewChat: {
-    Return: "Return",
-    Skip: "Skip",
-    Title: "Pick a Mask",
-    SubTitle: "Chat with the Soul behind the Mask",
-    More: "Find More",
-    NotShow: "Not Show Again",
-    ConfirmNoShow: "Confirm to disable?You can enable it in settings later.",
-  },
-
-  UI: {
-    Confirm: "Confirm",
-    Cancel: "Cancel",
-    Close: "Close",
-    Create: "Create",
-    Edit: "Edit",
-  },
-  Exporter: {
-    Model: "Modelo",
-    Messages: "Mensajes",
-    Topic: "Tema",
-    Time: "Time",
-  },
-};
-
-export default es;

+ 0 - 315
app/locales/fr.ts

@@ -1,315 +0,0 @@
-import { SubmitKey } from "../store/config";
-import type { PartialLocaleType } from "./index";
-
-const fr: PartialLocaleType = {
-  WIP: "Prochainement...",
-  Error: {
-    Unauthorized:
-      "Accès non autorisé, veuillez saisir le code d'accès dans la [page](/#/auth) des paramètres.",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} messages en total`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} messages échangés avec ChatGPT`,
-    Actions: {
-      ChatList: "Aller à la liste de discussion",
-      CompressedHistory: "Mémoire d'historique compressée Prompt",
-      Export: "Exporter tous les messages en tant que Markdown",
-      Copy: "Copier",
-      Stop: "Arrêter",
-      Retry: "Réessayer",
-      Delete: "Supprimer",
-      Pin: "Épingler",
-      PinToastContent: "Épingler 2 messages à des messages contextuels",
-      PinToastAction: "Voir",
-      Edit: "Modifier",
-    },
-    Commands: {
-      new: "Commencer une nouvelle conversation",
-      newm: "Démarrer une nouvelle conversation avec un assistant",
-      next: "Conversation suivante",
-      prev: "Conversation précédente",
-      clear: "Effacer le contexte",
-      del: "Supprimer la Conversation",
-    },
-    InputActions: {
-      Stop: "Stop",
-      ToBottom: "Au dernier",
-      Theme: {
-        auto: "Auto",
-        light: "Thème clair",
-        dark: "Thème sombre",
-      },
-      Prompt: "Instructions",
-      Masks: "Assistants",
-      Clear: "Effacer le contexte",
-      Settings: "Réglages",
-    },
-    Rename: "Renommer la conversation",
-    Typing: "En train d'écrire…",
-    Input: (submitKey: string) => {
-      var inputHints = `Appuyez sur ${submitKey} pour envoyer`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Shift + Enter pour insérer un saut de ligne";
-      }
-      return inputHints + ", / pour rechercher des prompts";
-    },
-    Send: "Envoyer",
-    Config: {
-      Reset: "Restaurer les paramètres par défaut",
-      SaveAs: "Enregistrer en tant que masque",
-    },
-  },
-  Export: {
-    Title: "Tous les messages",
-    Copy: "Tout sélectionner",
-    Download: "Télécharger",
-    MessageFromYou: "Message de votre part",
-    MessageFromChatGPT: "Message de ChatGPT",
-  },
-  Memory: {
-    Title: "Prompt mémoire",
-    EmptyContent: "Rien encore.",
-    Send: "Envoyer la mémoire",
-    Copy: "Copier la mémoire",
-    Reset: "Réinitialiser la session",
-    ResetConfirm:
-      "La réinitialisation supprimera l'historique de la conversation actuelle ainsi que la mémoire de l'historique. Êtes-vous sûr de vouloir procéder à la réinitialisation?",
-  },
-  Home: {
-    NewChat: "Nouvelle discussion",
-    DeleteChat: "Confirmer la suppression de la conversation sélectionnée ?",
-    DeleteToast: "Conversation supprimée",
-    Revert: "Revenir en arrière",
-  },
-  Settings: {
-    Title: "Paramètres",
-    SubTitle: "Toutes les configurations",
-    Danger: {
-      Reset: {
-        Title: "Restaurer les paramètres",
-        SubTitle: "Restaurer les paramètres par défaut",
-        Action: "Reinitialiser",
-        Confirm: "Confirmer la réinitialisation des paramètres?",
-      },
-      Clear: {
-        Title: "Supprimer toutes les données",
-        SubTitle:
-          "Effacer toutes les données, y compris les conversations et les paramètres",
-        Action: "Supprimer",
-        Confirm: "Confirmer la suppression de toutes les données?",
-      },
-    },
-    Lang: {
-      Name: "Language", // ATTENTION : si vous souhaitez ajouter une nouvelle traduction, ne traduisez pas cette valeur, laissez-la sous forme de `Language`
-      All: "Toutes les langues",
-    },
-
-    Avatar: "Avatar",
-    FontSize: {
-      Title: "Taille des polices",
-      SubTitle: "Ajuste la taille de police du contenu de la conversation",
-    },
-    FontFamily: {
-      Title: "Police de Chat",
-      SubTitle:
-        "Police du contenu du chat, laissez vide pour appliquer la police par défaut globale",
-      Placeholder: "Nom de la Police",
-    },
-    InjectSystemPrompts: {
-      Title: "Injecter des invites système",
-      SubTitle:
-        "Ajoute de force une invite système simulée de ChatGPT au début de la liste des messages pour chaque demande",
-    },
-    InputTemplate: {
-      Title: "Template",
-      SubTitle: "Le message le plus récent sera ajouté à ce template.",
-    },
-    Update: {
-      Version: (x: string) => `Version : ${x}`,
-      IsLatest: "Dernière version",
-      CheckUpdate: "Vérifier la mise à jour",
-      IsChecking: "Vérification de la mise à jour...",
-      FoundUpdate: (x: string) => `Nouvelle version disponible : ${x}`,
-      GoToUpdate: "Mise à jour",
-    },
-    SendKey: "Clé d'envoi",
-    Theme: "Thème",
-    TightBorder: "Bordure serrée",
-    SendPreviewBubble: {
-      Title: "Aperçu de l'envoi dans une bulle",
-      SubTitle: "Aperçu du Markdown dans une bulle",
-    },
-    Mask: {
-      Splash: {
-        Title: "Écran de masque",
-        SubTitle:
-          "Afficher un écran de masque avant de démarrer une nouvelle discussion",
-      },
-      Builtin: {
-        Title: "Masquer Les Assistants Intégrés",
-        SubTitle: "Masquer les assistants intégrés par défaut",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Désactiver la saisie semi-automatique",
-        SubTitle: "Appuyez sur / pour activer la saisie semi-automatique",
-      },
-      List: "Liste de prompts",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} intégré, ${custom} personnalisé`,
-      Edit: "Modifier",
-      Modal: {
-        Title: "Liste de prompts",
-        Add: "Ajouter un élément",
-        Search: "Rechercher des prompts",
-      },
-      EditModal: {
-        Title: "Modifier le prompt",
-      },
-    },
-    HistoryCount: {
-      Title: "Nombre de messages joints",
-      SubTitle: "Nombre de messages envoyés attachés par demande",
-    },
-    CompressThreshold: {
-      Title: "Seuil de compression de l'historique",
-      SubTitle:
-        "Comprimera si la longueur des messages non compressés dépasse cette valeur",
-    },
-
-    Usage: {
-      Title: "Solde du compte",
-      SubTitle(used: any, total: any) {
-        return `Épuisé ce mois-ci $${used}, abonnement $${total}`;
-      },
-      IsChecking: "Vérification...",
-      Check: "Vérifier",
-      NoAccess: "Entrez la clé API pour vérifier le solde",
-    },
-
-    Model: "Modèle",
-    Temperature: {
-      Title: "Température",
-      SubTitle: "Une valeur plus élevée rendra les réponses plus aléatoires",
-    },
-    TopP: {
-      Title: "Top P",
-      SubTitle:
-        "Ne modifiez pas à moins que vous ne sachiez ce que vous faites",
-    },
-    MaxTokens: {
-      Title: "Limite de Tokens",
-      SubTitle: "Longueur maximale des tokens d'entrée et des tokens générés",
-    },
-    PresencePenalty: {
-      Title: "Pénalité de présence",
-      SubTitle:
-        "Une valeur plus élevée augmentera la probabilité d'introduire de nouveaux sujets",
-    },
-    FrequencyPenalty: {
-      Title: "Pénalité de fréquence",
-      SubTitle:
-        "Une valeur plus élevée diminuant la probabilité de répéter la même ligne",
-    },
-  },
-  Store: {
-    DefaultTopic: "Nouvelle conversation",
-    BotHello: "Bonjour ! Comment puis-je vous aider aujourd'hui ?",
-    Error: "Quelque chose s'est mal passé, veuillez réessayer plus tard.",
-    Prompt: {
-      History: (content: string) =>
-        "Ceci est un résumé de l'historique des discussions entre l'IA et l'utilisateur : " +
-        content,
-      Topic:
-        "Veuillez générer un titre de quatre à cinq mots résumant notre conversation sans introduction, ponctuation, guillemets, points, symboles ou texte supplémentaire. Supprimez les guillemets inclus.",
-      Summarize:
-        "Résumez brièvement nos discussions en 200 mots ou moins pour les utiliser comme prompt de contexte futur.",
-    },
-  },
-  Copy: {
-    Success: "Copié dans le presse-papiers",
-    Failed:
-      "La copie a échoué, veuillez accorder l'autorisation d'accès au presse-papiers",
-  },
-  Context: {
-    Toast: (x: any) => `Avec ${x} contextes de prompts`,
-    Edit: "Contextes et mémoires de prompts",
-    Add: "Ajouter un prompt",
-  },
-  Plugin: {
-    Name: "Extension",
-  },
-  FineTuned: {
-    Sysmessage: "Eres un asistente que",
-  },
-  Mask: {
-    Name: "Masque",
-    Page: {
-      Title: "Modèle de prompt",
-      SubTitle: (count: number) => `${count} modèles de prompts`,
-      Search: "Rechercher des modèles",
-      Create: "Créer",
-    },
-    Item: {
-      Info: (count: number) => `${count} prompts`,
-      Chat: "Discussion",
-      View: "Vue",
-      Edit: "Modifier",
-      Delete: "Supprimer",
-      DeleteConfirm: "Confirmer la suppression?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Modifier le modèle de prompt ${readonly ? "(en lecture seule)" : ""}`,
-      Download: "Télécharger",
-      Clone: "Dupliquer",
-    },
-    Config: {
-      Avatar: "Avatar de lassistant",
-      Name: "Nom de lassistant",
-      Sync: {
-        Title: "Utiliser la configuration globale",
-        SubTitle: "Utiliser la configuration globale dans cette conversation",
-        Confirm: "Voulez-vous definir votre configuration personnalisée ?",
-      },
-      HideContext: {
-        Title: "Masquer les invites contextuelles",
-        SubTitle: "Ne pas afficher les instructions contextuelles dans le chat",
-      },
-      Share: {
-        Title: "Partager ce masque",
-        SubTitle: "Générer un lien vers ce masque",
-        Action: "Copier le lien",
-      },
-    },
-  },
-  NewChat: {
-    Return: "Retour",
-    Skip: "Passer",
-    Title: "Choisir un assitant",
-    SubTitle: "Discutez avec l'âme derrière le masque",
-    More: "En savoir plus",
-    NotShow: "Ne pas afficher à nouveau",
-    ConfirmNoShow:
-      "Confirmez-vous vouloir désactiver cela? Vous pouvez le réactiver plus tard dans les paramètres.",
-  },
-
-  UI: {
-    Confirm: "Confirmer",
-    Cancel: "Annuler",
-    Close: "Fermer",
-    Create: "Créer",
-    Edit: "Éditer",
-  },
-  Exporter: {
-    Model: "Modèle",
-    Messages: "Messages",
-    Topic: "Sujet",
-    Time: "Temps",
-  },
-};
-
-export default fr;

+ 0 - 391
app/locales/id.ts

@@ -1,391 +0,0 @@
-import { SubmitKey } from "../store/config";
-import { PartialLocaleType } from "./index";
-
-const id: PartialLocaleType = {
-  WIP: "Coming Soon...",
-  Error: {
-    Unauthorized:
-      "Akses tidak diizinkan, silakan masukkan kode akses atau masukkan kunci API OpenAI Anda. di halaman [autentikasi](/#/auth) atau di halaman [Pengaturan](/#/settings).",
-  },
-  Auth: {
-    Title: "Diperlukan Kode Akses",
-    Tips: "Masukkan kode akses di bawah",
-    SubTips: "Atau masukkan kunci API OpenAI Anda",
-    Input: "Kode Akses",
-    Confirm: "Konfirmasi",
-    Later: "Nanti",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} pesan`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} pesan`,
-    Actions: {
-      ChatList: "Buka Daftar Chat",
-      CompressedHistory: "Ekspor Riwayat Terkompresi",
-      Export: "Ekspor Semua Pesan sebagai Markdown",
-      Copy: "Salin",
-      Stop: "Berhenti",
-      Retry: "Coba Lagi",
-      Pin: "Pin",
-      PinToastContent: "2 pesan telah ditandai",
-      PinToastAction: "Lihat",
-      Delete: "Hapus",
-      Edit: "Edit",
-    },
-    Commands: {
-      new: "Mulai Chat Baru",
-      newm: "Mulai Chat Baru dengan Masks",
-      next: "Chat Selanjutnya",
-      prev: "Chat Sebelumnya",
-      clear: "Bersihkan Percakapan",
-      del: "Hapus Chat",
-    },
-    InputActions: {
-      Stop: "Berhenti",
-      ToBottom: "Ke Bagian Bawah",
-      Theme: {
-        auto: "Otomatis",
-        light: "Tema Terang",
-        dark: "Tema Gelap",
-      },
-      Prompt: "Prompts",
-      Masks: "Masks",
-      Clear: "Bersihkan Percakapan",
-      Settings: "Pengaturan",
-    },
-    Rename: "Ubah Nama Chat",
-    Typing: "Mengetik...",
-    Input: (submitKey: string) => {
-      var inputHints = `${submitKey} untuk mengirim`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Shift + Enter untuk membalut";
-      }
-      return (
-        inputHints + ", / untuk mencari prompt, : untuk menggunakan perintah"
-      );
-    },
-    Send: "Kirim",
-    Config: {
-      Reset: "Reset ke Default",
-      SaveAs: "Simpan sebagai Masks",
-    },
-  },
-  Export: {
-    Title: "Ekspor Pesan",
-    Copy: "Salin Semua",
-    Download: "Unduh",
-    MessageFromYou: "Pesan dari Anda",
-    MessageFromChatGPT: "Pesan dari ChatGPT",
-    Share: "Bagikan ke ShareGPT",
-    Format: {
-      Title: "Format Ekspor",
-      SubTitle: "Markdown atau Gambar PNG",
-    },
-    IncludeContext: {
-      Title: "Sertakan Konteks",
-      SubTitle: "Apakah akan menyertakan masks",
-    },
-    Steps: {
-      Select: "Pilih",
-      Preview: "Pratinjau",
-    },
-  },
-  Select: {
-    Search: "Cari",
-    All: "Pilih Semua",
-    Latest: "Pilih Terbaru",
-    Clear: "Bersihkan",
-  },
-  Memory: {
-    Title: "Prompt Memori",
-    EmptyContent: "Belum ada yang tersedia.",
-    Send: "Kirim Memori",
-    Copy: "Salin Memori",
-    Reset: "Reset",
-    ResetConfirm:
-      "Jika Anda mereset, riwayat obrolan saat ini dan memori historis akan dihapus. Apakah Anda yakin ingin melakukan reset?",
-  },
-  Home: {
-    NewChat: "Obrolan Baru",
-    DeleteChat: "Anda yakin ingin menghapus percakapan yang dipilih?",
-    DeleteToast: "Percakapan telah dihapus",
-    Revert: "Kembali",
-  },
-  Settings: {
-    Title: "Pengaturan",
-    SubTitle: "Semua Pengaturan",
-    Danger: {
-      Reset: {
-        Title: "Setel Ulang Semua Pengaturan",
-        SubTitle: "Mengembalikan semua pengaturan ke nilai default",
-        Action: "Setel Ulang",
-        Confirm:
-          "Anda yakin ingin mengembalikan semua pengaturan ke nilai default?",
-      },
-      Clear: {
-        Title: "Hapus Semua Data",
-        SubTitle: "Semua data yang tersimpan secara lokal akan dihapus",
-        Action: "Hapus",
-        Confirm:
-          "Apakah Anda yakin ingin menghapus semua data yang tersimpan secara lokal?",
-      },
-    },
-    Lang: {
-      Name: "Bahasa", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-      All: "Semua Bahasa",
-    },
-    Avatar: "Avatar",
-    FontSize: {
-      Title: "Ukuran Font",
-      SubTitle: "Ubah ukuran font konten chat",
-    },
-    FontFamily: {
-      Title: "Font Obrolan",
-      SubTitle:
-        "Font dari konten obrolan, biarkan kosong untuk menerapkan font default global",
-      Placeholder: "Nama Font",
-    },
-    InjectSystemPrompts: {
-      Title: "Suntikkan Petunjuk Sistem",
-      SubTitle:
-        "Tambahkan petunjuk simulasi sistem ChatGPT di awal daftar pesan yang diminta dalam setiap permintaan",
-    },
-    InputTemplate: {
-      Title: "Template Input",
-      SubTitle: "Pesan baru akan diisi menggunakan template ini",
-    },
-
-    Update: {
-      Version: (x: string) => `Version: ${x}`,
-      IsLatest: "Versi terbaru",
-      CheckUpdate: "Periksa Pembaruan",
-      IsChecking: "Memeriksa pembaruan...",
-      FoundUpdate: (x: string) => `Versi terbaru ditemukan: ${x}`,
-      GoToUpdate: "Perbarui Sekarang",
-    },
-    AutoGenerateTitle: {
-      Title: "Hasilkan Judul Otomatis",
-      SubTitle: "Hasilkan judul yang sesuai berdasarkan konten percakapan",
-    },
-    Sync: {
-      CloudState: "Pembaruan Terakhir",
-      NotSyncYet: "Belum disinkronkan",
-      Success: "Sinkronisasi Berhasil",
-      Fail: "Sinkronisasi Gagal",
-
-      Config: {
-        Modal: {
-          Title: "Konfigurasi Sinkronisasi",
-        },
-        SyncType: {
-          Title: "Tipe Sinkronisasi",
-          SubTitle: "Pilih layanan sinkronisasi favorit Anda",
-        },
-        Proxy: {
-          Title: "Aktifkan Proxy CORS",
-          SubTitle:
-            "Aktifkan Proxy untuk menghindari pembatasan atau pemblokiran lintas sumber",
-        },
-        ProxyUrl: {
-          Title: "Lokasi Titik Akhir Proxy CORS",
-          SubTitle: "Hanya berlaku untuk Proxy CORS bawaan untuk proyek ini",
-        },
-
-        WebDav: {
-          Endpoint: "Lokasi Titik Akhir WebDAV",
-          UserName: "User Pengguna",
-          Password: "Kata Sandi",
-        },
-      },
-    },
-    SendKey: "Kirim",
-    Theme: "Tema",
-    TightBorder: "Batas Ketat",
-    SendPreviewBubble: {
-      Title: "Pratinjau Obrolan",
-      SubTitle: "Pratinjau Obrolan dengan markdown",
-    },
-    Mask: {
-      Splash: {
-        Title: "Layar Pembuka Masks",
-        SubTitle:
-          "Tampilkan layar pembuka masks sebelum memulai percakapan baru",
-      },
-      Builtin: {
-        Title: "Sembunyikan Masks Bawaan",
-        SubTitle: "Sembunyikan Masks bawaan dari daftar masks",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Nonaktifkan Otomatisasi",
-        SubTitle: "Aktifkan/Matikan otomatisasi",
-      },
-      List: "Daftar Prompt",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} bawaan, ${custom} penggunaan khusus`,
-      Edit: "Edit",
-      Modal: {
-        Title: "Daftar Prompt",
-        Add: "Tambahkan",
-        Search: "Cari Prompt",
-      },
-      EditModal: {
-        Title: "Edit Prompt",
-      },
-    },
-    HistoryCount: {
-      Title: "Jumlah Pesan Riwayat",
-      SubTitle: "Jumlah pesan yang akan dikirim setiap permintaan",
-    },
-    CompressThreshold: {
-      Title: "Batas Kompresi Riwayat",
-      SubTitle:
-        "Jika panjang pesan melebihi batas yang ditentukan, pesan tersebut akan dikompresi",
-    },
-
-    Usage: {
-      Title: "Saldo Akun",
-      SubTitle(used: any, total: any) {
-        return `Digunakan bulan ini: ${used}, total langganan: ${total}`;
-      },
-      IsChecking: "Memeriksa...",
-      Check: "Periksa",
-      NoAccess: "Masukkan kunci API untuk memeriksa saldo",
-    },
-
-    Model: "Model",
-    Temperature: {
-      Title: "Suhu",
-      SubTitle: "Semakin tinggi nilainya, semakin acak keluarannya",
-    },
-    TopP: {
-      Title: "Top P",
-      SubTitle: "Tidak mengubah nilai dengan suhu",
-    },
-    MaxTokens: {
-      Title: "Token Maksimum",
-      SubTitle: "Panjang maksimum token input dan output",
-    },
-    PresencePenalty: {
-      Title: "Penalti Kehadiran",
-      SubTitle: "Semakin tinggi nilai, semakin mungkin topik baru muncul",
-    },
-    FrequencyPenalty: {
-      Title: "Penalti Frekuensi",
-      SubTitle:
-        "Semakin tinggi nilai, semakin rendah kemungkinan penggunaan ulang baris yang sama",
-    },
-  },
-  Store: {
-    DefaultTopic: "Percakapan Baru",
-    BotHello: "Halo! Bagaimana saya bisa membantu Anda hari ini?",
-    Error: "Terjadi kesalahan, silakan coba lagi nanti.",
-    Prompt: {
-      History: (content: string) =>
-        "Ini adalah ringkasan singkat dari riwayat percakapan: " + content,
-      Topic:
-        "Buat judul berisi empat hingga lima kata untuk percakapan kita yang tidak akan disertakan dalam ringkasan percakapan, seperti instruksi, format, kutipan, tanda baca awal, tanda kutip pendahuluan, atau karakter tambahan. Silakan coba dengan kutipan berakhir.",
-      Summarize:
-        "Buat ringkasan percakapan dalam 200 kata yang akan digunakan sebagai promp di masa depan.",
-    },
-  },
-  Copy: {
-    Success: "Tersalin ke clipboard",
-    Failed:
-      "Gagal menyalin, mohon berikan izin untuk mengakses clipboard atau Clipboard API tidak didukung (Tauri)",
-  },
-  Download: {
-    Success: "Konten berhasil diunduh ke direktori Anda.",
-    Failed: "Unduhan gagal.",
-  },
-  Context: {
-    Toast: (x: any) => `Dengan ${x} promp kontekstual`,
-    Edit: "Pengaturan Obrolan Saat Ini",
-    Add: "Tambahkan Promp",
-    Clear: "Bersihkan Konteks",
-    Revert: "Kembali ke Posisi Sebelumnya",
-  },
-  Plugin: {
-    Name: "Plugin",
-  },
-  FineTuned: {
-    Sysmessage: "Anda adalah asisten yang",
-  },
-  Mask: {
-    Name: "Masks",
-    Page: {
-      Title: "Template Promp",
-      SubTitle: (count: number) => `${count} template prompt`,
-      Search: "Cari template",
-      Create: "Buat",
-    },
-    Item: {
-      Info: (count: number) => `${count} prompt`,
-      Chat: "Obrolan",
-      View: "Lihat",
-      Edit: "Edit",
-      Delete: "Hapus",
-      DeleteConfirm: "Anda yakin ingin menghapus?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Edit Template Prompt ${readonly ? "(hanya baca)" : ""}`,
-      Download: "Unduh",
-      Clone: "Duplikat",
-    },
-    Config: {
-      Avatar: "Avatar Bot",
-      Name: "Nama Bot",
-      Sync: {
-        Title: "Gunakan Konfigurasi Global",
-        SubTitle: "Gunakan konfigurasi global dalam percakapan ini",
-        Confirm:
-          "Pastikan untuk mengganti konfigurasi kustom dengan konfigurasi global?",
-      },
-      HideContext: {
-        Title: "Sembunyikan Prompt Konteks",
-        SubTitle: "Tidak menampilkan prompt konteks dalam obrolan",
-      },
-      Share: {
-        Title: "Bagikan Masks Ini",
-        SubTitle: "Buat tautan untuk masks ini",
-        Action: "Salin Tautan",
-      },
-    },
-  },
-  NewChat: {
-    Return: "Kembali",
-    Skip: "Lewati",
-    Title: "Pilih Masks",
-    SubTitle: "Berkonversasilah dengan diri Anda di balik masks",
-    More: "Lebih Lanjut",
-    NotShow: "Jangan Tampilkan Sekarang",
-    ConfirmNoShow:
-      "Pastikan untuk menonaktifkannya? Anda dapat mengaktifkannya nanti melalui pengaturan.",
-  },
-
-  UI: {
-    Confirm: "Konfirmasi",
-    Cancel: "Batal",
-    Close: "Tutup",
-    Create: "Buat",
-    Edit: "Edit",
-  },
-  Exporter: {
-    Description: {
-      Title: "Hanya pesan setelah menghapus konteks yang akan ditampilkan",
-    },
-    Model: "Model",
-    Messages: "Pesan",
-    Topic: "Topik",
-    Time: "Tanggal & Waktu",
-  },
-  URLCommand: {
-    Code: "Kode akses terdeteksi dari url, konfirmasi untuk mendaftar ? ",
-    Settings: "Pengaturan terdeteksi dari url, konfirmasi untuk diterapkan ?",
-  },
-};
-
-export default id;

+ 0 - 49
app/locales/index.ts

@@ -1,22 +1,6 @@
 import cn from "./cn";
 import en from "./en";
-import pt from "./pt";
-import tw from "./tw";
-import id from "./id";
-import fr from "./fr";
-import es from "./es";
-import it from "./it";
-import tr from "./tr";
 import jp from "./jp";
-import de from "./de";
-import vi from "./vi";
-import ru from "./ru";
-import no from "./no";
-import cs from "./cs";
-import ko from "./ko";
-import ar from "./ar";
-import bn from "./bn";
-import sk from "./sk";
 import { merge } from "../utils/merge";
 
 import type { LocaleType } from "./cn";
@@ -25,23 +9,7 @@ export type { LocaleType, PartialLocaleType } from "./cn";
 const ALL_LANGS = {
   cn,
   en,
-  tw,
-  pt,
   jp,
-  ko,
-  id,
-  fr,
-  es,
-  it,
-  tr,
-  de,
-  vi,
-  ru,
-  cs,
-  no,
-  ar,
-  bn,
-  sk,
 };
 
 export type Lang = keyof typeof ALL_LANGS;
@@ -51,23 +19,7 @@ export const AllLangs = Object.keys(ALL_LANGS) as Lang[];
 export const ALL_LANG_OPTIONS: Record<Lang, string> = {
   cn: "简体中文",
   en: "English",
-  pt: "Português",
-  tw: "繁體中文",
   jp: "日本語",
-  ko: "한국어",
-  id: "Indonesia",
-  fr: "Français",
-  es: "Español",
-  it: "Italiano",
-  tr: "Türkçe",
-  de: "Deutsch",
-  vi: "Tiếng Việt",
-  ru: "Русский",
-  cs: "Čeština",
-  no: "Nynorsk",
-  ar: "العربية",
-  bn: "বাংলা",
-  sk: "Slovensky",
 };
 
 const LANG_KEY = "lang";
@@ -131,7 +83,6 @@ export function changeLang(lang: Lang) {
 export function getISOLang() {
   const isoLangString: Record<string, string> = {
     cn: "zh-Hans",
-    tw: "zh-Hant",
   };
 
   const lang = getLang();

+ 0 - 246
app/locales/it.ts

@@ -1,246 +0,0 @@
-import { SubmitKey } from "../store/config";
-import type { PartialLocaleType } from "./index";
-
-const it: PartialLocaleType = {
-  WIP: "Work in progress...",
-  Error: {
-    Unauthorized:
-      "Accesso non autorizzato, inserire il codice di accesso nella [pagina](/#/auth) delle impostazioni.",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} messaggi`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} messaggi con ChatGPT`,
-    Actions: {
-      ChatList: "Vai alla Chat List",
-      CompressedHistory: "Prompt di memoria della cronologia compressa",
-      Export: "Esportazione di tutti i messaggi come Markdown",
-      Copy: "Copia",
-      Stop: "Stop",
-      Retry: "Riprova",
-      Delete: "Delete",
-    },
-    Rename: "Rinomina Chat",
-    Typing: "Typing…",
-    Input: (submitKey: string) => {
-      var inputHints = `Scrivi qualcosa e premi ${submitKey} per inviare`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", premi Shift + Enter per andare a capo";
-      }
-      return inputHints;
-    },
-    Send: "Invia",
-    Config: {
-      Reset: "Reset to Default",
-      SaveAs: "Save as Mask",
-    },
-  },
-  Export: {
-    Title: "Tutti i messaggi",
-    Copy: "Copia tutto",
-    Download: "Scarica",
-    MessageFromYou: "Messaggio da te",
-    MessageFromChatGPT: "Messaggio da ChatGPT",
-  },
-  Memory: {
-    Title: "Prompt di memoria",
-    EmptyContent: "Vuoto.",
-    Copy: "Copia tutto",
-    Send: "Send Memory",
-    Reset: "Reset Session",
-    ResetConfirm:
-      "Ripristinare cancellerà la conversazione corrente e la cronologia di memoria. Sei sicuro che vuoi riavviare?",
-  },
-  Home: {
-    NewChat: "Nuova Chat",
-    DeleteChat: "Confermare la cancellazione della conversazione selezionata?",
-    DeleteToast: "Chat Cancellata",
-    Revert: "Revert",
-  },
-  Settings: {
-    Title: "Impostazioni",
-    SubTitle: "Tutte le impostazioni",
-
-    Lang: {
-      Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-      All: "Tutte le lingue",
-    },
-    Avatar: "Avatar",
-    FontSize: {
-      Title: "Dimensione carattere",
-      SubTitle: "Regolare la dimensione dei caratteri del contenuto della chat",
-    },
-    FontFamily: {
-      Title: "Font della Chat",
-      SubTitle:
-        "Carattere del contenuto della chat, lascia vuoto per applicare il carattere predefinito globale",
-      Placeholder: "Nome del Font",
-    },
-    InjectSystemPrompts: {
-      Title: "Inserisci Prompts di Sistema",
-      SubTitle:
-        "Aggiungi forzatamente un prompt di sistema simulato di ChatGPT all'inizio della lista dei messaggi per ogni richiesta",
-    },
-    Update: {
-      Version: (x: string) => `Versione: ${x}`,
-      IsLatest: "Ultima versione",
-      CheckUpdate: "Controlla aggiornamenti",
-      IsChecking: "Sto controllando gli aggiornamenti...",
-      FoundUpdate: (x: string) => `Trovata nuova versione: ${x}`,
-      GoToUpdate: "Aggiorna",
-    },
-    SendKey: "Tasto invia",
-    Theme: "Tema",
-    TightBorder: "Schermo intero",
-    SendPreviewBubble: {
-      Title: "Anteprima di digitazione",
-      SubTitle: "Preview markdown in bubble",
-    },
-    Mask: {
-      Splash: {
-        Title: "Mask Splash Screen",
-        SubTitle: "Show a mask splash screen before starting new chat",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Disabilita l'auto completamento",
-        SubTitle: "Input / per attivare il completamento automatico",
-      },
-      List: "Elenco dei suggerimenti",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} built-in, ${custom} user-defined`,
-      Edit: "Modifica",
-      Modal: {
-        Title: "Prompt List",
-        Add: "Add One",
-        Search: "Search Prompts",
-      },
-      EditModal: {
-        Title: "Edit Prompt",
-      },
-    },
-    HistoryCount: {
-      Title: "Conteggio dei messaggi allegati",
-      SubTitle: "Numero di messaggi inviati allegati per richiesta",
-    },
-    CompressThreshold: {
-      Title: "Soglia di compressione della cronologia",
-      SubTitle:
-        "Comprimerà se la lunghezza dei messaggi non compressi supera il valore",
-    },
-
-    Usage: {
-      Title: "Bilancio Account",
-      SubTitle(used: any, total: any) {
-        return `Attualmente usato in questo mese $${used}, soglia massima $${total}`;
-      },
-      IsChecking: "Controllando...",
-      Check: "Controlla ancora",
-      NoAccess: "Inserire la chiave API per controllare il saldo",
-    },
-
-    Model: "Modello GPT",
-    Temperature: {
-      Title: "Temperature",
-      SubTitle: "Un valore maggiore rende l'output più casuale",
-    },
-    MaxTokens: {
-      Title: "Token massimi",
-      SubTitle: "Lunghezza massima dei token in ingresso e dei token generati",
-    },
-    PresencePenalty: {
-      Title: "Penalità di presenza",
-      SubTitle:
-        "Un valore maggiore aumenta la probabilità di parlare di nuovi argomenti",
-    },
-    FrequencyPenalty: {
-      Title: "Penalità di frequenza",
-      SubTitle:
-        "Un valore maggiore che diminuisce la probabilità di ripetere la stessa riga",
-    },
-  },
-  Store: {
-    DefaultTopic: "Nuova conversazione",
-    BotHello: "Ciao, come posso aiutarti oggi?",
-    Error: "Qualcosa è andato storto, riprova più tardi.",
-    Prompt: {
-      History: (content: string) =>
-        "Questo è un riassunto della cronologia delle chat tra l'IA e l'utente:" +
-        content,
-      Topic:
-        "Si prega di generare un titolo di quattro o cinque parole che riassuma la nostra conversazione senza alcuna traccia, punteggiatura, virgolette, punti, simboli o testo aggiuntivo. Rimuovere le virgolette",
-      Summarize:
-        "Riassumi brevemente la nostra discussione in 200 caratteri o meno per usarla come spunto per una futura conversazione.",
-    },
-  },
-  Copy: {
-    Success: "Copiato sugli appunti",
-    Failed:
-      "Copia fallita, concedere l'autorizzazione all'accesso agli appunti",
-  },
-  Context: {
-    Toast: (x: any) => `Con ${x} prompts contestuali`,
-    Edit: "Prompt contestuali e di memoria",
-    Add: "Aggiungi altro",
-  },
-  Plugin: {
-    Name: "Plugin",
-  },
-  FineTuned: {
-    Sysmessage: "Sei un assistente che",
-  },
-  Mask: {
-    Name: "Mask",
-    Page: {
-      Title: "Prompt Template",
-      SubTitle: (count: number) => `${count} prompt templates`,
-      Search: "Search Templates",
-      Create: "Create",
-    },
-    Item: {
-      Info: (count: number) => `${count} prompts`,
-      Chat: "Chat",
-      View: "View",
-      Edit: "Edit",
-      Delete: "Delete",
-      DeleteConfirm: "Confirm to delete?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Edit Prompt Template ${readonly ? "(readonly)" : ""}`,
-      Download: "Download",
-      Clone: "Clone",
-    },
-    Config: {
-      Avatar: "Bot Avatar",
-      Name: "Bot Name",
-    },
-  },
-  NewChat: {
-    Return: "Return",
-    Skip: "Skip",
-    Title: "Pick a Mask",
-    SubTitle: "Chat with the Soul behind the Mask",
-    More: "Find More",
-    NotShow: "Not Show Again",
-    ConfirmNoShow: "Confirm to disable?You can enable it in settings later.",
-  },
-
-  UI: {
-    Confirm: "Confirm",
-    Cancel: "Cancel",
-    Close: "Close",
-    Create: "Create",
-    Edit: "Edit",
-  },
-  Exporter: {
-    Model: "Modello",
-    Messages: "Messaggi",
-    Topic: "Argomento",
-    Time: "Tempo",
-  },
-};
-
-export default it;

+ 0 - 242
app/locales/ko.ts

@@ -1,242 +0,0 @@
-import { SubmitKey } from "../store/config";
-
-import type { PartialLocaleType } from "./index";
-
-const ko: PartialLocaleType = {
-  WIP: "곧 출시 예정...",
-  Error: {
-    Unauthorized:
-      "권한이 없습니다. 설정 페이지에서 액세스 코드를 [입력하세요](/#/auth).",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count}개의 메시지`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `ChatGPT와의 ${count}개의 메시지`,
-    Actions: {
-      ChatList: "채팅 목록으로 이동",
-      CompressedHistory: "압축된 기억력 메모리 프롬프트",
-      Export: "모든 메시지를 Markdown으로 내보내기",
-      Copy: "복사",
-      Stop: "중지",
-      Retry: "다시 시도",
-      Delete: "삭제",
-    },
-    Rename: "채팅 이름 변경",
-    Typing: "입력 중...",
-    Input: (submitKey: string) => {
-      var inputHints = `${submitKey}를 눌러 보내기`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Shift + Enter로 줄 바꿈";
-      }
-      return inputHints + ", 프롬프트 검색을 위해 / 입력";
-    },
-    Send: "보내기",
-    Config: {
-      Reset: "기본값으로 재설정",
-      SaveAs: "마스크로 저장",
-    },
-  },
-  Export: {
-    Title: "모든 메시지",
-    Copy: "모두 복사",
-    Download: "다운로드",
-    MessageFromYou: "나의 메시지",
-    MessageFromChatGPT: "ChatGPT의 메시지",
-  },
-  Memory: {
-    Title: "기억 프롬프트",
-    EmptyContent: "아직 내용이 없습니다.",
-    Send: "기억 보내기",
-    Copy: "기억 복사",
-    Reset: "세션 재설정",
-    ResetConfirm:
-      "재설정하면 현재 대화 기록과 기억력이 삭제됩니다. 정말 재설정하시겠습니까?",
-  },
-  Home: {
-    NewChat: "새로운 채팅",
-    DeleteChat: "선택한 대화를 삭제하시겠습니까?",
-    DeleteToast: "채팅이 삭제되었습니다.",
-    Revert: "되돌리기",
-  },
-  Settings: {
-    Title: "설정",
-    SubTitle: "모든 설정",
-
-    Lang: {
-      Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-      All: "All Languages",
-    },
-    Avatar: "아바타",
-    FontSize: {
-      Title: "글꼴 크기",
-      SubTitle: "채팅 내용의 글꼴 크기 조정",
-    },
-    FontFamily: {
-      Title: "채팅 폰트",
-      SubTitle: "채팅 내용의 폰트, 비워 두면 글로벌 기본 폰트를 적용",
-      Placeholder: "폰트 이름",
-    },
-    InjectSystemPrompts: {
-      Title: "시스템 프롬프트 주입",
-      SubTitle:
-        "각 요청의 메시지 목록의 시작에 ChatGPT 시스템 프롬프트를 강제로 추가합니다",
-    },
-    Update: {
-      Version: (x: string) => `버전: ${x}`,
-      IsLatest: "최신 버전",
-      CheckUpdate: "업데이트 확인",
-      IsChecking: "업데이트 확인 중...",
-      FoundUpdate: (x: string) => `새 버전 발견: ${x}`,
-      GoToUpdate: "업데이트",
-    },
-    SendKey: "전송 키",
-    Theme: "테마",
-    TightBorder: "조밀한 테두리",
-    SendPreviewBubble: {
-      Title: "미리 보기 버블 전송",
-      SubTitle: "버블에서 마크다운 미리 보기",
-    },
-    Mask: {
-      Splash: {
-        Title: "마스크 시작 화면",
-        SubTitle: "새로운 채팅 시작 전에 마스크 시작 화면 표시",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "자동 완성 비활성화",
-        SubTitle: "자동 완성을 활성화하려면 /를 입력하세요.",
-      },
-      List: "프롬프트 목록",
-      ListCount: (builtin: number, custom: number) =>
-        `내장 ${builtin}개, 사용자 정의 ${custom}개`,
-      Edit: "편집",
-      Modal: {
-        Title: "프롬프트 목록",
-        Add: "추가",
-        Search: "프롬프트 검색",
-      },
-      EditModal: {
-        Title: "프롬프트 편집",
-      },
-    },
-    HistoryCount: {
-      Title: "첨부된 메시지 수",
-      SubTitle: "요청당 첨부된 전송된 메시지 수",
-    },
-    CompressThreshold: {
-      Title: "기록 압축 임계값",
-      SubTitle: "미압축 메시지 길이가 임계값을 초과하면 압축됨",
-    },
-
-    Usage: {
-      Title: "계정 잔액",
-      SubTitle(used: any, total: any) {
-        return `이번 달 사용액 ${used}, 구독액 ${total}`;
-      },
-      IsChecking: "확인 중...",
-      Check: "확인",
-      NoAccess: "잔액 확인을 위해 API 키를 입력하세요.",
-    },
-
-    Model: "모델",
-    Temperature: {
-      Title: "온도 (temperature)",
-      SubTitle: "값이 클수록 더 무작위한 출력이 생성됩니다.",
-    },
-    MaxTokens: {
-      Title: "최대 토큰 수 (max_tokens)",
-      SubTitle: "입력 토큰과 생성된 토큰의 최대 길이",
-    },
-    PresencePenalty: {
-      Title: "존재 페널티 (presence_penalty)",
-      SubTitle: "값이 클수록 새로운 주제에 대해 대화할 가능성이 높아집니다.",
-    },
-    FrequencyPenalty: {
-      Title: "빈도 페널티(frequency penalty)",
-      SubTitle: "값이 클수록 같은 줄이 반복될 가능성이 줄어듭니다.",
-    },
-  },
-  Store: {
-    DefaultTopic: "새 대화",
-    BotHello: "안녕하세요! 오늘 도움이 필요하신가요?",
-    Error: "문제가 발생했습니다. 나중에 다시 시도해주세요.",
-    Prompt: {
-      History: (content: string) =>
-        "이것은 AI와 사용자 간의 대화 기록을 요약한 내용입니다: " + content,
-      Topic:
-        "다음과 같이 대화 내용을 요약하는 4~5단어 제목을 생성해주세요. 따옴표, 구두점, 인용부호, 기호 또는 추가 텍스트를 제거하십시오. 따옴표로 감싸진 부분을 제거하십시오.",
-      Summarize:
-        "200단어 이내로 저희 토론을 간략히 요약하여 앞으로의 맥락으로 사용할 수 있는 프롬프트로 만들어주세요.",
-    },
-  },
-  Copy: {
-    Success: "클립보드에 복사되었습니다.",
-    Failed: "복사 실패, 클립보드 접근 권한을 허용해주세요.",
-  },
-  Context: {
-    Toast: (x: any) => `컨텍스트 프롬프트 ${x}개 사용`,
-    Edit: "컨텍스트 및 메모리 프롬프트",
-    Add: "프롬프트 추가",
-  },
-  Plugin: {
-    Name: "플러그인",
-  },
-  FineTuned: {
-    Sysmessage: "당신은 어시스턴트입니다",
-  },
-  Mask: {
-    Name: "마스크",
-    Page: {
-      Title: "프롬프트 템플릿",
-      SubTitle: (count: number) => `${count}개의 프롬프트 템플릿`,
-      Search: "템플릿 검색",
-      Create: "생성",
-    },
-    Item: {
-      Info: (count: number) => `${count}개의 프롬프롬프트`,
-      Chat: "채팅",
-      View: "보기",
-      Edit: "편집",
-      Delete: "삭제",
-      DeleteConfirm: "삭제하시겠습니까?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `프롬프트 템플릿 편집 ${readonly ? "(읽기 전용)" : ""}`,
-      Download: "다운로드",
-      Clone: "복제",
-    },
-    Config: {
-      Avatar: "봇 아바타",
-      Name: "봇 이름",
-    },
-  },
-  NewChat: {
-    Return: "돌아가기",
-    Skip: "건너뛰기",
-    Title: "마스크 선택",
-    SubTitle: "마스크 뒤의 영혼과 대화하세요",
-    More: "더 보기",
-    NotShow: "다시 표시하지 않음",
-    ConfirmNoShow:
-      "비활성화하시겠습니까? 나중에 설정에서 다시 활성화할 수 있습니다.",
-  },
-
-  UI: {
-    Confirm: "확인",
-    Cancel: "취소",
-    Close: "닫기",
-    Create: "생성",
-    Edit: "편집",
-  },
-  Exporter: {
-    Model: "모델",
-    Messages: "메시지",
-    Topic: "주제",
-    Time: "시간",
-  },
-};
-
-export default ko;

+ 0 - 167
app/locales/no.ts

@@ -1,167 +0,0 @@
-import { SubmitKey } from "../store/config";
-import type { PartialLocaleType } from "./index";
-
-const no: PartialLocaleType = {
-  WIP: "Arbeid pågår ...",
-  Error: {
-    Unauthorized:
-      "Du har ikke tilgang. [Vennlig oppgi tildelt adgangskode](/#/auth).",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} meldinger`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} meldinger med ChatGPT`,
-    Actions: {
-      ChatList: "Gå til chatlisten",
-      CompressedHistory: "Komprimert historikk for instrukser",
-      Export: "Eksporter alle meldinger i markdown-format",
-      Copy: "Kopier",
-      Stop: "Stopp",
-      Retry: "Prøv igjen",
-      Delete: "Slett",
-    },
-    Rename: "Gi nytt navn",
-    Typing: "Skriver …",
-    Input: (submitKey: string) => {
-      var inputHints = `${submitKey} for å sende`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Shift + Enter for å omgi";
-      }
-      return inputHints + ", / for å søke instrukser";
-    },
-    Send: "Send",
-  },
-  Export: {
-    Title: "Alle meldinger",
-    Copy: "Kopiere alle",
-    Download: "Last ned",
-    MessageFromYou: "Melding fra deg",
-    MessageFromChatGPT: "Melding fra ChatGPT",
-  },
-  Memory: {
-    Title: "Minneinstruks",
-    EmptyContent: "Ingen sålant.",
-    Send: "Send minne",
-    Copy: "Kopiere minne",
-    Reset: "Nulstill sesjon",
-    ResetConfirm:
-      "Om du nillstiller vil du slette hele historikken. Er du sikker på at du vil nullstille?",
-  },
-  Home: {
-    NewChat: "Ny chat",
-    DeleteChat: "Bekreft for å slette det valgte dialogen",
-    DeleteToast: "Samtale slettet",
-    Revert: "Tilbakestill",
-  },
-  Settings: {
-    Title: "Innstillinger",
-    SubTitle: "Alle innstillinger",
-
-    Lang: {
-      Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-    },
-    Avatar: "Avatar",
-    FontSize: {
-      Title: "Fontstørrelsen",
-      SubTitle: "Juster fontstørrelsen for samtaleinnholdet.",
-    },
-    FontFamily: {
-      Title: "Chat-skrifttype",
-      SubTitle:
-        "Skrifttypen for chatinnhold, la stå tom for å bruke global standardskrifttype",
-      Placeholder: "Skriftnavn",
-    },
-    InjectSystemPrompts: {
-      Title: "Sett inn systemprompter",
-      SubTitle:
-        "Tving tillegg av en simulert ChatGPT-systemprompt i begynnelsen av meldingslisten for hver forespørsel",
-    },
-    Update: {
-      Version: (x: string) => `Versjon: ${x}`,
-      IsLatest: "Siste versjon",
-      CheckUpdate: "Se etter oppdatering",
-      IsChecking: "Ser etter oppdatering ...",
-      FoundUpdate: (x: string) => `Fant ny versjon: ${x}`,
-      GoToUpdate: "Oppdater",
-    },
-    SendKey: "Send nøkkel",
-    Theme: "Tema",
-    TightBorder: "Stram innramming",
-    Prompt: {
-      Disable: {
-        Title: "Skru av autofullfør",
-        SubTitle: "Skriv / for å trigge autofullfør",
-      },
-      List: "Instruksliste",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} innebygde, ${custom} brukerdefinerte`,
-      Edit: "Endre",
-      Modal: {
-        Title: "Instruksliste",
-        Add: "Legg til",
-        Search: "Søk instrukser",
-      },
-    },
-    HistoryCount: {
-      Title: "Tall på tilhørende meldinger",
-      SubTitle: "Antall sendte meldinger tilknyttet hver spørring",
-    },
-    CompressThreshold: {
-      Title: "Terskeverdi for komprimering av historikk",
-      SubTitle:
-        "Komprimer dersom ikke-komprimert lengde på meldinger overskrider denne verdien",
-    },
-
-    Usage: {
-      Title: "Saldo for konto",
-      SubTitle(used: any, total: any) {
-        return `Brukt denne måneden $${used}, abonnement $${total}`;
-      },
-      IsChecking: "Sjekker ...",
-      Check: "Sjekk",
-      NoAccess: "Skriv inn API-nøkkelen for å sjekke saldo",
-    },
-
-    Model: "Model",
-    Temperature: {
-      Title: "Temperatur",
-      SubTitle: "Høyere verdi gir mer kreative svar",
-    },
-    MaxTokens: {
-      Title: "Maks tokens",
-      SubTitle: "Maksimum lengde på tokens for instrukser og svar",
-    },
-  },
-  Store: {
-    DefaultTopic: "Ny samtale",
-    BotHello: "Hei! Hva kan jeg hjelpe deg med i dag?",
-    Error: "Noe gikk galt, vennligst prøv igjen senere.",
-    Prompt: {
-      History: (content: string) =>
-        "Dette er et sammendrag av chatthistorikken mellom AI-en og brukeren som en oppsummering: " +
-        content,
-      Topic:
-        "Vennligst lag en fire til fem ords tittel som oppsummerer samtalen vår uten innledning, punktsetting, anførselstegn, punktum, symboler eller tillegg tekst. Fjern innrammende anførselstegn.",
-      Summarize:
-        "Oppsummer diskusjonen vår kort i 200 ord eller mindre for å bruke som en oppfordring til fremtidig sammenheng.",
-    },
-  },
-  Copy: {
-    Success: "Kopiert til utklippstavle",
-    Failed: "Kopiering feilet. Vennligst gi tilgang til utklippstavlen.",
-  },
-  Context: {
-    Toast: (x: any) => `Med ${x} kontekstuelle instrukser`,
-    Edit: "Kontekstuelle -og minneinstrukser",
-    Add: "Legg til",
-  },
-  Exporter: {
-    Model: "Model",
-    Messages: "Meldingar",
-    Topic: "Emne",
-    Time: "Tid",
-  },
-};
-
-export default no;

+ 0 - 489
app/locales/pt.ts

@@ -1,489 +0,0 @@
-import { SubmitKey } from "../store/config";
-import { PartialLocaleType } from "../locales/index";
-import { getClientConfig } from "../config/client";
-
-const isApp = !!getClientConfig()?.isApp;
-
-const pt: PartialLocaleType = {
-  WIP: "Em breve...",
-  Error: {
-    Unauthorized: isApp
-      ? "Chave API inválida, por favor verifique em [Configurações](/#/settings)."
-      : "Acesso não autorizado, por favor insira o código de acesso em [auth](/#/auth) ou insira sua Chave API OpenAI.",
-  },
-  Auth: {
-    Title: "Necessário Código de Acesso",
-    Tips: "Por favor, insira o código de acesso abaixo",
-    SubTips: "Ou insira sua Chave API OpenAI",
-    Input: "código de acesso",
-    Confirm: "Confirmar",
-    Later: "Depois",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} mensagens`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} mensagens`,
-    EditMessage: {
-      Title: "Editar Todas as Mensagens",
-      Topic: {
-        Title: "Tópico",
-        SubTitle: "Mudar o tópico atual",
-      },
-    },
-    Actions: {
-      ChatList: "Ir Para Lista de Chat",
-      CompressedHistory: "Prompt de Memória Histórica Comprimida",
-      Export: "Exportar Todas as Mensagens como Markdown",
-      Copy: "Copiar",
-      Stop: "Parar",
-      Retry: "Tentar Novamente",
-      Pin: "Fixar",
-      PinToastContent: "Fixada 1 mensagem para prompts contextuais",
-      PinToastAction: "Visualizar",
-      Delete: "Deletar",
-      Edit: "Editar",
-    },
-    Commands: {
-      new: "Iniciar um novo chat",
-      newm: "Iniciar um novo chat com máscara",
-      next: "Próximo Chat",
-      prev: "Chat Anterior",
-      clear: "Limpar Contexto",
-      del: "Deletar Chat",
-    },
-    InputActions: {
-      Stop: "Parar",
-      ToBottom: "Para o Mais Recente",
-      Theme: {
-        auto: "Automático",
-        light: "Tema Claro",
-        dark: "Tema Escuro",
-      },
-      Prompt: "Prompts",
-      Masks: "Máscaras",
-      Clear: "Limpar Contexto",
-      Settings: "Configurações",
-    },
-    Rename: "Renomear Chat",
-    Typing: "Digitando…",
-    Input: (submitKey: string) => {
-      var inputHints = `${submitKey} para enviar`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Shift + Enter para quebrar linha";
-      }
-      return inputHints + ", / para buscar prompts, : para usar comandos";
-    },
-    Send: "Enviar",
-    Config: {
-      Reset: "Redefinir para Padrão",
-      SaveAs: "Salvar como Máscara",
-    },
-    IsContext: "Prompt Contextual",
-  },
-  Export: {
-    Title: "Exportar Mensagens",
-    Copy: "Copiar Tudo",
-    Download: "Baixar",
-    MessageFromYou: "Mensagem De Você",
-    MessageFromChatGPT: "Mensagem De ChatGPT",
-    Share: "Compartilhar para ShareGPT",
-    Format: {
-      Title: "Formato de Exportação",
-      SubTitle: "Markdown ou Imagem PNG",
-    },
-    IncludeContext: {
-      Title: "Incluindo Contexto",
-      SubTitle: "Exportar prompts de contexto na máscara ou não",
-    },
-    Steps: {
-      Select: "Selecionar",
-      Preview: "Pré-visualizar",
-    },
-    Image: {
-      Toast: "Capturando Imagem...",
-      Modal:
-        "Pressione longamente ou clique com o botão direito para salvar a imagem",
-    },
-  },
-  Select: {
-    Search: "Buscar",
-    All: "Selecionar Tudo",
-    Latest: "Selecionar Mais Recente",
-    Clear: "Limpar",
-  },
-  Memory: {
-    Title: "Prompt de Memória",
-    EmptyContent: "Nada ainda.",
-    Send: "Enviar Memória",
-    Copy: "Copiar Memória",
-    Reset: "Resetar Sessão",
-    ResetConfirm:
-      "Resetar irá limpar o histórico de conversa atual e a memória histórica. Você tem certeza que quer resetar?",
-  },
-  Home: {
-    NewChat: "Novo Chat",
-    DeleteChat: "Confirmar para deletar a conversa selecionada?",
-    DeleteToast: "Chat Deletado",
-    Revert: "Reverter",
-  },
-  Settings: {
-    Title: "Configurações",
-    SubTitle: "Todas as Configurações",
-    Danger: {
-      Reset: {
-        Title: "Resetar Todas as Configurações",
-        SubTitle: "Resetar todos os itens de configuração para o padrão",
-        Action: "Resetar",
-        Confirm: "Confirmar para resetar todas as configurações para o padrão?",
-      },
-      Clear: {
-        Title: "Limpar Todos os Dados",
-        SubTitle: "Limpar todas as mensagens e configurações",
-        Action: "Limpar",
-        Confirm: "Confirmar para limpar todas as mensagens e configurações?",
-      },
-    },
-    Lang: {
-      Name: "Language",
-      All: "Todos os Idiomas",
-    },
-    Avatar: "Avatar",
-    FontSize: {
-      Title: "Tamanho da Fonte",
-      SubTitle: "Ajustar o tamanho da fonte do conteúdo do chat",
-    },
-    FontFamily: {
-      Title: "Fonte do Chat",
-      SubTitle:
-        "Fonte do conteúdo do chat, deixe vazio para aplicar a fonte padrão global",
-      Placeholder: "Nome da Fonte",
-    },
-    InjectSystemPrompts: {
-      Title: "Inserir Prompts de Sistema",
-      SubTitle: "Inserir um prompt de sistema global para cada requisição",
-    },
-    InputTemplate: {
-      Title: "Modelo de Entrada",
-      SubTitle: "A mensagem mais recente será preenchida neste modelo",
-    },
-
-    Update: {
-      Version: (x: string) => `Versão: ${x}`,
-      IsLatest: "Última versão",
-      CheckUpdate: "Verificar Atualização",
-      IsChecking: "Verificando atualização...",
-      FoundUpdate: (x: string) => `Nova versão encontrada: ${x}`,
-      GoToUpdate: "Atualizar",
-    },
-    SendKey: "Tecla de Envio",
-    Theme: "Tema",
-    TightBorder: "Borda Ajustada",
-    SendPreviewBubble: {
-      Title: "Bolha de Pré-visualização de Envio",
-      SubTitle: "Pré-visualizar markdown na bolha",
-    },
-    AutoGenerateTitle: {
-      Title: "Gerar Título Automaticamente",
-      SubTitle: "Gerar um título adequado baseado no conteúdo da conversa",
-    },
-    Sync: {
-      CloudState: "Última Atualização",
-      NotSyncYet: "Ainda não sincronizado",
-      Success: "Sincronização bem sucedida",
-      Fail: "Falha na sincronização",
-
-      Config: {
-        Modal: {
-          Title: "Configurar Sincronização",
-          Check: "Verificar Conexão",
-        },
-        SyncType: {
-          Title: "Tipo de Sincronização",
-          SubTitle: "Escolha seu serviço de sincronização favorito",
-        },
-        Proxy: {
-          Title: "Habilitar Proxy CORS",
-          SubTitle: "Habilitar um proxy para evitar restrições de cross-origin",
-        },
-        ProxyUrl: {
-          Title: "Endpoint de Proxy",
-          SubTitle: "Apenas aplicável ao proxy CORS embutido para este projeto",
-        },
-
-        WebDav: {
-          Endpoint: "Endpoint WebDAV",
-          UserName: "Nome de Usuário",
-          Password: "Senha",
-        },
-
-        UpStash: {
-          Endpoint: "URL REST Redis UpStash",
-          UserName: "Nome do Backup",
-          Password: "Token REST Redis UpStash",
-        },
-      },
-
-      LocalState: "Dados Locais",
-      Overview: (overview: any) => {
-        return `${overview.chat} chats,${overview.message} mensagens,${overview.prompt} prompts,${overview.mask} máscaras`;
-      },
-      ImportFailed: "Falha ao importar do arquivo",
-    },
-    Mask: {
-      Splash: {
-        Title: "Tela de Início da Máscara",
-        SubTitle:
-          "Mostrar uma tela de início da máscara antes de iniciar novo chat",
-      },
-      Builtin: {
-        Title: "Esconder Máscaras Embutidas",
-        SubTitle: "Esconder máscaras embutidas na lista de máscaras",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Desabilitar auto-completar",
-        SubTitle: "Digite / para acionar auto-completar",
-      },
-      List: "Lista de Prompts",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} embutidos, ${custom} definidos pelo usuário`,
-      Edit: "Editar",
-      Modal: {
-        Title: "Lista de Prompts",
-        Add: "Adicionar Um",
-        Search: "Buscar Prompts",
-      },
-      EditModal: {
-        Title: "Editar Prompt",
-      },
-    },
-    HistoryCount: {
-      Title: "Contagem de Mensagens Anexadas",
-      SubTitle: "Número de mensagens enviadas anexadas por requisição",
-    },
-    CompressThreshold: {
-      Title: "Limite de Compressão de Histórico",
-      SubTitle:
-        "Irá comprimir se o comprimento das mensagens não comprimidas exceder o valor",
-    },
-
-    Usage: {
-      Title: "Saldo da Conta",
-      SubTitle(used: any, total: any) {
-        return `Usado este mês ${used}, assinatura ${total}`;
-      },
-      IsChecking: "Verificando...",
-      Check: "Verificar",
-      NoAccess: "Insira a Chave API para verificar o saldo",
-    },
-    Access: {
-      AccessCode: {
-        Title: "Código de Acesso",
-        SubTitle: "Controle de Acesso Habilitado",
-        Placeholder: "Insira o Código",
-      },
-      CustomEndpoint: {
-        Title: "Endpoint Personalizado",
-        SubTitle: "Use serviço personalizado Azure ou OpenAI",
-      },
-      Provider: {
-        Title: "Provedor do Modelo",
-        SubTitle: "Selecione Azure ou OpenAI",
-      },
-      OpenAI: {
-        ApiKey: {
-          Title: "Chave API OpenAI",
-          SubTitle: "Usar Chave API OpenAI personalizada",
-          Placeholder: "sk-xxx",
-        },
-
-        Endpoint: {
-          Title: "Endpoint OpenAI",
-          SubTitle:
-            "Deve começar com http(s):// ou usar /api/openai como padrão",
-        },
-      },
-      Azure: {
-        ApiKey: {
-          Title: "Chave API Azure",
-          SubTitle: "Verifique sua chave API do console Azure",
-          Placeholder: "Chave API Azure",
-        },
-
-        Endpoint: {
-          Title: "Endpoint Azure",
-          SubTitle: "Exemplo: ",
-        },
-
-        ApiVerion: {
-          Title: "Versão API Azure",
-          SubTitle: "Verifique sua versão API do console Azure",
-        },
-      },
-      Anthropic: {
-        ApiKey: {
-          Title: "Chave API Anthropic",
-          SubTitle: "Verifique sua chave API do console Anthropic",
-          Placeholder: "Chave API Anthropic",
-        },
-
-        Endpoint: {
-          Title: "Endpoint Address",
-          SubTitle: "Exemplo: ",
-        },
-
-        ApiVerion: {
-          Title: "Versão API (Versão api claude)",
-          SubTitle: "Verifique sua versão API do console Anthropic",
-        },
-      },
-      CustomModel: {
-        Title: "Modelos Personalizados",
-        SubTitle: "Opções de modelo personalizado, separados por vírgula",
-      },
-    },
-
-    Model: "Modelo",
-    Temperature: {
-      Title: "Temperatura",
-      SubTitle: "Um valor maior torna a saída mais aleatória",
-    },
-    TopP: {
-      Title: "Top P",
-      SubTitle: "Não altere este valor junto com a temperatura",
-    },
-    MaxTokens: {
-      Title: "Máximo de Tokens",
-      SubTitle: "Comprimento máximo de tokens de entrada e tokens gerados",
-    },
-    PresencePenalty: {
-      Title: "Penalidade de Presença",
-      SubTitle:
-        "Um valor maior aumenta a probabilidade de falar sobre novos tópicos",
-    },
-    FrequencyPenalty: {
-      Title: "Penalidade de Frequência",
-      SubTitle:
-        "Um valor maior diminui a probabilidade de repetir a mesma linha",
-    },
-  },
-  Store: {
-    DefaultTopic: "Nova Conversa",
-    BotHello: "Olá! Como posso ajudá-lo hoje?",
-    Error: "Algo deu errado, por favor tente novamente mais tarde.",
-    Prompt: {
-      History: (content: string) =>
-        "Este é um resumo do histórico de chat como um recapitulativo: " +
-        content,
-      Topic:
-        "Por favor, gere um título de quatro a cinco palavras resumindo nossa conversa sem qualquer introdução, pontuação, aspas, períodos, símbolos ou texto adicional. Remova as aspas que o envolvem.",
-      Summarize:
-        "Resuma a discussão brevemente em 200 palavras ou menos para usar como um prompt para o contexto futuro.",
-    },
-  },
-  Copy: {
-    Success: "Copiado para a área de transferência",
-    Failed:
-      "Falha na cópia, por favor conceda permissão para acessar a área de transferência",
-  },
-  Download: {
-    Success: "Conteúdo baixado para seu diretório.",
-    Failed: "Falha no download.",
-  },
-  Context: {
-    Toast: (x: any) => `Com ${x} prompts contextuais`,
-    Edit: "Configurações do Chat Atual",
-    Add: "Adicionar um Prompt",
-    Clear: "Contexto Limpo",
-    Revert: "Reverter",
-  },
-  Plugin: {
-    Name: "Plugin",
-  },
-  FineTuned: {
-    Sysmessage: "Você é um assistente que",
-  },
-  Mask: {
-    Name: "Máscara",
-    Page: {
-      Title: "Template de Prompt",
-      SubTitle: (count: number) => `${count} templates de prompt`,
-      Search: "Buscar Templates",
-      Create: "Criar",
-    },
-    Item: {
-      Info: (count: number) => `${count} prompts`,
-      Chat: "Chat",
-      View: "Visualizar",
-      Edit: "Editar",
-      Delete: "Deletar",
-      DeleteConfirm: "Confirmar para deletar?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Editar Template de Prompt ${readonly ? "(somente leitura)" : ""}`,
-      Download: "Baixar",
-      Clone: "Clonar",
-    },
-    Config: {
-      Avatar: "Avatar do Bot",
-      Name: "Nome do Bot",
-      Sync: {
-        Title: "Usar Configuração Global",
-        SubTitle: "Usar configuração global neste chat",
-        Confirm:
-          "Confirmar para substituir a configuração personalizada pela configuração global?",
-      },
-      HideContext: {
-        Title: "Esconder Prompts de Contexto",
-        SubTitle: "Não mostrar prompts de contexto no chat",
-      },
-      Share: {
-        Title: "Compartilhar Esta Máscara",
-        SubTitle: "Gerar um link para esta máscara",
-        Action: "Copiar Link",
-      },
-    },
-  },
-  NewChat: {
-    Return: "Retornar",
-    Skip: "Apenas Começar",
-    Title: "Escolher uma Máscara",
-    SubTitle: "Converse com a Alma por trás da Máscara",
-    More: "Encontre Mais",
-    NotShow: "Nunca Mostrar Novamente",
-    ConfirmNoShow:
-      "Confirmar para desabilitar?Você pode habilitar nas configurações depois.",
-  },
-
-  UI: {
-    Confirm: "Confirmar",
-    Cancel: "Cancelar",
-    Close: "Fechar",
-    Create: "Criar",
-    Edit: "Editar",
-    Export: "Exportar",
-    Import: "Importar",
-    Sync: "Sincronizar",
-    Config: "Configurar",
-  },
-  Exporter: {
-    Description: {
-      Title: "Apenas mensagens após a limpeza do contexto serão exibidas",
-    },
-    Model: "Modelo",
-    Messages: "Mensagens",
-    Topic: "Tópico",
-    Time: "Tempo",
-  },
-
-  URLCommand: {
-    Code: "Código de acesso detectado a partir da url, confirmar para aplicar? ",
-    Settings:
-      "Configurações detectadas a partir da url, confirmar para aplicar?",
-  },
-};
-
-export default pt;

+ 0 - 250
app/locales/ru.ts

@@ -1,250 +0,0 @@
-import { SubmitKey } from "../store/config";
-import type { PartialLocaleType } from "./index";
-
-const ru: PartialLocaleType = {
-  WIP: "Скоро...",
-  Error: {
-    Unauthorized:
-      "Несанкционированный доступ. Пожалуйста, введите код доступа на [странице](/#/auth) настроек.",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} сообщений`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} сообщений с ChatGPT`,
-    Actions: {
-      ChatList: "Перейти к списку чатов",
-      CompressedHistory: "Сжатая история памяти",
-      Export: "Экспортировать все сообщения в формате Markdown",
-      Copy: "Копировать",
-      Stop: "Остановить",
-      Retry: "Повторить",
-      Delete: "Удалить",
-    },
-    Rename: "Переименовать чат",
-    Typing: "Печатает…",
-    Input: (submitKey: string) => {
-      var inputHints = `${submitKey} для отправки сообщения`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Shift + Enter для переноса строки";
-      }
-      return inputHints + ", / для поиска подсказок";
-    },
-    Send: "Отправить",
-    Config: {
-      Reset: "Сбросить настройки",
-      SaveAs: "Сохранить как маску",
-    },
-  },
-  Export: {
-    Title: "Все сообщения",
-    Copy: "Копировать все",
-    Download: "Скачать",
-    MessageFromYou: "Сообщение от вас",
-    MessageFromChatGPT: "Сообщение от ChatGPT",
-  },
-  Memory: {
-    Title: "Память",
-    EmptyContent: "Пусто.",
-    Send: "Отправить память",
-    Copy: "Копировать память",
-    Reset: "Сбросить сессию",
-    ResetConfirm:
-      "При сбросе текущая история переписки и историческая память будут удалены. Вы уверены, что хотите сбросить?",
-  },
-  Home: {
-    NewChat: "Новый чат",
-    DeleteChat: "Вы действительно хотите удалить выбранный разговор?",
-    DeleteToast: "Чат удален",
-    Revert: "Отмена",
-  },
-  Settings: {
-    Title: "Настройки",
-    SubTitle: "Все настройки",
-
-    Lang: {
-      Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-      All: "Все языки",
-    },
-    Avatar: "Аватар",
-    FontSize: {
-      Title: "Размер шрифта",
-      SubTitle: "Настроить размер шрифта контента чата",
-    },
-    FontFamily: {
-      Title: "Шрифт чата",
-      SubTitle:
-        "Шрифт содержимого чата, оставьте пустым для применения глобального шрифта по умолчанию",
-      Placeholder: "Название шрифта",
-    },
-    InjectSystemPrompts: {
-      Title: "Вставить системные подсказки",
-      SubTitle:
-        "Принудительно добавить симулированную системную подсказку ChatGPT в начало списка сообщений для каждого запроса",
-    },
-    Update: {
-      Version: (x: string) => `Версия: ${x}`,
-      IsLatest: "Последняя версия",
-      CheckUpdate: "Проверить обновление",
-      IsChecking: "Проверка обновления...",
-      FoundUpdate: (x: string) => `Найдена новая версия: ${x}`,
-      GoToUpdate: "Обновить",
-    },
-    SendKey: "Клавиша отправки",
-    Theme: "Тема",
-    TightBorder: "Узкая граница",
-    SendPreviewBubble: {
-      Title: "Отправить предпросмотр",
-      SubTitle: "Предварительный просмотр markdown в пузыре",
-    },
-    Mask: {
-      Splash: {
-        Title: "Экран заставки маски",
-        SubTitle: "Показывать экран заставки маски перед началом нового чата",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Отключить автозаполнение",
-        SubTitle: "Ввод / для запуска автозаполнения",
-      },
-      List: "Список подсказок",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} встроенных, ${custom} пользовательских`,
-      Edit: "Редактировать",
-      Modal: {
-        Title: "Список подсказок",
-        Add: "Добавить",
-        Search: "Поиск подсказок",
-      },
-      EditModal: {
-        Title: "Редактировать подсказку",
-      },
-    },
-    HistoryCount: {
-      Title: "Количество прикрепляемых сообщений",
-      SubTitle:
-        "Количество отправляемых сообщений, прикрепляемых к каждому запросу",
-    },
-    CompressThreshold: {
-      Title: "Порог сжатия истории",
-      SubTitle:
-        "Будет сжимать, если длина несжатых сообщений превышает указанное значение",
-    },
-
-    Usage: {
-      Title: "Баланс аккаунта",
-      SubTitle(used: any, total: any) {
-        return `Использовано в этом месяце $${used}, подписка $${total}`;
-      },
-      IsChecking: "Проверка...",
-      Check: "Проверить",
-      NoAccess: "Введите API ключ, чтобы проверить баланс",
-    },
-
-    Model: "Модель",
-    Temperature: {
-      Title: "Температура",
-      SubTitle: "Чем выше значение, тем более случайный вывод",
-    },
-    MaxTokens: {
-      Title: "Максимальное количество токенов",
-      SubTitle: "Максимальная длина вводных и генерируемых токенов",
-    },
-    PresencePenalty: {
-      Title: "Штраф за повторения",
-      SubTitle:
-        "Чем выше значение, тем больше вероятность общения на новые темы",
-    },
-    FrequencyPenalty: {
-      Title: "Штраф за частоту",
-      SubTitle:
-        "Большее значение снижает вероятность повторения одной и той же строки",
-    },
-  },
-  Store: {
-    DefaultTopic: "Новый разговор",
-    BotHello: "Здравствуйте! Как я могу вам помочь сегодня?",
-    Error: "Что-то пошло не так. Пожалуйста, попробуйте еще раз позже.",
-    Prompt: {
-      History: (content: string) =>
-        "Это краткое содержание истории чата между ИИ и пользователем: " +
-        content,
-      Topic:
-        "Пожалуйста, создайте заголовок из четырех или пяти слов, который кратко описывает нашу беседу, без введения, знаков пунктуации, кавычек, точек, символов или дополнительного текста. Удалите кавычки.",
-      Summarize:
-        "Кратко изложите нашу дискуссию в 200 словах или менее для использования в будущем контексте.",
-    },
-  },
-  Copy: {
-    Success: "Скопировано в буфер обмена",
-    Failed:
-      "Не удалось скопировать, пожалуйста, предоставьте разрешение на доступ к буферу обмена",
-  },
-  Context: {
-    Toast: (x: any) => `С ${x} контекстными подсказками`,
-    Edit: "Контекстные и памятные подсказки",
-    Add: "Добавить подсказку",
-  },
-  Plugin: {
-    Name: "Плагин",
-  },
-  FineTuned: {
-    Sysmessage: "Вы - ассистент, который",
-  },
-  Mask: {
-    Name: "Маска",
-    Page: {
-      Title: "Шаблон подсказки",
-      SubTitle: (count: number) => `${count} шаблонов подсказок`,
-      Search: "Поиск шаблонов",
-      Create: "Создать",
-    },
-    Item: {
-      Info: (count: number) => `${count} подсказок`,
-      Chat: "Чат",
-      View: "Просмотр",
-      Edit: "Редактировать",
-      Delete: "Удалить",
-      DeleteConfirm: "Подтвердить удаление?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Редактирование шаблона подсказки ${
-          readonly ? "(только для чтения)" : ""
-        }`,
-      Download: "Скачать",
-      Clone: "Клонировать",
-    },
-    Config: {
-      Avatar: "Аватар бота",
-      Name: "Имя бота",
-    },
-  },
-  NewChat: {
-    Return: "Вернуться",
-    Skip: "Пропустить",
-    Title: "Выберите маску",
-    SubTitle: "Общайтесь с душой за маской",
-    More: "Найти еще",
-    NotShow: "Не показывать снова",
-    ConfirmNoShow:
-      "Подтвердите отключение? Вы можете включить это позже в настройках.",
-  },
-
-  UI: {
-    Confirm: "Подтвердить",
-    Cancel: "Отмена",
-    Close: "Закрыть",
-    Create: "Создать",
-    Edit: "Редактировать",
-  },
-  Exporter: {
-    Model: "Модель",
-    Messages: "Сообщения",
-    Topic: "Тема",
-    Time: "Время",
-  },
-};
-
-export default ru;

+ 0 - 505
app/locales/sk.ts

@@ -1,505 +0,0 @@
-import { getClientConfig } from "../config/client";
-import { SubmitKey } from "../store/config";
-import { LocaleType } from "./index";
-import type { PartialLocaleType } from "./index";
-
-// if you are adding a new translation, please use PartialLocaleType instead of LocaleType
-
-const isApp = !!getClientConfig()?.isApp;
-const sk: PartialLocaleType = {
-  WIP: "Už čoskoro...",
-  Error: {
-    Unauthorized: isApp
-      ? "Neplatný API kľúč, prosím skontrolujte ho na stránke [Nastavenia](/#/settings)."
-      : "Neoprávnený prístup, prosím zadajte prístupový kód na stránke [auth](/#/auth), alebo zadajte váš OpenAI API kľúč.",
-  },
-  Auth: {
-    Title: "Potrebný prístupový kód",
-    Tips: "Prosím, zadajte prístupový kód nižšie",
-    SubTips: "Alebo zadajte váš OpenAI alebo Google API kľúč",
-    Input: "prístupový kód",
-    Confirm: "Potvrdiť",
-    Later: "Neskôr",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} správ`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} správ`,
-    EditMessage: {
-      Title: "Upraviť všetky správy",
-      Topic: {
-        Title: "Téma",
-        SubTitle: "Zmeniť aktuálnu tému",
-      },
-    },
-    Actions: {
-      ChatList: "Prejsť na zoznam chatov",
-      CompressedHistory: "Komprimovaná história výziev",
-      Export: "Exportovať všetky správy ako Markdown",
-      Copy: "Kopírovať",
-      Stop: "Zastaviť",
-      Retry: "Skúsiť znova",
-      Pin: "Pripnúť",
-      PinToastContent: "Pripnuté 1 správy do kontextových výziev",
-      PinToastAction: "Zobraziť",
-      Delete: "Vymazať",
-      Edit: "Upraviť",
-    },
-    Commands: {
-      new: "Začať nový chat",
-      newm: "Začať nový chat s maskou",
-      next: "Ďalší Chat",
-      prev: "Predchádzajúci Chat",
-      clear: "Vymazať kontext",
-      del: "Vymazať Chat",
-    },
-    InputActions: {
-      Stop: "Zastaviť",
-      ToBottom: "Na najnovšie",
-      Theme: {
-        auto: "Automaticky",
-        light: "Svetlý motív",
-        dark: "Tmavý motív",
-      },
-      Prompt: "Výzvy",
-      Masks: "Masky",
-      Clear: "Vymazať kontext",
-      Settings: "Nastavenia",
-    },
-    Rename: "Premenovať Chat",
-    Typing: "Písanie…",
-    Input: (submitKey: string) => {
-      var inputHints = `${submitKey} na odoslanie`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Shift + Enter na zalomenie";
-      }
-      return inputHints + ", / na vyhľadávanie výziev, : na použitie príkazov";
-    },
-    Send: "Odoslať",
-    Config: {
-      Reset: "Resetovať na predvolené",
-      SaveAs: "Uložiť ako masku",
-    },
-    IsContext: "Kontextová výzva",
-  },
-  Export: {
-    Title: "Export správ",
-    Copy: "Kopírovať všetko",
-    Download: "Stiahnuť",
-    MessageFromYou: "Správa od vás",
-    MessageFromChatGPT: "Správa od ChatGPT",
-    Share: "Zdieľať na ShareGPT",
-    Format: {
-      Title: "Formát exportu",
-      SubTitle: "Markdown alebo PNG obrázok",
-    },
-    IncludeContext: {
-      Title: "Vrátane kontextu",
-      SubTitle: "Exportovať kontextové výzvy v maske alebo nie",
-    },
-    Steps: {
-      Select: "Vybrať",
-      Preview: "Náhľad",
-    },
-    Image: {
-      Toast: "Snímanie obrázka...",
-      Modal:
-        "Dlhým stlačením alebo kliknutím pravým tlačidlom myši uložte obrázok",
-    },
-  },
-  Select: {
-    Search: "Hľadať",
-    All: "Vybrať všetko",
-    Latest: "Vybrať najnovšie",
-    Clear: "Vymazať",
-  },
-  Memory: {
-    Title: "Výzva pamäti",
-    EmptyContent: "Zatiaľ nič.",
-    Send: "Odoslať pamäť",
-    Copy: "Kopírovať pamäť",
-    Reset: "Resetovať reláciu",
-    ResetConfirm:
-      "Resetovaním sa vymaže aktuálna história konverzácie a historická pamäť. Ste si istí, že chcete resetovať?",
-  },
-  Home: {
-    NewChat: "Nový Chat",
-    DeleteChat: "Potvrdiť vymazanie vybranej konverzácie?",
-    DeleteToast: "Chat vymazaný",
-    Revert: "Vrátiť späť",
-  },
-  Settings: {
-    Title: "Nastavenia",
-    SubTitle: "Všetky nastavenia",
-    Danger: {
-      Reset: {
-        Title: "Resetovať všetky nastavenia",
-        SubTitle: "Resetovať všetky položky nastavení na predvolené",
-        Action: "Resetovať",
-        Confirm: "Potvrdiť resetovanie všetkých nastavení na predvolené?",
-      },
-      Clear: {
-        Title: "Vymazať všetky údaje",
-        SubTitle: "Vymazať všetky správy a nastavenia",
-        Action: "Vymazať",
-        Confirm: "Potvrdiť vymazanie všetkých správ a nastavení?",
-      },
-    },
-    Lang: {
-      Name: "Jazyk", // POZOR: ak pridávate nový preklad, prosím neprekladajte túto hodnotu, nechajte ju ako "Jazyk"
-      All: "Všetky jazyky",
-    },
-    Avatar: "Avatar",
-    FontSize: {
-      Title: "Veľkosť písma",
-      SubTitle: "Nastaviť veľkosť písma obsahu chatu",
-    },
-    FontFamily: {
-      Title: "Chatové Písmo",
-      SubTitle:
-        "Písmo obsahu chatu, ponechajte prázdne pre použitie globálneho predvoleného písma",
-      Placeholder: "Názov Písma",
-    },
-    InjectSystemPrompts: {
-      Title: "Vložiť systémové výzvy",
-      SubTitle: "Vložiť globálnu systémovú výzvu pre každú požiadavku",
-    },
-    InputTemplate: {
-      Title: "Šablóna vstupu",
-      SubTitle: "Najnovšia správa bude vyplnená do tejto šablóny",
-    },
-
-    Update: {
-      Version: (x: string) => `Verzia: ${x}`,
-      IsLatest: "Najnovšia verzia",
-      CheckUpdate: "Skontrolovať aktualizácie",
-      IsChecking: "Kontrola aktualizácií...",
-      FoundUpdate: (x: string) => `Nájdená nová verzia: ${x}`,
-      GoToUpdate: "Aktualizovať",
-    },
-    SendKey: "Odoslať kľúč",
-    Theme: "Motív",
-    TightBorder: "Tesný okraj",
-    SendPreviewBubble: {
-      Title: "Bublina náhľadu odoslania",
-      SubTitle: "Náhľad markdownu v bubline",
-    },
-    AutoGenerateTitle: {
-      Title: "Automaticky generovať názov",
-      SubTitle: "Generovať vhodný názov na základe obsahu konverzácie",
-    },
-    Sync: {
-      CloudState: "Posledná aktualizácia",
-      NotSyncYet: "Zatiaľ nesynchronizované",
-      Success: "Synchronizácia úspešná",
-      Fail: "Synchronizácia zlyhala",
-
-      Config: {
-        Modal: {
-          Title: "Konfigurácia synchronizácie",
-          Check: "Skontrolovať pripojenie",
-        },
-        SyncType: {
-          Title: "Typ synchronizácie",
-          SubTitle: "Vyberte svoju obľúbenú službu synchronizácie",
-        },
-        Proxy: {
-          Title: "Povoliť CORS Proxy",
-          SubTitle: "Povoliť proxy na obídenie obmedzení cross-origin",
-        },
-        ProxyUrl: {
-          Title: "Koncový bod Proxy",
-          SubTitle: "Platné len pre vstavaný CORS proxy tohto projektu",
-        },
-
-        WebDav: {
-          Endpoint: "Koncový bod WebDAV",
-          UserName: "Meno používateľa",
-          Password: "Heslo",
-        },
-
-        UpStash: {
-          Endpoint: "URL REST služby UpStash Redis",
-          UserName: "Názov zálohy",
-          Password: "Token REST služby UpStash Redis",
-        },
-      },
-
-      LocalState: "Lokálne údaje",
-      Overview: (overview: any) => {
-        return `${overview.chat} chaty, ${overview.message} správy, ${overview.prompt} výzvy, ${overview.mask} masky`;
-      },
-      ImportFailed: "Import z súboru zlyhal",
-    },
-    Mask: {
-      Splash: {
-        Title: "Úvodná obrazovka masky",
-        SubTitle: "Zobraziť úvodnú obrazovku masky pred začatím nového chatu",
-      },
-      Builtin: {
-        Title: "Skryť vstavané masky",
-        SubTitle: "Skryť vstavané masky v zozname masiek",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Zakázať automatické dopĺňanie",
-        SubTitle: "Zadajte / na spustenie automatického dopĺňania",
-      },
-      List: "Zoznam výziev",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} vstavaných, ${custom} užívateľsky definovaných`,
-      Edit: "Upraviť",
-      Modal: {
-        Title: "Zoznam výziev",
-        Add: "Pridať jednu",
-        Search: "Hľadať výzvy",
-      },
-      EditModal: {
-        Title: "Upraviť výzvu",
-      },
-    },
-    HistoryCount: {
-      Title: "Počet pripojených správ",
-      SubTitle: "Počet odoslaných správ pripojených na požiadavku",
-    },
-    CompressThreshold: {
-      Title: "Práh kompresie histórie",
-      SubTitle:
-        "Bude komprimované, ak dĺžka nekomprimovaných správ presiahne túto hodnotu",
-    },
-
-    Usage: {
-      Title: "Stav účtu",
-      SubTitle(used: any, total: any) {
-        return `Tento mesiac použité ${used}, predplatné ${total}`;
-      },
-      IsChecking: "Kontroluje sa...",
-      Check: "Skontrolovať",
-      NoAccess: "Zadajte API kľúč na skontrolovanie zostatku",
-    },
-    Access: {
-      AccessCode: {
-        Title: "Prístupový kód",
-        SubTitle: "Povolený prístupový kód",
-        Placeholder: "Zadajte kód",
-      },
-      CustomEndpoint: {
-        Title: "Vlastný koncový bod",
-        SubTitle: "Použiť vlastnú službu Azure alebo OpenAI",
-      },
-      Provider: {
-        Title: "Poskytovateľ modelu",
-        SubTitle: "Vyberte Azure alebo OpenAI",
-      },
-      OpenAI: {
-        ApiKey: {
-          Title: "API kľúč OpenAI",
-          SubTitle: "Použiť vlastný API kľúč OpenAI",
-          Placeholder: "sk-xxx",
-        },
-
-        Endpoint: {
-          Title: "Koncový bod OpenAI",
-          SubTitle:
-            "Musí začínať http(s):// alebo použiť /api/openai ako predvolený",
-        },
-      },
-      Azure: {
-        ApiKey: {
-          Title: "API kľúč Azure",
-          SubTitle: "Skontrolujte svoj API kľúč v Azure konzole",
-          Placeholder: "API kľúč Azure",
-        },
-
-        Endpoint: {
-          Title: "Koncový bod Azure",
-          SubTitle: "Príklad: ",
-        },
-
-        ApiVerion: {
-          Title: "Verzia API Azure",
-          SubTitle: "Skontrolujte svoju verziu API v Azure konzole",
-        },
-      },
-      Anthropic: {
-        ApiKey: {
-          Title: "API kľúč Anthropic",
-          SubTitle: "Skontrolujte svoj API kľúč v Anthropic konzole",
-          Placeholder: "API kľúč Anthropic",
-        },
-
-        Endpoint: {
-          Title: "Adresa koncového bodu",
-          SubTitle: "Príklad:",
-        },
-
-        ApiVerion: {
-          Title: "Verzia API (claude verzia API)",
-          SubTitle: "Vyberte špecifickú verziu časti",
-        },
-      },
-      CustomModel: {
-        Title: "Vlastné modely",
-        SubTitle: "Možnosti vlastného modelu, oddelené čiarkou",
-      },
-      Google: {
-        ApiKey: {
-          Title: "API kľúč",
-          SubTitle:
-            "Obísť obmedzenia prístupu heslom pomocou vlastného API kľúča Google AI Studio",
-          Placeholder: "API kľúč Google AI Studio",
-        },
-
-        Endpoint: {
-          Title: "Adresa koncového bodu",
-          SubTitle: "Príklad:",
-        },
-
-        ApiVersion: {
-          Title: "Verzia API (gemini-pro verzia API)",
-          SubTitle: "Vyberte špecifickú verziu časti",
-        },
-      },
-    },
-
-    Model: "Model",
-    Temperature: {
-      Title: "Teplota",
-      SubTitle: "Vyššia hodnota robí výstup náhodnejším",
-    },
-    TopP: {
-      Title: "Top P",
-      SubTitle: "Neupravujte túto hodnotu spolu s teplotou",
-    },
-    MaxTokens: {
-      Title: "Maximálny počet tokenov",
-      SubTitle: "Maximálna dĺžka vstupných tokenov a generovaných tokenov",
-    },
-    PresencePenalty: {
-      Title: "Penalizácia za prítomnosť",
-      SubTitle:
-        "Vyššia hodnota zvyšuje pravdepodobnosť hovorenia o nových témach",
-    },
-    FrequencyPenalty: {
-      Title: "Penalizácia za frekvenciu",
-      SubTitle:
-        "Vyššia hodnota znižuje pravdepodobnosť opakovania rovnakej línie",
-    },
-  },
-  Store: {
-    DefaultTopic: "Nová konverzácia",
-    BotHello: "Ahoj! Ako vám dnes môžem pomôcť?",
-    Error: "Niečo sa pokazilo, skúste to prosím neskôr znova.",
-    Prompt: {
-      History: (content: string) =>
-        "Toto je zhrnutie histórie chatu ako rekapitulácia: " + content,
-      Topic:
-        "Prosím, vygenerujte štvor- až päťslovný titul, ktorý zhrnie našu konverzáciu bez akéhokoľvek úvodu, interpunkcie, úvodzoviek, bodiek, symbolov, tučného textu alebo ďalšieho textu. Odstráňte uzatváracie úvodzovky.",
-      Summarize:
-        "Stručne zhrňte diskusiu na menej ako 200 slov, aby ste ju mohli použiť ako výzvu pre budúci kontext.",
-    },
-  },
-  Copy: {
-    Success: "Skopírované do schránky",
-    Failed:
-      "Kopírovanie zlyhalo, prosím udeľte povolenie na prístup k schránke",
-  },
-  Download: {
-    Success: "Obsah stiahnutý do vášho adresára.",
-    Failed: "Stiahnutie zlyhalo.",
-  },
-  Context: {
-    Toast: (x: any) => `S ${x} kontextovými výzvami`,
-    Edit: "Aktuálne nastavenia chatu",
-    Add: "Pridať výzvu",
-    Clear: "Kontext vyčistený",
-    Revert: "Vrátiť späť",
-  },
-  Plugin: {
-    Name: "Plugin",
-  },
-  FineTuned: {
-    Sysmessage: "Ste asistent, ktorý",
-  },
-  Mask: {
-    Name: "Maska",
-    Page: {
-      Title: "Šablóna výziev",
-      SubTitle: (count: number) => `${count} šablón výziev`,
-      Search: "Hľadať šablóny",
-      Create: "Vytvoriť",
-    },
-    Item: {
-      Info: (count: number) => `${count} výziev`,
-      Chat: "Chat",
-      View: "Zobraziť",
-      Edit: "Upraviť",
-      Delete: "Vymazať",
-      DeleteConfirm: "Potvrdiť vymazanie?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Upraviť šablónu výziev ${readonly ? "(iba na čítanie)" : ""}`,
-      Download: "Stiahnuť",
-      Clone: "Klonovať",
-    },
-    Config: {
-      Avatar: "Avatar robota",
-      Name: "Meno robota",
-      Sync: {
-        Title: "Použiť globálne nastavenia",
-        SubTitle: "Použiť globálne nastavenia v tomto chate",
-        Confirm: "Potvrdiť prepísanie vlastného nastavenia globálnym?",
-      },
-      HideContext: {
-        Title: "Skryť kontextové výzvy",
-        SubTitle: "Nezobrazovať kontextové výzvy v chate",
-      },
-      Share: {
-        Title: "Zdieľať túto masku",
-        SubTitle: "Vygenerovať odkaz na túto masku",
-        Action: "Kopírovať odkaz",
-      },
-    },
-  },
-  NewChat: {
-    Return: "Vrátiť sa",
-    Skip: "Len začať",
-    Title: "Vybrať masku",
-    SubTitle: "Chatovať s dušou za maskou",
-    More: "Nájsť viac",
-    NotShow: "Už nezobrazovať",
-    ConfirmNoShow:
-      "Potvrdiť deaktiváciu? Môžete ju neskôr znova povoliť v nastaveniach.",
-  },
-
-  UI: {
-    Confirm: "Potvrdiť",
-    Cancel: "Zrušiť",
-    Close: "Zavrieť",
-    Create: "Vytvoriť",
-    Edit: "Upraviť",
-    Export: "Exportovať",
-    Import: "Importovať",
-    Sync: "Synchronizovať",
-    Config: "Konfigurácia",
-  },
-  Exporter: {
-    Description: {
-      Title: "Zobrazia sa len správy po vyčistení kontextu",
-    },
-    Model: "Model",
-    Messages: "Správy",
-    Topic: "Téma",
-    Time: "Čas",
-  },
-
-  URLCommand: {
-    Code: "Zistený prístupový kód z URL, potvrdiť na aplikovanie?",
-    Settings: "Zistené nastavenia z URL, potvrdiť na aplikovanie?",
-  },
-};
-
-export default sk;

+ 0 - 247
app/locales/tr.ts

@@ -1,247 +0,0 @@
-import { SubmitKey } from "../store/config";
-import type { PartialLocaleType } from "./index";
-
-const tr: PartialLocaleType = {
-  WIP: "Çalışma devam ediyor...",
-  Error: {
-    Unauthorized:
-      "Yetkisiz erişim, lütfen erişim kodunu ayarlar [sayfasından](/#/auth) giriniz.",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} mesaj`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `ChatGPT tarafından ${count} mesaj`,
-    Actions: {
-      ChatList: "Sohbet Listesine Git",
-      CompressedHistory: "Sıkıştırılmış Geçmiş Bellek Komutu",
-      Export: "Tüm Mesajları Markdown Olarak Dışa Aktar",
-      Copy: "Kopyala",
-      Stop: "Durdur",
-      Retry: "Tekrar Dene",
-      Delete: "Delete",
-    },
-    Rename: "Sohbeti Yeniden Adlandır",
-    Typing: "Yazıyor…",
-    Input: (submitKey: string) => {
-      var inputHints = `Göndermek için ${submitKey}`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", kaydırmak için Shift + Enter";
-      }
-      return inputHints + ", komutları aramak için / (eğik çizgi)";
-    },
-    Send: "Gönder",
-    Config: {
-      Reset: "Reset to Default",
-      SaveAs: "Save as Mask",
-    },
-  },
-  Export: {
-    Title: "Tüm Mesajlar",
-    Copy: "Tümünü Kopyala",
-    Download: "İndir",
-    MessageFromYou: "Sizin Mesajınız",
-    MessageFromChatGPT: "ChatGPT'nin Mesajı",
-  },
-  Memory: {
-    Title: "Bellek Komutları",
-    EmptyContent: "Henüz değil.",
-    Send: "Belleği Gönder",
-    Copy: "Belleği Kopyala",
-    Reset: "Oturumu Sıfırla",
-    ResetConfirm:
-      "Sıfırlama, geçerli görüşme geçmişini ve geçmiş belleği siler. Sıfırlamak istediğinizden emin misiniz?",
-  },
-  Home: {
-    NewChat: "Yeni Sohbet",
-    DeleteChat: "Seçili sohbeti silmeyi onaylıyor musunuz?",
-    DeleteToast: "Sohbet Silindi",
-    Revert: "Geri Al",
-  },
-  Settings: {
-    Title: "Ayarlar",
-    SubTitle: "Tüm Ayarlar",
-
-    Lang: {
-      Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-      All: "Tüm Diller",
-    },
-    Avatar: "Avatar",
-    FontSize: {
-      Title: "Yazı Boyutu",
-      SubTitle: "Sohbet içeriğinin yazı boyutunu ayarlayın",
-    },
-    FontFamily: {
-      Title: "Sohbet Yazı Tipi",
-      SubTitle:
-        "Sohbet içeriğinin yazı tipi, boş bırakıldığında küresel varsayılan yazı tipi uygulanır",
-      Placeholder: "Yazı Tipi Adı",
-    },
-    InjectSystemPrompts: {
-      Title: "Sistem İpucu Ekleyin",
-      SubTitle:
-        "Her istek için ileti listesinin başına simüle edilmiş bir ChatGPT sistem ipucu ekleyin",
-    },
-    Update: {
-      Version: (x: string) => `Sürüm: ${x}`,
-      IsLatest: "En son sürüm",
-      CheckUpdate: "Güncellemeyi Kontrol Et",
-      IsChecking: "Güncelleme kontrol ediliyor...",
-      FoundUpdate: (x: string) => `Yeni sürüm bulundu: ${x}`,
-      GoToUpdate: "Güncelle",
-    },
-    SendKey: "Gönder Tuşu",
-    Theme: "Tema",
-    TightBorder: "Tam Ekran",
-    SendPreviewBubble: {
-      Title: "Mesaj Önizleme Balonu",
-      SubTitle: "Preview markdown in bubble",
-    },
-    Mask: {
-      Splash: {
-        Title: "Mask Splash Screen",
-        SubTitle: "Show a mask splash screen before starting new chat",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Otomatik tamamlamayı devre dışı bırak",
-        SubTitle: "Otomatik tamamlamayı kullanmak için / (eğik çizgi) girin",
-      },
-      List: "Komut Listesi",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} yerleşik, ${custom} kullanıcı tanımlı`,
-      Edit: "Düzenle",
-      Modal: {
-        Title: "Prompt List",
-        Add: "Add One",
-        Search: "Search Prompts",
-      },
-      EditModal: {
-        Title: "Edit Prompt",
-      },
-    },
-    HistoryCount: {
-      Title: "Ekli Mesaj Sayısı",
-      SubTitle: "İstek başına ekli gönderilen mesaj sayısı",
-    },
-    CompressThreshold: {
-      Title: "Geçmiş Sıkıştırma Eşiği",
-      SubTitle:
-        "Sıkıştırılmamış mesajların uzunluğu bu değeri aşarsa sıkıştırılır",
-    },
-
-    Usage: {
-      Title: "Hesap Bakiyesi",
-      SubTitle(used: any, total: any) {
-        return `Bu ay kullanılan $${used}, abonelik $${total}`;
-      },
-      IsChecking: "Kontrol ediliyor...",
-      Check: "Tekrar Kontrol Et",
-      NoAccess: "Bakiyeyi kontrol etmek için API anahtarını girin",
-    },
-
-    Model: "Model",
-    Temperature: {
-      Title: "Gerçeklik",
-      SubTitle:
-        "Daha büyük bir değer girildiğinde gerçeklik oranı düşer ve daha rastgele çıktılar üretir",
-    },
-    MaxTokens: {
-      Title: "Maksimum Belirteç",
-      SubTitle:
-        "Girdi belirteçlerinin ve oluşturulan belirteçlerin maksimum uzunluğu",
-    },
-    PresencePenalty: {
-      Title: "Varlık Cezası",
-      SubTitle:
-        "Daha büyük bir değer, yeni konular hakkında konuşma olasılığını artırır",
-    },
-    FrequencyPenalty: {
-      Title: "Frekans Cezası",
-      SubTitle:
-        "Aynı satırı tekrar etme olasılığını azaltan daha büyük bir değer",
-    },
-  },
-  Store: {
-    DefaultTopic: "Yeni Konuşma",
-    BotHello: "Merhaba! Size bugün nasıl yardımcı olabilirim?",
-    Error: "Bir şeyler yanlış gitti. Lütfen daha sonra tekrar deneyiniz.",
-    Prompt: {
-      History: (content: string) =>
-        "Bu, yapay zeka ile kullanıcı arasındaki sohbet geçmişinin bir özetidir: " +
-        content,
-      Topic:
-        "Lütfen herhangi bir giriş, noktalama işareti, tırnak işareti, nokta, sembol veya ek metin olmadan konuşmamızı özetleyen dört ila beş kelimelik bir başlık oluşturun. Çevreleyen tırnak işaretlerini kaldırın.",
-      Summarize:
-        "Gelecekteki bağlam için bir bilgi istemi olarak kullanmak üzere tartışmamızı en fazla 200 kelimeyle özetleyin.",
-    },
-  },
-  Copy: {
-    Success: "Panoya kopyalandı",
-    Failed: "Kopyalama başarısız oldu, lütfen panoya erişim izni verin",
-  },
-  Context: {
-    Toast: (x: any) => `${x} bağlamsal bellek komutu`,
-    Edit: "Bağlamsal ve Bellek Komutları",
-    Add: "Yeni Ekle",
-  },
-  Plugin: {
-    Name: "Plugin",
-  },
-  FineTuned: {
-    Sysmessage: "Sen bir asistansın",
-  },
-  Mask: {
-    Name: "Mask",
-    Page: {
-      Title: "Prompt Template",
-      SubTitle: (count: number) => `${count} prompt templates`,
-      Search: "Search Templates",
-      Create: "Create",
-    },
-    Item: {
-      Info: (count: number) => `${count} prompts`,
-      Chat: "Chat",
-      View: "View",
-      Edit: "Edit",
-      Delete: "Delete",
-      DeleteConfirm: "Confirm to delete?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Edit Prompt Template ${readonly ? "(readonly)" : ""}`,
-      Download: "Download",
-      Clone: "Clone",
-    },
-    Config: {
-      Avatar: "Bot Avatar",
-      Name: "Bot Name",
-    },
-  },
-  NewChat: {
-    Return: "Return",
-    Skip: "Skip",
-    Title: "Pick a Mask",
-    SubTitle: "Chat with the Soul behind the Mask",
-    More: "Find More",
-    NotShow: "Not Show Again",
-    ConfirmNoShow: "Confirm to disable?You can enable it in settings later.",
-  },
-
-  UI: {
-    Confirm: "Confirm",
-    Cancel: "Cancel",
-    Close: "Close",
-    Create: "Create",
-    Edit: "Edit",
-  },
-  Exporter: {
-    Model: "Model",
-    Messages: "Mesajlar",
-    Topic: "Konu",
-    Time: "Zaman",
-  },
-};
-
-export default tr;

+ 0 - 500
app/locales/tw.ts

@@ -1,500 +0,0 @@
-import { getClientConfig } from "../config/client";
-import { SubmitKey } from "../store/config";
-
-const isApp = !!getClientConfig()?.isApp;
-
-const tw = {
-  WIP: "此功能仍在開發中……",
-  Error: {
-    Unauthorized: isApp
-      ? "偵測到無效的 API Key,請前往[設定](/#/settings)頁面檢查 API Key 是否設定正確。"
-      : "存取密碼不正確或尚未填寫,請前往[登入](/#/auth)頁面輸入正確的存取密碼,或者在[設定](/#/settings)頁面填入你自己的 OpenAI API Key。",
-  },
-
-  Auth: {
-    Title: "需要密碼",
-    Tips: "管理員開啟了密碼驗證,請在下方填入存取密碼",
-    SubTips: "或者輸入你的 OpenAI 或 Google API 金鑰",
-    Input: "在此處填寫存取密碼",
-    Confirm: "確認",
-    Later: "稍候再說",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} 則對話`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `您已經與 ChatGPT 進行了 ${count} 則對話`,
-    EditMessage: {
-      Title: "編輯訊息記錄",
-      Topic: {
-        Title: "聊天主題",
-        SubTitle: "更改目前聊天主題",
-      },
-    },
-    Actions: {
-      ChatList: "檢視訊息列表",
-      CompressedHistory: "檢視壓縮後的歷史 Prompt",
-      Export: "匯出聊天紀錄",
-      Copy: "複製",
-      Stop: "停止",
-      Retry: "重試",
-      Pin: "固定",
-      PinToastContent: "已將 1 條對話固定至預設提示詞",
-      PinToastAction: "檢視",
-      Delete: "刪除",
-      Edit: "編輯",
-    },
-    Commands: {
-      new: "新建聊天",
-      newm: "從角色範本新建聊天",
-      next: "下一個聊天",
-      prev: "上一個聊天",
-      clear: "清除上下文",
-      del: "刪除聊天",
-    },
-    InputActions: {
-      Stop: "停止回應",
-      ToBottom: "移至最新",
-      Theme: {
-        auto: "自動主題",
-        light: "亮色模式",
-        dark: "深色模式",
-      },
-      Prompt: "快捷指令",
-      Masks: "所有角色範本",
-      Clear: "清除聊天",
-      Settings: "對話設定",
-      UploadImage: "上傳圖片",
-    },
-    Rename: "重新命名對話",
-    Typing: "正在輸入…",
-    Input: (submitKey: string) => {
-      var inputHints = `輸入訊息後,按下 ${submitKey} 鍵即可傳送`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ",Shift + Enter 鍵換行";
-      }
-      return inputHints;
-    },
-    Send: "傳送",
-    Config: {
-      Reset: "重設",
-      SaveAs: "另存新檔",
-    },
-    IsContext: "預設提示詞",
-  },
-  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",
-    EmptyContent: "尚未記憶",
-    Copy: "複製全部",
-    Send: "傳送記憶",
-    Reset: "重設對話",
-    ResetConfirm: "重設後將清除目前對話記錄以及歷史記憶,確認重設?",
-  },
-  Home: {
-    NewChat: "開新對話",
-    DeleteChat: "確定要刪除選取的對話嗎?",
-    DeleteToast: "已刪除對話",
-    Revert: "撤銷",
-  },
-  Settings: {
-    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: "所有語言",
-    },
-    Avatar: "大頭貼",
-    FontSize: {
-      Title: "字型大小",
-      SubTitle: "聊天內容的字型大小",
-    },
-    FontFamily: {
-      Title: "聊天字體",
-      SubTitle: "聊天內容的字體,若置空則應用全局默認字體",
-      Placeholder: "字體名稱",
-    },
-    InjectSystemPrompts: {
-      Title: "匯入系統提示",
-      SubTitle: "強制在每個請求的訊息列表開頭新增一個模擬 ChatGPT 的系統提示",
-    },
-    InputTemplate: {
-      Title: "使用者輸入預處理",
-      SubTitle: "使用者最新的一則訊息會填充到此範本",
-    },
-
-    Update: {
-      Version: (x: string) => `目前版本:${x}`,
-      IsLatest: "已是最新版本",
-      CheckUpdate: "檢查更新",
-      IsChecking: "正在檢查更新...",
-      FoundUpdate: (x: string) => `發現新版本:${x}`,
-      GoToUpdate: "前往更新",
-    },
-    SendKey: "傳送鍵",
-    Theme: "主題",
-    TightBorder: "緊湊邊框",
-    SendPreviewBubble: {
-      Title: "預覽氣泡",
-      SubTitle: "在預覽氣泡中預覽 Markdown 內容",
-    },
-    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: "新增聊天時,呈現角色範本啟動頁面",
-      },
-      Builtin: {
-        Title: "隱藏內建角色範本",
-        SubTitle: "在所有角色範本列表中隱藏內建角色範本",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "停用提示詞自動補齊",
-        SubTitle: "在輸入框開頭輸入 / 即可觸發自動補齊",
-      },
-      List: "自訂提示詞列表",
-      ListCount: (builtin: number, custom: number) =>
-        `內建 ${builtin} 條,使用者自訂 ${custom} 條`,
-      Edit: "編輯",
-      Modal: {
-        Title: "提示詞列表",
-        Add: "新增一則",
-        Search: "搜尋提示詞",
-      },
-      EditModal: {
-        Title: "編輯提示詞",
-      },
-    },
-    HistoryCount: {
-      Title: "附帶歷史訊息數",
-      SubTitle: "每次請求附帶的歷史訊息數",
-    },
-    CompressThreshold: {
-      Title: "歷史訊息長度壓縮閾值",
-      SubTitle: "當未壓縮的歷史訊息超過該值時,將進行壓縮",
-    },
-
-    Usage: {
-      Title: "帳戶餘額",
-      SubTitle(used: any, total: any) {
-        return `本月已使用 $${used},訂閱總額 $${total}`;
-      },
-      IsChecking: "正在檢查…",
-      Check: "重新檢查",
-      NoAccess: "輸入 API Key 檢視餘額",
-    },
-
-    Access: {
-      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)",
-    Temperature: {
-      Title: "隨機性 (temperature)",
-      SubTitle: "值越大,回應越隨機",
-    },
-    TopP: {
-      Title: "核心採樣 (top_p)",
-      SubTitle: "與隨機性類似,但不要和隨機性一起更改",
-    },
-    MaxTokens: {
-      Title: "單次回應限制 (max_tokens)",
-      SubTitle: "單次互動所用的最大 Token 數",
-    },
-    PresencePenalty: {
-      Title: "話題新穎度 (presence_penalty)",
-      SubTitle: "值越大,越有可能拓展到新話題",
-    },
-    FrequencyPenalty: {
-      Title: "頻率懲罰度 (frequency_penalty)",
-      SubTitle: "值越大,越有可能降低重複字詞",
-    },
-  },
-  Store: {
-    DefaultTopic: "新的對話",
-    BotHello: "請問需要我的協助嗎?",
-    Error: "出錯了,請稍後再嘗試",
-    Prompt: {
-      History: (content: string) =>
-        "這是 AI 與使用者的歷史聊天總結,作為前情提要:" + content,
-      Topic:
-        "Use the language used by the user (e.g. en for english conversation, zh-hant for chinese conversation, etc.) to generate a title (at most 6 words) summarizing our conversation without any lead-in, quotation marks, preamble like 'Title:', direct text copies, single-word replies, quotation marks, translations, or brackets. Remove enclosing quotation marks. The title should make third-party grasp the essence of the conversation in first sight.",
-      Summarize:
-        "Use the language used by the user (e.g. en-us for english conversation, zh-hant for chinese conversation, etc.) to summarise the conversation in at most 200 words. The summary will be used as prompt for you to continue the conversation in the future.",
-    },
-  },
-  Copy: {
-    Success: "已複製到剪貼簿中",
-    Failed: "複製失敗,請賦予剪貼簿權限",
-  },
-  Download: {
-    Success: "內容已下載到您的目錄。",
-    Failed: "下載失敗。",
-  },
-  Context: {
-    Toast: (x: any) => `已設定 ${x} 條前置上下文`,
-    Edit: "前置上下文和歷史記憶",
-    Add: "新增一則",
-    Clear: "上下文已清除",
-    Revert: "恢復上下文",
-  },
-  Plugin: { Name: "外掛" },
-  FineTuned: { Sysmessage: "你是一個助手" },
-  Mask: {
-    Name: "角色範本",
-    Page: {
-      Title: "預設角色角色範本",
-      SubTitle: (count: number) => `${count} 個預設角色定義`,
-      Search: "搜尋角色角色範本",
-      Create: "新增",
-    },
-    Item: {
-      Info: (count: number) => `包含 ${count} 條預設對話`,
-      Chat: "對話",
-      View: "檢視",
-      Edit: "編輯",
-      Delete: "刪除",
-      DeleteConfirm: "確認刪除?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `編輯預設角色範本 ${readonly ? "(唯讀)" : ""}`,
-      Download: "下載預設值",
-      Clone: "以此預設值建立副本",
-    },
-    Config: {
-      Avatar: "角色頭像",
-      Name: "角色名稱",
-      Sync: {
-        Title: "使用全域設定",
-        SubTitle: "目前對話是否使用全域模型設定",
-        Confirm: "目前對話的自訂設定將會被自動覆蓋,確認啟用全域設定?",
-      },
-      HideContext: {
-        Title: "隱藏預設對話",
-        SubTitle: "隱藏後預設對話不會出現在聊天介面",
-      },
-      Share: {
-        Title: "分享此角色範本",
-        SubTitle: "產生此角色範本的直達連結",
-        Action: "複製連結",
-      },
-    },
-  },
-  NewChat: {
-    Return: "返回",
-    Skip: "跳過",
-    NotShow: "不再顯示",
-    ConfirmNoShow: "確認停用?停用後可以隨時在設定中重新啟用。",
-    Title: "挑選一個角色範本",
-    SubTitle: "現在開始,與角色範本背後的靈魂思維碰撞",
-    More: "搜尋更多",
-  },
-  URLCommand: {
-    Code: "偵測到連結中已經包含存取密碼,是否自動填入?",
-    Settings: "偵測到連結中包含了預設設定,是否自動填入?",
-  },
-  UI: {
-    Confirm: "確認",
-    Cancel: "取消",
-    Close: "關閉",
-    Create: "新增",
-    Edit: "編輯",
-    Export: "匯出",
-    Import: "匯入",
-    Sync: "同步",
-    Config: "設定",
-  },
-  Exporter: {
-    Description: {
-      Title: "只有清除上下文之後的訊息會被顯示",
-    },
-    Model: "模型",
-    Messages: "訊息",
-    Topic: "主題",
-    Time: "時間",
-  },
-};
-
-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

+ 0 - 242
app/locales/vi.ts

@@ -1,242 +0,0 @@
-import { SubmitKey } from "../store/config";
-import type { PartialLocaleType } from "./index";
-
-const vi: PartialLocaleType = {
-  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.",
-  },
-  ChatItem: {
-    ChatItemCount: (count: number) => `${count} tin nhắn`,
-  },
-  Chat: {
-    SubTitle: (count: number) => `${count} tin nhắn với ChatGPT`,
-    Actions: {
-      ChatList: "Xem danh sách chat",
-      CompressedHistory: "Nén tin nhắn trong quá khứ",
-      Export: "Xuất tất cả tin nhắn dưới dạng Markdown",
-      Copy: "Sao chép",
-      Stop: "Dừng",
-      Retry: "Thử lại",
-      Delete: "Xóa",
-    },
-    Rename: "Đổi tên",
-    Typing: "Đang nhập…",
-    Input: (submitKey: string) => {
-      var inputHints = `${submitKey} để gửi`;
-      if (submitKey === String(SubmitKey.Enter)) {
-        inputHints += ", Shift + Enter để xuống dòng";
-      }
-      return inputHints + ", / để tìm kiếm mẫu gợi ý";
-    },
-    Send: "Gửi",
-    Config: {
-      Reset: "Khôi phục cài đặt gốc",
-      SaveAs: "Lưu dưới dạng Mẫu",
-    },
-  },
-  Export: {
-    Title: "Tất cả tin nhắn",
-    Copy: "Sao chép tất cả",
-    Download: "Tải xuống",
-    MessageFromYou: "Tin nhắn của bạn",
-    MessageFromChatGPT: "Tin nhắn từ ChatGPT",
-  },
-  Memory: {
-    Title: "Lịch sử tin nhắn",
-    EmptyContent: "Chưa có tin nhắn",
-    Send: "Gửi tin nhắn trong quá khứ",
-    Copy: "Sao chép tin nhắn trong quá khứ",
-    Reset: "Đặt lại phiên",
-    ResetConfirm:
-      "Đặt lại sẽ xóa toàn bộ lịch sử trò chuyện hiện tại và bộ nhớ. Bạn có chắc chắn muốn đặt lại không?",
-  },
-  Home: {
-    NewChat: "Cuộc trò chuyện mới",
-    DeleteChat: "Xác nhận xóa các cuộc trò chuyện đã chọn?",
-    DeleteToast: "Đã xóa cuộc trò chuyện",
-    Revert: "Khôi phục",
-  },
-  Settings: {
-    Title: "Cài đặt",
-    SubTitle: "Tất cả cài đặt",
-
-    Lang: {
-      Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
-      All: "Tất cả ngôn ngữ",
-    },
-    Avatar: "Ảnh đại diện",
-    FontSize: {
-      Title: "Font chữ",
-      SubTitle: "Thay đổi font chữ của nội dung trò chuyện",
-    },
-    FontFamily: {
-      Title: "Phông Chữ Trò Chuyện",
-      SubTitle:
-        "Phông chữ của nội dung trò chuyện, để trống để áp dụng phông chữ mặc định toàn cầu",
-      Placeholder: "Tên Phông Chữ",
-    },
-    InjectSystemPrompts: {
-      Title: "Tiêm Prompt Hệ thống",
-      SubTitle:
-        "Bắt buộc thêm một prompt hệ thống giả lập ChatGPT ở đầu danh sách tin nhắn cho mỗi yêu cầu",
-    },
-    Update: {
-      Version: (x: string) => `Phiên bản: ${x}`,
-      IsLatest: "Phiên bản mới nhất",
-      CheckUpdate: "Kiểm tra bản cập nhật",
-      IsChecking: "Kiểm tra bản cập nhật...",
-      FoundUpdate: (x: string) => `Phát hiện phiên bản mới: ${x}`,
-      GoToUpdate: "Cập nhật",
-    },
-    SendKey: "Phím gửi",
-    Theme: "Theme",
-    TightBorder: "Chế độ không viền",
-    SendPreviewBubble: {
-      Title: "Gửi bong bóng xem trước",
-      SubTitle: "Xem trước nội dung markdown bằng bong bóng",
-    },
-    Mask: {
-      Splash: {
-        Title: "Mask Splash Screen",
-        SubTitle: "Chớp màn hình khi bắt đầu cuộc trò chuyện mới",
-      },
-    },
-    Prompt: {
-      Disable: {
-        Title: "Vô hiệu hóa chức năng tự động hoàn thành",
-        SubTitle: "Nhập / để kích hoạt chức năng tự động hoàn thành",
-      },
-      List: "Danh sách mẫu gợi ý",
-      ListCount: (builtin: number, custom: number) =>
-        `${builtin} có sẵn, ${custom} do người dùng xác định`,
-      Edit: "Chỉnh sửa",
-      Modal: {
-        Title: "Danh sách mẫu gợi ý",
-        Add: "Thêm",
-        Search: "Tìm kiếm mẫu",
-      },
-      EditModal: {
-        Title: "Chỉnh sửa mẫu",
-      },
-    },
-    HistoryCount: {
-      Title: "Số lượng tin nhắn đính kèm",
-      SubTitle: "Số lượng tin nhắn trong quá khứ được gửi kèm theo mỗi yêu cầu",
-    },
-    CompressThreshold: {
-      Title: "Ngưỡng nén lịch sử tin nhắn",
-      SubTitle: "Thực hiện nén nếu số lượng tin nhắn chưa nén vượt quá ngưỡng",
-    },
-
-    Usage: {
-      Title: "Hạn mức tài khoản",
-      SubTitle(used: any, total: any) {
-        return `Đã sử dụng $${used} trong tháng này, hạn mức $${total}`;
-      },
-      IsChecking: "Đang kiểm tra...",
-      Check: "Kiểm tra",
-      NoAccess: "Nhập API Key để kiểm tra hạn mức",
-    },
-
-    Model: "Mô hình",
-    Temperature: {
-      Title: "Tính ngẫu nhiên (temperature)",
-      SubTitle: "Giá trị càng lớn, câu trả lời càng ngẫu nhiên",
-    },
-    MaxTokens: {
-      Title: "Giới hạn số lượng token (max_tokens)",
-      SubTitle: "Số lượng token tối đa được sử dụng trong mỗi lần tương tác",
-    },
-    PresencePenalty: {
-      Title: "Chủ đề mới (presence_penalty)",
-      SubTitle: "Giá trị càng lớn tăng khả năng mở rộng sang các chủ đề mới",
-    },
-    FrequencyPenalty: {
-      Title: "Hình phạt tần suất",
-      SubTitle: "Giá trị lớn hơn làm giảm khả năng lặp lại cùng một dòng",
-    },
-  },
-  Store: {
-    DefaultTopic: "Cuộc trò chuyện mới",
-    BotHello: "Xin chào! Mình có thể giúp gì cho bạn?",
-    Error: "Có lỗi xảy ra, vui lòng thử lại sau.",
-    Prompt: {
-      History: (content: string) =>
-        "Tóm tắt ngắn gọn cuộc trò chuyện giữa người dùng và AI: " + content,
-      Topic:
-        "Sử dụng 4 đến 5 từ tóm tắt cuộc trò chuyện này mà không có phần mở đầu, dấu chấm câu, dấu ngoặc kép, dấu chấm, ký hiệu hoặc văn bản bổ sung nào. Loại bỏ các dấu ngoặc kép kèm theo.",
-      Summarize:
-        "Tóm tắt cuộc trò chuyện này một cách ngắn gọn trong 200 từ hoặc ít hơn để sử dụng làm gợi ý cho ngữ cảnh tiếp theo.",
-    },
-  },
-  Copy: {
-    Success: "Sao chép vào bộ nhớ tạm",
-    Failed:
-      "Sao chép không thành công, vui lòng cấp quyền truy cập vào bộ nhớ tạm",
-  },
-  Context: {
-    Toast: (x: any) => `Sử dụng ${x} tin nhắn chứa ngữ cảnh`,
-    Edit: "Thiết lập ngữ cảnh và bộ nhớ",
-    Add: "Thêm tin nhắn",
-  },
-  Plugin: {
-    Name: "Plugin",
-  },
-  FineTuned: {
-    Sysmessage: "Bạn là một trợ lý",
-  },
-  Mask: {
-    Name: "Mẫu",
-    Page: {
-      Title: "Mẫu trò chuyện",
-      SubTitle: (count: number) => `${count} mẫu`,
-      Search: "Tìm kiếm mẫu",
-      Create: "Tạo",
-    },
-    Item: {
-      Info: (count: number) => `${count} tin nhắn`,
-      Chat: "Chat",
-      View: "Xem trước",
-      Edit: "Chỉnh sửa",
-      Delete: "Xóa",
-      DeleteConfirm: "Xác nhận xóa?",
-    },
-    EditModal: {
-      Title: (readonly: boolean) =>
-        `Chỉnh sửa mẫu ${readonly ? "(chỉ xem)" : ""}`,
-      Download: "Tải xuống",
-      Clone: "Tạo bản sao",
-    },
-    Config: {
-      Avatar: "Ảnh đại diện bot",
-      Name: "Tên bot",
-    },
-  },
-  NewChat: {
-    Return: "Quay lại",
-    Skip: "Bỏ qua",
-    Title: "Chọn 1 biểu tượng",
-    SubTitle: "Bắt đầu trò chuyện ẩn sau lớp mặt nạ",
-    More: "Tìm thêm",
-    NotShow: "Không hiển thị lại",
-    ConfirmNoShow: "Xác nhận tắt? Bạn có thể bật lại trong phần cài đặt.",
-  },
-
-  UI: {
-    Confirm: "Xác nhận",
-    Cancel: "Hủy",
-    Close: "Đóng",
-    Create: "Tạo",
-    Edit: "Chỉnh sửa",
-  },
-  Exporter: {
-    Model: "Mô hình",
-    Messages: "Thông điệp",
-    Topic: "Chủ đề",
-    Time: "Thời gian",
-  },
-};
-
-export default vi;

+ 2 - 22
app/masks/build.ts

@@ -1,26 +1,6 @@
-import fs from "fs";
-import path from "path";
 import { CN_MASKS } from "./cn";
-// import { TW_MASKS } from "./tw";
-// import { EN_MASKS } from "./en";
-
 import { type BuiltinMask } from "./typing";
 
-const BUILTIN_MASKS: Record<string, BuiltinMask[]> = {
+export const BUILTIN_MASKS: Record<string, BuiltinMask[]> = {
   cn: CN_MASKS,
-  // tw: TW_MASKS,
-  // en: EN_MASKS,
-};
-
-const dirname = path.dirname(__filename);
-
-// 不创建masks.json文件
-// fs.writeFile(
-//   dirname + "/../../public/masks.json",
-//   JSON.stringify(BUILTIN_MASKS, null, 4),
-//   function (error) {
-//     if (error) {
-//       console.error("[Build] failed to build masks", error);
-//     }
-//   },
-// );
+};

File diff suppressed because it is too large
+ 0 - 11
app/masks/en.ts


+ 4 - 7
app/masks/index.ts

@@ -1,8 +1,5 @@
 import { Mask } from "../store/mask";
 import { CN_MASKS } from "./cn";
-import { TW_MASKS } from "./tw";
-import { EN_MASKS } from "./en";
-
 import { type BuiltinMask } from "./typing";
 export { type BuiltinMask } from "./typing";
 
@@ -22,7 +19,7 @@ export const BUILTIN_MASK_STORE = {
   },
 };
 
-export const BUILTIN_MASKS: BuiltinMask[] = [];
+export const BUILTIN_MASKS: BuiltinMask[] = CN_MASKS.map(mask => BUILTIN_MASK_STORE.add(mask));
 
 // if (typeof window != "undefined") {
 //   // run in browser skip in next server
@@ -30,11 +27,11 @@ export const BUILTIN_MASKS: BuiltinMask[] = [];
 //     .then((res) => res.json())
 //     .catch((error) => {
 //       console.error("[Fetch] failed to fetch masks", error);
-//       return { cn: [], tw: [], en: [] };
+//       return { cn: [] };
 //     })
 //     .then((masks) => {
-//       const { cn = [], tw = [], en = [] } = masks;
-//       return [...cn, ...tw, ...en].map((m) => {
+//       const { cn = [] } = masks;
+//       return cn.map((m) => {
 //         BUILTIN_MASKS.push(BUILTIN_MASK_STORE.add(m));
 //       });
 //     });

File diff suppressed because it is too large
+ 0 - 420
app/masks/tw.ts


+ 126 - 122
app/store/prompt.ts

@@ -14,8 +14,8 @@ export interface Prompt {
 
 export const SearchService = {
   ready: false,
-  builtinEngine: new Fuse<Prompt>([], { keys: ["title"] }),
-  userEngine: new Fuse<Prompt>([], { keys: ["title"] }),
+  builtinEngine: new Fuse<Prompt>([], {keys: [ "title" ]}),
+  userEngine: new Fuse<Prompt>([], {keys: [ "title" ]}),
   count: {
     builtin: 0,
   },
@@ -23,7 +23,7 @@ export const SearchService = {
   builtinPrompts: [] as Prompt[],
 
   init(builtinPrompts: Prompt[], userPrompts: Prompt[]) {
-    if (this.ready) {
+    if ( this.ready ) {
       return;
     }
     this.allPrompts = userPrompts.concat(builtinPrompts);
@@ -49,136 +49,140 @@ export const SearchService = {
 };
 
 export const usePromptStore = createPersistStore(
-  {
-    counter: 0,
-    prompts: {} as Record<string, Prompt>,
-  },
-
-  (set, get) => ({
-    add(prompt: Prompt) {
-      const prompts = get().prompts;
-      prompt.id = nanoid();
-      prompt.isUser = true;
-      prompt.createdAt = Date.now();
-      prompts[prompt.id] = prompt;
-
-      set(() => ({
-        prompts: prompts,
-      }));
-
-      return prompt.id!;
+    {
+      counter: 0,
+      prompts: {} as Record<string, Prompt>,
     },
 
-    get(id: string) {
-      const targetPrompt = get().prompts[id];
+    (set, get) => ({
+      add(prompt: Prompt) {
+        const prompts = get().prompts;
+        prompt.id = nanoid();
+        prompt.isUser = true;
+        prompt.createdAt = Date.now();
+        prompts[prompt.id] = prompt;
 
-      if (!targetPrompt) {
-        return SearchService.builtinPrompts.find((v) => v.id === id);
-      }
+        set(() => ({
+          prompts: prompts,
+        }));
 
-      return targetPrompt;
-    },
+        return prompt.id!;
+      },
 
-    remove(id: string) {
-      const prompts = get().prompts;
-      delete prompts[id];
+      get(id: string) {
+        const targetPrompt = get().prompts[id];
 
-      Object.entries(prompts).some(([key, prompt]) => {
-        if (prompt.id === id) {
-          delete prompts[key];
-          return true;
+        if ( !targetPrompt ) {
+          return SearchService.builtinPrompts.find((v) => v.id === id);
         }
-        return false;
-      });
-
-      SearchService.remove(id);
 
-      set(() => ({
-        prompts,
-        counter: get().counter + 1,
-      }));
-    },
-
-    getUserPrompts() {
-      const userPrompts = Object.values(get().prompts ?? {});
-      userPrompts.sort((a, b) =>
-        b.id && a.id ? b.createdAt - a.createdAt : 0,
-      );
-      return userPrompts;
-    },
+        return targetPrompt;
+      },
 
-    updatePrompt(id: string, updater: (prompt: Prompt) => void) {
-      const prompt = get().prompts[id] ?? {
-        title: "",
-        content: "",
-        id,
-      };
-
-      SearchService.remove(id);
-      updater(prompt);
-      const prompts = get().prompts;
-      prompts[id] = prompt;
-      set(() => ({ prompts }));
-      SearchService.add(prompt);
-    },
-
-    search(text: string) {
-      if (text.length === 0) {
-        // return all rompts
-        return this.getUserPrompts().concat(SearchService.builtinPrompts);
-      }
-      return SearchService.search(text) as Prompt[];
-    },
-  }),
-  {
-    name: StoreKey.Prompt,
-    version: 3,
+      remove(id: string) {
+        const prompts = get().prompts;
+        delete prompts[id];
 
-    migrate(state, version) {
-      const newState = JSON.parse(JSON.stringify(state)) as {
-        prompts: Record<string, Prompt>;
-      };
-
-      if (version < 3) {
-        Object.values(newState.prompts).forEach((p) => (p.id = nanoid()));
-      }
-
-      return newState as any;
-    },
-
-    onRehydrateStorage(state) {
-      const PROMPT_URL = "./prompts.json";
-
-      type PromptList = Array<[string, string]>;
-
-      fetch(PROMPT_URL)
-        .then((res) => res.json())
-        .then((res) => {
-          let fetchPrompts = [res.en, res.tw, res.cn];
-          if (getLang() === "cn") {
-            fetchPrompts = fetchPrompts.reverse();
+        Object.entries(prompts).some(([ key, prompt ]) => {
+          if ( prompt.id === id ) {
+            delete prompts[key];
+            return true;
           }
-          const builtinPrompts = fetchPrompts.filter(item => item).map((promptList: PromptList) => {
-            return promptList.map(
-              ([title, content]) =>
-                ({
-                  id: nanoid(),
-                  title,
-                  content,
-                  createdAt: Date.now(),
-                }) as Prompt,
-            );
-          });
-
-          const userPrompts = usePromptStore.getState().getUserPrompts() ?? [];
-
-          const allPromptsForSearch = builtinPrompts
-            .reduce((pre, cur) => pre.concat(cur), [])
-            .filter((v) => !!v.title && !!v.content);
-          SearchService.count.builtin =
-            res.en.length + res.cn.length + res.tw.length;
-          SearchService.init(allPromptsForSearch, userPrompts);
+          return false;
         });
+
+        SearchService.remove(id);
+
+        set(() => ({
+          prompts,
+          counter: get().counter + 1,
+        }));
+      },
+
+      getUserPrompts() {
+        const userPrompts = Object.values(get().prompts ?? {});
+        userPrompts.sort((a, b) =>
+            b.id && a.id ? b.createdAt - a.createdAt : 0,
+        );
+        return userPrompts;
+      },
+
+      updatePrompt(id: string, updater: (prompt: Prompt) => void) {
+        const prompt = get().prompts[id] ?? {
+          title: "",
+          content: "",
+          id,
+        };
+
+        SearchService.remove(id);
+        updater(prompt);
+        const prompts = get().prompts;
+        prompts[id] = prompt;
+        set(() => ({prompts}));
+        SearchService.add(prompt);
+      },
+
+      search(text: string) {
+        if ( text.length === 0 ) {
+          // return all rompts
+          return this.getUserPrompts().concat(SearchService.builtinPrompts);
+        }
+        return SearchService.search(text) as Prompt[];
+      },
+    }),
+    {
+      name: StoreKey.Prompt,
+      version: 3,
+
+      migrate(state, version) {
+        const newState = JSON.parse(JSON.stringify(state)) as {
+          prompts: Record<string, Prompt>;
+        };
+
+        if ( version < 3 ) {
+          Object.values(newState.prompts).forEach((p) => (p.id = nanoid()));
+        }
+
+        return newState as any;
+      },
+
+      onRehydrateStorage(state) {
+        const PROMPT_URL = "./prompts.json";
+
+        type PromptList = Array<[ string, string ]>; // [标题, 内容]的元组数组
+        // tw: Array<[string, string]>; // 已停用繁体中文提示词
+        // en: Array<[string, string]>; // 已停用英文提示词
+
+        fetch(PROMPT_URL)
+            .then((res) => res.json())
+            .then((res) => {
+              let fetchPrompts = [
+                // res.en, res.tw,  // 注释掉英文和繁体中文提示词
+                res.cn ];
+          // if ( getLang() === "cn" ) {
+          //   fetchPrompts = fetchPrompts.reverse();
+          // }
+              const builtinPrompts = fetchPrompts.filter(item => item).map((promptList: PromptList) => {
+                return promptList.map(
+                    ([ title, content ]) =>
+                        ({
+                          id: nanoid(),
+                          title,
+                          content,
+                          createdAt: Date.now(),
+                        }) as Prompt,
+                );
+              });
+
+              const userPrompts = usePromptStore.getState().getUserPrompts() ?? [];
+
+              const allPromptsForSearch = builtinPrompts
+                  .reduce((pre, cur) => pre.concat(cur), [])
+                  .filter((v) => !!v.title && !!v.content);
+              SearchService.count.builtin =
+                  res.cn.length; // 仅计算中文提示词数量
+              SearchService.init(allPromptsForSearch, userPrompts);
+            });
+      },
     },
-  },
 );

+ 1 - 1
next.config.mjs

@@ -96,7 +96,7 @@ if (mode !== "export") {
       },
       {
         source: "/deepseek-api/:path*",
-        destination: "http://117.176.244.35:18078/:path*",
+        destination: "http://10.1.27.6:11817/:path*",
       },
     ];
 

+ 3 - 3
package.json

@@ -5,7 +5,7 @@
   "description": "AI问答-客户端",
   "license": "MIT",
   "scripts": {
-    "dev": "concurrently -r \"yarn run mask:watch\" \"next dev\"",
+    "dev": "next dev",
     "out": "yarn run build && yarn run export",
     "mask": "npx tsx app/masks/build.ts",
     "mask:watch": "npx watch \"yarn mask\" app/masks",
@@ -13,8 +13,8 @@
     "start": "next start",
     "lint": "next lint",
     "export": "cross-env BUILD_MODE=export BUILD_APP=1 next build",
-    "export:dev": "concurrently -r \"yarn mask:watch\"  \"cross-env BUILD_MODE=export BUILD_APP=1 next dev\"",
-    "app:dev": "concurrently -r \"yarn mask:watch\" \"yarn tauri dev\"",
+    "export:dev": "cross-env BUILD_MODE=export BUILD_APP=1 next dev",
+    "app:dev": "yarn tauri dev",
     "app:build": "yarn mask && yarn tauri build",
     "prompts": "node ./scripts/fetch-prompts.mjs",
     "prepare": "husky install",

File diff suppressed because it is too large
+ 0 - 400
public/masks_bk.json


File diff suppressed because it is too large
+ 0 - 4
public/prompts_bk.json


Some files were not shown because too many files changed in this diff