feat(i18n): add internationalization with DE, FR, ES, PT translations (#12)
Add a compile-time i18n system with 270 translation keys across 5 locales (EN, DE, FR, ES, PT). Translations are embedded via include_str! and parsed lazily into flat HashMaps with English fallback for missing keys. - Add src/i18n module with Locale enum, t()/tw() lookup functions, and tests - Add JSON translation files for all 5 locales under assets/i18n/ - Provide locale Signal via Dioxus context in App, persisted to localStorage - Replace all hardcoded UI strings across 33 component/page files - Add compact locale picker (globe icon + ISO alpha-2 code) in sidebar header - Add click-outside backdrop dismissal for locale dropdown Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Sharang Parnerkar <parnerkarsharang@gmail.com> Reviewed-on: #12
This commit was merged in pull request #12.
This commit is contained in:
302
assets/i18n/en.json
Normal file
302
assets/i18n/en.json
Normal file
@@ -0,0 +1,302 @@
|
||||
{
|
||||
"common": {
|
||||
"loading": "Loading...",
|
||||
"cancel": "Cancel",
|
||||
"save": "Save",
|
||||
"delete": "Delete",
|
||||
"send": "Send",
|
||||
"close": "Close",
|
||||
"login": "Login",
|
||||
"logout": "Logout",
|
||||
"on": "ON",
|
||||
"off": "OFF",
|
||||
"online": "Online",
|
||||
"offline": "Offline",
|
||||
"settings": "Settings",
|
||||
"search": "Search",
|
||||
"rename": "Rename",
|
||||
"copy": "Copy",
|
||||
"share": "Share",
|
||||
"edit": "Edit",
|
||||
"get_started": "Get Started",
|
||||
"coming_soon": "Coming Soon",
|
||||
"back_to_home": "Back to Home",
|
||||
"privacy_policy": "Privacy Policy",
|
||||
"impressum": "Impressum",
|
||||
"chunks": "chunks",
|
||||
"upload_file": "Upload File",
|
||||
"eur_per_month": "EUR / month",
|
||||
"up_to_seats": "Up to {n} seats",
|
||||
"unlimited_seats": "Unlimited seats",
|
||||
"set": "Set",
|
||||
"not_set": "Not set",
|
||||
"log_in": "Log In",
|
||||
"features": "Features",
|
||||
"how_it_works": "How It Works"
|
||||
},
|
||||
"nav": {
|
||||
"dashboard": "Dashboard",
|
||||
"providers": "Providers",
|
||||
"chat": "Chat",
|
||||
"tools": "Tools",
|
||||
"knowledge_base": "Knowledge Base",
|
||||
"developer": "Developer",
|
||||
"organization": "Organization",
|
||||
"switch_light": "Switch to light mode",
|
||||
"switch_dark": "Switch to dark mode",
|
||||
"github": "GitHub",
|
||||
"agents": "Agents",
|
||||
"flow": "Flow",
|
||||
"analytics": "Analytics",
|
||||
"pricing": "Pricing"
|
||||
},
|
||||
"auth": {
|
||||
"redirecting_login": "Redirecting to login...",
|
||||
"redirecting_secure": "Redirecting to secure login page...",
|
||||
"auth_error": "Authentication error: {msg}",
|
||||
"log_in": "Login"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Dashboard",
|
||||
"subtitle": "AI news and updates",
|
||||
"topic_placeholder": "Topic name...",
|
||||
"ollama_settings": "Ollama Settings",
|
||||
"settings_hint": "Leave empty to use OLLAMA_URL / OLLAMA_MODEL from .env",
|
||||
"ollama_url": "Ollama URL",
|
||||
"ollama_url_placeholder": "Uses OLLAMA_URL from .env",
|
||||
"model": "Model",
|
||||
"model_placeholder": "Uses OLLAMA_MODEL from .env",
|
||||
"searching": "Searching...",
|
||||
"search_failed": "Search failed: {e}",
|
||||
"ollama_status": "Ollama Status",
|
||||
"trending": "Trending",
|
||||
"recent_searches": "Recent Searches"
|
||||
},
|
||||
"chat": {
|
||||
"new_chat": "New Chat",
|
||||
"general": "General",
|
||||
"conversations": "Conversations",
|
||||
"news_chats": "News Chats",
|
||||
"all_chats": "All Chats",
|
||||
"no_conversations": "No conversations yet",
|
||||
"type_message": "Type a message...",
|
||||
"model_label": "Model:",
|
||||
"no_models": "No models available",
|
||||
"send_to_start": "Send a message to start the conversation.",
|
||||
"you": "You",
|
||||
"assistant": "Assistant",
|
||||
"thinking": "Thinking...",
|
||||
"copy_response": "Copy last response",
|
||||
"copy_conversation": "Copy conversation",
|
||||
"edit_last": "Edit last message",
|
||||
"just_now": "just now",
|
||||
"minutes_ago": "{n}m ago",
|
||||
"hours_ago": "{n}h ago",
|
||||
"days_ago": "{n}d ago"
|
||||
},
|
||||
"providers": {
|
||||
"title": "Providers",
|
||||
"subtitle": "Configure your LLM and embedding backends",
|
||||
"provider": "Provider",
|
||||
"model": "Model",
|
||||
"embedding_model": "Embedding Model",
|
||||
"api_key": "API Key",
|
||||
"api_key_placeholder": "Enter API key...",
|
||||
"save_config": "Save Configuration",
|
||||
"config_saved": "Configuration saved.",
|
||||
"active_config": "Active Configuration",
|
||||
"embedding": "Embedding"
|
||||
},
|
||||
"tools": {
|
||||
"title": "Tools",
|
||||
"subtitle": "Manage MCP servers and tool integrations",
|
||||
"calculator": "Calculator",
|
||||
"calculator_desc": "Mathematical computation and unit conversion",
|
||||
"tavily": "Tavily Search",
|
||||
"tavily_desc": "AI-optimized web search API for real-time information",
|
||||
"searxng": "SearXNG",
|
||||
"searxng_desc": "Privacy-respecting metasearch engine",
|
||||
"file_reader": "File Reader",
|
||||
"file_reader_desc": "Read and parse local files in various formats",
|
||||
"code_executor": "Code Executor",
|
||||
"code_executor_desc": "Sandboxed code execution for Python and JavaScript",
|
||||
"web_scraper": "Web Scraper",
|
||||
"web_scraper_desc": "Extract structured data from web pages",
|
||||
"email_sender": "Email Sender",
|
||||
"email_sender_desc": "Send emails via configured SMTP server",
|
||||
"git_ops": "Git Operations",
|
||||
"git_ops_desc": "Interact with Git repositories for version control"
|
||||
},
|
||||
"knowledge": {
|
||||
"title": "Knowledge Base",
|
||||
"subtitle": "Manage documents for RAG retrieval",
|
||||
"search_placeholder": "Search files...",
|
||||
"name": "Name",
|
||||
"type": "Type",
|
||||
"size": "Size",
|
||||
"chunks": "Chunks",
|
||||
"uploaded": "Uploaded",
|
||||
"actions": "Actions"
|
||||
},
|
||||
"developer": {
|
||||
"agents_title": "Agent Builder",
|
||||
"agents_desc": "Build and manage AI agents with LangGraph. Create multi-step reasoning pipelines, tool-using agents, and autonomous workflows.",
|
||||
"launch_agents": "Launch Agent Builder",
|
||||
"flow_title": "Flow Builder",
|
||||
"flow_desc": "Design visual AI workflows with LangFlow. Drag-and-drop nodes to create data processing pipelines, prompt chains, and integration flows.",
|
||||
"launch_flow": "Launch Flow Builder",
|
||||
"analytics_title": "Analytics & Observability",
|
||||
"analytics_desc": "Monitor and analyze your AI pipelines with LangFuse. Track token usage, latency, costs, and quality metrics across all your deployments.",
|
||||
"launch_analytics": "Launch LangFuse",
|
||||
"total_requests": "Total Requests",
|
||||
"avg_latency": "Avg Latency",
|
||||
"tokens_used": "Tokens Used",
|
||||
"error_rate": "Error Rate"
|
||||
},
|
||||
"org": {
|
||||
"title": "Organization",
|
||||
"subtitle": "Manage members and billing",
|
||||
"invite_member": "Invite Member",
|
||||
"seats_used": "Seats Used",
|
||||
"of_tokens": "of {limit} tokens",
|
||||
"cycle_ends": "Cycle Ends",
|
||||
"name": "Name",
|
||||
"email": "Email",
|
||||
"role": "Role",
|
||||
"joined": "Joined",
|
||||
"invite_title": "Invite New Member",
|
||||
"email_address": "Email Address",
|
||||
"email_placeholder": "colleague@company.com",
|
||||
"send_invite": "Send Invite",
|
||||
"pricing_title": "Pricing",
|
||||
"pricing_subtitle": "Choose the plan that fits your organization"
|
||||
},
|
||||
"pricing": {
|
||||
"starter": "Starter",
|
||||
"team": "Team",
|
||||
"enterprise": "Enterprise",
|
||||
"up_to_users": "Up to {n} users",
|
||||
"unlimited_users": "Unlimited users",
|
||||
"llm_provider_1": "1 LLM provider",
|
||||
"all_providers": "All LLM providers",
|
||||
"tokens_100k": "100K tokens/month",
|
||||
"tokens_1m": "1M tokens/month",
|
||||
"unlimited_tokens": "Unlimited tokens",
|
||||
"community_support": "Community support",
|
||||
"priority_support": "Priority support",
|
||||
"dedicated_support": "Dedicated support",
|
||||
"basic_analytics": "Basic analytics",
|
||||
"advanced_analytics": "Advanced analytics",
|
||||
"full_observability": "Full observability",
|
||||
"custom_mcp": "Custom MCP tools",
|
||||
"sso": "SSO integration",
|
||||
"custom_integrations": "Custom integrations",
|
||||
"sla": "SLA guarantee",
|
||||
"on_premise": "On-premise deployment"
|
||||
},
|
||||
"landing": {
|
||||
"badge": "Privacy-First GenAI Infrastructure",
|
||||
"hero_title_1": "Your AI. Your Data.",
|
||||
"hero_title_2": "Your Infrastructure.",
|
||||
"hero_subtitle": "Self-hosted, GDPR-compliant generative AI platform for enterprises that refuse to compromise on data sovereignty. Deploy LLMs, agents, and MCP servers on your own terms.",
|
||||
"learn_more": "Learn More",
|
||||
"social_proof": "Built for enterprises that value ",
|
||||
"data_sovereignty": "data sovereignty",
|
||||
"on_premise": "On-Premise",
|
||||
"compliant": "Compliant",
|
||||
"data_residency": "Data Residency",
|
||||
"third_party": "Third-Party Sharing",
|
||||
"features_title": "Everything You Need",
|
||||
"features_subtitle": "A complete, self-hosted GenAI stack under your full control.",
|
||||
"feat_infra_title": "Self-Hosted Infrastructure",
|
||||
"feat_infra_desc": "Deploy on your own hardware or private cloud. Full control over your AI stack with no external dependencies.",
|
||||
"feat_gdpr_title": "GDPR Compliant",
|
||||
"feat_gdpr_desc": "EU data residency guaranteed. Your data never leaves your infrastructure or gets shared with third parties.",
|
||||
"feat_llm_title": "LLM Management",
|
||||
"feat_llm_desc": "Deploy, monitor, and manage multiple language models. Switch between models with zero downtime.",
|
||||
"feat_agent_title": "Agent Builder",
|
||||
"feat_agent_desc": "Create custom AI agents with integrated Langchain and Langfuse for full observability and control.",
|
||||
"feat_mcp_title": "MCP Server Management",
|
||||
"feat_mcp_desc": "Manage Model Context Protocol servers to extend your AI capabilities with external tool integrations.",
|
||||
"feat_api_title": "API Key Management",
|
||||
"feat_api_desc": "Generate API keys, track usage per seat, and set fine-grained permissions for every integration.",
|
||||
"how_title": "Up and Running in Minutes",
|
||||
"how_subtitle": "Three steps to sovereign AI infrastructure.",
|
||||
"step_deploy": "Deploy",
|
||||
"step_deploy_desc": "Install CERTifAI on your infrastructure with a single command. Supports Docker, Kubernetes, and bare metal.",
|
||||
"step_configure": "Configure",
|
||||
"step_configure_desc": "Connect your identity provider, select your models, and set up team permissions through the admin dashboard.",
|
||||
"step_scale": "Scale",
|
||||
"step_scale_desc": "Add users, deploy more models, and integrate with your existing tools via API keys and MCP servers.",
|
||||
"cta_title": "Ready to take control of your AI infrastructure?",
|
||||
"cta_subtitle": "Start deploying sovereign GenAI today. No credit card required.",
|
||||
"get_started_free": "Get Started Free",
|
||||
"footer_tagline": "Sovereign GenAI infrastructure for enterprises.",
|
||||
"product": "Product",
|
||||
"legal": "Legal",
|
||||
"resources": "Resources",
|
||||
"documentation": "Documentation",
|
||||
"api_reference": "API Reference",
|
||||
"support": "Support",
|
||||
"copyright": "2026 CERTifAI. All rights reserved."
|
||||
},
|
||||
"article": {
|
||||
"read_original": "Read original article",
|
||||
"summarizing": "Summarizing...",
|
||||
"summarized_with_ai": "Summarized with AI",
|
||||
"ask_followup": "Ask a follow-up question..."
|
||||
},
|
||||
"impressum": {
|
||||
"title": "Impressum",
|
||||
"info_tmg": "Information according to 5 TMG",
|
||||
"company": "CERTifAI GmbH",
|
||||
"address_street": "Musterstrasse 1",
|
||||
"address_city": "10115 Berlin",
|
||||
"address_country": "Germany",
|
||||
"represented_by": "Represented by",
|
||||
"managing_director": "Managing Director: [Name]",
|
||||
"contact": "Contact",
|
||||
"email": "Email: info@certifai.example",
|
||||
"phone": "Phone: +49 (0) 30 1234567",
|
||||
"commercial_register": "Commercial Register",
|
||||
"registered_at": "Registered at: Amtsgericht Berlin-Charlottenburg",
|
||||
"registration_number": "Registration number: HRB XXXXXX",
|
||||
"vat_id": "VAT ID",
|
||||
"vat_number": "VAT identification number according to 27a UStG: DE XXXXXXXXX",
|
||||
"responsible_content": "Responsible for content according to 55 Abs. 2 RStV"
|
||||
},
|
||||
"privacy": {
|
||||
"title": "Privacy Policy",
|
||||
"last_updated": "Last updated: February 2026",
|
||||
"intro_title": "1. Introduction",
|
||||
"intro_text": "CERTifAI GmbH (\"we\", \"our\", \"us\") is committed to protecting your personal data. This privacy policy explains how we collect, use, and safeguard your information when you use our platform.",
|
||||
"controller_title": "2. Data Controller",
|
||||
"controller_address": "Musterstrasse 1, 10115 Berlin, Germany",
|
||||
"controller_email": "Email: privacy@certifai.example",
|
||||
"data_title": "3. Data We Collect",
|
||||
"data_intro": "We collect only the minimum data necessary to provide our services:",
|
||||
"data_account_label": "Account data: ",
|
||||
"data_account_text": "Name, email address, and organization details provided during registration.",
|
||||
"data_usage_label": "Usage data: ",
|
||||
"data_usage_text": "API call logs, token counts, and feature usage metrics for billing and analytics.",
|
||||
"data_technical_label": "Technical data: ",
|
||||
"data_technical_text": "IP addresses, browser type, and session identifiers for security and platform stability.",
|
||||
"use_title": "4. How We Use Your Data",
|
||||
"use_1": "To provide and maintain the CERTifAI platform",
|
||||
"use_2": "To manage your account and subscription",
|
||||
"use_3": "To communicate service updates and security notices",
|
||||
"use_4": "To comply with legal obligations",
|
||||
"storage_title": "5. Data Storage and Sovereignty",
|
||||
"storage_text": "CERTifAI is a self-hosted platform. All AI workloads, model data, and inference results remain entirely within your own infrastructure. We do not access, store, or process your AI data on our servers.",
|
||||
"rights_title": "6. Your Rights (GDPR)",
|
||||
"rights_intro": "Under the GDPR, you have the right to:",
|
||||
"rights_access": "Access your personal data",
|
||||
"rights_rectify": "Rectify inaccurate data",
|
||||
"rights_erasure": "Request erasure of your data",
|
||||
"rights_restrict": "Restrict or object to processing",
|
||||
"rights_portability": "Data portability",
|
||||
"rights_complaint": "Lodge a complaint with a supervisory authority",
|
||||
"contact_title": "7. Contact",
|
||||
"contact_text": "For privacy-related inquiries, contact us at privacy@certifai.example."
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user