# Meertalige content

Sitetalen, taaladressen, vertaalde velden en interfaceteksten.

Een Nimbly-site kan in elk aantal talen draaien. Talen werken op drie niveaus: de site-instellingen, de adressen en de data.

## 1. Talen van de site

Zet de talen in de site-instellingen, `/nb-admin/settings`, of in `ext/data/.config/site`:

```json
{
  "languages": ["en", "nl"]
}
```

Codes hebben twee letters. De eerste taal is de terugvaltaal. Arabisch, Perzisch en Hebreeuws worden automatisch van rechts naar links gezet; de tekstrichting kun je per taal instellen in de instellingen.

## 2. Adressen

Elke taal krijgt een eigen voorvoegsel, als mappen in `ext/uri/`:

```text
ext/uri/en/index.tpl            /en/
ext/uri/en/about/index.tpl      /en/about
ext/uri/nl/index.tpl            /nl/
ext/uri/nl/over-ons/index.tpl   /nl/over-ons
```

De root stuurt bezoekers naar hun taal met `[#redirect [#detect-language#]#]` in `ext/uri/index.tpl`. De taal wordt gehaald uit het adres, dan uit `?lang=`, het domein en de browser, in die volgorde.

Talen mogen verschillen in structuur en adressen. Waar pagina's gelijk zijn, deel je de content via een template:

```html
[#page-about#]
```

in zowel `en/about/main.tpl` als `nl/over-ons/main.tpl`. Om een pagina aan zijn tegenhangers te koppelen, zet je `i18n-url.json` naast de `index.tpl`; `[#language-switch#]` linkt dan in elke taal naar de juiste pagina. Zie [Routing](/nl/docs/concepts/routing/).

## 3. Vertaalde data

Markeer de velden die per taal verschillen met `"i18n": true`, en noem de talen op de resource:

```json
{
  "languages": ["en", "nl"],
  "fields": {
    "title": {"name": "Title", "type": "text", "required": true, "i18n": true},
    "title_slug": {"name": "URL slug", "type": "slug", "source": "title"},
    "year": {"name": "Year", "type": "text"},
    "description": {"name": "Description", "type": "html", "buttons": "bold,italic", "i18n": true}
  }
}
```

Eén record bevat elke taal: `"title": {"en": "Harbour Atlas", "nl": "Havenatlas"}`. Velden zonder `i18n` worden gedeeld, zoals het jaar. Een slug die van een vertaalde titel is afgeleid, wordt mee vertaald.

Templates hoeven niet te veranderen: `[#get project.title#]` en `[#get-html project.description#]` tonen de huidige taal. Gebruik `lang=nl` om om een bepaalde taal te vragen. In de admin heeft elk vertaald veld een taalwisselaar, en redacteuren kunnen daar een veld met AI laten vertalen als er een OpenAI-sleutel is ingesteld.

## Interfaceteksten

Teksten die bij de interface horen, zoals knoppen en labels, gebruiken `[#text#]`:

```html
<button>[#text Read_more#]</button>
[#text str="Search projects"#]
```

Vertalingen staan in `ext/data/.i18n/text.<language>.po`:

```po
msgid "Read_more"
msgstr "Lees meer"
```

Draai `./nimbly build` nadat je de bestanden hebt aangepast.

## AI-vertaling sturen

Een veld kan instructies voor de AI-vertaling meekrijgen, gedeeld of per taal:

```json
"description": {
  "type": "html",
  "i18n": true,
  "ai_prompts": {
    "_all": ["The input and output are HTML. Keep every tag, link and image.", "The tone is clear and professional."],
    "nl": ["You translate to Dutch."]
  }
}
```

Vraag bij HTML-velden uitdrukkelijk om de markup te behouden.
