From 6370eee354c965a8b1843edac2c8f0a0a97f2207 Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@nibio.no>
Date: Wed, 3 Apr 2024 14:14:19 +0200
Subject: [PATCH] Make risk map page more failsaife [GRIDV-109]

---
 VIPSWeb/locale/bg/LC_MESSAGES/djangojs.po     | 167 ++++----
 VIPSWeb/locale/bs/LC_MESSAGES/djangojs.po     | 171 ++++-----
 VIPSWeb/locale/de/LC_MESSAGES/djangojs.po     | 167 ++++----
 VIPSWeb/locale/fi/LC_MESSAGES/djangojs.po     | 167 ++++----
 VIPSWeb/locale/nb/LC_MESSAGES/djangojs.mo     | Bin 3982 -> 4019 bytes
 VIPSWeb/locale/nb/LC_MESSAGES/djangojs.po     | 226 +++++------
 VIPSWeb/locale/vi/LC_MESSAGES/djangojs.po     | 167 ++++----
 .../locale/zh_Hans/LC_MESSAGES/djangojs.po    | 167 ++++----
 .../locale/bg/LC_MESSAGES/djangojs.po         |  42 +++
 .../locale/bs/LC_MESSAGES/djangojs.po         |  43 +++
 .../locale/de/LC_MESSAGES/djangojs.po         |  14 +-
 .../locale/fi/LC_MESSAGES/djangojs.po         |  42 +++
 .../locale/nb/LC_MESSAGES/djangojs.po         |  14 +-
 .../locale/vi/LC_MESSAGES/djangojs.po         |  42 +++
 .../locale/zh_Hans/LC_MESSAGES/djangojs.po    |  14 +-
 roughage/locale/bg/LC_MESSAGES/djangojs.po    |  34 ++
 roughage/locale/bs/LC_MESSAGES/djangojs.po    |  35 ++
 roughage/locale/de/LC_MESSAGES/djangojs.po    |  34 ++
 roughage/locale/fi/LC_MESSAGES/djangojs.po    |  34 ++
 roughage/locale/nb/LC_MESSAGES/djangojs.po    |  11 +-
 roughage/locale/vi/LC_MESSAGES/djangojs.po    |  34 ++
 .../locale/zh_Hans/LC_MESSAGES/djangojs.po    |  34 ++
 spatial/locale/bg/LC_MESSAGES/djangojs.po     |  24 +-
 spatial/locale/bs/LC_MESSAGES/djangojs.po     |  24 +-
 spatial/locale/de/LC_MESSAGES/djangojs.po     |  24 +-
 spatial/locale/fi/LC_MESSAGES/djangojs.po     |  24 +-
 spatial/locale/nb/LC_MESSAGES/djangojs.po     |  30 +-
 spatial/locale/vi/LC_MESSAGES/djangojs.po     |  24 +-
 .../locale/zh_Hans/LC_MESSAGES/djangojs.po    |  24 +-
 spatial/static/spatial/js/gridmap.js          | 356 ++++++++++--------
 spatial/templates/spatial/gridmap.html        |   4 +-
 31 files changed, 1305 insertions(+), 888 deletions(-)
 create mode 100644 observations/locale/bg/LC_MESSAGES/djangojs.po
 create mode 100644 observations/locale/bs/LC_MESSAGES/djangojs.po
 create mode 100644 observations/locale/fi/LC_MESSAGES/djangojs.po
 create mode 100644 observations/locale/vi/LC_MESSAGES/djangojs.po
 create mode 100644 roughage/locale/bg/LC_MESSAGES/djangojs.po
 create mode 100644 roughage/locale/bs/LC_MESSAGES/djangojs.po
 create mode 100644 roughage/locale/de/LC_MESSAGES/djangojs.po
 create mode 100644 roughage/locale/fi/LC_MESSAGES/djangojs.po
 create mode 100644 roughage/locale/vi/LC_MESSAGES/djangojs.po
 create mode 100644 roughage/locale/zh_Hans/LC_MESSAGES/djangojs.po

diff --git a/VIPSWeb/locale/bg/LC_MESSAGES/djangojs.po b/VIPSWeb/locale/bg/LC_MESSAGES/djangojs.po
index 3f29f29f..fb949885 100755
--- a/VIPSWeb/locale/bg/LC_MESSAGES/djangojs.po
+++ b/VIPSWeb/locale/bg/LC_MESSAGES/djangojs.po
@@ -19,7 +19,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-11-22 13:23+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: 2014-05-14 09:33+0200\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,332 +30,333 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Poedit 1.6.5\n"
 
-#: static/js/3rdparty/moment.min.js:6
+#: VIPSWeb/static/js/3rdparty/moment.min.js:6
 msgid "\n"
 msgstr ""
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Remove from my forecasts"
 msgstr ""
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Add to my forecasts"
 msgstr ""
 
-#: static/js/frontpage.js:484
+#: VIPSWeb/static/js/frontpage.js:489
 msgid "No forecast available"
 msgstr ""
 
-#: static/js/frontpage.js:486
+#: VIPSWeb/static/js/frontpage.js:491
 msgid "Missing data"
 msgstr ""
 
-#: static/js/frontpage.js:488
+#: VIPSWeb/static/js/frontpage.js:493
 msgid "No risk of infection"
 msgstr ""
 
-#: static/js/frontpage.js:490
+#: VIPSWeb/static/js/frontpage.js:495
 msgid "Medium risk of infection"
 msgstr ""
 
-#: static/js/frontpage.js:492
+#: VIPSWeb/static/js/frontpage.js:497
 msgid "High risk of infection"
 msgstr ""
 
-#: static/js/frontpage.js:494
+#: VIPSWeb/static/js/frontpage.js:499
 msgid "Invalid forecast status"
 msgstr ""
 
-#: static/js/frontpageMap.js:69
+#: VIPSWeb/static/js/frontpageMap.js:81
 msgid "Source hostname not defined."
 msgstr "Името на източника не е определно. "
 
-#: static/js/frontpageMap.js:280
+#: VIPSWeb/static/js/frontpageMap.js:292
 #, fuzzy
 #| msgid "No forecasts found for"
 msgid "No forecasts found for selected crops"
 msgstr "Не е открита прогноза за "
 
-#: static/js/frontpageMap.js:292
+#: VIPSWeb/static/js/frontpageMap.js:304
 msgid "External resources"
 msgstr ""
 
-#: static/js/frontpageMap.js:316
+#: VIPSWeb/static/js/frontpageMap.js:327
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: static/js/frontpageMap.js:331
+#: VIPSWeb/static/js/frontpageMap.js:342
 msgid "in"
 msgstr ""
 
-#: static/js/frontpageMap.js:566
+#: VIPSWeb/static/js/frontpageMap.js:590
 msgid "Days since observation"
 msgstr ""
 
-#: static/js/frontpageMap.js:569
+#: VIPSWeb/static/js/frontpageMap.js:593
 msgid "Days"
 msgstr ""
 
-#: static/js/frontpageMap.js:571
+#: VIPSWeb/static/js/frontpageMap.js:595
 msgid "Older"
 msgstr ""
 
-#: static/js/util.js:235 static/js/util.js:264
+#: VIPSWeb/static/js/util.js:241 VIPSWeb/static/js/util.js:270
+#: VIPSWeb/static/js/util.js:422
 msgid "Unnamed"
 msgstr ""
 
-#: static/js/validateForm.js:120
+#: VIPSWeb/static/js/validateForm.js:122
 #, javascript-format
 msgid "%s is not equal to %s"
 msgstr ""
 
-#: static/js/validateForm.js:132
+#: VIPSWeb/static/js/validateForm.js:134
 #, javascript-format
 msgid "%s is not after %s"
 msgstr ""
 
-#: static/js/validateForm.js:247 static/js/validateForm.js:265
-#: static/js/validateForm.js:288 static/js/validateForm.js:477
+#: VIPSWeb/static/js/validateForm.js:249 VIPSWeb/static/js/validateForm.js:267
+#: VIPSWeb/static/js/validateForm.js:290 VIPSWeb/static/js/validateForm.js:479
 msgid "Field is required"
 msgstr ""
 
-#: static/js/validateForm.js:309
+#: VIPSWeb/static/js/validateForm.js:311
 #, javascript-format
 msgid "Exceeds max length of %s"
 msgstr ""
 
-#: static/js/validateForm.js:325 static/js/validateForm.js:343
+#: VIPSWeb/static/js/validateForm.js:327 VIPSWeb/static/js/validateForm.js:345
 #, javascript-format
 msgid "Does not match format %s"
 msgstr ""
 
-#: static/js/validateForm.js:360 static/js/validateForm.js:421
+#: VIPSWeb/static/js/validateForm.js:362 VIPSWeb/static/js/validateForm.js:423
 msgid "Invalid format"
 msgstr ""
 
-#: static/js/validateForm.js:378
+#: VIPSWeb/static/js/validateForm.js:380
 msgid "Number required"
 msgstr ""
 
-#: static/js/validateForm.js:383
+#: VIPSWeb/static/js/validateForm.js:385
 #, javascript-format
 msgid "Lower than minimum (%s)"
 msgstr ""
 
-#: static/js/validateForm.js:388
+#: VIPSWeb/static/js/validateForm.js:390
 #, javascript-format
 msgid "Higher than maximum (%s)"
 msgstr ""
 
-#: static/js/validateForm.js:407
+#: VIPSWeb/static/js/validateForm.js:409
 msgid "Missing separator comma"
 msgstr ""
 
-#: static/js/validateForm.js:412
+#: VIPSWeb/static/js/validateForm.js:414
 msgid "Too many separator commas"
 msgstr ""
 
-#: static/js/weatherStationSelectorMap.js:113
+#: VIPSWeb/static/js/weatherStationSelectorMap.js:115
 msgid "Select station"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Sunday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Monday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Tuesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Wednesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Thursday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Friday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Saturday"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sun"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Mon"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Tue"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Wed"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Thu"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Fri"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sat"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Su"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Mo"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Tu"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "We"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Th"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Fr"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Sa"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "January"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "February"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "March"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "April"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:17 templates/settings.js:44
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:17
+#: VIPSWeb/templates/settings.js:48 VIPSWeb/templates/settings.js:49
 msgid "May"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "June"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "July"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "August"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "September"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "October"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "November"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "December"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jan"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Feb"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Mar"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Apr"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jun"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jul"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Aug"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Sep"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Oct"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Nov"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Dec"
 msgstr ""
 
-#: templates/settings.js:48
+#: VIPSWeb/templates/settings.js:52
 msgid "Print chart"
 msgstr ""
 
-#: templates/settings.js:49
+#: VIPSWeb/templates/settings.js:53
 msgid "Download PNG image"
 msgstr ""
 
-#: templates/settings.js:50
+#: VIPSWeb/templates/settings.js:54
 msgid "Download JPEG image"
 msgstr ""
 
-#: templates/settings.js:51
+#: VIPSWeb/templates/settings.js:55
 msgid "Download PDF document"
 msgstr ""
 
-#: templates/settings.js:52
+#: VIPSWeb/templates/settings.js:56
 msgid "Download SVG vector image"
 msgstr ""
 
-#: templates/settings.js:53
+#: VIPSWeb/templates/settings.js:57
 msgid "Chart context menu"
 msgstr ""
diff --git a/VIPSWeb/locale/bs/LC_MESSAGES/djangojs.po b/VIPSWeb/locale/bs/LC_MESSAGES/djangojs.po
index f05027dd..575106b4 100755
--- a/VIPSWeb/locale/bs/LC_MESSAGES/djangojs.po
+++ b/VIPSWeb/locale/bs/LC_MESSAGES/djangojs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-11-22 13:23+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: 2015-02-13 11:26+0100\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -15,338 +15,339 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Generator: Poedit 1.7.4\n"
 
-#: static/js/3rdparty/moment.min.js:6
+#: VIPSWeb/static/js/3rdparty/moment.min.js:6
 msgid "\n"
 msgstr ""
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Remove from my forecasts"
 msgstr ""
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Add to my forecasts"
 msgstr ""
 
-#: static/js/frontpage.js:484
+#: VIPSWeb/static/js/frontpage.js:489
 msgid "No forecast available"
 msgstr "Prognoza nije dostupna"
 
-#: static/js/frontpage.js:486
+#: VIPSWeb/static/js/frontpage.js:491
 msgid "Missing data"
 msgstr "Podaci nedostaju"
 
-#: static/js/frontpage.js:488
+#: VIPSWeb/static/js/frontpage.js:493
 msgid "No risk of infection"
 msgstr "Bez rizika infekcije"
 
-#: static/js/frontpage.js:490
+#: VIPSWeb/static/js/frontpage.js:495
 msgid "Medium risk of infection"
 msgstr "Srednji rizik infekcije"
 
-#: static/js/frontpage.js:492
+#: VIPSWeb/static/js/frontpage.js:497
 msgid "High risk of infection"
 msgstr "Visok rizik infekcije"
 
-#: static/js/frontpage.js:494
+#: VIPSWeb/static/js/frontpage.js:499
 msgid "Invalid forecast status"
 msgstr "Nepravilan status prognoze"
 
-#: static/js/frontpageMap.js:69
+#: VIPSWeb/static/js/frontpageMap.js:81
 msgid "Source hostname not defined."
 msgstr "Ime izvora nije definisano."
 
-#: static/js/frontpageMap.js:280
+#: VIPSWeb/static/js/frontpageMap.js:292
 #, fuzzy
 #| msgid "No forecasts found for"
 msgid "No forecasts found for selected crops"
 msgstr "Prognoze nisu pronađene za"
 
-#: static/js/frontpageMap.js:292
+#: VIPSWeb/static/js/frontpageMap.js:304
 msgid "External resources"
 msgstr ""
 
-#: static/js/frontpageMap.js:316
+#: VIPSWeb/static/js/frontpageMap.js:327
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: static/js/frontpageMap.js:331
+#: VIPSWeb/static/js/frontpageMap.js:342
 msgid "in"
 msgstr ""
 
-#: static/js/frontpageMap.js:566
+#: VIPSWeb/static/js/frontpageMap.js:590
 msgid "Days since observation"
 msgstr ""
 
-#: static/js/frontpageMap.js:569
+#: VIPSWeb/static/js/frontpageMap.js:593
 msgid "Days"
 msgstr ""
 
-#: static/js/frontpageMap.js:571
+#: VIPSWeb/static/js/frontpageMap.js:595
 msgid "Older"
 msgstr ""
 
-#: static/js/util.js:235 static/js/util.js:264
+#: VIPSWeb/static/js/util.js:241 VIPSWeb/static/js/util.js:270
+#: VIPSWeb/static/js/util.js:422
 msgid "Unnamed"
 msgstr "Neimenovan"
 
-#: static/js/validateForm.js:120
+#: VIPSWeb/static/js/validateForm.js:122
 #, javascript-format
 msgid "%s is not equal to %s"
 msgstr ""
 
-#: static/js/validateForm.js:132
+#: VIPSWeb/static/js/validateForm.js:134
 #, javascript-format
 msgid "%s is not after %s"
 msgstr ""
 
-#: static/js/validateForm.js:247 static/js/validateForm.js:265
-#: static/js/validateForm.js:288 static/js/validateForm.js:477
+#: VIPSWeb/static/js/validateForm.js:249 VIPSWeb/static/js/validateForm.js:267
+#: VIPSWeb/static/js/validateForm.js:290 VIPSWeb/static/js/validateForm.js:479
 msgid "Field is required"
 msgstr ""
 
-#: static/js/validateForm.js:309
+#: VIPSWeb/static/js/validateForm.js:311
 #, javascript-format
 msgid "Exceeds max length of %s"
 msgstr ""
 
-#: static/js/validateForm.js:325 static/js/validateForm.js:343
+#: VIPSWeb/static/js/validateForm.js:327 VIPSWeb/static/js/validateForm.js:345
 #, javascript-format
 msgid "Does not match format %s"
 msgstr ""
 
-#: static/js/validateForm.js:360 static/js/validateForm.js:421
+#: VIPSWeb/static/js/validateForm.js:362 VIPSWeb/static/js/validateForm.js:423
 #, fuzzy
 msgid "Invalid format"
 msgstr "Nepravilan status prognoze"
 
-#: static/js/validateForm.js:378
+#: VIPSWeb/static/js/validateForm.js:380
 msgid "Number required"
 msgstr ""
 
-#: static/js/validateForm.js:383
+#: VIPSWeb/static/js/validateForm.js:385
 #, javascript-format
 msgid "Lower than minimum (%s)"
 msgstr ""
 
-#: static/js/validateForm.js:388
+#: VIPSWeb/static/js/validateForm.js:390
 #, javascript-format
 msgid "Higher than maximum (%s)"
 msgstr ""
 
-#: static/js/validateForm.js:407
+#: VIPSWeb/static/js/validateForm.js:409
 #, fuzzy
 msgid "Missing separator comma"
 msgstr "Podaci nedostaju"
 
-#: static/js/validateForm.js:412
+#: VIPSWeb/static/js/validateForm.js:414
 msgid "Too many separator commas"
 msgstr ""
 
-#: static/js/weatherStationSelectorMap.js:113
+#: VIPSWeb/static/js/weatherStationSelectorMap.js:115
 msgid "Select station"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Sunday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Monday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Tuesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Wednesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Thursday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Friday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Saturday"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sun"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Mon"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Tue"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Wed"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Thu"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Fri"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sat"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Su"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Mo"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Tu"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "We"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Th"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Fr"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Sa"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "January"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "February"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "March"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "April"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:17 templates/settings.js:44
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:17
+#: VIPSWeb/templates/settings.js:48 VIPSWeb/templates/settings.js:49
 msgid "May"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "June"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "July"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "August"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "September"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "October"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "November"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "December"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jan"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Feb"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Mar"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Apr"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jun"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jul"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Aug"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Sep"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Oct"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Nov"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Dec"
 msgstr ""
 
-#: templates/settings.js:48
+#: VIPSWeb/templates/settings.js:52
 msgid "Print chart"
 msgstr ""
 
-#: templates/settings.js:49
+#: VIPSWeb/templates/settings.js:53
 msgid "Download PNG image"
 msgstr ""
 
-#: templates/settings.js:50
+#: VIPSWeb/templates/settings.js:54
 msgid "Download JPEG image"
 msgstr ""
 
-#: templates/settings.js:51
+#: VIPSWeb/templates/settings.js:55
 msgid "Download PDF document"
 msgstr ""
 
-#: templates/settings.js:52
+#: VIPSWeb/templates/settings.js:56
 msgid "Download SVG vector image"
 msgstr ""
 
-#: templates/settings.js:53
+#: VIPSWeb/templates/settings.js:57
 msgid "Chart context menu"
 msgstr ""
diff --git a/VIPSWeb/locale/de/LC_MESSAGES/djangojs.po b/VIPSWeb/locale/de/LC_MESSAGES/djangojs.po
index ec571c9c..1733c864 100755
--- a/VIPSWeb/locale/de/LC_MESSAGES/djangojs.po
+++ b/VIPSWeb/locale/de/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-11-22 13:23+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,330 +18,331 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: static/js/3rdparty/moment.min.js:6
+#: VIPSWeb/static/js/3rdparty/moment.min.js:6
 msgid "\n"
 msgstr ""
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Remove from my forecasts"
 msgstr ""
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Add to my forecasts"
 msgstr ""
 
-#: static/js/frontpage.js:484
+#: VIPSWeb/static/js/frontpage.js:489
 msgid "No forecast available"
 msgstr ""
 
-#: static/js/frontpage.js:486
+#: VIPSWeb/static/js/frontpage.js:491
 msgid "Missing data"
 msgstr ""
 
-#: static/js/frontpage.js:488
+#: VIPSWeb/static/js/frontpage.js:493
 msgid "No risk of infection"
 msgstr ""
 
-#: static/js/frontpage.js:490
+#: VIPSWeb/static/js/frontpage.js:495
 msgid "Medium risk of infection"
 msgstr ""
 
-#: static/js/frontpage.js:492
+#: VIPSWeb/static/js/frontpage.js:497
 msgid "High risk of infection"
 msgstr ""
 
-#: static/js/frontpage.js:494
+#: VIPSWeb/static/js/frontpage.js:499
 msgid "Invalid forecast status"
 msgstr ""
 
-#: static/js/frontpageMap.js:69
+#: VIPSWeb/static/js/frontpageMap.js:81
 msgid "Source hostname not defined."
 msgstr ""
 
-#: static/js/frontpageMap.js:280
+#: VIPSWeb/static/js/frontpageMap.js:292
 msgid "No forecasts found for selected crops"
 msgstr ""
 
-#: static/js/frontpageMap.js:292
+#: VIPSWeb/static/js/frontpageMap.js:304
 msgid "External resources"
 msgstr ""
 
-#: static/js/frontpageMap.js:316
+#: VIPSWeb/static/js/frontpageMap.js:327
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: static/js/frontpageMap.js:331
+#: VIPSWeb/static/js/frontpageMap.js:342
 msgid "in"
 msgstr ""
 
-#: static/js/frontpageMap.js:566
+#: VIPSWeb/static/js/frontpageMap.js:590
 msgid "Days since observation"
 msgstr ""
 
-#: static/js/frontpageMap.js:569
+#: VIPSWeb/static/js/frontpageMap.js:593
 msgid "Days"
 msgstr ""
 
-#: static/js/frontpageMap.js:571
+#: VIPSWeb/static/js/frontpageMap.js:595
 msgid "Older"
 msgstr ""
 
-#: static/js/util.js:235 static/js/util.js:264
+#: VIPSWeb/static/js/util.js:241 VIPSWeb/static/js/util.js:270
+#: VIPSWeb/static/js/util.js:422
 msgid "Unnamed"
 msgstr ""
 
-#: static/js/validateForm.js:120
+#: VIPSWeb/static/js/validateForm.js:122
 #, javascript-format
 msgid "%s is not equal to %s"
 msgstr ""
 
-#: static/js/validateForm.js:132
+#: VIPSWeb/static/js/validateForm.js:134
 #, javascript-format
 msgid "%s is not after %s"
 msgstr ""
 
-#: static/js/validateForm.js:247 static/js/validateForm.js:265
-#: static/js/validateForm.js:288 static/js/validateForm.js:477
+#: VIPSWeb/static/js/validateForm.js:249 VIPSWeb/static/js/validateForm.js:267
+#: VIPSWeb/static/js/validateForm.js:290 VIPSWeb/static/js/validateForm.js:479
 msgid "Field is required"
 msgstr ""
 
-#: static/js/validateForm.js:309
+#: VIPSWeb/static/js/validateForm.js:311
 #, javascript-format
 msgid "Exceeds max length of %s"
 msgstr ""
 
-#: static/js/validateForm.js:325 static/js/validateForm.js:343
+#: VIPSWeb/static/js/validateForm.js:327 VIPSWeb/static/js/validateForm.js:345
 #, javascript-format
 msgid "Does not match format %s"
 msgstr ""
 
-#: static/js/validateForm.js:360 static/js/validateForm.js:421
+#: VIPSWeb/static/js/validateForm.js:362 VIPSWeb/static/js/validateForm.js:423
 msgid "Invalid format"
 msgstr ""
 
-#: static/js/validateForm.js:378
+#: VIPSWeb/static/js/validateForm.js:380
 msgid "Number required"
 msgstr ""
 
-#: static/js/validateForm.js:383
+#: VIPSWeb/static/js/validateForm.js:385
 #, javascript-format
 msgid "Lower than minimum (%s)"
 msgstr ""
 
-#: static/js/validateForm.js:388
+#: VIPSWeb/static/js/validateForm.js:390
 #, javascript-format
 msgid "Higher than maximum (%s)"
 msgstr ""
 
-#: static/js/validateForm.js:407
+#: VIPSWeb/static/js/validateForm.js:409
 msgid "Missing separator comma"
 msgstr ""
 
-#: static/js/validateForm.js:412
+#: VIPSWeb/static/js/validateForm.js:414
 msgid "Too many separator commas"
 msgstr ""
 
-#: static/js/weatherStationSelectorMap.js:113
+#: VIPSWeb/static/js/weatherStationSelectorMap.js:115
 msgid "Select station"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Sunday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Monday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Tuesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Wednesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Thursday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Friday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Saturday"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sun"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Mon"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Tue"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Wed"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Thu"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Fri"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sat"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Su"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Mo"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Tu"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "We"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Th"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Fr"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Sa"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "January"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "February"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "March"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "April"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:17 templates/settings.js:44
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:17
+#: VIPSWeb/templates/settings.js:48 VIPSWeb/templates/settings.js:49
 msgid "May"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "June"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "July"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "August"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "September"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "October"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "November"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "December"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jan"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Feb"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Mar"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Apr"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jun"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jul"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Aug"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Sep"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Oct"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Nov"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Dec"
 msgstr ""
 
-#: templates/settings.js:48
+#: VIPSWeb/templates/settings.js:52
 msgid "Print chart"
 msgstr ""
 
-#: templates/settings.js:49
+#: VIPSWeb/templates/settings.js:53
 msgid "Download PNG image"
 msgstr ""
 
-#: templates/settings.js:50
+#: VIPSWeb/templates/settings.js:54
 msgid "Download JPEG image"
 msgstr ""
 
-#: templates/settings.js:51
+#: VIPSWeb/templates/settings.js:55
 msgid "Download PDF document"
 msgstr ""
 
-#: templates/settings.js:52
+#: VIPSWeb/templates/settings.js:56
 msgid "Download SVG vector image"
 msgstr ""
 
-#: templates/settings.js:53
+#: VIPSWeb/templates/settings.js:57
 msgid "Chart context menu"
 msgstr ""
diff --git a/VIPSWeb/locale/fi/LC_MESSAGES/djangojs.po b/VIPSWeb/locale/fi/LC_MESSAGES/djangojs.po
index ec571c9c..1733c864 100755
--- a/VIPSWeb/locale/fi/LC_MESSAGES/djangojs.po
+++ b/VIPSWeb/locale/fi/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-11-22 13:23+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,330 +18,331 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: static/js/3rdparty/moment.min.js:6
+#: VIPSWeb/static/js/3rdparty/moment.min.js:6
 msgid "\n"
 msgstr ""
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Remove from my forecasts"
 msgstr ""
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Add to my forecasts"
 msgstr ""
 
-#: static/js/frontpage.js:484
+#: VIPSWeb/static/js/frontpage.js:489
 msgid "No forecast available"
 msgstr ""
 
-#: static/js/frontpage.js:486
+#: VIPSWeb/static/js/frontpage.js:491
 msgid "Missing data"
 msgstr ""
 
-#: static/js/frontpage.js:488
+#: VIPSWeb/static/js/frontpage.js:493
 msgid "No risk of infection"
 msgstr ""
 
-#: static/js/frontpage.js:490
+#: VIPSWeb/static/js/frontpage.js:495
 msgid "Medium risk of infection"
 msgstr ""
 
-#: static/js/frontpage.js:492
+#: VIPSWeb/static/js/frontpage.js:497
 msgid "High risk of infection"
 msgstr ""
 
-#: static/js/frontpage.js:494
+#: VIPSWeb/static/js/frontpage.js:499
 msgid "Invalid forecast status"
 msgstr ""
 
-#: static/js/frontpageMap.js:69
+#: VIPSWeb/static/js/frontpageMap.js:81
 msgid "Source hostname not defined."
 msgstr ""
 
-#: static/js/frontpageMap.js:280
+#: VIPSWeb/static/js/frontpageMap.js:292
 msgid "No forecasts found for selected crops"
 msgstr ""
 
-#: static/js/frontpageMap.js:292
+#: VIPSWeb/static/js/frontpageMap.js:304
 msgid "External resources"
 msgstr ""
 
-#: static/js/frontpageMap.js:316
+#: VIPSWeb/static/js/frontpageMap.js:327
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: static/js/frontpageMap.js:331
+#: VIPSWeb/static/js/frontpageMap.js:342
 msgid "in"
 msgstr ""
 
-#: static/js/frontpageMap.js:566
+#: VIPSWeb/static/js/frontpageMap.js:590
 msgid "Days since observation"
 msgstr ""
 
-#: static/js/frontpageMap.js:569
+#: VIPSWeb/static/js/frontpageMap.js:593
 msgid "Days"
 msgstr ""
 
-#: static/js/frontpageMap.js:571
+#: VIPSWeb/static/js/frontpageMap.js:595
 msgid "Older"
 msgstr ""
 
-#: static/js/util.js:235 static/js/util.js:264
+#: VIPSWeb/static/js/util.js:241 VIPSWeb/static/js/util.js:270
+#: VIPSWeb/static/js/util.js:422
 msgid "Unnamed"
 msgstr ""
 
-#: static/js/validateForm.js:120
+#: VIPSWeb/static/js/validateForm.js:122
 #, javascript-format
 msgid "%s is not equal to %s"
 msgstr ""
 
-#: static/js/validateForm.js:132
+#: VIPSWeb/static/js/validateForm.js:134
 #, javascript-format
 msgid "%s is not after %s"
 msgstr ""
 
-#: static/js/validateForm.js:247 static/js/validateForm.js:265
-#: static/js/validateForm.js:288 static/js/validateForm.js:477
+#: VIPSWeb/static/js/validateForm.js:249 VIPSWeb/static/js/validateForm.js:267
+#: VIPSWeb/static/js/validateForm.js:290 VIPSWeb/static/js/validateForm.js:479
 msgid "Field is required"
 msgstr ""
 
-#: static/js/validateForm.js:309
+#: VIPSWeb/static/js/validateForm.js:311
 #, javascript-format
 msgid "Exceeds max length of %s"
 msgstr ""
 
-#: static/js/validateForm.js:325 static/js/validateForm.js:343
+#: VIPSWeb/static/js/validateForm.js:327 VIPSWeb/static/js/validateForm.js:345
 #, javascript-format
 msgid "Does not match format %s"
 msgstr ""
 
-#: static/js/validateForm.js:360 static/js/validateForm.js:421
+#: VIPSWeb/static/js/validateForm.js:362 VIPSWeb/static/js/validateForm.js:423
 msgid "Invalid format"
 msgstr ""
 
-#: static/js/validateForm.js:378
+#: VIPSWeb/static/js/validateForm.js:380
 msgid "Number required"
 msgstr ""
 
-#: static/js/validateForm.js:383
+#: VIPSWeb/static/js/validateForm.js:385
 #, javascript-format
 msgid "Lower than minimum (%s)"
 msgstr ""
 
-#: static/js/validateForm.js:388
+#: VIPSWeb/static/js/validateForm.js:390
 #, javascript-format
 msgid "Higher than maximum (%s)"
 msgstr ""
 
-#: static/js/validateForm.js:407
+#: VIPSWeb/static/js/validateForm.js:409
 msgid "Missing separator comma"
 msgstr ""
 
-#: static/js/validateForm.js:412
+#: VIPSWeb/static/js/validateForm.js:414
 msgid "Too many separator commas"
 msgstr ""
 
-#: static/js/weatherStationSelectorMap.js:113
+#: VIPSWeb/static/js/weatherStationSelectorMap.js:115
 msgid "Select station"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Sunday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Monday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Tuesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Wednesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Thursday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Friday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Saturday"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sun"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Mon"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Tue"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Wed"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Thu"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Fri"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sat"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Su"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Mo"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Tu"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "We"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Th"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Fr"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Sa"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "January"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "February"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "March"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "April"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:17 templates/settings.js:44
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:17
+#: VIPSWeb/templates/settings.js:48 VIPSWeb/templates/settings.js:49
 msgid "May"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "June"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "July"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "August"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "September"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "October"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "November"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "December"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jan"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Feb"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Mar"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Apr"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jun"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jul"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Aug"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Sep"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Oct"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Nov"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Dec"
 msgstr ""
 
-#: templates/settings.js:48
+#: VIPSWeb/templates/settings.js:52
 msgid "Print chart"
 msgstr ""
 
-#: templates/settings.js:49
+#: VIPSWeb/templates/settings.js:53
 msgid "Download PNG image"
 msgstr ""
 
-#: templates/settings.js:50
+#: VIPSWeb/templates/settings.js:54
 msgid "Download JPEG image"
 msgstr ""
 
-#: templates/settings.js:51
+#: VIPSWeb/templates/settings.js:55
 msgid "Download PDF document"
 msgstr ""
 
-#: templates/settings.js:52
+#: VIPSWeb/templates/settings.js:56
 msgid "Download SVG vector image"
 msgstr ""
 
-#: templates/settings.js:53
+#: VIPSWeb/templates/settings.js:57
 msgid "Chart context menu"
 msgstr ""
diff --git a/VIPSWeb/locale/nb/LC_MESSAGES/djangojs.mo b/VIPSWeb/locale/nb/LC_MESSAGES/djangojs.mo
index 13ac1a0f3b73cc266de576f282c86f96c3d34993..df5b1d01eee98b33dc79e12c3ab8693950de5721 100755
GIT binary patch
delta 1880
zcmeB^-z;B$Pl#nI0|Ns?AOiz~3<Cqh5+(+QTm}XP9afMi1H%J01_nk328M@h3=BdH
z3=EIi7#Ktu7#O~>F)#=-Ffj12GcYhSFfb^vGcbU(s6hEz><kQS3=9l<>=1pX><kPn
z3=9k&><kQI3=9mu5OwtoDeMdk91IK$8SD%U5)2Fsh3pW6yVxNX&4U`Sg`I&xl7WHY
zI8@z3sQ534K@7Yc5OV}M7#IW@7#O5D7#Ns99^rsEP@e<hAY%@Q1FSee_SG{m1adGi
zh%+!SWN|Ps@G&qjG(j~?<X~W6XJBBM3gyq`fcRh`l)nthUj@~_9x8sE0}>Laq5O+r
zix?QLaxgIPFfcH@gR1`xa$r3J1A{Op#D!v<5En{uLVT{s$-tn>z`$V6$-p4Oz`zg-
zRae9b@o5<+0|P$;14BJ01A_ts14BPlegh}O;afN%4%x%Wz`)JGz;K8Y<YNYgbDWTn
zdCtkeP!Ec`S5O1raY91iJJcXHE(Qip1_lN$E=bxC;eu#1<bpWZgbU(e3#hm~RNRRR
z;y^bpNR;_Q<ujr3Ib0A27H~1tgM+vNs-OX?pc!g$J5+ok7Xw2eBLl+}E=Xd0#tlg$
zFSsFb{f8S8VthOhhpF&De69iI>+wJwYQzI^m?c!+iKiYC_a0D%2~Y(oJP;q}@<1%;
z;$dJAU|?XF1EtqO>3uv53~~$%4Ci?usr(((97bM<4_SF3QOC;*2{|QRh(lDNv`#%Q
z#O21kkf8G9g~U-ZFC;2zcp*OOhHB`C@~81a65}i=e?FAIm>1%q6;Sa5Q1K&B{z<6$
zXL%usvHlq^#HXL3E)?K{SSZW~aj7^T1A{aJ1A`nN1A`6&1A`SGB>SX8)z$Gqg0zVb
z;(=~H1_nh228N|j`Qv<$kT}f;iIU5F3=F&s3=B6R=F~GhhbsKX2k{XTKSTpNKg5On
z{16Ap@Iw-#0zU(T5(5K+7F67qAEGZ1sxOQm64Y@}`9!FADnG=dxls8ouzWoOLoZap
zM5qNbp$Zm*6)-R?<A;RADt<`f+X$s)85kH$A%!Hk<O5|v5EoR6f=Wsd8&m*Effx)7
z3@QwekTYk1nCAl$2jzb|5Q71d(Cir)7@VMdP+?)q07-cA3=9nZ43Llj6{8>}phAm_
z0TS$v3=9k|AVE+O%fP^(!N9=a$-uzi&A`B5!@$7c1(nlfU|=v|fJ6aEs9qlwrwj}X
zh71f00U!}5wqRgjP-b9YFoW_zsT{-vr3DZT!rCB$fq}t@fq_8{RFE-160<8*9Fz_~
zOa}%A20sQ!VFoJVL4_Ge98`8OXfiM`I72HSP(1)jWT0Xgq`-}Vfx!|~S%5eU3=HlJ
zkTjqL<r_0VN<a`-9YiodN;(kJngNnd3>YBkNe?8*#h_ZOkXfvdmtUfgm{yWnwD|_x
zOJ+eM6I}xnT?1nULlY|l6Kw;d$(Oi%c)5HM^U_Nb(^IV!@{%Uoa<@rG=(?xor4}WY
i<QG{f1mvftWR@rx>zU{oaWQN@#GT5_s5e=iKOF!vhLFwx

delta 1826
zcmdli-zQ&xPl#nI0|Ns?00RSq3<Cqh93}>aY!I6jB+9^Wf{lSeh=GCOBpU;RC<6n-
z9X19AVFm_<Pizbf%nS?+Z0rmSAf;UF5WWCA0|Ofa1A_=VM4vP}0|N^K1A`tr1A`a?
z1A{SCofkU;0|x^`J%b-R1A_zu14B4F#NYyUh(#?>17@)^Fi0{mFsy~DI}R0p05#|{
z#2|+6><kQoAUAU`FfcJNFbHu#93;vCagZbj!~qH%5c|wI7#PGE>KPaUI2aiC7#J8b
zpc=|K7#P?Y7#OOd{ALb_589#p9w>hT*Z>BGsZjB?9FUOM2<2~wTC|&kfq{pCf#C{N
z{X?h&e}dH2GcYjxfx3`^6XJ7rP6h^51_lOMP6h@M1_lOaPKZw;IKe^25W~s9z|X+I
zkjlxxpuoVuPzsfw#tCuwEKZ0+7I88#a5FG4tl)(Bcnc>aWX?j>U*Ke5sOJE=j1v+9
zccBt*I2k~0VferaNfW=I8pXLF4w2%51gRVs#6VT3xCR%*fjV4}C^Lo1`$Oe}xF8M;
zgVJ$a4E5l+N`orM<bqh73)NW8#lYan$iPs=1xXu6xFK<TgBuc3uec!&0);Oq5wh?=
z_*^^?2lDYi93;vE2@yFSP@FR`s6f@(@YF*TIPgGx>d6DKAdQECL4bjQp#n;GLg`sN
z3=DD%3=FGzAgTKl)S$aO5T8BdfkfF$9!SXigF1wf7vdleUWmi_c_AUBTF(oK8+%?z
z6h!bse2@;+kPYP*@j?<|8I)fQ<%9H#GcYi;K*i@k#TP*NOQGhk<b@={L%a}=p67))
zu>K8H;d`ispLrP=q!}0(e(^Fe=rAxai19(PjWZv_VNraL5R2o3_#mB+fkBahfuRv9
zznBja63h7@LB5`kfq|ESfnh7uoWoFcxA?#ws%N+d)$o`P;=<QZ1wZ&8Y2gpl0ych#
z12p)-8X0u>Ar=|(LwsThmA8S4JMcq%>H(Ech013@<#YH!=GQYYlt2~KK@~LeL*lBH
zpMimqfq|h1O51@-MFs{2DNrE;#fA(F3@Qu^48Bml0Vumd*`QL>l!1Xk9m=<0U|_HT
zm4FNk41Q2CQ27I6GMF<kFla-0P7DkTmQXgRXm(^^VBlh4U@&5U1S=?N9H8=`EDU9W
z%L_dQ1_mz%NREMtgNkHO@eL}9LB%#m9F)N8L1nT(0|SE+10*4uFhJrJl**ME7#QS1
zDv_`o1Ef#^6|wFN3=E!7IadY-25$xi1{VfM76S=`N<Di9NFim#z`&r%z`&pnD%cnp
z7<?EQ7}OXTLcxhcivd#NffAA}0|SFD0|SEw11NqViP4&Yfx!%9A_F9QdO+ErQV>*h
zgSem~8$^Tf=0|KlnFS3^bPbJkjVu%lO|1;gwG9j>zv1$c_i^-d4|Q~RRj~2#amdNk
h%P&f|<MK(&OD|1KPqk8*?8@D?`8jtA^JE|XbO7<li5LI?

diff --git a/VIPSWeb/locale/nb/LC_MESSAGES/djangojs.po b/VIPSWeb/locale/nb/LC_MESSAGES/djangojs.po
index e699bcf5..d38b7b9e 100755
--- a/VIPSWeb/locale/nb/LC_MESSAGES/djangojs.po
+++ b/VIPSWeb/locale/nb/LC_MESSAGES/djangojs.po
@@ -1,8 +1,8 @@
 #    Copyright (C) 2014 NIBIO
-#    
+#
 #    This file is part of VIPSWeb
 #    VIPSWeb is free software: you can redistribute it and/or modify
-#    it under the terms of the NIBIO Open Source License as published by 
+#    it under the terms of the NIBIO Open Source License as published by
 #    NIBIO, either version 1 of the License, or (at your option) any
 #    later version.
 #
@@ -19,409 +19,367 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VIPSWeb\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-11-22 13:23+0100\n"
-"PO-Revision-Date: 2014-12-28 15:17+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: 2024-04-03 14:04+0200\n"
 "Last-Translator: Tor-Einar Skog <tor-einar.skog@nibio.no>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"Language-Team: \n"
+"Language: nb\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.4.2\n"
 
-#: static/js/3rdparty/moment.min.js:6
+#: VIPSWeb/static/js/3rdparty/moment.min.js:6
 msgid "\n"
-msgstr ""
+msgstr "\n"
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Remove from my forecasts"
 msgstr "Fjern fra mine varsler"
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Add to my forecasts"
 msgstr "Legg til mine varsler"
 
-#: static/js/frontpage.js:484
+#: VIPSWeb/static/js/frontpage.js:489
 msgid "No forecast available"
 msgstr "Ingen varsler tilgjengelige"
 
-#: static/js/frontpage.js:486
+#: VIPSWeb/static/js/frontpage.js:491
 msgid "Missing data"
 msgstr "Data mangler"
 
-#: static/js/frontpage.js:488
+#: VIPSWeb/static/js/frontpage.js:493
 msgid "No risk of infection"
 msgstr "Ingen infeksjonsrisiko"
 
-#: static/js/frontpage.js:490
+#: VIPSWeb/static/js/frontpage.js:495
 msgid "Medium risk of infection"
 msgstr "Middels infeksjonsrisiko"
 
-#: static/js/frontpage.js:492
+#: VIPSWeb/static/js/frontpage.js:497
 msgid "High risk of infection"
 msgstr "Høy infeksjonsrisiko"
 
-#: static/js/frontpage.js:494
+#: VIPSWeb/static/js/frontpage.js:499
 msgid "Invalid forecast status"
 msgstr "Ikke gyldig varselstatus"
 
-#: static/js/frontpageMap.js:69
+#: VIPSWeb/static/js/frontpageMap.js:81
 msgid "Source hostname not defined."
-msgstr "Kildens hostname er ikke definert"
+msgstr "Kildens hostname er ikke definert."
 
-#: static/js/frontpageMap.js:280
+#: VIPSWeb/static/js/frontpageMap.js:292
 msgid "No forecasts found for selected crops"
 msgstr "Ingen varsler funnet for valgt(e) kultur(er)"
 
-#: static/js/frontpageMap.js:292
+#: VIPSWeb/static/js/frontpageMap.js:304
 msgid "External resources"
 msgstr "Eksterne tjenester"
 
-#: static/js/frontpageMap.js:316
+#: VIPSWeb/static/js/frontpageMap.js:327
 msgid "Observation(s) found at location"
 msgstr "Observasjoner gjort på lokalitet"
 
-#: static/js/frontpageMap.js:331
+#: VIPSWeb/static/js/frontpageMap.js:342
 msgid "in"
 msgstr "i"
 
-#: static/js/frontpageMap.js:566
+#: VIPSWeb/static/js/frontpageMap.js:590
 msgid "Days since observation"
 msgstr "Dager siden observasjon"
 
-#: static/js/frontpageMap.js:569
+#: VIPSWeb/static/js/frontpageMap.js:593
 msgid "Days"
 msgstr "Dager"
 
-#: static/js/frontpageMap.js:571
+#: VIPSWeb/static/js/frontpageMap.js:595
 msgid "Older"
 msgstr "Eldre"
 
-#: static/js/util.js:235
-#: static/js/util.js:264
+#: VIPSWeb/static/js/util.js:241 VIPSWeb/static/js/util.js:270
+#: VIPSWeb/static/js/util.js:422
 msgid "Unnamed"
 msgstr "Uten navn"
 
-#: static/js/validateForm.js:120
+#: VIPSWeb/static/js/validateForm.js:122
 #, javascript-format
 msgid "%s is not equal to %s"
 msgstr "%s er ikke lik %s"
 
-#: static/js/validateForm.js:132
+#: VIPSWeb/static/js/validateForm.js:134
 #, javascript-format
 msgid "%s is not after %s"
 msgstr "%s er ikke etter %s"
 
-#: static/js/validateForm.js:247
-#: static/js/validateForm.js:265
-#: static/js/validateForm.js:288
-#: static/js/validateForm.js:477
+#: VIPSWeb/static/js/validateForm.js:249 VIPSWeb/static/js/validateForm.js:267
+#: VIPSWeb/static/js/validateForm.js:290 VIPSWeb/static/js/validateForm.js:479
 msgid "Field is required"
 msgstr "Feltet må fylles ut"
 
-#: static/js/validateForm.js:309
+#: VIPSWeb/static/js/validateForm.js:311
 #, javascript-format
 msgid "Exceeds max length of %s"
 msgstr "Overskrider maks lengde på %s"
 
-#: static/js/validateForm.js:325
-#: static/js/validateForm.js:343
+#: VIPSWeb/static/js/validateForm.js:327 VIPSWeb/static/js/validateForm.js:345
 #, javascript-format
 msgid "Does not match format %s"
 msgstr "Stemmer ikke med formatet %s"
 
-#: static/js/validateForm.js:360
-#: static/js/validateForm.js:421
+#: VIPSWeb/static/js/validateForm.js:362 VIPSWeb/static/js/validateForm.js:423
 msgid "Invalid format"
 msgstr "Ugyldig format"
 
-#: static/js/validateForm.js:378
+#: VIPSWeb/static/js/validateForm.js:380
 msgid "Number required"
 msgstr "Verdien må være et tall"
 
-#: static/js/validateForm.js:383
+#: VIPSWeb/static/js/validateForm.js:385
 #, javascript-format
 msgid "Lower than minimum (%s)"
 msgstr "Mindre enn minimum (%s)"
 
-#: static/js/validateForm.js:388
+#: VIPSWeb/static/js/validateForm.js:390
 #, javascript-format
 msgid "Higher than maximum (%s)"
 msgstr "Høyere enn maksimum (%s)"
 
-#: static/js/validateForm.js:407
+#: VIPSWeb/static/js/validateForm.js:409
 msgid "Missing separator comma"
 msgstr "Manglende skilletegn (komma)"
 
-#: static/js/validateForm.js:412
+#: VIPSWeb/static/js/validateForm.js:414
 msgid "Too many separator commas"
 msgstr "For mange skilletegn (komma)"
 
-#: static/js/weatherStationSelectorMap.js:113
+#: VIPSWeb/static/js/weatherStationSelectorMap.js:115
 msgid "Select station"
 msgstr "Velg stasjon"
 
-#: templates/settings.js:13
-#: templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Sunday"
 msgstr "Søndag"
 
-#: templates/settings.js:13
-#: templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Monday"
 msgstr "Mandag"
 
-#: templates/settings.js:13
-#: templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Tuesday"
 msgstr "Tirsdag"
 
-#: templates/settings.js:13
-#: templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Wednesday"
 msgstr "Onsdag"
 
-#: templates/settings.js:13
-#: templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Thursday"
 msgstr "Torsdag"
 
-#: templates/settings.js:13
-#: templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Friday"
 msgstr "Fredag"
 
-#: templates/settings.js:13
-#: templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Saturday"
 msgstr "Lørdag"
 
-#: templates/settings.js:14
-#: templates/settings.js:47
 # Abbreviation for Sunday
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sun"
 msgstr "Søn"
 
-#: templates/settings.js:14
-#: templates/settings.js:47
 # Abbreviation for Monday
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Mon"
 msgstr "Man"
 
-#: templates/settings.js:14
-#: templates/settings.js:47
 # Abbreviation for Tuesday
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Tue"
 msgstr "Tir"
 
-#: templates/settings.js:14
-#: templates/settings.js:47
 # Abbreviation for Wednesday
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Wed"
 msgstr "Ons"
 
-#: templates/settings.js:14
-#: templates/settings.js:47
 # Abbreviation for Thursday
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Thu"
 msgstr "Tor"
 
-#: templates/settings.js:14
-#: templates/settings.js:47
 # Abbreviation for Friday
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Fri"
 msgstr "Fredag"
 
-#: templates/settings.js:14
-#: templates/settings.js:47
 # Abbreviation for Saturday
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sat"
 msgstr "Lør"
 
-#: templates/settings.js:15
 # Abbreviation for Sunday
+#: VIPSWeb/templates/settings.js:15
 msgid "Su"
 msgstr "Sø"
 
-#: templates/settings.js:15
 # Abbreviation for Monday
+#: VIPSWeb/templates/settings.js:15
 msgid "Mo"
 msgstr "Ma"
 
-#: templates/settings.js:15
 # Abbreviation for Tuesday
+#: VIPSWeb/templates/settings.js:15
 msgid "Tu"
 msgstr "Ti"
 
-#: templates/settings.js:15
 # Abbreviatio for Wednesday
+#: VIPSWeb/templates/settings.js:15
 msgid "We"
 msgstr "On"
 
-#: templates/settings.js:15
 # Abbreviation for Thursday
+#: VIPSWeb/templates/settings.js:15
 msgid "Th"
 msgstr "To"
 
-#: templates/settings.js:15
 # Abbreviation for Friday
+#: VIPSWeb/templates/settings.js:15
 msgid "Fr"
 msgstr "Fr"
 
-#: templates/settings.js:15
 # Abbreviation for Saturday
+#: VIPSWeb/templates/settings.js:15
 msgid "Sa"
 msgstr "Lø"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "January"
 msgstr "Januar"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "February"
 msgstr "Februar"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "March"
 msgstr "Mars"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "April"
 msgstr "April"
 
-#: templates/settings.js:16
-#: templates/settings.js:17
-#: templates/settings.js:44
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:17
+#: VIPSWeb/templates/settings.js:48 VIPSWeb/templates/settings.js:49
 msgid "May"
 msgstr "Mai"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "June"
 msgstr "Juni"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "July"
 msgstr "Juli"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "August"
 msgstr "August"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "September"
 msgstr "September"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "October"
 msgstr "Oktober"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "November"
 msgstr "November"
 
-#: templates/settings.js:16
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "December"
 msgstr "Desember"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for January
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jan"
 msgstr "Jan"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for February
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Feb"
 msgstr "Feb"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for March
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Mar"
 msgstr "Mar"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for April
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Apr"
 msgstr "Apr"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for June
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jun"
 msgstr "Jun"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for July
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jul"
 msgstr "Jul"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for August
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Aug"
 msgstr "Aug"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for September
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Sep"
 msgstr "Sep"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for October
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Oct"
 msgstr "Okt"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for November
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Nov"
 msgstr "Nov"
 
-#: templates/settings.js:17
-#: templates/settings.js:44
 # Abbreviation for December
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Dec"
 msgstr "Des"
 
-#: templates/settings.js:48
+#: VIPSWeb/templates/settings.js:52
 msgid "Print chart"
 msgstr "Skriv ut graf"
 
-#: templates/settings.js:49
+#: VIPSWeb/templates/settings.js:53
 msgid "Download PNG image"
 msgstr "Last ned som PNG"
 
-#: templates/settings.js:50
+#: VIPSWeb/templates/settings.js:54
 msgid "Download JPEG image"
 msgstr "Last ned som JPEG"
 
-#: templates/settings.js:51
+#: VIPSWeb/templates/settings.js:55
 msgid "Download PDF document"
 msgstr "Last ned som PDF"
 
-#: templates/settings.js:52
+#: VIPSWeb/templates/settings.js:56
 msgid "Download SVG vector image"
 msgstr "Last ned som SVG"
 
-#: templates/settings.js:53
+#: VIPSWeb/templates/settings.js:57
 msgid "Chart context menu"
 msgstr "Grafmeny"
-
diff --git a/VIPSWeb/locale/vi/LC_MESSAGES/djangojs.po b/VIPSWeb/locale/vi/LC_MESSAGES/djangojs.po
index 7dd554aa..f625d86e 100755
--- a/VIPSWeb/locale/vi/LC_MESSAGES/djangojs.po
+++ b/VIPSWeb/locale/vi/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-11-22 13:23+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,336 +18,337 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: static/js/3rdparty/moment.min.js:6
+#: VIPSWeb/static/js/3rdparty/moment.min.js:6
 msgid "\n"
 msgstr ""
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 #, fuzzy
 #| msgid "Remove from my favourites"
 msgid "Remove from my forecasts"
 msgstr "Xóa khỏi mục ưa thích của tôi"
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 #, fuzzy
 #| msgid "Add to my favourites"
 msgid "Add to my forecasts"
 msgstr "Thêm vào mục yêu thích của tôi"
 
-#: static/js/frontpage.js:484
+#: VIPSWeb/static/js/frontpage.js:489
 msgid "No forecast available"
 msgstr "Không dự báo có sẵn"
 
-#: static/js/frontpage.js:486
+#: VIPSWeb/static/js/frontpage.js:491
 msgid "Missing data"
 msgstr "Dữ liệu bị mất"
 
-#: static/js/frontpage.js:488
+#: VIPSWeb/static/js/frontpage.js:493
 msgid "No risk of infection"
 msgstr "Không có nguy cơ lây nhiễm"
 
-#: static/js/frontpage.js:490
+#: VIPSWeb/static/js/frontpage.js:495
 msgid "Medium risk of infection"
 msgstr "Rủi ro trung bình của nhiễm trùng"
 
-#: static/js/frontpage.js:492
+#: VIPSWeb/static/js/frontpage.js:497
 msgid "High risk of infection"
 msgstr "Nguy cơ lây nhiễm cao"
 
-#: static/js/frontpage.js:494
+#: VIPSWeb/static/js/frontpage.js:499
 msgid "Invalid forecast status"
 msgstr "Tình trạng dự báo không hợp lệ"
 
-#: static/js/frontpageMap.js:69
+#: VIPSWeb/static/js/frontpageMap.js:81
 msgid "Source hostname not defined."
 msgstr "Nguồn hostname không được định nghĩa."
 
-#: static/js/frontpageMap.js:280
+#: VIPSWeb/static/js/frontpageMap.js:292
 #, fuzzy
 #| msgid "No forecast available"
 msgid "No forecasts found for selected crops"
 msgstr "Không dự báo có sẵn"
 
-#: static/js/frontpageMap.js:292
+#: VIPSWeb/static/js/frontpageMap.js:304
 msgid "External resources"
 msgstr ""
 
-#: static/js/frontpageMap.js:316
+#: VIPSWeb/static/js/frontpageMap.js:327
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: static/js/frontpageMap.js:331
+#: VIPSWeb/static/js/frontpageMap.js:342
 msgid "in"
 msgstr ""
 
-#: static/js/frontpageMap.js:566
+#: VIPSWeb/static/js/frontpageMap.js:590
 msgid "Days since observation"
 msgstr ""
 
-#: static/js/frontpageMap.js:569
+#: VIPSWeb/static/js/frontpageMap.js:593
 msgid "Days"
 msgstr ""
 
-#: static/js/frontpageMap.js:571
+#: VIPSWeb/static/js/frontpageMap.js:595
 msgid "Older"
 msgstr ""
 
-#: static/js/util.js:235 static/js/util.js:264
+#: VIPSWeb/static/js/util.js:241 VIPSWeb/static/js/util.js:270
+#: VIPSWeb/static/js/util.js:422
 msgid "Unnamed"
 msgstr "Vô danh"
 
-#: static/js/validateForm.js:120
+#: VIPSWeb/static/js/validateForm.js:122
 #, javascript-format
 msgid "%s is not equal to %s"
 msgstr "%s không bằng %s"
 
-#: static/js/validateForm.js:132
+#: VIPSWeb/static/js/validateForm.js:134
 #, javascript-format
 msgid "%s is not after %s"
 msgstr "%s không phải là sau khi %s"
 
-#: static/js/validateForm.js:247 static/js/validateForm.js:265
-#: static/js/validateForm.js:288 static/js/validateForm.js:477
+#: VIPSWeb/static/js/validateForm.js:249 VIPSWeb/static/js/validateForm.js:267
+#: VIPSWeb/static/js/validateForm.js:290 VIPSWeb/static/js/validateForm.js:479
 msgid "Field is required"
 msgstr "Lĩnh vực được yêu cầu"
 
-#: static/js/validateForm.js:309
+#: VIPSWeb/static/js/validateForm.js:311
 #, javascript-format
 msgid "Exceeds max length of %s"
 msgstr "Vượt quá chiều dài tối đa của %s"
 
-#: static/js/validateForm.js:325 static/js/validateForm.js:343
+#: VIPSWeb/static/js/validateForm.js:327 VIPSWeb/static/js/validateForm.js:345
 #, javascript-format
 msgid "Does not match format %s"
 msgstr "Không phù hợp với định dạng %s"
 
-#: static/js/validateForm.js:360 static/js/validateForm.js:421
+#: VIPSWeb/static/js/validateForm.js:362 VIPSWeb/static/js/validateForm.js:423
 msgid "Invalid format"
 msgstr "định dạng không hợp lệ"
 
-#: static/js/validateForm.js:378
+#: VIPSWeb/static/js/validateForm.js:380
 msgid "Number required"
 msgstr "cần số"
 
-#: static/js/validateForm.js:383
+#: VIPSWeb/static/js/validateForm.js:385
 #, javascript-format
 msgid "Lower than minimum (%s)"
 msgstr "Thấp hơn mức tối thiểu (%s)"
 
-#: static/js/validateForm.js:388
+#: VIPSWeb/static/js/validateForm.js:390
 #, javascript-format
 msgid "Higher than maximum (%s)"
 msgstr "Cao hơn tối đa (%s)"
 
-#: static/js/validateForm.js:407
+#: VIPSWeb/static/js/validateForm.js:409
 msgid "Missing separator comma"
 msgstr "Thiếu phân cách bằng dấu phẩy"
 
-#: static/js/validateForm.js:412
+#: VIPSWeb/static/js/validateForm.js:414
 msgid "Too many separator commas"
 msgstr "Quá nhiều dấu phẩy phân cách"
 
-#: static/js/weatherStationSelectorMap.js:113
+#: VIPSWeb/static/js/weatherStationSelectorMap.js:115
 msgid "Select station"
 msgstr "Chọn ga"
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Sunday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Monday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Tuesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Wednesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Thursday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Friday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Saturday"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sun"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Mon"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Tue"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Wed"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Thu"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Fri"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sat"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Su"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Mo"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Tu"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "We"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Th"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Fr"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Sa"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "January"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "February"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "March"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "April"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:17 templates/settings.js:44
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:17
+#: VIPSWeb/templates/settings.js:48 VIPSWeb/templates/settings.js:49
 msgid "May"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "June"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "July"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "August"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "September"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "October"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "November"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "December"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jan"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Feb"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Mar"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Apr"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jun"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jul"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Aug"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Sep"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Oct"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Nov"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Dec"
 msgstr ""
 
-#: templates/settings.js:48
+#: VIPSWeb/templates/settings.js:52
 msgid "Print chart"
 msgstr ""
 
-#: templates/settings.js:49
+#: VIPSWeb/templates/settings.js:53
 msgid "Download PNG image"
 msgstr ""
 
-#: templates/settings.js:50
+#: VIPSWeb/templates/settings.js:54
 msgid "Download JPEG image"
 msgstr ""
 
-#: templates/settings.js:51
+#: VIPSWeb/templates/settings.js:55
 msgid "Download PDF document"
 msgstr ""
 
-#: templates/settings.js:52
+#: VIPSWeb/templates/settings.js:56
 msgid "Download SVG vector image"
 msgstr ""
 
-#: templates/settings.js:53
+#: VIPSWeb/templates/settings.js:57
 msgid "Chart context menu"
 msgstr ""
diff --git a/VIPSWeb/locale/zh_Hans/LC_MESSAGES/djangojs.po b/VIPSWeb/locale/zh_Hans/LC_MESSAGES/djangojs.po
index 92d45c64..8527d370 100755
--- a/VIPSWeb/locale/zh_Hans/LC_MESSAGES/djangojs.po
+++ b/VIPSWeb/locale/zh_Hans/LC_MESSAGES/djangojs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-11-22 13:23+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: 2016-11-03 15:00+0100\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -18,330 +18,331 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Poedit 1.8.7\n"
 
-#: static/js/3rdparty/moment.min.js:6
+#: VIPSWeb/static/js/3rdparty/moment.min.js:6
 msgid "\n"
 msgstr ""
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Remove from my forecasts"
 msgstr "从我的预报中移除"
 
-#: static/js/frontpage.js:352
+#: VIPSWeb/static/js/frontpage.js:356
 msgid "Add to my forecasts"
 msgstr "添加到我的预报"
 
-#: static/js/frontpage.js:484
+#: VIPSWeb/static/js/frontpage.js:489
 msgid "No forecast available"
 msgstr "没有可获得的预报"
 
-#: static/js/frontpage.js:486
+#: VIPSWeb/static/js/frontpage.js:491
 msgid "Missing data"
 msgstr "数据缺失"
 
-#: static/js/frontpage.js:488
+#: VIPSWeb/static/js/frontpage.js:493
 msgid "No risk of infection"
 msgstr "没有感染的风险"
 
-#: static/js/frontpage.js:490
+#: VIPSWeb/static/js/frontpage.js:495
 msgid "Medium risk of infection"
 msgstr "中度感染风险"
 
-#: static/js/frontpage.js:492
+#: VIPSWeb/static/js/frontpage.js:497
 msgid "High risk of infection"
 msgstr "高度感染风险"
 
-#: static/js/frontpage.js:494
+#: VIPSWeb/static/js/frontpage.js:499
 msgid "Invalid forecast status"
 msgstr "无效的预报状态"
 
-#: static/js/frontpageMap.js:69
+#: VIPSWeb/static/js/frontpageMap.js:81
 msgid "Source hostname not defined."
 msgstr "主机名来源未确定"
 
-#: static/js/frontpageMap.js:280
+#: VIPSWeb/static/js/frontpageMap.js:292
 msgid "No forecasts found for selected crops"
 msgstr "未发现所选作物的预报"
 
-#: static/js/frontpageMap.js:292
+#: VIPSWeb/static/js/frontpageMap.js:304
 msgid "External resources"
 msgstr "外部资源"
 
-#: static/js/frontpageMap.js:316
+#: VIPSWeb/static/js/frontpageMap.js:327
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: static/js/frontpageMap.js:331
+#: VIPSWeb/static/js/frontpageMap.js:342
 msgid "in"
 msgstr ""
 
-#: static/js/frontpageMap.js:566
+#: VIPSWeb/static/js/frontpageMap.js:590
 msgid "Days since observation"
 msgstr ""
 
-#: static/js/frontpageMap.js:569
+#: VIPSWeb/static/js/frontpageMap.js:593
 msgid "Days"
 msgstr ""
 
-#: static/js/frontpageMap.js:571
+#: VIPSWeb/static/js/frontpageMap.js:595
 msgid "Older"
 msgstr ""
 
-#: static/js/util.js:235 static/js/util.js:264
+#: VIPSWeb/static/js/util.js:241 VIPSWeb/static/js/util.js:270
+#: VIPSWeb/static/js/util.js:422
 msgid "Unnamed"
 msgstr "未命名的"
 
-#: static/js/validateForm.js:120
+#: VIPSWeb/static/js/validateForm.js:122
 #, javascript-format
 msgid "%s is not equal to %s"
 msgstr "%s 不等于 %s"
 
-#: static/js/validateForm.js:132
+#: VIPSWeb/static/js/validateForm.js:134
 #, javascript-format
 msgid "%s is not after %s"
 msgstr "%s 不在 %s 之后"
 
-#: static/js/validateForm.js:247 static/js/validateForm.js:265
-#: static/js/validateForm.js:288 static/js/validateForm.js:477
+#: VIPSWeb/static/js/validateForm.js:249 VIPSWeb/static/js/validateForm.js:267
+#: VIPSWeb/static/js/validateForm.js:290 VIPSWeb/static/js/validateForm.js:479
 msgid "Field is required"
 msgstr "需要的域"
 
-#: static/js/validateForm.js:309
+#: VIPSWeb/static/js/validateForm.js:311
 #, javascript-format
 msgid "Exceeds max length of %s"
 msgstr "超过最大长度的 %s"
 
-#: static/js/validateForm.js:325 static/js/validateForm.js:343
+#: VIPSWeb/static/js/validateForm.js:327 VIPSWeb/static/js/validateForm.js:345
 #, javascript-format
 msgid "Does not match format %s"
 msgstr "不符合格式 %s"
 
-#: static/js/validateForm.js:360 static/js/validateForm.js:421
+#: VIPSWeb/static/js/validateForm.js:362 VIPSWeb/static/js/validateForm.js:423
 msgid "Invalid format"
 msgstr "无效格式"
 
-#: static/js/validateForm.js:378
+#: VIPSWeb/static/js/validateForm.js:380
 msgid "Number required"
 msgstr "需要的数字"
 
-#: static/js/validateForm.js:383
+#: VIPSWeb/static/js/validateForm.js:385
 #, javascript-format
 msgid "Lower than minimum (%s)"
 msgstr "低于最小值  (%s)"
 
-#: static/js/validateForm.js:388
+#: VIPSWeb/static/js/validateForm.js:390
 #, javascript-format
 msgid "Higher than maximum (%s)"
 msgstr "高于最大值 (%s)"
 
-#: static/js/validateForm.js:407
+#: VIPSWeb/static/js/validateForm.js:409
 msgid "Missing separator comma"
 msgstr "缺少分割逗号"
 
-#: static/js/validateForm.js:412
+#: VIPSWeb/static/js/validateForm.js:414
 msgid "Too many separator commas"
 msgstr "太多分割逗号"
 
-#: static/js/weatherStationSelectorMap.js:113
+#: VIPSWeb/static/js/weatherStationSelectorMap.js:115
 msgid "Select station"
 msgstr "选择站点"
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Sunday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Monday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Tuesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Wednesday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Thursday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Friday"
 msgstr ""
 
-#: templates/settings.js:13 templates/settings.js:46
+#: VIPSWeb/templates/settings.js:13 VIPSWeb/templates/settings.js:50
 msgid "Saturday"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sun"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Mon"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Tue"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Wed"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Thu"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Fri"
 msgstr ""
 
-#: templates/settings.js:14 templates/settings.js:47
+#: VIPSWeb/templates/settings.js:14 VIPSWeb/templates/settings.js:51
 msgid "Sat"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Su"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Mo"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Tu"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "We"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Th"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Fr"
 msgstr ""
 
-#: templates/settings.js:15
+#: VIPSWeb/templates/settings.js:15
 msgid "Sa"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "January"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "February"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "March"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "April"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:17 templates/settings.js:44
-#: templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:17
+#: VIPSWeb/templates/settings.js:48 VIPSWeb/templates/settings.js:49
 msgid "May"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "June"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "July"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "August"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "September"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "October"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "November"
 msgstr ""
 
-#: templates/settings.js:16 templates/settings.js:45
+#: VIPSWeb/templates/settings.js:16 VIPSWeb/templates/settings.js:49
 msgid "December"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jan"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Feb"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Mar"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Apr"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jun"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Jul"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Aug"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Sep"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Oct"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Nov"
 msgstr ""
 
-#: templates/settings.js:17 templates/settings.js:44
+#: VIPSWeb/templates/settings.js:17 VIPSWeb/templates/settings.js:48
 msgid "Dec"
 msgstr ""
 
-#: templates/settings.js:48
+#: VIPSWeb/templates/settings.js:52
 msgid "Print chart"
 msgstr ""
 
-#: templates/settings.js:49
+#: VIPSWeb/templates/settings.js:53
 msgid "Download PNG image"
 msgstr ""
 
-#: templates/settings.js:50
+#: VIPSWeb/templates/settings.js:54
 msgid "Download JPEG image"
 msgstr ""
 
-#: templates/settings.js:51
+#: VIPSWeb/templates/settings.js:55
 msgid "Download PDF document"
 msgstr ""
 
-#: templates/settings.js:52
+#: VIPSWeb/templates/settings.js:56
 msgid "Download SVG vector image"
 msgstr ""
 
-#: templates/settings.js:53
+#: VIPSWeb/templates/settings.js:57
 msgid "Chart context menu"
 msgstr ""
diff --git a/observations/locale/bg/LC_MESSAGES/djangojs.po b/observations/locale/bg/LC_MESSAGES/djangojs.po
new file mode 100644
index 00000000..a9ed1e02
--- /dev/null
+++ b/observations/locale/bg/LC_MESSAGES/djangojs.po
@@ -0,0 +1,42 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: observations/static/observations/js/observationList.js:185
+msgid "Observation(s) found at location"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:203
+msgid "in"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:360
+msgid "Details"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:630
+msgid "Days since observation"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:633
+msgid "Days"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:635
+msgid "Older"
+msgstr ""
diff --git a/observations/locale/bs/LC_MESSAGES/djangojs.po b/observations/locale/bs/LC_MESSAGES/djangojs.po
new file mode 100644
index 00000000..d48ba98a
--- /dev/null
+++ b/observations/locale/bs/LC_MESSAGES/djangojs.po
@@ -0,0 +1,43 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+#: observations/static/observations/js/observationList.js:185
+msgid "Observation(s) found at location"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:203
+msgid "in"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:360
+msgid "Details"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:630
+msgid "Days since observation"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:633
+msgid "Days"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:635
+msgid "Older"
+msgstr ""
diff --git a/observations/locale/de/LC_MESSAGES/djangojs.po b/observations/locale/de/LC_MESSAGES/djangojs.po
index 13121d79..7618b366 100644
--- a/observations/locale/de/LC_MESSAGES/djangojs.po
+++ b/observations/locale/de/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-12-10 15:03+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,26 +18,26 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: static/observations/js/observationList.js:165
+#: observations/static/observations/js/observationList.js:185
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: static/observations/js/observationList.js:183
+#: observations/static/observations/js/observationList.js:203
 msgid "in"
 msgstr ""
 
-#: static/observations/js/observationList.js:274
+#: observations/static/observations/js/observationList.js:360
 msgid "Details"
 msgstr ""
 
-#: static/observations/js/observationList.js:505
+#: observations/static/observations/js/observationList.js:630
 msgid "Days since observation"
 msgstr ""
 
-#: static/observations/js/observationList.js:508
+#: observations/static/observations/js/observationList.js:633
 msgid "Days"
 msgstr ""
 
-#: static/observations/js/observationList.js:510
+#: observations/static/observations/js/observationList.js:635
 msgid "Older"
 msgstr ""
diff --git a/observations/locale/fi/LC_MESSAGES/djangojs.po b/observations/locale/fi/LC_MESSAGES/djangojs.po
new file mode 100644
index 00000000..a9ed1e02
--- /dev/null
+++ b/observations/locale/fi/LC_MESSAGES/djangojs.po
@@ -0,0 +1,42 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: observations/static/observations/js/observationList.js:185
+msgid "Observation(s) found at location"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:203
+msgid "in"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:360
+msgid "Details"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:630
+msgid "Days since observation"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:633
+msgid "Days"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:635
+msgid "Older"
+msgstr ""
diff --git a/observations/locale/nb/LC_MESSAGES/djangojs.po b/observations/locale/nb/LC_MESSAGES/djangojs.po
index 2b1aeefb..e332890f 100644
--- a/observations/locale/nb/LC_MESSAGES/djangojs.po
+++ b/observations/locale/nb/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-12-10 15:03+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,26 +18,26 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: static/observations/js/observationList.js:165
+#: observations/static/observations/js/observationList.js:185
 msgid "Observation(s) found at location"
 msgstr "Observasjon(er) funnet på lokalitet"
 
-#: static/observations/js/observationList.js:183
+#: observations/static/observations/js/observationList.js:203
 msgid "in"
 msgstr "i"
 
-#: static/observations/js/observationList.js:274
+#: observations/static/observations/js/observationList.js:360
 msgid "Details"
 msgstr "Detaljer"
 
-#: static/observations/js/observationList.js:505
+#: observations/static/observations/js/observationList.js:630
 msgid "Days since observation"
 msgstr "Dager siden observasjon"
 
-#: static/observations/js/observationList.js:508
+#: observations/static/observations/js/observationList.js:633
 msgid "Days"
 msgstr "Dager"
 
-#: static/observations/js/observationList.js:510
+#: observations/static/observations/js/observationList.js:635
 msgid "Older"
 msgstr "Eldre"
diff --git a/observations/locale/vi/LC_MESSAGES/djangojs.po b/observations/locale/vi/LC_MESSAGES/djangojs.po
new file mode 100644
index 00000000..48aabc02
--- /dev/null
+++ b/observations/locale/vi/LC_MESSAGES/djangojs.po
@@ -0,0 +1,42 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+#: observations/static/observations/js/observationList.js:185
+msgid "Observation(s) found at location"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:203
+msgid "in"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:360
+msgid "Details"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:630
+msgid "Days since observation"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:633
+msgid "Days"
+msgstr ""
+
+#: observations/static/observations/js/observationList.js:635
+msgid "Older"
+msgstr ""
diff --git a/observations/locale/zh_Hans/LC_MESSAGES/djangojs.po b/observations/locale/zh_Hans/LC_MESSAGES/djangojs.po
index 39c5bf83..a98c5d57 100644
--- a/observations/locale/zh_Hans/LC_MESSAGES/djangojs.po
+++ b/observations/locale/zh_Hans/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-12-10 15:03+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,26 +18,26 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: static/observations/js/observationList.js:165
+#: observations/static/observations/js/observationList.js:185
 msgid "Observation(s) found at location"
 msgstr ""
 
-#: static/observations/js/observationList.js:183
+#: observations/static/observations/js/observationList.js:203
 msgid "in"
 msgstr ""
 
-#: static/observations/js/observationList.js:274
+#: observations/static/observations/js/observationList.js:360
 msgid "Details"
 msgstr ""
 
-#: static/observations/js/observationList.js:505
+#: observations/static/observations/js/observationList.js:630
 msgid "Days since observation"
 msgstr ""
 
-#: static/observations/js/observationList.js:508
+#: observations/static/observations/js/observationList.js:633
 msgid "Days"
 msgstr ""
 
-#: static/observations/js/observationList.js:510
+#: observations/static/observations/js/observationList.js:635
 msgid "Older"
 msgstr ""
diff --git a/roughage/locale/bg/LC_MESSAGES/djangojs.po b/roughage/locale/bg/LC_MESSAGES/djangojs.po
new file mode 100644
index 00000000..8a645b64
--- /dev/null
+++ b/roughage/locale/bg/LC_MESSAGES/djangojs.po
@@ -0,0 +1,34 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: roughage/static/roughage/js/nutrition.js:236
+msgid "Select weather station"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:265
+msgid "Don't use normaldata"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:311
+msgid "Watering amount"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:349
+msgid "Date"
+msgstr ""
diff --git a/roughage/locale/bs/LC_MESSAGES/djangojs.po b/roughage/locale/bs/LC_MESSAGES/djangojs.po
new file mode 100644
index 00000000..a74214f8
--- /dev/null
+++ b/roughage/locale/bs/LC_MESSAGES/djangojs.po
@@ -0,0 +1,35 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+#: roughage/static/roughage/js/nutrition.js:236
+msgid "Select weather station"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:265
+msgid "Don't use normaldata"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:311
+msgid "Watering amount"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:349
+msgid "Date"
+msgstr ""
diff --git a/roughage/locale/de/LC_MESSAGES/djangojs.po b/roughage/locale/de/LC_MESSAGES/djangojs.po
new file mode 100644
index 00000000..8a645b64
--- /dev/null
+++ b/roughage/locale/de/LC_MESSAGES/djangojs.po
@@ -0,0 +1,34 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: roughage/static/roughage/js/nutrition.js:236
+msgid "Select weather station"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:265
+msgid "Don't use normaldata"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:311
+msgid "Watering amount"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:349
+msgid "Date"
+msgstr ""
diff --git a/roughage/locale/fi/LC_MESSAGES/djangojs.po b/roughage/locale/fi/LC_MESSAGES/djangojs.po
new file mode 100644
index 00000000..8a645b64
--- /dev/null
+++ b/roughage/locale/fi/LC_MESSAGES/djangojs.po
@@ -0,0 +1,34 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+#: roughage/static/roughage/js/nutrition.js:236
+msgid "Select weather station"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:265
+msgid "Don't use normaldata"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:311
+msgid "Watering amount"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:349
+msgid "Date"
+msgstr ""
diff --git a/roughage/locale/nb/LC_MESSAGES/djangojs.po b/roughage/locale/nb/LC_MESSAGES/djangojs.po
index 262f5eb9..1738c1ac 100755
--- a/roughage/locale/nb/LC_MESSAGES/djangojs.po
+++ b/roughage/locale/nb/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-06 10:02+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,19 +18,18 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: static/roughage/js/nutrition.js:196
+#: roughage/static/roughage/js/nutrition.js:236
 msgid "Select weather station"
 msgstr "Velg målestasjon"
 
-#: static/roughage/js/nutrition.js:222
+#: roughage/static/roughage/js/nutrition.js:265
 msgid "Don't use normaldata"
 msgstr "Ikke bruk normaldata"
 
-#: static/roughage/js/nutrition.js:265
+#: roughage/static/roughage/js/nutrition.js:311
 msgid "Watering amount"
 msgstr "Vanningsmengde"
 
-#: static/roughage/js/nutrition.js:290
+#: roughage/static/roughage/js/nutrition.js:349
 msgid "Date"
 msgstr "Dato"
-
diff --git a/roughage/locale/vi/LC_MESSAGES/djangojs.po b/roughage/locale/vi/LC_MESSAGES/djangojs.po
new file mode 100644
index 00000000..71d89b07
--- /dev/null
+++ b/roughage/locale/vi/LC_MESSAGES/djangojs.po
@@ -0,0 +1,34 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+#: roughage/static/roughage/js/nutrition.js:236
+msgid "Select weather station"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:265
+msgid "Don't use normaldata"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:311
+msgid "Watering amount"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:349
+msgid "Date"
+msgstr ""
diff --git a/roughage/locale/zh_Hans/LC_MESSAGES/djangojs.po b/roughage/locale/zh_Hans/LC_MESSAGES/djangojs.po
new file mode 100644
index 00000000..71d89b07
--- /dev/null
+++ b/roughage/locale/zh_Hans/LC_MESSAGES/djangojs.po
@@ -0,0 +1,34 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+#: roughage/static/roughage/js/nutrition.js:236
+msgid "Select weather station"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:265
+msgid "Don't use normaldata"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:311
+msgid "Watering amount"
+msgstr ""
+
+#: roughage/static/roughage/js/nutrition.js:349
+msgid "Date"
+msgstr ""
diff --git a/spatial/locale/bg/LC_MESSAGES/djangojs.po b/spatial/locale/bg/LC_MESSAGES/djangojs.po
index 434167e5..cd6204ac 100644
--- a/spatial/locale/bg/LC_MESSAGES/djangojs.po
+++ b/spatial/locale/bg/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-12-21 10:13+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,34 +18,40 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: static/spatial/js/gridmap.js:37
+#: spatial/static/spatial/js/gridmap.js:37
 msgid "WARNING_STATUS"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:446
+#: spatial/static/spatial/js/gridmap.js:426
+msgid ""
+"The risk map contains no data. Could we be out of season? Please read the "
+"model description."
+msgstr ""
+
+#: spatial/static/spatial/js/gridmap.js:515
 msgid "Map location"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:466
+#: spatial/static/spatial/js/gridmap.js:535
 msgid "Could not determine warning status"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:470
+#: spatial/static/spatial/js/gridmap.js:539
 msgid "No forecast available"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:471
+#: spatial/static/spatial/js/gridmap.js:540
 msgid "Missing data"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:472
+#: spatial/static/spatial/js/gridmap.js:541
 msgid "No risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:473
+#: spatial/static/spatial/js/gridmap.js:542
 msgid "Medium risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:474
+#: spatial/static/spatial/js/gridmap.js:543
 msgid "High risk of infection"
 msgstr ""
diff --git a/spatial/locale/bs/LC_MESSAGES/djangojs.po b/spatial/locale/bs/LC_MESSAGES/djangojs.po
index 98efe72c..74128b9e 100644
--- a/spatial/locale/bs/LC_MESSAGES/djangojs.po
+++ b/spatial/locale/bs/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-12-21 10:13+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -19,34 +19,40 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: static/spatial/js/gridmap.js:37
+#: spatial/static/spatial/js/gridmap.js:37
 msgid "WARNING_STATUS"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:446
+#: spatial/static/spatial/js/gridmap.js:426
+msgid ""
+"The risk map contains no data. Could we be out of season? Please read the "
+"model description."
+msgstr ""
+
+#: spatial/static/spatial/js/gridmap.js:515
 msgid "Map location"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:466
+#: spatial/static/spatial/js/gridmap.js:535
 msgid "Could not determine warning status"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:470
+#: spatial/static/spatial/js/gridmap.js:539
 msgid "No forecast available"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:471
+#: spatial/static/spatial/js/gridmap.js:540
 msgid "Missing data"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:472
+#: spatial/static/spatial/js/gridmap.js:541
 msgid "No risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:473
+#: spatial/static/spatial/js/gridmap.js:542
 msgid "Medium risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:474
+#: spatial/static/spatial/js/gridmap.js:543
 msgid "High risk of infection"
 msgstr ""
diff --git a/spatial/locale/de/LC_MESSAGES/djangojs.po b/spatial/locale/de/LC_MESSAGES/djangojs.po
index 434167e5..cd6204ac 100644
--- a/spatial/locale/de/LC_MESSAGES/djangojs.po
+++ b/spatial/locale/de/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-12-21 10:13+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,34 +18,40 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: static/spatial/js/gridmap.js:37
+#: spatial/static/spatial/js/gridmap.js:37
 msgid "WARNING_STATUS"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:446
+#: spatial/static/spatial/js/gridmap.js:426
+msgid ""
+"The risk map contains no data. Could we be out of season? Please read the "
+"model description."
+msgstr ""
+
+#: spatial/static/spatial/js/gridmap.js:515
 msgid "Map location"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:466
+#: spatial/static/spatial/js/gridmap.js:535
 msgid "Could not determine warning status"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:470
+#: spatial/static/spatial/js/gridmap.js:539
 msgid "No forecast available"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:471
+#: spatial/static/spatial/js/gridmap.js:540
 msgid "Missing data"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:472
+#: spatial/static/spatial/js/gridmap.js:541
 msgid "No risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:473
+#: spatial/static/spatial/js/gridmap.js:542
 msgid "Medium risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:474
+#: spatial/static/spatial/js/gridmap.js:543
 msgid "High risk of infection"
 msgstr ""
diff --git a/spatial/locale/fi/LC_MESSAGES/djangojs.po b/spatial/locale/fi/LC_MESSAGES/djangojs.po
index 434167e5..cd6204ac 100644
--- a/spatial/locale/fi/LC_MESSAGES/djangojs.po
+++ b/spatial/locale/fi/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-12-21 10:13+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,34 +18,40 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: static/spatial/js/gridmap.js:37
+#: spatial/static/spatial/js/gridmap.js:37
 msgid "WARNING_STATUS"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:446
+#: spatial/static/spatial/js/gridmap.js:426
+msgid ""
+"The risk map contains no data. Could we be out of season? Please read the "
+"model description."
+msgstr ""
+
+#: spatial/static/spatial/js/gridmap.js:515
 msgid "Map location"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:466
+#: spatial/static/spatial/js/gridmap.js:535
 msgid "Could not determine warning status"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:470
+#: spatial/static/spatial/js/gridmap.js:539
 msgid "No forecast available"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:471
+#: spatial/static/spatial/js/gridmap.js:540
 msgid "Missing data"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:472
+#: spatial/static/spatial/js/gridmap.js:541
 msgid "No risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:473
+#: spatial/static/spatial/js/gridmap.js:542
 msgid "Medium risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:474
+#: spatial/static/spatial/js/gridmap.js:543
 msgid "High risk of infection"
 msgstr ""
diff --git a/spatial/locale/nb/LC_MESSAGES/djangojs.po b/spatial/locale/nb/LC_MESSAGES/djangojs.po
index 802d3128..54b38bd3 100644
--- a/spatial/locale/nb/LC_MESSAGES/djangojs.po
+++ b/spatial/locale/nb/LC_MESSAGES/djangojs.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-12-21 10:13+0100\n"
-"PO-Revision-Date: 2023-12-20 10:24+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
+"PO-Revision-Date: 2024-04-03 14:06+0200\n"
 "Last-Translator: \n"
 "Language-Team: \n"
 "Language: nb\n"
@@ -16,36 +16,44 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 3.4.1\n"
+"X-Generator: Poedit 3.4.2\n"
 
-#: static/spatial/js/gridmap.js:37
+#: spatial/static/spatial/js/gridmap.js:37
 msgid "WARNING_STATUS"
 msgstr "Varselstatus"
 
-#: static/spatial/js/gridmap.js:446
+#: spatial/static/spatial/js/gridmap.js:426
+msgid ""
+"The risk map contains no data. Could we be out of season? Please read the "
+"model description."
+msgstr ""
+"Risikokartet inneholder ikke data. Kan vi være utenfor vekstsesong? "
+"Vennligst les modellbeskrivelsen."
+
+#: spatial/static/spatial/js/gridmap.js:515
 msgid "Map location"
 msgstr "Kartpunkt"
 
-#: static/spatial/js/gridmap.js:466
+#: spatial/static/spatial/js/gridmap.js:535
 msgid "Could not determine warning status"
 msgstr "Kunne ikke bestemme varselstatus"
 
-#: static/spatial/js/gridmap.js:470
+#: spatial/static/spatial/js/gridmap.js:539
 msgid "No forecast available"
 msgstr "Varsel ikke tilgjengelig"
 
-#: static/spatial/js/gridmap.js:471
+#: spatial/static/spatial/js/gridmap.js:540
 msgid "Missing data"
 msgstr "Data mangler"
 
-#: static/spatial/js/gridmap.js:472
+#: spatial/static/spatial/js/gridmap.js:541
 msgid "No risk of infection"
 msgstr "Ingen infeksjonsrisiko"
 
-#: static/spatial/js/gridmap.js:473
+#: spatial/static/spatial/js/gridmap.js:542
 msgid "Medium risk of infection"
 msgstr "Middels infeksjonsrisiko"
 
-#: static/spatial/js/gridmap.js:474
+#: spatial/static/spatial/js/gridmap.js:543
 msgid "High risk of infection"
 msgstr "Høy infeksjonsrisiko"
diff --git a/spatial/locale/vi/LC_MESSAGES/djangojs.po b/spatial/locale/vi/LC_MESSAGES/djangojs.po
index 35dbf0d4..4ba0cd25 100644
--- a/spatial/locale/vi/LC_MESSAGES/djangojs.po
+++ b/spatial/locale/vi/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-12-21 10:13+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,34 +18,40 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: static/spatial/js/gridmap.js:37
+#: spatial/static/spatial/js/gridmap.js:37
 msgid "WARNING_STATUS"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:446
+#: spatial/static/spatial/js/gridmap.js:426
+msgid ""
+"The risk map contains no data. Could we be out of season? Please read the "
+"model description."
+msgstr ""
+
+#: spatial/static/spatial/js/gridmap.js:515
 msgid "Map location"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:466
+#: spatial/static/spatial/js/gridmap.js:535
 msgid "Could not determine warning status"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:470
+#: spatial/static/spatial/js/gridmap.js:539
 msgid "No forecast available"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:471
+#: spatial/static/spatial/js/gridmap.js:540
 msgid "Missing data"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:472
+#: spatial/static/spatial/js/gridmap.js:541
 msgid "No risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:473
+#: spatial/static/spatial/js/gridmap.js:542
 msgid "Medium risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:474
+#: spatial/static/spatial/js/gridmap.js:543
 msgid "High risk of infection"
 msgstr ""
diff --git a/spatial/locale/zh_Hans/LC_MESSAGES/djangojs.po b/spatial/locale/zh_Hans/LC_MESSAGES/djangojs.po
index 35dbf0d4..4ba0cd25 100644
--- a/spatial/locale/zh_Hans/LC_MESSAGES/djangojs.po
+++ b/spatial/locale/zh_Hans/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-12-21 10:13+0100\n"
+"POT-Creation-Date: 2024-04-03 14:01+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,34 +18,40 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: static/spatial/js/gridmap.js:37
+#: spatial/static/spatial/js/gridmap.js:37
 msgid "WARNING_STATUS"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:446
+#: spatial/static/spatial/js/gridmap.js:426
+msgid ""
+"The risk map contains no data. Could we be out of season? Please read the "
+"model description."
+msgstr ""
+
+#: spatial/static/spatial/js/gridmap.js:515
 msgid "Map location"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:466
+#: spatial/static/spatial/js/gridmap.js:535
 msgid "Could not determine warning status"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:470
+#: spatial/static/spatial/js/gridmap.js:539
 msgid "No forecast available"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:471
+#: spatial/static/spatial/js/gridmap.js:540
 msgid "Missing data"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:472
+#: spatial/static/spatial/js/gridmap.js:541
 msgid "No risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:473
+#: spatial/static/spatial/js/gridmap.js:542
 msgid "Medium risk of infection"
 msgstr ""
 
-#: static/spatial/js/gridmap.js:474
+#: spatial/static/spatial/js/gridmap.js:543
 msgid "High risk of infection"
 msgstr ""
diff --git a/spatial/static/spatial/js/gridmap.js b/spatial/static/spatial/js/gridmap.js
index d6f12135..8763e827 100644
--- a/spatial/static/spatial/js/gridmap.js
+++ b/spatial/static/spatial/js/gridmap.js
@@ -187,121 +187,137 @@ async function initGridMap(inputModelId, wmsURL, mapAttribution) {
     //console.info(wmsURL + "?service=WMS&request=GetCapabilities&language=en");
     //console.info(response.status); // Response is 200 even if a model doesn't exist on the mapserver
     let txt = await response.text();
-    
+
     //console.info(txt);
-    let capabilities = parser.read(txt);
-    let WMSLayers = capabilities.Capability.Layer.Layer;
-
-    // Test: Are WMSLayers one level behind?
-    let testName = WMSLayers[0].Name;
-    let testNameParts = testName.split(".");
-    // The name must have 3 parts
-    // Part 1 of name must equal the model ID
-    // Part 3 must be a parseable date (YYYY-MM-DD)
-    if(testNameParts.length != 3 || testNameParts[0] != modelId || testNameParts[2].length != 10)
-    {
-        // This is not the layer we want, we must search one level deeper.
-        WMSLayers = WMSLayers[0].Layer;
-    }
-    //console.info(WMSLayers);
-    //console.info(capabilities);
-    // Get title and abstract. Could be either at top level or the level below
-    let modelTitle = capabilities.Service.Title;
-    let modelAbstract = undefined;
-    if(modelTitle != undefined && modelTitle.trim() != "")
-    {
-        modelAbstract = capabilities.Service.Abstract;
-    }
-    else
-    {
-        modelTitle = capabilities.Capability.Layer.Layer[0].Title;
-        modelAbstract = capabilities.Capability.Layer.Layer[0].Abstract;
-    }
-    document.getElementById("modelTitle").innerHTML = modelTitle;
-    if(modelAbstract != undefined)
+    let wmsServiceSuccess = false;
+    let isDataReturned = false
+    try
     {
-        // Placing the sections above/below the map
-        let el = new DOMParser().parseFromString(modelAbstract.replaceAll("\n\n",""),"text/html");
-        let preamble = el.getElementById("preamble") != null ? el.getElementById("preamble") : el;
-        document.getElementById("modelAbstractPreamble").innerHTML = new XMLSerializer().serializeToString(preamble);
-        let body = el.getElementById("body") != null ? el.getElementById("body") : null;
-        if(body != null)
+        let capabilities = parser.read(txt);
+        isDataReturned = capabilities.Capability.Layer != undefined;
+        
+        let WMSLayers = isDataReturned ? capabilities.Capability.Layer.Layer : [];
+
+        if(isDataReturned)
         {
-            document.getElementById("modelAbstractBody").innerHTML = new XMLSerializer().serializeToString(body);
+            // Test: Are WMSLayers one level behind?
+            let testName = WMSLayers[0].Name;
+            let testNameParts = testName.split(".");
+            // The name must have 3 parts
+            // Part 1 of name must equal the model ID
+            // Part 3 must be a parseable date (YYYY-MM-DD)
+            if(testNameParts.length != 3 || testNameParts[0] != modelId || testNameParts[2].length != 10)
+            {
+                // This is not the layer we want, we must search one level deeper.
+                WMSLayers = WMSLayers[0].Layer;
+            }
+            //console.info(WMSLayers);
         }
-        // Get the parameter explanations
-        let props = el.querySelectorAll("[itemprop]");
-        for(var i=0;i<props.length;i++)
+        //console.info(capabilities);
+        // Get title and abstract. Could be either at top level or the level below
+        let modelTitle = capabilities.Service.Title;
+        let modelAbstract = undefined;
+        if(modelTitle != undefined && modelTitle.trim() != "")
         {
-            parameterLabels[props[i].getAttribute("itemprop")]=props[i].textContent;
+            modelAbstract = capabilities.Service.Abstract;
         }
-    }
-    //console.info(capabilities);
-
-    // Analyze and organize layers
-    // First dimension: Time
-    // Second dimension: Parameter
-    for(let i=0;i<WMSLayers.length;i++){
-        // Sort by date ascending
-        let WMSLayerName = WMSLayers[i].Name;
-        let WMSLayerParam = WMSLayerName.split(".")[1];
-        // Adding the parameter if it does not exist in the list
-        if(parameters.indexOf(WMSLayerParam) < 0)
+        else if(isDataReturned)
         {
-            parameters.push(WMSLayerParam);
+            modelTitle = capabilities.Capability.Layer.Layer[0].Title;
+            modelAbstract = capabilities.Capability.Layer.Layer[0].Abstract;
         }
-        let timestamp = moment(WMSLayerName.split(".")[2]).valueOf();
-        if(WMSLayersDateBucket[timestamp] == undefined)
+        document.getElementById("modelTitle").innerHTML = modelTitle != undefined ? modelTitle : "No name found for model";
+        if(modelAbstract != undefined)
         {
-            WMSLayersDateBucket[timestamp] = {}
+            // Placing the sections above/below the map
+            let el = new DOMParser().parseFromString(modelAbstract.replaceAll("\n\n",""),"text/html");
+            let preamble = el.getElementById("preamble") != null ? el.getElementById("preamble") : el;
+            document.getElementById("modelAbstractPreamble").innerHTML = new XMLSerializer().serializeToString(preamble);
+            let body = el.getElementById("body") != null ? el.getElementById("body") : null;
+            if(body != null)
+            {
+                document.getElementById("modelAbstractBody").innerHTML = new XMLSerializer().serializeToString(body);
+            }
+            // Get the parameter explanations
+            let props = el.querySelectorAll("[itemprop]");
+            for(var i=0;i<props.length;i++)
+            {
+                parameterLabels[props[i].getAttribute("itemprop")]=props[i].textContent;
+            }
         }
-        WMSLayersDateBucket[timestamp][WMSLayerParam] = WMSLayers[i];
-    }
-    //console.info(WMSLayersDateBucket);
+        //console.info(capabilities);
+
+        // Analyze and organize layers
+        // First dimension: Time
+        // Second dimension: Parameter
+        for(let i=0;i<WMSLayers.length;i++){
+            // Sort by date ascending
+            let WMSLayerName = WMSLayers[i].Name;
+            let WMSLayerParam = WMSLayerName.split(".")[1];
+            // Adding the parameter if it does not exist in the list
+            if(parameters.indexOf(WMSLayerParam) < 0)
+            {
+                parameters.push(WMSLayerParam);
+            }
+            let timestamp = moment(WMSLayerName.split(".")[2]).valueOf();
+            if(WMSLayersDateBucket[timestamp] == undefined)
+            {
+                WMSLayersDateBucket[timestamp] = {}
+            }
+            WMSLayersDateBucket[timestamp][WMSLayerParam] = WMSLayers[i];
+        }
+        //console.info(WMSLayersDateBucket);
 
-    // Iterate timestamps, add all layers chronologically
-    timestamps = Object.keys(WMSLayersDateBucket);
-    timestamps.sort();
-    //console.info(timestamps);
+        // Iterate timestamps, add all layers chronologically
+        timestamps = Object.keys(WMSLayersDateBucket);
+        timestamps.sort();
+        //console.info(timestamps);
 
-    for(let i=0; i< timestamps.length;i++)
-    {
-        let dateStr = moment(parseInt(timestamps[i])).format("YYYY-MM-DD");
-        if(dateStr == today)
+        for(let i=0; i< timestamps.length;i++)
         {
-            todayLayerIndex = i;
-        }
+            let dateStr = moment(parseInt(timestamps[i])).format("YYYY-MM-DD");
+            if(dateStr == today)
+            {
+                todayLayerIndex = i;
+            }
 
-        // There are normally several parameters per timestamp
-        let timestampLayers = WMSLayersDateBucket[timestamps[i]];
-        let params = Object.keys(timestampLayers);
-        for(let j=0; j<params.length;j++)
-        {
-            let currentLayer = timestampLayers[params[j]];
-            let currentLayerParam = currentLayer.Name.split(".")[1];
-            /*if(j==0)
+            // There are normally several parameters per timestamp
+            let timestampLayers = WMSLayersDateBucket[timestamps[i]];
+            let params = Object.keys(timestampLayers);
+            for(let j=0; j<params.length;j++)
             {
-                console.info(currentLayer.Abstract);
-            }*/
-            layers.push(
-                new ol.layer.Image({
-                    source: new ol.source.ImageWMS({
-                        url: wmsURL,
-                        params: { "LAYERS": modelId + "." + currentLayerParam + "." + dateStr, "TRANSPARENT": "TRUE" },
-                        serverType: "mapserver",
-                        ratio: 1,
-                        projection: ol.proj.get(currentLayer.CRS[0])
-                    }),
-                    visible: false,
-                    opacity: 0.5
-                })
-            );
-            // This is the placement in the maps layers collection. By adding it here
-            // it's easy to manipulate it
-            currentLayer["ordering"] = layers.length -1;
+                let currentLayer = timestampLayers[params[j]];
+                let currentLayerParam = currentLayer.Name.split(".")[1];
+                /*if(j==0)
+                {
+                    console.info(currentLayer.Abstract);
+                }*/
+                layers.push(
+                    new ol.layer.Image({
+                        source: new ol.source.ImageWMS({
+                            url: wmsURL,
+                            params: { "LAYERS": modelId + "." + currentLayerParam + "." + dateStr, "TRANSPARENT": "TRUE" },
+                            serverType: "mapserver",
+                            ratio: 1,
+                            projection: ol.proj.get(currentLayer.CRS[0])
+                        }),
+                        visible: false,
+                        opacity: 0.5
+                    })
+                );
+                // This is the placement in the maps layers collection. By adding it here
+                // it's easy to manipulate it
+                currentLayer["ordering"] = layers.length -1;
+            }
         }
-    }
 
+        wmsServiceSuccess = true;
+    }
+    catch(error)
+    {
+        //console.info(error);
+        //console.info("No data or error from WMS");
+    }
     
     
     //console.info(WMSLayersDateBucket);
@@ -324,72 +340,92 @@ async function initGridMap(inputModelId, wmsURL, mapAttribution) {
 	map.setView(view);
 
     // If today is outside of the date range, use the most recent timestamp
-    if(todayLayerIndex == undefined)
+    if(wmsServiceSuccess && isDataReturned)
     {
-        todayLayerIndex = timestamps.length -1;
-    }
+        if(todayLayerIndex == undefined)
+        {
+            todayLayerIndex = timestamps.length -1;
+        }
 
-    let range = document.getElementById("layerDateRange");
-    range.min = 0;
-    range.max = timestamps.length -1;
-    range.value = todayLayerIndex;
-    setCurrentDate(todayLayerIndex);
-    switchLayer(todayLayerIndex);
-
-    // Set zoom and center either based on what the user previously had set,
-    // or fit the map to the layer's extent
-    var storedMapSettings = getLocalSettings([
-        "gridmap.longitude",
-        "gridmap.latitude",
-        "gridmap.zoomLevel"], 
-        true);
-    if(storedMapSettings != null)
-    {
-        longitude = parseFloat(storedMapSettings["gridmap.longitude"]);
-        latitude = parseFloat(storedMapSettings["gridmap.latitude"]);
-        let lonLat=[longitude,latitude];
-        zoomLevel = parseInt(storedMapSettings["gridmap.zoomLevel"]);
-        map.getView().setCenter(ol.proj.transform(lonLat, 'EPSG:4326', map.getView().getProjection().getCode()));
-        map.getView().setZoom(zoomLevel);
-    }
-    else
-    {
-        // Zoom and center the map to fit to the extent of the WMS layer. 
-        // If the current WMS layer has a lot of no-data / invisible values surrounding the 
-        // visible values, the zoom might appear to be a bit too far out
-        let currentWMSLayer = WMSLayersDateBucket[currentTimestamp][currentParameter]
-        let WMSExtent = currentWMSLayer.EX_GeographicBoundingBox; 
-        let extent = ol.proj.transformExtent(WMSExtent, getCurrentVisibleOLLayer().getSource().getProjection().getCode(), map.getView().getProjection());
-        map.getView().fit(extent, map.getSize());
-    }
+        let range = document.getElementById("layerDateRange");
+        range.min = 0;
+        range.max = timestamps.length -1;
+        range.value = todayLayerIndex;
+        setCurrentDate(todayLayerIndex);
+        switchLayer(todayLayerIndex);
+
+        // Set zoom and center either based on what the user previously had set,
+        // or fit the map to the layer's extent
+        var storedMapSettings = getLocalSettings([
+            "gridmap.longitude",
+            "gridmap.latitude",
+            "gridmap.zoomLevel"], 
+            true);
+        if(storedMapSettings != null)
+        {
+            longitude = parseFloat(storedMapSettings["gridmap.longitude"]);
+            latitude = parseFloat(storedMapSettings["gridmap.latitude"]);
+            let lonLat=[longitude,latitude];
+            zoomLevel = parseInt(storedMapSettings["gridmap.zoomLevel"]);
+            map.getView().setCenter(ol.proj.transform(lonLat, 'EPSG:4326', map.getView().getProjection().getCode()));
+            map.getView().setZoom(zoomLevel);
+        }
+        else
+        {
+            // Zoom and center the map to fit to the extent of the WMS layer. 
+            // If the current WMS layer has a lot of no-data / invisible values surrounding the 
+            // visible values, the zoom might appear to be a bit too far out
+            let currentWMSLayer = WMSLayersDateBucket[currentTimestamp][currentParameter]
+            let WMSExtent = currentWMSLayer.EX_GeographicBoundingBox; 
+            let extent = ol.proj.transformExtent(WMSExtent, getCurrentVisibleOLLayer().getSource().getProjection().getCode(), map.getView().getProjection());
+            map.getView().fit(extent, map.getSize());
+        }
 
-    popup = new ol.Overlay({
-    element: document.getElementById('popup')
-    });
-    map.addOverlay(popup);
-
-    map.on('singleclick', displayQueryResult);
-
-    // Store user's zoom/pan preferences for the next browser session
-    map.on('moveend', function(evt) {
-		// Store map settings
-		var centerCoordinate = ol.proj.transform(map.getView().getCenter(), map.getView().getProjection().getCode(),'EPSG:4326');
-		var settings = {
-			"gridmap.longitude": centerCoordinate[0],
-			"gridmap.latitude": centerCoordinate[1],
-			"gridmap.zoomLevel": map.getView().getZoom()
-		};
-		storeLocalSettings(settings);
-		});
-
-    // Add the parameter selector
-    let radioHTML = "";
-    for(let i=0;i<parameters.length;i++)
-    {
-        radioHTML += '<div class="radio"><label><input type="radio" name="parameter" value="' + parameters[i] + '"' + (parameters[i] == currentParameter ? "checked" : "") + ' onclick="switchParameter(this.value);"/>' + (parameterLabels[parameters[i]] != undefined ? capitalizeFirstLetter(parameterLabels[parameters[i]]) : parameters[i]) + '</label></div>';
+        popup = new ol.Overlay({
+        element: document.getElementById('popup')
+        });
+        map.addOverlay(popup);
+
+        map.on('singleclick', displayQueryResult);
+
+        // Store user's zoom/pan preferences for the next browser session
+        map.on('moveend', function(evt) {
+            // Store map settings
+            var centerCoordinate = ol.proj.transform(map.getView().getCenter(), map.getView().getProjection().getCode(),'EPSG:4326');
+            var settings = {
+                "gridmap.longitude": centerCoordinate[0],
+                "gridmap.latitude": centerCoordinate[1],
+                "gridmap.zoomLevel": map.getView().getZoom()
+            };
+            storeLocalSettings(settings);
+            });
+
+        // Add the parameter selector
+        let radioHTML = "";
+        for(let i=0;i<parameters.length;i++)
+        {
+            radioHTML += '<div class="radio"><label><input type="radio" name="parameter" value="' + parameters[i] + '"' + (parameters[i] == currentParameter ? "checked" : "") + ' onclick="switchParameter(this.value);"/>' + (parameterLabels[parameters[i]] != undefined ? capitalizeFirstLetter(parameterLabels[parameters[i]]) : parameters[i]) + '</label></div>';
+        }
+        
+        document.getElementById("paramselector").innerHTML = radioHTML;
+    }
+    else{
+        map.getView().setCenter(ol.proj.transform([0,0], 'EPSG:4326', map.getView().getProjection().getCode()));
+        map.getView().setZoom(2);
+        document.getElementById("paramselector").style.display="none";
+        document.getElementById("layerLegend").style.display="none";
+        document.getElementById("slidecontainer").style.display="none";
+        if(! wmsServiceSuccess)
+        {
+            alert("Got here");
+            document.getElementById("errorMessageContainer").innerHTML="ERROR: Response from server was " + txt;
+        }
+        else // Service OK, but no data (layers)
+        {
+            document.getElementById("errorMessageContainer").innerHTML=gettext("The risk map contains no data. Could we be out of season? Please read the model description.");
+        }
+        document.getElementById("errorMessageContainer").style.display="block";
     }
-    
-    document.getElementById("paramselector").innerHTML = radioHTML;
 
 }
 
diff --git a/spatial/templates/spatial/gridmap.html b/spatial/templates/spatial/gridmap.html
index c929bcfd..6ebd8a89 100644
--- a/spatial/templates/spatial/gridmap.html
+++ b/spatial/templates/spatial/gridmap.html
@@ -37,7 +37,7 @@
 	</div>
 	<!-- Start map container -->
 	<div class="col-md-12" id="mapContainer" style="position: relative; height: 800px; padding-top: 15px; padding-bottom: 15px;">
-		<div class="slidecontainer" style="position: absolute; left: 20px; bottom: 20px; background-color: white; z-index: 1000;padding: 15px; border-radius: 15px; margin-bottom: 15px;">
+		<div id="slidecontainer" class="slidecontainer" style="position: absolute; left: 20px; bottom: 20px; background-color: white; z-index: 1000;padding: 15px; border-radius: 15px; margin-bottom: 15px;">
 			{% trans "Current date" %}: <span id="currentDate"></span> <br/>
 			<button type="button" class="btn" onclick="moveDateSlider(-1);"><i class="fa fa-step-backward" aria-hidden="true"></i></button>
 			<input type="range" min="0" max="0" value="0" step="1" id="layerDateRange" onchange="switchLayer(parseInt(this.value));">
@@ -46,8 +46,8 @@
 		<div class="form-group" id="paramselector" style="position: absolute; right: 20px; bottom: 20px; background-color: white; z-index: 1000;padding: 15px; border-radius: 15px;">
 		</div>
 		<div id="layerLegend" style="position: absolute; right: 20px; top: 20px; background-color: white; z-index: 1000;padding: 15px; border-radius: 15px;">
-			
 		</div>
+		<div id="errorMessageContainer" style="display: none; position: absolute; left: 100px; top: 100px; background-color: white; z-index: 1000;padding: 15px; border-radius: 15px;"></div>
 	</div>
 	<div id="popup" title=""></div>
 	<div class="col-md-12">
-- 
GitLab