1package i18n
2
3import "sync"
4
5var registry = &Registry{
6 languages: make(map[string]*Locale),
7}
8
9// Registry holds all registered language locales.
10type Registry struct {
11 languages map[string]*Locale
12 mu sync.RWMutex
13}
14
15// RegisterLanguage registers a locale in the global registry.
16// This is typically called from init() functions in language files.
17func RegisterLanguage(locale *Locale) {
18 if locale == nil || locale.Code == "" {
19 return
20 }
21
22 registry.mu.Lock()
23 defer registry.mu.Unlock()
24
25 registry.languages[locale.Code] = locale
26}
27
28// GetLanguage retrieves a registered locale by code.
29func GetLanguage(code string) (*Locale, bool) {
30 registry.mu.RLock()
31 defer registry.mu.RUnlock()
32
33 locale, ok := registry.languages[code]
34 return locale, ok
35}
36
37// AvailableLanguages returns all registered locales.
38func AvailableLanguages() []*Locale {
39 registry.mu.RLock()
40 defer registry.mu.RUnlock()
41
42 locales := make([]*Locale, 0, len(registry.languages))
43 for _, locale := range registry.languages {
44 locales = append(locales, locale)
45 }
46 return locales
47}
48
49// LanguageCodes returns all registered language codes.
50func LanguageCodes() []string {
51 registry.mu.RLock()
52 defer registry.mu.RUnlock()
53
54 codes := make([]string, 0, len(registry.languages))
55 for code := range registry.languages {
56 codes = append(codes, code)
57 }
58 return codes
59}
60
61// HasLanguage checks if a language code is registered.
62func HasLanguage(code string) bool {
63 registry.mu.RLock()
64 defer registry.mu.RUnlock()
65
66 _, ok := registry.languages[code]
67 return ok
68}