From 8f0b65c9640295acb0ed42e1cd7fd32b2c0792f5 Mon Sep 17 00:00:00 2001 From: Robert Hurst Date: Tue, 23 Jan 2024 09:19:56 +0200 Subject: [PATCH 01/11] Provided missing gazetteer --- lib/ui/Gazetteer.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/Gazetteer.mjs b/lib/ui/Gazetteer.mjs index 126935dfc1..3b841e061c 100644 --- a/lib/ui/Gazetteer.mjs +++ b/lib/ui/Gazetteer.mjs @@ -39,7 +39,7 @@ export default gazetteer => { source: 'Coordinates', lng: ll[1], lat: ll[0] - }) + }, gazetteer) }}>Latitude:${ll[0]}, Longitude:${ll[1]}`) From b7cc91a330aadc7a798287c24aa416c577067f1b Mon Sep 17 00:00:00 2001 From: Robert Hurst Date: Tue, 23 Jan 2024 13:53:48 +0200 Subject: [PATCH 02/11] Update alert for invalid extent --- lib/mapview/fitView.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/mapview/fitView.mjs b/lib/mapview/fitView.mjs index 92c08ca350..c31de14ee7 100644 --- a/lib/mapview/fitView.mjs +++ b/lib/mapview/fitView.mjs @@ -8,6 +8,7 @@ export default function (extent, opt_options = {}){ // Extent must be an array of finite values. if (!Array.isArray(extent) || !extent.every(val => isFinite(val))) { console.warn('Attempted to call fitView method with invalid extent'); + alert('Attempted to call fitView method with invalid extent'); return; } From b7406740ae433a82e6a44333f2471da2c03d0ae2 Mon Sep 17 00:00:00 2001 From: Simon Leech Date: Tue, 23 Jan 2024 12:27:59 +0000 Subject: [PATCH 03/11] Updated alert and added translation --- lib/mapview/fitView.mjs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/mapview/fitView.mjs b/lib/mapview/fitView.mjs index c31de14ee7..4affaca952 100644 --- a/lib/mapview/fitView.mjs +++ b/lib/mapview/fitView.mjs @@ -5,10 +5,16 @@ export default function (extent, opt_options = {}){ * @param {Object} opt_options - Defaults to empty object */ + + mapp.utils.merge(mapp.dictionaries, { + en: { + invalid_lat_long: 'Invalid Latitude and/or Longitude. Please check your input and try again.' + } + }) // Extent must be an array of finite values. if (!Array.isArray(extent) || !extent.every(val => isFinite(val))) { console.warn('Attempted to call fitView method with invalid extent'); - alert('Attempted to call fitView method with invalid extent'); + alert(`${mapp.dictionary.invalid_lat_long}`); return; } From 3672bc5307dffa9aac53f74d8fd765c2735865ed Mon Sep 17 00:00:00 2001 From: Robert Hurst Date: Tue, 23 Jan 2024 15:21:31 +0200 Subject: [PATCH 04/11] Add invalid lat lon check into gazetteer --- lib/layer/decorate.mjs | 27 +++++++++++++---------- lib/ui/Gazetteer.mjs | 50 ++++++++++++++++++++++++++---------------- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/lib/layer/decorate.mjs b/lib/layer/decorate.mjs index 7d44440951..d1648f7f10 100644 --- a/lib/layer/decorate.mjs +++ b/lib/layer/decorate.mjs @@ -60,7 +60,8 @@ export default async layer => { // Spread in defaults. ...params?.defaults, - ...layer.draw?.defaults}) + ...layer.draw?.defaults + }) }) // Check whether feature is loaded on MVT update. @@ -79,9 +80,9 @@ export default async layer => { setTimeout(checkFeature, 1000) function checkFeature() { - + let found = layer.features?.find(F => F.properties?.id === location.id) - + if (found) { layer.source.un('tileloadend', concatFeatures); @@ -134,7 +135,7 @@ export default async layer => { // Keep object theme. layer.style.theme = typeof layer.style.theme === 'object' - + ? layer.style.theme // Assign theme from key [string], or first theme. @@ -148,7 +149,7 @@ export default async layer => { layer.style.label = layer.style.labels[layer.style.theme.setLabel] } - // Warn if outdated layer.hover configuration is used. + // Warn if outdated layer.hover configuration is used. // Set layer.style.hover and remove layer.hover. if (layer.hover) { @@ -245,16 +246,20 @@ export default async layer => { // Call layer and/or plugin methods. Object.keys(layer).forEach((key) => { + try { + // Check for layer method matching the layer key. + mapp.layer[key]?.(layer); - // Check for layer method matching the layer key. - mapp.layer[key]?.(layer); + // Or plugin method and provide the layer object as an argument. + mapp.plugins[key]?.(layer); - // Or plugin method and provide the layer object as argument. - mapp.plugins[key]?.(layer); - - // It is possible to have a plugin method of the same name as a layer method. + // It is possible to have a plugin method of the same name as a layer method. + } catch (error) { + console.error(`Error processing key "${key}":`, error); + } }); + return layer; } diff --git a/lib/ui/Gazetteer.mjs b/lib/ui/Gazetteer.mjs index 3b841e061c..f6a0cc627f 100644 --- a/lib/ui/Gazetteer.mjs +++ b/lib/ui/Gazetteer.mjs @@ -27,24 +27,36 @@ export default gazetteer => { // Get possible coordinates from input. let ll = e.target.value.split(',').map(parseFloat) - // Check whether coordinates are float values. - if (ll.length === 2 && ll.every(n => !isNaN(n))) { - - gazetteer.list.appendChild(mapp.utils.html.node` -
  • { - - mapp.utils.gazetteer.getLocation({ - label: `Latitude:${ll[0]}, Longitude:${ll[1]}`, - source: 'Coordinates', - lng: ll[1], - lat: ll[0] - }, gazetteer) - - }}>Latitude:${ll[0]}, Longitude:${ll[1]}`) - - // Do not search if coordinates are provided. - return; + // Check whether coordinates are valid float values. + if (ll.length === 2 && ll.every(n => typeof n === 'number' && !isNaN(n) && isFinite(n))) { + // Check if both coordinates are within valid range (latitude: -90 to 90, longitude: -180 to 180). + const [lat, lng] = ll; + if (lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180) { + gazetteer.list.appendChild(mapp.utils.html.node` +
  • { + mapp.utils.gazetteer.getLocation({ + label: `Latitude:${ll[0]}, Longitude:${ll[1]}`, + source: 'Coordinates', + lng: ll[1], + lat: ll[0] + }, gazetteer); + }} + > + Latitude:${ll[0]}, Longitude:${ll[1]} +
  • + `); + // Do not search if coordinates are provided. + return; + } else { + // Add the error as a list item + gazetteer.list.appendChild(mapp.utils.html.node` +
  • + Invalid coordinates: Latitude and longitude values must be within valid ranges. +
  • + `); + // Handle the case where coordinates are not within valid ranges. + } } // An external gazetteer provider is requested @@ -64,5 +76,5 @@ export default gazetteer => { // Request datasets gazetteer mapp.utils.gazetteer.datasets(e.target.value, gazetteer) } - + } \ No newline at end of file From 2d73f3cee06c221ba7b2505f0549c9e6d52bc6bd Mon Sep 17 00:00:00 2001 From: Robert Hurst Date: Tue, 23 Jan 2024 15:52:32 +0200 Subject: [PATCH 05/11] Update dictionary entries --- lib/mapview/fitView.mjs | 4 ++-- lib/ui/Gazetteer.mjs | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/mapview/fitView.mjs b/lib/mapview/fitView.mjs index 4affaca952..364b453ab3 100644 --- a/lib/mapview/fitView.mjs +++ b/lib/mapview/fitView.mjs @@ -8,12 +8,12 @@ export default function (extent, opt_options = {}){ mapp.utils.merge(mapp.dictionaries, { en: { - invalid_lat_long: 'Invalid Latitude and/or Longitude. Please check your input and try again.' + invalid_lat_long: 'Attempted to call fitView method with invalid extent' } }) // Extent must be an array of finite values. if (!Array.isArray(extent) || !extent.every(val => isFinite(val))) { - console.warn('Attempted to call fitView method with invalid extent'); + console.warn(mapp.dictionary.invalid_lat_long); alert(`${mapp.dictionary.invalid_lat_long}`); return; } diff --git a/lib/ui/Gazetteer.mjs b/lib/ui/Gazetteer.mjs index f6a0cc627f..809b370269 100644 --- a/lib/ui/Gazetteer.mjs +++ b/lib/ui/Gazetteer.mjs @@ -16,6 +16,12 @@ export default gazetteer => { gazetteer.input.addEventListener('focus', search) + mapp.utils.merge(mapp.dictionaries, { + en: { + invalid_lat_long_range: 'Invalid coordinates: Latitude and longitude values must be within valid ranges.' + } + }) + function search(e) { // Clear results @@ -52,7 +58,7 @@ export default gazetteer => { // Add the error as a list item gazetteer.list.appendChild(mapp.utils.html.node`
  • - Invalid coordinates: Latitude and longitude values must be within valid ranges. + ${mapp.dictionary.invalid_lat_long_range}
  • `); // Handle the case where coordinates are not within valid ranges. From 4012e5059de5497714bafe95781a7316673bc6a9 Mon Sep 17 00:00:00 2001 From: Simon Leech Date: Tue, 23 Jan 2024 14:07:54 +0000 Subject: [PATCH 06/11] Removed invalid_lat_long dictionary as not longer required --- lib/mapview/fitView.mjs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/mapview/fitView.mjs b/lib/mapview/fitView.mjs index 364b453ab3..92c08ca350 100644 --- a/lib/mapview/fitView.mjs +++ b/lib/mapview/fitView.mjs @@ -5,16 +5,9 @@ export default function (extent, opt_options = {}){ * @param {Object} opt_options - Defaults to empty object */ - - mapp.utils.merge(mapp.dictionaries, { - en: { - invalid_lat_long: 'Attempted to call fitView method with invalid extent' - } - }) // Extent must be an array of finite values. if (!Array.isArray(extent) || !extent.every(val => isFinite(val))) { - console.warn(mapp.dictionary.invalid_lat_long); - alert(`${mapp.dictionary.invalid_lat_long}`); + console.warn('Attempted to call fitView method with invalid extent'); return; } From 1b7cded67aa63d4a19d0764fe63e10d27ba65a22 Mon Sep 17 00:00:00 2001 From: Robert Hurst Date: Wed, 24 Jan 2024 13:53:39 +0200 Subject: [PATCH 07/11] Remove catch --- lib/layer/decorate.mjs | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/layer/decorate.mjs b/lib/layer/decorate.mjs index 4211c0011f..c5b854207d 100644 --- a/lib/layer/decorate.mjs +++ b/lib/layer/decorate.mjs @@ -254,9 +254,6 @@ export default async layer => { typeof mapp.plugins[key] === 'function' && mapp.plugins[key]?.(layer); // It is possible to have a plugin method of the same name as a layer method. - } catch (error) { - console.error(`Error processing key "${key}":`, error); - } }); From 6cda520bb1f35a65ae2d4cc6545e2e4cca6dccbb Mon Sep 17 00:00:00 2001 From: Robert Hurst Date: Wed, 24 Jan 2024 17:04:07 +0200 Subject: [PATCH 08/11] Restrict Coordinate fly to Locale --- lib/location/decorate.mjs | 20 ++++++++++---------- lib/mapview/fitView.mjs | 16 ++++++++++++++++ lib/utils/gazetteer.mjs | 5 ++++- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/lib/location/decorate.mjs b/lib/location/decorate.mjs index d23d3f09ef..acf50d4fff 100644 --- a/lib/location/decorate.mjs +++ b/lib/location/decorate.mjs @@ -108,21 +108,21 @@ async function syncFields(fields) { }) } -function flyTo(maxZoom) { - +function flyTo(maxZoom, targetExtent) { const sourceVector = new ol.source.Vector(); - this.Layers.forEach(layer => { + this.Layers.forEach((layer) => { + const source = layer.getSource(); + typeof source.getFeatures === 'function' && sourceVector.addFeatures(source.getFeatures()); + }); - const source = layer.getSource() + const currentExtent = sourceVector.getExtent(); - typeof source.getFeatures === 'function' - && sourceVector.addFeatures(source.getFeatures()) - }) - - this.layer.mapview.fitView(sourceVector.getExtent(), { - maxZoom + return this.layer.mapview.fitView(currentExtent, { + maxZoom, + targetExtent }); + } async function trash() { diff --git a/lib/mapview/fitView.mjs b/lib/mapview/fitView.mjs index 92c08ca350..94bffc8737 100644 --- a/lib/mapview/fitView.mjs +++ b/lib/mapview/fitView.mjs @@ -5,12 +5,26 @@ export default function (extent, opt_options = {}){ * @param {Object} opt_options - Defaults to empty object */ + mapp.utils.merge(mapp.dictionaries, { + en: { + invalid_lat_lon: 'The provided Coordinates do not fall within the selected Locale.' + } + }) + // Extent must be an array of finite values. if (!Array.isArray(extent) || !extent.every(val => isFinite(val))) { console.warn('Attempted to call fitView method with invalid extent'); return; } + if (opt_options.targetExtent) { + if (!ol.extent.containsExtent(opt_options.targetExtent, extent)) { + alert(mapp.dictionary.invalid_lat_lon); + // Handle the case where the target extent is not within the current extent. + return false; + } + } + this.Map.getView().fit( extent, Object.assign( @@ -20,4 +34,6 @@ export default function (extent, opt_options = {}){ }, opt_options) ) + + return true; } \ No newline at end of file diff --git a/lib/utils/gazetteer.mjs b/lib/utils/gazetteer.mjs index a527c25b7b..d5d14b666a 100644 --- a/lib/utils/gazetteer.mjs +++ b/lib/utils/gazetteer.mjs @@ -149,5 +149,8 @@ export function getLocation(location, gazetteer) { gazetteer.mapview.locations[location.hook] = location - location.flyTo(gazetteer.maxZoom) + if(!location.flyTo(gazetteer.maxZoom, gazetteer.mapview.extent)){ + // Handle the case where the target extent is not within the current extent. + location.remove(); + } } \ No newline at end of file From 418d3e38644bb9da95fb7c99881e004c23a30462 Mon Sep 17 00:00:00 2001 From: Simon Leech Date: Wed, 24 Jan 2024 16:43:29 +0000 Subject: [PATCH 09/11] Gazetteer without datasets array should still use default search --- lib/utils/gazetteer.mjs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/utils/gazetteer.mjs b/lib/utils/gazetteer.mjs index d5d14b666a..17f5daa7a1 100644 --- a/lib/utils/gazetteer.mjs +++ b/lib/utils/gazetteer.mjs @@ -3,7 +3,23 @@ export function datasets(term, gazetteer) { if (!gazetteer.provider) { // The default gazetteer config is for a dataset search. - gazetteer.qterm && search(gazetteer) + // Abort current dataset query. Onload will not be called. + gazetteer.xhr?.abort() + gazetteer.xhr = new XMLHttpRequest() + gazetteer.qterm && search({ + layer: gazetteer.layer, + table: gazetteer.table, + query: gazetteer.query, + qterm: gazetteer.qterm, + label: gazetteer.label, + title: gazetteer.title, + limit: gazetteer.limit, + no_result: gazetteer.no_result, + leading_wildcard: gazetteer.leading_wildcard, + callback: gazetteer.callback, + maxZoom: gazetteer.maxZoom, + xhr: gazetteer.xhr + }) } // Search additional datasets. @@ -46,7 +62,7 @@ export function datasets(term, gazetteer) { console.warn('No table definition for gazetteer search.') return; }; - + dataset.xhr.open('GET', gazetteer.mapview.host + '/api/query?' + mapp.utils.paramString({ template: dataset.query || 'gaz_query', @@ -149,8 +165,8 @@ export function getLocation(location, gazetteer) { gazetteer.mapview.locations[location.hook] = location - if(!location.flyTo(gazetteer.maxZoom, gazetteer.mapview.extent)){ - // Handle the case where the target extent is not within the current extent. - location.remove(); + if (!location.flyTo(gazetteer.maxZoom, gazetteer.mapview.extent)) { + // Handle the case where the target extent is not within the current extent. + location.remove(); } } \ No newline at end of file From e6d310288a0c161f5ea0de82ebbb2c0aeeb14869 Mon Sep 17 00:00:00 2001 From: dbauszus-glx Date: Wed, 24 Jan 2024 18:34:22 +0000 Subject: [PATCH 10/11] gazetteer check coordinate in extent --- lib/layer/decorate.mjs | 1 - lib/location/decorate.mjs | 10 +++------- lib/mapview/fitView.mjs | 34 +++++++--------------------------- lib/ui/Gazetteer.mjs | 34 +++++++++++++++++----------------- lib/utils/gazetteer.mjs | 31 +++++++++++++------------------ 5 files changed, 40 insertions(+), 70 deletions(-) diff --git a/lib/layer/decorate.mjs b/lib/layer/decorate.mjs index c5b854207d..0922bcfbe0 100644 --- a/lib/layer/decorate.mjs +++ b/lib/layer/decorate.mjs @@ -256,7 +256,6 @@ export default async layer => { // It is possible to have a plugin method of the same name as a layer method. }); - return layer; } diff --git a/lib/location/decorate.mjs b/lib/location/decorate.mjs index acf50d4fff..f7c0352ba0 100644 --- a/lib/location/decorate.mjs +++ b/lib/location/decorate.mjs @@ -108,7 +108,7 @@ async function syncFields(fields) { }) } -function flyTo(maxZoom, targetExtent) { +function flyTo(maxZoom) { const sourceVector = new ol.source.Vector(); this.Layers.forEach((layer) => { @@ -116,13 +116,9 @@ function flyTo(maxZoom, targetExtent) { typeof source.getFeatures === 'function' && sourceVector.addFeatures(source.getFeatures()); }); - const currentExtent = sourceVector.getExtent(); - - return this.layer.mapview.fitView(currentExtent, { - maxZoom, - targetExtent + this.layer.mapview.fitView(sourceVector.getExtent(), { + maxZoom }); - } async function trash() { diff --git a/lib/mapview/fitView.mjs b/lib/mapview/fitView.mjs index 94bffc8737..02704fa338 100644 --- a/lib/mapview/fitView.mjs +++ b/lib/mapview/fitView.mjs @@ -1,39 +1,19 @@ -export default function (extent, opt_options = {}){ +export default function (extent, options = {}){ /** * Fits the view to a given extent * @param {Array} extent - geo extent, array of 4 numbers, must be [minX, minY, maxX, maxY] - * @param {Object} opt_options - Defaults to empty object + * @param {Object} options - Defaults to empty object */ - mapp.utils.merge(mapp.dictionaries, { - en: { - invalid_lat_lon: 'The provided Coordinates do not fall within the selected Locale.' - } - }) - // Extent must be an array of finite values. if (!Array.isArray(extent) || !extent.every(val => isFinite(val))) { console.warn('Attempted to call fitView method with invalid extent'); return; } - if (opt_options.targetExtent) { - if (!ol.extent.containsExtent(opt_options.targetExtent, extent)) { - alert(mapp.dictionary.invalid_lat_lon); - // Handle the case where the target extent is not within the current extent. - return false; - } - } - - this.Map.getView().fit( - extent, - Object.assign( - { - padding: [50, 50, 50, 50], - duration: 1000 - }, - opt_options) - ) - - return true; + this.Map.getView().fit(extent, { + padding: [50, 50, 50, 50], + duration: 1000, + ...options + }) } \ No newline at end of file diff --git a/lib/ui/Gazetteer.mjs b/lib/ui/Gazetteer.mjs index 809b370269..0ba171840c 100644 --- a/lib/ui/Gazetteer.mjs +++ b/lib/ui/Gazetteer.mjs @@ -1,5 +1,12 @@ export default gazetteer => { + mapp.utils.merge(mapp.dictionaries, { + en: { + invalid_lat_long_range: 'Invalid coordinates: Latitude and longitude values must be within valid ranges.', + invalid_lat_lon: 'The provided Coordinates do not fall within the selected Locale.' + } + }) + gazetteer.input = mapp.utils.html.node`` @@ -16,12 +23,6 @@ export default gazetteer => { gazetteer.input.addEventListener('focus', search) - mapp.utils.merge(mapp.dictionaries, { - en: { - invalid_lat_long_range: 'Invalid coordinates: Latitude and longitude values must be within valid ranges.' - } - }) - function search(e) { // Clear results @@ -35,33 +36,32 @@ export default gazetteer => { // Check whether coordinates are valid float values. if (ll.length === 2 && ll.every(n => typeof n === 'number' && !isNaN(n) && isFinite(n))) { + // Check if both coordinates are within valid range (latitude: -90 to 90, longitude: -180 to 180). const [lat, lng] = ll; + if (lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180) { gazetteer.list.appendChild(mapp.utils.html.node` -
  • { +
  • { mapp.utils.gazetteer.getLocation({ label: `Latitude:${ll[0]}, Longitude:${ll[1]}`, source: 'Coordinates', lng: ll[1], lat: ll[0] }, gazetteer); - }} - > - Latitude:${ll[0]}, Longitude:${ll[1]} -
  • - `); + }}>Latitude:${ll[0]}, Longitude:${ll[1]}`); + // Do not search if coordinates are provided. return; + } else { + + // Handle the case where coordinates are not within valid ranges. // Add the error as a list item gazetteer.list.appendChild(mapp.utils.html.node`
  • - ${mapp.dictionary.invalid_lat_long_range} -
  • - `); - // Handle the case where coordinates are not within valid ranges. + ${mapp.dictionary.invalid_lat_long_range}`); + } } diff --git a/lib/utils/gazetteer.mjs b/lib/utils/gazetteer.mjs index 17f5daa7a1..93f5011e21 100644 --- a/lib/utils/gazetteer.mjs +++ b/lib/utils/gazetteer.mjs @@ -6,20 +6,7 @@ export function datasets(term, gazetteer) { // Abort current dataset query. Onload will not be called. gazetteer.xhr?.abort() gazetteer.xhr = new XMLHttpRequest() - gazetteer.qterm && search({ - layer: gazetteer.layer, - table: gazetteer.table, - query: gazetteer.query, - qterm: gazetteer.qterm, - label: gazetteer.label, - title: gazetteer.title, - limit: gazetteer.limit, - no_result: gazetteer.no_result, - leading_wildcard: gazetteer.leading_wildcard, - callback: gazetteer.callback, - maxZoom: gazetteer.maxZoom, - xhr: gazetteer.xhr - }) + gazetteer.qterm && search(gazetteer) } // Search additional datasets. @@ -128,6 +115,17 @@ export function getLocation(location, gazetteer) { return; } + const coord = ol.proj.transform( + [location.lng, location.lat], + `EPSG:4326`, + `EPSG:${gazetteer.mapview.srid}` + ) + + if (!ol.extent.containsCoordinate(gazetteer.mapview.extent, coord)) { + alert(mapp.dictionary.invalid_lat_lon); + return; + } + Object.assign(location, { layer: { mapview: gazetteer.mapview @@ -165,8 +163,5 @@ export function getLocation(location, gazetteer) { gazetteer.mapview.locations[location.hook] = location - if (!location.flyTo(gazetteer.maxZoom, gazetteer.mapview.extent)) { - // Handle the case where the target extent is not within the current extent. - location.remove(); - } + location.flyTo(gazetteer.maxZoom) } \ No newline at end of file From a893046a145fdf301f1a62892e939caefd9f9b2f Mon Sep 17 00:00:00 2001 From: dbauszus-glx Date: Wed, 24 Jan 2024 18:51:25 +0000 Subject: [PATCH 11/11] added German translation --- lib/ui/Gazetteer.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/ui/Gazetteer.mjs b/lib/ui/Gazetteer.mjs index 0ba171840c..e2a3fc2405 100644 --- a/lib/ui/Gazetteer.mjs +++ b/lib/ui/Gazetteer.mjs @@ -4,6 +4,10 @@ export default gazetteer => { en: { invalid_lat_long_range: 'Invalid coordinates: Latitude and longitude values must be within valid ranges.', invalid_lat_lon: 'The provided Coordinates do not fall within the selected Locale.' + }, + de: { + invalid_lat_long_range: 'Falsche Eingabe von Latitude / Longitude.', + invalid_lat_lon: 'Koordinate liegt außerhalb der Lokale.' } })