75 lines
2 KiB
Go
75 lines
2 KiB
Go
|
|
// Package i18n provides internationalization for the CLI.
|
||
|
|
package i18n
|
||
|
|
|
||
|
|
import (
|
||
|
|
"runtime"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Mode determines how the i18n service handles missing translation keys.
|
||
|
|
type Mode int
|
||
|
|
|
||
|
|
const (
|
||
|
|
// ModeNormal returns the key as-is when a translation is missing (production).
|
||
|
|
ModeNormal Mode = iota
|
||
|
|
// ModeStrict panics immediately when a translation is missing (dev/CI).
|
||
|
|
ModeStrict
|
||
|
|
// ModeCollect dispatches a MissingKeyAction and returns [key] (QA testing).
|
||
|
|
ModeCollect
|
||
|
|
)
|
||
|
|
|
||
|
|
// String returns the string representation of the mode.
|
||
|
|
func (m Mode) String() string {
|
||
|
|
switch m {
|
||
|
|
case ModeNormal:
|
||
|
|
return "normal"
|
||
|
|
case ModeStrict:
|
||
|
|
return "strict"
|
||
|
|
case ModeCollect:
|
||
|
|
return "collect"
|
||
|
|
default:
|
||
|
|
return "unknown"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// MissingKeyAction is dispatched when a translation key is not found in collect mode.
|
||
|
|
// It contains caller information for debugging and QA purposes.
|
||
|
|
type MissingKeyAction struct {
|
||
|
|
Key string // The missing translation key
|
||
|
|
Args map[string]any // Arguments passed to the translation
|
||
|
|
CallerFile string // Source file where T() was called
|
||
|
|
CallerLine int // Line number where T() was called
|
||
|
|
}
|
||
|
|
|
||
|
|
// ActionHandler is a function that handles MissingKeyAction dispatches.
|
||
|
|
// Register handlers via SetActionHandler to receive missing key notifications.
|
||
|
|
type ActionHandler func(action MissingKeyAction)
|
||
|
|
|
||
|
|
var actionHandler ActionHandler
|
||
|
|
|
||
|
|
// SetActionHandler registers a handler for MissingKeyAction dispatches.
|
||
|
|
// Only one handler can be active at a time; subsequent calls replace the previous handler.
|
||
|
|
func SetActionHandler(h ActionHandler) {
|
||
|
|
actionHandler = h
|
||
|
|
}
|
||
|
|
|
||
|
|
// dispatchMissingKey creates and dispatches a MissingKeyAction.
|
||
|
|
// Called internally when a key is missing in collect mode.
|
||
|
|
func dispatchMissingKey(key string, args map[string]any) {
|
||
|
|
if actionHandler == nil {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
_, file, line, ok := runtime.Caller(2) // Skip dispatchMissingKey and handleMissingKey
|
||
|
|
if !ok {
|
||
|
|
file = "unknown"
|
||
|
|
line = 0
|
||
|
|
}
|
||
|
|
|
||
|
|
actionHandler(MissingKeyAction{
|
||
|
|
Key: key,
|
||
|
|
Args: args,
|
||
|
|
CallerFile: file,
|
||
|
|
CallerLine: line,
|
||
|
|
})
|
||
|
|
}
|