From f536b13d13f9c8047d5394674895baabf87f428d Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 18 Nov 2025 21:30:19 +0000 Subject: [PATCH] Replace Chinese with Latvian translations and address PR review feedback Translations: - Add complete Latvian translations (lv.json) - Remove Chinese translations (zh.json) - Update i18n routing to support en/lv locales - Update LanguageSwitcher component for Latvian - Update LocaleContext to use Latvian messages PR Review Improvements: - Create shared handleSessionExpired() utility in auth-utils.ts - Refactor use-user.ts, use-chats.ts, use-search-space.ts to use shared utility - Add session_expired error message to auth-errors.ts - Consistent redirect to /login?error=session_expired --- surfsense_web/components/LanguageSwitcher.tsx | 4 +- surfsense_web/contexts/LocaleContext.tsx | 10 +- surfsense_web/hooks/use-chats.ts | 11 +- surfsense_web/hooks/use-search-space.ts | 6 +- surfsense_web/hooks/use-user.ts | 6 +- surfsense_web/i18n/routing.ts | 2 +- surfsense_web/lib/auth-errors.ts | 6 + surfsense_web/lib/auth-utils.ts | 43 ++ surfsense_web/messages/lv.json | 698 ++++++++++++++++++ surfsense_web/messages/zh.json | 698 ------------------ 10 files changed, 762 insertions(+), 722 deletions(-) create mode 100644 surfsense_web/lib/auth-utils.ts create mode 100644 surfsense_web/messages/lv.json delete mode 100644 surfsense_web/messages/zh.json diff --git a/surfsense_web/components/LanguageSwitcher.tsx b/surfsense_web/components/LanguageSwitcher.tsx index d5717bc10..0e307053a 100644 --- a/surfsense_web/components/LanguageSwitcher.tsx +++ b/surfsense_web/components/LanguageSwitcher.tsx @@ -21,7 +21,7 @@ export function LanguageSwitcher() { // Supported languages configuration const languages = [ { code: "en" as const, name: "English", flag: "🇺🇸" }, - { code: "zh" as const, name: "简体中文", flag: "🇨🇳" }, + { code: "lv" as const, name: "Latviešu", flag: "🇱🇻" }, ]; /** @@ -29,7 +29,7 @@ export function LanguageSwitcher() { * Updates locale in context and localStorage */ const handleLanguageChange = (newLocale: string) => { - setLocale(newLocale as "en" | "zh"); + setLocale(newLocale as "en" | "lv"); }; return ( diff --git a/surfsense_web/contexts/LocaleContext.tsx b/surfsense_web/contexts/LocaleContext.tsx index 30d2b2e80..aab0a06cd 100644 --- a/surfsense_web/contexts/LocaleContext.tsx +++ b/surfsense_web/contexts/LocaleContext.tsx @@ -3,9 +3,9 @@ import type React from "react"; import { createContext, useContext, useEffect, useState } from "react"; import enMessages from "../messages/en.json"; -import zhMessages from "../messages/zh.json"; +import lvMessages from "../messages/lv.json"; -type Locale = "en" | "zh"; +type Locale = "en" | "lv"; interface LocaleContextType { locale: Locale; @@ -24,15 +24,15 @@ export function LocaleProvider({ children }: { children: React.ReactNode }) { const [mounted, setMounted] = useState(false); // Get messages based on current locale - const messages = locale === "zh" ? zhMessages : enMessages; + const messages = locale === "lv" ? lvMessages : enMessages; // Load locale from localStorage after component mounts (client-side only) useEffect(() => { setMounted(true); if (typeof window !== "undefined") { const stored = localStorage.getItem(LOCALE_STORAGE_KEY); - if (stored === "zh") { - setLocaleState("zh"); + if (stored === "lv") { + setLocaleState("lv"); } } }, []); diff --git a/surfsense_web/hooks/use-chats.ts b/surfsense_web/hooks/use-chats.ts index e6233e55b..efb2dd2e1 100644 --- a/surfsense_web/hooks/use-chats.ts +++ b/surfsense_web/hooks/use-chats.ts @@ -2,6 +2,7 @@ import { useCallback, useEffect, useState } from "react"; import { toast } from "sonner"; +import { handleSessionExpired } from "@/lib/auth-utils"; interface Chat { created_at: string; @@ -46,10 +47,7 @@ export function useChats({ ); if (response.status === 401) { - // Clear token and redirect to home - localStorage.removeItem("surfsense_bearer_token"); - window.location.href = "/"; - throw new Error("Unauthorized: Redirecting to login page"); + handleSessionExpired(); } if (!response.ok) { @@ -90,10 +88,7 @@ export function useChats({ ); if (response.status === 401) { - // Clear token and redirect to home - localStorage.removeItem("surfsense_bearer_token"); - window.location.href = "/"; - throw new Error("Unauthorized: Redirecting to login page"); + handleSessionExpired(); } if (!response.ok) { diff --git a/surfsense_web/hooks/use-search-space.ts b/surfsense_web/hooks/use-search-space.ts index 2c512b954..45fb7bb62 100644 --- a/surfsense_web/hooks/use-search-space.ts +++ b/surfsense_web/hooks/use-search-space.ts @@ -2,6 +2,7 @@ import { useCallback, useEffect, useState } from "react"; import { toast } from "sonner"; +import { handleSessionExpired } from "@/lib/auth-utils"; interface SearchSpace { created_at: string; @@ -38,10 +39,7 @@ export function useSearchSpace({ searchSpaceId, autoFetch = true }: UseSearchSpa ); if (response.status === 401) { - // Clear token and redirect to home - localStorage.removeItem("surfsense_bearer_token"); - window.location.href = "/"; - throw new Error("Unauthorized: Redirecting to login page"); + handleSessionExpired(); } if (!response.ok) { diff --git a/surfsense_web/hooks/use-user.ts b/surfsense_web/hooks/use-user.ts index 23a23237b..578a90e08 100644 --- a/surfsense_web/hooks/use-user.ts +++ b/surfsense_web/hooks/use-user.ts @@ -2,6 +2,7 @@ import { useEffect, useState } from "react"; import { toast } from "sonner"; +import { handleSessionExpired } from "@/lib/auth-utils"; interface User { id: string; @@ -33,10 +34,7 @@ export function useUser() { }); if (response.status === 401) { - // Clear token and redirect to home - localStorage.removeItem("surfsense_bearer_token"); - window.location.href = "/"; - throw new Error("Unauthorized: Redirecting to login page"); + handleSessionExpired(); } if (!response.ok) { diff --git a/surfsense_web/i18n/routing.ts b/surfsense_web/i18n/routing.ts index 5017b4be1..866e14c8e 100644 --- a/surfsense_web/i18n/routing.ts +++ b/surfsense_web/i18n/routing.ts @@ -7,7 +7,7 @@ import { defineRouting } from "next-intl/routing"; */ export const routing = defineRouting({ // A list of all locales that are supported - locales: ["en", "zh"], + locales: ["en", "lv"], // Used when no locale matches defaultLocale: "en", diff --git a/surfsense_web/lib/auth-errors.ts b/surfsense_web/lib/auth-errors.ts index ce50c9c99..0becb4932 100644 --- a/surfsense_web/lib/auth-errors.ts +++ b/surfsense_web/lib/auth-errors.ts @@ -92,6 +92,12 @@ const AUTH_ERROR_MESSAGES: AuthErrorMapping = { description: "Login is temporarily unavailable. Please try again later", }, + // Session errors + session_expired: { + title: "Session expired", + description: "Your session has expired. Please sign in again", + }, + // Network errors NETWORK_ERROR: { title: "Connection failed", diff --git a/surfsense_web/lib/auth-utils.ts b/surfsense_web/lib/auth-utils.ts new file mode 100644 index 000000000..3ebb5c332 --- /dev/null +++ b/surfsense_web/lib/auth-utils.ts @@ -0,0 +1,43 @@ +/** + * Authentication utility functions for session management + */ + +import { baseApiService } from "./apis/base-api.service"; + +/** + * Handle session expiration by clearing tokens and redirecting to login + * This centralizes the 401 handling logic to avoid code duplication + */ +export function handleSessionExpired(): never { + // Clear token from localStorage + localStorage.removeItem("surfsense_bearer_token"); + + // Clear token from baseApiService singleton to prevent stale auth state + baseApiService.setBearerToken(""); + + // Redirect to login with error parameter for user feedback + window.location.href = "/login?error=session_expired"; + + // Throw to stop further execution (this line won't actually run due to redirect) + throw new Error("Session expired: Redirecting to login page"); +} + +/** + * Check if a response indicates an authentication error + * @param response - The fetch Response object + * @returns True if the response status is 401 + */ +export function isUnauthorizedResponse(response: Response): boolean { + return response.status === 401; +} + +/** + * Handle API response with automatic session expiration handling + * @param response - The fetch Response object + * @throws Error if response is 401 (after handling session expiration) + */ +export function handleAuthResponse(response: Response): void { + if (isUnauthorizedResponse(response)) { + handleSessionExpired(); + } +} diff --git a/surfsense_web/messages/lv.json b/surfsense_web/messages/lv.json new file mode 100644 index 000000000..c498275ba --- /dev/null +++ b/surfsense_web/messages/lv.json @@ -0,0 +1,698 @@ +{ + "common": { + "app_name": "SurfSense", + "welcome": "Laipni lūdzam", + "loading": "Ielādē...", + "save": "Saglabāt", + "cancel": "Atcelt", + "delete": "Dzēst", + "edit": "Rediģēt", + "create": "Izveidot", + "update": "Atjaunināt", + "search": "Meklēt", + "close": "Aizvērt", + "confirm": "Apstiprināt", + "back": "Atpakaļ", + "next": "Tālāk", + "submit": "Iesniegt", + "yes": "Jā", + "no": "Nē", + "add": "Pievienot", + "remove": "Noņemt", + "select": "Izvēlēties", + "all": "Visi", + "none": "Neviens", + "error": "Kļūda", + "success": "Veiksmīgi", + "warning": "Brīdinājums", + "info": "Informācija", + "required": "Obligāts", + "optional": "Neobligāts", + "retry": "Mēģināt vēlreiz" + }, + "auth": { + "login": "Pieteikties", + "register": "Reģistrēties", + "logout": "Iziet", + "email": "E-pasts", + "password": "Parole", + "confirm_password": "Apstiprināt paroli", + "forgot_password": "Aizmirsāt paroli?", + "show_password": "Rādīt paroli", + "hide_password": "Slēpt paroli", + "remember_me": "Atcerēties mani", + "sign_in": "Ieiet", + "sign_up": "Reģistrēties", + "sign_in_with": "Ieiet ar {provider}", + "dont_have_account": "Nav konta?", + "already_have_account": "Jau ir konts?", + "reset_password": "Atjaunot paroli", + "email_required": "E-pasts ir obligāts", + "password_required": "Parole ir obligāta", + "invalid_email": "Nederīga e-pasta adrese", + "password_too_short": "Parolei jābūt vismaz 8 rakstzīmēm", + "welcome_back": "Laipni lūdzam atpakaļ", + "create_account": "Izveidojiet savu kontu", + "login_subtitle": "Ievadiet savus akreditācijas datus, lai piekļūtu kontam", + "register_subtitle": "Reģistrējieties, lai sāktu lietot SurfSense", + "or_continue_with": "Vai turpiniet ar", + "by_continuing": "Turpinot jūs piekrītat mūsu", + "terms_of_service": "Lietošanas noteikumiem", + "and": "un", + "privacy_policy": "Privātuma politikai", + "full_name": "Pilns vārds", + "username": "Lietotājvārds", + "continue": "Turpināt", + "back_to_login": "Atpakaļ uz pieteikšanos", + "login_success": "Veiksmīgi pieteicies", + "register_success": "Konts veiksmīgi izveidots", + "continue_with_google": "Turpināt ar Google", + "cloud_dev_notice": "SurfSense Cloud pašlaik tiek izstrādāts. Skatiet", + "docs": "Dokumentāciju", + "cloud_dev_self_hosted": "lai uzzinātu vairāk par pašmitināto versiju.", + "passwords_no_match": "Paroles nesakrīt", + "password_mismatch": "Paroļu neatbilstība", + "passwords_no_match_desc": "Ievadītās paroles nesakrīt", + "creating_account": "Izveido jūsu kontu...", + "creating_account_btn": "Izveido kontu...", + "redirecting_login": "Pāradresē uz pieteikšanās lapu..." + }, + "dashboard": { + "title": "Panelis", + "search_spaces": "Meklēšanas telpas", + "documents": "Dokumenti", + "connectors": "Savienotāji", + "settings": "Iestatījumi", + "researcher": "Pētnieks", + "api_keys": "API atslēgas", + "profile": "Profils", + "loading_dashboard": "Ielādē paneli", + "checking_auth": "Pārbauda autentifikāciju...", + "loading_config": "Ielādē konfigurāciju", + "checking_llm_prefs": "Pārbauda jūsu LLM preferences...", + "config_error": "Konfigurācijas kļūda", + "failed_load_llm_config": "Neizdevās ielādēt jūsu LLM konfigurāciju", + "error_loading_chats": "Kļūda ielādējot sarunas", + "no_recent_chats": "Nav neseno sarunu", + "error_loading_space": "Kļūda ielādējot meklēšanas telpu", + "unknown_search_space": "Nezināma meklēšanas telpa", + "delete_chat": "Dzēst sarunu", + "delete_chat_confirm": "Vai tiešām vēlaties dzēst", + "action_cannot_undone": "Šo darbību nevar atsaukt.", + "deleting": "Dzēš...", + "surfsense_dashboard": "SurfSense panelis", + "welcome_message": "Laipni lūdzam jūsu SurfSense panelī.", + "your_search_spaces": "Jūsu meklēšanas telpas", + "create_search_space": "Izveidot meklēšanas telpu", + "add_new_search_space": "Pievienot jaunu meklēšanas telpu", + "loading": "Ielādē", + "fetching_spaces": "Iegūst jūsu meklēšanas telpas...", + "may_take_moment": "Tas var aizņemt brīdi", + "error": "Kļūda", + "something_wrong": "Kaut kas nogāja greizi", + "error_details": "Kļūdas detaļas", + "try_again": "Mēģināt vēlreiz", + "go_home": "Uz sākumu", + "delete_search_space": "Dzēst meklēšanas telpu", + "delete_space_confirm": "Vai tiešām vēlaties dzēst \"{name}\"? Šo darbību nevar atsaukt. Visi dokumenti, sarunas un podkāsti šajā meklēšanas telpā tiks neatgriezeniski dzēsti.", + "no_spaces_found": "Meklēšanas telpas nav atrastas", + "create_first_space": "Izveidojiet savu pirmo meklēšanas telpu, lai sāktu", + "created": "Izveidots" + }, + "navigation": { + "home": "Sākums", + "docs": "Dokumentācija", + "pricing": "Cenas", + "contact": "Kontakti", + "login": "Pieteikties", + "register": "Reģistrēties", + "dashboard": "Panelis", + "sign_in": "Ieiet", + "book_a_call": "Rezervēt zvanu" + }, + "nav_menu": { + "platform": "Platforma", + "researcher": "Pētnieks", + "manage_llms": "Pārvaldīt LLM", + "sources": "Avoti", + "add_sources": "Pievienot avotus", + "documents": "Dokumenti", + "upload_documents": "Augšupielādēt dokumentus", + "add_webpages": "Pievienot tīmekļa lapas", + "add_youtube": "Pievienot Youtube video", + "add_youtube_videos": "Pievienot Youtube video", + "manage_documents": "Pārvaldīt dokumentus", + "connectors": "Savienotāji", + "add_connector": "Pievienot savienotāju", + "manage_connectors": "Pārvaldīt savienotājus", + "podcasts": "Podkāsti", + "logs": "Žurnāli", + "all_search_spaces": "Visas meklēšanas telpas", + "chat": "Saruna" + }, + "pricing": { + "title": "SurfSense cenas", + "subtitle": "Izvēlieties sev piemērotāko", + "community_name": "KOPIENA", + "enterprise_name": "UZŅĒMUMS", + "forever": "uz visiem laikiem", + "contact_us": "Sazinieties ar mums", + "feature_llms": "Atbalsta 100+ LLM", + "feature_ollama": "Atbalsta vietējos Ollama vai vLLM iestatījumus", + "feature_embeddings": "6000+ iegulšanas modeļi", + "feature_files": "50+ failu paplašinājumi atbalstīti.", + "feature_podcasts": "Podkāstu atbalsts ar vietējiem TTS pakalpojumiem.", + "feature_sources": "Savienojas ar 15+ ārējiem avotiem.", + "feature_extension": "Starpplatformu pārlūka paplašinājums dinamiskiem tīmekļa lapām, ieskaitot autentificētu saturu", + "upcoming_mindmaps": "Drīzumā: Apvienojamas domu kartes", + "upcoming_notes": "Drīzumā: Piezīmju pārvaldība", + "community_desc": "Atvērtā koda versija ar jaudīgām funkcijām", + "get_started": "Sākt", + "everything_community": "Viss no Kopienas", + "priority_support": "Prioritārs atbalsts", + "access_controls": "Piekļuves kontrole", + "collaboration": "Sadarbības un daudzspēlētāju funkcijas", + "video_gen": "Video ģenerēšana", + "advanced_security": "Uzlabotas drošības funkcijas", + "enterprise_desc": "Lielām organizācijām ar specifiskām vajadzībām", + "contact_sales": "Sazināties ar pārdošanu" + }, + "contact": { + "title": "Kontakti", + "subtitle": "Mēs labprāt uzklausītu jūs.", + "we_are_here": "Mēs esam šeit", + "full_name": "Pilns vārds", + "email_address": "E-pasta adrese", + "company": "Uzņēmums", + "message": "Ziņojums", + "optional": "neobligāts", + "name_placeholder": "Jānis Bērziņš", + "email_placeholder": "janis.berzins@piemers.lv", + "company_placeholder": "Piemērs SIA", + "message_placeholder": "Ierakstiet savu ziņojumu šeit", + "submit": "Iesniegt", + "submitting": "Iesniedz...", + "name_required": "Vārds ir obligāts", + "name_too_long": "Vārds ir pārāk garš", + "invalid_email": "Nederīga e-pasta adrese", + "email_too_long": "E-pasts ir pārāk garš", + "company_required": "Uzņēmums ir obligāts", + "company_too_long": "Uzņēmuma nosaukums ir pārāk garš", + "message_sent": "Ziņojums veiksmīgi nosūtīts!", + "we_will_contact": "Mēs sazināsimies ar jums pēc iespējas ātrāk.", + "send_failed": "Neizdevās nosūtīt ziņojumu", + "try_again_later": "Lūdzu, mēģiniet vēlāk.", + "something_wrong": "Kaut kas nogāja greizi" + }, + "researcher": { + "loading": "Ielādē...", + "select_documents": "Izvēlēties dokumentus", + "select_documents_desc": "Izvēlieties dokumentus, ko iekļaut pētniecības kontekstā", + "loading_documents": "Ielādē dokumentus...", + "select_connectors": "Izvēlēties savienotājus", + "select_connectors_desc": "Izvēlieties, kurus datu avotus iekļaut pētniecībā", + "clear_all": "Notīrīt visu", + "select_all": "Izvēlēties visu", + "scope": "Tvērums", + "documents": "Dokumenti", + "docs": "Dok.", + "chunks": "Fragmenti", + "mode": "Režīms", + "research_mode": "Pētniecības režīms", + "mode_qna": "J&A", + "mode_general": "Vispārīgs pārskats", + "mode_general_short": "Vispārīgs", + "mode_deep": "Padziļināts pārskats", + "mode_deep_short": "Padziļināts", + "mode_deeper": "Dziļāks pārskats", + "mode_deeper_short": "Dziļāks", + "fast_llm": "Ātrais LLM", + "select_llm": "Izvēlēties LLM", + "fast_llm_selection": "Ātrā LLM izvēle", + "no_llm_configs": "Nav LLM konfigurāciju", + "configure_llm_to_start": "Konfigurējiet AI modeļus, lai sāktu", + "open_settings": "Atvērt iestatījumus", + "start_surfing": "Sāksim sērfot", + "through_knowledge_base": "caur jūsu zināšanu bāzi.", + "all_connectors": "Visi savienotāji", + "connectors_selected": "{count} savienotāji", + "placeholder": "Jautājiet man jebko..." + }, + "connectors": { + "title": "Savienotāji", + "subtitle": "Pārvaldiet savienotos pakalpojumus un datu avotus.", + "add_connector": "Pievienot savienotāju", + "your_connectors": "Jūsu savienotāji", + "view_manage": "Skatiet un pārvaldiet visus savienotos pakalpojumus.", + "no_connectors": "Savienotāji nav atrasti", + "no_connectors_desc": "Jūs vēl neesat pievienojis nevienu savienotāju. Pievienojiet to, lai uzlabotu meklēšanas iespējas.", + "add_first": "Pievienojiet savu pirmo savienotāju", + "name": "Nosaukums", + "type": "Veids", + "last_indexed": "Pēdējoreiz indeksēts", + "periodic": "Periodisks", + "actions": "Darbības", + "never": "Nekad", + "not_indexable": "Nav indeksējams", + "index_date_range": "Indeksēt ar datumu diapazonu", + "quick_index": "Ātrā indeksēšana", + "quick_index_auto": "Ātrā indeksēšana (automātisks datumu diapazons)", + "delete_connector": "Dzēst savienotāju", + "delete_confirm": "Vai tiešām vēlaties dzēst šo savienotāju? Šo darbību nevar atsaukt.", + "select_date_range": "Izvēlieties datumu diapazonu indeksēšanai", + "select_date_range_desc": "Izvēlieties sākuma un beigu datumus satura indeksēšanai. Atstājiet tukšu, lai izmantotu noklusējuma diapazonu.", + "start_date": "Sākuma datums", + "end_date": "Beigu datums", + "pick_date": "Izvēlieties datumu", + "clear_dates": "Notīrīt datumus", + "last_30_days": "Pēdējās 30 dienas", + "last_year": "Pēdējais gads", + "start_indexing": "Sākt indeksēšanu", + "failed_load": "Neizdevās ielādēt savienotājus", + "delete_success": "Savienotājs veiksmīgi dzēsts", + "delete_failed": "Neizdevās dzēst savienotāju", + "indexing_started": "Savienotāja satura indeksēšana sākta", + "indexing_failed": "Neizdevās indeksēt savienotāja saturu" + }, + "documents": { + "title": "Dokumenti", + "subtitle": "Pārvaldiet savus dokumentus un failus.", + "no_rows_selected": "Neviena rinda nav izvēlēta", + "delete_success_count": "Veiksmīgi dzēsti {count} dokument(i)", + "delete_partial_failed": "Dažus dokumentus nevarēja dzēst", + "delete_error": "Kļūda dzēšot dokumentus", + "filter_by_title": "Filtrēt pēc nosaukuma...", + "bulk_delete": "Dzēst izvēlētos", + "filter_types": "Filtrēt veidus", + "columns": "Kolonnas", + "confirm_delete": "Apstiprināt dzēšanu", + "confirm_delete_desc": "Vai tiešām vēlaties dzēst {count} dokument(us)? Šo darbību nevar atsaukt.", + "uploading": "Augšupielādē...", + "upload_success": "Dokuments veiksmīgi augšupielādēts", + "upload_failed": "Neizdevās augšupielādēt dokumentu", + "loading": "Ielādē dokumentus...", + "error_loading": "Kļūda ielādējot dokumentus", + "retry": "Mēģināt vēlreiz", + "no_documents": "Dokumenti nav atrasti", + "type": "Veids", + "content_summary": "Satura kopsavilkums", + "view_full": "Skatīt pilnu saturu", + "filter_placeholder": "Filtrēt pēc nosaukuma...", + "rows_per_page": "Rindas lapā" + }, + "add_connector": { + "title": "Savienojiet savus rīkus", + "subtitle": "Integrējiet ar saviem iecienītākajiem pakalpojumiem, lai uzlabotu pētniecības iespējas.", + "search_engines": "Meklētājprogrammas", + "team_chats": "Komandas sarunas", + "project_management": "Projektu pārvaldība", + "knowledge_bases": "Zināšanu bāzes", + "communication": "Komunikācija", + "connect": "Savienot", + "coming_soon": "Drīzumā", + "connected": "Savienots", + "manage": "Pārvaldīt", + "tavily_desc": "Meklēt tīmeklī, izmantojot Tavily API", + "searxng_desc": "Izmantojiet savu SearxNG meta-meklēšanas instanci tīmekļa rezultātiem.", + "linkup_desc": "Meklēt tīmeklī, izmantojot Linkup API", + "elasticsearch_desc": "Savienoties ar Elasticsearch, lai indeksētu un meklētu dokumentus, žurnālus un metriku.", + "baidu_desc": "Meklēt ķīniešu tīmeklī, izmantojot Baidu AI Search API", + "slack_desc": "Savienoties ar savu Slack darba telpu, lai piekļūtu ziņojumiem un kanāliem.", + "teams_desc": "Savienoties ar Microsoft Teams, lai piekļūtu komandas sarunām.", + "discord_desc": "Savienoties ar Discord serveriem, lai piekļūtu ziņojumiem un kanāliem.", + "linear_desc": "Savienoties ar Linear, lai meklētu problēmas, komentārus un projekta datus.", + "jira_desc": "Savienoties ar Jira, lai meklētu problēmas, biļetes un projekta datus.", + "clickup_desc": "Savienoties ar ClickUp, lai meklētu uzdevumus, komentārus un projekta datus.", + "notion_desc": "Savienoties ar savu Notion darba telpu, lai piekļūtu lapām un datubāzēm.", + "github_desc": "Savienojiet GitHub PAT, lai indeksētu kodu un dokumentāciju no pieejamiem repozitorijiem.", + "confluence_desc": "Savienoties ar Confluence, lai meklētu lapas, komentārus un dokumentāciju.", + "airtable_desc": "Savienoties ar Airtable, lai meklētu ierakstus, tabulas un datubāzes saturu.", + "luma_desc": "Savienoties ar Luma, lai meklētu notikumus", + "calendar_desc": "Savienoties ar Google Calendar, lai meklētu notikumus, sapulces un grafikus.", + "gmail_desc": "Savienoties ar savu Gmail kontu, lai meklētu e-pastus.", + "zoom_desc": "Savienoties ar Zoom, lai piekļūtu sapulču ierakstiem un stenogrammām." + }, + "upload_documents": { + "title": "Augšupielādēt dokumentus", + "subtitle": "Augšupielādējiet savus failus, lai padarītu tos meklējamus un pieejamus caur AI sarunām.", + "file_size_limit": "Maksimālais faila izmērs: 50MB failam. Atbalstītie formāti atšķiras atkarībā no jūsu ETL pakalpojuma konfigurācijas.", + "drop_files": "Nometiet failus šeit", + "drag_drop": "Velciet un nometiet failus šeit", + "or_browse": "vai noklikšķiniet, lai pārlūkotu", + "browse_files": "Pārlūkot failus", + "selected_files": "Izvēlētie faili ({count})", + "total_size": "Kopējais izmērs", + "clear_all": "Notīrīt visu", + "uploading_files": "Augšupielādē failus...", + "uploading": "Augšupielādē...", + "upload_button": "Augšupielādēt {count} {count, plural, one {failu} other {failus}}", + "upload_initiated": "Augšupielādes uzdevums sākts", + "upload_initiated_desc": "Failu augšupielāde sākta", + "upload_error": "Augšupielādes kļūda", + "upload_error_desc": "Kļūda augšupielādējot failus", + "supported_file_types": "Atbalstītie failu veidi", + "file_types_desc": "Šie failu veidi tiek atbalstīti, pamatojoties uz jūsu pašreizējo ETL pakalpojuma konfigurāciju." + }, + "add_webpage": { + "title": "Pievienot tīmekļa lapas pārmeklēšanai", + "subtitle": "Ievadiet URL, ko pārmeklēt un pievienot dokumentu kolekcijai", + "label": "Ievadiet URL pārmeklēšanai", + "placeholder": "Ievadiet URL un nospiediet Enter", + "hint": "Pievienojiet vairākus URL, nospiežot Enter pēc katra", + "tips_title": "Padomi URL pārmeklēšanai:", + "tip_1": "Ievadiet pilnus URL, ieskaitot http:// vai https://", + "tip_2": "Pārliecinieties, ka vietnes atļauj pārmeklēšanu", + "tip_3": "Publiskas tīmekļa lapas darbojas vislabāk", + "tip_4": "Pārmeklēšana var aizņemt laiku atkarībā no vietnes lieluma", + "cancel": "Atcelt", + "submit": "Iesniegt URL pārmeklēšanai", + "submitting": "Iesniedz...", + "error_no_url": "Lūdzu, pievienojiet vismaz vienu URL", + "error_invalid_urls": "Konstatēti nederīgi URL: {urls}", + "crawling_toast": "URL pārmeklēšana", + "crawling_toast_desc": "Sāk URL pārmeklēšanas procesu...", + "success_toast": "Pārmeklēšana veiksmīga", + "success_toast_desc": "URL ir iesniegti pārmeklēšanai", + "error_toast": "Pārmeklēšanas kļūda", + "error_toast_desc": "Kļūda pārmeklējot URL", + "error_generic": "Radās kļūda pārmeklējot URL", + "invalid_url_toast": "Nederīgs URL", + "invalid_url_toast_desc": "Lūdzu, ievadiet derīgu URL", + "duplicate_url_toast": "Dublikāts URL", + "duplicate_url_toast_desc": "Šis URL jau ir pievienots" + }, + "add_youtube": { + "title": "Pievienot YouTube video", + "subtitle": "Ievadiet YouTube video URL, lai pievienotu dokumentu kolekcijai", + "label": "Ievadiet YouTube video URL", + "placeholder": "Ievadiet YouTube URL un nospiediet Enter", + "hint": "Pievienojiet vairākus YouTube URL, nospiežot Enter pēc katra", + "tips_title": "Padomi YouTube video pievienošanai:", + "tip_1": "Izmantojiet standarta YouTube URL (youtube.com/watch?v= vai youtu.be/)", + "tip_2": "Pārliecinieties, ka video ir publiski pieejami", + "tip_3": "Atbalstītie formāti: youtube.com/watch?v=VIDEO_ID vai youtu.be/VIDEO_ID", + "tip_4": "Apstrāde var aizņemt laiku atkarībā no video garuma", + "preview": "Priekšskatījums", + "cancel": "Atcelt", + "submit": "Iesniegt YouTube video", + "processing": "Apstrādā...", + "error_no_video": "Lūdzu, pievienojiet vismaz vienu YouTube video URL", + "error_invalid_urls": "Konstatēti nederīgi YouTube URL: {urls}", + "processing_toast": "YouTube video apstrāde", + "processing_toast_desc": "Sāk YouTube video apstrādi...", + "success_toast": "Apstrāde veiksmīga", + "success_toast_desc": "YouTube video ir iesniegti apstrādei", + "error_toast": "Apstrādes kļūda", + "error_toast_desc": "Kļūda apstrādājot YouTube video", + "error_generic": "Radās kļūda apstrādājot YouTube video", + "invalid_url_toast": "Nederīgs YouTube URL", + "invalid_url_toast_desc": "Lūdzu, ievadiet derīgu YouTube video URL", + "duplicate_url_toast": "Dublikāts URL", + "duplicate_url_toast_desc": "Šis YouTube video jau ir pievienots" + }, + "settings": { + "title": "Iestatījumi", + "subtitle": "Pārvaldiet savas LLM konfigurācijas un lomu piešķires šai meklēšanas telpai.", + "back_to_dashboard": "Atpakaļ uz paneli", + "model_configs": "Modeļu konfigurācijas", + "models": "Modeļi", + "llm_roles": "LLM lomas", + "roles": "Lomas", + "llm_role_management": "LLM lomu pārvaldība", + "llm_role_desc": "Piešķiriet savas LLM konfigurācijas konkrētām lomām dažādiem mērķiem.", + "no_llm_configs_found": "LLM konfigurācijas nav atrastas. Lūdzu, pievienojiet vismaz vienu LLM pakalpojumu sniedzēju cilnē Modeļu konfigurācijas pirms lomu piešķiršanas.", + "select_llm_config": "Izvēlieties LLM konfigurāciju", + "long_context_llm": "Garā konteksta LLM", + "fast_llm": "Ātrais LLM", + "strategic_llm": "Stratēģiskais LLM", + "long_context_desc": "Apstrādā sarežģītus uzdevumus, kam nepieciešama plaša konteksta izpratne un spriešana", + "long_context_examples": "Dokumentu analīze, pētniecības sintēze, sarežģīti jautājumi un atbildes", + "large_context_window": "Liels konteksta logs", + "deep_reasoning": "Dziļa spriešana", + "complex_analysis": "Sarežģīta analīze", + "fast_llm_desc": "Optimizēts ātrām atbildēm un reāllaika mijiedarbībai", + "fast_llm_examples": "Ātra meklēšana, vienkārši jautājumi, tūlītējas atbildes", + "low_latency": "Zema latentums", + "quick_responses": "Ātras atbildes", + "real_time_chat": "Reāllaika saruna", + "strategic_llm_desc": "Uzlabota spriešana plānošanai un stratēģisku lēmumu pieņemšanai", + "strategic_llm_examples": "Darbplūsmu plānošana, stratēģiska analīze, sarežģītu problēmu risināšana", + "strategic_thinking": "Stratēģiska domāšana", + "long_term_planning": "Ilgtermiņa plānošana", + "complex_reasoning": "Sarežģīta spriešana", + "use_cases": "Lietošanas gadījumi", + "assign_llm_config": "Piešķirt LLM konfigurāciju", + "unassigned": "Nepiešķirts", + "assigned": "Piešķirts", + "model": "Modelis", + "base": "Bāze", + "all_roles_assigned": "Visas lomas ir piešķirtas un gatavas lietošanai! Jūsu LLM konfigurācija ir pabeigta.", + "save_changes": "Saglabāt izmaiņas", + "saving": "Saglabā...", + "reset": "Atiestatīt", + "status": "Statuss", + "status_ready": "Gatavs", + "status_setup": "Iestatīšana", + "complete_role_assignments": "Pabeidziet visas lomu piešķires, lai iespējotu pilnu funkcionalitāti. Katra loma kalpo dažādiem mērķiem jūsu darbplūsmā.", + "all_roles_saved": "Visas lomas piešķirtas un saglabātas!", + "progress": "Progress", + "roles_assigned_count": "{assigned} no {total} lomām piešķirtas" + }, + "podcasts": { + "title": "Podkāsti", + "subtitle": "Klausieties ģenerētos podkāstus.", + "search_placeholder": "Meklēt podkāstus...", + "sort_order": "Kārtošanas secība", + "newest_first": "Jaunākie vispirms", + "oldest_first": "Vecākie vispirms", + "loading": "Ielādē podkāstus...", + "error_loading": "Kļūda ielādējot podkāstus", + "no_podcasts": "Podkāsti nav atrasti", + "adjust_filters": "Mēģiniet pielāgot meklēšanas filtrus", + "generate_hint": "Ģenerējiet podkāstus no savām sarunām, lai sāktu", + "loading_podcast": "Ielādē podkāstu...", + "now_playing": "Tagad atskaņo", + "delete_podcast": "Dzēst podkāstu", + "delete_confirm_1": "Vai tiešām vēlaties dzēst", + "delete_confirm_2": "Šo darbību nevar atsaukt.", + "cancel": "Atcelt", + "delete": "Dzēst", + "deleting": "Dzēš..." + }, + "logs": { + "title": "Uzdevumu žurnāli", + "subtitle": "Pārraugiet un analizējiet visus uzdevumu izpildes žurnālus", + "refresh": "Atsvaidzināt", + "delete_selected": "Dzēst izvēlētos", + "confirm_title": "Vai esat pilnīgi pārliecināts?", + "confirm_delete_desc": "Šo darbību nevar atsaukt. Tas neatgriezeniski dzēsīs {count} izvēlēto(-os) žurnālu(-s).", + "cancel": "Atcelt", + "delete": "Dzēst", + "level": "Līmenis", + "status": "Statuss", + "source": "Avots", + "message": "Ziņojums", + "created_at": "Izveidots", + "actions": "Darbības", + "system": "Sistēma", + "filter_by_message": "Filtrēt pēc ziņojuma...", + "filter_by": "Filtrēt pēc", + "total_logs": "Kopā žurnālu", + "active_tasks": "Aktīvie uzdevumi", + "success_rate": "Veiksmes rādītājs", + "recent_failures": "Nesenās kļūmes", + "last_hours": "Pēdējās {hours} stundas", + "currently_running": "Pašlaik darbojas", + "successful": "veiksmīgi", + "need_attention": "Nepieciešama uzmanība", + "no_logs": "Žurnāli nav atrasti", + "loading": "Ielādē žurnālus...", + "error_loading": "Kļūda ielādējot žurnālus", + "columns": "Kolonnas", + "failed_load_summary": "Neizdevās ielādēt kopsavilkumu", + "retry": "Mēģināt vēlreiz", + "view": "Skatīt", + "toggle_columns": "Pārslēgt kolonnas", + "rows_per_page": "Rindas lapā", + "view_metadata": "Skatīt metadatus", + "log_deleted_success": "Žurnāls veiksmīgi dzēsts", + "log_deleted_error": "Neizdevās dzēst žurnālu", + "confirm_delete_log_title": "Vai esat pārliecināts?", + "confirm_delete_log_desc": "Šo darbību nevar atsaukt. Tas neatgriezeniski dzēsīs žurnāla ierakstu.", + "deleting": "Dzēš..." + }, + "onboard": { + "welcome_title": "Laipni lūdzam SurfSense", + "welcome_subtitle": "Konfigurēsim jūsu LLM konfigurācijas, lai sāktu", + "step_of": "Solis {current} no {total}", + "percent_complete": "{percent}% pabeigts", + "add_llm_provider": "Pievienot LLM pakalpojumu sniedzēju", + "assign_llm_roles": "Piešķirt LLM lomas", + "setup_llm_configuration": "Iestatīt LLM konfigurāciju", + "configure_providers_and_assign_roles": "Pievienojiet savus LLM pakalpojumu sniedzējus un piešķiriet tiem konkrētas lomas", + "setup_complete": "Iestatīšana pabeigta", + "configure_first_provider": "Konfigurējiet savu pirmo modeļa pakalpojumu sniedzēju", + "assign_specific_roles": "Piešķiriet konkrētas lomas savām LLM konfigurācijām", + "all_set": "Jūs esat gatavs sākt lietot SurfSense!", + "loading_config": "Ielādē jūsu konfigurāciju...", + "previous": "Iepriekšējais", + "next": "Tālāk", + "complete_setup": "Pabeigt iestatīšanu", + "add_provider_instruction": "Pievienojiet vismaz vienu LLM pakalpojumu sniedzēju, lai turpinātu. Jūs varat konfigurēt vairākus pakalpojumu sniedzējus un izvēlēties konkrētas lomas katram nākamajā solī.", + "your_llm_configs": "Jūsu LLM konfigurācijas", + "model": "Modelis", + "language": "Valoda", + "base": "Bāze", + "add_provider_title": "Pievienot LLM pakalpojumu sniedzēju", + "add_provider_subtitle": "Konfigurējiet savu pirmo modeļa pakalpojumu sniedzēju, lai sāktu", + "add_provider_button": "Pievienot pakalpojumu sniedzēju", + "add_new_llm_provider": "Pievienot jaunu LLM pakalpojumu sniedzēju", + "configure_new_provider": "Konfigurējiet jaunu valodas modeļa pakalpojumu sniedzēju savam AI asistentam", + "config_name": "Konfigurācijas nosaukums", + "config_name_required": "Konfigurācijas nosaukums *", + "config_name_placeholder": "piem., Mans OpenAI GPT-4", + "provider": "Pakalpojumu sniedzējs", + "provider_required": "Pakalpojumu sniedzējs *", + "provider_placeholder": "Izvēlieties pakalpojumu sniedzēju", + "language_optional": "Valoda (neobligāts)", + "language_placeholder": "Izvēlieties valodu", + "custom_provider_name": "Pielāgota pakalpojumu sniedzēja nosaukums *", + "custom_provider_placeholder": "piem., mans-pielāgotais-sniedzējs", + "model_name_required": "Modeļa nosaukums *", + "model_name_placeholder": "piem., gpt-4", + "examples": "Piemēri", + "api_key_required": "API atslēga *", + "api_key_placeholder": "Jūsu API atslēga", + "api_base_optional": "API bāzes URL (neobligāts)", + "api_base_placeholder": "piem., https://api.openai.com/v1", + "adding": "Pievieno...", + "add_provider": "Pievienot pakalpojumu sniedzēju", + "cancel": "Atcelt", + "assign_roles_instruction": "Piešķiriet savas LLM konfigurācijas konkrētām lomām. Katra loma kalpo dažādiem mērķiem jūsu darbplūsmā.", + "no_llm_configs_found": "LLM konfigurācijas nav atrastas", + "add_provider_before_roles": "Lūdzu, pievienojiet vismaz vienu LLM pakalpojumu sniedzēju iepriekšējā solī pirms lomu piešķiršanas.", + "long_context_llm_title": "Garā konteksta LLM", + "long_context_llm_desc": "Apstrādā sarežģītus uzdevumus, kam nepieciešama plaša konteksta izpratne un spriešana", + "long_context_llm_examples": "Dokumentu analīze, pētniecības sintēze, sarežģīti jautājumi un atbildes", + "fast_llm_title": "Ātrais LLM", + "fast_llm_desc": "Optimizēts ātrām atbildēm un reāllaika mijiedarbībai", + "fast_llm_examples": "Ātra meklēšana, vienkārši jautājumi, tūlītējas atbildes", + "strategic_llm_title": "Stratēģiskais LLM", + "strategic_llm_desc": "Uzlabota spriešana plānošanai un stratēģisku lēmumu pieņemšanai", + "strategic_llm_examples": "Darbplūsmu plānošana, stratēģiska analīze, sarežģītu problēmu risināšana", + "use_cases": "Lietošanas gadījumi", + "assign_llm_config": "Piešķirt LLM konfigurāciju", + "select_llm_config": "Izvēlieties LLM konfigurāciju", + "assigned": "Piešķirts", + "all_roles_assigned_saved": "Visas lomas piešķirtas un saglabātas!", + "progress": "Progress", + "roles_assigned": "{assigned} no {total} lomām piešķirtas", + "global_configs": "Globālās konfigurācijas", + "your_configs": "Jūsu konfigurācijas" + }, + "model_config": { + "title": "Modeļu konfigurācijas", + "subtitle": "Pārvaldiet savas LLM pakalpojumu sniedzēju konfigurācijas un API iestatījumus.", + "refresh": "Atsvaidzināt", + "loading": "Ielādē konfigurācijas...", + "total_configs": "Kopā konfigurāciju", + "unique_providers": "Unikāli pakalpojumu sniedzēji", + "system_status": "Sistēmas statuss", + "active": "Aktīvs", + "your_configs": "Jūsu konfigurācijas", + "manage_configs": "Pārvaldiet un konfigurējiet savus LLM pakalpojumu sniedzējus", + "add_config": "Pievienot konfigurāciju", + "no_configs": "Vēl nav konfigurāciju", + "no_configs_desc": "Pievienojiet savas LLM pakalpojumu sniedzēju konfigurācijas.", + "add_first_config": "Pievienot pirmo konfigurāciju", + "created": "Izveidots" + }, + "breadcrumb": { + "dashboard": "Panelis", + "search_space": "Meklēšanas telpa", + "researcher": "Pētnieks", + "documents": "Dokumenti", + "connectors": "Savienotāji", + "podcasts": "Podkāsti", + "logs": "Žurnāli", + "chats": "Sarunas", + "settings": "Iestatījumi", + "upload_documents": "Augšupielādēt dokumentus", + "add_youtube": "Pievienot YouTube video", + "add_webpages": "Pievienot tīmekļa lapas", + "add_connector": "Pievienot savienotāju", + "manage_connectors": "Pārvaldīt savienotājus", + "edit_connector": "Rediģēt savienotāju", + "manage": "Pārvaldīt" + }, + "sidebar": { + "recent_chats": "Nesenās sarunas", + "search_chats": "Meklēt sarunas...", + "no_chats_found": "Sarunas nav atrastas", + "no_recent_chats": "Nav neseno sarunu", + "view_all_chats": "Skatīt visas sarunas", + "search_space": "Meklēšanas telpa" + }, + "errors": { + "something_went_wrong": "Kaut kas nogāja greizi", + "try_again": "Lūdzu, mēģiniet vēlreiz", + "not_found": "Nav atrasts", + "unauthorized": "Nav autorizēts", + "forbidden": "Aizliegts", + "server_error": "Servera kļūda", + "network_error": "Tīkla kļūda" + }, + "homepage": { + "hero_title_part1": "AI darba telpa", + "hero_title_part2": "veidota komandām", + "hero_description": "Savienojiet jebkuru LLM ar saviem iekšējiem zināšanu avotiem un sarunājieties ar to reāllaikā kopā ar savu komandu.", + "cta_start_trial": "Sākt bezmaksas izmēģinājumu", + "cta_explore": "Izpētīt", + "integrations_title": "Integrācijas", + "integrations_subtitle": "Integrējiet ar jūsu komandas svarīgākajiem rīkiem", + "features_title": "Jūsu komandas AI darbināmais zināšanu centrs", + "features_subtitle": "Jaudīgas funkcijas, kas izstrādātas, lai uzlabotu sadarbību, palielinātu produktivitāti un optimizētu darbplūsmu.", + "feature_workflow_title": "Optimizēta darbplūsma", + "feature_workflow_desc": "Centralizējiet visas savas zināšanas un resursus vienā inteliģentā darba telpā. Atrodiet vajadzīgo uzreiz un paātriniet lēmumu pieņemšanu.", + "feature_collaboration_title": "Nevainojama sadarbība", + "feature_collaboration_desc": "Strādājiet kopā bez piepūles ar reāllaika sadarbības rīkiem, kas uztur visu komandu saskaņotu.", + "feature_customizable_title": "Pilnībā pielāgojams", + "feature_customizable_desc": "Izvēlieties no 100+ vadošajiem LLM un nevainojami izsauciet jebkuru modeli pēc pieprasījuma.", + "cta_transform": "Pārveidojiet veidu, kā jūsu komanda", + "cta_transform_bold": "atklāj un sadarbojas", + "cta_unite_start": "Apvienojiet savas", + "cta_unite_knowledge": "komandas zināšanas", + "cta_unite_middle": "vienā sadarbības telpā ar", + "cta_unite_search": "inteliģentu meklēšanu", + "cta_talk_to_us": "Sarunājieties ar mums", + "features": { + "find_ask_act": { + "title": "Atrodiet, jautājiet, rīkojieties", + "description": "Iegūstiet tūlītēju informāciju, detalizētus atjauninājumus un citētas atbildes no uzņēmuma un personīgajām zināšanām." + }, + "real_time_collab": { + "title": "Strādājiet kopā reāllaikā", + "description": "Pārveidojiet savus uzņēmuma dokumentus par daudzspēlētāju telpām ar tiešsaistes rediģēšanu, sinhronizētu saturu un klātbūtni." + }, + "beyond_text": { + "title": "Sadarbojieties ārpus teksta", + "description": "Izveidojiet podkāstus un multividi, ko jūsu komanda var komentēt, kopīgot un pilnveidot kopā." + }, + "context_counts": { + "title": "Konteksts, kur tas ir svarīgs", + "description": "Pievienojiet komentārus tieši savām sarunām un dokumentiem skaidrai, tūlītējai atsauksmei." + }, + "citation_illustration_title": "Citēšanas funkcijas ilustrācija, kas rāda noklikšķināmu avota atsauci", + "referenced_chunk": "Atsauces fragments", + "collab_illustration_label": "Reāllaika sadarbības ilustrācija teksta redaktorā.", + "real_time": "Reāllaikā", + "collab_part1": "sadar", + "collab_part2": "bī", + "collab_part3": "ba", + "annotation_illustration_label": "Teksta redaktora ilustrācija ar anotācijas komentāriem.", + "add_context_with": "Pievienojiet kontekstu ar", + "comments": "komentāriem", + "example_comment": "Apspriedīsim to rīt!" + } + } +} diff --git a/surfsense_web/messages/zh.json b/surfsense_web/messages/zh.json deleted file mode 100644 index d00da8e3a..000000000 --- a/surfsense_web/messages/zh.json +++ /dev/null @@ -1,698 +0,0 @@ -{ - "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", - "sources": "数据源", - "add_sources": "添加数据源", - "documents": "文档", - "upload_documents": "上传文档", - "add_webpages": "添加网页", - "add_youtube": "添加 YouTube 视频", - "add_youtube_videos": "添加 YouTube 视频", - "manage_documents": "管理文档", - "connectors": "连接器", - "add_connector": "添加连接器", - "manage_connectors": "管理连接器", - "podcasts": "播客", - "logs": "日志", - "all_search_spaces": "所有搜索空间", - "chat": "聊天" - }, - "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_llm_configuration": "设置 LLM 配置", - "configure_providers_and_assign_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} 个角色已分配", - "global_configs": "全局配置", - "your_configs": "您的配置" - }, - "model_config": { - "title": "模型配置", - "subtitle": "管理您的 LLM 提供商配置和 API 设置。", - "refresh": "刷新", - "loading": "正在加载配置...", - "total_configs": "配置总数", - "unique_providers": "独立提供商", - "system_status": "系统状态", - "active": "活跃", - "your_configs": "您的配置", - "manage_configs": "管理和配置您的 LLM 提供商", - "add_config": "添加配置", - "no_configs": "暂无配置", - "no_configs_desc": "添加您自己的 LLM 提供商配置。", - "add_first_config": "添加首个配置", - "created": "创建于" - }, - "breadcrumb": { - "dashboard": "仪表盘", - "search_space": "搜索空间", - "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": "我们明天讨论这个!" - } - } -}