diff options
Diffstat (limited to 'src/i18n')
-rw-r--r-- | src/i18n/i18n.go | 405 |
1 files changed, 237 insertions, 168 deletions
diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go index 3bc490f..b996681 100644 --- a/src/i18n/i18n.go +++ b/src/i18n/i18n.go @@ -17,11 +17,12 @@ type Printer struct { } type LocaleInfo struct { - Bcp, Name string - Eurozone, Enabled bool - DateFormat string - ThousandsSeparator, DecimalSeparator rune - MonetaryPre, MonetaryPost [2]string + Bcp, Name string + Eurozone, Enabled bool + DateFormat string + GroupSeparator, DecimalSeparator rune + MonetaryPre [2]string + MonetaryPost string } type number interface { @@ -41,205 +42,267 @@ var ( 'r': sprintfr, } - /* To determine the correct date format to use, use the ‘datefmt’ script in - the repository root */ + /* To determine the correct currency-, date-, and number formats to + use, use the ‘getfmt’ script in the repository root */ locales = [...]LocaleInfo{ { - Bcp: "ca", - Name: "Català", - DateFormat: "2/1/2006", - Eurozone: true, - Enabled: false, + Bcp: "ca", + Name: "Català", + DateFormat: "2/1/2006", + Eurozone: true, + Enabled: false, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "de", - Name: "Deutsch", - DateFormat: "2.1.2006", - Eurozone: true, - Enabled: false, + Bcp: "de", + Name: "Deutsch", + DateFormat: "2.1.2006", + Eurozone: true, + Enabled: false, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "el", - Name: "Ελληνικά", - DateFormat: "2/1/2006", - Eurozone: true, - Enabled: true, + Bcp: "el", + Name: "Ελληνικά", + DateFormat: "2/1/2006", + Eurozone: true, + Enabled: true, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "en", - Name: "English", - DateFormat: "02/01/2006", - Eurozone: true, - Enabled: true, - ThousandsSeparator: ',', - DecimalSeparator: '.', - MonetaryPre: [2]string{"€", "-€"}, + Bcp: "en", + Name: "English", + DateFormat: "02/01/2006", + Eurozone: true, + Enabled: true, + GroupSeparator: ',', + DecimalSeparator: '.', + MonetaryPre: [2]string{"€", "-€"}, }, { - Bcp: "es", - Name: "Español", - DateFormat: "2/1/2006", - Eurozone: true, - Enabled: false, + Bcp: "es", + Name: "Español", + DateFormat: "2/1/2006", + Eurozone: true, + Enabled: false, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "et", - Name: "Eesti", - DateFormat: "2.1.2006", - Eurozone: true, - Enabled: false, + Bcp: "et", + Name: "Eesti", + DateFormat: "2.1.2006", + Eurozone: true, + Enabled: false, + GroupSeparator: ' ', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "fi", - Name: "Suomi", - DateFormat: "2.1.2006", - Eurozone: true, - Enabled: false, + Bcp: "fi", + Name: "Suomi", + DateFormat: "2.1.2006", + Eurozone: true, + Enabled: false, + GroupSeparator: ' ', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "fr", - Name: "Français", - DateFormat: "02/01/2006", - Eurozone: true, - Enabled: false, + Bcp: "fr", + Name: "Français", + DateFormat: "02/01/2006", + Eurozone: true, + Enabled: false, + GroupSeparator: ' ', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "ga", - Name: "Gaeilge", - DateFormat: "02/01/2006", - Eurozone: true, - Enabled: false, + Bcp: "ga", + Name: "Gaeilge", + DateFormat: "02/01/2006", + Eurozone: true, + Enabled: false, + GroupSeparator: ',', + DecimalSeparator: '.', + MonetaryPre: [2]string{"€", "-€"}, }, { - Bcp: "hr", - Name: "Hrvatski", - DateFormat: "02. 01. 2006.", - Eurozone: true, - Enabled: false, + Bcp: "hr", + Name: "Hrvatski", + DateFormat: "02. 01. 2006.", + Eurozone: true, + Enabled: false, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "it", - Name: "Italiano", - DateFormat: "02/01/2006", - Eurozone: true, - Enabled: false, + Bcp: "it", + Name: "Italiano", + DateFormat: "02/01/2006", + Eurozone: true, + Enabled: false, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "lb", - Name: "Lëtzebuergesch", - DateFormat: "2.1.2006", - Eurozone: true, - Enabled: false, + Bcp: "lb", + Name: "Lëtzebuergesch", + DateFormat: "2.1.2006", + Eurozone: true, + Enabled: false, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "lt", - Name: "Lietuvių", - DateFormat: "2006-01-02", - Eurozone: true, - Enabled: false, + Bcp: "lt", + Name: "Lietuvių", + DateFormat: "2006-01-02", + Eurozone: true, + Enabled: false, + GroupSeparator: ' ', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "lv", - Name: "Latviešu", - DateFormat: "2.01.2006.", - Eurozone: true, - Enabled: false, + Bcp: "lv", + Name: "Latviešu", + DateFormat: "2.01.2006.", + Eurozone: true, + Enabled: false, + GroupSeparator: ' ', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "mt", - Name: "Malti", - DateFormat: "2/1/2006", - Eurozone: true, - Enabled: false, + Bcp: "mt", + Name: "Malti", + DateFormat: "2/1/2006", + Eurozone: true, + Enabled: false, + GroupSeparator: ',', + DecimalSeparator: '.', + MonetaryPre: [2]string{"€", "-€"}, }, { - Bcp: "nl", - Name: "Nederlands", - DateFormat: "2-1-2006", - Eurozone: true, - Enabled: true, - ThousandsSeparator: '.', - DecimalSeparator: ',', - MonetaryPre: [2]string{"€ ", "€ -"}, + Bcp: "nl", + Name: "Nederlands", + DateFormat: "2-1-2006", + Eurozone: true, + Enabled: true, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"€ ", "€ -"}, }, { - Bcp: "pt", - Name: "Português", - DateFormat: "02/01/2006", - Eurozone: true, - Enabled: false, + Bcp: "pt", + Name: "Português", + DateFormat: "02/01/2006", + Eurozone: true, + Enabled: false, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"€ ", "€ -"}, }, { - Bcp: "sk", - Name: "Slovenčina", - DateFormat: "2. 1. 2006", - Eurozone: true, - Enabled: false, + Bcp: "sk", + Name: "Slovenčina", + DateFormat: "2. 1. 2006", + Eurozone: true, + Enabled: false, + GroupSeparator: ' ', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "sl", - Name: "Slovenščina", - DateFormat: "2. 1. 2006", - Eurozone: true, - Enabled: false, + Bcp: "sl", + Name: "Slovenščina", + DateFormat: "2. 1. 2006", + Eurozone: true, + Enabled: false, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "sv", - Name: "Svenska", - DateFormat: "2006-01-02", - Eurozone: true, - Enabled: false, + Bcp: "sv", + Name: "Svenska", + DateFormat: "2006-01-02", + Eurozone: true, + Enabled: false, + GroupSeparator: ' ', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, - /* Non-Eurozone locales */ { - Bcp: "bg", - Name: "Български", - DateFormat: "2.01.2006 г.", - Eurozone: false, /* TODO(2026): Set to true */ - Enabled: true, - }, - { - Bcp: "da", - Name: "Dansk", - DateFormat: "02.01.2006", - Eurozone: false, - Enabled: false, - }, - { - Bcp: "en-US", - Name: "English (US)", - DateFormat: "1/2/2006", - Eurozone: false, - Enabled: false, - }, - { - Bcp: "hu", - Name: "Magyar", - DateFormat: "2006. 01. 02.", - Eurozone: false, - Enabled: false, + Bcp: "bg", + Name: "Български", + DateFormat: "2.01.2006 г.", + Eurozone: false, /* TODO(2026): Set to true */ + Enabled: true, + GroupSeparator: ' ', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "pl", - Name: "Polski", - DateFormat: "2.01.2006", - Eurozone: false, - Enabled: false, + Bcp: "en-US", + Name: "English (US)", + DateFormat: "1/2/2006", + Eurozone: false, + Enabled: false, + GroupSeparator: ',', + DecimalSeparator: '.', + MonetaryPre: [2]string{"€", "-€"}, }, { - Bcp: "ro", - Name: "Română", - DateFormat: "02.01.2006", - Eurozone: false, - Enabled: false, + Bcp: "ro", + Name: "Română", + DateFormat: "02.01.2006", + Eurozone: false, + Enabled: false, + GroupSeparator: '.', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, { - Bcp: "uk", - Name: "Yкраїнська", - DateFormat: "02.01.2006", - Eurozone: false, - Enabled: false, + Bcp: "uk", + Name: "Yкраїнська", + DateFormat: "02.01.2006", + Eurozone: false, + Enabled: false, + GroupSeparator: ' ', + DecimalSeparator: ',', + MonetaryPre: [2]string{"", "-"}, + MonetaryPost: " €", }, } /* Map of language codes to printers. We do this instead of just @@ -280,7 +343,7 @@ func (l LocaleInfo) Language() string { func (p Printer) Sprintf(format string, args ...map[string]any) string { var bob strings.Builder vars := map[string]any{ - "-": "", + "-": "a", } for _, arg := range args { maps.Copy(vars, arg) @@ -347,9 +410,9 @@ func sprintfGeneric(li LocaleInfo, bob *strings.Builder, v any) error { case time.Time: htmlesc(bob, v.(time.Time).Format(li.DateFormat)) case int: - writeInt(bob, v.(int), li.ThousandsSeparator) + writeInt(bob, v.(int), li.GroupSeparator) case float64: - writeFloat(bob, v.(float64), li.ThousandsSeparator, li.DecimalSeparator) + writeFloat(bob, v.(float64), li.GroupSeparator, li.DecimalSeparator) case string: htmlesc(bob, v.(string)) default: @@ -371,8 +434,16 @@ func sprintfe(li LocaleInfo, bob *strings.Builder, v any) error { return nil } -func sprintfE(li LocaleInfo, bob *strings.Builder, _ any) error { - bob.WriteString("</a>") +func sprintfE(li LocaleInfo, bob *strings.Builder, v any) error { + s, ok := v.(string) + if !ok { + return errors.New("TODO") + } + for tag := range strings.SplitSeq(s, ",") { + bob.WriteString("</") + bob.WriteString(tag) + bob.WriteByte('>') + } return nil } @@ -402,16 +473,14 @@ func sprintfm(li LocaleInfo, bob *strings.Builder, v any) error { switch v.(type) { case int: n := v.(int) - i := btoi(n >= 0) - htmlesc(bob, li.MonetaryPre[i]) - writeInt(bob, abs(n), li.ThousandsSeparator) - htmlesc(bob, li.MonetaryPost[i]) + htmlesc(bob, li.MonetaryPre[btoi(n >= 0)]) + writeInt(bob, abs(n), li.GroupSeparator) + htmlesc(bob, li.MonetaryPost) case float64: n := v.(float64) - i := btoi(n >= 0) - htmlesc(bob, li.MonetaryPre[i]) - writeFloat(bob, abs(n), li.ThousandsSeparator, li.DecimalSeparator) - htmlesc(bob, li.MonetaryPost[i]) + htmlesc(bob, li.MonetaryPre[btoi(n >= 0)]) + writeFloat(bob, abs(n), li.GroupSeparator, li.DecimalSeparator) + htmlesc(bob, li.MonetaryPost) default: return errors.New("TODO") } |