Drupal is a registered trademark of Dries Buytaert
Drupal 11.4.3 Update released for Drupal core (11.4.3)! Webform 6.2.11 Minor update available for module webform (6.2.11). Mailer Plus Log 1.2.6 Minor update available for module symfony_mailer_log (1.2.6). Burndown 1.0.66 Minor update available for module burndown (1.0.66). Icons 2.3.2 Minor update available for module icons (2.3.2). LocalGov News 2.5.3 Minor update available for module localgov_news (2.5.3). LocalGov Guides 2.2.4 Minor update available for module localgov_guides (2.2.4). LocalGov Services 2.2.6 Minor update available for module localgov_services (2.2.6). Menu Admin per Menu Module menu_admin_per_menu crossed 50,000 active installs. Visitors (Web Analytics) 8.x-2.33 Module visitors updated after 9 months of inactivity (8.x-2.33).

Drupal core's JSON:API serves the language-negotiated translation of an entity and exposes no way to address a single translation. JSON:API Multilingual adds per-translation GET, POST, PATCH, and DELETE on the existing resource URLs.

The target language is selected per request, not by URL prefix: a langCode query parameter, the Content-Language header on writes, or Accept-Language for negotiated reads. Responses set Content-Language, advertise available translations as hreflang links, and add Accept-Language to Vary. The contract does not depend on the site's language negotiation, so it behaves the same on any multilingual setup.

Endpoints

  • Read a translation: GET /jsonapi/node/article/{uuid}?langCode=de returns that translation (404 if it does not exist). Omit langCode and send Accept-Language to negotiate, with fallback to an existing translation.
  • Create a translation of an existing entity: POST /jsonapi/node/article/{uuid} with Content-Language: de (409 if it already exists; only translatable fields may be written).
  • Update one translation: PATCH /jsonapi/node/article/{uuid}?langCode=de changes that translation only (404 if it does not exist; use POST to create).
  • Delete one translation: DELETE /jsonapi/node/article/{uuid} with Content-Language: de (400 for the default translation). Without a language, the whole entity is deleted, matching core.
curl 'https://example.com/jsonapi/node/article/{uuid}?langCode=de' \
  -H 'Accept: application/vnd.api+json'
# 200 OK, Content-Language: de, data.attributes.langcode == "de"

JSON:API: writes are gated by jsonapi.settings.read_only (405 when read-only) and per-translation entity access is enforced.

JSON:API Multilingual is a forward-compatible implementation of core issue #3199697 and mirrors that merge request's HTTP contract.

Much of the code for this module has been created through AI assistance or generation, and has been spec'ed, reviewed, tested, and updated by real people.

Activity

Total releases
2
First release
Jul 2026
Latest release
2 hours ago
Releases (12 mo)
2 ▲ from 0
Maintenance
Active

Releases

Version Type Release date
1.0.0-alpha1 Pre-release Jul 14, 2026
1.0.x-dev Dev Jul 14, 2026