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" ,
"loading" : "Loading..." ,
"save" : "Save" ,
"cancel" : "Cancel" ,
"delete" : "Delete" ,
"edit" : "Edit" ,
"create" : "Create" ,
"update" : "Update" ,
"search" : "Search" ,
"close" : "Close" ,
"confirm" : "Confirm" ,
"back" : "Back" ,
"next" : "Next" ,
"submit" : "Submit" ,
"yes" : "Yes" ,
"no" : "No" ,
"add" : "Add" ,
"remove" : "Remove" ,
"select" : "Select" ,
"all" : "All" ,
"none" : "None" ,
"error" : "Error" ,
"success" : "Success" ,
"warning" : "Warning" ,
"info" : "Information" ,
"required" : "Required" ,
"optional" : "Optional" ,
"retry" : "Retry"
} ,
"auth" : {
"login" : "Login" ,
"register" : "Register" ,
"logout" : "Logout" ,
"email" : "Email" ,
"password" : "Password" ,
"confirm_password" : "Confirm Password" ,
"forgot_password" : "Forgot Password?" ,
"show_password" : "Show password" ,
"hide_password" : "Hide password" ,
"remember_me" : "Remember Me" ,
"sign_in" : "Sign In" ,
"sign_up" : "Sign Up" ,
"sign_in_with" : "Sign in with {provider}" ,
"dont_have_account" : "Don't have an account?" ,
"already_have_account" : "Already have an account?" ,
"reset_password" : "Reset Password" ,
"email_required" : "Email is required" ,
"password_required" : "Password is required" ,
"invalid_email" : "Invalid email address" ,
"password_too_short" : "Password must be at least 8 characters" ,
"welcome_back" : "Welcome back" ,
"create_account" : "Create your account" ,
"login_subtitle" : "Enter your credentials to access your account" ,
"register_subtitle" : "Sign up to get started with SurfSense" ,
"or_continue_with" : "Or continue with" ,
"by_continuing" : "By continuing, you agree to our" ,
"terms_of_service" : "Terms of Service" ,
"and" : "and" ,
"privacy_policy" : "Privacy Policy" ,
"full_name" : "Full Name" ,
"username" : "Username" ,
"continue" : "Continue" ,
"back_to_login" : "Back to Login" ,
"login_success" : "Successfully logged in" ,
"register_success" : "Account created successfully" ,
"continue_with_google" : "Continue with Google" ,
"cloud_dev_notice" : "SurfSense Cloud is currently in development. Check" ,
"docs" : "Docs" ,
"cloud_dev_self_hosted" : "for more information on Self-Hosted version." ,
"passwords_no_match" : "Passwords do not match" ,
"password_mismatch" : "Password Mismatch" ,
"passwords_no_match_desc" : "The passwords you entered do not match" ,
"creating_account" : "Creating your account..." ,
"creating_account_btn" : "Creating account..." ,
"redirecting_login" : "Redirecting to login page..."
} ,
"dashboard" : {
"title" : "Dashboard" ,
"search_spaces" : "Search Spaces" ,
"documents" : "Documents" ,
"connectors" : "Connectors" ,
"settings" : "Settings" ,
"researcher" : "Researcher" ,
"api_keys" : "API Keys" ,
"profile" : "Profile" ,
"loading_dashboard" : "Loading Dashboard" ,
"checking_auth" : "Checking authentication..." ,
"loading_config" : "Loading Configuration" ,
"checking_llm_prefs" : "Checking your LLM preferences..." ,
"config_error" : "Configuration Error" ,
"failed_load_llm_config" : "Failed to load your LLM configuration" ,
"error_loading_chats" : "Error loading chats" ,
"no_recent_chats" : "No recent chats" ,
"error_loading_space" : "Error loading search space" ,
"unknown_search_space" : "Unknown Search Space" ,
"delete_chat" : "Delete Chat" ,
"delete_chat_confirm" : "Are you sure you want to delete" ,
"action_cannot_undone" : "This action cannot be undone." ,
"deleting" : "Deleting..." ,
"surfsense_dashboard" : "SurfSense Dashboard" ,
"welcome_message" : "Welcome to your SurfSense dashboard." ,
"your_search_spaces" : "Your Search Spaces" ,
"create_search_space" : "Create Search Space" ,
"add_new_search_space" : "Add New Search Space" ,
"loading" : "Loading" ,
"fetching_spaces" : "Fetching your search spaces..." ,
"may_take_moment" : "This may take a moment" ,
"error" : "Error" ,
"something_wrong" : "Something went wrong" ,
"error_details" : "Error Details" ,
"try_again" : "Try Again" ,
"go_home" : "Go Home" ,
"delete_search_space" : "Delete Search Space" ,
"delete_space_confirm" : "Are you sure you want to delete \"{name}\"? This action cannot be undone. All documents, chats, and podcasts in this search space will be permanently deleted." ,
"no_spaces_found" : "No search spaces found" ,
"create_first_space" : "Create your first search space to get started" ,
"created" : "Created"
} ,
"navigation" : {
"home" : "Home" ,
"docs" : "Docs" ,
"pricing" : "Pricing" ,
"contact" : "Contact" ,
"login" : "Login" ,
"register" : "Register" ,
"dashboard" : "Dashboard" ,
"sign_in" : "Sign In" ,
"book_a_call" : "Book a call"
} ,
"nav_menu" : {
"platform" : "Platform" ,
"researcher" : "Researcher" ,
"manage_llms" : "Manage LLMs" ,
"documents" : "Documents" ,
"upload_documents" : "Upload Documents" ,
"add_webpages" : "Add Webpages" ,
"add_youtube" : "Add Youtube Videos" ,
"add_youtube_videos" : "Add Youtube Videos" ,
"manage_documents" : "Manage Documents" ,
"connectors" : "Connectors" ,
"add_connector" : "Add Connector" ,
"manage_connectors" : "Manage Connectors" ,
"podcasts" : "Podcasts" ,
"logs" : "Logs" ,
"all_search_spaces" : "All Search Spaces"
} ,
"pricing" : {
"title" : "SurfSense Pricing" ,
"subtitle" : "Choose that works for you" ,
"community_name" : "COMMUNITY" ,
"enterprise_name" : "ENTERPRISE" ,
"forever" : "forever" ,
"contact_us" : "Contact Us" ,
"feature_llms" : "Supports 100+ LLMs" ,
"feature_ollama" : "Supports local Ollama or vLLM setups" ,
"feature_embeddings" : "6000+ Embedding Models" ,
"feature_files" : "50+ File extensions supported." ,
"feature_podcasts" : "Podcasts support with local TTS providers." ,
"feature_sources" : "Connects with 15+ external sources." ,
"feature_extension" : "Cross-Browser Extension for dynamic webpages including authenticated content" ,
"upcoming_mindmaps" : "Upcoming: Mergeable MindMaps" ,
"upcoming_notes" : "Upcoming: Note Management" ,
"community_desc" : "Open source version with powerful features" ,
"get_started" : "Get Started" ,
"everything_community" : "Everything in Community" ,
"priority_support" : "Priority Support" ,
"access_controls" : "Access Controls" ,
"collaboration" : "Collaboration and multiplayer features" ,
"video_gen" : "Video generation" ,
"advanced_security" : "Advanced security features" ,
"enterprise_desc" : "For large organizations with specific needs" ,
"contact_sales" : "Contact Sales"
} ,
"contact" : {
"title" : "Contact" ,
"subtitle" : "We'd love to Hear From You." ,
"we_are_here" : "We are here" ,
"full_name" : "Full name" ,
"email_address" : "Email Address" ,
"company" : "Company" ,
"message" : "Message" ,
"optional" : "optional" ,
"name_placeholder" : "John Doe" ,
"email_placeholder" : "john.doe@example.com" ,
"company_placeholder" : "Example Inc." ,
"message_placeholder" : "Type your message here" ,
"submit" : "Submit" ,
"submitting" : "Submitting..." ,
"name_required" : "Name is required" ,
"name_too_long" : "Name is too long" ,
"invalid_email" : "Invalid email address" ,
"email_too_long" : "Email is too long" ,
"company_required" : "Company is required" ,
"company_too_long" : "Company name is too long" ,
"message_sent" : "Message sent successfully!" ,
"we_will_contact" : "We will get back to you as soon as possible." ,
"send_failed" : "Failed to send message" ,
"try_again_later" : "Please try again later." ,
"something_wrong" : "Something went wrong"
} ,
"researcher" : {
"loading" : "Loading..." ,
"select_documents" : "Select Documents" ,
"select_documents_desc" : "Choose documents to include in your research context" ,
"loading_documents" : "Loading documents..." ,
"select_connectors" : "Select Connectors" ,
"select_connectors_desc" : "Choose which data sources to include in your research" ,
"clear_all" : "Clear All" ,
"select_all" : "Select All" ,
"scope" : "Scope" ,
"documents" : "Documents" ,
"docs" : "Docs" ,
"chunks" : "Chunks" ,
"mode" : "Mode" ,
"research_mode" : "Research Mode" ,
"mode_qna" : "Q&A" ,
"mode_general" : "General Report" ,
"mode_general_short" : "General" ,
"mode_deep" : "Deep Report" ,
"mode_deep_short" : "Deep" ,
"mode_deeper" : "Deeper Report" ,
"mode_deeper_short" : "Deeper" ,
"fast_llm" : "Fast LLM" ,
"select_llm" : "Select LLM" ,
"fast_llm_selection" : "Fast LLM Selection" ,
"no_llm_configs" : "No LLM configurations" ,
"configure_llm_to_start" : "Configure AI models to get started" ,
"open_settings" : "Open Settings" ,
"start_surfing" : "Let's Start Surfing" ,
"through_knowledge_base" : "through your knowledge base." ,
"all_connectors" : "All Connectors" ,
"connectors_selected" : "{count} Connectors" ,
"placeholder" : "Ask me anything..."
} ,
"connectors" : {
"title" : "Connectors" ,
"subtitle" : "Manage your connected services and data sources." ,
"add_connector" : "Add Connector" ,
"your_connectors" : "Your Connectors" ,
"view_manage" : "View and manage all your connected services." ,
"no_connectors" : "No connectors found" ,
"no_connectors_desc" : "You haven't added any connectors yet. Add one to enhance your search capabilities." ,
"add_first" : "Add Your First Connector" ,
"name" : "Name" ,
"type" : "Type" ,
"last_indexed" : "Last Indexed" ,
"periodic" : "Periodic" ,
"actions" : "Actions" ,
"never" : "Never" ,
"not_indexable" : "Not indexable" ,
"index_date_range" : "Index with Date Range" ,
"quick_index" : "Quick Index" ,
"quick_index_auto" : "Quick Index (Auto Date Range)" ,
"delete_connector" : "Delete Connector" ,
"delete_confirm" : "Are you sure you want to delete this connector? This action cannot be undone." ,
"select_date_range" : "Select Date Range for Indexing" ,
"select_date_range_desc" : "Choose the start and end dates for indexing content. Leave empty to use default range." ,
"start_date" : "Start Date" ,
"end_date" : "End Date" ,
"pick_date" : "Pick a date" ,
"clear_dates" : "Clear Dates" ,
"last_30_days" : "Last 30 Days" ,
"last_year" : "Last Year" ,
"start_indexing" : "Start Indexing" ,
"failed_load" : "Failed to load connectors" ,
"delete_success" : "Connector deleted successfully" ,
"delete_failed" : "Failed to delete connector" ,
"indexing_started" : "Connector content indexing started" ,
"indexing_failed" : "Failed to index connector content"
} ,
"documents" : {
"title" : "Documents" ,
"subtitle" : "Manage your documents and files." ,
"no_rows_selected" : "No rows selected" ,
"delete_success_count" : "Successfully deleted {count} document(s)" ,
"delete_partial_failed" : "Some documents could not be deleted" ,
"delete_error" : "Error deleting documents" ,
"filter_by_title" : "Filter by title..." ,
"bulk_delete" : "Delete Selected" ,
"filter_types" : "Filter Types" ,
"columns" : "Columns" ,
"confirm_delete" : "Confirm Delete" ,
"confirm_delete_desc" : "Are you sure you want to delete {count} document(s)? This action cannot be undone." ,
"uploading" : "Uploading..." ,
"upload_success" : "Document uploaded successfully" ,
"upload_failed" : "Failed to upload document" ,
"loading" : "Loading documents..." ,
"error_loading" : "Error loading documents" ,
"retry" : "Retry" ,
"no_documents" : "No documents found" ,
"type" : "Type" ,
"content_summary" : "Content Summary" ,
"view_full" : "View Full Content" ,
"filter_placeholder" : "Filter by title..." ,
"rows_per_page" : "Rows per page"
} ,
"add_connector" : {
"title" : "Connect Your Tools" ,
"subtitle" : "Integrate with your favorite services to enhance your research capabilities." ,
"search_engines" : "Search Engines" ,
"team_chats" : "Team Chats" ,
"project_management" : "Project Management" ,
"knowledge_bases" : "Knowledge Bases" ,
"communication" : "Communication" ,
"connect" : "Connect" ,
"coming_soon" : "Coming Soon" ,
"connected" : "Connected" ,
"manage" : "Manage" ,
"tavily_desc" : "Search the web using the Tavily API" ,
"searxng_desc" : "Use your own SearxNG meta-search instance for web results." ,
"linkup_desc" : "Search the web using the Linkup API" ,
"elasticsearch_desc" : "Connect to Elasticsearch to index and search documents, logs and metrics." ,
"baidu_desc" : "Search the Chinese web using Baidu AI Search API" ,
"slack_desc" : "Connect to your Slack workspace to access messages and channels." ,
"teams_desc" : "Connect to Microsoft Teams to access your team's conversations." ,
"discord_desc" : "Connect to Discord servers to access messages and channels." ,
"linear_desc" : "Connect to Linear to search issues, comments and project data." ,
"jira_desc" : "Connect to Jira to search issues, tickets and project data." ,
"clickup_desc" : "Connect to ClickUp to search tasks, comments and project data." ,
"notion_desc" : "Connect to your Notion workspace to access pages and databases." ,
"github_desc" : "Connect a GitHub PAT to index code and docs from accessible repositories." ,
"confluence_desc" : "Connect to Confluence to search pages, comments and documentation." ,
"airtable_desc" : "Connect to Airtable to search records, tables and database content." ,
"luma_desc" : "Connect to Luma to search events" ,
"calendar_desc" : "Connect to Google Calendar to search events, meetings and schedules." ,
"gmail_desc" : "Connect to your Gmail account to search through your emails." ,
"zoom_desc" : "Connect to Zoom to access meeting recordings and transcripts."
} ,
"upload_documents" : {
"title" : "Upload Documents" ,
"subtitle" : "Upload your files to make them searchable and accessible through AI-powered conversations." ,
"file_size_limit" : "Maximum file size: 50MB per file. Supported formats vary based on your ETL service configuration." ,
"drop_files" : "Drop files here" ,
"drag_drop" : "Drag & drop files here" ,
"or_browse" : "or click to browse" ,
"browse_files" : "Browse Files" ,
"selected_files" : "Selected Files ({count})" ,
"total_size" : "Total size" ,
"clear_all" : "Clear all" ,
"uploading_files" : "Uploading files..." ,
"uploading" : "Uploading..." ,
"upload_button" : "Upload {count} {count, plural, one {file} other {files}}" ,
"upload_initiated" : "Upload Task Initiated" ,
"upload_initiated_desc" : "Files Uploading Initiated" ,
"upload_error" : "Upload Error" ,
"upload_error_desc" : "Error uploading files" ,
"supported_file_types" : "Supported File Types" ,
"file_types_desc" : "These file types are supported based on your current ETL service configuration."
} ,
"add_webpage" : {
"title" : "Add Webpages for Crawling" ,
"subtitle" : "Enter URLs to crawl and add to your document collection" ,
"label" : "Enter URLs to crawl" ,
"placeholder" : "Enter a URL and press Enter" ,
"hint" : "Add multiple URLs by pressing Enter after each one" ,
"tips_title" : "Tips for URL crawling:" ,
"tip_1" : "Enter complete URLs including http:// or https://" ,
"tip_2" : "Make sure the websites allow crawling" ,
"tip_3" : "Public webpages work best" ,
"tip_4" : "Crawling may take some time depending on the website size" ,
"cancel" : "Cancel" ,
"submit" : "Submit URLs for Crawling" ,
"submitting" : "Submitting..." ,
"error_no_url" : "Please add at least one URL" ,
"error_invalid_urls" : "Invalid URLs detected: {urls}" ,
"crawling_toast" : "URL Crawling" ,
"crawling_toast_desc" : "Starting URL crawling process..." ,
"success_toast" : "Crawling Successful" ,
"success_toast_desc" : "URLs have been submitted for crawling" ,
"error_toast" : "Crawling Error" ,
"error_toast_desc" : "Error crawling URLs" ,
"error_generic" : "An error occurred while crawling URLs" ,
"invalid_url_toast" : "Invalid URL" ,
"invalid_url_toast_desc" : "Please enter a valid URL" ,
"duplicate_url_toast" : "Duplicate URL" ,
"duplicate_url_toast_desc" : "This URL has already been added"
} ,
"add_youtube" : {
"title" : "Add YouTube Videos" ,
"subtitle" : "Enter YouTube video URLs to add to your document collection" ,
"label" : "Enter YouTube Video URLs" ,
"placeholder" : "Enter a YouTube URL and press Enter" ,
"hint" : "Add multiple YouTube URLs by pressing Enter after each one" ,
"tips_title" : "Tips for adding YouTube videos:" ,
"tip_1" : "Use standard YouTube URLs (youtube.com/watch?v= or youtu.be/)" ,
"tip_2" : "Make sure videos are publicly accessible" ,
"tip_3" : "Supported formats: youtube.com/watch?v=VIDEO_ID or youtu.be/VIDEO_ID" ,
"tip_4" : "Processing may take some time depending on video length" ,
"preview" : "Preview" ,
"cancel" : "Cancel" ,
"submit" : "Submit YouTube Videos" ,
"processing" : "Processing..." ,
"error_no_video" : "Please add at least one YouTube video URL" ,
"error_invalid_urls" : "Invalid YouTube URLs detected: {urls}" ,
"processing_toast" : "YouTube Video Processing" ,
"processing_toast_desc" : "Starting YouTube video processing..." ,
"success_toast" : "Processing Successful" ,
"success_toast_desc" : "YouTube videos have been submitted for processing" ,
"error_toast" : "Processing Error" ,
"error_toast_desc" : "Error processing YouTube videos" ,
"error_generic" : "An error occurred while processing YouTube videos" ,
"invalid_url_toast" : "Invalid YouTube URL" ,
"invalid_url_toast_desc" : "Please enter a valid YouTube video URL" ,
"duplicate_url_toast" : "Duplicate URL" ,
"duplicate_url_toast_desc" : "This YouTube video has already been added"
} ,
"settings" : {
"title" : "Settings" ,
"subtitle" : "Manage your LLM configurations and role assignments for this search space." ,
"back_to_dashboard" : "Back to Dashboard" ,
"model_configs" : "Model Configs" ,
"models" : "Models" ,
"llm_roles" : "LLM Roles" ,
"roles" : "Roles" ,
"llm_role_management" : "LLM Role Management" ,
"llm_role_desc" : "Assign your LLM configurations to specific roles for different purposes." ,
"no_llm_configs_found" : "No LLM configurations found. Please add at least one LLM provider in the Model Configs tab before assigning roles." ,
"select_llm_config" : "Select an LLM configuration" ,
"long_context_llm" : "Long Context LLM" ,
"fast_llm" : "Fast LLM" ,
"strategic_llm" : "Strategic LLM" ,
"long_context_desc" : "Handles complex tasks requiring extensive context understanding and reasoning" ,
"long_context_examples" : "Document analysis, research synthesis, complex Q&A" ,
"large_context_window" : "Large context window" ,
"deep_reasoning" : "Deep reasoning" ,
"complex_analysis" : "Complex analysis" ,
"fast_llm_desc" : "Optimized for quick responses and real-time interactions" ,
"fast_llm_examples" : "Quick searches, simple questions, instant responses" ,
"low_latency" : "Low latency" ,
"quick_responses" : "Quick responses" ,
"real_time_chat" : "Real-time chat" ,
"strategic_llm_desc" : "Advanced reasoning for planning and strategic decision making" ,
"strategic_llm_examples" : "Planning workflows, strategic analysis, complex problem solving" ,
"strategic_thinking" : "Strategic thinking" ,
"long_term_planning" : "Long-term planning" ,
"complex_reasoning" : "Complex reasoning" ,
"use_cases" : "Use cases" ,
"assign_llm_config" : "Assign LLM Configuration" ,
"unassigned" : "Unassigned" ,
"assigned" : "Assigned" ,
"model" : "Model" ,
"base" : "Base" ,
"all_roles_assigned" : "All roles are assigned and ready to use! Your LLM configuration is complete." ,
"save_changes" : "Save Changes" ,
"saving" : "Saving..." ,
"reset" : "Reset" ,
"status" : "Status" ,
"status_ready" : "Ready" ,
"status_setup" : "Setup" ,
"complete_role_assignments" : "Complete all role assignments to enable full functionality. Each role serves different purposes in your workflow." ,
"all_roles_saved" : "All roles assigned and saved!" ,
"progress" : "Progress" ,
"roles_assigned_count" : "{assigned} of {total} roles assigned"
} ,
"podcasts" : {
"title" : "Podcasts" ,
"subtitle" : "Listen to generated podcasts." ,
"search_placeholder" : "Search podcasts..." ,
"sort_order" : "Sort order" ,
"newest_first" : "Newest First" ,
"oldest_first" : "Oldest First" ,
"loading" : "Loading podcasts..." ,
"error_loading" : "Error loading podcasts" ,
"no_podcasts" : "No podcasts found" ,
"adjust_filters" : "Try adjusting your search filters" ,
"generate_hint" : "Generate podcasts from your chats to get started" ,
"loading_podcast" : "Loading podcast..." ,
"now_playing" : "Now Playing" ,
"delete_podcast" : "Delete Podcast" ,
"delete_confirm_1" : "Are you sure you want to delete" ,
"delete_confirm_2" : "This action cannot be undone." ,
"cancel" : "Cancel" ,
"delete" : "Delete" ,
"deleting" : "Deleting..."
} ,
"logs" : {
"title" : "Task Logs" ,
"subtitle" : "Monitor and analyze all task execution logs" ,
"refresh" : "Refresh" ,
"delete_selected" : "Delete Selected" ,
"confirm_title" : "Are you absolutely sure?" ,
"confirm_delete_desc" : "This action cannot be undone. This will permanently delete {count} selected log(s)." ,
"cancel" : "Cancel" ,
"delete" : "Delete" ,
"level" : "Level" ,
"status" : "Status" ,
"source" : "Source" ,
"message" : "Message" ,
"created_at" : "Created At" ,
"actions" : "Actions" ,
"system" : "System" ,
"filter_by_message" : "Filter by message..." ,
"filter_by" : "Filter by" ,
"total_logs" : "Total Logs" ,
"active_tasks" : "Active Tasks" ,
"success_rate" : "Success Rate" ,
"recent_failures" : "Recent Failures" ,
"last_hours" : "Last {hours} hours" ,
"currently_running" : "Currently running" ,
"successful" : "successful" ,
"need_attention" : "Need attention" ,
"no_logs" : "No logs found" ,
"loading" : "Loading logs..." ,
"error_loading" : "Error loading logs" ,
"columns" : "Columns" ,
"failed_load_summary" : "Failed to load summary" ,
"retry" : "Retry" ,
"view" : "View" ,
"toggle_columns" : "Toggle columns" ,
"rows_per_page" : "Rows per page" ,
"view_metadata" : "View Metadata" ,
"log_deleted_success" : "Log deleted successfully" ,
"log_deleted_error" : "Failed to delete log" ,
"confirm_delete_log_title" : "Are you sure?" ,
"confirm_delete_log_desc" : "This action cannot be undone. This will permanently delete the log entry." ,
"deleting" : "Deleting..."
} ,
"onboard" : {
"welcome_title" : "Welcome to SurfSense" ,
"welcome_subtitle" : "Let's configure your LLM configurations to get started" ,
"step_of" : "Step {current} of {total}" ,
"percent_complete" : "{percent}% Complete" ,
"add_llm_provider" : "Add LLM Provider" ,
"assign_llm_roles" : "Assign LLM Roles" ,
"setup_complete" : "Setup Complete" ,
"configure_first_provider" : "Configure your first model provider" ,
"assign_specific_roles" : "Assign specific roles to your LLM configurations" ,
"all_set" : "You're all set to start using SurfSense!" ,
"loading_config" : "Loading your configuration..." ,
"previous" : "Previous" ,
"next" : "Next" ,
"complete_setup" : "Complete Setup" ,
"add_provider_instruction" : "Add at least one LLM provider to continue. You can configure multiple providers and choose specific roles for each one in the next step." ,
"your_llm_configs" : "Your LLM Configurations" ,
"model" : "Model" ,
"language" : "Language" ,
"base" : "Base" ,
"add_provider_title" : "Add LLM Provider" ,
"add_provider_subtitle" : "Configure your first model provider to get started" ,
"add_provider_button" : "Add Provider" ,
"add_new_llm_provider" : "Add New LLM Provider" ,
"configure_new_provider" : "Configure a new language model provider for your AI assistant" ,
"config_name" : "Configuration Name" ,
"config_name_required" : "Configuration Name *" ,
"config_name_placeholder" : "e.g., My OpenAI GPT-4" ,
"provider" : "Provider" ,
"provider_required" : "Provider *" ,
"provider_placeholder" : "Select a provider" ,
"language_optional" : "Language (Optional)" ,
"language_placeholder" : "Select language" ,
"custom_provider_name" : "Custom Provider Name *" ,
"custom_provider_placeholder" : "e.g., my-custom-provider" ,
"model_name_required" : "Model Name *" ,
"model_name_placeholder" : "e.g., gpt-4" ,
"examples" : "Examples" ,
"api_key_required" : "API Key *" ,
"api_key_placeholder" : "Your API key" ,
"api_base_optional" : "API Base URL (Optional)" ,
"api_base_placeholder" : "e.g., https://api.openai.com/v1" ,
"adding" : "Adding..." ,
"add_provider" : "Add Provider" ,
"cancel" : "Cancel" ,
"assign_roles_instruction" : "Assign your LLM configurations to specific roles. Each role serves different purposes in your workflow." ,
"no_llm_configs_found" : "No LLM Configurations Found" ,
"add_provider_before_roles" : "Please add at least one LLM provider in the previous step before assigning roles." ,
"long_context_llm_title" : "Long Context LLM" ,
"long_context_llm_desc" : "Handles complex tasks requiring extensive context understanding and reasoning" ,
"long_context_llm_examples" : "Document analysis, research synthesis, complex Q&A" ,
"fast_llm_title" : "Fast LLM" ,
"fast_llm_desc" : "Optimized for quick responses and real-time interactions" ,
"fast_llm_examples" : "Quick searches, simple questions, instant responses" ,
"strategic_llm_title" : "Strategic LLM" ,
"strategic_llm_desc" : "Advanced reasoning for planning and strategic decision making" ,
"strategic_llm_examples" : "Planning workflows, strategic analysis, complex problem solving" ,
"use_cases" : "Use cases" ,
"assign_llm_config" : "Assign LLM Configuration" ,
"select_llm_config" : "Select an LLM configuration" ,
"assigned" : "Assigned" ,
"all_roles_assigned_saved" : "All roles assigned and saved!" ,
"progress" : "Progress" ,
"roles_assigned" : "{assigned} of {total} roles assigned"
} ,
"model_config" : {
"title" : "Model Configurations" ,
"subtitle" : "Manage your LLM provider configurations and API settings." ,
"refresh" : "Refresh" ,
"loading" : "Loading configurations..." ,
"total_configs" : "Total Configurations" ,
"unique_providers" : "Unique Providers" ,
"system_status" : "System Status" ,
"active" : "Active" ,
"your_configs" : "Your Configurations" ,
"manage_configs" : "Manage and configure your LLM providers" ,
"add_config" : "Add Configuration" ,
"no_configs" : "No Configurations Yet" ,
"no_configs_desc" : "Get started by adding your first LLM provider configuration to begin using the system." ,
"add_first_config" : "Add First Configuration" ,
"created" : "Created"
} ,
"breadcrumb" : {
"dashboard" : "Dashboard" ,
"search_space" : "Search Space" ,
"researcher" : "Researcher" ,
"documents" : "Documents" ,
"connectors" : "Connectors" ,
"podcasts" : "Podcasts" ,
"logs" : "Logs" ,
"chats" : "Chats" ,
"settings" : "Settings" ,
"upload_documents" : "Upload Documents" ,
"add_youtube" : "Add YouTube Videos" ,
"add_webpages" : "Add Webpages" ,
"add_connector" : "Add Connector" ,
"manage_connectors" : "Manage Connectors" ,
"edit_connector" : "Edit Connector" ,
"manage" : "Manage"
} ,
"sidebar" : {
"recent_chats" : "Recent Chats" ,
"search_chats" : "Search chats..." ,
"no_chats_found" : "No chats found" ,
"no_recent_chats" : "No recent chats" ,
"view_all_chats" : "View All Chats" ,
"search_space" : "Search Space"
} ,
"errors" : {
"something_went_wrong" : "Something went wrong" ,
"try_again" : "Please try again" ,
"not_found" : "Not found" ,
"unauthorized" : "Unauthorized" ,
"forbidden" : "Forbidden" ,
"server_error" : "Server error" ,
"network_error" : "Network error"
} ,
"homepage" : {
"hero_title_part1" : "The AI Workspace" ,
"hero_title_part2" : "Built for Teams" ,
"hero_description" : "Connect any LLM to your internal knowledge sources and chat with it in real time alongside your team." ,
"cta_start_trial" : "Start Free Trial" ,
"cta_explore" : "Explore" ,
"integrations_title" : "Integrations" ,
"integrations_subtitle" : "Integrate with your team's most important tools" ,
"features_title" : "Your Team's AI-Powered Knowledge Hub" ,
"features_subtitle" : "Powerful features designed to enhance collaboration, boost productivity, and streamline your workflow." ,
"feature_workflow_title" : "Streamlined Workflow" ,
"feature_workflow_desc" : "Centralize all your knowledge and resources in one intelligent workspace. Find what you need instantly and accelerate decision-making." ,
"feature_collaboration_title" : "Seamless Collaboration" ,
"feature_collaboration_desc" : "Work together effortlessly with real-time collaboration tools that keep your entire team aligned." ,
"feature_customizable_title" : "Fully Customizable" ,
"feature_customizable_desc" : "Choose from 100+ leading LLMs and seamlessly call any model on demand." ,
"cta_transform" : "Transform how your team" ,
"cta_transform_bold" : "discovers and collaborates" ,
"cta_unite_start" : "Unite your" ,
"cta_unite_knowledge" : "team's knowledge" ,
"cta_unite_middle" : "in one collaborative space with" ,
"cta_unite_search" : "intelligent search" ,
"cta_talk_to_us" : "Talk to us" ,
"features" : {
"find_ask_act" : {
"title" : "Find, Ask, Act" ,
"description" : "Get instant information, detailed updates, and cited answers across company and personal knowledge."
} ,
"real_time_collab" : {
"title" : "Work Together in Real Time" ,
"description" : "Transform your company docs into multiplayer spaces with live edits, synced content, and presence."
} ,
"beyond_text" : {
"title" : "Collaborate Beyond Text" ,
"description" : "Create podcasts and multimedia your team can comment on, share, and refine together."
} ,
"context_counts" : {
"title" : "Context Where It Counts" ,
"description" : "Add comments directly to your chats and docs for clear, in-the-moment feedback."
} ,
"citation_illustration_title" : "Citation feature illustration showing clickable source reference" ,
"referenced_chunk" : "Referenced Chunk" ,
"collab_illustration_label" : "Illustration of a realtime collaboration in a text editor." ,
"real_time" : "Real-time" ,
"collab_part1" : "collabo" ,
"collab_part2" : "orat" ,
"collab_part3" : "ion" ,
"annotation_illustration_label" : "Illustration of a text editor with annotation comments." ,
"add_context_with" : "Add context with" ,
"comments" : "comments" ,
"example_comment" : "Let's discuss this tomorrow!"
}
}
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
}