Back to Codeberg

Localized clap help messages, the hard part #524

forgejo-contrib-forgejo-cli-issues-524.md

latest11.7 KB
Original Source

forgejo-contrib/forgejo-cli

Watch20

Star402

Fork

You've already forked forgejo-cli

51

CodeIssues 44Pull requests 8Releases 11Packages 2WikiActivity

Localized clap help messages, the hard part #524

New issue

Open

opened 2026-06-24 22:36:39 +02:00 by Fluffinity · 3 comments

Fluffinity commented 2026-06-24 22:36:39 +02:00

Contributor

Copy link

Feature description

In #503 we discussed how to achieve fully localized help messages, with the conclusion, that this will be more work and for a separate PR. I managed to create a working proof of concept on how to allow for localized messages.

Motivation

The code is in a testing repo of mine: https://codeberg.org/Fluffinity/Fluffinity

The core is the method Command::help_template(). With this method we can specify the concrete form of the help message and keywords of the standard help message, such as Commands are not automatically applied. Instead we can use our own strings for them, allowing injection of localized strings.

The significant downside is that we need to manually extract all the relevant info out of the provided arguments, i.e a manual implementation of the parse() method of the CLI argument struct. However, the PoC also shows, that we can still use the current struct, defined with the derive API, and modify the help template with the builder API.

Because we only need to do this for a single binary we don't need the level of complexity and generality implemented in the uutils project. We do need to maintain the type structure of the CLI argument type twice, however, as the builder API does not know the type of things ahead of time.

Code of Conduct

  • I agree to act in accordance with the CoC & AI Agreement.
  • This issue was not generated by an LLM, even in part.

Feature description In #503 we discussed how to achieve fully localized help messages, with the conclusion, that this will be more work and for a separate PR. I managed to create a working proof of concept on how to allow for localized messages. ### Motivation The code is in a testing repo of mine: https://codeberg.org/Fluffinity/Fluffinity The core is the method Command::help_template(). With this method we can specify the concrete form of the help message and keywords of the standard help message, such as Commands are not automatically applied. Instead we can use our own strings for them, allowing injection of localized strings. The significant downside is that we need to manually extract all the relevant info out of the provided arguments, i.e a manual implementation of the parse() method of the CLI argument struct. However, the PoC also shows, that we can still use the current struct, defined with the derive API, and modify the help template with the builder API. Because we only need to do this for a single binary we don't need the level of complexity and generality implemented in the uutils project. We do need to maintain the type structure of the CLI argument type twice, however, as the builder API does not know the type of things ahead of time. ### Code of Conduct - [x] I agree to act in accordance with the CoC & AI Agreement. - [x] This issue was not generated by an LLM, even in part.

Fluffinity added the Kind/Feature label 2026-06-24 22:36:40 +02:00

Cyborus commented 2026-06-25 01:21:48 +02:00

Member

Copy link

Since clap::Parser::parse just calls get_matches followed by from_arg_matches_mut, we should be able to do the same thing to avoid manually extracting argument info.

Since clap::Parser::parse just calls get_matches followed by from_arg_matches_mut, we should be able to do the same thing to avoid manually extracting argument info.

Fluffinity commented 2026-06-25 11:50:03 +02:00

Author

Contributor

Copy link

That works. Just tested that. Depending on whether we only read from the arguments we can also just use from_arg_matches, which is what my PoC currently uses. The only things missing right now are to modify the clap error messages, when invalid input is found, like when you call the program with --name foo, and the automated usage message

That works. Just tested that. Depending on whether we only read from the arguments we can also just use from_arg_matches, which is what my PoC currently uses. The only things missing right now are to modify the clap error messages, when invalid input is found, like when you call the program with --name foo, and the automated usage message

👍 1

Fluffinity commented 2026-06-25 17:06:40 +02:00

Author

Contributor

Copy link

Ok, that part is possible, too. But only if we go the uutils route. They interact with the arg matches directly. See cat as an example. Our best chances seem to be with using try_get_matches to catch errors clap found and to display our version of usage/help instead

Ok, that part is possible, too. But only if we go the uutils route. They interact with the arg matches directly. See cat as an example. Our best chances seem to be with using try_get_matches to catch errors clap found and to display our version of usage/help instead

Sign in to join this conversation.

No Branch/Tag specified

BranchesTags

main

renovate/lock-file-maintenance

renovate/serde-saphyr-0.x

docs/contributing

no-port-in-refspec

login/v16.next.forgejo.org

crates-io-publish

0.5.x

compile-time-fluent

0.4.x

localization-alias-demo

api_url_field

v0.5.0

v0.4.1

v0.4.0

v0.3.0

v0.2.0

v0.1.1

v0.1.0

v0.0.4

v0.0.3

v0.0.2

v0.0.1

Labels

Clear labels[ Kind/Breaking Breaking change that won't be backward compatible

](#)[ Kind/Bug Something is not working

](#)[ Kind/Design Discussion about UI/UX design

](#)[ Kind/Documentation Documentation changes

](#)[ Kind/Enhancement Improve existing functionality

](#)[ Kind/Feature New functionality

](#)[ Kind/Security This is security issue

](#)[ Kind/Testing Issue or pull request related to testing

](#)[ Kind/Upstream This is an issue with upstream software (Forgejo) that is probably not our fault

](#)

[ Priority

Critical The priority is critical

](#)[ Priority

High The priority is high

](#)[ Priority

Low The priority is low

](#)[ Priority

Medium The priority is medium

](#)

[ Reviewed

Confirmed Issue has been confirmed

](#)[ Reviewed

Duplicate This issue or pull request already exists

](#)[ Reviewed

Invalid Invalid issue

](#)[ Reviewed

Won't Fix This issue won't be fixed

](#)

[ Status

Abandoned Somebody has started to work on this but abandoned work

](#)[ Status

Blocked Something is blocking this issue or pull request

](#)[ Status

Need More Info Feedback is required to reproduce issue or to continue work

](#)

[ Suspicious

](#)

No labels Kind/Breaking Kind/Bug Kind/Design Kind/Documentation Kind/Enhancement Kind/Feature Kind/Security Kind/Testing Kind/Upstream [ Priority

Critical ](/forgejo-contrib/forgejo-cli/issues?labels=173012) [ Priority

High ](/forgejo-contrib/forgejo-cli/issues?labels=173013) [ Priority

Low ](/forgejo-contrib/forgejo-cli/issues?labels=173015) [ Priority

Medium ](/forgejo-contrib/forgejo-cli/issues?labels=173014) [ Reviewed

Confirmed ](/forgejo-contrib/forgejo-cli/issues?labels=173007) [ Reviewed

Duplicate ](/forgejo-contrib/forgejo-cli/issues?labels=173005) [ Reviewed

Invalid ](/forgejo-contrib/forgejo-cli/issues?labels=173006) [ Reviewed

Won't Fix ](/forgejo-contrib/forgejo-cli/issues?labels=173008) [ Status

Abandoned ](/forgejo-contrib/forgejo-cli/issues?labels=173011) [ Status

Blocked ](/forgejo-contrib/forgejo-cli/issues?labels=173010) [ Status

Need More Info ](/forgejo-contrib/forgejo-cli/issues?labels=173009) Suspicious

Milestone

Clear milestone

No items

No milestone

Projects

Clear projects

No items

No project

Assignees

Clear assignees

No assignees

2 participants

Notifications Subscribe

Due date

The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference

forgejo-contrib/forgejo-cli#524

WritePreview

Loading…

Add table

| Rows | | | Columns | |

CancelOK

Add a link

Url Description Hint: With a URL in your clipboard, you can paste directly into the editor to create a link.

CancelOK

CancelSave

Reference in a new issue

Repository

forgejo-contrib/forgejo-cli

Title

Body

Create issue

No description provided.

Delete branch "%!s()"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?

No Yes