Go mow.cli localization means translating the human instructions around a command-line tool without corrupting its parser grammar. If you are looking for mow.cli Spec strings, App and Cmd help, StringOpt or StringArg usage, environment-variable defaults, nested commands or Unicode CLI testing, this practical guide shows how to separate what the program understands from what a person needs to read.
Imagine a small read-only research catalogue checker used by community groups in several countries. An operator wants to point it at a CSV file, select a language for its report and understand a warning about a missing column. The command must work the same way for people reading English, French, Arabic or Japanese. Translation fails if a friendly-looking example silently changes the names of the flags, switches a positional argument, or lets a default conceal an omitted input.
mow.cli is a Go library that defines applications with cli.App, subcommands with Command, typed options and positional arguments, and optional Spec strings that describe legal invocation patterns. Unlike purely decorative usage strings, a Spec can constrain parsing. We will use a harmless local-report example, work through typical mistakes, and build release tests that check accepted arguments as carefully as language quality. Exact behavior should be verified against the library version installed with the application.
Quick answer: make the example work before translating its explanation
For Go mow.cli, the reliable starting point is a miniature run: show the exact installed command, a harmless input, its accepted option spelling, the visible result and one specific recovery instruction. The parser’s grammar is the reference, while the explanation is written for human understanding. When a flag is genuinely localized in the software, document the new registered alias; when only the help text is translated, keep the machine token unchanged.
- Identify the version and executable actually distributed to readers.
- Preserve command tokens, input notation and structured output contracts unless deliberately changed in code.
- Translate purpose, help descriptions, examples of outcomes and appropriate recovery advice.
- Test success, failure, Unicode filenames and a terminal with a narrow display.
- Keep the first task short enough to copy without hidden prerequisites.
A safe local example to understand first
The example below illustrates a Go mow.cli interface around an imaginary catalogue inspection task. It is educational, not evidence that a specific release has already been compiled or that a library automatically selects translations. Adapt import paths, version requirements and formatting for your own application. The command’s intended effect is limited to printing or inspecting a local file reference; it should not update files or contact remote services.
package main
import (
"fmt"
"os"
cli "github.com/jawher/mow.cli"
)
func main() {
app := cli.App("catalog-check", "Inspect a local catalogue without changing it")
locale := app.StringOpt("language", "en", "Language of the reader-facing report")
file := app.StringArg("FILE", "", "Path to an existing catalogue")
app.Spec = "[--language] FILE"
app.Action = func() {
fmt.Printf("read-only input=%q report-language=%q\n", *file, *locale)
}
app.Run(os.Args)
}
Read the example from the outside in. A person provides a file and, where supported, a report language. The program parses literal command-line tokens into values before producing a human-facing explanation. Changing a message catalogue can improve the report, but it does not by itself register a new flag, validate a new date format or alter the contents of the source file. Use a synthetic fixture first so every value and side effect is visible.
The mental model: grammar, meaning, data and evidence
A command-line interface is a contract between a person and a program. A readable translation matters because it changes the decisions the person makes; a stable parser matters because it decides whether those decisions are carried out. That distinction has a practical consequence for a new reader: a line that looks friendlier in another language may still be wrong if it cannot be copied into a real shell.
Begin by separating four categories: shell tokens typed literally, placeholders that the reader replaces, natural-language descriptions, and data passed to other software. Only the descriptive category should change without an accompanying program change. Think of the option declaration as the stable shape of a door and the translated description as the sign explaining how to pass through it. The sign can improve, but it must point to the existing opening.
Good local help answers three questions early: what does this command do, how do I run the smallest useful example, and what do I do when it rejects my input? Long background material is useful only after those answers are clear. For a world-facing guide, one tested example is more useful than several ornate descriptions. An international reader may have a different shell, keyboard or decimal convention.
The following exercises use invented, nonprivate catalogues and read-only checks. Do not point a tutorial at confidential material or assume that a library translates its own messages without explicit application configuration. The desired result is not word-for-word similarity across locales. The desired result is the same safe user action, supported by comprehensible instructions and a predictable system response.
Twenty essential parts of Go mow.cli localization
1. cli.App and a readable identity
The cli.App constructor supplies the program name and a brief description. That name appears in invocations, while its description is a human-facing explanation that can be localized deliberately. That distinction has a practical consequence for a new reader: a line that looks friendlier in another language may still be wrong if it cannot be copied into a real shell.
A translated application name used as a shell token can make copied commands fail, even though the heading looks polished. The error here is not merely stylistic: it changes which operation the reader thinks they are authorizing. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Print the declared binary name and compare two language variants of the introductory help. Keep the executable name stable and translate the description only where the application can supply the translated string. Use a synthetic catalogue containing only invented records. Capture the command, the argument list, the report and the exit status so the result can be reproduced.
2. App.Action after parsing
The application Action runs only after parsing populates the declared option and argument pointers. It represents the work, not another piece of help text. Think of the option declaration as the stable shape of a door and the translated description as the sign explaining how to pass through it. The sign can improve, but it must point to the existing opening.
A volunteer may assume a translated option label changes the value passed to Action and misread a report produced from a different file. A person can follow the translated sentence perfectly and still encounter a parser rejection; that signals a mismatch between prose and software. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Run a local fixture and record the parsed file and selected locale before reading the translated report. Separate parser inputs from output language and do not rely on untested documentation prose. Repeat the check in two locales. The explanatory language may change, but any stable option names and data identifiers should remain predictable.
3. StringOpt and actual option spellings
StringOpt declares a string-valued option, using a supported name declaration, default and description. Its option spelling is an input contract. For a world-facing guide, one tested example is more useful than several ornate descriptions. An international reader may have a different shell, keyboard or decimal convention.
A translator may rename –language to a local-language equivalent without registering that alias in the executable. When the explanation and executable diverge, the shortest practical repair is to trace the token back to its declaration. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Copy a successful command from the localized documentation into the installed binary. Preserve documented spellings or implement intentional aliases with migration tests. Keep the fixture harmless and local. No network access, account credential or irreversible operation is needed to learn this distinction.
4. BoolOpt and switches
BoolOpt models a switch whose presence represents a choice; it is not a string that consumes an arbitrary following value. The desired result is not word-for-word similarity across locales. The desired result is the same safe user action, supported by comprehensible instructions and a predictable system response.
A translated sentence that instructs users to type –verbose yes can cause a parser error or shift the next token into the wrong slot. Treat this as a testable claim rather than a proofreading preference. A help page is accurate only when its examples match the shipped program. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Compare one invocation with the flag and one without it, and inspect the resulting boolean. Describe presence and absence in the local language rather than inventing textual values. Try a successful input first, then vary one token. If several things change together, the resulting error becomes harder to diagnose.
5. StringArg and positional inputs
StringArg declares a named positional value, such as FILE. It is supplied without an option prefix and appears in usage text. That distinction has a practical consequence for a new reader: a line that looks friendlier in another language may still be wrong if it cannot be copied into a real shell.
An example that adds an invented –file switch changes the invocation even if its natural-language instruction is clear. The consequence is usually visible in a copy-and-paste test, but a silent fallback can make it harder to notice. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Try the one-file example with a filename containing a space, passed as one shell argument. Explain quotation separately from positional grammar, showing why FILE is a placeholder rather than literal text. Document which output is produced by the parser and which comes from the application. Readers need different remedies for those failures.
6. StringsArg and repeated sources
StringsArg collects multiple positional values; the source documentation demonstrates repeated inputs including SRC… patterns. Think of the option declaration as the stable shape of a door and the translated description as the sign explaining how to pass through it. The sign can improve, but it must point to the existing opening.
A translated instruction may conceal the fact that a final destination argument is distinct from a variable-length source list. Review both the unfamiliar user’s interpretation and the parsed value. Either can be wrong while the other appears correct. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Test two sources and one terminal positional target with a read-only demonstration before teaching the ordering. Label each role precisely, preserving ordering and multiplicity in the translated explanation. A comparison of English and the target language should include both comprehension and the result of executing the published example.
7. Spec is executable grammar
An App or Cmd Spec constrains what invocations are accepted, rather than merely decorating a help screen. Brackets, choices and repetition have parser meaning. For a world-facing guide, one tested example is more useful than several ornate descriptions. An international reader may have a different shell, keyboard or decimal convention.
Localizing a Spec by rewriting punctuation or argument names can change what the application accepts. The error here is not merely stylistic: it changes which operation the reader thinks they are authorizing. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Record the successful and failing examples before editing any descriptive copy around the Spec. Treat the Spec as version-controlled program behavior; translate explanatory prose beside it. Use a synthetic catalogue containing only invented records. Capture the command, the argument list, the report and the exit status so the result can be reproduced.
8. Square brackets in Spec
Square brackets denote optional material in the documented Spec language; they are not punctuation for emphasis or a translator’s aside. The desired result is not word-for-word similarity across locales. The desired result is the same safe user action, supported by comprehensible instructions and a predictable system response.
Removing brackets to make usage look simpler can convert an optional flag into a requirement. A person can follow the translated sentence perfectly and still encounter a parser rejection; that signals a mismatch between prose and software. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Run a call with the optional token omitted and check that its documented default is applied. Preserve grammar punctuation and explain optionality in the reader’s language. Repeat the check in two locales. The explanatory language may change, but any stable option names and data identifiers should remain predictable.
9. Alternatives and grouping
The Spec language can express alternatives using the vertical choice operator and grouping rules for related options. That distinction has a practical consequence for a new reader: a line that looks friendlier in another language may still be wrong if it cannot be copied into a real shell.
A translator who rewrites the alternatives as one narrative sentence may promise options that cannot be combined. When the explanation and executable diverge, the shortest practical repair is to trace the token back to its declaration. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Test each allowed alternative and at least one prohibited combination on a fixture. Describe exclusive choices plainly while keeping the executable grammar untouched. Keep the fixture harmless and local. No network access, account credential or irreversible operation is needed to learn this distinction.
10. Ellipsis and argument multiplicity
The three-dot form signals repetition in documented Specs and appears in patterns such as SRC… DST. Think of the option declaration as the stable shape of a door and the translated description as the sign explaining how to pass through it. The sign can improve, but it must point to the existing opening.
Omitting repetition from a translated help example may cause users to think the tool accepts only one input file. Treat this as a testable claim rather than a proofreading preference. A help page is accurate only when its examples match the shipped program. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Try one repeated input, three inputs and a missing final required argument to show the actual boundary. Translate the idea of one-or-more inputs while preserving the exact declared Spec. Try a successful input first, then vary one token. If several things change together, the resulting error becomes harder to diagnose.
11. Nested Command definitions
App.Command defines a named command and supplies a Cmd for its own flags, arguments, Spec and Action. Commands may be nested. For a world-facing guide, one tested example is more useful than several ornate descriptions. An international reader may have a different shell, keyboard or decimal convention.
A help page that shows only a child name omits the parent path a user must type. The consequence is usually visible in a copy-and-paste test, but a silent fallback can make it harder to notice. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Walk through a complete read-only command path, then intentionally omit its parent and observe the error. Publish full command paths, not detached names borrowed from a menu. Document which output is produced by the parser and which comes from the application. Readers need different remedies for those failures.
12. Global options versus local options
Options on App and those on Cmd live in different command scopes. The parser’s accepted location determines the usable example. The desired result is not word-for-word similarity across locales. The desired result is the same safe user action, supported by comprehensible instructions and a predictable system response.
A localized quick-start may move a child option ahead of the subcommand, contradicting the registered grammar. Review both the unfamiliar user’s interpretation and the parsed value. Either can be wrong while the other appears correct. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Test the option before and after the subcommand, and document only accepted placement. Keep the command tree visible as a hierarchy and explain where each switch belongs. A comparison of English and the target language should include both comprehension and the result of executing the published example.
13. LongDesc for fuller explanations
The App or Cmd LongDesc can carry a fuller help explanation than the short description. This is a promising location for readable instructions. That distinction has a practical consequence for a new reader: a line that looks friendlier in another language may still be wrong if it cannot be copied into a real shell.
Long descriptions copied from another region may refer to paths or installation commands that do not exist on the target system. The error here is not merely stylistic: it changes which operation the reader thinks they are authorizing. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Read the full help in a narrow terminal and test every command contained in it. Translate purpose and procedure; replace only factual regional examples after verification. Use a synthetic catalogue containing only invented records. Capture the command, the argument list, the report and the exit status so the result can be reproduced.
14. EnvVar in long-form declarations
Long-form argument and option definitions can specify environment-variable sources for defaults. The environment name is a machine-recognized key. Think of the option declaration as the stable shape of a door and the translated description as the sign explaining how to pass through it. The sign can improve, but it must point to the existing opening.
Localizing the environment variable’s name in prose while leaving the program unchanged can make a command run with an unintended fallback. A person can follow the translated sentence perfectly and still encounter a parser rejection; that signals a mismatch between prose and software. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Invoke with an empty environment, a defined environment variable and an explicit CLI value. Keep variable keys literal, explain where they come from and identify which value won. Repeat the check in two locales. The explanatory language may change, but any stable option names and data identifiers should remain predictable.
15. SetByUser versus effective value
Long-form definitions can expose SetByUser to distinguish explicit command-line selection from a defaulted value. For a world-facing guide, one tested example is more useful than several ornate descriptions. An international reader may have a different shell, keyboard or decimal convention.
A report that says the user chose the locale may be false when the locale was inherited from configuration or environment. When the explanation and executable diverge, the shortest practical repair is to trace the token back to its declaration. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Compare three runs: omitted, environment-provided and explicitly supplied option. Use wording such as selected, inherited or defaulted according to observable provenance. Keep the fixture harmless and local. No network access, account credential or irreversible operation is needed to learn this distinction.
16. Flag.Value custom conversion
Custom types can implement Go’s flag.Value interface and be wired through VarOpt or VarArg. Conversion is part of the accepted data grammar. The desired result is not word-for-word similarity across locales. The desired result is the same safe user action, supported by comprehensible instructions and a predictable system response.
A localized decimal, duration or date may be human-readable but invalid for a particular custom converter. Treat this as a testable claim rather than a proofreading preference. A help page is accurate only when its examples match the shipped program. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Probe an accepted value and a regional-looking counterexample, recording whether conversion succeeds. Explain accepted input notation separately from localized display formatting. Try a successful input first, then vary one token. If several things change together, the resulting error becomes harder to diagnose.
17. Double dash separator
The double-dash token ends option interpretation so a subsequent filename beginning with a hyphen can be handled as an argument. That distinction has a practical consequence for a new reader: a line that looks friendlier in another language may still be wrong if it cannot be copied into a real shell.
A translated instruction may teach users to rename files rather than showing the safer separator. The consequence is usually visible in a copy-and-paste test, but a silent fallback can make it harder to notice. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Try a harmless existing file whose name begins with a dash, using — before the positional value. Show the exact separator and clarify that it is shell syntax rather than a translatable phrase. Document which output is produced by the parser and which comes from the application. Readers need different remedies for those failures.
18. Generated help and errors
mow.cli builds help and usage output from declarations; actual errors can arise before the Action runs. Think of the option declaration as the stable shape of a door and the translated description as the sign explaining how to pass through it. The sign can improve, but it must point to the existing opening.
A translation may make success and failure look the same, so users believe a file was checked when parsing never completed. Review both the unfamiliar user’s interpretation and the parsed value. Either can be wrong while the other appears correct. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Capture help, malformed input, stderr and process status, then compare with the accepted command. Translate recovery text without claiming the application processed data it rejected. A comparison of English and the target language should include both comprehension and the result of executing the published example.
19. Hidden command compatibility
A command may be hidden in help yet remain callable for backward compatibility. Discoverability and execution are different properties. For a world-facing guide, one tested example is more useful than several ornate descriptions. An international reader may have a different shell, keyboard or decimal convention.
A translated help index that simply drops deprecated commands can leave legacy users without a migration path. The error here is not merely stylistic: it changes which operation the reader thinks they are authorizing. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Test a hidden legacy command and the recommended replacement, without performing destructive actions. Explain whether the name is supported, deprecated or no longer accepted in this release. Use a synthetic catalogue containing only invented records. Capture the command, the argument list, the report and the exit status so the result can be reproduced.
20. Release platforms and Unicode paths
Go builds may run on different operating systems with different shells and path rules; unicode filenames exercise both terminal and filesystem handling. The desired result is not word-for-word similarity across locales. The desired result is the same safe user action, supported by comprehensible instructions and a predictable system response.
A command copied from a Unix shell into Windows PowerShell may fail because of quoting or path syntax, not translation quality. A person can follow the translated sentence perfectly and still encounter a parser rejection; that signals a mismatch between prose and software. The difference matters in a regional archive team receives files whose names contain accents, spaces and non-latin characters. the program is only checking headers, not editing sources. its report is localizable; its flags and csv column identifiers are stable.
Use a path with a space and a non-Latin letter on each supported platform, recording the parsed value. Offer platform-specific quoting examples that are actually tested while preserving the program’s flag grammar. Repeat the check in two locales. The explanatory language may change, but any stable option names and data identifiers should remain predictable.
One complete reader journey: from help to a dependable report
A regional archive team receives files whose names contain accents, spaces and non-Latin characters. The program is only checking headers, not editing sources. Its report is localizable; its flags and CSV column identifiers are stable. Start with a computer on which the installed program and source fixture are known. The reader should be able to answer what the tool is expected to read, which values can be selected, how to confirm it ran and what to do when it did not. These questions are more important than whether a translated slogan sounds elegant.
Step 1: Find the command
Open the packaged instructions, locate the actual executable name, and confirm that it launches. Distinguish a project title from a binary name. This is where cli.app and a readable identity becomes concrete. Print the declared binary name and compare two language variants of the introductory help. Keep the executable name stable and translate the description only where the application can supply the translated string.
The acceptable result is evidence the reader can inspect, not a promise that localization was installed. Ask the reader to say in their own words which part was translated and which part of the invocation must remain unchanged. Try a successful input first, then vary one token. If several things change together, the resulting error becomes harder to diagnose.
Step 2: Read the shortest help
Find a one-sentence purpose statement and the smallest required input. If the usage is long, begin with the shortest valid path. This is where stringopt and actual option spellings becomes concrete. Copy a successful command from the localized documentation into the installed binary. Preserve documented spellings or implement intentional aliases with migration tests.
The acceptable result is evidence the reader can inspect, not a promise that localization was installed. Ask the reader to say in their own words which part was translated and which part of the invocation must remain unchanged. Document which output is produced by the parser and which comes from the application. Readers need different remedies for those failures.
Step 3: Select a harmless fixture
Create or choose nonprivate data with a known filename and expected contents. Do not use a valuable original for first-time learning. This is where stringarg and positional inputs becomes concrete. Try the one-file example with a filename containing a space, passed as one shell argument. Explain quotation separately from positional grammar, showing why FILE is a placeholder rather than literal text.
The acceptable result is evidence the reader can inspect, not a promise that localization was installed. Ask the reader to say in their own words which part was translated and which part of the invocation must remain unchanged. A comparison of English and the target language should include both comprehension and the result of executing the published example.
Step 4: Run the baseline
Copy a tested English invocation exactly. Record stdout, stderr, exit status and whether the input file changed. This is where spec is executable grammar becomes concrete. Record the successful and failing examples before editing any descriptive copy around the Spec. Treat the Spec as version-controlled program behavior; translate explanatory prose beside it.
The acceptable result is evidence the reader can inspect, not a promise that localization was installed. Ask the reader to say in their own words which part was translated and which part of the invocation must remain unchanged. Use a synthetic catalogue containing only invented records. Capture the command, the argument list, the report and the exit status so the result can be reproduced.
Step 5: Choose another locale
Use only a language selection mechanism that the application implements. A translated article cannot create parser behavior. This is where alternatives and grouping becomes concrete. Test each allowed alternative and at least one prohibited combination on a fixture. Describe exclusive choices plainly while keeping the executable grammar untouched.
The acceptable result is evidence the reader can inspect, not a promise that localization was installed. Ask the reader to say in their own words which part was translated and which part of the invocation must remain unchanged. Repeat the check in two locales. The explanatory language may change, but any stable option names and data identifiers should remain predictable.
Step 6: Inspect the localized report
Check task meaning, warnings, labels, examples and next steps. Verify that every message is truthful about what succeeded. This is where nested command definitions becomes concrete. Walk through a complete read-only command path, then intentionally omit its parent and observe the error. Publish full command paths, not detached names borrowed from a menu.
The acceptable result is evidence the reader can inspect, not a promise that localization was installed. Ask the reader to say in their own words which part was translated and which part of the invocation must remain unchanged. Keep the fixture harmless and local. No network access, account credential or irreversible operation is needed to learn this distinction.
Step 7: Induce a single parser error
Misspell one registered switch. Observe the result before entering the application logic and note the recovery advice. This is where longdesc for fuller explanations becomes concrete. Read the full help in a narrow terminal and test every command contained in it. Translate purpose and procedure; replace only factual regional examples after verification.
The acceptable result is evidence the reader can inspect, not a promise that localization was installed. Ask the reader to say in their own words which part was translated and which part of the invocation must remain unchanged. Try a successful input first, then vary one token. If several things change together, the resulting error becomes harder to diagnose.
Step 8: Induce a separate data error
Use a nonexistent local file with otherwise valid syntax. Confirm the application-level explanation does not blame a flag. This is where setbyuser versus effective value becomes concrete. Compare three runs: omitted, environment-provided and explicitly supplied option. Use wording such as selected, inherited or defaulted according to observable provenance.
The acceptable result is evidence the reader can inspect, not a promise that localization was installed. Ask the reader to say in their own words which part was translated and which part of the invocation must remain unchanged. Document which output is produced by the parser and which comes from the application. Readers need different remedies for those failures.
Step 9: Try a complex filename
Test a path with spaces or non-Latin letters. Confirm the shell passes one argument and the application retains it correctly. This is where double dash separator becomes concrete. Try a harmless existing file whose name begins with a dash, using — before the positional value. Show the exact separator and clarify that it is shell syntax rather than a translatable phrase.
The acceptable result is evidence the reader can inspect, not a promise that localization was installed. Ask the reader to say in their own words which part was translated and which part of the invocation must remain unchanged. A comparison of English and the target language should include both comprehension and the result of executing the published example.
Step 10: Keep the result reproducible
Save a small release test record with version, locale, command, expected output class and an explanation of any differences. This is where hidden command compatibility becomes concrete. Test a hidden legacy command and the recommended replacement, without performing destructive actions. Explain whether the name is supported, deprecated or no longer accepted in this release.
The acceptable result is evidence the reader can inspect, not a promise that localization was installed. Ask the reader to say in their own words which part was translated and which part of the invocation must remain unchanged. Use a synthetic catalogue containing only invented records. Capture the command, the argument list, the report and the exit status so the result can be reproduced.
Troubleshooting: twenty specific investigations, not generic error advice
Investigation 1: cli.App and a readable identity
Start by reproducing the symptom with the smallest nonprivate input. A plausible failure is this: A translated application name used as a shell token can make copied commands fail, even though the heading looks polished. The next controlled check is: Print the declared binary name and compare two language variants of the introductory help.
If the behavior is confirmed, the repair is specific: Keep the executable name stable and translate the description only where the application can supply the translated string. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 2: App.Action after parsing
Compare the user’s literal command with the declared grammar before changing any translation. A plausible failure is this: A volunteer may assume a translated option label changes the value passed to Action and misread a report produced from a different file. The next controlled check is: Run a local fixture and record the parsed file and selected locale before reading the translated report.
If the behavior is confirmed, the repair is specific: Separate parser inputs from output language and do not rely on untested documentation prose. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 3: StringOpt and actual option spellings
Read the actual help or error output rather than inferring it from a design document. A plausible failure is this: A translator may rename –language to a local-language equivalent without registering that alias in the executable. The next controlled check is: Copy a successful command from the localized documentation into the installed binary.
If the behavior is confirmed, the repair is specific: Preserve documented spellings or implement intentional aliases with migration tests. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 4: BoolOpt and switches
Check whether the displayed result came from a fallback or an explicitly chosen input. A plausible failure is this: A translated sentence that instructs users to type –verbose yes can cause a parser error or shift the next token into the wrong slot. The next controlled check is: Compare one invocation with the flag and one without it, and inspect the resulting boolean.
If the behavior is confirmed, the repair is specific: Describe presence and absence in the local language rather than inventing textual values. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 5: StringArg and positional inputs
Look for a shell-token problem before assuming the application parser is defective. A plausible failure is this: An example that adds an invented –file switch changes the invocation even if its natural-language instruction is clear. The next controlled check is: Try the one-file example with a filename containing a space, passed as one shell argument.
If the behavior is confirmed, the repair is specific: Explain quotation separately from positional grammar, showing why FILE is a placeholder rather than literal text. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 6: StringsArg and repeated sources
Separate typed input conversion from later file validation. A plausible failure is this: A translated instruction may conceal the fact that a final destination argument is distinct from a variable-length source list. The next controlled check is: Test two sources and one terminal positional target with a read-only demonstration before teaching the ordering.
If the behavior is confirmed, the repair is specific: Label each role precisely, preserving ordering and multiplicity in the translated explanation. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 7: Spec is executable grammar
Review the result with a speaker of the target language who has not seen the source text. A plausible failure is this: Localizing a Spec by rewriting punctuation or argument names can change what the application accepts. The next controlled check is: Record the successful and failing examples before editing any descriptive copy around the Spec.
If the behavior is confirmed, the repair is specific: Treat the Spec as version-controlled program behavior; translate explanatory prose beside it. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 8: Square brackets in Spec
Use the released executable rather than only a source-tree demonstration. A plausible failure is this: Removing brackets to make usage look simpler can convert an optional flag into a requirement. The next controlled check is: Run a call with the optional token omitted and check that its documented default is applied.
If the behavior is confirmed, the repair is specific: Preserve grammar punctuation and explain optionality in the reader’s language. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 9: Alternatives and grouping
Start by reproducing the symptom with the smallest nonprivate input. A plausible failure is this: A translator who rewrites the alternatives as one narrative sentence may promise options that cannot be combined. The next controlled check is: Test each allowed alternative and at least one prohibited combination on a fixture.
If the behavior is confirmed, the repair is specific: Describe exclusive choices plainly while keeping the executable grammar untouched. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 10: Ellipsis and argument multiplicity
Compare the user’s literal command with the declared grammar before changing any translation. A plausible failure is this: Omitting repetition from a translated help example may cause users to think the tool accepts only one input file. The next controlled check is: Try one repeated input, three inputs and a missing final required argument to show the actual boundary.
If the behavior is confirmed, the repair is specific: Translate the idea of one-or-more inputs while preserving the exact declared Spec. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 11: Nested Command definitions
Read the actual help or error output rather than inferring it from a design document. A plausible failure is this: A help page that shows only a child name omits the parent path a user must type. The next controlled check is: Walk through a complete read-only command path, then intentionally omit its parent and observe the error.
If the behavior is confirmed, the repair is specific: Publish full command paths, not detached names borrowed from a menu. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 12: Global options versus local options
Check whether the displayed result came from a fallback or an explicitly chosen input. A plausible failure is this: A localized quick-start may move a child option ahead of the subcommand, contradicting the registered grammar. The next controlled check is: Test the option before and after the subcommand, and document only accepted placement.
If the behavior is confirmed, the repair is specific: Keep the command tree visible as a hierarchy and explain where each switch belongs. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 13: LongDesc for fuller explanations
Look for a shell-token problem before assuming the application parser is defective. A plausible failure is this: Long descriptions copied from another region may refer to paths or installation commands that do not exist on the target system. The next controlled check is: Read the full help in a narrow terminal and test every command contained in it.
If the behavior is confirmed, the repair is specific: Translate purpose and procedure; replace only factual regional examples after verification. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 14: EnvVar in long-form declarations
Separate typed input conversion from later file validation. A plausible failure is this: Localizing the environment variable’s name in prose while leaving the program unchanged can make a command run with an unintended fallback. The next controlled check is: Invoke with an empty environment, a defined environment variable and an explicit CLI value.
If the behavior is confirmed, the repair is specific: Keep variable keys literal, explain where they come from and identify which value won. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 15: SetByUser versus effective value
Review the result with a speaker of the target language who has not seen the source text. A plausible failure is this: A report that says the user chose the locale may be false when the locale was inherited from configuration or environment. The next controlled check is: Compare three runs: omitted, environment-provided and explicitly supplied option.
If the behavior is confirmed, the repair is specific: Use wording such as selected, inherited or defaulted according to observable provenance. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 16: Flag.Value custom conversion
Use the released executable rather than only a source-tree demonstration. A plausible failure is this: A localized decimal, duration or date may be human-readable but invalid for a particular custom converter. The next controlled check is: Probe an accepted value and a regional-looking counterexample, recording whether conversion succeeds.
If the behavior is confirmed, the repair is specific: Explain accepted input notation separately from localized display formatting. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 17: Double dash separator
Start by reproducing the symptom with the smallest nonprivate input. A plausible failure is this: A translated instruction may teach users to rename files rather than showing the safer separator. The next controlled check is: Try a harmless existing file whose name begins with a dash, using — before the positional value.
If the behavior is confirmed, the repair is specific: Show the exact separator and clarify that it is shell syntax rather than a translatable phrase. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 18: Generated help and errors
Compare the user’s literal command with the declared grammar before changing any translation. A plausible failure is this: A translation may make success and failure look the same, so users believe a file was checked when parsing never completed. The next controlled check is: Capture help, malformed input, stderr and process status, then compare with the accepted command.
If the behavior is confirmed, the repair is specific: Translate recovery text without claiming the application processed data it rejected. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 19: Hidden command compatibility
Read the actual help or error output rather than inferring it from a design document. A plausible failure is this: A translated help index that simply drops deprecated commands can leave legacy users without a migration path. The next controlled check is: Test a hidden legacy command and the recommended replacement, without performing destructive actions.
If the behavior is confirmed, the repair is specific: Explain whether the name is supported, deprecated or no longer accepted in this release. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Investigation 20: Release platforms and Unicode paths
Check whether the displayed result came from a fallback or an explicitly chosen input. A plausible failure is this: A command copied from a Unix shell into Windows PowerShell may fail because of quoting or path syntax, not translation quality. The next controlled check is: Use a path with a space and a non-Latin letter on each supported platform, recording the parsed value.
If the behavior is confirmed, the repair is specific: Offer platform-specific quoting examples that are actually tested while preserving the program’s flag grammar. A useful incident note says which token was typed, what output appeared, whether execution began, and how the revised instruction prevents the same misunderstanding. This gives future readers something they can apply instead of a vague instruction to try again.
Practical cases that reveal hidden translation mistakes
A filename looks translated but is not the same file
An operator has a folder containing a path with a space and a non-Latin letter. The localized quick-start renders it without shell quoting. The program receives two tokens, so the failure is not in the translated report at all. Correct the shell example, show which characters belong to the name, and compare the actual parsed path with the file on disk. A readable instruction is not enough unless the shell passes the intended input.
In Go mow.cli, connect the diagnosis to stringopt and actual option spellings. StringOpt declares a string-valued option, using a supported name declaration, default and description. Its option spelling is an input contract. Preserve documented spellings or implement intentional aliases with migration tests. The important distinction is between a message understood by a person and an input accepted by software. Both need evidence, and neither should be assumed to follow automatically from the other.
A default is mistaken for a reader’s decision
A second operator omits the report-language option and gets English. The translated introduction says the language was automatically detected, which is not what the test established. Check whether the value came from a program default, an environment variable, a configuration file or an explicit switch. Then revise the sentence to describe the source of the value. This protects users from assuming their preferences were recognized when no such detection occurred.
In Go mow.cli, connect the diagnosis to spec is executable grammar. An App or Cmd Spec constrains what invocations are accepted, rather than merely decorating a help screen. Brackets, choices and repetition have parser meaning. Treat the Spec as version-controlled program behavior; translate explanatory prose beside it. The important distinction is between a message understood by a person and an input accepted by software. Both need evidence, and neither should be assumed to follow automatically from the other.
A parser error is reported as a successful task
A third operator types a misspelled option. No file is inspected, but a friendly translated message says the catalogue was checked. The remedy is to move success messaging behind successful parsing and task execution, give the rejected token in the error, and show a corrected invocation. Review output channels and process status as well as language. An accessible translation must not conceal whether an operation happened.
In Go mow.cli, connect the diagnosis to nested command definitions. App.Command defines a named command and supplies a Cmd for its own flags, arguments, Spec and Action. Commands may be nested. Publish full command paths, not detached names borrowed from a menu. The important distinction is between a message understood by a person and an input accepted by software. Both need evidence, and neither should be assumed to follow automatically from the other.
A numeric example changes meaning at the language boundary
A fourth operator follows a localized guide containing a comma decimal separator. The text is culturally familiar, but the particular parser or converter may require a dot or an integer-only format. Test the exact input grammar and the printed output separately. If a converter accepts only one notation, the guide can explain that rule in the user’s language while leaving the actual command token correctly formatted.
In Go mow.cli, connect the diagnosis to setbyuser versus effective value. Long-form definitions can expose SetByUser to distinguish explicit command-line selection from a defaulted value. Use wording such as selected, inherited or defaulted according to observable provenance. The important distinction is between a message understood by a person and an input accepted by software. Both need evidence, and neither should be assumed to follow automatically from the other.
A multilingual release checklist readers can actually use
Release check 1: The installed version is recorded and matches every code example.
Print the declared binary name and compare two language variants of the introductory help. The installed version is recorded and matches every code example. Keep the executable name stable and translate the description only where the application can supply the translated string. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 2: The first paragraph says what useful problem the command solves.
Run a local fixture and record the parsed file and selected locale before reading the translated report. The first paragraph says what useful problem the command solves. Separate parser inputs from output language and do not rely on untested documentation prose. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 3: Every command shown can be copied into a supported shell.
Copy a successful command from the localized documentation into the installed binary. Every command shown can be copied into a supported shell. Preserve documented spellings or implement intentional aliases with migration tests. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 4: The examples use nonprivate, non-destructive fixtures.
Compare one invocation with the flag and one without it, and inspect the resulting boolean. The examples use nonprivate, non-destructive fixtures. Describe presence and absence in the local language rather than inventing textual values. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 5: Registered option names and command paths are not silently translated.
Try the one-file example with a filename containing a space, passed as one shell argument. Registered option names and command paths are not silently translated. Explain quotation separately from positional grammar, showing why FILE is a placeholder rather than literal text. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 6: Every placeholder is clearly distinguishable from literal text.
Test two sources and one terminal positional target with a read-only demonstration before teaching the ordering. Every placeholder is clearly distinguishable from literal text. Label each role precisely, preserving ordering and multiplicity in the translated explanation. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 7: The declared defaults match the behavior when values are omitted.
Record the successful and failing examples before editing any descriptive copy around the Spec. The declared defaults match the behavior when values are omitted. Treat the Spec as version-controlled program behavior; translate explanatory prose beside it. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 8: Required inputs are identified before advanced optional features.
Run a call with the optional token omitted and check that its documented default is applied. Required inputs are identified before advanced optional features. Preserve grammar punctuation and explain optionality in the reader’s language. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 9: Any environment-variable keys are written exactly as recognized.
Test each allowed alternative and at least one prohibited combination on a fixture. Any environment-variable keys are written exactly as recognized. Describe exclusive choices plainly while keeping the executable grammar untouched. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 10: Typed input examples use values accepted by the actual converter.
Try one repeated input, three inputs and a missing final required argument to show the actual boundary. Typed input examples use values accepted by the actual converter. Translate the idea of one-or-more inputs while preserving the exact declared Spec. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 11: A successful run states what the application did and did not do.
Walk through a complete read-only command path, then intentionally omit its parent and observe the error. A successful run states what the application did and did not do. Publish full command paths, not detached names borrowed from a menu. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 12: A parser failure is not reported as successful application work.
Test the option before and after the subcommand, and document only accepted placement. A parser failure is not reported as successful application work. Keep the command tree visible as a hierarchy and explain where each switch belongs. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 13: The error identifies a meaningful first repair step.
Read the full help in a narrow terminal and test every command contained in it. The error identifies a meaningful first repair step. Translate purpose and procedure; replace only factual regional examples after verification. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 14: Help is usable in a narrow plain-text terminal.
Invoke with an empty environment, a defined environment variable and an explicit CLI value. Help is usable in a narrow plain-text terminal. Keep variable keys literal, explain where they come from and identify which value won. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 15: Unicode arguments survive shell parsing and application handling.
Compare three runs: omitted, environment-provided and explicitly supplied option. Unicode arguments survive shell parsing and application handling. Use wording such as selected, inherited or defaulted according to observable provenance. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 16: Structured data identifiers do not change with display language.
Probe an accepted value and a regional-looking counterexample, recording whether conversion succeeds. Structured data identifiers do not change with display language. Explain accepted input notation separately from localized display formatting. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 17: A test includes an alternative locale and an English baseline.
Try a harmless existing file whose name begins with a dash, using — before the positional value. A test includes an alternative locale and an English baseline. Show the exact separator and clarify that it is shell syntax rather than a translatable phrase. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 18: Windows or Unix-specific instructions are clearly scoped and tested.
Capture help, malformed input, stderr and process status, then compare with the accepted command. Windows or Unix-specific instructions are clearly scoped and tested. Translate recovery text without claiming the application processed data it rejected. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 19: Autocomplete advice describes the functionality really packaged.
Test a hidden legacy command and the recommended replacement, without performing destructive actions. Autocomplete advice describes the functionality really packaged. Explain whether the name is supported, deprecated or no longer accepted in this release. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Release check 20: A reader who has never seen the source can finish one task unaided.
Use a path with a space and a non-Latin letter on each supported platform, recording the parsed value. A reader who has never seen the source can finish one task unaided. Offer platform-specific quoting examples that are actually tested while preserving the program’s flag grammar. Use a written pass or fail result rather than relying on a reviewer’s general impression of fluency. The translated wording should make the action and its limit unmistakable; the executable should produce the same intended safe outcome.
Four weeks of focused learning and improvement
Week one: discover the actual contract
Inventory the executable names, versions, real command paths, required arguments, defaults and output types. Write one small baseline command and one error case. Do not begin with dozens of strings: make a single complete user task reproducible. Compare one invocation with the flag and one without it, and inspect the resulting boolean. Describe presence and absence in the local language rather than inventing textual values.
Week two: translate the guidance a beginner needs
Write the purpose, input labels, first-run example, predictable result and error repair for the highest-frequency task. Check terminology with a fluent reader who is not part of the implementation team. Avoid translating identifiers that the binary still requires. Test each allowed alternative and at least one prohibited combination on a fixture. Describe exclusive choices plainly while keeping the executable grammar untouched.
Week three: test boundaries rather than only happy paths
Use space-containing paths, non-Latin filenames, omitted options, invalid numeric values, terminal width differences and a second operating system where supported. Record whether each fault belongs to shell parsing, the CLI parser, application validation or display encoding. Invoke with an empty environment, a defined environment variable and an explicit CLI value. Keep variable keys literal, explain where they come from and identify which value won.
Week four: release, explain and maintain
Publish only examples that run against the packaged version. Link primary documentation, record a small test matrix, and provide a readable correction path. When dependencies or accepted options change, repeat the command tests before assuming the old translation remains accurate. Test a hidden legacy command and the recommended replacement, without performing destructive actions. Explain whether the name is supported, deprecated or no longer accepted in this release.
Frequently asked questions
Can I translate every option name?
No. A localized description does not register a new parser token. Preserve documented spellings or implement intentional aliases with migration tests. If aliases are intentionally added in code, test the new and legacy spellings on the released binary.
Is a translated help page the same as a localized application?
Not necessarily. mow.cli builds help and usage output from declarations; actual errors can arise before the Action runs. The help page is one interface; validation messages, prompts and report text may be generated elsewhere and need their own tests.
Why does a copied example fail only in another language?
Check tokenization, Unicode paths and numeric notation before judging the natural-language translation. Use a path with a space and a non-Latin letter on each supported platform, recording the parsed value. A correct sentence can still contain an unusable literal command.
Should machine-readable JSON keys be translated?
Only through an intentional versioned schema design. Explain accepted input notation separately from localized display formatting. A human report can use translated headings while downstream programs continue to receive stable keys.
How do I know a default was used?
Leave the option out in a controlled fixture and compare it with an explicit value. Record the successful and failing examples before editing any descriptive copy around the Spec. Use wording that distinguishes a deliberate choice from a fallback.
Can automatic translation finish this work?
Machine translation can draft descriptive strings, but it cannot prove accepted grammar or file effects. Try a harmless existing file whose name begins with a dash, using — before the positional value. Execution evidence and human comprehension testing are both required.
What if an error message is understandable but unhelpful?
Name the failed layer, the offending input and a corrected example. Translate purpose and procedure; replace only factual regional examples after verification. A reader should know the next safe step without guessing.
How should I test a Unicode filename?
Use a real harmless path with a space and non-Latin characters, then compare the received argument and file-opening behavior. Compare three runs: omitted, environment-provided and explicitly supplied option. Record platform and shell to make the result reproducible.
Can we document untested completion behavior?
Describe completion only when the shipped program provides it. Test a hidden legacy command and the recommended replacement, without performing destructive actions. Avoid borrowing features from another framework’s help page.
Does a 4,500-word guide make the software safer?
Length alone cannot establish quality. A guide earns trust through accurate commands, transparent limits, useful examples and verified repairs. Print the declared binary name and compare two language variants of the introductory help. Give readers a dependable first task before deep background.
What is the difference between grammar and explanation?
Grammar is what the parser recognizes; explanation is what helps the person use it. Removing brackets to make usage look simpler can convert an optional flag into a requirement. Both must agree, but one cannot be substituted for the other.
What should I do when the dependency changes?
Retest installed commands, defaults, option names, output channels, Unicode paths and failure messages. Translate recovery text without claiming the application processed data it rejected. Treat the change as a compatibility check, not just a text refresh.
Primary references and further reading
Library features can evolve, and configuration differs by application. Check the official documentation for Go mow.cli and the pinned dependencies used in your own build before adopting a snippet. These references provide the basis for the API details in this guide. For broader theory of meaning transfer, consult the translation master; for other frameworks and specialisms, use the series index. Neither should be treated as a substitute for running the exact application you distribute.
- https://github.com/jawher/mow.cli
- https://pkg.go.dev/github.com/jawher/mow.cli
- Master Art of Translation — complete system
- Translate Like a Pro — series index
The lasting test of a good Go mow.cli localization is simple to state but serious to complete: a person can carry out the same intended task safely, read an accurate explanation of the outcome, and recover from errors without needing to know the source language. Keep parser grammar stable, make the human explanation precise, and check the installed program rather than trusting an attractive translation alone.