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}