diff options
Diffstat (limited to 'src/i18n.go')
-rw-r--r-- | src/i18n.go | 99 |
1 files changed, 76 insertions, 23 deletions
diff --git a/src/i18n.go b/src/i18n.go index dac7c5e..cb54e28 100644 --- a/src/i18n.go +++ b/src/i18n.go @@ -1,15 +1,18 @@ -//go:generate gotext -srclang=en -dir=rosetta extract -lang=bg,el,en,nl . +//go:generate go tool gotext -srclang=en -dir=rosetta update -lang=bg,el,en,nl . //go:generate ../exttmpl -package src +package app import ( "fmt" + "log" "strings" "time" "golang.org/x/text/language" "golang.org/x/text/message" + + "git.thomasvoss.com/euro-cash.eu/src/email" ) type Printer struct { @@ -20,10 +23,12 @@ type Printer struct { type locale struct { Bcp, Name string Eurozone, Enabled bool - dateFmt, moneyFmt string + dateFmt string } var ( + /* To determine the correct date format to use, use the ‘datefmt’ script in + the repository root */ Locales = [...]locale{ { Bcp: "ca", @@ -158,16 +163,30 @@ var ( Eurozone: true, Enabled: false, }, + { + Bcp: "sv", + Name: "svenska", + dateFmt: "2006-01-02", + Eurozone: true, + Enabled: false, + }, /* Non-Eurozone locales */ { Bcp: "bg", Name: "български", dateFmt: "2.01.2006 г.", - Eurozone: false, + Eurozone: false, /* TODO(2026): Set to true */ Enabled: true, }, { + Bcp: "da", + Name: "dansk", + dateFmt: "02.01.2006", + Eurozone: false, + Enabled: false, + }, + { Bcp: "en-US", Name: "English (US)", dateFmt: "1/2/2006", @@ -175,6 +194,20 @@ var ( Enabled: false, }, { + Bcp: "hu", + Name: "magyar", + dateFmt: "2006. 01. 02.", + Eurozone: false, + Enabled: false, + }, + { + Bcp: "pl", + Name: "polski", + dateFmt: "2.01.2006", + Eurozone: false, + Enabled: false, + }, + { Bcp: "ro", Name: "română", dateFmt: "02.01.2006", @@ -209,44 +242,64 @@ func init() { defaultPrinter = printers["en"] } -func (p Printer) T(fmt string, args ...any) string { - return p.inner.Sprintf(fmt, args...) -} - -func (p Printer) N(n int) string { - return p.inner.Sprint(n) -} - -func (p Printer) Date(d time.Time) string { +func (p Printer) D(d time.Time) string { return d.Format(p.Locale.dateFmt) } -func (p Printer) M(val float64, round bool) string { - var valstr string +func (p Printer) M(val any) string { + var vstr string /* Hack to avoid gotext writing these two ‘translations’ into the translations file */ f := p.inner.Sprintf - if round { - valstr = f("%d", int(val)) - } else { - valstr = f("%.2f", val) + + switch val.(type) { + case int: + vstr = f("%d", val) + case float64: + vstr = f("%.2f", val) + default: + go func() { + if err := email.ServerError(badMType{"TODO"}); err != nil { + log.Println(err) + } + }() + /* Hopefully this never happens */ + vstr = "ERROR" } /* All Eurozone languages place the eurosign after the value except - for Dutch, English, Gaelic, and Maltese. Austrian German also + for Dutch, English, Irish, and Maltese. Austrian German also uses Dutch-style formatting, but we do not support that dialect. */ switch p.Locale.Bcp { case "en", "en-US", "ga", "mt": - return fmt.Sprintf("€%s", valstr) + return fmt.Sprintf("€%s", vstr) case "nl": - return fmt.Sprintf("€ %s", valstr) + return fmt.Sprintf("€ %s", vstr) default: - return fmt.Sprintf("%s €", valstr) + return fmt.Sprintf("%s €", vstr) } } +func (p Printer) N(n int) string { + return p.inner.Sprint(n) +} + +func (p Printer) T(fmt string, args ...any) string { + return p.inner.Sprintf(fmt, args...) +} + /* Transform ‘en-US’ to ‘en’ */ func (l locale) Language() string { return l.Bcp[:2] } + +type badMType struct { + inner any +} + +func (e badMType) Error() string { + return fmt.Sprintf( + "Attempted to format ‘%v’ of type ‘%T’ as a monetary value in Printer.M()", + e.inner, e.inner) +} |