Merge branch 'master' of github.com:pietervdvn/MapComplete

This commit is contained in:
pietervdvn 2022-03-02 15:10:49 +01:00
commit bd3f4bb474
43 changed files with 1139 additions and 105 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

49
Docs/LanguagePicker.md Normal file
View file

@ -0,0 +1,49 @@
# The language-picker
(Originally published as diary-entry)
In my [little OpenStreetMap-editor](https://mapcomplete.osm.be) translations are provided by contributors on [hosted weblate](https://hosted.weblate.org/projects/mapcomplete/), where thousands of text snippets have been translated already in the past year - which is awesome.
However, the language picker was a bit dry: it used to have codes for every langauge, e.g. `nl`, `en`, `ja`, 'pt_BR', 'zh_Hant'... Quite boring and not really user-friendly - but easy to implement.
Today, I decided to give these an overhaul. I wanted to show proper language names in them. But: in which _language_ should we show the language overview?
Should we show the language option in the language itself? Or should the languages be shown in the _current language_? Showing in the _current language_ also means that the name of every language should be translated too - a huge task... Also, translating every language has the drawback that, if a user accidentally selects a language in a foreign writing system, they'll won't be able to find their language in all the "gibberish".
### Best of both worlds
I decided to offer the best of both worlds: in the menu, first language name is shown as the native speaker speaks it, followed by the language name in the _current language_ (except if both are the same)
This means that, in all circumstances, everyone can find their language.
But, where to fetch every language name in every language?
# Wikidata to the rescue
Of course, the internet must have a list of languages translated in every language. But where to find it or compile it?
I decided to have a look at one of the biggest repositories of knowledge: Wikidata. They do have an entry for every language (e.g. [Dutch](https://www.wikidata.org/wiki/Q7411)). To fetch every [modern language](https://www.wikidata.org/wiki/Q1288568), we turn to the SPARQL-endpoint with the following query:
``` sparql
SELECT ?lang ?label ?code
WHERE
{
?lang wdt:P31 wd:Q1288568.
?lang rdfs:label ?label.
?lang wdt:P424 ?code
}
```
This one fetches all languages and uses the labels in every language as their translation. With a Typescript these can be downloaded and used as translation.
## The messy real world
Of course, real life isn't as easy. There are dialects, differences in notation between Weblate and Wikipedia (e.g. `zh-hant` vs `zh-Hant`). But with a few exceptions, this can be fixed too. Some pragmatism doesn't hurt - even though it is nice that it works for most cases automatically.
[The full script is available here](https://github.com/pietervdvn/MapComplete/blob/develop/scripts/fetchLanguages.ts).
# Results
![](./Language-picker-english.png)
![](./Language-picker-Chinese.png)

View file

@ -209,9 +209,9 @@ export class BBox {
}
private check() {
private check() {
if (isNaN(this.maxLon) || isNaN(this.maxLat) || isNaN(this.minLon) || isNaN(this.minLat)) {
console.log(this);
console.trace("BBox with NaN detected:", this);
throw "BBOX has NAN";
}
}

View file

@ -86,7 +86,7 @@ export default class OsmFeatureSource {
}
private async LoadTile(z, x, y): Promise<void> {
if (z > 20) {
if (z > 25) {
throw "This is an absurd high zoom level"
}

View file

@ -2,7 +2,7 @@ import {Utils} from "../Utils";
export default class Constants {
public static vNumber = "0.16.2";
public static vNumber = "0.16.4";
public static ImgurApiKey = '7070e7167f0a25a'
public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"

View file

@ -23,7 +23,7 @@ export abstract class Conversion<TIn, TOut> {
throw fixed.errors.join("\n\n");
}
fixed.information?.forEach(i => console.log(" ", i))
const yellow = (s) => "\x1b[33m"+s+"\x1b[0m"
const yellow = (s) => "\x1b[33m"+s+"\x1b[0m"
const red = s => '\x1b[31m'+s+'\x1b[0m'
fixed.warnings?.forEach(w => console.warn(red(`<!> `), yellow (w)))

View file

@ -141,24 +141,6 @@ class AddDefaultLayers extends DesugaringStep<LayoutConfigJson> {
json.layers = [...json.layers]
const alreadyLoaded = new Set(json.layers.map(l => l["id"]))
if (json.id === "personal") {
json.layers = []
for (const publicLayer of AllKnownLayouts.AllPublicLayers()) {
const id = publicLayer.id
const config = state.sharedLayers.get(id)
if (Constants.added_by_default.indexOf(id) >= 0) {
continue;
}
if (config === undefined) {
// This is a layer which is coded within a public theme, not as separate .json
continue
}
json.layers.push(config)
}
const publicIds = AllKnownLayouts.AllPublicLayers().map(l => l.id)
publicIds.map(id => state.sharedLayers.get(id))
}
for (const layerName of Constants.added_by_default) {
const v = state.sharedLayers.get(layerName)
if (v === undefined) {
@ -306,7 +288,7 @@ class ApplyOverrideAll extends DesugaringStep<LayoutConfigJson> {
delete json.overrideAll
const newLayers = []
for (let layer of json.layers) {
layer = {...<LayerConfigJson>layer}
layer = Utils.Clone(<LayerConfigJson>layer)
Utils.Merge(overrideAll, layer)
newLayers.push(layer)
}
@ -419,7 +401,6 @@ class PreparePersonalTheme extends DesugaringStep<LayoutConfigJson> {
}
json.layers = Array.from(this._state.sharedLayers.keys()).filter(l => Constants.priviliged_layers.indexOf(l) < 0)
return {result: json};
}

View file

@ -367,7 +367,7 @@ export default class LayerConfig extends WithContextLoader {
extraProps.push(new Combine(["This layer will automatically load ", new Link(dep.neededLayer, "./" + dep.neededLayer + ".md"), " into the layout as it depends on it: ", dep.reason, "(" + dep.context + ")"]))
}
for (const revDep of layerIsNeededBy?.get(this.id) ?? []) {
for (const revDep of Utils.Dedup( layerIsNeededBy?.get(this.id) ?? [])) {
extraProps.push(new Combine(["This layer is needed as dependency for layer", new Link(revDep, "#" + revDep)]))
}

View file

@ -1,6 +1,9 @@
import {DropDown} from "./Input/DropDown";
import Locale from "./i18n/Locale";
import BaseUIElement from "./BaseUIElement";
import * as native from "../assets/language_native.json"
import * as language_translations from "../assets/language_translations.json"
import {Translation} from "./i18n/Translation";
export default class LanguagePicker {
@ -12,12 +15,33 @@ export default class LanguagePicker {
if (languages === undefined || languages.length <= 1) {
return undefined;
}
return new DropDown(label, languages.map(lang => {
return {value: lang, shown: lang}
return {value: lang, shown: LanguagePicker.hybrid(lang) }
}
), Locale.language);
}
private static hybrid(lang: string): Translation {
const nativeText = native[lang] ?? lang
const allTranslations = (language_translations["default"] ?? language_translations)
const translation = {}
const trans = allTranslations[lang]
console.log("Generating a hybrid for "+lang, trans)
if(trans === undefined){
return new Translation({"*": nativeText})
}
for (const key in trans) {
const translationInKey = allTranslations[lang][key]
if(nativeText.toLowerCase() === translationInKey.toLowerCase()){
translation[key] = nativeText
}else{
translation[key] = nativeText + " ("+translationInKey+")"
}
}
return new Translation(translation)
}
}

View file

@ -41,6 +41,7 @@ import {AutoAction} from "./AutoApplyButton";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import {Changes} from "../../Logic/Osm/Changes";
import {ElementStorage} from "../../Logic/ElementStorage";
import Hash from "../../Logic/Web/Hash";
/**
* A helper class for the various import-flows.
@ -268,8 +269,8 @@ ${Utils.special_visualizations_importRequirementDocs}
originalFeatureTags.data["_imported"] = "yes"
originalFeatureTags.ping() // will set isImported as per its definition
state.changes.applyAction(action)
state.selectedElement.setData(state.allElements.ContainingFeatures.get(action.newElementId ?? action.mainObjectId))
const newId = action.newElementId ?? action.mainObjectId
state.selectedElement.setData(state.allElements.ContainingFeatures.get(newId))
}
})
@ -503,14 +504,23 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
mergeConfigs,
"import"
)
} else {
} else if(feature.geometry.type === "Polygon"){
const outer = coors[0]
return new CreateWayWithPointReuseAction(
args.newTags.data,
outer,
state,
mergeConfigs
)
}else if(feature.geometry.type === "LineString"){
return new CreateWayWithPointReuseAction(
args.newTags.data,
coors,
state,
mergeConfigs
)
}else{
throw "Unsupported type"
}
}
}
@ -572,6 +582,8 @@ export class ImportPointButton extends AbstractImportButton {
state.selectedElement.setData(state.allElements.ContainingFeatures.get(
newElementAction.newElementId
))
Hash.hash.setData(newElementAction.newElementId)
if (note_id !== undefined) {
state.osmConnection.closeNote(note_id, "imported")
originalFeatureTags.data["closed_at"] = new Date().toISOString()

View file

@ -778,5 +778,16 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
}
}
public static MapToObj<T>(d : Map<string, T>, onValue: ((t:T, key: string) => any) = undefined): object{
const o = {}
d.forEach((value, key) => {
if(onValue !== undefined){
value = onValue(value, key)
}
o[key] = value;
})
return o
}
}

View file

@ -0,0 +1,22 @@
{
"ca": "català",
"de": "Deutsch",
"eo": "Esperanto",
"fr": "français",
"es": "español",
"gl": "lingua galega",
"fi": "suomi",
"en": "English",
"ru": "русский язык",
"it": "italiano",
"pl": "język polski",
"ja": "日本語",
"sv": "svenska",
"pt": "português",
"nl": "Nederlands",
"id": "Indonesia",
"hu": "magyar",
"nb_NO": "bokmål",
"zh_Hant": "簡體中文",
"pt_BR": "português brasileiro"
}

View file

@ -0,0 +1,453 @@
{
"ca": {
"en": "Catalan",
"de": "Katalanisch",
"nl": "Catalaans",
"ca": "català",
"es": "catalán",
"fr": "catalan",
"eo": "kataluna lingvo",
"fi": "katalaani",
"gl": "lingua catalá",
"hu": "katalán",
"id": "Bahasa Katala",
"it": "catalano",
"ja": "カタルーニャ語",
"nb_NO": "katalansk",
"pl": "język kataloński",
"pt": "língua catalã",
"pt_BR": "língua catalã",
"ru": "каталанский язык",
"sv": "katalanska",
"zh_Hans": "加泰罗尼亚语",
"zh_Hant": "加泰隆尼亞語"
},
"de": {
"ca": "alemany",
"en": "German",
"fr": "allemand",
"hu": "német",
"id": "Jerman",
"it": "tedesco",
"pt_BR": "alemão",
"de": "Deutsch",
"nl": "Duits",
"es": "alemán",
"ja": "ドイツ語",
"eo": "germana lingvo",
"fi": "saksa",
"gl": "lingua alemá",
"nb_NO": "tysk",
"pl": "język niemiecki",
"pt": "alemão",
"ru": "немецкий язык",
"sv": "tyska",
"zh_Hans": "德语",
"zh_Hant": "德語"
},
"eo": {
"en": "Esperanto",
"eo": "Esperanto",
"nl": "Esperanto",
"de": "Esperanto",
"id": "Esperanto",
"zh_Hant": "世界語",
"ja": "エスペラント",
"fr": "espéranto",
"ca": "esperanto",
"es": "esperanto",
"fi": "esperanto",
"gl": "esperanto",
"hu": "eszperantó",
"it": "esperanto",
"nb_NO": "esperanto",
"pl": "esperanto",
"pt": "esperanto",
"pt_BR": "esperanto",
"ru": "эсперанто",
"sv": "esperanto",
"zh_Hans": "世界语"
},
"fr": {
"es": "francés",
"nl": "Frans",
"en": "French",
"fr": "français",
"it": "francese",
"pt": "francês",
"hu": "francia",
"ca": "francès",
"zh_Hant": "法語",
"de": "Französisch",
"id": "Prancis",
"eo": "franca lingvo",
"fi": "ranska",
"gl": "lingua francesa",
"ja": "フランス語",
"zh_Hans": "法语",
"nb_NO": "fransk",
"pl": "język francuski",
"pt_BR": "francês",
"ru": "французский язык",
"sv": "franska"
},
"es": {
"en": "Spanish",
"es": "español",
"ca": "castellà",
"fr": "espagnol",
"de": "Spanisch",
"eo": "hispana lingvo",
"fi": "espanja",
"gl": "lingua castelá",
"hu": "spanyol",
"id": "Spanyol",
"it": "spagnolo",
"ja": "スペイン語",
"nb_NO": "spansk",
"nl": "Spaans",
"pl": "język hiszpański",
"pt": "espanhol",
"pt_BR": "espanhol",
"ru": "испанский язык",
"sv": "spanska",
"zh_Hans": "西班牙语",
"zh_Hant": "西班牙語"
},
"gl": {
"en": "Galician",
"es": "gallego",
"ca": "gallec",
"de": "Galicisch",
"eo": "galega lingvo",
"fi": "galicia",
"fr": "galicien",
"gl": "lingua galega",
"hu": "galiciai",
"id": "Bahasa Galisia",
"it": "gallego",
"ja": "ガリシア語",
"nb_NO": "galisisk",
"nl": "Galicisch",
"pl": "język galicyjski",
"pt": "galego",
"pt_BR": "língua galega",
"ru": "галисийский язык",
"sv": "galiciska",
"zh_Hant": "加利西亞語"
},
"fi": {
"nb_NO": "finsk",
"pl": "język fiński",
"pt": "finlandês",
"pt_BR": "língua finlandesa",
"sv": "finska",
"zh_Hans": "芬兰语",
"zh_Hant": "芬蘭語",
"nl": "Fins",
"de": "Finnisch",
"en": "Finnish",
"ja": "フィンランド語",
"fi": "suomi",
"es": "finés",
"ru": "финский язык",
"hu": "finn",
"id": "Finlandia",
"it": "finlandese",
"ca": "finès",
"eo": "finna lingvo",
"fr": "finnois",
"gl": "finés"
},
"en": {
"pl": "język angielski",
"pt": "inglês",
"pt_BR": "inglês",
"ru": "английский язык",
"sv": "engelska",
"zh_Hans": "英语",
"zh_Hant": "英語",
"id": "Inggris",
"it": "inglese",
"ja": "英語",
"nb_NO": "engelsk",
"nl": "Engels",
"ca": "anglès",
"de": "Englisch",
"en": "English",
"eo": "angla lingvo",
"es": "inglés",
"fi": "englanti",
"fr": "anglais",
"gl": "lingua inglesa",
"hu": "angol"
},
"ru": {
"ca": "rus",
"de": "Russisch",
"eo": "rusa lingvo",
"fi": "venäjä",
"gl": "lingua rusa",
"id": "Rusia",
"it": "russo",
"ja": "ロシア語",
"hu": "orosz",
"en": "Russian",
"ru": "русский язык",
"es": "ruso",
"fr": "russe",
"nl": "Russisch",
"sv": "ryska",
"zh_Hans": "俄语",
"zh_Hant": "俄語",
"nb_NO": "russisk",
"pl": "język rosyjski",
"pt": "russo",
"pt_BR": "russo"
},
"it": {
"zh_Hans": "意大利语",
"zh_Hant": "義大利語",
"nb_NO": "italiensk",
"pl": "język włoski",
"pt_BR": "língua italiana",
"ru": "итальянский язык",
"sv": "italienska",
"ca": "italià",
"eo": "itala lingvo",
"fi": "italia",
"gl": "lingua italiana",
"en": "Italian",
"ja": "イタリア語",
"es": "italiano",
"hu": "olasz",
"id": "Italia",
"it": "italiano",
"fr": "italien",
"de": "Italienisch",
"nl": "Italiaans",
"pt": "italiano"
},
"pl": {
"de": "Polnisch",
"en": "Polish",
"pl": "język polski",
"es": "polaco",
"fr": "polonais",
"ca": "polonès",
"eo": "pola lingvo",
"fi": "puola",
"gl": "lingua polaca",
"hu": "lengyel",
"id": "Polandia",
"zh_Hans": "波兰语",
"zh_Hant": "波蘭語",
"it": "polacco",
"ja": "ポーランド語",
"nb_NO": "polsk",
"nl": "Pools",
"pt": "polaco",
"pt_BR": "língua polonesa",
"ru": "польский язык",
"sv": "polska"
},
"ja": {
"nb_NO": "japansk",
"nl": "Japans",
"pl": "język japoński",
"pt": "japonês",
"pt_BR": "língua japonesa",
"ru": "японский язык",
"sv": "japanska",
"zh_Hans": "日语",
"zh_Hant": "日語",
"en": "Japanese",
"ca": "japonès",
"de": "Japanisch",
"eo": "japana lingvo",
"es": "japonés",
"fi": "japani",
"fr": "japonais",
"gl": "lingua xaponesa",
"hu": "japán",
"id": "Bahasa Jepang",
"it": "giapponese",
"ja": "日本語"
},
"sv": {
"en": "Swedish",
"ca": "suec",
"es": "sueco",
"fr": "suédois",
"ja": "スウェーデン語",
"sv": "svenska",
"hu": "svéd",
"id": "Swedia",
"it": "svedese",
"de": "Schwedisch",
"eo": "sveda lingvo",
"fi": "ruotsi",
"gl": "lingua sueca",
"nb_NO": "svensk",
"nl": "Zweeds",
"pl": "język szwedzki",
"pt": "língua sueca",
"pt_BR": "língua sueca",
"ru": "шведский язык",
"zh_Hant": "瑞典語"
},
"pt": {
"en": "Portuguese",
"hu": "portugál",
"id": "Portugis",
"it": "portoghese",
"nl": "Portugees",
"pt": "português",
"ca": "portuguès",
"de": "Portugiesisch",
"eo": "portugala lingvo",
"es": "portugués",
"fi": "portugali",
"fr": "portugais",
"gl": "lingua portuguesa",
"ja": "ポルトガル語",
"nb_NO": "portugisisk",
"pl": "język portugalski",
"pt_BR": "português",
"ru": "португальский язык",
"sv": "portugisiska",
"zh_Hans": "葡萄牙语",
"zh_Hant": "葡萄牙語"
},
"nl": {
"en": "Dutch",
"de": "Niederländisch",
"nl": "Nederlands",
"ca": "neerlandès",
"es": "neerlandés",
"fr": "néerlandais",
"hu": "holland",
"id": "Belanda",
"it": "olandese",
"eo": "nederlanda lingvo",
"fi": "hollanti",
"gl": "lingua neerlandesa",
"zh_Hans": "荷兰语",
"zh_Hant": "荷蘭語",
"ja": "オランダ語",
"nb_NO": "nederlandsk",
"pl": "język niderlandzki",
"pt": "neerlandês",
"pt_BR": "neerlandês",
"ru": "нидерландский язык",
"sv": "nederländska"
},
"id": {
"en": "Indonesian",
"es": "indonesio",
"fr": "indonésien",
"hu": "indonéz",
"id": "Indonesia",
"it": "indonesiano",
"ca": "indonesi",
"de": "Indonesisch",
"eo": "indonezia lingvo",
"fi": "indonesia",
"gl": "lingua indonesia",
"ja": "インドネシア語",
"nb_NO": "indonesisk",
"nl": "Indonesisch",
"pl": "język indonezyjski",
"pt": "língua indonésia",
"pt_BR": "língua indonésia",
"ru": "индонезийский язык",
"sv": "indonesiska",
"zh_Hans": "印度尼西亚语",
"zh_Hant": "印尼語"
},
"hu": {
"nb_NO": "ungarsk",
"nl": "Hongaars",
"pl": "język węgierski",
"pt": "húngaro",
"pt_BR": "língua húngara",
"ru": "венгерский язык",
"sv": "ungerska",
"zh_Hant": "匈牙利語",
"ca": "hongarès",
"de": "Ungarisch",
"eo": "hungara lingvo",
"es": "húngaro",
"fi": "unkari",
"gl": "lingua húngara",
"hu": "magyar",
"id": "Hongaria",
"it": "ungherese",
"ja": "ハンガリー語",
"en": "Hungarian",
"fr": "hongrois"
},
"nb_NO": {
"es": "bokmål",
"fi": "kirjanorja",
"fr": "bokmål",
"gl": "bokmål",
"hu": "norvég (bokmål)",
"id": "Bokmål",
"it": "bokmål",
"ja": "ブークモール",
"nb_NO": "bokmål",
"nl": "Bokmål",
"pl": "norweski (bokmål)",
"pt": "bokmål",
"pt_BR": "Bokmål",
"ru": "букмол",
"sv": "bokmål",
"ca": "bokmål",
"de": "Bokmål",
"en": "Bokmål",
"eo": "Bokmål"
},
"zh_Hant": {
"ca": "xinès simplificat",
"en": "Simplified Chinese",
"fr": "chinois simplifié",
"ru": "упрощённый китайский",
"sv": "förenklad kinesiska",
"de": "vereinfachtes Chinesisch",
"eo": "simpligita ĉina skribsistemo",
"es": "chino simplificado",
"it": "cinese semplificato",
"ja": "簡体字中国語",
"nb_NO": "tradisjonell kinesisk",
"pl": "Chiński uproszczony",
"pt": "chinês simplificado",
"zh_Hans": "简体中文",
"zh_Hant": "簡體中文",
"hu": "egyszerűsített kínai",
"id": "aksara Han sederhana"
},
"pt_BR": {
"ca": "portuguès brasiler",
"de": "brasilianisches Portugiesisch",
"en": "Brazilian Portuguese",
"eo": "brazilportugala lingvo",
"es": "portugués brasileño",
"fi": "brasilianportugali",
"fr": "portugais brésilien",
"gl": "portugués do Brasil",
"hu": "brazíliai portugál",
"id": "Portugis Brasil",
"it": "portoghese brasiliano",
"ja": "ブラジルポルトガル語",
"nb_NO": "brasiliansk portugisisk",
"nl": "Braziliaans-Portugees",
"pl": "brazylijska odmiana języka portugalskiego",
"pt": "português brasileiro",
"pt_BR": "português brasileiro",
"ru": "бразильский вариант португальского языка",
"sv": "brasiliansk portugisiska",
"zh_Hans": "巴西葡萄牙语",
"zh_Hant": "巴西葡萄牙語"
}
}

View file

@ -6,11 +6,15 @@
},
"source": {
"osmTags": {
"or": [
"amenity=bicycle_rental",
"bicycle_rental~*",
"service:bicycle:rental=yes",
"rental~.*bicycle.*"
"and": [
{
"or": [
"amenity=bicycle_rental",
"bicycle_rental~*",
"service:bicycle:rental=yes",
"rental~.*bicycle.*"
]
}
]
}
},

View file

@ -2,7 +2,7 @@
"id": "bike_repair_station",
"name": {
"en": "Bicycle pump and repair",
"nl": "Fietspomp and fietsherstel",
"nl": "Fietspomp en fietsherstel",
"fr": "Station velo (réparation, pompe à vélo)",
"gl": "Estación de bicicletas (arranxo, bomba de ar ou ambos)",
"de": "Fahrradstationen (Reparatur, Pumpe oder beides)",

View file

@ -353,7 +353,7 @@
{
"if": "diet:vegetarian=yes",
"then": {
"en": "No vegetarian options are available",
"en": "Vegetarian options are available",
"nl": "Vegetarische opties zijn beschikbaar"
}
},

View file

@ -669,7 +669,8 @@
"en": "Payment is done using a dedicated app",
"nl": "Betalen via een app van het netwerk",
"hu": "Fizetés erre a célra szolgáló alkalmazással",
"zh_Hant": "使用專用應用程式付款"
"zh_Hant": "使用專用應用程式付款",
"de": "Die Bezahlung erfolgt über eine spezielle App"
}
},
{
@ -680,7 +681,8 @@
"en": "Payment is done using a membership card",
"nl": "Betalen via een lidkaart van het netwerk",
"hu": "Fizetési tagsági kártyával",
"zh_Hant": "使用會員卡付款"
"zh_Hant": "使用會員卡付款",
"de": "Die Bezahlung erfolgt mit einer Mitgliedskarte"
}
}
]
@ -826,7 +828,9 @@
"then": {
"en": "Located on the first basement level",
"nl": "Bevindt zich in de eerste kelderverdieping",
"zh_Hant": "位於地下一樓"
"zh_Hant": "位於地下一樓",
"de": "Ist im 1. Untergeschoss",
"hu": "Az első alagsori szinten"
}
}
]

View file

@ -2,15 +2,18 @@
"id": "bicycle_rental",
"title": {
"en": "Bicycle rental",
"nl": "Fietsverhuur"
"nl": "Fietsverhuur",
"de": "Fahrradverleih"
},
"shortDescription": {
"en": "A map with bicycle rental stations and bicycle rental shops",
"nl": "Een kaart met fietsverhuurpunten en fietsverhuurzaken"
"nl": "Een kaart met fietsverhuurpunten en fietsverhuurzaken",
"de": "Eine Karte mit Fahrradverleihstationen und Fahrradverleihern"
},
"description": {
"en": "On this map, you'll find the many bicycle rental stations as they are known by OpenStreetMap",
"nl": "Op deze kaart vind je verschillende fietsverhuurpunten en fietsverhuurzaken"
"nl": "Op deze kaart vind je verschillende fietsverhuurpunten en fietsverhuurzaken",
"de": "Auf dieser Karte finden Sie die vielen Fahrradverleihstationen, wie sie auf OpenStreetMap eingetragen wurden"
},
"maintainer": "",
"icon": "./assets/themes/bicycle_rental/logo.svg",

View file

@ -18,7 +18,7 @@
"description": {
"en": "A public bookcase is a small streetside cabinet, box, old phone booth or some other objects where books are stored. Everyone can place or take a book. This map aims to collect all these bookcases. You can discover new bookcases nearby and, with a free OpenStreetMap account, quickly add your favourite bookcases.",
"nl": "Een boekenruilkast is een kastje waar iedereen een boek kan nemen of achterlaten. Op deze kaart kan je deze boekenruilkasten terugvinden en met een gratis OpenStreetMap-account, ook boekenruilkasten toevoegen of informatie verbeteren",
"de": "Bücherschränke sind alte Schaltschränke, Telefonzellen oder andere Einrichtungen, zur Aufbewahrung von Büchern. Jeder kann Bücher abstellen oder mitnehmen. Die Karte zielt darauf ab, alle Orte mit Bücherschränken zu sammeln. Sie können neue Bücherschränke in der Nähe entdecken und mit einem kostenlosen OpenStreetMap-Konto schnell Ihre Lieblingsbücherschränke hinzufügen.",
"de": "Bücherschränke sind alte Schaltschränke, Telefonzellen oder andere Einrichtungen zur Aufbewahrung von Büchern. Jeder kann Bücher abgeben oder mitnehmen. Die Karte soll helfen, alle Orte mit Bücherschränken zu sammeln. Sie können neue Bücherschränke in der Nähe entdecken und mit einem kostenlosen OpenStreetMap-Konto schnell Ihre Lieblingsbücherschränke hinzufügen.",
"fr": "Une microbibliothèques, également appelée boite à livre, est un élément de mobilier urbain (étagère, armoire, etc) dans lequel sont stockés des livres et autres objets en accès libre. Découvrez les boites à livres prêt de chez vous, ou ajouter en une nouvelle à l'aide de votre compte OpenStreetMap.",
"ru": "Общественный книжный шкаф - это небольшой уличный шкаф, коробка, старый телефонный аппарат или другие предметы, где хранятся книги. Каждый может положить или взять книгу. Цель этой карты - собрать все эти книжные шкафы. Вы можете обнаружить новые книжные шкафы поблизости и, имея бесплатный аккаунт OpenStreetMap, быстро добавить свои любимые книжные шкафы.",
"ja": "公共の本棚とは、本が保管されている小さな街角のキャビネット、箱、古い電話のトランク、その他の物のことです。誰でも本を置いたり持ったりすることができます。このマップは、すべての公共の本棚を収集することを目的としています。近くで新しい本棚を見つけることができ、無料のOpenStreetMapアカウントを使えば、お気に入りの本棚を簡単に追加できます。",

View file

@ -13,7 +13,8 @@
},
"description": {
"en": "Pubs and bars",
"nl": "Cafés, kroegen en drinkgelegenheden"
"nl": "Cafés, kroegen en drinkgelegenheden",
"de": "Kneipen und Bars"
},
"maintainer": "",
"icon": "./assets/layers/cafe_pub/pub.svg",

View file

@ -104,7 +104,7 @@
]
},
"description": {
"de": "Ein Kletterverein oder eine Organisation",
"de": "Ein Kletterverein oder -organisation",
"nl": "Een klimclub of organisatie",
"en": "A climbing club or organisation",
"ja": "クライミングクラブや団体",
@ -196,7 +196,7 @@
"hu": "Mászószervezet"
},
"description": {
"de": "Eine Organisation, welche sich mit dem Klettern beschäftigt",
"de": "Eine Organisation, die sich mit dem Klettern beschäftigt",
"nl": "Een VZW die werkt rond klimmen",
"en": "An NGO working around climbing",
"ja": "登山に関わるNGO",
@ -1341,7 +1341,7 @@
"it": "Qual è il livello della via più difficile qua, secondo il sistema di classificazione francese?"
},
"render": {
"de": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:max} (französisch/belgisches System)",
"de": "Die schwierigste Route hat hier die Schwierigkeitsstufe {climbing:grade:french:max} (französisch/belgisches System)",
"en": "The highest grade is {climbing:grade:french:max} according to the french/belgian system",
"nl": "De maximale klimmoeilijkheid is {climbing:grade:french:max} volgens het Franse/Belgische systeem",
"ja": "フランス/ベルギーのランク評価システムでは、最大の難易度は{climbing:grade:french:max}です",

View file

@ -3,18 +3,21 @@
"title": {
"en": "Entrances",
"zh_Hant": "出入口",
"hu": "Épületek bejáratai"
"hu": "Épületek bejáratai",
"de": "Eingänge"
},
"icon": "./assets/layers/entrance/door.svg",
"description": {
"en": "A map showing all entrances, which surveys for important aspects for wheelchair users",
"zh_Hant": "顯示所有出入口的地圖,勘查對輪椅使用者重要的資訊",
"hu": "Épületek bejáratai mutató térkép, amely a kerekesszékkel közlekedőknek fontos szempontokat jeleníti meg"
"hu": "Épületek bejáratai mutató térkép, amely a kerekesszékkel közlekedőknek fontos szempontokat jeleníti meg",
"de": "Eine Karte mit allen Eingängen, die wichtige Aspekte für Rollstuhlfahrer erfasst"
},
"shortDescription": {
"en": "Survey entrances to help wheelchair routing",
"zh_Hant": "幫助輪椅導航來勘查出入口",
"hu": "Akadálymentes útvonaltervezést segítő bejáratok feltérképezése"
"hu": "Akadálymentes útvonaltervezést segítő bejáratok feltérképezése",
"de": "Eingänge prüfen, um die Rollstuhlnavigation zu verbessern"
},
"version": "2021-12-04",
"maintainer": "MapComplete",

View file

@ -7,7 +7,8 @@
"it": "Apri Carta Etimologica",
"ru": "Открытая этимологическая карта",
"zh_Hant": "開放詞源地圖",
"hu": "Etimológiai térkép"
"hu": "Etimológiai térkép",
"fr": "Open Etymology Map"
},
"shortDescription": {
"en": "What is the origin of a toponym?",
@ -15,7 +16,8 @@
"de": "Was ist der Ursprung eines Ortsnamens?",
"it": "Qual è lorigine di un toponimo?",
"zh_Hant": "地名的由來是?",
"hu": "Mi az eredete egy helynévnek?"
"hu": "Mi az eredete egy helynévnek?",
"fr": "Quelle est l'origine de ce toponyme ?"
},
"description": {
"en": "On this map, you can see what an object is named after. The streets, buildings, ... come from OpenStreetMap which got linked with Wikidata. In the popup, you'll see the Wikipedia article (if it exists) or a wikidata box of what the object is named after. If the object itself has a wikipedia page, that'll be shown too.<br/><br/><b>You can help contribute too!</b>Zoom in enough and <i>all</i> streets will show up. You can click one and a Wikidata-search box will popup. With a few clicks, you can add an etymology link. Note that you need a free OpenStreetMap account to do this.",
@ -48,7 +50,8 @@
"de": "Straßen ohne Informationen zur Namensherkunft",
"it": "Strade senza informazioni etimologiche",
"zh_Hant": "道路沒有詞源資訊",
"hu": "Etimológiai adat nélküli utcák"
"hu": "Etimológiai adat nélküli utcák",
"fr": "Route sans origine étymologique"
},
"minzoom": 18,
"source": {
@ -72,7 +75,8 @@
"de": "Parks und Waldflächen ohne Informationen zur Namensherkunft",
"it": "Parchi e foreste senza informazioni etimologiche",
"zh_Hant": "公園與森哥沒有詞源資訊",
"hu": "Etimológiai adat nélküli parkok és erdők"
"hu": "Etimológiai adat nélküli parkok és erdők",
"fr": "Parcs et forêts sans origine étymologique"
},
"minzoom": 18,
"source": {
@ -95,7 +99,9 @@
"override": {
"id": "education_institutions_without_etymology",
"=name": {
"en": "Education institutions without etymology information"
"en": "Education institutions without etymology information",
"de": "Bildungseinrichtungen ohne Informationen zur Etymologie",
"fr": "Institutions d'éducation sans origine étymologique"
},
"minzoom": 18,
"source": {
@ -114,6 +120,109 @@
}
}
}
},
{
"builtin": "etymology",
"override": {
"id": "cultural_places_without_etymology",
"=name": {
"en": "Cultural places without etymology information",
"de": "Kulturelle Orte ohne etymologische Informationen"
},
"minzoom": 18,
"source": {
"osmTags": {
"and": [
"name~*",
{
"or": [
"amenity=arts_centre",
"amenity=cinema",
"amenity=community_centre",
"amenity=library",
"amenity=theatre"
]
}
]
}
}
}
},
{
"builtin": "etymology",
"override": {
"id": "toursistic_places_without_etymology",
"=name": {
"en": "Toursistic places without etymology information",
"de": "Touristische Orte ohne Angaben zur Etymologie"
},
"minzoom": 18,
"source": {
"osmTags": {
"and": [
"name~*",
{
"or": [
"tourism=aquarium",
"tourism=museum",
"tourism=theme_park",
"tourism=zoo"
]
}
]
}
}
}
},
{
"builtin": "etymology",
"override": {
"id": "health_and_social_places_without_etymology",
"=name": {
"en": "Health and social places without etymology information",
"de": "Gesundheits- und Sozialeinrichtungen ohne etymologische Informationen"
},
"minzoom": 18,
"source": {
"osmTags": {
"and": [
"name~*",
{
"or": [
"amenity=clinic",
"amenity=hospital",
"amenity=social_facility"
]
}
]
}
}
}
},
{
"builtin": "etymology",
"override": {
"id": "sport_places_without_etymology",
"=name": {
"en": "Sport places without etymology information",
"de": "Sportstätten ohne etymologische Informationen"
},
"minzoom": 18,
"source": {
"osmTags": {
"and": [
"name~*",
{
"or": [
"leisure=sports_centre",
"leisure=stadium",
"leisure=swimming_pool"
]
}
]
}
}
}
}
],
"hideFromOverview": false

View file

@ -11,7 +11,8 @@
},
"description": {
"nl": "Restaurants en fast food",
"en": "Restaurants and fast food"
"en": "Restaurants and fast food",
"de": "Restaurants und Fast Food"
},
"maintainer": "",
"icon": "./assets/layers/food/restaurant.svg",

View file

@ -3,11 +3,13 @@
"title": {
"nl": "Friturenkaart",
"en": "Fries shops",
"fr": "Carte des friteries"
"fr": "Carte des friteries",
"de": "Pommes-frites-Läden"
},
"description": {
"en": "On this map, you'll find your favourite fries shop!",
"nl": "Op deze kaart vind je je favoriete frituur!"
"nl": "Op deze kaart vind je je favoriete frituur!",
"de": "Auf dieser Karte findest du deine Lieblings-Pommesbude!"
},
"maintainer": "",
"icon": "./assets/themes/fritures/logo.svg",

View file

@ -9,7 +9,8 @@
"description": {
"nl": "Dit thema helpt het GRB importeren.",
"en": "This theme is an attempt to help automating the GRB import.",
"hu": "Ez a sablon a flandriai GRB épületimportálás automatizlását kívánja megkönnyíteni."
"hu": "Ez a sablon a flandriai GRB épületimportálás automatizlását kívánja megkönnyíteni.",
"de": "Dieses Thema ist ein Versuch, die Automatisierung des GRB-Imports zu unterstützen."
},
"maintainer": "Pieter Vander Vennet",
"icon": "./assets/themes/grb_import/logo.svg",
@ -472,6 +473,13 @@
"id": "Import-button",
"render": "{import_way_button(osm-buildings,building=$building;man_made=$man_made; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref; addr:street=$addr:street; addr:housenumber=$addr:housenumber; building:min_level=$_building:min_level, Upload this building to OpenStreetMap,,_is_part_of_building=true,1,_moveable=true)}",
"mappings": [
{
"#": "Failsafe",
"if": "_grb_ref=",
"then": {
"en": "Did not yet calculate the metatags... Reopen this popup"
}
},
{
"#": "Actually the same as below, except that the text shows 'add the address' too",
"if": {

View file

@ -1,13 +1,16 @@
{
"id": "mapcomplete-changes",
"title": {
"en": "Changes made with MapComplete"
"en": "Changes made with MapComplete",
"de": "Änderungen mit MapComplete"
},
"shortDescription": {
"en": "Shows changes made by MapComplete"
"en": "Shows changes made by MapComplete",
"de": "Zeigt Änderungen, die von MapComplete vorgenommen wurden"
},
"description": {
"en": "This maps shows all the changes made with MapComplete"
"en": "This maps shows all the changes made with MapComplete",
"de": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen"
},
"maintainer": "",
"icon": "./assets/svg/logo.svg",
@ -22,7 +25,8 @@
{
"id": "mapcomplete-changes",
"name": {
"en": "Changeset centers"
"en": "Changeset centers",
"de": "Schwerpunkte von Änderungssätzen"
},
"minzoom": 0,
"source": {
@ -36,35 +40,41 @@
],
"title": {
"render": {
"en": "Changeset for {theme}"
"en": "Changeset for {theme}",
"de": "Änderungssatz für {theme}"
}
},
"description": {
"en": "Shows all MapComplete changes"
"en": "Shows all MapComplete changes",
"de": "Zeigt alle MapComplete-Änderungen"
},
"tagRenderings": [
{
"id": "render_id",
"render": {
"en": "Changeset <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
"en": "Changeset <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>",
"de": "Änderungssatz <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
}
},
{
"id": "contributor",
"render": {
"en": "Change made by <a href='https://openstreetmap.org/user/{_last_edit:contributor}' target='_blank'>{_last_edit:contributor}</a>"
"en": "Change made by <a href='https://openstreetmap.org/user/{_last_edit:contributor}' target='_blank'>{_last_edit:contributor}</a>",
"de": "Geändert von <a href='https://openstreetmap.org/user/{_last_edit:contributor}' target='_blank'>{_last_edit:contributor}</a>"
}
},
{
"id": "theme",
"render": {
"en": "Change with theme <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>"
"en": "Change with theme <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>",
"de": "Änderung mit Thema <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>"
},
"mappings": [
{
"if": "theme~http.*",
"then": {
"en": "Change with <b>unofficial</b> theme <a href='https://mapcomplete.osm.be/theme.html?userlayout={theme}'>{theme}</a>"
"en": "Change with <b>unofficial</b> theme <a href='https://mapcomplete.osm.be/theme.html?userlayout={theme}'>{theme}</a>",
"de": "Änderung mit <b>inoffiziellem</b> Thema <a href='https://mapcomplete.osm.be/theme.html?userlayout={theme}'>{theme}</a>"
}
}
]
@ -328,7 +338,8 @@
}
],
"question": {
"en": "Themename contains {search}"
"en": "Themename contains {search}",
"de": "Themenname enthält {search}"
}
}
]
@ -344,7 +355,8 @@
}
],
"question": {
"en": "Made by contributor {search}"
"en": "Made by contributor {search}",
"de": "Erstellt von Mitwirkendem {search}"
}
}
]
@ -360,7 +372,8 @@
}
],
"question": {
"en": "<b>Not</b> made by contributor {search}"
"en": "<b>Not</b> made by contributor {search}",
"de": "<b> Nicht</b> erstellt von Mitwirkendem {search}"
}
}
]
@ -375,7 +388,8 @@
{
"id": "link_to_more",
"render": {
"en": "More statistics can be found <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>here</a>"
"en": "More statistics can be found <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>here</a>",
"de": "Weitere Statistiken finden Sie <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>hier</a>"
}
},
{

View file

@ -2,15 +2,18 @@
"id": "nature",
"title": {
"en": "Into nature",
"nl": "De Natuur in"
"nl": "De Natuur in",
"de": "In die Natur"
},
"shortDescription": {
"en": "A map for nature lovers, with interesting POI's",
"nl": "Deze kaart bevat informatie voor natuurliefhebbers"
"nl": "Deze kaart bevat informatie voor natuurliefhebbers",
"de": "Eine Karte für Naturliebhaber, mit interessanten Orten"
},
"description": {
"en": "On this map, one can find interesting infromation for tourists and nature lovers, such as ",
"nl": "Op deze kaart vind je informatie voor natuurliefhebbers, zoals info over het natuurgebied waar je inzit, vogelkijkhutten, informatieborden, ..."
"nl": "Op deze kaart vind je informatie voor natuurliefhebbers, zoals info over het natuurgebied waar je inzit, vogelkijkhutten, informatieborden, ...",
"de": "Auf dieser Karte findet man interessante Informationen für Touristen und Naturliebhaber, wie zum Beispiel "
},
"maintainer": "",
"icon": "./assets/themes/nature/logo.svg",

View file

@ -37,10 +37,10 @@
"startLon": 0,
"startZoom": 0,
"widenFactor": 1.2,
"#note": "The 'overpassMaxZoom' should be exactly the same as or less then the overrideAll",
"#note": "The 'overpassMaxZoom' should be exactly the same as or less then the minzzom in overrideAll",
"overpassMaxZoom": 15,
"overrideAll": {
"minZoom": 16,
"minzoom": 17,
"syncSelection": "theme",
"shownByDefault": false
},

View file

@ -203,7 +203,33 @@
"bike_repair_station-valves"
]
},
"bicycle_rental",
{
"builtin": [
"bicycle_rental"
],
"override": {
"id": "charging_station_non_docking",
"minzoom": 14,
"source": {
"osmTags": {
"and+": [
"bicycle_rental!=docking_station"
]
}
}
}
},
{
"#": "All bicycle rental at a high zoom level, to avoid duplicates",
"builtin": "bicycle_rental",
"override": {
"name": null,
"filter": {
"sameAs": "charging_station_non_docking"
},
"minzoom": 18
}
},
{
"builtin": "playground",
"override": {

View file

@ -41,10 +41,10 @@
"about": "Egy adott téma esetében az OpenStreetMap egyszerű szerkesztése és hozzáadása",
"aboutMapcomplete": "<h3>A MapComplete-ről</h3><p>Arra használhatod, hogy egy <b>egy adott téma szerint</b> OpenStreetMap-adatokat adj hozzá az adatbázishoz. Válaszolj a kérdésekre, és a szerkesztéseid perceken belül mindenhol elérhetővé válnak. A témához tartozó elemeket, kérdéseket és nyelveket a <b>téma karbantartója</b> határozza meg .</p><h3>További információk</h3><p>A MapComplete mindig <b>felkínálja a következő lépést</b> ahhoz, hogy tanulhass az OpenStreetMapről.</p><ul><li>Weboldalba ágyazva az iframe egy teljes képernyős MapComplete-hez vezet</li><li>A teljes képernyős változat az OpenStreetMapről mutat adatokat</li><li>A megtekintés bejelentkezés nélkül is működik, de a szerkesztéshez OSM-fiók szükséges</li><li>Ha nem vagy bejelentkezve, kérjük, tedd meg</li><li>Miután válaszoltál egy kérdésre, új pontokat helyezhetsz a térképre</li><li>Egy idő után megjelennek a tényleges OSM-címkék, amelyek később a wikire hivatkoznak</li></ul><p></p><br><p>Észrevettél <b>egy problémát</b>? Új <b>funkciót szeretnél kérni</b>? Szeretnél <b>segíteni a fordításban</b>? Látogass el a <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">forráskódhoz</a> vagy a <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">problémakövetőhöz (issue tracker)</a>. </p><p> Szeretnéd látni <b>a fejlődést</b>? Kövesd a szerkesztések számát az <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a> módosításkészlet-elemzőn.</p>",
"add": {
"addNew": "Új {category} hozzáadása itt",
"addNew": "Új {category} hozzáadása",
"addNewMapLabel": "Új elem hozzáadásához kattints ide",
"confirmButton": "{category} hozzáadása itt.<br><div class=\"alert\">A hozzáadott objektum mindenki számára látható lesz</div>",
"confirmIntro": "<h3>Felrajzolsz ide egy {title} objektumot?</h3>Az itt létrehozandó pontot <b>mindenki láthatja majd</b>. Kérjük, csak valóban létező dolgokat rajzolj fel a térképre. Ezeket az adatokat sok alkalmazás használja.",
"confirmButton": "{category} hozzáadása.<br><div class=\"alert\">A hozzáadott objektum mindenki számára látható lesz</div>",
"confirmIntro": "<h3>Felrajzolsz egy {title} objektumot?</h3>Az itt létrehozandó pontot <b>mindenki láthatja majd</b>. Kérjük, csak valóban létező dolgokat rajzolj fel a térképre. Ezeket az adatokat sok alkalmazás használja.",
"disableFilters": "Minden szűrő kikapcsolása",
"disableFiltersExplanation": "Lehet, hogy a szűrő miatt egyes objektumok nem látszanak",
"hasBeenImported": "Ezt a pontot már importálták",
@ -60,7 +60,7 @@
"intro": "Olyan helyre kattintottál, ahol még nincs ismert adat.<br>",
"layerNotEnabled": "A {layer} réteg nincs engedélyezve. Pont hozzáadásához engedélyezd ezt a réteget",
"openLayerControl": "Rétegvezérlő-doboz megnyitása",
"pleaseLogin": "<a class=\"activate-osm-authentication\">Új pont hozzáadásához be kell jelentkezned</a>",
"pleaseLogin": "Új pont hozzáadásához be kell jelentkezned",
"presetInfo": "Az új érdekes pont (POI) címkéi: {tags}",
"stillLoading": "Az adatok betöltése folyamatban van. Kérjük, várj egy kicsit mielőtt új pontot adsz hozzá.",
"title": "Hozzáadsz egy új pontot?",
@ -92,8 +92,10 @@
"openOsmcha": "A téma {theme} legutóbbi szerkesztéseinek megtekintése",
"themeBy": "A téma karbantartója: {author}"
},
"back": "Vissza",
"backgroundMap": "Háttértérkép",
"cancel": "Mégse",
"confirm": "Megerősítés",
"customThemeIntro": "<h3>Egyéni témák</h3> Ezek korábban megnézett, felhasználó által létrehozott témák.",
"download": {
"downloadAsPdf": "A jelenlegi térkép letöltése PDF-ként",
@ -113,6 +115,8 @@
"title": "A látható adatok letöltése",
"uploadGpx": "Töltsd fel a nyomvonalaidat az OpenStreetMapre"
},
"example": "Példa",
"examples": "Példák",
"fewChangesBefore": "Kérjük, válaszolj néhány meglévő pontokra vonatkozó kérdésre, mielőtt új pontot adnál hozzá.",
"getStartedLogin": "A kezdéshez jelentkezz be az OpenStreetMap-fiókoddal,",
"getStartedNewAccount": " vagy <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">hozz létre új fiókot</a>",
@ -125,9 +129,11 @@
"zoomInToSeeThisLayer": "Nagyíts a réteg megtekintéséhez"
},
"loading": "Betöltés…",
"loadingTheme": "{theme} betöltése…",
"loginOnlyNeededToEdit": "ha szerkeszteni szeretnéd a térképet",
"loginToStart": "A kérdés megválaszolásához be kell jelentkezni",
"loginWithOpenStreetMap": "Bejelentkezés OpenStreetMap-fiókkal",
"logout": "Kijelentkezés",
"morescreen": {
"createYourOwnTheme": "Készítsd el saját MapComplete témád a semmiből",
"hiddenExplanation": "Ezeket a témákat csak az érheti el, akik ismeri a linket. {total_hidden} rejtett téma közül {hidden_discovered} témát ismersz.",
@ -137,6 +143,7 @@
"streetcomplete": "Egy másik, hasonló alkalmazás a <a class=\"underline hover:text-blue-800\" href=\"https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete\" target=\"_blank\">StreetComplete</a>."
},
"nameInlineQuestion": "Ezen {category} neve: $$$",
"next": "Következő",
"noNameCategory": "Név nélküli {category}",
"noTagsSelected": "Nincs kijelölt címke",
"number": "szám",
@ -166,6 +173,7 @@
"versionInfo": "{version} verzió létrehozva: {date}"
},
"pickLanguage": "Nyelv kiválasztása: ",
"poweredByOsm": "Motor: OpenStreetMap",
"questions": {
"emailIs": "Ezen {category} e-mail-címe: <a href=\"mailto:{email}\" target=\"_blank\">{email}</a>",
"emailOf": "Mi az e-mail-címe ennek ({category})?",
@ -257,6 +265,9 @@
"uploadingPicture": "Kép feltöltése folyamatban…",
"willBePublished": "A képed így lesz közzétéve: "
},
"importHelper": {
"allAttributesSame": "Ez a címke minden importálandó objektumon szerepel"
},
"index": {
"#": "Ezek a szövegek akkor jelennek meg a témagombok felett, ha nincs betöltve téma",
"featuredThemeTitle": "Kiemelt ezen a héten",
@ -305,7 +316,7 @@
"aboutOsm": {
"aboutOsm": {
"intro": "Az OpenStreetMap egy önkéntesek által épített, megosztott, globális adatbázis. Az OpenStreetMaphez minden földrajzi adat hozzáadható, amennyiben <b>a helyszínen ellenőrizhető</b>.<br> Az OpenStreetMap hatalmas és mély adattárrá nőtte ki magát: több ezer objektumkategória adatait tartalmazza. Egy-egy objektumnak is nagyon sok tulajdonsága lehet, amivel rengeteg finom részlet ábrázolható, például:",
"li0": "Az utcáknak nem csak egy mértani alakja van a térképen, hanem tartalmazhat adatokat az ott érvényes sebességkorlátozásról, a burkolatáról, arról, hogy van-e rajta közvilágítás, mi a neve, van-e esetleg Wikipédia-szócikk róla, melyik turistautak, kerékpár- és buszútvonalak vezetnek rajta végig és így tovább",
"li0": "Az utcáknak nem csak egy mértani alakja van a térképen, hanem tartalmazhat adatokat az ott érvényes sebességkorlátozásról, a burkolatáról, arról, hogy van-e rajta közvilágítás, mi a neve, van-e esetleg Wikipédia-szócikk róla, melyik turistautak, kerékpár- és buszútvonalak vezetnek erre és így tovább…",
"li1": "Az üzleteknél és egyéb létesítményeknél megadható a nyitvatartási idejük, a telefonszámuk, a weboldalukra mutató link, az általuk elfogadott fizetési módok, az árusított termékek vagy az általuk kínált szolgáltatások stb.",
"li2": "A mosdókon lehet információ az akadálymentességükről, az ott megtalálható pelenkázóasztalokról, arról, hogy kell-e fizetni a használatukért et caetera",
"li3": "és még sok-sok minden más…",

View file

@ -3293,7 +3293,7 @@
"then": "Some vegetarian options are available"
},
"2": {
"then": "No vegetarian options are available"
"then": "Vegetarian options are available"
},
"3": {
"then": "All dishes are vegetarian"

View file

@ -771,7 +771,7 @@
},
"bike_repair_station": {
"description": "Deze laag toont fietspompen en herstelpunten voor fietsen",
"name": "Fietspomp and fietsherstel",
"name": "Fietspomp en fietsherstel",
"presets": {
"0": {
"description": "Een fietspomp in de publieke ruimte zonder extra gereedschap. De fietspomp in je kelder telt dus niet.",

View file

@ -1,9 +0,0 @@
{
"bench": {
"tagRenderings": {
"bench-material": {
"render": "材质: {material}"
}
}
}
}

View file

@ -36,6 +36,9 @@
},
"3": {
"then": "Ist im ersten Stock"
},
"4": {
"then": "Ist im 1. Untergeschoss"
}
},
"question": "In welchem Stockwerk befindet sich dieses Objekt?",
@ -56,6 +59,18 @@
},
"question": "Welche Zahlungsmethoden werden hier akzeptiert?"
},
"payment-options-advanced": {
"override": {
"mappings+": {
"0": {
"then": "Die Bezahlung erfolgt über eine spezielle App"
},
"1": {
"then": "Die Bezahlung erfolgt mit einer Mitgliedskarte"
}
}
}
},
"phone": {
"question": "Was ist die Telefonnummer von {title()}?"
},

View file

@ -36,6 +36,9 @@
},
"3": {
"then": "Az első emeleten"
},
"4": {
"then": "Az első alagsori szinten"
}
},
"question": "Melyik szinten található ez a létesítmény?",

View file

@ -12,6 +12,11 @@
"shortDescription": "Eine Karte aller Sitzbänke",
"title": "Sitzbänke"
},
"bicycle_rental": {
"description": "Auf dieser Karte finden Sie die vielen Fahrradverleihstationen, wie sie auf OpenStreetMap eingetragen wurden",
"shortDescription": "Eine Karte mit Fahrradverleihstationen und Fahrradverleihern",
"title": "Fahrradverleih"
},
"bicyclelib": {
"description": "Fahrradbibliotheken sind Orte, um Fahrräder auszuleihen, oft gegen eine geringe Gebühr. Ein wichtiger Anwendungsfall sind Fahrradbibliotheken für Kinder, die es ihnen ermöglichen, auf ein größeres Fahrrad umzusteigen, wenn sie aus ihrem aktuellen Fahrrad herausgewachsen sind",
"title": "Fahrradbibliothek"
@ -22,10 +27,11 @@
"title": "Ferngläser"
},
"bookcases": {
"description": "Bücherschränke sind alte Schaltschränke, Telefonzellen oder andere Einrichtungen, zur Aufbewahrung von Büchern. Jeder kann Bücher abstellen oder mitnehmen. Die Karte zielt darauf ab, alle Orte mit Bücherschränken zu sammeln. Sie können neue Bücherschränke in der Nähe entdecken und mit einem kostenlosen OpenStreetMap-Konto schnell Ihre Lieblingsbücherschränke hinzufügen.",
"description": "Bücherschränke sind alte Schaltschränke, Telefonzellen oder andere Einrichtungen zur Aufbewahrung von Büchern. Jeder kann Bücher abgeben oder mitnehmen. Die Karte soll helfen, alle Orte mit Bücherschränken zu sammeln. Sie können neue Bücherschränke in der Nähe entdecken und mit einem kostenlosen OpenStreetMap-Konto schnell Ihre Lieblingsbücherschränke hinzufügen.",
"title": "Öffentliche Bücherschränke Karte"
},
"cafes_and_pubs": {
"description": "Kneipen und Bars",
"title": "Cafés und Kneipen"
},
"campersite": {
@ -265,7 +271,7 @@
"descriptionTail": "<p><strong>kletterspots.de</strong> wird betrieben von <a href='https://utopicode.de/?ref=kletterspots' target='_blank'>Christian Neumann</a>. Bitte <a href='https://utopicode.de/kontakt/?project=kletterspots&ref=kletterspots' target='blank'>melden Sie sich</a>, wenn Sie Feedback oder Fragen haben.</p><p>Das Projekt nutzt Daten des <a href='https://www.openstreetmap.org/' target='_blank'>OpenStreetMap</a> Projekts und basiert auf der freien Software <a href='https://github.com/pietervdvn/MapComplete' target='_blank'>MapComplete</a>.</p>",
"layers": {
"0": {
"description": "Ein Kletterverein oder eine Organisation",
"description": "Ein Kletterverein oder -organisation",
"name": "Kletterverein",
"presets": {
"0": {
@ -273,7 +279,7 @@
"title": "Kletterverein"
},
"1": {
"description": "Eine Organisation, welche sich mit dem Klettern beschäftigt",
"description": "Eine Organisation, die sich mit dem Klettern beschäftigt",
"title": "Eine Kletter-Organisation"
}
},
@ -501,7 +507,7 @@
},
"6": {
"question": "Welche Schwierigkeit hat hier die schwerste Route (französisch/belgisches System)?",
"render": "Die schwerste Route hat hier die Schwierigkeit {climbing:grade:french:max} (französisch/belgisches System)"
"render": "Die schwierigste Route hat hier die Schwierigkeitsstufe {climbing:grade:french:max} (französisch/belgisches System)"
},
"7": {
"mappings": {
@ -711,6 +717,11 @@
"description": "Eine Karte zum Anzeigen und Bearbeiten öffentlicher Trinkwasserstellen",
"title": "Trinkwasserstelle"
},
"entrances": {
"description": "Eine Karte mit allen Eingängen, die wichtige Aspekte für Rollstuhlfahrer erfasst",
"shortDescription": "Eingänge prüfen, um die Rollstuhlnavigation zu verbessern",
"title": "Eingänge"
},
"etymology": {
"description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.<br/><br/><b>Sie können auch einen Beitrag leisten!</b>Zoomen Sie genug hinein und <i>alle</i> Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.",
"layers": {
@ -723,6 +734,31 @@
"override": {
"=name": "Parks und Waldflächen ohne Informationen zur Namensherkunft"
}
},
"3": {
"override": {
"=name": "Bildungseinrichtungen ohne Informationen zur Etymologie"
}
},
"4": {
"override": {
"=name": "Kulturelle Orte ohne etymologische Informationen"
}
},
"5": {
"override": {
"=name": "Touristische Orte ohne Angaben zur Etymologie"
}
},
"6": {
"override": {
"=name": "Gesundheits- und Sozialeinrichtungen ohne etymologische Informationen"
}
},
"7": {
"override": {
"=name": "Sportstätten ohne etymologische Informationen"
}
}
},
"shortDescription": "Was ist der Ursprung eines Ortsnamens?",
@ -816,22 +852,26 @@
"title": "Fassadengärten"
},
"food": {
"description": "Restaurants und Fast Food",
"title": "Restaurants und Schnellimbisse"
},
"fritures": {
"description": "Auf dieser Karte findest du deine Lieblings-Pommesbude!",
"layers": {
"0": {
"override": {
"name": "Pommesbude"
}
}
}
},
"title": "Pommes-frites-Läden"
},
"ghostbikes": {
"description": "Ein <b>Geisterrad</b> ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde.<br/><br/> Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
"title": "Geisterräder"
},
"grb": {
"description": "Dieses Thema ist ein Versuch, die Automatisierung des GRB-Imports zu unterstützen.",
"layers": {
"1": {
"tagRenderings": {
@ -928,11 +968,78 @@
"shortDescription": "Hydranten, Feuerlöscher, Feuerwachen und Rettungswachen.",
"title": "Hydranten, Feuerlöscher, Feuerwachen und Rettungswachen."
},
"mapcomplete-changes": {
"description": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen",
"layers": {
"0": {
"description": "Zeigt alle MapComplete-Änderungen",
"filter": {
"0": {
"options": {
"0": {
"question": "Themenname enthält {search}"
}
}
},
"1": {
"options": {
"0": {
"question": "Erstellt von Mitwirkendem {search}"
}
}
},
"2": {
"options": {
"0": {
"question": "<b> Nicht</b> erstellt von Mitwirkendem {search}"
}
}
}
},
"name": "Schwerpunkte von Änderungssätzen",
"tagRenderings": {
"contributor": {
"render": "Geändert von <a href='https://openstreetmap.org/user/{_last_edit:contributor}' target='_blank'>{_last_edit:contributor}</a>"
},
"render_id": {
"render": "Änderungssatz <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
},
"theme": {
"mappings": {
"0": {
"then": "Änderung mit <b>inoffiziellem</b> Thema <a href='https://mapcomplete.osm.be/theme.html?userlayout={theme}'>{theme}</a>"
}
},
"render": "Änderung mit Thema <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>"
}
},
"title": {
"render": "Änderungssatz für {theme}"
}
},
"1": {
"override": {
"tagRenderings": {
"link_to_more": {
"render": "Weitere Statistiken finden Sie <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>hier</a>"
}
}
}
}
},
"shortDescription": "Zeigt Änderungen, die von MapComplete vorgenommen wurden",
"title": "Änderungen mit MapComplete"
},
"maps": {
"description": "Auf dieser Karte findest du alle Karten, die OpenStreetMap kennt - typischerweise eine große Karte auf einer Informationstafel, die das Gebiet, die Stadt oder die Region zeigt, z.B. eine touristische Karte auf der Rückseite einer Plakatwand, eine Karte eines Naturschutzgebietes, eine Karte der Radwegenetze in der Region, ...) <br/><br/>Wenn eine Karte fehlt, können Sie diese leicht auf OpenStreetMap kartieren.",
"shortDescription": "Dieses Thema zeigt alle (touristischen) Karten, die OpenStreetMap kennt",
"title": "Eine Karte der Karten"
},
"nature": {
"description": "Auf dieser Karte findet man interessante Informationen für Touristen und Naturliebhaber, wie zum Beispiel ",
"shortDescription": "Eine Karte für Naturliebhaber, mit interessanten Orten",
"title": "In die Natur"
},
"observation_towers": {
"description": "Öffentlich zugänglicher Aussichtsturm",
"shortDescription": "Öffentlich zugänglicher Aussichtsturm",

View file

@ -739,6 +739,26 @@
"override": {
"=name": "Education institutions without etymology information"
}
},
"4": {
"override": {
"=name": "Cultural places without etymology information"
}
},
"5": {
"override": {
"=name": "Toursistic places without etymology information"
}
},
"6": {
"override": {
"=name": "Health and social places without etymology information"
}
},
"7": {
"override": {
"=name": "Sport places without etymology information"
}
}
},
"shortDescription": "What is the origin of a toponym?",

View file

@ -545,6 +545,27 @@
"description": "Cette carte affiche les points d'accès public à de l'eau potable, et permet d'en ajouter facilement",
"title": "Eau potable"
},
"etymology": {
"layers": {
"1": {
"override": {
"=name": "Route sans origine étymologique"
}
},
"2": {
"override": {
"=name": "Parcs et forêts sans origine étymologique"
}
},
"3": {
"override": {
"=name": "Institutions d'éducation sans origine étymologique"
}
}
},
"shortDescription": "Quelle est l'origine de ce toponyme ?",
"title": "Open Etymology Map"
},
"facadegardens": {
"description": "Les <a href='https://nl.wikipedia.org/wiki/Geveltuin' target=_blank>jardins muraux</a> en ville napportent pas seulement paix et tranquillité mais contribuent à embellir la ville, favoriser la biodiversité, régule la température et assainit lair. <br/> Klimaan VZW et Mechelen Klimaatneutraal veulent cartographier les jardins muraux comme exemple pour les personnes souhaitant en construire ainsi que celles aimant la nature.<br/>Plus dinfos sur <a href='https://klimaan.be/' target=_blank>klimaan.be</a>.",
"layers": {

View file

@ -1 +0,0 @@
{}

View file

@ -42,7 +42,8 @@
"gittag": "ts-node scripts/printVersion.ts | bash",
"lint": "tslint --project . -c tslint.json '**.ts' ",
"clean": "rm -rf .cache/ && (find *.html | grep -v \"\\(404\\|index\\|land\\|test\\|preferences\\|customGenerator\\|professional\\|automaton\\|import_helper\\|import_viewer\\|theme\\).html\" | xargs rm) && (ls | grep \"^index_[a-zA-Z_]\\+\\.ts$\" | xargs rm) && (ls | grep \".*.webmanifest$\" | xargs rm)",
"generate:dependency-graph": "node_modules/.bin/depcruise --exclude \"^node_modules\" --output-type dot Logic/State/MapState.ts > dependencies.dot && dot dependencies.dot -T svg -o dependencies.svg && rm dependencies.dot"
"generate:dependency-graph": "node_modules/.bin/depcruise --exclude \"^node_modules\" --output-type dot Logic/State/MapState.ts > dependencies.dot && dot dependencies.dot -T svg -o dependencies.svg && rm dependencies.dot",
"script": "ts-node"
},
"keywords": [
"OpenStreetMap",

136
scripts/fetchLanguages.ts Normal file
View file

@ -0,0 +1,136 @@
/**
* Fetches all 'modern languages' from wikidata, then exports their names in every language
*/
import * as wds from "wikidata-sdk"
import {Utils} from "../Utils";
import ScriptUtils from "./ScriptUtils";
import {existsSync, readFileSync, writeFileSync} from "fs";
import * as used_languages from "../assets/generated/used_languages.json"
const languageRemap = {
// MapComplete (or weblate) on the left, language of wikimedia on the right
"nb":"nb_NO",
"zh-hant":"zh_Hant",
"zh-hans":"zh_Hans",
"pt-br":"pt_BR"
}
const usedLanguages : Set<string> = new Set(used_languages.languages)
async function fetch(target: string){
const regular = await fetchRegularLanguages()
writeFileSync(target, JSON.stringify(regular, null, " "))
console.log("Written to "+target)
}
async function fetchRegularLanguages() {
ScriptUtils.fixUtils()
console.log("Fetching languages")
const sparql = 'SELECT ?lang ?label ?code \n' +
'WHERE \n' +
'{ \n' +
' ?lang wdt:P31 wd:Q1288568. \n' + // language instanceOf (p31) modern language(Q1288568)
' ?lang rdfs:label ?label. \n' +
' ?lang wdt:P424 ?code' + // Wikimedia language code seems to be close to the weblate entries
'} '
const url = wds.sparqlQuery(sparql)
// request the generated URL with your favorite HTTP request library
const result = await Utils.downloadJson(url, {"User-Agent": "MapComplete script"})
const bindings = result.results.bindings
const zh_hant = await fetchSpecial(18130932, "zh_Hant")
const zh_hans = await fetchSpecial(13414913, "zh_Hant")
const pt_br = await fetchSpecial( 750553, "pt_BR")
bindings.push(...zh_hant)
bindings.push(...zh_hans)
bindings.push(...pt_br)
return result.results.bindings
}
async function fetchSpecial(id: number, code: string) {
ScriptUtils.fixUtils()
console.log("Fetching languages")
const sparql = 'SELECT ?lang ?label ?code \n' +
'WHERE \n' +
'{ \n' +
' wd:Q'+id+' rdfs:label ?label. \n' +
'} '
const url = wds.sparqlQuery(sparql)
// request the generated URL with your favorite HTTP request library
const result = await Utils.downloadJson(url, {"User-Agent": "MapComplete script"})
const bindings = result.results.bindings
bindings.forEach(binding => binding["code"] = {value: code})
return bindings
}
function extract(data){
console.log("Got "+data.length+" entries")
const perId = new Map<string, Map<string, string>>();
for (const element of data) {
let id = element.code.value
id = languageRemap[id] ?? id
let labelLang = element.label["xml:lang"]
labelLang = languageRemap[labelLang] ?? labelLang
const value = element.label.value
if(!perId.has(id)){
perId.set(id, new Map<string, string>())
}
perId.get(id).set(labelLang, value)
}
console.log("Got "+perId.size+" languages")
return perId
}
function getNativeList(langs: Map<string, Map<string, string>>){
const native = {}
langs.forEach((translations, key ) =>{
if(!usedLanguages.has(key)){
return
}
native[key] = translations.get(key)
})
return native
}
async function main(wipeCache = false){
const cacheFile = "./assets/generated/languages-wd.json"
if(wipeCache || !existsSync(cacheFile)){
console.log("Refreshing cache")
await fetch(cacheFile);
}else{
console.log("Reusing the cached file")
}
const data = JSON.parse(readFileSync( cacheFile, "UTF8"))
const perId = extract(data)
const nativeList = getNativeList(perId)
writeFileSync("./assets/language_native.json", JSON.stringify(nativeList, null, " "))
const translations = Utils.MapToObj<Map<string, string>>(perId, (value, key) => {
if(!usedLanguages.has(key)){
return undefined // Remove unused languages
}
return Utils.MapToObj(value, (v, k ) => {
if(!usedLanguages.has(k)){
return undefined
}
return v
})
})
writeFileSync("./assets/language_translations.json",
JSON.stringify(translations, null, " "))
}
const forceRefresh = process.argv[2] === "--force-refresh"
main(forceRefresh).then(() => console.log("Done!"))