8 "github.com/go-playground/locales"
9 "github.com/go-playground/locales/currency"
14 pluralsCardinal []locales.PluralRule
15 pluralsOrdinal []locales.PluralRule
16 pluralsRange []locales.PluralRule
24 currencies []string // idx = enum of currency code
25 monthsAbbreviated []string
28 daysAbbreviated []string
32 periodsAbbreviated []string
33 periodsNarrow []string
36 erasAbbreviated []string
39 timezones map[string]string
42 // New returns a new instance of translator for the 'rof' locale
43 func New() locales.Translator {
46 pluralsCardinal: []locales.PluralRule{2, 6},
50 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", "BRL", "BRN", "BRR", "BRZ", "BSD", "BTN", "BUK", "BWP", "BYB", "BYN", "BYR", "BZD", "CAD", "CDF", "CHE", "CHF", "CHW", "CLE", "CLF", "CLP", "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", "EUR", "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", "MKD", "MKN", "MLF", "MMK", "MNT", "MOP", "MRO", "MTL", "MTP", "MUR", "MVP", "MVR", "MWK", "MXN", "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", "SUR", "SVC", "SYP", "SZL", "THB", "TJR", "TJS", "TMM", "TMT", "TND", "TOP", "TPE", "TRL", "TRY", "TTD", "TWD", "TSh", "UAH", "UAK", "UGS", "UGX", "USD", "USN", "USS", "UYI", "UYP", "UYU", "UZS", "VEB", "VEF", "VND", "VNN", "VUV", "WST", "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XEU", "XFO", "XFU", "XOF", "XPD", "XPF", "XPT", "XRE", "XSU", "XTS", "XUA", "XXX", "YDD", "YER", "YUD", "YUM", "YUN", "YUR", "ZAL", "ZAR", "ZMK", "ZMW", "ZRN", "ZRZ", "ZWD", "ZWL", "ZWR"},
51 monthsAbbreviated: []string{"", "M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10", "M11", "M12"},
52 monthsNarrow: []string{"", "K", "K", "K", "K", "T", "S", "S", "N", "T", "I", "I", "I"},
53 monthsWide: []string{"", "Mweri wa kwanza", "Mweri wa kaili", "Mweri wa katatu", "Mweri wa kaana", "Mweri wa tanu", "Mweri wa sita", "Mweri wa saba", "Mweri wa nane", "Mweri wa tisa", "Mweri wa ikumi", "Mweri wa ikumi na moja", "Mweri wa ikumi na mbili"},
54 daysAbbreviated: []string{"Ijp", "Ijt", "Ijn", "Ijtn", "Alh", "Iju", "Ijm"},
55 daysNarrow: []string{"2", "3", "4", "5", "6", "7", "1"},
56 daysWide: []string{"Ijumapili", "Ijumatatu", "Ijumanne", "Ijumatano", "Alhamisi", "Ijumaa", "Ijumamosi"},
57 periodsAbbreviated: []string{"kang’ama", "kingoto"},
58 periodsWide: []string{"kang’ama", "kingoto"},
59 erasAbbreviated: []string{"KM", "BM"},
60 erasNarrow: []string{"", ""},
61 erasWide: []string{"Kabla ya Mayesu", "Baada ya Mayesu"},
62 timezones: map[string]string{"IST": "IST", "GMT": "GMT", "BOT": "BOT", "AWDT": "AWDT", "MEZ": "MEZ", "CLT": "CLT", "WEZ": "WEZ", "MESZ": "MESZ", "WART": "WART", "AEDT": "AEDT", "GFT": "GFT", "ACST": "ACST", "ACDT": "ACDT", "ARST": "ARST", "HNEG": "HNEG", "HEEG": "HEEG", "AKST": "AKST", "CHADT": "CHADT", "TMT": "TMT", "LHDT": "LHDT", "WARST": "WARST", "OESZ": "OESZ", "AKDT": "AKDT", "MDT": "MDT", "∅∅∅": "∅∅∅", "CST": "CST", "PST": "PST", "JDT": "JDT", "HEOG": "HEOG", "WAT": "WAT", "COST": "COST", "WESZ": "WESZ", "MST": "MST", "UYT": "UYT", "TMST": "TMST", "CAT": "CAT", "HEPM": "HEPM", "CDT": "CDT", "LHST": "LHST", "GYT": "GYT", "CHAST": "CHAST", "BT": "BT", "HENOMX": "HENOMX", "ART": "ART", "EDT": "EDT", "ChST": "ChST", "HEPMX": "HEPMX", "OEZ": "OEZ", "EAT": "EAT", "HAT": "HAT", "SGT": "SGT", "PDT": "PDT", "AWST": "AWST", "HKST": "HKST", "COT": "COT", "SAST": "SAST", "CLST": "CLST", "EST": "EST", "NZDT": "NZDT", "WITA": "WITA", "HNOG": "HNOG", "WIT": "WIT", "ACWDT": "ACWDT", "HECU": "HECU", "HNPM": "HNPM", "UYST": "UYST", "HAST": "HAST", "ADT": "ADT", "JST": "JST", "HNT": "HNT", "HNPMX": "HNPMX", "WIB": "WIB", "SRT": "SRT", "MYT": "MYT", "VET": "VET", "AST": "AST", "WAST": "WAST", "HKT": "HKT", "ECT": "ECT", "HADT": "HADT", "NZST": "NZST", "AEST": "AEST", "ACWST": "ACWST", "HNNOMX": "HNNOMX", "HNCU": "HNCU"},
66 // Locale returns the current translators string locale
67 func (rof *rof) Locale() string {
71 // PluralsCardinal returns the list of cardinal plural rules associated with 'rof'
72 func (rof *rof) PluralsCardinal() []locales.PluralRule {
73 return rof.pluralsCardinal
76 // PluralsOrdinal returns the list of ordinal plural rules associated with 'rof'
77 func (rof *rof) PluralsOrdinal() []locales.PluralRule {
78 return rof.pluralsOrdinal
81 // PluralsRange returns the list of range plural rules associated with 'rof'
82 func (rof *rof) PluralsRange() []locales.PluralRule {
83 return rof.pluralsRange
86 // CardinalPluralRule returns the cardinal PluralRule given 'num' and digits/precision of 'v' for 'rof'
87 func (rof *rof) CardinalPluralRule(num float64, v uint64) locales.PluralRule {
92 return locales.PluralRuleOne
95 return locales.PluralRuleOther
98 // OrdinalPluralRule returns the ordinal PluralRule given 'num' and digits/precision of 'v' for 'rof'
99 func (rof *rof) OrdinalPluralRule(num float64, v uint64) locales.PluralRule {
100 return locales.PluralRuleUnknown
103 // RangePluralRule returns the ordinal PluralRule given 'num1', 'num2' and digits/precision of 'v1' and 'v2' for 'rof'
104 func (rof *rof) RangePluralRule(num1 float64, v1 uint64, num2 float64, v2 uint64) locales.PluralRule {
105 return locales.PluralRuleUnknown
108 // MonthAbbreviated returns the locales abbreviated month given the 'month' provided
109 func (rof *rof) MonthAbbreviated(month time.Month) string {
110 return rof.monthsAbbreviated[month]
113 // MonthsAbbreviated returns the locales abbreviated months
114 func (rof *rof) MonthsAbbreviated() []string {
115 return rof.monthsAbbreviated[1:]
118 // MonthNarrow returns the locales narrow month given the 'month' provided
119 func (rof *rof) MonthNarrow(month time.Month) string {
120 return rof.monthsNarrow[month]
123 // MonthsNarrow returns the locales narrow months
124 func (rof *rof) MonthsNarrow() []string {
125 return rof.monthsNarrow[1:]
128 // MonthWide returns the locales wide month given the 'month' provided
129 func (rof *rof) MonthWide(month time.Month) string {
130 return rof.monthsWide[month]
133 // MonthsWide returns the locales wide months
134 func (rof *rof) MonthsWide() []string {
135 return rof.monthsWide[1:]
138 // WeekdayAbbreviated returns the locales abbreviated weekday given the 'weekday' provided
139 func (rof *rof) WeekdayAbbreviated(weekday time.Weekday) string {
140 return rof.daysAbbreviated[weekday]
143 // WeekdaysAbbreviated returns the locales abbreviated weekdays
144 func (rof *rof) WeekdaysAbbreviated() []string {
145 return rof.daysAbbreviated
148 // WeekdayNarrow returns the locales narrow weekday given the 'weekday' provided
149 func (rof *rof) WeekdayNarrow(weekday time.Weekday) string {
150 return rof.daysNarrow[weekday]
153 // WeekdaysNarrow returns the locales narrow weekdays
154 func (rof *rof) WeekdaysNarrow() []string {
155 return rof.daysNarrow
158 // WeekdayShort returns the locales short weekday given the 'weekday' provided
159 func (rof *rof) WeekdayShort(weekday time.Weekday) string {
160 return rof.daysShort[weekday]
163 // WeekdaysShort returns the locales short weekdays
164 func (rof *rof) WeekdaysShort() []string {
168 // WeekdayWide returns the locales wide weekday given the 'weekday' provided
169 func (rof *rof) WeekdayWide(weekday time.Weekday) string {
170 return rof.daysWide[weekday]
173 // WeekdaysWide returns the locales wide weekdays
174 func (rof *rof) WeekdaysWide() []string {
178 // Decimal returns the decimal point of number
179 func (rof *rof) Decimal() string {
183 // Group returns the group of number
184 func (rof *rof) Group() string {
188 // Group returns the minus sign of number
189 func (rof *rof) Minus() string {
193 // FmtNumber returns 'num' with digits/precision of 'v' for 'rof' and handles both Whole and Real numbers based on 'v'
194 func (rof *rof) FmtNumber(num float64, v uint64) string {
196 return strconv.FormatFloat(math.Abs(num), 'f', int(v), 64)
199 // FmtPercent returns 'num' with digits/precision of 'v' for 'rof' and handles both Whole and Real numbers based on 'v'
200 // NOTE: 'num' passed into FmtPercent is assumed to be in percent already
201 func (rof *rof) FmtPercent(num float64, v uint64) string {
202 return strconv.FormatFloat(math.Abs(num), 'f', int(v), 64)
205 // FmtCurrency returns the currency representation of 'num' with digits/precision of 'v' for 'rof'
206 func (rof *rof) FmtCurrency(num float64, v uint64, currency currency.Type) string {
208 s := strconv.FormatFloat(math.Abs(num), 'f', int(v), 64)
209 symbol := rof.currencies[currency]
210 l := len(s) + len(symbol) + 0
213 b := make([]byte, 0, l)
215 for i := len(s) - 1; i >= 0; i-- {
218 b = append(b, rof.decimal[0])
225 b = append(b, rof.group[0])
235 for j := len(symbol) - 1; j >= 0; j-- {
236 b = append(b, symbol[j])
240 b = append(b, rof.minus[0])
244 for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
245 b[i], b[j] = b[j], b[i]
251 b = append(b, rof.decimal...)
254 for i := 0; i < 2-int(v); i++ {
262 // FmtAccounting returns the currency representation of 'num' with digits/precision of 'v' for 'rof'
263 // in accounting notation.
264 func (rof *rof) FmtAccounting(num float64, v uint64, currency currency.Type) string {
266 s := strconv.FormatFloat(math.Abs(num), 'f', int(v), 64)
267 symbol := rof.currencies[currency]
268 l := len(s) + len(symbol) + 0
271 b := make([]byte, 0, l)
273 for i := len(s) - 1; i >= 0; i-- {
276 b = append(b, rof.decimal[0])
283 b = append(b, rof.group[0])
295 for j := len(symbol) - 1; j >= 0; j-- {
296 b = append(b, symbol[j])
299 b = append(b, rof.minus[0])
303 for j := len(symbol) - 1; j >= 0; j-- {
304 b = append(b, symbol[j])
310 for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
311 b[i], b[j] = b[j], b[i]
317 b = append(b, rof.decimal...)
320 for i := 0; i < 2-int(v); i++ {
328 // FmtDateShort returns the short date representation of 't' for 'rof'
329 func (rof *rof) FmtDateShort(t time.Time) string {
331 b := make([]byte, 0, 32)
337 b = strconv.AppendInt(b, int64(t.Day()), 10)
338 b = append(b, []byte{0x2f}...)
344 b = strconv.AppendInt(b, int64(t.Month()), 10)
346 b = append(b, []byte{0x2f}...)
349 b = strconv.AppendInt(b, int64(t.Year()), 10)
351 b = strconv.AppendInt(b, int64(-t.Year()), 10)
357 // FmtDateMedium returns the medium date representation of 't' for 'rof'
358 func (rof *rof) FmtDateMedium(t time.Time) string {
360 b := make([]byte, 0, 32)
362 b = strconv.AppendInt(b, int64(t.Day()), 10)
363 b = append(b, []byte{0x20}...)
364 b = append(b, rof.monthsAbbreviated[t.Month()]...)
365 b = append(b, []byte{0x20}...)
368 b = strconv.AppendInt(b, int64(t.Year()), 10)
370 b = strconv.AppendInt(b, int64(-t.Year()), 10)
376 // FmtDateLong returns the long date representation of 't' for 'rof'
377 func (rof *rof) FmtDateLong(t time.Time) string {
379 b := make([]byte, 0, 32)
381 b = strconv.AppendInt(b, int64(t.Day()), 10)
382 b = append(b, []byte{0x20}...)
383 b = append(b, rof.monthsWide[t.Month()]...)
384 b = append(b, []byte{0x20}...)
387 b = strconv.AppendInt(b, int64(t.Year()), 10)
389 b = strconv.AppendInt(b, int64(-t.Year()), 10)
395 // FmtDateFull returns the full date representation of 't' for 'rof'
396 func (rof *rof) FmtDateFull(t time.Time) string {
398 b := make([]byte, 0, 32)
400 b = append(b, rof.daysWide[t.Weekday()]...)
401 b = append(b, []byte{0x2c, 0x20}...)
402 b = strconv.AppendInt(b, int64(t.Day()), 10)
403 b = append(b, []byte{0x20}...)
404 b = append(b, rof.monthsWide[t.Month()]...)
405 b = append(b, []byte{0x20}...)
408 b = strconv.AppendInt(b, int64(t.Year()), 10)
410 b = strconv.AppendInt(b, int64(-t.Year()), 10)
416 // FmtTimeShort returns the short time representation of 't' for 'rof'
417 func (rof *rof) FmtTimeShort(t time.Time) string {
419 b := make([]byte, 0, 32)
425 b = strconv.AppendInt(b, int64(t.Hour()), 10)
426 b = append(b, rof.timeSeparator...)
432 b = strconv.AppendInt(b, int64(t.Minute()), 10)
437 // FmtTimeMedium returns the medium time representation of 't' for 'rof'
438 func (rof *rof) FmtTimeMedium(t time.Time) string {
440 b := make([]byte, 0, 32)
446 b = strconv.AppendInt(b, int64(t.Hour()), 10)
447 b = append(b, rof.timeSeparator...)
453 b = strconv.AppendInt(b, int64(t.Minute()), 10)
454 b = append(b, rof.timeSeparator...)
460 b = strconv.AppendInt(b, int64(t.Second()), 10)
465 // FmtTimeLong returns the long time representation of 't' for 'rof'
466 func (rof *rof) FmtTimeLong(t time.Time) string {
468 b := make([]byte, 0, 32)
474 b = strconv.AppendInt(b, int64(t.Hour()), 10)
475 b = append(b, rof.timeSeparator...)
481 b = strconv.AppendInt(b, int64(t.Minute()), 10)
482 b = append(b, rof.timeSeparator...)
488 b = strconv.AppendInt(b, int64(t.Second()), 10)
489 b = append(b, []byte{0x20}...)
497 // FmtTimeFull returns the full time representation of 't' for 'rof'
498 func (rof *rof) FmtTimeFull(t time.Time) string {
500 b := make([]byte, 0, 32)
506 b = strconv.AppendInt(b, int64(t.Hour()), 10)
507 b = append(b, rof.timeSeparator...)
513 b = strconv.AppendInt(b, int64(t.Minute()), 10)
514 b = append(b, rof.timeSeparator...)
520 b = strconv.AppendInt(b, int64(t.Second()), 10)
521 b = append(b, []byte{0x20}...)
525 if btz, ok := rof.timezones[tz]; ok {
526 b = append(b, btz...)