localizer.go

  1package i18n
  2
  3// Localizer handles translation lookups for a specific language.
  4type Localizer struct {
  5	lang     string
  6	bundle   *Bundle
  7	locale   *Locale
  8	cache    *Cache
  9	fallback *FallbackChain
 10}
 11
 12// NewLocalizer creates a new Localizer for a language.
 13func NewLocalizer(lang string, bundle *Bundle) *Localizer {
 14	locale, _ := bundle.GetLocale(lang)
 15	if locale == nil {
 16		// Fallback to parsing locale
 17		locale, _ = ParseLocale(lang)
 18	}
 19
 20	return &Localizer{
 21		lang:     lang,
 22		bundle:   bundle,
 23		locale:   locale,
 24		cache:    NewCache(),
 25		fallback: NewFallbackChain(lang, bundle.DefaultLanguage()),
 26	}
 27}
 28
 29// Localize translates a message ID to text.
 30func (l *Localizer) Localize(messageID string) string {
 31	// Check cache first
 32	if cached, ok := l.cache.Get(messageID); ok {
 33		return cached
 34	}
 35
 36	// Try fallback chain
 37	msg, _, err := l.fallback.Resolve(l.bundle, messageID)
 38	if err != nil {
 39		// Return the key itself if translation not found
 40		return messageID
 41	}
 42
 43	text := msg.GetDefault()
 44	l.cache.Set(messageID, text)
 45	return text
 46}
 47
 48// LocalizePlural translates a message with plural support.
 49func (l *Localizer) LocalizePlural(messageID string, count int, data map[string]interface{}) string {
 50	// Try fallback chain
 51	msg, _, err := l.fallback.Resolve(l.bundle, messageID)
 52	if err != nil {
 53		return messageID
 54	}
 55
 56	// Get plural function
 57	pluralFunc := l.locale.PluralFunc
 58	if pluralFunc == nil {
 59		pluralFunc = DefaultPlural
 60	}
 61
 62	// Get appropriate plural form
 63	text := msg.Pluralize(count, pluralFunc)
 64
 65	// Interpolate variables
 66	if data != nil {
 67		text = Interpolate(text, data)
 68	}
 69
 70	return text
 71}
 72
 73// LocalizeTemplate translates a message and applies template data.
 74func (l *Localizer) LocalizeTemplate(messageID string, data map[string]interface{}) string {
 75	// Try fallback chain
 76	msg, _, err := l.fallback.Resolve(l.bundle, messageID)
 77	if err != nil {
 78		return messageID
 79	}
 80
 81	text := msg.GetDefault()
 82
 83	// Interpolate variables
 84	if data != nil {
 85		text = Interpolate(text, data)
 86	}
 87
 88	return text
 89}
 90
 91// Language returns the localizer's language code.
 92func (l *Localizer) Language() string {
 93	return l.lang
 94}
 95
 96// Locale returns the localizer's locale.
 97func (l *Localizer) Locale() *Locale {
 98	return l.locale
 99}
100
101// ClearCache clears the localizer's cache.
102func (l *Localizer) ClearCache() {
103	l.cache.Clear()
104}