escalated-dev/locale
Central source of truth for Escalated translations. Consolidates locale catalogs from the Vue frontend and framework plugins into canonical locales/{locale}.json files, then republishes them as npm, Composer, RubyGem, PyPI, Maven, NuGet, Hex, and Go packages.
Website: escalated.dev
escalated-locale is the central source of truth for Escalated translations. It consolidates locale catalogs from the Vue frontend and the framework plugins into a single canonical locales/{locale}.json set, then republishes that data through thin ecosystem-specific packages.
portfolio source repos
-> escalated-locale/locales/*.json
-> npm package (@escalated-dev/locale)
-> Composer package (escalated-dev/locale)
-> RubyGem (escalated-locale)
-> PyPI package (escalated-locale)
-> Maven package (dev.escalated:escalated-locale)
-> NuGet package (Escalated.Locale)
-> Hex package (:escalated_locale)
-> Go module (github.com/escalated-dev/escalated-locale/packages/go)
-> consumed by framework plugins
-> merged with repo-local overrides at app boot
locales/en.json directly if the central package is now the canonical owner.python scripts/build_locales.py (regenerates the canonical JSON from upstream sources, if needed).bash scripts/sync.sh (Linux/macOS/git-bash) or pwsh ./scripts/sync.ps1 (Windows). Both write the same outputs — JSON copies into each packages/*/ plus framework-native artifacts (Rails YAML, Django/WP gettext, Symfony YAML, Spring properties, Phoenix .po) via scripts/build_native_artifacts.py.locales/en.json to locales/{locale}.json.bash scripts/sync.sh (or pwsh ./scripts/sync.ps1).Each plugin should load the package locale data first, then layer its own framework-local overrides on top. The plugin remains free to keep framework-specific translations or emergency patches in its own repo; the central package provides the base catalog and fallback chain.
ar, de, en, es, fr, it, ja, ko, nl, pl, pt-BR, ru, tr, zh-CN. New locales are added by copying en.json.{name} (curly-brace named tokens, e.g. "Welcome {firstName}"). The wrapper t() helpers interpolate these.ticket.status.open).djangoStrings.* and WordPress strings under wordpressStrings.*, keyed deterministically from the English msgid.const { getLocaleData, t } = require('@escalated-dev/locale')
const messages = getLocaleData('fr')
const label = t('ticket.subject', 'fr')
use Escalated\Locale\Locale;
$messages = Locale::getLocaleData('fr');
$label = Locale::translate('ticket.subject', 'fr');
require "escalated/locale"
messages = Escalated::Locale.get_locale_data("fr")
label = Escalated::Locale.t("ticket.subject", "fr")
import dev.escalated.locale.Locale;
Map<String, Object> messages = Locale.getLocaleData("fr");
String label = Locale.translate("ticket.subject", "fr", Map.of());
using Escalated.Locale;
var messages = LocaleData.GetLocaleData("fr");
var label = LocaleData.Translate("ticket.subject", "fr");
messages = Escalated.Locale.get_locale_data("fr")
label = Escalated.Locale.t("ticket.subject", "fr")
from escalated_locale import get_locale_data, get_django_locale_path
messages = get_locale_data("fr") # returns dict from locales/fr.json
# In Django settings.py, layer this dir into LOCALE_PATHS so
# escalated_locale/locale/<lang>/LC_MESSAGES/django.{po,mo} is picked up
# by gettext.
LOCALE_PATHS = [
BASE_DIR / "locale", # project overrides (highest priority)
str(get_django_locale_path()),
]
import escalatedlocale "github.com/escalated-dev/escalated-locale/packages/go"
messages := escalatedlocale.GetLocaleData("fr")
label, _ := escalatedlocale.Translate("ticket.subject", "fr", nil)
Semantic versioning applies to the canonical JSON keys and wrapper APIs:
How can I help you explore Laravel packages today?