mirror of
https://github.com/spf13/cobra
synced 2024-11-24 22:57:12 +00:00
feat(i18n): translate more user-facing messages
This commit is contained in:
parent
0abea784c4
commit
ca6ece94df
4 changed files with 202 additions and 12 deletions
23
command.go
23
command.go
|
@ -759,7 +759,7 @@ func (c *Command) findSuggestions(arg string) string {
|
||||||
}
|
}
|
||||||
suggestionsString := ""
|
suggestionsString := ""
|
||||||
if suggestions := c.SuggestionsFor(arg); len(suggestions) > 0 {
|
if suggestions := c.SuggestionsFor(arg); len(suggestions) > 0 {
|
||||||
suggestionsString += "\n\nDid you mean this?\n"
|
suggestionsString += "\n\n" + i18nDidYouMeanThis() + "\n"
|
||||||
for _, s := range suggestions {
|
for _, s := range suggestions {
|
||||||
suggestionsString += fmt.Sprintf("\t%v\n", s)
|
suggestionsString += fmt.Sprintf("\t%v\n", s)
|
||||||
}
|
}
|
||||||
|
@ -880,7 +880,7 @@ func (c *Command) execute(a []string) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(c.Deprecated) > 0 {
|
if len(c.Deprecated) > 0 {
|
||||||
c.Printf("Command %q is deprecated, %s\n", c.Name(), c.Deprecated)
|
c.Printf(i18nCommandDeprecatedWarning()+"\n", c.Name(), c.Deprecated)
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialize help and version flag at the last point possible to allow for user
|
// initialize help and version flag at the last point possible to allow for user
|
||||||
|
@ -1165,7 +1165,7 @@ func (c *Command) ValidateRequiredFlags() error {
|
||||||
})
|
})
|
||||||
|
|
||||||
if len(missingFlagNames) > 0 {
|
if len(missingFlagNames) > 0 {
|
||||||
return fmt.Errorf(`required flag(s) "%s" not set`, strings.Join(missingFlagNames, `", "`))
|
return fmt.Errorf(i18nFlagNotSetError(len(missingFlagNames)), strings.Join(missingFlagNames, `", "`))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1189,9 +1189,9 @@ func (c *Command) checkCommandGroups() {
|
||||||
func (c *Command) InitDefaultHelpFlag() {
|
func (c *Command) InitDefaultHelpFlag() {
|
||||||
c.mergePersistentFlags()
|
c.mergePersistentFlags()
|
||||||
if c.Flags().Lookup("help") == nil {
|
if c.Flags().Lookup("help") == nil {
|
||||||
usage := "help for "
|
usage := i18nHelpFor() + " "
|
||||||
if c.Name() == "" {
|
if c.Name() == "" {
|
||||||
usage += "this command"
|
usage += i18nThisCommand()
|
||||||
} else {
|
} else {
|
||||||
usage += c.Name()
|
usage += c.Name()
|
||||||
}
|
}
|
||||||
|
@ -1211,9 +1211,9 @@ func (c *Command) InitDefaultVersionFlag() {
|
||||||
|
|
||||||
c.mergePersistentFlags()
|
c.mergePersistentFlags()
|
||||||
if c.Flags().Lookup("version") == nil {
|
if c.Flags().Lookup("version") == nil {
|
||||||
usage := "version for "
|
usage := i18nVersionFor() + " "
|
||||||
if c.Name() == "" {
|
if c.Name() == "" {
|
||||||
usage += "this command"
|
usage += i18nThisCommand()
|
||||||
} else {
|
} else {
|
||||||
usage += c.Name()
|
usage += c.Name()
|
||||||
}
|
}
|
||||||
|
@ -1236,10 +1236,9 @@ func (c *Command) InitDefaultHelpCmd() {
|
||||||
|
|
||||||
if c.helpCommand == nil {
|
if c.helpCommand == nil {
|
||||||
c.helpCommand = &Command{
|
c.helpCommand = &Command{
|
||||||
Use: "help [command]",
|
Use: fmt.Sprintf("help [%s]", i18nCommand()),
|
||||||
Short: "Help about any command",
|
Short: i18nCommandHelpShort(),
|
||||||
Long: `Help provides help for any command in the application.
|
Long: fmt.Sprintf(i18nCommandHelpLong(), c.Name()+fmt.Sprintf(" help [%s]", i18nPathToCommand())),
|
||||||
Simply type ` + c.Name() + ` help [path to command] for full details.`,
|
|
||||||
ValidArgsFunction: func(c *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
|
ValidArgsFunction: func(c *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
|
||||||
var completions []string
|
var completions []string
|
||||||
cmd, _, e := c.Root().Find(args)
|
cmd, _, e := c.Root().Find(args)
|
||||||
|
@ -1262,7 +1261,7 @@ Simply type ` + c.Name() + ` help [path to command] for full details.`,
|
||||||
Run: func(c *Command, args []string) {
|
Run: func(c *Command, args []string) {
|
||||||
cmd, _, e := c.Root().Find(args)
|
cmd, _, e := c.Root().Find(args)
|
||||||
if cmd == nil || e != nil {
|
if cmd == nil || e != nil {
|
||||||
c.Printf("Unknown help topic %#q\n", args)
|
c.Printf(i18nCommandHelpUnknownTopicError()+"\n", args)
|
||||||
CheckErr(c.Root().Usage())
|
CheckErr(c.Root().Usage())
|
||||||
} else {
|
} else {
|
||||||
cmd.InitDefaultHelpFlag() // make possible 'help' flag to be shown
|
cmd.InitDefaultHelpFlag() // make possible 'help' flag to be shown
|
||||||
|
|
90
localizer.go
90
localizer.go
|
@ -140,6 +140,87 @@ func i18nForInfoAboutCommand() string {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func i18nCommand() string {
|
||||||
|
return localizeMessage(&i18n.Message{
|
||||||
|
ID: "Command",
|
||||||
|
Description: "lowercase",
|
||||||
|
Other: "command",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func i18nPathToCommand() string {
|
||||||
|
return localizeMessage(&i18n.Message{
|
||||||
|
ID: "PathToCommand",
|
||||||
|
Description: "lowercase",
|
||||||
|
Other: "path to command",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func i18nCommandHelpShort() string {
|
||||||
|
return localizeMessage(&i18n.Message{
|
||||||
|
ID: "CommandHelpShort",
|
||||||
|
Description: "short help for command help",
|
||||||
|
Other: "Help about any command",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func i18nCommandHelpLong() string {
|
||||||
|
return localizeMessage(&i18n.Message{
|
||||||
|
ID: "CommandHelpLong",
|
||||||
|
Description: "long help for command help (cmd example)",
|
||||||
|
Other: `Help provides help for any command in the application.
|
||||||
|
Simply type %s for full details.`,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func i18nCommandHelpUnknownTopicError() string {
|
||||||
|
return localizeMessage(&i18n.Message{
|
||||||
|
ID: "CommandHelpUnknownTopicError",
|
||||||
|
Description: "shown when help topic is unknown (args)",
|
||||||
|
Other: "Unknown help topic %#q",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func i18nHelpFor() string {
|
||||||
|
return localizeMessage(&i18n.Message{
|
||||||
|
ID: "HelpFor",
|
||||||
|
Description: "lowercase, beginning of sentence",
|
||||||
|
Other: "help for",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func i18nVersionFor() string {
|
||||||
|
return localizeMessage(&i18n.Message{
|
||||||
|
ID: "VersionFor",
|
||||||
|
Description: "lowercase, beginning of sentence",
|
||||||
|
Other: "version for",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func i18nThisCommand() string {
|
||||||
|
return localizeMessage(&i18n.Message{
|
||||||
|
ID: "ThisCommand",
|
||||||
|
Description: "lowercase, end of sentence, used when command name is undefined",
|
||||||
|
Other: "this command",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func i18nDidYouMeanThis() string {
|
||||||
|
return localizeMessage(&i18n.Message{
|
||||||
|
ID: "DidYouMeanThis",
|
||||||
|
Description: "shown as suggestion",
|
||||||
|
Other: "Did you mean this?",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func i18nCommandDeprecatedWarning() string {
|
||||||
|
return localizeMessage(&i18n.Message{
|
||||||
|
ID: "CommandDeprecatedWarning",
|
||||||
|
Description: "printed when a deprecated command is executed (cmd, deprecation message)",
|
||||||
|
Other: "Command %q is deprecated, %s",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func i18nError() string {
|
func i18nError() string {
|
||||||
return localizeMessage(&i18n.Message{
|
return localizeMessage(&i18n.Message{
|
||||||
ID: "Error",
|
ID: "Error",
|
||||||
|
@ -224,6 +305,15 @@ func i18nExclusiveFlagsValidationError() string {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func i18nFlagNotSetError(amountFlags int) string {
|
||||||
|
return localizeMessageWithPlural(&i18n.Message{
|
||||||
|
ID: "FlagNotSetError",
|
||||||
|
Description: "error shown when required flags are not set (flags)",
|
||||||
|
Other: "required flags \"%s\" are not set",
|
||||||
|
One: "required flag \"%s\" is not set",
|
||||||
|
}, amountFlags)
|
||||||
|
}
|
||||||
|
|
||||||
// … lots more translations here
|
// … lots more translations here
|
||||||
|
|
||||||
func localizeMessage(message *i18n.Message) string {
|
func localizeMessage(message *i18n.Message) string {
|
||||||
|
|
|
@ -1,3 +1,27 @@
|
||||||
|
[Command]
|
||||||
|
description = "lowercase"
|
||||||
|
other = "command"
|
||||||
|
|
||||||
|
[CommandDeprecatedWarning]
|
||||||
|
description = "printed when a deprecated command is executed (cmd, deprecation message)"
|
||||||
|
other = "Command %q is deprecated, %s"
|
||||||
|
|
||||||
|
[CommandHelpLong]
|
||||||
|
description = "long help for command help (cmd example)"
|
||||||
|
other = "Help provides help for any command in the application.\nSimply type %s for full details."
|
||||||
|
|
||||||
|
[CommandHelpShort]
|
||||||
|
description = "short help for command help"
|
||||||
|
other = "Help about any command"
|
||||||
|
|
||||||
|
[CommandHelpUnknownTopicError]
|
||||||
|
description = "shown when help topic is unknown (args)"
|
||||||
|
other = "Unknown help topic %#q"
|
||||||
|
|
||||||
|
[DidYouMeanThis]
|
||||||
|
description = "shown as suggestion"
|
||||||
|
other = "Did you mean this?"
|
||||||
|
|
||||||
[Error]
|
[Error]
|
||||||
description = "prefix of error messages"
|
description = "prefix of error messages"
|
||||||
other = "Error"
|
other = "Error"
|
||||||
|
@ -11,10 +35,19 @@ other = "accepts %d args, received %d"
|
||||||
description = "error shown when multiple exclusive flags are provided (group flags, offending flags)"
|
description = "error shown when multiple exclusive flags are provided (group flags, offending flags)"
|
||||||
other = "if any flags in the group [%v] are set none of the others can be; %v were all set"
|
other = "if any flags in the group [%v] are set none of the others can be; %v were all set"
|
||||||
|
|
||||||
|
[FlagNotSetError]
|
||||||
|
description = "error shown when required flags are not set (flags)"
|
||||||
|
one = "required flag \"%s\" is not set"
|
||||||
|
other = "required flags \"%s\" are not set"
|
||||||
|
|
||||||
[ForInfoAboutCommand]
|
[ForInfoAboutCommand]
|
||||||
description = "end of a sentence"
|
description = "end of a sentence"
|
||||||
other = "for more information about a command"
|
other = "for more information about a command"
|
||||||
|
|
||||||
|
[HelpFor]
|
||||||
|
description = "lowercase, beginning of sentence"
|
||||||
|
other = "help for"
|
||||||
|
|
||||||
[LegacyArgsValidationError]
|
[LegacyArgsValidationError]
|
||||||
description = "error shown when args are not understood (subcmd, cmd, suggestion)"
|
description = "error shown when args are not understood (subcmd, cmd, suggestion)"
|
||||||
other = "unknown command %q for %q%s"
|
other = "unknown command %q for %q%s"
|
||||||
|
@ -37,6 +70,10 @@ other = "unknown command %q for %q"
|
||||||
description = "error shown when arg is invalid (arg, cmd, suggestion)"
|
description = "error shown when arg is invalid (arg, cmd, suggestion)"
|
||||||
other = "invalid argument %q for %q%s"
|
other = "invalid argument %q for %q%s"
|
||||||
|
|
||||||
|
[PathToCommand]
|
||||||
|
description = "lowercase"
|
||||||
|
other = "path to command"
|
||||||
|
|
||||||
[RangeArgsValidationError]
|
[RangeArgsValidationError]
|
||||||
description = "error shown when arg count is not in range (expected min, expected max, actual amount)"
|
description = "error shown when arg count is not in range (expected min, expected max, actual amount)"
|
||||||
one = "accepts between %d and %d arg, received %d"
|
one = "accepts between %d and %d arg, received %d"
|
||||||
|
@ -78,6 +115,14 @@ other = "Global Flags"
|
||||||
description = "title of the section in the usage template"
|
description = "title of the section in the usage template"
|
||||||
other = "Usage"
|
other = "Usage"
|
||||||
|
|
||||||
|
[ThisCommand]
|
||||||
|
description = "lowercase, end of sentence, used when command name is undefined"
|
||||||
|
other = "this command"
|
||||||
|
|
||||||
[Use]
|
[Use]
|
||||||
description = "beginning of a sentence like 'Use <this> to do <that>'"
|
description = "beginning of a sentence like 'Use <this> to do <that>'"
|
||||||
other = "Use"
|
other = "Use"
|
||||||
|
|
||||||
|
[VersionFor]
|
||||||
|
description = "lowercase, beginning of sentence"
|
||||||
|
other = "version for"
|
||||||
|
|
|
@ -1,3 +1,33 @@
|
||||||
|
[Command]
|
||||||
|
description = "lowercase"
|
||||||
|
hash = "sha1-c90bde9bb93ee6452afbe579d55cd32ba0159c8d"
|
||||||
|
other = "commande"
|
||||||
|
|
||||||
|
[CommandDeprecatedWarning]
|
||||||
|
description = "printed when a deprecated command is executed (cmd, deprecation message)"
|
||||||
|
hash = "sha1-e8b974a255eafe86d4a4fe15a0e79aaab345354c"
|
||||||
|
other = "La commande %q est dépréciée, %s"
|
||||||
|
|
||||||
|
[CommandHelpLong]
|
||||||
|
description = "long help for command help (cmd example)"
|
||||||
|
hash = "sha1-dc993d9f12d54910147c477318fa82c8210b6669"
|
||||||
|
other = "Help fournit de l'aide pour n'importe quelle commande de l'application.\nTapez '%s' pour obtenir une aide détaillée."
|
||||||
|
|
||||||
|
[CommandHelpShort]
|
||||||
|
description = "short help for command help"
|
||||||
|
hash = "sha1-5bab4a463f36ea8e33681f523445bbd614e9891c"
|
||||||
|
other = "Obtenir de l'aide au sujet d'une commande"
|
||||||
|
|
||||||
|
[CommandHelpUnknownTopicError]
|
||||||
|
description = "shown when help topic is unknown (args)"
|
||||||
|
hash = "sha1-d3b6cb615eee5770e0e8e62fbf7a3293502dd7a8"
|
||||||
|
other = "Sujet d'aide %#q inconnu"
|
||||||
|
|
||||||
|
[DidYouMeanThis]
|
||||||
|
description = "shown as suggestion"
|
||||||
|
hash = "sha1-eb9504fe384499caafe690853204c7fb7ac8b531"
|
||||||
|
other = "Vouliez-vous dire ceci ?"
|
||||||
|
|
||||||
[Error]
|
[Error]
|
||||||
description = "prefix of error messages"
|
description = "prefix of error messages"
|
||||||
hash = "sha1-7dcb56355a3ddc7ff7e5ccd6522507999ca7f238"
|
hash = "sha1-7dcb56355a3ddc7ff7e5ccd6522507999ca7f238"
|
||||||
|
@ -14,11 +44,22 @@ description = "error shown when multiple exclusive flags are provided (group fla
|
||||||
hash = "sha1-221b98bada52cfc2932f9aa5142b653b46baded6"
|
hash = "sha1-221b98bada52cfc2932f9aa5142b653b46baded6"
|
||||||
other = "les options [%v] sont exclusives, mais les options %v ont été fournies"
|
other = "les options [%v] sont exclusives, mais les options %v ont été fournies"
|
||||||
|
|
||||||
|
[FlagNotSetError]
|
||||||
|
description = "error shown when required flags are not set (flags)"
|
||||||
|
hash = "sha1-f5340c4bfceb0066ec70944b57e6458b6f8cc97b"
|
||||||
|
one = "l'option requise \"%s\" n'est pas présente"
|
||||||
|
other = "les options requises \"%s\" ne sont pas présentes"
|
||||||
|
|
||||||
[ForInfoAboutCommand]
|
[ForInfoAboutCommand]
|
||||||
description = "end of a sentence"
|
description = "end of a sentence"
|
||||||
hash = "sha1-923f6d48908b3a6981fb5504b0e5078700a312c0"
|
hash = "sha1-923f6d48908b3a6981fb5504b0e5078700a312c0"
|
||||||
other = "pour plus d'information au sujet d'une commande"
|
other = "pour plus d'information au sujet d'une commande"
|
||||||
|
|
||||||
|
[HelpFor]
|
||||||
|
description = "lowercase, beginning of sentence"
|
||||||
|
hash = "sha1-18fbe8d2780935dbe6a71f998821c22f283cbd25"
|
||||||
|
other = "aide pour"
|
||||||
|
|
||||||
[LegacyArgsValidationError]
|
[LegacyArgsValidationError]
|
||||||
description = "error shown when args are not understood (subcmd, cmd, suggestion)"
|
description = "error shown when args are not understood (subcmd, cmd, suggestion)"
|
||||||
hash = "sha1-c601c68bdcb9687109e793112b789b1858953b15"
|
hash = "sha1-c601c68bdcb9687109e793112b789b1858953b15"
|
||||||
|
@ -46,6 +87,11 @@ description = "error shown when arg is invalid (arg, cmd, suggestion)"
|
||||||
hash = "sha1-60b40e5782dd252c78ef3d585065cb99197ec22e"
|
hash = "sha1-60b40e5782dd252c78ef3d585065cb99197ec22e"
|
||||||
other = "argument %q invalide pour %q%s"
|
other = "argument %q invalide pour %q%s"
|
||||||
|
|
||||||
|
[PathToCommand]
|
||||||
|
description = "lowercase"
|
||||||
|
hash = "sha1-7dcca04d5dcb7ff289a5483bea3e4f1e4119c1f4"
|
||||||
|
other = "commande"
|
||||||
|
|
||||||
[RangeArgsValidationError]
|
[RangeArgsValidationError]
|
||||||
description = "error shown when arg count is not in range (expected min, expected max, actual amount)"
|
description = "error shown when arg count is not in range (expected min, expected max, actual amount)"
|
||||||
hash = "sha1-aa81e0aee17a3439b479cdf47169eb194706cd14"
|
hash = "sha1-aa81e0aee17a3439b479cdf47169eb194706cd14"
|
||||||
|
@ -97,7 +143,17 @@ description = "title of the section in the usage template"
|
||||||
hash = "sha1-5fdae7bd171315a453063384887ee4300363cf20"
|
hash = "sha1-5fdae7bd171315a453063384887ee4300363cf20"
|
||||||
other = "Usage"
|
other = "Usage"
|
||||||
|
|
||||||
|
[ThisCommand]
|
||||||
|
description = "lowercase, end of sentence, used when command name is undefined"
|
||||||
|
hash = "sha1-5cfa4629fdf18b89471b3d07a0d051a8a10afe70"
|
||||||
|
other = "cette commande"
|
||||||
|
|
||||||
[Use]
|
[Use]
|
||||||
description = "beginning of a sentence like 'Use <this> to do <that>'"
|
description = "beginning of a sentence like 'Use <this> to do <that>'"
|
||||||
hash = "sha1-f42c92acc9934eec952161dfa338a95ec0f02b75"
|
hash = "sha1-f42c92acc9934eec952161dfa338a95ec0f02b75"
|
||||||
other = "Utilisez"
|
other = "Utilisez"
|
||||||
|
|
||||||
|
[VersionFor]
|
||||||
|
description = "lowercase, beginning of sentence"
|
||||||
|
hash = "sha1-e7f03028ab18076d111cd3343a24bbd8113d5431"
|
||||||
|
other = "version de"
|
||||||
|
|
Loading…
Reference in a new issue