Command-line localization has one unforgiving boundary: some text is language, and some text is syntax. Translate the wrong word and the program stops working. Leave the wrong word untranslated and the tool becomes needlessly difficult for users who understand the target language better than the source.
Searches for CLI localization, command line translation, localize developer tools, gettext CLI, translate command line help, internationalize command line application, localize error messages and developer tool localization all describe a boundary problem. Commands, flags, environment variables, filenames, code identifiers and machine-readable output may need to remain exact while human-facing help, warnings and explanations can be translated.
This guide shows how to draw that boundary cleanly. It covers command and flag identity, usage strings, help text, GNU gettext practices, translator comments, whole-sentence messages, variable substitution, shell quoting, filenames, paths, code examples, errors, logs, locale environment variables, terminal encodings, table widths, machine-readable output, documentation, tests and the principle that users should be able to translate the explanation without translating the program’s grammar.
This article belongs to eduKateSG’s Master Art of Translation architecture. It extends the professional localization layer without replacing the existing owners for general software localization, terminology, dynamic messages, release control or quality assurance.
Quick answer
Keep executable syntax invariant unless the tool is deliberately designed with localized command aliases. Translate complete human-facing messages around that syntax. Mark translatable strings in source, give translators context, avoid runtime string concatenation, protect placeholders and code, and offer machine-readable output that is stable regardless of UI language when automation depends on it.
- Classify: separate executable tokens from human language.
- Mark: extract human-facing strings with localization tooling such as gettext.
- Contextualize: explain placeholders, commands and output states to translators.
- Protect: preserve flags, paths, identifiers and machine syntax.
- Render: support Unicode and terminal constraints.
- Automate: keep parseable output stable across locales.
- Test: run actual commands under every supported locale.
1. Define the executable grammar first
Commands, subcommands and flags are part of the program interface. Changing them can break scripts, documentation and muscle memory.
Professional method. Maintain a canonical machine syntax and decide explicitly whether any localized aliases are supported. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. A translator changes –verbose into a target-language word inside a usage example. The help sentence can be translated while the flag remains –verbose.
Verification. Copy the translated example and run it successfully. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
2. Keep command names stable across documentation
The same command should appear identically in help, tutorials, error recovery and release notes. Users often copy/paste command examples.
Professional method. Treat command tokens as protected terminology linked to executable behavior. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. A translated tutorial uses a localized command name that the shell does not recognize. The prose around git status can localize while git status itself remains unchanged.
Verification. Automate smoke tests from localized example snippets where practical. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
3. Mark human-facing strings in source
Internationalization begins before translators receive files. GNU gettext documentation emphasizes identifying and marking strings in program sources.
Professional method. Use gettext or the platform’s i18n framework so messages are extracted systematically rather than copied manually. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. Some error messages remain hard-coded because they were never marked. A shell or C program can route user-facing strings through gettext while machine syntax remains literal.
Verification. Run extraction and search source for unmarked visible strings. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
4. Translate complete sentences
GNU gettext guidance recommends preparing translatable strings as complete language units and avoiding concatenation. Word order, agreement and punctuation vary across languages.
Professional method. Expose a whole message with protected variables rather than stitching translated fragments at runtime. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. The program builds ‘File ‘ + filename + ‘ deleted’ from three independently translated pieces. A complete message allows the filename placeholder to move naturally.
Verification. A translator can rearrange every language-bearing part without editing program logic. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
5. Avoid string concatenation for grammar
Concatenated fragments embed source-language syntax into code. The target language may need different word order or morphology.
Professional method. Use complete format strings with named or well-documented placeholders. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. A plural suffix or adjective is appended mechanically. A count message should use the localization framework’s plural handling rather than adding ‘s’.
Verification. Test languages with different plural and word-order patterns. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
6. Protect placeholders and format directives
Variable syntax belongs to the program contract. Deleting or renaming placeholders can crash output or display wrong values.
Professional method. Configure localization tooling to validate placeholder parity and tell translators what each argument means. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. %s or {path} is altered because it looks like text. The target can move {filename} but must not rename it.
Verification. Render every message with realistic values under tests. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
7. Add translator comments near ambiguous strings
CLI strings are often short and context-poor. GNU gettext supports source comments and contextual information that can travel with extraction.
Professional method. Explain whether ‘list’ is a noun or verb, what a placeholder contains and where the message appears. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. A translator sees ‘Run’ with no idea whether it is a command, verb or noun. A comment can state ‘button-like prompt shown before executing migration’.
Verification. Review extracted catalog context rather than source code alone. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
8. Keep usage syntax distinct from explanatory prose
A usage line contains both fixed program grammar and language. Brackets, ellipses, metavariables and flags can carry conventional syntax.
Professional method. Protect executable tokens and localize explanatory labels or descriptions carefully. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. Square brackets are translated into prose punctuation or optional syntax becomes unclear. Usage: tool [OPTION] FILE can retain program tokens while accompanying text explains OPTION and FILE in the target language.
Verification. A user can reconstruct a valid invocation from the localized help. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
9. Decide whether metavariables localize
Tokens such as FILE, DIR or VALUE are examples rather than executable literal strings in many CLI conventions. They can be made more understandable, but localized forms may diverge from English documentation and community expectations.
Professional method. Create a documented policy by tool audience and keep it consistent. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. Half the help uses localized metavariables and half uses English. A globally developer-focused tool may keep FILE while localizing the explanation ‘path to input file’.
Verification. Check consistency across built-in help and web documentation. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
10. Protect code examples and identifiers
Source code has syntax and symbol identity. Translating function names, package names or language keywords breaks examples.
Professional method. Lock code spans and translate only comments or user-facing strings inside code when the teaching purpose requires it. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. A translator changes a class name because it resembles an English noun. The explanation of foo.bar() localizes while foo and bar remain code.
Verification. Run or compile examples where feasible. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
11. Handle paths and filenames as data
File paths can contain user data, platform syntax and localized folder names. A hard-coded path example may not work on every operating system or locale.
Professional method. Use placeholders and platform-appropriate examples; protect separators and literal paths that must remain exact. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. A Windows path backslash is treated as escape punctuation or a Unix path is localized word by word. The surrounding message can say ‘Could not open {path}’ without translating the runtime path.
Verification. Use paths containing spaces and non-ASCII characters in tests. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
12. Separate human-readable and machine-readable output
Automation needs stable structure. Scripts that parse localized prose are brittle.
Professional method. Offer JSON, structured output, stable fields or an explicit no-localization mode for automation while localizing default human output. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. A script greps for the English word ‘success’ and breaks in another locale. –json output can retain stable schema while terminal status messages localize.
Verification. Run the same automation under several locale settings. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
13. Keep exit codes independent from language
Exit status is machine communication. It should not change because an error message translates differently.
Professional method. Define stable exit codes and localize the accompanying explanation separately. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. A localized branch accidentally changes program control flow. Exit code 2 can mean invalid usage regardless of the target-language error text.
Verification. Assert exit status in tests for each localized message path. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
14. Localize errors for recovery, not decoration
A CLI error should tell users what went wrong and what to do next. Developer tools often expose terse English internals that do not translate well literally.
Professional method. Preserve exact diagnostic facts and command tokens while writing natural target-language recovery instructions. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. The target error becomes vague because technical nouns were generalized. ‘Unknown option –foo. Run tool –help.’ can localize fully except the literal tokens.
Verification. A user can resolve the error from the target text alone. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
15. Use locale environment variables deliberately
CLI programs often derive language and formatting from process locale. Users, containers and CI systems can run under different locale environments.
Professional method. Document how the tool selects messages and provide overrides where the runtime framework supports them. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. CI logs unexpectedly switch language and break troubleshooting assumptions. An automation environment can pin a predictable locale while interactive users see localized help.
Verification. Run under several locale configurations. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
16. Support Unicode in terminals and logs
Localized output needs encoding support end to end. A correct translation can become mojibake in a misconfigured console.
Professional method. Use Unicode-safe output and follow the principles in Unicode and encoding integrity. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. The tool falls back to ASCII and strips user filenames or translated text. A Japanese error message can display correctly alongside a Cyrillic filename.
Verification. Test supported terminal environments with multilingual data. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
17. Design for width and monospace constraints
Terminal windows can be narrow and help output often uses columns. Long translations can break alignment or wrap awkwardly.
Professional method. Use dynamic wrapping, hanging indentation and layout that tolerates expansion. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. A fixed 80-column table truncates option descriptions. Option names can stay in one column while target-language explanations wrap below them.
Verification. Test narrow terminals and long locale strings. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
18. Keep web documentation and built-in help synchronized
Users move between terminal and online docs. Different translations create confusion around exact syntax.
Professional method. Share terminology, examples and versioning between documentation and CLI resources. The rule should be written down clearly enough that another translator, reviewer, developer or product manager can apply it to the next release without guessing what the previous team intended.
Failure mode. The website uses a renamed flag while the installed version’s –help uses the old one. Docs can identify which product version introduced a command.
Verification. Follow a localized web tutorial against the released binary. If the result still depends on an unstated assumption, return to the source requirement, platform behavior, locale data or product state before approving it.
A repeatable operating sequence
A strong CLI localization workflow begins by freezing executable grammar, then surrounds it with translatable complete messages and stable automation interfaces.
- Inventory commands, flags, syntax tokens and human-facing strings.
- Define protected executable tokens and any explicit alias policy.
- Mark translatable strings in source.
- Add translator context and complete messages.
- Validate placeholders and plural logic.
- Protect code, paths and identifiers.
- Provide stable machine-readable output for automation.
- Localize human help and error recovery.
- Test Unicode and terminal-width behavior.
- Run command examples under every supported locale.
- Synchronize built-in help with documentation.
- Regression-test exit codes and parseable output.
Treat the sequence as a loop. A late defect often exposes an earlier assumption in source content, metadata, product logic, context or release configuration. Repair the earliest useful cause when possible so the same problem is less likely to return in the next locale or release.
Worked scenarios
1. Localized flag breaks script
A translator changes –output to a target-language word in a help example. The controlling risk is human translation altering executable grammar.
Protect the flag, translate the explanation and run the example under a smoke test. Then verify the decision in the real environment rather than judging it only from the translation file. A professional localization choice should remain correct when the actual user, device, runtime value or distribution channel enters the picture.
2. Automation parses localized text
A deployment script looks for the English word ‘Complete’. The controlling risk is human UI doubling as machine protocol.
Provide structured output or stable exit codes so scripts no longer parse translated prose. Then verify the decision in the real environment rather than judging it only from the translation file. A professional localization choice should remain correct when the actual user, device, runtime value or distribution channel enters the picture.
3. Error includes a user filename
The filename contains Japanese characters on an English-locale terminal. The controlling risk is encoding damage being blamed on translation.
Keep the runtime filename untouched and ensure Unicode-safe output and terminal support. Then verify the decision in the real environment rather than judging it only from the translation file. A professional localization choice should remain correct when the actual user, device, runtime value or distribution channel enters the picture.
4. Usage string built from fragments
The program appends ‘files remaining’ after a number. The controlling risk is source grammar being encoded in code.
Replace the fragments with a plural-aware complete message in the localization system. Then verify the decision in the real environment rather than judging it only from the translation file. A professional localization choice should remain correct when the actual user, device, runtime value or distribution channel enters the picture.
5. Localized help exceeds terminal width
Option descriptions wrap into the command column. The controlling risk is layout pressure encouraging inaccurate shortening.
Use resilient wrapping and indentation rather than deleting technical detail. Then verify the decision in the real environment rather than judging it only from the translation file. A professional localization choice should remain correct when the actual user, device, runtime value or distribution channel enters the picture.
6. Documentation translates a command name
The web translator treats a verb-like subcommand as ordinary English. The controlling risk is copy/paste examples failing.
Lock command tokens in documentation workflows and validate examples against the binary. Then verify the decision in the real environment rather than judging it only from the translation file. A professional localization choice should remain correct when the actual user, device, runtime value or distribution channel enters the picture.
CLI and developer-tool localization: twenty professional practice cases
For each case, identify what must remain invariant, what may be localized, which evidence you need before deciding, and what final test would prove the result is safe to release.
1. A subcommand is also an ordinary English verb
Treat it as executable syntax when shown as a command, and as language when used in explanatory prose. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
2. A flag has a long and short form
Protect both –verbose and -v consistently across help, errors and examples. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
3. A placeholder uses %d
Explain that it receives an integer and validate the format directive after translation. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
4. A help table has three fixed-width columns
Redesign wrapping before forcing translations into source-language lengths. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
5. An error contains an SQL query
Protect the query and translate the diagnosis around it. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
6. A CLI prints a JSON response
Keep schema keys stable unless the API explicitly defines localized data values. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
7. A shell script uses gettext
Separate shell variables from complete translatable messages as recommended by the gettext workflow. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
8. A user sets a locale unsupported by the tool
Follow documented fallback rather than emitting mixed-language fragments unpredictably. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
9. A filename is Arabic in an English terminal
Preserve the filename and test bidi/Unicode display without translating user data. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
10. A command example includes a placeholder FILE
Apply your metavariable policy consistently and make sure the literal command remains runnable after replacing FILE with a path. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
11. A tool logs machine events and user messages together
Keep structured log fields stable and localize only the intended human-facing message layer. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
12. An option was renamed in version 4
Version localized docs and deprecate the old flag consistently. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
13. The word ‘list’ appears as command and noun
Use context comments so translators know which occurrence is executable. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
14. A script depends on exit code 3
Preserve exit semantics regardless of localized message wording. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
15. The tool prints dates in logs
Decide whether logs need stable machine formatting while interactive display can localize. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
16. A translated error becomes less specific
Restore the exact technical failure and keep any recovery command tokens unchanged. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
17. A code block contains comments intended for learners
Translate comments only if the article’s teaching purpose requires it; do not translate language keywords. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
18. A Windows path example includes Program Files
Treat it as a path example, not prose, and explain platform assumptions separately. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
19. A command line contains quoted user text
Protect shell quoting while allowing the user’s runtime text to be multilingual. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
20. A new translator asks to localize all flags for friendliness
Explain the compatibility cost and follow the established command-alias policy rather than deciding per string. State the reason for the decision and one condition that would make you revisit it. That final condition turns a preference into a testable rule.
Now apply the same rule to a second locale, platform, screen size, voice, terminal or privacy state. Durable localization survives changed conditions rather than succeeding only in the example that produced the rule.
Release checklist
- Executable commands and flags have explicit protection rules.
- Human-facing strings are marked in source.
- Complete messages replace grammatical concatenation.
- Translator comments explain ambiguous CLI text.
- Placeholders and format directives are validated.
- Code, paths and identifiers remain exact.
- Machine-readable output is stable across locales.
- Exit codes do not depend on message language.
- Errors remain precise and actionable.
- Locale environment behavior is documented.
- Unicode and terminal widths are tested.
- Built-in help and documentation remain synchronized.
Frequently asked questions
Should commands be translated?
Usually not unless the tool explicitly supports localized aliases. Stable commands protect scripts, documentation and cross-language collaboration. The safest approach is to separate the invariant technical or product fact from the language layer that can legitimately vary.
Can help text be translated?
Yes. Help, descriptions, prompts and errors are strong candidates for localization as long as executable tokens remain exact. The safest approach is to separate the invariant technical or product fact from the language layer that can legitimately vary.
Why avoid concatenated strings?
Because target languages may need different word order, plural forms and punctuation that cannot be produced from source-language fragments. The safest approach is to separate the invariant technical or product fact from the language layer that can legitimately vary.
What is gettext useful for?
GNU gettext provides a mature model for marking source strings, extracting catalogs, adding context and delivering translations at runtime. The safest approach is to separate the invariant technical or product fact from the language layer that can legitimately vary.
Should machine-readable JSON be localized?
Stable schema and protocol fields should normally remain invariant; human-facing values can be localized only when the API contract defines that behavior. The safest approach is to separate the invariant technical or product fact from the language layer that can legitimately vary.
Can error messages be parsed by scripts?
It is safer to use exit codes or structured output. Human-readable localized prose is not a stable machine interface. The safest approach is to separate the invariant technical or product fact from the language layer that can legitimately vary.
What about filenames?
Treat runtime filenames as user/system data, not translatable text, while ensuring Unicode-safe display. The safest approach is to separate the invariant technical or product fact from the language layer that can legitimately vary.
How do we test CLI localization?
Run actual commands under supported locales, check examples, exit codes, placeholders, Unicode output, widths and machine-readable modes. The safest approach is to separate the invariant technical or product fact from the language layer that can legitimately vary.
Selected references and next routes
- GNU gettext manual: Preparing Program Sources
- GNU gettext utilities manual
- eduKateSG: Protect Unicode, Diacritics and Character Encoding
Conclusion
A command-line tool is both language and protocol. Localization succeeds when users can understand the protocol without the translation altering it.
By protecting commands, flags, code and structured output while translating complete human messages with context, developer tools can become multilingual without becoming incompatible.
