From 9e6617e3ca251260943ce0ebc15f2fff1022df26 Mon Sep 17 00:00:00 2001 From: Yidadaa Date: Thu, 6 Jul 2023 01:11:50 +0800 Subject: [PATCH 01/12] feat: add max icon for modals --- app/components/exporter.module.scss | 2 +- app/components/ui-lib.module.scss | 29 +++++++++++++++++++++++++---- app/components/ui-lib.tsx | 25 ++++++++++++++++++++++--- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/app/components/exporter.module.scss b/app/components/exporter.module.scss index 3fde363f0..c2046ffc0 100644 --- a/app/components/exporter.module.scss +++ b/app/components/exporter.module.scss @@ -186,7 +186,7 @@ box-shadow: var(--card-shadow); border: var(--border-in-light); - * { + *:not(li) { overflow: hidden; } } diff --git a/app/components/ui-lib.module.scss b/app/components/ui-lib.module.scss index d2ddb7df8..86b467e53 100644 --- a/app/components/ui-lib.module.scss +++ b/app/components/ui-lib.module.scss @@ -79,6 +79,19 @@ --modal-padding: 20px; + &-max { + width: 95vw; + max-width: unset; + height: 95vh; + display: flex; + flex-direction: column; + + .modal-content { + max-height: unset !important; + flex-grow: 1; + } + } + .modal-header { padding: var(--modal-padding); display: flex; @@ -91,11 +104,19 @@ font-size: 16px; } - .modal-close-btn { - cursor: pointer; + .modal-header-actions { + display: flex; - &:hover { - filter: brightness(1.2); + .modal-header-action { + cursor: pointer; + + &:not(:last-child) { + margin-right: 20px; + } + + &:hover { + filter: brightness(1.2); + } } } } diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index e02051c01..5e6a50dc7 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -6,6 +6,8 @@ import EyeOffIcon from "../icons/eye-off.svg"; import DownIcon from "../icons/down.svg"; import ConfirmIcon from "../icons/confirm.svg"; import CancelIcon from "../icons/cancel.svg"; +import MaxIcon from "../icons/max.svg"; +import MinIcon from "../icons/min.svg"; import Locale from "../locales"; @@ -111,13 +113,30 @@ export function Modal(props: ModalProps) { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const [isMax, setMax] = useState(false); + return ( -
+
{props.title}
-
- +
+
setMax(!isMax)} + > + {isMax ? : } +
+
+ +
From 6c6a2d08db4b8f74ded430c93125ffbc8f1d0eaf Mon Sep 17 00:00:00 2001 From: Yidadaa Date: Thu, 6 Jul 2023 01:26:06 +0800 Subject: [PATCH 02/12] feat: close #2267 display a modal to export image --- app/components/exporter.tsx | 31 +++++++++++++++++++++++++------ app/components/ui-lib.tsx | 3 ++- app/locales/cn.ts | 4 ++++ app/locales/en.ts | 4 ++++ 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/app/components/exporter.tsx b/app/components/exporter.tsx index 7765b77aa..f26b3a7d2 100644 --- a/app/components/exporter.tsx +++ b/app/components/exporter.tsx @@ -1,7 +1,8 @@ +/* eslint-disable @next/next/no-img-element */ import { ChatMessage, useAppConfig, useChatStore } from "../store"; import Locale from "../locales"; import styles from "./exporter.module.scss"; -import { List, ListItem, Modal, Select, showToast } from "./ui-lib"; +import { List, ListItem, Modal, Select, showModal, showToast } from "./ui-lib"; import { IconButton } from "./button"; import { copyToClipboard, downloadAs, useMobileScreen } from "../utils"; @@ -23,6 +24,7 @@ import { DEFAULT_MASK_AVATAR } from "../store/mask"; import { api } from "../client/api"; import { prettyObject } from "../utils/format"; import { EXPORT_MESSAGE_CLASS_NAME } from "../constant"; +import { getClientConfig } from "../config/client"; const Markdown = dynamic(async () => (await import("./markdown")).Markdown, { loading: () => , @@ -357,6 +359,24 @@ function ExportAvatar(props: { avatar: string }) { return ; } +export function showImageModal(img: string) { + showModal({ + title: Locale.Export.Image.Modal, + children: ( +
+ preview +
+ ), + defaultMax: true, + }); +} + export function ImagePreviewer(props: { messages: ChatMessage[]; topic: string; @@ -369,6 +389,7 @@ export function ImagePreviewer(props: { const previewRef = useRef(null); const copy = () => { + showToast(Locale.Export.Image.Toast); const dom = previewRef.current; if (!dom) return; toBlob(dom).then((blob) => { @@ -393,17 +414,15 @@ export function ImagePreviewer(props: { const isMobile = useMobileScreen(); const download = () => { + showToast(Locale.Export.Image.Toast); const dom = previewRef.current; if (!dom) return; toPng(dom) .then((blob) => { if (!blob) return; - if (isMobile) { - const image = new Image(); - image.src = blob; - const win = window.open(""); - win?.document.write(image.outerHTML); + if (isMobile || getClientConfig()?.isApp) { + showImageModal(blob); } else { const link = document.createElement("a"); link.download = `${props.topic}.png`; diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index 5e6a50dc7..da520bd84 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -95,6 +95,7 @@ interface ModalProps { title: string; children?: any; actions?: JSX.Element[]; + defaultMax?: boolean; onClose?: () => void; } export function Modal(props: ModalProps) { @@ -113,7 +114,7 @@ export function Modal(props: ModalProps) { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const [isMax, setMax] = useState(false); + const [isMax, setMax] = useState(!!props.defaultMax); return (
Date: Wed, 5 Jul 2023 23:31:45 +0600 Subject: [PATCH 03/12] Added support for Bangla language --- app/locales/bn.ts | 284 +++++++++++++++++++++++++++++++++++++++++++ app/locales/index.ts | 3 + 2 files changed, 287 insertions(+) create mode 100644 app/locales/bn.ts diff --git a/app/locales/bn.ts b/app/locales/bn.ts new file mode 100644 index 000000000..e6d204868 --- /dev/null +++ b/app/locales/bn.ts @@ -0,0 +1,284 @@ +import { SubmitKey } from "../store/config"; +import { RequiredLocaleType } from "./index"; + +const bn: RequiredLocaleType = { + WIP: "শীঘ্রই আসছে...", + Error: { + Unauthorized: + "অননুমোদিত অ্যাক্সেস, দয়া করে [অথোরিটি](/#/auth) পৃষ্ঠায় অ্যাক্সেস কোড ইনপুট করুন।", + }, + Auth: { + Title: "অ্যাক্সেস কোড প্রয়োজন", + Tips: "নীচে অ্যাক্সেস কোড ইনপুট করুন", + Input: "অ্যাক্সেস কোড", + Confirm: "কনফার্ম", + Later: "পরে", + }, + ChatItem: { + ChatItemCount: (count: number) => `${count} মেসেজ`, + }, + Chat: { + SubTitle: (count: number) => `${count} মেসেজ ChatGPT সঙ্গে`, + Actions: { + ChatList: "চ্যাট লিস্টে যান", + CompressedHistory: "সংক্ষিপ্ত ইতিহাস মেমোরি প্রম্পট", + Export: "সমস্ত মেসেজ মার্কডাউন হিসাবে এক্সপোর্ট করুন", + 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: "TheChatGPT থেকে মেসেজ", + 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: "সমস্ত সেটিংস", + Actions: { + ClearAll: "সমস্ত ডেটা সাফ করুন", + ResetAll: "সমস্ত সেটিংস পুনরায় সেট করুন", + Close: "বন্ধ করুন", + ConfirmResetAll: "আপনি কি নিশ্চিত যে আপনি সমস্ত কনফিগারেশন পুনরায় সেট করতে চান?", + ConfirmClearAll: "আপনি কি নিশ্চিত যে আপনি সমস্ত ডেটা পুনরায় সেট করতে চান?", + }, + Lang: { + Name: "Bangla", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` + All: "সমস্ত ভাষা", + }, + Avatar: "অবতার", + FontSize: { + Title: "ফন্ট সাইজ", + SubTitle: "চ্যাটের সন্তুষ্টির ফন্ট সাইজ সংযোজন করুন", + }, + Update: { + Version: (x: string) => `সংস্করণ: ${x}`, + IsLatest: "সর্বশেষ সংস্করণ", + CheckUpdate: "আপডেট চেক করুন", + IsChecking: "চেক করা হচ্ছে...", + FoundUpdate: (x: string) => `নতুন সংস্করণ পাওয়া গেছে: ${x}`, + GoToUpdate: "আপডেট করুন", + }, + SendKey: "কী পাঠান", + Theme: "থিম", + TightBorder: "সঙ্গতিহীন বর্ডার", + SendPreviewBubble: { + Title: "পূর্বরূপ বুদ্ধিমান বুদ্ধি", + SubTitle: "বুড়ি মধ্যে মার্কডাউন পূর্বরূপ প্রদর্শন করুন", + }, + Mask: { + 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: + "যদি অসংক্ষিপ্ত মেসেজের দৈর্ঘ্য এই মানের চেয়ে বেশি হয়", + }, + Token: { + Title: "API কী", + SubTitle: "অ্যাক্সেস কোড সীমা উপেক্ষা করতে আপনার কী ব্যবহার করুন", + Placeholder: "অপেনএআই এপিআই কী", + }, + Usage: { + Title: "অ্যাকাউন্ট ব্যালেন্স", + SubTitle(used: any, total: any) { + return `মাসে ব্যবহৃত $${used}, সাবস্ক্রিপশন $${total}`; + }, + IsChecking: "চেক করা হচ্ছে...", + Check: "চেক করুন", + NoAccess: "ব্যালেন্স চেক করতে API কী প্রবেশ করুন", + }, + AccessCode: { + Title: "অ্যাক্সেস কোড", + SubTitle: "অ্যাক্সেস নিয়ন্ত্রণ সক্ষম", + Placeholder: "অ্যাক্সেস কোড প্রয়োজন", + }, + Endpoint: { + Title: "এন্ডপয়েন্ট", + SubTitle: "কাস্টম এন্ডপয়েন্ট একটি http(s):// দিয়ে শুরু হতে হবে", + }, + Model: "মডেল", + Temperature: { + Title: "তাপমাত্রা", + SubTitle: "বড় মান বেশি একটি যিনির্দিষ্ট আউটপুট তৈরি করে", + }, + MaxTokens: { + Title: "সর্বাধিক টোকেন", + SubTitle: "ইনপুট টোকেন এবং জেনারেট টোকেনের সর্বাধিক দৈর্ঘ্য", + }, + PresencePenalty: { + Title: "উপস্থিতির জরিমানা", + SubTitle: "বড় মান নতুন বিষয় সম্পর্কে কথা বলার সম্ভাবনা বাড়ায়", + }, + }, + Store: { + DefaultTopic: "নতুন কনভার্সেশন", + BotHello: "হ্যালো! আমি আপনাকে কিভাবে সাহায্য করতে পারি?", + Error: "কিছু ভুল হয়েছে, দয়া করে পরে আবার চেষ্টা করুন।", + Prompt: { + History: (content: string) => + "এটি একটি চ্যাট ইতিহাসের সংক্ষিপ্ত সংক্ষেপণ হিসাবে: " + content, + Topic: + "অনুগ্রহ করে আমাদের কথোপকথনটির সংক্ষেপের জন্য একটি চার থেকে পাঁচ শব্দের শিরোনাম তৈরি করুন যাতে কোনো প্রবেশদ্বার, বিরামচিহ্ন, উদ্ধৃতি চিহ্ন, পূর্ণবিরাম, প্রতীক অথবা অতিরিক্ত লেখা না থাকে। আবর্তনযোগ্য উদ্ধৃতি চিহ্ন সরান।", + Summarize: + "আসলে আলোচনাটি সংক্ষেপে সংক্ষিপ্তসারে বর্ণনা করুন, যা ভবিষ্যতে প্রম্পট হিসাবে ব্যবহার করা যাবে।", + }, + }, + Copy: { + Success: "ক্লিপবোর্ডে কপি করা হয়েছে", + Failed: "কপি ব্যর্থ হয়েছে, দয়া করে ক্লিপবোর্ডে অ্যাক্সেসের অনুমতি প্রদান করুন", + }, + Context: { + Toast: (x: any) => `${x} সংযুক্তকালীন প্রম্পটসহ`, + Edit: "সংযুক্তকালীন এবং মেমোরি প্রম্পটসমূহ", + Add: "একটি প্রম্পট যোগ করুন", + Clear: "সংকেত সাফ করুন", + Revert: "পূর্ববর্তী অবস্থানে ফিরে যান", + }, + Plugin: { + Name: "প্লাগিন", + }, + 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: "সম্পাদন করুন", + }, +}; + +export default bn; \ No newline at end of file diff --git a/app/locales/index.ts b/app/locales/index.ts index abdb4eaab..7ece45838 100644 --- a/app/locales/index.ts +++ b/app/locales/index.ts @@ -13,6 +13,7 @@ import no from "./no"; import cs from "./cs"; import ko from "./ko"; import ar from "./ar"; +import bn from "./bn"; import { merge } from "../utils/merge"; import type { LocaleType } from "./cn"; @@ -34,6 +35,7 @@ const ALL_LANGS = { cs, no, ar, + bn, }; export type Lang = keyof typeof ALL_LANGS; @@ -56,6 +58,7 @@ export const ALL_LANG_OPTIONS: Record = { cs: "Čeština", no: "Nynorsk", ar: "العربية", + bn: "বাংলা", }; const LANG_KEY = "lang"; From b718285125879382aaa5fe6508b7809186f6b906 Mon Sep 17 00:00:00 2001 From: Yidadaa Date: Thu, 6 Jul 2023 01:33:30 +0800 Subject: [PATCH 04/12] feat: improve svg viewer --- app/components/exporter.tsx | 28 +++++++++------------------- app/components/markdown.tsx | 13 ++++++++----- app/components/ui-lib.tsx | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/app/components/exporter.tsx b/app/components/exporter.tsx index f26b3a7d2..f9d86a552 100644 --- a/app/components/exporter.tsx +++ b/app/components/exporter.tsx @@ -2,7 +2,15 @@ import { ChatMessage, useAppConfig, useChatStore } from "../store"; import Locale from "../locales"; import styles from "./exporter.module.scss"; -import { List, ListItem, Modal, Select, showModal, showToast } from "./ui-lib"; +import { + List, + ListItem, + Modal, + Select, + showImageModal, + showModal, + showToast, +} from "./ui-lib"; import { IconButton } from "./button"; import { copyToClipboard, downloadAs, useMobileScreen } from "../utils"; @@ -359,24 +367,6 @@ function ExportAvatar(props: { avatar: string }) { return ; } -export function showImageModal(img: string) { - showModal({ - title: Locale.Export.Image.Modal, - children: ( -
- preview -
- ), - defaultMax: true, - }); -} - export function ImagePreviewer(props: { messages: ChatMessage[]; topic: string; diff --git a/app/components/markdown.tsx b/app/components/markdown.tsx index 4db5f573b..3168641c7 100644 --- a/app/components/markdown.tsx +++ b/app/components/markdown.tsx @@ -12,6 +12,7 @@ import mermaid from "mermaid"; import LoadingIcon from "../icons/three-dots.svg"; import React from "react"; import { useDebouncedCallback, useThrottledCallback } from "use-debounce"; +import { showImageModal } from "./ui-lib"; export function Mermaid(props: { code: string }) { const ref = useRef(null); @@ -37,11 +38,13 @@ export function Mermaid(props: { code: string }) { if (!svg) return; const text = new XMLSerializer().serializeToString(svg); const blob = new Blob([text], { type: "image/svg+xml" }); - const url = URL.createObjectURL(blob); - const win = window.open(url); - if (win) { - win.onload = () => URL.revokeObjectURL(url); - } + console.log(blob); + // const url = URL.createObjectURL(blob); + // const win = window.open(url); + // if (win) { + // win.onload = () => URL.revokeObjectURL(url); + // } + showImageModal(URL.createObjectURL(blob)); } if (hasError) { diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index da520bd84..512044dca 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @next/next/no-img-element */ import styles from "./ui-lib.module.scss"; import LoadingIcon from "../icons/three-dots.svg"; import CloseIcon from "../icons/close.svg"; @@ -414,3 +415,20 @@ export function showPrompt(content: any, value = "", rows = 3) { ); }); } + +export function showImageModal(img: string) { + showModal({ + title: Locale.Export.Image.Modal, + children: ( +
+ preview +
+ ), + }); +} From 8a6a13e583d1b499c7b08fa4a47b4755000f501f Mon Sep 17 00:00:00 2001 From: ki-ask Date: Wed, 5 Jul 2023 23:35:55 +0600 Subject: [PATCH 05/12] Added support for Bangla language --- app/locales/bn.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/locales/bn.ts b/app/locales/bn.ts index e6d204868..5f24d5c19 100644 --- a/app/locales/bn.ts +++ b/app/locales/bn.ts @@ -108,7 +108,7 @@ const bn: RequiredLocaleType = { ConfirmClearAll: "আপনি কি নিশ্চিত যে আপনি সমস্ত ডেটা পুনরায় সেট করতে চান?", }, Lang: { - Name: "Bangla", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` + Name: "বাংলা", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` All: "সমস্ত ভাষা", }, Avatar: "অবতার", From 6897bf1254dac3ebe4f05d4617b1e6ed33a7105a Mon Sep 17 00:00:00 2001 From: ki-ask Date: Wed, 5 Jul 2023 23:39:22 +0600 Subject: [PATCH 06/12] Added support for Bangla language --- app/locales/bn.ts | 2 +- app/locales/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/locales/bn.ts b/app/locales/bn.ts index 5f24d5c19..e6d204868 100644 --- a/app/locales/bn.ts +++ b/app/locales/bn.ts @@ -108,7 +108,7 @@ const bn: RequiredLocaleType = { ConfirmClearAll: "আপনি কি নিশ্চিত যে আপনি সমস্ত ডেটা পুনরায় সেট করতে চান?", }, Lang: { - Name: "বাংলা", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` + Name: "Bangla", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` All: "সমস্ত ভাষা", }, Avatar: "অবতার", diff --git a/app/locales/index.ts b/app/locales/index.ts index 7ece45838..56538176c 100644 --- a/app/locales/index.ts +++ b/app/locales/index.ts @@ -58,7 +58,7 @@ export const ALL_LANG_OPTIONS: Record = { cs: "Čeština", no: "Nynorsk", ar: "العربية", - bn: "বাংলা", + bn: "Bangla", }; const LANG_KEY = "lang"; From 596b6542e80c87a1526b2f7b6c4616c6222eaaa5 Mon Sep 17 00:00:00 2001 From: ki-ask Date: Wed, 5 Jul 2023 23:55:14 +0600 Subject: [PATCH 07/12] Added support for Bangla language --- app/locales/bn.ts | 265 +++++++++++++++++++++++++++------------------- 1 file changed, 158 insertions(+), 107 deletions(-) diff --git a/app/locales/bn.ts b/app/locales/bn.ts index e6d204868..5f98ba21d 100644 --- a/app/locales/bn.ts +++ b/app/locales/bn.ts @@ -1,236 +1,276 @@ import { SubmitKey } from "../store/config"; -import { RequiredLocaleType } from "./index"; +import { LocaleType } from "./index"; -const bn: RequiredLocaleType = { +const bn: LocaleType = { WIP: "শীঘ্রই আসছে...", Error: { Unauthorized: - "অননুমোদিত অ্যাক্সেস, দয়া করে [অথোরিটি](/#/auth) পৃষ্ঠায় অ্যাক্সেস কোড ইনপুট করুন।", + "অননুমোদিত অ্যাক্সেস, অনুগ্রহ করে [অথোরাইজশন](/#/auth) পৃষ্ঠায় অ্যাক্সেস কোড ইনপুট করুন।", }, Auth: { - Title: "অ্যাক্সেস কোড প্রয়োজন", + Title: "একটি অ্যাক্সেস কোড প্রয়োজন", Tips: "নীচে অ্যাক্সেস কোড ইনপুট করুন", Input: "অ্যাক্সেস কোড", - Confirm: "কনফার্ম", + Confirm: "নিশ্চিত করুন", Later: "পরে", }, ChatItem: { - ChatItemCount: (count: number) => `${count} মেসেজ`, + ChatItemCount: (count: number) => `${count} টি বার্তা`, }, Chat: { - SubTitle: (count: number) => `${count} মেসেজ ChatGPT সঙ্গে`, + SubTitle: (count: number) => `${count} টি বার্তা`, Actions: { - ChatList: "চ্যাট লিস্টে যান", + ChatList: "চ্যাট তালিকায় যান", CompressedHistory: "সংক্ষিপ্ত ইতিহাস মেমোরি প্রম্পট", - Export: "সমস্ত মেসেজ মার্কডাউন হিসাবে এক্সপোর্ট করুন", - Copy: "অনুলিপি", + Export: "সমস্ত বার্তা মার্কডাউন হিসাবে রপ্তানি করুন", + Copy: "কপি", Stop: "বন্ধ করুন", Retry: "পুনরায় চেষ্টা করুন", + Pin: "পিন করুন", + PinToastContent: "পিন করা হয়েছে ২টি বার্তা প্রম্পটে", + PinToastAction: "দেখুন", Delete: "মুছে ফেলুন", + Edit: "সম্পাদন করুন", + }, + Commands: { + new: "নতুন চ্যাট শুরু করুন", + newm: "মাস্ক সহ নতুন চ্যাট শুরু করুন", + next: "পরবর্তী চ্যাট", + prev: "পূর্ববর্তী চ্যাট", + clear: "সংশ্লিষ্টতাবদ্ধকরণ পরিষ্কার করুন", + del: "চ্যাট মুছুন", }, InputActions: { Stop: "বন্ধ করুন", - ToBottom: "সর্বশেষে যান", + ToBottom: "সর্বশেষতম দিকে", Theme: { - auto: "স্বয়ংক্রিয়", + auto: "অটো", light: "হালকা থিম", dark: "ডার্ক থিম", }, - Prompt: "প্রম্পট", - Masks: "মাস্ক", - Clear: "সংকেত সাফ করুন", + Prompt: "প্রম্পটগুলিতে", + Masks: "মাস্কগুলি", + Clear: "সংশ্লিষ্টতাবদ্ধকরণ পরিষ্কার করুন", Settings: "সেটিংস", }, - Rename: "চ্যাটের নাম পরিবর্তন করুন", - Typing: "টাইপ হচ্ছে...", + Rename: "চ্যাট পুনঃনামকরণ করুন", + Typing: "টাইপিং...", Input: (submitKey: string) => { - var inputHints = `${submitKey} পাঠানোর জন্য`; + var inputHints = `${submitKey} to send`; if (submitKey === String(SubmitKey.Enter)) { - inputHints += ", ওয়ার্প করার জন্য Shift + Enter"; + inputHints += ", Shift + Enter to wrap"; } - return inputHints + ", / প্রম্পট অনুসন্ধান করতে"; + return inputHints + ", / to search prompts, : to use commands"; }, - Send: "পাঠান", + Send: "প্রেরণ করুন", Config: { - Reset: "ডিফল্টে পুনরায় সেট করুন", + Reset: "ডিফল্টে রিসেট করুন", SaveAs: "মাস্ক হিসাবে সংরক্ষণ করুন", }, }, Export: { - Title: "মেসেজ এক্সপোর্ট করুন", - Copy: "সমস্ত অনুলিপি করুন", + Title: "বার্তা রপ্তানিকরণ", + Copy: "সমস্তটি কপি করুন", Download: "ডাউনলোড করুন", - MessageFromYou: "আপনার মেসেজ", - MessageFromChatGPT: "TheChatGPT থেকে মেসেজ", - Share: "কিয়াস্ক শেয়ার এ শেয়ার করুন", + MessageFromYou: "আপনার বার্তা", + MessageFromChatGPT: "চ্যাটজিপিটির বার্তা", + Share: "শেয়ার করুন শেয়ারজিপিটি তে", Format: { - Title: "এক্সপোর্ট ফর্ম্যাট", - SubTitle: "মার্কডাউন বা পিএনজি ইমেজ", + Title: "রপ্তানি ফরম্যাট", + SubTitle: "মার্কডাউন বা পিএনজি চিত্র", }, IncludeContext: { - Title: "সংশ্লিষ্ট প্রম্পট অন্তর্ভুক্ত করুন", - SubTitle: "মাস্কে সংশ্লিষ্ট প্রম্পট নির্যাতন করুন কিনা", + Title: "মাস্ক অন্তর্ভুক্ত করুন", + SubTitle: "মাস্কগুলি সংরক্ষণ করবেন না কি", }, Steps: { Select: "নির্বাচন করুন", - Preview: "পূর্বরূপ", + Preview: "প্রিভিউ করুন", }, }, Select: { Search: "অনুসন্ধান করুন", - All: "সব নির্বাচন করুন", - Latest: "সর্বশেষ নির্বাচন করুন", - Clear: "সাফ করুন", + All: "সমস্তটি নির্বাচন করুন", + Latest: "সর্বশেষতমটি নির্বাচন করুন", + Clear: "পরিষ্কার করুন", }, Memory: { Title: "মেমোরি প্রম্পট", EmptyContent: "এখনও কিছুই নেই।", - Send: "মেমোরি পাঠান", - Copy: "মেমোরি অনুলিপি করুন", - Reset: "সেশন পুনরায় সেট করুন", + Send: "মেমোরি প্রেরণ করুন", + Copy: "মেমোরি কপি করুন", + Reset: "পুনরায় নিশ্চিত করুন", ResetConfirm: - "রিসেট করলে বর্তমান চ্যাট ইতিহাস এবং ঐতিহাসিক মেমোরি সাফ হয়ে যাবে। আপনি কি নিশ্চিত যে আপনি রিসেট করতে চান?", + "রিসেট করলে বর্তমান চ্যাট ইতিহাস এবং ঐতিহাসিক মেমোরি মুছে যাবে। পুনরায় নির্দিষ্ট করতে চান তা নিশ্চিত করতে চান?", }, Home: { NewChat: "নতুন চ্যাট", - DeleteChat: "নির্বাচিত কনভার্সেশন মুছতে নিশ্চিত করুন?", - DeleteToast: "চ্যাট মুছে ফেলা হয়েছে", - Revert: "পূর্ববর্তী অবস্থানে ফিরে যান", + DeleteChat: "নির্বাচিত সংলাপটি মুছতে নিশ্চিত করুন?", + DeleteToast: "চ্যাটটি মুছেছেন", + Revert: "পুনরায়", }, Settings: { Title: "সেটিংস", SubTitle: "সমস্ত সেটিংস", - Actions: { - ClearAll: "সমস্ত ডেটা সাফ করুন", - ResetAll: "সমস্ত সেটিংস পুনরায় সেট করুন", - Close: "বন্ধ করুন", - ConfirmResetAll: "আপনি কি নিশ্চিত যে আপনি সমস্ত কনফিগারেশন পুনরায় সেট করতে চান?", - ConfirmClearAll: "আপনি কি নিশ্চিত যে আপনি সমস্ত ডেটা পুনরায় সেট করতে চান?", + Danger: { + Reset: { + Title: "সমস্ত সেটিংস পুনঃনির্দেশ দিন", + SubTitle: "সকল সেটিংস ডিফল্টে পুনঃনির্দেশ দিতে", + Action: "পুনঃনির্দেশ দিন", + Confirm: "সমস্ত সেটিংস ডিফল্টে পুনঃনির্দেশ করতে নিশ্চিত করতে?", + }, + Clear: { + Title: "সমস্ত তথ্য মুছুন", + SubTitle: "সমস্ত বার্তা এবং সেটিংস মুছুন", + Action: "মুছুন", + Confirm: "সমস্ত বার্তা এবং সেটিংস মুছে ফেলতে নিশ্চিত করতে?", + }, }, Lang: { - Name: "Bangla", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` + Name: "বাংলা", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` All: "সমস্ত ভাষা", }, Avatar: "অবতার", FontSize: { Title: "ফন্ট সাইজ", - SubTitle: "চ্যাটের সন্তুষ্টির ফন্ট সাইজ সংযোজন করুন", + SubTitle: "চ্যাট সামগ্রীর ফন্ট সাইজ সংশোধন করুন", }, + + InputTemplate: { + Title: "ইনপুট টেমপ্লেট", + SubTitle: "নতুনতম বার্তা এই টেমপ্লেটে পূরণ হবে", + }, + Update: { - Version: (x: string) => `সংস্করণ: ${x}`, - IsLatest: "সর্বশেষ সংস্করণ", - CheckUpdate: "আপডেট চেক করুন", - IsChecking: "চেক করা হচ্ছে...", - FoundUpdate: (x: string) => `নতুন সংস্করণ পাওয়া গেছে: ${x}`, - GoToUpdate: "আপডেট করুন", + Version: (x: string) => `Version: ${x}`, + IsLatest: "Latest version", + CheckUpdate: "Check Update", + IsChecking: "Checking update...", + FoundUpdate: (x: string) => `Found new version: ${x}`, + GoToUpdate: "Update", }, - SendKey: "কী পাঠান", + SendKey: "প্রেরণ চাবি", Theme: "থিম", - TightBorder: "সঙ্গতিহীন বর্ডার", + TightBorder: "সঙ্গতি সীমা", SendPreviewBubble: { - Title: "পূর্বরূপ বুদ্ধিমান বুদ্ধি", - SubTitle: "বুড়ি মধ্যে মার্কডাউন পূর্বরূপ প্রদর্শন করুন", + Title: "প্রিভিউ বুলবুল প্রেরণ করুন", + SubTitle: "বুলবুলে মার্কডাউন প্রিভিউ করুন", }, Mask: { - Title: "মাস্ক স্প্ল্যাশ স্ক্রিন", - SubTitle: "নতুন চ্যাট শুরু করার আগে একটি মাস্ক স্প্ল্যাশ স্ক্রিন দেখান", + Splash: { + Title: "মাস্ক স্প্ল্যাশ স্ক্রিন", + SubTitle: "নতুন চ্যাট শুরু করার আগে মাস্ক স্প্ল্যাশ স্ক্রিন প্রদর্শন করুন", + }, + Builtin: { + Title: "মূলত মাস্ক গোপন করুন", + SubTitle: "মাস্ক তালিকা থেকে মূলত মাস্কগুলি লুকান", + }, }, Prompt: { Disable: { - Title: "অটো-সম্পূর্ণতা অক্ষম করুন", + Title: "অটো-সম্পূর্ণতা নিষ্ক্রিয় করুন", SubTitle: "অটো-সম্পূর্ণতা চালু করতে / ইনপুট করুন", }, List: "প্রম্পট তালিকা", ListCount: (builtin: number, custom: number) => - `${builtin} অভিন্নতম, ${custom} ব্যবহারকারী নির্ধারিত`, + `${builtin} built-in, ${custom} user-defined`, Edit: "সম্পাদন করুন", Modal: { Title: "প্রম্পট তালিকা", Add: "একটি যোগ করুন", - Search: "প্রম্পট অনুসন্ধান করুন", + Search: "সন্ধান প্রম্পট", }, EditModal: { - Title: "প্রম্পট সম্পাদনা করুন", + Title: "সম্পাদন করুন প্রম্পট", }, }, HistoryCount: { - Title: "সংযুক্ত মেসেজ সংখ্যা", - SubTitle: "প্রতি অনুরোধে প্রেরিত মেসেজের সংখ্যা", + Title: "সংযুক্ত বার্তা সংখ্যা", + SubTitle: "প্রতি অনুরোধে প্রেরণ করা গেলে প্রেরণ করা হবে", }, CompressThreshold: { - Title: "ইতিহাস সংক্ষিপ্ত করার সীমা", + Title: "ইতিহাস সঙ্কুচিত করার সীমা", SubTitle: - "যদি অসংক্ষিপ্ত মেসেজের দৈর্ঘ্য এই মানের চেয়ে বেশি হয়", + "নকুল বার্তা দৈর্ঘ্য সীমা অতিক্রান্ত হলে ঐ বার্তাটি সঙ্কুচিত হবে", }, Token: { - Title: "API কী", - SubTitle: "অ্যাক্সেস কোড সীমা উপেক্ষা করতে আপনার কী ব্যবহার করুন", - Placeholder: "অপেনএআই এপিআই কী", + Title: "অ্যাপি কী", + SubTitle: "অ্যাক্সেস কোড সীমা উপেক্ষা করতে আপনার কীটি ব্যবহার করুন", + Placeholder: "OpenAI API কী", }, Usage: { - Title: "অ্যাকাউন্ট ব্যালেন্স", + Title: "একাউন্ট ব্যালেন্স", SubTitle(used: any, total: any) { - return `মাসে ব্যবহৃত $${used}, সাবস্ক্রিপশন $${total}`; + return `এই মাসে ব্যবহৃত $${used}, সাবস্ক্রিপশন $${total}`; }, IsChecking: "চেক করা হচ্ছে...", - Check: "চেক করুন", - NoAccess: "ব্যালেন্স চেক করতে API কী প্রবেশ করুন", + Check: "চেক", + NoAccess: "ব্যালেন্স চেক করতে অ্যাপি কী ইনপুট করুন", }, AccessCode: { Title: "অ্যাক্সেস কোড", - SubTitle: "অ্যাক্সেস নিয়ন্ত্রণ সক্ষম", + SubTitle: "অ্যাক্সেস নিয়ন্ত্রণ সক্রিয়", Placeholder: "অ্যাক্সেস কোড প্রয়োজন", }, Endpoint: { - Title: "এন্ডপয়েন্ট", - SubTitle: "কাস্টম এন্ডপয়েন্ট একটি http(s):// দিয়ে শুরু হতে হবে", + Title: "ইনটারপয়েন্ট", + SubTitle: "কাস্টম এন্ডপয়েন্টটি হতে হবে http(s):// দিয়ে শুরু হতে হবে", }, Model: "মডেল", Temperature: { Title: "তাপমাত্রা", - SubTitle: "বড় মান বেশি একটি যিনির্দিষ্ট আউটপুট তৈরি করে", + SubTitle: "আরতি মান বেশি করলে বেশি এলোমেলো আউটপুট হবে", + }, + TopP: { + Title: "শীর্ষ পি", + SubTitle: "তাপমাত্রা সঙ্গে এই মান পরিবর্তন করবেন না", }, MaxTokens: { Title: "সর্বাধিক টোকেন", - SubTitle: "ইনপুট টোকেন এবং জেনারেট টোকেনের সর্বাধিক দৈর্ঘ্য", + SubTitle: "ইনপুট টোকেন এবং উৎপাদিত টোকেনের সর্বাধিক দৈর্ঘ্য", }, PresencePenalty: { Title: "উপস্থিতির জরিমানা", - SubTitle: "বড় মান নতুন বিষয় সম্পর্কে কথা বলার সম্ভাবনা বাড়ায়", + SubTitle: "আরতি মান বেশি করলে নতুন বিষয়গুলি সম্ভাব্যতা বাড়াতে পারে", + }, + FrequencyPenalty: { + Title: "ফ্রিকুয়েন্সি জরিমানা", + SubTitle: + "আরতি মান বাড়ালে একই লাইন পুনরায় ব্যাবহার করার সম্ভাবনা হ্রাস পায়", }, }, Store: { - DefaultTopic: "নতুন কনভার্সেশন", - BotHello: "হ্যালো! আমি আপনাকে কিভাবে সাহায্য করতে পারি?", - Error: "কিছু ভুল হয়েছে, দয়া করে পরে আবার চেষ্টা করুন।", + DefaultTopic: "নতুন সংলাপ", + BotHello: "হ্যালো! আজকে আপনাকে কিভাবে সাহায্য করতে পারি?", + Error: "কিছু নিয়ে ভুল হয়েছে, পরে আবার চেষ্টা করুন।", Prompt: { History: (content: string) => - "এটি একটি চ্যাট ইতিহাসের সংক্ষিপ্ত সংক্ষেপণ হিসাবে: " + content, + "এটি চ্যাট ইতিহাসের সংক্ষিপ্ত সংকলনের মতো: " + content, Topic: - "অনুগ্রহ করে আমাদের কথোপকথনটির সংক্ষেপের জন্য একটি চার থেকে পাঁচ শব্দের শিরোনাম তৈরি করুন যাতে কোনো প্রবেশদ্বার, বিরামচিহ্ন, উদ্ধৃতি চিহ্ন, পূর্ণবিরাম, প্রতীক অথবা অতিরিক্ত লেখা না থাকে। আবর্তনযোগ্য উদ্ধৃতি চিহ্ন সরান।", + "আমাদের সংলাপটির চার থেকে পাঁচ শব্দের একটি শিরোনাম তৈরি করুন যা আমাদের আলাপের সংক্ষিপ্তসার হিসাবে যোগ হবে না, যেমন অভিবৃত্তি, বিন্যাস, উদ্ধৃতি, পূর্বচালক চিহ্ন, পূর্বরোবক্তির যেকোনো চিহ্ন বা অতিরিক্ত পাঠ। মেয়াদশেষ উদ্ধৃতি চেষ্টা করুন।", Summarize: - "আসলে আলোচনাটি সংক্ষেপে সংক্ষিপ্তসারে বর্ণনা করুন, যা ভবিষ্যতে প্রম্পট হিসাবে ব্যবহার করা যাবে।", + "২০০ শব্দের লম্বা হয়ে মুহূর্তে আলোচনা সংক্ষেপের রপ্তানি করুন, যেটি ভবিষ্যতের প্রম্পট হিসাবে ব্যবহার করবেন।", }, }, Copy: { Success: "ক্লিপবোর্ডে কপি করা হয়েছে", - Failed: "কপি ব্যর্থ হয়েছে, দয়া করে ক্লিপবোর্ডে অ্যাক্সেসের অনুমতি প্রদান করুন", + Failed: "কপি ব্যর্থ, অনুমতি প্রদান করার জন্য অনুমতি প্রদান করুন", }, Context: { - Toast: (x: any) => `${x} সংযুক্তকালীন প্রম্পটসহ`, - Edit: "সংযুক্তকালীন এবং মেমোরি প্রম্পটসমূহ", + Toast: (x: any) => `With ${x} contextual prompts`, + Edit: "বর্তমান চ্যাট সেটিংস", Add: "একটি প্রম্পট যোগ করুন", - Clear: "সংকেত সাফ করুন", + Clear: "সঙ্গতি পরিস্কার করুন", Revert: "পূর্ববর্তী অবস্থানে ফিরে যান", }, Plugin: { - Name: "প্লাগিন", + Name: "প্লাগইন", }, Mask: { Name: "মাস্ক", Page: { Title: "প্রম্পট টেমপ্লেট", - SubTitle: (count: number) => `${count} প্রম্পট টেমপ্লেট`, + SubTitle: (count: number) => `${count} টি প্রম্পট টেমপ্লেট`, Search: "টেমপ্লেট অনুসন্ধান করুন", Create: "তৈরি করুন", }, @@ -244,7 +284,7 @@ const bn: RequiredLocaleType = { }, EditModal: { Title: (readonly: boolean) => - `প্রম্পট টেমপ্লেট সম্পাদনা করুন ${readonly ? "(পঠনযোগ্য)" : ""}`, + `প্রম্পট টেমপ্লেট সম্পাদন করুন ${readonly ? "(readonly)" : ""}`, Download: "ডাউনলোড করুন", Clone: "ক্লোন করুন", }, @@ -254,31 +294,42 @@ const bn: RequiredLocaleType = { Sync: { Title: "গ্লোবাল কনফিগ ব্যবহার করুন", SubTitle: "এই চ্যাটে গ্লোবাল কনফিগ ব্যবহার করুন", - Confirm: "কাস্টম কনফিগগুলি গ্লোবাল কনফিগের সাথে পরিবর্তন করতে নিশ্চিত করুন?", + Confirm: "গ্লোবাল কনফিগ দ্বারা কাস্টম কনফিগ ওভাররাইড করতে নিশ্চিত করতে?", }, HideContext: { - Title: "সংশ্লিষ্ট প্রম্পট লুকান", - SubTitle: "চ্যাটে সংশ্লিষ্ট প্রম্পট দেখান না", + Title: "সংশ্লিষ্টতা প্রম্পটগুলি লুকান", + SubTitle: "চ্যাটে সংশ্লিষ্টতা প্রম্পটগুলি দেখাবেন না", + }, + Share: { + Title: "এই মাস্কটি শেয়ার করুন", + SubTitle: "এই মাস্কের একটি লিঙ্ক তৈরি করুন", + Action: "লিঙ্ক কপি করুন", }, }, }, NewChat: { Return: "ফিরে যান", - Skip: "শুধুমাত্র শুরু করুন", - Title: "একটি মাস্ক নির্বাচন করুন", - SubTitle: "মাস্কের পিছনে মনের চ্যাট করুন", - More: "আরও খুঁজুন", - NotShow: "আর প্রদর্শন করবেন না", - ConfirmNoShow: "নিষ্ক্রিয় করতে নিশ্চিত করুন? পরে সেটিংসে এটি চালু করতে পারবেন।", + Skip: "শুরু করুন", + Title: "মাস্ক নির্বাচন করুন", + SubTitle: "মাস্কের পিছনে আত্মার সঙ্গে চ্যাট করুন", + More: "আরো খুঁজুন", + NotShow: "এখনও দেখাবেন না", + ConfirmNoShow: "নিষ্ক্রিয় করতে নিশ্চিত করুন? পরে আপনি এটি সেটিংসে সক্ষম করতে পারবেন।", }, UI: { - Confirm: "কনফার্ম", - Cancel: "বাতিল", + Confirm: "নিশ্চিত করুন", + Cancel: "বাতিল করুন", Close: "বন্ধ করুন", Create: "তৈরি করুন", Edit: "সম্পাদন করুন", }, + Exporter: { + Model: "মডেল", + Messages: "বার্তা", + Topic: "টপিক", + Time: "সময়", + }, }; export default bn; \ No newline at end of file From fe2c1c4ec667cdcf988cabc6bc2839389ed455ac Mon Sep 17 00:00:00 2001 From: ki-ask Date: Wed, 5 Jul 2023 23:55:43 +0600 Subject: [PATCH 08/12] Added support for Bangla language --- app/locales/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/locales/index.ts b/app/locales/index.ts index 56538176c..7ece45838 100644 --- a/app/locales/index.ts +++ b/app/locales/index.ts @@ -58,7 +58,7 @@ export const ALL_LANG_OPTIONS: Record = { cs: "Čeština", no: "Nynorsk", ar: "العربية", - bn: "Bangla", + bn: "বাংলা", }; const LANG_KEY = "lang"; From 0373b2c9dd646c288e7027fcd3e93a9fecf94658 Mon Sep 17 00:00:00 2001 From: Yidadaa Date: Thu, 6 Jul 2023 02:03:31 +0800 Subject: [PATCH 09/12] feat: close #2266 use modal to switch model --- app/components/chat.tsx | 44 ++++++++++++++++++++++--------- app/components/ui-lib.module.scss | 32 ++++++++++++++++++++++ app/components/ui-lib.tsx | 40 +++++++++++++++++++++++++++- 3 files changed, 103 insertions(+), 13 deletions(-) diff --git a/app/components/chat.tsx b/app/components/chat.tsx index 267161506..13105e843 100644 --- a/app/components/chat.tsx +++ b/app/components/chat.tsx @@ -61,7 +61,14 @@ import Locale from "../locales"; import { IconButton } from "./button"; import styles from "./chat.module.scss"; -import { ListItem, Modal, showConfirm, showPrompt, showToast } from "./ui-lib"; +import { + ListItem, + Modal, + Selector, + showConfirm, + showPrompt, + showToast, +} from "./ui-lib"; import { useLocation, useNavigate } from "react-router-dom"; import { LAST_INPUT_KEY, Path, REQUEST_TIMEOUT_MS } from "../constant"; import { Avatar } from "./emoji"; @@ -404,16 +411,11 @@ export function ChatActions(props: { // switch model const currentModel = chatStore.currentSession().mask.modelConfig.model; - function nextModel() { - const models = config.models.filter((m) => m.available).map((m) => m.name); - const modelIndex = models.indexOf(currentModel); - const nextIndex = (modelIndex + 1) % models.length; - const nextModel = models[nextIndex]; - chatStore.updateCurrentSession((session) => { - session.mask.modelConfig.model = nextModel as ModelType; - session.mask.syncGlobalConfig = false; - }); - } + const models = useMemo( + () => config.models.filter((m) => m.available).map((m) => m.name), + [config.models], + ); + const [showModelSelector, setShowModelSelector] = useState(false); return (
@@ -485,10 +487,28 @@ export function ChatActions(props: { /> setShowModelSelector(true)} text={currentModel} icon={} /> + + {showModelSelector && ( + ({ + title: m, + value: m, + }))} + onClose={() => setShowModelSelector(false)} + onSelection={(s) => { + if (s.length === 0) return; + chatStore.updateCurrentSession((session) => { + session.mask.modelConfig.model = s[0] as ModelType; + session.mask.syncGlobalConfig = false; + }); + showToast(s[0]); + }} + /> + )}
); } diff --git a/app/components/ui-lib.module.scss b/app/components/ui-lib.module.scss index 86b467e53..6e8b64e81 100644 --- a/app/components/ui-lib.module.scss +++ b/app/components/ui-lib.module.scss @@ -62,6 +62,7 @@ box-shadow: var(--card-shadow); margin-bottom: 20px; animation: slide-in ease 0.3s; + background: var(--white); } .list .list-item:last-child { @@ -270,3 +271,34 @@ border: 1px solid var(--primary); } } + +.selector { + position: fixed; + top: 0; + left: 0; + height: 100vh; + width: 100vw; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + + &-content { + .list { + overflow: hidden; + + .list-item { + cursor: pointer; + background-color: var(--white); + + &:hover { + filter: brightness(0.95); + } + + &:active { + filter: brightness(0.9); + } + } + } + } +} diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index 512044dca..814c0dd12 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -47,9 +47,13 @@ export function ListItem(props: { children?: JSX.Element | JSX.Element[]; icon?: JSX.Element; className?: string; + onClick?: () => void; }) { return ( -
+
{props.icon &&
{props.icon}
}
@@ -432,3 +436,37 @@ export function showImageModal(img: string) { ), }); } + +export function Selector(props: { + items: Array<{ + title: string; + subTitle?: string; + value: T; + }>; + onSelection?: (selection: T[]) => void; + onClose?: () => void; + multiple?: boolean; +}) { + return ( +
+
+ + {props.items.map((item, i) => { + return ( + { + props.onSelection?.([item.value]); + props.onClose?.(); + }} + > + ); + })} + +
+
+ ); +} From 52203b50eb9cdf94a8395a02006749fde0e82d27 Mon Sep 17 00:00:00 2001 From: Yidadaa Date: Thu, 6 Jul 2023 02:07:35 +0800 Subject: [PATCH 10/12] fixup --- app/components/ui-lib.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index 814c0dd12..b96809123 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -448,7 +448,7 @@ export function Selector(props: { multiple?: boolean; }) { return ( -
+
props.onClose?.()}>
{props.items.map((item, i) => { From 9a285ab9351af06efc37b5166df494d84ce89321 Mon Sep 17 00:00:00 2001 From: Yidadaa Date: Thu, 6 Jul 2023 02:12:37 +0800 Subject: [PATCH 11/12] fixup --- app/locales/bn.ts | 15 +++++++++------ app/locales/en.ts | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/locales/bn.ts b/app/locales/bn.ts index 5f98ba21d..065f4276a 100644 --- a/app/locales/bn.ts +++ b/app/locales/bn.ts @@ -1,7 +1,7 @@ import { SubmitKey } from "../store/config"; -import { LocaleType } from "./index"; +import { PartialLocaleType } from "./index"; -const bn: LocaleType = { +const bn: PartialLocaleType = { WIP: "শীঘ্রই আসছে...", Error: { Unauthorized: @@ -159,7 +159,8 @@ const bn: LocaleType = { Mask: { Splash: { Title: "মাস্ক স্প্ল্যাশ স্ক্রিন", - SubTitle: "নতুন চ্যাট শুরু করার আগে মাস্ক স্প্ল্যাশ স্ক্রিন প্রদর্শন করুন", + SubTitle: + "নতুন চ্যাট শুরু করার আগে মাস্ক স্প্ল্যাশ স্ক্রিন প্রদর্শন করুন", }, Builtin: { Title: "মূলত মাস্ক গোপন করুন", @@ -294,7 +295,8 @@ const bn: LocaleType = { Sync: { Title: "গ্লোবাল কনফিগ ব্যবহার করুন", SubTitle: "এই চ্যাটে গ্লোবাল কনফিগ ব্যবহার করুন", - Confirm: "গ্লোবাল কনফিগ দ্বারা কাস্টম কনফিগ ওভাররাইড করতে নিশ্চিত করতে?", + Confirm: + "গ্লোবাল কনফিগ দ্বারা কাস্টম কনফিগ ওভাররাইড করতে নিশ্চিত করতে?", }, HideContext: { Title: "সংশ্লিষ্টতা প্রম্পটগুলি লুকান", @@ -314,7 +316,8 @@ const bn: LocaleType = { SubTitle: "মাস্কের পিছনে আত্মার সঙ্গে চ্যাট করুন", More: "আরো খুঁজুন", NotShow: "এখনও দেখাবেন না", - ConfirmNoShow: "নিষ্ক্রিয় করতে নিশ্চিত করুন? পরে আপনি এটি সেটিংসে সক্ষম করতে পারবেন।", + ConfirmNoShow: + "নিষ্ক্রিয় করতে নিশ্চিত করুন? পরে আপনি এটি সেটিংসে সক্ষম করতে পারবেন।", }, UI: { @@ -332,4 +335,4 @@ const bn: LocaleType = { }, }; -export default bn; \ No newline at end of file +export default bn; diff --git a/app/locales/en.ts b/app/locales/en.ts index c744fd013..9373e2b14 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -1,6 +1,7 @@ import { SubmitKey } from "../store/config"; import { LocaleType } from "./index"; +// if you are adding a new translation, please use PartialLocaleType instead of LocaleType const en: LocaleType = { WIP: "Coming Soon...", Error: { From 42561d04de53dd9d2f1a8ef75ab2746b17aa43e7 Mon Sep 17 00:00:00 2001 From: Yifei Zhang Date: Thu, 6 Jul 2023 11:21:55 +0800 Subject: [PATCH 12/12] Update tauri.conf.json --- src-tauri/tauri.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 25d8c361f..5a8822fe1 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -9,7 +9,7 @@ }, "package": { "productName": "ChatGPT Next Web", - "version": "2.8.7" + "version": "2.8.8" }, "tauri": { "allowlist": {