aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2025-08-02 15:25:21 +0200
committerThomas Voss <mail@thomasvoss.com> 2025-08-02 15:25:21 +0200
commitbcbbbcbc40c956c1d8487f6eb48bf8a5325a6380 (patch)
treed934a85a618261c5c434cf75bf81f8a5eaa721c2 /src
parent1863809ecc34e6889ee7ec2ecac9d7f9540cbfab (diff)
Simplify code further
Diffstat (limited to 'src')
-rwxr-xr-xsrc/i18n/gen.py80
-rw-r--r--src/i18n/i18n.go46
-rw-r--r--src/i18n/locales.gen.go118
3 files changed, 119 insertions, 125 deletions
diff --git a/src/i18n/gen.py b/src/i18n/gen.py
index 2f86ae9..3f3c85a 100755
--- a/src/i18n/gen.py
+++ b/src/i18n/gen.py
@@ -9,24 +9,28 @@ import subprocess
import sys
import urllib.request
from dataclasses import dataclass
-from typing import TextIO
+from typing import Any, TextIO
FILENAME = "locales.gen.go"
+class Rune(int):
+ pass
+
+
@dataclass
class Locale:
bcp: str
eurozone: bool
enabled: bool
- territory: str | None = dataclasses.field(default=None)
- name: str = dataclasses.field(init=False)
- date_format: str = dataclasses.field(init=False)
- group_separator: int = dataclasses.field(init=False)
- decimal_separator: int = dataclasses.field(init=False)
- monetary_pre: str = dataclasses.field(init=False)
- monetary_suf: str = dataclasses.field(init=False)
- percent_format: str = dataclasses.field(init=False)
+ territory: str | None = dataclasses.field(default=None)
+ name: str = dataclasses.field(init=False)
+ date_format: str = dataclasses.field(init=False)
+ group_separator: Rune = dataclasses.field(init=False)
+ decimal_separator: Rune = dataclasses.field(init=False)
+ monetary_formats: tuple[str, str] = dataclasses.field(init=False)
+ percent_format: str = dataclasses.field(init=False)
+
LOCALES = (
Locale(bcp="ca", eurozone=True, enabled=False),
@@ -86,8 +90,7 @@ type LocaleInfo struct {
Eurozone, Enabled bool
DateFormat string
GroupSeparator, DecimalSeparator rune
- MonetaryPre [2]string
- MonetarySuf string
+ MonetaryFormats [2]string
PercentFormat string
}
@@ -98,19 +101,10 @@ var locales = [...]LocaleInfo{
for k, v in x.__dict__.items():
if not v or k == "territory":
continue
- f.write("%s: " % pascal(k))
- match v:
- case bool():
- f.write("true" if v else "false")
- case int():
- f.write("'%s'" % chr(v))
- case str() if not v.startswith("gotext"):
- f.write('"%s"' % v)
- case str():
- f.write(v)
- case [str(), str()]:
- f.write('[2]string{"%s", "%s"}' % (v[0], v[1]))
- f.write(",\n")
+ if k == "name":
+ f.write('Name: gotext.GetC(%s, "Language Name"),\n' % val_to_go(v))
+ else:
+ f.write("%s: %s,\n" % (pascal(k), val_to_go(v)))
f.write("},\n")
f.write("}")
@@ -125,15 +119,14 @@ def write_locale(l: Locale) -> None:
urllib.request.urlopen(DATES_LINK % bcp),
urllib.request.urlopen(LANGUAGES_LINK % bcp),
))
- name = jl["main"][bcp]["localeDisplayNames"]["languages"][l.bcp].capitalize()
- l.name = 'gotext.GetC("%s", "Language Name")' % name
+ name = jl["main"][bcp]["localeDisplayNames"]["languages"][l.bcp]
+ l.name = name.capitalize()
syms = jn["main"][bcp]["numbers"]["symbols-numberSystem-latn"]
- l.group_separator = ord(syms["group"])
- l.decimal_separator = ord(syms["decimal"])
+ l.group_separator = Rune(ord(syms["group"]))
+ l.decimal_separator = Rune(ord(syms["decimal"]))
fmt = jn["main"][bcp]["numbers"]["percentFormats-numberSystem-latn"]["standard"]
- fmt = fmt.replace("%", "%%")
- l.percent_format = re.sub(r"[0#,.]+", "%s", fmt)
+ l.percent_format = numfmt_subst(fmt)
fmt = jd["main"][bcp]["dates"]["calendars"]["gregorian"]["dateFormats"]["short"]
l.date_format = (
@@ -148,21 +141,32 @@ def write_locale(l: Locale) -> None:
)
fmt = jn["main"][bcp]["numbers"]["currencyFormats-numberSystem-latn"]["standard"]
- parts = fmt.replace("¤", "€").split(";")
- l.monetary_pre = ["", ""]
-
- for i, x in enumerate(parts):
- pre_suf = re.split(r"[0#,.]+", x)
- l.monetary_pre[i] = pre_suf[0]
- l.monetary_suf = pre_suf[1]
+ parts = list(map(numfmt_subst, fmt.replace("¤", "€").split(";")))
if len(parts) == 1:
- l.monetary_pre[1] = "-" + l.monetary_pre[0]
+ parts.append('-' + parts[0])
+ l.monetary_formats = tuple(parts)
+
+
+def numfmt_subst(s: str) -> str:
+ return re.sub(r"[0#,.]+", "123", s)
def pascal(s: str) -> str:
return ''.join(map(str.capitalize, s.split('_')))
+def val_to_go(x: Any) -> str:
+ match x:
+ case bool():
+ return "true" if x else "false"
+ case Rune():
+ return "'%s'" % chr(x)
+ case str():
+ return '"%s"' % x
+ case (str(), str()):
+ return "[2]string{%s, %s}" % (val_to_go(x[0]), val_to_go(x[1]))
+
+
if __name__ == "__main__":
os.chdir(os.path.dirname(sys.argv[0]))
sys.exit(main()) \ No newline at end of file
diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go
index 7d4ae5e..c844016 100644
--- a/src/i18n/i18n.go
+++ b/src/i18n/i18n.go
@@ -280,34 +280,44 @@ func sprintfL(li LocaleInfo, bob *strings.Builder, v any) error {
}
func sprintfm(li LocaleInfo, bob *strings.Builder, v any) error {
+ var (
+ fmt string
+ negp bool
+ )
switch v.(type) {
case int:
- n := v.(int)
- htmlesc(bob, li.MonetaryPre[btoi(n >= 0)])
- writeInt(bob, abs(n), li)
- htmlesc(bob, li.MonetarySuf)
+ negp = v.(int) < 0
case float64:
- n := v.(float64)
- htmlesc(bob, li.MonetaryPre[btoi(n >= 0)])
- writeFloat(bob, abs(n), li)
- htmlesc(bob, li.MonetarySuf)
- default:
- return errors.New("TODO")
+ negp = v.(float64) < 0
+ }
+
+ fmt = li.MonetaryFormats[btoi(negp)]
+ pre, suf, _ := strings.Cut(fmt, "123")
+ htmlesc(bob, pre)
+
+ switch v.(type) {
+ case int:
+ writeInt(bob, abs(v.(int)), li)
+ case float64:
+ writeFloat(bob, abs(v.(float64)), li)
}
+
+ htmlesc(bob, suf)
return nil
}
func sprintfp(li LocaleInfo, bob *strings.Builder, v any) error {
- var bob2 strings.Builder
+ pre, suf, _ := strings.Cut(li.PercentFormat, "123")
+ htmlesc(bob, pre)
+
switch v.(type) {
case int:
- writeInt(&bob2, v.(int), li)
+ writeInt(bob, v.(int), li)
case float64:
- writeFloat(&bob2, v.(float64), li)
- default:
- return errors.New("TODO")
+ writeFloat(bob, v.(float64), li)
}
- bob.WriteString(fmt.Sprintf(li.PercentFormat, bob2.String()))
+
+ htmlesc(bob, suf)
return nil
}
@@ -375,9 +385,9 @@ func abs[T number](x T) T {
func btoi(b bool) int {
if b {
- return 0
+ return 1
}
- return 1
+ return 0
}
func htmlesc(bob *strings.Builder, s string) {
diff --git a/src/i18n/locales.gen.go b/src/i18n/locales.gen.go
index 1ab431f..65dc3ef 100644
--- a/src/i18n/locales.gen.go
+++ b/src/i18n/locales.gen.go
@@ -9,8 +9,7 @@ type LocaleInfo struct {
Eurozone, Enabled bool
DateFormat string
GroupSeparator, DecimalSeparator rune
- MonetaryPre [2]string
- MonetarySuf string
+ MonetaryFormats [2]string
PercentFormat string
}
@@ -21,10 +20,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Català", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "2/1/06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "de",
@@ -32,10 +30,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Deutsch", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "02.01.06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "el",
@@ -43,10 +40,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Ελληνικά", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "2/1/06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "en",
@@ -55,9 +51,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("English", "Language Name"),
GroupSeparator: ',',
DecimalSeparator: '.',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "02/01/2006",
- MonetaryPre: [2]string{"€", "-€"},
+ MonetaryFormats: [2]string{"€123", "-€123"},
},
{
Bcp: "es",
@@ -65,10 +61,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Español", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "2/1/06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "et",
@@ -76,10 +71,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Eesti", "Language Name"),
GroupSeparator: ' ',
DecimalSeparator: ',',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "02.01.06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "fi",
@@ -87,10 +81,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Suomi", "Language Name"),
GroupSeparator: ' ',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "2.1.2006",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "fr",
@@ -98,10 +91,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Français", "Language Name"),
GroupSeparator: ' ',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "02/01/2006",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "ga",
@@ -109,9 +101,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Gaeilge", "Language Name"),
GroupSeparator: ',',
DecimalSeparator: '.',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "02/01/2006",
- MonetaryPre: [2]string{"€", "-€"},
+ MonetaryFormats: [2]string{"€123", "-€123"},
},
{
Bcp: "hr",
@@ -119,10 +111,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Hrvatski", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "02. 01. 2006.",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "it",
@@ -130,10 +121,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Italiano", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "02/01/06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "lb",
@@ -141,10 +131,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Lëtzebuergesch", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "02.01.06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "lt",
@@ -152,10 +141,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Lietuvių", "Language Name"),
GroupSeparator: ' ',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "2006-01-02",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "lv",
@@ -163,10 +151,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Latviešu", "Language Name"),
GroupSeparator: ' ',
DecimalSeparator: ',',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "02.01.06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "mt",
@@ -174,9 +161,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Malti", "Language Name"),
GroupSeparator: ',',
DecimalSeparator: '.',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "02/01/2006",
- MonetaryPre: [2]string{"€", "-€"},
+ MonetaryFormats: [2]string{"€123", "-€123"},
},
{
Bcp: "nl",
@@ -185,9 +172,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Nederlands", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "02-01-2006",
- MonetaryPre: [2]string{"€ ", "€ -"},
+ MonetaryFormats: [2]string{"€ 123", "€ -123"},
},
{
Bcp: "pt",
@@ -195,10 +182,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Português", "Language Name"),
GroupSeparator: ' ',
DecimalSeparator: ',',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "02/01/06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "sk",
@@ -206,10 +192,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Slovenčina", "Language Name"),
GroupSeparator: ' ',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "2. 1. 2006",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "sl",
@@ -217,10 +202,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Slovenščina", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "2. 1. 06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "sv",
@@ -229,10 +213,9 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Svenska", "Language Name"),
GroupSeparator: ' ',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "2006-01-02",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "tr",
@@ -240,38 +223,35 @@ var locales = [...]LocaleInfo{
Name: gotext.GetC("Türkçe", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%%%s",
+ PercentFormat: "%123",
DateFormat: "2.01.2006",
- MonetaryPre: [2]string{"€", "-€"},
+ MonetaryFormats: [2]string{"€123", "-€123"},
},
{
Bcp: "bg",
Name: gotext.GetC("Български", "Language Name"),
GroupSeparator: ' ',
DecimalSeparator: ',',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "2.01.06 г.",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "ro",
Name: gotext.GetC("Română", "Language Name"),
GroupSeparator: '.',
DecimalSeparator: ',',
- PercentFormat: "%s %%",
+ PercentFormat: "123 %",
DateFormat: "02.01.2006",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
{
Bcp: "uk",
Name: gotext.GetC("Українська", "Language Name"),
GroupSeparator: ' ',
DecimalSeparator: ',',
- PercentFormat: "%s%%",
+ PercentFormat: "123%",
DateFormat: "02.01.06",
- MonetaryPre: [2]string{"", "-"},
- MonetarySuf: " €",
+ MonetaryFormats: [2]string{"123 €", "-123 €"},
},
}