summaryrefslogtreecommitdiffhomepage
path: root/i18n/printer.go
diff options
context:
space:
mode:
Diffstat (limited to 'i18n/printer.go')
-rw-r--r--i18n/printer.go236
1 files changed, 236 insertions, 0 deletions
diff --git a/i18n/printer.go b/i18n/printer.go
new file mode 100644
index 0000000..2425f98
--- /dev/null
+++ b/i18n/printer.go
@@ -0,0 +1,236 @@
+package i18n
+
+import (
+ "fmt"
+ "strings"
+ "time"
+
+ "golang.org/x/text/language"
+ "golang.org/x/text/message"
+)
+
+//go:generate gotext -srclang=en-GB update -out=catalog.go -lang=en-GB,nl-NL git.thomasvoss.com/euro-cash.eu
+
+type Printer struct {
+ Locale Locale
+ printer *message.Printer
+}
+
+type Locale struct {
+ Code string
+ Name string
+ dateFmt string
+ moneyFmt string
+ Eurozone bool
+ Enabled bool
+}
+
+var (
+ Locales = [...]Locale{
+ Locale{
+ Code: "ca-AD",
+ Name: "català",
+ dateFmt: "2/1/2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "de-DE",
+ Name: "Deutsch",
+ dateFmt: "2.1.2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "el-GR",
+ Name: "ελληνικά",
+ dateFmt: "2/1/2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "en-GB",
+ Name: "English",
+ dateFmt: "02/01/2006",
+ Eurozone: true,
+ Enabled: true,
+ },
+ Locale{
+ Code: "es-ES",
+ Name: "español",
+ dateFmt: "2/1/2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "et-EE",
+ Name: "eesti",
+ dateFmt: "2.1.2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "fi-FI",
+ Name: "suomi",
+ dateFmt: "2.1.2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "fr-FR",
+ Name: "français",
+ dateFmt: "02/01/2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "ga-IE",
+ Name: "Gaeilge",
+ dateFmt: "02/01/2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "hr-HR",
+ Name: "hrvatski",
+ dateFmt: "02. 01. 2006.",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "it-IT",
+ Name: "italiano",
+ dateFmt: "02/01/2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "lt-LT",
+ Name: "lietuvių",
+ dateFmt: "2006-01-02",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "lv-LV",
+ Name: "latviešu",
+ dateFmt: "2.01.2006.",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "mt-MT",
+ Name: "Malti",
+ dateFmt: "2/1/2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "nl-NL",
+ Name: "Nederlands",
+ dateFmt: "2-1-2006",
+ Eurozone: true,
+ Enabled: true,
+ },
+ Locale{
+ Code: "pt-PT",
+ Name: "português",
+ dateFmt: "02/01/2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "sk-SK",
+ Name: "slovenčina",
+ dateFmt: "2. 1. 2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+ Locale{
+ Code: "sl-SI",
+ Name: "slovenščina",
+ dateFmt: "2. 1. 2006",
+ Eurozone: true,
+ Enabled: false,
+ },
+
+ /* Non-Eurozone locales */
+ Locale{
+ Code: "bg-BG",
+ Name: "български",
+ dateFmt: "2.01.2006 г.",
+ Eurozone: false,
+ Enabled: false,
+ },
+ Locale{
+ Code: "en-US",
+ Name: "English (US)",
+ dateFmt: "1/2/2006",
+ Eurozone: false,
+ Enabled: false,
+ },
+ Locale{
+ Code: "ro-RO",
+ Name: "română",
+ dateFmt: "02.01.2006",
+ Eurozone: false,
+ Enabled: false,
+ },
+ }
+ /* Map of language codes to printers. We do this instead of just
+ using language.MustParse() directly so that we can easily see if a
+ language is supported or not. */
+ Printers map[string]Printer = make(map[string]Printer, len(Locales))
+ DefaultPrinter Printer
+)
+
+func InitPrinters() {
+ for _, loc := range Locales {
+ if loc.Enabled {
+ lang := language.MustParse(loc.Code)
+ Printers[strings.ToLower(loc.Code)] = Printer{
+ Locale: loc,
+ printer: message.NewPrinter(lang),
+ }
+ }
+ }
+ DefaultPrinter = Printers["en-gb"]
+}
+
+func (p Printer) T(fmt string, args ...any) string {
+ return p.printer.Sprintf(fmt, args...)
+}
+
+func (p Printer) Date(d time.Time) string {
+ return d.Format(p.Locale.dateFmt)
+}
+
+/* TODO: Try to use a decimal type here */
+func (p Printer) Money(val float64, round bool) string {
+ var valstr string
+
+ /* Hack to avoid gotext writing these two ‘translations’ into the
+ translations file */
+ f := p.printer.Sprintf
+ if round {
+ valstr = f("%d", int(val))
+ } else {
+ valstr = f("%.2f", val)
+ }
+
+ /* All Eurozone languages place the eurosign after the value except
+ for Dutch, English, Gaelic, and Maltese. Austrian German also
+ uses Dutch-style formatting, but we do not support that dialect. */
+ switch p.Locale.Code {
+ case "en-GB", "en-US", "ga-IE", "mt-MT":
+ return fmt.Sprintf("€%s", valstr)
+ case "nl-NL":
+ return fmt.Sprintf("€ %s", valstr)
+ default:
+ return fmt.Sprintf("%s €", valstr)
+ }
+}
+
+func (l Locale) Language() string {
+ return l.Code[:2]
+}