From 0463e49e08c5e1b12c0259715cc20af3581a4531 Mon Sep 17 00:00:00 2001 From: Florian Kellner Date: Wed, 21 Feb 2024 16:44:24 +0100 Subject: [PATCH 1/3] geosolutions-it#10158: tooltip enhancer adds 'aria-label' with l10n Modify tooltip enhancer to also provide `aria-label`-property to wrapped objects (most commonly glyph-only buttons). Does localization on a best-effort basis, trying to unwrap messages passed in as tooltip prop. On Behalf of DB Systel --- .../misc/enhancers/__tests__/tooltip-test.jsx | 18 ++++++++++ .../components/misc/enhancers/tooltip.jsx | 34 ++++++++++++++----- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/web/client/components/misc/enhancers/__tests__/tooltip-test.jsx b/web/client/components/misc/enhancers/__tests__/tooltip-test.jsx index 8b90da7b92..4f5eb54663 100644 --- a/web/client/components/misc/enhancers/__tests__/tooltip-test.jsx +++ b/web/client/components/misc/enhancers/__tests__/tooltip-test.jsx @@ -12,6 +12,13 @@ import React from 'react'; import ReactDOM from 'react-dom'; import tooltip from '../tooltip'; import { Button } from 'react-bootstrap'; +import Message from "../../../I18N/HTML"; +import Localized from "../../../I18N/Localized"; + +const messages = { + "testMsg": "my message" +}; + describe("tooltip enhancer", () => { beforeEach((done) => { document.body.innerHTML = '
'; @@ -38,5 +45,16 @@ describe("tooltip enhancer", () => { el.click(); expect(el.getAttribute('aria-describedby')).toExist(); }); + it('adds an aria-label property with localized content', () => { + const CMP = tooltip(Button); + const tip = ; + ReactDOM.render( + + TEXT + , document.getElementById("container")); + const el = document.getElementById("text-cmp"); + expect(el).toExist(); + expect(el.getAttribute('aria-label')).toBe('my message'); + }); }); diff --git a/web/client/components/misc/enhancers/tooltip.jsx b/web/client/components/misc/enhancers/tooltip.jsx index 3a6403c194..bf0c958512 100644 --- a/web/client/components/misc/enhancers/tooltip.jsx +++ b/web/client/components/misc/enhancers/tooltip.jsx @@ -15,11 +15,15 @@ import { omit } from 'lodash'; /** * Tooltip enhancer. Enhances an object adding a tooltip (with i18n support). - * It is applied only if props contains `tooltip` or `tooltipId`. It have to be applied to a React (functional) component + * It is applied only if props contains `tooltip` or `tooltipId`. It has to be applied to a React (functional) component. + * The tooltip text will also be added as `aria-label` prop to the object in order to increase a11y. + * Note that if you add an i18n `Message` as a tooltip, it will be reconstructed around the tooltip so that its + * text is also available in the `aria-label` property. Passing other `node`s as tooltips is strongly discouraged, + * since it will result in an `[object Object]` `aria-label` which will help nobody. * @type {function} * @name tooltip * @memberof components.misc.enhancers - * @prop {string|node} [tooltip] if present will add the tooltip. This is the full tooltip content + * @prop {string|node} [tooltip] if present will add the tooltip. This is the full tooltip content. * @prop {string} [tooltipId] if present will show a localized tooltip using the tooltipId as msgId * @prop {string} [tooltipPosition="top"] * @prop {string} tooltipTrigger see react overlay trigger @@ -32,12 +36,26 @@ import { omit } from 'lodash'; */ export default branch( ({tooltip, tooltipId} = {}) => tooltip || tooltipId, - (Wrapped) => ({tooltip, tooltipId, tooltipPosition = "top", tooltipTrigger, keyProp, idDropDown, args, ...props} = {}) => ({tooltipId ? : tooltip}}>), + (Wrapped) => ({tooltip, tooltipId, tooltipPosition = "top", tooltipTrigger, keyProp, idDropDown, args, ...props} = {}) => + (tooltipId || (tooltip.props && tooltip.props.msgId) // this is not DRY, but constructing the within the OverlayTrigger prevents it from working + ? + { (msg) => {msg}}> + } + + : {tooltipId ? : tooltip}}> + ), // avoid to pass non needed props (Wrapped) => (props) => {props.children} ); From 53867bf8c96b1e1c04dd3175b9735df404c291b0 Mon Sep 17 00:00:00 2001 From: Florian Kellner Date: Fri, 23 Feb 2024 17:00:02 +0100 Subject: [PATCH 2/3] geosolutions-it#10158: refactor more buttons to use tooltip enhancer Use accessible tooltip enhancer in Locate, Redo, Undo, Zoom and Toggle button components On Behalf of DB Systel --- .../components/buttons/FullScreenButton.jsx | 3 +- .../buttons/GlobeViewSwitcherButton.jsx | 3 +- .../components/buttons/ToggleButton.jsx | 37 +++--- web/client/components/buttons/ZoomButton.jsx | 48 +++----- .../mapcontrols/locate/LocateBtn.jsx | 52 ++++----- .../navigationhistory/RedoButton.jsx | 52 +++------ .../navigationhistory/UndoButton.jsx | 51 +++------ .../mapcontrols/search/SearchBar.jsx | 107 +++++++++--------- web/client/components/misc/Button.jsx | 2 +- web/client/plugins/MousePosition.jsx | 3 +- web/client/product/components/viewer/Home.jsx | 3 +- 11 files changed, 163 insertions(+), 198 deletions(-) diff --git a/web/client/components/buttons/FullScreenButton.jsx b/web/client/components/buttons/FullScreenButton.jsx index 8c657fbf27..825663d4db 100644 --- a/web/client/components/buttons/FullScreenButton.jsx +++ b/web/client/components/buttons/FullScreenButton.jsx @@ -11,7 +11,6 @@ import PropTypes from 'prop-types'; import React from 'react'; import ToggleButton from './ToggleButton'; -import { Tooltip } from 'react-bootstrap'; import Message from '../I18N/Message'; /** @@ -86,7 +85,7 @@ class FullScreenButton extends React.Component { }; render() { - return (} />); + return (} />); } } diff --git a/web/client/components/buttons/GlobeViewSwitcherButton.jsx b/web/client/components/buttons/GlobeViewSwitcherButton.jsx index 06fdc2ca7a..413f8895e6 100644 --- a/web/client/components/buttons/GlobeViewSwitcherButton.jsx +++ b/web/client/components/buttons/GlobeViewSwitcherButton.jsx @@ -10,7 +10,6 @@ import React from 'react'; import PropTypes from 'prop-types'; import ToggleButton from './ToggleButton'; -import { Tooltip } from 'react-bootstrap'; import Message from '../I18N/Message'; /** @@ -85,7 +84,7 @@ class GlobeViewSwitcherButton extends React.Component { }; render() { - return } />; + return } />; } } diff --git a/web/client/components/buttons/ToggleButton.jsx b/web/client/components/buttons/ToggleButton.jsx index e838721f52..b788283599 100644 --- a/web/client/components/buttons/ToggleButton.jsx +++ b/web/client/components/buttons/ToggleButton.jsx @@ -11,8 +11,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Glyphicon } from 'react-bootstrap'; import OverlayTrigger from '../misc/OverlayTrigger'; -import Button from '../misc/Button'; +import {ButtonWithTooltip} from '../misc/Button'; import ImageButton from './ImageButton'; +import tooltip from "../misc/enhancers/tooltip"; /** * Toggle button with tooltip and icons or image support. * @memberof components.buttons @@ -70,18 +71,36 @@ class ToggleButton extends React.Component { renderNormalButton = () => { return ( - + ); }; renderImageButton = () => { + const ImageButtonT = tooltip(ImageButton); return ( - + ); }; @@ -94,15 +113,7 @@ class ToggleButton extends React.Component { }; render() { - var retval; - var btn = this.props.btnType === 'normal' ? this.renderNormalButton() : this.renderImageButton(); - if (this.props.tooltip) { - retval = this.addTooltip(btn); - } else { - retval = btn; - } - return retval; - + return this.props.btnType === 'normal' ? this.renderNormalButton() : this.renderImageButton(); } } diff --git a/web/client/components/buttons/ZoomButton.jsx b/web/client/components/buttons/ZoomButton.jsx index d855c88a68..e07644312a 100644 --- a/web/client/components/buttons/ZoomButton.jsx +++ b/web/client/components/buttons/ZoomButton.jsx @@ -10,9 +10,8 @@ import PropTypes from 'prop-types'; import React from 'react'; -import Button from '../misc/Button'; -import { Glyphicon, Tooltip } from 'react-bootstrap'; -import OverlayTrigger from '../misc/OverlayTrigger'; +import { ButtonWithTooltip } from '../misc/Button'; +import { Glyphicon } from 'react-bootstrap'; class ZoomButton extends React.Component { static propTypes = { @@ -49,34 +48,23 @@ class ZoomButton extends React.Component { }; render() { - return this.addTooltip( - - ); + return ( this.props.onZoom(this.props.currentZoom + this.props.step)} + className={this.props.className} + disabled={this.props.currentZoom + this.props.step > this.props.maxZoom || this.props.currentZoom + this.props.step < this.props.minZoom} + bsStyle={this.props.bsStyle} + tooltip={this.props.tooltip} + tooltipPosition={this.props.tooltipPlace} + keyProp={"overlay-trigger." + this.props.id} + > + {this.props.glyphicon ? : null} + {this.props.glyphicon && this.props.text ? "\u00A0" : null} + {this.props.text} + {this.props.help} + ); } - - addTooltip = (btn) => { - if (!this.props.tooltip) { - return btn; - } - let tooltip = {this.props.tooltip}; - return ( - - {btn} - - ); - }; } export default ZoomButton; diff --git a/web/client/components/mapcontrols/locate/LocateBtn.jsx b/web/client/components/mapcontrols/locate/LocateBtn.jsx index e98cddbc2a..381fa5e442 100644 --- a/web/client/components/mapcontrols/locate/LocateBtn.jsx +++ b/web/client/components/mapcontrols/locate/LocateBtn.jsx @@ -8,12 +8,10 @@ import PropTypes from 'prop-types'; import React from 'react'; -import {Glyphicon, Tooltip} from 'react-bootstrap'; +import {Glyphicon} from 'react-bootstrap'; -import Message from '../../I18N/Message'; -import OverlayTrigger from '../../misc/OverlayTrigger'; import defaultIcon from '../../misc/spinners/InlineSpinner/img/spinner.gif'; -import Button from '../../misc/Button'; +import {ButtonWithTooltip} from '../../misc/Button'; import('./css/locate.css'); let checkingGeoLocation = false; @@ -74,9 +72,19 @@ class LocateBtn extends React.Component { renderButton = () => { const geoLocationDisabled = this.props.locate === "PERMISSION_DENIED"; return ( - + ); }; @@ -91,18 +99,18 @@ class LocateBtn extends React.Component { }} alt="..." />) ; return ( - - ); - }; - - addTooltip = (btn) => { - const tooltip = ; - return ( - - {btn} - + ); }; @@ -130,15 +138,7 @@ class LocateBtn extends React.Component { } render() { - var retval; - var btn = this.props.locate === "LOCATING" ? this.renderLoadingButton() : this.renderButton(); - if (this.props.tooltip) { - retval = this.addTooltip(btn); - } else { - retval = btn; - } - return retval; - + return this.props.locate === "LOCATING" ? this.renderLoadingButton() : this.renderButton(); } getBtnStyle = () => { diff --git a/web/client/components/mapcontrols/navigationhistory/RedoButton.jsx b/web/client/components/mapcontrols/navigationhistory/RedoButton.jsx index 5c2594c746..1fe058eca2 100644 --- a/web/client/components/mapcontrols/navigationhistory/RedoButton.jsx +++ b/web/client/components/mapcontrols/navigationhistory/RedoButton.jsx @@ -9,10 +9,8 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Glyphicon, Tooltip } from 'react-bootstrap'; - -import OverlayTrigger from '../../misc/OverlayTrigger'; -import Button from '../../misc/Button'; +import { Glyphicon } from 'react-bootstrap'; +import {ButtonWithTooltip} from '../../misc/Button'; class RedoBtn extends React.Component { static propTypes = { @@ -40,44 +38,28 @@ class RedoBtn extends React.Component { } }; - onClick = () => { - this.props.onClick(); - }; - shouldComponentUpdate(nextProps) { return this.props.disabled !== nextProps.disabled; } - renderButton = () => { - return ( - - ); - }; - - addTooltip = (btn) => { - let tooltip = {this.props.tooltip}; - return ( - - {btn} - - ); + onClick = () => { + this.props.onClick(); }; - UNSAFE_componentWillMount() { - // none - } - render() { - var retval; - var btn = this.renderButton(); - if (this.props.tooltip) { - retval = this.addTooltip(btn); - } else { - retval = btn; - } - return retval; + return ( + {this.props.text}{this.props.help} + ); } } diff --git a/web/client/components/mapcontrols/navigationhistory/UndoButton.jsx b/web/client/components/mapcontrols/navigationhistory/UndoButton.jsx index fd32e5876d..f3967a506e 100644 --- a/web/client/components/mapcontrols/navigationhistory/UndoButton.jsx +++ b/web/client/components/mapcontrols/navigationhistory/UndoButton.jsx @@ -10,9 +10,8 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Glyphicon, Tooltip } from 'react-bootstrap'; -import OverlayTrigger from '../../misc/OverlayTrigger'; -import Button from '../../misc/Button'; +import { Glyphicon } from 'react-bootstrap'; +import {ButtonWithTooltip} from '../../misc/Button'; class UndoBtn extends React.Component { static propTypes = { @@ -40,44 +39,30 @@ class UndoBtn extends React.Component { } }; - onClick = () => { - this.props.onClick(); - }; - shouldComponentUpdate(nextProps) { return this.props.disabled !== nextProps.disabled; } - renderButton = () => { - return ( - - ); + onClick = () => { + this.props.onClick(); }; - addTooltip = (btn) => { - let tooltip = {this.props.tooltip}; + render() { return ( - - {btn} - + + {this.props.text}{this.props.help} + ); - }; - - UNSAFE_componentWillMount() { - // none - } - - render() { - var retval; - var btn = this.renderButton(); - if (this.props.tooltip) { - retval = this.addTooltip(btn); - } else { - retval = btn; - } - return retval; } } diff --git a/web/client/components/mapcontrols/search/SearchBar.jsx b/web/client/components/mapcontrols/search/SearchBar.jsx index d9a3b757f8..423a07dfa6 100644 --- a/web/client/components/mapcontrols/search/SearchBar.jsx +++ b/web/client/components/mapcontrols/search/SearchBar.jsx @@ -230,59 +230,62 @@ export default ({ activeTool === "bookmarkSearch" && showBookMarkSearchOption && } - target === 'button') - .map(({ component: Element }) => ({ - visible: !!showOptions, - Element - })), - { - glyph: removeIcon, - className: "square-button-md no-border", - bsStyle: "default", - pullRight: true, - loading: !isUndefined(loading) && loading, - visible: activeTool === "addressSearch" && - (searchText !== "" || selectedItems && selectedItems.length > 0), - onClick: () => { - if (activeTool === "addressSearch") { - clearSearch(); - } - }, - ...(activeTool === "coordinatesSearch" && - CoordinateOptions.removeIcon(activeTool, coordinate, onClearCoordinatesSearch, onChangeCoord)) - }, { - glyph: searchIcon, - className: "square-button-md no-border " + - (isSearchClickable || activeTool !== "addressSearch" ? "magnifying-glass clickable" : "magnifying-glass"), - bsStyle: "default", - pullRight: true, - tooltipPosition: "bottom", - visible: activeTool === "addressSearch" && - (!(searchText !== "" || selectedItems && selectedItems.length > 0) || !splitTools), - onClick: () => isSearchClickable && search(), - ...(activeTool === "coordinatesSearch" && - CoordinateOptions.searchIcon(activeTool, coordinate, onZoomToPoint, defaultZoomLevel)), - ...(activeTool === "bookmarkSearch" && + + {(searchButtonText) => target === 'button') + .map(({ component: Element }) => ({ + visible: !!showOptions, + Element + })), + { + glyph: removeIcon, + className: "square-button-md no-border", + bsStyle: "default", + pullRight: true, + loading: !isUndefined(loading) && loading, + visible: activeTool === "addressSearch" && + (searchText !== "" || selectedItems && selectedItems.length > 0), + onClick: () => { + if (activeTool === "addressSearch") { + clearSearch(); + } + }, + ...(activeTool === "coordinatesSearch" && + CoordinateOptions.removeIcon(activeTool, coordinate, onClearCoordinatesSearch, onChangeCoord)) + }, { + glyph: searchIcon, + className: "square-button-md no-border " + + (isSearchClickable || activeTool !== "addressSearch" ? "magnifying-glass clickable" : "magnifying-glass"), + bsStyle: "default", + pullRight: true, + tooltipPosition: "bottom", + 'aria-label': searchButtonText, + visible: activeTool === "addressSearch" && + (!(searchText !== "" || selectedItems && selectedItems.length > 0) || !splitTools), + onClick: () => isSearchClickable && search(), + ...(activeTool === "coordinatesSearch" && + CoordinateOptions.searchIcon(activeTool, coordinate, onZoomToPoint, defaultZoomLevel)), + ...(activeTool === "bookmarkSearch" && BookmarkOptions.searchIcon(activeTool, props)) - }, { - tooltip: getError(error), - tooltipPosition: "bottom", - className: "square-button-md no-border", - glyph: "warning-sign", - bsStyle: "danger", - glyphClassName: "searcherror", - visible: !!error, - onClick: clearSearch - }, { - visible: showOptions, - renderButton: - }]} - /> + }, { + tooltip: getError(error), + tooltipPosition: "bottom", + className: "square-button-md no-border", + glyph: "warning-sign", + bsStyle: "danger", + glyphClassName: "searcherror", + visible: !!error, + onClick: clearSearch + }, { + visible: showOptions, + renderButton: + }]} + />} + ); diff --git a/web/client/components/misc/Button.jsx b/web/client/components/misc/Button.jsx index 34db94318d..7431f56df1 100644 --- a/web/client/components/misc/Button.jsx +++ b/web/client/components/misc/Button.jsx @@ -13,4 +13,4 @@ import tooltip from './enhancers/tooltip'; export default buttonWithDisabled(Button); -export const ButtonWithTooltip = tooltip(Button); +export const ButtonWithTooltip = tooltip(buttonWithDisabled(Button)); diff --git a/web/client/plugins/MousePosition.jsx b/web/client/plugins/MousePosition.jsx index e498210643..77f206d24a 100644 --- a/web/client/plugins/MousePosition.jsx +++ b/web/client/plugins/MousePosition.jsx @@ -10,7 +10,6 @@ import { get } from 'lodash'; import assign from 'object-assign'; import PropTypes from 'prop-types'; import React from 'react'; -import { Tooltip } from 'react-bootstrap'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; @@ -58,7 +57,7 @@ const selector = createSelector([ const MousePositionButton = connect((state) => ({ pressed: isMouseMoveCoordinatesActiveSelector(state), active: isMouseMoveCoordinatesActiveSelector(state), - tooltip: , + tooltip: , tooltipPlace: 'left', pressedStyle: "success active", defaultStyle: "primary", diff --git a/web/client/product/components/viewer/Home.jsx b/web/client/product/components/viewer/Home.jsx index 2f649ea09f..03fb0c07a2 100644 --- a/web/client/product/components/viewer/Home.jsx +++ b/web/client/product/components/viewer/Home.jsx @@ -32,7 +32,6 @@ class Home extends React.Component { }; render() { - let tooltip = {this.props.buttonTooltip}; return ( } onClick={this.goHome} - tooltip={tooltip} + tooltip={this.props.buttonTooltip} tooltipPlace="left" /> ); From 04251140e2394c069972d8349b0450d1d0431273 Mon Sep 17 00:00:00 2001 From: Florian Kellner Date: Thu, 4 Apr 2024 12:57:50 +0200 Subject: [PATCH 3/3] geosolutions-it#10158: add aria-labels to maps search bar and home button This required adding some new text to the translation dictionaries. On Behalf of DB Systel --- web/client/components/home/Home.jsx | 23 ++-- .../components/maps/search/SearchBar.jsx | 116 +++++++++--------- web/client/product/components/viewer/Home.jsx | 2 +- web/client/translations/data.da-DK.json | 3 +- web/client/translations/data.de-DE.json | 3 +- web/client/translations/data.en-US.json | 3 +- web/client/translations/data.es-ES.json | 3 +- web/client/translations/data.fi-FI.json | 3 +- web/client/translations/data.fr-FR.json | 3 +- web/client/translations/data.hr-HR.json | 3 +- web/client/translations/data.is-IS.json | 3 +- web/client/translations/data.it-IT.json | 3 +- web/client/translations/data.nl-NL.json | 3 +- web/client/translations/data.pt-PT.json | 3 +- web/client/translations/data.sk-SK.json | 3 +- web/client/translations/data.sv-SE.json | 3 +- web/client/translations/data.vi-VN.json | 1 + web/client/translations/data.zh-ZH.json | 3 +- 18 files changed, 103 insertions(+), 81 deletions(-) diff --git a/web/client/components/home/Home.jsx b/web/client/components/home/Home.jsx index 8e545b9518..49f0a621c2 100644 --- a/web/client/components/home/Home.jsx +++ b/web/client/components/home/Home.jsx @@ -49,16 +49,19 @@ class Home extends React.Component { let tooltip = {}; return hidden ? false : ( - - - + + {(label) => + + } + - -
- - onSearchReset() - }, { - glyph: searchIcon, - className: "square-button-md no-border magnifying-glass clickable", - bsStyle: "default", - pullRight: true, - visible: true, - onClick: () => search() - }, { - glyph: advancedSearchIcon, - tooltip: {(searchButtonText) => ({(resetSearchText) => ( + + +
+ + onSearchReset(), + 'aria-label': resetSearchText + }, { + glyph: searchIcon, + className: "square-button-md no-border magnifying-glass clickable", + bsStyle: "default", + pullRight: true, + visible: true, + onClick: () => search(), + 'aria-label': searchButtonText + }, { + glyph: advancedSearchIcon, + tooltip: , - className: "square-button-md no-border " + + className: "square-button-md no-border " + (showAdvancedSearchPanel && showContextSearchOption ? "active" : ""), - bsStyle: isSearchFilterEmpty ? "default" : "success", - pullRight: true, - visible: showContextSearchOption, - onClick: () => { - onToggleControl("advancedsearchpanel"); - onLoadContexts('*', {params: {start: 0, limit: 12}}); - } - }]}/> -
-
- -
); + bsStyle: isSearchFilterEmpty ? "default" : "success", + pullRight: true, + visible: showContextSearchOption, + onClick: () => { + onToggleControl("advancedsearchpanel"); + onLoadContexts('*', {params: {start: 0, limit: 12}}); + } + }]}/> +
+
+ + )}
)}
); }; diff --git a/web/client/product/components/viewer/Home.jsx b/web/client/product/components/viewer/Home.jsx index 03fb0c07a2..d55dc06e09 100644 --- a/web/client/product/components/viewer/Home.jsx +++ b/web/client/product/components/viewer/Home.jsx @@ -9,7 +9,7 @@ import PropTypes from 'prop-types'; */ import React from 'react'; -import { Glyphicon, Tooltip } from 'react-bootstrap'; +import { Glyphicon } from 'react-bootstrap'; import ToggleButton from '../../../components/buttons/ToggleButton'; import Message from '../../../components/I18N/Message'; diff --git a/web/client/translations/data.da-DK.json b/web/client/translations/data.da-DK.json index 264a792164..286d94952e 100644 --- a/web/client/translations/data.da-DK.json +++ b/web/client/translations/data.da-DK.json @@ -387,7 +387,8 @@ "errorSizeExceeded": "Please, reduce the size or the quality of the images", "errorLoadingContexts": "An error occurred during contexts loading" }, - "search": "search..." + "search": "search...", + "searchButton": "Search in Maps" }, "resources": { "successSaved": "This resource has been saved correctly", diff --git a/web/client/translations/data.de-DE.json b/web/client/translations/data.de-DE.json index 56423ae1ba..665fdd41c1 100644 --- a/web/client/translations/data.de-DE.json +++ b/web/client/translations/data.de-DE.json @@ -458,7 +458,8 @@ "errorSizeExceeded": "Bitte verkleinern Sie die Größe der Details oder die Qualität der Bilder", "errorLoadingContexts": "Beim Laden des Karten-Kontexts ist ein Fehler aufgetreten" }, - "search": "Suche..." + "search": "Suche...", + "searchButton": "Suche in Karten" }, "resources": { "successSaved": "Diese Ressource wurde korrekt gespeichert", diff --git a/web/client/translations/data.en-US.json b/web/client/translations/data.en-US.json index cba52e6ada..01acd5e89d 100644 --- a/web/client/translations/data.en-US.json +++ b/web/client/translations/data.en-US.json @@ -420,7 +420,8 @@ "errorSizeExceeded": "Please, reduce the size or the quality of the images", "errorLoadingContexts": "An error occurred during contexts loading" }, - "search": "search..." + "search": "search...", + "searchButton": "Search in Maps" }, "resources": { "successSaved": "This resource has been saved correctly", diff --git a/web/client/translations/data.es-ES.json b/web/client/translations/data.es-ES.json index 0051f4b744..aa610e1d4c 100644 --- a/web/client/translations/data.es-ES.json +++ b/web/client/translations/data.es-ES.json @@ -420,7 +420,8 @@ "errorSizeExceeded": "Por favor, reduzca el tamaño de los detalles o la calidad de las imágenes", "errorLoadingContexts": "Se produjo un error durante la carga de contextos" }, - "search": "buscar..." + "search": "buscar...", + "searchButton": "Buscar mapas" }, "resources": { "successSaved": "Este recurso se ha guardado correctamente", diff --git a/web/client/translations/data.fi-FI.json b/web/client/translations/data.fi-FI.json index 1c50b8c287..bf4e52815f 100644 --- a/web/client/translations/data.fi-FI.json +++ b/web/client/translations/data.fi-FI.json @@ -278,7 +278,8 @@ "errorWhenDeleting": "Virhe poiston aikana", "errorSizeExceeded": "Pienennä yksityiskohtien kokoa tai kuvien laatua" }, - "search": "Haku..." + "search": "Haku...", + "searchButton": "Hae karttoja" }, "resources": { "successSaved": "Tämä resurssi on tallennettu oikein", diff --git a/web/client/translations/data.fr-FR.json b/web/client/translations/data.fr-FR.json index b5dfaf87ca..a404932687 100644 --- a/web/client/translations/data.fr-FR.json +++ b/web/client/translations/data.fr-FR.json @@ -420,7 +420,8 @@ "errorSizeExceeded": "S'il vous plaît, réduisez la taille ou la qualité des images", "errorLoadingContexts": "Une erreur s'est produite lors du chargement des contextes" }, - "search": "rechercher ..." + "search": "rechercher ...", + "searchButton": "Rechercher des cartes" }, "resources": { "successSaved": "Cette ressource a été enregistrée correctement", diff --git a/web/client/translations/data.hr-HR.json b/web/client/translations/data.hr-HR.json index ab967049f4..717d05a680 100644 --- a/web/client/translations/data.hr-HR.json +++ b/web/client/translations/data.hr-HR.json @@ -277,7 +277,8 @@ "errorWhenDeleting": "Došlo je do greške prilikom postupka brisanja", "errorSizeExceeded": "Molimo, smanjite veličinu detalja ili kvalitetu slika" }, - "search": "pretraži karte..." + "search": "pretraži karte...", + "searchButton": "Pretraži karte" }, "resources": { "deleteConfirmTitle": "Jeste li sigurni", diff --git a/web/client/translations/data.is-IS.json b/web/client/translations/data.is-IS.json index 2adbf295c8..602f6c7575 100644 --- a/web/client/translations/data.is-IS.json +++ b/web/client/translations/data.is-IS.json @@ -391,7 +391,8 @@ "errorSizeExceeded": "Please, reduce the size or the quality of the images", "errorLoadingContexts": "An error occurred during contexts loading" }, - "search": "search..." + "search": "search...", + "searchButton": "Search for maps" }, "resources": { "successSaved": "This resource has been saved correctly", diff --git a/web/client/translations/data.it-IT.json b/web/client/translations/data.it-IT.json index b1b8a8437e..c62f95f6fa 100644 --- a/web/client/translations/data.it-IT.json +++ b/web/client/translations/data.it-IT.json @@ -420,7 +420,8 @@ "errorSizeExceeded": "Riduci il contenuto o la qualità delle immagini", "errorLoadingContexts": "Si è verificato un errore durante il caricamento dei contesti" }, - "search": "Cerca..." + "search": "Cerca...", + "searchButton": "Cerca mappe" }, "resources": { "successSaved": "Questa risorsa è stata salvata correttamente", diff --git a/web/client/translations/data.nl-NL.json b/web/client/translations/data.nl-NL.json index 9c20490a0f..869e39f9ab 100644 --- a/web/client/translations/data.nl-NL.json +++ b/web/client/translations/data.nl-NL.json @@ -408,7 +408,8 @@ "errorSizeExceeded": "Gelieve de afbeeldingen te verkleinen of de kwaliteit te verlagen", "errorLoadingContexts": "Er is een fout opgetreden tijdens het laden van app-contexts" }, - "search": "Zoeken..." + "search": "Zoeken...", + "searchButton": "Zoek kaarten" }, "resources": { "successSaved": "Deze resource is correct opgeslagen", diff --git a/web/client/translations/data.pt-PT.json b/web/client/translations/data.pt-PT.json index 8181ada449..dc90f2d061 100644 --- a/web/client/translations/data.pt-PT.json +++ b/web/client/translations/data.pt-PT.json @@ -279,7 +279,8 @@ "errorWhenDeleting": "Ocorreu um erro durante o processo de remoção", "errorSizeExceeded": "Por favor, reduza a quantidade dos detalhes ou a qualidade das imagens" }, - "search": "pesquisar..." + "search": "pesquisar...", + "searchButton": "Pesquisar mapas" }, "resources": { "deleteConfirmTitle": "Tem a certeza", diff --git a/web/client/translations/data.sk-SK.json b/web/client/translations/data.sk-SK.json index 658c7f8e63..bf14e9c811 100644 --- a/web/client/translations/data.sk-SK.json +++ b/web/client/translations/data.sk-SK.json @@ -371,7 +371,8 @@ "errorSizeExceeded": "Prosím, zníž veľkosť alebo kvalitu obrázkov", "errorLoadingContexts": "An error occurred during contexts loading" }, - "search": "Vyhľadávanie..." + "search": "Vyhľadávanie...", + "searchButton": "Vyhľadajte mapy" }, "resources": { "successSaved": "Zdroj sa úspešne uložil", diff --git a/web/client/translations/data.sv-SE.json b/web/client/translations/data.sv-SE.json index c77073f50b..8d8aeaca5e 100644 --- a/web/client/translations/data.sv-SE.json +++ b/web/client/translations/data.sv-SE.json @@ -341,7 +341,8 @@ "errorSizeExceeded": "Prova att minska storleken eller kvaliteten på bilderna", "errorLoadingContexts": "Ett fel uppstod när webbkarta laddades" }, - "search": "Sök..." + "search": "Sök...", + "searchButton": "Sök kartor" }, "resources": { "successSaved": "Den här resursen har sparats korrekt", diff --git a/web/client/translations/data.vi-VN.json b/web/client/translations/data.vi-VN.json index 80cbc1703d..0cf37b0ab3 100644 --- a/web/client/translations/data.vi-VN.json +++ b/web/client/translations/data.vi-VN.json @@ -833,6 +833,7 @@ }, "removeFromFeaturedMaps": "Xóa khỏi bản đồ đặc trưng", "search": "Tìm kiếm...", + "searchButton": "Tìm kiếm bản đồ", "title": "Bản đồ" }, "markNameSelector": { diff --git a/web/client/translations/data.zh-ZH.json b/web/client/translations/data.zh-ZH.json index 4f136adee9..dbefd260ca 100644 --- a/web/client/translations/data.zh-ZH.json +++ b/web/client/translations/data.zh-ZH.json @@ -278,7 +278,8 @@ "errorWhenDeleting": "An error occurred during deleting process", "errorSizeExceeded": "Please, reduce the size of the details or the quality of the images" }, - "search": "搜索地图..." + "search": "搜索地图...", + "searchButton": "搜索地图" }, "resources": { "deleteConfirmTitle": "Are you sure",