Format counts using user locale

This commit is contained in:
Kovid Goyal
2025-07-12 08:24:06 +05:30
parent b01b73a8e5
commit fef57bd4c2
3 changed files with 30 additions and 2 deletions

View File

@@ -19,6 +19,7 @@ import (
"github.com/kovidgoyal/kitty/tools/tui/loop" "github.com/kovidgoyal/kitty/tools/tui/loop"
"github.com/kovidgoyal/kitty/tools/tui/readline" "github.com/kovidgoyal/kitty/tools/tui/readline"
"github.com/kovidgoyal/kitty/tools/utils" "github.com/kovidgoyal/kitty/tools/utils"
"golang.org/x/text/message"
) )
var _ = fmt.Print var _ = fmt.Print
@@ -204,6 +205,7 @@ type Handler struct {
rl *readline.Readline rl *readline.Readline
err_chan chan error err_chan chan error
shortcut_tracker config.ShortcutTracker shortcut_tracker config.ShortcutTracker
msg_printer *message.Printer
} }
func (h *Handler) draw_screen() (err error) { func (h *Handler) draw_screen() (err error) {
@@ -734,7 +736,7 @@ func main(_ *cli.Command, opts *Options, args []string) (rc int, err error) {
return 1, err return 1, err
} }
lp.MouseTrackingMode(loop.FULL_MOUSE_TRACKING) lp.MouseTrackingMode(loop.FULL_MOUSE_TRACKING)
handler := Handler{lp: lp, err_chan: make(chan error, 8)} handler := Handler{lp: lp, err_chan: make(chan error, 8), msg_printer: message.NewPrinter(utils.LanguageTag())}
handler.rl = readline.New(lp, readline.RlInit{ handler.rl = readline.New(lp, readline.RlInit{
Prompt: "> ", ContinuationPrompt: ". ", Completer: handler.complete_save_prompt, Prompt: "> ", ContinuationPrompt: ". ", Completer: handler.complete_save_prompt,
}) })

View File

@@ -248,7 +248,7 @@ func (h *Handler) draw_num_of_matches(num_shown, y int) {
case 0: case 0:
m = " no matches " m = " no matches "
default: default:
m = fmt.Sprintf(" %d of %d matches ", min(num_shown, h.state.last_render.num_matches), h.state.last_render.num_matches) m = fmt.Sprintf(" %d of %s matches ", min(num_shown, h.state.last_render.num_matches), h.msg_printer.Sprint(h.state.last_render.num_matches))
} }
w := int(math.Ceil(float64(wcswidth.Stringwidth(m)) / 2.0)) w := int(math.Ceil(float64(wcswidth.Stringwidth(m)) / 2.0))
h.lp.MoveCursorTo(h.screen_size.width-w-2, y) h.lp.MoveCursorTo(h.screen_size.width-w-2, y)

View File

@@ -15,6 +15,7 @@ import (
"sync" "sync"
"golang.org/x/exp/constraints" "golang.org/x/exp/constraints"
"golang.org/x/text/language"
) )
var _ = fmt.Print var _ = fmt.Print
@@ -397,3 +398,28 @@ func Abs[T constraints.Integer](x T) T {
} }
return x return x
} }
var LanguageTag = sync.OnceValue(func() language.Tag {
// Check environment variables in order of precedence
var locale string
for _, v := range []string{"LC_ALL", "LC_MESSAGES", "LANG"} {
locale = os.Getenv(v)
if locale != "" {
break
}
}
if locale == "" {
return language.English // Default/fallback
}
// Remove encoding, e.g., ".UTF-8"
locale = strings.Split(locale, ".")[0]
// Replace underscore with hyphen to match BCP47 format (en_US -> en-US)
locale = strings.ReplaceAll(locale, "_", "-")
// Validate/normalize with golang.org/x/text/language
tag, err := language.Parse(locale)
if err != nil {
return language.English
}
return tag
})