feat(i18n): Add next-intl framework with full bilingual support (EN/ZH)
- Implement next-intl framework for scalable i18n
- Add complete Chinese (Simplified) localization
- Support 400+ translated strings across all pages
- Add language switcher with persistent preference
- Zero breaking changes to existing functionality
Framework additions:
- i18n routing and middleware
- LocaleContext for client-side state
- LanguageSwitcher component
- Translation files (en.json, zh.json)
Translated components:
- Homepage: Hero, features, CTA, navbar
- Auth: Login, register
- Dashboard: Main page, layout
- Connectors: Management, add page (all categories)
- Documents: Upload, manage, filters
- Settings: LLM configs, role assignments
- Onboarding: Add provider, assign roles
- Logs: Task logs viewer
Adding a new language now requires only:
1. Create messages/<locale>.json
2. Add locale to i18n/routing.ts
2025-10-26 14:05:46 +08:00
{
2025-10-27 20:30:10 -07:00
"common" : {
"app_name" : "SurfSense" ,
"welcome" : "Welcome" ,
"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" ,
2026-01-12 15:59:03 +02:00
"retry" : "Retry" ,
2026-01-12 16:38:40 +02:00
"owner" : "Owner" ,
"shared" : "Shared" ,
"settings" : "Settings"
2025-10-27 20:30:10 -07:00
} ,
"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" ,
2026-01-25 16:28:34 +05:30
"signing_in" : "Signing in" ,
2025-10-27 20:30:10 -07:00
"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" ,
2026-01-24 19:42:07 +05:30
"creating_account" : "Creating your account" ,
"creating_account_btn" : "Creating account" ,
2026-01-27 15:28:30 +05:30
"redirecting_login" : "Redirecting to login page"
2025-10-27 20:30:10 -07:00
} ,
2026-01-12 15:56:23 +02:00
"searchSpace" : {
"create_title" : "Create Search Space" ,
"create_description" : "Create a new search space to organize your knowledge" ,
"name_label" : "Name" ,
"name_placeholder" : "Enter search space name" ,
"description_label" : "Description" ,
"description_placeholder" : "What is this search space for?" ,
"create_button" : "Create" ,
2026-01-16 11:32:06 -08:00
"creating" : "Creating" ,
2026-01-12 15:59:03 +02:00
"all_search_spaces" : "All Search Spaces" ,
"search_spaces_count" : "{count, plural, =0 {No search spaces} =1 {1 search space} other {# search spaces}}" ,
"no_search_spaces" : "No search spaces yet" ,
"create_first_search_space" : "Create your first search space to get started" ,
"members_count" : "{count, plural, =1 {1 member} other {# members}}" ,
2026-01-12 16:38:40 +02:00
"create_new_search_space" : "Create new search space" ,
"delete_title" : "Delete Search Space" ,
2026-01-12 16:55:05 +02:00
"delete_confirm" : "Are you sure you want to delete \"{name}\"? This action cannot be undone and will permanently remove all data." ,
2026-01-13 01:45:58 -08:00
"leave" : "Leave" ,
"leave_title" : "Leave Search Space" ,
"leave_confirm" : "Are you sure you want to leave \"{name}\"? You will lose access to all documents and chats in this search space." ,
2026-01-13 02:06:35 -08:00
"leaving" : "Leaving..." ,
2026-01-12 16:55:05 +02:00
"welcome_title" : "Welcome to SurfSense" ,
"welcome_description" : "Create your first search space to start organizing your knowledge, connecting sources, and chatting with AI." ,
"create_first_button" : "Create your first search space"
2026-01-12 15:56:23 +02:00
} ,
2026-01-12 17:06:05 +02:00
"userSettings" : {
"title" : "User Settings" ,
"description" : "Manage your account settings and API access" ,
"back_to_app" : "Back to app" ,
2026-01-14 15:57:02 +02:00
"profile_nav_label" : "Profile" ,
"profile_nav_description" : "Manage your display name and avatar" ,
"profile_title" : "Profile" ,
"profile_description" : "Update your personal information" ,
2026-01-14 16:11:13 +02:00
"profile_avatar" : "Profile Picture" ,
"profile_display_name" : "Display Name" ,
"profile_display_name_hint" : "This is how your name appears across the app" ,
"profile_email" : "Email" ,
"profile_save" : "Save Changes" ,
"profile_saved" : "Profile updated successfully" ,
"profile_save_error" : "Failed to update profile" ,
2026-01-12 17:06:05 +02:00
"api_key_nav_label" : "API Key" ,
"api_key_nav_description" : "Manage your API access token" ,
"api_key_title" : "API Key" ,
"api_key_description" : "Use this key to authenticate API requests" ,
"api_key_warning_title" : "Keep it secret" ,
"api_key_warning_description" : "Your API key grants full access to your account. Never share it publicly or commit it to version control." ,
"your_api_key" : "Your API Key" ,
"copied" : "Copied!" ,
"copy" : "Copy to clipboard" ,
"no_api_key" : "No API key found" ,
"usage_title" : "How to use" ,
"usage_description" : "Include your API key in the Authorization header:"
} ,
2025-10-27 20:30:10 -07:00
"dashboard" : {
"title" : "Dashboard" ,
"search_spaces" : "Search Spaces" ,
"documents" : "Documents" ,
"connectors" : "Connectors" ,
"settings" : "Settings" ,
2025-12-21 22:26:33 -08:00
"chat" : "Chat" ,
2025-10-27 20:30:10 -07:00
"api_keys" : "API Keys" ,
"profile" : "Profile" ,
"loading_dashboard" : "Loading Dashboard" ,
"loading_config" : "Loading Configuration" ,
"config_error" : "Configuration Error" ,
"failed_load_llm_config" : "Failed to load your LLM configuration" ,
"error_loading_chats" : "Error loading chats" ,
2026-01-24 19:42:07 +05:30
"loading_chat" : "Loading chat" ,
"loading_document" : "Loading document" ,
2025-10-27 20:30:10 -07:00
"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" ,
2025-12-19 21:40:40 +05:30
"delete_note" : "Delete Note" ,
"delete_note_confirm" : "Are you sure you want to delete" ,
2025-10-27 20:30:10 -07:00
"action_cannot_undone" : "This action cannot be undone." ,
2026-01-23 18:37:09 +05:30
"deleting" : "Deleting" ,
2025-10-27 20:30:10 -07:00
"surfsense_dashboard" : "SurfSense Dashboard" ,
"welcome_message" : "Welcome to your SurfSense dashboard." ,
"your_search_spaces" : "Your Search Spaces" ,
2025-11-27 22:45:04 -08:00
"shared" : "Shared" ,
2025-10-27 20:30:10 -07:00
"create_search_space" : "Create Search Space" ,
"add_new_search_space" : "Add New Search Space" ,
"loading" : "Loading" ,
"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" ,
2025-12-21 22:26:33 -08:00
"delete_space_confirm" : "Are you sure you want to delete \"{name}\"? This action cannot be undone. All documents and chats in this search space will be permanently deleted." ,
2026-01-13 02:06:35 -08:00
"leave" : "Leave" ,
"leave_title" : "Leave Search Space" ,
"leave_confirm" : "Are you sure you want to leave \"{name}\"? You will lose access to all documents and chats in this search space." ,
"leaving" : "Leaving..." ,
2025-10-27 20:30:10 -07:00
"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" : {
2025-11-19 15:04:46 -08:00
"settings" : "Settings" ,
2025-10-27 20:30:10 -07:00
"platform" : "Platform" ,
2025-12-21 22:26:33 -08:00
"chat" : "Chat" ,
2025-10-27 20:30:10 -07:00
"manage_llms" : "Manage LLMs" ,
2025-11-07 14:28:30 -08:00
"sources" : "Sources" ,
"add_sources" : "Add Sources" ,
2025-10-27 20:30:10 -07:00
"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" ,
"logs" : "Logs" ,
2025-11-16 15:54:54 -08:00
"all_search_spaces" : "All Search Spaces" ,
2025-11-27 22:45:04 -08:00
"team" : "Team"
2025-10-27 20:30:10 -07:00
} ,
"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"
} ,
"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" ,
2026-02-05 23:45:01 -08:00
"delete_success" : "Document deleted successfully" ,
2025-10-27 20:30:10 -07:00
"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." ,
2026-01-25 15:23:45 +05:30
"uploading" : "Uploading" ,
2025-10-27 20:30:10 -07:00
"upload_success" : "Document uploaded successfully" ,
"upload_failed" : "Failed to upload document" ,
2026-01-25 15:23:45 +05:30
"loading" : "Loading documents" ,
2025-10-27 20:30:10 -07:00
"error_loading" : "Error loading documents" ,
"retry" : "Retry" ,
"no_documents" : "No documents found" ,
"type" : "Type" ,
"content_summary" : "Content Summary" ,
2026-01-07 19:07:06 -08:00
"view_full" : "View Summary" ,
2025-10-27 20:30:10 -07:00
"filter_placeholder" : "Filter by title..." ,
2025-12-27 18:37:30 +05:30
"rows_per_page" : "Rows per page" ,
"refresh" : "Refresh" ,
2026-01-13 02:15:46 -08:00
"upload_documents" : "Upload Documents" ,
2026-01-13 00:17:12 -08:00
"create_shared_note" : "Create Shared Note" ,
2025-12-27 19:09:42 +05:30
"processing_documents" : "Processing documents..." ,
"active_tasks_count" : "{count} active task(s)"
2025-10-27 20:30:10 -07:00
} ,
"add_connector" : {
"title" : "Connect Your Tools" ,
"subtitle" : "Integrate with your favorite services to enhance your research capabilities." ,
2025-11-26 13:44:38 -08:00
"web_search" : "Web Search" ,
"messaging" : "Messaging" ,
2025-10-27 20:30:10 -07:00
"project_management" : "Project Management" ,
2025-11-26 13:44:38 -08:00
"documentation" : "Documentation" ,
"development" : "Development" ,
"databases" : "Databases" ,
"productivity" : "Productivity" ,
"web_crawling" : "Web Crawling" ,
2025-10-27 20:30:10 -07:00
"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." ,
2025-12-04 14:08:44 +08:00
"bookstack_desc" : "Connect to BookStack to search wiki pages and documentation." ,
2025-10-27 20:30:10 -07:00
"airtable_desc" : "Connect to Airtable to search records, tables and database content." ,
2025-11-26 13:44:38 -08:00
"luma_desc" : "Connect to Luma to search events, meetups and gatherings." ,
2025-12-30 09:00:59 -08:00
"circleback_desc" : "Receive meeting notes, transcripts and action items from Circleback via webhook." ,
2025-10-27 20:30:10 -07:00
"calendar_desc" : "Connect to Google Calendar to search events, meetings and schedules." ,
"gmail_desc" : "Connect to your Gmail account to search through your emails." ,
2025-12-28 15:56:42 +02:00
"google_drive_desc" : "Connect to Google Drive to search and index your files and documents." ,
2025-11-21 20:45:59 -08:00
"zoom_desc" : "Connect to Zoom to access meeting recordings and transcripts." ,
2025-11-26 13:44:38 -08:00
"webcrawler_desc" : "Crawl and index content from any public web pages."
2025-10-27 20:30:10 -07:00
} ,
"upload_documents" : {
"title" : "Upload Documents" ,
"subtitle" : "Upload your files to make them searchable and accessible through AI-powered conversations." ,
2026-02-06 18:13:11 +05:30
"file_size_limit" : "Maximum file size: 50MB per file." ,
2026-01-15 00:01:00 -08:00
"upload_limits" : "Upload limit: {maxFiles} files, {maxSizeMB}MB total." ,
2025-10-27 20:30:10 -07:00
"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" ,
2026-01-25 15:23:45 +05:30
"uploading_files" : "Uploading files" ,
"uploading" : "Uploading" ,
2025-10-27 20:30:10 -07:00
"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" ,
2026-01-15 00:01:00 -08:00
"file_types_desc" : "These file types are supported based on your current ETL service configuration." ,
"max_files_exceeded" : "File Limit Exceeded" ,
"max_files_exceeded_desc" : "You can upload a maximum of {max} files at a time." ,
"max_size_exceeded" : "Size Limit Exceeded" ,
"max_size_exceeded_desc" : "Total file size cannot exceed {max}MB." ,
"file_limit_reached" : "Maximum Files Reached" ,
"file_limit_reached_desc" : "Remove some files to add more (max {max} files)." ,
"remaining_capacity" : "{files} files remaining • {sizeMB}MB available"
2025-10-27 20:30:10 -07:00
} ,
"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" ,
2026-01-02 01:17:53 +05:30
"submit" : "Add" ,
2025-10-27 20:30:10 -07:00
"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" ,
2025-11-19 15:04:46 -08:00
"long_context_desc" : "Handles summarization of long documents and complex Q&A" ,
2025-10-27 20:30:10 -07:00
"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" ,
2026-01-23 18:37:09 +05:30
"saving" : "Saving" ,
2025-10-27 20:30:10 -07:00
"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"
} ,
"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." ,
2026-01-23 18:37:09 +05:30
"deleting" : "Deleting"
2025-10-27 20:30:10 -07:00
} ,
"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" ,
2025-11-16 15:54:54 -08:00
"setup_llm_configuration" : "Setup LLM Configuration" ,
"configure_providers_and_assign_roles" : "Add your LLM providers and assign them to specific roles" ,
2025-12-09 02:27:02 -08:00
"assign_llm_roles_title" : "Assign LLM Roles" ,
"complete_role_assignment" : "Assign your LLM configurations to specific roles to continue" ,
2025-10-27 20:30:10 -07:00
"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" ,
2025-11-19 15:04:46 -08:00
"long_context_llm_desc" : "Handles summarization of long documents and complex Q&A" ,
2025-10-27 20:30:10 -07:00
"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" ,
2025-11-14 21:53:46 -08:00
"roles_assigned" : "{assigned} of {total} roles assigned" ,
"global_configs" : "Global Configurations" ,
"your_configs" : "Your Configurations"
2025-10-27 20:30:10 -07:00
} ,
"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" ,
2025-11-14 21:53:46 -08:00
"no_configs_desc" : "Add your own LLM provider configurations." ,
2025-10-27 20:30:10 -07:00
"add_first_config" : "Add First Configuration" ,
"created" : "Created"
} ,
"breadcrumb" : {
"dashboard" : "Dashboard" ,
"search_space" : "Search Space" ,
2025-12-21 22:26:33 -08:00
"chat" : "Chat" ,
2025-10-27 20:30:10 -07:00
"documents" : "Documents" ,
"connectors" : "Connectors" ,
2025-11-23 15:23:31 +05:30
"editor" : "Editor" ,
2025-10-27 20:30:10 -07:00
"logs" : "Logs" ,
"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" : {
2026-01-13 00:17:12 -08:00
"chats" : "Private Chats" ,
"shared_chats" : "Shared Chats" ,
2026-01-16 11:32:06 -08:00
"search_chats" : "Search chats" ,
2025-10-27 20:30:10 -07:00
"no_chats_found" : "No chats found" ,
2026-01-13 00:17:12 -08:00
"no_shared_chats" : "No shared chats" ,
"view_all_shared_chats" : "View all shared chats" ,
"view_all_private_chats" : "View all private chats" ,
2025-12-19 03:53:40 +05:30
"no_chats" : "No chats yet" ,
2025-12-21 22:26:33 -08:00
"start_new_chat_hint" : "Start a new chat" ,
2025-12-19 03:53:40 +05:30
"error_loading_chats" : "Error loading chats" ,
"chat_deleted" : "Chat deleted successfully" ,
"error_deleting_chat" : "Failed to delete chat" ,
2025-12-19 21:40:40 +05:30
"delete" : "Delete" ,
2026-01-13 00:24:17 -08:00
"try_different_search" : "Try a different search term" ,
2025-12-19 21:40:40 +05:30
"updated" : "Updated" ,
"more_options" : "More options" ,
"clear_search" : "Clear search" ,
2025-12-21 16:32:55 -08:00
"archive" : "Archive" ,
"unarchive" : "Restore" ,
"chat_archived" : "Chat archived" ,
"chat_unarchived" : "Chat restored" ,
2026-02-03 20:47:18 -05:00
"chat_renamed" : "Chat renamed" ,
"error_renaming_chat" : "Failed to rename chat" ,
"rename" : "Rename" ,
"rename_chat" : "Rename Chat" ,
"rename_chat_description" : "Enter a new name for this conversation." ,
"chat_title_placeholder" : "Chat title" ,
2026-02-21 23:59:04 +05:30
"renaming" : "Renaming" ,
2025-12-21 16:32:55 -08:00
"no_archived_chats" : "No archived chats" ,
2026-01-08 19:10:53 +02:00
"error_archiving_chat" : "Failed to archive chat" ,
"new_chat" : "New chat" ,
2026-01-12 15:47:56 +02:00
"select_search_space" : "Select Search Space" ,
"manage_members" : "Manage members" ,
2026-01-12 17:12:06 +02:00
"search_space_settings" : "Search Space settings" ,
2026-01-22 12:26:37 -05:00
"logs" : "Logs" ,
2026-01-12 15:47:56 +02:00
"see_all_search_spaces" : "See all search spaces" ,
2026-01-08 19:10:53 +02:00
"expand_sidebar" : "Expand sidebar" ,
"collapse_sidebar" : "Collapse sidebar" ,
2026-01-12 17:06:05 +02:00
"user_settings" : "User settings" ,
2026-01-20 15:47:23 +05:30
"language" : "Language" ,
2026-01-20 16:04:56 +05:30
"theme" : "Theme" ,
"light" : "Light" ,
"dark" : "Dark" ,
"system" : "System" ,
2026-01-21 19:43:20 +05:30
"logout" : "Logout" ,
2026-02-05 18:56:38 +02:00
"loggingOut" : "Logging out..." ,
2026-01-21 19:43:20 +05:30
"inbox" : "Inbox" ,
"search_inbox" : "Search inbox" ,
"mark_all_read" : "Mark all as read" ,
"mark_as_read" : "Mark as read" ,
"mentions" : "Mentions" ,
2026-02-04 17:17:33 +02:00
"comments" : "Comments" ,
2026-01-21 19:43:20 +05:30
"status" : "Status" ,
"no_results_found" : "No results found" ,
"no_mentions" : "No mentions" ,
"no_mentions_hint" : "You'll see mentions from others here" ,
2026-02-04 17:17:33 +02:00
"no_comments" : "No comments" ,
"no_comments_hint" : "You'll see mentions and replies here" ,
2026-01-21 19:43:20 +05:30
"no_status_updates" : "No status updates" ,
"no_status_updates_hint" : "Document and connector updates will appear here" ,
"filter" : "Filter" ,
2026-01-21 23:07:08 +05:30
"all" : "All" ,
2026-01-22 04:02:32 +05:30
"unread" : "Unread" ,
"connectors" : "Connectors" ,
2026-01-27 23:58:08 +05:30
"all_connectors" : "All connectors" ,
2026-02-21 23:59:04 +05:30
"close" : "Close" ,
"cancel" : "Cancel"
2025-10-27 20:30:10 -07:00
} ,
"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"
} ,
2026-01-13 02:35:00 +02:00
"searchSpaceSettings" : {
"title" : "Search Space Settings" ,
"back_to_app" : "Back to app" ,
2026-01-24 13:18:28 +05:30
"nav_general" : "General" ,
"nav_general_desc" : "Name, description & basic info" ,
2026-01-13 02:35:00 +02:00
"nav_agent_configs" : "Agent Configs" ,
"nav_agent_configs_desc" : "LLM models with prompts & citations" ,
"nav_role_assignments" : "Role Assignments" ,
"nav_role_assignments_desc" : "Assign configs to agent roles" ,
2026-02-05 16:43:48 -08:00
"nav_image_models" : "Image Models" ,
"nav_image_models_desc" : "Configure image generation models" ,
2026-01-13 02:35:00 +02:00
"nav_system_instructions" : "System Instructions" ,
2026-01-24 13:18:28 +05:30
"nav_system_instructions_desc" : "SearchSpace-wide AI instructions" ,
2026-02-02 16:40:11 +02:00
"nav_public_links" : "Public Chat Links" ,
"nav_public_links_desc" : "Manage publicly shared chat links" ,
2026-02-21 14:26:56 +05:30
"nav_team_roles" : "Team Roles" ,
"nav_team_roles_desc" : "Manage team roles & permissions" ,
2026-01-24 13:18:28 +05:30
"general_name_label" : "Name" ,
"general_name_placeholder" : "Enter search space name" ,
"general_name_description" : "A unique name for your search space." ,
"general_description_label" : "Description" ,
"general_description_placeholder" : "Enter search space description" ,
"general_description_description" : "A brief description of what this search space will be used for." ,
"general_reset" : "Reset Changes" ,
"general_save" : "Save Changes" ,
"general_saving" : "Saving" ,
"general_unsaved_changes" : "You have unsaved changes. Click \"Save Changes\" to apply them."
2026-01-13 02:35:00 +02:00
} ,
2025-10-27 20:30:10 -07:00
"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!"
}
2026-02-02 20:08:38 +02:00
} ,
"public_chat" : {
"not_found_title" : "This chat has been deleted." ,
"click_here" : "Click here" ,
"sign_in_prompt" : "to log in to SurfSense and start your own."
2025-10-27 20:30:10 -07:00
}
feat(i18n): Add next-intl framework with full bilingual support (EN/ZH)
- Implement next-intl framework for scalable i18n
- Add complete Chinese (Simplified) localization
- Support 400+ translated strings across all pages
- Add language switcher with persistent preference
- Zero breaking changes to existing functionality
Framework additions:
- i18n routing and middleware
- LocaleContext for client-side state
- LanguageSwitcher component
- Translation files (en.json, zh.json)
Translated components:
- Homepage: Hero, features, CTA, navbar
- Auth: Login, register
- Dashboard: Main page, layout
- Connectors: Management, add page (all categories)
- Documents: Upload, manage, filters
- Settings: LLM configs, role assignments
- Onboarding: Add provider, assign roles
- Logs: Task logs viewer
Adding a new language now requires only:
1. Create messages/<locale>.json
2. Add locale to i18n/routing.ts
2025-10-26 14:05:46 +08:00
}