diff --git a/VIPSWeb/locale/bg/LC_MESSAGES/djangojs.po b/VIPSWeb/locale/bg/LC_MESSAGES/djangojs.po
index 3f29f29f4e18c07ebe8976f3a9293b63191c6045..fb9498857c1664445b400e54ee9a1c1a8c4641f2 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 f05027ddc8315183714d9f9f933ea9f0b6aac344..575106b4a66d11a7076585b79243fd84ddedaa1f 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 ec571c9c2162043b53e7109ca73f95afdabd2c0d..1733c8643625e7338cce14c4c805b6c71d473339 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 ec571c9c2162043b53e7109ca73f95afdabd2c0d..1733c8643625e7338cce14c4c805b6c71d473339 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
Binary files a/VIPSWeb/locale/nb/LC_MESSAGES/djangojs.mo and b/VIPSWeb/locale/nb/LC_MESSAGES/djangojs.mo differ
diff --git a/VIPSWeb/locale/nb/LC_MESSAGES/djangojs.po b/VIPSWeb/locale/nb/LC_MESSAGES/djangojs.po
index e699bcf54c443aa29f11786042bf09ac8de2391d..d38b7b9e9922260704af96d74118816fa940d1b2 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 7dd554aa6e86b5a6c0ef38bab17f2051e336baa8..f625d86e62fb34a9de4f8ca50d89a61fbb9f21e9 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 92d45c641e8cb89e5d7b2b923f55a3394888ad35..8527d3708d71a50db086c518131632ce7cc2877d 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 0000000000000000000000000000000000000000..a9ed1e023c98cee8a6c4f5edd76bde814aad547e
--- /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 0000000000000000000000000000000000000000..d48ba98a41dee137883e0f97868e853d3a0f3cad
--- /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 13121d79382ee037fa7a1d84220e755c036aeab0..7618b36618e3403fee006d3a71a0dfcdc5652a47 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 0000000000000000000000000000000000000000..a9ed1e023c98cee8a6c4f5edd76bde814aad547e
--- /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 2b1aeefbf150d3f5858fd1117df028771aac7871..e332890feff81d7d05f875640f5c09770dd351c7 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 0000000000000000000000000000000000000000..48aabc027156d46b6be62a9dc23b7d9da6a0aa55
--- /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 39c5bf8341f579f8915017e4b5c5a89770f24aeb..a98c5d57479952b8ea5eadf90186c864ac0fb4a6 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 0000000000000000000000000000000000000000..8a645b64eb30ff973ff43d4b378db1f837d2a182
--- /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 0000000000000000000000000000000000000000..a74214f8964a0740797916a269cdea2f7dedd371
--- /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 0000000000000000000000000000000000000000..8a645b64eb30ff973ff43d4b378db1f837d2a182
--- /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 0000000000000000000000000000000000000000..8a645b64eb30ff973ff43d4b378db1f837d2a182
--- /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 262f5eb9e7b68d6c8f0cd2af811a3c0b0bc98e74..1738c1acf96a459891970dabcec5971221fe2755 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 0000000000000000000000000000000000000000..71d89b070681ac317845b8a3ebcfc9ff48cc6ae3
--- /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 0000000000000000000000000000000000000000..71d89b070681ac317845b8a3ebcfc9ff48cc6ae3
--- /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 434167e5a5416e19f071c34fd6da83eb19554929..cd6204ac101423879096bf9c0471418af3f18b47 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 98efe72c458477c9707a8e9cddde4b95a5677c35..74128b9ebd0fc9e4b84bfc7007254d3bf345df3e 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 434167e5a5416e19f071c34fd6da83eb19554929..cd6204ac101423879096bf9c0471418af3f18b47 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 434167e5a5416e19f071c34fd6da83eb19554929..cd6204ac101423879096bf9c0471418af3f18b47 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 802d3128408f22e30f7519a6b8ebf9fa84d21c09..54b38bd331de4039ede3e9e058606623860b3ee9 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 35dbf0d4dd49c82b869021b8c2274ea4d323de21..4ba0cd25f025be72b0c611ed6009102bd24031a3 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 35dbf0d4dd49c82b869021b8c2274ea4d323de21..4ba0cd25f025be72b0c611ed6009102bd24031a3 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 d6f121355829dd53194329318a1baa8b4ebe79e9..8763e8273d4e71bc064dee3e7c21bcbb15a32a4b 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 c929bcfdd71e142f37e43d638a589fd9543896ba..6ebd8a89b704a0e957e3c84f606ea3a4041c17ce 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">