From 7670b8b73825300ba792d893c3a8b7f442bac8f5 Mon Sep 17 00:00:00 2001 From: aooyoo Date: Mon, 10 Apr 2023 14:01:54 +0000 Subject: [PATCH 1/4] add new language, Japanese --- app/locales/cn.ts | 1 + app/locales/en.ts | 1 + app/locales/es.ts | 1 + app/locales/index.ts | 9 ++- app/locales/it.ts | 1 + app/locales/jp.ts | 182 +++++++++++++++++++++++++++++++++++++++++++ app/locales/tr.ts | 10 ++- app/locales/tw.ts | 1 + 8 files changed, 201 insertions(+), 5 deletions(-) create mode 100644 app/locales/jp.ts diff --git a/app/locales/cn.ts b/app/locales/cn.ts index d3df950b5..fbb418471 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -73,6 +73,7 @@ const cn = { es: "Español", it: "Italiano", tr: "Türkçe", + jr: "日本語", }, }, Avatar: "头像", diff --git a/app/locales/en.ts b/app/locales/en.ts index 6b63f21be..8ffc07816 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -76,6 +76,7 @@ const en: LocaleType = { es: "Español", it: "Italiano", tr: "Türkçe", + jr: "日本語", }, }, Avatar: "Avatar", diff --git a/app/locales/es.ts b/app/locales/es.ts index eac504dd8..0939cc7a0 100644 --- a/app/locales/es.ts +++ b/app/locales/es.ts @@ -76,6 +76,7 @@ const es: LocaleType = { es: "Español", it: "Italiano", tr: "Türkçe", + jr: "日本語", }, }, Avatar: "Avatar", diff --git a/app/locales/index.ts b/app/locales/index.ts index d7a1aefe5..dff1e6614 100644 --- a/app/locales/index.ts +++ b/app/locales/index.ts @@ -4,10 +4,11 @@ import TW from "./tw"; import ES from "./es"; import IT from "./it"; import TR from "./tr"; +import JP from "./jp"; export type { LocaleType } from "./cn"; -export const AllLangs = ["en", "cn", "tw", "es", "it", "tr"] as const; +export const AllLangs = ["en", "cn", "tw", "es", "it", "tr", "jp"] as const; type Lang = (typeof AllLangs)[number]; const LANG_KEY = "lang"; @@ -53,6 +54,8 @@ export function getLang(): Lang { return "it"; } else if (lang.includes("tr")) { return "tr"; + } else if (lang.includes("jp")) { + return "jp"; } else { return "en"; } @@ -63,4 +66,6 @@ export function changeLang(lang: Lang) { location.reload(); } -export default { en: EN, cn: CN, tw: TW, es: ES, it: IT, tr: TR }[getLang()]; +export default { en: EN, cn: CN, tw: TW, es: ES, it: IT, tr: TR, jp: JP }[ + getLang() +]; diff --git a/app/locales/it.ts b/app/locales/it.ts index 3c11e708d..0a3cf18d9 100644 --- a/app/locales/it.ts +++ b/app/locales/it.ts @@ -76,6 +76,7 @@ const it: LocaleType = { es: "Español", it: "Italiano", tr: "Türkçe", + jr: "日本語", }, }, Avatar: "Avatar", diff --git a/app/locales/jp.ts b/app/locales/jp.ts new file mode 100644 index 000000000..98a62fb0c --- /dev/null +++ b/app/locales/jp.ts @@ -0,0 +1,182 @@ +import { SubmitKey } from "../store/app"; + +const jp = { + WIP: "この機能は開発中です……", + Error: { + Unauthorized: + "現在は未承認状態です。左下の設定ボタンをクリックし、アクセスパスワードを入力してください。", + }, + ChatItem: { + ChatItemCount: (count: number) => `${count} 通のチャット`, + }, + Chat: { + SubTitle: (count: number) => `ChatGPTとの ${count} 通のチャット`, + Actions: { + ChatList: "メッセージリストを表示", + CompressedHistory: "圧縮された履歴プロンプトを表示", + Export: "チャット履歴をエクスポート", + Copy: "コピー", + Stop: "停止", + Retry: "リトライ", + }, + Rename: "チャットの名前を変更", + Typing: "入力中…", + Input: (submitKey: string) => { + var inputHints = `${submitKey} で送信`; + if (submitKey === String(SubmitKey.Enter)) { + inputHints += ",Shift + Enter で改行"; + } + return inputHints + ",/ で自動補完をトリガー"; + }, + Send: "送信", + }, + Export: { + Title: "チャット履歴をMarkdown形式でエクスポート", + Copy: "すべてコピー", + Download: "ファイルをダウンロード", + MessageFromYou: "あなたからのメッセージ", + MessageFromChatGPT: "ChatGPTからのメッセージ", + }, + Memory: { + Title: "履歴メモリ", + EmptyContent: "まだ記憶されていません", + Send: "メモリを送信", + Copy: "メモリをコピー", + Reset: "チャットをリセット", + ResetConfirm: + "リセット後、現在のチャット履歴と過去のメモリがクリアされます。リセットしてもよろしいですか?", + }, + Home: { + NewChat: "新しいチャット", + DeleteChat: "選択したチャットを削除してもよろしいですか?", + DeleteToast: "チャットが削除されました", + Revert: "元に戻す", + }, + Settings: { + Title: "設定", + SubTitle: "設定オプション", + Actions: { + ClearAll: "すべてのデータをクリア", + ResetAll: "すべてのオプションをリセット", + Close: "閉じる", + ConfirmResetAll: { + Confirm: "すべての設定をリセットしてもよろしいですか?", + }, + ConfirmClearAll: { + Confirm: "すべてのチャットをリセットしてもよろしいですか?", + }, + }, + Lang: { + Name: "Language", + Options: { + cn: "简体中文", + en: "English", + tw: "繁體中文", + es: "Español", + it: "Italiano", + tr: "Türkçe", + jr: "日本語", + }, + }, + Avatar: "アバター", + FontSize: { + Title: "フォントサイズ", + SubTitle: "チャット内容のフォントサイズ", + }, + + Update: { + Version: (x: string) => `現在のバージョン:${x}`, + IsLatest: "最新バージョンです", + CheckUpdate: "アップデートを確認", + IsChecking: "アップデートを確認しています...", + FoundUpdate: (x: string) => `新しいバージョンが見つかりました:${x}`, + GoToUpdate: "更新する", + }, + SendKey: "送信キー", + Theme: "テーマ", + TightBorder: "ボーダーレスモード", + SendPreviewBubble: "プレビューバブルの送信", + Prompt: { + Disable: { + Title: "プロンプトの自動補完を無効にする", + SubTitle: + "入力フィールドの先頭に / を入力すると、自動補完がトリガーされます。", + }, + List: "カスタムプロンプトリスト", + ListCount: (builtin: number, custom: number) => + `組み込み ${builtin} 件、ユーザー定義 ${custom} 件`, + Edit: "編集", + }, + HistoryCount: { + Title: "履歴メッセージ数を添付", + SubTitle: "リクエストごとに添付する履歴メッセージ数", + }, + CompressThreshold: { + Title: "履歴メッセージの長さ圧縮しきい値", + SubTitle: + "圧縮されていない履歴メッセージがこの値を超えた場合、圧縮が行われます。", + }, + Token: { + Title: "APIキー", + SubTitle: "自分のキーを使用してパスワードアクセス制限を迂回する", + Placeholder: "OpenAI APIキー", + }, + Usage: { + Title: "残高照会", + SubTitle(used: any, total: any) { + return `今月は $${used} を使用しました。総額は $${total} です。`; + }, + IsChecking: "確認中...", + Check: "再確認", + NoAccess: "APIキーまたはアクセスパスワードを入力して残高を表示", + }, + AccessCode: { + Title: "アクセスパスワード", + SubTitle: "暗号化アクセスが有効になっています", + Placeholder: "アクセスパスワードを入力してください", + }, + Model: "モデル (model)", + Temperature: { + Title: "ランダム性 (temperature)", + SubTitle: + "値が大きいほど、回答がランダムになります。1以上の値には文字化けが含まれる可能性があります。", + }, + MaxTokens: { + Title: "シングルレスポンス制限 (max_tokens)", + SubTitle: "1回のインタラクションで使用される最大トークン数", + }, + PresencePenlty: { + Title: "トピックの新鮮度 (presence_penalty)", + SubTitle: "値が大きいほど、新しいトピックへの展開が可能になります。", + }, + }, + Store: { + DefaultTopic: "新しいチャット", + BotHello: "何かお手伝いできることはありますか", + Error: "エラーが発生しました。しばらくしてからやり直してください。", + Prompt: { + History: (content: string) => + "これは、AI とユーザの過去のチャットを要約した前提となるストーリーです:" + + content, + Topic: + "4~5文字でこの文章の簡潔な主題を返してください。説明、句読点、感嘆詞、余分なテキストは無しで。もし主題がない場合は、「おしゃべり」を返してください", + Summarize: + "あなたとユーザの会話を簡潔にまとめて、後続のコンテキストプロンプトとして使ってください。200字以内に抑えてください。", + }, + ConfirmClearAll: + "すべてのチャット、設定データをクリアしてもよろしいですか?", + }, + Copy: { + Success: "クリップボードに書き込みました", + Failed: "コピーに失敗しました。クリップボード許可を与えてください。", + }, + Context: { + Toast: (x: any) => `前置コンテキストが ${x} 件設定されました`, + Edit: "前置コンテキストと履歴メモリ", + Add: "新規追加", + }, +}; + +export type LocaleType = typeof jp; + +export default jp; diff --git a/app/locales/tr.ts b/app/locales/tr.ts index 354786818..d5ac93807 100644 --- a/app/locales/tr.ts +++ b/app/locales/tr.ts @@ -76,6 +76,7 @@ const tr: LocaleType = { es: "Español", it: "Italiano", tr: "Türkçe", + jr: "日本語", }, }, Avatar: "Avatar", @@ -136,11 +137,13 @@ const tr: LocaleType = { 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", + 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", + SubTitle: + "Girdi belirteçlerinin ve oluşturulan belirteçlerin maksimum uzunluğu", }, PresencePenlty: { Title: "Varlık Cezası", @@ -161,7 +164,8 @@ const tr: LocaleType = { Summarize: "Gelecekteki bağlam için bir bilgi istemi olarak kullanmak üzere tartışmamızı en fazla 200 kelimeyle özetleyin.", }, - ConfirmClearAll: "Tüm sohbet ve ayar verilerini temizlemeyi onaylıyor musunuz?", + ConfirmClearAll: + "Tüm sohbet ve ayar verilerini temizlemeyi onaylıyor musunuz?", }, Copy: { Success: "Panoya kopyalandı", diff --git a/app/locales/tw.ts b/app/locales/tw.ts index 89924b726..eadfa275a 100644 --- a/app/locales/tw.ts +++ b/app/locales/tw.ts @@ -74,6 +74,7 @@ const tw: LocaleType = { es: "Español", it: "Italiano", tr: "Türkçe", + jr: "日本語", }, }, Avatar: "大頭貼", From 042e989ebbefebb28c987114d52d8bc0e6ea7f73 Mon Sep 17 00:00:00 2001 From: aooyoo Date: Mon, 10 Apr 2023 14:12:31 +0000 Subject: [PATCH 2/4] fix spelling errors --- app/locales/cn.ts | 2 +- app/locales/en.ts | 2 +- app/locales/es.ts | 2 +- app/locales/it.ts | 2 +- app/locales/jp.ts | 2 +- app/locales/tr.ts | 2 +- app/locales/tw.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/locales/cn.ts b/app/locales/cn.ts index fbb418471..9973a3c68 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -73,7 +73,7 @@ const cn = { es: "Español", it: "Italiano", tr: "Türkçe", - jr: "日本語", + jp: "日本語", }, }, Avatar: "头像", diff --git a/app/locales/en.ts b/app/locales/en.ts index 8ffc07816..bd417aa84 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -76,7 +76,7 @@ const en: LocaleType = { es: "Español", it: "Italiano", tr: "Türkçe", - jr: "日本語", + jp: "日本語", }, }, Avatar: "Avatar", diff --git a/app/locales/es.ts b/app/locales/es.ts index 0939cc7a0..88bcd2012 100644 --- a/app/locales/es.ts +++ b/app/locales/es.ts @@ -76,7 +76,7 @@ const es: LocaleType = { es: "Español", it: "Italiano", tr: "Türkçe", - jr: "日本語", + jp: "日本語", }, }, Avatar: "Avatar", diff --git a/app/locales/it.ts b/app/locales/it.ts index 0a3cf18d9..3cd768fed 100644 --- a/app/locales/it.ts +++ b/app/locales/it.ts @@ -76,7 +76,7 @@ const it: LocaleType = { es: "Español", it: "Italiano", tr: "Türkçe", - jr: "日本語", + jp: "日本語", }, }, Avatar: "Avatar", diff --git a/app/locales/jp.ts b/app/locales/jp.ts index 98a62fb0c..50ac21609 100644 --- a/app/locales/jp.ts +++ b/app/locales/jp.ts @@ -75,7 +75,7 @@ const jp = { es: "Español", it: "Italiano", tr: "Türkçe", - jr: "日本語", + jp: "日本語", }, }, Avatar: "アバター", diff --git a/app/locales/tr.ts b/app/locales/tr.ts index d5ac93807..708d2d7d5 100644 --- a/app/locales/tr.ts +++ b/app/locales/tr.ts @@ -76,7 +76,7 @@ const tr: LocaleType = { es: "Español", it: "Italiano", tr: "Türkçe", - jr: "日本語", + jp: "日本語", }, }, Avatar: "Avatar", diff --git a/app/locales/tw.ts b/app/locales/tw.ts index eadfa275a..77975b896 100644 --- a/app/locales/tw.ts +++ b/app/locales/tw.ts @@ -74,7 +74,7 @@ const tw: LocaleType = { es: "Español", it: "Italiano", tr: "Türkçe", - jr: "日本語", + jp: "日本語", }, }, Avatar: "大頭貼", From a1c709bb58ac7d9ccb33637c06df3a097552bde6 Mon Sep 17 00:00:00 2001 From: peanut996 <849421294godw@gmail.com> Date: Tue, 11 Apr 2023 12:06:12 +0800 Subject: [PATCH 3/4] [refactor] rename ChatResponse. --- app/api/openai/typing.ts | 2 +- app/requests.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/api/openai/typing.ts b/app/api/openai/typing.ts index 8c4218467..b936530c3 100644 --- a/app/api/openai/typing.ts +++ b/app/api/openai/typing.ts @@ -4,4 +4,4 @@ import type { } from "openai"; export type ChatRequest = CreateChatCompletionRequest; -export type ChatReponse = CreateChatCompletionResponse; +export type ChatResponse = CreateChatCompletionResponse; diff --git a/app/requests.ts b/app/requests.ts index 6254c7c78..3d559e369 100644 --- a/app/requests.ts +++ b/app/requests.ts @@ -1,4 +1,4 @@ -import type { ChatRequest, ChatReponse } from "./api/openai/typing"; +import type { ChatRequest, ChatResponse } from "./api/openai/typing"; import { Message, ModelConfig, useAccessStore, useChatStore } from "./store"; import { showToast } from "./components/ui-lib"; @@ -67,7 +67,7 @@ export async function requestChat(messages: Message[]) { const res = await requestOpenaiClient("v1/chat/completions")(req); try { - const response = (await res.json()) as ChatReponse; + const response = (await res.json()) as ChatResponse; return response; } catch (error) { console.error("[Request Chat] ", error, res.body); From 8d2abe36a97e8a75e41e4640d35662f607a15e65 Mon Sep 17 00:00:00 2001 From: Yifei Zhang Date: Tue, 11 Apr 2023 16:04:36 +0800 Subject: [PATCH 4/4] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ba4a6dc49..b2d1e48ce 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ One-Click to deploy well-designed ChatGPT web UI on Vercel. 一键免费部署你的私人 ChatGPT 网页应用。 -[演示 Demo](https://chat-gpt-next-web.vercel.app/) / [反馈 Issues](https://github.com/Yidadaa/ChatGPT-Next-Web/issues) / [Join Discord](https://discord.gg/zrhvHCr79N) / [QQ 群](https://user-images.githubusercontent.com/16968934/228190818-7dd00845-e9b9-4363-97e5-44c507ac76da.jpeg) / [打赏开发者](https://user-images.githubusercontent.com/16968934/227772541-5bcd52d8-61b7-488c-a203-0330d8006e2b.jpg) / [Buy Me a Coffee](https://www.buymeacoffee.com/yidadaa) +[演示 Demo](https://chat-gpt-next-web.vercel.app/) / [反馈 Issues](https://github.com/Yidadaa/ChatGPT-Next-Web/issues) / [Join Discord](https://discord.gg/zrhvHCr79N) / [QQ 群](https://user-images.githubusercontent.com/16968934/231095592-330adc52-0337-4c13-8452-938ec169e367.jpeg) / [打赏开发者](https://user-images.githubusercontent.com/16968934/227772541-5bcd52d8-61b7-488c-a203-0330d8006e2b.jpg) / [Buy Me a Coffee](https://www.buymeacoffee.com/yidadaa) [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FYidadaa%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&project-name=chatgpt-next-web&repository-name=ChatGPT-Next-Web) @@ -20,6 +20,7 @@ One-Click to deploy well-designed ChatGPT web UI on Vercel. ## Features - **Deploy for free with one-click** on Vercel in under 1 minute +- Privacy first, all data stored locally in the browser - Responsive design, dark mode and PWA - Fast first screen loading speed (~100kb) - Awesome prompts powered by [awesome-chatgpt-prompts-zh](https://github.com/PlexPt/awesome-chatgpt-prompts-zh) and [awesome-chatgpt-prompts](https://github.com/f/awesome-chatgpt-prompts) @@ -45,6 +46,7 @@ One-Click to deploy well-designed ChatGPT web UI on Vercel. - 在 1 分钟内使用 Vercel **免费一键部署** - 精心设计的 UI,响应式设计,支持深色模式,支持 PWA - 极快的首屏加载速度(~100kb) +- 隐私安全,所有数据保存在用户浏览器本地 - 海量的内置 prompt 列表,来自[中文](https://github.com/PlexPt/awesome-chatgpt-prompts-zh)和[英文](https://github.com/f/awesome-chatgpt-prompts) - 自动压缩上下文聊天记录,在节省 Token 的同时支持超长对话 - 一键导出聊天记录,完整的 Markdown 支持