Skip to content

Commit b49f627

Browse files
committed
Add grunt plugin to generate locale, localeFr keys for DefaultMapOptions.js
1 parent 8900ec6 commit b49f627

File tree

8 files changed

+76
-142
lines changed

8 files changed

+76
-142
lines changed

Gruntfile.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
module.exports = function(grunt) {
2-
const Diff = require('diff');
3-
const nodeResolve = require('@rollup/plugin-node-resolve');
4-
grunt.initConfig({
2+
const Diff = require('diff');
3+
const nodeResolve = require('@rollup/plugin-node-resolve');
4+
const loadLocalePlugin = require('./load-locales.js');
5+
grunt.initConfig({
56
pkg: grunt.file.readJSON('package.json'),
67
cssmin: {
78
options: {
@@ -193,7 +194,7 @@ module.exports = function(grunt) {
193194
rollup: {
194195
options: {
195196
format: 'es',
196-
plugins: [nodeResolve()],
197+
plugins: [nodeResolve(),loadLocalePlugin()],
197198
external: './pmtilesRules.js'
198199
},
199200
main: {

load-locales.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// load-locales.js
2+
const fs = require('fs');
3+
const path = require('path');
4+
5+
function loadLocalePlugin() {
6+
return {
7+
name: 'load-locale',
8+
resolveId(source) {
9+
if (source === 'generated-locale') return source;
10+
return null;
11+
},
12+
load(id) {
13+
if (id === 'generated-locale') {
14+
// Load and process each language's messages.json file
15+
const enMessagesPath = path.resolve(__dirname, 'node_modules/mapml-extension/src/_locales/en/messages.json');
16+
const frMessagesPath = path.resolve(__dirname, 'node_modules/mapml-extension/src/_locales/fr/messages.json');
17+
18+
const enMessages = JSON.parse(fs.readFileSync(enMessagesPath, 'utf-8'));
19+
const frMessages = JSON.parse(fs.readFileSync(frMessagesPath, 'utf-8'));
20+
21+
// Function to transform messages.json content to the desired structure
22+
const transformMessages = (messages) => {
23+
return Object.keys(messages).reduce((acc, key) => {
24+
if (key !== 'extName' && key !== 'extDescription') {
25+
acc[key] = messages[key].message;
26+
}
27+
return acc;
28+
}, {});
29+
};
30+
31+
// Generate locale objects
32+
const locale = transformMessages(enMessages);
33+
const localeFr = transformMessages(frMessages);
34+
35+
// Export the transformed objects
36+
return `export const locale = ${JSON.stringify(locale)};
37+
export const localeFr = ${JSON.stringify(localeFr)};`;
38+
}
39+
return null;
40+
41+
}
42+
};
43+
}
44+
45+
module.exports = loadLocalePlugin;

package-lock.json

Lines changed: 14 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"devDependencies": {
3838
"@playwright/test": "^1.39.0",
3939
"@rollup/plugin-node-resolve": "^15.2.3",
40+
"mapml-extension": "git+https://github.com/Maps4HTML/mapml-extension",
4041
"diff": "^5.1.0",
4142
"express": "^4.17.1",
4243
"grunt": "^1.4.0",

src/mapml/DefaultMapOptions.js

Lines changed: 4 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -1,139 +1,11 @@
1+
import { locale, localeFr } from 'generated-locale';
2+
13
export var Options = {
24
featureIndexOverlayOption: false,
35
announceMovement: false,
46
announceScale: { metric: true, imperial: false },
57
defaultExtCoor: 'pcrs',
68
defaultLocCoor: 'gcrs',
7-
locale: {
8-
cmBack: 'Back',
9-
cmForward: 'Forward',
10-
cmReload: 'Reload',
11-
cmToggleControls: 'Toggle Controls',
12-
cmCopyCoords: 'Copy',
13-
cmCopyMapML: 'Map',
14-
cmCopyExtent: 'Extent',
15-
cmCopyLocation: 'Location',
16-
cmToggleDebug: 'Toggle Debug Mode',
17-
cmPasteLayer: 'Paste',
18-
cmViewSource: 'View Map Source',
19-
lmZoomToLayer: 'Zoom To Layer',
20-
lmCopyLayer: 'Copy Layer',
21-
lmLayerSettings: 'Layer Settings',
22-
lmRemoveLayer: 'Remove Layer',
23-
lmZoomToExtent: 'Zoom To Sub-layer',
24-
lmCopyExtent: 'Copy Sub-layer',
25-
lmExtentSettings: 'Sub-layer Settings',
26-
lmRemoveExtent: 'Remove Sub-layer',
27-
lmStyle: 'Style',
28-
lcOpacity: 'Opacity',
29-
btnAttribution: 'Map data attribution',
30-
btnZoomIn: 'Zoom in',
31-
btnZoomOut: 'Zoom out',
32-
btnFullScreen: 'View Fullscreen',
33-
btnExitFullScreen: 'Exit Fullscreen',
34-
btnLocTrackOn: 'Show my location - location tracking on',
35-
btnMyLocTrackOn: 'My current location, shown on map',
36-
btnLocTrackOff: 'Show my location - location tracking off',
37-
btnLocTrackLastKnown: 'Show my location - last known location shown',
38-
btnMyLastKnownLocTrackOn: 'My last known location, shown on map',
39-
amZoom: 'zoom level',
40-
amColumn: 'column',
41-
amRow: 'row',
42-
amMaxZoom: 'At maximum zoom level, zoom in disabled',
43-
amMinZoom: 'At minimum zoom level, zoom out disabled',
44-
amZoomedOut: 'Zoomed out of bounds, returning to',
45-
amDraggedOut: 'Dragged out of bounds, returning to',
46-
amEastBound: 'Reached east bound, panning east disabled',
47-
amWestBound: 'Reached west bound, panning west disabled',
48-
amNorthBound: 'Reached north bound, panning north disabled',
49-
amSouthBound: 'Reached south bound, panning south disabled',
50-
kbdShortcuts: 'Keyboard shortcuts',
51-
kbdMovement: 'Movement keys',
52-
kbdFeature: 'Feature navigation keys',
53-
kbdPanUp: 'Pan up',
54-
kbdPanDown: 'Pan down',
55-
kbdPanLeft: 'Pan left',
56-
kbdPanRight: 'Pan right',
57-
kbdPanIncrement: 'pan increment',
58-
kbdZoom: 'Zoom in/out 3 levels',
59-
kbdFocusMap: 'Focus map',
60-
kbdFocusControls: 'Focus controls',
61-
kbdPrevFeature: 'Previous feature',
62-
kbdNextFeature: 'Next feature',
63-
dfLayer: 'Layer',
64-
dfExtent: 'Sub-layer',
65-
dfPastedLayer: 'Pasted layer',
66-
dfFeatureCaption: 'Feature',
67-
popupZoom: 'Zoom to here',
68-
popupPropName: 'Property name',
69-
popupPropValue: 'Property value',
70-
fIndexNoFeatures: 'No features found'
71-
},
72-
localeFr: {
73-
cmBack: 'Retour',
74-
cmForward: "Vers l'avant",
75-
cmReload: 'Rechargez',
76-
cmToggleControls: 'Basculer les contrôles',
77-
cmCopyCoords: 'Copie',
78-
cmToggleDebug: 'Basculer le mode de débogage',
79-
cmCopyMapML: 'Carte',
80-
cmCopyExtent: 'Étendue',
81-
cmCopyLocation: 'Localisation',
82-
cmPasteLayer: 'Coller',
83-
cmViewSource: 'Voir la source de la carte',
84-
lmZoomToLayer: 'Zoomer sur la couche',
85-
lmCopyLayer: 'Copier (la couche)',
86-
lmLayerSettings: 'Paramètres de la couche',
87-
lmRemoveLayer: 'Supprimer la couche',
88-
lmZoomToExtent: 'Zoomer sur la sous-couche',
89-
lmCopyExtent: 'Copier (la sous-couche)',
90-
lmExtentSettings: 'Paramètres de la sous-couche',
91-
lmRemoveExtent: 'Supprimer la sous-couche',
92-
lmStyle: 'Style',
93-
lcOpacity: 'Opacité',
94-
btnZoomIn: 'Zoomer',
95-
btnZoomOut: 'Dézoomer',
96-
btnAttribution: 'Attribution des données cartographiques',
97-
btnFullScreen: 'Affichage plein écran',
98-
btnExitFullScreen: 'Quitter le plein écran',
99-
btnLocTrackOn: 'Afficher ma position - suivi de la position activé',
100-
btnMyLocTrackOn: 'Ma position actuelle, affichée sur la carte',
101-
btnLocTrackOff: 'Afficher ma position - suivi de la position désactivé',
102-
btnMyLastKnownLocTrackOn:
103-
'Ma dernière position connue, indiquée sur la carte',
104-
btnLocTrackLastKnown:
105-
'Afficher ma position - dernière position connue affichée',
106-
amZoom: 'Niveau de zoom',
107-
amColumn: 'Colonne',
108-
amRow: 'Rangée',
109-
amMaxZoom: 'Au niveau de zoom maximal, le zoom avant est désactivé',
110-
amMinZoom: 'Niveau de zoom minimum, le zoom arrière désactivé',
111-
amZoomedOut: 'Zoomé en dehors des limites, retour à',
112-
amDraggedOut: 'Traîné hors des limites, retour à',
113-
amEastBound: "Atteint la limite est, déplacement ver l'est désactivé",
114-
amWestBound: "Atteint la limite ouest, déplacement ver l'ouest désactivé",
115-
amNorthBound: 'Atteint la limite nord, déplacement vers le nord désactivé',
116-
amSouthBound: 'Atteint la limite sud, déplacement vers le sud désactivé',
117-
kbdShortcuts: 'Raccourcis clavier',
118-
kbdMovement: 'Touches de mouvement',
119-
kbdFeature: 'Touches de navigation dans les éléments géographiques',
120-
kbdPanUp: 'Panoramique vers le haut',
121-
kbdPanDown: 'Panoramique en bas',
122-
kbdPanLeft: 'Panoramique vers la gauche',
123-
kbdPanRight: 'Panoramique vers la droite',
124-
kbdPanIncrement: 'Incrémenter le panoramique',
125-
kbdZoom: 'Zoom avant/arrière 3 niveaux',
126-
kbdFocusMap: 'Centrer la carte',
127-
kbdFocusControls: 'Centrer les contrôles',
128-
kbdPrevFeature: 'Élément géographique précédente',
129-
kbdNextFeature: 'Élément géographique suivante',
130-
dfLayer: 'Couche',
131-
dfExtent: 'Sous-couche',
132-
dfPastedLayer: 'Couche collée',
133-
dfFeatureCaption: 'Élément géographique',
134-
popupZoom: 'Zoomer ici',
135-
popupPropName: 'Nom de la propriété',
136-
popupPropValue: 'Valeur de la propriété',
137-
fIndexNoFeatures: 'Aucun élément géographique trouvé'
138-
}
9+
locale,
10+
localeFr
13911
};

test/e2e/layers/multipleHeterogeneousQueryExtents.test.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ test.describe('Multiple Extent Queries with heterogeneous response content types
109109
);
110110
});
111111
test('Enusre extents that are unchecked or removed are not included in query results', async () => {
112-
await page.pause();
113112
// starting conditions
114113
let firstExtentInLayerControl = await page.$eval(
115114
'fieldset.mapml-layer-grouped-extents > fieldset:nth-child(1) span',

test/e2e/mapml-viewer/localization.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
<!doctype html>
1+
<!doctype html>
22
<html lang="en"><!-- default locale = en -->
33
<head>
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width,initial-scale=1">
66
<title>localization.html</title>
7-
<template data-testid="map-options"><map-options>{"locale":{"cmBack":"Повернутися назад","cmForward":"Перейти вперед","cmReload":"Перезавантажити","cmToggleControls":"Увімкнути/вимкнути елементи керування","cmCopyCoords":"Копіювати","cmToggleDebug":"Перемкнути на режим діагностики","cmCopyMapML":"Мапа","cmCopyExtent":"Межа екрану","cmCopyLocation":"Місцеположення","cmPasteLayer":"Вставити","cmViewSource":"Переглянути джерело мапи","lmZoomToLayer":"Збільшити до шару","lmCopyLayer":"Копіювати шар","lmLayerSettings":"Налаштування шару","lmRemoveLayer":"Видалити шар","lmZoomToExtent":"Збільшити до підшару","lmCopyExtent":"Копіювати підшар","lmExtentSettings":"Налаштування підшару","lmRemoveExtent":"Видалити підшар","lmStyle":"Стиль","lcOpacity":"Прозорість","btnAttribution":"Авторські права на дані карти","btnZoomIn":"Збільшити","btnZoomOut":"Зменшити","btnFullScreen":"Повноекранний режим","btnExitFullScreen":"Вихід з повноекранного режиму","btnLocTrackOn":"Показувати моє місцезнаходження - відстеження місцезнаходження увімкнено","btnMyLocTrackOn":"Моє поточне місцезнаходження на карті","btnLocTrackOff":"Показувати моє місцезнаходження - відстеження місцезнаходження вимкнено","btnLocTrackLastKnown":"Показати моє місцезнаходження - показано останнє відоме місцезнаходження","btnMyLastKnownLocTrackOn":"Моє останнє відоме місцезнаходження на карті","amZoom":"рівень масштабування","amColumn":"стовпчик","amRow":"рядок","amMaxZoom":"На максимальному рівні масштабування наближення вимкнено","amMinZoom":"На мінімальному рівні масштабування зменшення масштабу вимкнено","amZoomedOut":"Збільшення за межами, повернутись до","amDraggedOut":"Розширення за межами, повернутись до","amEastBound":"Досягнуто східного напрямку, панорамування на схід вимкнено","amWestBound":"Досягнуто західного напрямку, панорамування на захід вимкнено","amNorthBound":"Досягнуто північного напрямку, панорамування на північ вимкнено","amSouthBound":"Досягнуто південного напрямку, панорамування на південь вимкнено","kbdShortcuts":"Комбінації клавіш","kbdMovement":"Клавіші переміщення","kbdFeature":"Функціональні клавіші навігації","kbdPanUp":"Переміщення вгору","kbdPanDown":"Переміщення вниз","kbdPanLeft":"Переміщення ліворуч","kbdPanRight":"Переміщення праворуч","kbdPanIncrement":"крок переміщення зображення","kbdZoom":"Збільшення/зменшення на 3 рівні","kbdFocusMap":"Сфокусувати карту","kbdFocusControls":"Сфокусувати елементи керування","kbdPrevFeature":"Попередній об'єкт","kbdNextFeature":"Наступний об'єкт","dfLayer":"Шар","dfExtent":"Підшар","dfPastedLayer":"Вставлений шар","popupZoom":"Наблизити сюди","popupPropName":"Назва властивості","popupPropValue":"Значення властивості","fIndexNoFeatures":"Об'єктів не знайдено", "dfFeatureCaption": "Об'єкт"}}</map-options></template>
8-
<script>
7+
<template data-testid="map-options"><map-options>{"locale":{"cmBack":"Повернутися назад","cmForward":"Перейти вперед","cmReload":"Перезавантажити","cmToggleControls":"Увімкнути/вимкнути елементи керування","cmCopyCoords":"Копіювати","cmToggleDebug":"Перемкнути на режим діагностики","cmCopyMapML":"Мапа","cmCopyExtent":"Межа екрану","cmCopyLocation":"Місцеположення","cmPasteLayer":"Вставити","cmViewSource":"Переглянути джерело мапи","lmZoomToLayer":"Збільшити до шару","lmCopyLayer":"Копіювати шар","lmLayerSettings":"Налаштування шару","lmRemoveLayer":"Видалити шар","lmZoomToExtent":"Збільшити до підтипу шару","lmCopyExtent":"Копіювати підтип шару","lmExtentSettings":"Налаштування підшару","lmRemoveExtent":"Видалити підшар","lmStyle":"Стиль","lcOpacity":"Прозорість","btnZoomIn":"Збільшити","btnZoomOut":"Зменшити","btnAttribution":"Авторські права","btnFullScreen":"Повноекранний режим","btnExitFullScreen":"Вихід з повноекранного режиму","btnLocTrackOn":"Показувати моє місцезнаходження - відстеження місцезнаходження увімкнено","btnMyLocTrackOn":"Моє поточне місцезнаходження на карті","btnLocTrackOff":"Показувати моє місцезнаходження - відстеження місцезнаходження вимкнено","btnMyLastKnownLocTrackOn":"Моє останнє відоме місцезнаходження на карті","btnLocTrackLastKnown":"Показати моє місцезнаходження - показано останнє відоме місцезнаходження","btnFocusMap":"Карта Фокусування","btnFocusControls":"Елементи Керування Фокусуванням","btnPrevFeature":"Попередня Функція","btnNextFeature":"Наступна Функція","amZoom":"рівень масштабування","amColumn":"стовпчик","amRow":"рядок","amMaxZoom":"На максимальному рівні масштабування наближення вимкнено","amMinZoom":"На мінімальному рівні масштабування зменшення масштабу вимкнено","amZoomedOut":"Збільшення за межами, повернутись до","amDraggedOut":"Розширення за межами, повернутись до","amEastBound":"Досягнуто східного напрямку, панорамування на схід вимкнено","amWestBound":"Досягнуто західного напрямку, панорамування на захід вимкнено","amNorthBound":"Досягнуто північного напрямку, панорамування на північ вимкнено","amSouthBound":"Досягнуто південного напрямку, панорамування на південь вимкнено","kbdShortcuts":"Комбінації клавіш","kbdMovement":"Клавіші переміщення","kbdFeature":"Функціональні клавіші навігації","kbdPanUp":"Переміщення вгору","kbdPanDown":"Переміщення вниз","kbdPanLeft":"Переміщення ліворуч","kbdPanRight":"Переміщення праворуч","kbdPanIncrement":"крок переміщення зображення","kbdZoom":"Збільшення/зменшення на 3 рівні","kbdFocusMap":"Сфокусувати карту","kbdFocusControls":"Сфокусувати елементи керування","kbdPrevFeature":"Попередній об'єкт","kbdNextFeature":"Наступний об'єкт","dfLayer":"Шар","dfExtent":"Підтип шару","dfPastedLayer":"Вставлений шар","dfFeatureCaption":"Об'єкт","popupZoom":"Наблизити сюди","popupPropName":"Назва властивості","popupPropValue":"Значення властивості","fIndexNoFeatures":"Об'єктів не знайдено"}}</map-options></template>
8+
<script>
99
// this is the only way to force the browser to keep the map-options element in
1010
// the head, where it is looked for by the mapml-viewer...
1111
let options = document.querySelector("template").content.firstChild.cloneNode(true);

test/e2e/mapml-viewer/localization.test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ test.describe('<mapml-viewer> localization tests', () => {
9696
const button = buttons.nth(i);
9797
const text = await button.textContent();
9898
expect(text).toBeTruthy();
99+
// need to use startsWith because the runtime hard-codes some english
100+
// strings onto the localized string (which should be incorporated
101+
// into the localized string. e.g. "Alt+Left Arrow" and similar here:
102+
// https://github.com/Maps4HTML/MapML.js/blob/37d69c106d35f06d3592183ff999c7168626e261/src/mapml/handlers/ContextMenu.js#L53)
99103
expect(text.startsWith(locale[cmLocaleList[i]])).toBe(true);
100104
}
101105
}

0 commit comments

Comments
 (0)