1 package mk
2
3 import (
4 "math"
5 "strconv"
6 "time"
7
8 "github.com/go-playground/locales"
9 "github.com/go-playground/locales/currency"
10 )
11
12 type mk struct {
13 locale string
14 pluralsCardinal []locales.PluralRule
15 pluralsOrdinal []locales.PluralRule
16 pluralsRange []locales.PluralRule
17 decimal string
18 group string
19 minus string
20 percent string
21 percentSuffix string
22 perMille string
23 timeSeparator string
24 inifinity string
25 currencies []string
26 currencyPositiveSuffix string
27 currencyNegativeSuffix string
28 monthsAbbreviated []string
29 monthsNarrow []string
30 monthsWide []string
31 daysAbbreviated []string
32 daysNarrow []string
33 daysShort []string
34 daysWide []string
35 periodsAbbreviated []string
36 periodsNarrow []string
37 periodsShort []string
38 periodsWide []string
39 erasAbbreviated []string
40 erasNarrow []string
41 erasWide []string
42 timezones map[string]string
43 }
44
45
46 func New() locales.Translator {
47 return &mk{
48 locale: "mk",
49 pluralsCardinal: []locales.PluralRule{2, 6},
50 pluralsOrdinal: []locales.PluralRule{2, 3, 5, 6},
51 pluralsRange: []locales.PluralRule{6},
52 decimal: ",",
53 group: ".",
54 minus: "-",
55 percent: "%",
56 perMille: "‰",
57 timeSeparator: ":",
58 inifinity: "∞",
59 currencies: []string{"ADP", "AED", "AFA", "AFN", "ALK", "ALL", "AMD", "ANG", "AOA", "AOK", "AON", "AOR", "ARA", "ARL", "ARM", "ARP", "ARS", "ATS", "AUD", "AWG", "AZM", "AZN", "BAD", "BAM", "BAN", "BBD", "BDT", "BEC", "BEF", "BEL", "BGL", "BGM", "BGN", "BGO", "BHD", "BIF", "BMD", "BND", "BOB", "BOL", "BOP", "BOV", "BRB", "BRC", "BRE", "R$", "BRN", "BRR", "BRZ", "BSD", "BTN", "BUK", "BWP", "BYB", "BYN", "BYR", "BZD", "CA$", "CDF", "CHE", "CHF", "CHW", "CLE", "CLF", "CLP", "CNH", "CNX", "CNY", "COP", "COU", "CRC", "CSD", "CSK", "CUC", "CUP", "CVE", "CYP", "CZK", "DDM", "DEM", "DJF", "DKK", "DOP", "DZD", "ECS", "ECV", "EEK", "EGP", "ERN", "ESA", "ESB", "ESP", "ETB", "€", "FIM", "FJD", "FKP", "FRF", "GBP", "GEK", "GEL", "GHC", "GHS", "GIP", "GMD", "GNF", "GNS", "GQE", "GRD", "GTQ", "GWE", "GWP", "GYD", "HKD", "HNL", "HRD", "HRK", "HTG", "HUF", "IDR", "IEP", "ILP", "ILR", "ILS", "INR", "IQD", "IRR", "ISJ", "ISK", "ITL", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRH", "KRO", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LTL", "LTT", "LUC", "LUF", "LUL", "LVL", "LVR", "LYD", "MAD", "MAF", "MCF", "MDC", "MDL", "MGA", "MGF", "ден.", "MKN", "MLF", "MMK", "MNT", "MOP", "MRO", "MRU", "MTL", "MTP", "MUR", "MVP", "MVR", "MWK", "MX$", "MXP", "MXV", "MYR", "MZE", "MZM", "MZN", "NAD", "NGN", "NIC", "NIO", "NLG", "NOK", "NPR", "NZD", "OMR", "PAB", "PEI", "PEN", "PES", "PGK", "PHP", "PKR", "PLN", "PLZ", "PTE", "PYG", "QAR", "RHD", "ROL", "RON", "RSD", "RUB", "RUR", "RWF", "SAR", "SBD", "SCR", "SDD", "SDG", "SDP", "SEK", "SGD", "SHP", "SIT", "SKK", "SLL", "SOS", "SRD", "SRG", "SSP", "STD", "STN", "SUR", "SVC", "SYP", "SZL", "THB", "TJR", "TJS", "TMM", "TMT", "TND", "TOP", "TPE", "TRL", "TRY", "TTD", "TWD", "TZS", "UAH", "UAK", "UGS", "UGX", "US$", "USN", "USS", "UYI", "UYP", "UYU", "UYW", "UZS", "VEB", "VEF", "VES", "VND", "VNN", "VUV", "WST", "FCFA", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "EC$", "XDR", "XEU", "XFO", "XFU", "CFA", "XPD", "CFPF", "XPT", "XRE", "XSU", "XTS", "XUA", "XXX", "YDD", "YER", "YUD", "YUM", "YUN", "YUR", "ZAL", "ZAR", "ZMK", "ZMW", "ZRN", "ZRZ", "ZWD", "ZWL", "ZWR"},
60 percentSuffix: " ",
61 currencyPositiveSuffix: " ",
62 currencyNegativeSuffix: " ",
63 monthsAbbreviated: []string{"", "јан.", "фев.", "мар.", "апр.", "мај", "јун.", "јул.", "авг.", "септ.", "окт.", "ноем.", "дек."},
64 monthsNarrow: []string{"", "ј", "ф", "м", "а", "м", "ј", "ј", "а", "с", "о", "н", "д"},
65 monthsWide: []string{"", "јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември"},
66 daysAbbreviated: []string{"нед.", "пон.", "вт.", "сре.", "чет.", "пет.", "саб."},
67 daysNarrow: []string{"н", "п", "в", "с", "ч", "п", "с"},
68 daysShort: []string{"нед.", "пон.", "вто.", "сре.", "чет.", "пет.", "саб."},
69 daysWide: []string{"недела", "понеделник", "вторник", "среда", "четврток", "петок", "сабота"},
70 periodsAbbreviated: []string{"претпл.", "попл."},
71 periodsNarrow: []string{"претпл.", "попл."},
72 periodsWide: []string{"претпладне", "попладне"},
73 erasAbbreviated: []string{"пр.н.е.", "н.е."},
74 erasNarrow: []string{"пр.н.е.", "н.е."},
75 erasWide: []string{"пред нашата ера", "од нашата ера"},
76 timezones: map[string]string{"ACDT": "Летно сметање на времето во Централна Австралија", "ACST": "Стандардно време во Централна Австралија", "ACWDT": "Летно сметање на времето во Централна и Западна Австралија", "ACWST": "Стандардно време во Централна и Западна Австралија", "ADT": "Атлантско летно сметање на времето", "AEDT": "Летно сметање на времето во Источна Австралија", "AEST": "Стандардно време во Источна Австралија", "AKDT": "Летно сметање на времето во Алјаска", "AKST": "Стандардно време во Алјаска", "ARST": "Летно сметање на времето во Аргентина", "ART": "Стандардно време во Аргентина", "AST": "Атлантско стандардно време", "AWDT": "Летно сметање на времето во Западна Австралија", "AWST": "Стандардно време во Западна Австралија", "BOT": "Време во Боливија", "BT": "Време во Бутан", "CAT": "Средноафриканско време", "CDT": "Централно летно сметање на времето", "CHADT": "Летно сметање на времето во Чатам", "CHAST": "Стандардно време во Чатам", "CLST": "Летно сметање на времето во Чиле", "CLT": "Стандардно време во Чиле", "COST": "Летно сметање на времето во Колумбија", "COT": "Стандардно време во Колумбија", "CST": "Централно стандардно време во Северна Америка", "ChST": "Време во Чаморо", "EAT": "Источноафриканско време", "ECT": "Време во Еквадор", "EDT": "Источно летно сметање на времето", "EST": "Источно стандардно време", "GFT": "Време во Француска Гвајана", "GMT": "Средно време по Гринич", "GST": "Време на Мексиканскиот Залив", "GYT": "Време во Гвајана", "HADT": "Летно сметање на времето во Хаваи - Алеутски острови", "HAST": "Стандардно време во Хаваи - Алеутски острови", "HAT": "Летно сметање на времето на Њуфаундленд", "HECU": "Летно сметање на времето во Куба", "HEEG": "Летно сметање на времето во Источен Гренланд", "HENOMX": "Летно сметање на времето во северозападно Мексико", "HEOG": "Летно сметање на времето во Западен Гренланд", "HEPM": "Летно сметање на времето на Сент Пјер и Микелан", "HEPMX": "Летно пацифичко време во Мексико", "HKST": "Летно време во Хонг Конг", "HKT": "Стандардно време во Хонг Конг", "HNCU": "Стандардно време во Куба", "HNEG": "Стандардно време во Источен Гренланд", "HNNOMX": "Стандардно време во северозападно Мексико", "HNOG": "Стандардно време во Западен Гренланд", "HNPM": "Стандардно време на Сент Пјер и Микелан", "HNPMX": "Стандардно пацифичко време во Мексико", "HNT": "Стандардно време на Њуфаундленд", "IST": "Време во Индија", "JDT": "Летно сметање на времето во Јапонија", "JST": "Стандардно време во Јапонија", "LHDT": "Летно сметање на времето во Лорд Хау", "LHST": "Стандардно време во Лорд Хау", "MDT": "Планинско летно сметање на времето", "MESZ": "Средноевропско летно време", "MEZ": "Средноевропско стандардно време", "MST": "Планинско стандардно време", "MYT": "Време во Малезија", "NZDT": "Летно сметање на времето во Нов Зеланд", "NZST": "Стандардно време во Нов Зеланд", "OESZ": "Источноевропско летно време", "OEZ": "Источноевропско стандардно време", "PDT": "Пацифичко летно сметање на времето", "PST": "Пацифичко стандардно време", "SAST": "Време во Јужноафриканска Република", "SGT": "Време во Сингапур", "SRT": "Време во Суринам", "TMST": "Летно време во Туркменистан", "TMT": "Стандардно време во Туркменистан", "UYST": "Летно сметање на времето во Уругвај", "UYT": "Стандардно време во Уругвај", "VET": "Време во Венецуела", "WARST": "Летно сметање на времето во западна Аргентина", "WART": "Стандардно време во западна Аргентина", "WAST": "Западноафриканско летно сметање на времето", "WAT": "Западноафриканско стандардно време", "WESZ": "Западноевропско летно време", "WEZ": "Западноевропско стандардно време", "WIB": "Време во Западна Индонезија", "WIT": "Време во Источна Индонезија", "WITA": "Време во Централна Индонезија", "∅∅∅": "Летно време на Азорските Острови"},
77 }
78 }
79
80
81 func (mk *mk) Locale() string {
82 return mk.locale
83 }
84
85
86 func (mk *mk) PluralsCardinal() []locales.PluralRule {
87 return mk.pluralsCardinal
88 }
89
90
91 func (mk *mk) PluralsOrdinal() []locales.PluralRule {
92 return mk.pluralsOrdinal
93 }
94
95
96 func (mk *mk) PluralsRange() []locales.PluralRule {
97 return mk.pluralsRange
98 }
99
100
101 func (mk *mk) CardinalPluralRule(num float64, v uint64) locales.PluralRule {
102
103 n := math.Abs(num)
104 i := int64(n)
105 f := locales.F(n, v)
106 iMod10 := i % 10
107 iMod100 := i % 100
108 fMod10 := f % 10
109 fMod100 := f % 100
110
111 if (v == 0 && iMod10 == 1 && iMod100 != 11) || (fMod10 == 1 && fMod100 != 11) {
112 return locales.PluralRuleOne
113 }
114
115 return locales.PluralRuleOther
116 }
117
118
119 func (mk *mk) OrdinalPluralRule(num float64, v uint64) locales.PluralRule {
120
121 n := math.Abs(num)
122 i := int64(n)
123 iMod10 := i % 10
124 iMod100 := i % 100
125
126 if iMod10 == 1 && iMod100 != 11 {
127 return locales.PluralRuleOne
128 } else if iMod10 == 2 && iMod100 != 12 {
129 return locales.PluralRuleTwo
130 } else if (iMod10 == 7 || iMod10 == 8) && (iMod100 != 17 && iMod100 != 18) {
131 return locales.PluralRuleMany
132 }
133
134 return locales.PluralRuleOther
135 }
136
137
138 func (mk *mk) RangePluralRule(num1 float64, v1 uint64, num2 float64, v2 uint64) locales.PluralRule {
139 return locales.PluralRuleOther
140 }
141
142
143 func (mk *mk) MonthAbbreviated(month time.Month) string {
144 return mk.monthsAbbreviated[month]
145 }
146
147
148 func (mk *mk) MonthsAbbreviated() []string {
149 return mk.monthsAbbreviated[1:]
150 }
151
152
153 func (mk *mk) MonthNarrow(month time.Month) string {
154 return mk.monthsNarrow[month]
155 }
156
157
158 func (mk *mk) MonthsNarrow() []string {
159 return mk.monthsNarrow[1:]
160 }
161
162
163 func (mk *mk) MonthWide(month time.Month) string {
164 return mk.monthsWide[month]
165 }
166
167
168 func (mk *mk) MonthsWide() []string {
169 return mk.monthsWide[1:]
170 }
171
172
173 func (mk *mk) WeekdayAbbreviated(weekday time.Weekday) string {
174 return mk.daysAbbreviated[weekday]
175 }
176
177
178 func (mk *mk) WeekdaysAbbreviated() []string {
179 return mk.daysAbbreviated
180 }
181
182
183 func (mk *mk) WeekdayNarrow(weekday time.Weekday) string {
184 return mk.daysNarrow[weekday]
185 }
186
187
188 func (mk *mk) WeekdaysNarrow() []string {
189 return mk.daysNarrow
190 }
191
192
193 func (mk *mk) WeekdayShort(weekday time.Weekday) string {
194 return mk.daysShort[weekday]
195 }
196
197
198 func (mk *mk) WeekdaysShort() []string {
199 return mk.daysShort
200 }
201
202
203 func (mk *mk) WeekdayWide(weekday time.Weekday) string {
204 return mk.daysWide[weekday]
205 }
206
207
208 func (mk *mk) WeekdaysWide() []string {
209 return mk.daysWide
210 }
211
212
213 func (mk *mk) Decimal() string {
214 return mk.decimal
215 }
216
217
218 func (mk *mk) Group() string {
219 return mk.group
220 }
221
222
223 func (mk *mk) Minus() string {
224 return mk.minus
225 }
226
227
228 func (mk *mk) FmtNumber(num float64, v uint64) string {
229
230 s := strconv.FormatFloat(math.Abs(num), 'f', int(v), 64)
231 l := len(s) + 2 + 1*len(s[:len(s)-int(v)-1])/3
232 count := 0
233 inWhole := v == 0
234 b := make([]byte, 0, l)
235
236 for i := len(s) - 1; i >= 0; i-- {
237
238 if s[i] == '.' {
239 b = append(b, mk.decimal[0])
240 inWhole = true
241 continue
242 }
243
244 if inWhole {
245 if count == 3 {
246 b = append(b, mk.group[0])
247 count = 1
248 } else {
249 count++
250 }
251 }
252
253 b = append(b, s[i])
254 }
255
256 if num < 0 {
257 b = append(b, mk.minus[0])
258 }
259
260
261 for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
262 b[i], b[j] = b[j], b[i]
263 }
264
265 return string(b)
266 }
267
268
269
270 func (mk *mk) FmtPercent(num float64, v uint64) string {
271 s := strconv.FormatFloat(math.Abs(num), 'f', int(v), 64)
272 l := len(s) + 5
273 b := make([]byte, 0, l)
274
275 for i := len(s) - 1; i >= 0; i-- {
276
277 if s[i] == '.' {
278 b = append(b, mk.decimal[0])
279 continue
280 }
281
282 b = append(b, s[i])
283 }
284
285 if num < 0 {
286 b = append(b, mk.minus[0])
287 }
288
289
290 for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
291 b[i], b[j] = b[j], b[i]
292 }
293
294 b = append(b, mk.percentSuffix...)
295
296 b = append(b, mk.percent...)
297
298 return string(b)
299 }
300
301
302 func (mk *mk) FmtCurrency(num float64, v uint64, currency currency.Type) string {
303
304 s := strconv.FormatFloat(math.Abs(num), 'f', int(v), 64)
305 symbol := mk.currencies[currency]
306 l := len(s) + len(symbol) + 4 + 1*len(s[:len(s)-int(v)-1])/3
307 count := 0
308 inWhole := v == 0
309 b := make([]byte, 0, l)
310
311 for i := len(s) - 1; i >= 0; i-- {
312
313 if s[i] == '.' {
314 b = append(b, mk.decimal[0])
315 inWhole = true
316 continue
317 }
318
319 if inWhole {
320 if count == 3 {
321 b = append(b, mk.group[0])
322 count = 1
323 } else {
324 count++
325 }
326 }
327
328 b = append(b, s[i])
329 }
330
331 if num < 0 {
332 b = append(b, mk.minus[0])
333 }
334
335
336 for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
337 b[i], b[j] = b[j], b[i]
338 }
339
340 if int(v) < 2 {
341
342 if v == 0 {
343 b = append(b, mk.decimal...)
344 }
345
346 for i := 0; i < 2-int(v); i++ {
347 b = append(b, '0')
348 }
349 }
350
351 b = append(b, mk.currencyPositiveSuffix...)
352
353 b = append(b, symbol...)
354
355 return string(b)
356 }
357
358
359
360 func (mk *mk) FmtAccounting(num float64, v uint64, currency currency.Type) string {
361
362 s := strconv.FormatFloat(math.Abs(num), 'f', int(v), 64)
363 symbol := mk.currencies[currency]
364 l := len(s) + len(symbol) + 4 + 1*len(s[:len(s)-int(v)-1])/3
365 count := 0
366 inWhole := v == 0
367 b := make([]byte, 0, l)
368
369 for i := len(s) - 1; i >= 0; i-- {
370
371 if s[i] == '.' {
372 b = append(b, mk.decimal[0])
373 inWhole = true
374 continue
375 }
376
377 if inWhole {
378 if count == 3 {
379 b = append(b, mk.group[0])
380 count = 1
381 } else {
382 count++
383 }
384 }
385
386 b = append(b, s[i])
387 }
388
389 if num < 0 {
390
391 b = append(b, mk.minus[0])
392
393 }
394
395
396 for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
397 b[i], b[j] = b[j], b[i]
398 }
399
400 if int(v) < 2 {
401
402 if v == 0 {
403 b = append(b, mk.decimal...)
404 }
405
406 for i := 0; i < 2-int(v); i++ {
407 b = append(b, '0')
408 }
409 }
410
411 if num < 0 {
412 b = append(b, mk.currencyNegativeSuffix...)
413 b = append(b, symbol...)
414 } else {
415
416 b = append(b, mk.currencyPositiveSuffix...)
417 b = append(b, symbol...)
418 }
419
420 return string(b)
421 }
422
423
424 func (mk *mk) FmtDateShort(t time.Time) string {
425
426 b := make([]byte, 0, 32)
427
428 b = strconv.AppendInt(b, int64(t.Day()), 10)
429 b = append(b, []byte{0x2e}...)
430 b = strconv.AppendInt(b, int64(t.Month()), 10)
431 b = append(b, []byte{0x2e}...)
432
433 if t.Year() > 9 {
434 b = append(b, strconv.Itoa(t.Year())[2:]...)
435 } else {
436 b = append(b, strconv.Itoa(t.Year())[1:]...)
437 }
438
439 return string(b)
440 }
441
442
443 func (mk *mk) FmtDateMedium(t time.Time) string {
444
445 b := make([]byte, 0, 32)
446
447 b = strconv.AppendInt(b, int64(t.Day()), 10)
448 b = append(b, []byte{0x2e}...)
449 b = strconv.AppendInt(b, int64(t.Month()), 10)
450 b = append(b, []byte{0x2e}...)
451
452 if t.Year() > 0 {
453 b = strconv.AppendInt(b, int64(t.Year()), 10)
454 } else {
455 b = strconv.AppendInt(b, int64(-t.Year()), 10)
456 }
457
458 return string(b)
459 }
460
461
462 func (mk *mk) FmtDateLong(t time.Time) string {
463
464 b := make([]byte, 0, 32)
465
466 b = strconv.AppendInt(b, int64(t.Day()), 10)
467 b = append(b, []byte{0x20}...)
468 b = append(b, mk.monthsWide[t.Month()]...)
469 b = append(b, []byte{0x20}...)
470
471 if t.Year() > 0 {
472 b = strconv.AppendInt(b, int64(t.Year()), 10)
473 } else {
474 b = strconv.AppendInt(b, int64(-t.Year()), 10)
475 }
476
477 return string(b)
478 }
479
480
481 func (mk *mk) FmtDateFull(t time.Time) string {
482
483 b := make([]byte, 0, 32)
484
485 b = append(b, mk.daysWide[t.Weekday()]...)
486 b = append(b, []byte{0x2c, 0x20}...)
487 b = strconv.AppendInt(b, int64(t.Day()), 10)
488 b = append(b, []byte{0x20}...)
489 b = append(b, mk.monthsWide[t.Month()]...)
490 b = append(b, []byte{0x20}...)
491
492 if t.Year() > 0 {
493 b = strconv.AppendInt(b, int64(t.Year()), 10)
494 } else {
495 b = strconv.AppendInt(b, int64(-t.Year()), 10)
496 }
497
498 return string(b)
499 }
500
501
502 func (mk *mk) FmtTimeShort(t time.Time) string {
503
504 b := make([]byte, 0, 32)
505
506 if t.Hour() < 10 {
507 b = append(b, '0')
508 }
509
510 b = strconv.AppendInt(b, int64(t.Hour()), 10)
511 b = append(b, mk.timeSeparator...)
512
513 if t.Minute() < 10 {
514 b = append(b, '0')
515 }
516
517 b = strconv.AppendInt(b, int64(t.Minute()), 10)
518
519 return string(b)
520 }
521
522
523 func (mk *mk) FmtTimeMedium(t time.Time) string {
524
525 b := make([]byte, 0, 32)
526
527 if t.Hour() < 10 {
528 b = append(b, '0')
529 }
530
531 b = strconv.AppendInt(b, int64(t.Hour()), 10)
532 b = append(b, mk.timeSeparator...)
533
534 if t.Minute() < 10 {
535 b = append(b, '0')
536 }
537
538 b = strconv.AppendInt(b, int64(t.Minute()), 10)
539 b = append(b, mk.timeSeparator...)
540
541 if t.Second() < 10 {
542 b = append(b, '0')
543 }
544
545 b = strconv.AppendInt(b, int64(t.Second()), 10)
546
547 return string(b)
548 }
549
550
551 func (mk *mk) FmtTimeLong(t time.Time) string {
552
553 b := make([]byte, 0, 32)
554
555 if t.Hour() < 10 {
556 b = append(b, '0')
557 }
558
559 b = strconv.AppendInt(b, int64(t.Hour()), 10)
560 b = append(b, mk.timeSeparator...)
561
562 if t.Minute() < 10 {
563 b = append(b, '0')
564 }
565
566 b = strconv.AppendInt(b, int64(t.Minute()), 10)
567 b = append(b, mk.timeSeparator...)
568
569 if t.Second() < 10 {
570 b = append(b, '0')
571 }
572
573 b = strconv.AppendInt(b, int64(t.Second()), 10)
574 b = append(b, []byte{0x20}...)
575
576 tz, _ := t.Zone()
577 b = append(b, tz...)
578
579 return string(b)
580 }
581
582
583 func (mk *mk) FmtTimeFull(t time.Time) string {
584
585 b := make([]byte, 0, 32)
586
587 if t.Hour() < 10 {
588 b = append(b, '0')
589 }
590
591 b = strconv.AppendInt(b, int64(t.Hour()), 10)
592 b = append(b, mk.timeSeparator...)
593
594 if t.Minute() < 10 {
595 b = append(b, '0')
596 }
597
598 b = strconv.AppendInt(b, int64(t.Minute()), 10)
599 b = append(b, mk.timeSeparator...)
600
601 if t.Second() < 10 {
602 b = append(b, '0')
603 }
604
605 b = strconv.AppendInt(b, int64(t.Second()), 10)
606 b = append(b, []byte{0x20}...)
607
608 tz, _ := t.Zone()
609
610 if btz, ok := mk.timezones[tz]; ok {
611 b = append(b, btz...)
612 } else {
613 b = append(b, tz...)
614 }
615
616 return string(b)
617 }
618
View as plain text