aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app.go16
-rw-r--r--src/email/email.go14
-rw-r--r--src/http.go6
-rw-r--r--src/i18n/i18n.go19
-rw-r--r--src/templates.go6
-rw-r--r--src/templates/coins-designs-ad.html.tmpl10
-rw-r--r--src/templates/coins-designs-at.html.tmpl18
-rw-r--r--src/templates/coins-designs-be.html.tmpl8
-rw-r--r--src/templates/coins-designs-de.html.tmpl8
-rw-r--r--src/templates/coins-designs-ee.html.tmpl18
-rw-r--r--src/templates/coins-designs-hr.html.tmpl10
-rw-r--r--src/templates/coins-designs-nl.html.tmpl10
-rw-r--r--src/templates/language.html.tmpl5
13 files changed, 87 insertions, 61 deletions
diff --git a/src/app.go b/src/app.go
new file mode 100644
index 0000000..7b3d905
--- /dev/null
+++ b/src/app.go
@@ -0,0 +1,16 @@
+package app
+
+import (
+ "os"
+ "syscall"
+
+ "git.thomasvoss.com/euro-cash.eu/pkg/atexit"
+ . "git.thomasvoss.com/euro-cash.eu/pkg/try"
+)
+
+func Restart() {
+ path := Try2(os.Executable())
+ atexit.Exec()
+ Try(syscall.Exec(path, append([]string{path}, os.Args[1:]...),
+ os.Environ()))
+}
diff --git a/src/email/email.go b/src/email/email.go
index 33b30e0..a1f7f0b 100644
--- a/src/email/email.go
+++ b/src/email/email.go
@@ -6,6 +6,8 @@ import (
"crypto/tls"
"fmt"
"math/rand/v2"
+ "log"
+ "errors"
"net/smtp"
"strconv"
"time"
@@ -29,14 +31,20 @@ Message-ID: <%s>
%s`
-func ServerError(fault error) error {
+func Send(subject, body string) {
+ if err := send(subject, body); err != nil {
+ log.Print(err)
+ }
+}
+
+func send(subject, body string) error {
if Config.Disabled {
- return fault
+ return errors.New(body)
}
msgid := strconv.FormatInt(rand.Int64(), 10) + "@" + Config.Host
msg := fmt.Sprintf(emailTemplate, Config.FromAddr, Config.ToAddr,
- "Error Report", time.Now().Format(time.RFC1123Z), msgid, fault)
+ subject, time.Now().Format(time.RFC1123Z), msgid, body)
tlsConfig := &tls.Config{
InsecureSkipVerify: false,
diff --git a/src/http.go b/src/http.go
index b785bca..b0d5bcd 100644
--- a/src/http.go
+++ b/src/http.go
@@ -179,11 +179,7 @@ func setUserLanguage(w http.ResponseWriter, r *http.Request) {
func throwError(status int, err error, w http.ResponseWriter, r *http.Request) {
w.WriteHeader(status)
- go func() {
- if err := email.ServerError(err); err != nil {
- log.Println(err)
- }
- }()
+ go email.Send("Server Error", err.Error())
errorTmpl.Execute(w, struct {
Code int
Msg string
diff --git a/src/i18n/i18n.go b/src/i18n/i18n.go
index b996681..1258a27 100644
--- a/src/i18n/i18n.go
+++ b/src/i18n/i18n.go
@@ -72,7 +72,7 @@ var (
Name: "Ελληνικά",
DateFormat: "2/1/2006",
Eurozone: true,
- Enabled: true,
+ Enabled: false,
GroupSeparator: '.',
DecimalSeparator: ',',
MonetaryPre: [2]string{"", "-"},
@@ -212,7 +212,7 @@ var (
Name: "Nederlands",
DateFormat: "2-1-2006",
Eurozone: true,
- Enabled: true,
+ Enabled: false,
GroupSeparator: '.',
DecimalSeparator: ',',
MonetaryPre: [2]string{"€ ", "€ -"},
@@ -266,23 +266,13 @@ var (
Name: "Български",
DateFormat: "2.01.2006 г.",
Eurozone: false, /* TODO(2026): Set to true */
- Enabled: true,
+ Enabled: false,
GroupSeparator: ' ',
DecimalSeparator: ',',
MonetaryPre: [2]string{"", "-"},
MonetaryPost: " €",
},
{
- Bcp: "en-US",
- Name: "English (US)",
- DateFormat: "1/2/2006",
- Eurozone: false,
- Enabled: false,
- GroupSeparator: ',',
- DecimalSeparator: '.',
- MonetaryPre: [2]string{"€", "-€"},
- },
- {
Bcp: "ro",
Name: "Română",
DateFormat: "02.01.2006",
@@ -305,9 +295,6 @@ var (
MonetaryPost: " €",
},
}
- /* 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
)
diff --git a/src/templates.go b/src/templates.go
index 20fcf79..353c755 100644
--- a/src/templates.go
+++ b/src/templates.go
@@ -46,6 +46,12 @@ func BuildTemplates(dir fs.FS, debugp bool) {
buildAndSetTemplate(dir, name)
if debugp {
go watch.FileFS(dir, name, func() {
+ defer func() {
+ if p := recover(); p != nil {
+ log.Print(p)
+ }
+ }()
+
buildAndSetTemplate(dir, name)
log.Printf("Template ‘%s’ updated\n", name)
})
diff --git a/src/templates/coins-designs-ad.html.tmpl b/src/templates/coins-designs-ad.html.tmpl
index d63110c..97d590f 100644
--- a/src/templates/coins-designs-ad.html.tmpl
+++ b/src/templates/coins-designs-ad.html.tmpl
@@ -5,12 +5,12 @@
</header>
<main>
<div class="design-container">
- <img alt="{{ .Get `Andorran €0.01 coin` }}" src="/designs/ad-001.avif" />
- <img alt="{{ .Get `Andorran €0.50 coin` }}" src="/designs/ad-050.avif" />
+ <img alt="{{ .Get `Andorran €0.01 coin` }}" src="/designs/ad-001-1.avif" />
+ <img alt="{{ .Get `Andorran €0.50 coin` }}" src="/designs/ad-050-1.avif" />
</div>
<div class="design-container">
- <img alt="{{ .Get `Andorran €1 coin` }}" src="/designs/ad-100.avif" />
- <img alt="{{ .Get `Andorran €2 coin` }}" src="/designs/ad-200.avif" />
+ <img alt="{{ .Get `Andorran €1 coin` }}" src="/designs/ad-100-1.avif" />
+ <img alt="{{ .Get `Andorran €2 coin` }}" src="/designs/ad-200-1.avif" />
</div>
<p>
{{ .Get "On March of 2013 Andorra held a public design competition for all denominations except for the €2 denomination which the government pre-decided would bear the coat of arms of Andorra. Each set of denominations had a theme that participants had to center their designs around. These themes were:" }}
@@ -48,4 +48,4 @@
(map "LatinStart" `<span lang="la"><em>` "LatinEnd" "em,span") }}
</p>
</main>
-{{ end }} \ No newline at end of file
+{{ end }}
diff --git a/src/templates/coins-designs-at.html.tmpl b/src/templates/coins-designs-at.html.tmpl
index b439629..0393b6a 100644
--- a/src/templates/coins-designs-at.html.tmpl
+++ b/src/templates/coins-designs-at.html.tmpl
@@ -10,27 +10,27 @@
</p>
<div class="design-container">
- <img alt="{{ .Get `Austrian €0.01 coin` }}" src="/designs/at-001.avif">
- <img alt="{{ .Get `Austrian €0.02 coin` }}" src="/designs/at-002.avif">
- <img alt="{{ .Get `Austrian €0.05 coin` }}" src="/designs/at-005.avif">
+ <img alt="{{ .Get `Austrian €0.01 coin` }}" src="/designs/at-001-1.avif">
+ <img alt="{{ .Get `Austrian €0.02 coin` }}" src="/designs/at-002-1.avif">
+ <img alt="{{ .Get `Austrian €0.05 coin` }}" src="/designs/at-005-1.avif">
</div>
<p>
{{ .Get "The bronze coins feature the Alpine gentian, -edelweiss, and -primrose respectively, and were chosen to symbolize the role that Austria played in the development of EU environmental policy." }}
</p>
<div class="design-container">
- <img alt="{{ .Get `Austrian €0.10 coin` }}" src="/designs/at-010.avif">
- <img alt="{{ .Get `Austrian €0.20 coin` }}" src="/designs/at-020.avif">
- <img alt="{{ .Get `Austrian €0.50 coin` }}" src="/designs/at-050.avif">
+ <img alt="{{ .Get `Austrian €0.10 coin` }}" src="/designs/at-010-1.avif">
+ <img alt="{{ .Get `Austrian €0.20 coin` }}" src="/designs/at-020-1.avif">
+ <img alt="{{ .Get `Austrian €0.50 coin` }}" src="/designs/at-050-1.avif">
</div>
<p>
{{ .Get "The €0.10 coin features St. Stephen’s Cathedral. It symbolises the Viennese Gothic architectural style dating to around the year 1160. The €0.20 coin features Belvedere Palace. This is an example of Baroque architecture and symbolises the national freedom and sovereignty of Austria. The final gold coin — the €0.50 coin — features the Secession Building: an exhibition hall in the Art Nouveau style." }}
</p>
<div class="design-container">
- <img alt="{{ .Get `Austrian €1 coin` }}" src="/designs/at-100.avif">
- <img alt="{{ .Get `Austrian €2 coin` }}" src="/designs/at-200.avif">
+ <img alt="{{ .Get `Austrian €1 coin` }}" src="/designs/at-100-1.avif">
+ <img alt="{{ .Get `Austrian €2 coin` }}" src="/designs/at-200-1.avif">
</div>
<p>
{{ .Get "The two bimetallic coins feature the busts of the musical composer Wolfgang Amadeus Mozarts on the €1 coin, and the Austrian pacifist and Nobel Peace Prize winner Bertha von Suttner." }}
</p>
</main>
-{{ end }} \ No newline at end of file
+{{ end }}
diff --git a/src/templates/coins-designs-be.html.tmpl b/src/templates/coins-designs-be.html.tmpl
index b8fb0ef..54a2d9d 100644
--- a/src/templates/coins-designs-be.html.tmpl
+++ b/src/templates/coins-designs-be.html.tmpl
@@ -7,15 +7,15 @@
<div class="design-container">
<img
alt="{{ .Get `Belgian €1 coin (King Albert; Series 1)` }}"
- src="/designs/be-100-albert-1.avif"
+ src="/designs/be-100-1.avif"
>
<img
alt="{{ .Get `Belgian €1 coin (King Albert; Series 2)` }}"
- src="/designs/be-100-albert-2.avif"
+ src="/designs/be-100-2.avif"
>
<img
alt="{{ .Get `Belgian €1 coin (King Philippe)` }}"
- src="/designs/be-100-philippe.avif"
+ src="/designs/be-100-3.avif"
>
</div>
<p>
@@ -29,4 +29,4 @@
{{ .Get "After his accession to the throne, Belgium began a third series of coins in 2014 featuring the portrait of King Philippe. As is customary with coins bearing the portraits of monarchs, the direction in which the portrait faces was flipped to face right instead of left." }}
</p>
</main>
-{{ end }} \ No newline at end of file
+{{ end }}
diff --git a/src/templates/coins-designs-de.html.tmpl b/src/templates/coins-designs-de.html.tmpl
index 995752f..118477e 100644
--- a/src/templates/coins-designs-de.html.tmpl
+++ b/src/templates/coins-designs-de.html.tmpl
@@ -7,9 +7,9 @@
{{ $deargs := (map "GermanStart" `<span lang="de"><em>` "GermanEnd" "em,span") }}
<div class="design-container">
- <img alt="{{ .Get `German €0.01 coin` }}" src="/designs/de-001.avif">
- <img alt="{{ .Get `German €0.10 coin` }}" src="/designs/de-010.avif">
- <img alt="{{ .Get `German €1 coin` }}" src="/designs/de-100.avif">
+ <img alt="{{ .Get `German €0.01 coin` }}" src="/designs/de-001-1.avif">
+ <img alt="{{ .Get `German €0.10 coin` }}" src="/designs/de-010-1.avif">
+ <img alt="{{ .Get `German €1 coin` }}" src="/designs/de-100-1.avif">
</div>
<p>
{{ .Get "The German euro coins feature three different designs. A unique feature of German euro coins are the mint marks on each coin that denote in which city a given coin was minted. Germany has five active mints that produce Euro coins, which are denoted in the table below." }}
@@ -60,4 +60,4 @@
{{ .Get "The €2 coin also features an edge-inscription of Germany’s national motto and incipit of Germany’s national anthem. It reads ‘{GermanStart:r}EINIGKEIT UND RECHT UND FREIHEIT{GermanEnd:E}’ (English: ‘UNITY AND JUSTICE AND FREEDOM’)." $deargs }}
</p>
</main>
-{{ end }} \ No newline at end of file
+{{ end }}
diff --git a/src/templates/coins-designs-ee.html.tmpl b/src/templates/coins-designs-ee.html.tmpl
new file mode 100644
index 0000000..89c1d2f
--- /dev/null
+++ b/src/templates/coins-designs-ee.html.tmpl
@@ -0,0 +1,18 @@
+{{ define "content" }}
+<header>
+ {{ template "navbar" . }}
+ <h1>{{ .Get "Estonian Euro Coin Designs" }}</h1>
+</header>
+<main>
+ <p>
+ {{ .Get "The Estonian euro coins feature the same design across all eight denominations. The country’s outline is prominently displayed above the country’s name in Estonian (‘{EstonianStart:r}EESTI{EstonianEnd:E}’)."
+ (map "EstonianStart" `<span lang="et"><em>` "EstonianEnd" "em,span") }}
+ </p>
+ <div class="design-container">
+ <img
+ alt="{{ .Get `Estonian €1 coin` }}"
+ src="/designs/ee-100-1.avif"
+ >
+ </div>
+</main>
+{{ end }} \ No newline at end of file
diff --git a/src/templates/coins-designs-hr.html.tmpl b/src/templates/coins-designs-hr.html.tmpl
index 9f98a9b..01a391e 100644
--- a/src/templates/coins-designs-hr.html.tmpl
+++ b/src/templates/coins-designs-hr.html.tmpl
@@ -6,12 +6,12 @@
<main>
{{ $hrargs := (map "CroatianStart" `<span lang="hr"><em>` "CroatianEnd" "em,span") }}
<div class="design-container">
- <img alt="{{ .Get `Croatian €0.01 coin` }}" src="/designs/hr-001.avif" />
- <img alt="{{ .Get `Croatian €0.50 coin` }}" src="/designs/hr-050.avif" />
+ <img alt="{{ .Get `Croatian €0.01 coin` }}" src="/designs/hr-001-1.avif" />
+ <img alt="{{ .Get `Croatian €0.50 coin` }}" src="/designs/hr-050-1.avif" />
</div>
<div class="design-container">
- <img alt="{{ .Get `Croatian €1 coin` }}" src="/designs/hr-100.avif" />
- <img alt="{{ .Get `Croatian €2 coin` }}" src="/designs/hr-200.avif" />
+ <img alt="{{ .Get `Croatian €1 coin` }}" src="/designs/hr-100-1.avif" />
+ <img alt="{{ .Get `Croatian €2 coin` }}" src="/designs/hr-200-1.avif" />
</div>
<p>
{{ .Get "The Croatian euro coins feature four different themes, with each design featuring the Croatian checkerboard and the country’s name in Croatian (‘{CroatianStart:r}HRVATSKA{CroatianEnd:E}’). All designs were selected after voting in a public design competition."
@@ -35,4 +35,4 @@
$hrargs (map "Link" "https://www.wikipedia.org/wiki/Dubravka_(drama)") }}
</p>
</main>
-{{ end }} \ No newline at end of file
+{{ end }}
diff --git a/src/templates/coins-designs-nl.html.tmpl b/src/templates/coins-designs-nl.html.tmpl
index e98e77b..a801374 100644
--- a/src/templates/coins-designs-nl.html.tmpl
+++ b/src/templates/coins-designs-nl.html.tmpl
@@ -8,21 +8,21 @@
<div class="design-container">
<img
alt="Dutch €0.50 coin (Queen Beatrix)"
- src="/designs/nl-050-beatrix.avif"
+ src="/designs/nl-050-1.avif"
/>
<img
alt="Dutch €0.50 coin (King Willem-Alexander)"
- src="/designs/nl-050-willem-alexander.avif"
+ src="/designs/nl-050-2.avif"
/>
</div>
<div class="design-container">
<img
alt="Dutch €1 coin (Queen Beatrix)"
- src="/designs/nl-100-beatrix.avif"
+ src="/designs/nl-100-1.avif"
/>
<img
alt="Dutch €1 coin (King Willem-Alexander)"
- src="/designs/nl-100-willem-alexander.avif"
+ src="/designs/nl-100-2.avif"
/>
</div>
<p>
@@ -38,4 +38,4 @@
(map "Link" "/jargon#relief") }}
</p>
</main>
-{{ end }} \ No newline at end of file
+{{ end }}
diff --git a/src/templates/language.html.tmpl b/src/templates/language.html.tmpl
index f4b240a..13a8e85 100644
--- a/src/templates/language.html.tmpl
+++ b/src/templates/language.html.tmpl
@@ -7,11 +7,6 @@
<p>
{{ .Get "Select your preferred language to use on the site." }}
</p>
- <p>
- If you are an American user, it’s suggested that you select
- American English instead of British English. This will ensure that
- dates will be formatted with the month before the day.
- </p>
<hr />
<h2>{{ .Get "Eurozone Languages" }}</h2>
{{ template "langgrid" true }}