diff options
author | Thomas Voss <mail@thomasvoss.com> | 2025-08-02 15:25:21 +0200 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2025-08-02 15:25:21 +0200 |
commit | bcbbbcbc40c956c1d8487f6eb48bf8a5325a6380 (patch) | |
tree | d934a85a618261c5c434cf75bf81f8a5eaa721c2 /src | |
parent | 1863809ecc34e6889ee7ec2ecac9d7f9540cbfab (diff) |
Simplify code further
Diffstat (limited to 'src')
-rwxr-xr-x | src/i18n/gen.py | 80 | ||||
-rw-r--r-- | src/i18n/i18n.go | 46 | ||||
-rw-r--r-- | src/i18n/locales.gen.go | 118 |
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 €"}, }, } |