registry.go

 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}