aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/i18n
diff options
context:
space:
mode:
Diffstat (limited to 'src/i18n')
-rw-r--r--src/i18n/i18n.go405
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")
}