From 5f04a695172934d4052ba7ee90ae378e66893d6a Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Wed, 20 Sep 2023 01:47:32 +0200
Subject: [PATCH 01/40] Refactoring: port PlantNet-detection to svelte,
re-integrate wikipedia component
---
langs/en.json | 6 +-
package.json | 2 +-
public/css/index-tailwind-output.css | 18 +--
src/Logic/Web/PlantNet.ts | 42 +++---
src/UI/Base/BackButton.svelte | 3 +-
src/UI/Base/NextButton.svelte | 2 +-
src/UI/BigComponents/PlantNetSpeciesSearch.ts | 127 ------------------
src/UI/PlantNet/PlantNet.svelte | 123 +++++++++++++++++
src/UI/PlantNet/PlantNetSpeciesList.svelte | 37 +++++
src/UI/PlantNet/SpeciesButton.svelte | 56 ++++++++
src/UI/Popup/PlantNetDetectionViz.ts | 68 ++++------
src/UI/SpecialVisualizations.ts | 2 +-
src/UI/StylesheetTestGui.svelte | 4 +
src/UI/Wikipedia/WikidataPreviewBox.ts | 2 +-
src/UI/Wikipedia/WikidataSearchBox.ts | 2 +-
src/UI/Wikipedia/WikipediaArticle.svelte | 6 +-
src/UI/Wikipedia/WikipediaPanel.svelte | 2 +-
src/index.css | 5 +
18 files changed, 297 insertions(+), 210 deletions(-)
delete mode 100644 src/UI/BigComponents/PlantNetSpeciesSearch.ts
create mode 100644 src/UI/PlantNet/PlantNet.svelte
create mode 100644 src/UI/PlantNet/PlantNetSpeciesList.svelte
create mode 100644 src/UI/PlantNet/SpeciesButton.svelte
diff --git a/langs/en.json b/langs/en.json
index cc9974402e..7d75d0a7bd 100644
--- a/langs/en.json
+++ b/langs/en.json
@@ -380,6 +380,7 @@
"born": "Born: {value}",
"died": "Died: {value}"
},
+ "readMore": "Read the rest of the article",
"searchToShort": "Your search query is too short, enter a longer text",
"searchWikidata": "Search on Wikidata",
"wikipediaboxTitle": "Wikipedia"
@@ -498,7 +499,9 @@
},
"plantDetection": {
"back": "Back to species overview",
+ "button": "Automatically detect the plant species using the AI of Plantnet.org",
"confirm": "Select species",
+ "done": "The species has been applied",
"error": "Something went wrong while detecting the tree species: {error}",
"howTo": {
"intro": "For optimal results,",
@@ -515,7 +518,8 @@
"poweredByPlantnet": "Powered by plantnet.org ",
"querying": "Querying plantnet.org with {length} images",
"seeInfo": "See more information about the species",
- "takeImages": "Take images of the tree to automatically detect the tree type"
+ "takeImages": "Take images of the tree to automatically detect the tree type",
+ "tryAgain": "Select a different species"
},
"privacy": {
"editing": "When you make a change to the map, this change is recorded on OpenStreetMap and is publicly available to anyone. A changeset made with MapComplete includes the following data: The changes you made Your username When this change is made The theme you used while making the change The language of the user interface An indication of how close you were to changed objects. Other mappers can use this information to determine if a change was made based on survey or on remote research Please refer to the privacy policy on OpenStreetMap.org for detailed information. We'd like to remind you that you can use a fictional name when signing up.",
diff --git a/package.json b/package.json
index fff429293f..534568b5de 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "mapcomplete",
- "version": "0.32.0",
+ "version": "0.33.0",
"repository": "https://github.com/pietervdvn/MapComplete",
"description": "A small website to edit OSM easily",
"bugs": "https://github.com/pietervdvn/MapComplete/issues",
diff --git a/public/css/index-tailwind-output.css b/public/css/index-tailwind-output.css
index 91a0cd7e0e..e068f5f492 100644
--- a/public/css/index-tailwind-output.css
+++ b/public/css/index-tailwind-output.css
@@ -1096,6 +1096,10 @@ video {
height: 2.75rem;
}
+.h-10 {
+ height: 2.5rem;
+}
+
.h-48 {
height: 12rem;
}
@@ -1104,10 +1108,6 @@ video {
height: 10rem;
}
-.h-10 {
- height: 2.5rem;
-}
-
.h-80 {
height: 20rem;
}
@@ -1709,11 +1709,6 @@ video {
padding-right: 0.5rem;
}
-.py-2 {
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
-}
-
.pl-1 {
padding-left: 0.25rem;
}
@@ -2209,6 +2204,11 @@ input[type=text] {
border-radius: 0.5rem;
}
+.border-region {
+ border: 2px dashed var(--interactive-background);
+ border-radius: 0.5rem;
+}
+
/******************* Styling of input elements **********************/
/**
diff --git a/src/Logic/Web/PlantNet.ts b/src/Logic/Web/PlantNet.ts
index d22cae7632..dab705ad0b 100644
--- a/src/Logic/Web/PlantNet.ts
+++ b/src/Logic/Web/PlantNet.ts
@@ -985,6 +985,27 @@ export default class PlantNet {
}
}
+export interface PlantNetSpeciesMatch {
+ score: number
+ gbif: { id: string /*Actually a number*/ }
+ species: {
+ scientificNameWithoutAuthor: string
+ scientificNameAuthorship: string
+ genus: {
+ scientificNameWithoutAuthor: string
+ scientificNameAuthorship: string
+ scientificName: string
+ }
+ family: {
+ scientificNameWithoutAuthor: string
+ scientificNameAuthorship: string
+ scientificName: string
+ }
+ commonNames: string[]
+ scientificName: string
+ }
+}
+
export interface PlantNetResult {
query: {
project: string
@@ -995,26 +1016,7 @@ export interface PlantNetResult {
language: string
preferedReferential: string
bestMatch: string
- results: {
- score: number
- gbif: { id: string /*Actually a number*/ }
- species: {
- scientificNameWithoutAuthor: string
- scientificNameAuthorship: string
- genus: {
- scientificNameWithoutAuthor: string
- scientificNameAuthorship: string
- scientificName: string
- }
- family: {
- scientificNameWithoutAuthor: string
- scientificNameAuthorship: string
- scientificName: string
- }
- commonNames: string[]
- scientificName: string
- }
- }[]
+ results: PlantNetSpeciesMatch[]
version: string
remainingIdentificationRequests: number
}
diff --git a/src/UI/Base/BackButton.svelte b/src/UI/Base/BackButton.svelte
index 40f4d1eeaa..5f48bf7e63 100644
--- a/src/UI/Base/BackButton.svelte
+++ b/src/UI/Base/BackButton.svelte
@@ -10,12 +10,13 @@
const dispatch = createEventDispatcher<{ click }>()
export let clss: string | undefined = undefined
+ export let imageClass: string | undefined = undefined
dispatch("click")}
options={{ extraClasses: twMerge("flex items-center", clss) }}
>
-
+
diff --git a/src/UI/Base/NextButton.svelte b/src/UI/Base/NextButton.svelte
index a546fd8c1c..6b4a64dd83 100644
--- a/src/UI/Base/NextButton.svelte
+++ b/src/UI/Base/NextButton.svelte
@@ -20,6 +20,6 @@
-
+
diff --git a/src/UI/BigComponents/PlantNetSpeciesSearch.ts b/src/UI/BigComponents/PlantNetSpeciesSearch.ts
deleted file mode 100644
index b7e503f6e0..0000000000
--- a/src/UI/BigComponents/PlantNetSpeciesSearch.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-import { VariableUiElement } from "../Base/VariableUIElement"
-import { Store, UIEventSource } from "../../Logic/UIEventSource"
-import PlantNet from "../../Logic/Web/PlantNet"
-import Loading from "../Base/Loading"
-import Wikidata from "../../Logic/Web/Wikidata"
-import WikidataPreviewBox from "../Wikipedia/WikidataPreviewBox"
-import { Button } from "../Base/Button"
-import Combine from "../Base/Combine"
-import Title from "../Base/Title"
-import Translations from "../i18n/Translations"
-import List from "../Base/List"
-import Svg from "../../Svg"
-
-export default class PlantNetSpeciesSearch extends VariableUiElement {
- /***
- * Given images, queries plantnet to search a species matching those images.
- * A list of species will be presented to the user, after which they can confirm an item.
- * The wikidata-url is returned in the callback when the user selects one
- */
- constructor(images: Store, onConfirm: (wikidataUrl: string) => Promise) {
- const t = Translations.t.plantDetection
- super(
- images
- .bind((images) => {
- if (images.length === 0) {
- return null
- }
- return UIEventSource.FromPromiseWithErr(PlantNet.query(images.slice(0, 5)))
- })
- .map((result) => {
- if (images.data.length === 0) {
- return new Combine([
- t.takeImages,
- t.howTo.intro,
- new List([t.howTo.li0, t.howTo.li1, t.howTo.li2, t.howTo.li3]),
- ]).SetClass("flex flex-col")
- }
- if (result === undefined) {
- return new Loading(t.querying.Subs(images.data))
- }
-
- if (result["error"] !== undefined) {
- return t.error.Subs(result).SetClass("alert")
- }
- console.log(result)
- const success = result["success"]
-
- const selectedSpecies = new UIEventSource(undefined)
- const speciesInformation = success.results
- .filter((species) => species.score >= 0.005)
- .map((species) => {
- const wikidata = UIEventSource.FromPromise(
- Wikidata.Sparql<{ species }>(
- ["?species", "?speciesLabel"],
- ['?species wdt:P846 "' + species.gbif.id + '"']
- )
- )
-
- const confirmButton = new Button(t.seeInfo, async () => {
- await selectedSpecies.setData(wikidata.data[0].species?.value)
- }).SetClass("btn")
-
- const match = t.matchPercentage
- .Subs({ match: Math.round(species.score * 100) })
- .SetClass("font-bold")
-
- const extraItems = new Combine([match, confirmButton]).SetClass(
- "flex flex-col"
- )
-
- return new WikidataPreviewBox(
- wikidata.map((wd) =>
- wd == undefined ? undefined : wd[0]?.species?.value
- ),
- {
- whileLoading: new Loading(
- t.loadingWikidata.Subs({
- species: species.species.scientificNameWithoutAuthor,
- })
- ),
- extraItems: [new Combine([extraItems])],
-
- imageStyle: "max-width: 8rem; width: unset; height: 8rem",
- }
- ).SetClass("border-2 border-subtle rounded-xl block mb-2")
- })
- const plantOverview = new Combine([
- new Title(t.overviewTitle),
- t.overviewIntro,
- t.overviewVerify.SetClass("font-bold"),
- ...speciesInformation,
- ]).SetClass("flex flex-col")
-
- return new VariableUiElement(
- selectedSpecies.map((wikidataSpecies) => {
- if (wikidataSpecies === undefined) {
- return plantOverview
- }
- return new Combine([
- new Button(
- new Combine([
- Svg.back_svg().SetClass(
- "w-6 mr-1 bg-white rounded-full p-1"
- ),
- t.back,
- ]).SetClass("flex"),
- () => {
- selectedSpecies.setData(undefined)
- }
- ).SetClass("btn btn-secondary"),
-
- new Button(
- new Combine([
- Svg.confirm_svg().SetClass("w-6 mr-1"),
- t.confirm,
- ]).SetClass("flex"),
- () => {
- onConfirm(wikidataSpecies)
- }
- ).SetClass("btn"),
- ]).SetClass("flex justify-between")
- })
- )
- })
- )
- }
-}
diff --git a/src/UI/PlantNet/PlantNet.svelte b/src/UI/PlantNet/PlantNet.svelte
new file mode 100644
index 0000000000..170c7fc182
--- /dev/null
+++ b/src/UI/PlantNet/PlantNet.svelte
@@ -0,0 +1,123 @@
+
+
+
+
+ {#if collapsedMode}
+
+
+
+ {:else if $error !== undefined}
+
+ {:else if $imageUrls.length === 0}
+
+
+
{collapsedMode = true}}>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {:else if selectedOption === undefined}
+
speciesSelected(species.detail)}>
+ {collapsedMode = true}}>
+
+
+ {:else if !done}
+
+
+
+
+
+
+ {selectedOption = undefined}}>
+
+
+ { done = true; onConfirm(selectedOption); }} >
+
+
+
+
+ {:else}
+
+
+
{done = false; selectedOption = undefined}}>
+
+
+ {/if}
+
+
+
+
+
+
diff --git a/src/UI/PlantNet/PlantNetSpeciesList.svelte b/src/UI/PlantNet/PlantNetSpeciesList.svelte
new file mode 100644
index 0000000000..5cb7341561
--- /dev/null
+++ b/src/UI/PlantNet/PlantNetSpeciesList.svelte
@@ -0,0 +1,37 @@
+
+
+{#if $options === undefined}
+
+
+
+{:else}
+
+
+
+
+
+
+
+
+
+
+ {#each $options as species}
+
+ {/each}
+
+{/if}
diff --git a/src/UI/PlantNet/SpeciesButton.svelte b/src/UI/PlantNet/SpeciesButton.svelte
new file mode 100644
index 0000000000..de7f873332
--- /dev/null
+++ b/src/UI/PlantNet/SpeciesButton.svelte
@@ -0,0 +1,56 @@
+
+
+{
+ console.log("Dispatching: ", $wikidataId)
+ return dispatch("selected", $wikidataId); }}>
+ {#if $wikidata === undefined}
+
+
+
+ {:else}
+ new WikidataPreviewBox(wikidataId,
+ { imageStyle: "max-width: 8rem; width: unset; height: 8rem",
+ extraItems: [t.matchPercentage
+ .Subs({ match: Math.round(species.score * 100) })
+ .SetClass("thanks w-fit self-center")]
+ }).SetClass("w-full")}>
+ {/if}
+
diff --git a/src/UI/Popup/PlantNetDetectionViz.ts b/src/UI/Popup/PlantNetDetectionViz.ts
index 198fc7a938..69397cabdf 100644
--- a/src/UI/Popup/PlantNetDetectionViz.ts
+++ b/src/UI/Popup/PlantNetDetectionViz.ts
@@ -1,18 +1,14 @@
import { Store, UIEventSource } from "../../Logic/UIEventSource"
-import Toggle from "../Input/Toggle"
-import Lazy from "../Base/Lazy"
import { ProvidedImage } from "../../Logic/ImageProviders/ImageProvider"
import PlantNetSpeciesSearch from "../BigComponents/PlantNetSpeciesSearch"
import Wikidata from "../../Logic/Web/Wikidata"
import ChangeTagAction from "../../Logic/Osm/Actions/ChangeTagAction"
import { And } from "../../Logic/Tags/And"
import { Tag } from "../../Logic/Tags/Tag"
-import { SubtleButton } from "../Base/SubtleButton"
-import Combine from "../Base/Combine"
-import Svg from "../../Svg"
-import Translations from "../i18n/Translations"
import AllImageProviders from "../../Logic/ImageProviders/AllImageProviders"
import { SpecialVisualization, SpecialVisualizationState } from "../SpecialVisualization"
+import SvelteUIElement from "../Base/SvelteUIElement"
+import PlantNet from "../PlantNet/PlantNet.svelte"
export class PlantNetDetectionViz implements SpecialVisualization {
funcName = "plantnet_detection"
@@ -37,45 +33,29 @@ export class PlantNetDetectionViz implements SpecialVisualization {
imagePrefixes = [].concat(...args.map((a) => a.split(",")))
}
- const detect = new UIEventSource(false)
- const toggle = new Toggle(
- new Lazy(() => {
- const allProvidedImages: Store = AllImageProviders.LoadImagesFor(
- tags,
- imagePrefixes
- )
- const allImages: Store = allProvidedImages.map((pi) =>
- pi.map((pi) => pi.url)
- )
- return new PlantNetSpeciesSearch(allImages, async (selectedWikidata) => {
- selectedWikidata = Wikidata.ExtractKey(selectedWikidata)
- const change = new ChangeTagAction(
- tags.data.id,
- new And([
- new Tag("species:wikidata", selectedWikidata),
- new Tag("source:species:wikidata", "PlantNet.org AI"),
- ]),
- tags.data,
- {
- theme: state.layout.id,
- changeType: "plantnet-ai-detection",
- }
- )
- await state.changes.applyAction(change)
- })
- }),
- new SubtleButton(undefined, "Detect plant species with plantnet.org").onClick(() =>
- detect.setData(true)
- ),
- detect
+ const allProvidedImages: Store = AllImageProviders.LoadImagesFor(
+ tags,
+ imagePrefixes
)
+ const imageUrls: Store = allProvidedImages.map((pi) => pi.map((pi) => pi.url))
- return new Combine([
- toggle,
- new Combine([
- Svg.plantnet_logo_svg().SetClass("w-10 h-10 p-1 mr-1 bg-white rounded-full"),
- Translations.t.plantDetection.poweredByPlantnet,
- ]).SetClass("flex p-2 bg-gray-200 rounded-xl self-end"),
- ]).SetClass("flex flex-col")
+ async function applySpecies(selectedWikidata) {
+ selectedWikidata = Wikidata.ExtractKey(selectedWikidata)
+ const change = new ChangeTagAction(
+ tags.data.id,
+ new And([
+ new Tag("species:wikidata", selectedWikidata),
+ new Tag("source:species:wikidata", "PlantNet.org AI"),
+ ]),
+ tags.data,
+ {
+ theme: state.layout.id,
+ changeType: "plantnet-ai-detection",
+ }
+ )
+ await state.changes.applyAction(change)
+ }
+
+ return new SvelteUIElement(PlantNet, { imageUrls, onConfirm: applySpecies })
}
}
diff --git a/src/UI/SpecialVisualizations.ts b/src/UI/SpecialVisualizations.ts
index 213451e971..26a94ec7f3 100644
--- a/src/UI/SpecialVisualizations.ts
+++ b/src/UI/SpecialVisualizations.ts
@@ -538,7 +538,7 @@ export default class SpecialVisualizations {
const keys = args[0].split(";").map((k) => k.trim())
const wikiIds: Store = tagsSource.map((tags) => {
const key = keys.find((k) => tags[k] !== undefined && tags[k] !== "")
- return tags[key]?.split(";")?.map((id) => id.trim())
+ return tags[key]?.split(";")?.map((id) => id.trim()) ?? []
})
return new SvelteUIElement(WikipediaPanel, {
wikiIds,
diff --git a/src/UI/StylesheetTestGui.svelte b/src/UI/StylesheetTestGui.svelte
index 4ad1430061..7d40c735f8 100644
--- a/src/UI/StylesheetTestGui.svelte
+++ b/src/UI/StylesheetTestGui.svelte
@@ -29,6 +29,10 @@
areas, where some buttons might appear.
+
+ Highly interactive area (mostly: active question)
+
+
diff --git a/src/UI/Wikipedia/WikidataPreviewBox.ts b/src/UI/Wikipedia/WikidataPreviewBox.ts
index a9e6327fad..41f2afb2ca 100644
--- a/src/UI/Wikipedia/WikidataPreviewBox.ts
+++ b/src/UI/Wikipedia/WikidataPreviewBox.ts
@@ -126,7 +126,7 @@ export default class WikidataPreviewBox extends VariableUiElement {
new Combine([
Translation.fromMap(wikidata.labels)?.SetClass("font-bold"),
link,
- ]).SetClass("flex justify-between"),
+ ]).SetClass("flex justify-between flex-wrap-reverse"),
Translation.fromMap(wikidata.descriptions),
WikidataPreviewBox.QuickFacts(wikidata, options),
...(options?.extraItems ?? []),
diff --git a/src/UI/Wikipedia/WikidataSearchBox.ts b/src/UI/Wikipedia/WikidataSearchBox.ts
index 9790f72831..abb67b572a 100644
--- a/src/UI/Wikipedia/WikidataSearchBox.ts
+++ b/src/UI/Wikipedia/WikidataSearchBox.ts
@@ -131,7 +131,7 @@ Another example is to search for species and trees:
const searchResult: Store<{ success?: WikidataResponse[]; error?: any }> = searchField
.GetValue()
.bind((searchText) => {
- if (searchText.length < 3) {
+ if (searchText.length < 3 && !searchText.match(/[qQ][0-9]+/)) {
return tooShort
}
const lang = Locale.language.data
diff --git a/src/UI/Wikipedia/WikipediaArticle.svelte b/src/UI/Wikipedia/WikipediaArticle.svelte
index b2a35eec6c..11775b563b 100644
--- a/src/UI/Wikipedia/WikipediaArticle.svelte
+++ b/src/UI/Wikipedia/WikipediaArticle.svelte
@@ -11,7 +11,7 @@
import Translations from "../i18n/Translations";
/**
- * Small helper
+ * Shows a wikipedia-article + wikidata preview for the given item
*/
export let wikipediaDetails: Store;
@@ -23,9 +23,11 @@
{/if}
+
{#if $wikipediaDetails.wikidata}
{/if}
+
{#if $wikipediaDetails.articleUrl}
{#if $wikipediaDetails.firstParagraph === "" || $wikipediaDetails.firstParagraph === undefined}
@@ -42,7 +44,7 @@
style={(open ? "transform: rotate(90deg); " : "") +
" transition: all .25s linear; width: 1.5rem; height: 1.5rem"}
/>
- Read the rest of the article
+
diff --git a/src/UI/Wikipedia/WikipediaPanel.svelte b/src/UI/Wikipedia/WikipediaPanel.svelte
index 8ca905fc77..20a9180d53 100644
--- a/src/UI/Wikipedia/WikipediaPanel.svelte
+++ b/src/UI/Wikipedia/WikipediaPanel.svelte
@@ -16,7 +16,7 @@
*/
export let wikiIds: Store;
let wikipediaStores: Store[]> = Locale.language.bind((language) =>
- wikiIds.map((wikiIds) => wikiIds.map((id) => Wikipedia.fetchArticleAndWikidata(id, language)))
+ wikiIds?.map((wikiIds) => wikiIds?.map((id) => Wikipedia.fetchArticleAndWikidata(id, language)))
);
let _wikipediaStores;
onDestroy(
diff --git a/src/index.css b/src/index.css
index d947f8ce55..028a661122 100644
--- a/src/index.css
+++ b/src/index.css
@@ -154,6 +154,11 @@ input[type=text] {
border-radius: 0.5rem;
}
+.border-region {
+ border: 2px dashed var(--interactive-background);
+ border-radius: 0.5rem;
+}
+
/******************* Styling of input elements **********************/
From 665f8b1d25d004bb7832f25593fe58081bedf85f Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Wed, 20 Sep 2023 01:59:48 +0200
Subject: [PATCH 02/40] Typing: make options optional in wikidata search
---
src/Logic/Web/Wikidata.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/Logic/Web/Wikidata.ts b/src/Logic/Web/Wikidata.ts
index 7842be8a5e..31eaa33d84 100644
--- a/src/Logic/Web/Wikidata.ts
+++ b/src/Logic/Web/Wikidata.ts
@@ -159,7 +159,7 @@ export default class Wikidata {
*/
public static async searchAdvanced(
text: string,
- options: WikidataAdvancedSearchoptions
+ options?: WikidataAdvancedSearchoptions
): Promise<
{
id: string
@@ -185,7 +185,7 @@ export default class Wikidata {
?num wikibase:apiOrdinal true .
bd:serviceParam wikibase:limit ${
Math.round(
- (options.maxCount ?? 20) * 1.5
+ (options?.maxCount ?? 20) * 1.5
) /*Some padding for disambiguation pages */
} .
?label wikibase:apiOutput mwapi:label .
@@ -193,7 +193,7 @@ export default class Wikidata {
}
${instanceOf}
${minusPhrases.join("\n ")}
- } ORDER BY ASC(?num) LIMIT ${options.maxCount ?? 20}`
+ } ORDER BY ASC(?num) LIMIT ${options?.maxCount ?? 20}`
const url = wds.sparqlQuery(sparql)
const result = await Utils.downloadJson(url)
From 91892d50c5a5c5071838c8a38a24c60f1f7ed717 Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Wed, 20 Sep 2023 02:27:10 +0200
Subject: [PATCH 03/40] Fix: fix #1471: add option to bench for 'does probably
not have an artwork'
---
assets/layers/bench/bench.json | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/assets/layers/bench/bench.json b/assets/layers/bench/bench.json
index 0234018a9d..f6e5650c0a 100644
--- a/assets/layers/bench/bench.json
+++ b/assets/layers/bench/bench.json
@@ -890,6 +890,7 @@
"mappings": [
{
"if": "tourism=artwork",
+ "addExtraTags": ["not:tourism:artwork="],
"then": {
"en": "This bench has an integrated artwork",
"nl": "Deze bank heeft een geïntegreerd kunstwerk",
@@ -902,7 +903,7 @@
}
},
{
- "if": "tourism=",
+ "if": "not:tourism:artwork=yes",
"then": {
"en": "This bench does not have an integrated artwork",
"nl": "Deze bank heeft geen geïntegreerd kunstwerk",
@@ -913,7 +914,16 @@
"cs": "Tato lavička nemá integrované umělecké dílo",
"he": "לספסל זה אין יצירת אמנות משולבת",
"pl": "Ta ławka nie ma wbudowanego dzieła sztuki"
- }
+ },
+ "addExtraTags": ["tourism="]
+ },
+ {
+ "if": "tourism=",
+ "then": {
+ "en": "This bench probably doesn't have an integrated artwork",
+ "nl": "Deze bank heeft waarschijnlijk geen geïntegreerd kunstwerk"
+ },
+ "hideInAnswer": true
}
],
"questionHint": {
From 9252aafa2db74bba9267f324b137a29909de26d5 Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Wed, 20 Sep 2023 02:45:15 +0200
Subject: [PATCH 04/40] Chore: update language translations, partial fix of
#841
---
scripts/fetchLanguages.ts | 5 +-
src/assets/language_native.json | 6 +-
src/assets/language_translations.json | 826 +++++++++++++++++++-------
3 files changed, 623 insertions(+), 214 deletions(-)
diff --git a/scripts/fetchLanguages.ts b/scripts/fetchLanguages.ts
index 429ea56db3..1ecf6eb5e7 100644
--- a/scripts/fetchLanguages.ts
+++ b/scripts/fetchLanguages.ts
@@ -50,8 +50,11 @@ async function fetchRegularLanguages() {
const result = await Utils.downloadJson(url, { "User-Agent": "MapComplete script" })
const bindings = result.results.bindings
+ // Traditional chinese = 繁體中文 or 正體中文
const zh_hant = await fetchSpecial(18130932, "zh_Hant")
- const zh_hans = await fetchSpecial(13414913, "zh_Hant")
+
+ // Simplified chinese = 簡體中文 or 简体中文(
+ const zh_hans = await fetchSpecial(13414913, "zh_Hans")
const pt_br = await fetchSpecial(750553, "pt_BR")
const punjabi = await fetchSpecial(58635, "pa_PK")
const Shahmukhi = await Wikidata.LoadWikidataEntryAsync(133800)
diff --git a/src/assets/language_native.json b/src/assets/language_native.json
index d5f39bbe95..c7869833f1 100644
--- a/src/assets/language_native.json
+++ b/src/assets/language_native.json
@@ -6,12 +6,13 @@
"en": "English",
"eo": "Esperanto",
"es": "español",
+ "eu": "euskara",
"fi": "suomi",
"fr": "français",
"gl": "lingua galega",
"he": "עברית",
"hu": "magyar",
- "id": "Bahasa Indonesia",
+ "id": "bahasa Indonesia",
"it": "italiano",
"ja": "日本語",
"nb_NO": "bokmål",
@@ -22,5 +23,6 @@
"ru": "русский язык",
"sl": "slovenščina",
"sv": "svenska",
- "zh_Hant": "簡體中文"
+ "zh_Hans": "简体中文",
+ "zh_Hant": "繁體中文"
}
\ No newline at end of file
diff --git a/src/assets/language_translations.json b/src/assets/language_translations.json
index cf3dc45a86..87e2029114 100644
--- a/src/assets/language_translations.json
+++ b/src/assets/language_translations.json
@@ -6,6 +6,7 @@
"en": "Afar",
"eo": "afara lingvo",
"es": "idioma afar",
+ "eu": "Afarrera",
"fi": "afarin kieli",
"fr": "afar",
"gl": "Lingua afar",
@@ -35,6 +36,7 @@
"en": "Abkhaz",
"eo": "abĥaza lingvo",
"es": "abjasio",
+ "eu": "abkhazera",
"fi": "abhaasi",
"fr": "abkhaze",
"gl": "Lingua abkhaza",
@@ -70,6 +72,7 @@
"en": "Abaza",
"eo": "abaza lingvo",
"es": "abaza",
+ "eu": "abazera",
"fi": "Abazan kieli",
"fr": "abaza",
"gl": "Lingua abaza",
@@ -136,17 +139,18 @@
"de": "Adygeisch",
"en": "Adyghe",
"eo": "adigea lingvo",
- "es": "idioma adigué",
+ "es": "adigués",
+ "eu": "adigera",
"fi": "adygen kieli",
"fr": "adyguéen",
"gl": "Lingua adigue",
"he": "אדיגית",
"hu": "adigei",
- "id": "Bahasa Adighe",
+ "id": "bahasa Adyghe",
"it": "adighè",
"ja": "アディゲ語",
"nb_NO": "adygeisk",
- "nl": "West-Circassisch",
+ "nl": "Adygees",
"pl": "język adygejski",
"pt": "língua adigue",
"ru": "адыгейский язык",
@@ -176,7 +180,7 @@
"it": "arabo tunisino",
"ja": "アラビア語チュニジア方言",
"nb_NO": "tunisisk arabisk",
- "nl": "Tunesisch",
+ "nl": "Tunesisch-Arabisch",
"pl": "tunezyjski",
"pt": "árabe tunisino",
"pt_BR": "Árabe tunisino",
@@ -200,12 +204,13 @@
"en": "Afrikaans",
"eo": "afrikansa lingvo",
"es": "afrikáans",
+ "eu": "afrikaans",
"fi": "afrikaans",
"fr": "afrikaans",
"gl": "Lingua africáner",
"he": "אפריקאנס",
"hu": "afrikaans",
- "id": "Bahasa Afrikaans",
+ "id": "Afrikaans",
"it": "afrikaans",
"ja": "アフリカーンス語",
"nb_NO": "afrikaans",
@@ -253,10 +258,10 @@
"es": "árabe levantino",
"fr": "arabe levantin",
"he": "ערבית לבנטינית",
- "id": "Arab Levantin",
+ "id": "Arab Syam",
"it": "lingue arabe levantine",
"ja": "アラビア語レバント方言",
- "nl": "Levantijns Arabisch",
+ "nl": "Levantijns-Arabisch",
"pl": "dialekty syryjsko-palestyńskie języka arabskiego",
"pt": "Árabe levantino",
"ru": "Левантийский диалект арабского языка",
@@ -302,8 +307,10 @@
"ca": "aklanon",
"da": "aklansk",
"de": "Akeanon",
- "en": "Aklan",
+ "en": "Aklanon",
+ "eo": "aklana lingvo",
"es": "aclano",
+ "eu": "aklanera",
"fi": "Aklanon",
"fr": "aklanon",
"gl": "Lingua aklanon",
@@ -325,6 +332,7 @@
"en": "Alabama",
"eo": "alabama lingvo",
"es": "Idioma alabama",
+ "eu": "Alabama hizkuntza",
"fr": "alabama",
"gl": "Lingua alabama",
"it": "lingua alabama",
@@ -348,6 +356,7 @@
"en": "Gheg Albanian",
"eo": "geg-albana lingvo",
"es": "Albanés guego",
+ "eu": "gheg albaniera",
"fr": "guègue",
"hu": "geg albán",
"it": "lingua albanese ghega",
@@ -356,6 +365,7 @@
"nl": "Gegisch",
"pl": "Dialekt gegijski języka albańskiego",
"ru": "гегский диалект албанского языка",
+ "sl": "gegovščina",
"sv": "gegiska",
"zh_Hans": "盖格方言",
"zh_Hant": "蓋格方言",
@@ -378,7 +388,7 @@
"gl": "Lingua alemá de Suíza",
"he": "גרמנית שווייצרית",
"hu": "svájci német",
- "id": "Bahasa Jerman Swiss",
+ "id": "Jerman Swiss",
"it": "svizzero tedesco",
"ja": "スイスドイツ語",
"nb_NO": "sveitsertysk",
@@ -386,6 +396,7 @@
"pl": "gwary schwyzertüütsch",
"pt": "suíço-alemão",
"ru": "швейцарский диалект",
+ "sl": "švicarska nemščina",
"sv": "schweizertyska",
"zh_Hans": "瑞士德语",
"zh_Hant": "瑞士德語",
@@ -398,7 +409,7 @@
"alt": {
"ca": "altaic meridional",
"de": "Südaltaisch",
- "en": "Altai",
+ "en": "Southern Altai",
"eo": "sudaltaja lingvo",
"fr": "altaï méridional",
"gl": "Lingua altai meridional",
@@ -424,6 +435,7 @@
"en": "Amharic",
"eo": "amhara lingvo",
"es": "amhárico",
+ "eu": "Amharera",
"fi": "amharan kieli",
"fr": "amharique",
"gl": "Lingua amhárica",
@@ -438,7 +450,7 @@
"pt": "Língua amárica",
"pt_BR": "língua amárica",
"ru": "амхарский язык",
- "sl": "Amharščina",
+ "sl": "amharščina",
"sv": "amhariska",
"zh_Hans": "阿姆哈拉语",
"zh_Hant": "阿姆哈拉語",
@@ -483,6 +495,7 @@
"en": "Aragonese",
"eo": "aragona lingvo",
"es": "aragonés",
+ "eu": "aragoiera",
"fi": "aragonia",
"fr": "aragonais",
"gl": "Lingua aragonesa",
@@ -560,10 +573,10 @@
"es": "árabe levantino",
"fr": "arabe levantin",
"he": "ערבית לבנטינית",
- "id": "Arab Levantin",
+ "id": "Arab Syam",
"it": "lingue arabe levantine",
"ja": "アラビア語レバント方言",
- "nl": "Levantijns Arabisch",
+ "nl": "Levantijns-Arabisch",
"pl": "dialekty syryjsko-palestyńskie języka arabskiego",
"pt": "Árabe levantino",
"ru": "Левантийский диалект арабского языка",
@@ -584,12 +597,13 @@
"en": "Arabic",
"eo": "araba lingvo",
"es": "árabe",
+ "eu": "arabiera",
"fi": "arabia",
"fr": "arabe",
"gl": "árabe",
"he": "ערבית",
"hu": "arab",
- "id": "Arab",
+ "id": "bahasa Arab",
"it": "arabo",
"ja": "アラビア語",
"nb_NO": "arabisk",
@@ -644,6 +658,7 @@
"en": "Mapudungun",
"eo": "mapuĉa lingvo",
"es": "mapuche",
+ "eu": "Mapudungun",
"fi": "mapudungun",
"fr": "mapudungun",
"gl": "Lingua mapuche",
@@ -673,6 +688,7 @@
"en": "Algerian Arabic",
"eo": "alĝeria araba lingvo",
"es": "árabe argelino",
+ "eu": "aljeriar arabiera",
"fi": "algerianarabia",
"fr": "arabe algérien",
"gl": "Árabe alxeriano",
@@ -681,7 +697,7 @@
"it": "arabo algerino",
"ja": "アラビア語アルジェリア方言",
"nb_NO": "algerisk-arabisk",
- "nl": "Algerijns Arabisch",
+ "nl": "Algerijns-Arabisch",
"pt": "árabe argelino",
"ru": "Алжирский диалект арабского языка",
"sl": "alžirska arabščina",
@@ -701,6 +717,7 @@
"en": "Moroccan Darija",
"eo": "maroka araba lingvo",
"es": "árabe marroquí",
+ "eu": "marokoar arabiera",
"fi": "marokonarabia",
"fr": "Darija marocain",
"gl": "árabe marroquí",
@@ -709,7 +726,7 @@
"it": "arabo marocchino",
"ja": "アラビア語モロッコ方言",
"nb_NO": "marokkansk-arabisk",
- "nl": "Marokkaans Arabisch",
+ "nl": "Marokkaans-Arabisch",
"pl": "marokańska odmiana języka arabskiego",
"pt": "Árabe marroquino",
"ru": "Марокканский диалект арабского языка",
@@ -730,6 +747,7 @@
"en": "Egyptian Arabic",
"eo": "egipt-araba lingvo",
"es": "árabe egipcio",
+ "eu": "egiptoar arabiera",
"fi": "egyptinarabia",
"fr": "arabe égyptien",
"gl": "Árabe exipcio",
@@ -739,7 +757,7 @@
"it": "arabo egiziano",
"ja": "アラビア語エジプト方言",
"nb_NO": "egyptisk arabisk",
- "nl": "Egyptisch Arabisch",
+ "nl": "Egyptisch-Arabisch",
"pl": "dialekt egipski języka arabskiego",
"pt": "árabe egípcio",
"pt_BR": "Árabe egípcio",
@@ -761,12 +779,13 @@
"en": "Assamese",
"eo": "asama lingvo",
"es": "asamés",
+ "eu": "assamera",
"fi": "assami",
"fr": "assamais",
"gl": "Lingua asamesa",
"he": "אסאמית",
"hu": "asszámi",
- "id": "Bahasa Assam",
+ "id": "bahasa Assam",
"it": "assamese",
"ja": "アッサム語",
"nb_NO": "assamesisk",
@@ -791,6 +810,7 @@
"en": "American Sign Language",
"eo": "usona signolingvo",
"es": "lengua de señas estadounidense",
+ "eu": "amerikar keinu hizkuntza",
"fi": "amerikkalainen viittomakieli",
"fr": "langue des signes américaine",
"gl": "lingua de signos americana",
@@ -821,6 +841,7 @@
"en": "Asturian",
"eo": "astura lingvo",
"es": "asturiano",
+ "eu": "asturiera",
"fi": "asturia",
"fr": "asturien",
"gl": "lingua asturiana",
@@ -835,7 +856,7 @@
"pt": "asturiano",
"pt_BR": "Língua asturiana",
"ru": "астурийский язык",
- "sl": "asturščina",
+ "sl": "asturijščina",
"sv": "asturiska",
"zh_Hans": "阿斯图里亚斯语",
"zh_Hant": "阿斯圖里亞斯語",
@@ -875,7 +896,8 @@
"de": "Awarisch",
"en": "Avar",
"eo": "avara lingvo",
- "es": "ávaro",
+ "es": "avar",
+ "eu": "avarera",
"fi": "Avaarin kieli",
"fr": "avar",
"gl": "Lingua avar",
@@ -903,6 +925,7 @@
"en": "Awadhi",
"eo": "avadhia",
"es": "awadhi",
+ "eu": "Awadhiera",
"fi": "Awadhin kieli",
"fr": "awadhi",
"gl": "Lingua awadhi",
@@ -933,6 +956,7 @@
"en": "Aymara",
"eo": "ajmara lingvo",
"es": "aymara",
+ "eu": "Aimara",
"fi": "aimara",
"fr": "aymara",
"gl": "Lingua aimará",
@@ -969,6 +993,7 @@
"en": "Azerbaijani",
"eo": "azerbajĝana lingvo",
"es": "azerí",
+ "eu": "azerbaijanera",
"fi": "azeri",
"fr": "azéri",
"gl": "Lingua azerí",
@@ -1005,6 +1030,7 @@
"en": "Bashkir",
"eo": "baŝkira lingvo",
"es": "bashkir",
+ "eu": "Baxkirera",
"fi": "baškiiri",
"fr": "bachkir",
"gl": "Lingua baskir",
@@ -1037,6 +1063,7 @@
"en": "Balinese",
"eo": "balia lingvo",
"es": "balinés",
+ "eu": "baliera",
"fi": "Balin kieli",
"fr": "balinais",
"gl": "Lingua balinesa",
@@ -1068,6 +1095,7 @@
"en": "Bavarian",
"eo": "bavara lingvo",
"es": "bávaro",
+ "eu": "Bavariera",
"fi": "Baijerin kieli",
"fr": "bavarois",
"gl": "Lingua bavaresa",
@@ -1099,6 +1127,7 @@
"en": "Samogitian",
"eo": "Ĵemajtia dialekto",
"es": "Idioma samogitiano",
+ "eu": "samogatiera",
"fi": "Samogiitti",
"fr": "samogitien",
"gl": "Samoxiciano",
@@ -1129,6 +1158,7 @@
"en": "Toba Batak",
"eo": "Batak Toba",
"es": "Batak Toba",
+ "eu": "Batak Toba",
"fi": "Batak Toba",
"fr": "batak toba",
"gl": "Lingua toba batak",
@@ -1156,6 +1186,7 @@
"fr": "bajau de la côte occidentale",
"gl": "Lingua bajaw da costa occidental",
"nb_NO": "vestkystbajau",
+ "nl": "Westkust-Bajau",
"ru": "баджо западного побережья",
"sv": "västkustbajau",
"_meta": {
@@ -1170,6 +1201,7 @@
"en": "Beja",
"eo": "beĝaa lingvo",
"es": "Idioma beya",
+ "eu": "Bedawi hizkuntza",
"fi": "Bedžan kieli",
"fr": "bedja",
"id": "Bahasa Beja",
@@ -1180,6 +1212,7 @@
"pl": "Język bedża",
"pt": "Língua beja",
"ru": "Беджа",
+ "sl": "bedščina",
"sv": "beja",
"_meta": {
"dir": [
@@ -1189,6 +1222,7 @@
}
},
"bfi": {
+ "ca": "llengau de signes britànica",
"cs": "britský znakový jazyk",
"de": "Britische Gebärdensprache",
"en": "British Sign Language",
@@ -1242,12 +1276,13 @@
"en": "Bulgarian",
"eo": "bulgara lingvo",
"es": "búlgaro",
+ "eu": "bulgariera",
"fi": "bulgaria",
"fr": "bulgare",
"gl": "lingua búlgara",
"he": "בולגרית",
"hu": "bolgár",
- "id": "Bahasa Bulgaria",
+ "id": "bahasa Bulgaria",
"it": "bulgaro",
"ja": "ブルガリア語",
"nb_NO": "bulgarsk",
@@ -1277,12 +1312,13 @@
"en": "Bhojpuri",
"eo": "bhojpura lingvo",
"es": "Idioma bopurí",
+ "eu": "bhojpuri",
"fi": "Bhodžpurin kieli",
"fr": "bhodjpouri",
"gl": "Lingua bhojpuri",
"he": "בוג'פורית",
"hu": "bhódzspurí",
- "id": "Bahasa Bhojpuri",
+ "id": "bahasa Bhojpuri",
"it": "bhojpuri",
"ja": "ボージュプリー語",
"nb_NO": "Bhojpuri",
@@ -1307,12 +1343,13 @@
"en": "Bhojpuri",
"eo": "bhojpura lingvo",
"es": "Idioma bopurí",
+ "eu": "bhojpuri",
"fi": "Bhodžpurin kieli",
"fr": "bhodjpouri",
"gl": "Lingua bhojpuri",
"he": "בוג'פורית",
"hu": "bhódzspurí",
- "id": "Bahasa Bhojpuri",
+ "id": "bahasa Bhojpuri",
"it": "bhojpuri",
"ja": "ボージュプリー語",
"nb_NO": "Bhojpuri",
@@ -1336,6 +1373,7 @@
"en": "Bislama",
"eo": "bislama lingvo",
"es": "Bislama",
+ "eu": "Bislama",
"fi": "Bislama",
"fr": "bichelamar",
"gl": "Bislama",
@@ -1349,6 +1387,7 @@
"pl": "język bislama",
"pt": "Língua bislamá",
"ru": "бислама",
+ "sl": "bislamščina",
"sv": "bislama",
"_meta": {
"countries": [
@@ -1394,6 +1433,7 @@
"en": "Bambara",
"eo": "bambara lingvo",
"es": "bambara",
+ "eu": "Banbara hizkuntza",
"fi": "bambaran kieli",
"fr": "bambara",
"gl": "Lingua bambara",
@@ -1420,9 +1460,10 @@
"cs": "bengálština",
"da": "bengali",
"de": "Bengalisch",
- "en": "Bengali",
+ "en": "Bangla",
"eo": "bengala lingvo",
"es": "bengalí",
+ "eu": "bengalera",
"fi": "bengali",
"fr": "bengali",
"gl": "lingua bengalí",
@@ -1453,6 +1494,7 @@
"bnn": {
"ca": "bunun",
"en": "Bunun",
+ "eu": "bununera",
"fi": "bununin kieli",
"fr": "bunun",
"id": "Bahasa Bunun",
@@ -1478,6 +1520,7 @@
"en": "Tibetan",
"eo": "tibeta lingvo",
"es": "tibetano",
+ "eu": "Tibetera",
"fi": "tiibetin kieli",
"fr": "tibétain",
"gl": "Lingua tibetana",
@@ -1520,8 +1563,8 @@
"pt": "Bishnupriya Manipuri",
"ru": "Бишнуприя-манипури",
"sv": "bishnupriya manipuri",
- "zh_Hans": "比什奴普莱利亚-曼尼浦尔语",
- "zh_Hant": "比什奴普萊利亞-曼尼浦爾語",
+ "zh_Hans": "比什努普里亚-曼尼普尔语",
+ "zh_Hant": "比什努普里亞-曼尼普爾語",
"_meta": {
"dir": [
"left-to-right"
@@ -1530,7 +1573,7 @@
},
"bqi": {
"de": "Bachtiarisch",
- "en": "Bakhtiari dialect",
+ "en": "Bakhtiari",
"fr": "bakhtiari",
"it": "dialetto Bakhtiari-Hakhamanesh",
"ja": "バフティヤーリー語",
@@ -1554,6 +1597,7 @@
"en": "Breton",
"eo": "bretona lingvo",
"es": "bretón",
+ "eu": "Bretainiera",
"fi": "bretoni",
"fr": "breton",
"gl": "lingua bretoa",
@@ -1570,6 +1614,7 @@
"ru": "бретонский язык",
"sl": "bretonščina",
"sv": "bretonska",
+ "zh_Hans": "布列塔尼语",
"zh_Hant": "布列塔尼語",
"_meta": {
"dir": [
@@ -1615,6 +1660,7 @@
"nl": "Abinomn",
"pl": "Język abinomn",
"ru": "абиномн",
+ "sl": "abinomn",
"sv": "abinomn",
"_meta": {
"dir": [
@@ -1630,6 +1676,7 @@
"en": "Burushaski",
"eo": "buruŝa lingvo",
"es": "Idioma burushaski",
+ "eu": "Buruxaski",
"fi": "Burušaskin kieli",
"fr": "bourouchaski",
"gl": "Lingua burushaski",
@@ -1671,9 +1718,11 @@
"cs": "Mandailing",
"en": "Mandailing",
"fr": "batak mandailing",
- "id": "Bahasa Batak Mandailing",
+ "id": "Bahasa Mandailing",
"ja": "バタク・マンダイリン語",
+ "nl": "Batak Mandailing",
"pl": "język batak mandailing",
+ "ru": "мандайлингский язык",
"sv": "mandailing",
"zh_Hans": "曼代灵语",
"zh_Hant": "曼代靈語",
@@ -1702,6 +1751,7 @@
"pl": "język bugijski",
"pt": "Língua buginesa",
"ru": "бугийский язык",
+ "sl": "buginščina",
"sv": "buginesiska",
"_meta": {
"dir": [
@@ -1716,12 +1766,13 @@
"en": "Buryat",
"eo": "burjata lingvo",
"es": "idioma buriato",
+ "eu": "Buriatera",
"fi": "Burjaatin kieli",
"fr": "bouriate",
"gl": "Lingua buriata",
"he": "בוריאטית",
"hu": "burját",
- "id": "Bahasa Buryat",
+ "id": "bahasa Buryat",
"it": "buriato",
"ja": "ブリヤート語",
"nb_NO": "burjatisk",
@@ -1771,12 +1822,13 @@
"en": "Catalan",
"eo": "kataluna lingvo",
"es": "catalán",
+ "eu": "katalan",
"fi": "katalaani",
"fr": "catalan",
"gl": "lingua catalá",
"he": "קטלאנית",
"hu": "katalán",
- "id": "bahasa Katala",
+ "id": "Katalan",
"it": "catalano",
"ja": "カタルーニャ語",
"nb_NO": "katalansk",
@@ -1805,6 +1857,7 @@
"en": "Kaqchikel",
"eo": "kakĉikela lingvo",
"es": "Kaqchikel",
+ "eu": "Kaqchikel",
"fr": "cakchiquel",
"gl": "Lingua kaqchikel",
"id": "Bahasa Kaqchikel",
@@ -1830,7 +1883,7 @@
"fi": "Karoliini",
"fr": "carolinien",
"he": "קרוליניאלית",
- "id": "Bahasa Caroline",
+ "id": "bahasa Caroline",
"it": "lingua caroliniana",
"ja": "カロリン語",
"nb_NO": "karolinsk",
@@ -1900,6 +1953,7 @@
"en": "Chechen",
"eo": "ĉeĉena lingvo",
"es": "checheno",
+ "eu": "txetxenera",
"fi": "Tšetšeenin kieli",
"fr": "tchétchène",
"gl": "Lingua chechena",
@@ -1914,7 +1968,7 @@
"pt": "checheno",
"pt_BR": "Língua chechena",
"ru": "чеченский язык",
- "sl": "Čečenščina",
+ "sl": "čečenščina",
"sv": "tjetjenska",
"zh_Hans": "车臣语",
"zh_Hant": "車臣語",
@@ -1932,12 +1986,13 @@
"en": "Cebuano",
"eo": "cebua lingvo",
"es": "cebuano",
+ "eu": "cebuera",
"fi": "Cebun kieli",
"fr": "cebouan",
"gl": "Lingua cebuana",
"he": "סבואנו",
"hu": "szebuano",
- "id": "bahasa Sugbo",
+ "id": "Cebu",
"it": "cebuano",
"ja": "セブ語",
"nb_NO": "cebuano",
@@ -1945,6 +2000,7 @@
"pl": "język cebuański",
"pt": "cebuano",
"ru": "себуанский язык",
+ "sl": "sebuanščina",
"sv": "cebuano",
"zh_Hans": "宿务语",
"zh_Hant": "宿霧語",
@@ -1961,6 +2017,7 @@
"en": "Chamorro",
"eo": "ĉamora lingvo",
"es": "idioma chamorro",
+ "eu": "Chamorro",
"fi": "Tšamorron kieli",
"fr": "chamorro",
"gl": "Lingua chamorra",
@@ -2038,6 +2095,7 @@
"en": "Cherokee",
"eo": "Ĉeroka lingvo",
"es": "cheroqui",
+ "eu": "Txerokiera",
"fi": "Cherokeen kieli",
"fr": "cherokee",
"gl": "Lingua cheroqui",
@@ -2051,6 +2109,7 @@
"pl": "język czirokeski",
"pt": "cherokee",
"ru": "чероки",
+ "sl": "čerokeščina",
"sv": "cherokesiska",
"zh_Hans": "切罗基语",
"zh_Hant": "切羅基語",
@@ -2067,6 +2126,7 @@
"en": "Cheyenne",
"eo": "Ĉejena lingvo",
"es": "cheyene",
+ "eu": "Cheyennera",
"fi": "Cheyennen kieli",
"fr": "cheyenne",
"gl": "Lingua cheyenne",
@@ -2097,6 +2157,7 @@
"en": "Sorani",
"eo": "sorana lingvo",
"es": "sorani",
+ "eu": "Sorani",
"fi": "sorani",
"fr": "sorani",
"gl": "lingua kurda central",
@@ -2109,6 +2170,7 @@
"pl": "język sorani",
"pt": "Língua sorâni",
"ru": "сорани",
+ "sl": "soranščina",
"sv": "soranî",
"zh_Hans": "中库尔德语",
"zh_Hant": "中庫德語",
@@ -2126,6 +2188,7 @@
"en": "Chukchi",
"eo": "Ĉukĉa lingvo",
"es": "Idioma chucoto",
+ "eu": "Txuktxiera",
"fi": "Tšuktšin kieli",
"fr": "tchouktche",
"gl": "Lingua Chukoto",
@@ -2152,6 +2215,7 @@
"en": "Hakha–Chin",
"fr": "haka chin",
"ja": "ハカ語",
+ "nl": "Hakha-Chin",
"ru": "Чинский язык",
"sv": "hakha-chin",
"_meta": {
@@ -2168,6 +2232,7 @@
"en": "Corsican",
"eo": "korsika lingvo",
"es": "corso",
+ "eu": "Korsikera",
"fi": "Korsikan kieli",
"fr": "corse",
"gl": "Lingua corsa",
@@ -2181,7 +2246,7 @@
"pl": "język korsykański",
"pt": "Língua corsa",
"ru": "корсиканский язык",
- "sl": "Korziščina",
+ "sl": "korziščina",
"sv": "korsikanska",
"_meta": {
"dir": [
@@ -2195,6 +2260,7 @@
"fr": "puxian",
"ja": "莆仙語",
"nb_NO": "Puxian",
+ "nl": "Puxian",
"pl": "Język puxian",
"pt": "Língua putian",
"ru": "Пусяньский язык",
@@ -2203,7 +2269,7 @@
"zh_Hant": "莆仙語",
"_meta": {
"dir": [
- "top-to-bottom"
+ "left-to-right"
]
}
},
@@ -2214,6 +2280,7 @@
"en": "Cree",
"eo": "kria lingvo",
"es": "idioma cree",
+ "eu": "cree hizkuntza",
"fi": "Cree",
"fr": "cri",
"gl": "Lingua cree",
@@ -2243,6 +2310,7 @@
"en": "Crimean Tatar",
"eo": "krime-tatara lingvo",
"es": "tártaro de Crimea",
+ "eu": "Krimeako tatarera",
"fi": "krimintataari",
"fr": "tatar de Crimée",
"gl": "Lingua tártara de Crimea",
@@ -2257,7 +2325,7 @@
"pt": "tártaro da Crimeia",
"pt_BR": "Língua tártara da Crimeia",
"ru": "крымскотатарский язык",
- "sl": "Krimska tatarščina",
+ "sl": "krimska tatarščina",
"sv": "krimtatariska",
"zh_Hans": "克里米亚鞑靼语",
"zh_Hant": "克里米亞韃靼語",
@@ -2284,7 +2352,7 @@
"it": "creolo delle Seychelles",
"ja": "セーシェル・クレオール語",
"nb_NO": "seychellisk kreol",
- "nl": "Seychellois Creole",
+ "nl": "Seychellencreools",
"pl": "Język kreolski seszelski",
"pt": "Crioulo de Seychelles",
"ru": "сейшельский креольский язык",
@@ -2303,6 +2371,7 @@
"en": "Czech",
"eo": "ĉeĥa lingvo",
"es": "checo",
+ "eu": "txekiera",
"fi": "tšekki",
"fr": "tchèque",
"gl": "lingua checa",
@@ -2338,12 +2407,13 @@
"en": "Kashubian",
"eo": "kaŝuba lingvo",
"es": "casubio",
+ "eu": "Kaxubiera",
"fi": "kašubi",
"fr": "cachoube",
"gl": "Lingua caxubia",
"he": "קשובית",
"hu": "kasub",
- "id": "bahasa Kasubia",
+ "id": "Kashubia",
"it": "casciubo",
"ja": "カシューブ語",
"nb_NO": "kasjubisk",
@@ -2390,6 +2460,7 @@
"en": "Chuvash",
"eo": "ĉuvaŝa lingvo",
"es": "chuvasio",
+ "eu": "txuvaxera",
"fi": "tšuvassi",
"fr": "tchouvache",
"gl": "Lingua chuvash",
@@ -2422,12 +2493,13 @@
"en": "Welsh",
"eo": "kimra lingvo",
"es": "galés",
+ "eu": "gales",
"fi": "kymri",
"fr": "gallois",
"gl": "lingua galesa",
"he": "ולשית",
"hu": "walesi",
- "id": "Bahasa Wales",
+ "id": "bahasa Wales",
"it": "gallese",
"ja": "ウェールズ語",
"nb_NO": "walisisk",
@@ -2454,6 +2526,7 @@
"en": "Danish",
"eo": "dana lingvo",
"es": "danés",
+ "eu": "daniera",
"fi": "tanska",
"fr": "danois",
"gl": "lingua dinamarquesa",
@@ -2489,6 +2562,7 @@
"en": "Dagbani",
"eo": "Dagbania lingvo",
"es": "dagbani",
+ "eu": "Dagbani",
"fi": "Dagbanin kieli",
"fr": "dagbani",
"gl": "Lingua dagbani",
@@ -2515,6 +2589,7 @@
"en": "German",
"eo": "germana lingvo",
"es": "alemán",
+ "eu": "aleman",
"fi": "saksa",
"fr": "allemand",
"gl": "lingua alemá",
@@ -2554,6 +2629,7 @@
"de": "Dinka",
"en": "Dinka",
"es": "idioma dinka",
+ "eu": "dinka",
"fi": "dinka",
"fr": "dinka",
"gl": "Lingua dinka",
@@ -2579,6 +2655,7 @@
"en": "Zazaki",
"eo": "zazaa",
"es": "zazaki",
+ "eu": "Zazaki",
"fi": "zaza",
"fr": "zazaki",
"gl": "Lingua zazaki",
@@ -2633,6 +2710,7 @@
"en": "Lower Sorbian",
"eo": "malsuprasoraba lingvo",
"es": "bajo sorabo",
+ "eu": "Behe sorabiera",
"fr": "bas-sorabe",
"gl": "Baixo sorabo",
"he": "סורבית תחתית",
@@ -2723,6 +2801,7 @@
"en": "Maldivian",
"eo": "maldiva lingvo",
"es": "maldivo",
+ "eu": "Maldivera",
"fi": "Divehin kieli",
"fr": "maldivien",
"gl": "lingua maldivana",
@@ -2737,6 +2816,7 @@
"pt": "Língua divehi",
"pt_BR": "Língua divehi",
"ru": "мальдивский язык",
+ "sl": "maldivščina",
"sv": "divehi",
"zh_Hans": "迪维希语",
"zh_Hant": "迪維希語",
@@ -2757,6 +2837,7 @@
"en": "Dzongkha",
"eo": "dzonka lingvo",
"es": "dzongkha",
+ "eu": "Dzongkha",
"fi": "dzongkha",
"fr": "dzongkha",
"gl": "Lingua dzongkha",
@@ -2787,10 +2868,12 @@
"ee": {
"ca": "ewe",
"cs": "eveština",
+ "da": "ewe",
"de": "Ewe",
"en": "Ewe",
"eo": "evea lingvo",
"es": "ewé",
+ "eu": "eweera",
"fi": "ewen kieli",
"fr": "ewé",
"gl": "Lingua ewe",
@@ -2804,6 +2887,7 @@
"pl": "Język ewe",
"pt": "ewe",
"ru": "эве",
+ "sl": "eveščina",
"sv": "ewe",
"_meta": {
"dir": [
@@ -2858,29 +2942,30 @@
}
},
"el": {
- "ca": "grec",
- "cs": "řečtina",
- "da": "græsk",
- "de": "Griechisch",
- "en": "Greek",
- "eo": "greka lingvo",
+ "ca": "grec modern",
+ "cs": "novořečtina",
+ "da": "nygræsk",
+ "de": "Neugriechisch",
+ "en": "Modern Greek",
+ "eo": "moderna greka lingvo",
"es": "griego",
- "fi": "kreikka",
- "fr": "grec",
- "gl": "lingua grega",
- "he": "יוונית",
- "hu": "görög",
- "id": "Yunani",
- "it": "greco",
- "ja": "ギリシア語",
+ "eu": "greziera modernoa",
+ "fi": "nykykreikka",
+ "fr": "grec moderne",
+ "gl": "lingua grega moderna",
+ "he": "יוונית מודרנית",
+ "hu": "újgörög",
+ "id": "Yunani Modern",
+ "it": "greco moderno",
+ "ja": "現代ギリシア語",
"nb_NO": "nygresk",
- "nl": "Grieks",
+ "nl": "Nieuwgrieks",
"pl": "język nowogrecki",
- "pt": "grego",
+ "pt": "grego moderno",
"pt_BR": "língua grega",
- "ru": "греческий язык",
- "sl": "grščina",
- "sv": "grekiska",
+ "ru": "новогреческий язык",
+ "sl": "novogrščina",
+ "sv": "nygrekiska",
"zh_Hans": "希腊语",
"zh_Hant": "希臘語",
"_meta": {
@@ -2901,6 +2986,7 @@
"en": "English",
"eo": "angla lingvo",
"es": "inglés",
+ "eu": "ingeles",
"fi": "englanti",
"fr": "anglais",
"gl": "lingua inglesa",
@@ -2996,6 +3082,7 @@
"en": "Esperanto",
"eo": "Esperanto",
"es": "esperanto",
+ "eu": "esperanto",
"fi": "esperanto",
"fr": "espéranto",
"gl": "esperanto",
@@ -3028,6 +3115,7 @@
"en": "Spanish",
"eo": "hispana lingvo",
"es": "español",
+ "eu": "gaztelania",
"fi": "espanja",
"fr": "espagnol",
"gl": "lingua castelá",
@@ -3104,12 +3192,13 @@
"en": "Estonian",
"eo": "estona lingvo",
"es": "estonio",
+ "eu": "Estoniera",
"fi": "viro",
"fr": "estonien",
"gl": "lingua estoniana",
"he": "אסטונית",
"hu": "észt",
- "id": "bahasa Esti",
+ "id": "Esti",
"it": "estone",
"ja": "エストニア語",
"nb_NO": "estisk",
@@ -3138,6 +3227,7 @@
"en": "Basque",
"eo": "eŭska lingvo",
"es": "euskera",
+ "eu": "euskara",
"fi": "baski",
"fr": "basque",
"gl": "lingua éuscara",
@@ -3168,10 +3258,11 @@
"en": "Extremaduran",
"eo": "ekstremadura lingvo",
"es": "extremeño",
+ "eu": "Extremadurera",
"fi": "extremadura",
"fr": "estrémègne",
"gl": "lingua estremeña",
- "id": "Bahasa Estremeñu",
+ "id": "bahasa Extremadura",
"it": "estremegno",
"ja": "エストレマドゥーラ語",
"nb_NO": "ekstremaduransk",
@@ -3179,6 +3270,7 @@
"pl": "język estremadurski",
"pt": "Língua estremenha",
"ru": "Эстремадурский язык",
+ "sl": "ekstremadurščina",
"sv": "extremaduriska",
"_meta": {
"dir": [
@@ -3194,6 +3286,7 @@
"en": "Persian",
"eo": "persa lingvo",
"es": "persa",
+ "eu": "persiera",
"fi": "persia",
"fr": "persan",
"gl": "lingua persa",
@@ -3228,12 +3321,13 @@
"en": "Dari",
"eo": "daria lingvo",
"es": "dari",
+ "eu": "dari",
"fi": "darin kieli",
"fr": "dari",
"gl": "Lingua dari",
"he": "דארי",
"hu": "dari",
- "id": "Bahasa Persia Afgani",
+ "id": "Dari",
"it": "dari",
"ja": "ダリー語",
"nb_NO": "dari",
@@ -3242,6 +3336,7 @@
"pt": "Língua dari",
"pt_BR": "Língua dari",
"ru": "дари",
+ "sl": "darijščina",
"sv": "dari",
"zh_Hans": "达利语",
"zh_Hant": "達利語",
@@ -3259,6 +3354,7 @@
"en": "Fula",
"eo": "fula lingvo",
"es": "fula",
+ "eu": "fula",
"fi": "Fulani",
"fr": "peul",
"gl": "Lingua fula",
@@ -3291,12 +3387,13 @@
"en": "Finnish",
"eo": "finna lingvo",
"es": "finés",
+ "eu": "finlandiera",
"fi": "suomi",
"fr": "finnois",
"gl": "finés",
"he": "פינית",
"hu": "finn",
- "id": "bahasa Suomi",
+ "id": "Suomi",
"it": "finlandese",
"ja": "フィンランド語",
"nb_NO": "finsk",
@@ -3326,6 +3423,7 @@
"en": "Filipino",
"eo": "filipina lingvo",
"es": "idioma filipino",
+ "eu": "filipinera",
"fi": "filipino",
"fr": "philippin",
"gl": "Lingua filipina",
@@ -3341,7 +3439,7 @@
"pt_BR": "Língua filipina",
"ru": "филиппинский язык",
"sl": "filipinščina",
- "sv": "Filipino",
+ "sv": "filippinska",
"zh_Hant": "菲律賓語",
"_meta": {
"dir": [
@@ -3357,6 +3455,7 @@
"en": "Meänkieli",
"eo": "tornival-finna lingvo",
"es": "meänkieli",
+ "eu": "Meänkieli",
"fi": "meänkieli",
"fr": "meänkieli",
"gl": "meänkieli",
@@ -3386,7 +3485,7 @@
"de": "Võro",
"en": "Võro",
"eo": "voroa lingvo",
- "es": "Idioma võro",
+ "es": "idioma võro",
"fi": "võro",
"fr": "võro",
"gl": "Lingua võro",
@@ -3415,6 +3514,7 @@
"en": "Fijian",
"eo": "fiĝia lingvo",
"es": "fiyiano",
+ "eu": "Fijiera",
"fi": "Fidžin kieli",
"fr": "fidjien",
"gl": "Lingua fidxiana",
@@ -3447,6 +3547,7 @@
"en": "Kven",
"eo": "kvena lingvo",
"es": "kven",
+ "eu": "kvenera",
"fi": "kveeni",
"fr": "kvène",
"gl": "Lingua kven",
@@ -3477,6 +3578,7 @@
"en": "Faroese",
"eo": "feroa lingvo",
"es": "feroés",
+ "eu": "Faroera",
"fi": "fäärin kieli",
"fr": "féroïen",
"gl": "lingua feroesa",
@@ -3505,6 +3607,7 @@
"en": "Fon",
"eo": "fonua lingvo",
"es": "idioma fon",
+ "eu": "Fonera",
"fi": "Fonin kieli",
"fr": "fon-gbe",
"gl": "Lingua fon",
@@ -3533,6 +3636,7 @@
"en": "French",
"eo": "franca lingvo",
"es": "francés",
+ "eu": "frantses",
"fi": "ranska",
"fr": "français",
"gl": "lingua francesa",
@@ -3596,6 +3700,7 @@
"en": "Louisiana French",
"eo": "luiziana franca dialekto",
"es": "francés cajún",
+ "eu": "Louisianako frantses",
"fr": "français de Louisiane",
"id": "Bahasa Prancis Louisiana",
"it": "francese cajun",
@@ -3613,10 +3718,12 @@
"frp": {
"ca": "francoprovençal",
"cs": "franko-provensálština",
+ "da": "frankoprovençalsk",
"de": "Frankoprovenzalisch",
"en": "Franco-Provençal",
"eo": "arpitana lingvo",
"es": "franco-provenzal",
+ "eu": "Frankoprovenzera",
"fi": "Arpitaani",
"fr": "francoprovençal",
"gl": "Lingua francoprovenzal",
@@ -3631,6 +3738,7 @@
"pt": "franco-provençal",
"pt_BR": "Língua franco-provençal",
"ru": "франкопровансальский язык",
+ "sl": "frankoprovansalščina",
"sv": "frankoprovensalska",
"_meta": {
"dir": [
@@ -3645,6 +3753,7 @@
"en": "North Frisian",
"eo": "nordfrisa lingvo",
"es": "frisón septentrional",
+ "eu": "Iparraldeko frisiera",
"fi": "Pohjoisfriisi",
"fr": "frison septentrional",
"gl": "Lingua frisoa setentrional",
@@ -3676,6 +3785,7 @@
"en": "Friulian",
"eo": "friula lingvo",
"es": "friulano",
+ "eu": "Friuliera",
"fi": "Friulin kieli",
"fr": "frioulan",
"gl": "Lingua friulana",
@@ -3705,6 +3815,7 @@
"en": "West Frisian",
"eo": "okcidentfrisa lingvo",
"es": "frisón occidental",
+ "eu": "Mendebaldeko frisiera",
"fi": "länsifriisin kieli",
"fr": "frison occidental",
"gl": "Lingua frisoa occidental",
@@ -3736,6 +3847,7 @@
"en": "Irish",
"eo": "irlanda lingvo",
"es": "irlandés",
+ "eu": "Irlandako gaelera",
"fi": "iiri",
"fr": "irlandais",
"gl": "lingua irlandesa",
@@ -3793,6 +3905,7 @@
"en": "Gagauz",
"eo": "gagauza lingvo",
"es": "gagaúzo",
+ "eu": "Gagauzera",
"fi": "gagauzi",
"fr": "gagaouze",
"gl": "Lingua gagauza",
@@ -3806,7 +3919,7 @@
"pl": "Język gagauski",
"pt": "Língua gagaúza",
"ru": "Гагаузский язык",
- "sl": "Gagauščina",
+ "sl": "gagavščina",
"sv": "gagauziska",
"zh_Hans": "加告兹语",
"zh_Hant": "加告茲語",
@@ -3820,7 +3933,7 @@
"ca": "gan",
"da": "Gan",
"de": "Gan",
- "en": "Gan",
+ "en": "Gan Chinese",
"eo": "gana lingvo",
"es": "chino gan",
"fi": "Gan-kiina",
@@ -3835,6 +3948,7 @@
"pl": "język gan",
"pt": "Chinês gan",
"ru": "Гань",
+ "sl": "gan",
"sv": "gan",
"zh_Hant": "贛語",
"_meta": {
@@ -3853,7 +3967,7 @@
"gl": "Crioulo da Güiana Francesa",
"it": "lingua creola della Guyana francese",
"ja": "仏領ギアナのクレオール語",
- "nl": "French Guianese Creole",
+ "nl": "Guianaans-Creools",
"pl": "język kreolski Gujany Francuskiej",
"pt": "Crioulo da Guiana Francesa",
"ru": "Гвианский креольский язык",
@@ -3874,6 +3988,7 @@
"en": "Scottish Gaelic",
"eo": "skotgaela lingvo",
"es": "gaélico escocés",
+ "eu": "Eskoziako gaelera",
"fi": "Gaeli",
"fr": "gaélique écossais",
"gl": "Lingua gaélica escocesa",
@@ -3904,6 +4019,7 @@
"en": "Gilbertese",
"eo": "kiribata lingvo",
"es": "gilbertino",
+ "eu": "kiribatiera",
"fi": "Kiribatin kieli",
"fr": "gilbertin",
"gl": "Lingua kiribatiana",
@@ -3917,6 +4033,7 @@
"pl": "Język kiribati",
"pt": "Gilbertês",
"ru": "кирибати",
+ "sl": "kiribatščina",
"sv": "kiribatiska",
"_meta": {
"dir": [
@@ -3932,12 +4049,13 @@
"en": "Galician",
"eo": "galega lingvo",
"es": "gallego",
+ "eu": "galiziera",
"fi": "galicia",
"fr": "galicien",
"gl": "lingua galega",
"he": "גליסית",
"hu": "galiciai",
- "id": "Bahasa Galisia",
+ "id": "bahasa Galisia",
"it": "gallego",
"ja": "ガリシア語",
"nb_NO": "galisisk",
@@ -3961,6 +4079,7 @@
"en": "Gilaki",
"eo": "gila lingvo",
"es": "gileki",
+ "eu": "Gilaki",
"fi": "Gilakin kieli",
"fr": "gilaki",
"gl": "Lingua gilaki",
@@ -3988,9 +4107,10 @@
"en": "Guarani",
"eo": "gvarania lingvo",
"es": "guaraní",
+ "eu": "Guaraniera",
"fi": "Guaranin kieli",
"fr": "guarani",
- "gl": "Lingua guaraní",
+ "gl": "lingua guaraní",
"he": "גוארני",
"hu": "guarani",
"id": "bahasa Guarani",
@@ -4004,6 +4124,8 @@
"ru": "гуарани",
"sl": "Gvaranščina",
"sv": "guaraní",
+ "zh_Hans": "瓜纳尼语",
+ "zh_Hant": "瓜拉尼語",
"_meta": {
"countries": [
"BO",
@@ -4036,6 +4158,7 @@
"en": "Gorontalo",
"eo": "gorontala lingvo",
"es": "Idioma gorontalo",
+ "eu": "Gorontalo",
"fi": "Gorontalon kieli",
"fr": "gorontalo",
"gl": "Gorontalo",
@@ -4063,6 +4186,7 @@
"eo": "ganaa piĝino",
"es": "pidgin inglés de Ghana",
"gl": "Pidgin ghanés",
+ "nl": "Ghanees-Pidgin",
"ru": "ганский пиджин английского",
"sv": "ghanansk pidginengelska",
"_meta": {
@@ -4106,6 +4230,7 @@
"en": "Alsatian",
"eo": "alzaca lingvo",
"es": "alsaciano",
+ "eu": "Alsaziera",
"fi": "Elsassi",
"fr": "alsacien",
"gl": "Lingua alsaciana",
@@ -4135,6 +4260,7 @@
"en": "Gujarati",
"eo": "guĝarata lingvo",
"es": "guyaratí",
+ "eu": "gujaratera",
"fi": "gudžarati",
"fr": "gujarati",
"gl": "lingua guxaratí",
@@ -4163,10 +4289,12 @@
"en": "Wayuu",
"eo": "vajua lingvo",
"es": "Idioma wayú",
+ "eu": "Wayuu hizkuntza",
"fr": "wayuu",
"gl": "Lingua wayuu",
"it": "lingua wayuu",
"ja": "ワユ語",
+ "nb_NO": "wayuu",
"nl": "Wayuu",
"pl": "Język wayuu",
"pt": "Língua wayuu",
@@ -4204,6 +4332,7 @@
"en": "Manx",
"eo": "manksa lingvo",
"es": "manés",
+ "eu": "Manxera",
"fi": "manksi",
"fr": "mannois",
"gl": "Lingua manx",
@@ -4229,10 +4358,12 @@
"ha": {
"ca": "haussa",
"cs": "hauština",
+ "da": "hausa",
"de": "Hausa",
"en": "Hausa",
"eo": "haŭsa lingvo",
"es": "hausa",
+ "eu": "Hausa",
"fi": "hausan kieli",
"fr": "haoussa",
"gl": "Lingua hausa",
@@ -4262,6 +4393,7 @@
"en": "Haida",
"eo": "Ĥajda lingvo",
"es": "idioma haida",
+ "eu": "Haida hizkuntza",
"fi": "Haida",
"fr": "haïda",
"gl": "Lingua haida",
@@ -4286,9 +4418,9 @@
"ca": "hakka",
"cs": "Hakka",
"de": "Hakka",
- "en": "Hakka",
+ "en": "Hakka Chinese",
"eo": "hakaa lingvo",
- "es": "Chino hakka",
+ "es": "chino hakka",
"fi": "Hakka-kiina",
"fr": "hakka",
"gl": "Lingua hakka",
@@ -4320,6 +4452,7 @@
"en": "Hawaiian",
"eo": "havaja lingvo",
"es": "hawaiano",
+ "eu": "hawaiiera",
"fi": "havaijin kieli",
"fr": "hawaïen",
"gl": "Lingua hawaiana",
@@ -4334,7 +4467,7 @@
"pt": "havaiano",
"pt_BR": "língua havaiana",
"ru": "гавайский язык",
- "sl": "Havajščina",
+ "sl": "havajščina",
"sv": "hawaiiska",
"zh_Hant": "夏威夷語",
"_meta": {
@@ -4351,12 +4484,13 @@
"en": "Hebrew",
"eo": "hebrea lingvo",
"es": "hebreo",
+ "eu": "hebreera",
"fi": "heprea",
"fr": "hébreu",
"gl": "lingua hebrea",
"he": "עברית",
"hu": "héber",
- "id": "Bahasa Ibrani",
+ "id": "Ibrani",
"it": "ebraico",
"ja": "ヘブライ語",
"nb_NO": "hebraisk",
@@ -4386,6 +4520,7 @@
"en": "Fiji Hindi",
"eo": "Fiĝia hindia lingvo",
"es": "hindi de Fiyi",
+ "eu": "Fijiko hindi",
"fi": "Fidžinhindi",
"fr": "hindi des Fidji",
"gl": "Hindi de Fidxi",
@@ -4394,7 +4529,7 @@
"it": "hindi figiano",
"ja": "フィジー・ヒンディー語",
"nb_NO": "Fijiansk hindi",
- "nl": "Fijisch Hindoestani",
+ "nl": "Fijisch-Hindoestani",
"pl": "hindi fidżyjskie",
"pt": "Hindi fijiano",
"ru": "фиджийский хинди",
@@ -4410,7 +4545,7 @@
"da": "hiligajisk",
"de": "Hiligaynon",
"en": "Hiligaynon",
- "eo": "hiligajnona lingvo",
+ "eo": "hiligajna lingvo",
"es": "hiligueino",
"fi": "Hiligainon kieli",
"fr": "hiligaïnon",
@@ -4422,6 +4557,7 @@
"pl": "Język hiligaynon",
"pt": "Língua hiligaynon",
"ru": "Хилигайнон",
+ "sl": "hiligajnonščina",
"sv": "hiligaynon",
"_meta": {
"dir": [
@@ -4440,8 +4576,10 @@
"it": "Hindko",
"ja": "ヒンドコ語",
"nb_NO": "hindko",
+ "nl": "Hindko",
"pt": "Língua hindko",
"ru": "хиндко",
+ "sl": "hindščina",
"sv": "hindko",
"zh_Hans": "印德科语",
"zh_Hant": "印德科語",
@@ -4459,6 +4597,7 @@
"en": "Hiri Motu",
"eo": "hirimotua lingvo",
"es": "Hiri motu",
+ "eu": "Hiri Motu",
"fi": "Hiri motu",
"fr": "hiri motou",
"gl": "Hiri Motu",
@@ -4489,6 +4628,7 @@
"de": "Ho",
"en": "Ho",
"eo": "hoa lingvo",
+ "eu": "Hoera",
"fi": "Hon kieli",
"fr": "ho",
"it": "lingua ho",
@@ -4508,6 +4648,7 @@
"en": "Hunsrik",
"eo": "Sudriogranda germana dialekto",
"es": "Riograndenser Hunsrückisch",
+ "eu": "Riograndenser hunsrückisch",
"fr": "hunsrik",
"gl": "Hunsrik",
"it": "lingua hunsrik",
@@ -4516,7 +4657,7 @@
"pl": "Riograndenser Hunsrückisch",
"pt": "hunsriqueano riograndense",
"pt_BR": "hunsriqueano riograndense",
- "ru": "Хунсрик",
+ "ru": "хунсрик",
"sv": "hunsrik",
"_meta": {
"dir": [
@@ -4531,6 +4672,7 @@
"en": "Upper Sorbian",
"eo": "suprasoraba lingvo",
"es": "alto sorabo",
+ "eu": "Goi-sorabiera",
"fi": "yläsorbi",
"fr": "haut-sorabe",
"gl": "Alto sorabo",
@@ -4562,6 +4704,7 @@
"en": "Haitian Creole",
"eo": "haitia kreola lingvo",
"es": "criollo haitiano",
+ "eu": "Haitiko kreolera",
"fi": "haiti",
"fr": "créole haïtien",
"gl": "Crioulo haitiano",
@@ -4571,7 +4714,7 @@
"it": "creolo haitiano",
"ja": "ハイチ語",
"nb_NO": "haitisk",
- "nl": "Haïtiaans Creools",
+ "nl": "Haïtiaans-Creools",
"pl": "język kreolski haitański",
"pt": "crioulo haitiano",
"pt_BR": "Língua crioula haitiana",
@@ -4597,12 +4740,13 @@
"en": "Hungarian",
"eo": "hungara lingvo",
"es": "húngaro",
+ "eu": "hungariera",
"fi": "unkari",
"fr": "hongrois",
"gl": "lingua húngara",
"he": "הונגרית",
"hu": "magyar",
- "id": "Hongaria",
+ "id": "bahasa Hungaria",
"it": "ungherese",
"ja": "ハンガリー語",
"nb_NO": "ungarsk",
@@ -4633,6 +4777,7 @@
"en": "Armenian",
"eo": "armena lingvo",
"es": "armenio",
+ "eu": "armeniera",
"fi": "armenia",
"fr": "arménien",
"gl": "lingua armenia",
@@ -4692,6 +4837,7 @@
"en": "Herero",
"eo": "herera lingvo",
"es": "herero",
+ "eu": "Hereroera",
"fi": "Hereron kieli",
"fr": "héréro",
"gl": "Lingua herero",
@@ -4720,12 +4866,13 @@
"en": "Indonesian",
"eo": "indonezia lingvo",
"es": "indonesio",
+ "eu": "Indonesiera",
"fi": "indonesia",
"fr": "indonésien",
"gl": "lingua indonesia",
"he": "אינדונזית",
"hu": "indonéz",
- "id": "Bahasa Indonesia",
+ "id": "bahasa Indonesia",
"it": "indonesiano",
"ja": "インドネシア語",
"nb_NO": "indonesisk",
@@ -4747,41 +4894,13 @@
]
}
},
- "ig": {
- "ca": "igbo",
- "cs": "igboština",
- "da": "Igbo",
- "de": "Igbo",
- "en": "Igbo",
- "eo": "igba lingvo",
- "es": "idioma igbo",
- "fi": "igbon kieli",
- "fr": "igbo",
- "gl": "Lingua ibo",
- "he": "איגבו",
- "hu": "igbo",
- "id": "Bahasa Igbo",
- "it": "igbo",
- "ja": "イボ語",
- "nb_NO": "ibo",
- "nl": "Igbo",
- "pl": "język igbo",
- "pt": "Língua igbo",
- "ru": "игбо",
- "sv": "igbo",
- "zh_Hant": "伊博語",
- "_meta": {
- "dir": [
- "left-to-right"
- ]
- }
- },
"ii": {
"ca": "nuosu",
"de": "Nuosu-Sprache",
"en": "Nuosu",
"eo": "Siĉuana jia lingvo",
"es": "Idioma nuosu",
+ "eu": "nuosu",
"fi": "Sichuanin-yi",
"fr": "nuosu",
"gl": "Lingua nuosu",
@@ -4807,6 +4926,7 @@
"en": "Inupiaq",
"eo": "inupiaka lingvo",
"es": "Idioma iñupiaq",
+ "eu": "inupiaq",
"fi": "Inupiatun",
"fr": "inupiaq",
"gl": "Lingua inupiaq",
@@ -4847,6 +4967,7 @@
"pl": "język iloko",
"pt": "Ilocano",
"ru": "Илоканский язык",
+ "sl": "ilokanščina",
"sv": "ilokano",
"_meta": {
"dir": [
@@ -4862,6 +4983,7 @@
"en": "Ingush",
"eo": "inguŝa lingvo",
"es": "ingusetio",
+ "eu": "Inguxera",
"fi": "Inguušin kieli",
"fr": "ingouche",
"gl": "Lingua ingusetia",
@@ -4875,6 +4997,7 @@
"pl": "Język inguski",
"pt": "Língua inguche",
"ru": "ингушский язык",
+ "sl": "inguščina",
"sv": "ingusjiska",
"_meta": {
"dir": [
@@ -4890,6 +5013,7 @@
"en": "Icelandic",
"eo": "islanda lingvo",
"es": "islandés",
+ "eu": "islandiera",
"fi": "islanti",
"fr": "islandais",
"gl": "lingua islandesa",
@@ -4925,6 +5049,7 @@
"en": "Italian",
"eo": "itala lingvo",
"es": "italiano",
+ "eu": "italiera",
"fi": "italia",
"fr": "italien",
"gl": "lingua italiana",
@@ -4963,6 +5088,7 @@
"en": "Inuktitut",
"eo": "inuktituta lingvo",
"es": "lenguas inuit",
+ "eu": "Inuitera",
"fi": "Inuktitut",
"fr": "inuktitut",
"gl": "Lingua inuktitut",
@@ -4995,6 +5121,7 @@
"en": "Japanese",
"eo": "japana lingvo",
"es": "japonés",
+ "eu": "japoniera",
"fi": "japani",
"fr": "japonais",
"gl": "lingua xaponesa",
@@ -5032,6 +5159,7 @@
"en": "Jamaican Patois",
"eo": "jamajka-kreola lingvo",
"es": "Criollo jamaicano",
+ "eu": "Jamaikako kreolera",
"fi": "Jamaikankreoli",
"fr": "créole jamaïcain",
"gl": "Patois xamaicano",
@@ -5040,7 +5168,7 @@
"id": "Patwa Jamaika",
"it": "lingua creola giamaicana",
"ja": "ジャマイカ・クレオール語",
- "nl": "Jamaicaans Patois",
+ "nl": "Jamaicaans-Patois",
"pl": "język jamajski",
"pt": "Patoá jamaicano",
"pt_BR": "Patoá jamaicano",
@@ -5076,12 +5204,13 @@
"en": "Javanese",
"eo": "java lingvo",
"es": "javanés",
+ "eu": "Javera",
"fi": "jaavan kieli",
"fr": "javanais",
"gl": "Lingua xavanesa",
"he": "ג'אווה",
"hu": "jávai",
- "id": "Jawa",
+ "id": "bahasa Jawa",
"it": "giavanese",
"ja": "ジャワ語",
"nb_NO": "javanesisk",
@@ -5112,6 +5241,7 @@
"en": "Georgian",
"eo": "kartvela lingvo",
"es": "georgiano",
+ "eu": "georgiera",
"fi": "georgia",
"fr": "géorgien",
"gl": "lingua xeorxiana",
@@ -5146,6 +5276,7 @@
"en": "Karakalpak",
"eo": "karakalpaka lingvo",
"es": "Idioma karakalpako",
+ "eu": "Karakalpakera",
"fi": "karapalkki",
"fr": "karakalpak",
"gl": "Lingua karakalpak",
@@ -5174,6 +5305,7 @@
"en": "Kabyle",
"eo": "kabila lingvo",
"es": "cabilio",
+ "eu": "kabiliera",
"fi": "Kabyyli",
"fr": "kabyle",
"gl": "Lingua cabilia",
@@ -5187,6 +5319,7 @@
"pt": "Língua cabila",
"pt_BR": "Língua cabila",
"ru": "кабильский язык",
+ "sl": "kabilščina",
"sv": "kabyliska",
"zh_Hant": "卡拜爾語",
"_meta": {
@@ -5201,7 +5334,8 @@
"de": "Kabardinisch",
"en": "Kabardian",
"eo": "kabarda lingvo",
- "es": "Idioma cabardiano",
+ "es": "cabardino",
+ "eu": "Kabardera",
"fi": "Kabardin kieli",
"fr": "kabarde",
"gl": "Lingua kabardina",
@@ -5237,6 +5371,7 @@
"he": "קאביה",
"id": "Bahasa Kabiye",
"ja": "カビエ語",
+ "nb_NO": "kabiye",
"nl": "Kabiye",
"pl": "język kabre",
"pt": "Língua kabiyé",
@@ -5280,10 +5415,11 @@
"it": "creolo capoverdiano",
"ja": "カーボベルデ・クレオール語",
"nb_NO": "kappverdisk kreol",
- "nl": "Kaapverdisch Creools",
+ "nl": "Kaapverdisch-Creools",
"pl": "Język kreolski Wysp Zielonego Przylądka",
"pt": "crioulo cabo-verdiano",
"ru": "кабувердьяну",
+ "sl": "zelenortska kreolščina",
"sv": "krioli",
"_meta": {
"dir": [
@@ -5299,6 +5435,7 @@
"en": "Kongo",
"eo": "konga lingvo",
"es": "kikongo",
+ "eu": "Kikongo",
"fi": "kongon kieli",
"fr": "kikongo",
"gl": "Lingua congo",
@@ -5319,12 +5456,32 @@
]
}
},
+ "kgp": {
+ "de": "Kaingang",
+ "en": "Kaingang",
+ "eo": "kainganga lingvo",
+ "es": "Lengua kaingang",
+ "fr": "kaingang",
+ "it": "lingue kaingang",
+ "ja": "カインガング語",
+ "nb_NO": "Kaingang",
+ "nl": "Kaingang",
+ "pt": "Língua caingangue",
+ "pt_BR": "Língua kaingáng",
+ "ru": "Каинганг",
+ "_meta": {
+ "dir": [
+ "left-to-right"
+ ]
+ }
+ },
"kha": {
"ca": "khasi",
"cs": "khasiština",
"de": "Khasi",
"en": "Khasi",
"eo": "kasia lingvo",
+ "eu": "khasiera",
"fi": "Khasi",
"fr": "khasi",
"he": "קהאסי",
@@ -5385,6 +5542,7 @@
"en": "Gikuyu",
"eo": "kikuja lingvo",
"es": "kikuyu",
+ "eu": "kikuyuera",
"fi": "Kikujun kieli",
"fr": "kikuyu",
"gl": "Lingua kikuyu",
@@ -5454,7 +5612,7 @@
"fr": "pwo de l'Est",
"ja": "東ポー語",
"nb_NO": "østpwo",
- "nl": "oostelijk Pwo",
+ "nl": "Oostelijk Pwo",
"pt": "Língua pwo leste",
"ru": "Восточный пво",
"sv": "östlig pwo",
@@ -5472,6 +5630,7 @@
"en": "Kazakh",
"eo": "kazaĥa lingvo",
"es": "kazajo",
+ "eu": "kazakhera",
"fi": "kazakki",
"fr": "kazakh",
"gl": "Lingua casaca",
@@ -5508,12 +5667,13 @@
"en": "Greenlandic",
"eo": "gronlanda lingvo",
"es": "groenlandés",
+ "eu": "groenlandiera",
"fi": "grönlannin kieli",
"fr": "groenlandais",
"gl": "Lingua grenlandesa",
"he": "גרינלנדית",
"hu": "grönlandi",
- "id": "Bahasa Kalaallisut",
+ "id": "bahasa Greenland",
"it": "groenlandese",
"ja": "グリーンランド語",
"nb_NO": "grønlandsk",
@@ -5521,7 +5681,7 @@
"pl": "język grenlandzki",
"pt": "gronelandês",
"ru": "гренландский язык",
- "sl": "Grenlandščina",
+ "sl": "grenlandščina",
"sv": "grönländska",
"zh_Hans": "格陵兰语",
"zh_Hant": "格陵蘭語",
@@ -5539,12 +5699,13 @@
"en": "Khmer",
"eo": "kmera lingvo",
"es": "camboyano",
+ "eu": "khmerera",
"fi": "khmer",
"fr": "khmer",
"gl": "Lingua khmer",
"he": "קמרית",
"hu": "khmer",
- "id": "Bahasa Khmer",
+ "id": "bahasa Khmer",
"it": "khmer",
"ja": "クメール語",
"nb_NO": "khmer",
@@ -5573,12 +5734,13 @@
"en": "Kannada",
"eo": "kanara lingvo",
"es": "canarés",
+ "eu": "kannada",
"fi": "kannada",
"fr": "kannada",
"gl": "Lingua kanaresa",
"he": "קאנדה",
"hu": "kannada",
- "id": "Bahasa Kannada",
+ "id": "Kannada",
"it": "kannada",
"ja": "カンナダ語",
"nb_NO": "kannada",
@@ -5604,12 +5766,13 @@
"en": "Korean",
"eo": "korea lingvo",
"es": "coreano",
+ "eu": "koreera",
"fi": "korea",
"fr": "coréen",
"gl": "lingua coreana",
"he": "קוריאנית",
"hu": "koreai",
- "id": "bahasa Korea",
+ "id": "Korea",
"it": "coreano",
"ja": "朝鮮語",
"nb_NO": "koreansk",
@@ -5641,6 +5804,7 @@
"en": "Permyak",
"eo": "komipermjaka lingvo",
"es": "komi permio",
+ "eu": "komi-permyak",
"fi": "komipermjakin kieli",
"fr": "komi-permiak",
"gl": "Lingua komi-permyac",
@@ -5668,6 +5832,7 @@
"en": "Kanuri",
"eo": "kanura lingvo",
"es": "kanuri",
+ "eu": "Kanuri hizkuntza",
"fi": "Kanurin kieli",
"fr": "kanouri",
"gl": "Lingua kanuri",
@@ -5694,6 +5859,7 @@
"en": "Karachay-Balkar",
"eo": "karaĉaja-balkara lingvo",
"es": "idioma karachái-bálkaro",
+ "eu": "Karatxaiera-balkarera",
"fi": "Karatšai-balkaarin kieli",
"fr": "karatchaï-balkar",
"gl": "Lingua carachaio-bálcara",
@@ -5746,18 +5912,20 @@
"da": "harajansk",
"de": "Kinaray-a",
"en": "Karay-a",
+ "eo": "karaja lingvo",
"es": "harayo",
"fi": "Kinaray-a",
"fr": "harayen",
"he": "קריאית",
"id": "bahasa Karaik’a",
- "it": "kinaray-a",
+ "it": "caraio",
"ja": "キナライア語",
"nb_NO": "Kinaray-a",
"nl": "Kinaray-a",
"pl": "język Karaya",
"pt": "língua Karai-a",
"ru": "Карайский язык",
+ "sl": "kinarajščina",
"sv": "harajanska",
"_meta": {
"dir": [
@@ -5773,6 +5941,7 @@
"en": "Karelian",
"eo": "karela lingvo",
"es": "carelio",
+ "eu": "Kareliera",
"fi": "karjalan kieli",
"fr": "carélien",
"gl": "Lingua carelia",
@@ -5787,6 +5956,7 @@
"pt": "Língua carélia",
"pt_BR": "Língua carélia",
"ru": "карельский язык",
+ "sl": "karelščina",
"sv": "karelska",
"zh_Hans": "卡累利阿语",
"zh_Hant": "卡累利阿語",
@@ -5804,6 +5974,7 @@
"en": "Kashmiri",
"eo": "kaŝmira lingvo",
"es": "cachemir",
+ "eu": "kaxmirera",
"fi": "Kašmirin kieli",
"fr": "cachemiri",
"gl": "Lingua caxemiresa",
@@ -5836,6 +6007,7 @@
"en": "Ripuarian",
"eo": "ripuara dialektaro",
"es": "fráncico ripuario",
+ "eu": "ripuariera",
"fr": "francique ripuaire",
"gl": "Fráncico ripuario",
"he": "הניב הריפוארי",
@@ -5853,31 +6025,32 @@
}
},
"ku": {
- "ca": "kurd",
- "cs": "kurdština",
- "da": "kurdisk",
- "de": "Kurdisch",
- "en": "Kurdish",
- "eo": "kurda lingvo",
- "es": "kurdo",
- "fi": "kurdi",
- "fr": "kurde",
+ "ca": "kurd del nord",
+ "cs": "kurmándží",
+ "da": "Kurmanji",
+ "de": "Kurmandschi",
+ "en": "Kurmanji",
+ "eo": "kurmanĝa lingvo",
+ "es": "kurmanji",
+ "eu": "Kurmanji",
+ "fi": "Kurmandži",
+ "fr": "kurmandji",
"gl": "lingua kurda",
- "he": "כורדית",
- "hu": "kurd",
- "id": "Bahasa Kurdi",
- "it": "curdo",
- "ja": "クルド語",
+ "he": "כורמנג'ית",
+ "hu": "kurmandzsi",
+ "id": "Kurmanji",
+ "it": "kurmanji",
+ "ja": "クルマンジー",
"nb_NO": "kurdisk",
- "nl": "Koerdisch",
- "pl": "język kurdyjski",
- "pt": "língua curda",
- "pt_BR": "língua curda",
- "ru": "курдские языки",
- "sl": "kurdščina",
- "sv": "kurdiska",
+ "nl": "Kurmançi",
+ "pl": "język kurmandżi",
+ "pt": "curmânji",
+ "pt_BR": "Curmânji",
+ "ru": "курманджи",
+ "sl": "kurmandži",
+ "sv": "nordkurdiska",
"zh_Hans": "库尔德语",
- "zh_Hant": "庫德語",
+ "zh_Hant": "北庫德語",
"_meta": {
"countries": [
"IQ"
@@ -5894,6 +6067,7 @@
"en": "Kumyk",
"eo": "kumika lingvo",
"es": "Idioma cumuco",
+ "eu": "kumikera",
"fi": "Kumykin kieli",
"fr": "koumyk",
"he": "קומיקית",
@@ -5922,6 +6096,7 @@
"es": "Idioma kutenai",
"fi": "Kutenai",
"fr": "kutenai",
+ "gl": "Lingua kutenai",
"he": "קוטנאי",
"it": "lingua kutenai",
"ja": "クテナイ語",
@@ -5946,6 +6121,7 @@
"en": "Komi",
"eo": "komia lingvo",
"es": "komi",
+ "eu": "komiera",
"fi": "komin kieli",
"fr": "komi",
"gl": "lingua komi",
@@ -5974,6 +6150,7 @@
"en": "Kerinci",
"eo": "Kerinci",
"es": "Kerinci",
+ "eu": "Kerinci",
"fi": "Kerinci",
"fr": "kerinci",
"gl": "Kerinci",
@@ -6002,6 +6179,7 @@
"en": "Cornish",
"eo": "kornvala lingvo",
"es": "córnico",
+ "eu": "Kornubiera",
"fi": "Korni",
"fr": "cornique",
"gl": "Lingua córnica",
@@ -6033,6 +6211,7 @@
"en": "Kyrgyz",
"eo": "kirgiza lingvo",
"es": "kirguís",
+ "eu": "kirgizera",
"fi": "kirgiisi",
"fr": "kirghize",
"gl": "kirguiz",
@@ -6069,6 +6248,7 @@
"en": "Judaeo-Spanish",
"eo": "judhispana lingvo",
"es": "judeoespañol",
+ "eu": "Ladino",
"fi": "ladino",
"fr": "judéo-espagnol",
"gl": "Lingua xudeu-española",
@@ -6117,12 +6297,13 @@
"en": "Luxembourgish",
"eo": "leceburga lingvo",
"es": "luxemburgués",
+ "eu": "Luxenburgera",
"fi": "luxemburg",
"fr": "luxembourgeois",
"gl": "Lingua luxemburguesa",
"he": "לוקסמבורגית",
"hu": "luxemburgi",
- "id": "Bahasa Luksemburg",
+ "id": "bahasa Luksemburg",
"it": "lussemburghese",
"ja": "ルクセンブルク語",
"nb_NO": "luxembourgsk",
@@ -6150,6 +6331,7 @@
"en": "Lezgian",
"eo": "lezga lingvo",
"es": "Idioma lezgui",
+ "eu": "lezgiera",
"fi": "lezgi",
"fr": "lezghien",
"gl": "Lingua lezguia",
@@ -6182,6 +6364,7 @@
"en": "Luganda",
"eo": "ganda lingvo",
"es": "luganda",
+ "eu": "luganda",
"fi": "Gandan kieli",
"fr": "luganda",
"gl": "Lingua luganda",
@@ -6210,6 +6393,7 @@
"en": "Limburgish",
"eo": "limburga lingvo",
"es": "limburgués",
+ "eu": "limburgera",
"fi": "limburgin kieli",
"fr": "limbourgeois",
"gl": "Lingua limburguesa",
@@ -6223,6 +6407,7 @@
"pl": "język limburski",
"pt": "língua limburguesa",
"ru": "лимбургский язык",
+ "sl": "limburščina",
"sv": "limburgiska",
"zh_Hans": "林堡语",
"zh_Hant": "林堡語",
@@ -6240,6 +6425,7 @@
"en": "Ligurian",
"eo": "ligura lingvo",
"es": "ligur",
+ "eu": "liguriera",
"fi": "liguuri",
"fr": "ligure",
"gl": "Lingua lígur",
@@ -6272,7 +6458,7 @@
"gl": "Lingua laki",
"id": "Bahasa Laki",
"ja": "ラーク語",
- "nl": "Laki dialect",
+ "nl": "Laki",
"pt": "Laki",
"ru": "лаки",
"sv": "lekî",
@@ -6320,12 +6506,13 @@
"en": "Ladin",
"eo": "ladina lingvo",
"es": "ladino",
+ "eu": "Ladino",
"fi": "Ladinin kieli",
"fr": "ladin",
"gl": "Lingua ladina",
"he": "לדינית",
"hu": "ladin",
- "id": "Bahasa Ladin",
+ "id": "bahasa Ladin",
"it": "ladino",
"ja": "ラディン語",
"nb_NO": "ladinsk",
@@ -6350,6 +6537,7 @@
"en": "Lombard",
"eo": "lombarda lingvo",
"es": "lombardo",
+ "eu": "Lombardiera",
"fi": "lombardin kieli",
"fr": "lombard",
"gl": "Lingua lombarda",
@@ -6363,6 +6551,7 @@
"pl": "Język lombardzki",
"pt": "língua lombarda",
"ru": "ломбардский язык",
+ "sl": "lombardščina",
"sv": "lombardiska",
"_meta": {
"dir": [
@@ -6378,6 +6567,7 @@
"en": "Lingala",
"eo": "lingala lingvo",
"es": "lingala",
+ "eu": "Lingala",
"fi": "lingala",
"fr": "lingala",
"gl": "Lingua lingala",
@@ -6405,14 +6595,15 @@
"da": "Lao",
"de": "Laotisch",
"en": "Lao",
- "eo": "laosa lingvo",
+ "eo": "laŭa lingvo",
"es": "lao",
+ "eu": "Laosera",
"fi": "lao",
"fr": "lao",
"gl": "Lingua laosiana",
"he": "לאית",
"hu": "lao",
- "id": "bahasa Laos",
+ "id": "bahasa Lao",
"it": "lao",
"ja": "ラーオ語",
"nb_NO": "laotisk",
@@ -6421,6 +6612,7 @@
"pt": "Língua laociana",
"pt_BR": "Língua laociana",
"ru": "лаосский язык",
+ "sl": "laoščina",
"sv": "lao",
"zh_Hans": "老挝语",
"zh_Hant": "老撾語",
@@ -6484,6 +6676,7 @@
"en": "Lithuanian",
"eo": "litova lingvo",
"es": "lituano",
+ "eu": "lituaniera",
"fi": "liettua",
"fr": "lituanien",
"gl": "lingua lituana",
@@ -6519,6 +6712,7 @@
"en": "Latgalian",
"eo": "latgala lingvo",
"es": "Idioma latgaliano",
+ "eu": "Latgaliera",
"fi": "latgallin kieli",
"fr": "latgalien",
"gl": "Lingua latgaliá",
@@ -6543,6 +6737,7 @@
"de": "Mizo",
"en": "Mizo",
"es": "mizo",
+ "eu": "Mizo hizkuntza",
"fi": "Lusai",
"fr": "mizo",
"id": "Bahasa Mizo",
@@ -6565,6 +6760,7 @@
"en": "Southern Luri",
"fr": "luri du Sud",
"ja": "南ロル語",
+ "nl": "Zuid-Luri",
"ru": "южнолурский язык",
"sv": "sydluriska",
"_meta": {
@@ -6581,12 +6777,13 @@
"en": "Latvian",
"eo": "latva lingvo",
"es": "letón",
+ "eu": "letoniera",
"fi": "latvia",
"fr": "letton",
"gl": "lingua letona",
"he": "לטבית",
"hu": "lett",
- "id": "Bahasa Latvi",
+ "id": "Latvi",
"it": "lettone",
"ja": "ラトビア語",
"nb_NO": "latvisk",
@@ -6637,7 +6834,7 @@
"gl": "Lingua laz",
"he": "לאזית",
"hu": "láz",
- "id": "Bahasa Laz",
+ "id": "bahasa Laz",
"it": "laz",
"ja": "ラズ語",
"nb_NO": "Lazisk",
@@ -6668,7 +6865,7 @@
"id": "Madura",
"it": "madurese",
"ja": "マドゥラ語",
- "nl": "Madoerees",
+ "nl": "Madurees",
"pl": "język madurski",
"pt": "Língua maduresa",
"ru": "Мадурский язык",
@@ -6687,6 +6884,7 @@
"en": "Maithili",
"eo": "maitila lingvo",
"es": "Maithili",
+ "eu": "mahitiliera",
"fi": "Maithilin kieli",
"fr": "maïthili",
"gl": "Lingua maithili",
@@ -6716,6 +6914,7 @@
"en": "Moksha",
"eo": "mokŝa lingvo",
"es": "moksha",
+ "eu": "Mokxera",
"fi": "mokša",
"fr": "moksa",
"gl": "Lingua moksha",
@@ -6743,12 +6942,13 @@
"en": "Mauritian Creole",
"eo": "maŭricia kreola lingvo",
"es": "criollo mauriciano",
+ "eu": "Mauritaniako kreolera",
"fi": "Morisyen",
"fr": "créole mauricien",
"hu": "mauritiusi kreol",
"it": "creolo mauriziano",
"ja": "モーリシャス・クレオール語",
- "nl": "Mauritiaans Creools",
+ "nl": "Mauritiaans-Creools",
"pl": "język kreolski Mauritiusa",
"pt": "crioulo de Maurício",
"ru": "Маврикийский креольский язык",
@@ -6767,6 +6967,7 @@
"en": "Malagasy",
"eo": "malagasa lingvo",
"es": "malgache",
+ "eu": "Malgaxe",
"fi": "malagassi",
"fr": "malgache",
"gl": "Lingua malgaxe",
@@ -6801,6 +7002,7 @@
"en": "Marshallese",
"eo": "marŝala lingvo",
"es": "marshalés",
+ "eu": "Marshallera",
"fi": "Marshallin kieli",
"fr": "marshallais",
"gl": "Lingua marshalesa",
@@ -6815,7 +7017,9 @@
"pt": "Língua marshalesa",
"pt_BR": "Língua marshalesa",
"ru": "маршалльский язык",
+ "sl": "maršalščina",
"sv": "marshallesiska",
+ "zh_Hant": "馬紹爾語",
"_meta": {
"countries": [
"MH"
@@ -6830,9 +7034,11 @@
"de": "Wiesenmari",
"en": "Meadow Mari",
"es": "mari de las praderas",
+ "eu": "ekialdeko mari",
"fi": "niittymarin kieli",
"fr": "mari des prairies",
"gl": "Lingua mari das pradeiras",
+ "hu": "mezei mari",
"it": "mari orientale",
"ja": "牧地マリ語",
"nb_NO": "østmarisk",
@@ -6855,6 +7061,7 @@
"en": "Māori",
"eo": "maoria lingvo",
"es": "maorí",
+ "eu": "maoriera",
"fi": "Maorin kieli",
"fr": "māori",
"gl": "Lingua maorí",
@@ -6889,6 +7096,7 @@
"en": "Mi'kmaq",
"eo": "mikmaka lingvo",
"es": "micmac",
+ "eu": "Mikmakera",
"fi": "Micmacin kieli",
"fr": "micmac",
"gl": "Lingua micmac",
@@ -6912,6 +7120,7 @@
"en": "Minangkabau",
"eo": "minankabaŭa lingvo",
"es": "minangkabau",
+ "eu": "Minangkabauera",
"fi": "Minangkabaun kieli",
"fr": "minangkabau",
"gl": "Lingua minangkabau",
@@ -6925,6 +7134,7 @@
"pt": "Língua minangkabau",
"pt_BR": "Língua minangkabau",
"ru": "минангкабау",
+ "sl": "minangkabavščina",
"sv": "minangkabau",
"zh_Hans": "米南佳保语",
"zh_Hant": "米南佳保語",
@@ -6943,12 +7153,13 @@
"en": "Macedonian",
"eo": "makedona lingvo",
"es": "macedonio",
+ "eu": "mazedoniera",
"fi": "makedonia",
"fr": "macédonien",
"gl": "Lingua macedonia",
"he": "מקדונית",
"hu": "macedón",
- "id": "Bahasa Makedonia",
+ "id": "bahasa Makedonia",
"it": "macedone",
"ja": "マケドニア語",
"nb_NO": "makedonsk",
@@ -6978,12 +7189,13 @@
"en": "Malayalam",
"eo": "malajala lingvo",
"es": "malabar",
+ "eu": "Malabarera",
"fi": "malajalam",
"fr": "malayalam",
"gl": "lingua malayalam",
"he": "מלאיאלאם",
"hu": "malajálam",
- "id": "bahasa Malayalam",
+ "id": "Malayalam",
"it": "malayalam",
"ja": "マラヤーラム語",
"nb_NO": "malayalam",
@@ -6992,7 +7204,7 @@
"pt": "malaiala",
"pt_BR": "Língua malaiala",
"ru": "малаялам",
- "sl": "Malajalščina",
+ "sl": "malajalamščina",
"sv": "malayalam",
"zh_Hant": "馬拉雅拉姆語",
"_meta": {
@@ -7009,6 +7221,7 @@
"en": "Mongolian",
"eo": "mongola lingvo",
"es": "mongol",
+ "eu": "Mongoliera",
"fi": "mongoli",
"fr": "mongol",
"gl": "Lingua mongol",
@@ -7044,12 +7257,13 @@
"en": "Manchu",
"eo": "manĉura lingvo",
"es": "idioma manchú",
+ "eu": "mantxuera",
"fi": "Mantšun kieli",
"fr": "mandchou",
"gl": "Lingua manchú",
"he": "מנצ'ורית",
"hu": "mandzsu",
- "id": "Bahasa Manchu",
+ "id": "bahasa Manchu",
"it": "lingua mancese",
"ja": "満洲語",
"nb_NO": "Mandsjuisk",
@@ -7073,6 +7287,7 @@
"en": "Meitei",
"eo": "manipura lingvo",
"es": "meitei",
+ "eu": "Manipurera",
"fi": "Manipurin kieli",
"fr": "meitei",
"gl": "Lingua meitei",
@@ -7125,6 +7340,7 @@
"en": "Moldovan",
"eo": "moldava lingvo",
"es": "moldavo",
+ "eu": "Moldaviera",
"fi": "Moldavian kieli",
"fr": "moldave",
"gl": "lingua moldova",
@@ -7153,10 +7369,12 @@
"en": "Innu-aimun",
"eo": "inua lingvo",
"es": "innu",
+ "eu": "Innuera",
"fr": "innu-aimun",
"id": "Bahasa Innu",
"it": "innu-aimun",
- "nl": "Innu language",
+ "ja": "モンタニェ語",
+ "nl": "Innu",
"ru": "Монтанье-наскапи",
"sv": "innu-aimun",
"_meta": {
@@ -7173,6 +7391,7 @@
"en": "Marathi",
"eo": "marata lingvo",
"es": "maratí",
+ "eu": "marathera",
"fi": "marathi",
"fr": "marathi",
"gl": "Lingua marathi",
@@ -7202,6 +7421,7 @@
"en": "Mara",
"fr": "Mara",
"ja": "マラ語",
+ "nl": "Mara",
"ru": "Мара",
"sv": "mara",
"_meta": {
@@ -7215,6 +7435,7 @@
"de": "Bergmari",
"en": "Hill Mari",
"es": "mari de las colinas",
+ "eu": "mendebaldeko mari",
"fi": "vuorimarin kieli",
"fr": "mari des montagnes",
"gl": "Lingua mari das montañas",
@@ -7236,17 +7457,18 @@
"ms": {
"ca": "malai",
"cs": "malajština",
- "da": "Malajisk",
+ "da": "malajisk",
"de": "Malaiisch",
"en": "Malay",
"eo": "malaja lingvo",
"es": "malayo",
+ "eu": "Malaysiera",
"fi": "malaji",
"fr": "malais",
"gl": "lingua malaia",
"he": "מלאית",
"hu": "maláj",
- "id": "Bahasa Melayu",
+ "id": "bahasa Melayu",
"it": "malese",
"ja": "マレー語",
"nb_NO": "malayisk",
@@ -7279,6 +7501,7 @@
"en": "Maltese",
"eo": "malta lingvo",
"es": "maltés",
+ "eu": "maltera",
"fi": "malta",
"fr": "maltais",
"gl": "Lingua maltesa",
@@ -7356,6 +7579,7 @@
"en": "Mirandese",
"eo": "miranda lingvo",
"es": "mirandés",
+ "eu": "Mirandes",
"fi": "Mirandeesi",
"fr": "mirandais",
"gl": "lingua mirandesa",
@@ -7370,6 +7594,7 @@
"pt": "mirandês",
"pt_BR": "mirandês",
"ru": "мирандский язык",
+ "sl": "mirandeščina",
"sv": "mirandesiska",
"_meta": {
"dir": [
@@ -7385,6 +7610,7 @@
"en": "Mentawai",
"eo": "Mentawai",
"es": "mentawai",
+ "eu": "Mentawaiera",
"fi": "Mentawain kieli",
"fr": "mentawai",
"gl": "Lingua mentawai",
@@ -7414,12 +7640,13 @@
"en": "Burmese",
"eo": "birma lingvo",
"es": "birmano",
+ "eu": "Birmaniera",
"fi": "burma",
"fr": "birman",
"gl": "birmano",
"he": "בורמזית",
"hu": "burmai",
- "id": "Bahasa Myanmar",
+ "id": "bahasa Burma",
"it": "birmano",
"ja": "ビルマ語",
"nb_NO": "burmesisk",
@@ -7446,6 +7673,7 @@
"en": "Erzya",
"eo": "erzja lingvo",
"es": "erzya",
+ "eu": "erziera",
"fi": "ersä",
"fr": "erzya",
"gl": "Lingua erzya",
@@ -7475,6 +7703,7 @@
"en": "Mazanderani",
"eo": "mazandarana lingvo",
"es": "mazandaraní",
+ "eu": "Mazandarandera",
"fi": "Mazandaranin kieli",
"fr": "mazandarani",
"gl": "Lingua mazanderani",
@@ -7503,6 +7732,7 @@
"en": "Nauruan",
"eo": "naura lingvo",
"es": "nauruano",
+ "eu": "Nauruera",
"fi": "Naurun kieli",
"fr": "nauruan",
"gl": "Lingua nauruana",
@@ -7517,6 +7747,7 @@
"pt": "Língua nauruana",
"pt_BR": "Língua nauruana",
"ru": "науруанский язык",
+ "sl": "naurujščina",
"sv": "nauruanska",
"_meta": {
"countries": [
@@ -7535,12 +7766,13 @@
"en": "Southern Min",
"eo": "minnana lingvo",
"es": "chino min nan",
+ "eu": "hegoaldeko min",
"fi": "Minnan",
"fr": "minnan",
"gl": "lingua min nam",
"he": "מין דרומי",
"hu": "minnan",
- "id": "Bahasa Min Selatan",
+ "id": "Min Selatan",
"it": "min nan",
"ja": "閩南語",
"nb_NO": "minnan",
@@ -7567,6 +7799,7 @@
"en": "Neapolitan",
"eo": "napola lingvo",
"es": "napolitano",
+ "eu": "Napoliera",
"fi": "napoli",
"fr": "napolitain",
"gl": "Lingua napolitana",
@@ -7598,6 +7831,7 @@
"en": "Bokmål",
"eo": "Bokmål",
"es": "bokmål",
+ "eu": "bokmål",
"fi": "kirjanorja",
"fr": "bokmål",
"gl": "bokmål",
@@ -7628,6 +7862,7 @@
"en": "Low German",
"eo": "platgermana lingvo",
"es": "bajo alemán",
+ "eu": "behe-aleman",
"fi": "alasaksa",
"fr": "bas allemand",
"gl": "Lingua baixo alemá",
@@ -7658,6 +7893,7 @@
"en": "Nepali",
"eo": "nepala lingvo",
"es": "nepalí",
+ "eu": "nepalera",
"fi": "nepalin kieli",
"fr": "népalais",
"gl": "Lingua nepalesa",
@@ -7690,6 +7926,7 @@
"en": "Newar",
"eo": "nevara lingvo",
"es": "Newari",
+ "eu": "newarera",
"fi": "Newari",
"fr": "newari",
"gl": "Lingua newari",
@@ -7716,6 +7953,7 @@
"en": "Ndonga",
"eo": "ndonga lingvo",
"es": "ndonga",
+ "eu": "Ndonga",
"fi": "Ndonga",
"fr": "ndonga",
"gl": "Lingua ndonga",
@@ -7763,6 +8001,7 @@
"en": "Niuean",
"eo": "niua lingvo",
"es": "Idioma niuano",
+ "eu": "Niuera",
"fi": "Niuen kieli",
"fr": "niuéen",
"he": "ניואית",
@@ -7790,12 +8029,13 @@
"en": "Dutch",
"eo": "nederlanda lingvo",
"es": "neerlandés",
+ "eu": "nederlandera",
"fi": "hollanti",
"fr": "néerlandais",
"gl": "lingua neerlandesa",
"he": "הולנדית",
"hu": "holland",
- "id": "Belanda",
+ "id": "bahasa Belanda",
"it": "olandese",
"ja": "オランダ語",
"nb_NO": "nederlandsk",
@@ -7827,6 +8067,7 @@
"en": "Nynorsk",
"eo": "Nynorsk",
"es": "nynorsk",
+ "eu": "nynorsk",
"fi": "uusnorja",
"fr": "nynorsk",
"gl": "nynorsk",
@@ -7861,6 +8102,7 @@
"en": "Norwegian",
"eo": "norvega lingvo",
"es": "noruego",
+ "eu": "norvegiera",
"fi": "norja",
"fr": "norvégien",
"gl": "lingua norueguesa",
@@ -7896,13 +8138,14 @@
"es": "idioma tailandés septentrional",
"fr": "thaï du Nord",
"he": "תאית צפונית",
- "id": "Bahasa Thai Utara",
+ "id": "bahasa Thai Utara",
"it": "thailandese settentrionale",
"ja": "北タイ語",
"nl": "Noordelijk Thai",
"pl": "Język północnotajski",
"pt": "Língua tai norte",
"ru": "Юан (язык)",
+ "sl": "severna tajščina",
"sv": "nordthai",
"zh_Hans": "北部泰语",
"zh_Hant": "北部泰語",
@@ -7919,10 +8162,11 @@
"en": "Nogai",
"eo": "nogaja lingvo",
"es": "nogai",
+ "eu": "nogaiera",
"fi": "Nogain kieli",
"fr": "nogaï",
"he": "נוגאי",
- "id": "Bahasa Nogai",
+ "id": "bahasa Nogai",
"it": "lingua nogai",
"ja": "ノガイ語",
"nb_NO": "nogaisk",
@@ -7960,6 +8204,7 @@
"en": "Southern Ndebele",
"eo": "Suda Ndebela lingvo",
"es": "ndebele del Sur",
+ "eu": "hegoaldeko ndebelera",
"fi": "etelä-ndebelen kieli",
"fr": "nrebele",
"gl": "Lingua ndebele",
@@ -8019,6 +8264,7 @@
"en": "Northern Sotho",
"eo": "peda lingvo",
"es": "Sesotho sa leboa",
+ "eu": "pediera",
"fi": "Pohjoissothon kieli",
"fr": "sotho du Nord",
"gl": "Lingua sotho do norte",
@@ -8050,6 +8296,7 @@
"en": "Navajo",
"eo": "navaha lingvo",
"es": "navajo",
+ "eu": "Navajoera",
"fi": "navajo",
"fr": "navajo",
"gl": "Lingua navajo",
@@ -8079,6 +8326,7 @@
"en": "Chewa",
"eo": "njanĝa lingvo",
"es": "chichewa",
+ "eu": "txewera",
"fi": "njandžan kieli",
"fr": "chewa",
"gl": "lingua chichewa",
@@ -8092,6 +8340,7 @@
"pl": "język cziczewa",
"pt": "língua nianja",
"ru": "ньянджа",
+ "sl": "čičevščina",
"sv": "chichewa",
"_meta": {
"countries": [
@@ -8106,6 +8355,7 @@
"nys": {
"de": "Noongar",
"en": "Noongar",
+ "eu": "nyungar",
"fr": "nyungan",
"gl": "Lngua noongar",
"ja": "ニュンガル語",
@@ -8125,6 +8375,7 @@
"en": "Occitan",
"eo": "okcitana lingvo",
"es": "occitano",
+ "eu": "okzitaniera",
"fi": "oksitaani",
"fr": "occitan",
"gl": "lingua occitana",
@@ -8155,6 +8406,7 @@
"en": "Ojibwe",
"eo": "aniŝinabeka lingvo",
"es": "Idioma ojibwa",
+ "eu": "Ojibwera",
"fi": "Odžibwan kieli",
"fr": "ojibwé",
"gl": "Lingua ojibwa",
@@ -8206,6 +8458,7 @@
"en": "Oromo",
"eo": "oroma lingvo",
"es": "oromo",
+ "eu": "Oromoera",
"fi": "oromon kieli",
"fr": "oromo",
"gl": "Lingua oromo",
@@ -8254,6 +8507,7 @@
"en": "Odia",
"eo": "odia lingvo",
"es": "oriya",
+ "eu": "Odia",
"fi": "orija",
"fr": "oriya",
"gl": "Lingua oriya",
@@ -8267,7 +8521,7 @@
"pl": "język orija",
"pt": "língua oriá",
"ru": "ория",
- "sl": "odijščina",
+ "sl": "orijščina",
"sv": "oriya",
"zh_Hans": "奥里亚语",
"zh_Hant": "奧里亞語",
@@ -8285,12 +8539,13 @@
"en": "Ossetian",
"eo": "oseta lingvo",
"es": "osetio",
+ "eu": "Osetiera",
"fi": "osseetti",
"fr": "ossète",
"gl": "Lingua oseta",
"he": "אוסטית",
"hu": "oszét",
- "id": "Bahasa Ossetia",
+ "id": "bahasa Ossetia",
"it": "osseto",
"ja": "オセット語",
"nb_NO": "ossetisk",
@@ -8298,7 +8553,7 @@
"pl": "język osetyjski",
"pt": "Língua osseta",
"ru": "осетинский язык",
- "sl": "Osetinščina",
+ "sl": "osetščina",
"sv": "ossetiska",
"zh_Hans": "奥塞梯语",
"zh_Hant": "奧塞提亞語",
@@ -8360,6 +8615,7 @@
"en": "Punjabi (Shahmukhi)",
"eo": "panĝaba lingvo (Ŝahmuĥi-ortografio)",
"es": "panyabí (Shahmuji)",
+ "eu": "Punjabera (Shahmukhi)",
"fi": "punjabin kieli (Shahmukhi)",
"fr": "pendjabi (shahmukhi)",
"gl": "lingua punjabi (Shahmukhi)",
@@ -8392,11 +8648,12 @@
"en": "Pangasinan",
"eo": "pangasina lingvo",
"es": "pangasinense",
+ "eu": "pagasinanera",
"fi": "Pangasinanin kieli",
"fr": "pangassinais",
"gl": "Lingua pangasinesa",
"hu": "pangasinan",
- "id": "bahasa Pangasinan",
+ "id": "Pangasinan",
"it": "pangasinan",
"ja": "パンガシナン語",
"nb_NO": "pangasinansk",
@@ -8420,6 +8677,7 @@
"en": "Papiamento",
"eo": "Papiamento",
"es": "papiamento",
+ "eu": "Papiamento",
"fi": "Papiamentu",
"fr": "papiamento",
"gl": "Papiamento",
@@ -8450,6 +8708,7 @@
"en": "Picard",
"eo": "pikarda franca dialekto",
"es": "picardo",
+ "eu": "Pikardiera",
"fi": "Picardin kieli",
"fr": "picard",
"gl": "Lingua picarda",
@@ -8478,6 +8737,7 @@
"en": "Pennsylvania German",
"eo": "pensilvangermana dialekto",
"es": "alemán de Pensilvania",
+ "eu": "Pennsylvaniako aleman",
"fi": "Pennsylvaniansaksa",
"fr": "allemand de Pennsylvanie",
"gl": "Alemán de Pensilvania",
@@ -8529,6 +8789,7 @@
"en": "Palatinate German",
"eo": "Palatinata germana dialektaro",
"es": "alemán palatino",
+ "eu": "Palatinatuko alemana",
"fi": "pfaltsi",
"fr": "palatin",
"gl": "Alemán do Palatinado",
@@ -8619,6 +8880,7 @@
"en": "Polish",
"eo": "pola lingvo",
"es": "polaco",
+ "eu": "poloniera",
"fi": "puola",
"fr": "polonais",
"gl": "lingua polaca",
@@ -8652,6 +8914,7 @@
"en": "Piedmontese",
"eo": "piemonta lingvo",
"es": "piamontés",
+ "eu": "Piemontera",
"fi": "Piemonten kieli",
"fr": "piémontais",
"gl": "Lingua piemontesa",
@@ -8708,6 +8971,7 @@
"en": "Old Prussian",
"eo": "antikva prusa lingvo",
"es": "prusiano antiguo",
+ "eu": "Prusiera zahar",
"fi": "muinaispreussin kieli",
"fr": "vieux-prussien",
"gl": "Lingua prusiana antiga",
@@ -8737,12 +9001,13 @@
"en": "Pashto",
"eo": "paŝtuna lingvo",
"es": "pastún",
+ "eu": "paxtuera",
"fi": "paštun kieli",
"fr": "pachto",
"gl": "Lingua paxta",
"he": "פשטו",
"hu": "pastu",
- "id": "bahasa Pasto",
+ "id": "bahasa Pashtun",
"it": "pashtu",
"ja": "パシュトー語",
"nb_NO": "pashto",
@@ -8772,6 +9037,7 @@
"en": "Portuguese",
"eo": "portugala lingvo",
"es": "portugués",
+ "eu": "portugesa",
"fi": "portugali",
"fr": "portugais",
"gl": "lingua portuguesa",
@@ -8815,6 +9081,7 @@
"en": "Brazilian Portuguese",
"eo": "brazilportugala lingvo",
"es": "portugués brasileño",
+ "eu": "Brasilgo portuges",
"fi": "brasilianportugali",
"fr": "portugais brésilien",
"gl": "portugués do Brasil",
@@ -8847,6 +9114,7 @@
"en": "Quechua",
"eo": "keĉua lingvaro",
"es": "lenguas quechuas",
+ "eu": "kitxua",
"fi": "ketšua",
"fr": "quechua",
"gl": "linguas quechuas",
@@ -8880,6 +9148,7 @@
"de": "Quiché-Sprache",
"en": "K’iche’",
"es": "Idioma quiché",
+ "eu": "K'iche'era",
"fi": "k'iche'n kieli",
"fr": "quiché",
"gl": "Lingua kʼicheʼ",
@@ -8906,6 +9175,7 @@
"en": "Cook Islands Maori",
"eo": "Kuk-insulara maoria lingvo",
"es": "Idioma rarotongano",
+ "eu": "Cook uharteetako māoriera",
"fi": "Rarotongan kieli",
"fr": "maori des îles Cook",
"gl": "Lingua maorí das Illas Cook",
@@ -8939,6 +9209,7 @@
"nl": "Romagnools",
"pt": "romagnol",
"ru": "Романьольский язык",
+ "sl": "romanjolščina",
"sv": "romagnol",
"zh_Hans": "罗马涅语",
"zh_Hant": "羅馬涅語",
@@ -8953,6 +9224,7 @@
"de": "Tarifit",
"en": "Tarifit",
"es": "rifeño",
+ "eu": "Tmaziɣt",
"fi": "Tarifit",
"fr": "rifain",
"gl": "Lingua rifeña",
@@ -8963,6 +9235,7 @@
"pl": "Język tarifit",
"pt": "Língua rifenha",
"ru": "Рифский язык",
+ "sl": "tarifit",
"sv": "rif",
"zh_Hans": "里夫语",
"zh_Hant": "里夫語",
@@ -8980,8 +9253,9 @@
"en": "Rakhine",
"fr": "arakanais",
"gl": "Lingua arakanesa",
- "id": "Bahasa Arakan",
+ "id": "bahasa Rakhine",
"ja": "ラカイン語",
+ "nl": "Arakanees",
"pl": "Język arakański",
"pt": "Língua arracanesa",
"ru": "Араканский язык",
@@ -9002,12 +9276,13 @@
"en": "Romansh",
"eo": "romanĉa lingvo",
"es": "romanche",
+ "eu": "erromantxe",
"fi": "retoromaani",
"fr": "romanche",
"gl": "lingua romanche",
"he": "רומאנש",
"hu": "romans",
- "id": "Bahasa Romansh",
+ "id": "bahasa Romansh",
"it": "romancio",
"ja": "ロマンシュ語",
"nb_NO": "retoromansk",
@@ -9033,8 +9308,8 @@
"fr": "romani central",
"gl": "Romaní dos Cárpatos",
"it": "lingua carpato-romanì",
- "ja": "中央方言群",
- "nl": "Carpathian Romani",
+ "ja": "カルパティア・ロマ語",
+ "nl": "Karpathisch-Romani",
"ru": "Карпатские диалекты цыганского языка",
"sv": "centralromani",
"_meta": {
@@ -9051,6 +9326,7 @@
"en": "Romani",
"eo": "cigana lingvo",
"es": "romaní",
+ "eu": "erromaniera",
"fi": "romanikieli",
"fr": "romani",
"gl": "lingua romaní",
@@ -9080,6 +9356,7 @@
"en": "Kirundi",
"eo": "burunda lingvo",
"es": "kirundi",
+ "eu": "kirundi",
"fi": "Kirundi",
"fr": "kirundi",
"gl": "Lingua kirundi",
@@ -9111,12 +9388,13 @@
"en": "Romanian",
"eo": "rumana lingvo",
"es": "rumano",
+ "eu": "errumaniera",
"fi": "romania",
"fr": "roumain",
"gl": "lingua romanesa",
"he": "רומנית",
"hu": "román",
- "id": "bahasa Rumania",
+ "id": "Rumania",
"it": "romeno",
"ja": "ルーマニア語",
"nb_NO": "rumensk",
@@ -9146,6 +9424,7 @@
"en": "Russian",
"eo": "rusa lingvo",
"es": "ruso",
+ "eu": "errusiera",
"fi": "venäjä",
"fr": "russe",
"gl": "lingua rusa",
@@ -9185,12 +9464,13 @@
"en": "Rusyn",
"eo": "rusina lingvo",
"es": "rusino",
+ "eu": "Rusinera",
"fi": "ruteeni",
"fr": "rusyn",
"gl": "Lingua rutena",
"he": "רוסינית",
"hu": "ruszin",
- "id": "Bahasa Rusyn",
+ "id": "bahasa Rusyn",
"it": "ruteno",
"ja": "ルシン語",
"nb_NO": "rusinsk",
@@ -9215,6 +9495,7 @@
"en": "Aromanian",
"eo": "arumana lingvo",
"es": "arumano",
+ "eu": "arumaniera",
"fi": "aromania",
"fr": "aroumain",
"gl": "Lingua arromanesa",
@@ -9244,6 +9525,7 @@
"en": "Kinyarwanda",
"eo": "ruanda lingvo",
"es": "kiñaruanda",
+ "eu": "kinyaruanda",
"fi": "ruandan kieli",
"fr": "kinyarwanda",
"gl": "Lingua ruanda",
@@ -9274,6 +9556,7 @@
"en": "Okinawan",
"eo": "okinava lingvo",
"es": "okinawense",
+ "eu": "okinawera",
"fi": "Okinawan kieli",
"fr": "okinawaïen",
"gl": "Lingua okinawana",
@@ -9305,6 +9588,7 @@
"en": "Yakut",
"eo": "jakuta lingvo",
"es": "Idioma yakuto",
+ "eu": "Sakhera",
"fi": "jakuutti",
"fr": "iakoute",
"gl": "Lingua sakha",
@@ -9333,6 +9617,7 @@
"en": "Santali",
"eo": "santala lingvo",
"es": "idioma santalí",
+ "eu": "Santali",
"fi": "Santalin kieli",
"fr": "santâlî",
"gl": "lingua santali",
@@ -9363,6 +9648,7 @@
"en": "Sardinian",
"eo": "sarda lingvo",
"es": "sardo",
+ "eu": "Sardiniera",
"fi": "sardi",
"fr": "sarde",
"gl": "Lingua sarda",
@@ -9394,6 +9680,7 @@
"en": "Sicilian",
"eo": "sicilia lingvo",
"es": "siciliano",
+ "eu": "Siziliera",
"fi": "sisilia",
"fr": "sicilien",
"gl": "Lingua siciliana",
@@ -9424,6 +9711,7 @@
"en": "Scots",
"eo": "skota lingvo",
"es": "escocés",
+ "eu": "eskoziera",
"fi": "Skotin kieli",
"fr": "scots",
"gl": "Lingua escocesa",
@@ -9438,7 +9726,7 @@
"pt": "Scots",
"pt_BR": "Scots",
"ru": "шотландский язык",
- "sl": "Scots",
+ "sl": "škotščina",
"sv": "lågskotska",
"zh_Hans": "低地苏格兰语",
"zh_Hant": "低地蘇格蘭語",
@@ -9453,6 +9741,7 @@
"de": "Sassaresisch",
"en": "Sassarese",
"es": "sasarés",
+ "eu": "Sassariera",
"fr": "sassarais",
"gl": "Lingua sassaresa",
"he": "סאסארזה",
@@ -9507,6 +9796,7 @@
"en": "Northern Sami",
"eo": "nord-samea lingvo",
"es": "sami septentrional",
+ "eu": "Ipar samiera",
"fi": "pohjoissaame",
"fr": "same du Nord",
"gl": "Lingua saami setentrional",
@@ -9575,6 +9865,7 @@
"en": "Sango",
"eo": "sangoa lingvo",
"es": "idioma sango",
+ "eu": "Sango",
"fi": "Sango",
"fr": "sango",
"gl": "Lingua sango",
@@ -9615,10 +9906,11 @@
"hu": "silha",
"it": "tashelhit",
"ja": "シルハ語",
- "nl": "Chleuh",
+ "nl": "Tashelhiyt",
"pl": "Język tashelhiyt",
"pt": "Tachelhit",
"ru": "Шильхские языки",
+ "sl": "tašelhit",
"sv": "tachelhit",
"zh_Hans": "施卢赫语",
"zh_Hant": "施盧赫語",
@@ -9662,6 +9954,7 @@
"de": "Schawiya",
"en": "Shawiya",
"es": "chaoui",
+ "eu": "Xawia",
"fi": "Tašawit",
"fr": "chaoui",
"it": "tashawit",
@@ -9688,6 +9981,7 @@
"en": "Sinhala",
"eo": "sinhala lingvo",
"es": "cingalés",
+ "eu": "Sinhala",
"fi": "Sinhali",
"fr": "singhalais",
"gl": "Lingua cingalesa",
@@ -9719,6 +10013,7 @@
"de": "Sidama",
"en": "Sidamo",
"es": "Idioma sidamo",
+ "eu": "Sidamo hizkuntza",
"fi": "Sidamo",
"fr": "sidama",
"gl": "Lingua sidamo",
@@ -9750,7 +10045,7 @@
"it": "lingua sami di Kildin",
"ja": "キルディン・サーミ語",
"nb_NO": "kildinsamisk",
- "nl": "Kildin-Sami",
+ "nl": "Kildin-Samisch",
"pl": "Język kildin",
"pt": "Língua sami de Kildin",
"ru": "кильдинский саамский язык",
@@ -9806,6 +10101,7 @@
"pl": "język ume",
"pt": "língua sami de Ume",
"ru": "уме-саамский язык",
+ "sl": "umejska samijščina",
"sv": "umesamiska",
"_meta": {
"dir": [
@@ -9821,12 +10117,13 @@
"en": "Slovak",
"eo": "slovaka lingvo",
"es": "eslovaco",
+ "eu": "eslovakiera",
"fi": "slovakki",
"fr": "slovaque",
"gl": "lingua eslovaca",
"he": "סלובקית",
"hu": "szlovák",
- "id": "Bahasa Slowakia",
+ "id": "bahasa Slowakia",
"it": "slovacco",
"ja": "スロバキア語",
"nb_NO": "slovakisk",
@@ -9855,12 +10152,13 @@
"en": "Slovene",
"eo": "slovena lingvo",
"es": "esloveno",
+ "eu": "esloveniera",
"fi": "sloveeni",
"fr": "slovène",
"gl": "lingua eslovena",
"he": "סלובנית",
"hu": "szlovén",
- "id": "Bahasa Slovenia",
+ "id": "bahasa Slovenia",
"it": "sloveno",
"ja": "スロベニア語",
"nb_NO": "slovensk",
@@ -9895,7 +10193,7 @@
"it": "tedesco slesiano",
"ja": "低シレジア語",
"nb_NO": "lavschlesisk",
- "nl": "Silezisch Duits",
+ "nl": "Silezisch-Duits",
"pl": "dialekt śląski języka niemieckiego",
"ru": "силезские диалекты немецкого языка",
"sv": "schlesisk tyska",
@@ -9915,6 +10213,7 @@
"en": "Samoan",
"eo": "samoa lingvo",
"es": "samoano",
+ "eu": "Samoera",
"fi": "samoan kieli",
"fr": "samoan",
"gl": "Lingua samoana",
@@ -9959,6 +10258,7 @@
"pt": "língua sami meridional",
"pt_BR": "Língua sami meridional",
"ru": "южносаамский язык",
+ "sl": "južna samijščina",
"sv": "sydsamiska",
"zh_Hans": "南萨米语",
"zh_Hant": "南薩米語",
@@ -9987,6 +10287,7 @@
"pt": "língua sami de Lule",
"pt_BR": "Língua lapônica de Lule",
"ru": "луле-саамский язык",
+ "sl": "lulejska samijščina",
"sv": "lulesamiska",
"zh_Hans": "吕勒萨米语",
"zh_Hant": "呂勒薩米語",
@@ -10003,6 +10304,7 @@
"en": "Inari Sami",
"eo": "anar-samea lingvo",
"es": "sami inari",
+ "eu": "Inariko samiera",
"fi": "inarinsaame",
"fr": "same d'Inari",
"gl": "Lingua saami de Inari",
@@ -10092,6 +10394,7 @@
"en": "Somali",
"eo": "somala lingvo",
"es": "somalí",
+ "eu": "somaliera",
"fi": "somalin kieli",
"fr": "somali",
"gl": "Lingua somalí",
@@ -10129,6 +10432,7 @@
"nl": "Zuidelijk Thai",
"pl": "Język południowotajski",
"ru": "южнотайский диалект",
+ "sl": "južna tajščina",
"sv": "sydthai",
"zh_Hans": "南部泰语",
"zh_Hant": "南部泰語",
@@ -10146,6 +10450,7 @@
"en": "Albanian",
"eo": "albana lingvo",
"es": "albanés",
+ "eu": "albaniera",
"fi": "albania",
"fr": "albanais",
"gl": "Lingua albanesa",
@@ -10182,6 +10487,7 @@
"en": "Sranan Tongo",
"eo": "srana lingvo",
"es": "sranan tongo",
+ "eu": "Sranan Tongo",
"fi": "Sranantongo",
"fr": "sranan",
"gl": "Sranan tongo",
@@ -10229,6 +10535,7 @@
"en": "Swazi",
"eo": "svazia lingvo",
"es": "suazi",
+ "eu": "swaziera",
"fi": "swazin kieli",
"fr": "swati",
"gl": "Lingua suazi",
@@ -10264,6 +10571,7 @@
"en": "Sesotho",
"eo": "sota lingvo",
"es": "sesotho",
+ "eu": "sothoera",
"fi": "eteläsothon kieli",
"fr": "sotho du Sud",
"gl": "Lingua sotho",
@@ -10278,6 +10586,7 @@
"pt": "língua soto do sul",
"pt_BR": "língua soto",
"ru": "сесото",
+ "sl": "sesotščina",
"sv": "sesotho",
"_meta": {
"countries": [
@@ -10296,6 +10605,7 @@
"de": "Shelta",
"en": "Shelta",
"es": "shelta",
+ "eu": "Shelta",
"fi": "Shelta",
"fr": "shelta",
"gl": "Shelta",
@@ -10323,6 +10633,7 @@
"en": "Saterland Frisian",
"eo": "saterfrisa lingvo",
"es": "frisón del Saterland",
+ "eu": "ekialdeko frisiera",
"fi": "itäfriisi",
"fr": "frison saterlandais",
"gl": "Lingua frisoa oriental",
@@ -10345,12 +10656,13 @@
},
"su": {
"ca": "sunda",
- "cs": "Sunda",
+ "cs": "sundština",
"da": "Sunda",
"de": "Sundanesisch",
"en": "Sundanese",
"eo": "sunda lingvo",
"es": "sundanés",
+ "eu": "Sundera",
"fi": "sunda",
"fr": "soundanais",
"gl": "Sunda",
@@ -10360,12 +10672,12 @@
"it": "sunda",
"ja": "スンダ語",
"nb_NO": "sundanesisk",
- "nl": "Soendanees",
+ "nl": "Sundanees",
"pl": "język sundajski",
"pt": "Sunda",
"pt_BR": "Sunda",
"ru": "сунданский язык",
- "sl": "Sunda",
+ "sl": "sundanščina",
"sv": "sunda",
"_meta": {
"dir": [
@@ -10381,6 +10693,7 @@
"en": "Swedish",
"eo": "sveda lingvo",
"es": "sueco",
+ "eu": "suediera",
"fi": "ruotsi",
"fr": "suédois",
"gl": "lingua sueca",
@@ -10417,6 +10730,7 @@
"en": "Swahili",
"eo": "svahila lingvo",
"es": "suajili",
+ "eu": "swahili",
"fi": "swahili",
"fr": "swahili",
"gl": "Lingua suahili",
@@ -10458,10 +10772,12 @@
"it": "lingua silotica",
"ja": "シレット語",
"nb_NO": "Sylhetti",
- "nl": "taal van Sylhet",
+ "nl": "Sylheti",
"pl": "język syloti",
"ru": "силхетский язык",
"sv": "syloti",
+ "zh_Hans": "锡尔赫特语",
+ "zh_Hant": "錫爾赫特語",
"_meta": {
"dir": [
"left-to-right"
@@ -10476,6 +10792,7 @@
"en": "Silesian",
"eo": "silezia-pola lingvo",
"es": "silesio",
+ "eu": "Silesiera",
"fi": "sleesia",
"fr": "silésien",
"gl": "Lingua silesiana",
@@ -10505,6 +10822,7 @@
"gl": "Lingua sakizaya",
"id": "Bahasa Sakizaya",
"ja": "サキザヤ語",
+ "nl": "Sakizaya",
"pt": "Língua sakisaya",
"sv": "sakizaya",
"zh_Hans": "撒奇莱雅语",
@@ -10523,6 +10841,7 @@
"en": "Tamil",
"eo": "tamila lingvo",
"es": "tamil",
+ "eu": "Tamilera",
"fi": "tamil",
"fr": "tamoul",
"gl": "Lingua támil",
@@ -10584,6 +10903,7 @@
"en": "Tulu",
"eo": "tulua lingvo",
"es": "tulu",
+ "eu": "Tulu",
"fi": "Tulun kieli",
"fr": "toulou",
"gl": "Lingua tulu",
@@ -10606,11 +10926,12 @@
"te": {
"ca": "telugu",
"cs": "telugština",
- "da": "Telugu",
+ "da": "telugu",
"de": "Telugu",
"en": "Telugu",
"eo": "telugua lingvo",
"es": "télugu",
+ "eu": "Telugu",
"fi": "telugu",
"fr": "télougou",
"gl": "Lingua telugu",
@@ -10643,6 +10964,7 @@
"en": "Tetum",
"eo": "tetuna lingvo",
"es": "Idioma tetun",
+ "eu": "Tetum",
"fi": "Tetumin kieli",
"fr": "tétoum",
"gl": "Tetún",
@@ -10671,12 +10993,13 @@
"en": "Tajik",
"eo": "taĝika lingvo",
"es": "tayiko",
+ "eu": "tajikera",
"fi": "tadžikki",
"fr": "tadjik",
"gl": "Lingua taxica",
"he": "טג'יקית",
"hu": "tádzsik",
- "id": "Bahasa Tajik",
+ "id": "Tajik",
"it": "tagico",
"ja": "タジク語",
"nb_NO": "tadsjikisk",
@@ -10705,12 +11028,13 @@
"en": "Thai",
"eo": "taja lingvo",
"es": "tailandés",
+ "eu": "Thailandiera",
"fi": "thain kieli",
"fr": "thaï",
"gl": "lingua tailandesa",
"he": "תאית",
"hu": "thai",
- "id": "Thai",
+ "id": "bahasa Thai",
"it": "thailandese",
"ja": "タイ語",
"nb_NO": "thai",
@@ -10734,12 +11058,13 @@
},
"ti": {
"ca": "tigrinya",
- "cs": "Tigriňa",
+ "cs": "tigrajština",
"da": "Tigrinsk",
"de": "Tigrinya",
"en": "Tigrinya",
"eo": "tigraja lingvo",
"es": "idioma tigriña",
+ "eu": "Tigrinyera",
"fi": "tigrinja",
"fr": "tigrigna",
"gl": "Lingua tigriña",
@@ -10773,12 +11098,13 @@
"en": "Turkmen",
"eo": "turkmena lingvo",
"es": "turcomano",
+ "eu": "Turkmenera",
"fi": "turkmeeni",
"fr": "Turkmène",
"gl": "Lingua turcomá",
"he": "טורקמנית",
"hu": "türkmén",
- "id": "Bahasa Turkmen",
+ "id": "bahasa Turkmen",
"it": "Turkmeno",
"ja": "トルクメン語",
"nb_NO": "turkmensk",
@@ -10795,7 +11121,6 @@
"TM"
],
"dir": [
- "right-to-left",
"left-to-right"
]
}
@@ -10806,8 +11131,9 @@
"da": "tagalisk",
"de": "Tagalog",
"en": "Tagalog",
- "eo": "tagaloga lingvo",
+ "eo": "tagala lingvo",
"es": "tagalo",
+ "eu": "tagalo",
"fi": "tagalog",
"fr": "tagalog",
"gl": "lingua tagala",
@@ -10863,21 +11189,24 @@
"en": "Talysh",
"eo": "taliŝa lingvo",
"es": "talishi",
+ "eu": "Talyshera",
"fi": "Tališin kieli",
"fr": "talysh",
"gl": "Lingua talysh",
+ "he": "טליש",
"id": "Talish",
"it": "lingua taliscia",
"ja": "タリシュ語",
"nb_NO": "talysj",
"nl": "Talysjisch",
- "pl": "Tałyszowie",
+ "pl": "język tałyski",
"pt": "Língua talish",
"ru": "талышский язык",
"sv": "talysj",
"_meta": {
"dir": [
- "left-to-right"
+ "left-to-right",
+ "right-to-left"
]
}
},
@@ -10889,6 +11218,7 @@
"en": "Tswana",
"eo": "cvana lingvo",
"es": "setsuana",
+ "eu": "tswanera",
"fi": "tswanan kieli",
"fr": "tswana",
"gl": "Lingua tswana",
@@ -10903,6 +11233,7 @@
"pt": "língua tswana",
"pt_BR": "língua tswana",
"ru": "тсвана",
+ "sl": "cvanščina",
"sv": "setswana",
"zh_Hant": "札那語",
"_meta": {
@@ -10923,6 +11254,7 @@
"en": "Tongan",
"eo": "Tonga lingvo",
"es": "tongano",
+ "eu": "Tongera",
"fi": "Tongan kieli",
"fr": "tongien",
"gl": "Lingua tongana",
@@ -10955,6 +11287,7 @@
"en": "Tok Pisin",
"eo": "Tok-Pisino",
"es": "tok pisin",
+ "eu": "tok pisin",
"fi": "tok-pisin",
"fr": "tok pisin",
"gl": "Tok pisin",
@@ -11025,6 +11358,7 @@
"en": "Tsonga",
"eo": "conga lingvo",
"es": "tsonga",
+ "eu": "tsongera",
"fi": "tsongan kieli",
"fr": "tsonga",
"gl": "Lingua tsonga",
@@ -11060,12 +11394,13 @@
"en": "Tatar",
"eo": "tatara lingvo",
"es": "tártaro",
+ "eu": "tatarera",
"fi": "tataari",
"fr": "tatar",
"gl": "Lingua tártara",
"he": "טטרית",
"hu": "tatár",
- "id": "Bahasa Tatar",
+ "id": "bahasa Tatar",
"it": "tataro",
"ja": "タタール語",
"nb_NO": "tatarisk",
@@ -11115,6 +11450,7 @@
"en": "Tuvaluan",
"eo": "tuvala lingvo",
"es": "tuvaluano",
+ "eu": "Tuvaluera",
"fi": "tuvalun kieli",
"fr": "tuvaluan",
"gl": "Lingua tuvalesa",
@@ -11143,6 +11479,7 @@
"en": "Twi",
"eo": "Tvia",
"es": "idioma twi",
+ "eu": "twi",
"fi": "twi",
"fr": "twi",
"gl": "Lingua twi",
@@ -11172,6 +11509,7 @@
"en": "Tahitian",
"eo": "tahitia lingvo",
"es": "tahitiano",
+ "eu": "tahitiera",
"fi": "tahiti",
"fr": "tahitien",
"gl": "Lingua tahitiana",
@@ -11185,6 +11523,7 @@
"pl": "język tahitański",
"pt": "taitiano",
"ru": "таитянский язык",
+ "sl": "tahitijščina",
"sv": "tahitiska",
"zh_Hans": "塔希提语",
"zh_Hant": "大溪地語",
@@ -11201,12 +11540,13 @@
"en": "Tuvan",
"eo": "tuva lingvo",
"es": "idioma tuvano",
+ "eu": "Tuvera",
"fi": "tuvan kieli",
"fr": "touvain",
"gl": "Lingua tuvaniana",
"he": "טובאנית",
"hu": "tuvai",
- "id": "Bahasa Tuva",
+ "id": "bahasa Tuva",
"it": "tuvano",
"ja": "トゥヴァ語",
"nb_NO": "tuvinsk",
@@ -11233,7 +11573,7 @@
"he": "תמאזיגת של האטלס התיכון",
"it": "tamazight del Marocco centrale",
"ja": "中央アトラス・タマジクト語",
- "nl": "Central Atlas Tamazight",
+ "nl": "Centraal Atlas-Tamazight",
"pl": "Język tamazight",
"ru": "Тамазигхтские языки",
"sv": "tamazight",
@@ -11256,6 +11596,7 @@
"en": "Udmurt",
"eo": "udmurta lingvo",
"es": "udmurto",
+ "eu": "Udmurtera",
"fi": "udmurtin kieli",
"fr": "oudmourte",
"gl": "Lingua udmurta",
@@ -11285,12 +11626,13 @@
"en": "Uyghur",
"eo": "ujgura lingvo",
"es": "uigur",
+ "eu": "Uigurrera",
"fi": "uiguuri",
"fr": "ouïghour",
"gl": "Lingua uigur",
"he": "אויגורית",
"hu": "ujgur",
- "id": "bahasa Uigur",
+ "id": "bahasa Uyghur",
"it": "uiguro",
"ja": "ウイグル語",
"nb_NO": "uigurisk",
@@ -11318,12 +11660,13 @@
"en": "Ukrainian",
"eo": "ukraina lingvo",
"es": "ucraniano",
+ "eu": "ukrainera",
"fi": "ukraina",
"fr": "ukrainien",
"gl": "lingua ucraína",
"he": "אוקראינית",
"hu": "ukrán",
- "id": "Bahasa Ukraina",
+ "id": "bahasa Ukraina",
"it": "ucraino",
"ja": "ウクライナ語",
"nb_NO": "ukrainsk",
@@ -11353,6 +11696,7 @@
"en": "Uzbek",
"eo": "uzbeka lingvo",
"es": "uzbeko",
+ "eu": "Uzbekera",
"fi": "uzbekki",
"fr": "ouzbek",
"gl": "Lingua usbeka",
@@ -11403,6 +11747,7 @@
"en": "Venda",
"eo": "venda lingvo",
"es": "venda",
+ "eu": "vendera",
"fi": "vendan kieli",
"fr": "venda",
"gl": "Lingua venda",
@@ -11438,6 +11783,7 @@
"en": "Venetian",
"eo": "venecia lingvo",
"es": "véneto",
+ "eu": "Veneziera",
"fi": "venetsia",
"fr": "vénitien",
"gl": "Lingua véneta",
@@ -11451,8 +11797,10 @@
"pl": "język wenecki",
"pt": "Língua vêneta",
"ru": "современный венетский язык",
- "sl": "Beneščina",
+ "sl": "beneščina",
"sv": "venetianska",
+ "zh_Hans": "威尼斯语",
+ "zh_Hant": "威尼斯語",
"_meta": {
"dir": [
"left-to-right"
@@ -11467,6 +11815,7 @@
"en": "Veps",
"eo": "vepsa lingvo",
"es": "vepsio",
+ "eu": "vepsera",
"fi": "vepsä",
"fr": "vepse",
"gl": "Lingua vepsa",
@@ -11498,6 +11847,7 @@
"en": "Vietnamese",
"eo": "vjetnama lingvo",
"es": "vietnamita",
+ "eu": "Vietnamera",
"fi": "vietnam",
"fr": "vietnamien",
"gl": "Lingua vietnamita",
@@ -11542,6 +11892,7 @@
"nl": "West-Vlaams",
"pl": "dialekt zachodnioflamandzki",
"ru": "западнофламандская группа диалектов",
+ "sl": "zahodna flamščina",
"sv": "västflamländska",
"zh_Hans": "西佛兰德语",
"zh_Hant": "西佛蘭德語",
@@ -11552,7 +11903,7 @@
}
},
"vmf": {
- "de": "mainfränkische Dialekte",
+ "de": "Mainfränkisch",
"en": "Main-Franconian",
"es": "Fráncico del Meno",
"fr": "franconien du Main",
@@ -11574,11 +11925,12 @@
"en": "Votic",
"eo": "vota lingvo",
"es": "votio",
+ "eu": "votera",
"fi": "vatja",
"fr": "vote",
"he": "וודית",
"hu": "vót",
- "id": "Bahasa Votik",
+ "id": "bahasa Votik",
"it": "votico",
"ja": "ヴォート語",
"nb_NO": "votisk",
@@ -11602,7 +11954,7 @@
"de": "Võro",
"en": "Võro",
"eo": "voroa lingvo",
- "es": "Idioma võro",
+ "es": "idioma võro",
"fi": "võro",
"fr": "võro",
"gl": "Lingua võro",
@@ -11631,6 +11983,7 @@
"en": "Walloon",
"eo": "valona lingvo",
"es": "valón",
+ "eu": "Valoniera",
"fi": "Valloni",
"fr": "wallon",
"gl": "Lingua valoa",
@@ -11677,8 +12030,9 @@
"da": "varajansk",
"de": "Wáray-Wáray",
"en": "Waray",
- "eo": "varaja lingvo",
+ "eo": "ŭaraja lingvo",
"es": "samareño",
+ "eu": "samarera",
"fi": "waray-waray",
"fr": "ouarayen",
"gl": "Lingua waray-waray",
@@ -11734,6 +12088,7 @@
"en": "Sorbian",
"eo": "soraba lingvo",
"es": "sorbio",
+ "eu": "Sorabiera",
"fi": "Sorbi",
"fr": "sorabe",
"gl": "Lingua sorabia",
@@ -11762,6 +12117,7 @@
"es": "walisiano",
"fi": "Uvean kieli",
"fr": "wallisien",
+ "gl": "Lingua wallisiana",
"he": "ואליסיאנית",
"it": "wallisiano",
"ja": "ウォリス語",
@@ -11784,6 +12140,7 @@
"en": "Wolof",
"eo": "volofa lingvo",
"es": "wólof",
+ "eu": "Wolofera",
"fi": "wolofin kieli",
"fr": "wolof",
"gl": "lingua wolof",
@@ -11797,7 +12154,7 @@
"pl": "język wolof",
"pt": "Língua wolof",
"ru": "волоф",
- "sl": "Volofščina",
+ "sl": "volofščina",
"sv": "wolof",
"_meta": {
"countries": [
@@ -11811,16 +12168,17 @@
},
"wuu": {
"ca": "wu",
- "cs": "Wu",
+ "cs": "wu",
"de": "Wu",
- "en": "Wu Language",
+ "en": "Wu Chinese",
"eo": "vua lingvo",
"es": "Chino wu",
+ "eu": "Wu txinera",
"fi": "Wu-kiina",
"fr": "wu",
"gl": "Lingua wu",
"he": "סינית וו",
- "id": "Rumpun bahasa Wu",
+ "id": "bahasa Wu",
"it": "wu",
"ja": "呉語",
"nb_NO": "wu",
@@ -11845,6 +12203,7 @@
"en": "Vilamovian",
"eo": "vilamovica lingvo",
"es": "vilamoviciano",
+ "eu": "Wymysorys",
"fi": "Wymysorys",
"fr": "wilamowicien",
"gl": "Lingua wymysorys",
@@ -11873,6 +12232,7 @@
"en": "Xhosa",
"eo": "kosa lingvo",
"es": "xhosa",
+ "eu": "xhosera",
"fi": "xhosan kieli",
"fr": "xhosa",
"gl": "Lingua xhosa",
@@ -11887,7 +12247,7 @@
"pt": "língua xhosa",
"pt_BR": "língua xhosa",
"ru": "коса",
- "sl": "kosa",
+ "sl": "kojsanščina",
"sv": "xhosa",
"zh_Hant": "科薩語",
"_meta": {
@@ -11907,6 +12267,7 @@
"en": "Mingrelian",
"eo": "Mingrela kartvela lingvo",
"es": "megreliano",
+ "eu": "mingreliera",
"fi": "mingreli",
"fr": "mingrélien",
"gl": "Lingua mingreliana",
@@ -11955,6 +12316,7 @@
"yap": {
"de": "Yapesisch",
"en": "Yapese",
+ "eu": "Yapera",
"fi": "Yapin kieli",
"fr": "yap",
"it": "yapese",
@@ -11989,7 +12351,9 @@
"en": "Yenish",
"eo": "jeniŝa lingvo",
"es": "Idioma yeniche",
+ "eu": "Yeniche hizkuntza",
"fr": "yéniche",
+ "id": "bahasa Yeni",
"it": "yeniche",
"ja": "イェニッシュ",
"nb_NO": "jenischespråket",
@@ -12011,6 +12375,7 @@
"en": "Yiddish",
"eo": "jido",
"es": "yidis",
+ "eu": "Yiddish",
"fi": "jiddiš",
"fr": "yiddish",
"gl": "Lingua yiddish",
@@ -12041,6 +12406,7 @@
"en": "Yoruba",
"eo": "joruba lingvo",
"es": "yoruba",
+ "eu": "jorubera",
"fi": "joruban kieli",
"fr": "yoruba",
"gl": "Lingua yoruba",
@@ -12067,6 +12433,7 @@
"ca": "yonaguni",
"en": "Yonaguni",
"es": "yonaguni",
+ "eu": "yonaguniera",
"fr": "yonaguni",
"id": "Bahasa Yonaguni",
"it": "yonaguni",
@@ -12089,6 +12456,7 @@
"en": "Nenets",
"eo": "neneca lingvo",
"es": "nenezo",
+ "eu": "nenetsera",
"fi": "nenetsi",
"fr": "nénètse",
"he": "ננצית",
@@ -12139,6 +12507,7 @@
"en": "Zhuang",
"eo": "ĝuanga lingvo",
"es": "chuang",
+ "eu": "zhuangera",
"fi": "Zhuangin kieli",
"fr": "zhuang",
"gl": "Linguas zhuang",
@@ -12194,6 +12563,7 @@
"es": "Amazig estándar marroquí",
"fi": "Vakioitu tamazight",
"fr": "amazighe standard marocain",
+ "gl": "Amazigh estándar marroquí",
"ja": "標準モロッコ・タマジクト語",
"nl": "Standaardtamazight",
"ru": "Стандартный марокканский берберский язык",
@@ -12215,10 +12585,11 @@
"en": "Chinese",
"eo": "ĉina lingvo",
"es": "chino",
+ "eu": "txinera",
"fi": "kiina",
"fr": "langues chinoises",
"gl": "lingua chinesa",
- "he": "שפות סיניות",
+ "he": "סינית",
"hu": "kínai",
"id": "bahasa Tionghoa",
"it": "cinese",
@@ -12251,12 +12622,13 @@
"en": "Southern Min",
"eo": "minnana lingvo",
"es": "chino min nan",
+ "eu": "hegoaldeko min",
"fi": "Minnan",
"fr": "minnan",
"gl": "lingua min nam",
"he": "מין דרומי",
"hu": "minnan",
- "id": "Bahasa Min Selatan",
+ "id": "Min Selatan",
"it": "min nan",
"ja": "閩南語",
"nb_NO": "minnan",
@@ -12275,7 +12647,7 @@
]
}
},
- "zh_Hant": {
+ "zh_Hans": {
"ca": "xinès simplificat",
"cs": "zjednodušená čínština",
"da": "forenklet kinesisk",
@@ -12283,7 +12655,7 @@
"en": "Simplified Chinese",
"eo": "simpligita ĉina skribsistemo",
"es": "chino simplificado",
- "fi": "perinteinen kiina",
+ "eu": "Txinera sinplifikatua",
"fr": "chinois simplifié",
"gl": "chinés simplificado",
"he": "סינית מפושטת",
@@ -12306,6 +12678,36 @@
]
}
},
+ "zh_Hant": {
+ "ca": "xinès tradicional",
+ "cs": "čínština (tradiční)",
+ "da": "traditionel kinesisk",
+ "de": "traditionelles Chinesisch",
+ "en": "Traditional Chinese",
+ "eo": "ĉina lingvo de tradicia ortografio",
+ "es": "chino tradicional",
+ "eu": "Txinera tradizional",
+ "fi": "perinteinen kiina",
+ "fr": "chinois traditionnel",
+ "gl": "chinés tradicional",
+ "he": "סינית מסורתית",
+ "it": "cinese tradizionale",
+ "ja": "繁体字中国語",
+ "nb_NO": "tradisjonell kinesisk",
+ "nl": "traditioneel Chinees",
+ "pl": "język chiński tradycyjny",
+ "pt": "chinês tradicional",
+ "ru": "традиционный китайский",
+ "sl": "tradicionalna kitajščina",
+ "sv": "traditionell kinesiska",
+ "zh_Hans": "繁体中文",
+ "zh_Hant": "繁體中文",
+ "_meta": {
+ "dir": [
+ "left-to-right"
+ ]
+ }
+ },
"zu": {
"ca": "zulu",
"cs": "zuluština",
@@ -12314,6 +12716,7 @@
"en": "Zulu",
"eo": "zulua lingvo",
"es": "zulú",
+ "eu": "zuluera",
"fi": "zulu",
"fr": "zoulou",
"gl": "Lingua zulú",
@@ -12346,6 +12749,7 @@
"en": "Zuni",
"eo": "zunjia",
"es": "zuñi",
+ "eu": "Zuni hizkuntza",
"fi": "Zuni",
"fr": "zuni",
"hu": "zuni",
From 3a77c6f33e2df600a282f53f407891d318305cd8 Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Wed, 20 Sep 2023 23:05:08 +0200
Subject: [PATCH 05/40] Security: add DOM-purification, add 'norefferer' and
'noopener' automatically to links to new tabs
---
package-lock.json | 60 +++++++++++++++++++++++++++++-------
package.json | 2 ++
src/Models/ThemeViewState.ts | 1 +
src/UI/Base/FromHtml.svelte | 10 ++++--
src/Utils.ts | 11 +++++++
5 files changed, 71 insertions(+), 13 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 9256578de2..abd1e1ceda 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "mapcomplete",
- "version": "0.31.4",
+ "version": "0.33.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "mapcomplete",
- "version": "0.31.4",
+ "version": "0.33.0",
"license": "GPL-3.0-or-later",
"dependencies": {
"@rgossiaux/svelte-headlessui": "^1.0.2",
@@ -18,12 +18,14 @@
"@turf/distance": "^6.5.0",
"@turf/length": "^6.5.0",
"@turf/turf": "^6.5.0",
+ "@types/dompurify": "^3.0.2",
"@types/showdown": "^2.0.0",
"chart.js": "^3.8.0",
"country-language": "^0.1.7",
"country-to-currency": "^1.0.10",
"csv-parse": "^5.1.0",
"doctest-ts-improved": "^0.8.8",
+ "dompurify": "^3.0.5",
"email-validator": "^2.0.4",
"escape-html": "^1.0.3",
"fake-dom": "^1.0.4",
@@ -3799,6 +3801,14 @@
"@types/chai": "*"
}
},
+ "node_modules/@types/dompurify": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.2.tgz",
+ "integrity": "sha512-YBL4ziFebbbfQfH5mlC+QTJsvh0oJUrWbmxKMyEdL7emlHJqGR2Qb34TEFKj+VCayBvjKy3xczMFNhugThUsfQ==",
+ "dependencies": {
+ "@types/trusted-types": "*"
+ }
+ },
"node_modules/@types/estree": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
@@ -3926,6 +3936,11 @@
"resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.0.tgz",
"integrity": "sha512-70xBJoLv+oXjB5PhtA8vo7erjLDp9/qqI63SRHm4REKrwuPOLs8HhXwlZJBJaB4kC18cCZ1UUZ6Fb/PLFW4TCA=="
},
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz",
+ "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ=="
+ },
"node_modules/@types/wikidata-sdk": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@types/wikidata-sdk/-/wikidata-sdk-6.1.0.tgz",
@@ -6009,10 +6024,9 @@
}
},
"node_modules/dompurify": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz",
- "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==",
- "optional": true
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz",
+ "integrity": "sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A=="
},
"node_modules/domutils": {
"version": "1.3.0",
@@ -8394,6 +8408,12 @@
"url": "https://opencollective.com/core-js"
}
},
+ "node_modules/jspdf/node_modules/dompurify": {
+ "version": "2.4.7",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz",
+ "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==",
+ "optional": true
+ },
"node_modules/jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
@@ -16125,6 +16145,14 @@
"@types/chai": "*"
}
},
+ "@types/dompurify": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.2.tgz",
+ "integrity": "sha512-YBL4ziFebbbfQfH5mlC+QTJsvh0oJUrWbmxKMyEdL7emlHJqGR2Qb34TEFKj+VCayBvjKy3xczMFNhugThUsfQ==",
+ "requires": {
+ "@types/trusted-types": "*"
+ }
+ },
"@types/estree": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
@@ -16252,6 +16280,11 @@
"resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.0.tgz",
"integrity": "sha512-70xBJoLv+oXjB5PhtA8vo7erjLDp9/qqI63SRHm4REKrwuPOLs8HhXwlZJBJaB4kC18cCZ1UUZ6Fb/PLFW4TCA=="
},
+ "@types/trusted-types": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz",
+ "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ=="
+ },
"@types/wikidata-sdk": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@types/wikidata-sdk/-/wikidata-sdk-6.1.0.tgz",
@@ -17770,10 +17803,9 @@
}
},
"dompurify": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz",
- "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==",
- "optional": true
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz",
+ "integrity": "sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A=="
},
"domutils": {
"version": "1.3.0",
@@ -19559,6 +19591,12 @@
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.1.tgz",
"integrity": "sha512-GutwJLBChfGCpwwhbYoqfv03LAfmiz7e7D/BNxzeMxwQf10GRSzqiOjx7AmtEk+heiD/JWmBuyBPgFtx0Sg1ww==",
"optional": true
+ },
+ "dompurify": {
+ "version": "2.4.7",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz",
+ "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==",
+ "optional": true
}
}
},
@@ -23212,4 +23250,4 @@
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
}
}
-}
\ No newline at end of file
+}
diff --git a/package.json b/package.json
index 534568b5de..0b8d6a20bd 100644
--- a/package.json
+++ b/package.json
@@ -115,12 +115,14 @@
"@turf/distance": "^6.5.0",
"@turf/length": "^6.5.0",
"@turf/turf": "^6.5.0",
+ "@types/dompurify": "^3.0.2",
"@types/showdown": "^2.0.0",
"chart.js": "^3.8.0",
"country-language": "^0.1.7",
"country-to-currency": "^1.0.10",
"csv-parse": "^5.1.0",
"doctest-ts-improved": "^0.8.8",
+ "dompurify": "^3.0.5",
"email-validator": "^2.0.4",
"escape-html": "^1.0.3",
"fake-dom": "^1.0.4",
diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts
index 778576654f..4058b8c75c 100644
--- a/src/Models/ThemeViewState.ts
+++ b/src/Models/ThemeViewState.ts
@@ -113,6 +113,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
readonly floors: Store
constructor(layout: LayoutConfig) {
+ Utils.initDomPurify()
this.layout = layout
this.featureSwitches = new FeatureSwitchState(layout)
this.guistate = new MenuState(
diff --git a/src/UI/Base/FromHtml.svelte b/src/UI/Base/FromHtml.svelte
index b03b2624eb..ee37d88bf7 100644
--- a/src/UI/Base/FromHtml.svelte
+++ b/src/UI/Base/FromHtml.svelte
@@ -2,12 +2,18 @@
/**
* Given an HTML string, properly shows this
*/
-
+ import DOMPurify from 'dompurify';
export let src: string
+
+ let cleaned = DOMPurify.sanitize(src, { USE_PROFILES: { html: true },
+ ADD_ATTR: ['target'] // Don't remove target='_blank'. Note that Utils.initDomPurify does add a hook which automatically adds 'rel=noopener'
+ });
+
+
let htmlElem: HTMLElement
$: {
if (htmlElem) {
- htmlElem.innerHTML = src
+ htmlElem.innerHTML = cleaned
}
}
diff --git a/src/Utils.ts b/src/Utils.ts
index 9767027f46..cc09e8597b 100644
--- a/src/Utils.ts
+++ b/src/Utils.ts
@@ -1,4 +1,5 @@
import colors from "./assets/colors.json"
+import DOMPurify from "dompurify"
export class Utils {
/**
@@ -25,6 +26,16 @@ Note that these values can be prepare with javascript in the theme by using a [c
`
public static readonly imageExtensions = new Set(["jpg", "png", "svg", "jpeg", ".gif"])
+ public static initDomPurify() {
+ DOMPurify.addHook("afterSanitizeAttributes", function (node) {
+ // set all elements owning target to target=_blank + add noopener noreferrer
+ if ("target" in node) {
+ node.setAttribute("target", "_blank")
+ node.setAttribute("rel", "noopener noreferrer")
+ }
+ })
+ }
+
public static readonly special_visualizations_importRequirementDocs = `#### Importing a dataset into OpenStreetMap: requirements
If you want to import a dataset, make sure that:
From 1930f7bb53f4d477c2529471b478db77ddcc012b Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Wed, 20 Sep 2023 23:35:00 +0200
Subject: [PATCH 06/40] Fix: remove unneeded translation download, fix
PDF-export
---
src/Utils/svgToPdf.ts | 7 -------
1 file changed, 7 deletions(-)
diff --git a/src/Utils/svgToPdf.ts b/src/Utils/svgToPdf.ts
index 4bbc9e594e..0ae2399921 100644
--- a/src/Utils/svgToPdf.ts
+++ b/src/Utils/svgToPdf.ts
@@ -679,13 +679,6 @@ class SvgToPdfPage {
".json",
24 * 60 * 60 * 1000
)
- const shared_questions = await Utils.downloadJsonCached(
- "https://raw.githubusercontent.com/pietervdvn/MapComplete/develop/langs/shared-questions/" +
- language +
- ".json",
- 24 * 60 * 60 * 1000
- )
- this.layerTranslations[language]["shared-questions"] = shared_questions["shared_questions"]
}
public async Prepare() {
From 8fccf784786074e22a4d437dc8a38c58bf54c375 Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Thu, 21 Sep 2023 00:25:04 +0200
Subject: [PATCH 07/40] Fix: use api.openstreetmap.org on many places, fix
#1573
---
package.json | 6 +++---
.../FeatureSource/Sources/OsmFeatureSource.ts | 6 +++---
src/Logic/Osm/Actions/ReplaceGeometryAction.ts | 2 +-
src/Logic/Osm/OsmConnection.ts | 6 ++----
src/Logic/Osm/OsmObject.ts | 2 +-
src/Logic/Osm/OsmObjectDownloader.ts | 2 +-
src/Logic/SimpleMetaTagger.ts | 2 +-
src/UI/Popup/NoteCommentElement.ts | 2 +-
src/Utils.ts | 3 +++
test/Logic/Actors/Actors.spec.ts | 2 +-
.../OSM/Actions/RelationSplitHandler.spec.ts | 12 ++++++------
.../OSM/Actions/ReplaceGeometryAction.spec.ts | 6 +++---
test/Logic/OSM/Actions/SplitAction.spec.ts | 16 ++++++++--------
test/Logic/OSM/OsmObject.spec.ts | 4 ++--
14 files changed, 36 insertions(+), 35 deletions(-)
diff --git a/package.json b/package.json
index 0b8d6a20bd..540a1434b9 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "mapcomplete",
- "version": "0.33.0",
+ "version": "0.33.1",
"repository": "https://github.com/pietervdvn/MapComplete",
"description": "A small website to edit OSM easily",
"bugs": "https://github.com/pietervdvn/MapComplete/issues",
@@ -21,13 +21,13 @@
"#": "This client_id is registered by 'Pieter Vander Vennet' on OSM.org",
"oauth_client_id": "sa1ngLJBJ8McmzHElN8NYtIDm5TZTYEYhq3-0snO4Qc",
"oauth_secret": "XU_cD5Mvw9VKk9T0t_gO8V7cbRC4Hmw2Tb4Rv0Zmz-U",
- "url": "https://www.openstreetmap.org"
+ "url": "https://api.openstreetmap.org"
},
"osm": {
"#": "This client-id is registered by 'MapComplete' on osm.org",
"oauth_client_id": "K93H1d8ve7p-tVLE1ZwsQ4lAFLQk8INx5vfTLMu5DWk",
"oauth_secret": "NBWGhWDrD3QDB35xtVuxv4aExnmIt4FA_WgeLtwxasg",
- "url": "https://www.openstreetmap.org"
+ "url": "https://api.openstreetmap.org"
},
"osm-test": {
"oauth_client_id": "HwUn6GPxGm1m9WwMarxTglhy6dBTM4YkaV1I9h6pDGU",
diff --git a/src/Logic/FeatureSource/Sources/OsmFeatureSource.ts b/src/Logic/FeatureSource/Sources/OsmFeatureSource.ts
index 3890ce14f8..e884b1799a 100644
--- a/src/Logic/FeatureSource/Sources/OsmFeatureSource.ts
+++ b/src/Logic/FeatureSource/Sources/OsmFeatureSource.ts
@@ -20,7 +20,7 @@ export default class OsmFeatureSource extends FeatureSourceMerger {
private options: {
bounds: Store
readonly allowedFeatures: TagsFilter
- backend?: "https://openstreetmap.org/" | string
+ backend?: "https://api.openstreetmap.org/" | string
/**
* If given: this featureSwitch will not update if the store contains 'false'
*/
@@ -41,7 +41,7 @@ export default class OsmFeatureSource extends FeatureSourceMerger {
constructor(options: {
bounds: Store
readonly allowedFeatures: TagsFilter
- backend?: "https://openstreetmap.org/" | string
+ backend?: "https://api.openstreetmap.org/" | string
/**
* If given: this featureSwitch will not update if the store contains 'false'
*/
@@ -54,7 +54,7 @@ export default class OsmFeatureSource extends FeatureSourceMerger {
this._bounds = options.bounds
this.allowedTags = options.allowedFeatures
this.isActive = options.isActive ?? new ImmutableStore(true)
- this._backend = options.backend ?? "https://www.openstreetmap.org"
+ this._backend = options.backend ?? "https://api.openstreetmap.org"
this._bounds.addCallbackAndRunD((bbox) => this.loadData(bbox))
this._patchRelations = options?.patchRelations ?? true
}
diff --git a/src/Logic/Osm/Actions/ReplaceGeometryAction.ts b/src/Logic/Osm/Actions/ReplaceGeometryAction.ts
index 3dd23b73a7..07be721fbf 100644
--- a/src/Logic/Osm/Actions/ReplaceGeometryAction.ts
+++ b/src/Logic/Osm/Actions/ReplaceGeometryAction.ts
@@ -215,7 +215,7 @@ export default class ReplaceGeometryAction extends OsmChangeAction implements Pr
throw "Invalid ID to conflate: " + this.wayToReplaceId
}
const url = `${
- this.state.osmConnection?._oauth_config?.url ?? "https://openstreetmap.org"
+ this.state.osmConnection?._oauth_config?.url ?? "https://api.openstreetmap.org"
}/api/0.6/${this.wayToReplaceId}/full`
const rawData = await Utils.downloadJsonCached(url, 1000)
parsed = OsmObject.ParseObjects(rawData.elements)
diff --git a/src/Logic/Osm/OsmConnection.ts b/src/Logic/Osm/OsmConnection.ts
index b4b47d68e9..b6ddddf0b5 100644
--- a/src/Logic/Osm/OsmConnection.ts
+++ b/src/Logic/Osm/OsmConnection.ts
@@ -85,7 +85,7 @@ export class OsmConnection {
this._oauth_config = {
oauth_client_id: import.meta.env.VITE_OSM_OAUTH_CLIENT_ID,
oauth_secret: import.meta.env.VITE_OSM_OAUTH_SECRET,
- url: "https://www.openstreetmap.org",
+ url: "https://api.openstreetmap.org",
}
}
@@ -179,7 +179,7 @@ export class OsmConnection {
/**
* The backend host, without path or trailing '/'
*
- * new OsmConnection().Backend() // => "https://www.openstreetmap.org"
+ * new OsmConnection().Backend() // => "https://api.openstreetmap.org"
*/
public Backend(): string {
return this._oauth_config.url
@@ -365,7 +365,6 @@ export class OsmConnection {
)
})
}
- const auth = this.auth
const content = { lat, lon, text }
const response = await this.post("notes.json", JSON.stringify(content), {
"Content-Type": "application/json",
@@ -414,7 +413,6 @@ export class OsmConnection {
'"\r\nContent-Type: application/gpx+xml',
}
- const auth = this.auth
const boundary = "987654"
let body = ""
diff --git a/src/Logic/Osm/OsmObject.ts b/src/Logic/Osm/OsmObject.ts
index 44b8091906..f0e0215cde 100644
--- a/src/Logic/Osm/OsmObject.ts
+++ b/src/Logic/Osm/OsmObject.ts
@@ -5,7 +5,7 @@ import OsmToGeoJson from "osmtogeojson"
import { Feature, LineString, Polygon } from "geojson"
export abstract class OsmObject {
- private static defaultBackend = "https://www.openstreetmap.org/"
+ private static defaultBackend = "https://api.openstreetmap.org/"
protected static backendURL = OsmObject.defaultBackend
private static polygonFeatures = OsmObject.constructPolygonFeatures()
type: "node" | "way" | "relation"
diff --git a/src/Logic/Osm/OsmObjectDownloader.ts b/src/Logic/Osm/OsmObjectDownloader.ts
index c6c238eb8a..2118275772 100644
--- a/src/Logic/Osm/OsmObjectDownloader.ts
+++ b/src/Logic/Osm/OsmObjectDownloader.ts
@@ -17,7 +17,7 @@ export default class OsmObjectDownloader {
private historyCache = new Map>()
constructor(
- backend: string = "https://www.openstreetmap.org",
+ backend: string = "https://api.openstreetmap.org",
changes?: {
readonly pendingChanges: UIEventSource
readonly isUploading: Store
diff --git a/src/Logic/SimpleMetaTagger.ts b/src/Logic/SimpleMetaTagger.ts
index 2d1a8688c2..f9f4997ff7 100644
--- a/src/Logic/SimpleMetaTagger.ts
+++ b/src/Logic/SimpleMetaTagger.ts
@@ -219,7 +219,7 @@ class RewriteMetaInfoTags extends SimpleMetaTagger {
move("changeset", "_last_edit:changeset")
move("timestamp", "_last_edit:timestamp")
move("version", "_version_number")
- feature.properties._backend = feature.properties._backend ?? "https://openstreetmap.org"
+ feature.properties._backend = feature.properties._backend ?? "https://api.openstreetmap.org"
return movedSomething
}
}
diff --git a/src/UI/Popup/NoteCommentElement.ts b/src/UI/Popup/NoteCommentElement.ts
index c72244924c..7e03686bec 100644
--- a/src/UI/Popup/NoteCommentElement.ts
+++ b/src/UI/Popup/NoteCommentElement.ts
@@ -41,7 +41,7 @@ export default class NoteCommentElement extends Combine {
let userinfo = Stores.FromPromise(
Utils.downloadJsonCached(
- "https://www.openstreetmap.org/api/0.6/user/" + comment.uid,
+ "https://api.openstreetmap.org/api/0.6/user/" + comment.uid,
24 * 60 * 60 * 1000
)
)
diff --git a/src/Utils.ts b/src/Utils.ts
index cc09e8597b..290c66bb26 100644
--- a/src/Utils.ts
+++ b/src/Utils.ts
@@ -27,6 +27,9 @@ Note that these values can be prepare with javascript in the theme by using a [c
public static readonly imageExtensions = new Set(["jpg", "png", "svg", "jpeg", ".gif"])
public static initDomPurify() {
+ if (Utils.runningFromConsole) {
+ return
+ }
DOMPurify.addHook("afterSanitizeAttributes", function (node) {
// set all elements owning target to target=_blank + add noopener noreferrer
if ("target" in node) {
diff --git a/test/Logic/Actors/Actors.spec.ts b/test/Logic/Actors/Actors.spec.ts
index ef31ee3193..751964722e 100644
--- a/test/Logic/Actors/Actors.spec.ts
+++ b/test/Logic/Actors/Actors.spec.ts
@@ -21,7 +21,7 @@ const latestTags = {
"public_bookcase:type": "reading_box",
}
-Utils.injectJsonDownloadForTests("https://www.openstreetmap.org/api/0.6/node/5568693115", {
+Utils.injectJsonDownloadForTests("https://api.openstreetmap.org/api/0.6/node/5568693115", {
version: "0.6",
generator: "CGImap 0.8.5 (1815943 spike-06.openstreetmap.org)",
copyright: "OpenStreetMap and contributors",
diff --git a/test/Logic/OSM/Actions/RelationSplitHandler.spec.ts b/test/Logic/OSM/Actions/RelationSplitHandler.spec.ts
index fa90eafd3c..8b3dede8b4 100644
--- a/test/Logic/OSM/Actions/RelationSplitHandler.spec.ts
+++ b/test/Logic/OSM/Actions/RelationSplitHandler.spec.ts
@@ -11,7 +11,7 @@ import { ImmutableStore } from "../../../../src/Logic/UIEventSource"
import { OsmConnection } from "../../../../src/Logic/Osm/OsmConnection"
describe("RelationSplitHandler", () => {
- Utils.injectJsonDownloadForTests("https://www.openstreetmap.org/api/0.6/node/1124134958/ways", {
+ Utils.injectJsonDownloadForTests("https://api.openstreetmap.org/api/0.6/node/1124134958/ways", {
version: "0.6",
generator: "CGImap 0.8.5 (2937646 spike-07.openstreetmap.org)",
copyright: "OpenStreetMap and contributors",
@@ -81,7 +81,7 @@ describe("RelationSplitHandler", () => {
})
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/relation/9572808/full",
+ "https://api.openstreetmap.org/api/0.6/relation/9572808/full",
{
version: "0.6",
generator: "CGImap 0.8.5 (3128319 spike-07.openstreetmap.org)",
@@ -200,7 +200,7 @@ describe("RelationSplitHandler", () => {
}
)
- Utils.injectJsonDownloadForTests("https://www.openstreetmap.org/api/0.6/way/687866206/full", {
+ Utils.injectJsonDownloadForTests("https://api.openstreetmap.org/api/0.6/way/687866206/full", {
version: "0.6",
generator: "CGImap 0.8.5 (2601512 spike-07.openstreetmap.org)",
copyright: "OpenStreetMap and contributors",
@@ -250,7 +250,7 @@ describe("RelationSplitHandler", () => {
],
})
- Utils.injectJsonDownloadForTests("https://www.openstreetmap.org/api/0.6/way/690497698/full", {
+ Utils.injectJsonDownloadForTests("https://api.openstreetmap.org/api/0.6/way/690497698/full", {
version: "0.6",
generator: "CGImap 0.8.5 (3023311 spike-07.openstreetmap.org)",
copyright: "OpenStreetMap and contributors",
@@ -311,7 +311,7 @@ describe("RelationSplitHandler", () => {
],
})
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/relation/4374576/full",
+ "https://api.openstreetmap.org/api/0.6/relation/4374576/full",
{
version: "0.6",
generator: "CGImap 0.8.5 (1266692 spike-06.openstreetmap.org)",
@@ -342,7 +342,7 @@ describe("RelationSplitHandler", () => {
}
)
- Utils.injectJsonDownloadForTests("https://www.openstreetmap.org/api/0.6/way/143298912/full", {
+ Utils.injectJsonDownloadForTests("https://api.openstreetmap.org/api/0.6/way/143298912/full", {
version: "0.6",
generator: "CGImap 0.8.5 (4046166 spike-07.openstreetmap.org)",
copyright: "OpenStreetMap and contributors",
diff --git a/test/Logic/OSM/Actions/ReplaceGeometryAction.spec.ts b/test/Logic/OSM/Actions/ReplaceGeometryAction.spec.ts
index 94098e525e..bcc6e69d7b 100644
--- a/test/Logic/OSM/Actions/ReplaceGeometryAction.spec.ts
+++ b/test/Logic/OSM/Actions/ReplaceGeometryAction.spec.ts
@@ -327,7 +327,7 @@ describe("ReplaceGeometryAction", () => {
const wayId = "way/160909312"
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/map.json?bbox=3.2166673243045807,51.21467321525788,3.217007964849472,51.21482442824023",
+ "https://api.openstreetmap.org/api/0.6/map.json?bbox=3.2166673243045807,51.21467321525788,3.217007964849472,51.21482442824023",
{
version: "0.6",
generator: "CGImap 0.8.6 (1549677 spike-06.openstreetmap.org)",
@@ -715,7 +715,7 @@ describe("ReplaceGeometryAction", () => {
}
)
- Utils.injectJsonDownloadForTests("https://www.openstreetmap.org/api/0.6/way/160909312/full", {
+ Utils.injectJsonDownloadForTests("https://api.openstreetmap.org/api/0.6/way/160909312/full", {
version: "0.6",
generator: "CGImap 0.8.6 (2407324 spike-06.openstreetmap.org)",
copyright: "OpenStreetMap and contributors",
@@ -880,7 +880,7 @@ describe("ReplaceGeometryAction", () => {
[3.2166673243045807, 51.21467321525788],
[3.217007964849472, 51.21482442824023],
])
- const url = `https://www.openstreetmap.org/api/0.6/map.json?bbox=${bbox.minLon},${bbox.minLat},${bbox.maxLon},${bbox.maxLat}`
+ const url = `https://api.openstreetmap.org/api/0.6/map.json?bbox=${bbox.minLon},${bbox.minLat},${bbox.maxLon},${bbox.maxLat}`
const data = await Utils.downloadJson(url)
const fullNodeDatabase = new FullNodeDatabaseSource()
fullNodeDatabase.handleOsmJson(data, 0, 0, 0)
diff --git a/test/Logic/OSM/Actions/SplitAction.spec.ts b/test/Logic/OSM/Actions/SplitAction.spec.ts
index 53147d224c..aee9a58600 100644
--- a/test/Logic/OSM/Actions/SplitAction.spec.ts
+++ b/test/Logic/OSM/Actions/SplitAction.spec.ts
@@ -9,7 +9,7 @@ describe("SplitAction", () => {
{
// Setup of download
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/way/941079939/full",
+ "https://api.openstreetmap.org/api/0.6/way/941079939/full",
{
version: "0.6",
generator: "CGImap 0.8.5 (957273 spike-08.openstreetmap.org)",
@@ -210,7 +210,7 @@ describe("SplitAction", () => {
)
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/way/941079939/relations",
+ "https://api.openstreetmap.org/api/0.6/way/941079939/relations",
{
version: "0.6",
generator: "CGImap 0.8.5 (2419440 spike-07.openstreetmap.org)",
@@ -222,7 +222,7 @@ describe("SplitAction", () => {
)
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/way/295132739/full",
+ "https://api.openstreetmap.org/api/0.6/way/295132739/full",
{
version: "0.6",
generator: "CGImap 0.8.5 (3138407 spike-07.openstreetmap.org)",
@@ -409,7 +409,7 @@ describe("SplitAction", () => {
}
)
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/way/295132739/relations",
+ "https://api.openstreetmap.org/api/0.6/way/295132739/relations",
// Mimick that there are no relations relation is missing
{
version: "0.6",
@@ -422,7 +422,7 @@ describe("SplitAction", () => {
)
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/way/61435323/full",
+ "https://api.openstreetmap.org/api/0.6/way/61435323/full",
{
version: "0.6",
generator: "CGImap 0.8.5 (53092 spike-08.openstreetmap.org)",
@@ -488,7 +488,7 @@ describe("SplitAction", () => {
}
)
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/way/61435323/relations",
+ "https://api.openstreetmap.org/api/0.6/way/61435323/relations",
{
version: "0.6",
generator: "CGImap 0.8.5 (3622541 spike-06.openstreetmap.org)",
@@ -2567,7 +2567,7 @@ describe("SplitAction", () => {
}
)
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/way/61435332/full",
+ "https://api.openstreetmap.org/api/0.6/way/61435332/full",
{
version: "0.6",
generator: "CGImap 0.8.5 (3819319 spike-06.openstreetmap.org)",
@@ -2620,7 +2620,7 @@ describe("SplitAction", () => {
}
)
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/way/509668834/full",
+ "https://api.openstreetmap.org/api/0.6/way/509668834/full",
{
version: "0.6",
generator: "CGImap 0.8.5 (3735280 spike-06.openstreetmap.org)",
diff --git a/test/Logic/OSM/OsmObject.spec.ts b/test/Logic/OSM/OsmObject.spec.ts
index be8c416ef7..01c962ec6b 100644
--- a/test/Logic/OSM/OsmObject.spec.ts
+++ b/test/Logic/OSM/OsmObject.spec.ts
@@ -8,7 +8,7 @@ import OsmObjectDownloader from "../../../src/Logic/Osm/OsmObjectDownloader"
describe("OsmObject", () => {
describe("download referencing ways", () => {
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/node/1124134958/ways",
+ "https://api.openstreetmap.org/api/0.6/node/1124134958/ways",
{
version: "0.6",
generator: "CGImap 0.8.6 (49805 spike-06.openstreetmap.org)",
@@ -89,7 +89,7 @@ describe("OsmObject", () => {
it("should download full OSM-relations", async () => {
ScriptUtils.fixUtils()
Utils.injectJsonDownloadForTests(
- "https://www.openstreetmap.org/api/0.6/relation/5759328/full",
+ "https://api.openstreetmap.org/api/0.6/relation/5759328/full",
JSON.parse(readFileSync("./test/data/relation_5759328.json", { encoding: "utf-8" }))
)
const r = await new OsmObjectDownloader()
From 97236c80a99686a1dc0c296bb4a730bc595884a5 Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Thu, 21 Sep 2023 01:18:59 +0200
Subject: [PATCH 08/40] Themes: add ALPR-cameras to surveillance theme
---
.../surveillance_camera.json | 85 +++++++++++++++++--
1 file changed, 78 insertions(+), 7 deletions(-)
diff --git a/assets/layers/surveillance_camera/surveillance_camera.json b/assets/layers/surveillance_camera/surveillance_camera.json
index 83292fc9f4..7252f2047d 100644
--- a/assets/layers/surveillance_camera/surveillance_camera.json
+++ b/assets/layers/surveillance_camera/surveillance_camera.json
@@ -40,6 +40,32 @@
},
"tagRenderings": [
"images",
+ {
+ "id": "has_alpr",
+ "question": {
+ "en": "Can this camera automatically detect license plates?"
+ },
+ "questionHint": {
+ "en": "An ALPR (Automatic License Plate Reader) typically has two lenses and an array of infrared LEDS in between."
+ },
+ "mappings": [
+ {
+ "if": "surveillance:type=camera",
+ "then": {
+ "en": "This is a normal camera"
+ }
+ },
+ {
+ "if": "surveillance:type=ALPR",
+ "then": {
+ "en": "This is an ALPR (Automatic License Plate Reader)"
+ },
+ "icon": {
+ "path": "./assets/layers/surveillance_camera/ALPR.svg"
+ }
+ }
+ ]
+ },
{
"question": {
"en": "What kind of camera is this?",
@@ -595,6 +621,40 @@
"fr": "une caméra de surveillance fixée au mur"
},
"snapToLayer": "walls_and_buildings"
+ },
+ {
+ "tags": [
+ "man_made=surveillance",
+ "surveillance:type=ALPR"
+ ],
+ "title": {
+ "en": "an ALPR camera (Automatic Number Plate Reader)"
+ },
+ "description": {
+ "en": "An ALPR typically has two lenses and an array of infrared lights."
+ },
+ "exampleImages": [
+ "./assets/layers/surveillance_camera/ALPR_Example.jpg",
+ "./assets/layers/surveillance_camera/ALPR_Example2.jpg"
+ ]
+ },
+ {
+ "tags": [
+ "man_made=surveillance",
+ "surveillance:type=ALPR",
+ "camera:mount=wall"
+ ],
+ "title": {
+ "en": "an ALPR camera (Automatic Number Plate Reader) mounted on a wall"
+ },
+ "description": {
+ "en": "An ALPR typically has two lenses and an array of infrared lights."
+ },
+ "exampleImages": [
+ "./assets/layers/surveillance_camera/ALPR_Example.jpg",
+ "./assets/layers/surveillance_camera/ALPR_Example2.jpg"
+ ],
+ "snapToLayer": "walls_and_buildings"
}
],
"mapRendering": [
@@ -602,6 +662,10 @@
"icon": {
"render": "./assets/themes/surveillance/logo.svg",
"mappings": [
+ {
+ "if": "surveillance:type=ALPR",
+ "then": "./assets/layers/surveillance_camera/ALPR.svg"
+ },
{
"if": "camera:type=dome",
"then": "./assets/themes/surveillance/dome.svg"
@@ -619,15 +683,17 @@
"iconSize": {
"mappings": [
{
- "if": "camera:type=dome",
- "then": "50,50,center"
- },
- {
- "if": "_direction:leftright~*",
+ "if": {
+ "and": [
+ "camera:type=fixed",
+ "surveillance:type=camera",
+ "_direction:leftright~*"
+ ]
+ },
"then": "100,35,center"
}
],
- "render": "50,50,center"
+ "render": "35,35,center"
},
"location": [
"point",
@@ -638,7 +704,12 @@
"render": "calc({_direction:numerical}deg + 90deg)",
"mappings": [
{
- "if": "camera:type=dome",
+ "if": {
+ "or": [
+ "camera:type=dome",
+ "surveillance:type=ALPR"
+ ]
+ },
"then": "0"
},
{
From d1e91ee2f98936871941e4b7cd035ee4f1e35bbd Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Thu, 21 Sep 2023 01:19:07 +0200
Subject: [PATCH 09/40] Themes: add ALPR-cameras to surveillance theme
---
assets/layers/surveillance_camera/ALPR.svg | 129 ++++++++++++++++++
.../surveillance_camera/ALPR.svg.license | 2 +
.../surveillance_camera/ALPR_Example.jpg | Bin 0 -> 115658 bytes
.../ALPR_Example.jpg.license | 2 +
.../surveillance_camera/ALPR_Example2.jpg | Bin 0 -> 118171 bytes
.../ALPR_Example2.jpg.license | 2 +
.../surveillance_camera/license_info.json | 30 ++++
7 files changed, 165 insertions(+)
create mode 100644 assets/layers/surveillance_camera/ALPR.svg
create mode 100644 assets/layers/surveillance_camera/ALPR.svg.license
create mode 100644 assets/layers/surveillance_camera/ALPR_Example.jpg
create mode 100644 assets/layers/surveillance_camera/ALPR_Example.jpg.license
create mode 100644 assets/layers/surveillance_camera/ALPR_Example2.jpg
create mode 100644 assets/layers/surveillance_camera/ALPR_Example2.jpg.license
create mode 100644 assets/layers/surveillance_camera/license_info.json
diff --git a/assets/layers/surveillance_camera/ALPR.svg b/assets/layers/surveillance_camera/ALPR.svg
new file mode 100644
index 0000000000..a25527c21a
--- /dev/null
+++ b/assets/layers/surveillance_camera/ALPR.svg
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/layers/surveillance_camera/ALPR.svg.license b/assets/layers/surveillance_camera/ALPR.svg.license
new file mode 100644
index 0000000000..ed02883002
--- /dev/null
+++ b/assets/layers/surveillance_camera/ALPR.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Pieter Vander Vennet
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/layers/surveillance_camera/ALPR_Example.jpg b/assets/layers/surveillance_camera/ALPR_Example.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b16999e68493028545596ca2f36015b90bdd6fe0
GIT binary patch
literal 115658
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