JUCE localization is how developers translate a C++ audio plug-in or desktop application without breaking controls, plug-in parameter identities or user projects. If you are searching for how to use JUCE LocalisedStrings, the TRANS macro, juce::translate(), or multilingual VST3 and Audio Unit interfaces, this tutorial explains the message files, runtime behavior and release tests that matter. The aim is a natural user interface in every supported language, not a cosmetic replacement of English labels.
JUCE includes juce::LocalisedStrings, a lookup table for source strings and their translations. The documentation describes constructors that load mappings from a file or in-memory text, setCurrentMappings() for the current table, and translate() for obtaining the rendered text. A translated string returned for a new label does not automatically update an already-existing Label, TextButton or custom editor component. Plug-ins also share a host process with unrelated code, so global mapping and lifetime decisions deserve special care.
We will follow an imaginary audio analysis tool, Harmonic Notebook, from an English plug-in editor into other languages. Its menus, parameter labels, warning dialogs, preset names and waveform annotation texts create different translation problems. This guide gives an implementation route, illustrated C++ patterns, the limits of automatic translation, practical troubleshooting situations, a four-week plan and a release checklist for users anywhere in the world.
Quick answer: a practical implementation route
- Work in JUCE LocalisedStrings, TRANS and plug-in UI and identify juce::LocalisedStrings ownership and the distinction between changing displayed text and changing audio processor state.
- Keep the JUCE mapping files with language and countries declarations outside the application action model.
- Choose between juce::translate() and the legacy TRANS() shorthand; check the version-specific API.
- Load a deliberate LocalisedStrings table and refresh all already-created labels after changing language.
- Keep plug-in parameter IDs, preset data, automation and host-owned text out of UI translation.
- Never load a translation file or allocate localization resources on the real-time audio callback.
- Test standalone and every plug-in format or host combination you actually distribute.
Who this guide helps and how to use it
This guide is for developers, translators, testers and technical writers shipping JUCE C++ applications and audio plug-ins interfaces across language markets. The running example is Harmonic Notebook, a fictional audio plug-in that labels spectrum views, saves analysis notes and lets musicians recall processing presets. Rather than pretending that a language switch is just a word replacement, we follow the same interface through source extraction, translation, state changes, packaging, accessibility review and a real release. The examples are explanatory, not a claim that any particular engine or library provides all of these features automatically.
Begin with the quick route above if you need a decision now. Continue into the detailed platform mechanisms if you are implementing the feature, or jump to a troubleshooting case that resembles your failure. The final release checklist and four-week plan turn the explanation into a manageable project. Where an API behaves differently by version, check the official reference linked at the end against your pinned dependency before shipping.
Contents
- Core principles for a multilingual interface
- JUCE LocalisedStrings, TRANS and plug-in UI: platform-specific implementation choices
- A worked deployment example
- Thirty-two practical troubleshooting cases
- Four-week implementation plan
- Release and editorial checklist
- Frequently asked questions
- Documentation and related guides
Core principles: building dependable localization in JUCE C++ applications and audio plug-ins
1. Define the reader’s actual task
Decide what people are trying to accomplish, not just which sentence looks easy to translate. A button that commits an irreversible action needs explicit wording; a heading may tolerate a freer phrasing. Treat labels, notifications, validation messages, tooltips and documentation as separate editorial contexts. In JUCE C++ applications and audio plug-ins, this becomes concrete when a plug-in dialog asks whether to discard a modified preset. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Create a source-message inventory organized by screen, action, audience and consequence. For every string identify its owner, where it is shown, how it is triggered and what would happen if it were misunderstood. For Harmonic Notebook, one useful test is open an edited preset and choose Cancel in French without discarding data. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. Translation is a display concern; it must never rewrite a processor parameter’s stable identifier. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
2. Separate message keys from application logic
A translated caption is presentation, not an identifier. Message keys should remain stable when a designer changes the English wording or when a translator chooses a more natural sentence. In JUCE C++ applications and audio plug-ins, this becomes concrete when juce::translate() looks up a source literal but DSP parameters keep stable IDs. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Build a language-neutral action model: the code decides what action occurs, while the catalog only supplies its explanation. A change in target-language words must not change file operations, settings or saved documents. For Harmonic Notebook, one useful test is switch the language while the editor remains open and inspect every visible component. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. An audio thread must remain deterministic; file reading and heavy string conversion belong elsewhere. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
3. Choose a locale and explicit fallback
Language selection is not simply guessing from a two-letter country code. Application language, document language, operating-system preferences, accessibility settings and text direction can disagree. In JUCE C++ applications and audio plug-ins, this becomes concrete when the host’s preferred language and the editor’s chosen language are different. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Specify a supported language list and a fallback order. Make the selected locale visible, persist it where appropriate, and let the user correct an incorrect automatic choice without losing work. For Harmonic Notebook, one useful test is reopen a saved Japanese-named preset after switching the UI to English. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. The host can supply text your plug-in does not own, so account for that boundary. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
4. Collect strings and prevent omissions
Strings disappear from translation projects because they are buried in exception handlers, debug paths, file dialogs or source-generated interfaces. A successful home-screen screenshot is not evidence of complete coverage. In JUCE C++ applications and audio plug-ins, this becomes concrete when a custom component paints its own text instead of using a translated Label. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Inventory every reachable state, including errors, empty datasets, permission failures and first-run screens. Use both extraction and exploratory testing, with a human reviewing what automation cannot discover. For Harmonic Notebook, one useful test is start an AU instance and a VST3 instance separately in supported hosts. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. A catalog miss should be observable during testing but survivable for customers. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
5. Protect placeholders and variable values
Values inserted into translated sentences may be file names, counters, units, person names or user-created content. They must not be silently translated, reordered incorrectly or mistaken for executable formatting symbols. In JUCE C++ applications and audio plug-ins, this becomes concrete when a parameter tooltip inserts a frequency into a translated sentence. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Define expected placeholder names and types alongside the message. Give translators examples of singular and plural quantities, negative numbers, long paths and missing values before approving a catalog. For Harmonic Notebook, one useful test is make the catalog unavailable and verify the English fallback. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. Translation is a display concern; it must never rewrite a processor parameter’s stable identifier. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
6. Handle plurals and grammatical context
English singular-versus-plural is not a universal rule. Some languages have several grammatical categories; others use no visible inflection for the same count. English text concatenation can also trap a noun in the wrong case. In JUCE C++ applications and audio plug-ins, this becomes concrete when a warning says one file versus several files. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Represent complete messages and plural categories with suitable language rules. If the chosen catalog format cannot express that complexity, design an application-owned formatter instead of assuming a single replace operation is enough. For Harmonic Notebook, one useful test is test the same audio processing automation lane before and after a UI language change. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. An audio thread must remain deterministic; file reading and heavy string conversion belong elsewhere. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
7. Treat Unicode, font coverage and shaping separately
UTF-8 encoding ensures bytes can represent characters, but does not guarantee the renderer has the glyphs or shapes complex scripts correctly. A visually empty square is a rendering failure, not proof that translation data is missing. In JUCE C++ applications and audio plug-ins, this becomes concrete when a Japanese catalog includes code points absent from the default UI font. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Test accented Latin, Cyrillic, CJK, Arabic, Devanagari, combining marks and emoji only where the product claims support. Record both character coverage and script shaping limits rather than treating a font filename as proof. For Harmonic Notebook, one useful test is open an edited preset and choose Cancel in French without discarding data. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. The host can supply text your plug-in does not own, so account for that boundary. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
8. Design layouts for length and direction
Translated text may be shorter or much longer than English, with different word breaks and reading order. A fixed-size dialog that works in one language can conceal the very instruction needed to complete a task. In JUCE C++ applications and audio plug-ins, this becomes concrete when a German confirm button no longer fits next to Cancel. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Use flexible spacing, wrapping and scrollable long explanations. Verify right-to-left content separately from right-to-left interface flow; a successful glyph test does not mean buttons and navigation mirror correctly. For Harmonic Notebook, one useful test is switch the language while the editor remains open and inspect every visible component. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. A catalog miss should be observable during testing but survivable for customers. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
9. Preserve user-authored and imported data
User text is not part of a static interface catalog. A message editor, file path, search phrase, audio preset name or imported project label must remain the user’s own data unless they explicitly request translation. In JUCE C++ applications and audio plug-ins, this becomes concrete when a user saves a preset named in Japanese and opens it under English UI. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Localize surrounding instructions without rewriting stored values. Test save, reopen, copy, paste, undo and export under several interface languages to ensure content identity survives. For Harmonic Notebook, one useful test is reopen a saved Japanese-named preset after switching the UI to English. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. Translation is a display concern; it must never rewrite a processor parameter’s stable identifier. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
10. Keep keyboard and accessibility meaning
Shortcut letters, focus order, screen-reader names, error alerts, accessible hints and spoken labels all need independent review. A translated visible caption is not automatically a usable accessible interface. In JUCE C++ applications and audio plug-ins, this becomes concrete when a control must keep its shortcut and focus behavior. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Test real keyboards and assistive technologies where the platform permits. Preserve shortcut actions and focus identity while checking whether the translated wording is spoken or displayed correctly. For Harmonic Notebook, one useful test is start an AU instance and a VST3 instance separately in supported hosts. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. An audio thread must remain deterministic; file reading and heavy string conversion belong elsewhere. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
11. Package language resources reliably
An application launched from its build directory can read files that disappear once it is installed, copied to another operating system or run without network access. It may look translated in development and revert to English in production. In JUCE C++ applications and audio plug-ins, this becomes concrete when the plug-in package includes catalog files and fonts. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Build a release inventory of catalogs, fonts, images, licenses and locale configuration. Install the exact shipping artifact on a clean machine and test without access to the developer’s source tree. For Harmonic Notebook, one useful test is make the catalog unavailable and verify the English fallback. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. The host can supply text your plug-in does not own, so account for that boundary. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
12. Make release tests reproducible
A single happy-path screenshot cannot verify translated errors, long text, formatting, plural forms, offline operation or multiple application instances. Useful tests describe a state, an action and an observable outcome. In JUCE C++ applications and audio plug-ins, this becomes concrete when a VST3 loads in one host and an Audio Unit loads in another. That connection is worth writing down because a translator may see an isolated phrase while a tester sees the entire interaction.
Create a language-by-platform matrix. Retain example inputs, exact build versions, expected visible results and screenshots or logs so a later translation update can be compared against a known baseline. For Harmonic Notebook, one useful test is test the same audio processing automation lane before and after a UI language change. Make a screen recording or short defect note when the result differs. It is better to discover one precise failure in a small language pilot than to send a much larger unverified catalog into production.
Keep the distinction between visible language and application behavior clear. A catalog miss should be observable during testing but survivable for customers. The acceptance test should name the translated view and the underlying value independently; otherwise a correct-looking screenshot can conceal a functional regression.
JUCE LocalisedStrings, TRANS and plug-in UI: platform-specific implementation choices
13. Understand JUCE string-table format
The JUCE LocalisedStrings object can read text mappings of source and target strings. Its documented format starts with a language name, may list suitable country codes, and then pairs quoted strings on opposite sides of an equals sign. Think of those source strings as lookup keys, not as sentences to alter opportunistically in C++ after translators have received the file.
For a bilingual Help menu, a mapping might connect an English source label to a French equivalent. Keep quote escaping and Unicode encoding consistent with the version of JUCE and file loader you use. Create a validation script that checks for repeated English keys, empty translations and unexpected punctuation in controls with dangerous consequences.
Do not claim the file is a comprehensive ICU grammatical formatter. JUCE’s simple lookup is convenient for fixed messages; a product needing complex plural categories, inflected messages or rich markup can combine that lookup with a well-defined application formatting layer.
14. Use juce::translate() at the point of display
The API’s translate() functions retrieve a result using current mappings. JUCE’s TRANS() macro is documented, but newer code is encouraged to call juce::translate() directly; NEEDS_TRANS() is useful as a marker for scanners that collect translatable literals without changing the runtime string.
For example, an editor may call juce::translate("Export analysis") when setting a button’s text. Save the source key separately if you expect the language to change. If the label stores only the translated result, attempting to translate it again later may look up a French sentence rather than the original English key.
Treat source-code extraction as a developer aid, not a replacement for human context. The same word, such as "Drive", could mean gain, storage or transport. Store comments or message identifiers around ambiguous labels so translators understand the physical action.
15. Observe LocalisedStrings global ownership
The documented setCurrentMappings() call selects the active mapping object and takes ownership of the pointer. It can be passed nullptr to remove mappings. Do not retain a pointer to an object after transferring ownership, and do not create a new table on every paint or mouse event.
This global mapping choice is especially sensitive for plug-ins, because different instances may execute in a single DAW process. If two editors demand different user languages, a shared global catalog may cause one to change the other’s text unexpectedly. A per-instance catalog or a carefully controlled process-wide policy may be more appropriate.
Test multiple open plug-in editors in one host, and then load the same product in two tracks. Capture whether a language change affects only the intended editor or every instance. The policy should be intentional rather than an accident of a static setter.
16. Refresh components after switching language
Calling setCurrentMappings() changes future lookups but does not scan the component tree and rewrite every existing string. A TextButton holding a previously translated title may keep the old wording until the application explicitly updates it.
Keep a method such as refreshLocalizedText() in the editor that reapplies source keys to labels, descriptions, accessible names and tooltip strings. If a custom component paints labels directly, its repaint path must use the selected catalog or its own language context. Trigger an appropriate repaint or layout change only on the UI thread.
After switching, inspect pop-up menus, tab names, notifications and off-screen controls when they become visible. A mixed-language editor usually means one component was never refreshed, not that a translation dictionary suddenly changed.
17. Keep audio callback behavior untouched
A professional plug-in separates real-time audio processing from interface work. Changing labels should not require rebuilding the processor, changing audio data or reading disk from processBlock. A catalog is presentation state, not DSP state.
If an audio parameter displays "Mix: 25%" in the selected language, derive the string in the UI layer from the stable numeric value. Keep value-to-text formatting predictable and avoid locale-dependent parsing in an automation path. An audio host may store automation and project state across machines using different display languages.
Run an audio playback and automation test while changing editor language repeatedly. Listen for dropouts and compare parameter values; if translated UI changes signal processing or saved automation, the architecture is crossing a boundary it should not cross.
18. Do not translate stable processor parameter IDs
Host automation, saved sessions and presets often depend on IDs that developers choose when registering plug-in parameters. These identifiers should stay consistent across languages and releases even when the visible parameter name is localized.
Distinguish the machine-facing identifier, the UI-facing label and any host-facing display metadata. Some host interfaces cache parameter names or expose them outside the plug-in editor; a language change inside JUCE does not guarantee the host will re-query every label.
Prepare a round-trip test: automate a parameter in English, change editor language, save the DAW project and reopen it in another locale. The same parameter must be automated, with the same numerical values and no missing assignment.
19. Choose language under host control thoughtfully
A standalone application can offer an ordinary preferences page. A plug-in runs inside a host which may have its own operating-system locale, language selector and accessibility behavior. The editor’s settings do not necessarily control host-owned menus and notifications.
Document whether the plug-in follows the operating system, host preference or an explicit in-plug-in choice. If the host does not expose a reliable language preference, offer a visible language picker rather than implying that it does. A reset to automatic selection should be understandable.
When users report two languages on the same screen, first distinguish which components are yours. Translating a plug-in’s panel cannot force a DAW’s transport controls or system security prompt to change language.
20. Design safe catalog loading and fallbacks
External translation files offer updates without recompiling, but they can be missing, corrupt or unreadable. Bundled resources are more self-contained, yet they need a clear release process. Both paths require explicit fallback behavior.
Load and validate mappings before they are used by the editor, preferably off the audio thread. When a mapping is absent, JUCE’s normal translation lookup returns the source string. That is a reasonable safety net, but log missing keys in test builds so untranslated interface fragments are not silently shipped.
A language should not appear available unless its essential warnings and core operations have been reviewed. It is better to offer a smaller, dependable language list than a long list whose destructive prompts contain untranslated or misleading text.
21. Audit Unicode fonts, kerning and glyph coverage
JUCE String supports Unicode text, but successful character storage is only one layer. The Typeface and Font selected by the widget must render each promised script with appropriate glyphs, and some scripts require shaping that must be tested in the exact renderer.
Use real strings from target-language reviewers, not a single welcome phrase. Include combining marks, long compound words, punctuation, names, percent signs and emojis where relevant. Confirm font-asset licensing when a typeface is embedded in a commercial plugin.
Check high-DPI behavior, plug-in window resizing and host scaling. A note that fits a standalone build may clip when a host puts the editor inside a smaller container or applies an unexpected scale factor.
22. Treat plug-in notifications and file dialogs separately
Some notifications are application-owned components; others come from operating-system or host APIs. A desktop native file picker can use the OS language while the rest of the editor uses an explicit language, and that is not always a defect the JUCE application can control.
Provide user-facing file type descriptions and surrounding instructions where the application owns them. Do not translate extensions, file paths, preset identifiers or a user’s annotation text. Confirm that canceling a file dialog never commits the action described by an adjacent translated button.
Run import and export with names containing accents and non-Latin characters. The important invariant is byte-correct file selection and data persistence; a translated dialog label is secondary if the selected path is corrupted.
23. Prevent source-string collisions and ambiguous wording
A source literal used as a dictionary key is easy to introduce but can be ambiguous. "Open" as a verb differs from "open" as an audio gate state, and translators may need more context than the literal alone provides.
Organize strings by ownership and review repeated source strings in their actual screens. If different senses require different translations, create meaningfully distinct source messages or a more capable keyed message layer. Document why a label exists and the consequence of using it.
During review, ask a musician or engineer to interpret gain, clip, dry/wet, threshold and bypass in the destination language. Purely literal translation can be technically grammatical yet misleading within audio workflows.
24. Test the distributed format, not just the IDE
A JUCE project can build a standalone application and several plugin formats. Resource packaging, font loading, host restrictions and filesystem paths may differ between VST3, AU and other distributable formats.
Use a clean build of every advertised format. Open the plug-in in supported hosts, close and reopen its UI, remove network access and try a first installation with no development resources. Validate host rescanning and installation without rewriting existing user presets.
Keep a matrix by format, operating system, host and language. Note the scope: a successful VST3 test on one Windows host is not proof of AU behavior on macOS or of another DAW’s window-lifetime rules.
A worked JUCE C++ applications and audio plug-ins deployment: Harmonic Notebook
Suppose Harmonic Notebook is used first by an English-speaking team and later by people working in French, Japanese and Arabic. These are not just three translation files. French makes many controls longer; Japanese tests glyph coverage and line wrapping; Arabic asks whether the text renderer, input method, bidi behavior and interface direction are suitable for the product. Start with one representative screen containing a search field, a numeric value, a destructive confirmation and an error state.
In the English build, record a baseline: open the project, change an option, enter non-Latin text, cancel an unsafe operation and export a file. Capture actual saved values, not just pictures. Then switch to the pilot locale and repeat the same steps with the same test data. If the display changes correctly while saved state and operations remain identical, the team has evidence of localization rather than an unrelated feature variation.
Harmonic Notebook has one deliberate stress test: two plug-in instances display different interface languages while sharing a host process, with both instances recalling the same numeric automation lanes. A reviewer should note the source wording, approved translation, expected action, actual outcome, language chosen, target environment and build identifier. Classify failures as catalog, formatting, font, layout, state, packaging or accessibility defects; this prevents every failure from being blamed vaguely on "translation".
Thirty-two practical JUCE LocalisedStrings, TRANS and plug-in UI troubleshooting cases
1. An existing label stays English after a language change
What you observe: The menu changes, but the previously constructed JUCE Label still contains its original text. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Reapply its source key with juce::translate() in an explicit editor refresh method; set new text and request layout if needed. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The same open editor updates its label immediately, without reconstructing the processor or discarding edits. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
2. Switching language resets a parameter
What you observe: A gain control snaps to its default immediately after changing the interface language. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Remove any parameter reconstruction or preset reload from language handling. UI text and processor state must be separate. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: An automation lane and the precise gain value remain unchanged through the switch. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
3. Two plug-in instances display mixed languages
What you observe: An editor on one track changes text when language changes on another track. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Audit global LocalisedStrings mappings. Decide whether language is process-wide or implement scoped mapping that avoids cross-instance contamination. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Two open tracks behave according to the documented policy, with no unexpected language leak. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
4. A translation file seems loaded but no text changes
What you observe: A French catalog file exists, yet every call returns source strings. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Inspect the language file’s mapping syntax, the exact English source text and when setCurrentMappings() executes. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: A known test key resolves to its approved French text and missing keys fall back visibly. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
5. A catalog pointer causes a crash
What you observe: The application crashes after swapping or destroying translation tables. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Review ownership: setCurrentMappings() takes the mapping pointer and manages its lifetime. Remove additional deletes and stale access. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Repeated language changes and editor shutdown run without invalid memory access. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
6. Source wording updates break translations
What you observe: Changing "Save preset" to "Save the preset" makes the old mapping miss. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Treat source strings as lookup contracts, extract and review catalog differences with every UI wording change. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The changed control displays a reviewed translation and old unrelated keys still work. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
7. An ambiguous audio term is wrong
What you observe: A translator renders "Drive" as a disk drive instead of distortion. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Add domain context or a distinct key and have an audio practitioner verify the target term. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The control now describes the sonic parameter correctly in a real plug-in screen. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
8. A plural message sounds unnatural
What you observe: One preset and several presets share a mechanically appended plural suffix. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Use complete messages for the destination language or a plural-aware formatter outside a simple LocalisedStrings lookup. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Counts of zero, one, two and five read naturally in the target language. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
9. The host shows an English parameter name
What you observe: The editor is French but a DAW automation list is English. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Identify host-facing text that is registered or cached separately from JUCE editor labels; use platform capabilities where available. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The team documents host behavior accurately and does not promise control over unsupported host UI. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
10. Japanese text appears as squares
What you observe: Catalog bytes are intact but an editor label lacks needed glyphs. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Ship a suitably licensed Font or typeface covering the character set and test shaping on target systems. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Real Japanese presets and menu labels render across supported platforms. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
11. The audio thread glitches on switch
What you observe: Playback pops briefly when a translation file loads. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Move catalog I/O and UI rebuilding away from the real-time processing callback. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: An uninterrupted playback loop remains stable during repeated UI language switching. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
12. User preset names become translated
What you observe: A factory catalog unexpectedly rewrites names musicians have saved. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Protect user-authored strings and stored preset metadata; localize only descriptions and application-owned labels. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Names round-trip byte-for-byte between different interface locales. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
13. A destructive dialog becomes misleading
What you observe: The translated dialog omits the fact that unsaved analysis notes will be lost. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Translate the full consequence, not just the verb; include what can and cannot be recovered. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: A target-language reviewer can describe the exact effect before selecting Discard. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
14. A long German label clips
What you observe: A control covers another button in a narrow host window. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Measure translated text, allow reasonable resizing or wrapping and test host scale factors. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Both controls remain visible and clickable at advertised minimum editor size. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
15. An imported filename fails
What you observe: A folder path containing diacritics cannot be opened in a localized build. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Check Unicode file API boundaries and avoid lossy conversions through narrow platform-specific encodings. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The same file opens and exports correctly with accented and Japanese names. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
16. The language picker displays unreadable text
What you observe: The language names themselves require a font that is not yet loaded. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Use a safe fallback font and native language names where possible; preserve a way back to English. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Every offered language can be selected and reversed with no guessing. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
17. The wrong message is read by a screen reader
What you observe: A visible button is translated while its accessible label remains English. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Update accessible text during the same refresh cycle as visual labels and validate host integration. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Keyboard and assistive-technology users understand the action in the selected language. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
18. An export warning loses its filename
What you observe: A translation inserts arguments incorrectly and drops the named destination. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Keep variable placeholders typed and test formatting with long file names and quotes. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The approved warning identifies the correct output file without exposing formatting tokens. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
19. One OS is missing catalogs
What you observe: The localization works in a debug app but not in the installed macOS package. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Inspect bundle resources and build rules per distribution format, not only developer paths. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: A clean install launches offline and finds the selected locale. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
20. An older preset reopens differently
What you observe: A new language release changes saved option identifiers. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Keep serialized IDs and parameter mappings independent of translated captions. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: An old host session opens with the same processor configuration. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
21. A tooltip is mixed-language
What you observe: Main controls change but hover help remains English. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Inventory tooltips as translatable messages and refresh their source keys. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Every supported control displays a reviewed tooltip under the selected locale. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
22. A user value is rounded differently
What you observe: Localized display rounds a frequency and a save operation persists the rounded value. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Separate presentation formatting from raw numeric state; never parse displayed text back into precision-critical data by accident. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The stored frequency matches the original value independent of decimal display rules. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
23. A language preference disappears
What you observe: The editor reverts to English after reopening the DAW. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Define persistence ownership and store locale preference separately from host audio state where appropriate. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: After restart, the editor follows the intended preference without touching presets. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
24. An untested audio-format build crashes
What you observe: Standalone works but the AU editor crashes on opening translations. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Verify packaging, startup order and host-specific instance lifecycle for that format. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The shipped AU opens, closes and reopens in a supported host without errors. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
25. A font license blocks distribution
What you observe: The development build depends on a font that cannot be redistributed. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Replace it with an appropriately licensed font and store its attribution or notice where required. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The release has documented permission for every packaged font. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
26. A plugin loads catalog on each repaint
What you observe: CPU usage spikes when meters update while the editor is open. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Cache validated catalogs outside paint; translate labels on meaningful state or language changes. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Sustained meter updates have stable performance under both tested languages. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
27. A button says Confirm but performs Cancel
What you observe: A callback was rebound while refreshing localized controls. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Do not change callback wiring during text refresh; assert stable action IDs in tests. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The button executes the same action in English and French. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
28. The system dialog is a different language
What you observe: A native permission request remains in the OS language. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Explain ownership boundaries and test the localized application text around native dialogs. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The workflow remains clear without claiming to translate system-owned UI. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
29. A new untranslated error reaches customers
What you observe: A rarely triggered disk failure shows source-language text. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Add error branches to inventory and test with controlled permission-denied states. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The relevant error is reviewed in the target language with truthful recovery instructions. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
30. A host upgrade changes layout
What you observe: A DAW update resizes the plugin editor and long text starts clipping. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Retest minimum window size, host DPI and dynamic layout constraints after host updates. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: All essential controls remain reachable on the supported host versions. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
31. A catalog update changes shortcut cues
What you observe: The visible shortcut letters no longer correspond to keys. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Manage keybindings independently and make their actual combination visible in the locale. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: The documented shortcut triggers the correct action and accessible help describes it. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
32. The release passes screenshots but fails data round-trip
What you observe: Every French string looks correct, but a user annotation is corrupted on reopening. This is especially confusing when the rest of the interface appears correctly translated, because users naturally assume that the visible language tells the whole story. Reproduce the situation with a known test file and note the exact locale and application version.
What to inspect and change: Add file-save, session-recall and non-Latin text data checks to localization sign-off. Avoid a cosmetic patch that simply hides the failure. Trace the message from its source through the selected catalog, formatting step, UI component and release artifact; check whichever part is responsible before changing business logic.
What proves the repair: Saved projects, automation and notes match the originals byte-for-byte. Repeat the check in the source language and one substantially different language, including after closing and restarting the program. A pass means the user receives the right information and the underlying action or data remains correct, not merely that the screenshot looks attractive.
A four-week localization implementation plan
Week 1 — discover scope and establish a baseline
Inventory Harmonic Notebook’s visible messages, callback outcomes, errors, settings, shortcuts, dialogs and files. Record where each string originates and which audiences read it. Choose a pilot language deliberately, and identify who will review grammar and functional meaning. Capture an English baseline before touching the catalog so a new defect cannot be mistaken for an old one.
Deliver a list of message owners, a catalog format decision, a supported-locale policy and eight reproducible baseline tests. Confirm that juce::LocalisedStrings ownership and the distinction between changing displayed text and changing audio processor state is understood by the team. Do not promise an Arabic or CJK language option merely because the bytes can be stored.
Week 2 — build the language path
Implement the message store, locale selection, fallback behavior and representative integration points. Wire a safe switch or restart policy; neither choice is inherently wrong if it is transparent. Review JUCE mapping files with language and countries declarations and build at least one complete pilot flow with placeholders, a plural, a destructive alert, a file operation and an empty state.
Exercise open an edited preset and choose Cancel in French without discarding data and reopen a saved Japanese-named preset after switching the UI to English. Check invalid catalog handling, stale messages and translated text length. Record the exact source revision and catalog revision used to build the artifact so reviewers can recreate the result.
Week 3 — test meaning and international text
Have a competent target-language reviewer inspect real screens in context, not only a spreadsheet. Test fonts, character entry, wrapping, input methods, keyboard navigation, spoken labels and any limitations of the renderer. Make sure dates, units and number formatting are intentionally chosen rather than accidentally inherited from the developer’s machine.
Try two plug-in instances display different interface languages while sharing a host process, with both instances recalling the same numeric automation lanes. If a language is not fully supported, document the limitation honestly and keep it out of the language picker. Avoid issuing a "complete" badge merely because translation coverage reached 100 percent.
Week 4 — validate shipping artifacts
Build a production package for every supported target and install it in a clean environment. Test a fresh start, an upgrade, an offline launch, locale persistence, multiple windows or instances where relevant, and recovery after missing files. Read each serious warning aloud with the target-language reviewer to confirm its consequence is clear.
Sign off only when the release matrix shows identical functional outcomes in every promised language. Keep a rollback path for an incorrect catalog, preserve source-language fallbacks, and record how reports from international users will reach the maintainers.
Release checklist
- All visible JUCE C++ applications and audio plug-ins strings have a documented owner and source context.
- Catalogs under JUCE mapping files with language and countries declarations have been reviewed against the actual application.
- Long translations, numeric formats, plural messages and placeholders have been tested.
- Fonts and scripts work on every officially supported platform.
- Translated labels never change saved data, configuration keys or execution paths.
- Input, keyboard use, focus, dialog outcomes and accessibility have been checked.
- Packaged releases include the correct language resources and licenses.
- Offline launches and fresh installations behave consistently.
- Every promised language has a named reviewer and repeatable tests.
- A rollback and fallback plan exists for errors found after release.
Frequently asked questions
Does JUCE translate everything automatically?
No. LocalisedStrings supplies mapping lookups for strings the application asks to translate. Developers still identify messages, apply them to widgets, select fonts, refresh components and test host behavior.
Should I use TRANS() or juce::translate()?
The documented macro still exists, but JUCE recommends direct juce::translate() calls in new code. Use a consistent approach and keep source strings discoverable to extraction tools.
What does setCurrentMappings() own?
JUCE documentation states that the mapping pointer passed to setCurrentMappings() is automatically deleted when no longer needed. Do not double-delete it or assume it is safe to reuse after replacement.
Can a plug-in have a separate language from its DAW?
It can offer its own language policy, but not every host-owned control will follow it. Multiple plug-in instances make a process-global table an important design consideration.
Can I localize automation parameter IDs?
Do not change stable identifiers solely for translation. Display names may be language-specific when supported, but saved automation, host sessions and processor state must remain compatible.
What about pluralization?
A simple literal lookup is not a general grammatical message engine. Use full messages or an appropriate locale-aware formatter for complex plural and selection rules.
Does a Unicode string guarantee Arabic or Japanese rendering?
No. Fonts, glyph coverage, shaping, bidirectional handling and line layout require separate tests in the actual JUCE version and renderer.
What if a catalog file is missing?
The documented translation lookup can return the source string, but production should also validate resources and avoid claiming that an incomplete locale is fully supported.
Should language switching happen in processBlock?
No. Keep UI text construction, disk I/O, catalog loading and other heavyweight work away from the real-time audio callback.
How should I test different plug-in formats?
Test the real installer and each advertised format in supported hosts. Include multiple instances, editor reopen, host automation and saved preset round-trips.
Is a host English message a localization bug in my plug-in?
Not necessarily. First determine whether the UI belongs to the plug-in, the host or the operating system, then set clear expectations for users.
When is localization ready to ship?
When reviewed target-language text, stable behavior, font coverage, installation, host integration and rollback checks pass on exact release artifacts, not just development builds.
Official documentation and further reading
- JUCE LocalisedStrings official class reference — https://docs.juce.com/master/classjuce_1_1LocalisedStrings.html
- JUCE LocalisedStrings macros and translate functions — https://docs.juce.com/master/juce__LocalisedStrings_8h.html
- JUCE documentation home — https://docs.juce.com/master/index.html
JUCE LocalisedStrings official class reference · JUCE LocalisedStrings macros and translate functions · JUCE documentation home
Continue learning about trustworthy translation
This guide focuses on JUCE LocalisedStrings, TRANS and plug-in UI rather than replacing the general principles of translation. To understand how meaning, precision, audience and evidence travel between languages, follow the wider translation system. For a different software platform, use the series index rather than mixing unrelated APIs in one implementation.
Master Art of Translation · Translate Like a Pro series index · Previous guide in this series