A group of translation keys shipped together, typically per feature, page, or release.
A translation bundle is the complete set of translated strings for one locale: every key the product uses, paired with the words for that language and region. It is the unit that ships, the file a translator is handed, and the thing whose completeness decides whether a locale is ready to launch.
Bundles are the practical form of the oldest rule in internationalisation: keep the words out of the code. The i18n discipline named at Digital Equipment Corporation in the 1980s externalises strings into resource files addressed by key, and a bundle is one such file scoped to a single locale. Java called them resource bundles; the .NET world used resource files; web stacks settled on JSON or YAML catalogues. The shape differs, the idea holds: one bundle per locale, the same keys across all of them.
The workflow around bundles standardised into three moves. Extract pulls every translatable key from the source into a base bundle. Translate hands that bundle to a translator or service, producing a locale variantVariantGrowthA variant in an A/B testView reference →. Merge folds the returned strings back in, reconciling new keys added since extraction. Modern translation-management platforms automate the round trip, and formats like ICU MessageFormat let a single bundle entry carry the plural and gender variants a language needsNeedUserA user need, pain, desire, or constraintView reference →, so the bundle stays the unit even when individual messages get grammatically complex.
A product holds 1,200 keys in its base en bundle. To add Japanese, a build step extracts those keys into a ja skeleton and sends it for translation. The returned ja bundle comes back with 1,180 strings filled and 20 left as fallbacks, because new keys landed mid-cycle. The merge step flags those 20 as untranslated. The launch gate is simple: a bundle below full coverage shows English text in the gaps, so the team either finishes the 20 or accepts the fallback before flipping ja-JP live. A specific screen, say checkout, can be wired to its bundle so that screen's readiness is checkable on its own.
screen_translated_via_translation_bundleScreentranslated viaTranslation Bundlecross-domain, which lets translation readiness be tracked per surface rather than only per locale.In the Unified Product Graph, a translation bundle is the hub of the localisation region. It connects upward to its locale through Localetranslated viaTranslation Bundlehierarchy, downward to its entries through locale_translated_via_translation_bundleTranslation BundlecontainsTranslation Keyhierarchy, and outward to the surfaces it serves through translation_bundle_contains_translation_keyScreentranslated viaTranslation Bundlecross-domain. That three-way wiring is what makes coverage answerable: walk from a locale to its bundle, count the keys present against the base, and the graph reports exactly how localised that locale is, and which screens are still showing fallback text.screen_translated_via_translation_bundle
Type-specific fields on BaseNode
bundle_scopestringBundle scope. Closed set of common translation bundle groupings. Use `'other'` for product-specific module bundles.
last_syncedstringISO timestamp of the last sync with the translation service
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
4 phases — initial: draft · template: PUBLISHING
3 edge types connected to this entity.
locale_translated_via_translation_bundletranslation_bundle_contains_translation_keyscreen_translated_via_translation_bundle