+ {/* Assigned Config Summary */}
+ {assignedConfig && (
+
+ )}
+
);
@@ -572,9 +558,7 @@ export function LLMRoleManager({ searchSpaceId }: LLMRoleManagerProps) {
transition={{ duration: 0.2 }}
className="flex items-center justify-between gap-3 rounded-lg border border-border bg-muted/50 p-3 md:p-4"
>
-
{/* Provider + Model */}
@@ -453,14 +450,11 @@ export function ModelConfigManager({ searchSpaceId }: ModelConfigManagerProps) {
{/* Footer: Date + Creator */}
{onEditImage && !isAuto && (
diff --git a/surfsense_web/components/settings/llm-role-manager.tsx b/surfsense_web/components/settings/llm-role-manager.tsx
index cdc84d400..8c6fbf4cf 100644
--- a/surfsense_web/components/settings/llm-role-manager.tsx
+++ b/surfsense_web/components/settings/llm-role-manager.tsx
@@ -503,7 +503,7 @@ export function LLMRoleManager({ searchSpaceId }: LLMRoleManagerProps) {
/>
- Auto Load Balanced
+ Auto Mode
Routes across all available providers
From 68bc12691c54e873b491d4d82e1e55fc35c8ff18 Mon Sep 17 00:00:00 2001
From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com>
Date: Tue, 10 Feb 2026 23:04:27 +0530
Subject: [PATCH 26/34] refactor: improve Alert component styling in
ImageModelManager for better layout and readability
---
.../settings/image-model-manager.tsx | 20 +++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/surfsense_web/components/settings/image-model-manager.tsx b/surfsense_web/components/settings/image-model-manager.tsx
index ef1a20068..25f4e892e 100644
--- a/surfsense_web/components/settings/image-model-manager.tsx
+++ b/surfsense_web/components/settings/image-model-manager.tsx
@@ -348,16 +348,16 @@ export function ImageModelManager({ searchSpaceId }: ImageModelManagerProps) {
{/* Global info */}
{globalConfigs.filter((g) => !("is_auto_mode" in g && g.is_auto_mode)).length > 0 && (
-
-
-
-
- {globalConfigs.filter((g) => !("is_auto_mode" in g && g.is_auto_mode)).length} global
- image model(s)
- {" "}
- available from your administrator.
-
-
+
+
+
+
+ {globalConfigs.filter((g) => !("is_auto_mode" in g && g.is_auto_mode)).length} global
+ image model(s)
+ {" "}
+ available from your administrator.
+
+
)}
{/* Loading Skeleton */}
From cc356010589aa0c86cd15a4482fa44a6716384d3 Mon Sep 17 00:00:00 2001
From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com>
Date: Tue, 10 Feb 2026 23:06:22 +0530
Subject: [PATCH 27/34] chore: ran linting
---
.../settings/image-model-manager.tsx | 20 +++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/surfsense_web/components/settings/image-model-manager.tsx b/surfsense_web/components/settings/image-model-manager.tsx
index 25f4e892e..1e1354718 100644
--- a/surfsense_web/components/settings/image-model-manager.tsx
+++ b/surfsense_web/components/settings/image-model-manager.tsx
@@ -348,16 +348,16 @@ export function ImageModelManager({ searchSpaceId }: ImageModelManagerProps) {
{/* Global info */}
{globalConfigs.filter((g) => !("is_auto_mode" in g && g.is_auto_mode)).length > 0 && (
-
-
-
-
- {globalConfigs.filter((g) => !("is_auto_mode" in g && g.is_auto_mode)).length} global
- image model(s)
- {" "}
- available from your administrator.
-
-
+
+
+
+
+ {globalConfigs.filter((g) => !("is_auto_mode" in g && g.is_auto_mode)).length} global
+ image model(s)
+ {" "}
+ available from your administrator.
+
+
)}
{/* Loading Skeleton */}
From c41a0849458ec414e4a10fba1c367ed951b3bd40 Mon Sep 17 00:00:00 2001
From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com>
Date: Wed, 11 Feb 2026 03:48:46 +0530
Subject: [PATCH 28/34] chore: remove migration script for adding user_id to
new_llm_configs and image_generation_configs
---
...figs.py => 98_add_user_id_to_llm_and_image_configs.py} | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
rename surfsense_backend/alembic/versions/{96_add_user_id_to_llm_and_image_configs.py => 98_add_user_id_to_llm_and_image_configs.py} (97%)
diff --git a/surfsense_backend/alembic/versions/96_add_user_id_to_llm_and_image_configs.py b/surfsense_backend/alembic/versions/98_add_user_id_to_llm_and_image_configs.py
similarity index 97%
rename from surfsense_backend/alembic/versions/96_add_user_id_to_llm_and_image_configs.py
rename to surfsense_backend/alembic/versions/98_add_user_id_to_llm_and_image_configs.py
index 06983f510..07a287231 100644
--- a/surfsense_backend/alembic/versions/96_add_user_id_to_llm_and_image_configs.py
+++ b/surfsense_backend/alembic/versions/98_add_user_id_to_llm_and_image_configs.py
@@ -1,7 +1,7 @@
"""Add user_id to new_llm_configs and image_generation_configs
-Revision ID: 96
-Revises: 95
+Revision ID: 98
+Revises: 97
"""
from collections.abc import Sequence
@@ -9,8 +9,8 @@ from collections.abc import Sequence
from alembic import op
# revision identifiers, used by Alembic.
-revision: str = "96"
-down_revision: str | None = "95"
+revision: str = "98"
+down_revision: str | None = "97"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
From e1da6a61a40f97938231b8e8dc6f00d76ee8402d Mon Sep 17 00:00:00 2001
From: "DESKTOP-RTLN3BA\\$punk"
Date: Tue, 10 Feb 2026 20:34:04 -0800
Subject: [PATCH 29/34] hotpatch(cloud): added SERVICE_ROLE and CELERY_QUEUES
for task seperation
---
surfsense_backend/Dockerfile | 17 +++
surfsense_backend/app/celery_app.py | 33 ++++
.../scripts/docker/entrypoint.sh | 143 +++++++++++++-----
3 files changed, 157 insertions(+), 36 deletions(-)
diff --git a/surfsense_backend/Dockerfile b/surfsense_backend/Dockerfile
index 9ce6467b3..b7b96b6cb 100644
--- a/surfsense_backend/Dockerfile
+++ b/surfsense_backend/Dockerfile
@@ -74,6 +74,23 @@ RUN dos2unix /app/scripts/docker/entrypoint.sh && chmod +x /app/scripts/docker/e
ENV PYTHONPATH=/app
ENV UVICORN_LOOP=asyncio
+# SERVICE_ROLE controls which process this container runs:
+# api – FastAPI backend only (runs migrations on startup)
+# worker – Celery worker only
+# beat – Celery beat scheduler only
+# all – All three (legacy / dev default)
+ENV SERVICE_ROLE=all
+
+# Celery worker tuning (only used when SERVICE_ROLE=worker or all)
+ENV CELERY_MAX_WORKERS=10
+ENV CELERY_MIN_WORKERS=2
+ENV CELERY_MAX_TASKS_PER_CHILD=50
+# CELERY_QUEUES: comma-separated queues to consume (empty = all queues)
+# "surfsense" – fast tasks only (file uploads, podcasts, etc.)
+# "surfsense.connectors" – slow connector indexing tasks only
+# "" – both queues (default, for single-worker setups)
+ENV CELERY_QUEUES=""
+
# Run
EXPOSE 8000-8001
CMD ["/app/scripts/docker/entrypoint.sh"]
\ No newline at end of file
diff --git a/surfsense_backend/app/celery_app.py b/surfsense_backend/app/celery_app.py
index af406eab7..477e5369f 100644
--- a/surfsense_backend/app/celery_app.py
+++ b/surfsense_backend/app/celery_app.py
@@ -86,6 +86,11 @@ celery_app = Celery(
],
)
+# ── Queue names ──────────────────────────────────────────────
+# Default queue : fast, user-facing tasks (file upload, podcast, reindex, …)
+# Connectors queue: slow, long-running indexing tasks (Notion, Gmail, web crawl, …)
+CONNECTORS_QUEUE = f"{CELERY_TASK_DEFAULT_QUEUE}.connectors"
+
# Celery configuration
celery_app.conf.update(
# Task settings
@@ -114,6 +119,34 @@ celery_app.conf.update(
broker_connection_retry_on_startup=True,
# Beat scheduler settings
beat_max_loop_interval=60, # Check every minute
+ # ── Task routing ─────────────────────────────────────────
+ # Route slow connector/indexing tasks to a dedicated queue so they
+ # never block fast user-facing tasks (file uploads, podcasts, etc.)
+ task_routes={
+ # Connector indexing tasks → connectors queue
+ "index_slack_messages": {"queue": CONNECTORS_QUEUE},
+ "index_notion_pages": {"queue": CONNECTORS_QUEUE},
+ "index_github_repos": {"queue": CONNECTORS_QUEUE},
+ "index_linear_issues": {"queue": CONNECTORS_QUEUE},
+ "index_jira_issues": {"queue": CONNECTORS_QUEUE},
+ "index_confluence_pages": {"queue": CONNECTORS_QUEUE},
+ "index_clickup_tasks": {"queue": CONNECTORS_QUEUE},
+ "index_google_calendar_events": {"queue": CONNECTORS_QUEUE},
+ "index_airtable_records": {"queue": CONNECTORS_QUEUE},
+ "index_google_gmail_messages": {"queue": CONNECTORS_QUEUE},
+ "index_google_drive_files": {"queue": CONNECTORS_QUEUE},
+ "index_discord_messages": {"queue": CONNECTORS_QUEUE},
+ "index_teams_messages": {"queue": CONNECTORS_QUEUE},
+ "index_luma_events": {"queue": CONNECTORS_QUEUE},
+ "index_elasticsearch_documents": {"queue": CONNECTORS_QUEUE},
+ "index_crawled_urls": {"queue": CONNECTORS_QUEUE},
+ "index_bookstack_pages": {"queue": CONNECTORS_QUEUE},
+ "index_obsidian_vault": {"queue": CONNECTORS_QUEUE},
+ "index_composio_connector": {"queue": CONNECTORS_QUEUE},
+ "delete_connector_with_documents": {"queue": CONNECTORS_QUEUE},
+ # Everything else (document processing, podcasts, reindexing,
+ # schedule checker, cleanup) stays on the default fast queue.
+ },
)
# Configure Celery Beat schedule
diff --git a/surfsense_backend/scripts/docker/entrypoint.sh b/surfsense_backend/scripts/docker/entrypoint.sh
index f721e4e85..ce0f1ce13 100644
--- a/surfsense_backend/scripts/docker/entrypoint.sh
+++ b/surfsense_backend/scripts/docker/entrypoint.sh
@@ -1,58 +1,129 @@
#!/bin/bash
set -e
-# Function to handle shutdown gracefully
+# ─────────────────────────────────────────────────────────────
+# SERVICE_ROLE controls which process(es) this container runs.
+#
+# api – FastAPI backend only (runs migrations on startup)
+# worker – Celery worker only
+# beat – Celery beat scheduler only
+# all – All three in one container (legacy / dev default)
+#
+# Set SERVICE_ROLE as an environment variable in Coolify for
+# each service deployment.
+# ─────────────────────────────────────────────────────────────
+SERVICE_ROLE="${SERVICE_ROLE:-all}"
+echo "Starting SurfSense with SERVICE_ROLE=${SERVICE_ROLE}"
+
+# ── Autoscale defaults (override via env) ────────────────────
+# CELERY_MAX_WORKERS – max concurrent worker processes
+# CELERY_MIN_WORKERS – min workers kept warm
+# CELERY_QUEUES – comma-separated queues to consume
+# (empty = all queues for backward compat)
+CELERY_MAX_WORKERS="${CELERY_MAX_WORKERS:-10}"
+CELERY_MIN_WORKERS="${CELERY_MIN_WORKERS:-2}"
+CELERY_MAX_TASKS_PER_CHILD="${CELERY_MAX_TASKS_PER_CHILD:-50}"
+CELERY_QUEUES="${CELERY_QUEUES:-}"
+
+# ── Graceful shutdown ────────────────────────────────────────
+PIDS=()
+
cleanup() {
echo "Shutting down services..."
- kill -TERM "$backend_pid" "$celery_worker_pid" "$celery_beat_pid" 2>/dev/null || true
- wait "$backend_pid" "$celery_worker_pid" "$celery_beat_pid" 2>/dev/null || true
+ for pid in "${PIDS[@]}"; do
+ kill -TERM "$pid" 2>/dev/null || true
+ done
+ for pid in "${PIDS[@]}"; do
+ wait "$pid" 2>/dev/null || true
+ done
exit 0
}
trap cleanup SIGTERM SIGINT
-# Run database migrations with safeguards
-echo "Running database migrations..."
-# Wait for database to be ready (max 30 seconds)
-for i in {1..30}; do
- if python -c "from app.db import engine; import asyncio; asyncio.run(engine.dispose())" 2>/dev/null; then
- echo "Database is ready."
- break
+# ── Database migrations (only for api / all) ─────────────────
+run_migrations() {
+ echo "Running database migrations..."
+ for i in {1..30}; do
+ if python -c "from app.db import engine; import asyncio; asyncio.run(engine.dispose())" 2>/dev/null; then
+ echo "Database is ready."
+ break
+ fi
+ echo "Waiting for database... ($i/30)"
+ sleep 1
+ done
+
+ if timeout 60 alembic upgrade head 2>&1; then
+ echo "Migrations completed successfully."
+ else
+ echo "WARNING: Migration failed or timed out. Continuing anyway..."
+ echo "You may need to run migrations manually: alembic upgrade head"
fi
- echo "Waiting for database... ($i/30)"
- sleep 1
-done
+}
-# Run migrations with timeout (60 seconds max)
-if timeout 60 alembic upgrade head 2>&1; then
- echo "Migrations completed successfully."
-else
- echo "WARNING: Migration failed or timed out. Continuing anyway..."
- echo "You may need to run migrations manually: alembic upgrade head"
-fi
+# ── Service starters ─────────────────────────────────────────
+start_api() {
+ echo "Starting FastAPI Backend..."
+ python main.py &
+ PIDS+=($!)
+ echo " FastAPI PID=${PIDS[-1]}"
+}
-echo "Starting FastAPI Backend..."
-python main.py &
-backend_pid=$!
+start_worker() {
+ QUEUE_ARGS=""
+ if [ -n "${CELERY_QUEUES}" ]; then
+ QUEUE_ARGS="--queues=${CELERY_QUEUES}"
+ fi
-# Wait a bit for backend to initialize
-sleep 5
+ echo "Starting Celery Worker (autoscale=${CELERY_MAX_WORKERS},${CELERY_MIN_WORKERS}, max-tasks-per-child=${CELERY_MAX_TASKS_PER_CHILD}, queues=${CELERY_QUEUES:-all})..."
+ celery -A app.celery_app worker \
+ --loglevel=info \
+ --autoscale="${CELERY_MAX_WORKERS},${CELERY_MIN_WORKERS}" \
+ --max-tasks-per-child="${CELERY_MAX_TASKS_PER_CHILD}" \
+ --prefetch-multiplier=1 \
+ -Ofair \
+ ${QUEUE_ARGS} &
+ PIDS+=($!)
+ echo " Celery Worker PID=${PIDS[-1]}"
+}
-echo "Starting Celery Worker..."
-celery -A app.celery_app worker --loglevel=info --autoscale=128,4 &
-celery_worker_pid=$!
+start_beat() {
+ echo "Starting Celery Beat..."
+ celery -A app.celery_app beat --loglevel=info &
+ PIDS+=($!)
+ echo " Celery Beat PID=${PIDS[-1]}"
+}
-# Wait a bit for worker to initialize
-sleep 3
+# ── Main: run based on role ──────────────────────────────────
+case "${SERVICE_ROLE}" in
+ api)
+ run_migrations
+ start_api
+ ;;
+ worker)
+ start_worker
+ ;;
+ beat)
+ start_beat
+ ;;
+ all)
+ run_migrations
+ start_api
+ sleep 5
+ start_worker
+ sleep 3
+ start_beat
+ ;;
+ *)
+ echo "ERROR: Unknown SERVICE_ROLE '${SERVICE_ROLE}'. Use: api, worker, beat, or all"
+ exit 1
+ ;;
+esac
-echo "Starting Celery Beat..."
-celery -A app.celery_app beat --loglevel=info &
-celery_beat_pid=$!
-
-echo "All services started. PIDs: Backend=$backend_pid, Worker=$celery_worker_pid, Beat=$celery_beat_pid"
+echo "All requested services started. PIDs: ${PIDS[*]}"
# Wait for any process to exit
wait -n
-# If we get here, one process exited, so exit with its status
+# If we get here, one process exited unexpectedly
exit $?
From 725c03ab5d2f015a6613757942de89745f83919a Mon Sep 17 00:00:00 2001
From: "DESKTOP-RTLN3BA\\$punk"
Date: Tue, 10 Feb 2026 20:51:43 -0800
Subject: [PATCH 30/34] refactor: wrapped titles in Balancer
---
.../components/homepage/hero-section.tsx | 24 +++++++++----------
1 file changed, 11 insertions(+), 13 deletions(-)
diff --git a/surfsense_web/components/homepage/hero-section.tsx b/surfsense_web/components/homepage/hero-section.tsx
index ef9a529c3..13e1f8eed 100644
--- a/surfsense_web/components/homepage/hero-section.tsx
+++ b/surfsense_web/components/homepage/hero-section.tsx
@@ -85,21 +85,19 @@ export function HeroSection() {
/>
-
- {isNotebookLMVariant ? (
-
-
- NotebookLM with Superpowers
-
+ {isNotebookLMVariant ? (
+
+
+ NotebookLM with Superpowers
- ) : (
-
-
- NotebookLM for Teams
-
+
+ ) : (
+
+
+ NotebookLM for Teams
- )}
-
+
+ )}
{/* // TODO:aCTUAL DESCRITION */}
From f7ccd8ff91c6d4ae37784d26548a323ccd39168b Mon Sep 17 00:00:00 2001
From: "DESKTOP-RTLN3BA\\$punk"
Date: Tue, 10 Feb 2026 21:31:43 -0800
Subject: [PATCH 31/34] chore: linting
---
.../components/homepage/hero-section.tsx | 2 +-
.../components/homepage/integrations.tsx | 2 +-
.../components/icons/providers/index.ts | 2 +-
.../settings/image-model-manager.tsx | 6 +-
.../components/settings/llm-role-manager.tsx | 2 +-
.../settings/model-config-manager.tsx | 4 +-
surfsense_web/lib/provider-icons.tsx | 64 ++++++++++---------
7 files changed, 42 insertions(+), 40 deletions(-)
diff --git a/surfsense_web/components/homepage/hero-section.tsx b/surfsense_web/components/homepage/hero-section.tsx
index 13e1f8eed..b1e8d02bf 100644
--- a/surfsense_web/components/homepage/hero-section.tsx
+++ b/surfsense_web/components/homepage/hero-section.tsx
@@ -85,7 +85,7 @@ export function HeroSection() {
/>
- {isNotebookLMVariant ? (
+ {isNotebookLMVariant ? (
NotebookLM with Superpowers
diff --git a/surfsense_web/components/homepage/integrations.tsx b/surfsense_web/components/homepage/integrations.tsx
index 662387de5..1a4044140 100644
--- a/surfsense_web/components/homepage/integrations.tsx
+++ b/surfsense_web/components/homepage/integrations.tsx
@@ -1,7 +1,7 @@
"use client";
-import type React from "react";
import Image from "next/image";
+import type React from "react";
interface Integration {
name: string;
diff --git a/surfsense_web/components/icons/providers/index.ts b/surfsense_web/components/icons/providers/index.ts
index 73c03a6cc..0a9bdcc66 100644
--- a/surfsense_web/components/icons/providers/index.ts
+++ b/surfsense_web/components/icons/providers/index.ts
@@ -3,7 +3,6 @@ export { default as AnthropicIcon } from "./anthropic.svg";
export { default as AnyscaleIcon } from "./anyscale.svg";
export { default as BedrockIcon } from "./bedrock.svg";
export { default as CerebrasIcon } from "./cerebras.svg";
-export { default as CloudflareIcon } from "./workersai-cloudflare.svg";
export { default as CohereIcon } from "./cohere.svg";
export { default as CometApiIcon } from "./cometapi.svg";
export { default as DatabricksIcon } from "./dbrx.svg";
@@ -26,6 +25,7 @@ export { default as ReplicateIcon } from "./replicate.svg";
export { default as SambaNovaIcon } from "./sambanova.svg";
export { default as TogetherAiIcon } from "./togetherai.svg";
export { default as VertexAiIcon } from "./vertexai.svg";
+export { default as CloudflareIcon } from "./workersai-cloudflare.svg";
export { default as XaiIcon } from "./xai.svg";
export { default as XinferenceIcon } from "./xinference.svg";
export { default as ZhipuIcon } from "./zhipu.svg";
diff --git a/surfsense_web/components/settings/image-model-manager.tsx b/surfsense_web/components/settings/image-model-manager.tsx
index 80828f825..cf7bb5671 100644
--- a/surfsense_web/components/settings/image-model-manager.tsx
+++ b/surfsense_web/components/settings/image-model-manager.tsx
@@ -6,10 +6,10 @@ import {
Check,
ChevronsUpDown,
Edit3,
+ Info,
Key,
Plus,
RefreshCw,
- Info,
Trash2,
Wand2,
} from "lucide-react";
@@ -17,7 +17,6 @@ import { AnimatePresence, motion } from "motion/react";
import Image from "next/image";
import { useCallback, useMemo, useState } from "react";
import { toast } from "sonner";
-import { membersAtom, myAccessAtom } from "@/atoms/members/members-query.atoms";
import {
createImageGenConfigMutationAtom,
deleteImageGenConfigMutationAtom,
@@ -27,6 +26,7 @@ import {
globalImageGenConfigsAtom,
imageGenConfigsAtom,
} from "@/atoms/image-gen-config/image-gen-config-query.atoms";
+import { membersAtom, myAccessAtom } from "@/atoms/members/members-query.atoms";
import { updateLLMPreferencesMutationAtom } from "@/atoms/new-llm-config/new-llm-config-mutation.atoms";
import { Alert, AlertDescription } from "@/components/ui/alert";
import {
@@ -75,8 +75,8 @@ import {
IMAGE_GEN_PROVIDERS,
} from "@/contracts/enums/image-gen-providers";
import type { ImageGenerationConfig } from "@/contracts/types/new-llm-config.types";
-import { cn } from "@/lib/utils";
import { getProviderIcon } from "@/lib/provider-icons";
+import { cn } from "@/lib/utils";
interface ImageModelManagerProps {
searchSpaceId: number;
diff --git a/surfsense_web/components/settings/llm-role-manager.tsx b/surfsense_web/components/settings/llm-role-manager.tsx
index 8c6fbf4cf..051df855b 100644
--- a/surfsense_web/components/settings/llm-role-manager.tsx
+++ b/surfsense_web/components/settings/llm-role-manager.tsx
@@ -41,8 +41,8 @@ import {
SelectValue,
} from "@/components/ui/select";
import { Skeleton } from "@/components/ui/skeleton";
-import { cn } from "@/lib/utils";
import { getProviderIcon } from "@/lib/provider-icons";
+import { cn } from "@/lib/utils";
const ROLE_DESCRIPTIONS = {
agent: {
diff --git a/surfsense_web/components/settings/model-config-manager.tsx b/surfsense_web/components/settings/model-config-manager.tsx
index 7f228ff56..ba3445aad 100644
--- a/surfsense_web/components/settings/model-config-manager.tsx
+++ b/surfsense_web/components/settings/model-config-manager.tsx
@@ -5,10 +5,10 @@ import {
AlertCircle,
Edit3,
FileText,
+ Info,
MessageSquareQuote,
Plus,
RefreshCw,
- Info,
Trash2,
Wand2,
} from "lucide-react";
@@ -51,8 +51,8 @@ import { Skeleton } from "@/components/ui/skeleton";
import { Spinner } from "@/components/ui/spinner";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
import type { NewLLMConfig } from "@/contracts/types/new-llm-config.types";
-import { cn } from "@/lib/utils";
import { getProviderIcon } from "@/lib/provider-icons";
+import { cn } from "@/lib/utils";
interface ModelConfigManagerProps {
searchSpaceId: number;
diff --git a/surfsense_web/lib/provider-icons.tsx b/surfsense_web/lib/provider-icons.tsx
index 11cef5bce..b7f49fe33 100644
--- a/surfsense_web/lib/provider-icons.tsx
+++ b/surfsense_web/lib/provider-icons.tsx
@@ -1,36 +1,38 @@
import { Bot, Shuffle } from "lucide-react";
+import {
+ Ai21Icon,
+ AnthropicIcon,
+ AnyscaleIcon,
+ BedrockIcon,
+ CerebrasIcon,
+ CloudflareIcon,
+ CohereIcon,
+ CometApiIcon,
+ DatabricksIcon,
+ DeepInfraIcon,
+ DeepSeekIcon,
+ FireworksAiIcon,
+ GeminiIcon,
+ GroqIcon,
+ HuggingFaceIcon,
+ MistralIcon,
+ MoonshotIcon,
+ NscaleIcon,
+ OllamaIcon,
+ OpenaiIcon,
+ OpenRouterIcon,
+ PerplexityIcon,
+ QwenIcon,
+ RecraftIcon,
+ ReplicateIcon,
+ SambaNovaIcon,
+ TogetherAiIcon,
+ VertexAiIcon,
+ XaiIcon,
+ XinferenceIcon,
+ ZhipuIcon,
+} from "@/components/icons/providers";
import { cn } from "@/lib/utils";
-import { Ai21Icon } from "@/components/icons/providers";
-import { AnthropicIcon } from "@/components/icons/providers";
-import { AnyscaleIcon } from "@/components/icons/providers";
-import { BedrockIcon } from "@/components/icons/providers";
-import { CerebrasIcon } from "@/components/icons/providers";
-import { CloudflareIcon } from "@/components/icons/providers";
-import { CohereIcon } from "@/components/icons/providers";
-import { CometApiIcon } from "@/components/icons/providers";
-import { DatabricksIcon } from "@/components/icons/providers";
-import { DeepInfraIcon } from "@/components/icons/providers";
-import { DeepSeekIcon } from "@/components/icons/providers";
-import { FireworksAiIcon } from "@/components/icons/providers";
-import { GeminiIcon } from "@/components/icons/providers";
-import { GroqIcon } from "@/components/icons/providers";
-import { HuggingFaceIcon } from "@/components/icons/providers";
-import { MistralIcon } from "@/components/icons/providers";
-import { MoonshotIcon } from "@/components/icons/providers";
-import { NscaleIcon } from "@/components/icons/providers";
-import { OllamaIcon } from "@/components/icons/providers";
-import { OpenaiIcon } from "@/components/icons/providers";
-import { OpenRouterIcon } from "@/components/icons/providers";
-import { PerplexityIcon } from "@/components/icons/providers";
-import { QwenIcon } from "@/components/icons/providers";
-import { RecraftIcon } from "@/components/icons/providers";
-import { ReplicateIcon } from "@/components/icons/providers";
-import { SambaNovaIcon } from "@/components/icons/providers";
-import { TogetherAiIcon } from "@/components/icons/providers";
-import { VertexAiIcon } from "@/components/icons/providers";
-import { XaiIcon } from "@/components/icons/providers";
-import { XinferenceIcon } from "@/components/icons/providers";
-import { ZhipuIcon } from "@/components/icons/providers";
/**
* Returns a Lucide icon element for the given LLM / image-gen provider.
From ef7fa826001eaae5d6d7afd31dbb49bddae49e95 Mon Sep 17 00:00:00 2001
From: "DESKTOP-RTLN3BA\\$punk"
Date: Tue, 10 Feb 2026 22:41:55 -0800
Subject: [PATCH 32/34] hotpatch: update SlowAPI middleware to avoid issues
with StreamingResponse
---
surfsense_backend/app/app.py | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/surfsense_backend/app/app.py b/surfsense_backend/app/app.py
index cdba7c7b7..d62557b94 100644
--- a/surfsense_backend/app/app.py
+++ b/surfsense_backend/app/app.py
@@ -10,7 +10,7 @@ from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from slowapi import Limiter
from slowapi.errors import RateLimitExceeded
-from slowapi.middleware import SlowAPIASGIMiddleware
+from slowapi.middleware import SlowAPIMiddleware
from slowapi.util import get_remote_address
from sqlalchemy.ext.asyncio import AsyncSession
from uvicorn.middleware.proxy_headers import ProxyHeadersMiddleware
@@ -200,9 +200,11 @@ app = FastAPI(lifespan=lifespan)
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
-# Add SlowAPI ASGI middleware for automatic rate limiting
-# This applies default_limits to all routes and enables per-route overrides
-app.add_middleware(SlowAPIASGIMiddleware)
+# Add SlowAPI middleware for automatic rate limiting
+# Uses Starlette BaseHTTPMiddleware (not the raw ASGI variant) to avoid
+# corrupting StreamingResponse — SlowAPIASGIMiddleware re-sends
+# http.response.start on every body chunk, breaking SSE/streaming endpoints.
+app.add_middleware(SlowAPIMiddleware)
# Add ProxyHeaders middleware FIRST to trust proxy headers (e.g., from Cloudflare)
# This ensures FastAPI uses HTTPS in redirects when behind a proxy
From c662bb90cb8b4a6440be90d81986442b26c88ac9 Mon Sep 17 00:00:00 2001
From: "DESKTOP-RTLN3BA\\$punk"
Date: Tue, 10 Feb 2026 22:57:56 -0800
Subject: [PATCH 33/34] feat: add shared temporary directory for file uploads
in Dockerfile
---
surfsense_backend/Dockerfile | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/surfsense_backend/Dockerfile b/surfsense_backend/Dockerfile
index b7b96b6cb..446479ece 100644
--- a/surfsense_backend/Dockerfile
+++ b/surfsense_backend/Dockerfile
@@ -70,6 +70,12 @@ COPY . .
COPY scripts/docker/entrypoint.sh /app/scripts/docker/entrypoint.sh
RUN dos2unix /app/scripts/docker/entrypoint.sh && chmod +x /app/scripts/docker/entrypoint.sh
+# Shared temp directory for file uploads between API and Worker containers.
+# Python's tempfile module uses TMPDIR, so uploaded files land here.
+# Mount the SAME volume at /shared_tmp on both API and Worker in Coolify.
+RUN mkdir -p /shared_tmp
+ENV TMPDIR=/shared_tmp
+
# Prevent uvloop compatibility issues
ENV PYTHONPATH=/app
ENV UVICORN_LOOP=asyncio
From 1daa953e83075f9ba216d1a9b0293e299fce117c Mon Sep 17 00:00:00 2001
From: "DESKTOP-RTLN3BA\\$punk"
Date: Wed, 11 Feb 2026 00:39:01 -0800
Subject: [PATCH 34/34] feat: add support for additional languages in
LanguageSwitcher and SidebarUserProfile components
---
surfsense_web/components/LanguageSwitcher.tsx | 5 +-
.../layout/ui/sidebar/SidebarUserProfile.tsx | 5 +-
surfsense_web/contexts/LocaleContext.tsx | 19 +-
surfsense_web/i18n/routing.ts | 2 +-
surfsense_web/messages/es.json | 818 ++++++++++++++++++
surfsense_web/messages/hi.json | 818 ++++++++++++++++++
surfsense_web/messages/pt.json | 818 ++++++++++++++++++
7 files changed, 2478 insertions(+), 7 deletions(-)
create mode 100644 surfsense_web/messages/es.json
create mode 100644 surfsense_web/messages/hi.json
create mode 100644 surfsense_web/messages/pt.json
diff --git a/surfsense_web/components/LanguageSwitcher.tsx b/surfsense_web/components/LanguageSwitcher.tsx
index 76ab452cb..6fdef4ca0 100644
--- a/surfsense_web/components/LanguageSwitcher.tsx
+++ b/surfsense_web/components/LanguageSwitcher.tsx
@@ -21,6 +21,9 @@ export function LanguageSwitcher() {
// Supported languages configuration
const languages = [
{ code: "en" as const, name: "English", flag: "🇺🇸" },
+ { code: "es" as const, name: "Español", flag: "🇪🇸" },
+ { code: "pt" as const, name: "Português", flag: "🇧🇷" },
+ { code: "hi" as const, name: "हिन्दी", flag: "🇮🇳" },
{ code: "zh" as const, name: "简体中文", flag: "🇨🇳" },
];
@@ -29,7 +32,7 @@ export function LanguageSwitcher() {
* Updates locale in context and localStorage
*/
const handleLanguageChange = (newLocale: string) => {
- setLocale(newLocale as "en" | "zh");
+ setLocale(newLocale as "en" | "es" | "pt" | "hi" | "zh");
};
return (
diff --git a/surfsense_web/components/layout/ui/sidebar/SidebarUserProfile.tsx b/surfsense_web/components/layout/ui/sidebar/SidebarUserProfile.tsx
index ea9b0189c..a30b3e626 100644
--- a/surfsense_web/components/layout/ui/sidebar/SidebarUserProfile.tsx
+++ b/surfsense_web/components/layout/ui/sidebar/SidebarUserProfile.tsx
@@ -24,6 +24,9 @@ import type { User } from "../../types/layout.types";
// Supported languages configuration
const LANGUAGES = [
{ code: "en" as const, name: "English", flag: "🇺🇸" },
+ { code: "es" as const, name: "Español", flag: "🇪🇸" },
+ { code: "pt" as const, name: "Português", flag: "🇧🇷" },
+ { code: "hi" as const, name: "हिन्दी", flag: "🇮🇳" },
{ code: "zh" as const, name: "简体中文", flag: "🇨🇳" },
];
@@ -131,7 +134,7 @@ export function SidebarUserProfile({
const initials = getInitials(user.email);
const displayName = user.name || user.email.split("@")[0];
- const handleLanguageChange = (newLocale: "en" | "zh") => {
+ const handleLanguageChange = (newLocale: "en" | "es" | "pt" | "hi" | "zh") => {
setLocale(newLocale);
};
diff --git a/surfsense_web/contexts/LocaleContext.tsx b/surfsense_web/contexts/LocaleContext.tsx
index 30d2b2e80..5b41385e0 100644
--- a/surfsense_web/contexts/LocaleContext.tsx
+++ b/surfsense_web/contexts/LocaleContext.tsx
@@ -3,9 +3,20 @@
import type React from "react";
import { createContext, useContext, useEffect, useState } from "react";
import enMessages from "../messages/en.json";
+import esMessages from "../messages/es.json";
+import ptMessages from "../messages/pt.json";
+import hiMessages from "../messages/hi.json";
import zhMessages from "../messages/zh.json";
-type Locale = "en" | "zh";
+type Locale = "en" | "es" | "pt" | "hi" | "zh";
+
+const messagesMap: Record = {
+ en: enMessages,
+ es: esMessages as typeof enMessages,
+ pt: ptMessages as typeof enMessages,
+ hi: hiMessages as typeof enMessages,
+ zh: zhMessages as typeof enMessages,
+};
interface LocaleContextType {
locale: Locale;
@@ -24,15 +35,15 @@ export function LocaleProvider({ children }: { children: React.ReactNode }) {
const [mounted, setMounted] = useState(false);
// Get messages based on current locale
- const messages = locale === "zh" ? zhMessages : enMessages;
+ const messages = messagesMap[locale] || enMessages;
// Load locale from localStorage after component mounts (client-side only)
useEffect(() => {
setMounted(true);
if (typeof window !== "undefined") {
const stored = localStorage.getItem(LOCALE_STORAGE_KEY);
- if (stored === "zh") {
- setLocaleState("zh");
+ if (stored && (["en", "es", "pt", "hi", "zh"] as const).includes(stored as Locale)) {
+ setLocaleState(stored as Locale);
}
}
}, []);
diff --git a/surfsense_web/i18n/routing.ts b/surfsense_web/i18n/routing.ts
index 5017b4be1..d709ff62a 100644
--- a/surfsense_web/i18n/routing.ts
+++ b/surfsense_web/i18n/routing.ts
@@ -7,7 +7,7 @@ import { defineRouting } from "next-intl/routing";
*/
export const routing = defineRouting({
// A list of all locales that are supported
- locales: ["en", "zh"],
+ locales: ["en", "es", "pt", "hi", "zh"],
// Used when no locale matches
defaultLocale: "en",
diff --git a/surfsense_web/messages/es.json b/surfsense_web/messages/es.json
new file mode 100644
index 000000000..9db0a99c9
--- /dev/null
+++ b/surfsense_web/messages/es.json
@@ -0,0 +1,818 @@
+{
+ "common": {
+ "app_name": "SurfSense",
+ "welcome": "Bienvenido",
+ "save": "Guardar",
+ "cancel": "Cancelar",
+ "delete": "Eliminar",
+ "edit": "Editar",
+ "create": "Crear",
+ "update": "Actualizar",
+ "search": "Buscar",
+ "close": "Cerrar",
+ "confirm": "Confirmar",
+ "back": "Volver",
+ "next": "Siguiente",
+ "submit": "Enviar",
+ "yes": "Sí",
+ "no": "No",
+ "add": "Agregar",
+ "remove": "Eliminar",
+ "select": "Seleccionar",
+ "all": "Todo",
+ "none": "Ninguno",
+ "error": "Error",
+ "success": "Éxito",
+ "warning": "Advertencia",
+ "info": "Información",
+ "required": "Obligatorio",
+ "optional": "Opcional",
+ "retry": "Reintentar",
+ "owner": "Propietario",
+ "shared": "Compartido",
+ "settings": "Configuración"
+ },
+ "auth": {
+ "login": "Iniciar sesión",
+ "register": "Registrarse",
+ "logout": "Cerrar sesión",
+ "email": "Correo electrónico",
+ "password": "Contraseña",
+ "confirm_password": "Confirmar contraseña",
+ "forgot_password": "¿Olvidaste tu contraseña?",
+ "show_password": "Mostrar contraseña",
+ "hide_password": "Ocultar contraseña",
+ "remember_me": "Recuérdame",
+ "sign_in": "Iniciar sesión",
+ "signing_in": "Iniciando sesión",
+ "sign_up": "Registrarse",
+ "sign_in_with": "Iniciar sesión con {provider}",
+ "dont_have_account": "¿No tienes una cuenta?",
+ "already_have_account": "¿Ya tienes una cuenta?",
+ "reset_password": "Restablecer contraseña",
+ "email_required": "El correo electrónico es obligatorio",
+ "password_required": "La contraseña es obligatoria",
+ "invalid_email": "Dirección de correo electrónico inválida",
+ "password_too_short": "La contraseña debe tener al menos 8 caracteres",
+ "welcome_back": "Bienvenido de nuevo",
+ "create_account": "Crea tu cuenta",
+ "login_subtitle": "Ingresa tus credenciales para acceder a tu cuenta",
+ "register_subtitle": "Regístrate para comenzar con SurfSense",
+ "or_continue_with": "O continuar con",
+ "by_continuing": "Al continuar, aceptas nuestros",
+ "terms_of_service": "Términos de servicio",
+ "and": "y",
+ "privacy_policy": "Política de privacidad",
+ "full_name": "Nombre completo",
+ "username": "Nombre de usuario",
+ "continue": "Continuar",
+ "back_to_login": "Volver al inicio de sesión",
+ "login_success": "Sesión iniciada correctamente",
+ "register_success": "Cuenta creada correctamente",
+ "continue_with_google": "Continuar con Google",
+ "cloud_dev_notice": "SurfSense Cloud está actualmente en desarrollo. Consulta",
+ "docs": "Documentación",
+ "cloud_dev_self_hosted": "para más información sobre la versión autoalojada.",
+ "passwords_no_match": "Las contraseñas no coinciden",
+ "password_mismatch": "Las contraseñas no coinciden",
+ "passwords_no_match_desc": "Las contraseñas que ingresaste no coinciden",
+ "creating_account": "Creando tu cuenta",
+ "creating_account_btn": "Creando cuenta",
+ "redirecting_login": "Redirigiendo a la página de inicio de sesión"
+ },
+ "searchSpace": {
+ "create_title": "Crear espacio de búsqueda",
+ "create_description": "Crea un nuevo espacio de búsqueda para organizar tu conocimiento",
+ "name_label": "Nombre",
+ "name_placeholder": "Ingresa el nombre del espacio de búsqueda",
+ "description_label": "Descripción",
+ "description_placeholder": "¿Para qué es este espacio de búsqueda?",
+ "create_button": "Crear",
+ "creating": "Creando",
+ "all_search_spaces": "Todos los espacios de búsqueda",
+ "search_spaces_count": "{count, plural, =0 {Sin espacios de búsqueda} =1 {1 espacio de búsqueda} other {# espacios de búsqueda}}",
+ "no_search_spaces": "Aún no hay espacios de búsqueda",
+ "create_first_search_space": "Crea tu primer espacio de búsqueda para comenzar",
+ "members_count": "{count, plural, =1 {1 miembro} other {# miembros}}",
+ "create_new_search_space": "Crear nuevo espacio de búsqueda",
+ "delete_title": "Eliminar espacio de búsqueda",
+ "delete_confirm": "¿Estás seguro de que deseas eliminar \"{name}\"? Esta acción no se puede deshacer y eliminará permanentemente todos los datos.",
+ "leave": "Salir",
+ "leave_title": "Salir del espacio de búsqueda",
+ "leave_confirm": "¿Estás seguro de que deseas salir de \"{name}\"? Perderás acceso a todos los documentos y chats en este espacio de búsqueda.",
+ "leaving": "Saliendo...",
+ "welcome_title": "Bienvenido a SurfSense",
+ "welcome_description": "Crea tu primer espacio de búsqueda para comenzar a organizar tu conocimiento, conectar fuentes y chatear con IA.",
+ "create_first_button": "Crea tu primer espacio de búsqueda"
+ },
+ "userSettings": {
+ "title": "Configuración de usuario",
+ "description": "Administra tu configuración de cuenta y acceso a la API",
+ "back_to_app": "Volver a la app",
+ "profile_nav_label": "Perfil",
+ "profile_nav_description": "Administra tu nombre y avatar",
+ "profile_title": "Perfil",
+ "profile_description": "Actualiza tu información personal",
+ "profile_avatar": "Foto de perfil",
+ "profile_display_name": "Nombre para mostrar",
+ "profile_display_name_hint": "Así aparecerá tu nombre en la aplicación",
+ "profile_email": "Correo electrónico",
+ "profile_save": "Guardar cambios",
+ "profile_saved": "Perfil actualizado correctamente",
+ "profile_save_error": "Error al actualizar el perfil",
+ "api_key_nav_label": "Clave API",
+ "api_key_nav_description": "Administra tu token de acceso a la API",
+ "api_key_title": "Clave API",
+ "api_key_description": "Usa esta clave para autenticar las solicitudes de la API",
+ "api_key_warning_title": "Mantenla en secreto",
+ "api_key_warning_description": "Tu clave API otorga acceso completo a tu cuenta. Nunca la compartas públicamente ni la incluyas en el control de versiones.",
+ "your_api_key": "Tu clave API",
+ "copied": "¡Copiado!",
+ "copy": "Copiar al portapapeles",
+ "no_api_key": "No se encontró clave API",
+ "usage_title": "Cómo usar",
+ "usage_description": "Incluye tu clave API en el encabezado de Authorization:"
+ },
+ "dashboard": {
+ "title": "Panel de control",
+ "search_spaces": "Espacios de búsqueda",
+ "documents": "Documentos",
+ "connectors": "Conectores",
+ "settings": "Configuración",
+ "chat": "Chat",
+ "api_keys": "Claves API",
+ "profile": "Perfil",
+ "loading_dashboard": "Cargando panel de control",
+ "loading_config": "Cargando configuración",
+ "config_error": "Error de configuración",
+ "failed_load_llm_config": "No se pudo cargar tu configuración de LLM",
+ "error_loading_chats": "Error al cargar chats",
+ "loading_chat": "Cargando chat",
+ "loading_document": "Cargando documento",
+ "no_recent_chats": "No hay chats recientes",
+ "error_loading_space": "Error al cargar el espacio de búsqueda",
+ "unknown_search_space": "Espacio de búsqueda desconocido",
+ "delete_chat": "Eliminar chat",
+ "delete_chat_confirm": "¿Estás seguro de que deseas eliminar",
+ "delete_note": "Eliminar nota",
+ "delete_note_confirm": "¿Estás seguro de que deseas eliminar",
+ "action_cannot_undone": "Esta acción no se puede deshacer.",
+ "deleting": "Eliminando",
+ "surfsense_dashboard": "Panel de SurfSense",
+ "welcome_message": "Bienvenido a tu panel de SurfSense.",
+ "your_search_spaces": "Tus espacios de búsqueda",
+ "shared": "Compartido",
+ "create_search_space": "Crear espacio de búsqueda",
+ "add_new_search_space": "Agregar nuevo espacio de búsqueda",
+ "loading": "Cargando",
+ "may_take_moment": "Esto puede tomar un momento",
+ "error": "Error",
+ "something_wrong": "Algo salió mal",
+ "error_details": "Detalles del error",
+ "try_again": "Intentar de nuevo",
+ "go_home": "Ir al inicio",
+ "delete_search_space": "Eliminar espacio de búsqueda",
+ "delete_space_confirm": "¿Estás seguro de que deseas eliminar \"{name}\"? Esta acción no se puede deshacer. Todos los documentos y chats en este espacio de búsqueda se eliminarán permanentemente.",
+ "leave": "Salir",
+ "leave_title": "Salir del espacio de búsqueda",
+ "leave_confirm": "¿Estás seguro de que deseas salir de \"{name}\"? Perderás acceso a todos los documentos y chats en este espacio de búsqueda.",
+ "leaving": "Saliendo...",
+ "no_spaces_found": "No se encontraron espacios de búsqueda",
+ "create_first_space": "Crea tu primer espacio de búsqueda para comenzar",
+ "created": "Creado"
+ },
+ "navigation": {
+ "home": "Inicio",
+ "docs": "Documentación",
+ "pricing": "Precios",
+ "contact": "Contacto",
+ "login": "Iniciar sesión",
+ "register": "Registrarse",
+ "dashboard": "Panel de control",
+ "sign_in": "Iniciar sesión",
+ "book_a_call": "Agendar una llamada"
+ },
+ "nav_menu": {
+ "settings": "Configuración",
+ "platform": "Plataforma",
+ "chat": "Chat",
+ "manage_llms": "Administrar LLMs",
+ "sources": "Fuentes",
+ "add_sources": "Agregar fuentes",
+ "documents": "Documentos",
+ "upload_documents": "Subir documentos",
+ "add_webpages": "Agregar páginas web",
+ "add_youtube": "Agregar videos de YouTube",
+ "add_youtube_videos": "Agregar videos de YouTube",
+ "manage_documents": "Administrar documentos",
+ "connectors": "Conectores",
+ "add_connector": "Agregar conector",
+ "manage_connectors": "Administrar conectores",
+ "logs": "Registros",
+ "all_search_spaces": "Todos los espacios de búsqueda",
+ "team": "Equipo"
+ },
+ "pricing": {
+ "title": "Precios de SurfSense",
+ "subtitle": "Elige lo que funcione para ti",
+ "community_name": "COMUNIDAD",
+ "enterprise_name": "EMPRESA",
+ "forever": "para siempre",
+ "contact_us": "Contáctanos",
+ "feature_llms": "Soporta más de 100 LLMs",
+ "feature_ollama": "Soporta configuraciones locales de Ollama o vLLM",
+ "feature_embeddings": "Más de 6000 modelos de embeddings",
+ "feature_files": "Más de 50 extensiones de archivo soportadas.",
+ "feature_podcasts": "Soporte de podcasts con proveedores TTS locales.",
+ "feature_sources": "Se conecta con más de 15 fuentes externas.",
+ "feature_extension": "Extensión para múltiples navegadores para páginas web dinámicas incluyendo contenido autenticado",
+ "upcoming_mindmaps": "Próximamente: Mapas mentales combinables",
+ "upcoming_notes": "Próximamente: Gestión de notas",
+ "community_desc": "Versión de código abierto con funciones potentes",
+ "get_started": "Comenzar",
+ "everything_community": "Todo lo de Comunidad",
+ "priority_support": "Soporte prioritario",
+ "access_controls": "Controles de acceso",
+ "collaboration": "Colaboración y funciones multijugador",
+ "video_gen": "Generación de video",
+ "advanced_security": "Funciones de seguridad avanzadas",
+ "enterprise_desc": "Para grandes organizaciones con necesidades específicas",
+ "contact_sales": "Contactar ventas"
+ },
+ "contact": {
+ "title": "Contacto",
+ "subtitle": "Nos encantaría saber de ti.",
+ "we_are_here": "Estamos aquí",
+ "full_name": "Nombre completo",
+ "email_address": "Dirección de correo electrónico",
+ "company": "Empresa",
+ "message": "Mensaje",
+ "optional": "opcional",
+ "name_placeholder": "Juan Pérez",
+ "email_placeholder": "juan.perez@ejemplo.com",
+ "company_placeholder": "Ejemplo S.A.",
+ "message_placeholder": "Escribe tu mensaje aquí",
+ "submit": "Enviar",
+ "submitting": "Enviando...",
+ "name_required": "El nombre es obligatorio",
+ "name_too_long": "El nombre es demasiado largo",
+ "invalid_email": "Dirección de correo electrónico inválida",
+ "email_too_long": "El correo electrónico es demasiado largo",
+ "company_required": "La empresa es obligatoria",
+ "company_too_long": "El nombre de la empresa es demasiado largo",
+ "message_sent": "¡Mensaje enviado correctamente!",
+ "we_will_contact": "Nos pondremos en contacto contigo lo antes posible.",
+ "send_failed": "Error al enviar el mensaje",
+ "try_again_later": "Por favor, inténtalo de nuevo más tarde.",
+ "something_wrong": "Algo salió mal"
+ },
+ "connectors": {
+ "title": "Conectores",
+ "subtitle": "Administra tus servicios conectados y fuentes de datos.",
+ "add_connector": "Agregar conector",
+ "your_connectors": "Tus conectores",
+ "view_manage": "Ver y administrar todos tus servicios conectados.",
+ "no_connectors": "No se encontraron conectores",
+ "no_connectors_desc": "Aún no has agregado ningún conector. Agrega uno para mejorar tus capacidades de búsqueda.",
+ "add_first": "Agrega tu primer conector",
+ "name": "Nombre",
+ "type": "Tipo",
+ "last_indexed": "Última indexación",
+ "periodic": "Periódico",
+ "actions": "Acciones",
+ "never": "Nunca",
+ "not_indexable": "No indexable",
+ "index_date_range": "Indexar con rango de fechas",
+ "quick_index": "Indexación rápida",
+ "quick_index_auto": "Indexación rápida (rango de fechas automático)",
+ "delete_connector": "Eliminar conector",
+ "delete_confirm": "¿Estás seguro de que deseas eliminar este conector? Esta acción no se puede deshacer.",
+ "select_date_range": "Seleccionar rango de fechas para indexación",
+ "select_date_range_desc": "Elige las fechas de inicio y fin para indexar contenido. Déjalo vacío para usar el rango predeterminado.",
+ "start_date": "Fecha de inicio",
+ "end_date": "Fecha de fin",
+ "pick_date": "Seleccionar fecha",
+ "clear_dates": "Limpiar fechas",
+ "last_30_days": "Últimos 30 días",
+ "last_year": "Último año",
+ "start_indexing": "Iniciar indexación",
+ "failed_load": "Error al cargar los conectores",
+ "delete_success": "Conector eliminado correctamente",
+ "delete_failed": "Error al eliminar el conector",
+ "indexing_started": "Indexación del contenido del conector iniciada",
+ "indexing_failed": "Error al indexar el contenido del conector"
+ },
+ "documents": {
+ "title": "Documentos",
+ "subtitle": "Administra tus documentos y archivos.",
+ "no_rows_selected": "No hay filas seleccionadas",
+ "delete_success_count": "Se eliminaron correctamente {count} documento(s)",
+ "delete_partial_failed": "Algunos documentos no se pudieron eliminar",
+ "delete_success": "Documento eliminado correctamente",
+ "delete_error": "Error al eliminar documentos",
+ "filter_by_title": "Filtrar por título...",
+ "bulk_delete": "Eliminar seleccionados",
+ "filter_types": "Filtrar tipos",
+ "columns": "Columnas",
+ "confirm_delete": "Confirmar eliminación",
+ "confirm_delete_desc": "¿Estás seguro de que deseas eliminar {count} documento(s)? Esta acción no se puede deshacer.",
+ "uploading": "Subiendo",
+ "upload_success": "Documento subido correctamente",
+ "upload_failed": "Error al subir el documento",
+ "loading": "Cargando documentos",
+ "error_loading": "Error al cargar documentos",
+ "retry": "Reintentar",
+ "no_documents": "No se encontraron documentos",
+ "type": "Tipo",
+ "content_summary": "Resumen del contenido",
+ "view_full": "Ver resumen",
+ "filter_placeholder": "Filtrar por título...",
+ "rows_per_page": "Filas por página",
+ "refresh": "Actualizar",
+ "upload_documents": "Subir documentos",
+ "create_shared_note": "Crear nota compartida",
+ "processing_documents": "Procesando documentos...",
+ "active_tasks_count": "{count} tarea(s) activa(s)"
+ },
+ "add_connector": {
+ "title": "Conecta tus herramientas",
+ "subtitle": "Integra con tus servicios favoritos para mejorar tus capacidades de investigación.",
+ "web_search": "Búsqueda web",
+ "messaging": "Mensajería",
+ "project_management": "Gestión de proyectos",
+ "documentation": "Documentación",
+ "development": "Desarrollo",
+ "databases": "Bases de datos",
+ "productivity": "Productividad",
+ "web_crawling": "Rastreo web",
+ "connect": "Conectar",
+ "coming_soon": "Próximamente",
+ "connected": "Conectado",
+ "manage": "Administrar",
+ "tavily_desc": "Busca en la web usando la API de Tavily",
+ "searxng_desc": "Usa tu propia instancia de SearxNG para resultados web.",
+ "linkup_desc": "Busca en la web usando la API de Linkup",
+ "elasticsearch_desc": "Conéctate a Elasticsearch para indexar y buscar documentos, registros y métricas.",
+ "baidu_desc": "Busca en la web china usando la API de Baidu AI Search",
+ "slack_desc": "Conéctate a tu espacio de trabajo de Slack para acceder a mensajes y canales.",
+ "teams_desc": "Conéctate a Microsoft Teams para acceder a las conversaciones de tu equipo.",
+ "discord_desc": "Conéctate a servidores de Discord para acceder a mensajes y canales.",
+ "linear_desc": "Conéctate a Linear para buscar problemas, comentarios y datos de proyectos.",
+ "jira_desc": "Conéctate a Jira para buscar problemas, tickets y datos de proyectos.",
+ "clickup_desc": "Conéctate a ClickUp para buscar tareas, comentarios y datos de proyectos.",
+ "notion_desc": "Conéctate a tu espacio de trabajo de Notion para acceder a páginas y bases de datos.",
+ "github_desc": "Conecta un PAT de GitHub para indexar código y documentos de repositorios accesibles.",
+ "confluence_desc": "Conéctate a Confluence para buscar páginas, comentarios y documentación.",
+ "bookstack_desc": "Conéctate a BookStack para buscar páginas wiki y documentación.",
+ "airtable_desc": "Conéctate a Airtable para buscar registros, tablas y contenido de bases de datos.",
+ "luma_desc": "Conéctate a Luma para buscar eventos, encuentros y reuniones.",
+ "circleback_desc": "Recibe notas de reuniones, transcripciones y elementos de acción de Circleback vía webhook.",
+ "calendar_desc": "Conéctate a Google Calendar para buscar eventos, reuniones y horarios.",
+ "gmail_desc": "Conéctate a tu cuenta de Gmail para buscar en tus correos electrónicos.",
+ "google_drive_desc": "Conéctate a Google Drive para buscar e indexar tus archivos y documentos.",
+ "zoom_desc": "Conéctate a Zoom para acceder a grabaciones y transcripciones de reuniones.",
+ "webcrawler_desc": "Rastrea e indexa contenido de cualquier página web pública."
+ },
+ "upload_documents": {
+ "title": "Subir documentos",
+ "subtitle": "Sube tus archivos para hacerlos buscables y accesibles a través de conversaciones con IA.",
+ "file_size_limit": "Tamaño máximo de archivo: 50 MB por archivo.",
+ "upload_limits": "Límite de subida: {maxFiles} archivos, {maxSizeMB} MB en total.",
+ "drop_files": "Suelta los archivos aquí",
+ "drag_drop": "Arrastra y suelta archivos aquí",
+ "or_browse": "o haz clic para explorar",
+ "browse_files": "Explorar archivos",
+ "selected_files": "Archivos seleccionados ({count})",
+ "total_size": "Tamaño total",
+ "clear_all": "Limpiar todo",
+ "uploading_files": "Subiendo archivos",
+ "uploading": "Subiendo",
+ "upload_button": "Subir {count} {count, plural, one {archivo} other {archivos}}",
+ "upload_initiated": "Tarea de subida iniciada",
+ "upload_initiated_desc": "La subida de archivos ha comenzado",
+ "upload_error": "Error de subida",
+ "upload_error_desc": "Error al subir archivos",
+ "supported_file_types": "Tipos de archivo soportados",
+ "file_types_desc": "Estos tipos de archivo son soportados según la configuración actual de tu servicio ETL.",
+ "max_files_exceeded": "Límite de archivos excedido",
+ "max_files_exceeded_desc": "Puedes subir un máximo de {max} archivos a la vez.",
+ "max_size_exceeded": "Límite de tamaño excedido",
+ "max_size_exceeded_desc": "El tamaño total de los archivos no puede exceder {max} MB.",
+ "file_limit_reached": "Máximo de archivos alcanzado",
+ "file_limit_reached_desc": "Elimina algunos archivos para agregar más (máximo {max} archivos).",
+ "remaining_capacity": "{files} archivos restantes • {sizeMB} MB disponibles"
+ },
+ "add_webpage": {
+ "title": "Agregar páginas web para rastreo",
+ "subtitle": "Ingresa URLs para rastrear y agregar a tu colección de documentos",
+ "label": "Ingresa URLs para rastrear",
+ "placeholder": "Ingresa una URL y presiona Enter",
+ "hint": "Agrega múltiples URLs presionando Enter después de cada una",
+ "tips_title": "Consejos para el rastreo de URLs:",
+ "tip_1": "Ingresa URLs completas incluyendo http:// o https://",
+ "tip_2": "Asegúrate de que los sitios web permitan el rastreo",
+ "tip_3": "Las páginas web públicas funcionan mejor",
+ "tip_4": "El rastreo puede tomar un tiempo dependiendo del tamaño del sitio web",
+ "cancel": "Cancelar",
+ "submit": "Enviar URLs para rastreo",
+ "submitting": "Enviando...",
+ "error_no_url": "Por favor agrega al menos una URL",
+ "error_invalid_urls": "URLs inválidas detectadas: {urls}",
+ "crawling_toast": "Rastreo de URL",
+ "crawling_toast_desc": "Iniciando proceso de rastreo de URL...",
+ "success_toast": "Rastreo exitoso",
+ "success_toast_desc": "Las URLs han sido enviadas para rastreo",
+ "error_toast": "Error de rastreo",
+ "error_toast_desc": "Error al rastrear URLs",
+ "error_generic": "Ocurrió un error al rastrear URLs",
+ "invalid_url_toast": "URL inválida",
+ "invalid_url_toast_desc": "Por favor ingresa una URL válida",
+ "duplicate_url_toast": "URL duplicada",
+ "duplicate_url_toast_desc": "Esta URL ya ha sido agregada"
+ },
+ "add_youtube": {
+ "title": "Agregar videos de YouTube",
+ "subtitle": "Ingresa URLs de videos de YouTube para agregar a tu colección de documentos",
+ "label": "Ingresa URLs de videos de YouTube",
+ "placeholder": "Ingresa una URL de YouTube y presiona Enter",
+ "hint": "Agrega múltiples URLs de YouTube presionando Enter después de cada una",
+ "tips_title": "Consejos para agregar videos de YouTube:",
+ "tip_1": "Usa URLs estándar de YouTube (youtube.com/watch?v= o youtu.be/)",
+ "tip_2": "Asegúrate de que los videos sean accesibles públicamente",
+ "tip_3": "Formatos soportados: youtube.com/watch?v=VIDEO_ID o youtu.be/VIDEO_ID",
+ "tip_4": "El procesamiento puede tomar un tiempo dependiendo de la duración del video",
+ "preview": "Vista previa",
+ "cancel": "Cancelar",
+ "submit": "Agregar",
+ "processing": "Procesando...",
+ "error_no_video": "Por favor agrega al menos una URL de video de YouTube",
+ "error_invalid_urls": "URLs de YouTube inválidas detectadas: {urls}",
+ "processing_toast": "Procesamiento de video de YouTube",
+ "processing_toast_desc": "Iniciando procesamiento de video de YouTube...",
+ "success_toast": "Procesamiento exitoso",
+ "success_toast_desc": "Los videos de YouTube han sido enviados para procesamiento",
+ "error_toast": "Error de procesamiento",
+ "error_toast_desc": "Error al procesar videos de YouTube",
+ "error_generic": "Ocurrió un error al procesar videos de YouTube",
+ "invalid_url_toast": "URL de YouTube inválida",
+ "invalid_url_toast_desc": "Por favor ingresa una URL válida de video de YouTube",
+ "duplicate_url_toast": "URL duplicada",
+ "duplicate_url_toast_desc": "Este video de YouTube ya ha sido agregado"
+ },
+ "settings": {
+ "title": "Configuración",
+ "subtitle": "Administra tus configuraciones de LLM y asignaciones de roles para este espacio de búsqueda.",
+ "back_to_dashboard": "Volver al panel de control",
+ "model_configs": "Configuraciones de modelos",
+ "models": "Modelos",
+ "llm_roles": "Roles de LLM",
+ "roles": "Roles",
+ "llm_role_management": "Gestión de roles de LLM",
+ "llm_role_desc": "Asigna tus configuraciones de LLM a roles específicos para diferentes propósitos.",
+ "no_llm_configs_found": "No se encontraron configuraciones de LLM. Agrega al menos un proveedor de LLM en la pestaña de Configuraciones de Modelos antes de asignar roles.",
+ "select_llm_config": "Selecciona una configuración de LLM",
+ "long_context_llm": "LLM de contexto largo",
+ "fast_llm": "LLM rápido",
+ "strategic_llm": "LLM estratégico",
+ "long_context_desc": "Maneja resúmenes de documentos largos y preguntas complejas",
+ "long_context_examples": "Análisis de documentos, síntesis de investigación, preguntas complejas",
+ "large_context_window": "Ventana de contexto amplia",
+ "deep_reasoning": "Razonamiento profundo",
+ "complex_analysis": "Análisis complejo",
+ "fast_llm_desc": "Optimizado para respuestas rápidas e interacciones en tiempo real",
+ "fast_llm_examples": "Búsquedas rápidas, preguntas simples, respuestas instantáneas",
+ "low_latency": "Baja latencia",
+ "quick_responses": "Respuestas rápidas",
+ "real_time_chat": "Chat en tiempo real",
+ "strategic_llm_desc": "Razonamiento avanzado para planificación y toma de decisiones estratégicas",
+ "strategic_llm_examples": "Planificación de flujos de trabajo, análisis estratégico, resolución de problemas complejos",
+ "strategic_thinking": "Pensamiento estratégico",
+ "long_term_planning": "Planificación a largo plazo",
+ "complex_reasoning": "Razonamiento complejo",
+ "use_cases": "Casos de uso",
+ "assign_llm_config": "Asignar configuración de LLM",
+ "unassigned": "Sin asignar",
+ "assigned": "Asignado",
+ "model": "Modelo",
+ "base": "Base",
+ "all_roles_assigned": "¡Todos los roles están asignados y listos para usar! Tu configuración de LLM está completa.",
+ "save_changes": "Guardar cambios",
+ "saving": "Guardando",
+ "reset": "Restablecer",
+ "status": "Estado",
+ "status_ready": "Listo",
+ "status_setup": "Configuración",
+ "complete_role_assignments": "Completa todas las asignaciones de roles para habilitar la funcionalidad completa. Cada rol tiene diferentes propósitos en tu flujo de trabajo.",
+ "all_roles_saved": "¡Todos los roles asignados y guardados!",
+ "progress": "Progreso",
+ "roles_assigned_count": "{assigned} de {total} roles asignados"
+ },
+ "logs": {
+ "title": "Registros de tareas",
+ "subtitle": "Monitorea y analiza todos los registros de ejecución de tareas",
+ "refresh": "Actualizar",
+ "delete_selected": "Eliminar seleccionados",
+ "confirm_title": "¿Estás completamente seguro?",
+ "confirm_delete_desc": "Esta acción no se puede deshacer. Esto eliminará permanentemente {count} registro(s) seleccionado(s).",
+ "cancel": "Cancelar",
+ "delete": "Eliminar",
+ "level": "Nivel",
+ "status": "Estado",
+ "source": "Fuente",
+ "message": "Mensaje",
+ "created_at": "Fecha de creación",
+ "actions": "Acciones",
+ "system": "Sistema",
+ "filter_by_message": "Filtrar por mensaje...",
+ "filter_by": "Filtrar por",
+ "total_logs": "Total de registros",
+ "active_tasks": "Tareas activas",
+ "success_rate": "Tasa de éxito",
+ "recent_failures": "Fallos recientes",
+ "last_hours": "Últimas {hours} horas",
+ "currently_running": "Ejecutándose actualmente",
+ "successful": "exitoso",
+ "need_attention": "Requiere atención",
+ "no_logs": "No se encontraron registros",
+ "loading": "Cargando registros...",
+ "error_loading": "Error al cargar registros",
+ "columns": "Columnas",
+ "failed_load_summary": "Error al cargar el resumen",
+ "retry": "Reintentar",
+ "view": "Ver",
+ "toggle_columns": "Alternar columnas",
+ "rows_per_page": "Filas por página",
+ "view_metadata": "Ver metadatos",
+ "log_deleted_success": "Registro eliminado correctamente",
+ "log_deleted_error": "Error al eliminar el registro",
+ "confirm_delete_log_title": "¿Estás seguro?",
+ "confirm_delete_log_desc": "Esta acción no se puede deshacer. Esto eliminará permanentemente la entrada del registro.",
+ "deleting": "Eliminando"
+ },
+ "onboard": {
+ "welcome_title": "Bienvenido a SurfSense",
+ "welcome_subtitle": "Vamos a configurar tus configuraciones de LLM para comenzar",
+ "step_of": "Paso {current} de {total}",
+ "percent_complete": "{percent}% completado",
+ "add_llm_provider": "Agregar proveedor de LLM",
+ "assign_llm_roles": "Asignar roles de LLM",
+ "setup_llm_configuration": "Configurar LLM",
+ "configure_providers_and_assign_roles": "Agrega tus proveedores de LLM y asígnalos a roles específicos",
+ "assign_llm_roles_title": "Asignar roles de LLM",
+ "complete_role_assignment": "Asigna tus configuraciones de LLM a roles específicos para continuar",
+ "setup_complete": "Configuración completa",
+ "configure_first_provider": "Configura tu primer proveedor de modelos",
+ "assign_specific_roles": "Asigna roles específicos a tus configuraciones de LLM",
+ "all_set": "¡Todo listo para comenzar a usar SurfSense!",
+ "loading_config": "Cargando tu configuración...",
+ "previous": "Anterior",
+ "next": "Siguiente",
+ "complete_setup": "Completar configuración",
+ "add_provider_instruction": "Agrega al menos un proveedor de LLM para continuar. Puedes configurar múltiples proveedores y elegir roles específicos para cada uno en el siguiente paso.",
+ "your_llm_configs": "Tus configuraciones de LLM",
+ "model": "Modelo",
+ "language": "Idioma",
+ "base": "Base",
+ "add_provider_title": "Agregar proveedor de LLM",
+ "add_provider_subtitle": "Configura tu primer proveedor de modelos para comenzar",
+ "add_provider_button": "Agregar proveedor",
+ "add_new_llm_provider": "Agregar nuevo proveedor de LLM",
+ "configure_new_provider": "Configura un nuevo proveedor de modelo de lenguaje para tu asistente de IA",
+ "config_name": "Nombre de configuración",
+ "config_name_required": "Nombre de configuración *",
+ "config_name_placeholder": "ej., Mi OpenAI GPT-4",
+ "provider": "Proveedor",
+ "provider_required": "Proveedor *",
+ "provider_placeholder": "Selecciona un proveedor",
+ "language_optional": "Idioma (opcional)",
+ "language_placeholder": "Selecciona idioma",
+ "custom_provider_name": "Nombre del proveedor personalizado *",
+ "custom_provider_placeholder": "ej., mi-proveedor-personalizado",
+ "model_name_required": "Nombre del modelo *",
+ "model_name_placeholder": "ej., gpt-4",
+ "examples": "Ejemplos",
+ "api_key_required": "Clave API *",
+ "api_key_placeholder": "Tu clave API",
+ "api_base_optional": "URL base de la API (opcional)",
+ "api_base_placeholder": "ej., https://api.openai.com/v1",
+ "adding": "Agregando...",
+ "add_provider": "Agregar proveedor",
+ "cancel": "Cancelar",
+ "assign_roles_instruction": "Asigna tus configuraciones de LLM a roles específicos. Cada rol tiene diferentes propósitos en tu flujo de trabajo.",
+ "no_llm_configs_found": "No se encontraron configuraciones de LLM",
+ "add_provider_before_roles": "Agrega al menos un proveedor de LLM en el paso anterior antes de asignar roles.",
+ "long_context_llm_title": "LLM de contexto largo",
+ "long_context_llm_desc": "Maneja resúmenes de documentos largos y preguntas complejas",
+ "long_context_llm_examples": "Análisis de documentos, síntesis de investigación, preguntas complejas",
+ "fast_llm_title": "LLM rápido",
+ "fast_llm_desc": "Optimizado para respuestas rápidas e interacciones en tiempo real",
+ "fast_llm_examples": "Búsquedas rápidas, preguntas simples, respuestas instantáneas",
+ "strategic_llm_title": "LLM estratégico",
+ "strategic_llm_desc": "Razonamiento avanzado para planificación y toma de decisiones estratégicas",
+ "strategic_llm_examples": "Planificación de flujos de trabajo, análisis estratégico, resolución de problemas complejos",
+ "use_cases": "Casos de uso",
+ "assign_llm_config": "Asignar configuración de LLM",
+ "select_llm_config": "Selecciona una configuración de LLM",
+ "assigned": "Asignado",
+ "all_roles_assigned_saved": "¡Todos los roles asignados y guardados!",
+ "progress": "Progreso",
+ "roles_assigned": "{assigned} de {total} roles asignados",
+ "global_configs": "Configuraciones globales",
+ "your_configs": "Tus configuraciones"
+ },
+ "model_config": {
+ "title": "Configuraciones de modelos",
+ "subtitle": "Administra las configuraciones de tus proveedores de LLM y ajustes de API.",
+ "refresh": "Actualizar",
+ "loading": "Cargando configuraciones...",
+ "total_configs": "Total de configuraciones",
+ "unique_providers": "Proveedores únicos",
+ "system_status": "Estado del sistema",
+ "active": "Activo",
+ "your_configs": "Tus configuraciones",
+ "manage_configs": "Administra y configura tus proveedores de LLM",
+ "add_config": "Agregar configuración",
+ "no_configs": "Aún no hay configuraciones",
+ "no_configs_desc": "Agrega tus propias configuraciones de proveedor de LLM.",
+ "add_first_config": "Agregar primera configuración",
+ "created": "Creado"
+ },
+ "breadcrumb": {
+ "dashboard": "Panel de control",
+ "search_space": "Espacio de búsqueda",
+ "chat": "Chat",
+ "documents": "Documentos",
+ "connectors": "Conectores",
+ "editor": "Editor",
+ "logs": "Registros",
+ "settings": "Configuración",
+ "upload_documents": "Subir documentos",
+ "add_youtube": "Agregar videos de YouTube",
+ "add_webpages": "Agregar páginas web",
+ "add_connector": "Agregar conector",
+ "manage_connectors": "Administrar conectores",
+ "edit_connector": "Editar conector",
+ "manage": "Administrar"
+ },
+ "sidebar": {
+ "chats": "Chats privados",
+ "shared_chats": "Chats compartidos",
+ "search_chats": "Buscar chats",
+ "no_chats_found": "No se encontraron chats",
+ "no_shared_chats": "No hay chats compartidos",
+ "view_all_shared_chats": "Ver todos los chats compartidos",
+ "view_all_private_chats": "Ver todos los chats privados",
+ "no_chats": "Aún no hay chats",
+ "start_new_chat_hint": "Iniciar un nuevo chat",
+ "error_loading_chats": "Error al cargar chats",
+ "chat_deleted": "Chat eliminado correctamente",
+ "error_deleting_chat": "Error al eliminar el chat",
+ "delete": "Eliminar",
+ "try_different_search": "Intenta con un término de búsqueda diferente",
+ "updated": "Actualizado",
+ "more_options": "Más opciones",
+ "clear_search": "Limpiar búsqueda",
+ "archive": "Archivar",
+ "unarchive": "Restaurar",
+ "chat_archived": "Chat archivado",
+ "chat_unarchived": "Chat restaurado",
+ "chat_renamed": "Chat renombrado",
+ "error_renaming_chat": "Error al renombrar el chat",
+ "rename": "Renombrar",
+ "rename_chat": "Renombrar chat",
+ "rename_chat_description": "Ingresa un nuevo nombre para esta conversación.",
+ "chat_title_placeholder": "Título del chat",
+ "renaming": "Renombrando...",
+ "no_archived_chats": "No hay chats archivados",
+ "error_archiving_chat": "Error al archivar el chat",
+ "new_chat": "Nuevo chat",
+ "select_search_space": "Seleccionar espacio de búsqueda",
+ "manage_members": "Administrar miembros",
+ "search_space_settings": "Configuración del espacio de búsqueda",
+ "logs": "Registros",
+ "see_all_search_spaces": "Ver todos los espacios de búsqueda",
+ "expand_sidebar": "Expandir barra lateral",
+ "collapse_sidebar": "Contraer barra lateral",
+ "user_settings": "Configuración de usuario",
+ "language": "Idioma",
+ "theme": "Tema",
+ "light": "Claro",
+ "dark": "Oscuro",
+ "system": "Sistema",
+ "logout": "Cerrar sesión",
+ "loggingOut": "Cerrando sesión...",
+ "inbox": "Bandeja de entrada",
+ "search_inbox": "Buscar en bandeja de entrada",
+ "mark_all_read": "Marcar todo como leído",
+ "mark_as_read": "Marcar como leído",
+ "mentions": "Menciones",
+ "comments": "Comentarios",
+ "status": "Estado",
+ "no_results_found": "No se encontraron resultados",
+ "no_mentions": "No hay menciones",
+ "no_mentions_hint": "Aquí verás las menciones de otros",
+ "no_comments": "No hay comentarios",
+ "no_comments_hint": "Aquí verás las menciones y respuestas",
+ "no_status_updates": "No hay actualizaciones de estado",
+ "no_status_updates_hint": "Las actualizaciones de documentos y conectores aparecerán aquí",
+ "filter": "Filtrar",
+ "all": "Todo",
+ "unread": "No leído",
+ "connectors": "Conectores",
+ "all_connectors": "Todos los conectores",
+ "close": "Cerrar"
+ },
+ "errors": {
+ "something_went_wrong": "Algo salió mal",
+ "try_again": "Por favor, inténtalo de nuevo",
+ "not_found": "No encontrado",
+ "unauthorized": "No autorizado",
+ "forbidden": "Prohibido",
+ "server_error": "Error del servidor",
+ "network_error": "Error de red"
+ },
+ "searchSpaceSettings": {
+ "title": "Configuración del espacio de búsqueda",
+ "back_to_app": "Volver a la app",
+ "nav_general": "General",
+ "nav_general_desc": "Nombre, descripción e información básica",
+ "nav_agent_configs": "Configuraciones de agente",
+ "nav_agent_configs_desc": "Modelos LLM con prompts y citas",
+ "nav_role_assignments": "Asignaciones de roles",
+ "nav_role_assignments_desc": "Asignar configuraciones a roles de agente",
+ "nav_image_models": "Modelos de imagen",
+ "nav_image_models_desc": "Configurar modelos de generación de imágenes",
+ "nav_system_instructions": "Instrucciones del sistema",
+ "nav_system_instructions_desc": "Instrucciones de IA a nivel del espacio de búsqueda",
+ "nav_public_links": "Enlaces de chat públicos",
+ "nav_public_links_desc": "Administrar enlaces de chat compartidos públicamente",
+ "general_name_label": "Nombre",
+ "general_name_placeholder": "Ingresa el nombre del espacio de búsqueda",
+ "general_name_description": "Un nombre único para tu espacio de búsqueda.",
+ "general_description_label": "Descripción",
+ "general_description_placeholder": "Ingresa la descripción del espacio de búsqueda",
+ "general_description_description": "Una breve descripción del uso de este espacio de búsqueda.",
+ "general_reset": "Restablecer cambios",
+ "general_save": "Guardar cambios",
+ "general_saving": "Guardando",
+ "general_unsaved_changes": "Tienes cambios sin guardar. Haz clic en \"Guardar cambios\" para aplicarlos."
+ },
+ "homepage": {
+ "hero_title_part1": "El espacio de trabajo con IA",
+ "hero_title_part2": "diseñado para equipos",
+ "hero_description": "Conecta cualquier LLM a tus fuentes de conocimiento internas y chatea con él en tiempo real junto a tu equipo.",
+ "cta_start_trial": "Comienza gratis",
+ "cta_explore": "Explorar",
+ "integrations_title": "Integraciones",
+ "integrations_subtitle": "Integra con las herramientas más importantes de tu equipo",
+ "features_title": "El centro de conocimiento impulsado por IA de tu equipo",
+ "features_subtitle": "Funciones potentes diseñadas para mejorar la colaboración, aumentar la productividad y optimizar tu flujo de trabajo.",
+ "feature_workflow_title": "Flujo de trabajo optimizado",
+ "feature_workflow_desc": "Centraliza todo tu conocimiento y recursos en un espacio de trabajo inteligente. Encuentra lo que necesitas al instante y acelera la toma de decisiones.",
+ "feature_collaboration_title": "Colaboración fluida",
+ "feature_collaboration_desc": "Trabaja junto a tu equipo sin esfuerzo con herramientas de colaboración en tiempo real que mantienen a todos alineados.",
+ "feature_customizable_title": "Totalmente personalizable",
+ "feature_customizable_desc": "Elige entre más de 100 LLMs líderes y llama a cualquier modelo bajo demanda sin problemas.",
+ "cta_transform": "Transforma cómo tu equipo",
+ "cta_transform_bold": "descubre y colabora",
+ "cta_unite_start": "Unifica el",
+ "cta_unite_knowledge": "conocimiento de tu equipo",
+ "cta_unite_middle": "en un espacio colaborativo con",
+ "cta_unite_search": "búsqueda inteligente",
+ "cta_talk_to_us": "Habla con nosotros",
+ "features": {
+ "find_ask_act": {
+ "title": "Encuentra, pregunta, actúa",
+ "description": "Obtén información instantánea, actualizaciones detalladas y respuestas con citas del conocimiento de la empresa y personal."
+ },
+ "real_time_collab": {
+ "title": "Trabaja juntos en tiempo real",
+ "description": "Transforma los documentos de tu empresa en espacios multijugador con ediciones en vivo, contenido sincronizado y presencia."
+ },
+ "beyond_text": {
+ "title": "Colabora más allá del texto",
+ "description": "Crea podcasts y multimedia que tu equipo puede comentar, compartir y perfeccionar juntos."
+ },
+ "context_counts": {
+ "title": "Contexto donde importa",
+ "description": "Agrega comentarios directamente a tus chats y documentos para retroalimentación clara y en el momento."
+ },
+ "citation_illustration_title": "Ilustración de la función de citas mostrando referencia de fuente clicable",
+ "referenced_chunk": "Fragmento referenciado",
+ "collab_illustration_label": "Ilustración de colaboración en tiempo real en un editor de texto.",
+ "real_time": "Tiempo real",
+ "collab_part1": "colabo",
+ "collab_part2": "raci",
+ "collab_part3": "ón",
+ "annotation_illustration_label": "Ilustración de un editor de texto con comentarios de anotación.",
+ "add_context_with": "Agrega contexto con",
+ "comments": "comentarios",
+ "example_comment": "¡Hablemos de esto mañana!"
+ }
+ },
+ "public_chat": {
+ "not_found_title": "Este chat ha sido eliminado.",
+ "click_here": "Haz clic aquí",
+ "sign_in_prompt": "para iniciar sesión en SurfSense y comenzar el tuyo."
+ }
+}
diff --git a/surfsense_web/messages/hi.json b/surfsense_web/messages/hi.json
new file mode 100644
index 000000000..0c5370fd0
--- /dev/null
+++ b/surfsense_web/messages/hi.json
@@ -0,0 +1,818 @@
+{
+ "common": {
+ "app_name": "SurfSense",
+ "welcome": "स्वागत है",
+ "save": "सहेजें",
+ "cancel": "रद्द करें",
+ "delete": "हटाएं",
+ "edit": "संपादित करें",
+ "create": "बनाएं",
+ "update": "अपडेट करें",
+ "search": "खोजें",
+ "close": "बंद करें",
+ "confirm": "पुष्टि करें",
+ "back": "वापस",
+ "next": "अगला",
+ "submit": "सबमिट करें",
+ "yes": "हाँ",
+ "no": "नहीं",
+ "add": "जोड़ें",
+ "remove": "हटाएं",
+ "select": "चुनें",
+ "all": "सभी",
+ "none": "कोई नहीं",
+ "error": "त्रुटि",
+ "success": "सफल",
+ "warning": "चेतावनी",
+ "info": "जानकारी",
+ "required": "आवश्यक",
+ "optional": "वैकल्पिक",
+ "retry": "पुनः प्रयास करें",
+ "owner": "स्वामी",
+ "shared": "साझा",
+ "settings": "सेटिंग्स"
+ },
+ "auth": {
+ "login": "लॉगिन",
+ "register": "पंजीकरण",
+ "logout": "लॉगआउट",
+ "email": "ईमेल",
+ "password": "पासवर्ड",
+ "confirm_password": "पासवर्ड की पुष्टि करें",
+ "forgot_password": "पासवर्ड भूल गए?",
+ "show_password": "पासवर्ड दिखाएं",
+ "hide_password": "पासवर्ड छुपाएं",
+ "remember_me": "मुझे याद रखें",
+ "sign_in": "साइन इन करें",
+ "signing_in": "साइन इन हो रहा है",
+ "sign_up": "साइन अप करें",
+ "sign_in_with": "{provider} से साइन इन करें",
+ "dont_have_account": "खाता नहीं है?",
+ "already_have_account": "पहले से खाता है?",
+ "reset_password": "पासवर्ड रीसेट करें",
+ "email_required": "ईमेल आवश्यक है",
+ "password_required": "पासवर्ड आवश्यक है",
+ "invalid_email": "अमान्य ईमेल पता",
+ "password_too_short": "पासवर्ड कम से कम 8 अक्षरों का होना चाहिए",
+ "welcome_back": "वापसी पर स्वागत है",
+ "create_account": "अपना खाता बनाएं",
+ "login_subtitle": "अपने खाते तक पहुंचने के लिए अपनी जानकारी दर्ज करें",
+ "register_subtitle": "SurfSense के साथ शुरू करने के लिए साइन अप करें",
+ "or_continue_with": "या इसके साथ जारी रखें",
+ "by_continuing": "जारी रखकर, आप हमारी सहमति देते हैं",
+ "terms_of_service": "सेवा की शर्तें",
+ "and": "और",
+ "privacy_policy": "गोपनीयता नीति",
+ "full_name": "पूरा नाम",
+ "username": "उपयोगकर्ता नाम",
+ "continue": "जारी रखें",
+ "back_to_login": "लॉगिन पर वापस जाएं",
+ "login_success": "सफलतापूर्वक लॉगिन हुआ",
+ "register_success": "खाता सफलतापूर्वक बनाया गया",
+ "continue_with_google": "Google के साथ जारी रखें",
+ "cloud_dev_notice": "SurfSense Cloud वर्तमान में विकास में है। देखें",
+ "docs": "दस्तावेज़",
+ "cloud_dev_self_hosted": "सेल्फ-होस्टेड संस्करण के बारे में अधिक जानकारी के लिए।",
+ "passwords_no_match": "पासवर्ड मेल नहीं खाते",
+ "password_mismatch": "पासवर्ड मेल नहीं खाते",
+ "passwords_no_match_desc": "आपके द्वारा दर्ज किए गए पासवर्ड मेल नहीं खाते",
+ "creating_account": "आपका खाता बनाया जा रहा है",
+ "creating_account_btn": "खाता बनाया जा रहा है",
+ "redirecting_login": "लॉगिन पेज पर रीडायरेक्ट हो रहा है"
+ },
+ "searchSpace": {
+ "create_title": "सर्च स्पेस बनाएं",
+ "create_description": "अपने ज्ञान को व्यवस्थित करने के लिए एक नया सर्च स्पेस बनाएं",
+ "name_label": "नाम",
+ "name_placeholder": "सर्च स्पेस का नाम दर्ज करें",
+ "description_label": "विवरण",
+ "description_placeholder": "यह सर्च स्पेस किसके लिए है?",
+ "create_button": "बनाएं",
+ "creating": "बनाया जा रहा है",
+ "all_search_spaces": "सभी सर्च स्पेस",
+ "search_spaces_count": "{count, plural, =0 {कोई सर्च स्पेस नहीं} =1 {1 सर्च स्पेस} other {# सर्च स्पेस}}",
+ "no_search_spaces": "अभी तक कोई सर्च स्पेस नहीं",
+ "create_first_search_space": "शुरू करने के लिए अपना पहला सर्च स्पेस बनाएं",
+ "members_count": "{count, plural, =1 {1 सदस्य} other {# सदस्य}}",
+ "create_new_search_space": "नया सर्च स्पेस बनाएं",
+ "delete_title": "सर्च स्पेस हटाएं",
+ "delete_confirm": "क्या आप वाकई \"{name}\" को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती और सभी डेटा स्थायी रूप से हटा दिया जाएगा।",
+ "leave": "छोड़ें",
+ "leave_title": "सर्च स्पेस छोड़ें",
+ "leave_confirm": "क्या आप वाकई \"{name}\" छोड़ना चाहते हैं? आप इस सर्च स्पेस के सभी दस्तावेज़ों और चैट तक पहुंच खो देंगे।",
+ "leaving": "छोड़ा जा रहा है...",
+ "welcome_title": "SurfSense में आपका स्वागत है",
+ "welcome_description": "अपना ज्ञान व्यवस्थित करने, स्रोत जोड़ने और AI के साथ चैट करने के लिए अपना पहला सर्च स्पेस बनाएं।",
+ "create_first_button": "अपना पहला सर्च स्पेस बनाएं"
+ },
+ "userSettings": {
+ "title": "उपयोगकर्ता सेटिंग्स",
+ "description": "अपनी खाता सेटिंग्स और API एक्सेस प्रबंधित करें",
+ "back_to_app": "ऐप पर वापस जाएं",
+ "profile_nav_label": "प्रोफ़ाइल",
+ "profile_nav_description": "अपना नाम और अवतार प्रबंधित करें",
+ "profile_title": "प्रोफ़ाइल",
+ "profile_description": "अपनी व्यक्तिगत जानकारी अपडेट करें",
+ "profile_avatar": "प्रोफ़ाइल चित्र",
+ "profile_display_name": "प्रदर्शन नाम",
+ "profile_display_name_hint": "ऐप में आपका नाम इस तरह दिखाई देगा",
+ "profile_email": "ईमेल",
+ "profile_save": "परिवर्तन सहेजें",
+ "profile_saved": "प्रोफ़ाइल सफलतापूर्वक अपडेट की गई",
+ "profile_save_error": "प्रोफ़ाइल अपडेट करने में विफल",
+ "api_key_nav_label": "API कुंजी",
+ "api_key_nav_description": "अपना API एक्सेस टोकन प्रबंधित करें",
+ "api_key_title": "API कुंजी",
+ "api_key_description": "API अनुरोधों को प्रमाणित करने के लिए इस कुंजी का उपयोग करें",
+ "api_key_warning_title": "इसे गुप्त रखें",
+ "api_key_warning_description": "आपकी API कुंजी आपके खाते तक पूर्ण पहुंच प्रदान करती है। इसे कभी सार्वजनिक रूप से साझा न करें या संस्करण नियंत्रण में शामिल न करें।",
+ "your_api_key": "आपकी API कुंजी",
+ "copied": "कॉपी किया गया!",
+ "copy": "क्लिपबोर्ड पर कॉपी करें",
+ "no_api_key": "कोई API कुंजी नहीं मिली",
+ "usage_title": "कैसे उपयोग करें",
+ "usage_description": "Authorization हेडर में अपनी API कुंजी शामिल करें:"
+ },
+ "dashboard": {
+ "title": "डैशबोर्ड",
+ "search_spaces": "सर्च स्पेस",
+ "documents": "दस्तावेज़",
+ "connectors": "कनेक्टर",
+ "settings": "सेटिंग्स",
+ "chat": "चैट",
+ "api_keys": "API कुंजियां",
+ "profile": "प्रोफ़ाइल",
+ "loading_dashboard": "डैशबोर्ड लोड हो रहा है",
+ "loading_config": "कॉन्फ़िगरेशन लोड हो रहा है",
+ "config_error": "कॉन्फ़िगरेशन त्रुटि",
+ "failed_load_llm_config": "आपका LLM कॉन्फ़िगरेशन लोड करने में विफल",
+ "error_loading_chats": "चैट लोड करने में त्रुटि",
+ "loading_chat": "चैट लोड हो रहा है",
+ "loading_document": "दस्तावेज़ लोड हो रहा है",
+ "no_recent_chats": "कोई हालिया चैट नहीं",
+ "error_loading_space": "सर्च स्पेस लोड करने में त्रुटि",
+ "unknown_search_space": "अज्ञात सर्च स्पेस",
+ "delete_chat": "चैट हटाएं",
+ "delete_chat_confirm": "क्या आप वाकई हटाना चाहते हैं",
+ "delete_note": "नोट हटाएं",
+ "delete_note_confirm": "क्या आप वाकई हटाना चाहते हैं",
+ "action_cannot_undone": "यह क्रिया पूर्ववत नहीं की जा सकती।",
+ "deleting": "हटाया जा रहा है",
+ "surfsense_dashboard": "SurfSense डैशबोर्ड",
+ "welcome_message": "आपके SurfSense डैशबोर्ड में आपका स्वागत है।",
+ "your_search_spaces": "आपके सर्च स्पेस",
+ "shared": "साझा",
+ "create_search_space": "सर्च स्पेस बनाएं",
+ "add_new_search_space": "नया सर्च स्पेस जोड़ें",
+ "loading": "लोड हो रहा है",
+ "may_take_moment": "इसमें कुछ समय लग सकता है",
+ "error": "त्रुटि",
+ "something_wrong": "कुछ गलत हो गया",
+ "error_details": "त्रुटि विवरण",
+ "try_again": "पुनः प्रयास करें",
+ "go_home": "होम पर जाएं",
+ "delete_search_space": "सर्च स्पेस हटाएं",
+ "delete_space_confirm": "क्या आप वाकई \"{name}\" को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती। इस सर्च स्पेस के सभी दस्तावेज़ और चैट स्थायी रूप से हटा दिए जाएंगे।",
+ "leave": "छोड़ें",
+ "leave_title": "सर्च स्पेस छोड़ें",
+ "leave_confirm": "क्या आप वाकई \"{name}\" छोड़ना चाहते हैं? आप इस सर्च स्पेस के सभी दस्तावेज़ों और चैट तक पहुंच खो देंगे।",
+ "leaving": "छोड़ा जा रहा है...",
+ "no_spaces_found": "कोई सर्च स्पेस नहीं मिला",
+ "create_first_space": "शुरू करने के लिए अपना पहला सर्च स्पेस बनाएं",
+ "created": "बनाया गया"
+ },
+ "navigation": {
+ "home": "होम",
+ "docs": "दस्तावेज़",
+ "pricing": "मूल्य निर्धारण",
+ "contact": "संपर्क",
+ "login": "लॉगिन",
+ "register": "पंजीकरण",
+ "dashboard": "डैशबोर्ड",
+ "sign_in": "साइन इन",
+ "book_a_call": "कॉल बुक करें"
+ },
+ "nav_menu": {
+ "settings": "सेटिंग्स",
+ "platform": "प्लेटफ़ॉर्म",
+ "chat": "चैट",
+ "manage_llms": "LLM प्रबंधित करें",
+ "sources": "स्रोत",
+ "add_sources": "स्रोत जोड़ें",
+ "documents": "दस्तावेज़",
+ "upload_documents": "दस्तावेज़ अपलोड करें",
+ "add_webpages": "वेबपेज जोड़ें",
+ "add_youtube": "YouTube वीडियो जोड़ें",
+ "add_youtube_videos": "YouTube वीडियो जोड़ें",
+ "manage_documents": "दस्तावेज़ प्रबंधित करें",
+ "connectors": "कनेक्टर",
+ "add_connector": "कनेक्टर जोड़ें",
+ "manage_connectors": "कनेक्टर प्रबंधित करें",
+ "logs": "लॉग",
+ "all_search_spaces": "सभी सर्च स्पेस",
+ "team": "टीम"
+ },
+ "pricing": {
+ "title": "SurfSense मूल्य निर्धारण",
+ "subtitle": "अपने लिए सही योजना चुनें",
+ "community_name": "समुदाय",
+ "enterprise_name": "एंटरप्राइज़",
+ "forever": "हमेशा के लिए",
+ "contact_us": "हमसे संपर्क करें",
+ "feature_llms": "100+ LLM का समर्थन",
+ "feature_ollama": "स्थानीय Ollama या vLLM सेटअप का समर्थन",
+ "feature_embeddings": "6000+ एम्बेडिंग मॉडल",
+ "feature_files": "50+ फ़ाइल एक्सटेंशन समर्थित",
+ "feature_podcasts": "स्थानीय TTS प्रदाताओं के साथ पॉडकास्ट समर्थन",
+ "feature_sources": "15+ बाहरी स्रोतों से कनेक्ट",
+ "feature_extension": "प्रमाणित सामग्री सहित डायनामिक वेबपेजों के लिए क्रॉस-ब्राउज़र एक्सटेंशन",
+ "upcoming_mindmaps": "जल्द आ रहा है: मर्ज करने योग्य माइंड मैप",
+ "upcoming_notes": "जल्द आ रहा है: नोट प्रबंधन",
+ "community_desc": "शक्तिशाली सुविधाओं के साथ ओपन सोर्स संस्करण",
+ "get_started": "शुरू करें",
+ "everything_community": "समुदाय में सब कुछ शामिल",
+ "priority_support": "प्राथमिकता समर्थन",
+ "access_controls": "एक्सेस नियंत्रण",
+ "collaboration": "सहयोग और मल्टीप्लेयर सुविधाएं",
+ "video_gen": "वीडियो जनरेशन",
+ "advanced_security": "उन्नत सुरक्षा सुविधाएं",
+ "enterprise_desc": "विशेष आवश्यकताओं वाले बड़े संगठनों के लिए",
+ "contact_sales": "सेल्स से संपर्क करें"
+ },
+ "contact": {
+ "title": "संपर्क",
+ "subtitle": "हम आपसे सुनना चाहेंगे।",
+ "we_are_here": "हम यहां हैं",
+ "full_name": "पूरा नाम",
+ "email_address": "ईमेल पता",
+ "company": "कंपनी",
+ "message": "संदेश",
+ "optional": "वैकल्पिक",
+ "name_placeholder": "राहुल शर्मा",
+ "email_placeholder": "rahul.sharma@example.com",
+ "company_placeholder": "उदाहरण प्रा. लि.",
+ "message_placeholder": "अपना संदेश यहां लिखें",
+ "submit": "सबमिट करें",
+ "submitting": "सबमिट हो रहा है...",
+ "name_required": "नाम आवश्यक है",
+ "name_too_long": "नाम बहुत लंबा है",
+ "invalid_email": "अमान्य ईमेल पता",
+ "email_too_long": "ईमेल बहुत लंबा है",
+ "company_required": "कंपनी आवश्यक है",
+ "company_too_long": "कंपनी का नाम बहुत लंबा है",
+ "message_sent": "संदेश सफलतापूर्वक भेजा गया!",
+ "we_will_contact": "हम जल्द से जल्द आपसे संपर्क करेंगे।",
+ "send_failed": "संदेश भेजने में विफल",
+ "try_again_later": "कृपया बाद में पुनः प्रयास करें।",
+ "something_wrong": "कुछ गलत हो गया"
+ },
+ "connectors": {
+ "title": "कनेक्टर",
+ "subtitle": "अपने कनेक्टेड सेवाओं और डेटा स्रोतों को प्रबंधित करें।",
+ "add_connector": "कनेक्टर जोड़ें",
+ "your_connectors": "आपके कनेक्टर",
+ "view_manage": "अपनी सभी कनेक्टेड सेवाओं को देखें और प्रबंधित करें।",
+ "no_connectors": "कोई कनेक्टर नहीं मिला",
+ "no_connectors_desc": "आपने अभी तक कोई कनेक्टर नहीं जोड़ा है। अपनी खोज क्षमताओं को बढ़ाने के लिए एक जोड़ें।",
+ "add_first": "अपना पहला कनेक्टर जोड़ें",
+ "name": "नाम",
+ "type": "प्रकार",
+ "last_indexed": "अंतिम इंडेक्सिंग",
+ "periodic": "आवधिक",
+ "actions": "क्रियाएं",
+ "never": "कभी नहीं",
+ "not_indexable": "इंडेक्स करने योग्य नहीं",
+ "index_date_range": "तिथि सीमा के साथ इंडेक्स करें",
+ "quick_index": "त्वरित इंडेक्स",
+ "quick_index_auto": "त्वरित इंडेक्स (स्वचालित तिथि सीमा)",
+ "delete_connector": "कनेक्टर हटाएं",
+ "delete_confirm": "क्या आप वाकई इस कनेक्टर को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।",
+ "select_date_range": "इंडेक्सिंग के लिए तिथि सीमा चुनें",
+ "select_date_range_desc": "सामग्री इंडेक्स करने के लिए प्रारंभ और समाप्ति तिथियां चुनें। डिफ़ॉल्ट सीमा का उपयोग करने के लिए खाली छोड़ दें।",
+ "start_date": "प्रारंभ तिथि",
+ "end_date": "समाप्ति तिथि",
+ "pick_date": "तिथि चुनें",
+ "clear_dates": "तिथियां साफ करें",
+ "last_30_days": "पिछले 30 दिन",
+ "last_year": "पिछला वर्ष",
+ "start_indexing": "इंडेक्सिंग शुरू करें",
+ "failed_load": "कनेक्टर लोड करने में विफल",
+ "delete_success": "कनेक्टर सफलतापूर्वक हटाया गया",
+ "delete_failed": "कनेक्टर हटाने में विफल",
+ "indexing_started": "कनेक्टर सामग्री इंडेक्सिंग शुरू हो गई",
+ "indexing_failed": "कनेक्टर सामग्री इंडेक्स करने में विफल"
+ },
+ "documents": {
+ "title": "दस्तावेज़",
+ "subtitle": "अपने दस्तावेज़ और फ़ाइलें प्रबंधित करें।",
+ "no_rows_selected": "कोई पंक्ति चयनित नहीं",
+ "delete_success_count": "{count} दस्तावेज़ सफलतापूर्वक हटाए गए",
+ "delete_partial_failed": "कुछ दस्तावेज़ हटाए नहीं जा सके",
+ "delete_success": "दस्तावेज़ सफलतापूर्वक हटाया गया",
+ "delete_error": "दस्तावेज़ हटाने में त्रुटि",
+ "filter_by_title": "शीर्षक से फ़िल्टर करें...",
+ "bulk_delete": "चयनित हटाएं",
+ "filter_types": "प्रकार फ़िल्टर करें",
+ "columns": "कॉलम",
+ "confirm_delete": "हटाने की पुष्टि करें",
+ "confirm_delete_desc": "क्या आप वाकई {count} दस्तावेज़ हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।",
+ "uploading": "अपलोड हो रहा है",
+ "upload_success": "दस्तावेज़ सफलतापूर्वक अपलोड किया गया",
+ "upload_failed": "दस्तावेज़ अपलोड करने में विफल",
+ "loading": "दस्तावेज़ लोड हो रहे हैं",
+ "error_loading": "दस्तावेज़ लोड करने में त्रुटि",
+ "retry": "पुनः प्रयास करें",
+ "no_documents": "कोई दस्तावेज़ नहीं मिला",
+ "type": "प्रकार",
+ "content_summary": "सामग्री सारांश",
+ "view_full": "सारांश देखें",
+ "filter_placeholder": "शीर्षक से फ़िल्टर करें...",
+ "rows_per_page": "प्रति पृष्ठ पंक्तियां",
+ "refresh": "रीफ्रेश करें",
+ "upload_documents": "दस्तावेज़ अपलोड करें",
+ "create_shared_note": "साझा नोट बनाएं",
+ "processing_documents": "दस्तावेज़ प्रोसेस हो रहे हैं...",
+ "active_tasks_count": "{count} सक्रिय कार्य"
+ },
+ "add_connector": {
+ "title": "अपने टूल कनेक्ट करें",
+ "subtitle": "अपनी शोध क्षमताओं को बढ़ाने के लिए अपनी पसंदीदा सेवाओं के साथ एकीकृत करें।",
+ "web_search": "वेब खोज",
+ "messaging": "मैसेजिंग",
+ "project_management": "प्रोजेक्ट प्रबंधन",
+ "documentation": "दस्तावेज़ीकरण",
+ "development": "विकास",
+ "databases": "डेटाबेस",
+ "productivity": "उत्पादकता",
+ "web_crawling": "वेब क्रॉलिंग",
+ "connect": "कनेक्ट करें",
+ "coming_soon": "जल्द आ रहा है",
+ "connected": "कनेक्टेड",
+ "manage": "प्रबंधित करें",
+ "tavily_desc": "Tavily API का उपयोग करके वेब खोजें",
+ "searxng_desc": "वेब परिणामों के लिए अपनी SearxNG मेटा-सर्च इंस्टेंस का उपयोग करें।",
+ "linkup_desc": "Linkup API का उपयोग करके वेब खोजें",
+ "elasticsearch_desc": "दस्तावेज़, लॉग और मेट्रिक्स को इंडेक्स और खोजने के लिए Elasticsearch से कनेक्ट करें।",
+ "baidu_desc": "Baidu AI Search API का उपयोग करके चीनी वेब खोजें",
+ "slack_desc": "संदेशों और चैनलों तक पहुंचने के लिए अपने Slack वर्कस्पेस से कनेक्ट करें।",
+ "teams_desc": "अपनी टीम की बातचीत तक पहुंचने के लिए Microsoft Teams से कनेक्ट करें।",
+ "discord_desc": "संदेशों और चैनलों तक पहुंचने के लिए Discord सर्वरों से कनेक्ट करें।",
+ "linear_desc": "इश्यू, टिप्पणियां और प्रोजेक्ट डेटा खोजने के लिए Linear से कनेक्ट करें।",
+ "jira_desc": "इश्यू, टिकट और प्रोजेक्ट डेटा खोजने के लिए Jira से कनेक्ट करें।",
+ "clickup_desc": "टास्क, टिप्पणियां और प्रोजेक्ट डेटा खोजने के लिए ClickUp से कनेक्ट करें।",
+ "notion_desc": "पेज और डेटाबेस तक पहुंचने के लिए अपने Notion वर्कस्पेस से कनेक्ट करें।",
+ "github_desc": "एक्सेसिबल रिपॉजिटरी से कोड और दस्तावेज़ इंडेक्स करने के लिए GitHub PAT कनेक्ट करें।",
+ "confluence_desc": "पेज, टिप्पणियां और दस्तावेज़ खोजने के लिए Confluence से कनेक्ट करें।",
+ "bookstack_desc": "विकी पेज और दस्तावेज़ खोजने के लिए BookStack से कनेक्ट करें।",
+ "airtable_desc": "रिकॉर्ड, टेबल और डेटाबेस सामग्री खोजने के लिए Airtable से कनेक्ट करें।",
+ "luma_desc": "इवेंट, मीटअप और गैदरिंग खोजने के लिए Luma से कनेक्ट करें।",
+ "circleback_desc": "वेबहुक के माध्यम से Circleback से मीटिंग नोट्स, ट्रांसक्रिप्ट और एक्शन आइटम प्राप्त करें।",
+ "calendar_desc": "इवेंट, मीटिंग और शेड्यूल खोजने के लिए Google Calendar से कनेक्ट करें।",
+ "gmail_desc": "अपने ईमेल में खोज करने के लिए अपने Gmail खाते से कनेक्ट करें।",
+ "google_drive_desc": "अपनी फ़ाइलें और दस्तावेज़ खोजने और इंडेक्स करने के लिए Google Drive से कनेक्ट करें।",
+ "zoom_desc": "मीटिंग रिकॉर्डिंग और ट्रांसक्रिप्ट तक पहुंचने के लिए Zoom से कनेक्ट करें।",
+ "webcrawler_desc": "किसी भी सार्वजनिक वेब पेज से सामग्री क्रॉल और इंडेक्स करें।"
+ },
+ "upload_documents": {
+ "title": "दस्तावेज़ अपलोड करें",
+ "subtitle": "AI-संचालित बातचीत के माध्यम से अपनी फ़ाइलों को खोजने योग्य और सुलभ बनाने के लिए अपलोड करें।",
+ "file_size_limit": "अधिकतम फ़ाइल आकार: प्रति फ़ाइल 50MB।",
+ "upload_limits": "अपलोड सीमा: {maxFiles} फ़ाइलें, कुल {maxSizeMB}MB।",
+ "drop_files": "फ़ाइलें यहां छोड़ें",
+ "drag_drop": "फ़ाइलें यहां खींचें और छोड़ें",
+ "or_browse": "या ब्राउज़ करने के लिए क्लिक करें",
+ "browse_files": "फ़ाइलें ब्राउज़ करें",
+ "selected_files": "चयनित फ़ाइलें ({count})",
+ "total_size": "कुल आकार",
+ "clear_all": "सभी साफ करें",
+ "uploading_files": "फ़ाइलें अपलोड हो रही हैं",
+ "uploading": "अपलोड हो रहा है",
+ "upload_button": "{count} {count, plural, one {फ़ाइल} other {फ़ाइलें}} अपलोड करें",
+ "upload_initiated": "अपलोड कार्य शुरू हुआ",
+ "upload_initiated_desc": "फ़ाइलों का अपलोड शुरू हो गया है",
+ "upload_error": "अपलोड त्रुटि",
+ "upload_error_desc": "फ़ाइलें अपलोड करने में त्रुटि",
+ "supported_file_types": "समर्थित फ़ाइल प्रकार",
+ "file_types_desc": "ये फ़ाइल प्रकार आपकी वर्तमान ETL सेवा कॉन्फ़िगरेशन के आधार पर समर्थित हैं।",
+ "max_files_exceeded": "फ़ाइल सीमा पार हो गई",
+ "max_files_exceeded_desc": "आप एक बार में अधिकतम {max} फ़ाइलें अपलोड कर सकते हैं।",
+ "max_size_exceeded": "आकार सीमा पार हो गई",
+ "max_size_exceeded_desc": "कुल फ़ाइल आकार {max}MB से अधिक नहीं हो सकता।",
+ "file_limit_reached": "अधिकतम फ़ाइलें पहुंच गई",
+ "file_limit_reached_desc": "और जोड़ने के लिए कुछ फ़ाइलें हटाएं (अधिकतम {max} फ़ाइलें)।",
+ "remaining_capacity": "{files} फ़ाइलें शेष • {sizeMB}MB उपलब्ध"
+ },
+ "add_webpage": {
+ "title": "क्रॉलिंग के लिए वेबपेज जोड़ें",
+ "subtitle": "अपने दस्तावेज़ संग्रह में क्रॉल करने और जोड़ने के लिए URL दर्ज करें",
+ "label": "क्रॉल करने के लिए URL दर्ज करें",
+ "placeholder": "URL दर्ज करें और Enter दबाएं",
+ "hint": "प्रत्येक के बाद Enter दबाकर कई URL जोड़ें",
+ "tips_title": "URL क्रॉलिंग के लिए सुझाव:",
+ "tip_1": "http:// या https:// सहित पूरा URL दर्ज करें",
+ "tip_2": "सुनिश्चित करें कि वेबसाइट क्रॉलिंग की अनुमति देती है",
+ "tip_3": "सार्वजनिक वेबपेज सबसे अच्छे काम करते हैं",
+ "tip_4": "वेबसाइट के आकार के आधार पर क्रॉलिंग में कुछ समय लग सकता है",
+ "cancel": "रद्द करें",
+ "submit": "क्रॉलिंग के लिए URL सबमिट करें",
+ "submitting": "सबमिट हो रहा है...",
+ "error_no_url": "कृपया कम से कम एक URL जोड़ें",
+ "error_invalid_urls": "अमान्य URL पाए गए: {urls}",
+ "crawling_toast": "URL क्रॉलिंग",
+ "crawling_toast_desc": "URL क्रॉलिंग प्रक्रिया शुरू हो रही है...",
+ "success_toast": "क्रॉलिंग सफल",
+ "success_toast_desc": "URL क्रॉलिंग के लिए सबमिट किए गए हैं",
+ "error_toast": "क्रॉलिंग त्रुटि",
+ "error_toast_desc": "URL क्रॉल करने में त्रुटि",
+ "error_generic": "URL क्रॉल करते समय त्रुटि हुई",
+ "invalid_url_toast": "अमान्य URL",
+ "invalid_url_toast_desc": "कृपया एक मान्य URL दर्ज करें",
+ "duplicate_url_toast": "डुप्लिकेट URL",
+ "duplicate_url_toast_desc": "यह URL पहले से जोड़ा जा चुका है"
+ },
+ "add_youtube": {
+ "title": "YouTube वीडियो जोड़ें",
+ "subtitle": "अपने दस्तावेज़ संग्रह में जोड़ने के लिए YouTube वीडियो URL दर्ज करें",
+ "label": "YouTube वीडियो URL दर्ज करें",
+ "placeholder": "YouTube URL दर्ज करें और Enter दबाएं",
+ "hint": "प्रत्येक के बाद Enter दबाकर कई YouTube URL जोड़ें",
+ "tips_title": "YouTube वीडियो जोड़ने के लिए सुझाव:",
+ "tip_1": "मानक YouTube URL का उपयोग करें (youtube.com/watch?v= या youtu.be/)",
+ "tip_2": "सुनिश्चित करें कि वीडियो सार्वजनिक रूप से सुलभ हैं",
+ "tip_3": "समर्थित प्रारूप: youtube.com/watch?v=VIDEO_ID या youtu.be/VIDEO_ID",
+ "tip_4": "वीडियो की अवधि के आधार पर प्रोसेसिंग में कुछ समय लग सकता है",
+ "preview": "पूर्वावलोकन",
+ "cancel": "रद्द करें",
+ "submit": "जोड़ें",
+ "processing": "प्रोसेस हो रहा है...",
+ "error_no_video": "कृपया कम से कम एक YouTube वीडियो URL जोड़ें",
+ "error_invalid_urls": "अमान्य YouTube URL पाए गए: {urls}",
+ "processing_toast": "YouTube वीडियो प्रोसेसिंग",
+ "processing_toast_desc": "YouTube वीडियो प्रोसेसिंग शुरू हो रही है...",
+ "success_toast": "प्रोसेसिंग सफल",
+ "success_toast_desc": "YouTube वीडियो प्रोसेसिंग के लिए सबमिट किए गए हैं",
+ "error_toast": "प्रोसेसिंग त्रुटि",
+ "error_toast_desc": "YouTube वीडियो प्रोसेस करने में त्रुटि",
+ "error_generic": "YouTube वीडियो प्रोसेस करते समय त्रुटि हुई",
+ "invalid_url_toast": "अमान्य YouTube URL",
+ "invalid_url_toast_desc": "कृपया एक मान्य YouTube वीडियो URL दर्ज करें",
+ "duplicate_url_toast": "डुप्लिकेट URL",
+ "duplicate_url_toast_desc": "यह YouTube वीडियो पहले से जोड़ा जा चुका है"
+ },
+ "settings": {
+ "title": "सेटिंग्स",
+ "subtitle": "इस सर्च स्पेस के लिए अपनी LLM कॉन्फ़िगरेशन और भूमिका असाइनमेंट प्रबंधित करें।",
+ "back_to_dashboard": "डैशबोर्ड पर वापस जाएं",
+ "model_configs": "मॉडल कॉन्फ़िगरेशन",
+ "models": "मॉडल",
+ "llm_roles": "LLM भूमिकाएं",
+ "roles": "भूमिकाएं",
+ "llm_role_management": "LLM भूमिका प्रबंधन",
+ "llm_role_desc": "विभिन्न उद्देश्यों के लिए अपनी LLM कॉन्फ़िगरेशन को विशिष्ट भूमिकाओं में असाइन करें।",
+ "no_llm_configs_found": "कोई LLM कॉन्फ़िगरेशन नहीं मिला। भूमिकाएं असाइन करने से पहले मॉडल कॉन्फ़िगरेशन टैब में कम से कम एक LLM प्रदाता जोड़ें।",
+ "select_llm_config": "एक LLM कॉन्फ़िगरेशन चुनें",
+ "long_context_llm": "लंबे कॉन्टेक्स्ट LLM",
+ "fast_llm": "तेज़ LLM",
+ "strategic_llm": "रणनीतिक LLM",
+ "long_context_desc": "लंबे दस्तावेज़ सारांश और जटिल प्रश्नोत्तर संभालता है",
+ "long_context_examples": "दस्तावेज़ विश्लेषण, शोध संश्लेषण, जटिल प्रश्नोत्तर",
+ "large_context_window": "बड़ी कॉन्टेक्स्ट विंडो",
+ "deep_reasoning": "गहन तर्क",
+ "complex_analysis": "जटिल विश्लेषण",
+ "fast_llm_desc": "त्वरित प्रतिक्रियाओं और रीयल-टाइम इंटरैक्शन के लिए अनुकूलित",
+ "fast_llm_examples": "त्वरित खोज, सरल प्रश्न, तत्काल प्रतिक्रियाएं",
+ "low_latency": "कम विलंबता",
+ "quick_responses": "त्वरित प्रतिक्रियाएं",
+ "real_time_chat": "रीयल-टाइम चैट",
+ "strategic_llm_desc": "योजना और रणनीतिक निर्णय लेने के लिए उन्नत तर्क",
+ "strategic_llm_examples": "वर्कफ़्लो योजना, रणनीतिक विश्लेषण, जटिल समस्या समाधान",
+ "strategic_thinking": "रणनीतिक सोच",
+ "long_term_planning": "दीर्घकालिक योजना",
+ "complex_reasoning": "जटिल तर्क",
+ "use_cases": "उपयोग के मामले",
+ "assign_llm_config": "LLM कॉन्फ़िगरेशन असाइन करें",
+ "unassigned": "असाइन नहीं",
+ "assigned": "असाइन किया गया",
+ "model": "मॉडल",
+ "base": "बेस",
+ "all_roles_assigned": "सभी भूमिकाएं असाइन और उपयोग के लिए तैयार हैं! आपका LLM कॉन्फ़िगरेशन पूरा हो गया है।",
+ "save_changes": "परिवर्तन सहेजें",
+ "saving": "सहेजा जा रहा है",
+ "reset": "रीसेट करें",
+ "status": "स्थिति",
+ "status_ready": "तैयार",
+ "status_setup": "सेटअप",
+ "complete_role_assignments": "पूर्ण कार्यक्षमता सक्षम करने के लिए सभी भूमिका असाइनमेंट पूरे करें। प्रत्येक भूमिका आपके वर्कफ़्लो में अलग-अलग उद्देश्य पूरा करती है।",
+ "all_roles_saved": "सभी भूमिकाएं असाइन और सहेजी गई!",
+ "progress": "प्रगति",
+ "roles_assigned_count": "{total} में से {assigned} भूमिकाएं असाइन की गईं"
+ },
+ "logs": {
+ "title": "कार्य लॉग",
+ "subtitle": "सभी कार्य निष्पादन लॉग की निगरानी और विश्लेषण करें",
+ "refresh": "रीफ्रेश करें",
+ "delete_selected": "चयनित हटाएं",
+ "confirm_title": "क्या आप पूरी तरह सुनिश्चित हैं?",
+ "confirm_delete_desc": "यह क्रिया पूर्ववत नहीं की जा सकती। यह {count} चयनित लॉग को स्थायी रूप से हटा देगी।",
+ "cancel": "रद्द करें",
+ "delete": "हटाएं",
+ "level": "स्तर",
+ "status": "स्थिति",
+ "source": "स्रोत",
+ "message": "संदेश",
+ "created_at": "बनाया गया",
+ "actions": "क्रियाएं",
+ "system": "सिस्टम",
+ "filter_by_message": "संदेश से फ़िल्टर करें...",
+ "filter_by": "इसके द्वारा फ़िल्टर करें",
+ "total_logs": "कुल लॉग",
+ "active_tasks": "सक्रिय कार्य",
+ "success_rate": "सफलता दर",
+ "recent_failures": "हालिया विफलताएं",
+ "last_hours": "पिछले {hours} घंटे",
+ "currently_running": "वर्तमान में चल रहा है",
+ "successful": "सफल",
+ "need_attention": "ध्यान देने की आवश्यकता",
+ "no_logs": "कोई लॉग नहीं मिला",
+ "loading": "लॉग लोड हो रहे हैं...",
+ "error_loading": "लॉग लोड करने में त्रुटि",
+ "columns": "कॉलम",
+ "failed_load_summary": "सारांश लोड करने में विफल",
+ "retry": "पुनः प्रयास करें",
+ "view": "देखें",
+ "toggle_columns": "कॉलम टॉगल करें",
+ "rows_per_page": "प्रति पृष्ठ पंक्तियां",
+ "view_metadata": "मेटाडेटा देखें",
+ "log_deleted_success": "लॉग सफलतापूर्वक हटाया गया",
+ "log_deleted_error": "लॉग हटाने में विफल",
+ "confirm_delete_log_title": "क्या आप सुनिश्चित हैं?",
+ "confirm_delete_log_desc": "यह क्रिया पूर्ववत नहीं की जा सकती। यह लॉग प्रविष्टि को स्थायी रूप से हटा देगी।",
+ "deleting": "हटाया जा रहा है"
+ },
+ "onboard": {
+ "welcome_title": "SurfSense में आपका स्वागत है",
+ "welcome_subtitle": "शुरू करने के लिए अपनी LLM कॉन्फ़िगरेशन सेट करें",
+ "step_of": "चरण {current} / {total}",
+ "percent_complete": "{percent}% पूर्ण",
+ "add_llm_provider": "LLM प्रदाता जोड़ें",
+ "assign_llm_roles": "LLM भूमिकाएं असाइन करें",
+ "setup_llm_configuration": "LLM कॉन्फ़िगरेशन सेटअप",
+ "configure_providers_and_assign_roles": "अपने LLM प्रदाता जोड़ें और उन्हें विशिष्ट भूमिकाओं में असाइन करें",
+ "assign_llm_roles_title": "LLM भूमिकाएं असाइन करें",
+ "complete_role_assignment": "जारी रखने के लिए अपनी LLM कॉन्फ़िगरेशन को विशिष्ट भूमिकाओं में असाइन करें",
+ "setup_complete": "सेटअप पूरा हुआ",
+ "configure_first_provider": "अपना पहला मॉडल प्रदाता कॉन्फ़िगर करें",
+ "assign_specific_roles": "अपनी LLM कॉन्फ़िगरेशन को विशिष्ट भूमिकाएं असाइन करें",
+ "all_set": "SurfSense का उपयोग शुरू करने के लिए आप तैयार हैं!",
+ "loading_config": "आपकी कॉन्फ़िगरेशन लोड हो रही है...",
+ "previous": "पिछला",
+ "next": "अगला",
+ "complete_setup": "सेटअप पूरा करें",
+ "add_provider_instruction": "जारी रखने के लिए कम से कम एक LLM प्रदाता जोड़ें। आप कई प्रदाता कॉन्फ़िगर कर सकते हैं और अगले चरण में प्रत्येक के लिए विशिष्ट भूमिकाएं चुन सकते हैं।",
+ "your_llm_configs": "आपकी LLM कॉन्फ़िगरेशन",
+ "model": "मॉडल",
+ "language": "भाषा",
+ "base": "बेस",
+ "add_provider_title": "LLM प्रदाता जोड़ें",
+ "add_provider_subtitle": "शुरू करने के लिए अपना पहला मॉडल प्रदाता कॉन्फ़िगर करें",
+ "add_provider_button": "प्रदाता जोड़ें",
+ "add_new_llm_provider": "नया LLM प्रदाता जोड़ें",
+ "configure_new_provider": "अपने AI सहायक के लिए एक नया भाषा मॉडल प्रदाता कॉन्फ़िगर करें",
+ "config_name": "कॉन्फ़िगरेशन नाम",
+ "config_name_required": "कॉन्फ़िगरेशन नाम *",
+ "config_name_placeholder": "उदा., मेरा OpenAI GPT-4",
+ "provider": "प्रदाता",
+ "provider_required": "प्रदाता *",
+ "provider_placeholder": "प्रदाता चुनें",
+ "language_optional": "भाषा (वैकल्पिक)",
+ "language_placeholder": "भाषा चुनें",
+ "custom_provider_name": "कस्टम प्रदाता नाम *",
+ "custom_provider_placeholder": "उदा., my-custom-provider",
+ "model_name_required": "मॉडल नाम *",
+ "model_name_placeholder": "उदा., gpt-4",
+ "examples": "उदाहरण",
+ "api_key_required": "API कुंजी *",
+ "api_key_placeholder": "आपकी API कुंजी",
+ "api_base_optional": "API बेस URL (वैकल्पिक)",
+ "api_base_placeholder": "उदा., https://api.openai.com/v1",
+ "adding": "जोड़ा जा रहा है...",
+ "add_provider": "प्रदाता जोड़ें",
+ "cancel": "रद्द करें",
+ "assign_roles_instruction": "अपनी LLM कॉन्फ़िगरेशन को विशिष्ट भूमिकाओं में असाइन करें। प्रत्येक भूमिका आपके वर्कफ़्लो में अलग-अलग उद्देश्य पूरा करती है।",
+ "no_llm_configs_found": "कोई LLM कॉन्फ़िगरेशन नहीं मिला",
+ "add_provider_before_roles": "भूमिकाएं असाइन करने से पहले कृपया पिछले चरण में कम से कम एक LLM प्रदाता जोड़ें।",
+ "long_context_llm_title": "लंबे कॉन्टेक्स्ट LLM",
+ "long_context_llm_desc": "लंबे दस्तावेज़ सारांश और जटिल प्रश्नोत्तर संभालता है",
+ "long_context_llm_examples": "दस्तावेज़ विश्लेषण, शोध संश्लेषण, जटिल प्रश्नोत्तर",
+ "fast_llm_title": "तेज़ LLM",
+ "fast_llm_desc": "त्वरित प्रतिक्रियाओं और रीयल-टाइम इंटरैक्शन के लिए अनुकूलित",
+ "fast_llm_examples": "त्वरित खोज, सरल प्रश्न, तत्काल प्रतिक्रियाएं",
+ "strategic_llm_title": "रणनीतिक LLM",
+ "strategic_llm_desc": "योजना और रणनीतिक निर्णय लेने के लिए उन्नत तर्क",
+ "strategic_llm_examples": "वर्कफ़्लो योजना, रणनीतिक विश्लेषण, जटिल समस्या समाधान",
+ "use_cases": "उपयोग के मामले",
+ "assign_llm_config": "LLM कॉन्फ़िगरेशन असाइन करें",
+ "select_llm_config": "एक LLM कॉन्फ़िगरेशन चुनें",
+ "assigned": "असाइन किया गया",
+ "all_roles_assigned_saved": "सभी भूमिकाएं असाइन और सहेजी गई!",
+ "progress": "प्रगति",
+ "roles_assigned": "{total} में से {assigned} भूमिकाएं असाइन की गईं",
+ "global_configs": "वैश्विक कॉन्फ़िगरेशन",
+ "your_configs": "आपकी कॉन्फ़िगरेशन"
+ },
+ "model_config": {
+ "title": "मॉडल कॉन्फ़िगरेशन",
+ "subtitle": "अपने LLM प्रदाता कॉन्फ़िगरेशन और API सेटिंग्स प्रबंधित करें।",
+ "refresh": "रीफ्रेश करें",
+ "loading": "कॉन्फ़िगरेशन लोड हो रही हैं...",
+ "total_configs": "कुल कॉन्फ़िगरेशन",
+ "unique_providers": "अद्वितीय प्रदाता",
+ "system_status": "सिस्टम स्थिति",
+ "active": "सक्रिय",
+ "your_configs": "आपकी कॉन्फ़िगरेशन",
+ "manage_configs": "अपने LLM प्रदाता प्रबंधित और कॉन्फ़िगर करें",
+ "add_config": "कॉन्फ़िगरेशन जोड़ें",
+ "no_configs": "अभी तक कोई कॉन्फ़िगरेशन नहीं",
+ "no_configs_desc": "अपनी LLM प्रदाता कॉन्फ़िगरेशन जोड़ें।",
+ "add_first_config": "पहली कॉन्फ़िगरेशन जोड़ें",
+ "created": "बनाया गया"
+ },
+ "breadcrumb": {
+ "dashboard": "डैशबोर्ड",
+ "search_space": "सर्च स्पेस",
+ "chat": "चैट",
+ "documents": "दस्तावेज़",
+ "connectors": "कनेक्टर",
+ "editor": "एडिटर",
+ "logs": "लॉग",
+ "settings": "सेटिंग्स",
+ "upload_documents": "दस्तावेज़ अपलोड करें",
+ "add_youtube": "YouTube वीडियो जोड़ें",
+ "add_webpages": "वेबपेज जोड़ें",
+ "add_connector": "कनेक्टर जोड़ें",
+ "manage_connectors": "कनेक्टर प्रबंधित करें",
+ "edit_connector": "कनेक्टर संपादित करें",
+ "manage": "प्रबंधित करें"
+ },
+ "sidebar": {
+ "chats": "निजी चैट",
+ "shared_chats": "साझा चैट",
+ "search_chats": "चैट खोजें",
+ "no_chats_found": "कोई चैट नहीं मिला",
+ "no_shared_chats": "कोई साझा चैट नहीं",
+ "view_all_shared_chats": "सभी साझा चैट देखें",
+ "view_all_private_chats": "सभी निजी चैट देखें",
+ "no_chats": "अभी तक कोई चैट नहीं",
+ "start_new_chat_hint": "नई चैट शुरू करें",
+ "error_loading_chats": "चैट लोड करने में त्रुटि",
+ "chat_deleted": "चैट सफलतापूर्वक हटाया गया",
+ "error_deleting_chat": "चैट हटाने में विफल",
+ "delete": "हटाएं",
+ "try_different_search": "कोई अलग खोज शब्द आज़माएं",
+ "updated": "अपडेट किया गया",
+ "more_options": "और विकल्प",
+ "clear_search": "खोज साफ करें",
+ "archive": "आर्काइव करें",
+ "unarchive": "पुनर्स्थापित करें",
+ "chat_archived": "चैट आर्काइव किया गया",
+ "chat_unarchived": "चैट पुनर्स्थापित किया गया",
+ "chat_renamed": "चैट का नाम बदला गया",
+ "error_renaming_chat": "चैट का नाम बदलने में विफल",
+ "rename": "नाम बदलें",
+ "rename_chat": "चैट का नाम बदलें",
+ "rename_chat_description": "इस वार्तालाप के लिए एक नया नाम दर्ज करें।",
+ "chat_title_placeholder": "चैट शीर्षक",
+ "renaming": "नाम बदला जा रहा है...",
+ "no_archived_chats": "कोई आर्काइव्ड चैट नहीं",
+ "error_archiving_chat": "चैट आर्काइव करने में विफल",
+ "new_chat": "नई चैट",
+ "select_search_space": "सर्च स्पेस चुनें",
+ "manage_members": "सदस्य प्रबंधित करें",
+ "search_space_settings": "सर्च स्पेस सेटिंग्स",
+ "logs": "लॉग",
+ "see_all_search_spaces": "सभी सर्च स्पेस देखें",
+ "expand_sidebar": "साइडबार विस्तृत करें",
+ "collapse_sidebar": "साइडबार संकुचित करें",
+ "user_settings": "उपयोगकर्ता सेटिंग्स",
+ "language": "भाषा",
+ "theme": "थीम",
+ "light": "लाइट",
+ "dark": "डार्क",
+ "system": "सिस्टम",
+ "logout": "लॉगआउट",
+ "loggingOut": "लॉगआउट हो रहा है...",
+ "inbox": "इनबॉक्स",
+ "search_inbox": "इनबॉक्स में खोजें",
+ "mark_all_read": "सभी पढ़ा हुआ चिह्नित करें",
+ "mark_as_read": "पढ़ा हुआ चिह्नित करें",
+ "mentions": "उल्लेख",
+ "comments": "टिप्पणियां",
+ "status": "स्थिति",
+ "no_results_found": "कोई परिणाम नहीं मिला",
+ "no_mentions": "कोई उल्लेख नहीं",
+ "no_mentions_hint": "आप यहां दूसरों के उल्लेख देखेंगे",
+ "no_comments": "कोई टिप्पणियां नहीं",
+ "no_comments_hint": "आप यहां उल्लेख और उत्तर देखेंगे",
+ "no_status_updates": "कोई स्थिति अपडेट नहीं",
+ "no_status_updates_hint": "दस्तावेज़ और कनेक्टर अपडेट यहां दिखाई देंगे",
+ "filter": "फ़िल्टर",
+ "all": "सभी",
+ "unread": "अपठित",
+ "connectors": "कनेक्टर",
+ "all_connectors": "सभी कनेक्टर",
+ "close": "बंद करें"
+ },
+ "errors": {
+ "something_went_wrong": "कुछ गलत हो गया",
+ "try_again": "कृपया पुनः प्रयास करें",
+ "not_found": "नहीं मिला",
+ "unauthorized": "अनधिकृत",
+ "forbidden": "प्रतिबंधित",
+ "server_error": "सर्वर त्रुटि",
+ "network_error": "नेटवर्क त्रुटि"
+ },
+ "searchSpaceSettings": {
+ "title": "सर्च स्पेस सेटिंग्स",
+ "back_to_app": "ऐप पर वापस जाएं",
+ "nav_general": "सामान्य",
+ "nav_general_desc": "नाम, विवरण और बुनियादी जानकारी",
+ "nav_agent_configs": "एजेंट कॉन्फ़िगरेशन",
+ "nav_agent_configs_desc": "प्रॉम्प्ट और उद्धरण के साथ LLM मॉडल",
+ "nav_role_assignments": "भूमिका असाइनमेंट",
+ "nav_role_assignments_desc": "एजेंट भूमिकाओं को कॉन्फ़िगरेशन असाइन करें",
+ "nav_image_models": "इमेज मॉडल",
+ "nav_image_models_desc": "इमेज जनरेशन मॉडल कॉन्फ़िगर करें",
+ "nav_system_instructions": "सिस्टम निर्देश",
+ "nav_system_instructions_desc": "सर्च स्पेस-व्यापी AI निर्देश",
+ "nav_public_links": "सार्वजनिक चैट लिंक",
+ "nav_public_links_desc": "सार्वजनिक रूप से साझा किए गए चैट लिंक प्रबंधित करें",
+ "general_name_label": "नाम",
+ "general_name_placeholder": "सर्च स्पेस का नाम दर्ज करें",
+ "general_name_description": "आपके सर्च स्पेस के लिए एक अद्वितीय नाम।",
+ "general_description_label": "विवरण",
+ "general_description_placeholder": "सर्च स्पेस का विवरण दर्ज करें",
+ "general_description_description": "इस सर्च स्पेस के उपयोग का संक्षिप्त विवरण।",
+ "general_reset": "परिवर्तन रीसेट करें",
+ "general_save": "परिवर्तन सहेजें",
+ "general_saving": "सहेजा जा रहा है",
+ "general_unsaved_changes": "आपके पास सहेजे नहीं गए परिवर्तन हैं। उन्हें लागू करने के लिए \"परिवर्तन सहेजें\" पर क्लिक करें।"
+ },
+ "homepage": {
+ "hero_title_part1": "AI कार्यक्षेत्र",
+ "hero_title_part2": "टीमों के लिए बनाया गया",
+ "hero_description": "किसी भी LLM को अपने आंतरिक ज्ञान स्रोतों से जोड़ें और अपनी टीम के साथ रीयल-टाइम में चैट करें।",
+ "cta_start_trial": "मुफ़्त शुरू करें",
+ "cta_explore": "एक्सप्लोर करें",
+ "integrations_title": "एकीकरण",
+ "integrations_subtitle": "अपनी टीम के सबसे महत्वपूर्ण टूल के साथ एकीकृत करें",
+ "features_title": "आपकी टीम का AI-संचालित ज्ञान केंद्र",
+ "features_subtitle": "सहयोग बढ़ाने, उत्पादकता बढ़ाने और अपने वर्कफ़्लो को सुव्यवस्थित करने के लिए डिज़ाइन की गई शक्तिशाली सुविधाएं।",
+ "feature_workflow_title": "सुव्यवस्थित वर्कफ़्लो",
+ "feature_workflow_desc": "अपने सभी ज्ञान और संसाधनों को एक बुद्धिमान कार्यक्षेत्र में केंद्रित करें। तुरंत वह खोजें जो आपको चाहिए और निर्णय लेने में तेज़ी लाएं।",
+ "feature_collaboration_title": "सहज सहयोग",
+ "feature_collaboration_desc": "रीयल-टाइम सहयोग टूल के साथ आसानी से एक साथ काम करें जो आपकी पूरी टीम को संरेखित रखें।",
+ "feature_customizable_title": "पूरी तरह अनुकूलन योग्य",
+ "feature_customizable_desc": "100+ प्रमुख LLM में से चुनें और मांग पर किसी भी मॉडल को सहजता से कॉल करें।",
+ "cta_transform": "बदलें कि आपकी टीम कैसे",
+ "cta_transform_bold": "खोजती और सहयोग करती है",
+ "cta_unite_start": "अपनी",
+ "cta_unite_knowledge": "टीम के ज्ञान",
+ "cta_unite_middle": "को एक सहयोगी स्थान में एकजुट करें",
+ "cta_unite_search": "बुद्धिमान खोज के साथ",
+ "cta_talk_to_us": "हमसे बात करें",
+ "features": {
+ "find_ask_act": {
+ "title": "खोजें, पूछें, कार्य करें",
+ "description": "कंपनी और व्यक्तिगत ज्ञान से तत्काल जानकारी, विस्तृत अपडेट और उद्धृत उत्तर प्राप्त करें।"
+ },
+ "real_time_collab": {
+ "title": "रीयल-टाइम में एक साथ काम करें",
+ "description": "अपनी कंपनी के दस्तावेज़ों को लाइव एडिट, सिंक्ड सामग्री और उपस्थिति के साथ मल्टीप्लेयर स्पेस में बदलें।"
+ },
+ "beyond_text": {
+ "title": "टेक्स्ट से परे सहयोग करें",
+ "description": "पॉडकास्ट और मल्टीमीडिया बनाएं जिन पर आपकी टीम टिप्पणी कर सकती है, साझा कर सकती है और एक साथ सुधार कर सकती है।"
+ },
+ "context_counts": {
+ "title": "जहां मायने रखता है वहां संदर्भ",
+ "description": "स्पष्ट, तात्कालिक प्रतिक्रिया के लिए सीधे अपने चैट और दस्तावेज़ों में टिप्पणियां जोड़ें।"
+ },
+ "citation_illustration_title": "क्लिक करने योग्य स्रोत संदर्भ दिखाने वाली उद्धरण सुविधा का चित्रण",
+ "referenced_chunk": "संदर्भित अंश",
+ "collab_illustration_label": "टेक्स्ट एडिटर में रीयल-टाइम सहयोग का चित्रण।",
+ "real_time": "रीयल-टाइम",
+ "collab_part1": "सह",
+ "collab_part2": "यो",
+ "collab_part3": "ग",
+ "annotation_illustration_label": "एनोटेशन टिप्पणियों वाले टेक्स्ट एडिटर का चित्रण।",
+ "add_context_with": "संदर्भ जोड़ें",
+ "comments": "टिप्पणियों के साथ",
+ "example_comment": "इस पर कल चर्चा करते हैं!"
+ }
+ },
+ "public_chat": {
+ "not_found_title": "यह चैट हटा दिया गया है।",
+ "click_here": "यहां क्लिक करें",
+ "sign_in_prompt": "SurfSense में लॉगिन करने और अपना शुरू करने के लिए।"
+ }
+}
diff --git a/surfsense_web/messages/pt.json b/surfsense_web/messages/pt.json
new file mode 100644
index 000000000..3803e066c
--- /dev/null
+++ b/surfsense_web/messages/pt.json
@@ -0,0 +1,818 @@
+{
+ "common": {
+ "app_name": "SurfSense",
+ "welcome": "Bem-vindo",
+ "save": "Salvar",
+ "cancel": "Cancelar",
+ "delete": "Excluir",
+ "edit": "Editar",
+ "create": "Criar",
+ "update": "Atualizar",
+ "search": "Pesquisar",
+ "close": "Fechar",
+ "confirm": "Confirmar",
+ "back": "Voltar",
+ "next": "Próximo",
+ "submit": "Enviar",
+ "yes": "Sim",
+ "no": "Não",
+ "add": "Adicionar",
+ "remove": "Remover",
+ "select": "Selecionar",
+ "all": "Tudo",
+ "none": "Nenhum",
+ "error": "Erro",
+ "success": "Sucesso",
+ "warning": "Aviso",
+ "info": "Informação",
+ "required": "Obrigatório",
+ "optional": "Opcional",
+ "retry": "Tentar novamente",
+ "owner": "Proprietário",
+ "shared": "Compartilhado",
+ "settings": "Configurações"
+ },
+ "auth": {
+ "login": "Entrar",
+ "register": "Cadastrar",
+ "logout": "Sair",
+ "email": "E-mail",
+ "password": "Senha",
+ "confirm_password": "Confirmar senha",
+ "forgot_password": "Esqueceu a senha?",
+ "show_password": "Mostrar senha",
+ "hide_password": "Ocultar senha",
+ "remember_me": "Lembrar de mim",
+ "sign_in": "Entrar",
+ "signing_in": "Entrando",
+ "sign_up": "Cadastrar",
+ "sign_in_with": "Entrar com {provider}",
+ "dont_have_account": "Não tem uma conta?",
+ "already_have_account": "Já tem uma conta?",
+ "reset_password": "Redefinir senha",
+ "email_required": "O e-mail é obrigatório",
+ "password_required": "A senha é obrigatória",
+ "invalid_email": "Endereço de e-mail inválido",
+ "password_too_short": "A senha deve ter pelo menos 8 caracteres",
+ "welcome_back": "Bem-vindo de volta",
+ "create_account": "Crie sua conta",
+ "login_subtitle": "Insira suas credenciais para acessar sua conta",
+ "register_subtitle": "Cadastre-se para começar a usar o SurfSense",
+ "or_continue_with": "Ou continuar com",
+ "by_continuing": "Ao continuar, você concorda com nossos",
+ "terms_of_service": "Termos de serviço",
+ "and": "e",
+ "privacy_policy": "Política de privacidade",
+ "full_name": "Nome completo",
+ "username": "Nome de usuário",
+ "continue": "Continuar",
+ "back_to_login": "Voltar ao login",
+ "login_success": "Login realizado com sucesso",
+ "register_success": "Conta criada com sucesso",
+ "continue_with_google": "Continuar com Google",
+ "cloud_dev_notice": "O SurfSense Cloud está atualmente em desenvolvimento. Consulte",
+ "docs": "Documentação",
+ "cloud_dev_self_hosted": "para mais informações sobre a versão auto-hospedada.",
+ "passwords_no_match": "As senhas não coincidem",
+ "password_mismatch": "Senhas diferentes",
+ "passwords_no_match_desc": "As senhas que você digitou não coincidem",
+ "creating_account": "Criando sua conta",
+ "creating_account_btn": "Criando conta",
+ "redirecting_login": "Redirecionando para a página de login"
+ },
+ "searchSpace": {
+ "create_title": "Criar espaço de pesquisa",
+ "create_description": "Crie um novo espaço de pesquisa para organizar seu conhecimento",
+ "name_label": "Nome",
+ "name_placeholder": "Digite o nome do espaço de pesquisa",
+ "description_label": "Descrição",
+ "description_placeholder": "Para que é este espaço de pesquisa?",
+ "create_button": "Criar",
+ "creating": "Criando",
+ "all_search_spaces": "Todos os espaços de pesquisa",
+ "search_spaces_count": "{count, plural, =0 {Nenhum espaço de pesquisa} =1 {1 espaço de pesquisa} other {# espaços de pesquisa}}",
+ "no_search_spaces": "Nenhum espaço de pesquisa ainda",
+ "create_first_search_space": "Crie seu primeiro espaço de pesquisa para começar",
+ "members_count": "{count, plural, =1 {1 membro} other {# membros}}",
+ "create_new_search_space": "Criar novo espaço de pesquisa",
+ "delete_title": "Excluir espaço de pesquisa",
+ "delete_confirm": "Tem certeza de que deseja excluir \"{name}\"? Esta ação não pode ser desfeita e removerá permanentemente todos os dados.",
+ "leave": "Sair",
+ "leave_title": "Sair do espaço de pesquisa",
+ "leave_confirm": "Tem certeza de que deseja sair de \"{name}\"? Você perderá acesso a todos os documentos e chats neste espaço de pesquisa.",
+ "leaving": "Saindo...",
+ "welcome_title": "Bem-vindo ao SurfSense",
+ "welcome_description": "Crie seu primeiro espaço de pesquisa para começar a organizar seu conhecimento, conectar fontes e conversar com IA.",
+ "create_first_button": "Crie seu primeiro espaço de pesquisa"
+ },
+ "userSettings": {
+ "title": "Configurações do usuário",
+ "description": "Gerencie suas configurações de conta e acesso à API",
+ "back_to_app": "Voltar ao app",
+ "profile_nav_label": "Perfil",
+ "profile_nav_description": "Gerencie seu nome e avatar",
+ "profile_title": "Perfil",
+ "profile_description": "Atualize suas informações pessoais",
+ "profile_avatar": "Foto do perfil",
+ "profile_display_name": "Nome de exibição",
+ "profile_display_name_hint": "É assim que seu nome aparece no aplicativo",
+ "profile_email": "E-mail",
+ "profile_save": "Salvar alterações",
+ "profile_saved": "Perfil atualizado com sucesso",
+ "profile_save_error": "Falha ao atualizar o perfil",
+ "api_key_nav_label": "Chave API",
+ "api_key_nav_description": "Gerencie seu token de acesso à API",
+ "api_key_title": "Chave API",
+ "api_key_description": "Use esta chave para autenticar solicitações da API",
+ "api_key_warning_title": "Mantenha em segredo",
+ "api_key_warning_description": "Sua chave API concede acesso total à sua conta. Nunca a compartilhe publicamente nem a inclua no controle de versão.",
+ "your_api_key": "Sua chave API",
+ "copied": "Copiado!",
+ "copy": "Copiar para a área de transferência",
+ "no_api_key": "Nenhuma chave API encontrada",
+ "usage_title": "Como usar",
+ "usage_description": "Inclua sua chave API no cabeçalho Authorization:"
+ },
+ "dashboard": {
+ "title": "Painel",
+ "search_spaces": "Espaços de pesquisa",
+ "documents": "Documentos",
+ "connectors": "Conectores",
+ "settings": "Configurações",
+ "chat": "Chat",
+ "api_keys": "Chaves API",
+ "profile": "Perfil",
+ "loading_dashboard": "Carregando painel",
+ "loading_config": "Carregando configuração",
+ "config_error": "Erro de configuração",
+ "failed_load_llm_config": "Falha ao carregar sua configuração de LLM",
+ "error_loading_chats": "Erro ao carregar chats",
+ "loading_chat": "Carregando chat",
+ "loading_document": "Carregando documento",
+ "no_recent_chats": "Nenhum chat recente",
+ "error_loading_space": "Erro ao carregar o espaço de pesquisa",
+ "unknown_search_space": "Espaço de pesquisa desconhecido",
+ "delete_chat": "Excluir chat",
+ "delete_chat_confirm": "Tem certeza de que deseja excluir",
+ "delete_note": "Excluir nota",
+ "delete_note_confirm": "Tem certeza de que deseja excluir",
+ "action_cannot_undone": "Esta ação não pode ser desfeita.",
+ "deleting": "Excluindo",
+ "surfsense_dashboard": "Painel do SurfSense",
+ "welcome_message": "Bem-vindo ao seu painel do SurfSense.",
+ "your_search_spaces": "Seus espaços de pesquisa",
+ "shared": "Compartilhado",
+ "create_search_space": "Criar espaço de pesquisa",
+ "add_new_search_space": "Adicionar novo espaço de pesquisa",
+ "loading": "Carregando",
+ "may_take_moment": "Isso pode levar um momento",
+ "error": "Erro",
+ "something_wrong": "Algo deu errado",
+ "error_details": "Detalhes do erro",
+ "try_again": "Tentar novamente",
+ "go_home": "Ir para o início",
+ "delete_search_space": "Excluir espaço de pesquisa",
+ "delete_space_confirm": "Tem certeza de que deseja excluir \"{name}\"? Esta ação não pode ser desfeita. Todos os documentos e chats neste espaço de pesquisa serão excluídos permanentemente.",
+ "leave": "Sair",
+ "leave_title": "Sair do espaço de pesquisa",
+ "leave_confirm": "Tem certeza de que deseja sair de \"{name}\"? Você perderá acesso a todos os documentos e chats neste espaço de pesquisa.",
+ "leaving": "Saindo...",
+ "no_spaces_found": "Nenhum espaço de pesquisa encontrado",
+ "create_first_space": "Crie seu primeiro espaço de pesquisa para começar",
+ "created": "Criado"
+ },
+ "navigation": {
+ "home": "Início",
+ "docs": "Documentação",
+ "pricing": "Preços",
+ "contact": "Contato",
+ "login": "Entrar",
+ "register": "Cadastrar",
+ "dashboard": "Painel",
+ "sign_in": "Entrar",
+ "book_a_call": "Agendar uma chamada"
+ },
+ "nav_menu": {
+ "settings": "Configurações",
+ "platform": "Plataforma",
+ "chat": "Chat",
+ "manage_llms": "Gerenciar LLMs",
+ "sources": "Fontes",
+ "add_sources": "Adicionar fontes",
+ "documents": "Documentos",
+ "upload_documents": "Enviar documentos",
+ "add_webpages": "Adicionar páginas web",
+ "add_youtube": "Adicionar vídeos do YouTube",
+ "add_youtube_videos": "Adicionar vídeos do YouTube",
+ "manage_documents": "Gerenciar documentos",
+ "connectors": "Conectores",
+ "add_connector": "Adicionar conector",
+ "manage_connectors": "Gerenciar conectores",
+ "logs": "Logs",
+ "all_search_spaces": "Todos os espaços de pesquisa",
+ "team": "Equipe"
+ },
+ "pricing": {
+ "title": "Preços do SurfSense",
+ "subtitle": "Escolha o que funciona para você",
+ "community_name": "COMUNIDADE",
+ "enterprise_name": "EMPRESA",
+ "forever": "para sempre",
+ "contact_us": "Fale conosco",
+ "feature_llms": "Suporta mais de 100 LLMs",
+ "feature_ollama": "Suporta configurações locais de Ollama ou vLLM",
+ "feature_embeddings": "Mais de 6000 modelos de embeddings",
+ "feature_files": "Mais de 50 extensões de arquivo suportadas.",
+ "feature_podcasts": "Suporte a podcasts com provedores TTS locais.",
+ "feature_sources": "Conecta com mais de 15 fontes externas.",
+ "feature_extension": "Extensão multi-navegador para páginas web dinâmicas incluindo conteúdo autenticado",
+ "upcoming_mindmaps": "Em breve: Mapas mentais combináveis",
+ "upcoming_notes": "Em breve: Gerenciamento de notas",
+ "community_desc": "Versão de código aberto com recursos poderosos",
+ "get_started": "Começar",
+ "everything_community": "Tudo da Comunidade",
+ "priority_support": "Suporte prioritário",
+ "access_controls": "Controles de acesso",
+ "collaboration": "Colaboração e recursos multiplayer",
+ "video_gen": "Geração de vídeo",
+ "advanced_security": "Recursos de segurança avançados",
+ "enterprise_desc": "Para grandes organizações com necessidades específicas",
+ "contact_sales": "Falar com vendas"
+ },
+ "contact": {
+ "title": "Contato",
+ "subtitle": "Adoraríamos ouvir você.",
+ "we_are_here": "Estamos aqui",
+ "full_name": "Nome completo",
+ "email_address": "Endereço de e-mail",
+ "company": "Empresa",
+ "message": "Mensagem",
+ "optional": "opcional",
+ "name_placeholder": "João Silva",
+ "email_placeholder": "joao.silva@exemplo.com",
+ "company_placeholder": "Exemplo Ltda.",
+ "message_placeholder": "Digite sua mensagem aqui",
+ "submit": "Enviar",
+ "submitting": "Enviando...",
+ "name_required": "O nome é obrigatório",
+ "name_too_long": "O nome é muito longo",
+ "invalid_email": "Endereço de e-mail inválido",
+ "email_too_long": "O e-mail é muito longo",
+ "company_required": "A empresa é obrigatória",
+ "company_too_long": "O nome da empresa é muito longo",
+ "message_sent": "Mensagem enviada com sucesso!",
+ "we_will_contact": "Entraremos em contato o mais breve possível.",
+ "send_failed": "Falha ao enviar a mensagem",
+ "try_again_later": "Por favor, tente novamente mais tarde.",
+ "something_wrong": "Algo deu errado"
+ },
+ "connectors": {
+ "title": "Conectores",
+ "subtitle": "Gerencie seus serviços conectados e fontes de dados.",
+ "add_connector": "Adicionar conector",
+ "your_connectors": "Seus conectores",
+ "view_manage": "Visualize e gerencie todos os seus serviços conectados.",
+ "no_connectors": "Nenhum conector encontrado",
+ "no_connectors_desc": "Você ainda não adicionou nenhum conector. Adicione um para melhorar suas capacidades de pesquisa.",
+ "add_first": "Adicione seu primeiro conector",
+ "name": "Nome",
+ "type": "Tipo",
+ "last_indexed": "Última indexação",
+ "periodic": "Periódico",
+ "actions": "Ações",
+ "never": "Nunca",
+ "not_indexable": "Não indexável",
+ "index_date_range": "Indexar com intervalo de datas",
+ "quick_index": "Indexação rápida",
+ "quick_index_auto": "Indexação rápida (intervalo automático)",
+ "delete_connector": "Excluir conector",
+ "delete_confirm": "Tem certeza de que deseja excluir este conector? Esta ação não pode ser desfeita.",
+ "select_date_range": "Selecionar intervalo de datas para indexação",
+ "select_date_range_desc": "Escolha as datas de início e fim para indexar o conteúdo. Deixe vazio para usar o intervalo padrão.",
+ "start_date": "Data de início",
+ "end_date": "Data de fim",
+ "pick_date": "Escolher data",
+ "clear_dates": "Limpar datas",
+ "last_30_days": "Últimos 30 dias",
+ "last_year": "Último ano",
+ "start_indexing": "Iniciar indexação",
+ "failed_load": "Falha ao carregar conectores",
+ "delete_success": "Conector excluído com sucesso",
+ "delete_failed": "Falha ao excluir conector",
+ "indexing_started": "Indexação do conteúdo do conector iniciada",
+ "indexing_failed": "Falha ao indexar conteúdo do conector"
+ },
+ "documents": {
+ "title": "Documentos",
+ "subtitle": "Gerencie seus documentos e arquivos.",
+ "no_rows_selected": "Nenhuma linha selecionada",
+ "delete_success_count": "{count} documento(s) excluído(s) com sucesso",
+ "delete_partial_failed": "Alguns documentos não puderam ser excluídos",
+ "delete_success": "Documento excluído com sucesso",
+ "delete_error": "Erro ao excluir documentos",
+ "filter_by_title": "Filtrar por título...",
+ "bulk_delete": "Excluir selecionados",
+ "filter_types": "Filtrar tipos",
+ "columns": "Colunas",
+ "confirm_delete": "Confirmar exclusão",
+ "confirm_delete_desc": "Tem certeza de que deseja excluir {count} documento(s)? Esta ação não pode ser desfeita.",
+ "uploading": "Enviando",
+ "upload_success": "Documento enviado com sucesso",
+ "upload_failed": "Falha ao enviar documento",
+ "loading": "Carregando documentos",
+ "error_loading": "Erro ao carregar documentos",
+ "retry": "Tentar novamente",
+ "no_documents": "Nenhum documento encontrado",
+ "type": "Tipo",
+ "content_summary": "Resumo do conteúdo",
+ "view_full": "Ver resumo",
+ "filter_placeholder": "Filtrar por título...",
+ "rows_per_page": "Linhas por página",
+ "refresh": "Atualizar",
+ "upload_documents": "Enviar documentos",
+ "create_shared_note": "Criar nota compartilhada",
+ "processing_documents": "Processando documentos...",
+ "active_tasks_count": "{count} tarefa(s) ativa(s)"
+ },
+ "add_connector": {
+ "title": "Conecte suas ferramentas",
+ "subtitle": "Integre com seus serviços favoritos para melhorar suas capacidades de pesquisa.",
+ "web_search": "Pesquisa web",
+ "messaging": "Mensagens",
+ "project_management": "Gerenciamento de projetos",
+ "documentation": "Documentação",
+ "development": "Desenvolvimento",
+ "databases": "Bancos de dados",
+ "productivity": "Produtividade",
+ "web_crawling": "Rastreamento web",
+ "connect": "Conectar",
+ "coming_soon": "Em breve",
+ "connected": "Conectado",
+ "manage": "Gerenciar",
+ "tavily_desc": "Pesquise na web usando a API do Tavily",
+ "searxng_desc": "Use sua própria instância SearxNG para resultados web.",
+ "linkup_desc": "Pesquise na web usando a API do Linkup",
+ "elasticsearch_desc": "Conecte-se ao Elasticsearch para indexar e pesquisar documentos, logs e métricas.",
+ "baidu_desc": "Pesquise na web chinesa usando a API Baidu AI Search",
+ "slack_desc": "Conecte-se ao seu workspace do Slack para acessar mensagens e canais.",
+ "teams_desc": "Conecte-se ao Microsoft Teams para acessar as conversas da sua equipe.",
+ "discord_desc": "Conecte-se a servidores Discord para acessar mensagens e canais.",
+ "linear_desc": "Conecte-se ao Linear para pesquisar issues, comentários e dados de projetos.",
+ "jira_desc": "Conecte-se ao Jira para pesquisar issues, tickets e dados de projetos.",
+ "clickup_desc": "Conecte-se ao ClickUp para pesquisar tarefas, comentários e dados de projetos.",
+ "notion_desc": "Conecte-se ao seu workspace do Notion para acessar páginas e bancos de dados.",
+ "github_desc": "Conecte um PAT do GitHub para indexar código e docs de repositórios acessíveis.",
+ "confluence_desc": "Conecte-se ao Confluence para pesquisar páginas, comentários e documentação.",
+ "bookstack_desc": "Conecte-se ao BookStack para pesquisar páginas wiki e documentação.",
+ "airtable_desc": "Conecte-se ao Airtable para pesquisar registros, tabelas e conteúdo de bancos de dados.",
+ "luma_desc": "Conecte-se ao Luma para pesquisar eventos, encontros e reuniões.",
+ "circleback_desc": "Receba notas de reuniões, transcrições e itens de ação do Circleback via webhook.",
+ "calendar_desc": "Conecte-se ao Google Calendar para pesquisar eventos, reuniões e agendas.",
+ "gmail_desc": "Conecte-se à sua conta do Gmail para pesquisar seus e-mails.",
+ "google_drive_desc": "Conecte-se ao Google Drive para pesquisar e indexar seus arquivos e documentos.",
+ "zoom_desc": "Conecte-se ao Zoom para acessar gravações e transcrições de reuniões.",
+ "webcrawler_desc": "Rastreie e indexe conteúdo de qualquer página web pública."
+ },
+ "upload_documents": {
+ "title": "Enviar documentos",
+ "subtitle": "Envie seus arquivos para torná-los pesquisáveis e acessíveis através de conversas com IA.",
+ "file_size_limit": "Tamanho máximo do arquivo: 50 MB por arquivo.",
+ "upload_limits": "Limite de envio: {maxFiles} arquivos, {maxSizeMB} MB no total.",
+ "drop_files": "Solte os arquivos aqui",
+ "drag_drop": "Arraste e solte arquivos aqui",
+ "or_browse": "ou clique para navegar",
+ "browse_files": "Navegar arquivos",
+ "selected_files": "Arquivos selecionados ({count})",
+ "total_size": "Tamanho total",
+ "clear_all": "Limpar tudo",
+ "uploading_files": "Enviando arquivos",
+ "uploading": "Enviando",
+ "upload_button": "Enviar {count} {count, plural, one {arquivo} other {arquivos}}",
+ "upload_initiated": "Tarefa de envio iniciada",
+ "upload_initiated_desc": "O envio de arquivos foi iniciado",
+ "upload_error": "Erro no envio",
+ "upload_error_desc": "Erro ao enviar arquivos",
+ "supported_file_types": "Tipos de arquivo suportados",
+ "file_types_desc": "Estes tipos de arquivo são suportados com base na configuração atual do seu serviço ETL.",
+ "max_files_exceeded": "Limite de arquivos excedido",
+ "max_files_exceeded_desc": "Você pode enviar no máximo {max} arquivos de uma vez.",
+ "max_size_exceeded": "Limite de tamanho excedido",
+ "max_size_exceeded_desc": "O tamanho total dos arquivos não pode exceder {max} MB.",
+ "file_limit_reached": "Máximo de arquivos atingido",
+ "file_limit_reached_desc": "Remova alguns arquivos para adicionar mais (máximo {max} arquivos).",
+ "remaining_capacity": "{files} arquivos restantes • {sizeMB} MB disponíveis"
+ },
+ "add_webpage": {
+ "title": "Adicionar páginas web para rastreamento",
+ "subtitle": "Insira URLs para rastrear e adicionar à sua coleção de documentos",
+ "label": "Insira URLs para rastrear",
+ "placeholder": "Insira uma URL e pressione Enter",
+ "hint": "Adicione múltiplas URLs pressionando Enter após cada uma",
+ "tips_title": "Dicas para rastreamento de URLs:",
+ "tip_1": "Insira URLs completas incluindo http:// ou https://",
+ "tip_2": "Certifique-se de que os sites permitem rastreamento",
+ "tip_3": "Páginas web públicas funcionam melhor",
+ "tip_4": "O rastreamento pode levar algum tempo dependendo do tamanho do site",
+ "cancel": "Cancelar",
+ "submit": "Enviar URLs para rastreamento",
+ "submitting": "Enviando...",
+ "error_no_url": "Por favor, adicione pelo menos uma URL",
+ "error_invalid_urls": "URLs inválidas detectadas: {urls}",
+ "crawling_toast": "Rastreamento de URL",
+ "crawling_toast_desc": "Iniciando processo de rastreamento de URL...",
+ "success_toast": "Rastreamento bem-sucedido",
+ "success_toast_desc": "As URLs foram enviadas para rastreamento",
+ "error_toast": "Erro no rastreamento",
+ "error_toast_desc": "Erro ao rastrear URLs",
+ "error_generic": "Ocorreu um erro ao rastrear URLs",
+ "invalid_url_toast": "URL inválida",
+ "invalid_url_toast_desc": "Por favor, insira uma URL válida",
+ "duplicate_url_toast": "URL duplicada",
+ "duplicate_url_toast_desc": "Esta URL já foi adicionada"
+ },
+ "add_youtube": {
+ "title": "Adicionar vídeos do YouTube",
+ "subtitle": "Insira URLs de vídeos do YouTube para adicionar à sua coleção de documentos",
+ "label": "Insira URLs de vídeos do YouTube",
+ "placeholder": "Insira uma URL do YouTube e pressione Enter",
+ "hint": "Adicione múltiplas URLs do YouTube pressionando Enter após cada uma",
+ "tips_title": "Dicas para adicionar vídeos do YouTube:",
+ "tip_1": "Use URLs padrão do YouTube (youtube.com/watch?v= ou youtu.be/)",
+ "tip_2": "Certifique-se de que os vídeos sejam acessíveis publicamente",
+ "tip_3": "Formatos suportados: youtube.com/watch?v=VIDEO_ID ou youtu.be/VIDEO_ID",
+ "tip_4": "O processamento pode levar algum tempo dependendo da duração do vídeo",
+ "preview": "Visualizar",
+ "cancel": "Cancelar",
+ "submit": "Adicionar",
+ "processing": "Processando...",
+ "error_no_video": "Por favor, adicione pelo menos uma URL de vídeo do YouTube",
+ "error_invalid_urls": "URLs do YouTube inválidas detectadas: {urls}",
+ "processing_toast": "Processamento de vídeo do YouTube",
+ "processing_toast_desc": "Iniciando processamento de vídeo do YouTube...",
+ "success_toast": "Processamento bem-sucedido",
+ "success_toast_desc": "Os vídeos do YouTube foram enviados para processamento",
+ "error_toast": "Erro no processamento",
+ "error_toast_desc": "Erro ao processar vídeos do YouTube",
+ "error_generic": "Ocorreu um erro ao processar vídeos do YouTube",
+ "invalid_url_toast": "URL do YouTube inválida",
+ "invalid_url_toast_desc": "Por favor, insira uma URL válida de vídeo do YouTube",
+ "duplicate_url_toast": "URL duplicada",
+ "duplicate_url_toast_desc": "Este vídeo do YouTube já foi adicionado"
+ },
+ "settings": {
+ "title": "Configurações",
+ "subtitle": "Gerencie suas configurações de LLM e atribuições de funções para este espaço de pesquisa.",
+ "back_to_dashboard": "Voltar ao painel",
+ "model_configs": "Configurações de modelos",
+ "models": "Modelos",
+ "llm_roles": "Funções de LLM",
+ "roles": "Funções",
+ "llm_role_management": "Gerenciamento de funções de LLM",
+ "llm_role_desc": "Atribua suas configurações de LLM a funções específicas para diferentes propósitos.",
+ "no_llm_configs_found": "Nenhuma configuração de LLM encontrada. Adicione pelo menos um provedor de LLM na aba Configurações de Modelos antes de atribuir funções.",
+ "select_llm_config": "Selecione uma configuração de LLM",
+ "long_context_llm": "LLM de contexto longo",
+ "fast_llm": "LLM rápido",
+ "strategic_llm": "LLM estratégico",
+ "long_context_desc": "Lida com resumos de documentos longos e perguntas complexas",
+ "long_context_examples": "Análise de documentos, síntese de pesquisa, perguntas complexas",
+ "large_context_window": "Janela de contexto ampla",
+ "deep_reasoning": "Raciocínio profundo",
+ "complex_analysis": "Análise complexa",
+ "fast_llm_desc": "Otimizado para respostas rápidas e interações em tempo real",
+ "fast_llm_examples": "Pesquisas rápidas, perguntas simples, respostas instantâneas",
+ "low_latency": "Baixa latência",
+ "quick_responses": "Respostas rápidas",
+ "real_time_chat": "Chat em tempo real",
+ "strategic_llm_desc": "Raciocínio avançado para planejamento e tomada de decisões estratégicas",
+ "strategic_llm_examples": "Planejamento de fluxos de trabalho, análise estratégica, resolução de problemas complexos",
+ "strategic_thinking": "Pensamento estratégico",
+ "long_term_planning": "Planejamento a longo prazo",
+ "complex_reasoning": "Raciocínio complexo",
+ "use_cases": "Casos de uso",
+ "assign_llm_config": "Atribuir configuração de LLM",
+ "unassigned": "Não atribuído",
+ "assigned": "Atribuído",
+ "model": "Modelo",
+ "base": "Base",
+ "all_roles_assigned": "Todas as funções estão atribuídas e prontas para uso! Sua configuração de LLM está completa.",
+ "save_changes": "Salvar alterações",
+ "saving": "Salvando",
+ "reset": "Redefinir",
+ "status": "Status",
+ "status_ready": "Pronto",
+ "status_setup": "Configuração",
+ "complete_role_assignments": "Complete todas as atribuições de funções para habilitar a funcionalidade completa. Cada função tem diferentes propósitos no seu fluxo de trabalho.",
+ "all_roles_saved": "Todas as funções atribuídas e salvas!",
+ "progress": "Progresso",
+ "roles_assigned_count": "{assigned} de {total} funções atribuídas"
+ },
+ "logs": {
+ "title": "Logs de tarefas",
+ "subtitle": "Monitore e analise todos os logs de execução de tarefas",
+ "refresh": "Atualizar",
+ "delete_selected": "Excluir selecionados",
+ "confirm_title": "Tem certeza absoluta?",
+ "confirm_delete_desc": "Esta ação não pode ser desfeita. Isso excluirá permanentemente {count} log(s) selecionado(s).",
+ "cancel": "Cancelar",
+ "delete": "Excluir",
+ "level": "Nível",
+ "status": "Status",
+ "source": "Fonte",
+ "message": "Mensagem",
+ "created_at": "Criado em",
+ "actions": "Ações",
+ "system": "Sistema",
+ "filter_by_message": "Filtrar por mensagem...",
+ "filter_by": "Filtrar por",
+ "total_logs": "Total de logs",
+ "active_tasks": "Tarefas ativas",
+ "success_rate": "Taxa de sucesso",
+ "recent_failures": "Falhas recentes",
+ "last_hours": "Últimas {hours} horas",
+ "currently_running": "Em execução",
+ "successful": "bem-sucedido",
+ "need_attention": "Precisa de atenção",
+ "no_logs": "Nenhum log encontrado",
+ "loading": "Carregando logs...",
+ "error_loading": "Erro ao carregar logs",
+ "columns": "Colunas",
+ "failed_load_summary": "Falha ao carregar resumo",
+ "retry": "Tentar novamente",
+ "view": "Ver",
+ "toggle_columns": "Alternar colunas",
+ "rows_per_page": "Linhas por página",
+ "view_metadata": "Ver metadados",
+ "log_deleted_success": "Log excluído com sucesso",
+ "log_deleted_error": "Falha ao excluir log",
+ "confirm_delete_log_title": "Tem certeza?",
+ "confirm_delete_log_desc": "Esta ação não pode ser desfeita. Isso excluirá permanentemente a entrada do log.",
+ "deleting": "Excluindo"
+ },
+ "onboard": {
+ "welcome_title": "Bem-vindo ao SurfSense",
+ "welcome_subtitle": "Vamos configurar suas configurações de LLM para começar",
+ "step_of": "Passo {current} de {total}",
+ "percent_complete": "{percent}% concluído",
+ "add_llm_provider": "Adicionar provedor de LLM",
+ "assign_llm_roles": "Atribuir funções de LLM",
+ "setup_llm_configuration": "Configurar LLM",
+ "configure_providers_and_assign_roles": "Adicione seus provedores de LLM e atribua-os a funções específicas",
+ "assign_llm_roles_title": "Atribuir funções de LLM",
+ "complete_role_assignment": "Atribua suas configurações de LLM a funções específicas para continuar",
+ "setup_complete": "Configuração concluída",
+ "configure_first_provider": "Configure seu primeiro provedor de modelos",
+ "assign_specific_roles": "Atribua funções específicas às suas configurações de LLM",
+ "all_set": "Tudo pronto para começar a usar o SurfSense!",
+ "loading_config": "Carregando sua configuração...",
+ "previous": "Anterior",
+ "next": "Próximo",
+ "complete_setup": "Concluir configuração",
+ "add_provider_instruction": "Adicione pelo menos um provedor de LLM para continuar. Você pode configurar múltiplos provedores e escolher funções específicas para cada um no próximo passo.",
+ "your_llm_configs": "Suas configurações de LLM",
+ "model": "Modelo",
+ "language": "Idioma",
+ "base": "Base",
+ "add_provider_title": "Adicionar provedor de LLM",
+ "add_provider_subtitle": "Configure seu primeiro provedor de modelos para começar",
+ "add_provider_button": "Adicionar provedor",
+ "add_new_llm_provider": "Adicionar novo provedor de LLM",
+ "configure_new_provider": "Configure um novo provedor de modelo de linguagem para seu assistente de IA",
+ "config_name": "Nome da configuração",
+ "config_name_required": "Nome da configuração *",
+ "config_name_placeholder": "ex., Meu OpenAI GPT-4",
+ "provider": "Provedor",
+ "provider_required": "Provedor *",
+ "provider_placeholder": "Selecione um provedor",
+ "language_optional": "Idioma (opcional)",
+ "language_placeholder": "Selecione o idioma",
+ "custom_provider_name": "Nome do provedor personalizado *",
+ "custom_provider_placeholder": "ex., meu-provedor-personalizado",
+ "model_name_required": "Nome do modelo *",
+ "model_name_placeholder": "ex., gpt-4",
+ "examples": "Exemplos",
+ "api_key_required": "Chave API *",
+ "api_key_placeholder": "Sua chave API",
+ "api_base_optional": "URL base da API (opcional)",
+ "api_base_placeholder": "ex., https://api.openai.com/v1",
+ "adding": "Adicionando...",
+ "add_provider": "Adicionar provedor",
+ "cancel": "Cancelar",
+ "assign_roles_instruction": "Atribua suas configurações de LLM a funções específicas. Cada função tem diferentes propósitos no seu fluxo de trabalho.",
+ "no_llm_configs_found": "Nenhuma configuração de LLM encontrada",
+ "add_provider_before_roles": "Adicione pelo menos um provedor de LLM no passo anterior antes de atribuir funções.",
+ "long_context_llm_title": "LLM de contexto longo",
+ "long_context_llm_desc": "Lida com resumos de documentos longos e perguntas complexas",
+ "long_context_llm_examples": "Análise de documentos, síntese de pesquisa, perguntas complexas",
+ "fast_llm_title": "LLM rápido",
+ "fast_llm_desc": "Otimizado para respostas rápidas e interações em tempo real",
+ "fast_llm_examples": "Pesquisas rápidas, perguntas simples, respostas instantâneas",
+ "strategic_llm_title": "LLM estratégico",
+ "strategic_llm_desc": "Raciocínio avançado para planejamento e tomada de decisões estratégicas",
+ "strategic_llm_examples": "Planejamento de fluxos de trabalho, análise estratégica, resolução de problemas complexos",
+ "use_cases": "Casos de uso",
+ "assign_llm_config": "Atribuir configuração de LLM",
+ "select_llm_config": "Selecione uma configuração de LLM",
+ "assigned": "Atribuído",
+ "all_roles_assigned_saved": "Todas as funções atribuídas e salvas!",
+ "progress": "Progresso",
+ "roles_assigned": "{assigned} de {total} funções atribuídas",
+ "global_configs": "Configurações globais",
+ "your_configs": "Suas configurações"
+ },
+ "model_config": {
+ "title": "Configurações de modelos",
+ "subtitle": "Gerencie as configurações dos seus provedores de LLM e configurações de API.",
+ "refresh": "Atualizar",
+ "loading": "Carregando configurações...",
+ "total_configs": "Total de configurações",
+ "unique_providers": "Provedores únicos",
+ "system_status": "Status do sistema",
+ "active": "Ativo",
+ "your_configs": "Suas configurações",
+ "manage_configs": "Gerencie e configure seus provedores de LLM",
+ "add_config": "Adicionar configuração",
+ "no_configs": "Nenhuma configuração ainda",
+ "no_configs_desc": "Adicione suas próprias configurações de provedor de LLM.",
+ "add_first_config": "Adicionar primeira configuração",
+ "created": "Criado"
+ },
+ "breadcrumb": {
+ "dashboard": "Painel",
+ "search_space": "Espaço de pesquisa",
+ "chat": "Chat",
+ "documents": "Documentos",
+ "connectors": "Conectores",
+ "editor": "Editor",
+ "logs": "Logs",
+ "settings": "Configurações",
+ "upload_documents": "Enviar documentos",
+ "add_youtube": "Adicionar vídeos do YouTube",
+ "add_webpages": "Adicionar páginas web",
+ "add_connector": "Adicionar conector",
+ "manage_connectors": "Gerenciar conectores",
+ "edit_connector": "Editar conector",
+ "manage": "Gerenciar"
+ },
+ "sidebar": {
+ "chats": "Chats privados",
+ "shared_chats": "Chats compartilhados",
+ "search_chats": "Pesquisar chats",
+ "no_chats_found": "Nenhum chat encontrado",
+ "no_shared_chats": "Nenhum chat compartilhado",
+ "view_all_shared_chats": "Ver todos os chats compartilhados",
+ "view_all_private_chats": "Ver todos os chats privados",
+ "no_chats": "Nenhum chat ainda",
+ "start_new_chat_hint": "Iniciar um novo chat",
+ "error_loading_chats": "Erro ao carregar chats",
+ "chat_deleted": "Chat excluído com sucesso",
+ "error_deleting_chat": "Falha ao excluir chat",
+ "delete": "Excluir",
+ "try_different_search": "Tente um termo de pesquisa diferente",
+ "updated": "Atualizado",
+ "more_options": "Mais opções",
+ "clear_search": "Limpar pesquisa",
+ "archive": "Arquivar",
+ "unarchive": "Restaurar",
+ "chat_archived": "Chat arquivado",
+ "chat_unarchived": "Chat restaurado",
+ "chat_renamed": "Chat renomeado",
+ "error_renaming_chat": "Falha ao renomear chat",
+ "rename": "Renomear",
+ "rename_chat": "Renomear chat",
+ "rename_chat_description": "Insira um novo nome para esta conversa.",
+ "chat_title_placeholder": "Título do chat",
+ "renaming": "Renomeando...",
+ "no_archived_chats": "Nenhum chat arquivado",
+ "error_archiving_chat": "Falha ao arquivar chat",
+ "new_chat": "Novo chat",
+ "select_search_space": "Selecionar espaço de pesquisa",
+ "manage_members": "Gerenciar membros",
+ "search_space_settings": "Configurações do espaço de pesquisa",
+ "logs": "Logs",
+ "see_all_search_spaces": "Ver todos os espaços de pesquisa",
+ "expand_sidebar": "Expandir barra lateral",
+ "collapse_sidebar": "Recolher barra lateral",
+ "user_settings": "Configurações do usuário",
+ "language": "Idioma",
+ "theme": "Tema",
+ "light": "Claro",
+ "dark": "Escuro",
+ "system": "Sistema",
+ "logout": "Sair",
+ "loggingOut": "Saindo...",
+ "inbox": "Caixa de entrada",
+ "search_inbox": "Pesquisar caixa de entrada",
+ "mark_all_read": "Marcar tudo como lido",
+ "mark_as_read": "Marcar como lido",
+ "mentions": "Menções",
+ "comments": "Comentários",
+ "status": "Status",
+ "no_results_found": "Nenhum resultado encontrado",
+ "no_mentions": "Sem menções",
+ "no_mentions_hint": "Você verá as menções de outros aqui",
+ "no_comments": "Sem comentários",
+ "no_comments_hint": "Você verá menções e respostas aqui",
+ "no_status_updates": "Sem atualizações de status",
+ "no_status_updates_hint": "Atualizações de documentos e conectores aparecerão aqui",
+ "filter": "Filtrar",
+ "all": "Tudo",
+ "unread": "Não lido",
+ "connectors": "Conectores",
+ "all_connectors": "Todos os conectores",
+ "close": "Fechar"
+ },
+ "errors": {
+ "something_went_wrong": "Algo deu errado",
+ "try_again": "Por favor, tente novamente",
+ "not_found": "Não encontrado",
+ "unauthorized": "Não autorizado",
+ "forbidden": "Proibido",
+ "server_error": "Erro do servidor",
+ "network_error": "Erro de rede"
+ },
+ "searchSpaceSettings": {
+ "title": "Configurações do espaço de pesquisa",
+ "back_to_app": "Voltar ao app",
+ "nav_general": "Geral",
+ "nav_general_desc": "Nome, descrição e informações básicas",
+ "nav_agent_configs": "Configurações do agente",
+ "nav_agent_configs_desc": "Modelos LLM com prompts e citações",
+ "nav_role_assignments": "Atribuições de funções",
+ "nav_role_assignments_desc": "Atribuir configurações a funções do agente",
+ "nav_image_models": "Modelos de imagem",
+ "nav_image_models_desc": "Configurar modelos de geração de imagens",
+ "nav_system_instructions": "Instruções do sistema",
+ "nav_system_instructions_desc": "Instruções de IA em nível do espaço de pesquisa",
+ "nav_public_links": "Links de chat públicos",
+ "nav_public_links_desc": "Gerenciar links de chat compartilhados publicamente",
+ "general_name_label": "Nome",
+ "general_name_placeholder": "Insira o nome do espaço de pesquisa",
+ "general_name_description": "Um nome único para seu espaço de pesquisa.",
+ "general_description_label": "Descrição",
+ "general_description_placeholder": "Insira a descrição do espaço de pesquisa",
+ "general_description_description": "Uma breve descrição de para que este espaço de pesquisa será usado.",
+ "general_reset": "Redefinir alterações",
+ "general_save": "Salvar alterações",
+ "general_saving": "Salvando",
+ "general_unsaved_changes": "Você tem alterações não salvas. Clique em \"Salvar alterações\" para aplicá-las."
+ },
+ "homepage": {
+ "hero_title_part1": "O espaço de trabalho com IA",
+ "hero_title_part2": "feito para equipes",
+ "hero_description": "Conecte qualquer LLM às suas fontes de conhecimento internas e converse com ele em tempo real junto com sua equipe.",
+ "cta_start_trial": "Comece gratuitamente",
+ "cta_explore": "Explorar",
+ "integrations_title": "Integrações",
+ "integrations_subtitle": "Integre com as ferramentas mais importantes da sua equipe",
+ "features_title": "O hub de conhecimento da sua equipe com IA",
+ "features_subtitle": "Recursos poderosos projetados para melhorar a colaboração, aumentar a produtividade e otimizar seu fluxo de trabalho.",
+ "feature_workflow_title": "Fluxo de trabalho otimizado",
+ "feature_workflow_desc": "Centralize todo o seu conhecimento e recursos em um espaço de trabalho inteligente. Encontre o que precisa instantaneamente e acelere a tomada de decisões.",
+ "feature_collaboration_title": "Colaboração perfeita",
+ "feature_collaboration_desc": "Trabalhe junto com sua equipe sem esforço com ferramentas de colaboração em tempo real que mantêm todos alinhados.",
+ "feature_customizable_title": "Totalmente personalizável",
+ "feature_customizable_desc": "Escolha entre mais de 100 LLMs líderes e chame qualquer modelo sob demanda sem problemas.",
+ "cta_transform": "Transforme como sua equipe",
+ "cta_transform_bold": "descobre e colabora",
+ "cta_unite_start": "Unifique o",
+ "cta_unite_knowledge": "conhecimento da sua equipe",
+ "cta_unite_middle": "em um espaço colaborativo com",
+ "cta_unite_search": "pesquisa inteligente",
+ "cta_talk_to_us": "Fale conosco",
+ "features": {
+ "find_ask_act": {
+ "title": "Encontre, pergunte, aja",
+ "description": "Obtenha informações instantâneas, atualizações detalhadas e respostas com citações do conhecimento da empresa e pessoal."
+ },
+ "real_time_collab": {
+ "title": "Trabalhe junto em tempo real",
+ "description": "Transforme os documentos da sua empresa em espaços multiplayer com edições ao vivo, conteúdo sincronizado e presença."
+ },
+ "beyond_text": {
+ "title": "Colabore além do texto",
+ "description": "Crie podcasts e multimídia que sua equipe pode comentar, compartilhar e aprimorar juntos."
+ },
+ "context_counts": {
+ "title": "Contexto onde importa",
+ "description": "Adicione comentários diretamente aos seus chats e documentos para feedback claro e no momento."
+ },
+ "citation_illustration_title": "Ilustração do recurso de citação mostrando referência de fonte clicável",
+ "referenced_chunk": "Trecho referenciado",
+ "collab_illustration_label": "Ilustração de colaboração em tempo real em um editor de texto.",
+ "real_time": "Tempo real",
+ "collab_part1": "colabo",
+ "collab_part2": "raç",
+ "collab_part3": "ão",
+ "annotation_illustration_label": "Ilustração de um editor de texto com comentários de anotação.",
+ "add_context_with": "Adicione contexto com",
+ "comments": "comentários",
+ "example_comment": "Vamos discutir isso amanhã!"
+ }
+ },
+ "public_chat": {
+ "not_found_title": "Este chat foi excluído.",
+ "click_here": "Clique aqui",
+ "sign_in_prompt": "para entrar no SurfSense e começar o seu."
+ }
+}