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