- {t('recent_chats')}
+ {t("recent_chats")}
{/* Search Input */}
{showSearch && (
setSearchQuery(e.target.value)}
className="h-8"
@@ -170,7 +170,7 @@ export function NavProjects({ chats }: { chats: ChatItem[] }) {
- {searchQuery ? t('no_chats_found') : t('no_recent_chats')}
+ {searchQuery ? t("no_chats_found") : t("no_recent_chats")}
)}
@@ -180,7 +180,7 @@ export function NavProjects({ chats }: { chats: ChatItem[] }) {
router.push(`/dashboard/${searchSpaceId}/chats`)}>
- {t('view_all_chats')}
+ {t("view_all_chats")}
)}
diff --git a/surfsense_web/components/sidebar/nav-secondary.tsx b/surfsense_web/components/sidebar/nav-secondary.tsx
index db27f9f3..d4a56e4b 100644
--- a/surfsense_web/components/sidebar/nav-secondary.tsx
+++ b/surfsense_web/components/sidebar/nav-secondary.tsx
@@ -1,9 +1,9 @@
"use client";
import type { LucideIcon } from "lucide-react";
+import { useTranslations } from "next-intl";
import type * as React from "react";
import { useMemo } from "react";
-import { useTranslations } from "next-intl";
import {
SidebarGroup,
@@ -25,14 +25,14 @@ export function NavSecondary({
}: {
items: NavSecondaryItem[];
} & React.ComponentPropsWithoutRef) {
- const t = useTranslations('sidebar');
-
+ const t = useTranslations("sidebar");
+
// Memoize items to prevent unnecessary re-renders
const memoizedItems = useMemo(() => items, [items]);
return (
- {t('search_space')}
+ {t("search_space")}
{memoizedItems.map((item, index) => (
diff --git a/surfsense_web/contexts/LocaleContext.tsx b/surfsense_web/contexts/LocaleContext.tsx
index fc0e57d6..30d2b2e8 100644
--- a/surfsense_web/contexts/LocaleContext.tsx
+++ b/surfsense_web/contexts/LocaleContext.tsx
@@ -1,70 +1,70 @@
-'use client';
+"use client";
-import React, { createContext, useContext, useState, useEffect } from 'react';
-import enMessages from '../messages/en.json';
-import zhMessages from '../messages/zh.json';
+import type React from "react";
+import { createContext, useContext, useEffect, useState } from "react";
+import enMessages from "../messages/en.json";
+import zhMessages from "../messages/zh.json";
-type Locale = 'en' | 'zh';
+type Locale = "en" | "zh";
interface LocaleContextType {
- locale: Locale;
- messages: typeof enMessages;
- setLocale: (locale: Locale) => void;
+ locale: Locale;
+ messages: typeof enMessages;
+ setLocale: (locale: Locale) => void;
}
const LocaleContext = createContext(undefined);
-const LOCALE_STORAGE_KEY = 'surfsense-locale';
+const LOCALE_STORAGE_KEY = "surfsense-locale";
export function LocaleProvider({ children }: { children: React.ReactNode }) {
- // Always start with 'en' to avoid hydration mismatch
- // Then sync with localStorage after mount
- const [locale, setLocaleState] = useState('en');
- const [mounted, setMounted] = useState(false);
+ // Always start with 'en' to avoid hydration mismatch
+ // Then sync with localStorage after mount
+ const [locale, setLocaleState] = useState("en");
+ const [mounted, setMounted] = useState(false);
- // Get messages based on current locale
- const messages = locale === 'zh' ? zhMessages : enMessages;
+ // Get messages based on current locale
+ const messages = locale === "zh" ? zhMessages : 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');
- }
- }
- }, []);
+ // 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");
+ }
+ }
+ }, []);
- // Update locale and persist to localStorage
- const setLocale = (newLocale: Locale) => {
- setLocaleState(newLocale);
- if (typeof window !== 'undefined') {
- localStorage.setItem(LOCALE_STORAGE_KEY, newLocale);
- // Update HTML lang attribute
- document.documentElement.lang = newLocale;
- }
- };
+ // Update locale and persist to localStorage
+ const setLocale = (newLocale: Locale) => {
+ setLocaleState(newLocale);
+ if (typeof window !== "undefined") {
+ localStorage.setItem(LOCALE_STORAGE_KEY, newLocale);
+ // Update HTML lang attribute
+ document.documentElement.lang = newLocale;
+ }
+ };
- // Set HTML lang attribute when locale changes
- useEffect(() => {
- if (typeof window !== 'undefined' && mounted) {
- document.documentElement.lang = locale;
- }
- }, [locale, mounted]);
+ // Set HTML lang attribute when locale changes
+ useEffect(() => {
+ if (typeof window !== "undefined" && mounted) {
+ document.documentElement.lang = locale;
+ }
+ }, [locale, mounted]);
- return (
-
- {children}
-
- );
+ return (
+
+ {children}
+
+ );
}
export function useLocaleContext() {
- const context = useContext(LocaleContext);
- if (context === undefined) {
- throw new Error('useLocaleContext must be used within a LocaleProvider');
- }
- return context;
+ const context = useContext(LocaleContext);
+ if (context === undefined) {
+ throw new Error("useLocaleContext must be used within a LocaleProvider");
+ }
+ return context;
}
-
diff --git a/surfsense_web/i18n/request.ts b/surfsense_web/i18n/request.ts
index 93324fcc..9a3f53b9 100644
--- a/surfsense_web/i18n/request.ts
+++ b/surfsense_web/i18n/request.ts
@@ -1,22 +1,21 @@
-import {getRequestConfig} from 'next-intl/server';
-import {routing} from './routing';
+import { getRequestConfig } from "next-intl/server";
+import { routing } from "./routing";
/**
* Configuration for internationalization request handling
* This function is called for each request to determine the locale and load translations
*/
-export default getRequestConfig(async ({requestLocale}) => {
- // This typically corresponds to the `[locale]` segment
- let locale = await requestLocale;
+export default getRequestConfig(async ({ requestLocale }) => {
+ // This typically corresponds to the `[locale]` segment
+ let locale = await requestLocale;
- // Ensure that the incoming `locale` is valid
- if (!locale || !routing.locales.includes(locale as any)) {
- locale = routing.defaultLocale;
- }
+ // Ensure that the incoming `locale` is valid
+ if (!locale || !routing.locales.includes(locale as any)) {
+ locale = routing.defaultLocale;
+ }
- return {
- locale,
- messages: (await import(`../messages/${locale}.json`)).default
- };
+ return {
+ locale,
+ messages: (await import(`../messages/${locale}.json`)).default,
+ };
});
-
diff --git a/surfsense_web/i18n/routing.ts b/surfsense_web/i18n/routing.ts
index 927c7d0c..5017b4be 100644
--- a/surfsense_web/i18n/routing.ts
+++ b/surfsense_web/i18n/routing.ts
@@ -1,24 +1,22 @@
-import {defineRouting} from 'next-intl/routing';
-import {createNavigation} from 'next-intl/navigation';
+import { createNavigation } from "next-intl/navigation";
+import { defineRouting } from "next-intl/routing";
/**
* Internationalization routing configuration
* Defines supported locales and routing behavior for the application
*/
export const routing = defineRouting({
- // A list of all locales that are supported
- locales: ['en', 'zh'],
+ // A list of all locales that are supported
+ locales: ["en", "zh"],
- // Used when no locale matches
- defaultLocale: 'en',
+ // Used when no locale matches
+ defaultLocale: "en",
- // The `localePrefix` setting controls whether the locale is included in the pathname
- // 'as-needed': Only add locale prefix when not using the default locale
- localePrefix: 'as-needed'
+ // The `localePrefix` setting controls whether the locale is included in the pathname
+ // 'as-needed': Only add locale prefix when not using the default locale
+ localePrefix: "as-needed",
});
// Lightweight wrappers around Next.js' navigation APIs
// that will consider the routing configuration
-export const {Link, redirect, usePathname, useRouter, getPathname} =
- createNavigation(routing);
-
+export const { Link, redirect, usePathname, useRouter, getPathname } = createNavigation(routing);
diff --git a/surfsense_web/messages/en.json b/surfsense_web/messages/en.json
index 45518c5b..bd88f100 100644
--- a/surfsense_web/messages/en.json
+++ b/surfsense_web/messages/en.json
@@ -1,692 +1,691 @@
{
- "common": {
- "app_name": "SurfSense",
- "welcome": "Welcome",
- "loading": "Loading...",
- "save": "Save",
- "cancel": "Cancel",
- "delete": "Delete",
- "edit": "Edit",
- "create": "Create",
- "update": "Update",
- "search": "Search",
- "close": "Close",
- "confirm": "Confirm",
- "back": "Back",
- "next": "Next",
- "submit": "Submit",
- "yes": "Yes",
- "no": "No",
- "add": "Add",
- "remove": "Remove",
- "select": "Select",
- "all": "All",
- "none": "None",
- "error": "Error",
- "success": "Success",
- "warning": "Warning",
- "info": "Information",
- "required": "Required",
- "optional": "Optional",
- "retry": "Retry"
- },
- "auth": {
- "login": "Login",
- "register": "Register",
- "logout": "Logout",
- "email": "Email",
- "password": "Password",
- "confirm_password": "Confirm Password",
- "forgot_password": "Forgot Password?",
- "show_password": "Show password",
- "hide_password": "Hide password",
- "remember_me": "Remember Me",
- "sign_in": "Sign In",
- "sign_up": "Sign Up",
- "sign_in_with": "Sign in with {provider}",
- "dont_have_account": "Don't have an account?",
- "already_have_account": "Already have an account?",
- "reset_password": "Reset Password",
- "email_required": "Email is required",
- "password_required": "Password is required",
- "invalid_email": "Invalid email address",
- "password_too_short": "Password must be at least 8 characters",
- "welcome_back": "Welcome back",
- "create_account": "Create your account",
- "login_subtitle": "Enter your credentials to access your account",
- "register_subtitle": "Sign up to get started with SurfSense",
- "or_continue_with": "Or continue with",
- "by_continuing": "By continuing, you agree to our",
- "terms_of_service": "Terms of Service",
- "and": "and",
- "privacy_policy": "Privacy Policy",
- "full_name": "Full Name",
- "username": "Username",
- "continue": "Continue",
- "back_to_login": "Back to Login",
- "login_success": "Successfully logged in",
- "register_success": "Account created successfully",
- "continue_with_google": "Continue with Google",
- "cloud_dev_notice": "SurfSense Cloud is currently in development. Check",
- "docs": "Docs",
- "cloud_dev_self_hosted": "for more information on Self-Hosted version.",
- "passwords_no_match": "Passwords do not match",
- "password_mismatch": "Password Mismatch",
- "passwords_no_match_desc": "The passwords you entered do not match",
- "creating_account": "Creating your account...",
- "creating_account_btn": "Creating account...",
- "redirecting_login": "Redirecting to login page..."
- },
- "dashboard": {
- "title": "Dashboard",
- "search_spaces": "Search Spaces",
- "documents": "Documents",
- "connectors": "Connectors",
- "settings": "Settings",
- "researcher": "Researcher",
- "api_keys": "API Keys",
- "profile": "Profile",
- "loading_dashboard": "Loading Dashboard",
- "checking_auth": "Checking authentication...",
- "loading_config": "Loading Configuration",
- "checking_llm_prefs": "Checking your LLM preferences...",
- "config_error": "Configuration Error",
- "failed_load_llm_config": "Failed to load your LLM configuration",
- "error_loading_chats": "Error loading chats",
- "no_recent_chats": "No recent chats",
- "error_loading_space": "Error loading search space",
- "unknown_search_space": "Unknown Search Space",
- "delete_chat": "Delete Chat",
- "delete_chat_confirm": "Are you sure you want to delete",
- "action_cannot_undone": "This action cannot be undone.",
- "deleting": "Deleting...",
- "surfsense_dashboard": "SurfSense Dashboard",
- "welcome_message": "Welcome to your SurfSense dashboard.",
- "your_search_spaces": "Your Search Spaces",
- "create_search_space": "Create Search Space",
- "add_new_search_space": "Add New Search Space",
- "loading": "Loading",
- "fetching_spaces": "Fetching your search spaces...",
- "may_take_moment": "This may take a moment",
- "error": "Error",
- "something_wrong": "Something went wrong",
- "error_details": "Error Details",
- "try_again": "Try Again",
- "go_home": "Go Home",
- "delete_search_space": "Delete Search Space",
- "delete_space_confirm": "Are you sure you want to delete \"{name}\"? This action cannot be undone. All documents, chats, and podcasts in this search space will be permanently deleted.",
- "no_spaces_found": "No search spaces found",
- "create_first_space": "Create your first search space to get started",
- "created": "Created"
- },
- "navigation": {
- "home": "Home",
- "docs": "Docs",
- "pricing": "Pricing",
- "contact": "Contact",
- "login": "Login",
- "register": "Register",
- "dashboard": "Dashboard",
- "sign_in": "Sign In",
- "book_a_call": "Book a call"
- },
- "nav_menu": {
- "platform": "Platform",
- "researcher": "Researcher",
- "manage_llms": "Manage LLMs",
- "documents": "Documents",
- "upload_documents": "Upload Documents",
- "add_webpages": "Add Webpages",
- "add_youtube": "Add Youtube Videos",
- "add_youtube_videos": "Add Youtube Videos",
- "manage_documents": "Manage Documents",
- "connectors": "Connectors",
- "add_connector": "Add Connector",
- "manage_connectors": "Manage Connectors",
- "podcasts": "Podcasts",
- "logs": "Logs",
- "all_search_spaces": "All Search Spaces"
- },
- "pricing": {
- "title": "SurfSense Pricing",
- "subtitle": "Choose that works for you",
- "community_name": "COMMUNITY",
- "enterprise_name": "ENTERPRISE",
- "forever": "forever",
- "contact_us": "Contact Us",
- "feature_llms": "Supports 100+ LLMs",
- "feature_ollama": "Supports local Ollama or vLLM setups",
- "feature_embeddings": "6000+ Embedding Models",
- "feature_files": "50+ File extensions supported.",
- "feature_podcasts": "Podcasts support with local TTS providers.",
- "feature_sources": "Connects with 15+ external sources.",
- "feature_extension": "Cross-Browser Extension for dynamic webpages including authenticated content",
- "upcoming_mindmaps": "Upcoming: Mergeable MindMaps",
- "upcoming_notes": "Upcoming: Note Management",
- "community_desc": "Open source version with powerful features",
- "get_started": "Get Started",
- "everything_community": "Everything in Community",
- "priority_support": "Priority Support",
- "access_controls": "Access Controls",
- "collaboration": "Collaboration and multiplayer features",
- "video_gen": "Video generation",
- "advanced_security": "Advanced security features",
- "enterprise_desc": "For large organizations with specific needs",
- "contact_sales": "Contact Sales"
- },
- "contact": {
- "title": "Contact",
- "subtitle": "We'd love to Hear From You.",
- "we_are_here": "We are here",
- "full_name": "Full name",
- "email_address": "Email Address",
- "company": "Company",
- "message": "Message",
- "optional": "optional",
- "name_placeholder": "John Doe",
- "email_placeholder": "john.doe@example.com",
- "company_placeholder": "Example Inc.",
- "message_placeholder": "Type your message here",
- "submit": "Submit",
- "submitting": "Submitting...",
- "name_required": "Name is required",
- "name_too_long": "Name is too long",
- "invalid_email": "Invalid email address",
- "email_too_long": "Email is too long",
- "company_required": "Company is required",
- "company_too_long": "Company name is too long",
- "message_sent": "Message sent successfully!",
- "we_will_contact": "We will get back to you as soon as possible.",
- "send_failed": "Failed to send message",
- "try_again_later": "Please try again later.",
- "something_wrong": "Something went wrong"
- },
- "researcher": {
- "loading": "Loading...",
- "select_documents": "Select Documents",
- "select_documents_desc": "Choose documents to include in your research context",
- "loading_documents": "Loading documents...",
- "select_connectors": "Select Connectors",
- "select_connectors_desc": "Choose which data sources to include in your research",
- "clear_all": "Clear All",
- "select_all": "Select All",
- "scope": "Scope",
- "documents": "Documents",
- "docs": "Docs",
- "chunks": "Chunks",
- "mode": "Mode",
- "research_mode": "Research Mode",
- "mode_qna": "Q&A",
- "mode_general": "General Report",
- "mode_general_short": "General",
- "mode_deep": "Deep Report",
- "mode_deep_short": "Deep",
- "mode_deeper": "Deeper Report",
- "mode_deeper_short": "Deeper",
- "fast_llm": "Fast LLM",
- "select_llm": "Select LLM",
- "fast_llm_selection": "Fast LLM Selection",
- "no_llm_configs": "No LLM configurations",
- "configure_llm_to_start": "Configure AI models to get started",
- "open_settings": "Open Settings",
- "start_surfing": "Let's Start Surfing",
- "through_knowledge_base": "through your knowledge base.",
- "all_connectors": "All Connectors",
- "connectors_selected": "{count} Connectors",
- "placeholder": "Ask me anything..."
- },
- "connectors": {
- "title": "Connectors",
- "subtitle": "Manage your connected services and data sources.",
- "add_connector": "Add Connector",
- "your_connectors": "Your Connectors",
- "view_manage": "View and manage all your connected services.",
- "no_connectors": "No connectors found",
- "no_connectors_desc": "You haven't added any connectors yet. Add one to enhance your search capabilities.",
- "add_first": "Add Your First Connector",
- "name": "Name",
- "type": "Type",
- "last_indexed": "Last Indexed",
- "periodic": "Periodic",
- "actions": "Actions",
- "never": "Never",
- "not_indexable": "Not indexable",
- "index_date_range": "Index with Date Range",
- "quick_index": "Quick Index",
- "quick_index_auto": "Quick Index (Auto Date Range)",
- "delete_connector": "Delete Connector",
- "delete_confirm": "Are you sure you want to delete this connector? This action cannot be undone.",
- "select_date_range": "Select Date Range for Indexing",
- "select_date_range_desc": "Choose the start and end dates for indexing content. Leave empty to use default range.",
- "start_date": "Start Date",
- "end_date": "End Date",
- "pick_date": "Pick a date",
- "clear_dates": "Clear Dates",
- "last_30_days": "Last 30 Days",
- "last_year": "Last Year",
- "start_indexing": "Start Indexing",
- "failed_load": "Failed to load connectors",
- "delete_success": "Connector deleted successfully",
- "delete_failed": "Failed to delete connector",
- "indexing_started": "Connector content indexing started",
- "indexing_failed": "Failed to index connector content"
- },
- "documents": {
- "title": "Documents",
- "subtitle": "Manage your documents and files.",
- "no_rows_selected": "No rows selected",
- "delete_success_count": "Successfully deleted {count} document(s)",
- "delete_partial_failed": "Some documents could not be deleted",
- "delete_error": "Error deleting documents",
- "filter_by_title": "Filter by title...",
- "bulk_delete": "Delete Selected",
- "filter_types": "Filter Types",
- "columns": "Columns",
- "confirm_delete": "Confirm Delete",
- "confirm_delete_desc": "Are you sure you want to delete {count} document(s)? This action cannot be undone.",
- "uploading": "Uploading...",
- "upload_success": "Document uploaded successfully",
- "upload_failed": "Failed to upload document",
- "loading": "Loading documents...",
- "error_loading": "Error loading documents",
- "retry": "Retry",
- "no_documents": "No documents found",
- "type": "Type",
- "content_summary": "Content Summary",
- "view_full": "View Full Content",
- "filter_placeholder": "Filter by title...",
- "rows_per_page": "Rows per page"
- },
- "add_connector": {
- "title": "Connect Your Tools",
- "subtitle": "Integrate with your favorite services to enhance your research capabilities.",
- "search_engines": "Search Engines",
- "team_chats": "Team Chats",
- "project_management": "Project Management",
- "knowledge_bases": "Knowledge Bases",
- "communication": "Communication",
- "connect": "Connect",
- "coming_soon": "Coming Soon",
- "connected": "Connected",
- "manage": "Manage",
- "tavily_desc": "Search the web using the Tavily API",
- "searxng_desc": "Use your own SearxNG meta-search instance for web results.",
- "linkup_desc": "Search the web using the Linkup API",
- "elasticsearch_desc": "Connect to Elasticsearch to index and search documents, logs and metrics.",
- "baidu_desc": "Search the Chinese web using Baidu AI Search API",
- "slack_desc": "Connect to your Slack workspace to access messages and channels.",
- "teams_desc": "Connect to Microsoft Teams to access your team's conversations.",
- "discord_desc": "Connect to Discord servers to access messages and channels.",
- "linear_desc": "Connect to Linear to search issues, comments and project data.",
- "jira_desc": "Connect to Jira to search issues, tickets and project data.",
- "clickup_desc": "Connect to ClickUp to search tasks, comments and project data.",
- "notion_desc": "Connect to your Notion workspace to access pages and databases.",
- "github_desc": "Connect a GitHub PAT to index code and docs from accessible repositories.",
- "confluence_desc": "Connect to Confluence to search pages, comments and documentation.",
- "airtable_desc": "Connect to Airtable to search records, tables and database content.",
- "luma_desc": "Connect to Luma to search events",
- "calendar_desc": "Connect to Google Calendar to search events, meetings and schedules.",
- "gmail_desc": "Connect to your Gmail account to search through your emails.",
- "zoom_desc": "Connect to Zoom to access meeting recordings and transcripts."
- },
- "upload_documents": {
- "title": "Upload Documents",
- "subtitle": "Upload your files to make them searchable and accessible through AI-powered conversations.",
- "file_size_limit": "Maximum file size: 50MB per file. Supported formats vary based on your ETL service configuration.",
- "drop_files": "Drop files here",
- "drag_drop": "Drag & drop files here",
- "or_browse": "or click to browse",
- "browse_files": "Browse Files",
- "selected_files": "Selected Files ({count})",
- "total_size": "Total size",
- "clear_all": "Clear all",
- "uploading_files": "Uploading files...",
- "uploading": "Uploading...",
- "upload_button": "Upload {count} {count, plural, one {file} other {files}}",
- "upload_initiated": "Upload Task Initiated",
- "upload_initiated_desc": "Files Uploading Initiated",
- "upload_error": "Upload Error",
- "upload_error_desc": "Error uploading files",
- "supported_file_types": "Supported File Types",
- "file_types_desc": "These file types are supported based on your current ETL service configuration."
- },
- "add_webpage": {
- "title": "Add Webpages for Crawling",
- "subtitle": "Enter URLs to crawl and add to your document collection",
- "label": "Enter URLs to crawl",
- "placeholder": "Enter a URL and press Enter",
- "hint": "Add multiple URLs by pressing Enter after each one",
- "tips_title": "Tips for URL crawling:",
- "tip_1": "Enter complete URLs including http:// or https://",
- "tip_2": "Make sure the websites allow crawling",
- "tip_3": "Public webpages work best",
- "tip_4": "Crawling may take some time depending on the website size",
- "cancel": "Cancel",
- "submit": "Submit URLs for Crawling",
- "submitting": "Submitting...",
- "error_no_url": "Please add at least one URL",
- "error_invalid_urls": "Invalid URLs detected: {urls}",
- "crawling_toast": "URL Crawling",
- "crawling_toast_desc": "Starting URL crawling process...",
- "success_toast": "Crawling Successful",
- "success_toast_desc": "URLs have been submitted for crawling",
- "error_toast": "Crawling Error",
- "error_toast_desc": "Error crawling URLs",
- "error_generic": "An error occurred while crawling URLs",
- "invalid_url_toast": "Invalid URL",
- "invalid_url_toast_desc": "Please enter a valid URL",
- "duplicate_url_toast": "Duplicate URL",
- "duplicate_url_toast_desc": "This URL has already been added"
- },
- "add_youtube": {
- "title": "Add YouTube Videos",
- "subtitle": "Enter YouTube video URLs to add to your document collection",
- "label": "Enter YouTube Video URLs",
- "placeholder": "Enter a YouTube URL and press Enter",
- "hint": "Add multiple YouTube URLs by pressing Enter after each one",
- "tips_title": "Tips for adding YouTube videos:",
- "tip_1": "Use standard YouTube URLs (youtube.com/watch?v= or youtu.be/)",
- "tip_2": "Make sure videos are publicly accessible",
- "tip_3": "Supported formats: youtube.com/watch?v=VIDEO_ID or youtu.be/VIDEO_ID",
- "tip_4": "Processing may take some time depending on video length",
- "preview": "Preview",
- "cancel": "Cancel",
- "submit": "Submit YouTube Videos",
- "processing": "Processing...",
- "error_no_video": "Please add at least one YouTube video URL",
- "error_invalid_urls": "Invalid YouTube URLs detected: {urls}",
- "processing_toast": "YouTube Video Processing",
- "processing_toast_desc": "Starting YouTube video processing...",
- "success_toast": "Processing Successful",
- "success_toast_desc": "YouTube videos have been submitted for processing",
- "error_toast": "Processing Error",
- "error_toast_desc": "Error processing YouTube videos",
- "error_generic": "An error occurred while processing YouTube videos",
- "invalid_url_toast": "Invalid YouTube URL",
- "invalid_url_toast_desc": "Please enter a valid YouTube video URL",
- "duplicate_url_toast": "Duplicate URL",
- "duplicate_url_toast_desc": "This YouTube video has already been added"
- },
- "settings": {
- "title": "Settings",
- "subtitle": "Manage your LLM configurations and role assignments for this search space.",
- "back_to_dashboard": "Back to Dashboard",
- "model_configs": "Model Configs",
- "models": "Models",
- "llm_roles": "LLM Roles",
- "roles": "Roles",
- "llm_role_management": "LLM Role Management",
- "llm_role_desc": "Assign your LLM configurations to specific roles for different purposes.",
- "no_llm_configs_found": "No LLM configurations found. Please add at least one LLM provider in the Model Configs tab before assigning roles.",
- "select_llm_config": "Select an LLM configuration",
- "long_context_llm": "Long Context LLM",
- "fast_llm": "Fast LLM",
- "strategic_llm": "Strategic LLM",
- "long_context_desc": "Handles complex tasks requiring extensive context understanding and reasoning",
- "long_context_examples": "Document analysis, research synthesis, complex Q&A",
- "large_context_window": "Large context window",
- "deep_reasoning": "Deep reasoning",
- "complex_analysis": "Complex analysis",
- "fast_llm_desc": "Optimized for quick responses and real-time interactions",
- "fast_llm_examples": "Quick searches, simple questions, instant responses",
- "low_latency": "Low latency",
- "quick_responses": "Quick responses",
- "real_time_chat": "Real-time chat",
- "strategic_llm_desc": "Advanced reasoning for planning and strategic decision making",
- "strategic_llm_examples": "Planning workflows, strategic analysis, complex problem solving",
- "strategic_thinking": "Strategic thinking",
- "long_term_planning": "Long-term planning",
- "complex_reasoning": "Complex reasoning",
- "use_cases": "Use cases",
- "assign_llm_config": "Assign LLM Configuration",
- "unassigned": "Unassigned",
- "assigned": "Assigned",
- "model": "Model",
- "base": "Base",
- "all_roles_assigned": "All roles are assigned and ready to use! Your LLM configuration is complete.",
- "save_changes": "Save Changes",
- "saving": "Saving...",
- "reset": "Reset",
- "status": "Status",
- "status_ready": "Ready",
- "status_setup": "Setup",
- "complete_role_assignments": "Complete all role assignments to enable full functionality. Each role serves different purposes in your workflow.",
- "all_roles_saved": "All roles assigned and saved!",
- "progress": "Progress",
- "roles_assigned_count": "{assigned} of {total} roles assigned"
- },
- "podcasts": {
- "title": "Podcasts",
- "subtitle": "Listen to generated podcasts.",
- "search_placeholder": "Search podcasts...",
- "sort_order": "Sort order",
- "newest_first": "Newest First",
- "oldest_first": "Oldest First",
- "loading": "Loading podcasts...",
- "error_loading": "Error loading podcasts",
- "no_podcasts": "No podcasts found",
- "adjust_filters": "Try adjusting your search filters",
- "generate_hint": "Generate podcasts from your chats to get started",
- "loading_podcast": "Loading podcast...",
- "now_playing": "Now Playing",
- "delete_podcast": "Delete Podcast",
- "delete_confirm_1": "Are you sure you want to delete",
- "delete_confirm_2": "This action cannot be undone.",
- "cancel": "Cancel",
- "delete": "Delete",
- "deleting": "Deleting..."
- },
- "logs": {
- "title": "Task Logs",
- "subtitle": "Monitor and analyze all task execution logs",
- "refresh": "Refresh",
- "delete_selected": "Delete Selected",
- "confirm_title": "Are you absolutely sure?",
- "confirm_delete_desc": "This action cannot be undone. This will permanently delete {count} selected log(s).",
- "cancel": "Cancel",
- "delete": "Delete",
- "level": "Level",
- "status": "Status",
- "source": "Source",
- "message": "Message",
- "created_at": "Created At",
- "actions": "Actions",
- "system": "System",
- "filter_by_message": "Filter by message...",
- "filter_by": "Filter by",
- "total_logs": "Total Logs",
- "active_tasks": "Active Tasks",
- "success_rate": "Success Rate",
- "recent_failures": "Recent Failures",
- "last_hours": "Last {hours} hours",
- "currently_running": "Currently running",
- "successful": "successful",
- "need_attention": "Need attention",
- "no_logs": "No logs found",
- "loading": "Loading logs...",
- "error_loading": "Error loading logs",
- "columns": "Columns",
- "failed_load_summary": "Failed to load summary",
- "retry": "Retry",
- "view": "View",
- "toggle_columns": "Toggle columns",
- "rows_per_page": "Rows per page",
- "view_metadata": "View Metadata",
- "log_deleted_success": "Log deleted successfully",
- "log_deleted_error": "Failed to delete log",
- "confirm_delete_log_title": "Are you sure?",
- "confirm_delete_log_desc": "This action cannot be undone. This will permanently delete the log entry.",
- "deleting": "Deleting..."
- },
- "onboard": {
- "welcome_title": "Welcome to SurfSense",
- "welcome_subtitle": "Let's configure your LLM configurations to get started",
- "step_of": "Step {current} of {total}",
- "percent_complete": "{percent}% Complete",
- "add_llm_provider": "Add LLM Provider",
- "assign_llm_roles": "Assign LLM Roles",
- "setup_complete": "Setup Complete",
- "configure_first_provider": "Configure your first model provider",
- "assign_specific_roles": "Assign specific roles to your LLM configurations",
- "all_set": "You're all set to start using SurfSense!",
- "loading_config": "Loading your configuration...",
- "previous": "Previous",
- "next": "Next",
- "complete_setup": "Complete Setup",
- "add_provider_instruction": "Add at least one LLM provider to continue. You can configure multiple providers and choose specific roles for each one in the next step.",
- "your_llm_configs": "Your LLM Configurations",
- "model": "Model",
- "language": "Language",
- "base": "Base",
- "add_provider_title": "Add LLM Provider",
- "add_provider_subtitle": "Configure your first model provider to get started",
- "add_provider_button": "Add Provider",
- "add_new_llm_provider": "Add New LLM Provider",
- "configure_new_provider": "Configure a new language model provider for your AI assistant",
- "config_name": "Configuration Name",
- "config_name_required": "Configuration Name *",
- "config_name_placeholder": "e.g., My OpenAI GPT-4",
- "provider": "Provider",
- "provider_required": "Provider *",
- "provider_placeholder": "Select a provider",
- "language_optional": "Language (Optional)",
- "language_placeholder": "Select language",
- "custom_provider_name": "Custom Provider Name *",
- "custom_provider_placeholder": "e.g., my-custom-provider",
- "model_name_required": "Model Name *",
- "model_name_placeholder": "e.g., gpt-4",
- "examples": "Examples",
- "api_key_required": "API Key *",
- "api_key_placeholder": "Your API key",
- "api_base_optional": "API Base URL (Optional)",
- "api_base_placeholder": "e.g., https://api.openai.com/v1",
- "adding": "Adding...",
- "add_provider": "Add Provider",
- "cancel": "Cancel",
- "assign_roles_instruction": "Assign your LLM configurations to specific roles. Each role serves different purposes in your workflow.",
- "no_llm_configs_found": "No LLM Configurations Found",
- "add_provider_before_roles": "Please add at least one LLM provider in the previous step before assigning roles.",
- "long_context_llm_title": "Long Context LLM",
- "long_context_llm_desc": "Handles complex tasks requiring extensive context understanding and reasoning",
- "long_context_llm_examples": "Document analysis, research synthesis, complex Q&A",
- "fast_llm_title": "Fast LLM",
- "fast_llm_desc": "Optimized for quick responses and real-time interactions",
- "fast_llm_examples": "Quick searches, simple questions, instant responses",
- "strategic_llm_title": "Strategic LLM",
- "strategic_llm_desc": "Advanced reasoning for planning and strategic decision making",
- "strategic_llm_examples": "Planning workflows, strategic analysis, complex problem solving",
- "use_cases": "Use cases",
- "assign_llm_config": "Assign LLM Configuration",
- "select_llm_config": "Select an LLM configuration",
- "assigned": "Assigned",
- "all_roles_assigned_saved": "All roles assigned and saved!",
- "progress": "Progress",
- "roles_assigned": "{assigned} of {total} roles assigned"
- },
- "model_config": {
- "title": "Model Configurations",
- "subtitle": "Manage your LLM provider configurations and API settings.",
- "refresh": "Refresh",
- "loading": "Loading configurations...",
- "total_configs": "Total Configurations",
- "unique_providers": "Unique Providers",
- "system_status": "System Status",
- "active": "Active",
- "your_configs": "Your Configurations",
- "manage_configs": "Manage and configure your LLM providers",
- "add_config": "Add Configuration",
- "no_configs": "No Configurations Yet",
- "no_configs_desc": "Get started by adding your first LLM provider configuration to begin using the system.",
- "add_first_config": "Add First Configuration",
- "created": "Created"
- },
- "breadcrumb": {
- "dashboard": "Dashboard",
- "search_space": "Search Space",
- "researcher": "Researcher",
- "documents": "Documents",
- "connectors": "Connectors",
- "podcasts": "Podcasts",
- "logs": "Logs",
- "chats": "Chats",
- "settings": "Settings",
- "upload_documents": "Upload Documents",
- "add_youtube": "Add YouTube Videos",
- "add_webpages": "Add Webpages",
- "add_connector": "Add Connector",
- "manage_connectors": "Manage Connectors",
- "edit_connector": "Edit Connector",
- "manage": "Manage"
- },
- "sidebar": {
- "recent_chats": "Recent Chats",
- "search_chats": "Search chats...",
- "no_chats_found": "No chats found",
- "no_recent_chats": "No recent chats",
- "view_all_chats": "View All Chats",
- "search_space": "Search Space"
- },
- "errors": {
- "something_went_wrong": "Something went wrong",
- "try_again": "Please try again",
- "not_found": "Not found",
- "unauthorized": "Unauthorized",
- "forbidden": "Forbidden",
- "server_error": "Server error",
- "network_error": "Network error"
- },
- "homepage": {
- "hero_title_part1": "The AI Workspace",
- "hero_title_part2": "Built for Teams",
- "hero_description": "Connect any LLM to your internal knowledge sources and chat with it in real time alongside your team.",
- "cta_start_trial": "Start Free Trial",
- "cta_explore": "Explore",
- "integrations_title": "Integrations",
- "integrations_subtitle": "Integrate with your team's most important tools",
- "features_title": "Your Team's AI-Powered Knowledge Hub",
- "features_subtitle": "Powerful features designed to enhance collaboration, boost productivity, and streamline your workflow.",
- "feature_workflow_title": "Streamlined Workflow",
- "feature_workflow_desc": "Centralize all your knowledge and resources in one intelligent workspace. Find what you need instantly and accelerate decision-making.",
- "feature_collaboration_title": "Seamless Collaboration",
- "feature_collaboration_desc": "Work together effortlessly with real-time collaboration tools that keep your entire team aligned.",
- "feature_customizable_title": "Fully Customizable",
- "feature_customizable_desc": "Choose from 100+ leading LLMs and seamlessly call any model on demand.",
- "cta_transform": "Transform how your team",
- "cta_transform_bold": "discovers and collaborates",
- "cta_unite_start": "Unite your",
- "cta_unite_knowledge": "team's knowledge",
- "cta_unite_middle": "in one collaborative space with",
- "cta_unite_search": "intelligent search",
- "cta_talk_to_us": "Talk to us",
- "features": {
- "find_ask_act": {
- "title": "Find, Ask, Act",
- "description": "Get instant information, detailed updates, and cited answers across company and personal knowledge."
- },
- "real_time_collab": {
- "title": "Work Together in Real Time",
- "description": "Transform your company docs into multiplayer spaces with live edits, synced content, and presence."
- },
- "beyond_text": {
- "title": "Collaborate Beyond Text",
- "description": "Create podcasts and multimedia your team can comment on, share, and refine together."
- },
- "context_counts": {
- "title": "Context Where It Counts",
- "description": "Add comments directly to your chats and docs for clear, in-the-moment feedback."
- },
- "citation_illustration_title": "Citation feature illustration showing clickable source reference",
- "referenced_chunk": "Referenced Chunk",
- "collab_illustration_label": "Illustration of a realtime collaboration in a text editor.",
- "real_time": "Real-time",
- "collab_part1": "collabo",
- "collab_part2": "orat",
- "collab_part3": "ion",
- "annotation_illustration_label": "Illustration of a text editor with annotation comments.",
- "add_context_with": "Add context with",
- "comments": "comments",
- "example_comment": "Let's discuss this tomorrow!"
- }
- }
+ "common": {
+ "app_name": "SurfSense",
+ "welcome": "Welcome",
+ "loading": "Loading...",
+ "save": "Save",
+ "cancel": "Cancel",
+ "delete": "Delete",
+ "edit": "Edit",
+ "create": "Create",
+ "update": "Update",
+ "search": "Search",
+ "close": "Close",
+ "confirm": "Confirm",
+ "back": "Back",
+ "next": "Next",
+ "submit": "Submit",
+ "yes": "Yes",
+ "no": "No",
+ "add": "Add",
+ "remove": "Remove",
+ "select": "Select",
+ "all": "All",
+ "none": "None",
+ "error": "Error",
+ "success": "Success",
+ "warning": "Warning",
+ "info": "Information",
+ "required": "Required",
+ "optional": "Optional",
+ "retry": "Retry"
+ },
+ "auth": {
+ "login": "Login",
+ "register": "Register",
+ "logout": "Logout",
+ "email": "Email",
+ "password": "Password",
+ "confirm_password": "Confirm Password",
+ "forgot_password": "Forgot Password?",
+ "show_password": "Show password",
+ "hide_password": "Hide password",
+ "remember_me": "Remember Me",
+ "sign_in": "Sign In",
+ "sign_up": "Sign Up",
+ "sign_in_with": "Sign in with {provider}",
+ "dont_have_account": "Don't have an account?",
+ "already_have_account": "Already have an account?",
+ "reset_password": "Reset Password",
+ "email_required": "Email is required",
+ "password_required": "Password is required",
+ "invalid_email": "Invalid email address",
+ "password_too_short": "Password must be at least 8 characters",
+ "welcome_back": "Welcome back",
+ "create_account": "Create your account",
+ "login_subtitle": "Enter your credentials to access your account",
+ "register_subtitle": "Sign up to get started with SurfSense",
+ "or_continue_with": "Or continue with",
+ "by_continuing": "By continuing, you agree to our",
+ "terms_of_service": "Terms of Service",
+ "and": "and",
+ "privacy_policy": "Privacy Policy",
+ "full_name": "Full Name",
+ "username": "Username",
+ "continue": "Continue",
+ "back_to_login": "Back to Login",
+ "login_success": "Successfully logged in",
+ "register_success": "Account created successfully",
+ "continue_with_google": "Continue with Google",
+ "cloud_dev_notice": "SurfSense Cloud is currently in development. Check",
+ "docs": "Docs",
+ "cloud_dev_self_hosted": "for more information on Self-Hosted version.",
+ "passwords_no_match": "Passwords do not match",
+ "password_mismatch": "Password Mismatch",
+ "passwords_no_match_desc": "The passwords you entered do not match",
+ "creating_account": "Creating your account...",
+ "creating_account_btn": "Creating account...",
+ "redirecting_login": "Redirecting to login page..."
+ },
+ "dashboard": {
+ "title": "Dashboard",
+ "search_spaces": "Search Spaces",
+ "documents": "Documents",
+ "connectors": "Connectors",
+ "settings": "Settings",
+ "researcher": "Researcher",
+ "api_keys": "API Keys",
+ "profile": "Profile",
+ "loading_dashboard": "Loading Dashboard",
+ "checking_auth": "Checking authentication...",
+ "loading_config": "Loading Configuration",
+ "checking_llm_prefs": "Checking your LLM preferences...",
+ "config_error": "Configuration Error",
+ "failed_load_llm_config": "Failed to load your LLM configuration",
+ "error_loading_chats": "Error loading chats",
+ "no_recent_chats": "No recent chats",
+ "error_loading_space": "Error loading search space",
+ "unknown_search_space": "Unknown Search Space",
+ "delete_chat": "Delete Chat",
+ "delete_chat_confirm": "Are you sure you want to delete",
+ "action_cannot_undone": "This action cannot be undone.",
+ "deleting": "Deleting...",
+ "surfsense_dashboard": "SurfSense Dashboard",
+ "welcome_message": "Welcome to your SurfSense dashboard.",
+ "your_search_spaces": "Your Search Spaces",
+ "create_search_space": "Create Search Space",
+ "add_new_search_space": "Add New Search Space",
+ "loading": "Loading",
+ "fetching_spaces": "Fetching your search spaces...",
+ "may_take_moment": "This may take a moment",
+ "error": "Error",
+ "something_wrong": "Something went wrong",
+ "error_details": "Error Details",
+ "try_again": "Try Again",
+ "go_home": "Go Home",
+ "delete_search_space": "Delete Search Space",
+ "delete_space_confirm": "Are you sure you want to delete \"{name}\"? This action cannot be undone. All documents, chats, and podcasts in this search space will be permanently deleted.",
+ "no_spaces_found": "No search spaces found",
+ "create_first_space": "Create your first search space to get started",
+ "created": "Created"
+ },
+ "navigation": {
+ "home": "Home",
+ "docs": "Docs",
+ "pricing": "Pricing",
+ "contact": "Contact",
+ "login": "Login",
+ "register": "Register",
+ "dashboard": "Dashboard",
+ "sign_in": "Sign In",
+ "book_a_call": "Book a call"
+ },
+ "nav_menu": {
+ "platform": "Platform",
+ "researcher": "Researcher",
+ "manage_llms": "Manage LLMs",
+ "documents": "Documents",
+ "upload_documents": "Upload Documents",
+ "add_webpages": "Add Webpages",
+ "add_youtube": "Add Youtube Videos",
+ "add_youtube_videos": "Add Youtube Videos",
+ "manage_documents": "Manage Documents",
+ "connectors": "Connectors",
+ "add_connector": "Add Connector",
+ "manage_connectors": "Manage Connectors",
+ "podcasts": "Podcasts",
+ "logs": "Logs",
+ "all_search_spaces": "All Search Spaces"
+ },
+ "pricing": {
+ "title": "SurfSense Pricing",
+ "subtitle": "Choose that works for you",
+ "community_name": "COMMUNITY",
+ "enterprise_name": "ENTERPRISE",
+ "forever": "forever",
+ "contact_us": "Contact Us",
+ "feature_llms": "Supports 100+ LLMs",
+ "feature_ollama": "Supports local Ollama or vLLM setups",
+ "feature_embeddings": "6000+ Embedding Models",
+ "feature_files": "50+ File extensions supported.",
+ "feature_podcasts": "Podcasts support with local TTS providers.",
+ "feature_sources": "Connects with 15+ external sources.",
+ "feature_extension": "Cross-Browser Extension for dynamic webpages including authenticated content",
+ "upcoming_mindmaps": "Upcoming: Mergeable MindMaps",
+ "upcoming_notes": "Upcoming: Note Management",
+ "community_desc": "Open source version with powerful features",
+ "get_started": "Get Started",
+ "everything_community": "Everything in Community",
+ "priority_support": "Priority Support",
+ "access_controls": "Access Controls",
+ "collaboration": "Collaboration and multiplayer features",
+ "video_gen": "Video generation",
+ "advanced_security": "Advanced security features",
+ "enterprise_desc": "For large organizations with specific needs",
+ "contact_sales": "Contact Sales"
+ },
+ "contact": {
+ "title": "Contact",
+ "subtitle": "We'd love to Hear From You.",
+ "we_are_here": "We are here",
+ "full_name": "Full name",
+ "email_address": "Email Address",
+ "company": "Company",
+ "message": "Message",
+ "optional": "optional",
+ "name_placeholder": "John Doe",
+ "email_placeholder": "john.doe@example.com",
+ "company_placeholder": "Example Inc.",
+ "message_placeholder": "Type your message here",
+ "submit": "Submit",
+ "submitting": "Submitting...",
+ "name_required": "Name is required",
+ "name_too_long": "Name is too long",
+ "invalid_email": "Invalid email address",
+ "email_too_long": "Email is too long",
+ "company_required": "Company is required",
+ "company_too_long": "Company name is too long",
+ "message_sent": "Message sent successfully!",
+ "we_will_contact": "We will get back to you as soon as possible.",
+ "send_failed": "Failed to send message",
+ "try_again_later": "Please try again later.",
+ "something_wrong": "Something went wrong"
+ },
+ "researcher": {
+ "loading": "Loading...",
+ "select_documents": "Select Documents",
+ "select_documents_desc": "Choose documents to include in your research context",
+ "loading_documents": "Loading documents...",
+ "select_connectors": "Select Connectors",
+ "select_connectors_desc": "Choose which data sources to include in your research",
+ "clear_all": "Clear All",
+ "select_all": "Select All",
+ "scope": "Scope",
+ "documents": "Documents",
+ "docs": "Docs",
+ "chunks": "Chunks",
+ "mode": "Mode",
+ "research_mode": "Research Mode",
+ "mode_qna": "Q&A",
+ "mode_general": "General Report",
+ "mode_general_short": "General",
+ "mode_deep": "Deep Report",
+ "mode_deep_short": "Deep",
+ "mode_deeper": "Deeper Report",
+ "mode_deeper_short": "Deeper",
+ "fast_llm": "Fast LLM",
+ "select_llm": "Select LLM",
+ "fast_llm_selection": "Fast LLM Selection",
+ "no_llm_configs": "No LLM configurations",
+ "configure_llm_to_start": "Configure AI models to get started",
+ "open_settings": "Open Settings",
+ "start_surfing": "Let's Start Surfing",
+ "through_knowledge_base": "through your knowledge base.",
+ "all_connectors": "All Connectors",
+ "connectors_selected": "{count} Connectors",
+ "placeholder": "Ask me anything..."
+ },
+ "connectors": {
+ "title": "Connectors",
+ "subtitle": "Manage your connected services and data sources.",
+ "add_connector": "Add Connector",
+ "your_connectors": "Your Connectors",
+ "view_manage": "View and manage all your connected services.",
+ "no_connectors": "No connectors found",
+ "no_connectors_desc": "You haven't added any connectors yet. Add one to enhance your search capabilities.",
+ "add_first": "Add Your First Connector",
+ "name": "Name",
+ "type": "Type",
+ "last_indexed": "Last Indexed",
+ "periodic": "Periodic",
+ "actions": "Actions",
+ "never": "Never",
+ "not_indexable": "Not indexable",
+ "index_date_range": "Index with Date Range",
+ "quick_index": "Quick Index",
+ "quick_index_auto": "Quick Index (Auto Date Range)",
+ "delete_connector": "Delete Connector",
+ "delete_confirm": "Are you sure you want to delete this connector? This action cannot be undone.",
+ "select_date_range": "Select Date Range for Indexing",
+ "select_date_range_desc": "Choose the start and end dates for indexing content. Leave empty to use default range.",
+ "start_date": "Start Date",
+ "end_date": "End Date",
+ "pick_date": "Pick a date",
+ "clear_dates": "Clear Dates",
+ "last_30_days": "Last 30 Days",
+ "last_year": "Last Year",
+ "start_indexing": "Start Indexing",
+ "failed_load": "Failed to load connectors",
+ "delete_success": "Connector deleted successfully",
+ "delete_failed": "Failed to delete connector",
+ "indexing_started": "Connector content indexing started",
+ "indexing_failed": "Failed to index connector content"
+ },
+ "documents": {
+ "title": "Documents",
+ "subtitle": "Manage your documents and files.",
+ "no_rows_selected": "No rows selected",
+ "delete_success_count": "Successfully deleted {count} document(s)",
+ "delete_partial_failed": "Some documents could not be deleted",
+ "delete_error": "Error deleting documents",
+ "filter_by_title": "Filter by title...",
+ "bulk_delete": "Delete Selected",
+ "filter_types": "Filter Types",
+ "columns": "Columns",
+ "confirm_delete": "Confirm Delete",
+ "confirm_delete_desc": "Are you sure you want to delete {count} document(s)? This action cannot be undone.",
+ "uploading": "Uploading...",
+ "upload_success": "Document uploaded successfully",
+ "upload_failed": "Failed to upload document",
+ "loading": "Loading documents...",
+ "error_loading": "Error loading documents",
+ "retry": "Retry",
+ "no_documents": "No documents found",
+ "type": "Type",
+ "content_summary": "Content Summary",
+ "view_full": "View Full Content",
+ "filter_placeholder": "Filter by title...",
+ "rows_per_page": "Rows per page"
+ },
+ "add_connector": {
+ "title": "Connect Your Tools",
+ "subtitle": "Integrate with your favorite services to enhance your research capabilities.",
+ "search_engines": "Search Engines",
+ "team_chats": "Team Chats",
+ "project_management": "Project Management",
+ "knowledge_bases": "Knowledge Bases",
+ "communication": "Communication",
+ "connect": "Connect",
+ "coming_soon": "Coming Soon",
+ "connected": "Connected",
+ "manage": "Manage",
+ "tavily_desc": "Search the web using the Tavily API",
+ "searxng_desc": "Use your own SearxNG meta-search instance for web results.",
+ "linkup_desc": "Search the web using the Linkup API",
+ "elasticsearch_desc": "Connect to Elasticsearch to index and search documents, logs and metrics.",
+ "baidu_desc": "Search the Chinese web using Baidu AI Search API",
+ "slack_desc": "Connect to your Slack workspace to access messages and channels.",
+ "teams_desc": "Connect to Microsoft Teams to access your team's conversations.",
+ "discord_desc": "Connect to Discord servers to access messages and channels.",
+ "linear_desc": "Connect to Linear to search issues, comments and project data.",
+ "jira_desc": "Connect to Jira to search issues, tickets and project data.",
+ "clickup_desc": "Connect to ClickUp to search tasks, comments and project data.",
+ "notion_desc": "Connect to your Notion workspace to access pages and databases.",
+ "github_desc": "Connect a GitHub PAT to index code and docs from accessible repositories.",
+ "confluence_desc": "Connect to Confluence to search pages, comments and documentation.",
+ "airtable_desc": "Connect to Airtable to search records, tables and database content.",
+ "luma_desc": "Connect to Luma to search events",
+ "calendar_desc": "Connect to Google Calendar to search events, meetings and schedules.",
+ "gmail_desc": "Connect to your Gmail account to search through your emails.",
+ "zoom_desc": "Connect to Zoom to access meeting recordings and transcripts."
+ },
+ "upload_documents": {
+ "title": "Upload Documents",
+ "subtitle": "Upload your files to make them searchable and accessible through AI-powered conversations.",
+ "file_size_limit": "Maximum file size: 50MB per file. Supported formats vary based on your ETL service configuration.",
+ "drop_files": "Drop files here",
+ "drag_drop": "Drag & drop files here",
+ "or_browse": "or click to browse",
+ "browse_files": "Browse Files",
+ "selected_files": "Selected Files ({count})",
+ "total_size": "Total size",
+ "clear_all": "Clear all",
+ "uploading_files": "Uploading files...",
+ "uploading": "Uploading...",
+ "upload_button": "Upload {count} {count, plural, one {file} other {files}}",
+ "upload_initiated": "Upload Task Initiated",
+ "upload_initiated_desc": "Files Uploading Initiated",
+ "upload_error": "Upload Error",
+ "upload_error_desc": "Error uploading files",
+ "supported_file_types": "Supported File Types",
+ "file_types_desc": "These file types are supported based on your current ETL service configuration."
+ },
+ "add_webpage": {
+ "title": "Add Webpages for Crawling",
+ "subtitle": "Enter URLs to crawl and add to your document collection",
+ "label": "Enter URLs to crawl",
+ "placeholder": "Enter a URL and press Enter",
+ "hint": "Add multiple URLs by pressing Enter after each one",
+ "tips_title": "Tips for URL crawling:",
+ "tip_1": "Enter complete URLs including http:// or https://",
+ "tip_2": "Make sure the websites allow crawling",
+ "tip_3": "Public webpages work best",
+ "tip_4": "Crawling may take some time depending on the website size",
+ "cancel": "Cancel",
+ "submit": "Submit URLs for Crawling",
+ "submitting": "Submitting...",
+ "error_no_url": "Please add at least one URL",
+ "error_invalid_urls": "Invalid URLs detected: {urls}",
+ "crawling_toast": "URL Crawling",
+ "crawling_toast_desc": "Starting URL crawling process...",
+ "success_toast": "Crawling Successful",
+ "success_toast_desc": "URLs have been submitted for crawling",
+ "error_toast": "Crawling Error",
+ "error_toast_desc": "Error crawling URLs",
+ "error_generic": "An error occurred while crawling URLs",
+ "invalid_url_toast": "Invalid URL",
+ "invalid_url_toast_desc": "Please enter a valid URL",
+ "duplicate_url_toast": "Duplicate URL",
+ "duplicate_url_toast_desc": "This URL has already been added"
+ },
+ "add_youtube": {
+ "title": "Add YouTube Videos",
+ "subtitle": "Enter YouTube video URLs to add to your document collection",
+ "label": "Enter YouTube Video URLs",
+ "placeholder": "Enter a YouTube URL and press Enter",
+ "hint": "Add multiple YouTube URLs by pressing Enter after each one",
+ "tips_title": "Tips for adding YouTube videos:",
+ "tip_1": "Use standard YouTube URLs (youtube.com/watch?v= or youtu.be/)",
+ "tip_2": "Make sure videos are publicly accessible",
+ "tip_3": "Supported formats: youtube.com/watch?v=VIDEO_ID or youtu.be/VIDEO_ID",
+ "tip_4": "Processing may take some time depending on video length",
+ "preview": "Preview",
+ "cancel": "Cancel",
+ "submit": "Submit YouTube Videos",
+ "processing": "Processing...",
+ "error_no_video": "Please add at least one YouTube video URL",
+ "error_invalid_urls": "Invalid YouTube URLs detected: {urls}",
+ "processing_toast": "YouTube Video Processing",
+ "processing_toast_desc": "Starting YouTube video processing...",
+ "success_toast": "Processing Successful",
+ "success_toast_desc": "YouTube videos have been submitted for processing",
+ "error_toast": "Processing Error",
+ "error_toast_desc": "Error processing YouTube videos",
+ "error_generic": "An error occurred while processing YouTube videos",
+ "invalid_url_toast": "Invalid YouTube URL",
+ "invalid_url_toast_desc": "Please enter a valid YouTube video URL",
+ "duplicate_url_toast": "Duplicate URL",
+ "duplicate_url_toast_desc": "This YouTube video has already been added"
+ },
+ "settings": {
+ "title": "Settings",
+ "subtitle": "Manage your LLM configurations and role assignments for this search space.",
+ "back_to_dashboard": "Back to Dashboard",
+ "model_configs": "Model Configs",
+ "models": "Models",
+ "llm_roles": "LLM Roles",
+ "roles": "Roles",
+ "llm_role_management": "LLM Role Management",
+ "llm_role_desc": "Assign your LLM configurations to specific roles for different purposes.",
+ "no_llm_configs_found": "No LLM configurations found. Please add at least one LLM provider in the Model Configs tab before assigning roles.",
+ "select_llm_config": "Select an LLM configuration",
+ "long_context_llm": "Long Context LLM",
+ "fast_llm": "Fast LLM",
+ "strategic_llm": "Strategic LLM",
+ "long_context_desc": "Handles complex tasks requiring extensive context understanding and reasoning",
+ "long_context_examples": "Document analysis, research synthesis, complex Q&A",
+ "large_context_window": "Large context window",
+ "deep_reasoning": "Deep reasoning",
+ "complex_analysis": "Complex analysis",
+ "fast_llm_desc": "Optimized for quick responses and real-time interactions",
+ "fast_llm_examples": "Quick searches, simple questions, instant responses",
+ "low_latency": "Low latency",
+ "quick_responses": "Quick responses",
+ "real_time_chat": "Real-time chat",
+ "strategic_llm_desc": "Advanced reasoning for planning and strategic decision making",
+ "strategic_llm_examples": "Planning workflows, strategic analysis, complex problem solving",
+ "strategic_thinking": "Strategic thinking",
+ "long_term_planning": "Long-term planning",
+ "complex_reasoning": "Complex reasoning",
+ "use_cases": "Use cases",
+ "assign_llm_config": "Assign LLM Configuration",
+ "unassigned": "Unassigned",
+ "assigned": "Assigned",
+ "model": "Model",
+ "base": "Base",
+ "all_roles_assigned": "All roles are assigned and ready to use! Your LLM configuration is complete.",
+ "save_changes": "Save Changes",
+ "saving": "Saving...",
+ "reset": "Reset",
+ "status": "Status",
+ "status_ready": "Ready",
+ "status_setup": "Setup",
+ "complete_role_assignments": "Complete all role assignments to enable full functionality. Each role serves different purposes in your workflow.",
+ "all_roles_saved": "All roles assigned and saved!",
+ "progress": "Progress",
+ "roles_assigned_count": "{assigned} of {total} roles assigned"
+ },
+ "podcasts": {
+ "title": "Podcasts",
+ "subtitle": "Listen to generated podcasts.",
+ "search_placeholder": "Search podcasts...",
+ "sort_order": "Sort order",
+ "newest_first": "Newest First",
+ "oldest_first": "Oldest First",
+ "loading": "Loading podcasts...",
+ "error_loading": "Error loading podcasts",
+ "no_podcasts": "No podcasts found",
+ "adjust_filters": "Try adjusting your search filters",
+ "generate_hint": "Generate podcasts from your chats to get started",
+ "loading_podcast": "Loading podcast...",
+ "now_playing": "Now Playing",
+ "delete_podcast": "Delete Podcast",
+ "delete_confirm_1": "Are you sure you want to delete",
+ "delete_confirm_2": "This action cannot be undone.",
+ "cancel": "Cancel",
+ "delete": "Delete",
+ "deleting": "Deleting..."
+ },
+ "logs": {
+ "title": "Task Logs",
+ "subtitle": "Monitor and analyze all task execution logs",
+ "refresh": "Refresh",
+ "delete_selected": "Delete Selected",
+ "confirm_title": "Are you absolutely sure?",
+ "confirm_delete_desc": "This action cannot be undone. This will permanently delete {count} selected log(s).",
+ "cancel": "Cancel",
+ "delete": "Delete",
+ "level": "Level",
+ "status": "Status",
+ "source": "Source",
+ "message": "Message",
+ "created_at": "Created At",
+ "actions": "Actions",
+ "system": "System",
+ "filter_by_message": "Filter by message...",
+ "filter_by": "Filter by",
+ "total_logs": "Total Logs",
+ "active_tasks": "Active Tasks",
+ "success_rate": "Success Rate",
+ "recent_failures": "Recent Failures",
+ "last_hours": "Last {hours} hours",
+ "currently_running": "Currently running",
+ "successful": "successful",
+ "need_attention": "Need attention",
+ "no_logs": "No logs found",
+ "loading": "Loading logs...",
+ "error_loading": "Error loading logs",
+ "columns": "Columns",
+ "failed_load_summary": "Failed to load summary",
+ "retry": "Retry",
+ "view": "View",
+ "toggle_columns": "Toggle columns",
+ "rows_per_page": "Rows per page",
+ "view_metadata": "View Metadata",
+ "log_deleted_success": "Log deleted successfully",
+ "log_deleted_error": "Failed to delete log",
+ "confirm_delete_log_title": "Are you sure?",
+ "confirm_delete_log_desc": "This action cannot be undone. This will permanently delete the log entry.",
+ "deleting": "Deleting..."
+ },
+ "onboard": {
+ "welcome_title": "Welcome to SurfSense",
+ "welcome_subtitle": "Let's configure your LLM configurations to get started",
+ "step_of": "Step {current} of {total}",
+ "percent_complete": "{percent}% Complete",
+ "add_llm_provider": "Add LLM Provider",
+ "assign_llm_roles": "Assign LLM Roles",
+ "setup_complete": "Setup Complete",
+ "configure_first_provider": "Configure your first model provider",
+ "assign_specific_roles": "Assign specific roles to your LLM configurations",
+ "all_set": "You're all set to start using SurfSense!",
+ "loading_config": "Loading your configuration...",
+ "previous": "Previous",
+ "next": "Next",
+ "complete_setup": "Complete Setup",
+ "add_provider_instruction": "Add at least one LLM provider to continue. You can configure multiple providers and choose specific roles for each one in the next step.",
+ "your_llm_configs": "Your LLM Configurations",
+ "model": "Model",
+ "language": "Language",
+ "base": "Base",
+ "add_provider_title": "Add LLM Provider",
+ "add_provider_subtitle": "Configure your first model provider to get started",
+ "add_provider_button": "Add Provider",
+ "add_new_llm_provider": "Add New LLM Provider",
+ "configure_new_provider": "Configure a new language model provider for your AI assistant",
+ "config_name": "Configuration Name",
+ "config_name_required": "Configuration Name *",
+ "config_name_placeholder": "e.g., My OpenAI GPT-4",
+ "provider": "Provider",
+ "provider_required": "Provider *",
+ "provider_placeholder": "Select a provider",
+ "language_optional": "Language (Optional)",
+ "language_placeholder": "Select language",
+ "custom_provider_name": "Custom Provider Name *",
+ "custom_provider_placeholder": "e.g., my-custom-provider",
+ "model_name_required": "Model Name *",
+ "model_name_placeholder": "e.g., gpt-4",
+ "examples": "Examples",
+ "api_key_required": "API Key *",
+ "api_key_placeholder": "Your API key",
+ "api_base_optional": "API Base URL (Optional)",
+ "api_base_placeholder": "e.g., https://api.openai.com/v1",
+ "adding": "Adding...",
+ "add_provider": "Add Provider",
+ "cancel": "Cancel",
+ "assign_roles_instruction": "Assign your LLM configurations to specific roles. Each role serves different purposes in your workflow.",
+ "no_llm_configs_found": "No LLM Configurations Found",
+ "add_provider_before_roles": "Please add at least one LLM provider in the previous step before assigning roles.",
+ "long_context_llm_title": "Long Context LLM",
+ "long_context_llm_desc": "Handles complex tasks requiring extensive context understanding and reasoning",
+ "long_context_llm_examples": "Document analysis, research synthesis, complex Q&A",
+ "fast_llm_title": "Fast LLM",
+ "fast_llm_desc": "Optimized for quick responses and real-time interactions",
+ "fast_llm_examples": "Quick searches, simple questions, instant responses",
+ "strategic_llm_title": "Strategic LLM",
+ "strategic_llm_desc": "Advanced reasoning for planning and strategic decision making",
+ "strategic_llm_examples": "Planning workflows, strategic analysis, complex problem solving",
+ "use_cases": "Use cases",
+ "assign_llm_config": "Assign LLM Configuration",
+ "select_llm_config": "Select an LLM configuration",
+ "assigned": "Assigned",
+ "all_roles_assigned_saved": "All roles assigned and saved!",
+ "progress": "Progress",
+ "roles_assigned": "{assigned} of {total} roles assigned"
+ },
+ "model_config": {
+ "title": "Model Configurations",
+ "subtitle": "Manage your LLM provider configurations and API settings.",
+ "refresh": "Refresh",
+ "loading": "Loading configurations...",
+ "total_configs": "Total Configurations",
+ "unique_providers": "Unique Providers",
+ "system_status": "System Status",
+ "active": "Active",
+ "your_configs": "Your Configurations",
+ "manage_configs": "Manage and configure your LLM providers",
+ "add_config": "Add Configuration",
+ "no_configs": "No Configurations Yet",
+ "no_configs_desc": "Get started by adding your first LLM provider configuration to begin using the system.",
+ "add_first_config": "Add First Configuration",
+ "created": "Created"
+ },
+ "breadcrumb": {
+ "dashboard": "Dashboard",
+ "search_space": "Search Space",
+ "researcher": "Researcher",
+ "documents": "Documents",
+ "connectors": "Connectors",
+ "podcasts": "Podcasts",
+ "logs": "Logs",
+ "chats": "Chats",
+ "settings": "Settings",
+ "upload_documents": "Upload Documents",
+ "add_youtube": "Add YouTube Videos",
+ "add_webpages": "Add Webpages",
+ "add_connector": "Add Connector",
+ "manage_connectors": "Manage Connectors",
+ "edit_connector": "Edit Connector",
+ "manage": "Manage"
+ },
+ "sidebar": {
+ "recent_chats": "Recent Chats",
+ "search_chats": "Search chats...",
+ "no_chats_found": "No chats found",
+ "no_recent_chats": "No recent chats",
+ "view_all_chats": "View All Chats",
+ "search_space": "Search Space"
+ },
+ "errors": {
+ "something_went_wrong": "Something went wrong",
+ "try_again": "Please try again",
+ "not_found": "Not found",
+ "unauthorized": "Unauthorized",
+ "forbidden": "Forbidden",
+ "server_error": "Server error",
+ "network_error": "Network error"
+ },
+ "homepage": {
+ "hero_title_part1": "The AI Workspace",
+ "hero_title_part2": "Built for Teams",
+ "hero_description": "Connect any LLM to your internal knowledge sources and chat with it in real time alongside your team.",
+ "cta_start_trial": "Start Free Trial",
+ "cta_explore": "Explore",
+ "integrations_title": "Integrations",
+ "integrations_subtitle": "Integrate with your team's most important tools",
+ "features_title": "Your Team's AI-Powered Knowledge Hub",
+ "features_subtitle": "Powerful features designed to enhance collaboration, boost productivity, and streamline your workflow.",
+ "feature_workflow_title": "Streamlined Workflow",
+ "feature_workflow_desc": "Centralize all your knowledge and resources in one intelligent workspace. Find what you need instantly and accelerate decision-making.",
+ "feature_collaboration_title": "Seamless Collaboration",
+ "feature_collaboration_desc": "Work together effortlessly with real-time collaboration tools that keep your entire team aligned.",
+ "feature_customizable_title": "Fully Customizable",
+ "feature_customizable_desc": "Choose from 100+ leading LLMs and seamlessly call any model on demand.",
+ "cta_transform": "Transform how your team",
+ "cta_transform_bold": "discovers and collaborates",
+ "cta_unite_start": "Unite your",
+ "cta_unite_knowledge": "team's knowledge",
+ "cta_unite_middle": "in one collaborative space with",
+ "cta_unite_search": "intelligent search",
+ "cta_talk_to_us": "Talk to us",
+ "features": {
+ "find_ask_act": {
+ "title": "Find, Ask, Act",
+ "description": "Get instant information, detailed updates, and cited answers across company and personal knowledge."
+ },
+ "real_time_collab": {
+ "title": "Work Together in Real Time",
+ "description": "Transform your company docs into multiplayer spaces with live edits, synced content, and presence."
+ },
+ "beyond_text": {
+ "title": "Collaborate Beyond Text",
+ "description": "Create podcasts and multimedia your team can comment on, share, and refine together."
+ },
+ "context_counts": {
+ "title": "Context Where It Counts",
+ "description": "Add comments directly to your chats and docs for clear, in-the-moment feedback."
+ },
+ "citation_illustration_title": "Citation feature illustration showing clickable source reference",
+ "referenced_chunk": "Referenced Chunk",
+ "collab_illustration_label": "Illustration of a realtime collaboration in a text editor.",
+ "real_time": "Real-time",
+ "collab_part1": "collabo",
+ "collab_part2": "orat",
+ "collab_part3": "ion",
+ "annotation_illustration_label": "Illustration of a text editor with annotation comments.",
+ "add_context_with": "Add context with",
+ "comments": "comments",
+ "example_comment": "Let's discuss this tomorrow!"
+ }
+ }
}
-
diff --git a/surfsense_web/messages/zh.json b/surfsense_web/messages/zh.json
index 1f65b249..cf47a090 100644
--- a/surfsense_web/messages/zh.json
+++ b/surfsense_web/messages/zh.json
@@ -1,692 +1,691 @@
{
- "common": {
- "app_name": "SurfSense",
- "welcome": "欢迎",
- "loading": "加载中...",
- "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": "重试"
- },
- "auth": {
- "login": "登录",
- "register": "注册",
- "logout": "登出",
- "email": "电子邮箱",
- "password": "密码",
- "confirm_password": "确认密码",
- "forgot_password": "忘记密码?",
- "show_password": "显示密码",
- "hide_password": "隐藏密码",
- "remember_me": "记住我",
- "sign_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 云版本正在开发中。查看",
- "docs": "文档",
- "cloud_dev_self_hosted": "以获取有关自托管版本的更多信息。",
- "passwords_no_match": "密码不匹配",
- "password_mismatch": "密码不匹配",
- "passwords_no_match_desc": "您输入的密码不一致",
- "creating_account": "正在创建您的账户...",
- "creating_account_btn": "创建中...",
- "redirecting_login": "正在跳转到登录页面..."
- },
- "dashboard": {
- "title": "仪表盘",
- "search_spaces": "搜索空间",
- "documents": "文档",
- "connectors": "连接器",
- "settings": "设置",
- "researcher": "AI 研究",
- "api_keys": "API 密钥",
- "profile": "个人资料",
- "loading_dashboard": "正在加载仪表盘",
- "checking_auth": "正在检查身份验证...",
- "loading_config": "正在加载配置",
- "checking_llm_prefs": "正在检查您的 LLM 偏好设置...",
- "config_error": "配置错误",
- "failed_load_llm_config": "无法加载您的 LLM 配置",
- "error_loading_chats": "加载对话失败",
- "no_recent_chats": "暂无最近对话",
- "error_loading_space": "加载搜索空间失败",
- "unknown_search_space": "未知搜索空间",
- "delete_chat": "删除对话",
- "delete_chat_confirm": "您确定要删除",
- "action_cannot_undone": "此操作无法撤销。",
- "deleting": "删除中...",
- "surfsense_dashboard": "SurfSense 仪表盘",
- "welcome_message": "欢迎来到您的 SurfSense 仪表盘。",
- "your_search_spaces": "您的搜索空间",
- "create_search_space": "创建搜索空间",
- "add_new_search_space": "添加新的搜索空间",
- "loading": "加载中",
- "fetching_spaces": "正在获取您的搜索空间...",
- "may_take_moment": "这可能需要一些时间",
- "error": "错误",
- "something_wrong": "出现错误",
- "error_details": "错误详情",
- "try_again": "重试",
- "go_home": "返回首页",
- "delete_search_space": "删除搜索空间",
- "delete_space_confirm": "您确定要删除\"{name}\"吗?此操作无法撤销。此搜索空间中的所有文档、对话和播客将被永久删除。",
- "no_spaces_found": "未找到搜索空间",
- "create_first_space": "创建您的第一个搜索空间以开始使用",
- "created": "创建于"
- },
- "navigation": {
- "home": "首页",
- "docs": "文档",
- "pricing": "定价",
- "contact": "联系我们",
- "login": "登录",
- "register": "注册",
- "dashboard": "仪表盘",
- "sign_in": "登录",
- "book_a_call": "预约咨询"
- },
- "nav_menu": {
- "platform": "平台",
- "researcher": "AI 研究",
- "manage_llms": "管理 LLM",
- "documents": "文档",
- "upload_documents": "上传文档",
- "add_webpages": "添加网页",
- "add_youtube": "添加 YouTube 视频",
- "add_youtube_videos": "添加 YouTube 视频",
- "manage_documents": "管理文档",
- "connectors": "连接器",
- "add_connector": "添加连接器",
- "manage_connectors": "管理连接器",
- "podcasts": "播客",
- "logs": "日志",
- "all_search_spaces": "所有搜索空间"
- },
- "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": "zhangsan@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": "出错了"
- },
- "researcher": {
- "loading": "加载中...",
- "select_documents": "选择文档",
- "select_documents_desc": "选择要包含在研究上下文中的文档",
- "loading_documents": "正在加载文档...",
- "select_connectors": "选择连接器",
- "select_connectors_desc": "选择要包含在研究中的数据源",
- "clear_all": "全部清除",
- "select_all": "全部选择",
- "scope": "范围",
- "documents": "文档",
- "docs": "文档",
- "chunks": "块",
- "mode": "模式",
- "research_mode": "研究模式",
- "mode_qna": "问答",
- "mode_general": "通用报告",
- "mode_general_short": "通用",
- "mode_deep": "深度报告",
- "mode_deep_short": "深度",
- "mode_deeper": "更深度报告",
- "mode_deeper_short": "更深",
- "fast_llm": "快速 LLM",
- "select_llm": "选择 LLM",
- "fast_llm_selection": "快速 LLM 选择",
- "no_llm_configs": "未配置 LLM",
- "configure_llm_to_start": "配置 AI 模型以开始使用",
- "open_settings": "打开设置",
- "start_surfing": "开始探索",
- "through_knowledge_base": "您的知识库。",
- "all_connectors": "所有连接器",
- "connectors_selected": "{count} 个连接器",
- "placeholder": "问我任何问题..."
- },
- "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_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": "每页行数"
- },
- "add_connector": {
- "title": "连接您的工具",
- "subtitle": "集成您喜欢的服务以增强研究能力。",
- "search_engines": "搜索引擎",
- "team_chats": "团队聊天",
- "project_management": "项目管理",
- "knowledge_bases": "知识库",
- "communication": "通讯",
- "connect": "连接",
- "coming_soon": "即将推出",
- "connected": "已连接",
- "manage": "管理",
- "tavily_desc": "使用 Tavily API 搜索网络",
- "searxng_desc": "使用您自己的 SearxNG 元搜索实例获取网络结果。",
- "linkup_desc": "使用 Linkup API 搜索网络",
- "elasticsearch_desc": "连接到 Elasticsearch 以索引和搜索文档、日志和指标。",
- "baidu_desc": "使用百度 AI 搜索 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 以搜索页面、评论和文档。",
- "airtable_desc": "连接到 Airtable 以搜索记录、表格和数据库内容。",
- "luma_desc": "连接到 Luma 以搜索活动",
- "calendar_desc": "连接到 Google 日历以搜索活动、会议和日程。",
- "gmail_desc": "连接到您的 Gmail 账户以搜索您的电子邮件。",
- "zoom_desc": "连接到 Zoom 以访问会议录制和转录。"
- },
- "upload_documents": {
- "title": "上传文档",
- "subtitle": "上传您的文件,使其可通过 AI 对话进行搜索和访问。",
- "file_size_limit": "最大文件大小:每个文件 50MB。支持的格式因您的 ETL 服务配置而异。",
- "drop_files": "放下文件到这里",
- "drag_drop": "拖放文件到这里",
- "or_browse": "或点击浏览",
- "browse_files": "浏览文件",
- "selected_files": "已选择的文件 ({count})",
- "total_size": "总大小",
- "clear_all": "全部清除",
- "uploading_files": "正在上传文件...",
- "uploading": "上传中...",
- "upload_button": "上传 {count} 个文件",
- "upload_initiated": "上传任务已启动",
- "upload_initiated_desc": "文件上传已开始",
- "upload_error": "上传错误",
- "upload_error_desc": "上传文件时出错",
- "supported_file_types": "支持的文件类型",
- "file_types_desc": "根据您当前的 ETL 服务配置支持这些文件类型。"
- },
- "add_webpage": {
- "title": "添加网页爬取",
- "subtitle": "输入要爬取的 URL 并添加到您的文档集合",
- "label": "输入要爬取的 URL",
- "placeholder": "输入 URL 并按 Enter",
- "hint": "按 Enter 键添加多个 URL",
- "tips_title": "URL 爬取提示:",
- "tip_1": "输入完整的 URL,包括 http:// 或 https://",
- "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": "提交 YouTube 视频",
- "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": "{assigned} / {total} 个角色已分配"
- },
- "podcasts": {
- "title": "播客",
- "subtitle": "收听生成的播客。",
- "search_placeholder": "搜索播客...",
- "sort_order": "排序方式",
- "newest_first": "最新优先",
- "oldest_first": "最旧优先",
- "loading": "正在加载播客...",
- "error_loading": "加载播客时出错",
- "no_podcasts": "未找到播客",
- "adjust_filters": "尝试调整搜索条件",
- "generate_hint": "从您的聊天中生成播客以开始使用",
- "loading_podcast": "正在加载播客...",
- "now_playing": "正在播放",
- "delete_podcast": "删除播客",
- "delete_confirm_1": "您确定要删除",
- "delete_confirm_2": "此操作无法撤销。",
- "cancel": "取消",
- "delete": "删除",
- "deleting": "删除中..."
- },
- "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_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": "{assigned}/{total} 个角色已分配"
- },
- "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": "搜索空间",
- "researcher": "AI 研究",
- "documents": "文档",
- "connectors": "连接器",
- "podcasts": "播客",
- "logs": "日志",
- "chats": "聊天",
- "settings": "设置",
- "upload_documents": "上传文档",
- "add_youtube": "添加 YouTube 视频",
- "add_webpages": "添加网页",
- "add_connector": "添加连接器",
- "manage_connectors": "管理连接器",
- "edit_connector": "编辑连接器",
- "manage": "管理"
- },
- "sidebar": {
- "recent_chats": "最近对话",
- "search_chats": "搜索对话...",
- "no_chats_found": "未找到对话",
- "no_recent_chats": "暂无最近对话",
- "view_all_chats": "查看所有对话",
- "search_space": "搜索空间"
- },
- "errors": {
- "something_went_wrong": "出错了",
- "try_again": "请重试",
- "not_found": "未找到",
- "unauthorized": "未授权",
- "forbidden": "禁止访问",
- "server_error": "服务器错误",
- "network_error": "网络错误"
- },
- "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": "我们明天讨论这个!"
- }
- }
+ "common": {
+ "app_name": "SurfSense",
+ "welcome": "欢迎",
+ "loading": "加载中...",
+ "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": "重试"
+ },
+ "auth": {
+ "login": "登录",
+ "register": "注册",
+ "logout": "登出",
+ "email": "电子邮箱",
+ "password": "密码",
+ "confirm_password": "确认密码",
+ "forgot_password": "忘记密码?",
+ "show_password": "显示密码",
+ "hide_password": "隐藏密码",
+ "remember_me": "记住我",
+ "sign_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 云版本正在开发中。查看",
+ "docs": "文档",
+ "cloud_dev_self_hosted": "以获取有关自托管版本的更多信息。",
+ "passwords_no_match": "密码不匹配",
+ "password_mismatch": "密码不匹配",
+ "passwords_no_match_desc": "您输入的密码不一致",
+ "creating_account": "正在创建您的账户...",
+ "creating_account_btn": "创建中...",
+ "redirecting_login": "正在跳转到登录页面..."
+ },
+ "dashboard": {
+ "title": "仪表盘",
+ "search_spaces": "搜索空间",
+ "documents": "文档",
+ "connectors": "连接器",
+ "settings": "设置",
+ "researcher": "AI 研究",
+ "api_keys": "API 密钥",
+ "profile": "个人资料",
+ "loading_dashboard": "正在加载仪表盘",
+ "checking_auth": "正在检查身份验证...",
+ "loading_config": "正在加载配置",
+ "checking_llm_prefs": "正在检查您的 LLM 偏好设置...",
+ "config_error": "配置错误",
+ "failed_load_llm_config": "无法加载您的 LLM 配置",
+ "error_loading_chats": "加载对话失败",
+ "no_recent_chats": "暂无最近对话",
+ "error_loading_space": "加载搜索空间失败",
+ "unknown_search_space": "未知搜索空间",
+ "delete_chat": "删除对话",
+ "delete_chat_confirm": "您确定要删除",
+ "action_cannot_undone": "此操作无法撤销。",
+ "deleting": "删除中...",
+ "surfsense_dashboard": "SurfSense 仪表盘",
+ "welcome_message": "欢迎来到您的 SurfSense 仪表盘。",
+ "your_search_spaces": "您的搜索空间",
+ "create_search_space": "创建搜索空间",
+ "add_new_search_space": "添加新的搜索空间",
+ "loading": "加载中",
+ "fetching_spaces": "正在获取您的搜索空间...",
+ "may_take_moment": "这可能需要一些时间",
+ "error": "错误",
+ "something_wrong": "出现错误",
+ "error_details": "错误详情",
+ "try_again": "重试",
+ "go_home": "返回首页",
+ "delete_search_space": "删除搜索空间",
+ "delete_space_confirm": "您确定要删除\"{name}\"吗?此操作无法撤销。此搜索空间中的所有文档、对话和播客将被永久删除。",
+ "no_spaces_found": "未找到搜索空间",
+ "create_first_space": "创建您的第一个搜索空间以开始使用",
+ "created": "创建于"
+ },
+ "navigation": {
+ "home": "首页",
+ "docs": "文档",
+ "pricing": "定价",
+ "contact": "联系我们",
+ "login": "登录",
+ "register": "注册",
+ "dashboard": "仪表盘",
+ "sign_in": "登录",
+ "book_a_call": "预约咨询"
+ },
+ "nav_menu": {
+ "platform": "平台",
+ "researcher": "AI 研究",
+ "manage_llms": "管理 LLM",
+ "documents": "文档",
+ "upload_documents": "上传文档",
+ "add_webpages": "添加网页",
+ "add_youtube": "添加 YouTube 视频",
+ "add_youtube_videos": "添加 YouTube 视频",
+ "manage_documents": "管理文档",
+ "connectors": "连接器",
+ "add_connector": "添加连接器",
+ "manage_connectors": "管理连接器",
+ "podcasts": "播客",
+ "logs": "日志",
+ "all_search_spaces": "所有搜索空间"
+ },
+ "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": "zhangsan@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": "出错了"
+ },
+ "researcher": {
+ "loading": "加载中...",
+ "select_documents": "选择文档",
+ "select_documents_desc": "选择要包含在研究上下文中的文档",
+ "loading_documents": "正在加载文档...",
+ "select_connectors": "选择连接器",
+ "select_connectors_desc": "选择要包含在研究中的数据源",
+ "clear_all": "全部清除",
+ "select_all": "全部选择",
+ "scope": "范围",
+ "documents": "文档",
+ "docs": "文档",
+ "chunks": "块",
+ "mode": "模式",
+ "research_mode": "研究模式",
+ "mode_qna": "问答",
+ "mode_general": "通用报告",
+ "mode_general_short": "通用",
+ "mode_deep": "深度报告",
+ "mode_deep_short": "深度",
+ "mode_deeper": "更深度报告",
+ "mode_deeper_short": "更深",
+ "fast_llm": "快速 LLM",
+ "select_llm": "选择 LLM",
+ "fast_llm_selection": "快速 LLM 选择",
+ "no_llm_configs": "未配置 LLM",
+ "configure_llm_to_start": "配置 AI 模型以开始使用",
+ "open_settings": "打开设置",
+ "start_surfing": "开始探索",
+ "through_knowledge_base": "您的知识库。",
+ "all_connectors": "所有连接器",
+ "connectors_selected": "{count} 个连接器",
+ "placeholder": "问我任何问题..."
+ },
+ "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_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": "每页行数"
+ },
+ "add_connector": {
+ "title": "连接您的工具",
+ "subtitle": "集成您喜欢的服务以增强研究能力。",
+ "search_engines": "搜索引擎",
+ "team_chats": "团队聊天",
+ "project_management": "项目管理",
+ "knowledge_bases": "知识库",
+ "communication": "通讯",
+ "connect": "连接",
+ "coming_soon": "即将推出",
+ "connected": "已连接",
+ "manage": "管理",
+ "tavily_desc": "使用 Tavily API 搜索网络",
+ "searxng_desc": "使用您自己的 SearxNG 元搜索实例获取网络结果。",
+ "linkup_desc": "使用 Linkup API 搜索网络",
+ "elasticsearch_desc": "连接到 Elasticsearch 以索引和搜索文档、日志和指标。",
+ "baidu_desc": "使用百度 AI 搜索 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 以搜索页面、评论和文档。",
+ "airtable_desc": "连接到 Airtable 以搜索记录、表格和数据库内容。",
+ "luma_desc": "连接到 Luma 以搜索活动",
+ "calendar_desc": "连接到 Google 日历以搜索活动、会议和日程。",
+ "gmail_desc": "连接到您的 Gmail 账户以搜索您的电子邮件。",
+ "zoom_desc": "连接到 Zoom 以访问会议录制和转录。"
+ },
+ "upload_documents": {
+ "title": "上传文档",
+ "subtitle": "上传您的文件,使其可通过 AI 对话进行搜索和访问。",
+ "file_size_limit": "最大文件大小:每个文件 50MB。支持的格式因您的 ETL 服务配置而异。",
+ "drop_files": "放下文件到这里",
+ "drag_drop": "拖放文件到这里",
+ "or_browse": "或点击浏览",
+ "browse_files": "浏览文件",
+ "selected_files": "已选择的文件 ({count})",
+ "total_size": "总大小",
+ "clear_all": "全部清除",
+ "uploading_files": "正在上传文件...",
+ "uploading": "上传中...",
+ "upload_button": "上传 {count} 个文件",
+ "upload_initiated": "上传任务已启动",
+ "upload_initiated_desc": "文件上传已开始",
+ "upload_error": "上传错误",
+ "upload_error_desc": "上传文件时出错",
+ "supported_file_types": "支持的文件类型",
+ "file_types_desc": "根据您当前的 ETL 服务配置支持这些文件类型。"
+ },
+ "add_webpage": {
+ "title": "添加网页爬取",
+ "subtitle": "输入要爬取的 URL 并添加到您的文档集合",
+ "label": "输入要爬取的 URL",
+ "placeholder": "输入 URL 并按 Enter",
+ "hint": "按 Enter 键添加多个 URL",
+ "tips_title": "URL 爬取提示:",
+ "tip_1": "输入完整的 URL,包括 http:// 或 https://",
+ "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": "提交 YouTube 视频",
+ "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": "{assigned} / {total} 个角色已分配"
+ },
+ "podcasts": {
+ "title": "播客",
+ "subtitle": "收听生成的播客。",
+ "search_placeholder": "搜索播客...",
+ "sort_order": "排序方式",
+ "newest_first": "最新优先",
+ "oldest_first": "最旧优先",
+ "loading": "正在加载播客...",
+ "error_loading": "加载播客时出错",
+ "no_podcasts": "未找到播客",
+ "adjust_filters": "尝试调整搜索条件",
+ "generate_hint": "从您的聊天中生成播客以开始使用",
+ "loading_podcast": "正在加载播客...",
+ "now_playing": "正在播放",
+ "delete_podcast": "删除播客",
+ "delete_confirm_1": "您确定要删除",
+ "delete_confirm_2": "此操作无法撤销。",
+ "cancel": "取消",
+ "delete": "删除",
+ "deleting": "删除中..."
+ },
+ "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_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": "{assigned}/{total} 个角色已分配"
+ },
+ "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": "搜索空间",
+ "researcher": "AI 研究",
+ "documents": "文档",
+ "connectors": "连接器",
+ "podcasts": "播客",
+ "logs": "日志",
+ "chats": "聊天",
+ "settings": "设置",
+ "upload_documents": "上传文档",
+ "add_youtube": "添加 YouTube 视频",
+ "add_webpages": "添加网页",
+ "add_connector": "添加连接器",
+ "manage_connectors": "管理连接器",
+ "edit_connector": "编辑连接器",
+ "manage": "管理"
+ },
+ "sidebar": {
+ "recent_chats": "最近对话",
+ "search_chats": "搜索对话...",
+ "no_chats_found": "未找到对话",
+ "no_recent_chats": "暂无最近对话",
+ "view_all_chats": "查看所有对话",
+ "search_space": "搜索空间"
+ },
+ "errors": {
+ "something_went_wrong": "出错了",
+ "try_again": "请重试",
+ "not_found": "未找到",
+ "unauthorized": "未授权",
+ "forbidden": "禁止访问",
+ "server_error": "服务器错误",
+ "network_error": "网络错误"
+ },
+ "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": "我们明天讨论这个!"
+ }
+ }
}
-
diff --git a/surfsense_web/middleware.ts b/surfsense_web/middleware.ts
index e36e68d6..c7eb6f91 100644
--- a/surfsense_web/middleware.ts
+++ b/surfsense_web/middleware.ts
@@ -2,11 +2,10 @@
// Server-side i18n routing would require restructuring entire app directory to app/[locale]/...
// which is too invasive for this project
-import { NextResponse } from 'next/server';
-import type { NextRequest } from 'next/server';
+import type { NextRequest } from "next/server";
+import { NextResponse } from "next/server";
// Empty middleware - just pass through all requests
export function middleware(request: NextRequest) {
- return NextResponse.next();
+ return NextResponse.next();
}
-
diff --git a/surfsense_web/next.config.ts b/surfsense_web/next.config.ts
index 7883b8b0..aca3e2d3 100644
--- a/surfsense_web/next.config.ts
+++ b/surfsense_web/next.config.ts
@@ -1,9 +1,9 @@
import { createMDX } from "fumadocs-mdx/next";
import type { NextConfig } from "next";
-import createNextIntlPlugin from 'next-intl/plugin';
+import createNextIntlPlugin from "next-intl/plugin";
// Create the next-intl plugin
-const withNextIntl = createNextIntlPlugin('./i18n/request.ts');
+const withNextIntl = createNextIntlPlugin("./i18n/request.ts");
const nextConfig: NextConfig = {
output: "standalone",