mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-26 09:52:11 +03:00
feat(i18n): expand locale coverage with nine new language packs
Add Bengali, Persian, Gujarati, Indonesian alt, Marathi, Swahili, Tamil, Telugu, and Urdu message bundles to the app's locale configuration. Extend RTL locale support for Persian and Urdu and update project docs to reflect the broader 40+ language availability.
This commit is contained in:
@@ -15,7 +15,7 @@ with **MCP Server** (29 tools), **A2A v0.3 Protocol**, and **Electron desktop ap
|
||||
- **Database**: better-sqlite3 (SQLite) — `DATA_DIR` configurable, default `~/.omniroute/`
|
||||
- **Streaming**: SSE via `open-sse` internal workspace package
|
||||
- **Styling**: Tailwind CSS v4
|
||||
- **i18n**: next-intl with 30 languages
|
||||
- **i18n**: next-intl with 40+ languages
|
||||
- **Desktop**: Electron (cross-platform: Windows, macOS, Linux)
|
||||
- **Schemas**: Zod v4 for all API / MCP input validation
|
||||
|
||||
|
||||
@@ -420,9 +420,9 @@ Teams in non-English-speaking countries, especially in Latin America, Asia, and
|
||||
|
||||
**How OmniRoute solves it:**
|
||||
|
||||
- **Dashboard i18n — 30 Languages** — All 500+ keys translated including Arabic, Bulgarian, Danish, German, Spanish, Finnish, French, Hebrew, Hindi, Hungarian, Indonesian, Italian, Japanese, Korean, Malay, Dutch, Norwegian, Polish, Portuguese (PT/BR), Romanian, Russian, Slovak, Swedish, Thai, Ukrainian, Vietnamese, Chinese, Filipino, English
|
||||
- **RTL Support** — Right-to-left support for Arabic and Hebrew
|
||||
- **Multi-Language READMEs** — 30 complete documentation translations
|
||||
- **Dashboard i18n — 40+ Languages** — All 500+ keys translated including Arabic, Bengali, Bulgarian, Czech, Danish, German, Spanish, Persian, Finnish, French, Gujarati, Hebrew, Hindi, Hungarian, Indonesian, Italian, Japanese, Korean, Marathi, Malay, Dutch, Norwegian, Polish, Portuguese (PT/BR), Romanian, Russian, Slovak, Swedish, Swahili, Tamil, Telugu, Thai, Turkish, Ukrainian, Urdu, Vietnamese, Chinese, Filipino, English
|
||||
- **RTL Support** — Right-to-left support for Arabic, Persian, Hebrew, and Urdu
|
||||
- **Multi-Language READMEs** — 40+ complete documentation translations
|
||||
- **Language Selector** — Globe icon in header for real-time switching
|
||||
|
||||
</details>
|
||||
@@ -1511,7 +1511,7 @@ OmniRoute v3.6 is built as an operational platform, not just a relay proxy.
|
||||
| 🔧 **CLI Tools Dashboard** | One-click setup for popular coding tools |
|
||||
| 🎮 **Model Playground** | Test any provider/model/endpoint from the dashboard |
|
||||
| 🔏 **CLI Fingerprint Toggle** | Per-provider fingerprint matching in Settings > Security |
|
||||
| 🌐 **i18n (30 languages)** | Full dashboard + docs language support with RTL coverage |
|
||||
| 🌐 **i18n (40+ languages)** | Full dashboard + docs language support with RTL coverage |
|
||||
| 🧹 **Clear All Models** | One-click model list clearing in provider details |
|
||||
| 👁️ **Sidebar Controls** 🆕 | Hide components and integrations from Appearance Settings |
|
||||
| 📋 **Issue Templates** | Standardized GitHub templates for bugs and features |
|
||||
|
||||
8
llm.txt
8
llm.txt
@@ -22,7 +22,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
|
||||
- **Background jobs:** Custom token health check scheduler, 24h model auto-sync
|
||||
- **Streaming:** Server-Sent Events (SSE) for real-time proxy responses
|
||||
- **Proxy engine:** Custom pipeline with format translation, circuit breaker, rate limiting, auto-combo engine
|
||||
- **i18n:** next-intl with 30 languages
|
||||
- **i18n:** next-intl with 40+ languages
|
||||
- **Desktop:** Electron (cross-platform: Windows, macOS, Linux)
|
||||
- **Package:** Published on npm (`omniroute`) and Docker Hub (`diegosouzapw/omniroute`)
|
||||
|
||||
@@ -94,7 +94,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
|
||||
│ │ ├── configAudit.ts # Configuration auditing
|
||||
│ │ └── responses.ts # Domain response types
|
||||
│ ├── i18n/ # Internationalization
|
||||
│ │ └── messages/ # 30 language JSON files
|
||||
│ │ └── messages/ # 40+ language JSON files
|
||||
│ ├── lib/ # Core libraries
|
||||
│ │ ├── a2a/ # Agent-to-Agent v0.3 protocol server
|
||||
│ │ │ ├── skills/ # A2A skills (quotaManagement, smartRouting)
|
||||
@@ -370,8 +370,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
|
||||
**Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs
|
||||
|
||||
### Internationalization
|
||||
- 30 languages for UI (all dashboard pages)
|
||||
- 30 translated documentation sets in docs/i18n/
|
||||
- 40+ languages for UI (all dashboard pages)
|
||||
- 40 translated documentation sets in docs/i18n/
|
||||
- Language switcher in documentation
|
||||
|
||||
## Key Architectural Decisions
|
||||
|
||||
@@ -1,20 +1,25 @@
|
||||
export const LOCALES = [
|
||||
"ar",
|
||||
"bg",
|
||||
"bn",
|
||||
"cs",
|
||||
"da",
|
||||
"de",
|
||||
"en",
|
||||
"es",
|
||||
"fa",
|
||||
"fi",
|
||||
"fr",
|
||||
"gu",
|
||||
"he",
|
||||
"hi",
|
||||
"hu",
|
||||
"id",
|
||||
"hi",
|
||||
"in",
|
||||
"it",
|
||||
"ja",
|
||||
"ko",
|
||||
"mr",
|
||||
"ms",
|
||||
"nl",
|
||||
"no",
|
||||
@@ -26,9 +31,13 @@ export const LOCALES = [
|
||||
"ru",
|
||||
"sk",
|
||||
"sv",
|
||||
"sw",
|
||||
"ta",
|
||||
"te",
|
||||
"th",
|
||||
"tr",
|
||||
"uk-UA",
|
||||
"ur",
|
||||
"vi",
|
||||
"zh-CN",
|
||||
] as const;
|
||||
@@ -43,20 +52,25 @@ export const LANGUAGES: readonly {
|
||||
}[] = [
|
||||
{ code: "ar", label: "AR", name: "العربية", flag: "🇸🇦" },
|
||||
{ code: "bg", label: "BG", name: "Български", flag: "🇧🇬" },
|
||||
{ code: "bn", label: "BN", name: "বাংলা", flag: "🇧🇩" },
|
||||
{ code: "cs", label: "CS", name: "Čeština", flag: "🇨🇿" },
|
||||
{ code: "da", label: "DA", name: "Dansk", flag: "🇩🇰" },
|
||||
{ code: "de", label: "DE", name: "Deutsch", flag: "🇩🇪" },
|
||||
{ code: "en", label: "EN", name: "English", flag: "🇺🇸" },
|
||||
{ code: "es", label: "ES", name: "Español", flag: "🇪🇸" },
|
||||
{ code: "fa", label: "FA", name: "فارسی", flag: "🇮🇷" },
|
||||
{ code: "fi", label: "FI", name: "Suomi", flag: "🇫🇮" },
|
||||
{ code: "fr", label: "FR", name: "Français", flag: "🇫🇷" },
|
||||
{ code: "gu", label: "GU", name: "ગુજરાતી", flag: "🇮🇳" },
|
||||
{ code: "he", label: "HE", name: "עברית", flag: "🇮🇱" },
|
||||
{ code: "hi", label: "HI", name: "हिन्दी", flag: "🇮🇳" },
|
||||
{ code: "hu", label: "HU", name: "Magyar", flag: "🇭🇺" },
|
||||
{ code: "id", label: "ID", name: "Bahasa Indonesia", flag: "🇮🇩" },
|
||||
{ code: "hi", label: "HI", name: "हिन्दी", flag: "🇮🇳" },
|
||||
{ code: "in", label: "IN", name: "Bahasa Indonesia (Alt)", flag: "🇮🇩" },
|
||||
{ code: "it", label: "IT", name: "Italiano", flag: "🇮🇹" },
|
||||
{ code: "ja", label: "JA", name: "日本語", flag: "🇯🇵" },
|
||||
{ code: "ko", label: "KO", name: "한국어", flag: "🇰🇷" },
|
||||
{ code: "mr", label: "MR", name: "मराठी", flag: "🇮🇳" },
|
||||
{ code: "ms", label: "MS", name: "Bahasa Melayu", flag: "🇲🇾" },
|
||||
{ code: "nl", label: "NL", name: "Nederlands", flag: "🇳🇱" },
|
||||
{ code: "no", label: "NO", name: "Norsk", flag: "🇳🇴" },
|
||||
@@ -68,13 +82,17 @@ export const LANGUAGES: readonly {
|
||||
{ code: "ru", label: "RU", name: "Русский", flag: "🇷🇺" },
|
||||
{ code: "sk", label: "SK", name: "Slovenčina", flag: "🇸🇰" },
|
||||
{ code: "sv", label: "SV", name: "Svenska", flag: "🇸🇪" },
|
||||
{ code: "sw", label: "SW", name: "Kiswahili", flag: "🇰🇪" },
|
||||
{ code: "ta", label: "TA", name: "தமிழ்", flag: "🇮🇳" },
|
||||
{ code: "te", label: "TE", name: "తెలుగు", flag: "🇮🇳" },
|
||||
{ code: "th", label: "TH", name: "ไทย", flag: "🇹🇭" },
|
||||
{ code: "tr", label: "TR", name: "Türkçe", flag: "🇹🇷" },
|
||||
{ code: "uk-UA", label: "UK-UA", name: "Українська", flag: "🇺🇦" },
|
||||
{ code: "ur", label: "UR", name: "اردو", flag: "🇵🇰" },
|
||||
{ code: "vi", label: "VI", name: "Tiếng Việt", flag: "🇻🇳" },
|
||||
{ code: "zh-CN", label: "ZH-CN", name: "中文 (简体)", flag: "🇨🇳" },
|
||||
] as const;
|
||||
|
||||
export const RTL_LOCALES = ["ar", "he"] as const;
|
||||
export const RTL_LOCALES = ["ar", "fa", "he", "ur"] as const;
|
||||
|
||||
export const LOCALE_COOKIE = "NEXT_LOCALE";
|
||||
|
||||
4710
src/i18n/messages/bn.json
Normal file
4710
src/i18n/messages/bn.json
Normal file
File diff suppressed because it is too large
Load Diff
4710
src/i18n/messages/fa.json
Normal file
4710
src/i18n/messages/fa.json
Normal file
File diff suppressed because it is too large
Load Diff
4710
src/i18n/messages/gu.json
Normal file
4710
src/i18n/messages/gu.json
Normal file
File diff suppressed because it is too large
Load Diff
4710
src/i18n/messages/in.json
Normal file
4710
src/i18n/messages/in.json
Normal file
File diff suppressed because it is too large
Load Diff
4710
src/i18n/messages/mr.json
Normal file
4710
src/i18n/messages/mr.json
Normal file
File diff suppressed because it is too large
Load Diff
4710
src/i18n/messages/sw.json
Normal file
4710
src/i18n/messages/sw.json
Normal file
File diff suppressed because it is too large
Load Diff
4710
src/i18n/messages/ta.json
Normal file
4710
src/i18n/messages/ta.json
Normal file
File diff suppressed because it is too large
Load Diff
4710
src/i18n/messages/te.json
Normal file
4710
src/i18n/messages/te.json
Normal file
File diff suppressed because it is too large
Load Diff
4710
src/i18n/messages/ur.json
Normal file
4710
src/i18n/messages/ur.json
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user