Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions test/e2e/mapml-viewer/localization.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>localization.html</title>
<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":"Стиль","lmLegend":"Легенда","lmOpenInNewTab":"Відкрити легенду","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":"Об'єктів не знайдено","btnSearch":"Пошук","btnSearchClose":"Закрити пошук","searchPlaceholder":"Пошук\u2026","searchResultWithNoName":"Без назви"}}</map-options></template>
<script>
// this is the only way to force the browser to keep the map-options element in
// the head, where it is looked for by the mapml-viewer...
let options = document.querySelector("template").content.firstChild.cloneNode(true);
// The Ukrainian locale is injected by localization.test.js via
// page.addInitScript (window.__browserLocale), sourced from mapml-extension's
// uk/messages.json so it can never drift from the extension. The map-options
// element must be in <head> before mapml-viewer connects. When opened
// standalone (no test) it falls back to an empty locale, so the viewer still
// loads but its strings won't be localized.
let options = document.createElement('map-options');
options.textContent = JSON.stringify({ locale: window.__browserLocale || {} });
document.head.appendChild(options);

let f1 = {
Expand Down
40 changes: 34 additions & 6 deletions test/e2e/mapml-viewer/localization.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
import { test, expect, chromium } from '@playwright/test';
import fs from 'node:fs';
import path from 'node:path';
let browserLocale, enLocale, frLocale, locales;

// Load a mapml-extension locale straight from node_modules and flatten it the
// same way load-locales.js does for en/fr, so the test never drifts from the
// extension's message catalogue.
function loadLocale(lang) {
const file = path.resolve(
__dirname,
`../../../node_modules/mapml-extension/src/_locales/${lang}/messages.json`
);
const messages = JSON.parse(fs.readFileSync(file, 'utf-8'));
return Object.keys(messages).reduce((acc, key) => {
if (key !== 'extName' && key !== 'extDescription') {
acc[key] = messages[key].message;
}
return acc;
}, {});
}

test.use({
geolocation: { longitude: -73.56766530667056, latitude: 45.5027789304487 },
permissions: ['geolocation']
Expand All @@ -17,12 +36,18 @@ test.describe('<mapml-viewer> localization tests', () => {
context.pages().find((page) => page.url() === 'about:blank') ||
(await context.newPage());
page = await context.newPage();

// The Ukrainian viewer (lang="browser-language") has no bundled locale, so
// inject uk/messages.json before navigation; localization.html reads
// window.__browserLocale to build its <map-options> before the viewer
// connects. Must run before goto() so it lands at document_start.
browserLocale = loadLocale('uk');
await page.addInitScript((locale) => {
window.__browserLocale = locale;
}, browserLocale);
await page.goto('localization.html', { waitUntil: 'networkidle' });

// fetch locales and check that they are not undefined
browserLocale = await page.getByTestId('map-options').evaluate((t) => {
return JSON.parse(t.content.firstChild.textContent).locale;
});
expect(browserLocale.cmBack).toBeTruthy();
enLocale = await page.evaluate(() => M.options.localeEn);
expect(enLocale.cmBack).toBeTruthy();
Expand All @@ -45,13 +70,16 @@ test.describe('<mapml-viewer> localization tests', () => {
// for every property in enLocale, check that the corresponding
// exist in frLocale and browserLocale
for (const l in enLocale) {
expect(frLocale[l]).toBeTruthy();
expect(browserLocale[l]).toBeTruthy();
expect(frLocale[l], `french locale is missing key "${l}"`).toBeTruthy();
expect(
browserLocale[l],
`ukrainian (browser) locale is missing key "${l}"`
).toBeTruthy();
}

// for every property in frLocale, check that the corresponding is in enLocale
for (const l in frLocale) {
expect(enLocale[l]).toBeTruthy();
expect(enLocale[l], `english locale is missing key "${l}"`).toBeTruthy();
}
});

Expand Down
Loading