Multi-Language Support
Serve documentation in multiple languages with a language switcher. Each language gets its own navigation structure and translated content.
If your docs need to reach users in more than one language, you can define separate navigation trees per locale and let readers switch with a dropdown in the top bar.
Configuration
Wrap your navigation in a languages array, with each language containing its own navigation structure:
{
"navigation": {
"languages": [
{
"language": "en",
"tabs": [
{
"tab": "Documentation",
"groups": [
{
"group": "Getting Started",
"pages": ["introduction", "quickstart"]
}
]
}
]
},
{
"language": "es",
"tabs": [
{
"tab": "Documentación",
"groups": [
{
"group": "Comenzar",
"pages": ["es/introduction", "es/quickstart"]
}
]
}
]
}
]
}
}Supported Languages
| Code | Language | Code | Language |
|---|---|---|---|
en | English | ko | Korean |
es | Spanish | pt-BR | Portuguese (Brazil) |
fr | French | ru | Russian |
de | German | ar | Arabic |
it | Italian | hi | Hindi |
jp | Japanese | id | Indonesian |
cn | Chinese (Simplified) | tr | Turkish |
zh-Hant | Chinese (Traditional) | vi | Vietnamese |
nl | Dutch | pl | Polish |
sv | Swedish | cs | Czech |
no | Norwegian | ro | Romanian |
he | Hebrew | ua | Ukrainian |
lv | Latvian | uz | Uzbek |
Directory Structure
Organize translated content in language-prefixed directories:
my-docs/
├── docs.json
├── introduction.mdx # English (default)
├── quickstart.mdx
├── es/
│ ├── introduction.mdx # Spanish
│ └── quickstart.mdx
├── fr/
│ ├── introduction.mdx # French
│ └── quickstart.mdx
└── de/
├── introduction.mdx # German
└── quickstart.mdx
Reference pages in navigation using their full path (with the language prefix):
{
"language": "es",
"tabs": [
{
"tab": "Documentación",
"groups": [
{
"group": "Comenzar",
"pages": ["es/introduction", "es/quickstart"]
}
]
}
]
}
Language-Specific Settings
Each language can have its own configuration:
{
"navigation": {
"languages": [
{
"language": "en",
"banner": {
"content": "Version 2.0 is now live! See our [changelog](/changelog).",
"dismissible": true
},
"tabs": [...]
},
{
"language": "es",
"banner": {
"content": "¡La versión 2.0 está disponible! Ver [registro de cambios](/es/changelog).",
"dismissible": true
},
"tabs": [...]
}
]
}
}
Default Language
The first language in the array is the default. Users landing on your docs see this language first. The language switcher allows them to change.
URL Structure
Language prefixes appear in URLs:
| Language | URL |
|---|---|
| English (default) | docs.example.com/introduction |
| Spanish | docs.example.com/es/introduction |
| French | docs.example.com/fr/introduction |
Partial Translations
You don't need to translate every page. If a page doesn't exist in a language, users see a fallback message with a link to the English version.
For pages that shouldn't be translated (like API reference), you can reference the same page across languages:
{
"language": "es",
"tabs": [
{
"tab": "API",
"groups": [
{
"group": "Endpoints",
"pages": ["api/users", "api/posts"] // Same as English
}
]
}
]
}
Translation Workflow
Write your docs in English first. This becomes your source of truth.
Create directories for each target language (es/, fr/, etc.).
Copy English files to language directories and translate. Keep filenames the same.
Add language entries to your navigation config.
RTL Languages
Right-to-left languages like Arabic and Hebrew are supported. Jamdesk automatically applies RTL styling when these languages are active.
