1
2
3
4
5 package gettext
6
7 import (
8 "fmt"
9 "sync"
10 )
11
12 type _Locale struct {
13 mutex sync.Mutex
14 fs FileSystem
15 lang string
16 domain string
17 trMap map[string]*translator
18 trCurrent *translator
19 }
20
21 var _ Gettexter = (*_Locale)(nil)
22
23 func newLocale(domain, path string, data ...interface{}) *_Locale {
24 if domain == "" {
25 domain = "default"
26 }
27 p := &_Locale{
28 lang: DefaultLanguage,
29 domain: domain,
30 }
31 if len(data) > 0 {
32 p.fs = NewFS(path, data[0])
33 } else {
34 p.fs = NewFS(path, nil)
35 }
36
37 p.syncTrMap()
38 return p
39 }
40
41 func (p *_Locale) makeTrMapKey(domain, _Locale string) string {
42 return domain + "_$$$_" + _Locale
43 }
44
45 func (p *_Locale) FileSystem() FileSystem {
46 return p.fs
47 }
48
49 func (p *_Locale) GetLanguage() string {
50 p.mutex.Lock()
51 defer p.mutex.Unlock()
52
53 return p.lang
54 }
55 func (p *_Locale) SetLanguage(lang string) Gettexter {
56 p.mutex.Lock()
57 defer p.mutex.Unlock()
58
59 if lang == "" {
60 lang = DefaultLanguage
61 }
62 if lang == p.lang {
63 return p
64 }
65
66 p.lang = lang
67 p.syncTrMap()
68 return p
69 }
70
71 func (p *_Locale) GetDomain() string {
72 p.mutex.Lock()
73 defer p.mutex.Unlock()
74 return p.domain
75 }
76
77 func (p *_Locale) SetDomain(domain string) Gettexter {
78 p.mutex.Lock()
79 defer p.mutex.Unlock()
80
81 if domain == "" || domain == p.domain {
82 return p
83 }
84
85 p.domain = domain
86 p.syncTrMap()
87 return p
88 }
89
90 func (p *_Locale) syncTrMap() {
91 p.trMap = make(map[string]*translator)
92 trMapKey := p.makeTrMapKey(p.domain, p.lang)
93
94 if tr, ok := p.trMap[trMapKey]; ok {
95 p.trCurrent = tr
96 return
97 }
98
99
100 if data, err := p.fs.LoadMessagesFile(p.domain, p.lang, ".po"); err == nil {
101 if tr, err := newPoTranslator(fmt.Sprintf("%s_%s.po", p.domain, p.lang), data); err == nil {
102 p.trMap[trMapKey] = tr
103 p.trCurrent = tr
104 return
105 }
106 }
107
108
109 if data, err := p.fs.LoadMessagesFile(p.domain, p.lang, ".mo"); err == nil {
110 if tr, err := newMoTranslator(fmt.Sprintf("%s_%s.mo", p.domain, p.lang), data); err == nil {
111 p.trMap[trMapKey] = tr
112 p.trCurrent = tr
113 return
114 }
115 }
116
117
118 if data, err := p.fs.LoadMessagesFile(p.domain, p.lang, ".json"); err == nil {
119 if tr, err := newJsonTranslator(p.lang, fmt.Sprintf("%s_%s.json", p.domain, p.lang), data); err == nil {
120 p.trMap[trMapKey] = tr
121 p.trCurrent = tr
122 return
123 }
124 }
125
126
127 p.trMap[trMapKey] = nilTranslator
128 p.trCurrent = nilTranslator
129 return
130 }
131
132 func (p *_Locale) Gettext(msgid string) string {
133 p.mutex.Lock()
134 defer p.mutex.Unlock()
135 return p.trCurrent.PGettext("", msgid)
136 }
137
138 func (p *_Locale) PGettext(msgctxt, msgid string) string {
139 p.mutex.Lock()
140 defer p.mutex.Unlock()
141 return p.trCurrent.PGettext(msgctxt, msgid)
142 }
143
144 func (p *_Locale) NGettext(msgid, msgidPlural string, n int) string {
145 p.mutex.Lock()
146 defer p.mutex.Unlock()
147 return p.trCurrent.PNGettext("", msgid, msgidPlural, n)
148 }
149
150 func (p *_Locale) PNGettext(msgctxt, msgid, msgidPlural string, n int) string {
151 p.mutex.Lock()
152 defer p.mutex.Unlock()
153 return p.trCurrent.PNGettext(msgctxt, msgid, msgidPlural, n)
154 }
155
156 func (p *_Locale) DGettext(domain, msgid string) string {
157 p.mutex.Lock()
158 defer p.mutex.Unlock()
159 return p.gettext(domain, "", msgid, "", 0)
160 }
161
162 func (p *_Locale) DNGettext(domain, msgid, msgidPlural string, n int) string {
163 p.mutex.Lock()
164 defer p.mutex.Unlock()
165 return p.gettext(domain, "", msgid, msgidPlural, n)
166 }
167
168 func (p *_Locale) DPGettext(domain, msgctxt, msgid string) string {
169 p.mutex.Lock()
170 defer p.mutex.Unlock()
171 return p.gettext(domain, msgctxt, msgid, "", 0)
172 }
173
174 func (p *_Locale) DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
175 p.mutex.Lock()
176 defer p.mutex.Unlock()
177 return p.gettext(domain, msgctxt, msgid, msgidPlural, n)
178 }
179
180 func (p *_Locale) Getdata(name string) []byte {
181 return p.getdata(p.domain, name)
182 }
183
184 func (p *_Locale) DGetdata(domain, name string) []byte {
185 return p.getdata(domain, name)
186 }
187
188 func (p *_Locale) gettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
189 if f, ok := p.trMap[p.makeTrMapKey(domain, p.lang)]; ok {
190 return f.PNGettext(msgctxt, msgid, msgidPlural, n)
191 }
192 return msgid
193 }
194
195 func (p *_Locale) getdata(domain, name string) []byte {
196 if data, err := p.fs.LoadResourceFile(domain, p.lang, name); err == nil {
197 return data
198 }
199 if p.lang != "default" {
200 if data, err := p.fs.LoadResourceFile(domain, "default", name); err == nil {
201 return data
202 }
203 }
204 return nil
205 }
206
View as plain text