Localization in Infinity 25: Bundles, not scattered rules

Infinity 25 changes localization in a big way. Instead of maintaining individual localization rules per view, portal, or paragraph, localization is now handled through bundles. A bundle is a centralized localization rule that aggregates labels for an application. Internally, bundles are instances of Rule-UI-Localization. This makes localization easier to manage, export, translate, and serve at runtime.

The three localization bundles in Infinity 25

Infinity 25 uses three bundle types.

1) Base bundle (system-generated)

The base bundle is the source-of-truth catalog of labels for the application.

  • Instance of: Rule-UI-Localization

  • Context: bundle

  • Label: typically <pyProductName>

  • Applies to: @baseclass

  • Creation:

    • Created when you run the Localization Wizard, or

    • From Application Definition → Generate base bundle

  • Used for:

    • Exporting labels to Excel/JSON via the wizard

    • Acting as the baseline for translation generation

  • Important: do not edit manually. Treat it as generated output.

2) Language bundle (runtime-served)

The language bundle stores translations and is what the runtime uses to render localized UI for a user.

  • Instance of: Rule-UI-Localization

  • Context: bundle

  • Label: typically <pyProductName>_<langCode> (example: AcmeClaims_fr-FR)

  • Applies to: @baseclass

  • Populated by: importing translated Excel/JSON

  • Runtime behavior:

    • Stored in language rulesets

    • Those rulesets are automatically applied to the user profile at runtime

3) Overrides bundle (client-owned extension)

The overrides bundle is a client-owned extension point. It’s where clients add their own message groups (like MESSAGES, STATUSWORK, etc.) so those labels participate in the standard export/import workflow.

  • Instance of: Rule-UI-Localization

  • Context: overrides

  • Label: client-defined

  • Applies to: @baseclass

  • Must be created by: the client

  • Critical ordering:

    • Create the overrides bundle before generating the base bundle

    • Select it in Application Definition → Localization Configurations → Overrides for localizatio

  • Language requirement: overrides must be authored in the base language (typically English)

  • Effect: labels from overrides are included when the base bundle is generated

Example overrides format:

{ "MESSAGES": { "my custom message": "my custom message" }, ... } 

Built-on applications: the recommended approach (centralized translations)

Bundle localization also changes how translation is handled in built-on stacks. To keep things simple and predictable, the recommended pattern is to centralize translations in the top-most application.

Example built-on stack

Layer Application Purpose
Top AcmeClaims Client-specific claims experience and UI customization
Middle ClaimsAccel Shared claims accelerators and patterns
Base Constellation / platform Constellation UI foundation

In this model:

  • Labels can originate in any layer (platform, accelerators, or client app).

  • Translation ownership stays in one place: the top-most application.

What you do

  1. Generate a base bundle for each application in the stack

    • ClaimsAccel → base bundle

    • AcmeClaims → base bundle
      (Base bundles are only applicable for Constellation-based apps.)

  2. Create language bundles only for the top-most application

    • Example: AcmeClaims_fr, AcmeClaims_de, etc.
  3. When generating translations from the top-most application, set:

    • Re-translate all layers = true

What this really means

  • The top app becomes the single place where translation files are produced and imported.

  • When labels change in lower layers, you regenerate translation inputs from the top and keep your workflow consistent.

  • Teams don’t have to coordinate translations per layer.

Migration From Infinity 24

Most existing applications will need a one-time migration step to move from legacy localization artifacts to bundles.

  • Migration activity: Rule-UI-Localization.pxMigrateToLocalizationV2

  • What it does: This will merge the existing translations to make it a bundle. Always provide the

  • When to run: Once environment is migrated.

  • Validation: Success message from the activity

If you’re working with library-sourced labels or conditional paragraphs in Constellation, I’ve written a step-by-step guide that shows exactly how to translate the generated HTML files in the language pack and get the results at runtime:
https://community.pega.com/conversations/user-experience/infinity-25-localization-guide%3A-translating-dynamic-text-rules-and-decisioned-paragraphs

Important notes :

  • During localization work, always use an open ruleset (or enable branching) so bundle generation and updates can be saved cleanly without ruleset lock issues.

  • Before you start, verify that the top-most ruleset in the application ruleset stack actually exists in the application (and is available). If it’s missing, rule creation can fail or land in an unexpected ruleset.

  • If you’re using branching and you create a language bundle inside a branch, you have two clean ways to test it:

    • Merge the branch so the language bundle lands in the base ruleset and is picked up normally at runtime.

    • Or, for quick validation, add the language ruleset to the bottom of the application ruleset stack so the runtime can resolve the bundle while the change is still in the branch.

  • Any issues with “re-translate all layers”, please install HFIX-C4425 in your system..

@akuls Hello Sai,

What is Pega’s recommended approach for applications that continue to evolve over time—for example, apps where new views are added or existing ones are updated in future releases?

On the current App Studio localization landing page, I noticed that once a language pack is imported, the status changes from Ready for translation to Complete. This raises a question:

If in Release 1 (R1) we localized the application in French, and then in Release 2 (R2) we introduce a new view that also requires French translation, what is the correct process? Do we need to regenerate the base bundle, re-import the updated language pack, and then validate the translations carried over from R1?

Also, I want to add that the new localization enhancements coming in Infinite 25 seem like a significant improvement to how localization is managed in Pega.

Thanks,

-Jose

Hey @josenavas with every release you can delete the current language pack from the language pack screen in app studio and then create a new french bundle. Your translations from R1 will be auto-populated in the excel/json. The labels from R2 release will be blank.

note: with every language pack generation we will see couple of binary file instances make sure they are in open ruleset when your performing the above process.

@akuls Thanks Sai.

I have an additional question that may be more of a feature request. According to the Pega documentation, if the application does not contain a Ruleset for the user’s selected locale, the UI defaults to English. This means the default locale works as a fallback—for example, if a user’s locale is en_GB, the UI displays correctly in English.

However, it would be very useful to define a default locale other than English. For instance, if we set es_ES as the default locale for Spanish, then users accessing the application from Mexico (es_MX) would still see the UI in Spanish even if that specific locale is not configured (no rulesets for that locale).

Thank you for your consideration.

Regards,

-Jose Navas

@akuls Hello Sai,
regarding the migration from Infinity 24, in that version we used custom field labels which were replaced for dynamic text rules in Infinity 25. My question is, once we migrate from Infinity 24 to Infinity 25, are the custom field labels converted to dynamic text rules automatically? or existing views will preserve the custom field labels, and only for new views we will see the dynamic text rules.

Thanks,

-Jose

custom field labels will remain as is Jose.

1 Like