This commit is contained in:
MrMarans 2025-01-28 16:49:17 -05:00 committed by GitHub
commit 6cc30bfacf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
32 changed files with 2721 additions and 191 deletions
frontend/src
components
Modals/ManageWorkspace
DataConnectors
Connectors
Confluence
Github
Gitlab
WebsiteDepth
Youtube
index.jsx
Documents
Directory
UploadFile
WorkspaceDirectory
index.jsx
UserMenu/AccountModal
WorkspaceChat/ChatContainer
ChatHistory
PromptInput
AgentMenu
AttachItem
SlashCommands
SpeechToText
TextSizeMenu
index.jsx
locales

View file

@ -1,10 +1,12 @@
import { useState } from "react";
import { useTranslation } from "react-i18next";
import System from "@/models/system";
import showToast from "@/utils/toast";
import { Warning } from "@phosphor-icons/react";
import { Tooltip } from "react-tooltip";
export default function ConfluenceOptions() {
const { t } = useTranslation();
const [loading, setLoading] = useState(false);
const handleSubmit = async (e) => {
@ -59,12 +61,11 @@ export default function ConfluenceOptions() {
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold flex gap-x-2 items-center">
<p className="font-bold text-theme-text-primary">
Confluence deployment type
{t("connectors.confluence.deployment_type")}
</p>
</label>
<p className="text-xs font-normal text-theme-text-secondary">
Determine if your Confluence instance is hosted on Atlassian
cloud or self-hosted.
{t("connectors.confluence.deployment_type_explained")}
</p>
</div>
<select
@ -83,10 +84,10 @@ export default function ConfluenceOptions() {
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold flex gap-x-2 items-center">
<p className="font-bold text-white">Confluence base URL</p>
<p className="font-bold text-white">{t("connectors.confluence.base_url")}</p>
</label>
<p className="text-xs font-normal text-theme-text-secondary">
This is the base URL of your Confluence space.
{t("connectors.confluence.base_url_explained")}
</p>
</div>
<input
@ -102,11 +103,10 @@ export default function ConfluenceOptions() {
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">
Confluence space key
{t("connectors.confluence.space_key")}
</label>
<p className="text-xs font-normal text-theme-text-secondary">
This is the spaces key of your confluence instance that will
be used. Usually begins with ~
{t("connectors.confluence.space_key_explained")}
</p>
</div>
<input
@ -122,10 +122,10 @@ export default function ConfluenceOptions() {
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">
Confluence Username
{t("connectors.confluence.username")}
</label>
<p className="text-xs font-normal text-theme-text-secondary">
Your Confluence username.
{t("connectors.confluence.username_explained")}
</p>
</div>
<input
@ -142,7 +142,7 @@ export default function ConfluenceOptions() {
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold flex gap-x-2 items-center">
<p className="font-bold text-white">
Confluence Access Token
{t("connectors.confluence.token")}
</p>
<Warning
size={14}
@ -157,8 +157,17 @@ export default function ConfluenceOptions() {
clickable={true}
>
<p className="text-sm">
You need to provide an access token for authentication.
You can generate an access token{" "}
{t("connectors.confluence.token_explained_start")}
<a
href="https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/"
target="_blank"
rel="noopener noreferrer"
className="underline"
onClick={(e) => e.stopPropagation()}
>
{t("connectors.confluence.token_explained_link1")}
</a>
{t("connectors.confluence.token_explained_middle")}
<a
href="https://id.atlassian.com/manage-profile/security/api-tokens"
target="_blank"
@ -166,14 +175,14 @@ export default function ConfluenceOptions() {
className="underline"
onClick={(e) => e.stopPropagation()}
>
here
{t("connectors.confluence.token_explained_link2")}
</a>
.
{t("connectors.confluence.token_explained_end")}
</p>
</Tooltip>
</label>
<p className="text-xs font-normal text-theme-text-secondary">
Access token for authentication.
{t("connectors.confluence.token_desc")}
</p>
</div>
<input
@ -199,8 +208,7 @@ export default function ConfluenceOptions() {
</button>
{loading && (
<p className="text-xs text-theme-text-secondary">
Once complete, all pages will be available for embedding into
workspaces.
{t("connectors.confluence.task_explained")}
</p>
)}
</div>

View file

@ -1,5 +1,6 @@
import React, { useEffect, useState } from "react";
import System from "@/models/system";
import { useTranslation } from "react-i18next";
import showToast from "@/utils/toast";
import pluralize from "pluralize";
import { TagsInput } from "react-tag-input-component";
@ -8,6 +9,7 @@ import { Tooltip } from "react-tooltip";
const DEFAULT_BRANCHES = ["main", "master"];
export default function GithubOptions() {
const { t } = useTranslation();
const [loading, setLoading] = useState(false);
const [repo, setRepo] = useState(null);
const [accessToken, setAccessToken] = useState(null);
@ -68,10 +70,10 @@ export default function GithubOptions() {
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">
GitHub Repo URL
{t('connectors.github.URL')}
</label>
<p className="text-xs font-normal text-theme-text-secondary">
Url of the GitHub repo you wish to collect.
{t('connectors.github.URL_explained')}
</p>
</div>
<input
@ -89,16 +91,19 @@ export default function GithubOptions() {
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white font-bold text-sm flex gap-x-2 items-center">
<p className="font-bold text-white">Github Access Token</p>{" "}
<p className="font-bold text-white">
{t('connectors.github.token')}
</p>{" "}
<p className="text-xs font-light flex items-center">
<span className="text-theme-text-secondary">
optional
{t('connectors.github.optional')}
</span>
<PATTooltip accessToken={accessToken} />
</p>
</label>
<p className="text-xs font-normal text-theme-text-secondary">
Access Token to prevent rate limiting.
{t('connectors.github.token_explained')}
</p>
</div>
<input
@ -122,11 +127,12 @@ export default function GithubOptions() {
<div className="flex flex-col w-full py-4 pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm flex gap-x-2 items-center">
<p className="text-white text-sm font-bold">File Ignores</p>
<p className="text-white text-sm font-bold">
{t('connectors.github.ignores')}</p>
</label>
<p className="text-xs font-normal text-theme-text-secondary">
List in .gitignore format to ignore specific files during
collection. Press enter after each entry you want to save.
{t('connectors.github.git_ignore')}
</p>
</div>
<TagsInput
@ -154,8 +160,8 @@ export default function GithubOptions() {
</button>
{loading && (
<p className="text-xs text-white/50">
Once complete, all files will be available for embedding into
workspaces in the document picker.
{t('connectors.github.task_explained')}
</p>
)}
</div>
@ -166,6 +172,7 @@ export default function GithubOptions() {
}
function GitHubBranchSelection({ repo, accessToken }) {
const { t } = useTranslation();
const [allBranches, setAllBranches] = useState(DEFAULT_BRANCHES);
const [loading, setLoading] = useState(true);
@ -194,7 +201,9 @@ function GitHubBranchSelection({ repo, accessToken }) {
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">Branch</label>
<p className="text-xs font-normal text-theme-text-secondary">
Branch you wish to collect files from.
{t('connectors.github.branch')}
</p>
</div>
<select
@ -203,7 +212,7 @@ function GitHubBranchSelection({ repo, accessToken }) {
className="border-none bg-theme-settings-input-bg border-gray-500 text-white focus:outline-primary-button active:outline-primary-button outline-none text-sm rounded-lg block w-full p-2.5"
>
<option disabled={true} selected={true}>
-- loading available branches --
{t('connectors.github.branch_loading')}
</option>
</select>
</div>
@ -215,7 +224,7 @@ function GitHubBranchSelection({ repo, accessToken }) {
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">Branch</label>
<p className="text-xs font-normal text-theme-text-secondary">
Branch you wish to collect files from.
{t('connectors.github.branch_explained')}
</p>
</div>
<select
@ -236,15 +245,14 @@ function GitHubBranchSelection({ repo, accessToken }) {
}
function PATAlert({ accessToken }) {
const { t } = useTranslation();
if (!!accessToken) return null;
return (
<div className="flex flex-col md:flex-row md:items-center gap-x-2 text-white mb-4 bg-blue-800/30 w-fit rounded-lg px-4 py-2">
<div className="gap-x-2 flex items-center">
<Info className="shrink-0" size={25} />
<p className="text-sm">
Without filling out the <b>Github Access Token</b> this data connector
will only be able to collect the <b>top-level</b> files of the repo
due to GitHub's public API rate-limits.
<span dangerouslySetInnerHTML={{ __html: t("connectors.github.token_information") }} />
<br />
<br />
<a
@ -255,7 +263,8 @@ function PATAlert({ accessToken }) {
onClick={(e) => e.stopPropagation()}
>
{" "}
Get a free Personal Access Token with a GitHub account here.
{t('connectors.github.token_personal')}
</a>
</p>
</div>
@ -264,6 +273,7 @@ function PATAlert({ accessToken }) {
}
function PATTooltip({ accessToken }) {
const { t } = useTranslation();
if (!!accessToken) return null;
return (
<>
@ -282,7 +292,7 @@ function PATTooltip({ accessToken }) {
clickable={true}
>
<p className="text-sm">
Without a{" "}
{t('connectors.github.token_explained_start')}
<a
href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens"
rel="noreferrer"
@ -290,10 +300,9 @@ function PATTooltip({ accessToken }) {
className="underline"
onClick={(e) => e.stopPropagation()}
>
Personal Access Token
{t('connectors.github.token_explained_link1')}
</a>
, the GitHub API may limit the number of files that can be collected
due to rate limits. You can{" "}
{t('connectors.github.token_explained_middle')}
<a
href="https://github.com/settings/personal-access-tokens/new"
rel="noreferrer"
@ -301,9 +310,9 @@ function PATTooltip({ accessToken }) {
className="underline"
onClick={(e) => e.stopPropagation()}
>
create a temporary Access Token
</a>{" "}
to avoid this issue.
{t('connectors.github.token_explained_link2')}
</a>
{t('connectors.github.token_explained_end')}
</p>
</Tooltip>
</>

View file

@ -5,9 +5,11 @@ import pluralize from "pluralize";
import { TagsInput } from "react-tag-input-component";
import { Info, Warning } from "@phosphor-icons/react";
import { Tooltip } from "react-tooltip";
import { useTranslation } from "react-i18next";
const DEFAULT_BRANCHES = ["main", "master"];
export default function GitlabOptions() {
const { t } = useTranslation();
const [loading, setLoading] = useState(false);
const [repo, setRepo] = useState(null);
const [accessToken, setAccessToken] = useState(null);
@ -68,10 +70,10 @@ export default function GitlabOptions() {
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">
GitLab Repo URL
{t("connectors.gitlab.URL")}
</label>
<p className="text-xs font-normal text-theme-text-secondary">
URL of the GitLab repo you wish to collect.
{t("connectors.gitlab.URL_explained")}
</p>
</div>
<input
@ -89,16 +91,16 @@ export default function GitlabOptions() {
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white font-bold text-sm flex gap-x-2 items-center">
<p className="font-bold text-white">GitLab Access Token</p>{" "}
<p className="font-bold text-white">{t("connectors.gitlab.token")}</p>{" "}
<p className="text-xs font-light flex items-center">
<span className="text-theme-text-secondary">
optional
{t("connectors.gitlab.optional")}
</span>
<PATTooltip accessToken={accessToken} />
</p>
</label>
<p className="text-xs font-normal text-theme-text-secondary">
Access Token to prevent rate limiting.
{t("connectors.gitlab.token_description")}
</p>
</div>
<input
@ -119,7 +121,7 @@ export default function GitlabOptions() {
<p className="font-bold text-white">Settings</p>{" "}
</label>
<p className="text-xs font-normal text-white/50">
Select additional entities to fetch from the GitLab API.
{t("connectors.gitlab.token_description")}
</p>
</div>
<div className="flex items-center gap-x-2">
@ -132,7 +134,7 @@ export default function GitlabOptions() {
/>
<div className="peer-disabled:opacity-50 pointer-events-none peer h-6 w-11 rounded-full bg-[#CFCFD0] after:absolute after:left-[2px] after:top-[2px] after:h-5 after:w-5 after:rounded-full after:shadow-xl after:border-none after:bg-white after:box-shadow-md after:transition-all after:content-[''] peer-checked:bg-[#32D583] peer-checked:after:translate-x-full peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-transparent"></div>
<span className="ml-3 text-sm font-medium text-white">
Fetch Issues as Documents
{t("connectors.gitlab.fetch_issues")}
</span>
</label>
</div>
@ -146,11 +148,10 @@ export default function GitlabOptions() {
<div className="flex flex-col w-full py-4 pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm flex gap-x-2 items-center">
<p className="text-white text-sm font-bold">File Ignores</p>
<p className="text-white text-sm font-bold">{t("connectors.gitlab.ignores")}</p>
</label>
<p className="text-xs font-normal text-theme-text-secondary">
List in .gitignore format to ignore specific files during
collection. Press enter after each entry you want to save.
{t("connectors.gitlab.git_ignore")}
</p>
</div>
<TagsInput
@ -178,8 +179,7 @@ export default function GitlabOptions() {
</button>
{loading && (
<p className="text-xs text-white/50">
Once complete, all files will be available for embedding into
workspaces in the document picker.
{t("connectors.gitlab.task_explained")}
</p>
)}
</div>
@ -190,6 +190,7 @@ export default function GitlabOptions() {
}
function GitLabBranchSelection({ repo, accessToken }) {
const { t } = useTranslation();
const [allBranches, setAllBranches] = useState(DEFAULT_BRANCHES);
const [loading, setLoading] = useState(true);
@ -216,9 +217,9 @@ function GitLabBranchSelection({ repo, accessToken }) {
return (
<div className="flex flex-col w-60">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">Branch</label>
<label className="text-white text-sm font-bold">{t("connectors.gitlab.branch")}</label>
<p className="text-xs font-normal text-theme-text-secondary">
Branch you wish to collect files from.
{t("connectors.gitlab.branch_explained")}
</p>
</div>
<select
@ -227,7 +228,7 @@ function GitLabBranchSelection({ repo, accessToken }) {
className="border-none bg-theme-settings-input-bg border-gray-500 text-white focus:outline-primary-button active:outline-primary-button outline-none text-sm rounded-lg block w-full p-2.5"
>
<option disabled={true} selected={true}>
-- loading available branches --
{t("connectors.gitlab.branch_loading")}
</option>
</select>
</div>
@ -239,7 +240,7 @@ function GitLabBranchSelection({ repo, accessToken }) {
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">Branch</label>
<p className="text-xs font-normal text-theme-text-secondary">
Branch you wish to collect files from.
{t("connectors.gitlab.branch_explained")}
</p>
</div>
<select
@ -260,15 +261,14 @@ function GitLabBranchSelection({ repo, accessToken }) {
}
function PATAlert({ accessToken }) {
const { t } = useTranslation();
if (!!accessToken) return null;
return (
<div className="flex flex-col md:flex-row md:items-center gap-x-2 text-white mb-4 bg-blue-800/30 w-fit rounded-lg px-4 py-2">
<div className="gap-x-2 flex items-center">
<Info className="shrink-0" size={25} />
<p className="text-sm">
Without filling out the <b>GitLab Access Token</b> this data connector
will only be able to collect the <b>top-level</b> files of the repo
due to GitLab's public API rate-limits.
<span dangerouslySetInnerHTML={{ __html: t("connectors.gitlab.token_information") }} />
<br />
<br />
<a
@ -278,8 +278,7 @@ function PATAlert({ accessToken }) {
className="underline"
onClick={(e) => e.stopPropagation()}
>
{" "}
Get a free Personal Access Token with a GitLab account here.
{t("connectors.gitlab.token_personal")}
</a>
</p>
</div>
@ -288,6 +287,7 @@ function PATAlert({ accessToken }) {
}
function PATTooltip({ accessToken }) {
const { t } = useTranslation();
if (!!accessToken) return null;
return (
<>
@ -306,7 +306,7 @@ function PATTooltip({ accessToken }) {
clickable={true}
>
<p className="text-sm">
Without a{" "}
{t('connectors.gitlab.token_explained_start')}
<a
href="https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html"
rel="noreferrer"
@ -314,20 +314,19 @@ function PATTooltip({ accessToken }) {
className="underline"
onClick={(e) => e.stopPropagation()}
>
Personal Access Token
{t('connectors.gitlab.token_explained_link1')}
</a>
, the GitLab API may limit the number of files that can be collected
due to rate limits. You can{" "}
{t('connectors.gitlab.token_explained_middle')}
<a
href="https://gitlab.com/-/user_settings/personal_access_tokens"
href="https://gitlab.com/-/profile/personal_access_tokens"
rel="noreferrer"
target="_blank"
className="underline"
onClick={(e) => e.stopPropagation()}
>
create a temporary Access Token
</a>{" "}
to avoid this issue.
{t('connectors.gitlab.token_explained_link2')}
</a>
{t('connectors.gitlab.token_explained_end')}
</p>
</Tooltip>
</>

View file

@ -2,8 +2,10 @@ import React, { useState } from "react";
import System from "@/models/system";
import showToast from "@/utils/toast";
import pluralize from "pluralize";
import { useTranslation } from "react-i18next";
export default function WebsiteDepthOptions() {
const { t } = useTranslation();
const [loading, setLoading] = useState(false);
const handleSubmit = async (e) => {
@ -55,10 +57,10 @@ export default function WebsiteDepthOptions() {
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">
Website URL
{t("connectors.website-depth.URL")}
</label>
<p className="text-xs font-normal text-theme-text-secondary">
URL of the website you want to scrape.
{t("connectors.website-depth.URL_explained")}
</p>
</div>
<input
@ -73,10 +75,9 @@ export default function WebsiteDepthOptions() {
</div>
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">Depth</label>
<label className="text-white text-sm font-bold"> {t("connectors.website-depth.depth")}</label>
<p className="text-xs font-normal text-theme-text-secondary">
This is the number of child-links that the worker should
follow from the origin URL.
{t("connectors.website-depth.depth_explained")}
</p>
</div>
<input
@ -92,10 +93,10 @@ export default function WebsiteDepthOptions() {
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">
Max Links
{t("connectors.website-depth.max_pages")}
</label>
<p className="text-xs font-normal text-theme-text-secondary">
Maximum number of links to scrape.
{t("connectors.website-depth.max_pages_explained")}
</p>
</div>
<input
@ -122,8 +123,7 @@ export default function WebsiteDepthOptions() {
</button>
{loading && (
<p className="text-xs text-theme-text-secondary">
Once complete, all scraped pages will be available for embedding
into workspaces in the document picker.
{t("connectors.website-depth.task_explained")}
</p>
)}
</div>

View file

@ -1,8 +1,10 @@
import React, { useState } from "react";
import System from "@/models/system";
import showToast from "@/utils/toast";
import { useTranslation } from "react-i18next";
export default function YoutubeOptions() {
const { t } = useTranslation();
const [loading, setLoading] = useState(false);
const handleSubmit = async (e) => {
@ -50,10 +52,20 @@ export default function YoutubeOptions() {
<div className="flex flex-col pr-10">
<div className="flex flex-col gap-y-1 mb-4">
<label className="text-white text-sm font-bold">
YouTube Video URL
{t("connectors.youtube.URL")}
</label>
<p className="text-xs font-normal text-theme-text-secondary">
URL of the YouTube video you wish to transcribe.
{t("connectors.youtube.URL_explained_start")}
<a
href="https://support.google.com/youtube/answer/6373554"
rel="noreferrer"
target="_blank"
className="underline"
onClick={(e) => e.stopPropagation()}
>
{t("connectors.youtube.URL_explained_link")}
</a>
{t("connectors.youtube.URL_explained_end")}
</p>
</div>
<input
@ -79,8 +91,7 @@ export default function YoutubeOptions() {
</button>
{loading && (
<p className="text-xs text-theme-text-secondary max-w-sm">
Once complete, the transcription will be available for embedding
into workspaces in the document picker.
{t("connectors.youtube.task_explained")}
</p>
)}
</div>

View file

@ -1,5 +1,6 @@
import ConnectorImages from "@/components/DataConnectorOption/media";
import { MagnifyingGlass } from "@phosphor-icons/react";
import { useTranslation } from "react-i18next";
import GithubOptions from "./Connectors/Github";
import GitlabOptions from "./Connectors/Gitlab";
import YoutubeOptions from "./Connectors/Youtube";
@ -8,45 +9,44 @@ import { useState } from "react";
import ConnectorOption from "./ConnectorOption";
import WebsiteDepthOptions from "./Connectors/WebsiteDepth";
export const DATA_CONNECTORS = {
export const getDataConnectors = (t) => ({
github: {
name: "GitHub Repo",
name: t('connectors.github.name'),
image: ConnectorImages.github,
description:
"Import an entire public or private Github repository in a single click.",
description: t('connectors.github.description'),
options: <GithubOptions />,
},
gitlab: {
name: "GitLab Repo",
name: t('connectors.gitlab.name'),
image: ConnectorImages.gitlab,
description:
"Import an entire public or private GitLab repository in a single click.",
description: t('connectors.gitlab.description'),
options: <GitlabOptions />,
},
"youtube-transcript": {
name: "YouTube Transcript",
name: t('connectors.youtube.name'),
image: ConnectorImages.youtube,
description:
"Import the transcription of an entire YouTube video from a link.",
description: t('connectors.youtube.description'),
options: <YoutubeOptions />,
},
"website-depth": {
name: "Bulk Link Scraper",
name: t('connectors.website-depth.name'),
image: ConnectorImages.websiteDepth,
description: "Scrape a website and its sub-links up to a certain depth.",
description: t('connectors.website-depth.description'),
options: <WebsiteDepthOptions />,
},
confluence: {
name: "Confluence",
name: t('connectors.confluence.name'),
image: ConnectorImages.confluence,
description: "Import an entire Confluence page in a single click.",
description: t('connectors.confluence.description'),
options: <ConfluenceOptions />,
},
};
});
export default function DataConnectors() {
const { t } = useTranslation();
const [selectedConnector, setSelectedConnector] = useState("github");
const [searchQuery, setSearchQuery] = useState("");
const DATA_CONNECTORS = getDataConnectors(t);
const filteredConnectors = Object.keys(DATA_CONNECTORS).filter((slug) =>
DATA_CONNECTORS[slug].name.toLowerCase().includes(searchQuery.toLowerCase())
@ -63,7 +63,7 @@ export default function DataConnectors() {
/>
<input
type="text"
placeholder="Search data connectors"
placeholder={t('connectors.search-placeholder')}
className="border-none z-20 pl-10 h-[38px] rounded-full w-full px-4 py-1 text-sm border-2 border-slate-300/40 outline-none focus:outline-primary-button active:outline-primary-button outline-none placeholder:text-theme-settings-input-placeholder text-white bg-theme-settings-input-bg"
autoComplete="off"
value={searchQuery}
@ -85,7 +85,7 @@ export default function DataConnectors() {
))
) : (
<div className="text-white text-center mt-4">
No data connectors found.
{t('connectors.no-connectors')}
</div>
)}
</div>

View file

@ -1,6 +1,7 @@
import UploadFile from "../UploadFile";
import PreLoader from "@/components/Preloader";
import { memo, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import FolderRow from "./FolderRow";
import System from "@/models/system";
import { MagnifyingGlass, Plus, Trash } from "@phosphor-icons/react";
@ -30,6 +31,7 @@ function Directory({
setLoadingMessage,
loadingMessage,
}) {
const { t } = useTranslation();
const [amountSelected, setAmountSelected] = useState(0);
const [showFolderSelection, setShowFolderSelection] = useState(false);
const [searchTerm, setSearchTerm] = useState("");
@ -51,9 +53,7 @@ function Directory({
const deleteFiles = async (event) => {
event.stopPropagation();
if (
!window.confirm(
"Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible."
)
!window.confirm(t('connectors.directory.delete-confirmation'))
) {
return false;
}
@ -83,7 +83,7 @@ function Directory({
setLoading(true);
setLoadingMessage(
`Removing ${toRemove.length} documents and ${foldersToRemove.length} folders. Please wait.`
t('connectors.directory.removing-message', { count: toRemove.length, folderCount: foldersToRemove.length })
);
await System.deleteDocuments(toRemove);
for (const folderName of foldersToRemove) {
@ -166,7 +166,7 @@ function Directory({
// show info if some files were not moved due to being embedded
showToast(message, "info");
} else {
showToast(`Successfully moved ${toMove.length} documents.`, "success");
showToast(t('connectors.directory.move-success', { count: toMove.length }), "success");
}
await fetchKeys(true);
setSelectedItems({});
@ -194,11 +194,11 @@ function Directory({
<div className="px-8 pb-8" onContextMenu={handleContextMenu}>
<div className="flex flex-col gap-y-6">
<div className="flex items-center justify-between w-[560px] px-5 relative">
<h3 className="text-white text-base font-bold">My Documents</h3>
<h3 className="text-white text-base font-bold">{t('connectors.directory.my-documents')}</h3>
<div className="relative">
<input
type="search"
placeholder="Search for document"
placeholder={t('connectors.directory.search-document')}
onChange={handleSearch}
className="border-none search-input bg-theme-settings-input-bg text-white placeholder:text-theme-settings-input-placeholder focus:outline-primary-button active:outline-primary-button outline-none text-sm rounded-lg pl-9 pr-2.5 py-2 w-[250px] h-[32px] light:border-theme-modal-border light:border"
/>
@ -218,7 +218,7 @@ function Directory({
className="text-theme-text-primary light:text-[#0ba5ec]"
/>
<div className="text-theme-text-primary light:text-[#0ba5ec] text-xs font-bold leading-[18px]">
New Folder
{t('connectors.directory.new-folder')}
</div>
</button>
</div>
@ -257,7 +257,7 @@ function Directory({
) : (
<div className="w-full h-full flex items-center justify-center">
<p className="text-white text-opacity-40 text-sm font-medium">
No Documents
{t('connectors.directory.no-documents')}
</p>
</div>
)}
@ -272,7 +272,7 @@ function Directory({
onMouseLeave={() => setHighlightWorkspace(false)}
className="border-none text-sm font-semibold bg-white light:bg-[#E0F2FE] h-[30px] px-2.5 rounded-lg hover:bg-neutral-800/80 hover:text-white light:text-[#026AA2] light:hover:bg-[#026AA2] light:hover:text-white"
>
Move to Workspace
{t('connectors.directory.move-workspace')}
</button>
<div className="relative">
<button

View file

@ -1,5 +1,6 @@
import { CloudArrowUp } from "@phosphor-icons/react";
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import showToast from "../../../../../utils/toast";
import System from "../../../../../models/system";
import { useDropzone } from "react-dropzone";
@ -14,6 +15,7 @@ export default function UploadFile({
setLoading,
setLoadingMessage,
}) {
const { t } = useTranslation();
const [ready, setReady] = useState(false);
const [files, setFiles] = useState([]);
const [fetchingUrl, setFetchingUrl] = useState(false);
@ -90,21 +92,20 @@ export default function UploadFile({
<div className="flex flex-col items-center justify-center h-full">
<CloudArrowUp className="w-8 h-8 text-white/80 light:invert" />
<div className="text-white text-opacity-80 text-sm font-semibold py-1">
Document Processor Unavailable
{t('connectors.upload.processor-offline')}
</div>
<div className="text-white text-opacity-60 text-xs font-medium py-1 px-20 text-center">
We can't upload your files right now because the document
processor is offline. Please try again later.
{t('connectors.upload.processor-offline-desc')}
</div>
</div>
) : files.length === 0 ? (
<div className="flex flex-col items-center justify-center">
<CloudArrowUp className="w-8 h-8 text-white/80 light:invert" />
<div className="text-white text-opacity-80 text-sm font-semibold py-1">
Click to upload or drag and drop
{t('connectors.upload.click-upload')}
</div>
<div className="text-white text-opacity-60 text-xs font-medium py-1">
supports text files, csv's, spreadsheets, audio files, and more!
{t('connectors.upload.file-types')}
</div>
</div>
) : (
@ -128,7 +129,7 @@ export default function UploadFile({
)}
</div>
<div className="text-center text-white text-opacity-50 text-xs font-medium w-[560px] py-2">
or submit a link
{t('connectors.upload.or-submit-link')}
</div>
<form onSubmit={handleSendLink} className="flex gap-x-2">
<input
@ -136,7 +137,7 @@ export default function UploadFile({
name="link"
type="url"
className="border-none disabled:bg-theme-settings-input-bg disabled:text-theme-settings-input-placeholder bg-theme-settings-input-bg text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-3/4 p-2.5"
placeholder={"https://example.com"}
placeholder={t('connectors.upload.placeholder-link')}
autoComplete="off"
/>
<button
@ -144,13 +145,11 @@ export default function UploadFile({
type="submit"
className="disabled:bg-white/20 disabled:text-slate-300 disabled:border-slate-400 disabled:cursor-wait bg bg-transparent hover:bg-slate-200 hover:text-slate-800 w-auto border border-white light:border-theme-modal-border text-sm text-white p-2.5 rounded-lg"
>
{fetchingUrl ? "Fetching..." : "Fetch website"}
{fetchingUrl ? t('connectors.upload.fetching') : t('connectors.upload.fetch-website')}
</button>
</form>
<div className="mt-6 text-center text-white text-opacity-80 text-xs font-medium w-[560px]">
These files will be uploaded to the document processor running on this
AnythingLLM instance. These files are not sent or shared with a third
party.
{t('connectors.upload.privacy-notice')}
</div>
</div>
);

View file

@ -10,6 +10,7 @@ import { Link } from "react-router-dom";
import Workspace from "@/models/workspace";
import { Tooltip } from "react-tooltip";
import { safeJsonParse } from "@/utils/request";
import { useTranslation } from "react-i18next";
function WorkspaceDirectory({
workspace,
@ -25,6 +26,7 @@ function WorkspaceDirectory({
embeddingCosts,
movedItems,
}) {
const { t } = useTranslation();
const [selectedItems, setSelectedItems] = useState({});
const toggleSelection = (item) => {
@ -182,7 +184,7 @@ function WorkspaceDirectory({
) : (
<div className="w-full h-full flex items-center justify-center">
<p className="text-white text-opacity-40 text-sm font-medium">
No Documents
{t("connectors.directory.no_docs")}
</p>
</div>
)}
@ -201,14 +203,14 @@ function WorkspaceDirectory({
(sum, folder) => sum + folder.items.length,
0
)
? "Deselect All"
: "Select All"}
? t("connectors.directory.deselect_all")
: t("connectors.directory.select_all")}
</button>
<button
onClick={removeSelectedItems}
className="border-none text-sm font-semibold bg-white light:bg-[#E0F2FE] h-[30px] px-2.5 rounded-lg hover:bg-neutral-800/80 hover:text-white light:text-[#026AA2] light:hover:bg-[#026AA2] light:hover:text-white"
>
Remove Selected
{t("connectors.directory.remove_selected")}
</button>
</div>
</div>
@ -229,7 +231,7 @@ function WorkspaceDirectory({
}`}
</p>
<p className="mt-2 text-xs italic" hidden={embeddingCosts === 0}>
*One time cost for embeddings
{t("new-workspace.costs")}
</p>
</div>
@ -237,7 +239,7 @@ function WorkspaceDirectory({
onClick={(e) => handleSaveChanges(e)}
className="border border-slate-200 px-5 py-2.5 rounded-lg text-white text-sm items-center flex gap-x-2 hover:bg-slate-200 hover:text-slate-800 focus:ring-gray-800"
>
Save and Embed
{t("connectors.directory.save_embed")}
</button>
</div>
)}
@ -250,6 +252,7 @@ function WorkspaceDirectory({
}
const PinAlert = memo(() => {
const { t } = useTranslation();
const [showAlert, setShowAlert] = useState(false);
function dismissAlert() {
setShowAlert(false);
@ -277,25 +280,20 @@ const PinAlert = memo(() => {
weight="regular"
/>
<h3 className="text-xl font-semibold text-white">
What is document pinning?
{t("connectors.pinning.what_pinning")}
</h3>
</div>
</div>
<div className="py-7 px-9 space-y-2 flex-col">
<div className="w-full text-white text-md flex flex-col gap-y-2">
<p>
When you <b>pin</b> a document in AnythingLLM we will inject the
entire content of the document into your prompt window for your
LLM to fully comprehend.
<span dangerouslySetInnerHTML={{ __html: t("connectors.pinning.pin_explained_block1") }} />
</p>
<p>
This works best with <b>large-context models</b> or small files
that are critical to its knowledge-base.
<span dangerouslySetInnerHTML={{ __html: t("connectors.pinning.pin_explained_block2") }} />
</p>
<p>
If you are not getting the answers you desire from AnythingLLM by
default then pinning is a great way to get higher quality answers
in a click.
{t("connectors.pinning.pin_explained_block3")}
</p>
</div>
</div>
@ -304,7 +302,7 @@ const PinAlert = memo(() => {
onClick={dismissAlert}
className="transition-all duration-300 bg-white text-black hover:opacity-60 px-4 py-2 rounded-lg text-sm"
>
Okay, got it
{t("connectors.pinning.accept")}
</button>
</div>
</div>
@ -313,6 +311,7 @@ const PinAlert = memo(() => {
});
const DocumentWatchAlert = memo(() => {
const { t } = useTranslation();
const [showAlert, setShowAlert] = useState(false);
function dismissAlert() {
setShowAlert(false);
@ -340,31 +339,27 @@ const DocumentWatchAlert = memo(() => {
weight="regular"
/>
<h3 className="text-xl font-semibold text-white">
What does watching a document do?
{t("connectors.pinning.what_watching")}
</h3>
</div>
</div>
<div className="py-7 px-9 space-y-2 flex-col">
<div className="w-full text-white text-md flex flex-col gap-y-2">
<p>
When you <b>watch</b> a document in AnythingLLM we will{" "}
<i>automatically</i> sync your document content from it's original
source on regular intervals. This will automatically update the
content in every workspace where this file is managed.
<span dangerouslySetInnerHTML={{ __html: t("connectors.watching.watch_explained_block1") }} />
</p>
<p>
This feature currently supports online-based content and will not
be available for manually uploaded documents.
{t("connectors.watching.watch_explained_block2")}
</p>
<p>
You can manage what documents are watched from the{" "}
{t("connectors.watching.watch_explained_block3_start")}
<Link
to={paths.experimental.liveDocumentSync.manage()}
className="text-blue-600 underline"
>
File manager
</Link>{" "}
admin view.
{t("connectors.watching.watch_explained_block3_link")}
</Link>
{t("connectors.watching.watch_explained_block3_end")}
</p>
</div>
</div>
@ -373,7 +368,7 @@ const DocumentWatchAlert = memo(() => {
onClick={dismissAlert}
className="transition-all duration-300 bg-white text-black hover:opacity-60 px-4 py-2 rounded-lg text-sm"
>
Okay, got it
{t("connectors.watching.accept")}
</button>
</div>
</div>

View file

@ -1,5 +1,6 @@
import React, { useState, useEffect, memo } from "react";
import { X } from "@phosphor-icons/react";
import { useTranslation } from "react-i18next";
import { useParams } from "react-router-dom";
import Workspace from "../../../models/workspace";
import System from "../../../models/system";
@ -11,6 +12,7 @@ import ModalWrapper from "@/components/ModalWrapper";
const noop = () => {};
const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
const { t } = useTranslation();
const { slug } = useParams();
const { user } = useUser();
const [workspace, setWorkspace] = useState(null);
@ -42,7 +44,7 @@ const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
<div className="relative p-6 border-b rounded-t border-theme-modal-border">
<div className="w-full flex gap-x-2 items-center">
<h3 className="text-xl font-semibold text-white overflow-hidden overflow-ellipsis whitespace-nowrap">
Editing "{workspace.name}"
{t('connectors.manage.editing')} "{workspace.name}"
</h3>
</div>
<button
@ -59,8 +61,7 @@ const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
>
<div className="py-7 px-9 space-y-2 flex-col">
<p className="text-white">
Editing these settings are only available on a desktop device.
Please access this page on your desktop to continue.
{t('connectors.manage.desktop-only')}
</p>
</div>
</div>
@ -70,7 +71,7 @@ const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
type="button"
className="transition-all duration-300 bg-white text-black hover:opacity-60 px-4 py-2 rounded-lg text-sm"
>
Dismiss
{t('connectors.manage.dismiss')}
</button>
</div>
</div>
@ -114,6 +115,7 @@ const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
export default memo(ManageWorkspace);
const ModalTabSwitcher = ({ selectedTab, setSelectedTab }) => {
const { t } = useTranslation();
return (
<div className="w-full flex justify-center z-10 relative">
<div className="gap-x-2 flex justify-center -mt-[68px] mb-10 bg-theme-bg-secondary p-1 rounded-xl shadow border-2 border-theme-modal-border w-fit">
@ -125,7 +127,7 @@ const ModalTabSwitcher = ({ selectedTab, setSelectedTab }) => {
: "text-white/20 font-medium hover:text-white light:bg-white light:text-[#535862] light:hover:bg-[#E0F2FE]"
}`}
>
Documents
{t('connectors.manage.documents')}
</button>
<button
onClick={() => setSelectedTab("dataConnectors")}
@ -135,7 +137,7 @@ const ModalTabSwitcher = ({ selectedTab, setSelectedTab }) => {
: "text-white/20 font-medium hover:text-white light:bg-white light:text-[#535862] light:hover:bg-[#E0F2FE]"
}`}
>
Data Connectors
{t('connectors.manage.data-connectors')}
</button>
</div>
</div>

View file

@ -6,6 +6,7 @@ import showToast from "@/utils/toast";
import { Plus, X } from "@phosphor-icons/react";
import ModalWrapper from "@/components/ModalWrapper";
import { useTheme } from "@/hooks/useTheme";
import { useTranslation } from "react-i18next";
export default function AccountModal({ user, hideModal }) {
const { pfp, setPfp } = usePfp();
@ -28,6 +29,7 @@ export default function AccountModal({ user, hideModal }) {
};
const handleRemovePfp = async () => {
const { success, error } = await System.removePfp();
if (!success) {
showToast(`Failed to remove profile picture: ${error}`, "error");
@ -39,7 +41,7 @@ export default function AccountModal({ user, hideModal }) {
const handleUpdate = async (e) => {
e.preventDefault();
const data = {};
const form = new FormData(e.target);
for (var [key, value] of form.entries()) {
@ -61,14 +63,14 @@ export default function AccountModal({ user, hideModal }) {
showToast(`Failed to update user: ${error}`, "error");
}
};
const { t } = useTranslation();
return (
<ModalWrapper isOpen={true}>
<div className="w-full max-w-2xl bg-theme-bg-secondary rounded-lg shadow border-2 border-theme-modal-border overflow-hidden">
<div className="relative p-6 border-b rounded-t border-theme-modal-border">
<div className="w-full flex gap-x-2 items-center">
<h3 className="text-xl font-semibold text-white overflow-hidden overflow-ellipsis whitespace-nowrap">
Edit Account
{t('profile_settings.edit_account')}
</h3>
</div>
<button
@ -104,7 +106,7 @@ export default function AccountModal({ user, hideModal }) {
<div className="flex flex-col items-center justify-center p-3">
<Plus className="w-8 h-8 text-theme-text-secondary m-2" />
<span className="text-theme-text-secondary text-opacity-80 text-sm font-semibold">
Profile Picture
{t('profile_settings.profile_picture')}
</span>
<span className="text-theme-text-secondary text-opacity-60 text-xs">
800 x 800
@ -118,7 +120,7 @@ export default function AccountModal({ user, hideModal }) {
onClick={handleRemovePfp}
className="mt-3 text-theme-text-secondary text-opacity-60 text-sm font-medium hover:underline"
>
Remove Profile Picture
{t('profile_settings.remove_profile_picture')}
</button>
)}
</div>
@ -129,7 +131,7 @@ export default function AccountModal({ user, hideModal }) {
htmlFor="username"
className="block mb-2 text-sm font-medium text-theme-text-primary"
>
Username
{t('profile_settings.username')}
</label>
<input
name="username"
@ -142,8 +144,7 @@ export default function AccountModal({ user, hideModal }) {
autoComplete="off"
/>
<p className="mt-2 text-xs text-white/60">
Username must be only contain lowercase letters, numbers,
underscores, and hyphens with no spaces
{t('profile_settings.username_description')}
</p>
</div>
<div>
@ -151,7 +152,7 @@ export default function AccountModal({ user, hideModal }) {
htmlFor="password"
className="block mb-2 text-sm font-medium text-white"
>
New Password
{t('profile_settings.new_password')}
</label>
<input
name="password"
@ -161,7 +162,7 @@ export default function AccountModal({ user, hideModal }) {
minLength={8}
/>
<p className="mt-2 text-xs text-white/60">
Password must be at least 8 characters long
{t('profile_settings.passwort_description')}
</p>
</div>
<div className="flex flex-row gap-x-8">
@ -175,13 +176,13 @@ export default function AccountModal({ user, hideModal }) {
type="button"
className="transition-all duration-300 text-white hover:bg-zinc-700 px-4 py-2 rounded-lg text-sm"
>
Cancel
{t('profile_settings.cancel')}
</button>
<button
type="submit"
className="transition-all duration-300 bg-white text-black hover:opacity-60 px-4 py-2 rounded-lg text-sm"
>
Update Account
{t('profile_settings.update_account')}
</button>
</div>
</form>
@ -198,14 +199,14 @@ function LanguagePreference() {
getLanguageName,
changeLanguage,
} = useLanguageOptions();
const { t } = useTranslation();
return (
<div>
<label
htmlFor="userLang"
className="block mb-2 text-sm font-medium text-white"
>
Preferred language
{t('profile_settings.language')}
</label>
<select
name="userLang"
@ -227,14 +228,14 @@ function LanguagePreference() {
function ThemePreference() {
const { theme, setTheme, availableThemes } = useTheme();
const { t } = useTranslation();
return (
<div>
<label
htmlFor="theme"
className="block mb-2 text-sm font-medium text-white"
>
Theme Preference
{t('profile_settings.theme')}
</label>
<select
name="theme"

View file

@ -14,6 +14,7 @@ import paths from "@/utils/paths";
import Appearance from "@/models/appearance";
import useTextSize from "@/hooks/useTextSize";
import { v4 } from "uuid";
import { useTranslation } from "react-i18next";
export default function ChatHistory({
history = [],
@ -23,6 +24,7 @@ export default function ChatHistory({
regenerateAssistantMessage,
hasAttachments = false,
}) {
const { t } = useTranslation();
const lastScrollTopRef = useRef(0);
const { user } = useUser();
const { threadSlug = null } = useParams();
@ -179,22 +181,22 @@ export default function ChatHistory({
<div className="flex flex-col h-full md:mt-0 pb-44 md:pb-40 w-full justify-end items-center">
<div className="flex flex-col items-center md:items-start md:max-w-[600px] w-full px-4">
<p className="text-white/60 text-lg font-base py-4">
Welcome to your new workspace.
{t('chat_window.welcome')}
</p>
{!user || user.role !== "default" ? (
<p className="w-full items-center text-white/60 text-lg font-base flex flex-col md:flex-row gap-x-1">
To get started either{" "}
{t('chat_window.get_started')}
<span
className="underline font-medium cursor-pointer"
onClick={showModal}
>
upload a document
{t('chat_window.upload')}
</span>
or <b className="font-medium italic">send a chat.</b>
{t('chat_window.or')} <b className="font-medium italic">{t('chat_window.send_chat')}</b>
</p>
) : (
<p className="w-full items-center text-white/60 text-lg font-base flex flex-col md:flex-row gap-x-1">
To get started <b className="font-medium italic">send a chat.</b>
{t('chat_window.get_started_default')} <b className="font-medium italic">{t('chat_window.send_chat')}</b>
</p>
)}
<WorkspaceChatSuggestions

View file

@ -2,16 +2,18 @@ import { useEffect, useRef, useState } from "react";
import { Tooltip } from "react-tooltip";
import { At } from "@phosphor-icons/react";
import { useIsAgentSessionActive } from "@/utils/chat/agent";
import { useTranslation } from "react-i18next";
export default function AvailableAgentsButton({ showing, setShowAgents }) {
const { t } = useTranslation();
const agentSessionActive = useIsAgentSessionActive();
if (agentSessionActive) return null;
return (
<div
id="agent-list-btn"
data-tooltip-id="tooltip-agent-list-btn"
data-tooltip-content="View all available agents you can use for chatting."
aria-label="View all available agents you can use for chatting."
data-tooltip-content={t('chat_window.agents')}
aria-label={t('chat_window.agents')}
onClick={() => setShowAgents(!showing)}
className={`flex justify-center items-center cursor-pointer ${
showing ? "!opacity-100" : ""

View file

@ -1,12 +1,14 @@
import useUser from "@/hooks/useUser";
import { PaperclipHorizontal } from "@phosphor-icons/react";
import { Tooltip } from "react-tooltip";
import { useTranslation } from "react-i18next";
/**
* This is a simple proxy component that clicks on the DnD file uploader for the user.
* @returns
*/
export default function AttachItem() {
const { t } = useTranslation();
const { user } = useUser();
if (!!user && user.role === "default") return null;
@ -15,8 +17,8 @@ export default function AttachItem() {
<button
id="attach-item-btn"
data-tooltip-id="attach-item-btn"
data-tooltip-content="Attach a file to this chat"
aria-label="Attach a file to this chat"
data-tooltip-content={t('chat_window.attach_file')}
aria-label={t('chat_window.attach_file')}
type="button"
onClick={(e) => {
e?.target?.blur();

View file

@ -4,13 +4,15 @@ import { Tooltip } from "react-tooltip";
import ResetCommand from "./reset";
import EndAgentSession from "./endAgentSession";
import SlashPresets from "./SlashPresets";
import { useTranslation } from "react-i18next";
export default function SlashCommandsButton({ showing, setShowSlashCommand }) {
const { t } = useTranslation();
return (
<div
id="slash-cmd-btn"
data-tooltip-id="tooltip-slash-cmd-btn"
data-tooltip-content="View all available slash commands for chatting."
data-tooltip-content={t('chat_window.slash')}
onClick={() => setShowSlashCommand(!showing)}
className={`flex justify-center items-center cursor-pointer ${
showing ? "!opacity-100" : ""

View file

@ -6,6 +6,7 @@ import SpeechRecognition, {
useSpeechRecognition,
} from "react-speech-recognition";
import { PROMPT_INPUT_EVENT } from "../../PromptInput";
import { useTranslation } from "react-i18next";
let timeout;
const SILENCE_INTERVAL = 3_200; // wait in seconds of silence before closing.
@ -20,7 +21,7 @@ export default function SpeechToText({ sendCommand }) {
} = useSpeechRecognition({
clearTranscriptOnListen: true,
});
const { t } = useTranslation();
function startSTTSession() {
if (!isMicrophoneAvailable) {
alert(
@ -95,8 +96,8 @@ export default function SpeechToText({ sendCommand }) {
<div
id="text-size-btn"
data-tooltip-id="tooltip-text-size-btn"
data-tooltip-content="Speak your prompt"
aria-label="Speak your prompt"
data-tooltip-content={t('chat_window.microphone')}
aria-label={t('chat_window.microphone')}
onClick={listening ? endTTSSession : startSTTSession}
className={`border-none relative flex justify-center items-center opacity-60 hover:opacity-100 light:opacity-100 light:hover:opacity-60 cursor-pointer ${
!!listening ? "!opacity-100" : ""

View file

@ -1,10 +1,12 @@
import { useState, useRef, useEffect } from "react";
import { TextT } from "@phosphor-icons/react";
import { Tooltip } from "react-tooltip";
import { useTranslation } from "react-i18next";
export default function TextSizeButton() {
const [showTextSizeMenu, setShowTextSizeMenu] = useState(false);
const buttonRef = useRef(null);
const { t } = useTranslation();
return (
<>
@ -12,8 +14,8 @@ export default function TextSizeButton() {
ref={buttonRef}
id="text-size-btn"
data-tooltip-id="tooltip-text-size-btn"
data-tooltip-content="Change text size"
aria-label="Change text size"
data-tooltip-content={t('chat_window.text_size')}
aria-label={t('chat_window.text_size')}
onClick={() => setShowTextSizeMenu(!showTextSizeMenu)}
className={`border-none relative flex justify-center items-center opacity-60 hover:opacity-100 light:opacity-100 light:hover:opacity-60 cursor-pointer ${
showTextSizeMenu ? "!opacity-100" : ""

View file

@ -17,6 +17,7 @@ import AttachmentManager from "./Attachments";
import AttachItem from "./AttachItem";
import { PASTE_ATTACHMENT_EVENT } from "../DnDWrapper";
import useTextSize from "@/hooks/useTextSize";
import { useTranslation } from "react-i18next";
export const PROMPT_INPUT_EVENT = "set_prompt_input";
const MAX_EDIT_STACK_SIZE = 100;
@ -29,6 +30,7 @@ export default function PromptInput({
sendCommand,
attachments = [],
}) {
const { t } = useTranslation();
const [promptInput, setPromptInput] = useState("");
const { showAgents, setShowAgents } = useAvailableAgents();
const { showSlashCommand, setShowSlashCommand } = useSlashCommands();
@ -272,7 +274,7 @@ export default function PromptInput({
}}
value={promptInput}
className={`border-none cursor-text max-h-[50vh] md:max-h-[350px] md:min-h-[40px] mx-2 md:mx-0 pt-[12px] w-full leading-5 md:text-md text-white bg-transparent placeholder:text-white/60 light:placeholder:text-theme-text-primary resize-none active:outline-none focus:outline-none flex-grow ${textSizeClass}`}
placeholder={"Send a message"}
placeholder={t('chat_window.send_message')}
/>
{buttonDisabled ? (
<StopGenerationButton />
@ -283,8 +285,8 @@ export default function PromptInput({
type="submit"
className="border-none inline-flex justify-center rounded-2xl cursor-pointer opacity-60 hover:opacity-100 light:opacity-100 light:hover:opacity-60 ml-4"
data-tooltip-id="send-prompt"
data-tooltip-content="Send prompt message to workspace"
aria-label="Send prompt message to workspace"
data-tooltip-content={t('chat_window.send')}
aria-label={t('chat_window.send')}
>
<PaperPlaneRight
color="var(--theme-sidebar-footer-icon-fill)"

View file

@ -1,5 +1,5 @@
const TRANSLATIONS = {
common: {
common: {
"workspaces-name": "Name der Arbeitsbereiche",
error: "Fehler",
success: "Erfolg",
@ -479,6 +479,185 @@ const TRANSLATIONS = {
vector: "Vektordatenbank",
anonymous: "Anonyme Telemetrie aktiviert",
},
connectors: {
"search-placeholder": "Datenverbindungen durchsuchen",
"no-connectors": "Keine Datenverbindungen gefunden.",
github: {
name: "GitHub Repository",
description: "Importieren Sie ein öffentliches oder privates Github-Repository mit einem einzigen Klick.",
URL: "GitHub Repo URL",
URL_explained: "URL des GitHub-Repositories, das Sie sammeln möchten.",
token: "Github Zugriffstoken",
optional: "optional",
token_explained: "Zugriffstoken um Ratenlimits zu vermeiden.",
token_explained_start: "Ohne einen ",
token_explained_link1: "persönlichen Zugriffstoken",
token_explained_middle: " kann die GitHub-API aufgrund von Ratenlimits die Anzahl der abrufbaren Dateien einschränken. Sie können ",
token_explained_link2: "einen temporären Zugriffstoken erstellen",
token_explained_end: ", um dieses Problem zu vermeiden.",
ignores: "Datei-Ausschlüsse",
git_ignore: "Liste im .gitignore-Format, um bestimmte Dateien während der Sammlung zu ignorieren. Drücken Sie Enter nach jedem Eintrag, den Sie speichern möchten.",
task_explained: "Sobald der Vorgang abgeschlossen ist, sind alle Dateien im Dokumenten-Picker zur Einbettung in Arbeitsbereiche verfügbar.",
branch: "Branch, von dem Sie Dateien sammeln möchten.",
branch_loading: "-- lade verfügbare Branches --",
branch_explained: "Branch, von dem Sie Dateien sammeln möchten.",
token_information: "Ohne Angabe des <b>Github Zugriffstokens</b> kann dieser Datenkonnektor aufgrund der öffentlichen API-Ratenlimits von GitHub nur die <b>Top-Level</b>-Dateien des Repositories sammeln.",
token_personal: "Holen Sie sich hier einen kostenlosen persönlichen Zugriffstoken mit einem GitHub-Konto."
},
gitlab: {
name: "GitLab Repository",
description: "Importieren Sie ein öffentliches oder privates GitLab-Repository mit einem einzigen Klick.",
URL: "GitLab Repo URL",
URL_explained: "URL des GitLab-Repositories, das Sie sammeln möchten.",
token: "GitLab Zugriffstoken",
optional: "optional",
token_explained: "Zugriffstoken zur Vermeidung von Ratenlimits.",
token_description: "Wählen Sie zusätzliche Entitäten aus, die von der GitLab-API abgerufen werden sollen.",
token_explained_start: "Ohne einen ",
token_explained_link1: "persönlichen Zugriffstoken",
token_explained_middle: " kann die GitLab-API aufgrund von Ratenlimits die Anzahl der abrufbaren Dateien einschränken. Sie können ",
token_explained_link2: "einen temporären Zugriffstoken erstellen",
token_explained_end: ", um dieses Problem zu vermeiden.",
fetch_issues: "Issues als Dokumente abrufen",
ignores: "Datei-Ausschlüsse",
git_ignore: "Liste im .gitignore-Format, um bestimmte Dateien während der Sammlung zu ignorieren. Drücken Sie Enter nach jedem Eintrag, den Sie speichern möchten.",
task_explained: "Sobald der Vorgang abgeschlossen ist, sind alle Dateien im Dokumenten-Picker zur Einbettung in Arbeitsbereiche verfügbar.",
branch: "Branch, von dem Sie Dateien sammeln möchten",
branch_loading: "-- lade verfügbare Branches --",
branch_explained: "Branch, von dem Sie Dateien sammeln möchten.",
token_information: "Ohne Angabe des <b>GitLab Zugriffstokens</b> kann dieser Datenkonnektor aufgrund der öffentlichen API-Ratenlimits von GitLab nur die <b>Top-Level</b>-Dateien des Repositories sammeln.",
token_personal: "Holen Sie sich hier einen kostenlosen persönlichen Zugriffstoken mit einem GitLab-Konto."
},
youtube: {
name: "YouTube Transkript",
description: "Importieren Sie die Transkription eines YouTube-Videos über einen Link.",
URL: "YouTube Video URL",
URL_explained_start: "Geben Sie die URL eines beliebigen YouTube-Videos ein, um dessen Transkript abzurufen. Das Video muss über ",
URL_explained_link: "Untertitel",
URL_explained_end: " verfügen.",
task_explained: "Sobald der Vorgang abgeschlossen ist, ist das Transkript im Dokumenten-Picker zur Einbettung in Arbeitsbereiche verfügbar.",
language: "Transkriptsprache",
language_explained: "Wählen Sie die Sprache des Transkripts aus, das Sie sammeln möchten.",
loading_languages: "-- lade verfügbare Sprachen --"
},
"website-depth": {
name: "Massen-Link-Scraper",
description: "Durchsuchen Sie eine Website und ihre Unterlinks bis zu einer bestimmten Tiefe.",
URL: "Website URL",
URL_explained: "Geben Sie die Start-URL der Website ein, die Sie durchsuchen möchten.",
depth: "Durchsuchungstiefe",
depth_explained: "Das ist die Menge an Unterseiten, die abhängig der originalen URL durchsucht werden sollen.",
max_pages: "Maximale Seitenanzahl",
max_pages_explained: "Maximale Anzahl der zu durchsuchenden Seiten.",
task_explained: "Sobald der Vorgang abgeschlossen ist, sind alle gesammelten Inhalte im Dokumenten-Picker zur Einbettung in Arbeitsbereiche verfügbar."
},
confluence: {
name: "Confluence",
description: "Importieren Sie eine komplette Confluence-Seite mit einem einzigen Klick.",
deployment_type: "Confluence Bereitstellungstyp",
deployment_type_explained: "Bestimmen Sie, ob Ihre Confluence-Instanz in der Atlassian Cloud oder selbst gehostet ist.",
base_url: "Confluence Basis-URL",
base_url_explained: "Dies ist die Basis-URL Ihres Confluence-Bereichs.",
space_key: "Confluence Space-Key",
space_key_explained: "Dies ist der Space-Key Ihrer Confluence-Instanz, der verwendet wird. Beginnt normalerweise mit ~",
username: "Confluence Benutzername",
username_explained: "Ihr Confluence Benutzername.",
token: "Confluence API-Token",
token_explained_start: "Ein ",
token_explained_link1: "persönlicher API-Token",
token_explained_middle: " ist erforderlich, um auf Confluence-Seiten zuzugreifen. Sie können ",
token_explained_link2: "hier einen API-Token erstellen",
token_explained_end: ".",
token_desc: "Zugriffstoken für die Authentifizierung.",
task_explained: "Sobald der Vorgang abgeschlossen ist, ist der Seiteninhalt im Dokumenten-Picker zur Einbettung in Arbeitsbereiche verfügbar."
},
manage: {
documents: "Dokumente",
"data-connectors": "Datenverbindungen",
"desktop-only": "Diese Einstellungen können nur auf einem Desktop-Gerät bearbeitet werden. Bitte rufen Sie diese Seite auf Ihrem Desktop auf, um fortzufahren.",
dismiss: "Schließen",
editing: "Bearbeite",
},
directory: {
"my-documents": "Meine Dokumente",
"new-folder": "Neuer Ordner",
"search-document": "Dokument suchen",
"no-documents": "Keine Dokumente",
"move-workspace": "In Arbeitsbereich verschieben",
name: "Name",
"delete-confirmation": "Sind Sie sicher, dass Sie diese Dateien und Ordner löschen möchten?\nDies wird die Dateien vom System entfernen und sie automatisch aus allen vorhandenen Arbeitsbereichen entfernen.\nDiese Aktion kann nicht rückgängig gemacht werden.",
"removing-message": "Entferne {{count}} Dokumente und {{folderCount}} Ordner. Bitte warten.",
"move-success": "{{count}} Dokumente erfolgreich verschoben.",
date: "Datum",
type: "Typ",
select_all:"Alle auswählen",
deselect_all:"Auswahl abbrechen",
no_docs: "Keine Dokumente vorhanden.",
remove_selected: "Ausgewähltes entfernen",
costs: "*Einmalige Kosten für das Einbetten",
save_embed: "Speichern und Einbetten"
},
upload: {
"processor-offline": "Dokumentenprozessor nicht verfügbar",
"processor-offline-desc": "Wir können Ihre Dateien momentan nicht hochladen, da der Dokumentenprozessor offline ist. Bitte versuchen Sie es später erneut.",
"click-upload": "Klicken Sie zum Hochladen oder ziehen Sie Dateien per Drag & Drop",
"file-types": "unterstützt Textdateien, CSVs, Tabellenkalkulationen, Audiodateien und mehr!",
"or-submit-link": "oder einen Link einreichen",
"placeholder-link": "https://beispiel.de",
"fetching": "Wird abgerufen...",
"fetch-website": "Website abrufen",
"privacy-notice": "Diese Dateien werden zum Dokumentenprozessor hochgeladen, der auf dieser AnythingLLM-Instanz läuft. Diese Dateien werden nicht an Dritte gesendet oder geteilt.",
},
pinning: {
what_pinning: "Was bedeutet es Dokumente anzuheften?",
pin_explained_block1: "Wenn du ein Dokument <b>anheftest</b>, wird den kompletten Inhalt des Dokuments mit deinem Prompt versendet, wodurch das LLM den vollen Kontext besitzt",
pin_explained_block2: "Das funktioniert am besten bei <b>sehr großen Dokumenten</b> sowie für kleine Dokumenten, dessen Inhalt für die Wissensbasis absolut wichtig sind.",
pin_explained_block3: "Wenn du nicht standardmäßig die erwünschten Ergebnisse bekommst, kann das anheften eine gute Methode sein, um Antworten mit einer besseren Qualität mit nur einem Klick zu erhalten.",
accept: "Alles klar, ich habe es verstanden."
},
watching: {
what_watching: "Was bedeutet es ein Dokument zu beobachten?",
watch_explained_block1: "Wenn du ein Dokument <b>beobachtest,</b> werden wir <i>automatisch</i> das Dokument von der Datenquelle in regelmäßigen Abständen aktualisieren. Dadurch wird der Inhalt automatisch in allen Arbeitsbereichen aktualisiert, wo sich das Dokument befindet.",
watch_explained_block2: "Diese Funktion unterstützt aktuell nur Online-Quellen und ist somit nicht verfügbar für selbst hochgeladene Dokumente",
watch_explained_block3_start: "Du kannst im ",
watch_explained_block3_link: "Dateimanager",
watch_explained_block3_end: " entscheiden, welche Dokumente du beobachten möchtest.",
accept: "Alles klar, ich habe es verstanden."
}
},
chat_window:{
welcome: "Willkommen zu deinem Arbeitsbereich.",
get_started: "Starte mit ",
get_started_default: "Starte mit ",
upload: "dem Upload von Dokumenten",
or: " oder ",
send_chat: " schreibe im Chat.",
send_message: "Schreibe eine Nachricht",
attach_file: "Füge eine Datei zum Chat hinzu",
slash: "Schau dir alle verfügbaren Slash Befehle für den Chat an.",
agents: "Schau dir alle verfugbaren Agentenfähigkeiten für den Chat an.",
text_size: "Ändere die Größe des Textes.",
microphone: "Spreche deinen Prompt ein.",
send: "Versende den Prompt an den Arbeitsbereich.",
},
profile_settings:{
edit_account: "Account bearbeiten",
profile_picture: "Profilbild",
remove_profile_picture: "Profilbild entfernen",
username: "Nutzername",
username_description: "Der Nutzername darf nur kleine Buchstaben, Zahlen, Unterstrich und Bindestriche ohne Leerzeichen.",
new_password: "Neues Passwort",
passwort_description: "Das Passwort muss mindestens 8 Zeichen haben.",
cancel: "Abbrechen",
update_account: "Account updaten",
theme: "Bevozugtes Design",
language: "Bevorzugte Sprache",
},
};
export default TRANSLATIONS;

View file

@ -490,6 +490,184 @@ const TRANSLATIONS = {
vector: "Vector Database",
anonymous: "Anonymous Telemetry Enabled",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -482,6 +482,184 @@ const TRANSLATIONS = {
vector: "Base de datos de vectores",
anonymous: "Telemetría anónima habilitada",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -486,6 +486,184 @@ const TRANSLATIONS = {
vector: "پایگاه داده برداری",
anonymous: "ارسال تله‌متری ناشناس فعال است",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -498,6 +498,184 @@ const TRANSLATIONS = {
vector: "Base de données vectorielle",
anonymous: "Télémétrie anonyme activée",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -480,6 +480,184 @@ const TRANSLATIONS = {
vector: "בסיס נתונים וקטור",
anonymous: "טלמטריה אנונימית מופעלת",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -495,6 +495,184 @@ const TRANSLATIONS = {
vector: "Database vettoriale",
anonymous: "Telemetria anonima abilitata",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -480,6 +480,184 @@ const TRANSLATIONS = {
vector: "벡터 데이터베이스",
anonymous: "익명 원격 분석 활성화",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -491,6 +491,184 @@ const TRANSLATIONS = {
vector: "Vector Database",
anonymous: "Anonieme Telemetrie Ingeschakeld",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -493,6 +493,184 @@ const TRANSLATIONS = {
vector: "Banco de Dados Vetorial",
anonymous: "Telemetria Anônima Ativada",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -460,6 +460,184 @@ const TRANSLATIONS = {
vector: "Векторная база данных",
anonymous: "Анонимная телеметрия включена",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -489,6 +489,184 @@ const TRANSLATIONS = {
vector: "Cơ sở dữ liệu Vector",
anonymous: "Anonymous Telemetry Enabled",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -463,6 +463,184 @@ const TRANSLATIONS = {
vector: "向量数据库",
anonymous: "启用匿名遥测",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;

View file

@ -466,6 +466,184 @@ const TRANSLATIONS = {
vector: "向量資料庫",
anonymous: "已啟用匿名統計資訊",
},
connectors: {
"search-placeholder": "Search data connectors",
"no-connectors": "No data connectors found.",
github: {
name: "GitHub Repo",
description: "Import an entire public or private Github repository in a single click.",
URL: "GitHub Repo URL",
URL_explained: "Url of the GitHub repo you wish to collect.",
token: "Github Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitHub API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from.",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>Github Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitHub's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitHub account here."
},
gitlab: {
name: "GitLab Repo",
description: "Import an entire public or private GitLab repository in a single click.",
URL: "GitLab Repo URL",
URL_explained: "URL of the GitLab repo you wish to collect.",
token: "GitLab Access Token",
optional: "optional",
token_explained: "Access Token to prevent rate limiting.",
token_description: "Select additional entities to fetch from the GitLab API.",
token_explained_start: "Without a ",
token_explained_link1: "Personal Access Token",
token_explained_middle: ", the GitLab API may limit the number of files that can be collected due to rate limits. You can ",
token_explained_link2: "create a temporary Access Token",
token_explained_end: " to avoid this issue.",
fetch_issues: "Fetch Issues as Documents",
ignores: "File Ignores",
git_ignore: "List in .gitignore format to ignore specific files during collection. Press enter after each entry you want to save.",
task_explained: "Once complete, all files will be available for embedding into workspaces in the document picker.",
branch: "Branch you wish to collect files from",
branch_loading: "-- loading available branches --",
branch_explained: "Branch you wish to collect files from.",
token_information: "Without filling out the <b>GitLab Access Token</b> this data connector will only be able to collect the <b>top-level</b> files of the repo due to GitLab's public API rate-limits.",
token_personal: "Get a free Personal Access Token with a GitLab account here."
},
youtube: {
name: "YouTube Transcript",
description: "Import the transcription of an entire YouTube video from a link.",
URL: "YouTube Video URL",
URL_explained_start: "Enter the URL of any YouTube video to fetch its transcript. The video must have ",
URL_explained_link: "closed captions",
URL_explained_end: " available.",
task_explained: "Once complete, the transcript will be available for embedding into workspaces in the document picker.",
language: "Transcript Language",
language_explained: "Select the language of the transcript you want to collect.",
loading_languages: "-- loading available languages --"
},
"website-depth": {
name: "Bulk Link Scraper",
description: "Scrape a website and its sub-links up to a certain depth.",
URL: "Website URL",
URL_explained: "URL of the website you want to scrape.",
depth: "Crawl Depth",
depth_explained: "This is the number of child-links that the worker should follow from the origin URL.",
max_pages: "Maximum Pages",
max_pages_explained: "Maximum number of links to scrape.",
task_explained: "Once complete, all scraped content will be available for embedding into workspaces in the document picker."
},
confluence: {
name: "Confluence",
description: "Import an entire Confluence page in a single click.",
deployment_type: "Confluence deployment type",
deployment_type_explained: "Determine if your Confluence instance is hosted on Atlassian cloud or self-hosted.",
base_url: "Confluence base URL",
base_url_explained: "This is the base URL of your Confluence space.",
space_key: "Confluence space key",
space_key_explained: "This is the spaces key of your confluence instance that will be used. Usually begins with ~",
username: "Confluence Username",
username_explained: "Your Confluence username.",
token: "Confluence API Token",
token_explained_start: "A ",
token_explained_link1: "Personal API Token",
token_explained_middle: " is required to access Confluence pages. You can ",
token_explained_link2: "create an API Token here",
token_explained_end: ".",
token_desc: "Access token for authentication.",
task_explained: "Once complete, the page content will be available for embedding into workspaces in the document picker."
},
manage: {
documents: "Documents",
"data-connectors": "Data Connectors",
"desktop-only": "Editing these settings are only available on a desktop device. Please access this page on your desktop to continue.",
dismiss: "Dismiss",
editing: "Editing",
},
directory: {
"my-documents": "My Documents",
"new-folder": "New Folder",
"search-document": "Search for document",
"no-documents": "No Documents",
"move-workspace": "Move to Workspace",
name: "Name",
"delete-confirmation": "Are you sure you want to delete these files and folders?\nThis will remove the files from the system and remove them from any existing workspaces automatically.\nThis action is not reversible.",
"removing-message": "Removing {{count}} documents and {{folderCount}} folders. Please wait.",
"move-success": "Successfully moved {{count}} documents.",
date: "Date",
type: "Type",
no_docs: "No Documents",
select_all:"Select All",
deselect_all:"Deselect All",
remove_selected: "Remove Selected",
costs: "*One time cost for embeddings",
save_embed: "Save and Embed",
},
upload: {
"processor-offline": "Document Processor Unavailable",
"processor-offline-desc": "We can't upload your files right now because the document processor is offline. Please try again later.",
"click-upload": "Click to upload or drag and drop",
"file-types": "supports text files, csv's, spreadsheets, audio files, and more!",
"or-submit-link": "or submit a link",
"placeholder-link": "https://example.com",
"fetching": "Fetching...",
"fetch-website": "Fetch website",
"privacy-notice": "These files will be uploaded to the document processor running on this AnythingLLM instance. These files are not sent or shared with a third party.",
},
pinning: {
what_pinning: "What is document pinning?",
pin_explained_block1: "When you <b>pin</b> a document in AnythingLLM we will inject the entire content of the document into your prompt window for your LLM to fully comprehend.",
pin_explained_block2: "This works best with <b>large-context models</b> or small files that are critical to its knowledge-base.",
pin_explained_block3: "If you are not getting the answers you desire from AnythingLLM by default then pinning is a great way to get higher quality answers in a click.",
accept: "Okay, got it"
},
watching: {
what_watching: "What does watching a document do?",
watch_explained_block1: "When you <b>watch</b> a document in AnythingLLM we will <i>automatically</i> sync your document content from it's original source on regular intervals. This will automatically update the content in every workspace where this file is managed.",
watch_explained_block2: "This feature currently supports online-based content and will not be available for manually uploaded documents.",
watch_explained_block3_start: "You can manage what documents are watched from the ",
watch_explained_block3_link: "File manager",
watch_explained_block3_end: " admin view.",
accept: "Okay, got it"
}
},
chat_window:{
welcome: "Welcome to your new workspace.",
get_started: "To get started either",
get_started_default: "To get started",
upload: "upload a document",
or: "or",
send_chat: "send a chat.",
send_message: "Send a message",
attach_file: "Attach a file to this chat",
slash: "View all available slash commands for chatting.",
agents: "View all available agents you can use for chatting.",
text_size: "Change text size.",
microphone: "Speak your prompt.",
send: "Send prompt message to workspace",
},
profile_settings:{
edit_account: "Edit Account",
profile_picture: "Profile Picture",
remove_profile_picture: "Remove Profile Picture",
username: "Username",
username_description: "Username must be only contain lowercase letters, numbers, underscores, and hyphens with no spaces",
new_password: "New Password",
passwort_description: "Password must be at least 8 characters long",
cancel: "Cancel",
update_account: "Update Account",
theme: "Theme Preference",
language: "Preferred language",
},
};
export default TRANSLATIONS;