diff --git a/locales/ar/common.json b/locales/ar/common.json
index 59d4d3c6a7ff..6554525166e5 100644
--- a/locales/ar/common.json
+++ b/locales/ar/common.json
@@ -58,6 +58,7 @@
},
"title": "استيراد البيانات"
},
+ "installPWA": "تثبيت تطبيق المتصفح",
"lang": {
"ar": "العربية",
"bg-BG": "البلغارية",
diff --git a/locales/ar/metadata.json b/locales/ar/metadata.json
new file mode 100644
index 000000000000..6af63d036756
--- /dev/null
+++ b/locales/ar/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "تقدم LobeChat أفضل تجربة استخدام لـ ChatGPT و OLLaMA و Gemini و Claude WebUI",
+ "title": "LobeChat: أداة أداء شخصية LLM، لتمنح نفسك عقلًا أكثر ذكاءً"
+ },
+ "market": {
+ "description": "إنشاء محتوى، كتابة نصوص، إجابة على الأسئلة، إنشاء صور، إنشاء فيديو، إنشاء صوت، وكيل ذكاء اصطناعي، سير عمل تلقائي، قم بتخصيص مساعد ذكاء اصطناعي / GPTs / OLLaMA الخاص بك",
+ "title": "سوق المساعدين"
+ },
+ "plugins": {
+ "description": "البحث، إنشاء رسوم بيانية، أكاديمي، إنشاء صور، إنشاء فيديو، إنشاء صوت، سير عمل تلقائي، قم بتخصيص قدرات الإضافات الخاصة بـ ChatGPT / OLLaMA",
+ "title": "سوق الإضافات"
+ },
+ "welcome": {
+ "description": "تقدم LobeChat أفضل تجربة استخدام لـ ChatGPT و OLLaMA و Gemini و Claude WebUI",
+ "title": "مرحبًا بك في استخدام LobeChat: أداة أداء شخصية LLM، لتمنح نفسك عقلًا أكثر ذكاءً"
+ }
+}
diff --git a/locales/ar/plugin.json b/locales/ar/plugin.json
index 62b75c38da49..c1aa952dca34 100644
--- a/locales/ar/plugin.json
+++ b/locales/ar/plugin.json
@@ -4,7 +4,9 @@
"function_call": "استدعاء الدالة",
"off": "إيقاف التصحيح",
"on": "عرض معلومات استدعاء البرنامج المساعد",
- "response": "الرد"
+ "payload": "حمولة البرنامج المساعد",
+ "response": "الرد",
+ "tool_call": "طلب استدعاء الأداة"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "جاري تشغيل الإضافة..."
},
"pluginList": "قائمة الإضافات",
- "plugins": {
- "loading": "جاري فحص الأدوات...",
- "unknown": "أداة غير معروفة"
- },
"setting": "إعدادات الإضافة",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "مثبتة"
},
"title": "متجر الإضافات"
- }
+ },
+ "unknownPlugin": "البرنامج المساعد غير معروف"
}
diff --git a/locales/ar/tool.json b/locales/ar/tool.json
index a322c40105f4..6876ab6c640c 100644
--- a/locales/ar/tool.json
+++ b/locales/ar/tool.json
@@ -4,6 +4,7 @@
"downloading": "صلاحية روابط الصور المُولَّدة بواسطة DallE3 تدوم ساعة واحدة فقط، يتم تحميل الصور إلى الجهاز المحلي...",
"generate": "توليد",
"generating": "جارٍ التوليد...",
- "images": "الصور:"
+ "images": "الصور:",
+ "prompt": "كلمة تلميح"
}
}
diff --git a/locales/bg-BG/common.json b/locales/bg-BG/common.json
index e3770f7aca66..1152b3346e90 100644
--- a/locales/bg-BG/common.json
+++ b/locales/bg-BG/common.json
@@ -58,6 +58,7 @@
},
"title": "Импортирай данни"
},
+ "installPWA": "Инсталиране на PWA",
"lang": {
"ar": "Арабски",
"bg-BG": "български",
diff --git a/locales/bg-BG/metadata.json b/locales/bg-BG/metadata.json
new file mode 100644
index 000000000000..0e2331d7eb3d
--- /dev/null
+++ b/locales/bg-BG/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat предлага най-доброто използване на ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: Личен инструмент за ефективност на LLM, даващ по-умен мозък"
+ },
+ "market": {
+ "description": "Създаване на съдържание, копирайтинг, въпроси и отговори, генериране на изображения, генериране на видео, генериране на глас, интелигентен агент, автоматизирани работни процеси, персонализирайте си собствения AI / GPTs / OLLaMA интелигентен асистент",
+ "title": "Пазар на асистенти"
+ },
+ "plugins": {
+ "description": "Търсене, генериране на диаграми, академични изследвания, генериране на изображения, генериране на видео, генериране на глас, автоматизирани работни процеси, персонализирайте си собствените способности на ChatGPT / OLLaMA с инструментите на ToolCall",
+ "title": "Пазар на добавки"
+ },
+ "welcome": {
+ "description": "LobeChat предлага най-доброто използване на ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Добре дошли в LobeChat: Личен инструмент за ефективност на LLM, даващ по-умен мозък"
+ }
+}
diff --git a/locales/bg-BG/plugin.json b/locales/bg-BG/plugin.json
index 42caeb66cb09..24d6b5cc7225 100644
--- a/locales/bg-BG/plugin.json
+++ b/locales/bg-BG/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Извикване на функция",
"off": "Изключи отстраняване на грешки",
"on": "Преглед на информацията за извикване на плъгина",
- "response": "Отговор"
+ "payload": "полезна натоварване",
+ "response": "Отговор",
+ "tool_call": "заявка за инструмент"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Плъгинът работи..."
},
"pluginList": "Списък с плъгини",
- "plugins": {
- "loading": "Откриване на плъгини...",
- "unknown": "Неизвестен плъгин"
- },
"setting": "Настройки на плъгина",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Инсталирани"
},
"title": "Магазин за плъгини"
- }
+ },
+ "unknownPlugin": "Неизвестен плъгин"
}
diff --git a/locales/bg-BG/tool.json b/locales/bg-BG/tool.json
index c08feea03dd4..0f7f661a780b 100644
--- a/locales/bg-BG/tool.json
+++ b/locales/bg-BG/tool.json
@@ -4,6 +4,7 @@
"downloading": "Връзките към изображенията, генерирани от DALL·E3, са валидни само за 1 час, кеширане на изображенията локално...",
"generate": "Генерирай",
"generating": "Генериране...",
- "images": "Изображения:"
+ "images": "Изображения:",
+ "prompt": "подсказка"
}
}
diff --git a/locales/de-DE/common.json b/locales/de-DE/common.json
index c63b203ec65a..55b041f61472 100644
--- a/locales/de-DE/common.json
+++ b/locales/de-DE/common.json
@@ -58,6 +58,7 @@
},
"title": "Daten importieren"
},
+ "installPWA": "Installiere die Browser-App",
"lang": {
"ar": "Arabisch",
"bg-BG": "Bulgarisch",
diff --git a/locales/de-DE/metadata.json b/locales/de-DE/metadata.json
new file mode 100644
index 000000000000..94cec38e833c
--- /dev/null
+++ b/locales/de-DE/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat bietet Ihnen das beste ChatGPT-, OLLaMA-, Gemini- und Claude-WebUI-Nutzererlebnis.",
+ "title": "LobeChat: Persönliches LLM-Produktivitätstool, um deinem Gehirn mehr Intelligenz zu verleihen"
+ },
+ "market": {
+ "description": "Inhalts-Erstellung, Copywriting, Fragen & Antworten, Bildgenerierung, Videogenerierung, Sprachgenerierung, intelligente Agenten, Automatisierungs-Workflows - gestalten Sie Ihren eigenen AI / GPTs / OLLaMA intelligenten Assistenten",
+ "title": "Assistentenmarkt"
+ },
+ "plugins": {
+ "description": "Suche, Diagrammerstellung, Akademisch, Bildgenerierung, Videogenerierung, Sprachgenerierung, Automatisierungs-Workflows - passen Sie die exklusiven ToolCall-Plugin-Fähigkeiten für ChatGPT / OLLaMA an",
+ "title": "Plugin-Markt"
+ },
+ "welcome": {
+ "description": "LobeChat bietet Ihnen das beste ChatGPT-, OLLaMA-, Gemini- und Claude-WebUI-Nutzererlebnis.",
+ "title": "Willkommen bei LobeChat: Persönliches LLM-Produktivitätstool, um deinem Gehirn mehr Intelligenz zu verleihen"
+ }
+}
diff --git a/locales/de-DE/plugin.json b/locales/de-DE/plugin.json
index 5ae97802181f..647789272aa8 100644
--- a/locales/de-DE/plugin.json
+++ b/locales/de-DE/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Funktionsaufruf",
"off": "Debugging deaktivieren",
"on": "Plugin-Aufrufinformationen anzeigen",
- "response": "Antwort"
+ "payload": "Plugin-Payload",
+ "response": "Antwort",
+ "tool_call": "Tool Call Request"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Plugin wird ausgeführt..."
},
"pluginList": "Plugin-Liste",
- "plugins": {
- "loading": "Plugins werden überprüft...",
- "unknown": "Unbekanntes Plugin"
- },
"setting": "Plugin-Einstellung",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Installiert"
},
"title": "Plugin-Shop"
- }
+ },
+ "unknownPlugin": "Unbekanntes Plugin"
}
diff --git a/locales/de-DE/tool.json b/locales/de-DE/tool.json
index eaadb6d25850..02a9c5e5518b 100644
--- a/locales/de-DE/tool.json
+++ b/locales/de-DE/tool.json
@@ -4,6 +4,7 @@
"downloading": "Die von DallE3 generierten Bildlinks sind nur 1 Stunde lang gültig. Das Bild wird lokal zwischengespeichert...",
"generate": "Generieren",
"generating": "Generiert",
- "images": "Bilder:"
+ "images": "Bilder:",
+ "prompt": "Hinweiswort"
}
}
diff --git a/locales/en-US/common.json b/locales/en-US/common.json
index adb77af60c34..0292a1e7bbf8 100644
--- a/locales/en-US/common.json
+++ b/locales/en-US/common.json
@@ -14,7 +14,7 @@
"copySuccess": "Copied successfully",
"dataStatistics": {
"messages": "Messages",
- "sessions": "Assistants",
+ "sessions": "Agents",
"today": "Today's New",
"topics": "Topics"
},
@@ -58,6 +58,7 @@
},
"title": "Import Data"
},
+ "installPWA": "Install browser app",
"lang": {
"ar": "Arabic",
"bg-BG": "Bulgarian",
diff --git a/locales/en-US/metadata.json b/locales/en-US/metadata.json
new file mode 100644
index 000000000000..ce0211f85062
--- /dev/null
+++ b/locales/en-US/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat offers you the best ChatGPT, OLLaMA, Gemini, Claude WebUI user experience",
+ "title": "LobeChat: Personal LLM Productivity Tool, Give Yourself a Smarter Brain"
+ },
+ "market": {
+ "description": "Content creation, copywriting, Q&A, image generation, video generation, voice generation, smart agents, automation workflows, customize your own AI / GPTs / OLLaMA intelligent agent",
+ "title": "Agent Market"
+ },
+ "plugins": {
+ "description": "Search, chart generation, academic, image generation, video generation, voice generation, automation workflows, customize ChatGPT / OLLaMA exclusive ToolCall plugin capabilities",
+ "title": "Plugin Market"
+ },
+ "welcome": {
+ "description": "LobeChat offers you the best ChatGPT, OLLaMA, Gemini, Claude WebUI user experience",
+ "title": "Welcome to LobeChat: Personal LLM Productivity Tool, Give Yourself a Smarter Brain"
+ }
+}
diff --git a/locales/en-US/plugin.json b/locales/en-US/plugin.json
index 35afb6d5c49e..9ada632581ef 100644
--- a/locales/en-US/plugin.json
+++ b/locales/en-US/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Function Call",
"off": "Turn off debug",
"on": "View plugin invocation information",
- "response": "Response"
+ "payload": "plugin payload",
+ "response": "Response",
+ "tool_call": "tool call request"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Plugin is running..."
},
"pluginList": "Plugin List",
- "plugins": {
- "loading": "Detecting plugins...",
- "unknown": "Unknown Plugin"
- },
"setting": "Plugin Settings",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Installed"
},
"title": "Plugin Store"
- }
+ },
+ "unknownPlugin": "Unknown plugin"
}
diff --git a/locales/en-US/tool.json b/locales/en-US/tool.json
index 50d725ca0eb4..cb6c2f2d2e67 100644
--- a/locales/en-US/tool.json
+++ b/locales/en-US/tool.json
@@ -4,6 +4,7 @@
"downloading": "The image links generated by DALL·E3 are only valid for 1 hour, caching the images locally...",
"generate": "Generate",
"generating": "Generating...",
- "images": "Images:"
+ "images": "Images:",
+ "prompt": "提示词"
}
}
diff --git a/locales/es-ES/common.json b/locales/es-ES/common.json
index ec7570dcfe11..3d8d5ab9451a 100644
--- a/locales/es-ES/common.json
+++ b/locales/es-ES/common.json
@@ -58,6 +58,7 @@
},
"title": "Importar datos"
},
+ "installPWA": "Instalar la aplicación del navegador",
"lang": {
"ar": "árabe",
"bg-BG": "búlgaro",
diff --git a/locales/es-ES/metadata.json b/locales/es-ES/metadata.json
new file mode 100644
index 000000000000..ed672f377ecd
--- /dev/null
+++ b/locales/es-ES/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat ofrece la mejor experiencia de uso de ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: Herramienta personal de productividad LLM para tener un cerebro más inteligente"
+ },
+ "market": {
+ "description": "Creación de contenido, redacción, preguntas y respuestas, generación de imágenes, generación de videos, generación de voz, agente inteligente, flujo de trabajo automatizado, personaliza tu asistente inteligente AI / GPTs / OLLaMA exclusivo",
+ "title": "Mercado de asistentes"
+ },
+ "plugins": {
+ "description": "Búsqueda, generación de gráficos, académico, generación de imágenes, generación de videos, generación de voz, flujo de trabajo automatizado, personaliza las capacidades de los complementos ToolCall exclusivos de ChatGPT / OLLaMA",
+ "title": "Mercado de complementos"
+ },
+ "welcome": {
+ "description": "LobeChat ofrece la mejor experiencia de uso de ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "¡Bienvenido a LobeChat: Herramienta personal de productividad LLM para tener un cerebro más inteligente!"
+ }
+}
diff --git a/locales/es-ES/plugin.json b/locales/es-ES/plugin.json
index 1fb1ce83d57a..7e98a982de76 100644
--- a/locales/es-ES/plugin.json
+++ b/locales/es-ES/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Llamada a función",
"off": "Desactivado",
"on": "Ver información de llamada de complemento",
- "response": "Respuesta"
+ "payload": "carga del complemento",
+ "response": "Respuesta",
+ "tool_call": "solicitud de llamada de herramienta"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Ejecutando complemento..."
},
"pluginList": "Lista de complementos",
- "plugins": {
- "loading": "Comprobando complementos...",
- "unknown": "Complemento desconocido"
- },
"setting": "Configuración de complementos",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Instalados"
},
"title": "Tienda de complementos"
- }
+ },
+ "unknownPlugin": "Plugin desconocido"
}
diff --git a/locales/es-ES/tool.json b/locales/es-ES/tool.json
index 911f5fb59ae2..2677a4d6085b 100644
--- a/locales/es-ES/tool.json
+++ b/locales/es-ES/tool.json
@@ -4,6 +4,7 @@
"downloading": "El enlace de la imagen generada por DALL·E 3 solo es válido durante 1 hora, descargando la imagen al dispositivo local...",
"generate": "Generar",
"generating": "Generando...",
- "images": "Imágenes:"
+ "images": "Imágenes:",
+ "prompt": "Palabra de aviso"
}
}
diff --git a/locales/fr-FR/common.json b/locales/fr-FR/common.json
index 38a66b984066..43fbd354cb96 100644
--- a/locales/fr-FR/common.json
+++ b/locales/fr-FR/common.json
@@ -58,6 +58,7 @@
},
"title": "Importer des données"
},
+ "installPWA": "Installer l'application du navigateur",
"lang": {
"ar": "arabe",
"bg-BG": "Bulgare",
diff --git a/locales/fr-FR/metadata.json b/locales/fr-FR/metadata.json
new file mode 100644
index 000000000000..afbe6b9c890a
--- /dev/null
+++ b/locales/fr-FR/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat offre la meilleure expérience d'utilisation de ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: Outil de productivité personnel LLM, pour un cerveau plus intelligent"
+ },
+ "market": {
+ "description": "Création de contenu, rédaction, questions-réponses, génération d'images, génération de vidéos, génération vocale, agent intelligent, flux de travail automatisé, personnalisez votre agent intelligent AI / GPTs / OLLaMA",
+ "title": "Marché des agents"
+ },
+ "plugins": {
+ "description": "Recherche, génération de graphiques, académique, génération d'images, génération de vidéos, génération vocale, flux de travail automatisé, personnalisez les capacités des plugins ToolCall exclusifs de ChatGPT / OLLaMA",
+ "title": "Marché des plugins"
+ },
+ "welcome": {
+ "description": "LobeChat offre la meilleure expérience d'utilisation de ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Bienvenue sur LobeChat: Outil de productivité personnel LLM, pour un cerveau plus intelligent"
+ }
+}
diff --git a/locales/fr-FR/plugin.json b/locales/fr-FR/plugin.json
index bec0bce1d322..23951b67b0a2 100644
--- a/locales/fr-FR/plugin.json
+++ b/locales/fr-FR/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Appel de fonction",
"off": "Désactivé",
"on": "Activer le débogage",
- "response": "Réponse"
+ "payload": "charge du plugin",
+ "response": "Réponse",
+ "tool_call": "demande d'appel d'outil"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Exécution du plugin en cours..."
},
"pluginList": "Liste des plugins",
- "plugins": {
- "loading": "Vérification des plugins en cours...",
- "unknown": "Plugin inconnu"
- },
"setting": "Paramètres des plugins",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Installés"
},
"title": "Boutique de plugins"
- }
+ },
+ "unknownPlugin": "Plugin inconnu"
}
diff --git a/locales/fr-FR/tool.json b/locales/fr-FR/tool.json
index 42aa797eabf8..ed373d0a72ab 100644
--- a/locales/fr-FR/tool.json
+++ b/locales/fr-FR/tool.json
@@ -4,6 +4,7 @@
"downloading": "Les liens d'image générés par DallE3 ne sont valides que pendant 1 heure. Le téléchargement de l'image est en cours...",
"generate": "Générer",
"generating": "En cours de génération...",
- "images": "Images :"
+ "images": "Images :",
+ "prompt": "Mot de rappel"
}
}
diff --git a/locales/it-IT/common.json b/locales/it-IT/common.json
index 187594db5b2b..d980d2b829cf 100644
--- a/locales/it-IT/common.json
+++ b/locales/it-IT/common.json
@@ -58,6 +58,7 @@
},
"title": "Importa dati"
},
+ "installPWA": "Installa l'applicazione del browser",
"lang": {
"ar": "Arabo",
"bg-BG": "bulgaro",
diff --git a/locales/it-IT/metadata.json b/locales/it-IT/metadata.json
new file mode 100644
index 000000000000..d2022380324f
--- /dev/null
+++ b/locales/it-IT/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat offre la migliore esperienza di utilizzo di ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: strumento personale per la produttività LLM, per un cervello più intelligente"
+ },
+ "market": {
+ "description": "Creazione di contenuti, copywriting, domande e risposte, generazione di immagini, generazione di video, generazione vocale, agente intelligente, flusso di lavoro automatizzato, personalizza il tuo assistente intelligente AI / GPTs / OLLaMA",
+ "title": "Mercato degli assistenti"
+ },
+ "plugins": {
+ "description": "Ricerca, generazione di grafici, accademico, generazione di immagini, generazione di video, generazione vocale, flusso di lavoro automatizzato, personalizza le capacità di plugin di ToolCall esclusive di ChatGPT / OLLaMA",
+ "title": "Mercato dei plugin"
+ },
+ "welcome": {
+ "description": "LobeChat offre la migliore esperienza di utilizzo di ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Benvenuto su LobeChat: strumento personale per la produttività LLM, per un cervello più intelligente"
+ }
+}
diff --git a/locales/it-IT/plugin.json b/locales/it-IT/plugin.json
index 566a45de6b54..82ea14ab5732 100644
--- a/locales/it-IT/plugin.json
+++ b/locales/it-IT/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Chiamata di funzione",
"off": "Disattivato",
"on": "Visualizza informazioni sulla chiamata del plugin",
- "response": "Risposta"
+ "payload": "carico del plugin",
+ "response": "Risposta",
+ "tool_call": "richiesta di chiamata dello strumento"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Esecuzione del plugin in corso..."
},
"pluginList": "Elenco dei plugin",
- "plugins": {
- "loading": "Rilevamento dei plugin in corso...",
- "unknown": "Plugin sconosciuto"
- },
"setting": "Impostazioni del plugin",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Installati"
},
"title": "Negozio dei plugin"
- }
+ },
+ "unknownPlugin": "Plugin sconosciuto"
}
diff --git a/locales/it-IT/tool.json b/locales/it-IT/tool.json
index cddcbe53af28..3ec2f38de749 100644
--- a/locales/it-IT/tool.json
+++ b/locales/it-IT/tool.json
@@ -4,6 +4,7 @@
"downloading": "Il link dell'immagine generata da DALL·E3 è valido solo per 1 ora, sta scaricando l'immagine in locale...",
"generate": "Genera",
"generating": "Generazione in corso...",
- "images": "Immagini:"
+ "images": "Immagini:",
+ "prompt": "parola chiave"
}
}
diff --git a/locales/ja-JP/common.json b/locales/ja-JP/common.json
index c7f3e4f2a0a3..d3af605e013c 100644
--- a/locales/ja-JP/common.json
+++ b/locales/ja-JP/common.json
@@ -58,6 +58,7 @@
},
"title": "データのインポート"
},
+ "installPWA": "PWAをインストール",
"lang": {
"ar": "アラビア語",
"bg-BG": "ブルガリア語",
diff --git a/locales/ja-JP/metadata.json b/locales/ja-JP/metadata.json
new file mode 100644
index 000000000000..2cdf6c13e5d6
--- /dev/null
+++ b/locales/ja-JP/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChatは、ChatGPT、OLLaMA、Gemini、Claude WebUIの最高の使用体験を提供します",
+ "title": "LobeChat: 個人LLM効率ツール、より賢い脳を手に入れよう"
+ },
+ "market": {
+ "description": "コンテンツ作成、コピーライティング、質問回答、画像生成、動画生成、音声生成、スマートエージェント、ワークフローの自動化、あなただけのAI / GPTs / OLLaMAスマートアシスタントをカスタマイズ",
+ "title": "アシスタントマーケット"
+ },
+ "plugins": {
+ "description": "検索、チャート生成、アカデミック、画像生成、動画生成、音声生成、ワークフローの自動化、ChatGPT / OLLaMA専用のToolCallプラグイン機能をカスタマイズ",
+ "title": "プラグインマーケット"
+ },
+ "welcome": {
+ "description": "LobeChatは、ChatGPT、OLLaMA、Gemini、Claude WebUIの最高の使用体験を提供します",
+ "title": "LobeChatをご利用いただきありがとうございます:個人LLM効率ツール、より賢い脳を手に入れよう"
+ }
+}
diff --git a/locales/ja-JP/plugin.json b/locales/ja-JP/plugin.json
index c79f47e66ff0..73dbc0c6b95c 100644
--- a/locales/ja-JP/plugin.json
+++ b/locales/ja-JP/plugin.json
@@ -4,7 +4,9 @@
"function_call": "関数呼び出し",
"off": "デバッグをオフにする",
"on": "プラグイン呼び出し情報を表示する",
- "response": "レスポンス"
+ "payload": "ペイロード",
+ "response": "レスポンス",
+ "tool_call": "ツール呼び出し"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "プラグインの実行中..."
},
"pluginList": "プラグインリスト",
- "plugins": {
- "loading": "プラグインを読み込み中...",
- "unknown": "不明なプラグイン"
- },
"setting": "プラグインの設定",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "インストール済み"
},
"title": "プラグインストア"
- }
+ },
+ "unknownPlugin": "未知のプラグイン"
}
diff --git a/locales/ja-JP/tool.json b/locales/ja-JP/tool.json
index e75367969d00..15f3716ff522 100644
--- a/locales/ja-JP/tool.json
+++ b/locales/ja-JP/tool.json
@@ -4,6 +4,7 @@
"downloading": "DallE3 で生成された画像リンクは有効期間が1時間しかありません。画像をローカルにキャッシュしています...",
"generate": "生成する",
"generating": "生成中...",
- "images": "画像:"
+ "images": "画像:",
+ "prompt": "プロンプト"
}
}
diff --git a/locales/ko-KR/common.json b/locales/ko-KR/common.json
index ad8ba6f6a830..ef2e1c585af4 100644
--- a/locales/ko-KR/common.json
+++ b/locales/ko-KR/common.json
@@ -58,6 +58,7 @@
},
"title": "데이터 가져오기"
},
+ "installPWA": "브라우저 앱 설치",
"lang": {
"ar": "아랍어",
"bg-BG": "불가리아어",
diff --git a/locales/ko-KR/metadata.json b/locales/ko-KR/metadata.json
new file mode 100644
index 000000000000..1403aca6a9fc
--- /dev/null
+++ b/locales/ko-KR/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat은 최고의 ChatGPT, OLLaMA, Gemini, Claude WebUI 사용 경험을 제공합니다.",
+ "title": "LobeChat: 개인 LLM 생산성 도구, 더 똑똑한 두뇌를 위해"
+ },
+ "market": {
+ "description": "콘텐츠 작성, 문구, 질의응답, 이미지 생성, 비디오 생성, 음성 생성, 지능형 에이전트, 자동화된 워크플로우를 통해 AI / GPTs / OLLaMA를 맞춤 설정하세요.",
+ "title": "어시스턴트 마켓"
+ },
+ "plugins": {
+ "description": "검색, 차트 생성, 학술, 이미지 생성, 비디오 생성, 음성 생성, 자동화된 워크플로우를 통해 ChatGPT / OLLaMA 전용 ToolCall 플러그인 능력을 맞춤 설정하세요.",
+ "title": "플러그인 마켓"
+ },
+ "welcome": {
+ "description": "LobeChat은 최고의 ChatGPT, OLLaMA, Gemini, Claude WebUI 사용 경험을 제공합니다.",
+ "title": "LobeChat를 사용해 주셔서 감사합니다: 개인 LLM 생산성 도구, 더 똑똑한 두뇌를 위해"
+ }
+}
diff --git a/locales/ko-KR/plugin.json b/locales/ko-KR/plugin.json
index 1991baf5faf6..07f66ac22ab7 100644
--- a/locales/ko-KR/plugin.json
+++ b/locales/ko-KR/plugin.json
@@ -4,7 +4,9 @@
"function_call": "함수 호출",
"off": "디버그 끄기",
"on": "플러그인 호출 정보 보기",
- "response": "응답"
+ "payload": "페이로드",
+ "response": "응답",
+ "tool_call": "도구 호출"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "플러그인 실행 중..."
},
"pluginList": "플러그인 목록",
- "plugins": {
- "loading": "플러그인을 확인하는 중...",
- "unknown": "알 수 없는 플러그인"
- },
"setting": "플러그인 설정",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "설치됨"
},
"title": "플러그인 스토어"
- }
+ },
+ "unknownPlugin": "알 수 없는 플러그인"
}
diff --git a/locales/ko-KR/tool.json b/locales/ko-KR/tool.json
index 682e88328b82..eebaab6b0f1f 100644
--- a/locales/ko-KR/tool.json
+++ b/locales/ko-KR/tool.json
@@ -4,6 +4,7 @@
"downloading": "DallE3로 생성된 이미지 링크는 1시간 동안 유효하며, 로컬에 이미지를 캐시하는 중입니다...",
"generate": "생성",
"generating": "생성 중...",
- "images": "이미지:"
+ "images": "이미지:",
+ "prompt": "알림 단어"
}
}
diff --git a/locales/nl-NL/common.json b/locales/nl-NL/common.json
index 03c816c8f6ab..0d087adcace9 100644
--- a/locales/nl-NL/common.json
+++ b/locales/nl-NL/common.json
@@ -58,6 +58,7 @@
},
"title": "Gegevens importeren"
},
+ "installPWA": "Installeer de browser-app",
"lang": {
"ar": "Arabisch",
"bg-BG": "Bulgaars",
diff --git a/locales/nl-NL/metadata.json b/locales/nl-NL/metadata.json
new file mode 100644
index 000000000000..62f0ff24de91
--- /dev/null
+++ b/locales/nl-NL/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat biedt je de beste ChatGPT, OLLaMA, Gemini, Claude WebUI gebruikerservaring",
+ "title": "LobeChat: Persoonlijke LLM-productiviteitstool, geef jezelf een slimmer brein"
+ },
+ "market": {
+ "description": "Content creatie, copywriting, Q&A, beeldgeneratie, videogeneratie, spraakgeneratie, intelligente agent, geautomatiseerde workflows, pas je eigen AI / GPTs / OLLaMA slimme assistent aan",
+ "title": "Assistentenmarkt"
+ },
+ "plugins": {
+ "description": "Zoeken, grafieken genereren, academisch, beeldgeneratie, videogeneratie, spraakgeneratie, geautomatiseerde workflows, pas ChatGPT / OLLaMA exclusieve ToolCall plug-inmogelijkheden aan",
+ "title": "Plug-insmarkt"
+ },
+ "welcome": {
+ "description": "LobeChat biedt je de beste ChatGPT, OLLaMA, Gemini, Claude WebUI gebruikerservaring",
+ "title": "Welkom bij LobeChat: Persoonlijke LLM-productiviteitstool, geef jezelf een slimmer brein"
+ }
+}
diff --git a/locales/nl-NL/plugin.json b/locales/nl-NL/plugin.json
index 40952cc4432d..c9b41e1c4786 100644
--- a/locales/nl-NL/plugin.json
+++ b/locales/nl-NL/plugin.json
@@ -1,111 +1,113 @@
{
"debug": {
- "arguments": "调用参数",
- "function_call": "函数调用",
- "off": "关闭调试",
- "on": "查看插件调用信息",
- "response": "返回结果"
+ "arguments": "Argumenten",
+ "function_call": "Functieoproep",
+ "off": "Zet debug uit",
+ "on": "Bekijk plug-in oproepinformatie",
+ "payload": "plug-in payload",
+ "response": "Reactie",
+ "tool_call": "Tool-oproepverzoek"
},
"detailModal": {
"info": {
- "description": "API 描述",
- "name": "API 名称"
+ "description": "API-beschrijving",
+ "name": "API-naam"
},
"tabs": {
- "info": "插件能力",
- "manifest": "安装文件",
- "settings": "设置"
+ "info": "Plug-in mogelijkheden",
+ "manifest": "Installatiebestand",
+ "settings": "Instellingen"
},
- "title": "插件详情"
+ "title": "Plug-in Details"
},
"dev": {
- "confirmDeleteDevPlugin": "即将删除该本地插件,删除后将无法找回,是否删除该插件?",
+ "confirmDeleteDevPlugin": "Weet u zeker dat u deze lokale plug-in wilt verwijderen? Eenmaal verwijderd, kan het niet worden hersteld.",
"customParams": {
"useProxy": {
- "label": "通过代理安装(如遇到跨域访问错误,可尝试开启该选项后重新安装)"
+ "label": "Installeren via proxy (als u problemen ondervindt met toegang tot cross-origin, probeer dan deze optie in te schakelen en opnieuw te installeren)"
}
},
- "deleteSuccess": "插件删除成功",
+ "deleteSuccess": "Plug-in succesvol verwijderd",
"manifest": {
"identifier": {
- "desc": "插件的唯一标识",
- "label": "标识符"
+ "desc": "De unieke identificatie van de plug-in",
+ "label": "Identificatie"
},
"mode": {
- "local": "可视化配置",
- "local-tooltip": "暂时不支持可视化配置",
- "url": "在线链接"
+ "local": "Visuele configuratie",
+ "local-tooltip": "Visuele configuratie wordt op dit moment niet ondersteund",
+ "url": "Online link"
},
"name": {
- "desc": "插件标题",
- "label": "标题",
- "placeholder": "搜索引擎"
+ "desc": "De titel van de plug-in",
+ "label": "Titel",
+ "placeholder": "Zoekmachine"
}
},
"meta": {
"author": {
- "desc": "插件的作者",
- "label": "作者"
+ "desc": "De auteur van de plug-in",
+ "label": "Auteur"
},
"avatar": {
- "desc": "插件的图标,可以使用 Emoji,也可以使用 URL",
- "label": "图标"
+ "desc": "Het pictogram van de plug-in, kan een Emoji of een URL zijn",
+ "label": "Pictogram"
},
"description": {
- "desc": "插件描述",
- "label": "描述",
- "placeholder": "查询搜索引擎获取信息"
+ "desc": "De beschrijving van de plug-in",
+ "label": "Beschrijving",
+ "placeholder": "Informatie verkrijgen van zoekmachines"
},
- "formFieldRequired": "该字段为必填项",
+ "formFieldRequired": "Dit veld is verplicht",
"homepage": {
- "desc": "插件的首页",
- "label": "首页"
+ "desc": "De startpagina van de plug-in",
+ "label": "Startpagina"
},
"identifier": {
- "desc": "插件的唯一标识,将从 manifest 中自动识别",
- "errorDuplicate": "标识符和已有插件重复,请修改标识符",
- "label": "标识符",
- "pattenErrorMessage": "只能输入英文字符、数字 、- 和_ 这两个符号"
+ "desc": "De unieke identificatie van de plug-in, ondersteunt alleen alfanumerieke tekens, koppelteken - en underscore _",
+ "errorDuplicate": "De identificatie wordt al gebruikt door een andere plug-in, wijzig de identificatie",
+ "label": "Identificatie",
+ "pattenErrorMessage": "Alleen alfanumerieke tekens, koppelteken - en underscore _ zijn toegestaan"
},
"manifest": {
- "desc": "LobeChat 将会通过该链接安装插件",
- "label": "插件描述文件 (Manifest) URL",
- "preview": "预览 Manifest",
- "refresh": "刷新"
+ "desc": "LobeChat zal de plug-in installeren via deze link",
+ "label": "Plug-in Beschrijving (Manifest) URL",
+ "preview": "Voorbeeld",
+ "refresh": "Vernieuwen"
},
"title": {
- "desc": "插件标题",
- "label": "标题",
- "placeholder": "搜索引擎"
+ "desc": "De titel van de plug-in",
+ "label": "Titel",
+ "placeholder": "Zoekmachine"
}
},
- "metaConfig": "插件元信息配置",
- "modalDesc": "添加自定义插件后,可用于插件开发验证,也可直接在会话中使用。插件开发请参考<1>开发文档↗>",
+ "metaConfig": "Configuratie van plug-inmetadata",
+ "modalDesc": "Na het toevoegen van een aangepaste plug-in kan deze worden gebruikt voor verificatie van plug-inontwikkeling of direct in de sessie. Raadpleeg de <1>ontwikkelingsdocumentatie↗> voor plug-inontwikkeling.",
"openai": {
- "importUrl": "从 URL 链接导入",
+ "importUrl": "Importeren van URL-link",
"schema": "Schema"
},
"preview": {
- "card": "预览插件展示效果",
- "desc": "预览插件描述",
- "title": "插件名称预览"
+ "card": "Voorbeeld van plug-inweergave",
+ "desc": "Voorbeeld van plug-inbeschrijving",
+ "title": "Voorbeeld van plug-innaam"
},
- "save": "安装插件",
- "saveSuccess": "插件设置保存成功",
+ "save": "Installeer plug-in",
+ "saveSuccess": "Instellingen van plug-in succesvol opgeslagen",
"tabs": {
- "manifest": "功能描述清单 (Manifest)",
- "meta": "插件元信息"
+ "manifest": "Functiebeschrijving Manifest (Manifest)",
+ "meta": "Plug-in Metadata"
},
"title": {
- "create": "添加自定义插件",
- "edit": "编辑自定义插件"
+ "create": "Aangepaste plug-in toevoegen",
+ "edit": "Aangepaste plug-in bewerken"
},
"type": {
- "lobe": "LobeChat 插件",
- "openai": "OpenAI 插件"
+ "lobe": "LobeChat-plug-in",
+ "openai": "OpenAI-plug-in"
},
- "update": "更新",
- "updateSuccess": "插件设置更新成功"
+ "update": "Bijwerken",
+ "updateSuccess": "Instellingen van plug-in succesvol bijgewerkt"
},
"error": {
"fetchError": "Het ophalen van de manifest-link is mislukt. Zorg ervoor dat de link geldig is en controleer of de link cross-origin toegang toestaat.",
@@ -128,10 +130,6 @@
"plugin": "Plugin wordt uitgevoerd..."
},
"pluginList": "Lijst met plugins",
- "plugins": {
- "loading": "Plugins worden gecontroleerd...",
- "unknown": "Onbekende plugin"
- },
"setting": "Plugin-instellingen",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Geïnstalleerd"
},
"title": "Pluginwinkel"
- }
+ },
+ "unknownPlugin": "onbekende plugin"
}
diff --git a/locales/nl-NL/tool.json b/locales/nl-NL/tool.json
index 8a458aaad29e..52448ec512f9 100644
--- a/locales/nl-NL/tool.json
+++ b/locales/nl-NL/tool.json
@@ -4,6 +4,7 @@
"downloading": "De link naar de afbeelding gegenereerd door DallE3 is slechts 1 uur geldig. De afbeelding wordt lokaal in de cache opgeslagen...",
"generate": "Genereren",
"generating": "Bezig met genereren...",
- "images": "Afbeeldingen:"
+ "images": "Afbeeldingen:",
+ "prompt": "prompt"
}
}
diff --git a/locales/pl-PL/common.json b/locales/pl-PL/common.json
index 446813dcdacd..1ee4664e94de 100644
--- a/locales/pl-PL/common.json
+++ b/locales/pl-PL/common.json
@@ -58,6 +58,7 @@
},
"title": "Import danych"
},
+ "installPWA": "Zainstaluj aplikację przeglądarki",
"lang": {
"ar": "arabski",
"bg-BG": "bułgarski",
diff --git a/locales/pl-PL/metadata.json b/locales/pl-PL/metadata.json
new file mode 100644
index 000000000000..4a95e8bb5134
--- /dev/null
+++ b/locales/pl-PL/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat zapewnia najlepsze doświadczenie użytkowania ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: narzędzie do poprawy efektywności osobistej LLM, dając sobie bardziej inteligentny umysł"
+ },
+ "market": {
+ "description": "Tworzenie treści, copywriting, pytania i odpowiedzi, generowanie obrazów, generowanie wideo, generowanie głosu, inteligentny agent, automatyzacja workflowów - dostosuj swojego własnego asystenta AI / GPTs / OLLaMA",
+ "title": "Rynek asystentów"
+ },
+ "plugins": {
+ "description": "Wyszukiwanie, generowanie wykresów, akademickie, generowanie obrazów, generowanie wideo, generowanie głosu, automatyzacja workflowów - dostosuj ekskluzywne możliwości narzędzi ToolCall dla ChatGPT / OLLaMA",
+ "title": "Rynek wtyczek"
+ },
+ "welcome": {
+ "description": "LobeChat zapewnia najlepsze doświadczenie użytkowania ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Witaj w LobeChat: narzędziu do poprawy efektywności osobistej LLM, dając sobie bardziej inteligentny umysł"
+ }
+}
diff --git a/locales/pl-PL/plugin.json b/locales/pl-PL/plugin.json
index 0132b95c3082..78f0f5580e88 100644
--- a/locales/pl-PL/plugin.json
+++ b/locales/pl-PL/plugin.json
@@ -1,166 +1,165 @@
{
"debug": {
- "arguments": "参数调试",
- "function_call": "函数调用",
- "off": "关闭",
- "on": "开启调试",
- "response": "响应结果"
+ "arguments": "Argumenty",
+ "function_call": "Wywołanie funkcji",
+ "off": "Wyłącz debugowanie",
+ "on": "Wyświetl informacje o wywołaniach wtyczki",
+ "payload": "dane wejściowe wtyczki",
+ "response": "Odpowiedź",
+ "tool_call": "żądanie wywołania narzędzia"
},
"detailModal": {
"info": {
- "description": "API 描述",
- "name": "API 名称"
+ "description": "Opis interfejsu API",
+ "name": "Nazwa interfejsu API"
},
"tabs": {
- "info": "插件信息",
- "manifest": "安装清单",
- "settings": "设置"
+ "info": "Zdolności wtyczki",
+ "manifest": "Plik instalacyjny",
+ "settings": "Ustawienia"
},
- "title": "插件详情"
+ "title": "Szczegóły wtyczki"
},
"dev": {
- "confirmDeleteDevPlugin": "确认删除开发插件?删除后将无法恢复。",
+ "confirmDeleteDevPlugin": "Czy na pewno chcesz usunąć tę lokalną wtyczkę? Po usunięciu nie będzie możliwe jej odzyskanie.",
"customParams": {
"useProxy": {
- "label": "使用代理安装(如遇跨域访问错误,可尝试开启该选项后重新安装)"
+ "label": "Zainstaluj za pośrednictwem serwera proxy (jeśli występują błędy dostępu z innej domeny, spróbuj włączyć tę opcję i ponownie zainstalować)"
}
},
- "deleteSuccess": "插件删除成功",
+ "deleteSuccess": "Wtyczka została pomyślnie usunięta",
"manifest": {
"identifier": {
- "desc": "插件的唯一标识",
- "label": "标识符"
+ "desc": "Unikalny identyfikator wtyczki",
+ "label": "Identyfikator"
},
"mode": {
- "local": "本地模式",
- "local-tooltip": "暂不支持本地模式",
- "url": "在线链接"
+ "local": "Konfiguracja wizualna",
+ "local-tooltip": "Konfiguracja wizualna nie jest obecnie obsługiwana",
+ "url": "Link online"
},
"name": {
- "desc": "插件标题",
- "label": "标题",
- "placeholder": "搜索引擎"
+ "desc": "Tytuł wtyczki",
+ "label": "Tytuł",
+ "placeholder": "Wyszukiwarka"
}
},
"meta": {
"author": {
- "desc": "插件作者",
- "label": "作者"
+ "desc": "Autor wtyczki",
+ "label": "Autor"
},
"avatar": {
- "desc": "插件图标,可使用 Emoji 或 URL",
- "label": "图标"
+ "desc": "Ikona wtyczki, może być emotikonem lub adresem URL",
+ "label": "Ikona"
},
"description": {
- "desc": "插件描述",
- "label": "描述",
- "placeholder": "查询搜索引擎获取信息"
+ "desc": "Opis wtyczki",
+ "label": "Opis",
+ "placeholder": "Pobierz informacje z wyszukiwarek"
},
- "formFieldRequired": "此字段为必填项",
+ "formFieldRequired": "To pole jest wymagane",
"homepage": {
- "desc": "插件首页",
- "label": "首页"
+ "desc": "Strona główna wtyczki",
+ "label": "Strona główna"
},
"identifier": {
- "desc": "插件的唯一标识,将从清单中自动识别",
- "errorDuplicate": "标识符与现有插件重复,请修改标识符",
- "label": "标识符",
- "pattenErrorMessage": "只能输入英文字符、数字、- 和_"
+ "desc": "Unikalny identyfikator wtyczki, obsługuje tylko znaki alfanumeryczne, myślnik - i podkreślenie _",
+ "errorDuplicate": "Identyfikator jest już używany przez inną wtyczkę, proszę zmień identyfikator",
+ "label": "Identyfikator",
+ "pattenErrorMessage": "Dozwolone są tylko znaki alfanumeryczne, myślnik - i podkreślenie _"
},
"manifest": {
- "desc": "LobeChat 将通过该链接安装插件",
- "label": "插件描述文件 (Manifest) URL",
- "preview": "预览清单",
- "refresh": "刷新"
+ "desc": "LobeChat zainstaluje wtyczkę za pomocą tego linku",
+ "label": "Opis wtyczki (Manifest) URL",
+ "preview": "Podgląd",
+ "refresh": "Odśwież"
},
"title": {
- "desc": "插件标题",
- "label": "标题",
- "placeholder": "搜索引擎"
+ "desc": "Tytuł wtyczki",
+ "label": "Tytuł",
+ "placeholder": "Wyszukiwarka"
}
},
- "metaConfig": "插件元信息配置",
- "modalDesc": "添加自定义插件后,可用于插件开发验证,也可直接在会话中使用。插件开发请参考<1>开发文档↗>",
+ "metaConfig": "Konfiguracja metadanych wtyczki",
+ "modalDesc": "Po dodaniu niestandardowej wtyczki można jej używać do weryfikacji rozwoju wtyczki lub bezpośrednio w sesji. Proszę odnieść się do <1>dokumentacji rozwojowej↗> dotyczącej rozwoju wtyczki.",
"openai": {
- "importUrl": "从 URL 导入",
- "schema": "模式"
+ "importUrl": "Importuj z linku URL",
+ "schema": "Schemat"
},
"preview": {
- "card": "预览插件效果",
- "desc": "预览插件描述",
- "title": "插件名称预览"
+ "card": "Podgląd wyświetlania wtyczki",
+ "desc": "Podgląd opisu wtyczki",
+ "title": "Podgląd nazwy wtyczki"
},
- "save": "安装插件",
- "saveSuccess": "插件设置保存成功",
+ "save": "Zainstaluj wtyczkę",
+ "saveSuccess": "Ustawienia wtyczki zostały pomyślnie zapisane",
"tabs": {
- "manifest": "功能描述清单 (Manifest)",
- "meta": "插件元信息"
+ "manifest": "Opis funkcji manifestu (Manifest)",
+ "meta": "Metadane wtyczki"
},
"title": {
- "create": "添加自定义插件",
- "edit": "编辑自定义插件"
+ "create": "Dodaj niestandardową wtyczkę",
+ "edit": "Edytuj niestandardową wtyczkę"
},
"type": {
- "lobe": "LobeChat 插件",
- "openai": "OpenAI 插件"
+ "lobe": "Wtyczka LobeChat",
+ "openai": "Wtyczka OpenAI"
},
- "update": "更新",
- "updateSuccess": "插件设置更新成功"
+ "update": "Aktualizuj",
+ "updateSuccess": "Ustawienia wtyczki zostały pomyślnie zaktualizowane"
},
"error": {
- "fetchError": "请求该清单链接失败,请确保链接的有效性,并检查链接是否允许跨域访问",
- "installError": "插件 {{name}} 安装失败",
- "manifestInvalid": "清单不符合规范,校验结果: \n\n {{error}}",
- "noManifest": "描述文件不存在",
- "openAPIInvalid": "OpenAPI 解析失败,错误: \n\n {{error}}",
- "reinstallError": "插件 {{name}} 刷新失败",
- "urlError": "该链接没有返回 JSON 格式的内容,请确保是有效的链接"
+ "fetchError": "Nie udało się pobrać linku manifestu. Upewnij się, że link jest poprawny i zezwala na dostęp z innej domeny.",
+ "installError": "Instalacja wtyczki {{name}} nie powiodła się",
+ "manifestInvalid": "Manifest nie spełnia specyfikacji. Wynik walidacji: \n\n {{error}}",
+ "noManifest": "Plik manifestu nie istnieje",
+ "openAPIInvalid": "Analiza OpenAPI nie powiodła się. Błąd: \n\n {{error}}",
+ "reinstallError": "Nie udało się odświeżyć wtyczki {{name}}",
+ "urlError": "Link nie zwrócił treści w formacie JSON. Upewnij się, że jest to poprawny link."
},
"list": {
"item": {
- "deprecated.title": "已删除",
- "local.config": "配置",
- "local.title": "自定义"
+ "deprecated.title": "Usunięte",
+ "local.config": "Konfiguracja",
+ "local.title": "Lokalne"
}
},
"loading": {
- "content": "调用插件中...",
- "plugin": "插件运行中..."
+ "content": "Wywoływanie wtyczki...",
+ "plugin": "Wtyczka jest uruchomiona..."
},
- "pluginList": "插件列表",
- "plugins": {
- "loading": "插件检测中...",
- "unknown": "未知插件"
- },
- "setting": "插件设置",
+ "pluginList": "Lista wtyczek",
+ "setting": "Ustawienia wtyczki",
"settings": {
"indexUrl": {
- "title": "市场索引",
- "tooltip": "暂不支持在线编辑,请通过部署时环境变量进行设置"
+ "title": "Indeks sklepu",
+ "tooltip": "Edycja nie jest obecnie obsługiwana"
},
- "modalDesc": "配置插件市场的地址后,可以使用自定义的插件市场",
- "title": "设置插件市场"
+ "modalDesc": "Po skonfigurowaniu adresu sklepu wtyczek możesz korzystać z niestandardowego sklepu wtyczek",
+ "title": "Skonfiguruj sklep wtyczek"
},
"store": {
"actions": {
- "confirmUninstall": "即将卸载该插件,卸载后将清除该插件配置,请确认你的操作",
- "detail": "详情",
- "install": "安装",
- "manifest": "编辑安装文件",
- "settings": "设置",
- "uninstall": "卸载"
+ "confirmUninstall": "Wtyczka zostanie odinstalowana. Po odinstalowaniu konfiguracja wtyczki zostanie wyczyszczona. Potwierdź swoje działanie.",
+ "detail": "Szczegóły",
+ "install": "Instaluj",
+ "manifest": "Edytuj plik instalacyjny",
+ "settings": "Ustawienia",
+ "uninstall": "Odinstaluj"
},
- "communityPlugin": "社区插件",
- "customPlugin": "自定义",
- "empty": "暂无已安装插件",
- "installAllPlugins": "安装全部",
- "networkError": "获取插件商店失败,请检测网络连接后重试",
- "placeholder": "搜索插件名称、介绍或关键词...",
- "releasedAt": "发布于 {{createdAt}}",
+ "communityPlugin": "Wtyczka społecznościowa",
+ "customPlugin": "Niestandardowa wtyczka",
+ "empty": "Brak zainstalowanych wtyczek",
+ "installAllPlugins": "Zainstaluj wszystkie",
+ "networkError": "Nie udało się pobrać sklepu wtyczek. Sprawdź swoje połączenie sieciowe i spróbuj ponownie",
+ "placeholder": "Szukaj nazwy wtyczki, opisu lub słowa kluczowego...",
+ "releasedAt": "Wydane {{createdAt}}",
"tabs": {
- "all": "全部",
- "installed": "已安装"
+ "all": "Wszystkie",
+ "installed": "Zainstalowane"
},
- "title": "插件商店"
- }
+ "title": "Sklep wtyczek"
+ },
+ "unknownPlugin": "nieznana wtyczka"
}
diff --git a/locales/pl-PL/tool.json b/locales/pl-PL/tool.json
index ced030efea23..104d25ef5aca 100644
--- a/locales/pl-PL/tool.json
+++ b/locales/pl-PL/tool.json
@@ -4,6 +4,7 @@
"downloading": "Linki do obrazów wygenerowanych przez DallE3 są ważne tylko przez 1 godzinę. Trwa pobieranie obrazów do lokalnego bufora...",
"generate": "Generuj",
"generating": "Generowanie...",
- "images": "Obrazy:"
+ "images": "Obrazy:",
+ "prompt": "słowo kluczowe"
}
}
diff --git a/locales/pt-BR/common.json b/locales/pt-BR/common.json
index 634b22d4c88a..ff81352f00b1 100644
--- a/locales/pt-BR/common.json
+++ b/locales/pt-BR/common.json
@@ -58,6 +58,7 @@
},
"title": "Importar dados"
},
+ "installPWA": "Instalar aplicativo de navegador",
"lang": {
"ar": "árabe",
"bg-BG": "Búlgaro",
diff --git a/locales/pt-BR/metadata.json b/locales/pt-BR/metadata.json
new file mode 100644
index 000000000000..97a2a3cb3f11
--- /dev/null
+++ b/locales/pt-BR/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat oferece a melhor experiência de uso do ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: Ferramenta de produtividade pessoal LLM para um cérebro mais inteligente"
+ },
+ "market": {
+ "description": "Criação de conteúdo, redação, perguntas e respostas, geração de imagens, geração de vídeos, geração de voz, agente inteligente, fluxo de trabalho automatizado, personalize seu assistente de IA / GPTs / OLLaMA exclusivo",
+ "title": "Mercado de assistentes"
+ },
+ "plugins": {
+ "description": "Pesquisa, geração de gráficos, acadêmico, geração de imagens, geração de vídeos, geração de voz, fluxo de trabalho automatizado, personalize a capacidade de plug-in exclusiva do ChatGPT / OLLaMA com ToolCall",
+ "title": "Mercado de plug-ins"
+ },
+ "welcome": {
+ "description": "LobeChat oferece a melhor experiência de uso do ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Bem-vindo ao LobeChat: Ferramenta de produtividade pessoal LLM para um cérebro mais inteligente"
+ }
+}
diff --git a/locales/pt-BR/plugin.json b/locales/pt-BR/plugin.json
index 67c96efba8d3..59f08d66421f 100644
--- a/locales/pt-BR/plugin.json
+++ b/locales/pt-BR/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Chamada de Função",
"off": "Desativar Depuração",
"on": "Ver Informações de Chamada de Plugin",
- "response": "Resposta"
+ "payload": "carga do plugin",
+ "response": "Resposta",
+ "tool_call": "solicitação de chamada de ferramenta"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Executando o plugin..."
},
"pluginList": "Lista de Plugins",
- "plugins": {
- "loading": "Verificando plugins...",
- "unknown": "Plugin desconhecido"
- },
"setting": "Configuração do Plugin",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Instalados"
},
"title": "Loja de Plugins"
- }
+ },
+ "unknownPlugin": "Plugin desconhecido"
}
diff --git a/locales/pt-BR/tool.json b/locales/pt-BR/tool.json
index ab839f22144e..8c1e193b22bd 100644
--- a/locales/pt-BR/tool.json
+++ b/locales/pt-BR/tool.json
@@ -4,6 +4,7 @@
"downloading": "O link da imagem gerada pelo DALL·E3 é válido apenas por 1 hora, está baixando a imagem para o armazenamento local...",
"generate": "Gerar",
"generating": "Gerando...",
- "images": "Imagens:"
+ "images": "Imagens:",
+ "prompt": "Palavra-chave"
}
}
diff --git a/locales/ru-RU/common.json b/locales/ru-RU/common.json
index 7ff343727161..9480d368fa32 100644
--- a/locales/ru-RU/common.json
+++ b/locales/ru-RU/common.json
@@ -58,6 +58,7 @@
},
"title": "Импорт данных"
},
+ "installPWA": "Установить веб-приложение",
"lang": {
"ar": "арабский",
"bg-BG": "болгарский",
diff --git a/locales/ru-RU/metadata.json b/locales/ru-RU/metadata.json
new file mode 100644
index 000000000000..1f8e10debb7a
--- /dev/null
+++ b/locales/ru-RU/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat предлагает вам лучший опыт использования ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: персональный инструмент для повышения эффективности LLM, чтобы сделать ваш мозг умнее"
+ },
+ "market": {
+ "description": "Создание контента, копирайтинг, вопросы и ответы, генерация изображений, видео, голоса, интеллектуальный агент, автоматизация рабочих процессов, настройте своего собственного помощника AI / GPTs / OLLaMA",
+ "title": "Рынок помощников"
+ },
+ "plugins": {
+ "description": "Поиск, создание диаграмм, академические исследования, генерация изображений, видео, голоса, автоматизация рабочих процессов, настройте специальные возможности плагинов ToolCall для ChatGPT / OLLaMA",
+ "title": "Рынок плагинов"
+ },
+ "welcome": {
+ "description": "LobeChat предлагает вам лучший опыт использования ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Добро пожаловать в LobeChat: персональный инструмент для повышения эффективности LLM, чтобы сделать ваш мозг умнее"
+ }
+}
diff --git a/locales/ru-RU/plugin.json b/locales/ru-RU/plugin.json
index 88a5a41cd00b..ceb3b7129f3f 100644
--- a/locales/ru-RU/plugin.json
+++ b/locales/ru-RU/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Вызов функции",
"off": "Отключить отладку",
"on": "Включить отображение информации о вызовах плагинов",
- "response": "Ответ"
+ "payload": "полезная нагрузка",
+ "response": "Ответ",
+ "tool_call": "запрос на вызов инструмента"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Запуск плагина..."
},
"pluginList": "Список плагинов",
- "plugins": {
- "loading": "Загрузка плагинов...",
- "unknown": "Неизвестный плагин"
- },
"setting": "Настройка плагина",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Установленные"
},
"title": "Магазин плагинов"
- }
+ },
+ "unknownPlugin": "Неизвестный плагин"
}
diff --git a/locales/ru-RU/tool.json b/locales/ru-RU/tool.json
index 171136250c3d..94b30e6ed4c1 100644
--- a/locales/ru-RU/tool.json
+++ b/locales/ru-RU/tool.json
@@ -4,6 +4,7 @@
"downloading": "Ссылка на изображение, созданное DALL·E3, действительна только в течение 1 часа. Идет кэширование изображения локально...",
"generate": "Создать",
"generating": "Создание...",
- "images": "Изображения:"
+ "images": "Изображения:",
+ "prompt": "подсказка"
}
}
diff --git a/locales/tr-TR/common.json b/locales/tr-TR/common.json
index 145aaa5ca8d0..93f92824aff3 100644
--- a/locales/tr-TR/common.json
+++ b/locales/tr-TR/common.json
@@ -58,6 +58,7 @@
},
"title": "Veri İçe Aktar"
},
+ "installPWA": "Tarayıcı Uygulamasını Yükle",
"lang": {
"ar": "Arapça",
"bg-BG": "Bulgarca",
diff --git a/locales/tr-TR/metadata.json b/locales/tr-TR/metadata.json
new file mode 100644
index 000000000000..c45b5a078b32
--- /dev/null
+++ b/locales/tr-TR/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat size en iyi ChatGPT, OLLaMA, Gemini, Claude WebUI kullanım deneyimini sunar",
+ "title": "LobeChat: Kişisel LLM Verimlilik Aracı, Daha Akıllı Bir Beyin İçin Kendinize Bir Hediye"
+ },
+ "market": {
+ "description": "İçerik oluşturma, metin yazma, soru cevap, görüntü oluşturma, video oluşturma, ses oluşturma, akıllı ajan, otomasyon iş akışı, kendi AI / GPTs / OLLaMA akıllı asistanınızı özelleştirin",
+ "title": "Asistan Pazarı"
+ },
+ "plugins": {
+ "description": "Arama, grafik oluşturma, akademik, görüntü oluşturma, video oluşturma, ses oluşturma, otomasyon iş akışı, ChatGPT / OLLaMA için özel ToolCall eklenti yeteneklerini özelleştirin",
+ "title": "Eklenti Pazarı"
+ },
+ "welcome": {
+ "description": "LobeChat size en iyi ChatGPT, OLLaMA, Gemini, Claude WebUI kullanım deneyimini sunar",
+ "title": "LobeChat'i Kullanmaya Hoş Geldiniz: Kişisel LLM Verimlilik Aracı, Daha Akıllı Bir Beyin İçin Kendinize Bir Hediye"
+ }
+}
diff --git a/locales/tr-TR/plugin.json b/locales/tr-TR/plugin.json
index 3cbbbfbdf845..6c50d4cf3d36 100644
--- a/locales/tr-TR/plugin.json
+++ b/locales/tr-TR/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Fonksiyon Çağrısı",
"off": "Hata Ayıklamayı Kapat",
"on": "Eklenti Çağrı Bilgilerini Görüntüle",
- "response": "Yanıt"
+ "payload": "eklenti yükü",
+ "response": "Yanıt",
+ "tool_call": "aracı çağrı"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Eklenti çalışıyor..."
},
"pluginList": "Eklenti Listesi",
- "plugins": {
- "loading": "Eklentiler kontrol ediliyor...",
- "unknown": "Bilinmeyen eklenti"
- },
"setting": "Eklenti Ayarları",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Yüklü"
},
"title": "Eklenti Mağazası"
- }
+ },
+ "unknownPlugin": "Bilinmeyen eklenti"
}
diff --git a/locales/tr-TR/tool.json b/locales/tr-TR/tool.json
index a22966f74fd7..4a5b0965510e 100644
--- a/locales/tr-TR/tool.json
+++ b/locales/tr-TR/tool.json
@@ -4,6 +4,7 @@
"downloading": "DallE3 tarafından oluşturulan resim bağlantıları sadece 1 saat geçerlidir, resim yerel olarak önbelleğe alınıyor...",
"generate": "Oluştur",
"generating": "Oluşturuluyor...",
- "images": "Görseller:"
+ "images": "Görseller:",
+ "prompt": "İpucu"
}
}
diff --git a/locales/vi-VN/common.json b/locales/vi-VN/common.json
index 54401c78ef09..cc5b736c6488 100644
--- a/locales/vi-VN/common.json
+++ b/locales/vi-VN/common.json
@@ -58,6 +58,7 @@
},
"title": "Nhập dữ liệu"
},
+ "installPWA": "Cài đặt ứng dụng trình duyệt",
"lang": {
"ar": "Tiếng Ả Rập",
"bg-BG": "Tiếng Bun-ga-ri",
diff --git a/locales/vi-VN/metadata.json b/locales/vi-VN/metadata.json
new file mode 100644
index 000000000000..743c34f7533b
--- /dev/null
+++ b/locales/vi-VN/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat mang đến trải nghiệm sử dụng tốt nhất với ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "LobeChat: Công cụ hiệu suất cá nhân LLM, giúp tăng cường trí não của bạn"
+ },
+ "market": {
+ "description": "Tạo nội dung, viết copy, trả lời câu hỏi, tạo hình ảnh, tạo video, tạo giọng nói, trợ lý thông minh, quy trình làm việc tự động, tùy chỉnh trợ lý trí tuệ AI / GPTs / OLLaMA riêng của bạn",
+ "title": "Thị trường trợ lý"
+ },
+ "plugins": {
+ "description": "Tìm kiếm, tạo biểu đồ, học thuật, tạo hình ảnh, tạo video, tạo giọng nói, quy trình làm việc tự động, tùy chỉnh khả năng plugin ToolCall riêng của ChatGPT / OLLaMA",
+ "title": "Thị trường plugin"
+ },
+ "welcome": {
+ "description": "LobeChat mang đến trải nghiệm sử dụng tốt nhất với ChatGPT, OLLaMA, Gemini, Claude WebUI",
+ "title": "Chào mừng đến với LobeChat: Công cụ hiệu suất cá nhân LLM, giúp tăng cường trí não của bạn"
+ }
+}
diff --git a/locales/vi-VN/plugin.json b/locales/vi-VN/plugin.json
index 34f09a9d5b8e..dadf166cbe5c 100644
--- a/locales/vi-VN/plugin.json
+++ b/locales/vi-VN/plugin.json
@@ -4,7 +4,9 @@
"function_call": "Gọi hàm",
"off": "Tắt gỡ lỗi",
"on": "Xem thông tin gọi plugin",
- "response": "Kết quả trả về"
+ "payload": "Dữ liệu cắm",
+ "response": "Kết quả trả về",
+ "tool_call": "Yêu cầu công cụ"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "Plugin đang chạy..."
},
"pluginList": "Danh sách plugin",
- "plugins": {
- "loading": "Đang kiểm tra công cụ...",
- "unknown": "Công cụ không xác định"
- },
"setting": "Cài đặt plugin",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "Đã cài đặt"
},
"title": "Cửa hàng plugin"
- }
+ },
+ "unknownPlugin": "Plugin không xác định"
}
diff --git a/locales/vi-VN/tool.json b/locales/vi-VN/tool.json
index d289333ecb56..38e997bf1be1 100644
--- a/locales/vi-VN/tool.json
+++ b/locales/vi-VN/tool.json
@@ -4,6 +4,7 @@
"downloading": "Liên kết hình ảnh được tạo bởi DallE3 chỉ có hiệu lực trong 1 giờ, đang tải hình ảnh xuống máy...",
"generate": "Tạo",
"generating": "Đang tạo...",
- "images": "Hình ảnh:"
+ "images": "Hình ảnh:",
+ "prompt": "Từ khóa"
}
}
diff --git a/locales/zh-CN/common.json b/locales/zh-CN/common.json
index 9f58ad9d5df3..b3619043538b 100644
--- a/locales/zh-CN/common.json
+++ b/locales/zh-CN/common.json
@@ -58,6 +58,7 @@
},
"title": "导入数据"
},
+ "installPWA": "安装浏览器应用 (PWA)",
"lang": {
"ar": "阿拉伯语",
"bg-BG": "保加利亚语",
diff --git a/locales/zh-CN/metadata.json b/locales/zh-CN/metadata.json
new file mode 100644
index 000000000000..c0db09e96b7e
--- /dev/null
+++ b/locales/zh-CN/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat 带给你最好的 ChatGPT, OLLaMA, Gemini, Claude WebUI 使用体验",
+ "title": "LobeChat:个人 LLM 效能工具,给自己一个更聪明的大脑"
+ },
+ "market": {
+ "description": "内容创作、文案、问答、图像生成、视频生成、语音生成、智能 Agent、自动化工作流,定制你专属的 AI / GPTs / OLLaMA 智能助手",
+ "title": "助手市场"
+ },
+ "plugins": {
+ "description": "搜素、图表生成、学术、图像生成、视频生成、语音生成、自动化工作流,定制 ChatGPT / OLLaMA 专属的 ToolCall 插件能力",
+ "title": "插件市场"
+ },
+ "welcome": {
+ "description": "LobeChat 带给你最好的 ChatGPT, OLLaMA, Gemini, Claude WebUI 使用体验",
+ "title": "欢迎使用 LobeChat:个人 LLM 效能工具,给自己一个更聪明的大脑"
+ }
+}
diff --git a/locales/zh-CN/plugin.json b/locales/zh-CN/plugin.json
index e6de6a00f34b..de096296754f 100644
--- a/locales/zh-CN/plugin.json
+++ b/locales/zh-CN/plugin.json
@@ -4,7 +4,9 @@
"function_call": "函数调用",
"off": "关闭调试",
"on": "查看插件调用信息",
- "response": "返回结果"
+ "payload": "插件载荷",
+ "response": "返回结果",
+ "tool_call": "工具调用请求"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "插件运行中..."
},
"pluginList": "插件列表",
- "plugins": {
- "loading": "工具检测中...",
- "unknown": "未知工具"
- },
"setting": "插件设置",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "已安装"
},
"title": "插件商店"
- }
+ },
+ "unknownPlugin": "未知插件"
}
diff --git a/locales/zh-CN/tool.json b/locales/zh-CN/tool.json
index a818d01ccf06..3f459aa66931 100644
--- a/locales/zh-CN/tool.json
+++ b/locales/zh-CN/tool.json
@@ -4,6 +4,7 @@
"downloading": "DallE3 生成的图片链接有效期仅1小时,正在缓存图片到本地...",
"generate": "生成",
"generating": "生成中...",
- "images": "图片:"
+ "images": "图片:",
+ "prompt": "提示词"
}
}
diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json
index d547133c38b9..e3cfcef784c2 100644
--- a/locales/zh-TW/common.json
+++ b/locales/zh-TW/common.json
@@ -58,6 +58,7 @@
},
"title": "匯入資料"
},
+ "installPWA": "安裝瀏覽器應用 (PWA)",
"lang": {
"ar": "阿拉伯語",
"bg-BG": "保加利亞語",
diff --git a/locales/zh-TW/metadata.json b/locales/zh-TW/metadata.json
new file mode 100644
index 000000000000..c206897fddaa
--- /dev/null
+++ b/locales/zh-TW/metadata.json
@@ -0,0 +1,18 @@
+{
+ "chat": {
+ "description": "LobeChat 帶給你最佳的 ChatGPT、OLLaMA、Gemini、Claude WebUI 使用體驗",
+ "title": "LobeChat:個人 LLM 效能工具,給自己一個更聰明的大腦"
+ },
+ "market": {
+ "description": "內容創作、文案、問答、圖像生成、視頻生成、語音生成、智能 Agent、自動化工作流,定制你專屬的 AI / GPTs / OLLaMA 智能助手",
+ "title": "助手市場"
+ },
+ "plugins": {
+ "description": "搜尋、圖表生成、學術、圖像生成、視頻生成、語音生成、自動化工作流,定制 ChatGPT / OLLaMA 專屬的 ToolCall 插件能力",
+ "title": "插件市場"
+ },
+ "welcome": {
+ "description": "LobeChat 帶給你最佳的 ChatGPT、OLLaMA、Gemini、Claude WebUI 使用體驗",
+ "title": "歡迎使用 LobeChat:個人 LLM 效能工具,給自己一個更聰明的大腦"
+ }
+}
diff --git a/locales/zh-TW/plugin.json b/locales/zh-TW/plugin.json
index e496bee19c29..dd7042240b85 100644
--- a/locales/zh-TW/plugin.json
+++ b/locales/zh-TW/plugin.json
@@ -4,7 +4,9 @@
"function_call": "函式呼叫",
"off": "關閉偵錯",
"on": "查看插件呼叫資訊",
- "response": "回應"
+ "payload": "插件載荷",
+ "response": "回應",
+ "tool_call": "工具呼叫"
},
"detailModal": {
"info": {
@@ -128,10 +130,6 @@
"plugin": "外掛執行中..."
},
"pluginList": "外掛清單",
- "plugins": {
- "loading": "插件檢測中...",
- "unknown": "未知插件"
- },
"setting": "插件設置",
"settings": {
"indexUrl": {
@@ -162,5 +160,6 @@
"installed": "已安裝"
},
"title": "插件商店"
- }
+ },
+ "unknownPlugin": "未知插件"
}
diff --git a/locales/zh-TW/tool.json b/locales/zh-TW/tool.json
index e9a699f61ceb..b1c3c53689e9 100644
--- a/locales/zh-TW/tool.json
+++ b/locales/zh-TW/tool.json
@@ -4,6 +4,7 @@
"downloading": "DallE3 生成的圖片連結有效期僅1小時,正在快取圖片到本地...",
"generate": "生成",
"generating": "生成中...",
- "images": "圖片:"
+ "images": "圖片:",
+ "prompt": "提示詞"
}
}
diff --git a/package.json b/package.json
index 7bb2bc3854ce..b533ff208f2b 100644
--- a/package.json
+++ b/package.json
@@ -141,6 +141,7 @@
"pino": "^9.0.0",
"polished": "^4.3.1",
"posthog-js": "^1.131.4",
+ "pwa-install-handler": "^2.5.0",
"query-string": "^9.0.0",
"random-words": "^2.0.1",
"react": "^18.3.1",
diff --git a/public/icons/maskable-icon-192x192.png b/public/icons/icon-192x192.maskable.png
similarity index 100%
rename from public/icons/maskable-icon-192x192.png
rename to public/icons/icon-192x192.maskable.png
diff --git a/public/icons/maskable-icon-512x512.png b/public/icons/icon-512x512.maskable.png
similarity index 100%
rename from public/icons/maskable-icon-512x512.png
rename to public/icons/icon-512x512.maskable.png
diff --git a/public/manifest.json b/public/manifest.json
index 452614090a44..ebb5e301be49 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -1,7 +1,13 @@
{
"background_color": "#000000",
- "description": "An open-source, extensible (Function Calling), high-performance chatbot framework. It supports one-click free deployment of your private ChatGPT/LLM web application",
+ "categories": ["productivity", "design", "development", "education"],
+ "description": "Personal LLM productivity tool, brings you the best user experience of ChatGPT, OLLaMA, Gemini, Claude WebUI. Customize AI assistant features flexibly according to personalized needs to solve problems, enhance productivity, and explore future workflow in LobeChat.",
"display": "standalone",
+ "display_override": ["tabbed"],
+ "edge_side_panel": {
+ "preferred_width": 480
+ },
+ "handle_links": "auto",
"icons": [
{
"src": "/icons/icon-192x192.png",
@@ -10,7 +16,7 @@
"purpose": "any"
},
{
- "src": "/icons/maskable-icon-192x192.png",
+ "src": "/icons/icon-192x192.maskable.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
@@ -22,40 +28,94 @@
"purpose": "any"
},
{
- "src": "/icons/maskable-icon-512x512.png",
+ "src": "/icons/icon-512x512.maskable.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
],
- "id": "/",
+ "id": "lobe-chat",
+ "launch_handler": {
+ "client_mode": ["navigate-existing", "auto"]
+ },
"name": "LobeChat",
"orientation": "portrait",
+ "related_applications": [
+ {
+ "platform": "webapp",
+ "url": "https://chat-preview.lobehub.com/manifest.json"
+ }
+ ],
"scope": "/",
"screenshots": [
{
- "src": "/screenshots/screenshot-1.png",
- "sizes": "750x1334",
- "type": "image/png"
+ "src": "/screenshots/shot-1.mobile.png",
+ "sizes": "640x1138",
+ "type": "image/png",
+ "form_factor": "narrow"
+ },
+ {
+ "src": "/screenshots/shot-2.mobile.png",
+ "sizes": "640x1138",
+ "type": "image/png",
+ "form_factor": "narrow"
+ },
+ {
+ "src": "/screenshots/shot-3.mobile.png",
+ "sizes": "640x1138",
+ "type": "image/png",
+ "form_factor": "narrow"
+ },
+ {
+ "src": "/screenshots/shot-4.mobile.png",
+ "sizes": "640x1138",
+ "type": "image/png",
+ "form_factor": "narrow"
+ },
+ {
+ "src": "/screenshots/shot-5.mobile.png",
+ "sizes": "640x1138",
+ "type": "image/png",
+ "form_factor": "narrow"
},
{
- "src": "/screenshots/screenshot-2.png",
- "sizes": "750x1334",
- "type": "image/png"
+ "src": "/screenshots/shot-1.desktop.png",
+ "sizes": "1280x676",
+ "type": "image/png",
+ "form_factor": "wide"
},
{
- "src": "/screenshots/screenshot-3.png",
- "sizes": "750x1334",
- "type": "image/png"
+ "src": "/screenshots/shot-2.desktop.png",
+ "sizes": "1280x676",
+ "type": "image/png",
+ "form_factor": "wide"
},
{
- "src": "/screenshots/screenshot-4.png",
- "sizes": "750x1334",
- "type": "image/png"
+ "src": "/screenshots/shot-3.desktop.png",
+ "sizes": "1280x676",
+ "type": "image/png",
+ "form_factor": "wide"
+ },
+ {
+ "src": "/screenshots/shot-4.desktop.png",
+ "sizes": "1280x676",
+ "type": "image/png",
+ "form_factor": "wide"
+ },
+ {
+ "src": "/screenshots/shot-5.desktop.png",
+ "sizes": "1280x676",
+ "type": "image/png",
+ "form_factor": "wide"
}
],
"short_name": "LobeChat",
"splash_pages": null,
"start_url": ".",
+ "tab_strip": {
+ "new_tab_button": {
+ "url": "/"
+ }
+ },
"theme_color": "#000000"
}
diff --git a/public/og/cover.png b/public/og/cover.png
new file mode 100644
index 000000000000..4c9ed9455155
Binary files /dev/null and b/public/og/cover.png differ
diff --git a/public/screenshots/screenshot-1.png b/public/screenshots/screenshot-1.png
deleted file mode 100644
index 207e57fb4d72..000000000000
Binary files a/public/screenshots/screenshot-1.png and /dev/null differ
diff --git a/public/screenshots/screenshot-2.png b/public/screenshots/screenshot-2.png
deleted file mode 100644
index a6f9d3e95ddb..000000000000
Binary files a/public/screenshots/screenshot-2.png and /dev/null differ
diff --git a/public/screenshots/screenshot-3.png b/public/screenshots/screenshot-3.png
deleted file mode 100644
index 170597363382..000000000000
Binary files a/public/screenshots/screenshot-3.png and /dev/null differ
diff --git a/public/screenshots/screenshot-4.png b/public/screenshots/screenshot-4.png
deleted file mode 100644
index 4772d31ec990..000000000000
Binary files a/public/screenshots/screenshot-4.png and /dev/null differ
diff --git a/public/screenshots/shot-1.desktop.png b/public/screenshots/shot-1.desktop.png
new file mode 100644
index 000000000000..9c28b281c179
Binary files /dev/null and b/public/screenshots/shot-1.desktop.png differ
diff --git a/public/screenshots/shot-1.mobile.png b/public/screenshots/shot-1.mobile.png
new file mode 100644
index 000000000000..a6c437e04c7e
Binary files /dev/null and b/public/screenshots/shot-1.mobile.png differ
diff --git a/public/screenshots/shot-2.desktop.png b/public/screenshots/shot-2.desktop.png
new file mode 100644
index 000000000000..8a61f16c503d
Binary files /dev/null and b/public/screenshots/shot-2.desktop.png differ
diff --git a/public/screenshots/shot-2.mobile.png b/public/screenshots/shot-2.mobile.png
new file mode 100644
index 000000000000..dbaabc4f2146
Binary files /dev/null and b/public/screenshots/shot-2.mobile.png differ
diff --git a/public/screenshots/shot-3.desktop.png b/public/screenshots/shot-3.desktop.png
new file mode 100644
index 000000000000..c1046fc7e0c1
Binary files /dev/null and b/public/screenshots/shot-3.desktop.png differ
diff --git a/public/screenshots/shot-3.mobile.png b/public/screenshots/shot-3.mobile.png
new file mode 100644
index 000000000000..e4bf5b225738
Binary files /dev/null and b/public/screenshots/shot-3.mobile.png differ
diff --git a/public/screenshots/shot-4.desktop.png b/public/screenshots/shot-4.desktop.png
new file mode 100644
index 000000000000..e6f0cc27864d
Binary files /dev/null and b/public/screenshots/shot-4.desktop.png differ
diff --git a/public/screenshots/shot-4.mobile.png b/public/screenshots/shot-4.mobile.png
new file mode 100644
index 000000000000..a6baa107a8e5
Binary files /dev/null and b/public/screenshots/shot-4.mobile.png differ
diff --git a/public/screenshots/shot-5.desktop.png b/public/screenshots/shot-5.desktop.png
new file mode 100644
index 000000000000..e38a8cdb7020
Binary files /dev/null and b/public/screenshots/shot-5.desktop.png differ
diff --git a/public/screenshots/shot-5.mobile.png b/public/screenshots/shot-5.mobile.png
new file mode 100644
index 000000000000..5eb8ad43fb9d
Binary files /dev/null and b/public/screenshots/shot-5.mobile.png differ
diff --git a/src/app/(auth)/login/[[...login]]/PageTitle.tsx b/src/app/(auth)/login/[[...login]]/PageTitle.tsx
deleted file mode 100644
index 79cfdf3c830a..000000000000
--- a/src/app/(auth)/login/[[...login]]/PageTitle.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-'use client';
-
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import PageTitle from '@/components/PageTitle';
-
-const Title = memo(() => {
- const { t } = useTranslation('auth');
-
- return ;
-});
-export default Title;
diff --git a/src/app/(auth)/login/[[...login]]/page.tsx b/src/app/(auth)/login/[[...login]]/page.tsx
index 2f819cafa1b3..2598f4250eb7 100644
--- a/src/app/(auth)/login/[[...login]]/page.tsx
+++ b/src/app/(auth)/login/[[...login]]/page.tsx
@@ -1,14 +1,21 @@
import { SignIn } from '@clerk/nextjs';
-import PageTitle from './PageTitle';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
+
+export const generateMetadata = async () => {
+ const { t } = await translation('clerk');
+ return metadataModule.generate({
+ description: t('signIn.start.subtitle'),
+ title: t('signIn.start.title', { applicationName: 'LobeChat' }),
+ url: '/login',
+ });
+};
const Page = () => {
- return (
- <>
-
-
- >
- );
+ return ;
};
+Page.displayName = 'Login';
+
export default Page;
diff --git a/src/app/(auth)/signup/[[...signup]]/PageTitle.tsx b/src/app/(auth)/signup/[[...signup]]/PageTitle.tsx
deleted file mode 100644
index a0924ce20997..000000000000
--- a/src/app/(auth)/signup/[[...signup]]/PageTitle.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-'use client';
-
-import { memo } from 'react';
-import { useTranslation } from 'react-i18next';
-
-import PageTitle from '@/components/PageTitle';
-
-const Title = memo(() => {
- const { t } = useTranslation('auth');
-
- return ;
-});
-export default Title;
diff --git a/src/app/(auth)/signup/[[...signup]]/page.tsx b/src/app/(auth)/signup/[[...signup]]/page.tsx
index b1913f71e2a2..eeac0953592a 100644
--- a/src/app/(auth)/signup/[[...signup]]/page.tsx
+++ b/src/app/(auth)/signup/[[...signup]]/page.tsx
@@ -1,14 +1,21 @@
import { SignUp } from '@clerk/nextjs';
-import PageTitle from './PageTitle';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
+
+export const generateMetadata = async () => {
+ const { t } = await translation('clerk');
+ return metadataModule.generate({
+ description: t('signUp.start.subtitle'),
+ title: t('signUp.start.title'),
+ url: '/signup',
+ });
+};
const Page = () => {
- return (
- <>
-
-
- >
- );
+ return ;
};
+Page.displayName = 'SignUp';
+
export default Page;
diff --git a/src/app/(main)/(mobile)/me/(home)/features/useCategory.tsx b/src/app/(main)/(mobile)/me/(home)/features/useCategory.tsx
index 3b3456e41928..5f084d3e451b 100644
--- a/src/app/(main)/(mobile)/me/(home)/features/useCategory.tsx
+++ b/src/app/(main)/(mobile)/me/(home)/features/useCategory.tsx
@@ -1,11 +1,12 @@
import { DiscordIcon } from '@lobehub/ui';
-import { Book, CircleUserRound, Database, Feather, Settings2 } from 'lucide-react';
+import { Book, CircleUserRound, Database, Download, Feather, Settings2 } from 'lucide-react';
import { useRouter } from 'next/navigation';
import { useTranslation } from 'react-i18next';
import { CellProps } from '@/components/Cell';
import { enableAuth } from '@/const/auth';
import { DISCORD, DOCUMENTS, FEEDBACK } from '@/const/url';
+import { usePWAInstall } from '@/hooks/usePWAInstall';
import { useUserStore } from '@/store/user';
import { authSelectors } from '@/store/user/slices/auth/selectors';
@@ -13,6 +14,7 @@ import { useCategory as useSettingsCategory } from '../../settings/features/useC
export const useCategory = () => {
const router = useRouter();
+ const { canInstall, install } = usePWAInstall();
const { t } = useTranslation(['common', 'setting', 'auth']);
const [isLogin, isLoginWithAuth, isLoginWithClerk] = useUserStore((s) => [
authSelectors.isLogin(s),
@@ -41,6 +43,18 @@ export const useCategory = () => {
},
];
+ const pwa: CellProps[] = [
+ {
+ icon: Download,
+ key: 'pwa',
+ label: t('installPWA'),
+ onClick: () => install(),
+ },
+ {
+ type: 'divider',
+ },
+ ];
+
const settingsWithoutAuth = [
...useSettingsCategory(),
{
@@ -87,6 +101,7 @@ export const useCategory = () => {
},
...(isLoginWithClerk ? profile : []),
...(enableAuth ? (isLoginWithAuth ? settings : []) : settingsWithoutAuth),
+ ...(canInstall ? pwa : []),
...(isLogin ? data : []),
...helps,
].filter(Boolean) as CellProps[];
diff --git a/src/app/(main)/(mobile)/me/(home)/page.tsx b/src/app/(main)/(mobile)/me/(home)/page.tsx
index a0f96954b28a..5db1e3f08408 100644
--- a/src/app/(main)/(mobile)/me/(home)/page.tsx
+++ b/src/app/(main)/(mobile)/me/(home)/page.tsx
@@ -2,11 +2,21 @@ import { redirect } from 'next/navigation';
import { Center } from 'react-layout-kit';
import BrandWatermark from '@/components/BrandWatermark';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
import Category from './features/Category';
import UserBanner from './features/UserBanner';
+export const generateMetadata = async () => {
+ const { t } = await translation('common');
+ return metadataModule.generate({
+ title: t('tab.me'),
+ url: '/me',
+ });
+};
+
const Page = () => {
const mobile = isMobileDevice();
diff --git a/src/app/(main)/(mobile)/me/data/page.tsx b/src/app/(main)/(mobile)/me/data/page.tsx
index cc11c6422a1d..6f278bf94aa9 100644
--- a/src/app/(main)/(mobile)/me/data/page.tsx
+++ b/src/app/(main)/(mobile)/me/data/page.tsx
@@ -1,9 +1,19 @@
import { redirect } from 'next/navigation';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
import Category from './features/Category';
+export const generateMetadata = async () => {
+ const { t } = await translation('common');
+ return metadataModule.generate({
+ title: t('userPanel.data'),
+ url: '/me/data',
+ });
+};
+
const Page = () => {
const mobile = isMobileDevice();
diff --git a/src/app/(main)/(mobile)/me/profile/page.tsx b/src/app/(main)/(mobile)/me/profile/page.tsx
index 7bfc2fe371c5..120cadca1e19 100644
--- a/src/app/(main)/(mobile)/me/profile/page.tsx
+++ b/src/app/(main)/(mobile)/me/profile/page.tsx
@@ -1,9 +1,20 @@
import { redirect } from 'next/navigation';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
import Category from './features/Category';
+export const generateMetadata = async () => {
+ const { t } = await translation('clerk');
+ return metadataModule.generate({
+ description: t('userProfile.navbar.title'),
+ title: t('userProfile.navbar.description'),
+ url: '/me/profile',
+ });
+};
+
const Page = () => {
const mobile = isMobileDevice();
diff --git a/src/app/(main)/(mobile)/me/settings/page.tsx b/src/app/(main)/(mobile)/me/settings/page.tsx
index 771b7208db87..4cabe69d8734 100644
--- a/src/app/(main)/(mobile)/me/settings/page.tsx
+++ b/src/app/(main)/(mobile)/me/settings/page.tsx
@@ -1,9 +1,20 @@
import { redirect } from 'next/navigation';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
import Category from './features/Category';
+export const generateMetadata = async () => {
+ const { t } = await translation('setting');
+ return metadataModule.generate({
+ description: t('header.desc'),
+ title: t('header.title'),
+ url: '/me/settings',
+ });
+};
+
const Page = () => {
const mobile = isMobileDevice();
diff --git a/src/app/(main)/chat/(workspace)/page.tsx b/src/app/(main)/chat/(workspace)/page.tsx
index df67a3148d98..cfd081ec3b78 100644
--- a/src/app/(main)/chat/(workspace)/page.tsx
+++ b/src/app/(main)/chat/(workspace)/page.tsx
@@ -1,13 +1,33 @@
+import StructuredData from '@/components/StructuredData';
+import { ldModule } from '@/server/ld';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
import PageTitle from '../features/PageTitle';
import TelemetryNotification from './features/TelemetryNotification';
-const Page = () => {
+export const generateMetadata = async () => {
+ const { t } = await translation('metadata');
+ return metadataModule.generate({
+ description: t('chat.description'),
+ title: t('chat.title'),
+ url: '/chat',
+ });
+};
+
+const Page = async () => {
const mobile = isMobileDevice();
+ const { t } = await translation('metadata');
+ const ld = ldModule.generate({
+ description: t('chat.description'),
+ title: t('chat.title'),
+ url: '/chat',
+ });
return (
<>
+
>
diff --git a/src/app/(main)/market/page.tsx b/src/app/(main)/market/page.tsx
index fd731f6df0eb..5a1a0ac8aca5 100644
--- a/src/app/(main)/market/page.tsx
+++ b/src/app/(main)/market/page.tsx
@@ -1,6 +1,8 @@
import { Flexbox } from 'react-layout-kit';
-import { getCanonicalUrl } from '@/const/url';
+import StructuredData from '@/components/StructuredData';
+import { ldModule } from '@/server/ld';
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
@@ -9,18 +11,25 @@ import AgentSearchBar from './features/AgentSearchBar';
import TagList from './features/TagList';
export const generateMetadata = async () => {
- const { t } = await translation('common');
- return {
- alternates: { canonical: getCanonicalUrl('/market') },
- title: t('tab.market'),
- };
+ const { t } = await translation('metadata');
+ return metadataModule.generate({
+ description: t('market.description'),
+ title: t('market.title'),
+ url: '/market',
+ });
};
-const Page = () => {
+const Page = async () => {
const mobile = isMobileDevice();
-
+ const { t } = await translation('metadata');
+ const ld = ldModule.generate({
+ description: t('market.description'),
+ title: t('market.title'),
+ url: '/market',
+ });
return (
<>
+
diff --git a/src/app/(main)/profile/[[...slugs]]/page.tsx b/src/app/(main)/profile/[[...slugs]]/page.tsx
index 297e6f3b6109..4854d157a91c 100644
--- a/src/app/(main)/profile/[[...slugs]]/page.tsx
+++ b/src/app/(main)/profile/[[...slugs]]/page.tsx
@@ -1,13 +1,16 @@
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
import Client from './Client';
export const generateMetadata = async () => {
- const { t } = await translation('common');
- return {
- title: t('userButton.profile'),
- };
+ const { t } = await translation('clerk');
+ return metadataModule.generate({
+ description: t('userProfile.navbar.title'),
+ title: t('userProfile.navbar.description'),
+ url: '/profile',
+ });
};
const Page = () => {
diff --git a/src/app/(main)/settings/about/page.tsx b/src/app/(main)/settings/about/page.tsx
index 838aa41315b3..0798bfac5480 100644
--- a/src/app/(main)/settings/about/page.tsx
+++ b/src/app/(main)/settings/about/page.tsx
@@ -1,3 +1,4 @@
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
@@ -5,9 +6,11 @@ import Page from './index';
export const generateMetadata = async () => {
const { t } = await translation('setting');
- return {
+ return metadataModule.generate({
+ description: t('header.desc'),
title: t('tab.about'),
- };
+ url: '/settings/about',
+ });
};
export default () => {
diff --git a/src/app/(main)/settings/agent/page.tsx b/src/app/(main)/settings/agent/page.tsx
index c47984c050b0..ed35b90c3779 100644
--- a/src/app/(main)/settings/agent/page.tsx
+++ b/src/app/(main)/settings/agent/page.tsx
@@ -1,10 +1,12 @@
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
export const generateMetadata = async () => {
const { t } = await translation('setting');
- return {
+ return metadataModule.generate({
+ description: t('header.desc'),
title: t('tab.agent'),
- };
+ url: '/settings/agent',
+ });
};
-
export { default } from './index';
diff --git a/src/app/(main)/settings/common/page.tsx b/src/app/(main)/settings/common/page.tsx
index aee71a1c4fa4..a5c56c76e8b0 100644
--- a/src/app/(main)/settings/common/page.tsx
+++ b/src/app/(main)/settings/common/page.tsx
@@ -1,10 +1,12 @@
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
export const generateMetadata = async () => {
const { t } = await translation('setting');
- return {
+ return metadataModule.generate({
+ description: t('header.desc'),
title: t('tab.common'),
- };
+ url: '/settings/common',
+ });
};
-
export { default } from './index';
diff --git a/src/app/(main)/settings/llm/page.tsx b/src/app/(main)/settings/llm/page.tsx
index a69114b02f9f..ed4e80daa913 100644
--- a/src/app/(main)/settings/llm/page.tsx
+++ b/src/app/(main)/settings/llm/page.tsx
@@ -1,15 +1,18 @@
import { notFound } from 'next/navigation';
import { serverFeatureFlags } from '@/config/server/featureFlags';
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
import Page from './index';
export const generateMetadata = async () => {
const { t } = await translation('setting');
- return {
+ return metadataModule.generate({
+ description: t('header.desc'),
title: t('tab.llm'),
- };
+ url: '/settings/llm',
+ });
};
export default () => {
diff --git a/src/app/(main)/settings/sync/page.tsx b/src/app/(main)/settings/sync/page.tsx
index 974384398d7a..88bdceeda760 100644
--- a/src/app/(main)/settings/sync/page.tsx
+++ b/src/app/(main)/settings/sync/page.tsx
@@ -1,6 +1,7 @@
import { notFound } from 'next/navigation';
import { serverFeatureFlags } from '@/config/server/featureFlags';
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
import { gerServerDeviceInfo, isMobileDevice } from '@/utils/responsive';
@@ -8,11 +9,12 @@ import Page from './index';
export const generateMetadata = async () => {
const { t } = await translation('setting');
- return {
+ return metadataModule.generate({
+ description: t('header.desc'),
title: t('tab.sync'),
- };
+ url: '/settings/sync',
+ });
};
-
export default () => {
const enableWebrtc = serverFeatureFlags().enableWebrtc;
if (!enableWebrtc) return notFound();
diff --git a/src/app/(main)/settings/tts/page.tsx b/src/app/(main)/settings/tts/page.tsx
index 2408ef0e0dcd..cde02645c36e 100644
--- a/src/app/(main)/settings/tts/page.tsx
+++ b/src/app/(main)/settings/tts/page.tsx
@@ -1,10 +1,12 @@
+import { metadataModule } from '@/server/metadata';
import { translation } from '@/server/translation';
export const generateMetadata = async () => {
const { t } = await translation('setting');
- return {
+ return metadataModule.generate({
+ description: t('header.desc'),
title: t('tab.tts'),
- };
+ url: '/settings/tts',
+ });
};
-
export { default } from './index';
diff --git a/src/app/(main)/welcome/page.tsx b/src/app/(main)/welcome/page.tsx
index 7b6868668b34..ff00751d464e 100644
--- a/src/app/(main)/welcome/page.tsx
+++ b/src/app/(main)/welcome/page.tsx
@@ -1,21 +1,34 @@
-import { Metadata } from 'next';
-
-import { getCanonicalUrl } from '@/const/url';
+import StructuredData from '@/components/StructuredData';
+import { ldModule } from '@/server/ld';
+import { metadataModule } from '@/server/metadata';
+import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive';
import Actions from './features/Actions';
import Hero from './features/Hero';
import Logo from './features/Logo';
-export const metadata: Metadata = {
- alternates: { canonical: getCanonicalUrl('/welcome') },
+export const generateMetadata = async () => {
+ const { t } = await translation('metadata');
+ return metadataModule.generate({
+ description: t('welcome.description'),
+ title: t('welcome.title'),
+ url: '/welcome',
+ });
};
-const Page = () => {
+const Page = async () => {
const mobile = isMobileDevice();
+ const { t } = await translation('metadata');
+ const ld = ldModule.generate({
+ description: t('welcome.description'),
+ title: t('welcome.title'),
+ url: '/welcome',
+ });
return (
<>
+
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index cbec8f14f561..35fcea3bf7bb 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -39,7 +39,7 @@ const RootLayout = async ({ children, modal }: RootLayoutProps) => {
export default RootLayout;
-export { default as metadata } from './metadata';
+export { generateMetadata } from './metadata';
export const generateViewport = async (): ResolvingViewport => {
const isMobile = isMobileDevice();
diff --git a/src/app/metadata.ts b/src/app/metadata.ts
index 5cd02b87fb75..d0f370cfff7b 100644
--- a/src/app/metadata.ts
+++ b/src/app/metadata.ts
@@ -3,11 +3,9 @@ import { Metadata } from 'next';
import { getClientConfig } from '@/config/client';
import { getServerConfig } from '@/config/server';
import { OFFICIAL_URL } from '@/const/url';
-
-import pkg from '../../package.json';
+import { translation } from '@/server/translation';
const title = 'LobeChat';
-const { description, homepage } = pkg;
const { SITE_URL = OFFICIAL_URL } = getServerConfig();
const { BASE_PATH } = getClientConfig();
@@ -15,55 +13,47 @@ const { BASE_PATH } = getClientConfig();
// if there is a base path, then we don't need the manifest
const noManifest = !!BASE_PATH;
-const metadata: Metadata = {
- appleWebApp: {
- statusBarStyle: 'black-translucent',
- title,
- },
- description,
- icons: {
- apple: '/icons/apple-touch-icon.png',
- icon: '/favicon.ico',
- shortcut: '/favicon-32x32.ico',
- },
- manifest: noManifest ? undefined : '/manifest.json',
- metadataBase: new URL(SITE_URL),
- openGraph: {
- description: description,
- images: [
- {
- alt: title,
- height: 360,
- url: 'https://registry.npmmirror.com/@lobehub/assets-favicons/latest/files/assets/og-480x270.png',
- width: 480,
- },
- {
- alt: title,
- height: 720,
- url: 'https://registry.npmmirror.com/@lobehub/assets-favicons/latest/files/assets/og-960x540.png',
- width: 960,
- },
- ],
- locale: 'en-US',
- siteName: title,
- title: title,
- type: 'website',
- url: homepage,
- },
-
- title: {
- default: title,
- template: '%s · LobeChat',
- },
- twitter: {
- card: 'summary_large_image',
- description,
- images: [
- 'https://registry.npmmirror.com/@lobehub/assets-favicons/latest/files/assets/og-960x540.png',
- ],
- site: '@lobehub',
- title,
- },
+export const generateMetadata = async (): Promise => {
+ const { t } = await translation('metadata');
+ return {
+ appleWebApp: {
+ statusBarStyle: 'black-translucent',
+ title,
+ },
+ description: t('chat.description'),
+ icons: {
+ apple: '/icons/apple-touch-icon.png',
+ icon: '/favicon.ico',
+ shortcut: '/favicon-32x32.ico',
+ },
+ manifest: noManifest ? undefined : '/manifest.json',
+ metadataBase: new URL(SITE_URL),
+ openGraph: {
+ description: t('chat.description'),
+ images: [
+ {
+ alt: t('chat.title'),
+ height: 640,
+ url: '/og/cover.png',
+ width: 1200,
+ },
+ ],
+ locale: 'en-US',
+ siteName: title,
+ title: title,
+ type: 'website',
+ url: OFFICIAL_URL,
+ },
+ title: {
+ default: t('chat.title'),
+ template: '%s · LobeChat',
+ },
+ twitter: {
+ card: 'summary_large_image',
+ description: t('chat.description'),
+ images: ['/og/cover.png'],
+ site: '@lobehub',
+ title: t('chat.title'),
+ },
+ };
};
-
-export default metadata;
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 0968fc7e8ed9..6f0ec82c6c58 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -5,6 +5,10 @@ import { getCanonicalUrl } from '@/const/url';
import Client from './(loading)/Client';
import Redirect from './(loading)/Redirect';
+export const metadata: Metadata = {
+ alternates: { canonical: getCanonicalUrl('/') },
+};
+
const Page = () => {
return (
<>
@@ -17,7 +21,3 @@ const Page = () => {
Page.displayName = 'Loading';
export default Page;
-
-export const metadata: Metadata = {
- alternates: { canonical: getCanonicalUrl('/') },
-};
diff --git a/src/components/StructuredData/index.tsx b/src/components/StructuredData/index.tsx
new file mode 100644
index 000000000000..f8a5dc5545ba
--- /dev/null
+++ b/src/components/StructuredData/index.tsx
@@ -0,0 +1,12 @@
+import { FC } from 'react';
+
+const StructuredData: FC<{ ld: any }> = ({ ld }) => {
+ return (
+
+ );
+};
+export default StructuredData;
diff --git a/src/features/User/UserPanel/useMenu.tsx b/src/features/User/UserPanel/useMenu.tsx
index 5cc040c36809..0d737c1b510c 100644
--- a/src/features/User/UserPanel/useMenu.tsx
+++ b/src/features/User/UserPanel/useMenu.tsx
@@ -3,6 +3,7 @@ import { Badge } from 'antd';
import {
Book,
CircleUserRound,
+ Download,
Feather,
HardDriveDownload,
HardDriveUpload,
@@ -22,6 +23,7 @@ import type { MenuProps } from '@/components/Menu';
import { DISCORD, DOCUMENTS, EMAIL_SUPPORT, GITHUB_ISSUES } from '@/const/url';
import DataImporter from '@/features/DataImporter';
import { useOpenSettings } from '@/hooks/useInterceptingRoutes';
+import { usePWAInstall } from '@/hooks/usePWAInstall';
import { useQueryRoute } from '@/hooks/useQueryRoute';
import { configService } from '@/services/config';
import { SettingsTabs } from '@/store/global/initialState';
@@ -54,6 +56,7 @@ const NewVersionBadge = memo(
export const useMenu = () => {
const router = useQueryRoute();
+ const { canInstall, install } = usePWAInstall();
const hasNewVersion = useNewVersion();
const openSettings = useOpenSettings();
const { t } = useTranslation(['common', 'setting', 'auth']);
@@ -96,6 +99,18 @@ export const useMenu = () => {
},
];
+ const pwa: MenuProps['items'] = [
+ {
+ icon: ,
+ key: 'pwa',
+ label: t('installPWA'),
+ onClick: () => install(),
+ },
+ {
+ type: 'divider',
+ },
+ ];
+
const data: MenuProps['items'] = [
{
icon: ,
@@ -192,6 +207,7 @@ export const useMenu = () => {
},
...(isLoginWithClerk ? profile : []),
...(isLogin ? settings : []),
+ ...(canInstall ? pwa : []),
...(isLogin ? data : []),
...helps,
].filter(Boolean) as MenuProps['items'];
diff --git a/src/hooks/usePWAInstall.ts b/src/hooks/usePWAInstall.ts
new file mode 100644
index 000000000000..284f9655d9e2
--- /dev/null
+++ b/src/hooks/usePWAInstall.ts
@@ -0,0 +1,18 @@
+import { pwaInstallHandler } from 'pwa-install-handler';
+import { useEffect, useState } from 'react';
+
+export const usePWAInstall = () => {
+ const [canInstall, setCanInstall] = useState(false);
+
+ useEffect(() => {
+ pwaInstallHandler.addListener(setCanInstall);
+ return () => {
+ pwaInstallHandler.removeListener(setCanInstall);
+ };
+ }, []);
+
+ return {
+ canInstall,
+ install: pwaInstallHandler.install,
+ };
+};
diff --git a/src/locales/default/common.ts b/src/locales/default/common.ts
index 8da79ab8efb9..33da7ed8ff61 100644
--- a/src/locales/default/common.ts
+++ b/src/locales/default/common.ts
@@ -59,6 +59,7 @@ export default {
},
title: '导入数据',
},
+ installPWA: '安装浏览器应用 (PWA)',
lang: {
'ar': '阿拉伯语',
'bg-BG': '保加利亚语',
@@ -138,13 +139,13 @@ export default {
title: '同步状态',
unconnected: { tip: '信令服务器连接失败,将无法建立点对点通信频道,请检查网络后重试' },
},
+
tab: {
chat: '会话',
market: '发现',
me: '我',
setting: '设置',
},
-
telemetry: {
allow: '允许',
deny: '拒绝',
diff --git a/src/locales/default/index.ts b/src/locales/default/index.ts
index dfccd3ddb82f..b2ddc98c857f 100644
--- a/src/locales/default/index.ts
+++ b/src/locales/default/index.ts
@@ -6,6 +6,7 @@ import common from './common';
import components from './components';
import error from './error';
import market from './market';
+import metadata from './metadata';
import migration from './migration';
import modelProvider from './modelProvider';
import plugin from './plugin';
@@ -20,6 +21,7 @@ const resources = {
components,
error,
market,
+ metadata,
migration,
modelProvider,
plugin,
diff --git a/src/locales/default/metadata.ts b/src/locales/default/metadata.ts
new file mode 100644
index 000000000000..2d85c5b2227a
--- /dev/null
+++ b/src/locales/default/metadata.ts
@@ -0,0 +1,20 @@
+export default {
+ chat: {
+ description: 'LobeChat 带给你最好的 ChatGPT, OLLaMA, Gemini, Claude WebUI 使用体验',
+ title: 'LobeChat:个人 LLM 效能工具,给自己一个更聪明的大脑',
+ },
+ market: {
+ description:
+ '内容创作、文案、问答、图像生成、视频生成、语音生成、智能 Agent、自动化工作流,定制你专属的 AI / GPTs / OLLaMA 智能助手',
+ title: '助手市场',
+ },
+ plugins: {
+ description:
+ '搜素、图表生成、学术、图像生成、视频生成、语音生成、自动化工作流,定制 ChatGPT / OLLaMA 专属的 ToolCall 插件能力',
+ title: '插件市场',
+ },
+ welcome: {
+ description: 'LobeChat 带给你最好的 ChatGPT, OLLaMA, Gemini, Claude WebUI 使用体验',
+ title: '欢迎使用 LobeChat:个人 LLM 效能工具,给自己一个更聪明的大脑',
+ },
+};
diff --git a/src/server/ld.ts b/src/server/ld.ts
new file mode 100644
index 000000000000..14f0829a5a8d
--- /dev/null
+++ b/src/server/ld.ts
@@ -0,0 +1,218 @@
+import urlJoin from 'url-join';
+
+import { getServerConfig } from '@/config/server';
+import { EMAIL_BUSINESS, EMAIL_SUPPORT, OFFICIAL_SITE, OFFICIAL_URL, X } from '@/const/url';
+
+import pkg from '../../package.json';
+
+const { SITE_URL = OFFICIAL_URL } = getServerConfig();
+const LAST_MODIFIED = new Date().toISOString();
+export const AUTHOR_LIST = {
+ arvinxx: {
+ avatar: 'https://avatars.githubusercontent.com/u/28616219?v=4',
+ desc: 'Founder, Design Engineer',
+ name: 'Arvin Xu',
+ url: 'https://github.com/arvinxx',
+ },
+ canisminor: {
+ avatar: 'https://avatars.githubusercontent.com/u/17870709?v=4',
+ desc: 'Founder, Design Engineer',
+ name: 'CanisMinor',
+ url: 'https://github.com/arvinxx',
+ },
+ lobehub: {
+ avatar: 'https://avatars.githubusercontent.com/u/131470832?v=4',
+ desc: 'Official Account',
+ name: 'LobeHub',
+ url: 'https://github.com/lobehub',
+ },
+};
+
+class Ld {
+ generate({
+ image = '/og/cover.png',
+ url,
+ title,
+ description,
+ date,
+ webpage = {
+ enable: true,
+ },
+ }: {
+ date?: string;
+ description: string;
+ image?: string;
+ title: string;
+ url: string;
+ webpage?: {
+ enable?: boolean;
+ search?: boolean;
+ };
+ }) {
+ return {
+ '@context': 'https://schema.org',
+ '@graph': [
+ this.genWebSite(),
+ webpage?.enable &&
+ this.genWebPage({
+ ...webpage,
+ date,
+ description,
+ image,
+ title,
+ url,
+ }),
+ image && this.genImageObject({ image, url }),
+ this.genOrganization(),
+ ].filter(Boolean),
+ };
+ }
+
+ genOrganization() {
+ return {
+ '@id': this.getId(SITE_URL, '#organization'),
+ '@type': 'Organization',
+ 'alternateName': 'LobeChat',
+ 'contactPoint': {
+ '@type': 'ContactPoint',
+ 'contactType': 'customer support',
+ 'email': EMAIL_SUPPORT,
+ },
+ 'description':
+ 'We are a group of e/acc design-engineers, hoping to provide modern design components and tools for AIGC, and creating a technology-driven forum, fostering knowledge interaction and the exchange of ideas that may culminate in mutual inspiration and collaborative innovation.',
+ 'email': EMAIL_BUSINESS,
+ 'founders': [this.getAuthors(['arvinxx']), this.getAuthors(['canisminor'])],
+ 'image': urlJoin(OFFICIAL_SITE, '/icon-512x512.png'),
+ 'logo': {
+ '@type': 'ImageObject',
+ 'height': 512,
+ 'url': urlJoin(OFFICIAL_SITE, '/icon-512x512.png'),
+ 'width': 512,
+ },
+ 'name': 'LobeHub',
+ 'sameAs': [
+ X,
+ 'https://github.com/lobehub',
+ 'https://medium.com/@lobehub',
+ 'https://www.youtube.com/@lobehub',
+ ],
+ 'url': OFFICIAL_SITE,
+ };
+ }
+
+ getAuthors(ids: string[] = []) {
+ const defaultAuthor = {
+ '@id': this.getId(SITE_URL, '#organization'),
+ '@type': 'Organization',
+ };
+ if (!ids || ids.length === 0) return defaultAuthor;
+ if (ids.length === 1 && ids[0] === 'lobehub') return defaultAuthor;
+ const personId = ids.find((id) => id !== 'lobehub');
+ if (!personId) return defaultAuthor;
+ const person = (AUTHOR_LIST as any)?.[personId];
+ if (!person) return defaultAuthor;
+ return {
+ '@type': 'Person',
+ 'name': person.name,
+ 'url': person.url,
+ };
+ }
+
+ genWebPage({
+ date,
+ image,
+ search,
+ description,
+ title,
+ url,
+ }: {
+ breadcrumbs?: { title: string; url: string }[];
+ date?: string;
+ description: string;
+ image?: string;
+ search?: boolean;
+ title: string;
+ url: string;
+ }) {
+ const fixedUrl = this.fixUrl(url);
+ const dateCreated = date ? new Date(date).toISOString() : LAST_MODIFIED;
+ const dateModified = date ? new Date(date).toISOString() : LAST_MODIFIED;
+
+ const baseInfo: any = {
+ '@id': fixedUrl,
+ '@type': 'WebPage',
+ 'about': {
+ '@id': this.getId(SITE_URL, '#organization'),
+ },
+ 'breadcrumbs': {
+ '@id': this.getId(fixedUrl, '#breadcrumb'),
+ },
+ 'dateModified': dateModified,
+ 'datePublished': dateCreated,
+ 'description': description,
+ 'image': {
+ '@id': this.getId(fixedUrl, '#primaryimage'),
+ },
+ 'inLanguage': 'en-US',
+ 'isPartOf': {
+ '@id': this.getId(SITE_URL, '#website'),
+ },
+ 'name': this.fixTitle(title),
+ 'primaryImageOfPage': {
+ '@id': this.getId(fixedUrl, '#primaryimage'),
+ },
+ 'thumbnailUrl': image,
+ };
+
+ if (search)
+ baseInfo.potentialAction = {
+ '@type': 'SearchAction',
+ 'query-input': 'required name=search_term_string',
+ 'target': `${fixedUrl}?q={search_term_string}`,
+ };
+
+ return baseInfo;
+ }
+
+ genImageObject({ image, url }: { image: string; url: string }) {
+ const fixedUrl = this.fixUrl(url);
+
+ return {
+ '@id': this.getId(fixedUrl, '#primaryimage'),
+ '@type': 'ImageObject',
+ 'contentUrl': image,
+ 'inLanguage': 'en-US',
+ 'url': image,
+ };
+ }
+
+ genWebSite() {
+ const baseInfo: any = {
+ '@id': this.getId(SITE_URL, '#website'),
+ '@type': 'WebSite',
+ 'description': pkg.description,
+ 'inLanguage': 'en-US',
+ 'name': 'LobeChat',
+ 'publisher': {
+ '@id': this.getId(SITE_URL, '#organization'),
+ },
+ 'url': SITE_URL,
+ };
+
+ return baseInfo;
+ }
+
+ private getId(url: string, id: string) {
+ return [url, id].join('/');
+ }
+
+ private fixTitle(title: string) {
+ return title.includes('LobeChat') ? title : `${title} · LobeChat`;
+ }
+
+ private fixUrl(url: string) {
+ return urlJoin(SITE_URL, url);
+ }
+}
+
+export const ldModule = new Ld();
diff --git a/src/server/metadata.ts b/src/server/metadata.ts
new file mode 100644
index 000000000000..e203ab2fec3a
--- /dev/null
+++ b/src/server/metadata.ts
@@ -0,0 +1,96 @@
+import { Metadata } from 'next';
+
+import { getCanonicalUrl } from '@/const/url';
+import { formatDescLength, formatTitleLength } from '@/utils/genOG';
+
+export class Meta {
+ public generate({
+ description = 'LobeChat offers you the best ChatGPT, OLLaMA, Gemini, Claude WebUI user experience',
+ title,
+ image = '/og/cover.png',
+ url,
+ type = 'website',
+ tags,
+ }: {
+ description?: string;
+ image?: string;
+ tags?: string[];
+ title: string;
+ type?: 'website' | 'article';
+ url: string;
+ }): Metadata {
+ // eslint-disable-next-line no-param-reassign
+ const formatedTitle = formatTitleLength(title, 21);
+ // eslint-disable-next-line no-param-reassign
+ const formatedDescription = formatDescLength(description, tags);
+ const siteTitle = title.includes('LobeChat') ? title : title + ' · LobeChat';
+ return {
+ alternates: { canonical: getCanonicalUrl(url) },
+ description: formatedDescription,
+ openGraph: this.genOpenGraph({
+ description,
+ image,
+ title: siteTitle,
+ type,
+ url,
+ }),
+ other: {
+ robots: 'index,follow',
+ },
+ title: formatedTitle,
+ twitter: this.genTwitter({ description, image, title: siteTitle, url }),
+ };
+ }
+
+ private genTwitter({
+ description,
+ title,
+ image,
+ url,
+ }: {
+ description: string;
+ image: string;
+ title: string;
+ url: string;
+ }) {
+ return {
+ card: 'summary_large_image',
+ description,
+ images: [image],
+ site: '@lobehub',
+ title,
+ url,
+ };
+ }
+
+ private genOpenGraph({
+ description,
+ title,
+ image,
+ url,
+ type = 'website',
+ }: {
+ description: string;
+ image: string;
+ title: string;
+ type?: 'website' | 'article';
+ url: string;
+ }) {
+ return {
+ description,
+ images: [
+ {
+ alt: title,
+ url: image,
+ },
+ ],
+ locale: 'en-US',
+ siteName: 'LobeChat',
+ title,
+ type,
+ url,
+ };
+ }
+}
+
+export const metadataModule = new Meta();
diff --git a/src/server/translation.ts b/src/server/translation.ts
index 387eba9b323c..96c6dfbab97e 100644
--- a/src/server/translation.ts
+++ b/src/server/translation.ts
@@ -16,5 +16,15 @@ export const translation = async (ns: NS) => {
const file = readFileSync(filepath, 'utf8');
const i18ns = JSON.parse(file);
- return { t: (key: string) => get(i18ns, key) };
+ return {
+ t: (key: string, options: { [key: string]: string } = {}) => {
+ let content = get(i18ns, key);
+ if (options) {
+ Object.entries(options).forEach(([key, value]) => {
+ content = content.replace(`{{${key}}}`, value);
+ });
+ }
+ return content;
+ },
+ };
};
diff --git a/src/utils/genOG.ts b/src/utils/genOG.ts
new file mode 100644
index 000000000000..27b1c9b1160e
--- /dev/null
+++ b/src/utils/genOG.ts
@@ -0,0 +1,20 @@
+export const formatTitleLength = (title: string, addOnLength: number = 0) => {
+ if (title.length > 60 - addOnLength) {
+ return title.slice(0, 57 - addOnLength) + '...';
+ } else {
+ return title;
+ }
+};
+
+export const formatDescLength = (desc: string, tags?: string[]): any => {
+ if (!desc) return;
+ if (desc.length > 160) {
+ return desc.slice(0, 157) + '...';
+ } else {
+ if (!tags) return desc;
+ const tagStr: string = tags ? tags.join(', ') : '';
+ const tagLength = 160 - desc.length - 3;
+ const newDesc = desc + tagStr.slice(0, tagLength) + (tagStr.length > tagLength ? '...' : '');
+ return newDesc.length <= 157 ? newDesc : newDesc + '...';
+ }
+};