diff --git a/frontend/src/components/EditingChatBubble/index.jsx b/frontend/src/components/EditingChatBubble/index.jsx index 0aa2a078488..38eeb4e8341 100644 --- a/frontend/src/components/EditingChatBubble/index.jsx +++ b/frontend/src/components/EditingChatBubble/index.jsx @@ -1,5 +1,6 @@ import React, { useState } from "react"; import { X } from "@phosphor-icons/react"; +import { useTranslation } from "react-i18next"; export default function EditingChatBubble({ message, @@ -11,11 +12,12 @@ export default function EditingChatBubble({ const [isEditing, setIsEditing] = useState(false); const [tempMessage, setTempMessage] = useState(message[type]); const isUser = type === "user"; + const { t } = useTranslation(); return (

- {isUser ? "User" : "AnythingLLM Chat Assistant"} + {isUser ? t("common.user") : t("appearance.message.assistant")}

- There is no set up required when using AnythingLLM's native embedding - engine. + {t("embedding.provider.description")}

); diff --git a/frontend/src/components/TranscriptionSelection/NativeTranscriptionOptions/index.jsx b/frontend/src/components/TranscriptionSelection/NativeTranscriptionOptions/index.jsx index 07ee12126ae..4a8948664e6 100644 --- a/frontend/src/components/TranscriptionSelection/NativeTranscriptionOptions/index.jsx +++ b/frontend/src/components/TranscriptionSelection/NativeTranscriptionOptions/index.jsx @@ -1,19 +1,21 @@ import { Gauge } from "@phosphor-icons/react"; +import { useTranslation } from "react-i18next"; + export default function NativeTranscriptionOptions() { + const { t } = useTranslation(); return (

- Using the local whisper model on machines with limited RAM or CPU - can stall AnythingLLM when processing media files. + {t("transcription.warn-start")}
- We recommend at least 2GB of RAM and upload files <10Mb. + {t("transcription.warn-recommend")}

- The built-in model will automatically download on the first use. + {t("transcription.warn-end")}

@@ -21,7 +23,7 @@ export default function NativeTranscriptionOptions() {
- Remove + {t("appearance.logo.remove")}
diff --git a/frontend/src/pages/GeneralSettings/Appearance/CustomMessages/index.jsx b/frontend/src/pages/GeneralSettings/Appearance/CustomMessages/index.jsx index 40043f15ab6..145d73d8e66 100644 --- a/frontend/src/pages/GeneralSettings/Appearance/CustomMessages/index.jsx +++ b/frontend/src/pages/GeneralSettings/Appearance/CustomMessages/index.jsx @@ -3,10 +3,12 @@ import System from "@/models/system"; import showToast from "@/utils/toast"; import { Plus } from "@phosphor-icons/react"; import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; export default function CustomMessages() { const [hasChanges, setHasChanges] = useState(false); const [messages, setMessages] = useState([]); + const { t } = useTranslation(); useEffect(() => { async function fetchMessages() { @@ -20,12 +22,12 @@ export default function CustomMessages() { if (type === "user") { setMessages([ ...messages, - { user: "Double click to edit...", response: "" }, + { user: t("appearance.message.double-click"), response: "" }, ]); } else { setMessages([ ...messages, - { user: "", response: "Double click to edit..." }, + { user: "", response: t("appearance.message.double-click") }, ]); } }; @@ -56,10 +58,10 @@ export default function CustomMessages() {

- Custom Messages + {t("appearance.message.title")}

- Customize the automatic messages displayed to your users. + {t("appearance.message.description")}

@@ -93,8 +95,8 @@ export default function CustomMessages() {
- New system{" "} - message + {t("appearance.message.new")} {t("appearance.message.system")}{" "} + {t("appearance.message.message")}
@@ -105,7 +107,7 @@ export default function CustomMessages() {
- New user message + {t("appearance.message.new")} {t("appearance.message.user")} {t("appearance.message.message")}
@@ -117,7 +119,7 @@ export default function CustomMessages() { className="transition-all duration-300 border border-slate-200 px-4 py-2 rounded-lg text-white text-sm items-center flex gap-x-2 hover:bg-slate-200 hover:text-slate-800 focus:ring-gray-800" onClick={handleMessageSave} > - Save Messages + {t("appearance.message.save")}
)} diff --git a/frontend/src/pages/GeneralSettings/Appearance/FooterCustomization/index.jsx b/frontend/src/pages/GeneralSettings/Appearance/FooterCustomization/index.jsx index bd78861a78a..e7f6c75ec3d 100644 --- a/frontend/src/pages/GeneralSettings/Appearance/FooterCustomization/index.jsx +++ b/frontend/src/pages/GeneralSettings/Appearance/FooterCustomization/index.jsx @@ -4,10 +4,11 @@ import { safeJsonParse } from "@/utils/request"; import NewIconForm from "./NewIconForm"; import Admin from "@/models/admin"; import System from "@/models/system"; +import { useTranslation } from "react-i18next"; export default function FooterCustomization() { const [footerIcons, setFooterIcons] = useState(Array(3).fill(null)); - + const { t } = useTranslation(); useEffect(() => { async function fetchFooterIcons() { const settings = (await Admin.systemPreferences())?.settings; @@ -52,15 +53,15 @@ export default function FooterCustomization() {

- Custom Footer Icons + {t("appearance.icons.title")}

- Customize the footer icons displayed on the bottom of the sidebar. + {t("appearance.icons.description")}

-
Icon
-
Link
+
{t("appearance.icons.icon")}
+
{t("appearance.icons.link")}
{footerIcons.map((icon, index) => ( diff --git a/frontend/src/pages/GeneralSettings/Appearance/index.jsx b/frontend/src/pages/GeneralSettings/Appearance/index.jsx index bb2c79896c4..4cd4ad25b97 100644 --- a/frontend/src/pages/GeneralSettings/Appearance/index.jsx +++ b/frontend/src/pages/GeneralSettings/Appearance/index.jsx @@ -4,8 +4,10 @@ import FooterCustomization from "./FooterCustomization"; import SupportEmail from "./SupportEmail"; import CustomLogo from "./CustomLogo"; import CustomMessages from "./CustomMessages"; +import { useTranslation } from "react-i18next"; export default function Appearance() { + const { t } = useTranslation(); return (
@@ -17,11 +19,11 @@ export default function Appearance() {

- Appearance + {t("appearance.title")}

- Customize the appearance settings of your platform. + {t("appearance.description")}

diff --git a/frontend/src/pages/GeneralSettings/Chats/index.jsx b/frontend/src/pages/GeneralSettings/Chats/index.jsx index d5b3d50932d..ad4625b66c4 100644 --- a/frontend/src/pages/GeneralSettings/Chats/index.jsx +++ b/frontend/src/pages/GeneralSettings/Chats/index.jsx @@ -9,6 +9,7 @@ import showToast from "@/utils/toast"; import System from "@/models/system"; import { CaretDown, Download } from "@phosphor-icons/react"; import { saveAs } from "file-saver"; +import { useTranslation } from "react-i18next"; const exportOptions = { csv: { @@ -65,6 +66,7 @@ export default function WorkspaceChats() { const toggleMenu = () => { setShowMenu(!showMenu); }; + const { t } = useTranslation(); useEffect(() => { function handleClickOutside(event) { @@ -94,7 +96,7 @@ export default function WorkspaceChats() {

- Workspace Chats + {t("recorded.title")}

{Object.entries(exportOptions).map(([key, data]) => ( @@ -130,8 +131,7 @@ export default function WorkspaceChats() {

- These are all the recorded chats and messages that have been sent - by users ordered by their creation date. + {t("recorded.description")}

@@ -147,6 +147,7 @@ function ChatsContainer() { const [chats, setChats] = useState([]); const [offset, setOffset] = useState(Number(query.get("offset") || 0)); const [canNext, setCanNext] = useState(false); + const { t } = useTranslation(); const handlePrevious = () => { setOffset(Math.max(offset - 1, 0)); @@ -189,22 +190,22 @@ function ChatsContainer() { - Id + {t("recorded.table.id")} - Sent By + {t("recorded.table.by")} - Workspace + {t("recorded.table.workspace")} - Prompt + {t("recorded.table.prompt")} - Response + {t("recorded.table.response")} - Sent At + {t("recorded.table.at")} {" "} diff --git a/frontend/src/pages/GeneralSettings/EmbedChats/index.jsx b/frontend/src/pages/GeneralSettings/EmbedChats/index.jsx index a2605154fb8..39b013c754b 100644 --- a/frontend/src/pages/GeneralSettings/EmbedChats/index.jsx +++ b/frontend/src/pages/GeneralSettings/EmbedChats/index.jsx @@ -6,9 +6,11 @@ import "react-loading-skeleton/dist/skeleton.css"; import useQuery from "@/hooks/useQuery"; import ChatRow from "./ChatRow"; import Embed from "@/models/embed"; +import { useTranslation } from "react-i18next"; export default function EmbedChats() { // TODO [FEAT]: Add export of embed chats + const { t } = useTranslation(); return (
@@ -20,12 +22,11 @@ export default function EmbedChats() {

- Embed Chats + {t("embed-chats.title")}

- These are all the recorded chats and messages from any embed that - you have published. + {t("embed-chats.description")}

@@ -41,6 +42,7 @@ function ChatsContainer() { const [chats, setChats] = useState([]); const [offset, setOffset] = useState(Number(query.get("offset") || 0)); const [canNext, setCanNext] = useState(false); + const { t } = useTranslation(); const handlePrevious = () => { setOffset(Math.max(offset - 1, 0)); @@ -83,19 +85,19 @@ function ChatsContainer() { - Embed + {t("embed-chats.table.embed")} - Sender + {t("embed-chats.table.sender")} - Message + {t("embed-chats.table.message")} - Response + {t("embed-chats.table.response")} - Sent At + {t("embed-chats.table.at")} {" "} @@ -116,14 +118,14 @@ function ChatsContainer() { disabled={offset === 0} > {" "} - Previous Page + {t("common.previous")}
diff --git a/frontend/src/pages/GeneralSettings/EmbedConfigs/index.jsx b/frontend/src/pages/GeneralSettings/EmbedConfigs/index.jsx index 4d65e0d0398..a11d0d31d83 100644 --- a/frontend/src/pages/GeneralSettings/EmbedConfigs/index.jsx +++ b/frontend/src/pages/GeneralSettings/EmbedConfigs/index.jsx @@ -10,10 +10,11 @@ import { useModal } from "@/hooks/useModal"; import ModalWrapper from "@/components/ModalWrapper"; import Embed from "@/models/embed"; import CTAButton from "@/components/lib/CTAButton"; +import { useTranslation } from "react-i18next"; export default function EmbedConfigs() { const { isOpen, openModal, closeModal } = useModal(); - + const { t } = useTranslation(); return (
@@ -25,18 +26,16 @@ export default function EmbedConfigs() {

- Embeddable Chat Widgets + {t("embeddable.title")}

- Embeddable chat widgets are public facing chat interfaces that are - tied to a single workspace. These allow you to build workspaces - that then you can publish to the world. + {t("embeddable.description")}

- Create embed + {t("embeddable.create")}
@@ -52,6 +51,7 @@ export default function EmbedConfigs() { function EmbedContainer() { const [loading, setLoading] = useState(true); const [embeds, setEmbeds] = useState([]); + const { t } = useTranslation(); useEffect(() => { async function fetchUsers() { @@ -81,13 +81,13 @@ function EmbedContainer() { - Workspace + {t("embeddable.table.workspace")} - Sent Chats + {t("embeddable.table.chats")} - Active Domains + {t("embeddable.table.Active")} {" "} diff --git a/frontend/src/pages/GeneralSettings/EmbeddingPreference/index.jsx b/frontend/src/pages/GeneralSettings/EmbeddingPreference/index.jsx index 8f234b5ac1d..15e84467214 100644 --- a/frontend/src/pages/GeneralSettings/EmbeddingPreference/index.jsx +++ b/frontend/src/pages/GeneralSettings/EmbeddingPreference/index.jsx @@ -25,6 +25,7 @@ import { CaretUpDown, MagnifyingGlass, X } from "@phosphor-icons/react"; import { useModal } from "@/hooks/useModal"; import ModalWrapper from "@/components/ModalWrapper"; import CTAButton from "@/components/lib/CTAButton"; +import { useTranslation } from "react-i18next"; const EMBEDDERS = [ { @@ -93,6 +94,7 @@ export default function GeneralEmbeddingPreference() { const [searchMenuOpen, setSearchMenuOpen] = useState(false); const searchInputRef = useRef(null); const { isOpen, openModal, closeModal } = useModal(); + const { t } = useTranslation(); function embedderModelChanged(formEl) { try { @@ -204,17 +206,13 @@ export default function GeneralEmbeddingPreference() {

- Embedding Preference + {t("embedding.title")}

- When using an LLM that does not natively support an embedding - engine - you may need to additionally specify credentials to - for embedding text. + {t("embedding.desc-start")}
- Embedding is the process of turning text into vectors. These - credentials are required to turn your files and prompts into a - format which AnythingLLM can use to process. + {t("embedding.desc-end")}

@@ -223,12 +221,12 @@ export default function GeneralEmbeddingPreference() { onClick={() => handleSubmit()} className="mt-3 mr-0 -mb-14 z-10" > - {saving ? "Saving..." : "Save changes"} + {saving ? t("common.saving") : t("common.save")} )}
- Embedding Provider + {t("embedding.provider.title")}
{searchMenuOpen && ( diff --git a/frontend/src/pages/GeneralSettings/EmbeddingTextSplitterPreference/index.jsx b/frontend/src/pages/GeneralSettings/EmbeddingTextSplitterPreference/index.jsx index 5ee1197f117..fd7d7a5b78f 100644 --- a/frontend/src/pages/GeneralSettings/EmbeddingTextSplitterPreference/index.jsx +++ b/frontend/src/pages/GeneralSettings/EmbeddingTextSplitterPreference/index.jsx @@ -6,6 +6,7 @@ import CTAButton from "@/components/lib/CTAButton"; import Admin from "@/models/admin"; import showToast from "@/utils/toast"; import { nFormatter, numberWithCommas } from "@/utils/numbers"; +import { useTranslation } from "react-i18next"; function isNullOrNaN(value) { if (value === null) return true; @@ -17,6 +18,7 @@ export default function EmbeddingTextSplitterPreference() { const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [hasChanges, setHasChanges] = useState(false); + const { t } = useTranslation(); const handleSubmit = async (e) => { e.preventDefault(); @@ -86,25 +88,22 @@ export default function EmbeddingTextSplitterPreference() {

- Text splitting & Chunking Preferences + {t("text.title")}

- Sometimes, you may want to change the default way that new - documents are split and chunked before being inserted into - your vector database.
- You should only modify this setting if you understand how text - splitting works and it's side effects. + {t("text.desc-start")}
+ {t("text.desc-end")}

- Changes here will only apply to{" "} - newly embedded documents, not existing documents. + {t("text.warn-start")}{" "} + {t("text.warn-center")}{t("text.warn-end")}

{hasChanges && ( - {saving ? "Saving..." : "Save changes"} + {saving ? t("common.saving") : t("common.save")} )}
@@ -113,11 +112,10 @@ export default function EmbeddingTextSplitterPreference() {

- This is the maximum length of characters that can be - present in a single vector. + {t("text.size.description")}

- Embed model maximum length is{" "} + {t("text.size.recommend")}{" "} {numberWithCommas(settings?.max_embed_chunk_size || 1000)}.

@@ -147,11 +145,10 @@ export default function EmbeddingTextSplitterPreference() {

- This is the maximum overlap of characters that occurs - during chunking between two adjacent text chunks. + {t("text.overlap.description")}

{ e.preventDefault(); @@ -300,14 +302,11 @@ export default function GeneralLLMPreference() {

- LLM Preference + {t("llm.title")}

- These are the credentials and settings for your preferred LLM - chat & embedding provider. Its important these keys are - current and correct or else AnythingLLM will not function - properly. + {t("llm.description")}

@@ -321,7 +320,7 @@ export default function GeneralLLMPreference() { )}
- LLM Provider + {t("llm.provider")}
{searchMenuOpen && ( diff --git a/frontend/src/pages/GeneralSettings/PrivacyAndData/index.jsx b/frontend/src/pages/GeneralSettings/PrivacyAndData/index.jsx index 4075c89a6ac..599cf1d624a 100644 --- a/frontend/src/pages/GeneralSettings/PrivacyAndData/index.jsx +++ b/frontend/src/pages/GeneralSettings/PrivacyAndData/index.jsx @@ -9,11 +9,12 @@ import { LLM_SELECTION_PRIVACY, VECTOR_DB_PRIVACY, } from "@/pages/OnboardingFlow/Steps/DataHandling"; +import { useTranslation } from "react-i18next"; export default function PrivacyAndDataHandling() { const [settings, setSettings] = useState({}); const [loading, setLoading] = useState(true); - + const { t } = useTranslation(); useEffect(() => { async function fetchSettings() { setLoading(true); @@ -35,12 +36,11 @@ export default function PrivacyAndDataHandling() {

- Privacy & Data-Handling + {t("privacy.title")}

- This is your configuration for how connected third party providers - and AnythingLLM handle your data. + {t("privacy.description")}

{loading ? ( @@ -65,12 +65,12 @@ function ThirdParty({ settings }) { const llmChoice = settings?.LLMProvider || "openai"; const embeddingEngine = settings?.EmbeddingEngine || "openai"; const vectorDb = settings?.VectorDB || "pinecone"; - + const { t } = useTranslation(); return (
-
LLM Selection
+
{t("privacy.llm")}
- Embedding Preference + {t("privacy.embedding")}
-
Vector Database
+
{t("privacy.vector")}
)} @@ -116,8 +117,8 @@ function MultiUserMode() {
- Admin account password + {t("multi.enable.password")}

- By default, you will be the only admin. As an admin you will - need to create accounts for all new users or admins. Do not lose - your password as only an Admin user can reset passwords. + {t("multi.enable.description")}

@@ -196,6 +195,7 @@ function PasswordProtection() { const [multiUserModeEnabled, setMultiUserModeEnabled] = useState(false); const [usePassword, setUsePassword] = useState(false); const [loading, setLoading] = useState(true); + const { t } = useTranslation(); const handleSubmit = async (e) => { e.preventDefault(); @@ -259,12 +259,11 @@ function PasswordProtection() {

- Password Protection + {t("multi.password.title")}

- Protect your AnythingLLM instance with a password. If you forget - this there is no recovery method so ensure you save this password. + {t("multi.password.description")}

{hasChanges && ( @@ -273,7 +272,7 @@ function PasswordProtection() { onClick={() => handleSubmit()} className="mt-3 mr-0 -mb-20 z-10" > - {saving ? "Saving..." : "Save changes"} + {saving ? t("common.saving") : t("common.save")}
)} @@ -284,7 +283,7 @@ function PasswordProtection() {

- By default, you will be the only admin. As an admin you will - need to create accounts for all new users or admins. Do not lose - your password as only an Admin user can reset passwords. + {t("multi.instance.description")}

diff --git a/frontend/src/pages/GeneralSettings/TranscriptionPreference/index.jsx b/frontend/src/pages/GeneralSettings/TranscriptionPreference/index.jsx index 5fbd196c328..59b06233947 100644 --- a/frontend/src/pages/GeneralSettings/TranscriptionPreference/index.jsx +++ b/frontend/src/pages/GeneralSettings/TranscriptionPreference/index.jsx @@ -11,6 +11,7 @@ import NativeTranscriptionOptions from "@/components/TranscriptionSelection/Nati import LLMItem from "@/components/LLMSelection/LLMItem"; import { CaretUpDown, MagnifyingGlass, X } from "@phosphor-icons/react"; import CTAButton from "@/components/lib/CTAButton"; +import { useTranslation } from "react-i18next"; export default function TranscriptionModelPreference() { const [saving, setSaving] = useState(false); @@ -22,6 +23,7 @@ export default function TranscriptionModelPreference() { const [selectedProvider, setSelectedProvider] = useState(null); const [searchMenuOpen, setSearchMenuOpen] = useState(false); const searchInputRef = useRef(null); + const { t } = useTranslation(); const handleSubmit = async (e) => { e.preventDefault(); @@ -119,14 +121,11 @@ export default function TranscriptionModelPreference() {

- Transcription Model Preference + {t("transcription.title")}

- These are the credentials and settings for your preferred - transcription model provider. Its important these keys are - current and correct or else media files and audio will not - transcribe. + {t("transcription.description")}

@@ -140,7 +139,7 @@ export default function TranscriptionModelPreference() { )}
- Transcription Provider + {t("transcription.provider")}
{searchMenuOpen && ( diff --git a/frontend/src/pages/GeneralSettings/VectorDatabase/index.jsx b/frontend/src/pages/GeneralSettings/VectorDatabase/index.jsx index a782410e52d..3c26ec0463c 100644 --- a/frontend/src/pages/GeneralSettings/VectorDatabase/index.jsx +++ b/frontend/src/pages/GeneralSettings/VectorDatabase/index.jsx @@ -26,6 +26,7 @@ import { useModal } from "@/hooks/useModal"; import ModalWrapper from "@/components/ModalWrapper"; import AstraDBOptions from "@/components/VectorDBSelection/AstraDBOptions"; import CTAButton from "@/components/lib/CTAButton"; +import { useTranslation } from "react-i18next"; export default function GeneralVectorDatabase() { const [saving, setSaving] = useState(false); @@ -39,6 +40,7 @@ export default function GeneralVectorDatabase() { const [searchMenuOpen, setSearchMenuOpen] = useState(false); const searchInputRef = useRef(null); const { isOpen, openModal, closeModal } = useModal(); + const { t } = useTranslation(); const handleSubmit = async (e) => { e.preventDefault(); @@ -194,13 +196,11 @@ export default function GeneralVectorDatabase() {

- Vector Database + {t("vector.title")}

- These are the credentials and settings for how your - AnythingLLM instance will function. It's important these keys - are current and correct. + {t("vector.description")}

@@ -209,12 +209,12 @@ export default function GeneralVectorDatabase() { onClick={() => handleSubmit()} className="mt-3 mr-0 -mb-14 z-10" > - {saving ? "Saving..." : "Save changes"} + {saving ? t("common.saving") : t("common.save")} )}
- Vector Database Provider + {t("vector.provider.title")}
{searchMenuOpen && ( diff --git a/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentLLMSelection/index.jsx b/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentLLMSelection/index.jsx index 51c11581733..adf6dc6948a 100644 --- a/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentLLMSelection/index.jsx +++ b/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentLLMSelection/index.jsx @@ -4,6 +4,7 @@ import AgentLLMItem from "./AgentLLMItem"; import { AVAILABLE_LLM_PROVIDERS } from "@/pages/GeneralSettings/LLMPreference"; import { CaretUpDown, Gauge, MagnifyingGlass, X } from "@phosphor-icons/react"; import AgentModelSelection from "../AgentModelSelection"; +import { useTranslation } from "react-i18next"; const ENABLED_PROVIDERS = [ "openai", @@ -65,7 +66,7 @@ export default function AgentLLMSelection({ const [searchQuery, setSearchQuery] = useState(""); const [searchMenuOpen, setSearchMenuOpen] = useState(false); const searchInputRef = useRef(null); - + const { t } = useTranslation(); function updateLLMChoice(selection) { setSearchQuery(""); setSelectedLLM(selection); @@ -97,9 +98,7 @@ export default function AgentLLMSelection({

- Performance of LLMs that do not explicitly support tool-calling is - highly dependent on the model's capabilities and accuracy. Some - abilities may be limited or non-functional. + {t("agent.performance-warning")}

@@ -107,11 +106,10 @@ export default function AgentLLMSelection({

- The specific LLM provider & model that will be used for this - workspace's @agent agent. + {t("agent.provider.description")}

diff --git a/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentModelSelection/index.jsx b/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentModelSelection/index.jsx index bf51cb87eea..270f22ef94f 100644 --- a/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentModelSelection/index.jsx +++ b/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentModelSelection/index.jsx @@ -1,6 +1,7 @@ import useGetProviderModels, { DISABLED_PROVIDERS, } from "@/hooks/useGetProvidersModels"; +import { useTranslation } from "react-i18next"; // These models do NOT support function calling function supportedModel(provider, model = "") { @@ -19,6 +20,8 @@ export default function AgentModelSelection({ }) { const { defaultModels, customModels, loading } = useGetProviderModels(provider); + + const { t } = useTranslation(); if (DISABLED_PROVIDERS.includes(provider)) return null; if (loading) { @@ -26,11 +29,10 @@ export default function AgentModelSelection({

- The specific chat model that will be used for this workspace's - @agent agent. + {t("agent.mode.chat.description")}

@@ -51,11 +53,10 @@ export default function AgentModelSelection({

- The specific LLM model that will be used for this workspace's @agent - agent. + {t("agent.mode.description")}

diff --git a/frontend/src/pages/WorkspaceSettings/AgentConfig/WebSearchSelection/index.jsx b/frontend/src/pages/WorkspaceSettings/AgentConfig/WebSearchSelection/index.jsx index 0581983fa2f..e38a796c829 100644 --- a/frontend/src/pages/WorkspaceSettings/AgentConfig/WebSearchSelection/index.jsx +++ b/frontend/src/pages/WorkspaceSettings/AgentConfig/WebSearchSelection/index.jsx @@ -8,6 +8,7 @@ import { SerperDotDevOptions, GoogleSearchOptions, } from "./SearchProviderOptions"; +import { useTranslation } from "react-i18next"; const SEARCH_PROVIDERS = [ { @@ -47,7 +48,7 @@ export default function AgentWebSearchSelection({ const [selectedProvider, setSelectedProvider] = useState("none"); const [searchQuery, setSearchQuery] = useState(""); const [searchMenuOpen, setSearchMenuOpen] = useState(false); - + const { t } = useTranslation(); function updateChoice(selection) { setSearchQuery(""); setSelectedProvider(selection); @@ -83,7 +84,7 @@ export default function AgentWebSearchSelection({

- Enable your agent to search the web to answer your questions by - connecting to a web-search (SERP) provider. + {t("agent.skill.web.desc-start")}
- Web search during agent sessions will not work until this is set up. + {t("agent.skill.web.desc-end")}