Skip to content

SPA Multilingual

Menu: Development → SPA Multilingual
Deep link: /_Admin/development/spamultilingual?SiteId={siteGuid}

Maintain key-value multilingual copy for single-page applications (SPA): edit translations per language in admin; front-end fetches JSON dictionary via /_spa/lang/{languageCode}. For Vue/React etc. managing UI language without Kooboo server template rendering.

Permissions

View list: spaMultilingual. Import, Settings (language columns), row Edit require spaMultilingual·edit; multi-select Delete requires spaMultilingual·delete.

vs Content → Labels

SPA Multilingual (this page)Content → Labels
ConsumptionFront-end requests /_spa/lang/{lang} for full JSON tableTemplates / KScript: k.label(), k.t()
Typical scenarioSPA, static front-end bundled in siteLayout / Page / View server rendering
Script APINo k.* read/write; see SPA Multilingual APIk.site.labels

Site page-level multilingual (routes, culture switch) is still in Site settings → Basic; see Pages and k-data · culture.

How to Open

  1. In Edit Menu, enable Development → SPA Multilingual.
  2. Open Development → SPA Multilingual in the left sidebar.
SPA multilingual list overview

Toolbar

ButtonPermissionDescription
ImportspaMultilingual·editOpen import dialog, batch write entries from JSON
Export allNo extra restrictionDownload all entries as translate-YYYYMMDD.json
SettingsspaMultilingual·editOpen language settings dialog, enable language columns

After list selection, toolbar shows Export selected (checked entries only).

SPA multilingual toolbar

List table

Columns from language settings: first language column header marked (default) = entry defaultLang; others are language codes (e.g. en, zh-cn).

ColumnDescription
NameEntry key (unique), JSON key; max 50 chars (validated on import)
Language columnsCopy for that key in each language; empty = untranslated
ActionsEdit opens edit entry dialog

Supports multi-select Delete entries.

SPA multilingual list

New entries

No separate Create on list; use Import for first or batch keys. Edit rows to complete translations.

Language settings dialog

Settings opens. Tag-style checkboxes for enabled language codes (aligned with Element Plus locales, e.g. en, zh-cn, zh-tw).

  • First language in list (column title "default") cannot be unchecked here — site default language column.
  • Save calls SetLang: adds/removes language keys on all entries; new languages start empty, fill in list or import.
Language settings dialog

Import dialog

AreaDescription
Submit modeReplace: overwrites existing translations for same key; Merge: only fills empty language fields
Content typeFile (.json) or Code (Monaco paste JSON)
ExampleDownload example.json

JSON structure: entry name → language code → copy:

json
{
  "welcome": {
    "en": "Welcome",
    "zh-cn": "欢迎"
  },
  "nav.home": {
    "en": "Home",
    "zh-cn": "首页"
  }
}
  • Each key (entry name) length ≤ 50.
  • Language codes normalized to lowercase (e.g. zh-cn).
  • Replace with existing data prompts confirmation to avoid accidental overwrite.
Import dialog

Edit entry dialog

Row Edit (title may show Settings). Textareas per enabled language; save updates that key (SpaMultilingual/post).

Front-end usage

After save, SPA requests at runtime (same origin):

http
GET /_spa/lang/{languageCode}

Example GET /_spa/lang/zh-cn returns:

json
{
  "welcome": "欢迎",
  "nav.home": "首页"
}
  • Missing translation for a key uses that entry's default language copy.
  • Response Content-Type: application/json; CORS headers (local debugging).
  • Server caches full table ~3 seconds in memory (per site Id).

Integration examples (Vue i18n, react-i18next, etc.): SPA Multilingual API.

DocDescription
SPA Multilingual API/_spa/lang/{lang} response and fallback
LabelsTemplate k.label()
k.label APIServer-side multilingual copy
Development overviewDevelopment menu index