@projektemacher/storymapjs 0.10.6 → 0.10.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG +11 -0
- package/dist/assets/{demo-CVQ7kFek.js → demo-D6cTmzn6.js} +1 -1
- package/dist/assets/{harness-C-VZV-ou.js → harness-BPFlzutp.js} +1 -1
- package/dist/assets/main-Y-MYUSJ4.js +17 -0
- package/dist/css/fonts/font.oldstandard.css +18 -22
- package/dist/demo.html +2 -2
- package/dist/docs/migration.html +1 -1
- package/dist/embed/index.html +129 -4
- package/dist/harness.html +2 -2
- package/dist/index.html +17 -0
- package/dist/js/storymap.d.ts +126 -7
- package/dist/js/storymap.js +4518 -3613
- package/dist/js/storymap.js.map +1 -1
- package/docs/migration-from-knightlab.md +139 -0
- package/docs/storymap-as-iiif-manifest.md +510 -0
- package/package.json +6 -3
- package/src/animation/easings.ts +18 -0
- package/src/animation/morpheus.d.ts +41 -0
- package/src/core/Browser.ts +19 -0
- package/src/core/Load.ts +180 -0
- package/src/core/Util.ts +354 -0
- package/src/core/mixins.ts +171 -0
- package/src/dom/Dom.ts +31 -0
- package/src/dom/DomEvent.ts +61 -0
- package/src/globals.d.ts +16 -0
- package/src/language/Language.ts +107 -0
- package/src/language/locale/be.json +18 -0
- package/src/language/locale/bg.json +18 -0
- package/src/language/locale/cs.json +18 -0
- package/src/language/locale/de.json +20 -0
- package/src/language/locale/el.json +18 -0
- package/src/language/locale/en.json +28 -0
- package/src/language/locale/es.json +18 -0
- package/src/language/locale/et.json +18 -0
- package/src/language/locale/fr.json +18 -0
- package/src/language/locale/he.json +18 -0
- package/src/language/locale/hu.json +18 -0
- package/src/language/locale/is.json +18 -0
- package/src/language/locale/it.json +18 -0
- package/src/language/locale/jp.json +18 -0
- package/src/language/locale/ko.json +18 -0
- package/src/language/locale/nl.json +18 -0
- package/src/language/locale/nn.json +18 -0
- package/src/language/locale/no.json +18 -0
- package/src/language/locale/pl.json +18 -0
- package/src/language/locale/pt.json +18 -0
- package/src/language/locale/ru.json +18 -0
- package/src/language/locale/sk.json +18 -0
- package/src/language/locale/sr.json +17 -0
- package/src/language/locale/sv.json +18 -0
- package/src/language/locale/tr.json +18 -0
- package/src/language/locale/uk.json +18 -0
- package/src/language/locale/ur.json +18 -0
- package/src/language/locale/zh-cn.json +18 -0
- package/src/language/locale/zh-tw.json +18 -0
- package/src/main.ts +51 -0
- package/src/map/Map.ts +717 -0
- package/src/map/MapMarker.ts +149 -0
- package/src/map/openlayers/Map.OpenLayers.ts +1879 -0
- package/src/map/openlayers/MapMarker.OpenLayers.ts +176 -0
- package/src/map/openlayers/zoomifyTiles.ts +28 -0
- package/src/map/types.ts +17 -0
- package/src/media/EmbedUtil.ts +168 -0
- package/src/media/Media.ts +409 -0
- package/src/media/MediaType.ts +163 -0
- package/src/media/types/Audio.ts +87 -0
- package/src/media/types/Blockquote.ts +40 -0
- package/src/media/types/DailyMotion.ts +58 -0
- package/src/media/types/DocumentCloud.ts +41 -0
- package/src/media/types/Facebook.ts +41 -0
- package/src/media/types/Flickr.ts +115 -0
- package/src/media/types/GoogleDoc.ts +59 -0
- package/src/media/types/IFrame.ts +51 -0
- package/src/media/types/Image.ts +49 -0
- package/src/media/types/Juxtapose.ts +32 -0
- package/src/media/types/SoundCloud.ts +77 -0
- package/src/media/types/Text.ts +172 -0
- package/src/media/types/Twitter.ts +96 -0
- package/src/media/types/Video.ts +84 -0
- package/src/media/types/Vimeo.ts +65 -0
- package/src/media/types/Website.ts +36 -0
- package/src/media/types/Wikipedia.ts +124 -0
- package/src/media/types/YouTube.ts +192 -0
- package/src/scss/Typography.scss +237 -0
- package/src/scss/VCO.StoryMap.Dark.scss +138 -0
- package/src/scss/VCO.StoryMap.scss +164 -0
- package/src/scss/Variables.Dark.scss +56 -0
- package/src/scss/Variables.scss +47 -0
- package/src/scss/core/Mixins.scss +112 -0
- package/src/scss/core/Reset.scss +206 -0
- package/src/scss/fonts/_font.base.scss +113 -0
- package/src/scss/fonts/font.abril-droidsans.scss +75 -0
- package/src/scss/fonts/font.amatic-andika.scss +73 -0
- package/src/scss/fonts/font.bitter-raleway.scss +86 -0
- package/src/scss/fonts/font.clicker-garamond.scss +92 -0
- package/src/scss/fonts/font.dancing-ledger.scss +74 -0
- package/src/scss/fonts/font.default.scss +9 -0
- package/src/scss/fonts/font.fjalla-average.scss +80 -0
- package/src/scss/fonts/font.georgia-helvetica.scss +58 -0
- package/src/scss/fonts/font.knightlab.scss +97 -0
- package/src/scss/fonts/font.lustria-lato.scss +80 -0
- package/src/scss/fonts/font.medula-lato.scss +73 -0
- package/src/scss/fonts/font.oldstandard.scss +88 -0
- package/src/scss/fonts/font.opensans-gentiumbook.scss +80 -0
- package/src/scss/fonts/font.playfair-faunaone.scss +86 -0
- package/src/scss/fonts/font.playfair.scss +85 -0
- package/src/scss/fonts/font.pt.scss +90 -0
- package/src/scss/fonts/font.roboto-megrim.scss +73 -0
- package/src/scss/fonts/font.rufina-sintony.scss +73 -0
- package/src/scss/fonts/font.ubuntu.scss +78 -0
- package/src/scss/fonts/font.unicaone-vollkorn.scss +85 -0
- package/src/scss/icons/Icons.scss +239 -0
- package/src/scss/map/VCO.ImageMarker.scss +23 -0
- package/src/scss/map/VCO.Map.scss +21 -0
- package/src/scss/map/VCO.MapMarker.scss +147 -0
- package/src/scss/map/openlayers/VCO.Map.OpenLayers.scss +126 -0
- package/src/scss/media/VCO.Media.scss +222 -0
- package/src/scss/media/types/VCO.Media.Blockquote.scss +76 -0
- package/src/scss/media/types/VCO.Media.IFrame.scss +11 -0
- package/src/scss/media/types/VCO.Media.Image.scss +13 -0
- package/src/scss/media/types/VCO.Media.Instagram.scss +7 -0
- package/src/scss/media/types/VCO.Media.Profile.scss +5 -0
- package/src/scss/media/types/VCO.Media.Text.scss +90 -0
- package/src/scss/media/types/VCO.Media.Twitter.scss +87 -0
- package/src/scss/media/types/VCO.Media.Wikipedia.scss +64 -0
- package/src/scss/site/site.scss +748 -0
- package/src/scss/slider/VCO.Slide.scss +447 -0
- package/src/scss/slider/VCO.SlideNav.scss +338 -0
- package/src/scss/slider/VCO.StorySlider.scss +64 -0
- package/src/scss/snapmap/VCO.SnapMap.scss +103 -0
- package/src/scss/ui/VCO.Consent.scss +77 -0
- package/src/scss/ui/VCO.MenuBar.Button.scss +99 -0
- package/src/scss/ui/VCO.MenuBar.scss +20 -0
- package/src/scss/ui/VCO.Message.scss +104 -0
- package/src/site/site.ts +87 -0
- package/src/slider/Slide.ts +460 -0
- package/src/slider/SlideNav.ts +212 -0
- package/src/slider/StorySlider.ts +722 -0
- package/src/storymap/Consent.ts +146 -0
- package/src/storymap/StoryMap.ts +1108 -0
- package/src/storymap/iiif.ts +386 -0
- package/src/storymap/validate.ts +184 -0
- package/src/types.ts +297 -0
- package/src/ui/Draggable.ts +374 -0
- package/src/ui/MenuBar.ts +323 -0
- package/src/ui/Message.ts +118 -0
- package/src/ui/Swipable.ts +388 -0
- package/dist/assets/main-DwbXrrYn.js +0 -17
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// Mixin helpers following the TypeScript handbook mixin pattern:
|
|
2
|
+
// https://www.typescriptlang.org/docs/handbook/mixins.html
|
|
3
|
+
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any -- the handbook mixin
|
|
5
|
+
pattern requires mixin constructors to take a single any[] rest parameter
|
|
6
|
+
(see TS2545). */
|
|
7
|
+
|
|
8
|
+
/** Constructor shape accepted by the mixin functions. */
|
|
9
|
+
export type Constructor<T = object> = new (...args: any[]) => T;
|
|
10
|
+
|
|
11
|
+
/** Eventing members provided by the Evented mixin. */
|
|
12
|
+
export interface EventedInstance {
|
|
13
|
+
on: (type: string, fn: unknown, context?: unknown) => unknown;
|
|
14
|
+
off: (type: string, fn: unknown, context?: unknown) => unknown;
|
|
15
|
+
fire: (type: string, data?: unknown, target?: unknown) => unknown;
|
|
16
|
+
hasEventListeners: (type: string) => boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Instance contract for DomMixed consumers. */
|
|
20
|
+
export interface DomMixedInstance extends EventedInstance {
|
|
21
|
+
_el: Record<string, HTMLElement>;
|
|
22
|
+
data?: unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Evented
|
|
26
|
+
adds custom events functionality to a class (semantics of the former
|
|
27
|
+
core/Events class)
|
|
28
|
+
================================================== */
|
|
29
|
+
|
|
30
|
+
/** Adds eventing (on/off/fire/hasEventListeners) to a class. */
|
|
31
|
+
export function Evented<T extends Constructor>(Base: T) {
|
|
32
|
+
return class extends Base {
|
|
33
|
+
declare "_vco_events"?: Record<string, { action: unknown; context: unknown }[]>;
|
|
34
|
+
|
|
35
|
+
on(
|
|
36
|
+
/*String*/ type: string,
|
|
37
|
+
/*Function*/ fn: unknown,
|
|
38
|
+
/*(optional) Object*/ context?: unknown,
|
|
39
|
+
): this {
|
|
40
|
+
const events = (this._vco_events = this._vco_events || {});
|
|
41
|
+
events[type] = events[type] || [];
|
|
42
|
+
events[type].push({
|
|
43
|
+
action: fn,
|
|
44
|
+
context: context || this,
|
|
45
|
+
});
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
hasEventListeners(/*String*/ type: string) /*-> Boolean*/ {
|
|
50
|
+
return !!this._vco_events?.[type]?.length;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
off(
|
|
54
|
+
/*String*/ type: string,
|
|
55
|
+
/*Function*/ fn: unknown,
|
|
56
|
+
/*(optional) Object*/ context?: unknown,
|
|
57
|
+
): this {
|
|
58
|
+
if (!this.hasEventListeners(type)) {
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
const events = this._vco_events as Record<
|
|
62
|
+
string,
|
|
63
|
+
{ action: unknown; context: unknown }[]
|
|
64
|
+
>;
|
|
65
|
+
for (let i = 0, len = events[type].length; i < len; i++) {
|
|
66
|
+
if (
|
|
67
|
+
events[type][i].action === fn &&
|
|
68
|
+
(!context || events[type][i].context === context)
|
|
69
|
+
) {
|
|
70
|
+
events[type].splice(i, 1);
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
fire(
|
|
78
|
+
/*String*/ type: string,
|
|
79
|
+
/*(optional) Object*/ data?: unknown,
|
|
80
|
+
target?: unknown,
|
|
81
|
+
): this {
|
|
82
|
+
if (!this.hasEventListeners(type)) {
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const event = {
|
|
87
|
+
type: type,
|
|
88
|
+
target: target || this,
|
|
89
|
+
...(data as Record<string, unknown> | undefined),
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const listeners = (
|
|
93
|
+
this._vco_events as Record<string, { action: unknown; context: unknown }[]>
|
|
94
|
+
)[type].slice();
|
|
95
|
+
|
|
96
|
+
for (const listener of listeners) {
|
|
97
|
+
(listener.action as (e: unknown) => void).call(listener.context || this, event);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
constructor(...args: any[]) {
|
|
104
|
+
super(...args);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* DomMixed
|
|
110
|
+
DOM container conveniences, replacing the former DomMixins runtime
|
|
111
|
+
mixin (addTo/removeFrom call the onAdd/onRemove lifecycle hooks)
|
|
112
|
+
================================================== */
|
|
113
|
+
|
|
114
|
+
/** Adds DOM container conveniences (addTo/removeFrom/setPosition/show/hide
|
|
115
|
+
* and the onAdd/onRemove/onLoaded lifecycle events) to a class. */
|
|
116
|
+
export function DomMixed<T extends Constructor<DomMixedInstance>>(Base: T) {
|
|
117
|
+
return class extends Base {
|
|
118
|
+
/* Adding, Hiding, Showing etc
|
|
119
|
+
================================================== */
|
|
120
|
+
show(animate?: unknown): void {
|
|
121
|
+
if (!animate) {
|
|
122
|
+
this._el.container.style.display = "block";
|
|
123
|
+
}
|
|
124
|
+
// animated show is not implemented
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
hide(): void {
|
|
128
|
+
this._el.container.style.display = "none";
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
addTo(container: HTMLElement): this {
|
|
132
|
+
container.appendChild(this._el.container);
|
|
133
|
+
this.onAdd();
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
removeFrom(container: HTMLElement): this {
|
|
138
|
+
container.removeChild(this._el.container);
|
|
139
|
+
this.onRemove();
|
|
140
|
+
return this;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* Set the Position
|
|
144
|
+
================================================== */
|
|
145
|
+
setPosition(pos: Record<string, number>, el?: HTMLElement): this {
|
|
146
|
+
const target = el || this._el.container;
|
|
147
|
+
for (const name of Object.keys(pos)) {
|
|
148
|
+
(target.style as unknown as Record<string, string>)[name] = pos[name] + "px";
|
|
149
|
+
}
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/* Lifecycle events
|
|
154
|
+
================================================== */
|
|
155
|
+
onLoaded(): void {
|
|
156
|
+
this.fire("loaded", this.data);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
onAdd(): void {
|
|
160
|
+
this.fire("added", this.data);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
onRemove(): void {
|
|
164
|
+
this.fire("removed", this.data);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
constructor(...args: any[]) {
|
|
168
|
+
super(...args);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
}
|
package/src/dom/Dom.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* Dom
|
|
2
|
+
Utilities for working with the DOM
|
|
3
|
+
================================================= */
|
|
4
|
+
|
|
5
|
+
export default class Dom {
|
|
6
|
+
static get(id: string | HTMLElement): HTMLElement | null {
|
|
7
|
+
return typeof id === "string" ? document.getElementById(id) : id;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
static create(tagName: string, className: string, container?: HTMLElement): HTMLElement {
|
|
11
|
+
const el = document.createElement(tagName);
|
|
12
|
+
el.className = className;
|
|
13
|
+
if (container) {
|
|
14
|
+
container.appendChild(el);
|
|
15
|
+
}
|
|
16
|
+
return el;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
static getPosition(el: HTMLElement | null): { x: number; y: number } {
|
|
20
|
+
const pos = {
|
|
21
|
+
x: 0,
|
|
22
|
+
y: 0,
|
|
23
|
+
};
|
|
24
|
+
while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {
|
|
25
|
+
pos.x += el.offsetLeft;
|
|
26
|
+
pos.y += el.offsetTop;
|
|
27
|
+
el = el.offsetParent as HTMLElement | null;
|
|
28
|
+
}
|
|
29
|
+
return pos;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { stamp } from "../core/Util";
|
|
2
|
+
|
|
3
|
+
/* DomEvent
|
|
4
|
+
Inspired by Leaflet
|
|
5
|
+
DomEvent contains functions for working with DOM events.
|
|
6
|
+
================================================== */
|
|
7
|
+
|
|
8
|
+
/** Elements/objects DomEvent listeners can be attached to. */
|
|
9
|
+
type DomEventTarget = HTMLElement | Window | Document;
|
|
10
|
+
|
|
11
|
+
/** Legacy drag handlers historically mixed mouse and touch event surfaces. */
|
|
12
|
+
export type LegacyEvent = Event & {
|
|
13
|
+
originalEvent?: TouchEvent;
|
|
14
|
+
targetTouches?: TouchList;
|
|
15
|
+
pageX?: number;
|
|
16
|
+
pageY?: number;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const DomEvent = {
|
|
20
|
+
addListener: function (
|
|
21
|
+
obj: DomEventTarget,
|
|
22
|
+
type: string,
|
|
23
|
+
fn: (e: Event) => void,
|
|
24
|
+
context?: unknown,
|
|
25
|
+
): void {
|
|
26
|
+
const handler = function (e: Event) {
|
|
27
|
+
return (fn as (this: unknown, e: Event) => void).call(context || obj, e);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
obj.addEventListener(type, handler, false);
|
|
31
|
+
(obj as unknown as Record<string, unknown>)["_vco_" + type + stamp(fn)] = handler;
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
removeListener: function (
|
|
35
|
+
obj: DomEventTarget,
|
|
36
|
+
type: string,
|
|
37
|
+
fn: (e: Event) => void,
|
|
38
|
+
context?: unknown,
|
|
39
|
+
): void {
|
|
40
|
+
const key = "_vco_" + type + stamp(fn);
|
|
41
|
+
const handler = (obj as unknown as Record<string, unknown>)[key];
|
|
42
|
+
|
|
43
|
+
if (!handler) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
obj.removeEventListener(type, handler as EventListener, false);
|
|
48
|
+
(obj as unknown as Record<string, unknown>)[key] = null;
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
preventDefault: function (e: Event): void {
|
|
52
|
+
if (e.preventDefault) {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
} else {
|
|
55
|
+
e.returnValue = false;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export { DomEvent };
|
|
61
|
+
export type { DomEventTarget };
|
package/src/globals.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Externally loaded script globals (YouTube/SoundCloud player APIs).
|
|
2
|
+
// Everything the library or the test harness touches on window is typed
|
|
3
|
+
// at its usage site instead.
|
|
4
|
+
|
|
5
|
+
declare global {
|
|
6
|
+
// Externally loaded script globals
|
|
7
|
+
const YT: {
|
|
8
|
+
Player: new (el: HTMLElement | string, opts: unknown) => unknown;
|
|
9
|
+
PlayerState: Record<string, number>;
|
|
10
|
+
};
|
|
11
|
+
const SC: {
|
|
12
|
+
Widget: (el: HTMLElement) => { pause(): void };
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import be from "./locale/be.json";
|
|
2
|
+
import bg from "./locale/bg.json";
|
|
3
|
+
import cs from "./locale/cs.json";
|
|
4
|
+
import de from "./locale/de.json";
|
|
5
|
+
import el from "./locale/el.json";
|
|
6
|
+
import en from "./locale/en.json";
|
|
7
|
+
import es from "./locale/es.json";
|
|
8
|
+
import et from "./locale/et.json";
|
|
9
|
+
import fr from "./locale/fr.json";
|
|
10
|
+
import he from "./locale/he.json";
|
|
11
|
+
import hu from "./locale/hu.json";
|
|
12
|
+
import isLocale from "./locale/is.json";
|
|
13
|
+
import it from "./locale/it.json";
|
|
14
|
+
import jp from "./locale/jp.json";
|
|
15
|
+
import ko from "./locale/ko.json";
|
|
16
|
+
import nl from "./locale/nl.json";
|
|
17
|
+
import nn from "./locale/nn.json";
|
|
18
|
+
import no from "./locale/no.json";
|
|
19
|
+
import pl from "./locale/pl.json";
|
|
20
|
+
import pt from "./locale/pt.json";
|
|
21
|
+
import ru from "./locale/ru.json";
|
|
22
|
+
import sk from "./locale/sk.json";
|
|
23
|
+
import sr from "./locale/sr.json";
|
|
24
|
+
import sv from "./locale/sv.json";
|
|
25
|
+
import tr from "./locale/tr.json";
|
|
26
|
+
import uk from "./locale/uk.json";
|
|
27
|
+
import ur from "./locale/ur.json";
|
|
28
|
+
import zhCn from "./locale/zh-cn.json";
|
|
29
|
+
import zhTw from "./locale/zh-tw.json";
|
|
30
|
+
|
|
31
|
+
interface LanguageEntry {
|
|
32
|
+
buttons?: Record<string, string>;
|
|
33
|
+
messages?: Record<string, string>;
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Static locale map: the bundler-agnostic form of what `import.meta.glob`
|
|
38
|
+
// with `{ eager: true }` desugars to (works in vite dev and rollup builds).
|
|
39
|
+
const localeModules: Record<string, { default?: unknown }> = {
|
|
40
|
+
"./locale/be.json": { default: be },
|
|
41
|
+
"./locale/bg.json": { default: bg },
|
|
42
|
+
"./locale/cs.json": { default: cs },
|
|
43
|
+
"./locale/de.json": { default: de },
|
|
44
|
+
"./locale/el.json": { default: el },
|
|
45
|
+
"./locale/en.json": { default: en },
|
|
46
|
+
"./locale/es.json": { default: es },
|
|
47
|
+
"./locale/et.json": { default: et },
|
|
48
|
+
"./locale/fr.json": { default: fr },
|
|
49
|
+
"./locale/he.json": { default: he },
|
|
50
|
+
"./locale/hu.json": { default: hu },
|
|
51
|
+
"./locale/is.json": { default: isLocale },
|
|
52
|
+
"./locale/it.json": { default: it },
|
|
53
|
+
"./locale/jp.json": { default: jp },
|
|
54
|
+
"./locale/ko.json": { default: ko },
|
|
55
|
+
"./locale/nl.json": { default: nl },
|
|
56
|
+
"./locale/nn.json": { default: nn },
|
|
57
|
+
"./locale/no.json": { default: no },
|
|
58
|
+
"./locale/pl.json": { default: pl },
|
|
59
|
+
"./locale/pt.json": { default: pt },
|
|
60
|
+
"./locale/ru.json": { default: ru },
|
|
61
|
+
"./locale/sk.json": { default: sk },
|
|
62
|
+
"./locale/sr.json": { default: sr },
|
|
63
|
+
"./locale/sv.json": { default: sv },
|
|
64
|
+
"./locale/tr.json": { default: tr },
|
|
65
|
+
"./locale/uk.json": { default: uk },
|
|
66
|
+
"./locale/ur.json": { default: ur },
|
|
67
|
+
"./locale/zh-cn.json": { default: zhCn },
|
|
68
|
+
"./locale/zh-tw.json": { default: zhTw },
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const EN: Record<string, unknown> =
|
|
72
|
+
(localeModules["./locale/en.json"]?.default as Record<string, unknown> | undefined) || {};
|
|
73
|
+
|
|
74
|
+
let Language: LanguageEntry = {};
|
|
75
|
+
|
|
76
|
+
function getLanguage(code: string): Record<string, unknown> {
|
|
77
|
+
const lang = structuredClone(
|
|
78
|
+
(localeModules[`./locale/${code}.json`]?.default as Record<string, unknown> | undefined) ||
|
|
79
|
+
{},
|
|
80
|
+
);
|
|
81
|
+
for (const k in EN) {
|
|
82
|
+
if (lang[k]) {
|
|
83
|
+
if (typeof EN[k] == "object" && EN[k] !== null && typeof lang[k] == "object") {
|
|
84
|
+
// fresh object: never mutate the shared English default,
|
|
85
|
+
// otherwise one setLanguage() call would poison every later
|
|
86
|
+
// lookup (and every other language falling back to English)
|
|
87
|
+
lang[k] = Object.assign({}, EN[k] as object, lang[k]);
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
lang[k] = structuredClone(EN[k]);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return lang;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Switch the active UI language.
|
|
98
|
+
*
|
|
99
|
+
* @param code - A locale code for which a locale file exists (e.g. `"en"`).
|
|
100
|
+
* @returns The language entry that is now active.
|
|
101
|
+
*/
|
|
102
|
+
function setLanguage(code: string): LanguageEntry {
|
|
103
|
+
Language = getLanguage(code);
|
|
104
|
+
return Language;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { setLanguage, Language };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Беларуская",
|
|
3
|
+
"lang": "be",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "Загрузка",
|
|
6
|
+
"wikipedia": "Вікіпедыя",
|
|
7
|
+
"start": "Start Exploring"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "Прагляд мапы",
|
|
11
|
+
"overview": "Прагляд",
|
|
12
|
+
"backtostart": "Вярнуцца ў пачатак",
|
|
13
|
+
"collapse_toggle": "Схаваць мапу",
|
|
14
|
+
"uncollapse_toggle": "Паказаць мапу",
|
|
15
|
+
"swipe_to_navigate": "Swipe to Navigate<br><span class='vco-button'>OK</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Български",
|
|
3
|
+
"lang": "bg",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "Зареждане",
|
|
6
|
+
"wikipedia": "От Уикипедия, свободната енциклопедия",
|
|
7
|
+
"start": "Започнете да разглеждате"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "Преглед на картата",
|
|
11
|
+
"overview": "Преглед",
|
|
12
|
+
"backtostart": "Към началото",
|
|
13
|
+
"collapse_toggle": "Скриване на картата",
|
|
14
|
+
"uncollapse_toggle": "Показване на картата",
|
|
15
|
+
"swipe_to_navigate": "Swipe to Navigate<br><span class='vco-button'>OK</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Čeština",
|
|
3
|
+
"lang": "cs",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "Nahrávání",
|
|
6
|
+
"wikipedia": "Z Wikipedie, svobodné encyklopedie",
|
|
7
|
+
"start": "Prozkoumat"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "Přehledová mapa",
|
|
11
|
+
"overview": "Přehled",
|
|
12
|
+
"backtostart": "Zpět na začátek",
|
|
13
|
+
"collapse_toggle": "Skrýt mapu",
|
|
14
|
+
"uncollapse_toggle": "Zobrazit mapu",
|
|
15
|
+
"swipe_to_navigate": "Swipe to Navigate<br><span class='vco-button'>OK</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Deutsch",
|
|
3
|
+
"lang": "de",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "Daten werden geladen",
|
|
6
|
+
"wikipedia": "von Wikipedia, der freien Enzyklopädie",
|
|
7
|
+
"start": "Explore"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "Kartenübersicht",
|
|
11
|
+
"overview": "Kartenübersicht",
|
|
12
|
+
"backtostart": "Zurück zum Anfang",
|
|
13
|
+
"collapse_toggle": "Karte ausblenden",
|
|
14
|
+
"uncollapse_toggle": "Karte anzeigen",
|
|
15
|
+
"swipe_to_navigate": "Swipe to Navigate<br><span class='vco-button'>OK</span>",
|
|
16
|
+
"fullscreen": "Vollbild",
|
|
17
|
+
"exit_fullscreen": "Vollbild beenden"
|
|
18
|
+
},
|
|
19
|
+
"direction": "ltr"
|
|
20
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Ελληνικά",
|
|
3
|
+
"lang": "el",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "Φόρτωση",
|
|
6
|
+
"wikipedia": "Από την Wikipedia, την ελεύθερη εγκυκλοπαίδεια",
|
|
7
|
+
"start": "Έναρξη περιήγησης"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "Επισκόπηση χάρτη",
|
|
11
|
+
"overview": "Επισκόπηση",
|
|
12
|
+
"backtostart": "Επιστροφή στην αρχή",
|
|
13
|
+
"collapse_toggle": "Απόκρυψη χάρτη",
|
|
14
|
+
"uncollapse_toggle": "Εμφάνιση χάρτη",
|
|
15
|
+
"swipe_to_navigate": "Κτυπήστε ελαφρά για περιήγηση<br><span class='vco-button'>OK</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "English",
|
|
3
|
+
"lang": "en",
|
|
4
|
+
"messages": {
|
|
5
|
+
"error": "Error loading",
|
|
6
|
+
"loading": "Loading",
|
|
7
|
+
"wikipedia": "From Wikipedia, the free encyclopedia",
|
|
8
|
+
"start": "Start Exploring",
|
|
9
|
+
"consent_title": "External content",
|
|
10
|
+
"consent_message": "Load content from {service}?",
|
|
11
|
+
"consent_allow": "Allow",
|
|
12
|
+
"consent_deny": "Deny",
|
|
13
|
+
"consent_blocked": "Content from {service} is blocked.",
|
|
14
|
+
"consent_service_tiles": "map tiles",
|
|
15
|
+
"consent_service_fonts": "web fonts"
|
|
16
|
+
},
|
|
17
|
+
"buttons": {
|
|
18
|
+
"map_overview": "Map Overview",
|
|
19
|
+
"overview": "Overview",
|
|
20
|
+
"backtostart": "Back To Beginning",
|
|
21
|
+
"collapse_toggle": "Hide Map",
|
|
22
|
+
"uncollapse_toggle": "Show Map",
|
|
23
|
+
"swipe_to_navigate": "Swipe to Navigate<br><span class='vco-button'>OK</span>",
|
|
24
|
+
"fullscreen": "Full Screen",
|
|
25
|
+
"exit_fullscreen": "Exit Full Screen"
|
|
26
|
+
},
|
|
27
|
+
"direction": "ltr"
|
|
28
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Español",
|
|
3
|
+
"lang": "es",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "cargando",
|
|
6
|
+
"wikipedia": "de Wikipedia, la enciclopedia libre",
|
|
7
|
+
"start": "Explore"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "vista general del mapa",
|
|
11
|
+
"overview": "vista general",
|
|
12
|
+
"backtostart": "volver al comienzo",
|
|
13
|
+
"collapse_toggle": "ocultar mapa",
|
|
14
|
+
"uncollapse_toggle": "mostrar mapa",
|
|
15
|
+
"swipe_to_navigate": "Deslizar para navegar<br><span class='vco-button'>Entendido</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "eesti",
|
|
3
|
+
"lang": "et",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "Laadib",
|
|
6
|
+
"wikipedia": "Vikipeedia, vaba entsüklopeedia",
|
|
7
|
+
"start": "Uuri"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "Kaardi ülevaade",
|
|
11
|
+
"overview": "Ülevaade",
|
|
12
|
+
"backtostart": "Tagasi algusesse",
|
|
13
|
+
"collapse_toggle": "Peida kaart",
|
|
14
|
+
"uncollapse_toggle": "Näita kaarti",
|
|
15
|
+
"swipe_to_navigate": "Swipe to Navigate<br><span class='vco-button'>OK</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Français",
|
|
3
|
+
"lang": "fr",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "Chargement",
|
|
6
|
+
"wikipedia": "Extrait de Wikipédia, l'encyclopédie libre",
|
|
7
|
+
"start": "Explore"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "Vue d'ensemble de la carte",
|
|
11
|
+
"overview": "Vue d'ensemble",
|
|
12
|
+
"backtostart": "Retourner au point de départ",
|
|
13
|
+
"collapse_toggle": "Masquer la carte",
|
|
14
|
+
"uncollapse_toggle": "Afficher la carte",
|
|
15
|
+
"swipe_to_navigate": "Faites glisser pour naviguer<br><span class='vco-button'>OK</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "עברית",
|
|
3
|
+
"lang": "he",
|
|
4
|
+
"direction": "rtl",
|
|
5
|
+
"messages": {
|
|
6
|
+
"loading": "טוען",
|
|
7
|
+
"wikipedia": "מתוך ויקיפדיה, האנציקלופדיה החופשית",
|
|
8
|
+
"start": "התחל במסע"
|
|
9
|
+
},
|
|
10
|
+
"buttons": {
|
|
11
|
+
"map_overview": "המפה במלואה",
|
|
12
|
+
"overview": "תצוגה מקדימה",
|
|
13
|
+
"backtostart": "חזור להתחלה",
|
|
14
|
+
"collapse_toggle": "הסתר מפה",
|
|
15
|
+
"uncollapse_toggle": "הצג מפה",
|
|
16
|
+
"swipe_to_navigate": "Swipe to Navigate<br><span class='vco-button'>OK</span>"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Magyar",
|
|
3
|
+
"lang": "hu",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "töltés",
|
|
6
|
+
"wikipedia": "Wikipedia",
|
|
7
|
+
"start": "Indítsd"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "teljes térkép",
|
|
11
|
+
"overview": "teljes sztori",
|
|
12
|
+
"backtostart": "vissza az elejére",
|
|
13
|
+
"collapse_toggle": "összecsuk",
|
|
14
|
+
"uncollapse_toggle": "kinyit",
|
|
15
|
+
"swipe_to_navigate": "Húzd el a navigációhoz<br><span class='vco-button'>OK</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Icelandic",
|
|
3
|
+
"lang": "is",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "Hleðsla",
|
|
6
|
+
"wikipedia": "Frá Wikipedia",
|
|
7
|
+
"start": "Hefja"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "Kortayfirlit",
|
|
11
|
+
"overview": "Yfirlit",
|
|
12
|
+
"backtostart": "Hefja aftur",
|
|
13
|
+
"collapse_toggle": "Fela kortið",
|
|
14
|
+
"uncollapse_toggle": "Sýna kortið",
|
|
15
|
+
"swipe_to_navigate": "Strjúktu fyrir valmynd<br><span class='vco-button'>Allt í lagi</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Italiano",
|
|
3
|
+
"lang": "it",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "caricare",
|
|
6
|
+
"wikipedia": "da Wikipedia, la enciclopedia libera",
|
|
7
|
+
"start": "Explore"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "vista generale della mappa",
|
|
11
|
+
"overview": "vista generale",
|
|
12
|
+
"backtostart": "tornare all' inizio",
|
|
13
|
+
"collapse_toggle": "nascondere mappa",
|
|
14
|
+
"uncollapse_toggle": "mostrare mappa",
|
|
15
|
+
"swipe_to_navigate": "Swipe to Navigate<br><span class='vco-button'>OK</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "日本語",
|
|
3
|
+
"lang": "jp",
|
|
4
|
+
"messages": {
|
|
5
|
+
"loading": "ローディング",
|
|
6
|
+
"wikipedia": "フリー百科事典ウィキペディア(Wikipedia)から",
|
|
7
|
+
"start": "Explore"
|
|
8
|
+
},
|
|
9
|
+
"buttons": {
|
|
10
|
+
"map_overview": "概観地図",
|
|
11
|
+
"overview": "概観",
|
|
12
|
+
"backtostart": "初めに戻る",
|
|
13
|
+
"collapse_toggle": "地図を隠す",
|
|
14
|
+
"uncollapse_toggle": "地図を表示",
|
|
15
|
+
"swipe_to_navigate": "Swipe to Navigate<br><span class='vco-button'>OK</span>"
|
|
16
|
+
},
|
|
17
|
+
"direction": "ltr"
|
|
18
|
+
}
|