diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index db4308eb6..4ff3316d6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -37,34 +37,34 @@ jobs: # Learn more about CodeQL language support at https://git.io/codeql-language-support steps: - - name: Checkout repository - uses: actions/checkout@v2 + - name: Checkout repository + uses: actions/checkout@v2 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language - #- run: | - # make bootstrap - # make release + #- run: | + # make bootstrap + # make release - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/Customizations/AllKnownLayouts.ts b/Customizations/AllKnownLayouts.ts index f5695d70b..0281a7649 100644 --- a/Customizations/AllKnownLayouts.ts +++ b/Customizations/AllKnownLayouts.ts @@ -9,16 +9,16 @@ export class AllKnownLayouts { public static allKnownLayouts: Map = AllKnownLayouts.AllLayouts(); public static layoutsList: LayoutConfig[] = AllKnownLayouts.GenerateOrderedList(AllKnownLayouts.allKnownLayouts); - public static AllPublicLayers(){ - const allLayers : LayerConfig[] = [] + public static AllPublicLayers() { + const allLayers: LayerConfig[] = [] const seendIds = new Set() const publicLayouts = AllKnownLayouts.layoutsList.filter(l => !l.hideFromOverview) for (const layout of publicLayouts) { - if(layout.hideFromOverview){ + if (layout.hideFromOverview) { continue } for (const layer of layout.layers) { - if(seendIds.has(layer.id)){ + if (seendIds.has(layer.id)) { continue } seendIds.add(layer.id) @@ -28,7 +28,7 @@ export class AllKnownLayouts { } return allLayers } - + private static GenerateOrderedList(allKnownLayouts: Map): LayoutConfig[] { const keys = ["personal", "cyclofix", "hailhydrant", "bookcases", "toilets", "aed"] const list = [] diff --git a/Customizations/SharedTagRenderings.ts b/Customizations/SharedTagRenderings.ts index 0f47ef9a9..c44156345 100644 --- a/Customizations/SharedTagRenderings.ts +++ b/Customizations/SharedTagRenderings.ts @@ -15,7 +15,7 @@ export default class SharedTagRenderings { const d = new Map() for (const key of Array.from(configJsons.keys())) { try { - d.set(key, new TagRenderingConfig(configJsons.get(key), `SharedTagRenderings.${key}`)) + d.set(key, new TagRenderingConfig(configJsons.get(key), `SharedTagRenderings.${key}`)) } catch (e) { if (!Utils.runningFromConsole) { console.error("BUG: could not parse", key, " from questions.json or icons.json - this error happened during the build step of the SharedTagRenderings", e) diff --git a/Docs/CalculatedTags.md b/Docs/CalculatedTags.md index 07f334db6..3ef554249 100644 --- a/Docs/CalculatedTags.md +++ b/Docs/CalculatedTags.md @@ -1,144 +1,103 @@ - - Metatags +Metatags ========== Metatags are extra tags available, in order to display more data or to give better questions. -The are calculated automatically on every feature when the data arrives in the webbrowser. This document gives an overview of the available metatags. +The are calculated automatically on every feature when the data arrives in the webbrowser. This document gives an +overview of the available metatags. -**Hint:** when using metatags, add the [query parameter](URL_Parameters.md) `debug=true` to the URL. This will include a box in the popup for features which shows all the properties of the object +**Hint:** when using metatags, add the [query parameter](URL_Parameters.md) `debug=true` to the URL. This will include a +box in the popup for features which shows all the properties of the object - Metatags calculated by MapComplete +Metatags calculated by MapComplete ------------------------------------ -The following values are always calculated, by default, by MapComplete and are available automatically on all elements in every theme - - -### _lat, _lon - +The following values are always calculated, by default, by MapComplete and are available automatically on all elements +in every theme +### _lat, _lon The latitude and longitude of the point (or centerpoint in the case of a way/area) +### _layer +The layer-id to which this feature belongs. Note that this might be return any applicable if `passAllFeatures` is +defined. - -### _layer - - - -The layer-id to which this feature belongs. Note that this might be return any applicable if `passAllFeatures` is defined. - - - - -### _surface, _surface:ha - - +### _surface, _surface:ha The surface area of the feature, in square meters and in hectare. Not set on points and ways This is a lazy metatag and is only calculated when needed +### _length, _length:km -### _length, _length:km +The total length of a feature in meters (and in kilometers, rounded to one decimal for '_length:km'). For a surface, the +length of the perimeter +### Theme-defined keys +If 'units' is defined in the layoutConfig, then this metatagger will rewrite the specified keys to have the canonical +form (e.g. `1meter` will be rewritten to `1m`) -The total length of a feature in meters (and in kilometers, rounded to one decimal for '_length:km'). For a surface, the length of the perimeter - - - - -### Theme-defined keys - - - -If 'units' is defined in the layoutConfig, then this metatagger will rewrite the specified keys to have the canonical form (e.g. `1meter` will be rewritten to `1m`) - - - - -### _country - - +### _country The country code of the property (with latlon2country) - - - -### _isOpen, _isOpen:description - - +### _isOpen, _isOpen:description If 'opening_hours' is present, it will add the current state of the feature (being 'yes' or 'no') This is a lazy metatag and is only calculated when needed +### _direction:numerical, _direction:leftright -### _direction:numerical, _direction:leftright +_direction:numerical is a normalized, numerical direction based on 'camera:direction' or on 'direction'; it is only +present if a valid direction is found (e.g. 38.5 or NE). _direction:leftright is either 'left' or 'right', which is +left-looking on the map or 'right-looking' on the map +### _now:date, _now:datetime, _loaded:date, _loaded:_datetime +Adds the time that the data got loaded - pretty much the time of downloading from overpass. The format is YYYY-MM-DD hh: +mm, aka 'sortable' aka ISO-8601-but-not-entirely -_direction:numerical is a normalized, numerical direction based on 'camera:direction' or on 'direction'; it is only present if a valid direction is found (e.g. 38.5 or NE). _direction:leftright is either 'left' or 'right', which is left-looking on the map or 'right-looking' on the map - - - - -### _now:date, _now:datetime, _loaded:date, _loaded:_datetime - - - -Adds the time that the data got loaded - pretty much the time of downloading from overpass. The format is YYYY-MM-DD hh:mm, aka 'sortable' aka ISO-8601-but-not-entirely - - - - -### _last_edit:contributor, _last_edit:contributor:uid, _last_edit:changeset, _last_edit:timestamp, _version_number, _backend - - +### _last_edit:contributor, _last_edit:contributor:uid, _last_edit:changeset, _last_edit:timestamp, _version_number, _backend Information about the last edit of this object. +### sidewalk:left, sidewalk:right, generic_key:left:property, generic_key:right:property - - -### sidewalk:left, sidewalk:right, generic_key:left:property, generic_key:right:property - - - -Rewrites tags from 'generic_key:both:property' as 'generic_key:left:property' and 'generic_key:right:property' (and similar for sidewalk tagging). Note that this rewritten tags _will be reuploaded on a change_. To prevent to much unrelated retagging, this is only enabled if the layer has at least some lineRenderings with offset defined +Rewrites tags from 'generic_key:both:property' as 'generic_key:left:property' and 'generic_key:right:property' (and +similar for sidewalk tagging). Note that this rewritten tags _will be reuploaded on a change_. To prevent to much +unrelated retagging, this is only enabled if the layer has at least some lineRenderings with offset defined - Calculating tags with Javascript +Calculating tags with Javascript ---------------------------------- -In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by default (e.g. `lat`, `lon`, `_country`), as detailed above. +In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by +default (e.g. `lat`, `lon`, `_country`), as detailed above. It is also possible to calculate your own tags - but this requires some javascript knowledge. - - Before proceeding, some warnings: +- DO NOT DO THIS AS BEGINNER +- **Only do this if all other techniques fail** This should _not_ be done to create a rendering effect, only to + calculate a specific value +- **THIS MIGHT BE DISABLED WITHOUT ANY NOTICE ON UNOFFICIAL THEMES** As unofficial themes might be loaded from the + internet, this is the equivalent of injecting arbitrary code into the client. It'll be disabled if abuse occurs. - - - DO NOT DO THIS AS BEGINNER - - **Only do this if all other techniques fail** This should _not_ be done to create a rendering effect, only to calculate a specific value - - **THIS MIGHT BE DISABLED WITHOUT ANY NOTICE ON UNOFFICIAL THEMES** As unofficial themes might be loaded from the internet, this is the equivalent of injecting arbitrary code into the client. It'll be disabled if abuse occurs. - - -To enable this feature, add a field `calculatedTags` in the layer object, e.g.: +To enable this feature, add a field `calculatedTags` in the layer object, e.g.: ```` @@ -154,71 +113,75 @@ To enable this feature, add a field `calculatedTags` in the layer object, e.g.: ```` +The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended +geojson object: +- `area` contains the surface area (in square meters) of the object +- `lat` and `lon` contain the latitude and longitude -The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended geojson object: +Some advanced functions are available on **feat** as well: +- [distanceTo](#distanceTo) +- [overlapWith](#overlapWith) +- [closest](#closest) +- [closestn](#closestn) +- [memberships](#memberships) +- [get](#get) +### distanceTo - - `area` contains the surface area (in square meters) of the object - - `lat` and `lon` contain the latitude and longitude +Calculates the distance between the feature and a specified point in kilometer. The input should either be a pair of +coordinates, a geojson feature or the ID of an object +0. feature OR featureID OR longitude +1. undefined OR latitude -Some advanced functions are available on **feat** as well: +### overlapWith - - [distanceTo](#distanceTo) - - [overlapWith](#overlapWith) - - [closest](#closest) - - [closestn](#closestn) - - [memberships](#memberships) - - [get](#get) - -### distanceTo +Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded +in the feature is detected as well.If the current feature is a point, all features that this point is embeded in are +given. - Calculates the distance between the feature and a specified point in kilometer. The input should either be a pair of coordinates, a geojson feature or the ID of an object +The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in +m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature +is a point. The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be +the first in the list - 0. feature OR featureID OR longitude - 1. undefined OR latitude - -### overlapWith +For example to get all objects which overlap or embed from a layer, +use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')` - Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well.If the current feature is a point, all features that this point is embeded in are given. +0. ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap) -The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point. -The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list +### closest -For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')` +Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. +In the case of ways/polygons, only the centerpoint is considered. Returns a single geojson feature or undefined if +nothing is found (or not yet laoded) - 0. ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap) - -### closest +0. list of features or a layer name or '*' to get all features - Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. In the case of ways/polygons, only the centerpoint is considered. Returns a single geojson feature or undefined if nothing is found (or not yet laoded) +### closestn - 0. list of features or a layer name or '*' to get all features - -### closestn +Given either a list of geojson features or a single layer name, gives the n closest objects which are nearest to the +feature (excluding the feature itself). In the case of ways/polygons, only the centerpoint is considered. Returns a list +of `{feat: geojson, distance:number}` the empty list if nothing is found (or not yet loaded) - Given either a list of geojson features or a single layer name, gives the n closest objects which are nearest to the feature (excluding the feature itself). In the case of ways/polygons, only the centerpoint is considered. Returns a list of `{feat: geojson, distance:number}` the empty list if nothing is found (or not yet loaded) +If a 'unique tag key' is given, the tag with this key will only appear once (e.g. if 'name' is given, all features will +have a different name) -If a 'unique tag key' is given, the tag with this key will only appear once (e.g. if 'name' is given, all features will have a different name) +0. list of features or layer name or '*' to get all features +1. amount of features +2. unique tag key (optional) +3. maxDistanceInMeters (optional) - 0. list of features or layer name or '*' to get all features - 1. amount of features - 2. unique tag key (optional) - 3. maxDistanceInMeters (optional) - -### memberships +### memberships - Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. +Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. -For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')` +For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')` +### get - -### get +Gets the property of the feature, parses it (as JSON) and returns it. Might return 'undefined' if not defined, null, ... - Gets the property of the feature, parses it (as JSON) and returns it. Might return 'undefined' if not defined, null, ... - - 0. key - Generated from SimpleMetaTagger, ExtraFunction \ No newline at end of file +0. key Generated from SimpleMetaTagger, ExtraFunction \ No newline at end of file diff --git a/Docs/ContributorRights.md b/Docs/ContributorRights.md index f845f0672..c9257350d 100644 --- a/Docs/ContributorRights.md +++ b/Docs/ContributorRights.md @@ -1,32 +1,42 @@ - - Rights of contributors - ====================== +Rights of contributors +====================== If a contributor is quite active within MapComplete, this contributor might be granted access to the main repository. -If you have access to the repository, you can make a fork of an already existing branch and push this new branch to github. -This means that this branch will be _automatically built_ and be **deployed** to `https://pietervdvn.github.io/mc/`. You can see the deploy process on [Github Actions](https://github.com/pietervdvn/MapComplete/actions). -Don't worry about pushing too much. These deploys are free and totally automatic. They might fail if something is wrong, but this will hinder no-one. +If you have access to the repository, you can make a fork of an already existing branch and push this new branch to +github. This means that this branch will be _automatically built_ and be **deployed** +to `https://pietervdvn.github.io/mc/`. You can see the deploy process +on [Github Actions](https://github.com/pietervdvn/MapComplete/actions). Don't worry about pushing too much. These +deploys are free and totally automatic. They might fail if something is wrong, but this will hinder no-one. -Additionaly, some other maintainer might step in and merge the latest develop with your branch, making later pull requests easier. +Additionaly, some other maintainer might step in and merge the latest develop with your branch, making later pull +requests easier. Don't worry about bugs ---------------------- -As a non-admin contributor, you can _not_ make changes to the `master` nor to the `develop` branch. This is because, as soon as master is changed, this is built and deployed on `mapcomplete.osm.be`, which a lot of people use. An error there will cause a lot of grieve. +As a non-admin contributor, you can _not_ make changes to the `master` nor to the `develop` branch. This is because, as +soon as master is changed, this is built and deployed on `mapcomplete.osm.be`, which a lot of people use. An error there +will cause a lot of grieve. -A push on `develop` is automatically deployed to [pietervdvn.github.io/mc/develop] and is used by quite some people to. People using this version should know that this is a testing ground for new features and might contain a bug every now and then. +A push on `develop` is automatically deployed to [pietervdvn.github.io/mc/develop] and is used by quite some people to. +People using this version should know that this is a testing ground for new features and might contain a bug every now +and then. -In other words, to get your theme deployed on the main instances, you'll still have to create a pull request. The maintainers will then doublecheck and pull it in. +In other words, to get your theme deployed on the main instances, you'll still have to create a pull request. The +maintainers will then doublecheck and pull it in. If you have a local repository ------------------------------ -If you have made a fork earlier and have received contributor rights, you need to tell your local git repository that pushing to the main repository is possible. +If you have made a fork earlier and have received contributor rights, you need to tell your local git repository that +pushing to the main repository is possible. To do this: 1. type `git remote add upstream git@github.com:pietervdvn/MapComplete` -2. Run `git push upstream` to push your latest changes to the main repo (and not your fork). Running `git push` will push to your fork. +2. Run `git push upstream` to push your latest changes to the main repo (and not your fork). Running `git push` will + push to your fork. -Alternatively, if you don't have any unmerged changes, you can remove your local copy and clone `pietervdvn/MapComplete` again to start fresh. \ No newline at end of file +Alternatively, if you don't have any unmerged changes, you can remove your local copy and clone `pietervdvn/MapComplete` +again to start fresh. \ No newline at end of file diff --git a/Docs/Development_deployment.md b/Docs/Development_deployment.md index 2bf304508..9206dfe51 100644 --- a/Docs/Development_deployment.md +++ b/Docs/Development_deployment.md @@ -28,14 +28,15 @@ To develop and build MapComplete, you 0. Make a fork and clone the repository. 0. Install the nodejs version specified in [.tool-versions](./.tool-versions) - - On linux: install npm first `sudo apt install npm`, then install `n` using npm: ` npm install -g n`, which can then install node with `n install ` - - You can [use asdf to manage your runtime versions](https://asdf-vm.com/). + - On linux: install npm first `sudo apt install npm`, then install `n` using npm: ` npm install -g n`, which can + then install node with `n install ` + - You can [use asdf to manage your runtime versions](https://asdf-vm.com/). 0. Install `npm`. Linux: `sudo apt install npm` (or your favourite package manager), Windows: install nodeJS: https://nodejs.org/en/download/ 0. On iOS, install `wget` (`brew install wget`) 0. Run `npm run init` which … - - runs `npm install` - - generates some additional dependencies and files + - runs `npm install` + - generates some additional dependencies and files 0. Run `npm run start` to host a local testversion at http://localhost:1234/index.html 0. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename` or `userlayout=true#` as [Query parameter](URL_Parameters.md). Note that the shorter URLs ( @@ -106,7 +107,8 @@ Try removing `node_modules`, `package-lock.json` and `.cache` Misc setup ---------- -The json-git-merger is used to quickly merge translation files, [documentation here](https://github.com/jonatanpedersen/git-json-merge#single-project--directory) +The json-git-merger is used to quickly merge translation +files, [documentation here](https://github.com/jonatanpedersen/git-json-merge#single-project--directory) Overview of package.json-scripts -------------------------------- diff --git a/Docs/Misc/geolocation_button.gv.svg b/Docs/Misc/geolocation_button.gv.svg index 6dbf78848..5fd2710d0 100644 --- a/Docs/Misc/geolocation_button.gv.svg +++ b/Docs/Misc/geolocation_button.gv.svg @@ -1,145 +1,181 @@ + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> - -G - - - -init - -init - - - -denied - -denied - - - -init->denied - - -geolocation permanently denied - - - -getting_location - -getting_location - - - -init->getting_location - - -previously granted flag set - - - -idle - -idle - - - -init->idle - - -previously granted flag unset - - - -location_found - -location_found - - - -getting_location->location_found - - -location found - - - -request_permission - -request_permission - - - -idle->request_permission - - -on click - - - -request_permission->denied - - -permanently denied - - - -request_permission->getting_location - - -granted (sets flag) - - - -request_permission->idle - - -not granted - - - -open_lock - -open_lock - - - -location_found->open_lock - - -on click (zooms to location) - - - -open_lock->location_found - - -after 3 sec - - - -closed_lock - -closed_lock - - - -open_lock->closed_lock - - -on click (locks zoom to location) - - - -closed_lock->location_found - - -on click - - + viewBox="0.00 0.00 664.25 566.00" xmlns="http://www.w3.org/2000/svg"> + + G + + + + init + + init + + + + denied + + denied + + + + init->denied + + + geolocation + permanently denied + + + + + getting_location + + + getting_location + + + + + init->getting_location + + + previously + granted flag set + + + + + idle + + idle + + + + init->idle + + + previously + granted flag unset + + + + + location_found + + + location_found + + + + + getting_location->location_found + + + location + found + + + + + request_permission + + + request_permission + + + + + idle->request_permission + + + on click + + + + request_permission->denied + + + permanently + denied + + + + + request_permission->getting_location + + + granted (sets + flag) + + + + + request_permission->idle + + + not granted + + + + + open_lock + + open_lock + + + + + location_found->open_lock + + + on click (zooms + to location) + + + + + open_lock->location_found + + + after 3 sec + + + + + closed_lock + + closed_lock + + + + + open_lock->closed_lock + + + on click (locks + zoom to location) + + + + + closed_lock->location_found + + + on click + + diff --git a/Docs/Release_Notes.md b/Docs/Release_Notes.md index c6f0ac35d..e352720c2 100644 --- a/Docs/Release_Notes.md +++ b/Docs/Release_Notes.md @@ -6,13 +6,15 @@ Some highlights of new releases. 0.10 ---- -The 0.10 version contains a lot of refactorings on various core of the application, namely in the rendering stack, the fetching of data and uploading. +The 0.10 version contains a lot of refactorings on various core of the application, namely in the rendering stack, the +fetching of data and uploading. Some highlights are: 1. The addition of fallback overpass servers 2. Fetching data from OSM directly (especially useful in the personal theme) -3. Splitting all the features per tile (with a maximum amount of features per tile, splitting further if needed), making everything a ton faster +3. Splitting all the features per tile (with a maximum amount of features per tile, splitting further if needed), making + everything a ton faster 4. If a tile has too much features, the featuers are not shown. Instead, a rectangle with the feature amount is shown. Furthermore, it contains a few new themes and theme updates: @@ -31,9 +33,8 @@ Other various small improvements: 0.8 and 0.9 ----------- -Addition of filters per layer -Addition of a download-as-pdf for select themes -Addition of a download-as-geojson and download-as-csv for select themes +Addition of filters per layer Addition of a download-as-pdf for select themes Addition of a download-as-geojson and +download-as-csv for select themes ... diff --git a/Docs/SpecialInputElements.md b/Docs/SpecialInputElements.md index d6648fa3b..323d7522f 100644 --- a/Docs/SpecialInputElements.md +++ b/Docs/SpecialInputElements.md @@ -1,10 +1,10 @@ - - Available types for text fields +Available types for text fields ================================= -The listed types here trigger a special input element. Use them in `tagrendering.freeform.type` of your tagrendering to activate them +The listed types here trigger a special input element. Use them in `tagrendering.freeform.type` of your tagrendering to +activate them ## string @@ -24,29 +24,29 @@ A geographical direction, in degrees. 0° is north, 90° is east, ... Will retur ## length -A geographical length in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `["21", "map,photo"] +A geographical length in meters (rounded at two points). Will give an extra minimap with a measurement tool. +Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `["21", "map,photo"] ## wikidata -A wikidata identifier, e.g. Q42. -### Helper arguments +A wikidata identifier, e.g. Q42. - +### Helper arguments name | doc ------ | ----- key | the value of this tag will initialize search (default: name) -options | A JSON-object of type `{ removePrefixes: string[], removePostfixes: string[] }`. +options | A JSON-object of type `{ removePrefixes: string[], removePostfixes: string[] }`. subarg | doc -------- | ----- removePrefixes | remove these snippets of text from the start of the passed string to search removePostfixes | remove these snippets of text from the end of the passed string to search - -### Example usage +### Example usage - The following is the 'freeform'-part of a layer config which will trigger a search for the wikidata item corresponding with the name of the selected feature. It will also remove '-street', '-square', ... if found at the end of the name +The following is the 'freeform'-part of a layer config which will trigger a search for the wikidata item corresponding +with the name of the selected feature. It will also remove '-street', '-square', ... if found at the end of the name ``` "freeform": { @@ -101,24 +101,22 @@ A phone number ## opening_hours -Has extra elements to easily input when a POI is opened. -### Helper arguments +Has extra elements to easily input when a POI is opened. - +### Helper arguments name | doc ------ | ----- -options | A JSON-object of type `{ prefix: string, postfix: string }`. +options | A JSON-object of type `{ prefix: string, postfix: string }`. subarg | doc -------- | ----- prefix | Piece of text that will always be added to the front of the generated opening hours. If the OSM-data does not start with this, it will fail to parse postfix | Piece of text that will always be added to the end of the generated opening hours - -### Example usage +### Example usage - To add a conditional (based on time) access restriction: +To add a conditional (based on time) access restriction: ``` @@ -134,7 +132,8 @@ postfix | Piece of text that will always be added to the end of the generated op } ``` -*Don't forget to pass the prefix and postfix in the rendering as well*: `{opening_hours_table(opening_hours,yes @ &LPARENS, &RPARENS )` +*Don't forget to pass the prefix and postfix in the rendering as +well*: `{opening_hours_table(opening_hours,yes @ &LPARENS, &RPARENS )` ## color diff --git a/Docs/SpecialRenderings.md b/Docs/SpecialRenderings.md index 35d03abc0..ba939d686 100644 --- a/Docs/SpecialRenderings.md +++ b/Docs/SpecialRenderings.md @@ -1,196 +1,200 @@ +### Special tag renderings -### Special tag renderings +In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and +visualizations to be reused by custom themes or even to query third-party API's. +General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do +not_ need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a +comma in your args +- [all_tags](#all_tags) +- [image_carousel](#image_carousel) +- [image_upload](#image_upload) +- [wikipedia](#wikipedia) +- [minimap](#minimap) +- [sided_minimap](#sided_minimap) +- [reviews](#reviews) +- [opening_hours_table](#opening_hours_table) +- [live](#live) +- [histogram](#histogram) +- [share_link](#share_link) +- [canonical](#canonical) +- [import_button](#import_button) +- [multi_apply](#multi_apply) +- [tag_apply](#tag_apply) -In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and visualizations to be reused by custom themes or even to query third-party API's. +### all_tags -General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do not_ need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a comma in your args +Prints all key-value pairs of the object - used for debugging +#### Example usage +`{all_tags()}` - - [all_tags](#all_tags) - - [image_carousel](#image_carousel) - - [image_upload](#image_upload) - - [wikipedia](#wikipedia) - - [minimap](#minimap) - - [sided_minimap](#sided_minimap) - - [reviews](#reviews) - - [opening_hours_table](#opening_hours_table) - - [live](#live) - - [histogram](#histogram) - - [share_link](#share_link) - - [canonical](#canonical) - - [import_button](#import_button) - - [multi_apply](#multi_apply) - - [tag_apply](#tag_apply) +### image_carousel - - -### all_tags - - Prints all key-value pairs of the object - used for debugging -#### Example usage - - `{all_tags()}` - - -### image_carousel - - Creates an image carousel for the given sources. An attempt will be made to guess what source is used. Supported: Wikidata identifiers, Wikipedia pages, Wikimedia categories, IMGUR (with attribution, direct links) +Creates an image carousel for the given sources. An attempt will be made to guess what source is used. Supported: +Wikidata identifiers, Wikipedia pages, Wikimedia categories, IMGUR (with attribution, direct links) name | default | description ------ | --------- | ------------- -image key/prefix (multiple values allowed if comma-seperated) | image,mapillary,image,wikidata,wikimedia_commons,image,image | The keys given to the images, e.g. if image is given, the first picture URL will be added as image, the second as image:0, the third as image:1, etc... - -#### Example usage +image key/prefix (multiple values allowed if comma-seperated) | image,mapillary,image,wikidata,wikimedia_commons,image,image | The keys given to the images, e.g. if image is given, the first picture URL will be added as image, the second as image:0, the third as image:1, etc... - `{image_carousel(image,mapillary,image,wikidata,wikimedia_commons,image,image)}` +#### Example usage +`{image_carousel(image,mapillary,image,wikidata,wikimedia_commons,image,image)}` -### image_upload +### image_upload - Creates a button where a user can upload an image to IMGUR +Creates a button where a user can upload an image to IMGUR name | default | description ------ | --------- | ------------- image-key | image | Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added) label | Add image | The text to show on the button - -#### Example usage - `{image_upload(image,Add image)}` +#### Example usage +`{image_upload(image,Add image)}` -### wikipedia +### wikipedia - A box showing the corresponding wikipedia article - based on the wikidata tag +A box showing the corresponding wikipedia article - based on the wikidata tag name | default | description ------ | --------- | ------------- keyToShowWikipediaFor | wikidata | Use the wikidata entry from this key to show the wikipedia article for - -#### Example usage - `{wikipedia()}` is a basic example, `{wikipedia(name:etymology:wikidata)}` to show the wikipedia page of whom the feature was named after. Also remember that these can be styled, e.g. `{wikipedia():max-height: 10rem}` to limit the height +#### Example usage +`{wikipedia()}` is a basic example, `{wikipedia(name:etymology:wikidata)}` to show the wikipedia page of whom the +feature was named after. Also remember that these can be styled, e.g. `{wikipedia():max-height: 10rem}` to limit the +height -### minimap +### minimap - A small map showing the selected feature. +A small map showing the selected feature. name | default | description ------ | --------- | ------------- zoomlevel | 18 | The (maximum) zoomlevel: the target zoomlevel after fitting the entire feature. The minimap will fit the entire feature, then zoom out to this zoom level. The higher, the more zoomed in with 1 being the entire world and 19 being really close idKey | id | (Matches all resting arguments) This argument should be the key of a property of the feature. The corresponding value is interpreted as either the id or the a list of ID's. The features with these ID's will be shown on this minimap. - -#### Example usage - `{minimap()}`, `{minimap(17, id, _list_of_embedded_feature_ids_calculated_by_calculated_tag):height:10rem; border: 2px solid black}` +#### Example usage +`{minimap()}` +, `{minimap(17, id, _list_of_embedded_feature_ids_calculated_by_calculated_tag):height:10rem; border: 2px solid black}` -### sided_minimap +### sided_minimap - A small map showing _only one side_ the selected feature. *This features requires to have linerenderings with offset* as only linerenderings with a postive or negative offset will be shown. Note: in most cases, this map will be automatically introduced +A small map showing _only one side_ the selected feature. *This features requires to have linerenderings with offset* as +only linerenderings with a postive or negative offset will be shown. Note: in most cases, this map will be automatically +introduced name | default | description ------ | --------- | ------------- side | _undefined_ | The side to show, either `left` or `right` - -#### Example usage - `{sided_minimap(left)}` +#### Example usage +`{sided_minimap(left)}` -### reviews +### reviews - Adds an overview of the mangrove-reviews of this object. Mangrove.Reviews needs - in order to identify the reviewed object - a coordinate and a name. By default, the name of the object is given, but this can be overwritten +Adds an overview of the mangrove-reviews of this object. Mangrove.Reviews needs - in order to identify the reviewed +object - a coordinate and a name. By default, the name of the object is given, but this can be overwritten name | default | description ------ | --------- | ------------- subjectKey | name | The key to use to determine the subject. If specified, the subject will be tags[subjectKey] -fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value - -#### Example usage +fallback | _ +undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value - `{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name will be used as identifier, otherwise 'play_forest' is used +#### Example usage +`{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name +will be used as identifier, otherwise 'play_forest' is used -### opening_hours_table +### opening_hours_table - Creates an opening-hours table. Usage: {opening_hours_table(opening_hours)} to create a table of the tag 'opening_hours'. +Creates an opening-hours table. Usage: {opening_hours_table(opening_hours)} to create a table of the tag ' +opening_hours'. name | default | description ------ | --------- | ------------- key | opening_hours | The tagkey from which the table is constructed. -prefix | _empty string_ | Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__ -postfix | _empty string_ | Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__ - -#### Example usage +prefix | _empty string_ | Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to +indicate `(` if needed__ +postfix | _empty string_ | Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to +indicate `)` if needed__ - A normal opening hours table can be invoked with `{opening_hours_table()}`. A table for e.g. conditional access with opening hours can be `{opening_hours_table(access:conditional, no @ &LPARENS, &RPARENS)}` +#### Example usage +A normal opening hours table can be invoked with `{opening_hours_table()}`. A table for e.g. conditional access with +opening hours can be `{opening_hours_table(access:conditional, no @ &LPARENS, &RPARENS)}` -### live +### live - Downloads a JSON from the given URL, e.g. '{live(example.org/data.json, shorthand:x.y.z, other:a.b.c, shorthand)}' will download the given file, will create an object {shorthand: json[x][y][z], other: json[a][b][c] out of it and will return 'other' or 'json[a][b][c]. This is made to use in combination with tags, e.g. {live({url}, {url:format}, needed_value)} +Downloads a JSON from the given URL, e.g. '{live(example.org/data.json, shorthand:x.y.z, other:a.b.c, shorthand)}' will +download the given file, will create an object {shorthand: json[x][y][z], other: json[a][b][c] out of it and will +return 'other' or 'json[a][b][c]. This is made to use in combination with tags, e.g. {live({url}, {url:format}, +needed_value)} name | default | description ------ | --------- | ------------- Url | _undefined_ | The URL to load Shorthands | _undefined_ | A list of shorthands, of the format 'shorthandname:path.path.path'. separated by ; path | _undefined_ | The path (or shorthand) that should be returned - -#### Example usage - {live({url},{url:format},hour)} {live(https://data.mobility.brussels/bike/api/counts/?request=live&featureID=CB2105,hour:data.hour_cnt;day:data.day_cnt;year:data.year_cnt,hour)} +#### Example usage +{live({url},{url:format},hour)} +{live(https://data.mobility.brussels/bike/api/counts/?request=live&featureID=CB2105,hour:data.hour_cnt;day:data.day_cnt;year:data.year_cnt,hour)} -### histogram +### histogram - Create a histogram for a list of given values, read from the properties. +Create a histogram for a list of given values, read from the properties. name | default | description ------ | --------- | ------------- key | _undefined_ | The key to be read and to generate a histogram from title | _empty string_ | The text to put above the given values column countHeader | _empty string_ | The text to put above the counts -colors* | _undefined_ | (Matches all resting arguments - optional) Matches a regex onto a color value, e.g. `3[a-zA-Z+-]*:#33cc33` - -#### Example usage +colors* | _ +undefined_ | (Matches all resting arguments - optional) Matches a regex onto a color value, e.g. `3[a-zA-Z+-]*:#33cc33` - `{histogram('some_key')}` with properties being `{some_key: ['a','b','a','c']} to create a histogram +#### Example usage +`{histogram('some_key')}` with properties being `{some_key: ['a','b','a','c']} to create a histogram -### share_link +### share_link - Creates a link that (attempts to) open the native 'share'-screen +Creates a link that (attempts to) open the native 'share'-screen name | default | description ------ | --------- | ------------- url | _undefined_ | The url to share (default: current URL) - -#### Example usage - {share_link()} to share the current page, {share_link()} to share the given url +#### Example usage +{share_link()} to share the current page, {share_link()} to share the given url -### canonical +### canonical - Converts a short, canonical value into the long, translated text +Converts a short, canonical value into the long, translated text name | default | description ------ | --------- | ------------- key | _undefined_ | The key of the tag to give the canonical text for - -#### Example usage - {canonical(length)} will give 42 metre (in french) +#### Example usage +{canonical(length)} will give 42 metre (in french) -### import_button +### import_button - This button will copy the data from an external dataset into OpenStreetMap. It is only functional in official themes but can be tested in unofficial themes. +This button will copy the data from an external dataset into OpenStreetMap. It is only functional in official themes but +can be tested in unofficial themes. #### Importing a dataset into OpenStreetMap: requirements @@ -198,101 +202,113 @@ If you want to import a dataset, make sure that: 1. The dataset to import has a suitable license 2. The community has been informed of the import -3. All other requirements of the [import guidelines](https://wiki.openstreetmap.org/wiki/Import/Guidelines) have been followed +3. All other requirements of the [import guidelines](https://wiki.openstreetmap.org/wiki/Import/Guidelines) have been + followed There are also some technicalities in your theme to keep in mind: -1. The new feature will be added and will flow through the program as any other new point as if it came from OSM. - This means that there should be a layer which will match the new tags and which will display it. -2. The original feature from your geojson layer will gain the tag '_imported=yes'. - This should be used to change the appearance or even to hide it (eg by changing the icon size to zero) -3. There should be a way for the theme to detect previously imported points, even after reloading. - A reference number to the original dataset is an excellent way to do this -4. When importing ways, the theme creator is also responsible of avoiding overlapping ways. - +1. The new feature will be added and will flow through the program as any other new point as if it came from OSM. This + means that there should be a layer which will match the new tags and which will display it. +2. The original feature from your geojson layer will gain the tag '_imported=yes'. This should be used to change the + appearance or even to hide it (eg by changing the icon size to zero) +3. There should be a way for the theme to detect previously imported points, even after reloading. A reference number to + the original dataset is an excellent way to do this +4. When importing ways, the theme creator is also responsible of avoiding overlapping ways. + #### Disabled in unofficial themes -The import button can be tested in an unofficial theme by adding `test=true` or `backend=osm-test` as [URL-paramter](URL_Parameters.md). -The import button will show up then. If in testmode, you can read the changeset-XML directly in the web console. -In the case that MapComplete is pointed to the testing grounds, the edit will be made on https://master.apis.dev.openstreetmap.org - +The import button can be tested in an unofficial theme by adding `test=true` or `backend=osm-test` +as [URL-paramter](URL_Parameters.md). The import button will show up then. If in testmode, you can read the +changeset-XML directly in the web console. In the case that MapComplete is pointed to the testing grounds, the edit will +be made on https://master.apis.dev.openstreetmap.org #### Specifying which tags to copy or add The argument `tags` of the import button takes a `;`-seperated list of tags to add. -These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number`. -This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. +These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number` +. This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved +in `number` in the original feature. If a value to substitute is undefined, empty string will be used instead. This supports multiple values, e.g. `ref=$source:geometry:type/$source:geometry:ref` -Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name (matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special rendering... +Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name ( +matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special +rendering... -Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) - - - - +Note that these values can be prepare with javascript in the theme by using +a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) name | default | description ------ | --------- | ------------- -targetLayer | _undefined_ | The id of the layer where this point should end up. This is not very strict, it will simply result in checking that this layer is shown preventing possible duplicate elements +targetLayer | _ +undefined_ | The id of the layer where this point should end up. This is not very strict, it will simply result in checking that this layer is shown preventing possible duplicate elements tags | _undefined_ | The tags to add onto the new object - see specification above text | Import this data into OpenStreetMap | The text to show on the button icon | ./assets/svg/addSmall.svg | A nice icon to show in the button minzoom | 18 | How far the contributor must zoom in before being able to import the point -Snap onto layer(s)/replace geometry with this other way | _undefined_ | - If the value corresponding with this key starts with 'way/' and the feature is a LineString or Polygon, the original OSM-way geometry will be changed to match the new geometry - - If a way of the given layer(s) is closeby, will snap the new point onto this way (similar as preset might snap). To show multiple layers to snap onto, use a `;`-seperated list -snap max distance | 5 | The maximum distance that this point will move to snap onto a layer (in meters) - -#### Example usage +Snap onto layer(s)/replace geometry with this other way | _ +undefined_ | - If the value corresponding with this key starts with 'way/' and the feature is a LineString or Polygon, the original OSM-way geometry will be changed to match the new geometry - `{import_button(,,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,18,,5)}` +- If a way of the given layer(s) is closeby, will snap the new point onto this way (similar as preset might snap). To + show multiple layers to snap onto, use a `;`-seperated list snap max distance | 5 | The maximum distance that this + point will move to snap onto a layer (in meters) +#### Example usage -### multi_apply +`{import_button(,,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,18,,5)}` - A button to apply the tagging of this object onto a list of other features. This is an advanced feature for which you'll need calculatedTags +### multi_apply + +A button to apply the tagging of this object onto a list of other features. This is an advanced feature for which you'll +need calculatedTags name | default | description ------ | --------- | ------------- feature_ids | _undefined_ | A JSOn-serialized list of IDs of features to apply the tagging on -keys | _undefined_ | One key (or multiple keys, seperated by ';') of the attribute that should be copied onto the other features. +keys | _ +undefined_ | One key (or multiple keys, seperated by ';') of the attribute that should be copied onto the other features. text | _undefined_ | The text to show on the button -autoapply | _undefined_ | A boolean indicating wether this tagging should be applied automatically if the relevant tags on this object are changed. A visual element indicating the multi_apply is still shown -overwrite | _undefined_ | If set to 'true', the tags on the other objects will always be overwritten. The default behaviour will be to only change the tags on other objects if they are either undefined or had the same value before the change - -#### Example usage +autoapply | _ +undefined_ | A boolean indicating wether this tagging should be applied automatically if the relevant tags on this object are changed. A visual element indicating the multi_apply is still shown +overwrite | _ +undefined_ | If set to 'true', the tags on the other objects will always be overwritten. The default behaviour will be to only change the tags on other objects if they are either undefined or had the same value before the change - {multi_apply(_features_with_the_same_name_within_100m, name:etymology:wikidata;name:etymology, Apply etymology information on all nearby objects with the same name)} +#### Example usage +{multi_apply(_features_with_the_same_name_within_100m, name:etymology:wikidata;name:etymology, Apply etymology +information on all nearby objects with the same name)} -### tag_apply +### tag_apply - Shows a big button; clicking this button will apply certain tags onto the feature. +Shows a big button; clicking this button will apply certain tags onto the feature. -The first argument takes a specification of which tags to add. -These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number`. -This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. +The first argument takes a specification of which tags to add. These can either be a tag to add, such +as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number`. This new point will then have the +tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. If a value to substitute is undefined, empty string will be used instead. This supports multiple values, e.g. `ref=$source:geometry:type/$source:geometry:ref` -Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name (matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special rendering... +Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name ( +matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special +rendering... -Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) - +Note that these values can be prepare with javascript in the theme by using +a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) name | default | description ------ | --------- | ------------- tags_to_apply | _undefined_ | A specification of the tags to apply message | _undefined_ | The text to show to the contributor image | _undefined_ | An image to show to the contributor on the button -id_of_object_to_apply_this_one | _undefined_ | If specified, applies the the tags onto _another_ object. The id will be read from properties[id_of_object_to_apply_this_one] of the selected object. The tags are still calculated based on the tags of the _selected_ element - -#### Example usage +id_of_object_to_apply_this_one | _undefined_ | If specified, applies the the tags onto _ +another_ object. The id will be read from properties[id_of_object_to_apply_this_one] of the selected object. The tags are still calculated based on the tags of the _ +selected_ element - `{tag_apply(survey_date:=$_now:date, Surveyed today!)}` Generated from UI/SpecialVisualisations.ts \ No newline at end of file +#### Example usage + +`{tag_apply(survey_date:=$_now:date, Surveyed today!)}` Generated from UI/SpecialVisualisations.ts \ No newline at end of file diff --git a/Docs/Tools/GenPlot.py b/Docs/Tools/GenPlot.py index 62ab890da..62419829a 100644 --- a/Docs/Tools/GenPlot.py +++ b/Docs/Tools/GenPlot.py @@ -1,7 +1,7 @@ -from datetime import datetime -from matplotlib import pyplot import json import sys +from datetime import datetime +from matplotlib import pyplot def pyplot_init(): @@ -9,54 +9,55 @@ def pyplot_init(): pyplot.figure(figsize=(14, 8), dpi=200) pyplot.xticks(rotation='vertical') pyplot.grid() - + def genKeys(data, type): keys = map(lambda kv: kv["key"], data) if type == "date": - keys = map(lambda key : datetime.strptime(key, "%Y-%m-%dT%H:%M:%S.000Z"), keys) + keys = map(lambda key: datetime.strptime(key, "%Y-%m-%dT%H:%M:%S.000Z"), keys) return list(keys) + def createPie(options): data = options["plot"]["count"] keys = genKeys(data, options["interpetKeysAs"]) values = list(map(lambda kv: kv["value"], data)) - - total = sum(map(lambda kv : kv["value"], data)) + + total = sum(map(lambda kv: kv["value"], data)) first_pct = data[0]["value"] / total - + pyplot_init() pyplot.pie(values, labels=keys, startangle=(90 - 360 * first_pct / 2)) - + + def createBar(options): data = options["plot"]["count"] keys = genKeys(data, options["interpetKeysAs"]) values = list(map(lambda kv: kv["value"], data)) - + pyplot.bar(keys, values, label=options["name"]) pyplot.legend() - pyplot_init() title = sys.argv[1] pyplot.title = title names = [] -while(True): +while (True): line = sys.stdin.readline() if line == "" or line == "\n": - if(len(names) > 1): - pyplot.legend(loc="upper left", ncol=3) - pyplot.savefig(title+".png", dpi=400, facecolor='w', edgecolor='w', + if (len(names) > 1): + pyplot.legend(loc="upper left", ncol=3) + pyplot.savefig(title + ".png", dpi=400, facecolor='w', edgecolor='w', bbox_inches='tight') break - + options = json.loads(line) - print("Creating "+options["plot"]["type"]+" '"+options["name"]+"'") + print("Creating " + options["plot"]["type"] + " '" + options["name"] + "'") names.append(options["name"]) - if(options["plot"]["type"] == "pie"): + if (options["plot"]["type"] == "pie"): createPie(options) - elif(options["plot"]["type"] == "bar"): + elif (options["plot"]["type"] == "bar"): createBar(options) else: - print("Unkown type: "+options.type) \ No newline at end of file + print("Unkown type: " + options.type) diff --git a/Docs/URL_Parameters.md b/Docs/URL_Parameters.md index a27eadc97..1c98a6877 100644 --- a/Docs/URL_Parameters.md +++ b/Docs/URL_Parameters.md @@ -1,4 +1,3 @@ - URL-parameters and URL-hash ============================ @@ -9,8 +8,8 @@ What is a URL parameter? URL-parameters are extra parts of the URL used to set the state. -For example, if the url is `https://mapcomplete.osm.be/cyclofix?lat=51.0&lon=4.3&z=5&test=true#node/1234`, -the URL-parameters are stated in the part between the `?` and the `#`. There are multiple, all separated by `&`, namely: +For example, if the url is `https://mapcomplete.osm.be/cyclofix?lat=51.0&lon=4.3&z=5&test=true#node/1234`, the +URL-parameters are stated in the part between the `?` and the `#`. There are multiple, all separated by `&`, namely: - The url-parameter `lat` is `51.0` in this instance - The url-parameter `lon` is `4.3` in this instance @@ -20,139 +19,145 @@ the URL-parameters are stated in the part between the `?` and the `#`. There are Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case. - fs-userbadge +fs-userbadge -------------- - Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus disables editing all together, effectively putting MapComplete into read-only mode. The default value is _true_ +Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus +disables editing all together, effectively putting MapComplete into read-only mode. The default value is _true_ - fs-search +fs-search ----------- - Disables/Enables the search bar The default value is _true_ +Disables/Enables the search bar The default value is _true_ - fs-background +fs-background --------------- - Disables/Enables the background layer control The default value is _true_ +Disables/Enables the background layer control The default value is _true_ - fs-filter +fs-filter ----------- - Disables/Enables the filter The default value is _true_ +Disables/Enables the filter The default value is _true_ - fs-add-new +fs-add-new ------------ - Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) The default value is _true_ +Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) The default +value is _true_ - fs-welcome-message +fs-welcome-message -------------------- - Disables/enables the help menu or welcome message The default value is _true_ +Disables/enables the help menu or welcome message The default value is _true_ - fs-iframe-popout +fs-iframe-popout ------------------ - Disables/Enables the iframe-popout button. If in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch) The default value is _true_ +Disables/Enables the iframe-popout button. If in iframe mode and the welcome message is hidden, a popout button to the +full mapcomplete instance is shown instead (unless disabled with this switch) The default value is _true_ - fs-more-quests +fs-more-quests ---------------- - Disables/Enables the 'More Quests'-tab in the welcome message The default value is _true_ +Disables/Enables the 'More Quests'-tab in the welcome message The default value is _true_ - fs-share-screen +fs-share-screen ----------------- - Disables/Enables the 'Share-screen'-tab in the welcome message The default value is _true_ +Disables/Enables the 'Share-screen'-tab in the welcome message The default value is _true_ - fs-geolocation +fs-geolocation ---------------- - Disables/Enables the geolocation button The default value is _true_ +Disables/Enables the geolocation button The default value is _true_ - fs-all-questions +fs-all-questions ------------------ - Always show all questions The default value is _false_ +Always show all questions The default value is _false_ - fs-export +fs-export ----------- - Enable the export as GeoJSON and CSV button The default value is _false_ +Enable the export as GeoJSON and CSV button The default value is _false_ - fs-pdf +fs-pdf -------- - Enable the PDF download button The default value is _false_ +Enable the PDF download button The default value is _false_ - backend +backend --------- - The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test' The default value is _osm_ +The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test' The default +value is _osm_ - test +test ------ - If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org The default value is _false_ +If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the +console instead of actually uploaded to osm.org The default value is _false_ - debug +debug ------- - If true, shows some extra debugging help such as all the available tags on every object The default value is _false_ +If true, shows some extra debugging help such as all the available tags on every object The default value is _false_ - fake-user +fake-user ----------- - If true, 'dryrun' mode is activated and a fake user account is loaded The default value is _false_ +If true, 'dryrun' mode is activated and a fake user account is loaded The default value is _false_ - overpassUrl +overpassUrl ------------- - Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter The default value is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_ +Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter The default value +is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_ - overpassTimeout +overpassTimeout ----------------- - Set a different timeout (in seconds) for queries in overpass The default value is _30_ +Set a different timeout (in seconds) for queries in overpass The default value is _30_ - overpassMaxZoom +overpassMaxZoom ----------------- - point to switch between OSM-api and overpass The default value is _17_ +point to switch between OSM-api and overpass The default value is _17_ - osmApiTileSize +osmApiTileSize ---------------- - Tilesize when the OSM-API is used to fetch data within a BBOX The default value is _18_ +Tilesize when the OSM-API is used to fetch data within a BBOX The default value is _18_ - background +background ------------ - The id of the background layer to start with The default value is _osm_ +The id of the background layer to start with The default value is _osm_ - layer- +layer- ------------------ - Wether or not the layer with id is shown The default value is _true_ Generated from QueryParameters \ No newline at end of file +Wether or not the layer with id is shown The default value is _true_ Generated from QueryParameters \ No newline at end of file diff --git a/Logic/Actors/AvailableBaseLayers.ts b/Logic/Actors/AvailableBaseLayers.ts index 89a5435e6..c7b84247b 100644 --- a/Logic/Actors/AvailableBaseLayers.ts +++ b/Logic/Actors/AvailableBaseLayers.ts @@ -5,8 +5,10 @@ import Loc from "../../Models/Loc"; export interface AvailableBaseLayersObj { readonly osmCarto: BaseLayer; layerOverview: BaseLayer[]; - AvailableLayersAt(location: UIEventSource): UIEventSource - SelectBestLayerAccordingTo(location: UIEventSource, preferedCategory: UIEventSource): UIEventSource ; + + AvailableLayersAt(location: UIEventSource): UIEventSource + + SelectBestLayerAccordingTo(location: UIEventSource, preferedCategory: UIEventSource): UIEventSource; } @@ -15,13 +17,13 @@ export interface AvailableBaseLayersObj { * Changes the basemap */ export default class AvailableBaseLayers { - - + + public static layerOverview: BaseLayer[]; public static osmCarto: BaseLayer; private static implementation: AvailableBaseLayersObj - + static AvailableLayersAt(location: UIEventSource): UIEventSource { return AvailableBaseLayers.implementation?.AvailableLayersAt(location) ?? new UIEventSource([]); } @@ -31,7 +33,7 @@ export default class AvailableBaseLayers { } - public static implement(backend: AvailableBaseLayersObj){ + public static implement(backend: AvailableBaseLayersObj) { AvailableBaseLayers.layerOverview = backend.layerOverview AvailableBaseLayers.osmCarto = backend.osmCarto AvailableBaseLayers.implementation = backend diff --git a/Logic/Actors/AvailableBaseLayersImplementation.ts b/Logic/Actors/AvailableBaseLayersImplementation.ts index 09f5cfe42..880311eb4 100644 --- a/Logic/Actors/AvailableBaseLayersImplementation.ts +++ b/Logic/Actors/AvailableBaseLayersImplementation.ts @@ -3,13 +3,13 @@ import {UIEventSource} from "../UIEventSource"; import Loc from "../../Models/Loc"; import {GeoOperations} from "../GeoOperations"; import * as editorlayerindex from "../../assets/editor-layer-index.json"; +import * as L from "leaflet"; import {TileLayer} from "leaflet"; import * as X from "leaflet-providers"; -import * as L from "leaflet"; import {Utils} from "../../Utils"; import {AvailableBaseLayersObj} from "./AvailableBaseLayers"; -export default class AvailableBaseLayersImplementation implements AvailableBaseLayersObj{ +export default class AvailableBaseLayersImplementation implements AvailableBaseLayersObj { public readonly osmCarto: BaseLayer = { @@ -28,102 +28,6 @@ export default class AvailableBaseLayersImplementation implements AvailableBaseL public layerOverview = AvailableBaseLayersImplementation.LoadRasterIndex().concat(AvailableBaseLayersImplementation.LoadProviderIndex()); - public AvailableLayersAt(location: UIEventSource): UIEventSource { - const source = location.map( - (currentLocation) => { - - if (currentLocation === undefined) { - return this.layerOverview; - } - - const currentLayers = source?.data; // A bit unorthodox - I know - const newLayers = this.CalculateAvailableLayersAt(currentLocation?.lon, currentLocation?.lat); - - if (currentLayers === undefined) { - return newLayers; - } - if (newLayers.length !== currentLayers.length) { - return newLayers; - } - for (let i = 0; i < newLayers.length; i++) { - if (newLayers[i].name !== currentLayers[i].name) { - return newLayers; - } - } - - return currentLayers; - }); - return source; - } - - public SelectBestLayerAccordingTo(location: UIEventSource, preferedCategory: UIEventSource): UIEventSource { - return this.AvailableLayersAt(location).map(available => { - // First float all 'best layers' to the top - available.sort((a, b) => { - if (a.isBest && b.isBest) { - return 0; - } - if (!a.isBest) { - return 1 - } - - return -1; - } - ) - - if (preferedCategory.data === undefined) { - return available[0] - } - - let prefered: string [] - if (typeof preferedCategory.data === "string") { - prefered = [preferedCategory.data] - } else { - prefered = preferedCategory.data; - } - - prefered.reverse(); - for (const category of prefered) { - //Then sort all 'photo'-layers to the top. Stability of the sorting will force a 'best' photo layer on top - available.sort((a, b) => { - if (a.category === category && b.category === category) { - return 0; - } - if (a.category !== category) { - return 1 - } - - return -1; - } - ) - } - return available[0] - }) - } - - private CalculateAvailableLayersAt(lon: number, lat: number): BaseLayer[] { - const availableLayers = [this.osmCarto] - const globalLayers = []; - for (const layerOverviewItem of this.layerOverview) { - const layer = layerOverviewItem; - - if (layer.feature?.geometry === undefined || layer.feature?.geometry === null) { - globalLayers.push(layer); - continue; - } - - if (lon === undefined || lat === undefined) { - continue; - } - - if (GeoOperations.inside([lon, lat], layer.feature)) { - availableLayers.push(layer); - } - } - - return availableLayers.concat(globalLayers); - } - private static LoadRasterIndex(): BaseLayer[] { const layers: BaseLayer[] = [] // @ts-ignore @@ -289,4 +193,100 @@ export default class AvailableBaseLayersImplementation implements AvailableBaseL subdomains: domains }); } + + public AvailableLayersAt(location: UIEventSource): UIEventSource { + const source = location.map( + (currentLocation) => { + + if (currentLocation === undefined) { + return this.layerOverview; + } + + const currentLayers = source?.data; // A bit unorthodox - I know + const newLayers = this.CalculateAvailableLayersAt(currentLocation?.lon, currentLocation?.lat); + + if (currentLayers === undefined) { + return newLayers; + } + if (newLayers.length !== currentLayers.length) { + return newLayers; + } + for (let i = 0; i < newLayers.length; i++) { + if (newLayers[i].name !== currentLayers[i].name) { + return newLayers; + } + } + + return currentLayers; + }); + return source; + } + + public SelectBestLayerAccordingTo(location: UIEventSource, preferedCategory: UIEventSource): UIEventSource { + return this.AvailableLayersAt(location).map(available => { + // First float all 'best layers' to the top + available.sort((a, b) => { + if (a.isBest && b.isBest) { + return 0; + } + if (!a.isBest) { + return 1 + } + + return -1; + } + ) + + if (preferedCategory.data === undefined) { + return available[0] + } + + let prefered: string [] + if (typeof preferedCategory.data === "string") { + prefered = [preferedCategory.data] + } else { + prefered = preferedCategory.data; + } + + prefered.reverse(); + for (const category of prefered) { + //Then sort all 'photo'-layers to the top. Stability of the sorting will force a 'best' photo layer on top + available.sort((a, b) => { + if (a.category === category && b.category === category) { + return 0; + } + if (a.category !== category) { + return 1 + } + + return -1; + } + ) + } + return available[0] + }) + } + + private CalculateAvailableLayersAt(lon: number, lat: number): BaseLayer[] { + const availableLayers = [this.osmCarto] + const globalLayers = []; + for (const layerOverviewItem of this.layerOverview) { + const layer = layerOverviewItem; + + if (layer.feature?.geometry === undefined || layer.feature?.geometry === null) { + globalLayers.push(layer); + continue; + } + + if (lon === undefined || lat === undefined) { + continue; + } + + if (GeoOperations.inside([lon, lat], layer.feature)) { + availableLayers.push(layer); + } + } + + return availableLayers.concat(globalLayers); + } } \ No newline at end of file diff --git a/Logic/Actors/BackgroundLayerResetter.ts b/Logic/Actors/BackgroundLayerResetter.ts index 60666c53d..f8c73892e 100644 --- a/Logic/Actors/BackgroundLayerResetter.ts +++ b/Logic/Actors/BackgroundLayerResetter.ts @@ -13,11 +13,11 @@ export default class BackgroundLayerResetter { location: UIEventSource, availableLayers: UIEventSource, defaultLayerId: string = undefined) { - - if(Utils.runningFromConsole){ + + if (Utils.runningFromConsole) { return } - + defaultLayerId = defaultLayerId ?? AvailableBaseLayers.osmCarto.id; // Change the baselayer back to OSM if we go out of the current range of the layer diff --git a/Logic/Actors/GeoLocationHandler.ts b/Logic/Actors/GeoLocationHandler.ts index c508f8902..e997afec5 100644 --- a/Logic/Actors/GeoLocationHandler.ts +++ b/Logic/Actors/GeoLocationHandler.ts @@ -8,9 +8,9 @@ import FeatureSource from "../FeatureSource/FeatureSource"; import StaticFeatureSource from "../FeatureSource/Sources/StaticFeatureSource"; export default class GeoLocationHandler extends VariableUiElement { - - public readonly currentLocation : FeatureSource - + + public readonly currentLocation: FeatureSource + /** * Wether or not the geolocation is active, aka the user requested the current location * @private @@ -182,25 +182,25 @@ export default class GeoLocationHandler extends VariableUiElement { } }) - this.currentLocation = new StaticFeatureSource([], false) + this.currentLocation = new StaticFeatureSource([], false) this._currentGPSLocation.addCallback((location) => { self._previousLocationGrant.setData("granted"); const feature = { "type": "Feature", properties: { - "user:location":"yes", - "accuracy":location.accuracy, - "speed":location.speed, + "user:location": "yes", + "accuracy": location.accuracy, + "speed": location.speed, }, - geometry:{ - type:"Point", + geometry: { + type: "Point", coordinates: [location.longitude, location.latitude], } } - + self.currentLocation.features.setData([{feature, freshness: new Date()}]) - + const timeSinceRequest = (new Date().getTime() - (self._lastUserRequest?.getTime() ?? 0)) / 1000; if (timeSinceRequest < 30) { @@ -210,7 +210,7 @@ export default class GeoLocationHandler extends VariableUiElement { } }); - + } private init(askPermission: boolean, zoomToLocation: boolean) { @@ -279,7 +279,7 @@ export default class GeoLocationHandler extends VariableUiElement { ); } else { const currentZoom = this._leafletMap.data.getZoom() - + this._leafletMap.data.setView([location.latitude, location.longitude], Math.max(targetZoom ?? 0, currentZoom)); } } diff --git a/Logic/Actors/OverpassFeatureSource.ts b/Logic/Actors/OverpassFeatureSource.ts index 49c605137..feb09f952 100644 --- a/Logic/Actors/OverpassFeatureSource.ts +++ b/Logic/Actors/OverpassFeatureSource.ts @@ -113,8 +113,7 @@ export default class OverpassFeatureSource implements FeatureSource { let data: any = undefined let date: Date = undefined let lastUsed = 0; - - + const layersToDownload = [] for (const layer of this.state.layoutToUse.layers) { @@ -137,7 +136,7 @@ export default class OverpassFeatureSource implements FeatureSource { const self = this; const overpassUrls = self.state.overpassUrl.data - let bounds : BBox + let bounds: BBox do { try { @@ -180,9 +179,9 @@ export default class OverpassFeatureSource implements FeatureSource { } } while (data === undefined && this._isActive.data); - + try { - if(data === undefined){ + if (data === undefined) { return undefined } data.features.forEach(feature => SimpleMetaTagger.objectMetaInfo.applyMetaTagsOnFeature(feature, date, undefined)); diff --git a/Logic/Actors/PendingChangesUploader.ts b/Logic/Actors/PendingChangesUploader.ts index 675491467..f123123d1 100644 --- a/Logic/Actors/PendingChangesUploader.ts +++ b/Logic/Actors/PendingChangesUploader.ts @@ -31,10 +31,10 @@ export default class PendingChangesUploader { } }); - if(Utils.runningFromConsole){ + if (Utils.runningFromConsole) { return; } - + document.addEventListener('mouseout', e => { // @ts-ignore if (!e.toElement && !e.relatedTarget) { diff --git a/Logic/Actors/SelectedFeatureHandler.ts b/Logic/Actors/SelectedFeatureHandler.ts index aba97ecb1..3089be2cb 100644 --- a/Logic/Actors/SelectedFeatureHandler.ts +++ b/Logic/Actors/SelectedFeatureHandler.ts @@ -10,7 +10,7 @@ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; * Makes sure the hash shows the selected element and vice-versa. */ export default class SelectedFeatureHandler { - private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "filters","", undefined]) + private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "filters", "", undefined]) private readonly hash: UIEventSource; private readonly state: { selectedElement: UIEventSource, @@ -88,7 +88,7 @@ export default class SelectedFeatureHandler { if (!(hash.startsWith("node") || hash.startsWith("way") || hash.startsWith("relation"))) { return; } - + OsmObject.DownloadObjectAsync(hash).then(obj => { @@ -114,7 +114,7 @@ export default class SelectedFeatureHandler { // Hash has been cleared - we clear the selected element state.selectedElement.setData(undefined); } else { - + // we search the element to select const feature = state.allElements.ContainingFeatures.get(h) if (feature === undefined) { diff --git a/Logic/Actors/StrayClickHandler.ts b/Logic/Actors/StrayClickHandler.ts index bdf79d162..1cde81871 100644 --- a/Logic/Actors/StrayClickHandler.ts +++ b/Logic/Actors/StrayClickHandler.ts @@ -80,6 +80,5 @@ export default class StrayClickHandler { } - } \ No newline at end of file diff --git a/Logic/Actors/TitleHandler.ts b/Logic/Actors/TitleHandler.ts index d3d2f78fb..0da9bb4de 100644 --- a/Logic/Actors/TitleHandler.ts +++ b/Logic/Actors/TitleHandler.ts @@ -8,7 +8,7 @@ import {ElementStorage} from "../ElementStorage"; import {Utils} from "../../Utils"; export default class TitleHandler { - constructor(state : { + constructor(state: { selectedElement: UIEventSource, layoutToUse: LayoutConfig, allElements: ElementStorage @@ -39,7 +39,7 @@ export default class TitleHandler { currentTitle.addCallbackAndRunD(title => { - if(Utils.runningFromConsole){ + if (Utils.runningFromConsole) { return } document.title = title diff --git a/Logic/BBox.ts b/Logic/BBox.ts index ccd320125..436f00125 100644 --- a/Logic/BBox.ts +++ b/Logic/BBox.ts @@ -4,11 +4,11 @@ import {GeoOperations} from "./GeoOperations"; export class BBox { + static global: BBox = new BBox([[-180, -90], [180, 90]]); readonly maxLat: number; readonly maxLon: number; readonly minLat: number; readonly minLon: number; - static global: BBox = new BBox([[-180, -90], [180, 90]]); constructor(coordinates) { this.maxLat = -90; @@ -45,6 +45,17 @@ export class BBox { return feature.bbox; } + static fromTile(z: number, x: number, y: number): BBox { + return new BBox(Tiles.tile_bounds_lon_lat(z, x, y)) + } + + static fromTileIndex(i: number): BBox { + if (i === 0) { + return BBox.global + } + return BBox.fromTile(...Tiles.tile_from_index(i)) + } + /** * Constructs a tilerange which fully contains this bbox (thus might be a bit larger) * @param zoomlevel @@ -83,24 +94,6 @@ export class BBox { return true; } - private check() { - if (isNaN(this.maxLon) || isNaN(this.maxLat) || isNaN(this.minLon) || isNaN(this.minLat)) { - console.log(this); - throw "BBOX has NAN"; - } - } - - static fromTile(z: number, x: number, y: number): BBox { - return new BBox(Tiles.tile_bounds_lon_lat(z, x, y)) - } - - static fromTileIndex(i: number): BBox { - if (i === 0) { - return BBox.global - } - return BBox.fromTile(...Tiles.tile_from_index(i)) - } - getEast() { return this.maxLon } @@ -116,10 +109,10 @@ export class BBox { getSouth() { return this.minLat } - - contains(lonLat: [number, number]){ + + contains(lonLat: [number, number]) { return this.minLat <= lonLat[1] && lonLat[1] <= this.maxLat - && this.minLon<= lonLat[0] && lonLat[0] <= this.maxLon + && this.minLon <= lonLat[0] && lonLat[0] <= this.maxLon } pad(factor: number, maxIncrease = 2): BBox { @@ -179,4 +172,11 @@ export class BBox { } + + private check() { + if (isNaN(this.maxLon) || isNaN(this.maxLat) || isNaN(this.minLon) || isNaN(this.minLat)) { + console.log(this); + throw "BBOX has NAN"; + } + } } \ No newline at end of file diff --git a/Logic/ContributorCount.ts b/Logic/ContributorCount.ts index f39d1106f..08eb496c5 100644 --- a/Logic/ContributorCount.ts +++ b/Logic/ContributorCount.ts @@ -8,6 +8,7 @@ export default class ContributorCount { public readonly Contributors: UIEventSource> = new UIEventSource>(new Map()); private readonly state: { featurePipeline: FeaturePipeline, currentBounds: UIEventSource, locationControl: UIEventSource }; + private lastUpdate: Date = undefined; constructor(state: { featurePipeline: FeaturePipeline, currentBounds: UIEventSource, locationControl: UIEventSource }) { this.state = state; @@ -16,15 +17,13 @@ export default class ContributorCount { self.update(bbox) }) state.featurePipeline.runningQuery.addCallbackAndRun( - _ => self.update(state.currentBounds.data) + _ => self.update(state.currentBounds.data) ) - + } - private lastUpdate: Date = undefined; - private update(bbox: BBox) { - if(bbox === undefined){ + if (bbox === undefined) { return; } const now = new Date(); diff --git a/Logic/DetermineLayout.ts b/Logic/DetermineLayout.ts index b29e5f8b5..872b5b3e9 100644 --- a/Logic/DetermineLayout.ts +++ b/Logic/DetermineLayout.ts @@ -61,43 +61,10 @@ export default class DetermineLayout { layer.minzoom = Math.max(16, layer.minzoom) } } - + return [layoutToUse, undefined] } - private static async LoadRemoteTheme(link: string): Promise { - console.log("Downloading map theme from ", link); - - new FixedUiElement(`Downloading the theme from the link...`) - .AttachTo("centermessage"); - - try { - - const parsed = await Utils.downloadJson(link) - console.log("Got ", parsed) - LegacyJsonConvert.fixThemeConfig(parsed) - try { - parsed.id = link; - return new LayoutConfig(parsed, false).patchImages(link, JSON.stringify(parsed)); - } catch (e) { - console.error(e) - DetermineLayout.ShowErrorOnCustomTheme( - `${link} is invalid:`, - new FixedUiElement(e) - ) - return null; - } - - } catch (e) { - console.error(e) - DetermineLayout.ShowErrorOnCustomTheme( - `${link} is invalid - probably not found or invalid JSON:`, - new FixedUiElement(e) - ) - return null; - } - } - public static LoadLayoutFromHash( userLayoutParam: UIEventSource ): [LayoutConfig, string] | null { @@ -166,4 +133,37 @@ export default class DetermineLayout { .AttachTo("centermessage"); } + private static async LoadRemoteTheme(link: string): Promise { + console.log("Downloading map theme from ", link); + + new FixedUiElement(`Downloading the theme from the link...`) + .AttachTo("centermessage"); + + try { + + const parsed = await Utils.downloadJson(link) + console.log("Got ", parsed) + LegacyJsonConvert.fixThemeConfig(parsed) + try { + parsed.id = link; + return new LayoutConfig(parsed, false).patchImages(link, JSON.stringify(parsed)); + } catch (e) { + console.error(e) + DetermineLayout.ShowErrorOnCustomTheme( + `${link} is invalid:`, + new FixedUiElement(e) + ) + return null; + } + + } catch (e) { + console.error(e) + DetermineLayout.ShowErrorOnCustomTheme( + `${link} is invalid - probably not found or invalid JSON:`, + new FixedUiElement(e) + ) + return null; + } + } + } \ No newline at end of file diff --git a/Logic/ElementStorage.ts b/Logic/ElementStorage.ts index ae51094ae..b64ac18ef 100644 --- a/Logic/ElementStorage.ts +++ b/Logic/ElementStorage.ts @@ -39,10 +39,10 @@ export class ElementStorage { } getEventSourceById(elementId): UIEventSource { - if(elementId === undefined){ + if (elementId === undefined) { return undefined; } - return this._elements.get(elementId); + return this._elements.get(elementId); } has(id) { diff --git a/Logic/ExtraFunction.ts b/Logic/ExtraFunction.ts index a3e12567f..2bb238f54 100644 --- a/Logic/ExtraFunction.ts +++ b/Logic/ExtraFunction.ts @@ -64,7 +64,7 @@ export class ExtraFunction { }, (params, feat) => { return (...layerIds: string[]) => { - const result : {feat:any, overlap: number}[]= [] + const result: { feat: any, overlap: number }[] = [] const bbox = BBox.get(feat) @@ -80,9 +80,9 @@ export class ExtraFunction { result.push(...GeoOperations.calculateOverlap(feat, otherLayer)); } } - + result.sort((a, b) => b.overlap - a.overlap) - + return result; } } @@ -181,7 +181,7 @@ export class ExtraFunction { } try { const parsed = JSON.parse(value) - if(parsed === null){ + if (parsed === null) { return undefined; } return parsed; diff --git a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts index 83a269b89..4bbba043f 100644 --- a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts +++ b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts @@ -39,7 +39,7 @@ export default class SaveTileToLocalStorageActor { } } - public static poison(layers: string[], lon: number, lat: number) { + public static poison(layers: string[], lon: number, lat: number) { for (let z = 0; z < 25; z++) { const {x, y} = Tiles.embedded_tile(lat, lon, z) diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts index 4e90f1616..17c753ccf 100644 --- a/Logic/FeatureSource/FeaturePipeline.ts +++ b/Logic/FeatureSource/FeaturePipeline.ts @@ -129,7 +129,7 @@ export default class FeaturePipeline { // This will already contain the merged features for this tile. In other words, this will only be triggered once for every tile const srcFiltered = new FilteringFeatureSource(state, src.tileIndex, - new ChangeGeometryApplicator(src, state.changes) + new ChangeGeometryApplicator(src, state.changes) ) handleFeatureSource(srcFiltered) @@ -147,7 +147,7 @@ export default class FeaturePipeline { this.freshnesses.set(id, new TileFreshnessCalculator()) - if(id === "type_node"){ + if (id === "type_node") { // Handles by the 'FullNodeDatabaseSource' continue; } @@ -226,15 +226,15 @@ export default class FeaturePipeline { self.freshnesses.get(flayer.layerDef.id).addTileLoad(tileId, new Date()) }) }) - - if(state.layoutToUse.trackAllNodes){ - const fullNodeDb = new FullNodeDatabaseSource( - state.filteredLayers.data.filter(l => l.layerDef.id === "type_node")[0], - tile => { - new RegisteringAllFromFeatureSourceActor(tile) - perLayerHierarchy.get(tile.layer.layerDef.id).registerTile(tile) - tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) - }) + + if (state.layoutToUse.trackAllNodes) { + const fullNodeDb = new FullNodeDatabaseSource( + state.filteredLayers.data.filter(l => l.layerDef.id === "type_node")[0], + tile => { + new RegisteringAllFromFeatureSourceActor(tile) + perLayerHierarchy.get(tile.layer.layerDef.id).registerTile(tile) + tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) + }) osmFeatureSource.rawDataHandlers.push((osmJson, tileId) => fullNodeDb.handleOsmJson(osmJson, tileId)) } @@ -299,6 +299,34 @@ export default class FeaturePipeline { } + public GetAllFeaturesWithin(bbox: BBox): any[][] { + const self = this + const tiles = [] + Array.from(this.perLayerHierarchy.keys()) + .forEach(key => tiles.push(...self.GetFeaturesWithin(key, bbox))) + return tiles; + } + + public GetFeaturesWithin(layerId: string, bbox: BBox): any[][] { + if (layerId === "*") { + return this.GetAllFeaturesWithin(bbox) + } + const requestedHierarchy = this.perLayerHierarchy.get(layerId) + if (requestedHierarchy === undefined) { + console.warn("Layer ", layerId, "is not defined. Try one of ", Array.from(this.perLayerHierarchy.keys())) + return undefined; + } + return TileHierarchyTools.getTiles(requestedHierarchy, bbox) + .filter(featureSource => featureSource.features?.data !== undefined) + .map(featureSource => featureSource.features.data.map(fs => fs.feature)) + } + + public GetTilesPerLayerWithin(bbox: BBox, handleTile: (tile: FeatureSourceForLayer & Tiled) => void) { + Array.from(this.perLayerHierarchy.values()).forEach(hierarchy => { + TileHierarchyTools.getTiles(hierarchy, bbox).forEach(handleTile) + }) + } + private freshnessForVisibleLayers(z: number, x: number, y: number): Date { let oldestDate = undefined; for (const flayer of this.state.filteredLayers.data) { @@ -438,32 +466,4 @@ export default class FeaturePipeline { } - public GetAllFeaturesWithin(bbox: BBox): any[][] { - const self = this - const tiles = [] - Array.from(this.perLayerHierarchy.keys()) - .forEach(key => tiles.push(...self.GetFeaturesWithin(key, bbox))) - return tiles; - } - - public GetFeaturesWithin(layerId: string, bbox: BBox): any[][] { - if (layerId === "*") { - return this.GetAllFeaturesWithin(bbox) - } - const requestedHierarchy = this.perLayerHierarchy.get(layerId) - if (requestedHierarchy === undefined) { - console.warn("Layer ", layerId, "is not defined. Try one of ", Array.from(this.perLayerHierarchy.keys())) - return undefined; - } - return TileHierarchyTools.getTiles(requestedHierarchy, bbox) - .filter(featureSource => featureSource.features?.data !== undefined) - .map(featureSource => featureSource.features.data.map(fs => fs.feature)) - } - - public GetTilesPerLayerWithin(bbox: BBox, handleTile: (tile: FeatureSourceForLayer & Tiled) => void) { - Array.from(this.perLayerHierarchy.values()).forEach(hierarchy => { - TileHierarchyTools.getTiles(hierarchy, bbox).forEach(handleTile) - }) - } - } \ No newline at end of file diff --git a/Logic/FeatureSource/FeatureSource.ts b/Logic/FeatureSource/FeatureSource.ts index 7d603d1f6..df8b56412 100644 --- a/Logic/FeatureSource/FeatureSource.ts +++ b/Logic/FeatureSource/FeatureSource.ts @@ -1,5 +1,4 @@ import {UIEventSource} from "../UIEventSource"; -import {Utils} from "../../Utils"; import FilteredLayer from "../../Models/FilteredLayer"; import {BBox} from "../BBox"; @@ -19,7 +18,7 @@ export interface Tiled { /** * A feature source which only contains features for the defined layer */ -export interface FeatureSourceForLayer extends FeatureSource{ +export interface FeatureSourceForLayer extends FeatureSource { readonly layer: FilteredLayer } diff --git a/Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts b/Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts index f9a0cbe1a..1338baa4f 100644 --- a/Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts +++ b/Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts @@ -14,9 +14,9 @@ export default class PerLayerFeatureSourceSplitter { constructor(layers: UIEventSource, handleLayerData: (source: FeatureSourceForLayer & Tiled) => void, upstream: FeatureSource, - options?:{ - tileIndex?: number, - handleLeftovers?: (featuresWithoutLayer: any[]) => void + options?: { + tileIndex?: number, + handleLeftovers?: (featuresWithoutLayer: any[]) => void }) { const knownLayers = new Map() @@ -35,6 +35,7 @@ export default class PerLayerFeatureSourceSplitter { const featuresPerLayer = new Map(); const noLayerFound = [] + function addTo(layer: FilteredLayer, feature: { feature, freshness }) { const id = layer.layerDef.id const list = featuresPerLayer.get(id) @@ -80,9 +81,9 @@ export default class PerLayerFeatureSourceSplitter { featureSource.features.setData(features) } } - + // AT last, the leftovers are handled - if(options?.handleLeftovers !== undefined && noLayerFound.length > 0){ + if (options?.handleLeftovers !== undefined && noLayerFound.length > 0) { options.handleLeftovers(noLayerFound) } } diff --git a/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts b/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts index a35879d96..83ab174bd 100644 --- a/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts +++ b/Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts @@ -11,9 +11,9 @@ import {ChangeDescription, ChangeDescriptionTools} from "../../Osm/Actions/Chang export default class ChangeGeometryApplicator implements FeatureSourceForLayer { public readonly features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]); public readonly name: string; + public readonly layer: FilteredLayer private readonly source: IndexedFeatureSource; private readonly changes: Changes; - public readonly layer: FilteredLayer constructor(source: (IndexedFeatureSource & FeatureSourceForLayer), changes: Changes) { this.source = source; @@ -22,10 +22,10 @@ export default class ChangeGeometryApplicator implements FeatureSourceForLayer { this.name = "ChangesApplied(" + source.name + ")" this.features = new UIEventSource<{ feature: any; freshness: Date }[]>(undefined) - + const self = this; source.features.addCallbackAndRunD(_ => self.update()) - + changes.allChanges.addCallbackAndRunD(_ => self.update()) } @@ -52,9 +52,9 @@ export default class ChangeGeometryApplicator implements FeatureSourceForLayer { const changesPerId = new Map() for (const ch of changesToApply) { const key = ch.type + "/" + ch.id - if(changesPerId.has(key)){ + if (changesPerId.has(key)) { changesPerId.get(key).push(ch) - }else{ + } else { changesPerId.set(key, [ch]) } } @@ -66,7 +66,7 @@ export default class ChangeGeometryApplicator implements FeatureSourceForLayer { newFeatures.push(feature) continue; } - + // Allright! We have a feature to rewrite! const copy = { ...feature diff --git a/Logic/FeatureSource/Sources/FeatureSourceMerger.ts b/Logic/FeatureSource/Sources/FeatureSourceMerger.ts index b1797d0ae..99a9b9bc5 100644 --- a/Logic/FeatureSource/Sources/FeatureSourceMerger.ts +++ b/Logic/FeatureSource/Sources/FeatureSourceMerger.ts @@ -5,7 +5,6 @@ import {UIEventSource} from "../../UIEventSource"; import FeatureSource, {FeatureSourceForLayer, IndexedFeatureSource, Tiled} from "../FeatureSource"; import FilteredLayer from "../../../Models/FilteredLayer"; -import {Utils} from "../../../Utils"; import {Tiles} from "../../../Models/TileRange"; import {BBox} from "../../BBox"; @@ -14,17 +13,17 @@ export default class FeatureSourceMerger implements FeatureSourceForLayer, Tiled public features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]); public readonly name; public readonly layer: FilteredLayer - private readonly _sources: UIEventSource; public readonly tileIndex: number; public readonly bbox: BBox; public readonly containedIds: UIEventSource> = new UIEventSource>(new Set()) + private readonly _sources: UIEventSource; constructor(layer: FilteredLayer, tileIndex: number, bbox: BBox, sources: UIEventSource) { this.tileIndex = tileIndex; this.bbox = bbox; this._sources = sources; this.layer = layer; - this.name = "FeatureSourceMerger("+layer.layerDef.id+", "+Tiles.tile_from_index(tileIndex).join(",")+")" + this.name = "FeatureSourceMerger(" + layer.layerDef.id + ", " + Tiles.tile_from_index(tileIndex).join(",") + ")" const self = this; const handledSources = new Set(); diff --git a/Logic/FeatureSource/Sources/FilteringFeatureSource.ts b/Logic/FeatureSource/Sources/FilteringFeatureSource.ts index cf0475d26..d5ed4dc71 100644 --- a/Logic/FeatureSource/Sources/FilteringFeatureSource.ts +++ b/Logic/FeatureSource/Sources/FilteringFeatureSource.ts @@ -18,6 +18,8 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti locationControl: UIEventSource<{ zoom: number }>; selectedElement: UIEventSource, allElements: ElementStorage }; + private readonly _alreadyRegistered = new Set>(); + private readonly _is_dirty = new UIEventSource(false) constructor( state: { @@ -55,24 +57,6 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti this.update(); } - private readonly _alreadyRegistered = new Set>(); - private readonly _is_dirty = new UIEventSource(false) - - private registerCallback(feature: any, layer: LayerConfig) { - const src = this.state.allElements.addOrGetElement(feature) - if (this._alreadyRegistered.has(src)) { - return - } - this._alreadyRegistered.add(src) - if (layer.isShown !== undefined) { - - const self = this; - src.map(tags => layer.isShown?.GetRenderValue(tags, "yes").txt).addCallbackAndRunD(isShown => { - self._is_dirty.setData(true) - }) - } - } - public update() { const self = this; const layer = this.upstream.layer; @@ -116,4 +100,19 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti this._is_dirty.setData(false) } + private registerCallback(feature: any, layer: LayerConfig) { + const src = this.state.allElements.addOrGetElement(feature) + if (this._alreadyRegistered.has(src)) { + return + } + this._alreadyRegistered.add(src) + if (layer.isShown !== undefined) { + + const self = this; + src.map(tags => layer.isShown?.GetRenderValue(tags, "yes").txt).addCallbackAndRunD(isShown => { + self._is_dirty.setData(true) + }) + } + } + } diff --git a/Logic/FeatureSource/Sources/GeoJsonSource.ts b/Logic/FeatureSource/Sources/GeoJsonSource.ts index 68f8fab82..e2269d621 100644 --- a/Logic/FeatureSource/Sources/GeoJsonSource.ts +++ b/Logic/FeatureSource/Sources/GeoJsonSource.ts @@ -15,12 +15,10 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>; public readonly name; public readonly isOsmCache: boolean - private readonly seenids: Set = new Set() public readonly layer: FilteredLayer; - public readonly tileIndex public readonly bbox; - + private readonly seenids: Set = new Set() /** * Only used if the actual source is a tiled geojson. * A big feature might be contained in multiple tiles. @@ -32,7 +30,7 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { public constructor(flayer: FilteredLayer, zxy?: [number, number, number], options?: { - featureIdBlacklist?: UIEventSource> + featureIdBlacklist?: UIEventSource> }) { if (flayer.layerDef.source.geojsonZoomLevel !== undefined && zxy === undefined) { @@ -45,18 +43,18 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { if (zxy !== undefined) { const [z, x, y] = zxy; let tile_bbox = BBox.fromTile(z, x, y) - let bounds : { minLat: number, maxLat: number, minLon: number, maxLon: number } = tile_bbox - if(this.layer.layerDef.source.mercatorCrs){ + let bounds: { minLat: number, maxLat: number, minLon: number, maxLon: number } = tile_bbox + if (this.layer.layerDef.source.mercatorCrs) { bounds = tile_bbox.toMercator() } url = url .replace('{z}', "" + z) .replace('{x}', "" + x) .replace('{y}', "" + y) - .replace('{y_min}',""+bounds.minLat) - .replace('{y_max}',""+bounds.maxLat) - .replace('{x_min}',""+bounds.minLon) - .replace('{x_max}',""+bounds.maxLon) + .replace('{y_min}', "" + bounds.minLat) + .replace('{y_max}', "" + bounds.maxLat) + .replace('{x_min}', "" + bounds.minLon) + .replace('{x_max}', "" + bounds.maxLon) this.tileIndex = Tiles.tile_index(z, x, y) this.bbox = BBox.fromTile(z, x, y) @@ -78,11 +76,11 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { const self = this; Utils.downloadJson(url) .then(json => { - if(json.features === undefined || json.features === null){ + if (json.features === undefined || json.features === null) { return; } - - if(self.layer.layerDef.source.mercatorCrs){ + + if (self.layer.layerDef.source.mercatorCrs) { json = GeoOperations.GeoJsonToWGS84(json) } @@ -109,8 +107,8 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { continue; } self.seenids.add(props.id) - - if(self.featureIdBlacklist?.data?.has(props.id)){ + + if (self.featureIdBlacklist?.data?.has(props.id)) { continue; } @@ -122,7 +120,7 @@ export default class GeoJsonSource implements FeatureSourceForLayer, Tiled { newFeatures.push({feature: feature, freshness: freshness}) } - if ( newFeatures.length == 0) { + if (newFeatures.length == 0) { return; } diff --git a/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts b/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts index bd73f04c2..6b8611d50 100644 --- a/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts +++ b/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts @@ -7,7 +7,7 @@ import State from "../../../State"; export class NewGeometryFromChangesFeatureSource implements FeatureSource { // This class name truly puts the 'Java' into 'Javascript' - + /** * A feature source containing exclusively new elements */ @@ -53,10 +53,10 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource { for (const kv of change.tags) { tags[kv.k] = kv.v } - tags["id"] = change.type+"/"+change.id - + tags["id"] = change.type + "/" + change.id + tags["_backend"] = State.state.osmConnection._oauth_config.url - + switch (change.type) { case "node": const n = new OsmNode(change.id) @@ -85,7 +85,7 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource { } } - + self.features.ping() }) } diff --git a/Logic/FeatureSource/Sources/RememberingSource.ts b/Logic/FeatureSource/Sources/RememberingSource.ts index 683576736..c9a5e97e4 100644 --- a/Logic/FeatureSource/Sources/RememberingSource.ts +++ b/Logic/FeatureSource/Sources/RememberingSource.ts @@ -6,19 +6,19 @@ import FeatureSource, {Tiled} from "../FeatureSource"; import {UIEventSource} from "../../UIEventSource"; import {BBox} from "../../BBox"; -export default class RememberingSource implements FeatureSource , Tiled{ +export default class RememberingSource implements FeatureSource, Tiled { public readonly features: UIEventSource<{ feature: any, freshness: Date }[]>; public readonly name; - public readonly tileIndex : number - public readonly bbox : BBox - + public readonly tileIndex: number + public readonly bbox: BBox + constructor(source: FeatureSource & Tiled) { const self = this; this.name = "RememberingSource of " + source.name; - this.tileIndex= source.tileIndex + this.tileIndex = source.tileIndex this.bbox = source.bbox; - + const empty = []; this.features = source.features.map(features => { const oldFeatures = self.features?.data ?? empty; diff --git a/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts b/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts index eb0d4b10d..ec6358e62 100644 --- a/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts +++ b/Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts @@ -32,7 +32,7 @@ export default class RenderingMultiPlexerFeatureSource { const withIndex: (any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined })[] = []; - function addAsPoint(feat, rendering, coordinate) { + function addAsPoint(feat, rendering, coordinate) { const patched = { ...feat, pointRenderingIndex: rendering.index diff --git a/Logic/FeatureSource/TileFreshnessCalculator.ts b/Logic/FeatureSource/TileFreshnessCalculator.ts index 85ff8ae12..58a655151 100644 --- a/Logic/FeatureSource/TileFreshnessCalculator.ts +++ b/Logic/FeatureSource/TileFreshnessCalculator.ts @@ -13,35 +13,35 @@ export default class TileFreshnessCalculator { * @param tileId * @param freshness */ - public addTileLoad(tileId: number, freshness: Date){ + public addTileLoad(tileId: number, freshness: Date) { const existingFreshness = this.freshnessFor(...Tiles.tile_from_index(tileId)) - if(existingFreshness >= freshness){ + if (existingFreshness >= freshness) { return; } this.freshnesses.set(tileId, freshness) - + // Do we have freshness for the neighbouring tiles? If so, we can mark the tile above as loaded too! let [z, x, y] = Tiles.tile_from_index(tileId) - if(z === 0){ + if (z === 0) { return; } x = x - (x % 2) // Make the tiles always even y = y - (y % 2) - + const ul = this.freshnessFor(z, x, y)?.getTime() - if(ul === undefined){ + if (ul === undefined) { return } const ur = this.freshnessFor(z, x + 1, y)?.getTime() - if(ur === undefined){ + if (ur === undefined) { return } const ll = this.freshnessFor(z, x, y + 1)?.getTime() - if(ll === undefined){ + if (ll === undefined) { return } const lr = this.freshnessFor(z, x + 1, y + 1)?.getTime() - if(lr === undefined){ + if (lr === undefined) { return } @@ -50,22 +50,22 @@ export default class TileFreshnessCalculator { date.setTime(leastFresh) this.addTileLoad( Tiles.tile_index(z - 1, Math.floor(x / 2), Math.floor(y / 2)), - date + date ) - + } - - public freshnessFor(z: number, x: number, y:number): Date { - if(z < 0){ + + public freshnessFor(z: number, x: number, y: number): Date { + if (z < 0) { return undefined } const tileId = Tiles.tile_index(z, x, y) - if(this.freshnesses.has(tileId)) { + if (this.freshnesses.has(tileId)) { return this.freshnesses.get(tileId) } // recurse up - return this.freshnessFor(z - 1, Math.floor(x /2), Math.floor(y / 2)) - + return this.freshnessFor(z - 1, Math.floor(x / 2), Math.floor(y / 2)) + } } \ No newline at end of file diff --git a/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts b/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts index faeb5869a..dcc415f31 100644 --- a/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts @@ -9,9 +9,8 @@ import {Tiles} from "../../../Models/TileRange"; * A tiled source which dynamically loads the required tiles at a fixed zoom level */ export default class DynamicTileSource implements TileHierarchy { - private readonly _loadedTiles = new Set(); - public readonly loadedTiles: Map; + private readonly _loadedTiles = new Set(); constructor( layer: FilteredLayer, @@ -24,7 +23,7 @@ export default class DynamicTileSource implements TileHierarchy() + this.loadedTiles = new Map() const neededTiles = state.locationControl.map( location => { if (!layer.isDisplayed.data) { @@ -54,14 +53,14 @@ export default class DynamicTileSource implements TileHierarchy { - console.log("Tiled geojson source ",layer.layerDef.id," needs", neededIndexes) + console.log("Tiled geojson source ", layer.layerDef.id, " needs", neededIndexes) if (neededIndexes === undefined) { return; } for (const neededIndex of neededIndexes) { self._loadedTiles.add(neededIndex) const src = constructTile(Tiles.tile_from_index(neededIndex)) - if(src !== undefined){ + if (src !== undefined) { self.loadedTiles.set(neededIndex, src) } } diff --git a/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts b/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts index 750f6d037..d02ae5858 100644 --- a/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts @@ -19,7 +19,7 @@ export default class FullNodeDatabaseSource implements TileHierarchy = new UIEventSource(false) + public readonly downloadedTiles = new Set() + public rawDataHandlers: ((osmJson: any, tileId: number) => void)[] = [] + private readonly _backend: string; private readonly filteredLayers: UIEventSource; private readonly handleTile: (fs: (FeatureSourceForLayer & Tiled)) => void; private isActive: UIEventSource; @@ -28,10 +29,7 @@ export default class OsmFeatureSource { }, markTileVisited?: (tileId: number) => void }; - public readonly downloadedTiles = new Set() private readonly allowedTags: TagsFilter; - - public rawDataHandlers: ((osmJson: any, tileId: number) => void)[] = [] constructor(options: { handleTile: (tile: FeatureSourceForLayer & Tiled) => void; @@ -54,13 +52,13 @@ export default class OsmFeatureSource { if (options.isActive?.data === false) { return; } - + neededTiles = neededTiles.filter(tile => !self.downloadedTiles.has(tile)) - if(neededTiles.length == 0){ + if (neededTiles.length == 0) { return; } - + self.isRunning.setData(true) try { @@ -73,7 +71,7 @@ export default class OsmFeatureSource { } } catch (e) { console.error(e) - }finally { + } finally { console.log("Done") self.isRunning.setData(false) } @@ -111,7 +109,7 @@ export default class OsmFeatureSource { geojson.features = geojson.features.filter(feature => this.allowedTags.matchesProperties(feature.properties)) geojson.features.forEach(f => f.properties["_backend"] = this._backend) - + const index = Tiles.tile_index(z, x, y); new PerLayerFeatureSourceSplitter(this.filteredLayers, this.handleTile, diff --git a/Logic/FeatureSource/TiledFeatureSource/README.md b/Logic/FeatureSource/TiledFeatureSource/README.md index 93b51c6ad..914c1caf7 100644 --- a/Logic/FeatureSource/TiledFeatureSource/README.md +++ b/Logic/FeatureSource/TiledFeatureSource/README.md @@ -11,17 +11,14 @@ Currently, they are: When the data enters from Overpass or from the OSM-API, they are first distributed per layer: OVERPASS | ---PerLayerFeatureSource---> FeatureSourceForLayer[] -OSM | +OSM | The GeoJSon files (not tiled) are then added to this list A single FeatureSourcePerLayer is then further handled by splitting it into a tile hierarchy. - - In order to keep thins snappy, they are distributed over a tiled database per layer. - ## Notes `cached-featuresbookcases` is the old key used `cahced-features{themeid}` and should be cleaned up \ No newline at end of file diff --git a/Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts b/Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts index 6fd3dae65..716aefde0 100644 --- a/Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts +++ b/Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts @@ -8,9 +8,8 @@ import {BBox} from "../../BBox"; export class TileHierarchyMerger implements TileHierarchy { public readonly loadedTiles: Map = new Map(); - private readonly sources: Map> = new Map>(); - public readonly layer: FilteredLayer; + private readonly sources: Map> = new Map>(); private _handleTile: (src: FeatureSourceForLayer & IndexedFeatureSource, index: number) => void; constructor(layer: FilteredLayer, handleTile: (src: FeatureSourceForLayer & IndexedFeatureSource & Tiled, index: number) => void) { @@ -24,7 +23,7 @@ export class TileHierarchyMerger implements TileHierarchy> public readonly bbox: BBox; + public readonly tileIndex: number; private upper_left: TiledFeatureSource private upper_right: TiledFeatureSource private lower_left: TiledFeatureSource private lower_right: TiledFeatureSource private readonly maxzoom: number; private readonly options: TiledFeatureSourceOptions - public readonly tileIndex: number; private constructor(z: number, x: number, y: number, parent: TiledFeatureSource, options?: TiledFeatureSourceOptions) { this.z = z; @@ -92,25 +91,25 @@ export default class TiledFeatureSource implements Tiled, IndexedFeatureSource, return root; } - private isSplitNeeded(featureCount: number){ - if(this.upper_left !== undefined){ + private isSplitNeeded(featureCount: number) { + if (this.upper_left !== undefined) { // This tile has been split previously, so we keep on splitting return true; } - if(this.z >= this.maxzoom){ + if (this.z >= this.maxzoom) { // We are not allowed to split any further return false } - if(this.options.minZoomLevel !== undefined && this.z < this.options.minZoomLevel){ + if (this.options.minZoomLevel !== undefined && this.z < this.options.minZoomLevel) { // We must have at least this zoom level before we are allowed to start splitting return true } - + // To much features - we split return featureCount > this.maxFeatureCount - + } - + /*** * Adds the list of features to this hierarchy. * If there are too much features, the list will be broken down and distributed over the subtiles (only retaining features that don't fit a subtile on this level) @@ -121,7 +120,7 @@ export default class TiledFeatureSource implements Tiled, IndexedFeatureSource, if (features === undefined || features.length === 0) { return; } - + if (!this.isSplitNeeded(features.length)) { this.features.setData(features) return; @@ -155,7 +154,7 @@ export default class TiledFeatureSource implements Tiled, IndexedFeatureSource, } else { overlapsboundary.push(feature) } - }else if (this.options.minZoomLevel === undefined) { + } else if (this.options.minZoomLevel === undefined) { if (bbox.isContainedIn(this.upper_left.bbox)) { ulf.push(feature) } else if (bbox.isContainedIn(this.upper_right.bbox)) { diff --git a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts index 900393c1e..c473491b2 100644 --- a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts @@ -13,44 +13,6 @@ export default class TiledFromLocalStorageSource implements TileHierarchy void; private readonly undefinedTiles: Set; - public static GetFreshnesses(layerId: string): Map { - const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layerId + "-" - const freshnesses = new Map() - for (const key of Object.keys(localStorage)) { - if (!(key.startsWith(prefix) && key.endsWith("-time"))) { - continue - } - const index = Number(key.substring(prefix.length, key.length - "-time".length)) - const time = Number(localStorage.getItem(key)) - const freshness = new Date() - freshness.setTime(time) - freshnesses.set(index, freshness) - } - return freshnesses - } - - - static cleanCacheForLayer(layer: LayerConfig) { - const now = new Date() - const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layer.id + "-" - console.log("Cleaning tiles of ", prefix, "with max age",layer.maxAgeOfCache) - for (const key of Object.keys(localStorage)) { - if (!(key.startsWith(prefix) && key.endsWith("-time"))) { - continue - } - const index = Number(key.substring(prefix.length, key.length - "-time".length)) - const time = Number(localStorage.getItem(key)) - const timeDiff = (now.getTime() - time) / 1000 - - if(timeDiff >= layer.maxAgeOfCache){ - const k = prefix+index; - localStorage.removeItem(k) - localStorage.removeItem(k+"-format") - localStorage.removeItem(k+"-time") - } - } - } - constructor(layer: FilteredLayer, handleFeatureSource: (src: FeatureSourceForLayer & Tiled, index: number) => void, state: { @@ -110,6 +72,43 @@ export default class TiledFromLocalStorageSource implements TileHierarchy { + const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layerId + "-" + const freshnesses = new Map() + for (const key of Object.keys(localStorage)) { + if (!(key.startsWith(prefix) && key.endsWith("-time"))) { + continue + } + const index = Number(key.substring(prefix.length, key.length - "-time".length)) + const time = Number(localStorage.getItem(key)) + const freshness = new Date() + freshness.setTime(time) + freshnesses.set(index, freshness) + } + return freshnesses + } + + static cleanCacheForLayer(layer: LayerConfig) { + const now = new Date() + const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layer.id + "-" + console.log("Cleaning tiles of ", prefix, "with max age", layer.maxAgeOfCache) + for (const key of Object.keys(localStorage)) { + if (!(key.startsWith(prefix) && key.endsWith("-time"))) { + continue + } + const index = Number(key.substring(prefix.length, key.length - "-time".length)) + const time = Number(localStorage.getItem(key)) + const timeDiff = (now.getTime() - time) / 1000 + + if (timeDiff >= layer.maxAgeOfCache) { + const k = prefix + index; + localStorage.removeItem(k) + localStorage.removeItem(k + "-format") + localStorage.removeItem(k + "-time") + } + } + } + private loadTile(neededIndex: number) { try { const key = SaveTileToLocalStorageActor.storageKey + "-" + this.layer.layerDef.id + "-" + neededIndex diff --git a/Logic/GeoOperations.ts b/Logic/GeoOperations.ts index a4fd2ea35..14f4f261b 100644 --- a/Logic/GeoOperations.ts +++ b/Logic/GeoOperations.ts @@ -3,6 +3,9 @@ import {BBox} from "./BBox"; export class GeoOperations { + private static readonly _earthRadius = 6378137; + private static readonly _originShift = 2 * Math.PI * GeoOperations._earthRadius / 2; + static surfaceAreaInSqMeters(feature: any) { return turf.area(feature); } @@ -40,7 +43,7 @@ export class GeoOperations { * If 'feature' is a Polygon, overlapping points and points within the polygon will be returned * * If 'feature' is a point, it will return every feature the point is embedded in. Overlap will be undefined - * + * */ static calculateOverlap(feature: any, otherFeatures: any[]): { feat: any, overlap: number }[] { @@ -237,13 +240,13 @@ export class GeoOperations { * @param point Point defined as [lon, lat] */ public static nearestPoint(way, point: [number, number]) { - if(way.geometry.type === "Polygon"){ + if (way.geometry.type === "Polygon") { way = {...way} way.geometry = {...way.geometry} way.geometry.type = "LineString" way.geometry.coordinates = way.geometry.coordinates[0] } - + return turf.nearestPointOnLine(way, point, {units: "kilometers"}); } @@ -292,10 +295,6 @@ export class GeoOperations { return headerValuesOrdered.map(v => JSON.stringify(v)).join(",") + "\n" + lines.join("\n") } - - private static readonly _earthRadius = 6378137; - private static readonly _originShift = 2 * Math.PI * GeoOperations._earthRadius / 2; - //Converts given lat/lon in WGS84 Datum to XY in Spherical Mercator EPSG:900913 public static ConvertWgs84To900913(lonLat: [number, number]): [number, number] { const lon = lonLat[0]; @@ -315,11 +314,36 @@ export class GeoOperations { y = 180 / Math.PI * (2 * Math.atan(Math.exp(y * Math.PI / 180)) - Math.PI / 2); return [x, y]; } - - public static GeoJsonToWGS84(geojson){ + + public static GeoJsonToWGS84(geojson) { return turf.toWgs84(geojson) } + /** + * Tries to remove points which do not contribute much to the general outline. + * Points for which the angle is ~ 180° are removed + * @param coordinates + * @constructor + */ + public static SimplifyCoordinates(coordinates: [number, number][]) { + const newCoordinates = [] + for (let i = 1; i < coordinates.length - 1; i++) { + const coordinate = coordinates[i]; + const prev = coordinates[i - 1] + const next = coordinates[i + 1] + const b0 = turf.bearing(prev, coordinate, {final: true}) + const b1 = turf.bearing(coordinate, next) + + const diff = Math.abs(b1 - b0) + if (diff < 2) { + continue + } + newCoordinates.push(coordinate) + } + return newCoordinates + + } + /** * Calculates the intersection between two features. * Returns the length if intersecting a linestring and a (multi)polygon (in meters), returns a surface area (in m²) if intersecting two (multi)polygons @@ -412,31 +436,6 @@ export class GeoOperations { return undefined; } - /** - * Tries to remove points which do not contribute much to the general outline. - * Points for which the angle is ~ 180° are removed - * @param coordinates - * @constructor - */ - public static SimplifyCoordinates(coordinates: [number, number][]){ - const newCoordinates = [] - for (let i = 1; i < coordinates.length - 1; i++){ - const coordinate = coordinates[i]; - const prev = coordinates[i - 1] - const next = coordinates[i + 1] - const b0 = turf.bearing(prev, coordinate, {final: true}) - const b1 = turf.bearing(coordinate, next) - - const diff = Math.abs(b1 - b0) - if(diff < 2){ - continue - } - newCoordinates.push(coordinate) - } - return newCoordinates - - } - } diff --git a/Logic/ImageProviders/AllImageProviders.ts b/Logic/ImageProviders/AllImageProviders.ts index 5d428f262..3abdc49d0 100644 --- a/Logic/ImageProviders/AllImageProviders.ts +++ b/Logic/ImageProviders/AllImageProviders.ts @@ -19,9 +19,9 @@ export default class AllImageProviders { new GenericImageProvider( [].concat(...Imgur.defaultValuePrefix, ...WikimediaImageProvider.commonsPrefixes, ...Mapillary.valuePrefixes) ) - + ] - + public static defaultKeys = [].concat(AllImageProviders.ImageAttributionSource.map(provider => provider.defaultKeyPrefixes)) @@ -32,7 +32,7 @@ export default class AllImageProviders { return undefined; } - const cacheKey = tags.data.id+tagKey + const cacheKey = tags.data.id + tagKey const cached = this._cache.get(cacheKey) if (cached !== undefined) { return cached @@ -43,22 +43,22 @@ export default class AllImageProviders { this._cache.set(cacheKey, source) const allSources = [] for (const imageProvider of AllImageProviders.ImageAttributionSource) { - + let prefixes = imageProvider.defaultKeyPrefixes - if(tagKey !== undefined){ + if (tagKey !== undefined) { prefixes = tagKey } - + const singleSource = imageProvider.GetRelevantUrls(tags, { prefixes: prefixes }) allSources.push(singleSource) singleSource.addCallbackAndRunD(_ => { - const all : ProvidedImage[] = [].concat(...allSources.map(source => source.data)) + const all: ProvidedImage[] = [].concat(...allSources.map(source => source.data)) const uniq = [] const seen = new Set() for (const img of all) { - if(seen.has(img.url)){ + if (seen.has(img.url)) { continue } seen.add(img.url) diff --git a/Logic/ImageProviders/GenericImageProvider.ts b/Logic/ImageProviders/GenericImageProvider.ts index 2f2dab322..02011687d 100644 --- a/Logic/ImageProviders/GenericImageProvider.ts +++ b/Logic/ImageProviders/GenericImageProvider.ts @@ -10,24 +10,19 @@ export default class GenericImageProvider extends ImageProvider { this._valuePrefixBlacklist = valuePrefixBlacklist; } - - protected DownloadAttribution(url: string) { - return undefined - } - async ExtractUrls(key: string, value: string): Promise[]> { if (this._valuePrefixBlacklist.some(prefix => value.startsWith(prefix))) { return [] } - - try{ + + try { new URL(value) - }catch (_){ + } catch (_) { // Not a valid URL return [] } - + return [Promise.resolve({ key: key, url: value, @@ -39,5 +34,9 @@ export default class GenericImageProvider extends ImageProvider { return undefined; } + protected DownloadAttribution(url: string) { + return undefined + } + } \ No newline at end of file diff --git a/Logic/ImageProviders/ImageProvider.ts b/Logic/ImageProviders/ImageProvider.ts index 592f9a1f0..c1d90578e 100644 --- a/Logic/ImageProviders/ImageProvider.ts +++ b/Logic/ImageProviders/ImageProvider.ts @@ -14,7 +14,7 @@ export default abstract class ImageProvider { public abstract readonly defaultKeyPrefixes: string[] private _cache = new Map>() - + GetAttributionFor(url: string): UIEventSource { const cached = this._cache.get(url); if (cached !== undefined) { @@ -27,8 +27,6 @@ export default abstract class ImageProvider { public abstract SourceIcon(backlinkSource?: string): BaseUIElement; - protected abstract DownloadAttribution(url: string): Promise; - /** * Given a properies object, maps it onto _all_ the available pictures for this imageProvider */ @@ -77,4 +75,6 @@ export default abstract class ImageProvider { public abstract ExtractUrls(key: string, value: string): Promise[]>; + protected abstract DownloadAttribution(url: string): Promise; + } \ No newline at end of file diff --git a/Logic/ImageProviders/Imgur.ts b/Logic/ImageProviders/Imgur.ts index 289dad1f8..b06b2a6c0 100644 --- a/Logic/ImageProviders/Imgur.ts +++ b/Logic/ImageProviders/Imgur.ts @@ -7,10 +7,9 @@ import {LicenseInfo} from "./LicenseInfo"; export class Imgur extends ImageProvider { - public static readonly defaultValuePrefix = ["https://i.imgur.com"] - public readonly defaultKeyPrefixes: string[] = ["image"]; - + public static readonly defaultValuePrefix = ["https://i.imgur.com"] public static readonly singleton = new Imgur(); + public readonly defaultKeyPrefixes: string[] = ["image"]; private constructor() { super(); @@ -89,6 +88,17 @@ export class Imgur extends ImageProvider { return undefined; } + public async ExtractUrls(key: string, value: string): Promise[]> { + if (Imgur.defaultValuePrefix.some(prefix => value.startsWith(prefix))) { + return [Promise.resolve({ + url: value, + key: key, + provider: this + })] + } + return [] + } + protected DownloadAttribution: (url: string) => Promise = async (url: string) => { const hash = url.substr("https://i.imgur.com/".length).split(".jpg")[0]; @@ -112,16 +122,5 @@ export class Imgur extends ImageProvider { return licenseInfo } - public async ExtractUrls(key: string, value: string): Promise[]> { - if (Imgur.defaultValuePrefix.some(prefix => value.startsWith(prefix))) { - return [Promise.resolve({ - url: value, - key: key, - provider: this - })] - } - return [] - } - } \ No newline at end of file diff --git a/Logic/ImageProviders/ImgurUploader.ts b/Logic/ImageProviders/ImgurUploader.ts index 10bf43609..65cb8c9f0 100644 --- a/Logic/ImageProviders/ImgurUploader.ts +++ b/Logic/ImageProviders/ImgurUploader.ts @@ -6,9 +6,8 @@ export default class ImgurUploader { public readonly queue: UIEventSource = new UIEventSource([]); public readonly failed: UIEventSource = new UIEventSource([]); public readonly success: UIEventSource = new UIEventSource([]); - private readonly _handleSuccessUrl: (string) => void; - public maxFileSizeInMegabytes = 10; + private readonly _handleSuccessUrl: (string) => void; constructor(handleSuccessUrl: (string) => void) { this._handleSuccessUrl = handleSuccessUrl; diff --git a/Logic/ImageProviders/Mapillary.ts b/Logic/ImageProviders/Mapillary.ts index 07e0473d4..184af3a8e 100644 --- a/Logic/ImageProviders/Mapillary.ts +++ b/Logic/ImageProviders/Mapillary.ts @@ -7,17 +7,16 @@ import Constants from "../../Models/Constants"; export class Mapillary extends ImageProvider { - defaultKeyPrefixes = ["mapillary","image"] - public static readonly singleton = new Mapillary(); private static readonly valuePrefix = "https://a.mapillary.com" - public static readonly valuePrefixes = [Mapillary.valuePrefix, "http://mapillary.com","https://mapillary.com","http://www.mapillary.com","https://www.mapillary.com"] + public static readonly valuePrefixes = [Mapillary.valuePrefix, "http://mapillary.com", "https://mapillary.com", "http://www.mapillary.com", "https://www.mapillary.com"] + defaultKeyPrefixes = ["mapillary", "image"] private static ExtractKeyFromURL(value: string, failIfNoMath = false): { key: string, isApiv4?: boolean } { - + if (value.startsWith(Mapillary.valuePrefix)) { const key = value.substring(0, value.lastIndexOf("?")).substring(value.lastIndexOf("/") + 1) return {key: key, isApiv4: !isNaN(Number(key))}; @@ -43,11 +42,11 @@ export class Mapillary extends ImageProvider { if (matchApi !== null) { return {key: matchApi[1]}; } - - if(failIfNoMath){ + + if (failIfNoMath) { return undefined; } - + return {key: value, isApiv4: !isNaN(Number(value))}; } @@ -59,33 +58,6 @@ export class Mapillary extends ImageProvider { return [this.PrepareUrlAsync(key, value)] } - private async PrepareUrlAsync(key: string, value: string): Promise { - const failIfNoMatch = key.indexOf("mapillary") < 0 - const keyV = Mapillary.ExtractKeyFromURL(value, failIfNoMatch) - if(keyV === undefined){ - return undefined; - } - - if (!keyV.isApiv4) { - const url = `https://images.mapillary.com/${keyV.key}/thumb-640.jpg?client_id=${Constants.mapillary_client_token_v3}` - return { - url: url, - provider: this, - key: key - } - } else { - const mapillaryId = keyV.key; - const metadataUrl = 'https://graph.mapillary.com/' + mapillaryId + '?fields=thumb_1024_url&&access_token=' + Constants.mapillary_client_token_v4; - const response = await Utils.downloadJson(metadataUrl) - const url = response["thumb_1024_url"]; - return { - url: url, - provider: this, - key: key - } - } - } - protected async DownloadAttribution(url: string): Promise { const keyV = Mapillary.ExtractKeyFromURL(url) @@ -110,4 +82,31 @@ export class Mapillary extends ImageProvider { return license } + + private async PrepareUrlAsync(key: string, value: string): Promise { + const failIfNoMatch = key.indexOf("mapillary") < 0 + const keyV = Mapillary.ExtractKeyFromURL(value, failIfNoMatch) + if (keyV === undefined) { + return undefined; + } + + if (!keyV.isApiv4) { + const url = `https://images.mapillary.com/${keyV.key}/thumb-640.jpg?client_id=${Constants.mapillary_client_token_v3}` + return { + url: url, + provider: this, + key: key + } + } else { + const mapillaryId = keyV.key; + const metadataUrl = 'https://graph.mapillary.com/' + mapillaryId + '?fields=thumb_1024_url&&access_token=' + Constants.mapillary_client_token_v4; + const response = await Utils.downloadJson(metadataUrl) + const url = response["thumb_1024_url"]; + return { + url: url, + provider: this, + key: key + } + } + } } \ No newline at end of file diff --git a/Logic/ImageProviders/WikidataImageProvider.ts b/Logic/ImageProviders/WikidataImageProvider.ts index 139201578..c3d72d064 100644 --- a/Logic/ImageProviders/WikidataImageProvider.ts +++ b/Logic/ImageProviders/WikidataImageProvider.ts @@ -1,4 +1,3 @@ -import {Utils} from "../../Utils"; import ImageProvider, {ProvidedImage} from "./ImageProvider"; import BaseUIElement from "../../UI/BaseUIElement"; import Svg from "../../Svg"; @@ -7,10 +6,6 @@ import Wikidata from "../Web/Wikidata"; export class WikidataImageProvider extends ImageProvider { - public SourceIcon(backlinkSource?: string): BaseUIElement { - throw Svg.wikidata_svg(); - } - public static readonly singleton = new WikidataImageProvider() public readonly defaultKeyPrefixes = ["wikidata"] @@ -18,17 +13,17 @@ export class WikidataImageProvider extends ImageProvider { super() } - protected DownloadAttribution(url: string): Promise { - throw new Error("Method not implemented; shouldn't be needed!"); + public SourceIcon(backlinkSource?: string): BaseUIElement { + throw Svg.wikidata_svg(); } public async ExtractUrls(key: string, value: string): Promise[]> { const entity = await Wikidata.LoadWikidataEntryAsync(value) - if(entity === undefined){ + if (entity === undefined) { return [] } - - const allImages : Promise[] = [] + + const allImages: Promise[] = [] // P18 is the claim 'depicted in this image' for (const img of Array.from(entity.claims.get("P18") ?? [])) { const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined, img) @@ -36,19 +31,23 @@ export class WikidataImageProvider extends ImageProvider { } // P373 is 'commons category' for (let cat of Array.from(entity.claims.get("P373") ?? [])) { - if(!cat.startsWith("Category:")){ - cat = "Category:"+cat + if (!cat.startsWith("Category:")) { + cat = "Category:" + cat } const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined, cat) allImages.push(...promises) } - + const commons = entity.commons if (commons !== undefined && (commons.startsWith("Category:") || commons.startsWith("File:"))) { - const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined , commons) + const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined, commons) allImages.push(...promises) } return allImages } + protected DownloadAttribution(url: string): Promise { + throw new Error("Method not implemented; shouldn't be needed!"); + } + } \ No newline at end of file diff --git a/Logic/ImageProviders/WikimediaImageProvider.ts b/Logic/ImageProviders/WikimediaImageProvider.ts index ea122f491..ec9920640 100644 --- a/Logic/ImageProviders/WikimediaImageProvider.ts +++ b/Logic/ImageProviders/WikimediaImageProvider.ts @@ -12,10 +12,10 @@ import Wikimedia from "../Web/Wikimedia"; export class WikimediaImageProvider extends ImageProvider { - private readonly commons_key = "wikimedia_commons" - public readonly defaultKeyPrefixes = [this.commons_key,"image"] public static readonly singleton = new WikimediaImageProvider(); public static readonly commonsPrefixes = ["https://commons.wikimedia.org/wiki/", "https://upload.wikimedia.org", "File:"] + private readonly commons_key = "wikimedia_commons" + public readonly defaultKeyPrefixes = [this.commons_key, "image"] private constructor() { super(); @@ -30,6 +30,40 @@ export class WikimediaImageProvider extends ImageProvider { } + private static PrepareUrl(value: string): string { + + if (value.toLowerCase().startsWith("https://commons.wikimedia.org/wiki/")) { + return value; + } + return (`https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(value)}?width=500&height=400`) + } + + private static startsWithCommonsPrefix(value: string): boolean { + return WikimediaImageProvider.commonsPrefixes.some(prefix => value.startsWith(prefix)) + } + + private static removeCommonsPrefix(value: string): string { + if (value.startsWith("https://upload.wikimedia.org/")) { + value = value.substring(value.lastIndexOf("/") + 1) + value = decodeURIComponent(value) + if (!value.startsWith("File:")) { + value = "File:" + value + } + return value; + } + + for (const prefix of WikimediaImageProvider.commonsPrefixes) { + if (value.startsWith(prefix)) { + let part = value.substr(prefix.length) + if (prefix.startsWith("http")) { + part = decodeURIComponent(part) + } + return part + } + } + return value; + } + SourceIcon(backlink: string): BaseUIElement { const img = Svg.wikimedia_commons_white_svg() .SetStyle("width:2em;height: 2em"); @@ -44,12 +78,38 @@ export class WikimediaImageProvider extends ImageProvider { } - private static PrepareUrl(value: string): string { + public PrepUrl(value: string): ProvidedImage { + const hasCommonsPrefix = WikimediaImageProvider.startsWithCommonsPrefix(value) + value = WikimediaImageProvider.removeCommonsPrefix(value) - if (value.toLowerCase().startsWith("https://commons.wikimedia.org/wiki/")) { - return value; + if (value.startsWith("File:")) { + return this.UrlForImage(value) } - return (`https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(value)}?width=500&height=400`) + + // We do a last effort and assume this is a file + return this.UrlForImage("File:" + value) + } + + public async ExtractUrls(key: string, value: string): Promise[]> { + const hasCommonsPrefix = WikimediaImageProvider.startsWithCommonsPrefix(value) + if (key !== undefined && key !== this.commons_key && !hasCommonsPrefix) { + return [] + } + + value = WikimediaImageProvider.removeCommonsPrefix(value) + if (value.startsWith("Category:")) { + const urls = await Wikimedia.GetCategoryContents(value) + return urls.filter(url => url.startsWith("File:")).map(image => Promise.resolve(this.UrlForImage(image))) + } + if (value.startsWith("File:")) { + return [Promise.resolve(this.UrlForImage(value))] + } + if (value.startsWith("http")) { + // PRobably an error + return [] + } + // We do a last effort and assume this is a file + return [Promise.resolve(this.UrlForImage("File:" + value))] } protected async DownloadAttribution(filename: string): Promise { @@ -66,24 +126,24 @@ export class WikimediaImageProvider extends ImageProvider { const data = await Utils.downloadJson(url) const licenseInfo = new LicenseInfo(); const pageInfo = data.query.pages[-1] - if(pageInfo === undefined){ + if (pageInfo === undefined) { return undefined; } - + const license = (pageInfo.imageinfo ?? [])[0]?.extmetadata; if (license === undefined) { - console.warn("The file", filename ,"has no usable metedata or license attached... Please fix the license info file yourself!") + console.warn("The file", filename, "has no usable metedata or license attached... Please fix the license info file yourself!") return undefined; } let title = pageInfo.title - if(title.startsWith("File:")){ - title= title.substr("File:".length) + if (title.startsWith("File:")) { + title = title.substr("File:".length) } - if(title.endsWith(".jpg") || title.endsWith(".png")){ + if (title.endsWith(".jpg") || title.endsWith(".png")) { title = title.substring(0, title.length - 4) } - + licenseInfo.title = title licenseInfo.artist = license.Artist?.value; licenseInfo.license = license.License?.value; @@ -103,66 +163,6 @@ export class WikimediaImageProvider extends ImageProvider { } return {url: WikimediaImageProvider.PrepareUrl(image), key: undefined, provider: this} } - - private static startsWithCommonsPrefix(value: string): boolean{ - return WikimediaImageProvider.commonsPrefixes.some(prefix => value.startsWith(prefix)) - } - - private static removeCommonsPrefix(value: string): string{ - if(value.startsWith("https://upload.wikimedia.org/")){ - value = value.substring(value.lastIndexOf("/") + 1) - value = decodeURIComponent(value) - if(!value.startsWith("File:")){ - value = "File:"+value - } - return value; - } - - for (const prefix of WikimediaImageProvider.commonsPrefixes) { - if(value.startsWith(prefix)){ - let part = value.substr(prefix.length) - if(prefix.startsWith("http")){ - part = decodeURIComponent(part) - } - return part - } - } - return value; - } - - public PrepUrl(value: string): ProvidedImage { - const hasCommonsPrefix = WikimediaImageProvider.startsWithCommonsPrefix(value) - value = WikimediaImageProvider.removeCommonsPrefix(value) - - if (value.startsWith("File:")) { - return this.UrlForImage(value) - } - - // We do a last effort and assume this is a file - return this.UrlForImage("File:" + value) - } - - public async ExtractUrls(key: string, value: string): Promise[]> { - const hasCommonsPrefix = WikimediaImageProvider.startsWithCommonsPrefix(value) - if(key !== undefined && key !== this.commons_key && !hasCommonsPrefix){ - return [] - } - - value = WikimediaImageProvider.removeCommonsPrefix(value) - if (value.startsWith("Category:")) { - const urls = await Wikimedia.GetCategoryContents(value) - return urls.filter(url => url.startsWith("File:")).map(image => Promise.resolve(this.UrlForImage(image))) - } - if (value.startsWith("File:")) { - return [Promise.resolve(this.UrlForImage(value))] - } - if (value.startsWith("http")) { - // PRobably an error - return [] - } - // We do a last effort and assume this is a file - return [Promise.resolve(this.UrlForImage("File:" + value))] - } } diff --git a/Logic/MetaTagging.ts b/Logic/MetaTagging.ts index a6e3cc44b..0ac9ba4e1 100644 --- a/Logic/MetaTagging.ts +++ b/Logic/MetaTagging.ts @@ -18,7 +18,7 @@ export default class MetaTagging { /** * This method (re)calculates all metatags and calculated tags on every given object. * The given features should be part of the given layer - * + * * Returns true if at least one feature has changed properties */ public static addMetatags(features: { feature: any; freshness: Date }[], @@ -63,15 +63,15 @@ export default class MetaTagging { // All keys are already defined, we probably already ran this one continue } - - if(metatag.isLazy){ + + if (metatag.isLazy) { somethingChanged = true; - + metatag.applyMetaTagsOnFeature(feature, freshness, layer) - - }else{ - - + + } else { + + const newValueAdded = metatag.applyMetaTagsOnFeature(feature, freshness, layer) /* Note that the expression: * `somethingChanged = newValueAdded || metatag.applyMetaTagsOnFeature(feature, freshness)` @@ -146,12 +146,13 @@ export default class MetaTagging { } } } - - }} ) + + } + }) } - - + + functions.push(f) } return functions; diff --git a/Logic/Osm/Actions/ChangeDescription.ts b/Logic/Osm/Actions/ChangeDescription.ts index c8a262d6f..b3b2e9bbf 100644 --- a/Logic/Osm/Actions/ChangeDescription.ts +++ b/Logic/Osm/Actions/ChangeDescription.ts @@ -16,13 +16,13 @@ export interface ChangeDescription { /** * The type of the change */ - changeType: "answer" | "create" | "split" | "delete" | "move" | "import" | string | null + changeType: "answer" | "create" | "split" | "delete" | "move" | "import" | string | null /** * THe motivation for the change, e.g. 'deleted because does not exist anymore' */ specialMotivation?: string }, - + /** * Identifier of the object */ @@ -32,11 +32,11 @@ export interface ChangeDescription { * Negative for new objects */ id: number, - + /** * All changes to tags * v = "" or v = undefined to erase this tag - * + * * Note that this list will only contain the _changes_ to the tags, not the full set of tags */ tags?: { k: string, v: string }[], @@ -65,9 +65,9 @@ export interface ChangeDescription { doDelete?: boolean } -export class ChangeDescriptionTools{ - - public static getGeojsonGeometry(change: ChangeDescription): any{ +export class ChangeDescriptionTools { + + public static getGeojsonGeometry(change: ChangeDescription): any { switch (change.type) { case "node": const n = new OsmNode(change.id) diff --git a/Logic/Osm/Actions/ChangeTagAction.ts b/Logic/Osm/Actions/ChangeTagAction.ts index 862d36629..359d733e4 100644 --- a/Logic/Osm/Actions/ChangeTagAction.ts +++ b/Logic/Osm/Actions/ChangeTagAction.ts @@ -7,7 +7,7 @@ export default class ChangeTagAction extends OsmChangeAction { private readonly _elementId: string; private readonly _tagsFilter: TagsFilter; private readonly _currentTags: any; - private readonly _meta: {theme: string, changeType: string}; + private readonly _meta: { theme: string, changeType: string }; constructor(elementId: string, tagsFilter: TagsFilter, currentTags: any, meta: { theme: string, @@ -31,11 +31,11 @@ export default class ChangeTagAction extends OsmChangeAction { return undefined; } if (value === undefined || value === null) { - console.error("Invalid value for ", key,":", value); + console.error("Invalid value for ", key, ":", value); return undefined; } - - if(typeof value !== "string"){ + + if (typeof value !== "string") { console.error("Invalid value for ", key, "as it is not a string:", value) return undefined; } @@ -53,7 +53,7 @@ export default class ChangeTagAction extends OsmChangeAction { const type = typeId[0] const id = Number(typeId [1]) return [{ - type: <"node"|"way"|"relation"> type, + type: <"node" | "way" | "relation">type, id: id, tags: changedTags, meta: this._meta diff --git a/Logic/Osm/Actions/CreateNewNodeAction.ts b/Logic/Osm/Actions/CreateNewNodeAction.ts index b8e0f0171..bf9255709 100644 --- a/Logic/Osm/Actions/CreateNewNodeAction.ts +++ b/Logic/Osm/Actions/CreateNewNodeAction.ts @@ -156,7 +156,7 @@ export default class CreateNewNodeAction extends OsmChangeAction { private setElementId(id: number) { this.newElementIdNumber = id; - this.newElementId = "node/"+id + this.newElementId = "node/" + id if (!this._reusePreviouslyCreatedPoint) { return } diff --git a/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts b/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts index a411bee82..dcbc3501f 100644 --- a/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts +++ b/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts @@ -163,17 +163,18 @@ export default class CreateWayWithPointReuseAction extends OsmChangeAction { }) allChanges.push(...(await newNodeAction.CreateChangeDescriptions(changes))) - + nodeIdsToUse.push({ lat, lon, - nodeId : newNodeAction.newElementIdNumber}) + nodeId: newNodeAction.newElementIdNumber + }) continue - + } - + const closestPoint = info.closebyNodes[0] const id = Number(closestPoint.node.properties.id.split("/")[1]) - if(closestPoint.config.mode === "move_osm_point"){ + if (closestPoint.config.mode === "move_osm_point") { allChanges.push({ type: "node", id, @@ -193,9 +194,9 @@ export default class CreateWayWithPointReuseAction extends OsmChangeAction { const newWay = new CreateNewWayAction(this._tags, nodeIdsToUse, { theme }) - + allChanges.push(...(await newWay.Perform(changes))) - + return allChanges } diff --git a/Logic/Osm/Actions/RelationSplitHandler.ts b/Logic/Osm/Actions/RelationSplitHandler.ts index 463674347..1f0da8bcd 100644 --- a/Logic/Osm/Actions/RelationSplitHandler.ts +++ b/Logic/Osm/Actions/RelationSplitHandler.ts @@ -10,6 +10,7 @@ export interface RelationSplitInput { originalNodes: number[], allWaysNodesInOrder: number[][] } + abstract class AbstractRelationSplitHandler extends OsmChangeAction { protected readonly _input: RelationSplitInput; protected readonly _theme: string; @@ -57,11 +58,11 @@ export default class RelationSplitHandler extends AbstractRelationSplitHandler { } async CreateChangeDescriptions(changes: Changes): Promise { - if(this._input.relation.tags["type"] === "restriction"){ + if (this._input.relation.tags["type"] === "restriction") { // This is a turn restriction return new TurnRestrictionRSH(this._input, this._theme).CreateChangeDescriptions(changes) } - return new InPlaceReplacedmentRTSH(this._input, this._theme).CreateChangeDescriptions(changes) + return new InPlaceReplacedmentRTSH(this._input, this._theme).CreateChangeDescriptions(changes) } @@ -72,68 +73,71 @@ export class TurnRestrictionRSH extends AbstractRelationSplitHandler { constructor(input: RelationSplitInput, theme: string) { super(input, theme); } - + public async CreateChangeDescriptions(changes: Changes): Promise { const relation = this._input.relation const members = relation.members - + const selfMembers = members.filter(m => m.type === "way" && m.ref === this._input.originalWayId) - - if(selfMembers.length > 1){ + + if (selfMembers.length > 1) { console.warn("Detected a turn restriction where this way has multiple occurances. This is an error") } const selfMember = selfMembers[0] - - if(selfMember.role === "via"){ + + if (selfMember.role === "via") { // A via way can be replaced in place return new InPlaceReplacedmentRTSH(this._input, this._theme).CreateChangeDescriptions(changes); } - - + + // We have to keep only the way with a common point with the rest of the relation // Let's figure out which member is neighbouring our way - - let commonStartPoint : number = await this.targetNodeAt(members.indexOf(selfMember), true) - let commonEndPoint : number = await this.targetNodeAt(members.indexOf(selfMember), false) - + + let commonStartPoint: number = await this.targetNodeAt(members.indexOf(selfMember), true) + let commonEndPoint: number = await this.targetNodeAt(members.indexOf(selfMember), false) + // In normal circumstances, only one of those should be defined let commonPoint = commonStartPoint ?? commonEndPoint - + // Let's select the way to keep - const idToKeep : {id: number} = this._input.allWaysNodesInOrder.map((nodes, i) => ({nodes: nodes, id: this._input.allWayIdsInOrder[i]})) + const idToKeep: { id: number } = this._input.allWaysNodesInOrder.map((nodes, i) => ({ + nodes: nodes, + id: this._input.allWayIdsInOrder[i] + })) .filter(nodesId => { const nds = nodesId.nodes - return nds[0] == commonPoint || nds[nds.length - 1] == commonPoint + return nds[0] == commonPoint || nds[nds.length - 1] == commonPoint })[0] - - if(idToKeep === undefined){ + + if (idToKeep === undefined) { console.error("No common point found, this was a broken turn restriction!", relation.id) return [] } - + const originalWayId = this._input.originalWayId - if(idToKeep.id === originalWayId){ + if (idToKeep.id === originalWayId) { console.log("Turn_restriction fixer: the original ID can be kept, nothing to do") return [] } - - const newMembers : { - ref:number, - type:"way" | "node" | "relation", - role:string + + const newMembers: { + ref: number, + type: "way" | "node" | "relation", + role: string } [] = relation.members.map(m => { - if(m.type === "way" && m.ref === originalWayId){ + if (m.type === "way" && m.ref === originalWayId) { return { ref: idToKeep.id, - type:"way", + type: "way", role: m.role } } return m }) - - + + return [ { type: "relation", @@ -148,7 +152,7 @@ export class TurnRestrictionRSH extends AbstractRelationSplitHandler { } ]; } - + } /** @@ -184,8 +188,8 @@ export class InPlaceReplacedmentRTSH extends AbstractRelationSplitHandler { const nodeIdBefore = await this.targetNodeAt(i - 1, false) const nodeIdAfter = await this.targetNodeAt(i + 1, true) - const firstNodeMatches = nodeIdBefore === undefined || nodeIdBefore === firstNode - const lastNodeMatches =nodeIdAfter === undefined || nodeIdAfter === lastNode + const firstNodeMatches = nodeIdBefore === undefined || nodeIdBefore === firstNode + const lastNodeMatches = nodeIdAfter === undefined || nodeIdAfter === lastNode if (firstNodeMatches && lastNodeMatches) { // We have a classic situation, forward situation @@ -200,10 +204,10 @@ export class InPlaceReplacedmentRTSH extends AbstractRelationSplitHandler { } const firstNodeMatchesRev = nodeIdBefore === undefined || nodeIdBefore === lastNode - const lastNodeMatchesRev =nodeIdAfter === undefined || nodeIdAfter === firstNode + const lastNodeMatchesRev = nodeIdAfter === undefined || nodeIdAfter === firstNode if (firstNodeMatchesRev || lastNodeMatchesRev) { // We (probably) have a reversed situation, backward situation - for (let i1 = this._input.allWayIdsInOrder.length - 1; i1 >= 0; i1--){ + for (let i1 = this._input.allWayIdsInOrder.length - 1; i1 >= 0; i1--) { // Iterate BACKWARDS const wId = this._input.allWayIdsInOrder[i1]; newMembers.push({ @@ -214,7 +218,7 @@ export class InPlaceReplacedmentRTSH extends AbstractRelationSplitHandler { } continue; } - + // Euhm, allright... Something weird is going on, but let's not care too much // Lets pretend this is forward going for (const wId of this._input.allWayIdsInOrder) { @@ -231,7 +235,7 @@ export class InPlaceReplacedmentRTSH extends AbstractRelationSplitHandler { id: relation.id, type: "relation", changes: {members: newMembers}, - meta:{ + meta: { changeType: "relation-fix", theme: this._theme } diff --git a/Logic/Osm/Actions/ReplaceGeometryAction.ts b/Logic/Osm/Actions/ReplaceGeometryAction.ts index cc56ff03e..f1d03fb40 100644 --- a/Logic/Osm/Actions/ReplaceGeometryAction.ts +++ b/Logic/Osm/Actions/ReplaceGeometryAction.ts @@ -77,13 +77,13 @@ export default class ReplaceGeometryAction extends OsmChangeAction { public async getPreview(): Promise { const {closestIds, allNodesById} = await this.GetClosestIds(); - console.log("Generating preview, identicals are ", ) + console.log("Generating preview, identicals are ",) const preview = closestIds.map((newId, i) => { - if(this.identicalTo[i] !== undefined){ + if (this.identicalTo[i] !== undefined) { return undefined } - - + + if (newId === undefined) { return { type: "Feature", @@ -123,7 +123,7 @@ export default class ReplaceGeometryAction extends OsmChangeAction { const {closestIds, osmWay} = await this.GetClosestIds() for (let i = 0; i < closestIds.length; i++) { - if(this.identicalTo[i] !== undefined){ + if (this.identicalTo[i] !== undefined) { const j = this.identicalTo[i] actualIdsToUse.push(actualIdsToUse[j]) continue @@ -221,7 +221,7 @@ export default class ReplaceGeometryAction extends OsmChangeAction { const closestIds = [] const distances = [] - for (let i = 0; i < this.targetCoordinates.length; i++){ + for (let i = 0; i < this.targetCoordinates.length; i++) { const target = this.targetCoordinates[i]; let closestDistance = undefined let closestId = undefined; @@ -240,15 +240,15 @@ export default class ReplaceGeometryAction extends OsmChangeAction { // Next step: every closestId can only occur once in the list // We skip the ones which are identical - console.log("Erasing double ids") + console.log("Erasing double ids") for (let i = 0; i < closestIds.length; i++) { - if(this.identicalTo[i] !== undefined){ + if (this.identicalTo[i] !== undefined) { closestIds[i] = closestIds[this.identicalTo[i]] continue } const closestId = closestIds[i] for (let j = i + 1; j < closestIds.length; j++) { - if(this.identicalTo[j] !== undefined){ + if (this.identicalTo[j] !== undefined) { continue } const otherClosestId = closestIds[j] diff --git a/Logic/Osm/Actions/SplitAction.ts b/Logic/Osm/Actions/SplitAction.ts index 682d6dc70..f7e95dedf 100644 --- a/Logic/Osm/Actions/SplitAction.ts +++ b/Logic/Osm/Actions/SplitAction.ts @@ -25,7 +25,7 @@ export default class SplitAction extends OsmChangeAction { * @param meta * @param toleranceInMeters: if a splitpoint closer then this amount of meters to an existing point, the existing point will be used to split the line instead of a new point */ - constructor(wayId: string, splitPointCoordinates: [number, number][], meta: {theme: string}, toleranceInMeters = 5) { + constructor(wayId: string, splitPointCoordinates: [number, number][], meta: { theme: string }, toleranceInMeters = 5) { super() this.wayId = wayId; this._splitPointsCoordinates = splitPointCoordinates @@ -51,7 +51,7 @@ export default class SplitAction extends OsmChangeAction { } async CreateChangeDescriptions(changes: Changes): Promise { - const originalElement = await OsmObject.DownloadObjectAsync(this.wayId) + const originalElement = await OsmObject.DownloadObjectAsync(this.wayId) const originalNodes = originalElement.nodes; // First, calculate splitpoints and remove points close to one another @@ -180,7 +180,7 @@ export default class SplitAction extends OsmChangeAction { private CalculateSplitCoordinates(osmWay: OsmWay, toleranceInM = 5): SplitInfo[] { const wayGeoJson = osmWay.asGeoJson() // Should be [lon, lat][] - const originalPoints : [number, number][] = osmWay.coordinates.map(c => [c[1], c[0]]) + const originalPoints: [number, number][] = osmWay.coordinates.map(c => [c[1], c[0]]) const allPoints: { // lon, lat coordinates: [number, number], @@ -234,25 +234,25 @@ export default class SplitAction extends OsmChangeAction { // We keep the original points continue } - + // At this point, 'dist' told us the point is pretty close to an already existing point. // Lets see which (already existing) point is closer and mark it as splitpoint const nextPoint = allPoints[i + 1] const prevPoint = allPoints[i - 1] const distToNext = nextPoint.location - point.location const distToPrev = point.location - prevPoint.location - - if(distToNext * 1000 > toleranceInM && distToPrev * 1000 > toleranceInM){ + + if (distToNext * 1000 > toleranceInM && distToPrev * 1000 > toleranceInM) { // Both are too far away to mark them as the split point continue; } - + let closest = nextPoint if (distToNext > distToPrev) { closest = prevPoint } // Ok, we have a closest point! - if(closest.originalIndex === 0 || closest.originalIndex === originalPoints.length){ + if (closest.originalIndex === 0 || closest.originalIndex === originalPoints.length) { // We can not split on the first or last points... continue } diff --git a/Logic/Osm/ChangesetHandler.ts b/Logic/Osm/ChangesetHandler.ts index 4357fa054..26ccafd1a 100644 --- a/Logic/Osm/ChangesetHandler.ts +++ b/Logic/Osm/ChangesetHandler.ts @@ -53,61 +53,6 @@ export class ChangesetHandler { } } - private handleIdRewrite(node: any, type: string): [string, string] { - const oldId = parseInt(node.attributes.old_id.value); - if (node.attributes.new_id === undefined) { - // We just removed this point! - const element = this.allElements.getEventSourceById("node/" + oldId); - element.data._deleted = "yes" - element.ping(); - return; - } - - const newId = parseInt(node.attributes.new_id.value); - const result: [string, string] = [type + "/" + oldId, type + "/" + newId] - if (!(oldId !== undefined && newId !== undefined && - !isNaN(oldId) && !isNaN(newId))) { - return undefined; - } - if (oldId == newId) { - return undefined; - } - console.log("Rewriting id: ", type + "/" + oldId, "-->", type + "/" + newId); - const element = this.allElements.getEventSourceById("node/" + oldId); - if(element === undefined){ - // Element to rewrite not found, probably a node or relation that is not rendered - return undefined - } - element.data.id = type + "/" + newId; - this.allElements.addElementById(type + "/" + newId, element); - this.allElements.ContainingFeatures.set(type + "/" + newId, this.allElements.ContainingFeatures.get(type + "/" + oldId)) - element.ping(); - return result; - } - - private parseUploadChangesetResponse(response: XMLDocument): void { - const nodes = response.getElementsByTagName("node"); - const mappings = new Map() - // @ts-ignore - for (const node of nodes) { - const mapping = this.handleIdRewrite(node, "node") - if (mapping !== undefined) { - mappings.set(mapping[0], mapping[1]) - } - } - - const ways = response.getElementsByTagName("way"); - // @ts-ignore - for (const way of ways) { - const mapping = this.handleIdRewrite(way, "way") - if (mapping !== undefined) { - mappings.set(mapping[0], mapping[1]) - } - } - this.changes.registerIdRewrites(mappings) - - } - /** * The full logic to upload a change to one or more elements. * @@ -191,7 +136,7 @@ export class ChangesetHandler { // The old value is overwritten, thus we drop } } - + await this.UpdateTags(csId, extraMetaTags.map(csTag => <[string, string]>[csTag.key, csTag.value])) @@ -207,6 +152,60 @@ export class ChangesetHandler { } } + private handleIdRewrite(node: any, type: string): [string, string] { + const oldId = parseInt(node.attributes.old_id.value); + if (node.attributes.new_id === undefined) { + // We just removed this point! + const element = this.allElements.getEventSourceById("node/" + oldId); + element.data._deleted = "yes" + element.ping(); + return; + } + + const newId = parseInt(node.attributes.new_id.value); + const result: [string, string] = [type + "/" + oldId, type + "/" + newId] + if (!(oldId !== undefined && newId !== undefined && + !isNaN(oldId) && !isNaN(newId))) { + return undefined; + } + if (oldId == newId) { + return undefined; + } + console.log("Rewriting id: ", type + "/" + oldId, "-->", type + "/" + newId); + const element = this.allElements.getEventSourceById("node/" + oldId); + if (element === undefined) { + // Element to rewrite not found, probably a node or relation that is not rendered + return undefined + } + element.data.id = type + "/" + newId; + this.allElements.addElementById(type + "/" + newId, element); + this.allElements.ContainingFeatures.set(type + "/" + newId, this.allElements.ContainingFeatures.get(type + "/" + oldId)) + element.ping(); + return result; + } + + private parseUploadChangesetResponse(response: XMLDocument): void { + const nodes = response.getElementsByTagName("node"); + const mappings = new Map() + // @ts-ignore + for (const node of nodes) { + const mapping = this.handleIdRewrite(node, "node") + if (mapping !== undefined) { + mappings.set(mapping[0], mapping[1]) + } + } + + const ways = response.getElementsByTagName("way"); + // @ts-ignore + for (const way of ways) { + const mapping = this.handleIdRewrite(way, "way") + if (mapping !== undefined) { + mappings.set(mapping[0], mapping[1]) + } + } + this.changes.registerIdRewrites(mappings) + + } private async CloseChangeset(changesetId: number = undefined): Promise { const self = this diff --git a/Logic/Osm/OsmConnection.ts b/Logic/Osm/OsmConnection.ts index 7fd107838..3ef0593c4 100644 --- a/Logic/Osm/OsmConnection.ts +++ b/Logic/Osm/OsmConnection.ts @@ -50,26 +50,28 @@ export class OsmConnection { _dryRun: boolean; public preferencesHandler: OsmPreferences; public changesetHandler: ChangesetHandler; - private fakeUser: boolean; - private _onLoggedIn: ((userDetails: UserDetails) => void)[] = []; - private readonly _iframeMode: Boolean | boolean; - private readonly _singlePage: boolean; public readonly _oauth_config: { oauth_consumer_key: string, oauth_secret: string, url: string }; + private fakeUser: boolean; + private _onLoggedIn: ((userDetails: UserDetails) => void)[] = []; + private readonly _iframeMode: Boolean | boolean; + private readonly _singlePage: boolean; private isChecking = false; - constructor(options:{dryRun?: false | boolean, - fakeUser?: false | boolean, - allElements: ElementStorage, - changes: Changes, - oauth_token?: UIEventSource, - // Used to keep multiple changesets open and to write to the correct changeset - layoutName: string, - singlePage?: boolean, - osmConfiguration?: "osm" | "osm-test" } + constructor(options: { + dryRun?: false | boolean, + fakeUser?: false | boolean, + allElements: ElementStorage, + changes: Changes, + oauth_token?: UIEventSource, + // Used to keep multiple changesets open and to write to the correct changeset + layoutName: string, + singlePage?: boolean, + osmConfiguration?: "osm" | "osm-test" + } ) { this.fakeUser = options.fakeUser ?? false; this._singlePage = options.singlePage ?? true; @@ -79,7 +81,7 @@ export class OsmConnection { this._iframeMode = Utils.runningFromConsole ? false : window !== window.top; this.userDetails = new UIEventSource(new UserDetails(this._oauth_config.url), "userDetails"); - this.userDetails.data.dryRun = (options.dryRun ?? false) || (options.fakeUser ?? false) ; + this.userDetails.data.dryRun = (options.dryRun ?? false) || (options.fakeUser ?? false); if (options.fakeUser) { const ud = this.userDetails.data; ud.csCount = 5678 @@ -112,7 +114,7 @@ export class OsmConnection { self.AttemptLogin(); }, this.auth); - options. oauth_token.setData(undefined); + options.oauth_token.setData(undefined); } if (this.auth.authenticated()) { diff --git a/Logic/Osm/OsmObject.ts b/Logic/Osm/OsmObject.ts index cfc9c5234..d28d8f165 100644 --- a/Logic/Osm/OsmObject.ts +++ b/Logic/Osm/OsmObject.ts @@ -56,7 +56,7 @@ export abstract class OsmObject { OsmObject.objectCache.set(id, src); return src; } - + static async DownloadPropertiesOf(id: string): Promise { const splitted = id.split("/"); const idN = Number(splitted[1]); @@ -84,18 +84,18 @@ export abstract class OsmObject { const parsed = OsmObject.ParseObjects(rawData.elements); // Lets fetch the object we need for (const osmObject of parsed) { - if(osmObject.type !== type){ + if (osmObject.type !== type) { continue; } - if(osmObject.id !== idN){ + if (osmObject.id !== idN) { continue } // Found the one! return osmObject } throw "PANIC: requested object is not part of the response" - - + + } @@ -170,6 +170,43 @@ export abstract class OsmObject { const elements: any[] = data.elements; return OsmObject.ParseObjects(elements); } + + public static ParseObjects(elements: any[]): OsmObject[] { + const objects: OsmObject[] = []; + const allNodes: Map = new Map() + + for (const element of elements) { + const type = element.type; + const idN = element.id; + let osmObject: OsmObject = null + switch (type) { + case("node"): + const node = new OsmNode(idN); + allNodes.set(idN, node); + osmObject = node + node.SaveExtraData(element); + break; + case("way"): + osmObject = new OsmWay(idN); + const nodes = element.nodes.map(i => allNodes.get(i)); + osmObject.SaveExtraData(element, nodes) + break; + case("relation"): + osmObject = new OsmRelation(idN); + osmObject.SaveExtraData(element, []) + break; + } + + if (osmObject !== undefined && OsmObject.backendURL !== OsmObject.defaultBackend) { + osmObject.tags["_backend"] = OsmObject.backendURL + } + + osmObject?.LoadData(element) + objects.push(osmObject) + } + return objects; + } + protected static isPolygon(tags: any): boolean { for (const tagsKey in tags) { if (!tags.hasOwnProperty(tagsKey)) { @@ -206,42 +243,6 @@ export abstract class OsmObject { return result; } - public static ParseObjects(elements: any[]): OsmObject[] { - const objects: OsmObject[] = []; - const allNodes: Map = new Map() - - for (const element of elements) { - const type = element.type; - const idN = element.id; - let osmObject: OsmObject = null - switch (type) { - case("node"): - const node = new OsmNode(idN); - allNodes.set(idN, node); - osmObject = node - node.SaveExtraData(element); - break; - case("way"): - osmObject = new OsmWay(idN); - const nodes = element.nodes.map(i => allNodes.get(i)); - osmObject.SaveExtraData(element, nodes) - break; - case("relation"): - osmObject = new OsmRelation(idN); - osmObject.SaveExtraData(element, []) - break; - } - - if (osmObject !== undefined && OsmObject.backendURL !== OsmObject.defaultBackend) { - osmObject.tags["_backend"] = OsmObject.backendURL - } - - osmObject?.LoadData(element) - objects.push(osmObject) - } - return objects; - } - // The centerpoint of the feature, as [lat, lon] public abstract centerpoint(): [number, number]; diff --git a/Logic/Osm/Overpass.ts b/Logic/Osm/Overpass.ts index 257133307..f13f7a29b 100644 --- a/Logic/Osm/Overpass.ts +++ b/Logic/Osm/Overpass.ts @@ -42,13 +42,13 @@ export class Overpass { } const self = this; const json = await Utils.downloadJson(query) - + if (json.elements.length === 0 && json.remark !== undefined) { console.warn("Timeout or other runtime error while querying overpass", json.remark); throw `Runtime error (timeout or similar)${json.remark}` } - if(json.elements.length === 0){ - console.warn("No features for" ,json) + if (json.elements.length === 0) { + console.warn("No features for", json) } self._relationTracker.RegisterRelations(json) diff --git a/Logic/Osm/RelationsTracker.ts b/Logic/Osm/RelationsTracker.ts index f0528e77d..eb776907b 100644 --- a/Logic/Osm/RelationsTracker.ts +++ b/Logic/Osm/RelationsTracker.ts @@ -1,4 +1,3 @@ -import State from "../../State"; import {UIEventSource} from "../UIEventSource"; export interface Relation { @@ -21,10 +20,6 @@ export default class RelationsTracker { constructor() { } - public RegisterRelations(overpassJson: any): void { - this.UpdateMembershipTable(RelationsTracker.GetRelationElements(overpassJson)) - } - /** * Gets an overview of the relations - except for multipolygons. We don't care about those * @param overpassJson @@ -39,6 +34,10 @@ export default class RelationsTracker { return relations } + public RegisterRelations(overpassJson: any): void { + this.UpdateMembershipTable(RelationsTracker.GetRelationElements(overpassJson)) + } + /** * Build a mapping of {memberId --> {role in relation, id of relation} } * @param relations diff --git a/Logic/SimpleMetaTagger.ts b/Logic/SimpleMetaTagger.ts index cbe30c726..ff3175247 100644 --- a/Logic/SimpleMetaTagger.ts +++ b/Logic/SimpleMetaTagger.ts @@ -49,6 +49,8 @@ export default class SimpleMetaTagger { return true; } ) + public static readonly lazyTags: string[] = [].concat(...SimpleMetaTagger.metatags.filter(tagger => tagger.isLazy) + .map(tagger => tagger.keys)); private static latlon = new SimpleMetaTagger({ keys: ["_lat", "_lon"], doc: "The latitude and longitude of the point (or centerpoint in the case of a way/area)" @@ -78,83 +80,6 @@ export default class SimpleMetaTagger { return true; } ) - - /** - * Edits the given object to rewrite 'both'-tagging into a 'left-right' tagging scheme. - * These changes are performed in-place. - * - * Returns 'true' is at least one change has been made - * @param tags - */ - public static removeBothTagging(tags: any): boolean{ - let somethingChanged = false - /** - * Sets the key onto the properties (but doesn't overwrite if already existing) - */ - function set(k, value) { - if (tags[k] === undefined || tags[k] === "") { - tags[k] = value - somethingChanged = true - } - } - - if (tags["sidewalk"]) { - - const v = tags["sidewalk"] - switch (v) { - case "none": - case "no": - set("sidewalk:left", "no"); - set("sidewalk:right", "no"); - break - case "both": - set("sidewalk:left", "yes"); - set("sidewalk:right", "yes"); - break; - case "left": - set("sidewalk:left", "yes"); - set("sidewalk:right", "no"); - break; - case "right": - set("sidewalk:left", "no"); - set("sidewalk:right", "yes"); - break; - default: - set("sidewalk:left", v); - set("sidewalk:right", v); - break; - } - delete tags["sidewalk"] - somethingChanged = true - } - - - const regex = /\([^:]*\):both:\(.*\)/ - for (const key in tags) { - const v = tags[key] - if (key.endsWith(":both")) { - const strippedKey = key.substring(0, key.length - ":both".length) - set(strippedKey + ":left", v) - set(strippedKey + ":right", v) - delete tags[key] - continue - } - - const match = key.match(regex) - if (match !== null) { - const strippedKey = match[1] - const property = match[1] - set(strippedKey + ":left:" + property, v) - set(strippedKey + ":right:" + property, v) - console.log("Left-right rewritten " + key) - delete tags[key] - } - } - - - return somethingChanged - } - private static noBothButLeftRight = new SimpleMetaTagger( { keys: ["sidewalk:left", "sidewalk:right", "generic_key:left:property", "generic_key:right:property"], @@ -163,11 +88,11 @@ export default class SimpleMetaTagger { cleanupRetagger: true }, ((feature, state, layer) => { - - if(!layer.lineRendering.some(lr => lr.leftRightSensitive)){ + + if (!layer.lineRendering.some(lr => lr.leftRightSensitive)) { return; } - + return SimpleMetaTagger.removeBothTagging(feature.properties) }) ) @@ -451,9 +376,6 @@ export default class SimpleMetaTagger { SimpleMetaTagger.noBothButLeftRight ]; - public static readonly lazyTags: string[] = [].concat(...SimpleMetaTagger.metatags.filter(tagger => tagger.isLazy) - .map(tagger => tagger.keys)); - public readonly keys: string[]; public readonly doc: string; public readonly isLazy: boolean; @@ -481,6 +403,83 @@ export default class SimpleMetaTagger { } } + /** + * Edits the given object to rewrite 'both'-tagging into a 'left-right' tagging scheme. + * These changes are performed in-place. + * + * Returns 'true' is at least one change has been made + * @param tags + */ + public static removeBothTagging(tags: any): boolean { + let somethingChanged = false + + /** + * Sets the key onto the properties (but doesn't overwrite if already existing) + */ + function set(k, value) { + if (tags[k] === undefined || tags[k] === "") { + tags[k] = value + somethingChanged = true + } + } + + if (tags["sidewalk"]) { + + const v = tags["sidewalk"] + switch (v) { + case "none": + case "no": + set("sidewalk:left", "no"); + set("sidewalk:right", "no"); + break + case "both": + set("sidewalk:left", "yes"); + set("sidewalk:right", "yes"); + break; + case "left": + set("sidewalk:left", "yes"); + set("sidewalk:right", "no"); + break; + case "right": + set("sidewalk:left", "no"); + set("sidewalk:right", "yes"); + break; + default: + set("sidewalk:left", v); + set("sidewalk:right", v); + break; + } + delete tags["sidewalk"] + somethingChanged = true + } + + + const regex = /\([^:]*\):both:\(.*\)/ + for (const key in tags) { + const v = tags[key] + if (key.endsWith(":both")) { + const strippedKey = key.substring(0, key.length - ":both".length) + set(strippedKey + ":left", v) + set(strippedKey + ":right", v) + delete tags[key] + continue + } + + const match = key.match(regex) + if (match !== null) { + const strippedKey = match[1] + const property = match[1] + set(strippedKey + ":left:" + property, v) + set(strippedKey + ":right:" + property, v) + console.log("Left-right rewritten " + key) + delete tags[key] + } + } + + + return somethingChanged + } + public static HelpText(): BaseUIElement { const subElements: (string | BaseUIElement)[] = [ new Combine([ diff --git a/Logic/State/FeaturePipelineState.ts b/Logic/State/FeaturePipelineState.ts index 53f21341b..96a29beb6 100644 --- a/Logic/State/FeaturePipelineState.ts +++ b/Logic/State/FeaturePipelineState.ts @@ -97,7 +97,7 @@ export default class FeaturePipelineState extends MapState { }, this ); new SelectedFeatureHandler(Hash.hash, this) - + this.AddClusteringToMap(this.leafletMap) } diff --git a/Logic/State/FeatureSwitchState.ts b/Logic/State/FeatureSwitchState.ts index d02abe270..32aca8294 100644 --- a/Logic/State/FeatureSwitchState.ts +++ b/Logic/State/FeatureSwitchState.ts @@ -146,7 +146,7 @@ export default class FeatureSwitchState { this.featureSwitchIsTesting = QueryParameters.GetBooleanQueryParameter( "test", - ""+testingDefaultValue, + "" + testingDefaultValue, "If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org" ) @@ -158,7 +158,7 @@ export default class FeatureSwitchState { this.featureSwitchFakeUser = QueryParameters.GetBooleanQueryParameter("fake-user", "false", "If true, 'dryrun' mode is activated and a fake user account is loaded") - + this.overpassUrl = QueryParameters.GetQueryParameter("overpassUrl", (layoutToUse?.overpassUrl ?? Constants.defaultOverpassUrls).join(","), diff --git a/Logic/State/MapState.ts b/Logic/State/MapState.ts index 8939149f5..a4141f33c 100644 --- a/Logic/State/MapState.ts +++ b/Logic/State/MapState.ts @@ -14,7 +14,6 @@ import {QueryParameters} from "../Web/QueryParameters"; import * as personal from "../../assets/themes/personal/personal.json"; import FilterConfig from "../../Models/ThemeConfig/FilterConfig"; import ShowOverlayLayer from "../../UI/ShowDataLayer/ShowOverlayLayer"; -import {Coord} from "@turf/turf"; /** * Contains all the leaflet-map related state @@ -123,7 +122,21 @@ export default class MapState extends UserRelatedState { this.AddAllOverlaysToMap(this.leafletMap) } + public AddAllOverlaysToMap(leafletMap: UIEventSource) { + const initialized = new Set() + for (const overlayToggle of this.overlayToggles) { + new ShowOverlayLayer(overlayToggle.config, leafletMap, overlayToggle.isDisplayed) + initialized.add(overlayToggle.config) + } + for (const tileLayerSource of this.layoutToUse.tileLayerSources) { + if (initialized.has(tileLayerSource)) { + continue + } + new ShowOverlayLayer(tileLayerSource, leafletMap) + } + + } private lockBounds() { const layout = this.layoutToUse; @@ -201,21 +214,5 @@ export default class MapState extends UserRelatedState { return new UIEventSource(flayers); } - public AddAllOverlaysToMap(leafletMap: UIEventSource) { - const initialized = new Set() - for (const overlayToggle of this.overlayToggles) { - new ShowOverlayLayer(overlayToggle.config, leafletMap, overlayToggle.isDisplayed) - initialized.add(overlayToggle.config) - } - - for (const tileLayerSource of this.layoutToUse.tileLayerSources) { - if (initialized.has(tileLayerSource)) { - continue - } - new ShowOverlayLayer(tileLayerSource, leafletMap) - } - - } - } \ No newline at end of file diff --git a/Logic/State/UserRelatedState.ts b/Logic/State/UserRelatedState.ts index 68c32351a..b31cd55b1 100644 --- a/Logic/State/UserRelatedState.ts +++ b/Logic/State/UserRelatedState.ts @@ -64,7 +64,7 @@ export default class UserRelatedState extends ElementsState { if (layoutToUse?.hideFromOverview) { this.osmConnection.isLoggedIn.addCallbackAndRunD(loggedIn => { - if(loggedIn){ + if (loggedIn) { this.osmConnection .GetPreference("hidden-theme-" + layoutToUse?.id + "-enabled") .setData("true"); @@ -129,7 +129,7 @@ export default class UserRelatedState extends ElementsState { } return [home.lon, home.lat] })).map(homeLonLat => { - if(homeLonLat === undefined){ + if (homeLonLat === undefined) { return empty } return [{ @@ -148,5 +148,5 @@ export default class UserRelatedState extends ElementsState { this.homeLocation = new StaticFeatureSource(feature, false) } - + } \ No newline at end of file diff --git a/Logic/Tags/RegexTag.ts b/Logic/Tags/RegexTag.ts index 68840188b..8e120cb71 100644 --- a/Logic/Tags/RegexTag.ts +++ b/Logic/Tags/RegexTag.ts @@ -19,7 +19,7 @@ export class RegexTag extends TagsFilter { if (fromTag === undefined) { return; } - if(typeof fromTag === "number"){ + if (typeof fromTag === "number") { fromTag = "" + fromTag; } if (typeof possibleRegex === "string") { @@ -47,11 +47,11 @@ export class RegexTag extends TagsFilter { } matchesProperties(tags: any): boolean { - if(typeof this.key === "string"){ + if (typeof this.key === "string") { const value = tags[this.key] ?? "" return RegexTag.doesMatch(value, this.value) != this.invert; } - + for (const key in tags) { if (key === undefined) { continue; diff --git a/Logic/Tags/TagUtils.ts b/Logic/Tags/TagUtils.ts index 0ff6896bb..dd54d011a 100644 --- a/Logic/Tags/TagUtils.ts +++ b/Logic/Tags/TagUtils.ts @@ -27,14 +27,14 @@ export class TagUtils { return properties; } - static changeAsProperties(kvs : {k: string, v: string}[]): any { + static changeAsProperties(kvs: { k: string, v: string }[]): any { const tags = {} for (const kv of kvs) { tags[kv.k] = kv.v } return tags } - + /** * Given two hashes of {key --> values[]}, makes sure that every neededTag is present in availableTags */ diff --git a/Logic/UIEventSource.ts b/Logic/UIEventSource.ts index 8051128ce..bb862a94a 100644 --- a/Logic/UIEventSource.ts +++ b/Logic/UIEventSource.ts @@ -1,5 +1,4 @@ import {Utils} from "../Utils"; -import * as Events from "events"; export class UIEventSource { @@ -75,27 +74,6 @@ export class UIEventSource { promise?.catch(err => console.warn("Promise failed:", err)) return src } - - public AsPromise(): Promise{ - const self = this; - return new Promise((resolve, reject) => { - if(self.data !== undefined){ - resolve(self.data) - }else{ - self.addCallbackD(data => { - resolve(data) - return true; // return true to unregister as we only need to be called once - }) - } - }) - } - - public WaitForPromise(promise: Promise, onFail: ((any) => void)): UIEventSource { - const self = this; - promise?.then(d => self.setData(d)) - promise?.catch(err =>onFail(err)) - return this - } /** * Converts a promise into a UIVentsource, sets the UIEVentSource when the result is calculated. @@ -109,20 +87,6 @@ export class UIEventSource { promise?.catch(err => src.setData({error: err})) return src } - - public withEqualityStabilized(comparator: (t:T | undefined, t1:T | undefined) => boolean): UIEventSource{ - let oldValue = undefined; - return this.map(v => { - if(v == oldValue){ - return oldValue - } - if(comparator(oldValue, v)){ - return oldValue - } - oldValue = v; - return v; - }) - } /** * Given a UIEVentSource with a list, returns a new UIEventSource which is only updated if the _contents_ of the list are different. @@ -168,6 +132,57 @@ export class UIEventSource { return stable } + public static asFloat(source: UIEventSource): UIEventSource { + return source.map( + (str) => { + let parsed = parseFloat(str); + return isNaN(parsed) ? undefined : parsed; + }, + [], + (fl) => { + if (fl === undefined || isNaN(fl)) { + return undefined; + } + return ("" + fl).substr(0, 8); + } + ) + } + + public AsPromise(): Promise { + const self = this; + return new Promise((resolve, reject) => { + if (self.data !== undefined) { + resolve(self.data) + } else { + self.addCallbackD(data => { + resolve(data) + return true; // return true to unregister as we only need to be called once + }) + } + }) + } + + public WaitForPromise(promise: Promise, onFail: ((any) => void)): UIEventSource { + const self = this; + promise?.then(d => self.setData(d)) + promise?.catch(err => onFail(err)) + return this + } + + public withEqualityStabilized(comparator: (t: T | undefined, t1: T | undefined) => boolean): UIEventSource { + let oldValue = undefined; + return this.map(v => { + if (v == oldValue) { + return oldValue + } + if (comparator(oldValue, v)) { + return oldValue + } + oldValue = v; + return v; + }) + } + /** * Adds a callback * @@ -234,14 +249,14 @@ export class UIEventSource { sink.setData(null) } else if (newEventSource === undefined) { sink.setData(undefined) - }else if (!seenEventSources.has(newEventSource)) { + } else if (!seenEventSources.has(newEventSource)) { seenEventSources.add(newEventSource) newEventSource.addCallbackAndRun(resultData => { if (mapped.data === newEventSource) { sink.setData(resultData); } }) - }else{ + } else { // Already seen, so we don't have to add a callback, just update the value sink.setData(newEventSource.data) } @@ -300,7 +315,7 @@ export class UIEventSource { } public stabilized(millisToStabilize): UIEventSource { - if(Utils.runningFromConsole){ + if (Utils.runningFromConsole) { return this; } @@ -335,20 +350,4 @@ export class UIEventSource { } }) } - - public static asFloat(source: UIEventSource): UIEventSource { - return source.map( - (str) => { - let parsed = parseFloat(str); - return isNaN(parsed) ? undefined : parsed; - }, - [], - (fl) => { - if (fl === undefined || isNaN(fl)) { - return undefined; - } - return ("" + fl).substr(0, 8); - } - ) - } } \ No newline at end of file diff --git a/Logic/Web/QueryParameters.ts b/Logic/Web/QueryParameters.ts index 8af95a69b..6a34e46bb 100644 --- a/Logic/Web/QueryParameters.ts +++ b/Logic/Web/QueryParameters.ts @@ -55,8 +55,8 @@ export class QueryParameters { return source; } - public static GetBooleanQueryParameter(key: string, deflt: string, documentation?: string): UIEventSource{ - return QueryParameters.GetQueryParameter(key, deflt, documentation).map(str => str === "true", [], b => ""+b) + public static GetBooleanQueryParameter(key: string, deflt: string, documentation?: string): UIEventSource { + return QueryParameters.GetQueryParameter(key, deflt, documentation).map(str => str === "true", [], b => "" + b) } public static GenerateQueryParameterDocs(): string { diff --git a/Logic/Web/Wikidata.ts b/Logic/Web/Wikidata.ts index 0d9d5b6ba..376766472 100644 --- a/Logic/Web/Wikidata.ts +++ b/Logic/Web/Wikidata.ts @@ -64,11 +64,11 @@ export class WikidataResponse { } static extractClaims(claimsJson: any): Map> { - - const simplified = wds.simplify.claims(claimsJson, { + + const simplified = wds.simplify.claims(claimsJson, { timeConverter: 'simple-day' }) - + const claims = new Map>(); for (const claimId in simplified) { const claimsList: any[] = simplified[claimId] @@ -98,11 +98,11 @@ export class WikidataLexeme { for (const sense of json.senses) { const glosses = sense.glosses for (const language in glosses) { - let previousSenses = this.senses.get(language) - if(previousSenses === undefined){ + let previousSenses = this.senses.get(language) + if (previousSenses === undefined) { previousSenses = "" - }else{ - previousSenses = previousSenses+"; " + } else { + previousSenses = previousSenses + "; " } this.senses.set(language, previousSenses + glosses[language].value ?? "") } @@ -192,7 +192,7 @@ export default class Wikidata { return result; } - + public static async searchAndFetch( search: string, options?: WikidataSearchoptions @@ -248,7 +248,7 @@ export default class Wikidata { for (const identifierPrefix of Wikidata._identifierPrefixes) { if (value.startsWith(identifierPrefix)) { const trimmed = value.substring(identifierPrefix.length); - if(trimmed === ""){ + if (trimmed === "") { return undefined } const n = Number(trimmed) @@ -266,14 +266,14 @@ export default class Wikidata { return undefined; } - public static IdToArticle(id: string){ - if(id.startsWith("Q")){ - return "https://wikidata.org/wiki/"+id + public static IdToArticle(id: string) { + if (id.startsWith("Q")) { + return "https://wikidata.org/wiki/" + id } - if(id.startsWith("L")){ - return "https://wikidata.org/wiki/Lexeme:"+id + if (id.startsWith("L")) { + return "https://wikidata.org/wiki/Lexeme:" + id } - throw "Unknown id type: "+id + throw "Unknown id type: " + id } /** @@ -289,7 +289,7 @@ export default class Wikidata { const url = "https://www.wikidata.org/wiki/Special:EntityData/" + id + ".json"; const entities = (await Utils.downloadJsonCached(url, 10000)).entities - const firstKey = Array.from(Object.keys(entities))[0] // Roundabout way to fetch the entity; it might have been a redirect + const firstKey = Array.from(Object.keys(entities))[0] // Roundabout way to fetch the entity; it might have been a redirect const response = entities[firstKey] if (id.startsWith("L")) { diff --git a/Logic/Web/Wikimedia.ts b/Logic/Web/Wikimedia.ts index 8aa34068e..56ad0596b 100644 --- a/Logic/Web/Wikimedia.ts +++ b/Logic/Web/Wikimedia.ts @@ -9,8 +9,8 @@ export default class Wikimedia { * @param continueParameter: if the page indicates that more pages should be loaded, this uses a token to continue. Provided by wikimedia */ public static async GetCategoryContents(categoryName: string, - maxLoad = 10, - continueParameter: string = undefined): Promise { + maxLoad = 10, + continueParameter: string = undefined): Promise { if (categoryName === undefined || categoryName === null || categoryName === "") { return []; } diff --git a/Logic/Web/Wikipedia.ts b/Logic/Web/Wikipedia.ts index ede8e608d..3a548ee57 100644 --- a/Logic/Web/Wikipedia.ts +++ b/Logic/Web/Wikipedia.ts @@ -14,7 +14,7 @@ export default class Wikipedia { private static readonly classesToRemove = [ "shortdescription", "sidebar", - "infobox","infobox_v2", + "infobox", "infobox_v2", "noprint", "ambox", "mw-editsection", @@ -22,26 +22,27 @@ export default class Wikipedia { "mw-empty-elt", "hatnote" // Often redirects ] - + private static readonly idsToRemove = [ "sjabloon_zie" ] private static readonly _cache = new Map>() - + public static GetArticle(options: { pageName: string, - language?: "en" | string}): UIEventSource<{ success: string } | { error: any }>{ - const key = (options.language ?? "en")+":"+options.pageName + language?: "en" | string + }): UIEventSource<{ success: string } | { error: any }> { + const key = (options.language ?? "en") + ":" + options.pageName const cached = Wikipedia._cache.get(key) - if(cached !== undefined){ + if (cached !== undefined) { return cached } const v = UIEventSource.FromPromiseWithErr(Wikipedia.GetArticleAsync(options)) Wikipedia._cache.set(key, v) return v; } - + public static async GetArticleAsync(options: { pageName: string, language?: "en" | string @@ -57,24 +58,22 @@ export default class Wikipedia { const content = Array.from(div.children)[0] for (const forbiddenClass of Wikipedia.classesToRemove) { - const toRemove = content.getElementsByClassName(forbiddenClass) + const toRemove = content.getElementsByClassName(forbiddenClass) for (const toRemoveElement of Array.from(toRemove)) { toRemoveElement.parentElement?.removeChild(toRemoveElement) } } for (const forbiddenId of Wikipedia.idsToRemove) { - const toRemove = content.querySelector("#"+forbiddenId) + const toRemove = content.querySelector("#" + forbiddenId) toRemove?.parentElement?.removeChild(toRemove) } - - + const links = Array.from(content.getElementsByTagName("a")) // Rewrite relative links to absolute links + open them in a new tab - links.filter(link => link.getAttribute("href")?.startsWith("/") ?? false). - forEach(link => { + links.filter(link => link.getAttribute("href")?.startsWith("/") ?? false).forEach(link => { link.target = '_blank' // note: link.getAttribute("href") gets the textual value, link.href is the rewritten version which'll contain the host for relative paths link.href = `https://${language}.wikipedia.org${link.getAttribute("href")}`; diff --git a/Models/Constants.ts b/Models/Constants.ts index 449d4ca70..e491ea067 100644 --- a/Models/Constants.ts +++ b/Models/Constants.ts @@ -17,7 +17,6 @@ export default class Constants { // Doesn't support nwr: "https://overpass.openstreetmap.fr/api/interpreter" ] - // The user journey states thresholds when a new feature gets unlocked public static userJourney = { diff --git a/Models/Denomination.ts b/Models/Denomination.ts index 04e4077d7..d79118f51 100644 --- a/Models/Denomination.ts +++ b/Models/Denomination.ts @@ -44,13 +44,13 @@ export class Denomination { get human(): Translation { return this._human.Clone() } - + get humanSingular(): Translation { return (this._humanSingular ?? this._human).Clone() } - - getToggledHuman(isSingular: UIEventSource): BaseUIElement{ - if(this._humanSingular === undefined){ + + getToggledHuman(isSingular: UIEventSource): BaseUIElement { + if (this._humanSingular === undefined) { return this.human } return new Toggle( @@ -59,7 +59,7 @@ export class Denomination { isSingular ) } - + public canonicalValue(value: string, actAsDefault?: boolean) { if (value === undefined) { return undefined; @@ -68,12 +68,12 @@ export class Denomination { if (stripped === null) { return null; } - if(stripped === "1" && this._canonicalSingular !== undefined){ - return "1 "+this._canonicalSingular + if (stripped === "1" && this._canonicalSingular !== undefined) { + return "1 " + this._canonicalSingular } return stripped + " " + this.canonical; } - + /** * Returns the core value (without unit) if: * - the value ends with the canonical or an alternative value (or begins with if prefix is set) @@ -89,30 +89,31 @@ export class Denomination { value = value.toLowerCase() const self = this; - function startsWith(key){ - if(self.prefix){ + + function startsWith(key) { + if (self.prefix) { return value.startsWith(key) - }else{ + } else { return value.endsWith(key) } } - - function substr(key){ - if(self.prefix){ + + function substr(key) { + if (self.prefix) { return value.substr(key.length).trim() - }else{ + } else { return value.substring(0, value.length - key.length).trim() } } - - if(this.canonical !== "" && startsWith(this.canonical.toLowerCase())){ + + if (this.canonical !== "" && startsWith(this.canonical.toLowerCase())) { return substr(this.canonical) - } - - if(this._canonicalSingular !== undefined && this._canonicalSingular !== "" && startsWith(this._canonicalSingular)){ + } + + if (this._canonicalSingular !== undefined && this._canonicalSingular !== "" && startsWith(this._canonicalSingular)) { return substr(this._canonicalSingular) } - + for (const alternativeValue of this.alternativeDenominations) { if (startsWith(alternativeValue)) { return substr(alternativeValue); diff --git a/Models/FilteredLayer.ts b/Models/FilteredLayer.ts index 68ffb4483..f57cea891 100644 --- a/Models/FilteredLayer.ts +++ b/Models/FilteredLayer.ts @@ -1,10 +1,9 @@ import {UIEventSource} from "../Logic/UIEventSource"; import LayerConfig from "./ThemeConfig/LayerConfig"; -import {And} from "../Logic/Tags/And"; import FilterConfig from "./ThemeConfig/FilterConfig"; export default interface FilteredLayer { readonly isDisplayed: UIEventSource; - readonly appliedFilters: UIEventSource<{filter: FilterConfig, selected: number}[]>; + readonly appliedFilters: UIEventSource<{ filter: FilterConfig, selected: number }[]>; readonly layerDef: LayerConfig; } \ No newline at end of file diff --git a/Models/ThemeConfig/FilterConfig.ts b/Models/ThemeConfig/FilterConfig.ts index 7a032c6de..833ae5050 100644 --- a/Models/ThemeConfig/FilterConfig.ts +++ b/Models/ThemeConfig/FilterConfig.ts @@ -18,7 +18,7 @@ export default class FilterConfig { if (json.id === undefined) { throw `A filter without id was found at ${context}` } - if(json.id.match(/^[a-zA-Z0-9_-]*$/) === null){ + if (json.id.match(/^[a-zA-Z0-9_-]*$/) === null) { throw `A filter with invalid id was found at ${context}. Ids should only contain letters, numbers or - _` } @@ -42,9 +42,9 @@ export default class FilterConfig { return {question: question, osmTags: osmTags}; }); - - if(this.options.length > 1 && this.options[0].osmTags["and"]?.length !== 0){ - throw "Error in "+context+"."+this.id+": the first option of a multi-filter should always be the 'reset' option and not have any filters" + + if (this.options.length > 1 && this.options[0].osmTags["and"]?.length !== 0) { + throw "Error in " + context + "." + this.id + ": the first option of a multi-filter should always be the 'reset' option and not have any filters" } } } \ No newline at end of file diff --git a/Models/ThemeConfig/Json/LayerConfigJson.ts b/Models/ThemeConfig/Json/LayerConfigJson.ts index 1d0e7f8fd..c45548bb9 100644 --- a/Models/ThemeConfig/Json/LayerConfigJson.ts +++ b/Models/ThemeConfig/Json/LayerConfigJson.ts @@ -64,14 +64,14 @@ export interface LayerConfigJson { * NOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: "key=value"} * While still supported, this is considered deprecated */ - source: ({ osmTags: AndOrTagConfigJson | string, overpassScript?: string } | + source: ({ osmTags: AndOrTagConfigJson | string, overpassScript?: string } | { osmTags: AndOrTagConfigJson | string, geoJson: string, geoJsonZoomLevel?: number, isOsmCache?: boolean, mercatorCrs?: boolean }) & ({ /** * The maximum amount of seconds that a tile is allowed to linger in the cache */ maxCacheAge?: number }) - + /** * * A list of extra tags to calculate, specified as "keyToAssignTo=javascript-expression". @@ -93,8 +93,8 @@ export interface LayerConfigJson { /** * This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view. - * This is useful to hide certain features from view. - * + * This is useful to hide certain features from view. + * * Important: hiding features does not work dynamically, but is only calculated when the data is first renders. * This implies that it is not possible to hide a feature after a tagging change * @@ -207,15 +207,13 @@ export interface LayerConfigJson { * This is mainly create questions for a 'left' and a 'right' side of the road. * These will be grouped and questions will be asked together */ - tagRenderings?: (string | {builtin: string, override: any} | TagRenderingConfigJson | { + tagRenderings?: (string | { builtin: string, override: any } | TagRenderingConfigJson | { rewrite: { sourceString: string, into: string[] }[], - renderings: (string | {builtin: string, override: any} | TagRenderingConfigJson)[] + renderings: (string | { builtin: string, override: any } | TagRenderingConfigJson)[] }) [], - - /** @@ -273,15 +271,15 @@ export interface LayerConfigJson { /** * Indicates if a point can be moved and configures the modalities. - * + * * A feature can be moved by MapComplete if: - * + * * - It is a point * - The point is _not_ part of a way or a a relation. - * + * * Off by default. Can be enabled by setting this flag or by configuring. */ - allowMove?: boolean | MoveConfigJson + allowMove?: boolean | MoveConfigJson /** * IF set, a 'split this road' button is shown diff --git a/Models/ThemeConfig/Json/LayoutConfigJson.ts b/Models/ThemeConfig/Json/LayoutConfigJson.ts index de2abe0a1..27d10823e 100644 --- a/Models/ThemeConfig/Json/LayoutConfigJson.ts +++ b/Models/ThemeConfig/Json/LayoutConfigJson.ts @@ -1,4 +1,3 @@ -import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; import {LayerConfigJson} from "./LayerConfigJson"; import TilesourceConfigJson from "./TilesourceConfigJson"; @@ -15,7 +14,7 @@ import TilesourceConfigJson from "./TilesourceConfigJson"; * General remark: a type (string | any) indicates either a fixed or a translatable string. */ export interface LayoutConfigJson { - + /** * The id of this layout. * @@ -216,7 +215,7 @@ export interface LayoutConfigJson { */ maxZoom?: number, /** - * The number of elements per tile needed to start clustering + * The number of elements per tile needed to start clustering * If clustering is defined, defaults to 25 */ minNeededElements?: number diff --git a/Models/ThemeConfig/Json/LineRenderingConfigJson.ts b/Models/ThemeConfig/Json/LineRenderingConfigJson.ts index 708366767..5bcd7e32d 100644 --- a/Models/ThemeConfig/Json/LineRenderingConfigJson.ts +++ b/Models/ThemeConfig/Json/LineRenderingConfigJson.ts @@ -2,9 +2,9 @@ import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; /** * The LineRenderingConfig gives all details onto how to render a single line of a feature. - * + * * This can be used if: - * + * * - The feature is a line * - The feature is an area */ @@ -28,9 +28,9 @@ export default interface LineRenderingConfigJson { dashArray?: string | TagRenderingConfigJson /** - * The number of pixels this line should be moved. + * The number of pixels this line should be moved. * Use a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line). - * + * * IMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right') * This simplifies programming. Refer to the CalculatedTags.md-documentation for more details */ diff --git a/Models/ThemeConfig/Json/PointRenderingConfigJson.ts b/Models/ThemeConfig/Json/PointRenderingConfigJson.ts index 45f34b755..75e663361 100644 --- a/Models/ThemeConfig/Json/PointRenderingConfigJson.ts +++ b/Models/ThemeConfig/Json/PointRenderingConfigJson.ts @@ -3,9 +3,9 @@ import {AndOrTagConfigJson} from "./TagConfigJson"; /** * The PointRenderingConfig gives all details onto how to render a single point of a feature. - * + * * This can be used if: - * + * * - The feature is a point * - To render something at the centroid of an area, or at the start, end or projected centroid of a way */ @@ -16,7 +16,7 @@ export default interface PointRenderingConfigJson { * Using `location: ["point", "centroid"] will always render centerpoint */ location: ("point" | "centroid" | "start" | "end")[] - + /** * The icon for an element. * Note that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets. diff --git a/Models/ThemeConfig/Json/TagRenderingConfigJson.ts b/Models/ThemeConfig/Json/TagRenderingConfigJson.ts index 0be6c6967..e00bf8487 100644 --- a/Models/ThemeConfig/Json/TagRenderingConfigJson.ts +++ b/Models/ThemeConfig/Json/TagRenderingConfigJson.ts @@ -17,7 +17,7 @@ export interface TagRenderingConfigJson { * The first tagRendering of a group will always be a sticky element. */ group?: string - + /** * Renders this value. Note that "{key}"-parts are substituted by the corresponding values of the element. * If neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value. @@ -89,13 +89,13 @@ export interface TagRenderingConfigJson { * Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes */ mappings?: { - + /** * If this condition is met, then the text under `then` will be shown. * If no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM. - * + * * For example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'} - * + * * This can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'} */ if: AndOrTagConfigJson | string, diff --git a/Models/ThemeConfig/Json/UnitConfigJson.ts b/Models/ThemeConfig/Json/UnitConfigJson.ts index c8c22afc0..5eba5eaf4 100644 --- a/Models/ThemeConfig/Json/UnitConfigJson.ts +++ b/Models/ThemeConfig/Json/UnitConfigJson.ts @@ -12,12 +12,11 @@ export default interface UnitConfigJson { /** * The possible denominations */ - applicableUnits:ApplicableUnitJson[] + applicableUnits: ApplicableUnitJson[] } -export interface ApplicableUnitJson -{ +export interface ApplicableUnitJson { /** * The canonical value which will be added to the text. * e.g. "m" for meters @@ -28,8 +27,8 @@ export interface ApplicableUnitJson * The canonical denomination in the case that the unit is precisely '1' */ canonicalDenominationSingular?: string, - - + + /** * A list of alternative values which can occur in the OSM database - used for parsing. */ diff --git a/Models/ThemeConfig/LayerConfig.ts b/Models/ThemeConfig/LayerConfig.ts index 5c8090d61..a7e3e992a 100644 --- a/Models/ThemeConfig/LayerConfig.ts +++ b/Models/ThemeConfig/LayerConfig.ts @@ -264,7 +264,7 @@ export default class LayerConfig extends WithContextLoader { } } - public defaultIcon() : BaseUIElement | undefined{ + public defaultIcon(): BaseUIElement | undefined { const mapRendering = this.mapRendering.filter(r => r.location.has("point"))[0] if (mapRendering === undefined) { return undefined diff --git a/Models/ThemeConfig/LayoutConfig.ts b/Models/ThemeConfig/LayoutConfig.ts index 8702a3cbf..bfa9ceaf6 100644 --- a/Models/ThemeConfig/LayoutConfig.ts +++ b/Models/ThemeConfig/LayoutConfig.ts @@ -52,8 +52,8 @@ export default class LayoutConfig { public readonly overpassMaxZoom: number public readonly osmApiTileSize: number public readonly official: boolean; - public readonly trackAllNodes : boolean; - + public readonly trackAllNodes: boolean; + constructor(json: LayoutConfigJson, official = true, context?: string) { this.official = official; this.id = json.id; @@ -63,7 +63,7 @@ export default class LayoutConfig { this.version = json.version; this.language = []; this.trackAllNodes = false - + if (typeof json.language === "string") { this.language = [json.language]; } else { @@ -87,32 +87,32 @@ export default class LayoutConfig { this.startZoom = json.startZoom; this.startLat = json.startLat; this.startLon = json.startLon; - if(json.widenFactor <= 0){ - throw "Widenfactor too small, shoud be > 0" + if (json.widenFactor <= 0) { + throw "Widenfactor too small, shoud be > 0" } - if(json.widenFactor > 20){ - throw "Widenfactor is very big, use a value between 1 and 5 (current value is "+json.widenFactor+") at "+context + if (json.widenFactor > 20) { + throw "Widenfactor is very big, use a value between 1 and 5 (current value is " + json.widenFactor + ") at " + context } - + this.widenFactor = json.widenFactor ?? 1.5; - + this.defaultBackgroundId = json.defaultBackgroundId; - this.tileLayerSources = (json.tileLayerSources??[]).map((config, i) => new TilesourceConfig(config, `${this.id}.tileLayerSources[${i}]`)) - const layerInfo = LayoutConfig.ExtractLayers(json, official, context); + this.tileLayerSources = (json.tileLayerSources ?? []).map((config, i) => new TilesourceConfig(config, `${this.id}.tileLayerSources[${i}]`)) + const layerInfo = LayoutConfig.ExtractLayers(json, official, context); this.layers = layerInfo.layers this.trackAllNodes = layerInfo.extractAllNodes - - + + this.clustering = { maxZoom: 16, minNeededElements: 25, }; - if(json.clustering === false){ + if (json.clustering === false) { this.clustering = { maxZoom: 0, minNeededElements: 100000, }; - }else if (json.clustering) { + } else if (json.clustering) { this.clustering = { maxZoom: json.clustering.maxZoom ?? 18, minNeededElements: json.clustering.minNeededElements ?? 25, @@ -124,7 +124,7 @@ export default class LayoutConfig { if (json.hideInOverview) { throw "The json for " + this.id + " contains a 'hideInOverview'. Did you mean hideFromOverview instead?" } - this.lockLocation = <[[number, number], [number, number]]> json.lockLocation ?? undefined; + this.lockLocation = <[[number, number], [number, number]]>json.lockLocation ?? undefined; this.enableUserBadge = json.enableUserBadge ?? true; this.enableShareScreen = json.enableShareScreen ?? true; this.enableMoreQuests = json.enableMoreQuests ?? true; @@ -139,10 +139,10 @@ export default class LayoutConfig { this.enableIframePopout = json.enableIframePopout ?? true this.customCss = json.customCss; this.overpassUrl = Constants.defaultOverpassUrls - if(json.overpassUrl !== undefined){ - if(typeof json.overpassUrl === "string"){ + if (json.overpassUrl !== undefined) { + if (typeof json.overpassUrl === "string") { this.overpassUrl = [json.overpassUrl] - }else{ + } else { this.overpassUrl = json.overpassUrl } } @@ -152,11 +152,11 @@ export default class LayoutConfig { } - private static ExtractLayers(json: LayoutConfigJson, official: boolean, context: string): {layers: LayerConfig[], extractAllNodes: boolean} { + private static ExtractLayers(json: LayoutConfigJson, official: boolean, context: string): { layers: LayerConfig[], extractAllNodes: boolean } { const result: LayerConfig[] = [] let exportAllNodes = false json.layers.forEach((layer, i) => { - + if (typeof layer === "string") { if (AllKnownLayers.sharedLayersJson.get(layer) !== undefined) { if (json.overrideAll !== undefined) { @@ -183,7 +183,7 @@ export default class LayoutConfig { result.push(newLayer) return } - + // @ts-ignore let names = layer.builtin; if (typeof names === "string") { @@ -191,11 +191,11 @@ export default class LayoutConfig { } names.forEach(name => { - if(name === "type_node"){ + if (name === "type_node") { // This is a very special layer which triggers special behaviour exportAllNodes = true; } - + const shared = AllKnownLayers.sharedLayersJson.get(name); if (shared === undefined) { throw `Unknown shared/builtin layer ${name} at ${context}.layers[${i}]. Available layers are ${Array.from(AllKnownLayers.sharedLayersJson.keys()).join(", ")}`; @@ -287,8 +287,8 @@ export default class LayoutConfig { }) return new LayoutConfig(JSON.parse(originalJson), false, "Layout rewriting") } - - public isLeftRightSensitive(){ + + public isLeftRightSensitive() { return this.layers.some(l => l.isLeftRightSensitive()) } diff --git a/Models/ThemeConfig/LineRenderingConfig.ts b/Models/ThemeConfig/LineRenderingConfig.ts index 1f0397888..41e3dd993 100644 --- a/Models/ThemeConfig/LineRenderingConfig.ts +++ b/Models/ThemeConfig/LineRenderingConfig.ts @@ -1,6 +1,4 @@ -import PointRenderingConfigJson from "./Json/PointRenderingConfigJson"; import WithContextLoader from "./WithContextLoader"; -import {UIEventSource} from "../../Logic/UIEventSource"; import TagRenderingConfig from "./TagRenderingConfig"; import {Utils} from "../../Utils"; import LineRenderingConfigJson from "./Json/LineRenderingConfigJson"; diff --git a/Models/ThemeConfig/PointRenderingConfig.ts b/Models/ThemeConfig/PointRenderingConfig.ts index 911a2ed54..8e047c24b 100644 --- a/Models/ThemeConfig/PointRenderingConfig.ts +++ b/Models/ThemeConfig/PointRenderingConfig.ts @@ -15,7 +15,7 @@ import {VariableUiElement} from "../../UI/Base/VariableUIElement"; export default class PointRenderingConfig extends WithContextLoader { - private static readonly allowed_location_codes = new Set(["point", "centroid","start","end"]) + private static readonly allowed_location_codes = new Set(["point", "centroid", "start", "end"]) public readonly location: Set<"point" | "centroid" | "start" | "end"> public readonly icon: TagRenderingConfig; @@ -26,34 +26,34 @@ export default class PointRenderingConfig extends WithContextLoader { constructor(json: PointRenderingConfigJson, context: string) { super(json, context) - - if(typeof json.location === "string"){ + + if (typeof json.location === "string") { json.location = [json.location] } - + this.location = new Set(json.location) - + this.location.forEach(l => { const allowed = PointRenderingConfig.allowed_location_codes - if(!allowed.has(l)){ + if (!allowed.has(l)) { throw `A point rendering has an invalid location: '${l}' is not one of ${Array.from(allowed).join(", ")} (at ${context}.location)` } }) - - if(json.icon === undefined && json.label === undefined){ + + if (json.icon === undefined && json.label === undefined) { throw `A point rendering should define at least an icon or a label` } - if(this.location.size == 0){ - throw "A pointRendering should have at least one 'location' to defined where it should be rendered. (At "+context+".location)" + if (this.location.size == 0) { + throw "A pointRendering should have at least one 'location' to defined where it should be rendered. (At " + context + ".location)" } this.icon = this.tr("icon", ""); this.iconBadges = (json.iconBadges ?? []).map((overlay, i) => { - let tr : TagRenderingConfig; + let tr: TagRenderingConfig; if (typeof overlay.then === "string" && SharedTagRenderings.SharedIcons.get(overlay.then) !== undefined) { tr = SharedTagRenderings.SharedIcons.get(overlay.then); - }else{ + } else { tr = new TagRenderingConfig( overlay.then, `iconBadges.${i}` @@ -77,6 +77,43 @@ export default class PointRenderingConfig extends WithContextLoader { this.rotation = this.tr("rotation", "0"); } + /** + * Given a single HTML spec (either a single image path OR "image_path_to_known_svg:fill-colour", returns a fixedUIElement containing that + * The element will fill 100% and be positioned absolutely with top:0 and left: 0 + */ + private static FromHtmlSpec(htmlSpec: string, style: string, isBadge = false): BaseUIElement { + if (htmlSpec === undefined) { + return undefined; + } + const match = htmlSpec.match(/([a-zA-Z0-9_]*):([^;]*)/); + if (match !== null && Svg.All[match[1] + ".svg"] !== undefined) { + const svg = (Svg.All[match[1] + ".svg"] as string) + const targetColor = match[2] + const img = new Img(svg.replace(/#000000/g, targetColor), true) + .SetStyle(style) + if (isBadge) { + img.SetClass("badge") + } + return img + } else { + return new FixedUiElement(``); + } + } + + private static FromHtmlMulti(multiSpec: string, rotation: string, isBadge: boolean, defaultElement: BaseUIElement = undefined) { + if (multiSpec === undefined) { + return defaultElement + } + const style = `width:100%;height:100%;transform: rotate( ${rotation} );display:block;position: absolute; top: 0; left: 0`; + + const htmlDefs = multiSpec.trim()?.split(";") ?? [] + const elements = Utils.NoEmpty(htmlDefs).map(def => PointRenderingConfig.FromHtmlSpec(def, style, isBadge)) + if (elements.length === 0) { + return defaultElement + } else { + return new Combine(elements).SetClass("relative block w-full h-full") + } + } public ExtractImages(): Set { const parts: Set[] = []; @@ -92,44 +129,6 @@ export default class PointRenderingConfig extends WithContextLoader { return allIcons; } - /** - * Given a single HTML spec (either a single image path OR "image_path_to_known_svg:fill-colour", returns a fixedUIElement containing that - * The element will fill 100% and be positioned absolutely with top:0 and left: 0 - */ - private static FromHtmlSpec(htmlSpec: string, style: string, isBadge = false): BaseUIElement { - if (htmlSpec === undefined) { - return undefined; - } - const match = htmlSpec.match(/([a-zA-Z0-9_]*):([^;]*)/); - if (match !== null && Svg.All[match[1] + ".svg"] !== undefined) { - const svg = (Svg.All[match[1] + ".svg"] as string) - const targetColor = match[2] - const img = new Img(svg.replace(/#000000/g, targetColor), true) - .SetStyle(style) - if(isBadge){ - img.SetClass("badge") - } - return img - } else { - return new FixedUiElement(``); - } - } - - private static FromHtmlMulti(multiSpec: string, rotation: string , isBadge: boolean, defaultElement: BaseUIElement = undefined){ - if(multiSpec === undefined){ - return defaultElement - } - const style = `width:100%;height:100%;transform: rotate( ${rotation} );display:block;position: absolute; top: 0; left: 0`; - - const htmlDefs = multiSpec.trim()?.split(";") ?? [] - const elements = Utils.NoEmpty(htmlDefs).map(def => PointRenderingConfig.FromHtmlSpec(def, style, isBadge)) - if (elements.length === 0) { - return defaultElement - } else { - return new Combine(elements).SetClass("relative block w-full h-full") - } - } - public GetSimpleIcon(tags: UIEventSource): BaseUIElement { const self = this; if (this.icon === undefined) { @@ -137,58 +136,16 @@ export default class PointRenderingConfig extends WithContextLoader { } return new VariableUiElement(tags.map(tags => { const rotation = Utils.SubstituteKeys(self.rotation?.GetRenderValue(tags)?.txt ?? "0deg", tags) - + const htmlDefs = Utils.SubstituteKeys(self.icon.GetRenderValue(tags)?.txt, tags) - let defaultPin : BaseUIElement = undefined - if(self.label === undefined){ - defaultPin = Svg.teardrop_with_hole_green_svg() + let defaultPin: BaseUIElement = undefined + if (self.label === undefined) { + defaultPin = Svg.teardrop_with_hole_green_svg() } - return PointRenderingConfig.FromHtmlMulti(htmlDefs, rotation,false, defaultPin) + return PointRenderingConfig.FromHtmlMulti(htmlDefs, rotation, false, defaultPin) })).SetClass("w-full h-full block") } - private GetBadges(tags: UIEventSource): BaseUIElement { - if (this.iconBadges.length === 0) { - return undefined - } - return new VariableUiElement( - tags.map(tags => { - - const badgeElements = this.iconBadges.map(badge => { - - if (!badge.if.matchesProperties(tags)) { - // Doesn't match... - return undefined - } - - const htmlDefs = Utils.SubstituteKeys(badge.then.GetRenderValue(tags)?.txt, tags) - const badgeElement= PointRenderingConfig.FromHtmlMulti(htmlDefs, "0", true)?.SetClass("block relative") - if(badgeElement === undefined){ - return undefined; - } - return new Combine([badgeElement]).SetStyle("width: 1.5rem").SetClass("block") - - }) - - return new Combine(badgeElements).SetClass("inline-flex h-full") - })).SetClass("absolute bottom-0 right-1/3 h-1/2 w-0") - } - - private GetLabel(tags: UIEventSource): BaseUIElement { - if (this.label === undefined) { - return undefined; - } - const self = this; - return new VariableUiElement(tags.map(tags => { - const label = self.label - ?.GetRenderValue(tags) - ?.Subs(tags) - ?.SetClass("block text-center") - return new Combine([label]).SetClass("flex flex-col items-center mt-1") - })) - - } - public GenerateLeafletStyle( tags: UIEventSource, clickable: boolean, @@ -246,9 +203,9 @@ export default class PointRenderingConfig extends WithContextLoader { const iconAndBadges = new Combine([this.GetSimpleIcon(tags), this.GetBadges(tags)]) .SetClass("block relative") - if(!options?.noSize){ + if (!options?.noSize) { iconAndBadges.SetStyle(`width: ${iconW}px; height: ${iconH}px`) - }else{ + } else { iconAndBadges.SetClass("w-full h-full") } @@ -264,4 +221,46 @@ export default class PointRenderingConfig extends WithContextLoader { }; } + private GetBadges(tags: UIEventSource): BaseUIElement { + if (this.iconBadges.length === 0) { + return undefined + } + return new VariableUiElement( + tags.map(tags => { + + const badgeElements = this.iconBadges.map(badge => { + + if (!badge.if.matchesProperties(tags)) { + // Doesn't match... + return undefined + } + + const htmlDefs = Utils.SubstituteKeys(badge.then.GetRenderValue(tags)?.txt, tags) + const badgeElement = PointRenderingConfig.FromHtmlMulti(htmlDefs, "0", true)?.SetClass("block relative") + if (badgeElement === undefined) { + return undefined; + } + return new Combine([badgeElement]).SetStyle("width: 1.5rem").SetClass("block") + + }) + + return new Combine(badgeElements).SetClass("inline-flex h-full") + })).SetClass("absolute bottom-0 right-1/3 h-1/2 w-0") + } + + private GetLabel(tags: UIEventSource): BaseUIElement { + if (this.label === undefined) { + return undefined; + } + const self = this; + return new VariableUiElement(tags.map(tags => { + const label = self.label + ?.GetRenderValue(tags) + ?.Subs(tags) + ?.SetClass("block text-center") + return new Combine([label]).SetClass("flex flex-col items-center mt-1") + })) + + } + } \ No newline at end of file diff --git a/Models/ThemeConfig/SourceConfig.ts b/Models/ThemeConfig/SourceConfig.ts index b378d0acd..7cb58124b 100644 --- a/Models/ThemeConfig/SourceConfig.ts +++ b/Models/ThemeConfig/SourceConfig.ts @@ -8,7 +8,7 @@ export default class SourceConfig { public readonly geojsonSource?: string; public readonly geojsonZoomLevel?: number; public readonly isOsmCacheLayer: boolean; - public readonly mercatorCrs: boolean; + public readonly mercatorCrs: boolean; constructor(params: { mercatorCrs?: boolean; @@ -36,11 +36,12 @@ export default class SourceConfig { console.error(params) throw `Source said it is a OSM-cached layer, but didn't define the actual source of the cache (in context ${context})` } - if(params.geojsonSource !== undefined && params.geojsonSourceLevel !== undefined){ - if(! ["x","y","x_min","x_max","y_min","Y_max"].some(toSearch => params.geojsonSource.indexOf(toSearch) > 0)){ + if (params.geojsonSource !== undefined && params.geojsonSourceLevel !== undefined) { + if (!["x", "y", "x_min", "x_max", "y_min", "Y_max"].some(toSearch => params.geojsonSource.indexOf(toSearch) > 0)) { throw `Source defines a geojson-zoomLevel, but does not specify {x} nor {y} (or equivalent), this is probably a bug (in context ${context})` - }} - this.osmTags = params.osmTags ?? new RegexTag("id",/.*/); + } + } + this.osmTags = params.osmTags ?? new RegexTag("id", /.*/); this.overpassScript = params.overpassScript; this.geojsonSource = params.geojsonSource; this.geojsonZoomLevel = params.geojsonSourceLevel; diff --git a/Models/ThemeConfig/TagRenderingConfig.ts b/Models/ThemeConfig/TagRenderingConfig.ts index 7ef2c5fec..ae053f3a0 100644 --- a/Models/ThemeConfig/TagRenderingConfig.ts +++ b/Models/ThemeConfig/TagRenderingConfig.ts @@ -49,14 +49,14 @@ export default class TagRenderingConfig { this.question = null; this.condition = null; } - - - if(typeof json === "number"){ - this.render = Translations.WT( ""+json) + + + if (typeof json === "number") { + this.render = Translations.WT("" + json) return; } - - + + if (json === undefined) { throw "Initing a TagRenderingConfig with undefined in " + context; } @@ -66,7 +66,7 @@ export default class TagRenderingConfig { return; } - + this.id = json.id ?? ""; this.group = json.group ?? ""; this.render = Translations.T(json.render, context + ".render"); @@ -74,7 +74,7 @@ export default class TagRenderingConfig { this.condition = TagUtils.Tag(json.condition ?? {"and": []}, `${context}.condition`); if (json.freeform) { - if(json.freeform.addExtraTags !== undefined && json.freeform.addExtraTags.map === undefined){ + if (json.freeform.addExtraTags !== undefined && json.freeform.addExtraTags.map === undefined) { throw `Freeform.addExtraTags should be a list of strings - not a single string (at ${context})` } this.freeform = { @@ -134,8 +134,8 @@ export default class TagRenderingConfig { if (typeof mapping.if !== "string" && mapping.if["length"] !== undefined) { throw `${ctx}: Invalid mapping: "if" is defined as an array. Use {"and": } or {"or": } instead` } - - if(mapping.addExtraTags !== undefined && this.multiAnswer){ + + if (mapping.addExtraTags !== undefined && this.multiAnswer) { throw `${ctx}: Invalid mapping: got a multi-Answer with addExtraTags; this is not allowed` } @@ -150,7 +150,7 @@ export default class TagRenderingConfig { ifnot: (mapping.ifnot !== undefined ? TagUtils.Tag(mapping.ifnot, `${ctx}.ifnot`) : undefined), then: Translations.T(mapping.then, `${ctx}.then`), hideInAnswer: hideInAnswer, - addExtraTags: (mapping.addExtraTags??[]).map((str, j) => TagUtils.SimpleTag(str, `${ctx}.addExtraTags[${j}]`)) + addExtraTags: (mapping.addExtraTags ?? []).map((str, j) => TagUtils.SimpleTag(str, `${ctx}.addExtraTags[${j}]`)) }; if (this.question) { if (hideInAnswer !== true && mp.if !== undefined && !mp.if.isUsableAsAnswer()) { @@ -260,6 +260,7 @@ export default class TagRenderingConfig { return false; } + /** * Gets all the render values. Will return multiple render values if 'multianswer' is enabled. * The result will equal [GetRenderValue] if not 'multiAnswer' diff --git a/Models/ThemeConfig/TilesourceConfig.ts b/Models/ThemeConfig/TilesourceConfig.ts index aed5b9604..661172bcf 100644 --- a/Models/ThemeConfig/TilesourceConfig.ts +++ b/Models/ThemeConfig/TilesourceConfig.ts @@ -19,7 +19,7 @@ export default class TilesourceConfig { this.minzoom = config.minZoom ?? 0 this.maxzoom = config.maxZoom ?? 999 this.defaultState = config.defaultState ?? true; - if(this.id === undefined){ + if (this.id === undefined) { throw "An id is obligated" } if (this.minzoom > this.maxzoom) { @@ -34,7 +34,7 @@ export default class TilesourceConfig { if (this.source.indexOf("{zoom}") >= 0) { throw "Invalid source url: use {z} instead of {zoom} (at " + ctx + ".source)" } - if(!this.defaultState && config.name === undefined){ + if (!this.defaultState && config.name === undefined) { throw "Disabling an overlay without a name is not possible" } } diff --git a/Models/ThemeConfig/WithContextLoader.ts b/Models/ThemeConfig/WithContextLoader.ts index 9b3be07eb..04999b9d9 100644 --- a/Models/ThemeConfig/WithContextLoader.ts +++ b/Models/ThemeConfig/WithContextLoader.ts @@ -4,8 +4,8 @@ import {TagRenderingConfigJson} from "./Json/TagRenderingConfigJson"; import {Utils} from "../../Utils"; export default class WithContextLoader { - private readonly _json: any; protected readonly _context: string; + private readonly _json: any; constructor(json: any, context: string) { this._json = json; @@ -47,7 +47,7 @@ export default class WithContextLoader { tagRenderings?: (string | { builtin: string, override: any } | TagRenderingConfigJson)[], readOnly = false, prepConfig: ((config: TagRenderingConfigJson) => TagRenderingConfigJson) = undefined - ) : TagRenderingConfig[]{ + ): TagRenderingConfig[] { if (tagRenderings === undefined) { return []; } diff --git a/Models/TileRange.ts b/Models/TileRange.ts index cccfe1964..9a585a30e 100644 --- a/Models/TileRange.ts +++ b/Models/TileRange.ts @@ -1,5 +1,5 @@ import {control} from "leaflet"; -import zoom = control.zoom; + export interface TileRange { xstart: number, @@ -15,7 +15,7 @@ export class Tiles { public static MapRange(tileRange: TileRange, f: (x: number, y: number) => T): T[] { const result: T[] = [] const total = tileRange.total - if(total > 100000){ + if (total > 100000) { throw "Tilerange too big" } for (let x = tileRange.xstart; x <= tileRange.xend; x++) { @@ -27,24 +27,6 @@ export class Tiles { return result; } - - private static tile2long(x, z) { - return (x / Math.pow(2, z) * 360 - 180); - } - - private static tile2lat(y, z) { - const n = Math.PI - 2 * Math.PI * y / Math.pow(2, z); - return (180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)))); - } - - private static lon2tile(lon, zoom) { - return (Math.floor((lon + 180) / 360 * Math.pow(2, zoom))); - } - - private static lat2tile(lat, zoom) { - return (Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom))); - } - /** * Calculates the tile bounds of the * @param z @@ -56,7 +38,6 @@ export class Tiles { return [[Tiles.tile2lat(y, z), Tiles.tile2long(x, z)], [Tiles.tile2lat(y + 1, z), Tiles.tile2long(x + 1, z)]] } - static tile_bounds_lon_lat(z: number, x: number, y: number): [[number, number], [number, number]] { return [[Tiles.tile2long(x, z), Tiles.tile2lat(y, z)], [Tiles.tile2long(x + 1, z), Tiles.tile2lat(y + 1, z)]] } @@ -67,13 +48,14 @@ export class Tiles { * @param x * @param y */ - static centerPointOf(z: number, x: number, y: number): [number, number]{ - return [(Tiles.tile2long(x, z) + Tiles.tile2long(x+1, z)) / 2, (Tiles.tile2lat(y, z) + Tiles.tile2lat(y+1, z)) / 2] + static centerPointOf(z: number, x: number, y: number): [number, number] { + return [(Tiles.tile2long(x, z) + Tiles.tile2long(x + 1, z)) / 2, (Tiles.tile2lat(y, z) + Tiles.tile2lat(y + 1, z)) / 2] } - + static tile_index(z: number, x: number, y: number): number { return ((x * (2 << z)) + y) * 100 + z } + /** * Given a tile index number, returns [z, x, y] * @param index @@ -93,7 +75,7 @@ export class Tiles { static embedded_tile(lat: number, lon: number, z: number): { x: number, y: number, z: number } { return {x: Tiles.lon2tile(lon, z), y: Tiles.lat2tile(lat, z), z: z} } - + static TileRangeBetween(zoomlevel: number, lat0: number, lon0: number, lat1: number, lon1: number): TileRange { const t0 = Tiles.embedded_tile(lat0, lon0, zoomlevel) const t1 = Tiles.embedded_tile(lat1, lon1, zoomlevel) @@ -114,5 +96,22 @@ export class Tiles { } } - + private static tile2long(x, z) { + return (x / Math.pow(2, z) * 360 - 180); + } + + private static tile2lat(y, z) { + const n = Math.PI - 2 * Math.PI * y / Math.pow(2, z); + return (180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)))); + } + + private static lon2tile(lon, zoom) { + return (Math.floor((lon + 180) / 360 * Math.pow(2, zoom))); + } + + private static lat2tile(lat, zoom) { + return (Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom))); + } + + } \ No newline at end of file diff --git a/Models/Unit.ts b/Models/Unit.ts index 2512580bc..88f41ee41 100644 --- a/Models/Unit.ts +++ b/Models/Unit.ts @@ -37,7 +37,9 @@ export class Unit { const possiblePostFixes = new Set() function addPostfixesOf(str) { - if(str === undefined){return} + if (str === undefined) { + return + } str = str.toLowerCase() for (let i = 0; i < str.length + 1; i++) { const substr = str.substring(0, i) @@ -54,8 +56,8 @@ export class Unit { this.possiblePostFixes.sort((a, b) => b.length - a.length) } - - static fromJson(json: UnitConfigJson, ctx: string){ + + static fromJson(json: UnitConfigJson, ctx: string) { const appliesTo = json.appliesToKey for (let i = 0; i < appliesTo.length; i++) { let key = appliesTo[i]; @@ -82,7 +84,7 @@ export class Unit { const applicable = json.applicableUnits.map((u, i) => new Denomination(u, `${ctx}.units[${i}]`)) return new Unit(appliesTo, applicable, json.eraseInvalidValues ?? false) } - + isApplicableToKey(key: string | undefined): boolean { if (key === undefined) { return false; @@ -112,7 +114,7 @@ export class Unit { return undefined; } const [stripped, denom] = this.findDenomination(value) - const human = stripped === "1" ? denom?.humanSingular : denom?.human + const human = stripped === "1" ? denom?.humanSingular : denom?.human if (human === undefined) { return new FixedUiElement(stripped ?? value); } diff --git a/README.md b/README.md index 6f05efe8f..cd024056a 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ > Let a thousand flowers bloom -**MapComplete is an OpenStreetMap viewer and editor.** It shows map features on a certain topic, and allows to see, edit and -add new features to the map. It can be seen as a +**MapComplete is an OpenStreetMap viewer and editor.** It shows map features on a certain topic, and allows to see, edit +and add new features to the map. It can be seen as a webversion [crossover of StreetComplete and MapContrib](Docs/MapComplete_vs_other_editors.md). It tries to be just as easy to use as StreetComplete, but it allows to focus on one single theme per instance (e.g. nature, bicycle infrastructure, ...) @@ -15,20 +15,23 @@ infrastructure, ...) - Easy to set up a custom theme - Easy to fall down the rabbit hole of OSM -**The basic functionality is** to download some map features from Overpass and then ask certain questions. An answer is sent -back to directly to OpenStreetMap. +**The basic functionality is** to download some map features from Overpass and then ask certain questions. An answer is +sent back to directly to OpenStreetMap. Furthermore, it shows images present in the `image` tag or, if a `wikidata` or `wikimedia_commons`-tag is present, it follows those to get these images too. -**An explicit non-goal** of MapComplete is to modify geometries of ways. Although adding a point to a way or splitting a way -in two parts might be added one day. +**An explicit non-goal** of MapComplete is to modify geometries of ways. Although adding a point to a way or splitting a +way in two parts might be added one day. -**More about MapComplete:** [Watch Pieter's talk on the 2021 State Of The Map Conference](https://media.ccc.de/v/sotm2021-9448-introduction-and-review-of-mapcomplete) ([YouTube](https://www.youtube.com/watch?v=zTtMn6fNbYY)) about the history, vision and future of MapComplete. +**More about +MapComplete:** [Watch Pieter's talk on the 2021 State Of The Map Conference](https://media.ccc.de/v/sotm2021-9448-introduction-and-review-of-mapcomplete) ([YouTube](https://www.youtube.com/watch?v=zTtMn6fNbYY)) +about the history, vision and future of MapComplete. # Creating your own theme It is possible to quickly make and distribute your own theme + - [please read the documentation on how to do this](Docs/Making_Your_Own_Theme.md). ## Examples diff --git a/State.ts b/State.ts index f11113f4a..9a0f47816 100644 --- a/State.ts +++ b/State.ts @@ -14,6 +14,5 @@ export default class State extends FeaturePipelineState { super(layoutToUse) } - } diff --git a/UI/AllThemesGui.ts b/UI/AllThemesGui.ts index ec5e2481d..fe65c8d09 100644 --- a/UI/AllThemesGui.ts +++ b/UI/AllThemesGui.ts @@ -8,32 +8,31 @@ import {Utils} from "../Utils"; import LanguagePicker from "./LanguagePicker"; import IndexText from "./BigComponents/IndexText"; import FeaturedMessage from "./BigComponents/FeaturedMessage"; -import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; export default class AllThemesGui { constructor() { - - try{ - - new FixedUiElement("").AttachTo("centermessage") - const state = new UserRelatedState(undefined); - const intro = new Combine([ - LanguagePicker.CreateLanguagePicker(Translations.t.index.title.SupportedLanguages()) - .SetClass("absolute top-2 right-3"), - new IndexText() - ]); - new Combine([ - intro, - new FeaturedMessage(), - new MoreScreen(state, true), - Translations.t.general.aboutMapcomplete - .Subs({"osmcha_link": Utils.OsmChaLinkFor(7)}) - .SetClass("link-underline"), - new FixedUiElement("v" + Constants.vNumber) - ]).SetClass("block m-5 lg:w-3/4 lg:ml-40") - .SetStyle("pointer-events: all;") - .AttachTo("topleft-tools"); - }catch (e) { + + try { + + new FixedUiElement("").AttachTo("centermessage") + const state = new UserRelatedState(undefined); + const intro = new Combine([ + LanguagePicker.CreateLanguagePicker(Translations.t.index.title.SupportedLanguages()) + .SetClass("absolute top-2 right-3"), + new IndexText() + ]); + new Combine([ + intro, + new FeaturedMessage(), + new MoreScreen(state, true), + Translations.t.general.aboutMapcomplete + .Subs({"osmcha_link": Utils.OsmChaLinkFor(7)}) + .SetClass("link-underline"), + new FixedUiElement("v" + Constants.vNumber) + ]).SetClass("block m-5 lg:w-3/4 lg:ml-40") + .SetStyle("pointer-events: all;") + .AttachTo("topleft-tools"); + } catch (e) { new FixedUiElement("Seems like no layers are compiled - check the output of `npm run generate:layeroverview`. Is this visible online? Contact pietervdvn immediately!").SetClass("alert") .AttachTo("centermessage") } diff --git a/UI/Base/AsyncLazy.ts b/UI/Base/AsyncLazy.ts index b8db53d3c..5d1eed9a9 100644 --- a/UI/Base/AsyncLazy.ts +++ b/UI/Base/AsyncLazy.ts @@ -3,26 +3,25 @@ import {VariableUiElement} from "./VariableUIElement"; import {UIEventSource} from "../../Logic/UIEventSource"; import Loading from "./Loading"; -export default class AsyncLazy extends BaseUIElement{ +export default class AsyncLazy extends BaseUIElement { private readonly _f: () => Promise; - + constructor(f: () => Promise) { super(); this._f = f; } - + protected InnerConstructElement(): HTMLElement { // The caching of the BaseUIElement will guarantee that _f will only be called once - + return new VariableUiElement( UIEventSource.FromPromise(this._f()).map(el => { - if(el === undefined){ + if (el === undefined) { return new Loading() } return el }) - ).ConstructElement() } - + } \ No newline at end of file diff --git a/UI/Base/Combine.ts b/UI/Base/Combine.ts index 2c64779a7..e714092f6 100644 --- a/UI/Base/Combine.ts +++ b/UI/Base/Combine.ts @@ -30,13 +30,13 @@ export default class Combine extends BaseUIElement { if (subEl === undefined || subEl === null) { continue; } - try{ - - const subHtml = subEl.ConstructElement() - if (subHtml !== undefined) { - el.appendChild(subHtml) - } - }catch(e){ + try { + + const subHtml = subEl.ConstructElement() + if (subHtml !== undefined) { + el.appendChild(subHtml) + } + } catch (e) { console.error("Could not generate subelement in combine due to ", e) } } diff --git a/UI/Base/Img.ts b/UI/Base/Img.ts index 876265b86..7104dfeb2 100644 --- a/UI/Base/Img.ts +++ b/UI/Base/Img.ts @@ -10,7 +10,7 @@ export default class Img extends BaseUIElement { fallbackImage?: string }) { super(); - if(src === undefined || src === "undefined"){ + if (src === undefined || src === "undefined") { throw "Undefined src for image" } this._src = src; @@ -44,7 +44,7 @@ export default class Img extends BaseUIElement { } el.onerror = () => { if (self._options?.fallbackImage) { - if(el.src === self._options.fallbackImage){ + if (el.src === self._options.fallbackImage) { // Sigh... nothing to be done anymore return; } diff --git a/UI/Base/Lazy.ts b/UI/Base/Lazy.ts index e2b846cd8..1852099f8 100644 --- a/UI/Base/Lazy.ts +++ b/UI/Base/Lazy.ts @@ -1,16 +1,16 @@ import BaseUIElement from "../BaseUIElement"; -export default class Lazy extends BaseUIElement{ +export default class Lazy extends BaseUIElement { private readonly _f: () => BaseUIElement; - + constructor(f: () => BaseUIElement) { super(); this._f = f; } - + protected InnerConstructElement(): HTMLElement { // The caching of the BaseUIElement will guarantee that _f will only be called once return this._f().ConstructElement(); } - + } \ No newline at end of file diff --git a/UI/Base/Loading.ts b/UI/Base/Loading.ts index c2636c1f3..e577f2847 100644 --- a/UI/Base/Loading.ts +++ b/UI/Base/Loading.ts @@ -1,4 +1,3 @@ -import {FixedUiElement} from "./FixedUiElement"; import {Translation} from "../i18n/Translation"; import Combine from "./Combine"; import Svg from "../../Svg"; @@ -6,11 +5,11 @@ import Translations from "../i18n/Translations"; export default class Loading extends Combine { constructor(msg?: Translation | string) { - const t = Translations.T(msg ) ?? Translations.t.general.loading.Clone(); + const t = Translations.T(msg) ?? Translations.t.general.loading.Clone(); t.SetClass("pl-2") super([ Svg.loading_svg().SetClass("animate-spin").SetStyle("width: 1.5rem; height: 1.5rem;"), - t + t ]) this.SetClass("flex p-1") } diff --git a/UI/Base/Minimap.ts b/UI/Base/Minimap.ts index 4a878684e..1a0fd4c02 100644 --- a/UI/Base/Minimap.ts +++ b/UI/Base/Minimap.ts @@ -17,8 +17,10 @@ export interface MinimapOptions { } export interface MinimapObj { - readonly leafletMap: UIEventSource, - installBounds(factor: number | BBox, showRange?: boolean) : void + readonly leafletMap: UIEventSource, + + installBounds(factor: number | BBox, showRange?: boolean): void + TakeScreenshot(): Promise; } diff --git a/UI/Base/MinimapImplementation.ts b/UI/Base/MinimapImplementation.ts index 271b5d5cf..3ade20f17 100644 --- a/UI/Base/MinimapImplementation.ts +++ b/UI/Base/MinimapImplementation.ts @@ -103,6 +103,12 @@ export default class MinimapImplementation extends BaseUIElement implements Mini }) } + public async TakeScreenshot() { + const screenshotter = new SimpleMapScreenshoter(); + screenshotter.addTo(this.leafletMap.data); + return await screenshotter.takeScreen('image') + } + protected InnerConstructElement(): HTMLElement { const div = document.createElement("div") div.id = this._id; @@ -148,8 +154,8 @@ export default class MinimapImplementation extends BaseUIElement implements Mini const self = this; let currentLayer = this._background.data.layer() let latLon = <[number, number]>[location.data?.lat ?? 0, location.data?.lon ?? 0] - if(isNaN(latLon[0]) || isNaN(latLon[1])){ - latLon = [0,0] + if (isNaN(latLon[0]) || isNaN(latLon[1])) { + latLon = [0, 0] } const options = { center: latLon, @@ -279,10 +285,4 @@ export default class MinimapImplementation extends BaseUIElement implements Mini this.leafletMap.setData(map) } - - public async TakeScreenshot(){ - const screenshotter = new SimpleMapScreenshoter(); - screenshotter.addTo(this.leafletMap.data); - return await screenshotter.takeScreen('image') - } } \ No newline at end of file diff --git a/UI/Base/ScrollableFullScreen.ts b/UI/Base/ScrollableFullScreen.ts index 248f9a884..0e28bd445 100644 --- a/UI/Base/ScrollableFullScreen.ts +++ b/UI/Base/ScrollableFullScreen.ts @@ -19,8 +19,8 @@ import Img from "./Img"; export default class ScrollableFullScreen extends UIElement { private static readonly empty = new FixedUiElement(""); private static _currentlyOpen: ScrollableFullScreen; - private hashToShow: string; public isShown: UIEventSource; + private hashToShow: string; private _component: BaseUIElement; private _fullscreencomponent: BaseUIElement; @@ -61,13 +61,6 @@ export default class ScrollableFullScreen extends UIElement { }) } - private clear() { - ScrollableFullScreen.empty.AttachTo("fullscreen") - const fs = document.getElementById("fullscreen"); - ScrollableFullScreen._currentlyOpen?.isShown?.setData(false); - fs.classList.add("hidden") - } - InnerRender(): BaseUIElement { return this._component; } @@ -80,6 +73,13 @@ export default class ScrollableFullScreen extends UIElement { fs.classList.remove("hidden") } + private clear() { + ScrollableFullScreen.empty.AttachTo("fullscreen") + const fs = document.getElementById("fullscreen"); + ScrollableFullScreen._currentlyOpen?.isShown?.setData(false); + fs.classList.add("hidden") + } + private BuildComponent(title: BaseUIElement, content: BaseUIElement, isShown: UIEventSource) { const returnToTheMap = new Combine([ diff --git a/UI/Base/TabbedComponent.ts b/UI/Base/TabbedComponent.ts index e151df6c5..d931cf475 100644 --- a/UI/Base/TabbedComponent.ts +++ b/UI/Base/TabbedComponent.ts @@ -6,7 +6,7 @@ import {VariableUiElement} from "./VariableUIElement"; export class TabbedComponent extends Combine { - constructor(elements: { header: BaseUIElement | string, content: BaseUIElement | string }[], + constructor(elements: { header: BaseUIElement | string, content: BaseUIElement | string }[], openedTab: (UIEventSource | number) = 0, options?: { leftOfHeader?: BaseUIElement @@ -15,13 +15,13 @@ export class TabbedComponent extends Combine { const openedTabSrc = typeof (openedTab) === "number" ? new UIEventSource(openedTab) : (openedTab ?? new UIEventSource(0)) - const tabs: BaseUIElement[] = [options?.leftOfHeader ] + const tabs: BaseUIElement[] = [options?.leftOfHeader] const contentElements: BaseUIElement[] = []; for (let i = 0; i < elements.length; i++) { let element = elements[i]; const header = Translations.W(element.header).onClick(() => openedTabSrc.setData(i)) openedTabSrc.addCallbackAndRun(selected => { - if(selected >= elements.length){ + if (selected >= elements.length) { selected = 0 } if (selected === i) { @@ -40,7 +40,7 @@ export class TabbedComponent extends Combine { } const header = new Combine(tabs).SetClass("tabs-header-bar") - if(options?.styleHeader){ + if (options?.styleHeader) { options.styleHeader(header) } const actualContent = new VariableUiElement( diff --git a/UI/Base/Title.ts b/UI/Base/Title.ts index d9b1c464c..bc02d0c28 100644 --- a/UI/Base/Title.ts +++ b/UI/Base/Title.ts @@ -7,9 +7,9 @@ export default class Title extends BaseUIElement { constructor(embedded: string | BaseUIElement, level: number = 3) { super() - if(typeof embedded === "string"){ - this._embedded = new FixedUiElement(embedded) - }else{ + if (typeof embedded === "string") { + this._embedded = new FixedUiElement(embedded) + } else { this._embedded = embedded } this._level = level; diff --git a/UI/BaseUIElement.ts b/UI/BaseUIElement.ts index 80cb7b26e..6e96e2616 100644 --- a/UI/BaseUIElement.ts +++ b/UI/BaseUIElement.ts @@ -45,7 +45,9 @@ export default abstract class BaseUIElement { * Adds all the relevant classes, space separated */ public SetClass(clss: string) { - if(clss == undefined){return } + if (clss == undefined) { + return + } const all = clss.split(" ").map(clsName => clsName.trim()); let recordedChange = false; for (let c of all) { diff --git a/UI/BigComponents/Attribution.ts b/UI/BigComponents/Attribution.ts index 267bd776c..e2f6b6562 100644 --- a/UI/BigComponents/Attribution.ts +++ b/UI/BigComponents/Attribution.ts @@ -15,7 +15,7 @@ import {Utils} from "../../Utils"; */ export default class Attribution extends Combine { - constructor(location: UIEventSource, + constructor(location: UIEventSource, userDetails: UIEventSource, layoutToUse: LayoutConfig, currentBounds: UIEventSource) { diff --git a/UI/BigComponents/CopyrightPanel.ts b/UI/BigComponents/CopyrightPanel.ts index bcf7f3784..0611f8801 100644 --- a/UI/BigComponents/CopyrightPanel.ts +++ b/UI/BigComponents/CopyrightPanel.ts @@ -36,8 +36,8 @@ export default class CopyrightPanel extends Combine { locationControl: UIEventSource, osmConnection: OsmConnection }, contributions: UIEventSource>) { - - const t =Translations.t.general.attribution + + const t = Translations.t.general.attribution const layoutToUse = state.layoutToUse const josmState = new UIEventSource(undefined) // Reset after 15s @@ -53,7 +53,7 @@ export default class CopyrightPanel extends Combine { newTab: true }), new SubtleButton(Svg.statistics_ui().SetStyle(iconStyle), t.openOsmcha.Subs({theme: state.layoutToUse.title}), { - url: Utils.OsmChaLinkFor(31, state.layoutToUse.id), + url: Utils.OsmChaLinkFor(31, state.layoutToUse.id), newTab: true }), new VariableUiElement(state.locationControl.map(location => { @@ -63,42 +63,45 @@ export default class CopyrightPanel extends Combine { new VariableUiElement(state.locationControl.map(location => { const mapillaryLink = `https://www.mapillary.com/app/?focus=map&lat=${location?.lat ?? 0}&lng=${location?.lon ?? 0}&z=${Math.max((location?.zoom ?? 2) - 1, 1)}` - return new SubtleButton(Svg.mapillary_black_ui().SetStyle(iconStyle), t.openMapillary, {url: mapillaryLink, newTab: true}) + return new SubtleButton(Svg.mapillary_black_ui().SetStyle(iconStyle), t.openMapillary, { + url: mapillaryLink, + newTab: true + }) })), new VariableUiElement(josmState.map(state => { - if(state === undefined){ + if (state === undefined) { return undefined } state = state.toUpperCase() - if(state === "OK"){ + if (state === "OK") { return t.josmOpened.SetClass("thanks") } return t.josmNotOpened.SetClass("alert") })), new Toggle( - new SubtleButton(Svg.josm_logo_ui().SetStyle(iconStyle) , t.editJosm).onClick(() => { - const bounds: any = state.currentBounds.data; - if (bounds === undefined) { - return undefined - } - const top = bounds.getNorth(); - const bottom = bounds.getSouth(); - const right = bounds.getEast(); - const left = bounds.getWest(); - const josmLink = `http://127.0.0.1:8111/load_and_zoom?left=${left}&right=${right}&top=${top}&bottom=${bottom}` - Utils.download(josmLink).then(answer => josmState.setData(answer.replace(/\n/g, '').trim())).catch(_ => josmState.setData("ERROR")) - }), undefined, state.osmConnection.userDetails.map(ud => ud.loggedIn && ud.csCount >= Constants.userJourney.historyLinkVisible)), - + new SubtleButton(Svg.josm_logo_ui().SetStyle(iconStyle), t.editJosm).onClick(() => { + const bounds: any = state.currentBounds.data; + if (bounds === undefined) { + return undefined + } + const top = bounds.getNorth(); + const bottom = bounds.getSouth(); + const right = bounds.getEast(); + const left = bounds.getWest(); + const josmLink = `http://127.0.0.1:8111/load_and_zoom?left=${left}&right=${right}&top=${top}&bottom=${bottom}` + Utils.download(josmLink).then(answer => josmState.setData(answer.replace(/\n/g, '').trim())).catch(_ => josmState.setData("ERROR")) + }), undefined, state.osmConnection.userDetails.map(ud => ud.loggedIn && ud.csCount >= Constants.userJourney.historyLinkVisible)), + ].map(button => button.SetStyle("max-height: 3rem")) - + const iconAttributions = Utils.NoNull(Array.from(layoutToUse.ExtractImages())) .map(CopyrightPanel.IconAttribution) - - let maintainer : BaseUIElement= undefined - if(layoutToUse.maintainer !== undefined && layoutToUse.maintainer !== "" && layoutToUse.maintainer.toLowerCase() !== "mapcomplete"){ + + let maintainer: BaseUIElement = undefined + if (layoutToUse.maintainer !== undefined && layoutToUse.maintainer !== "" && layoutToUse.maintainer.toLowerCase() !== "mapcomplete") { maintainer = Translations.t.general.attribution.themeBy.Subs({author: layoutToUse.maintainer}) } - + super([ Translations.t.general.attribution.attributionContent, maintainer, @@ -106,7 +109,7 @@ export default class CopyrightPanel extends Combine { new FixedUiElement(layoutToUse.credits), new Attribution(State.state.locationControl, State.state.osmConnection.userDetails, State.state.layoutToUse, State.state.currentBounds), new VariableUiElement(contributions.map(contributions => { - if(contributions === undefined){ + if (contributions === undefined) { return "" } const sorted = Array.from(contributions, ([name, value]) => ({ diff --git a/UI/BigComponents/DownloadPanel.ts b/UI/BigComponents/DownloadPanel.ts index 552f6f357..520473625 100644 --- a/UI/BigComponents/DownloadPanel.ts +++ b/UI/BigComponents/DownloadPanel.ts @@ -12,26 +12,25 @@ import FeaturePipeline from "../../Logic/FeatureSource/FeaturePipeline"; import {UIEventSource} from "../../Logic/UIEventSource"; import SimpleMetaTagger from "../../Logic/SimpleMetaTagger"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; -import {meta} from "@turf/turf"; import {BBox} from "../../Logic/BBox"; export class DownloadPanel extends Toggle { - + constructor() { const state: { featurePipeline: FeaturePipeline, layoutToUse: LayoutConfig, currentBounds: UIEventSource } = State.state - + const t = Translations.t.general.download const name = State.state.layoutToUse.id; - + const includeMetaToggle = new CheckBoxes([t.includeMetaData.Clone()]) const metaisIncluded = includeMetaToggle.GetValue().map(selected => selected.length > 0) - + const buttonGeoJson = new SubtleButton(Svg.floppy_ui(), new Combine([t.downloadGeojson.Clone().SetClass("font-bold"), t.downloadGeoJsonHelper.Clone()]).SetClass("flex flex-col")) @@ -42,7 +41,7 @@ export class DownloadPanel extends Toggle { mimetype: "application/vnd.geo+json" }); }) - + const buttonCSV = new SubtleButton(Svg.floppy_ui(), new Combine( [t.downloadCSV.Clone().SetClass("font-bold"), @@ -59,9 +58,9 @@ export class DownloadPanel extends Toggle { const downloadButtons = new Combine( [new Title(t.title), - buttonGeoJson, + buttonGeoJson, buttonCSV, - includeMetaToggle, + includeMetaToggle, t.licenseInfo.Clone().SetClass("link-underline")]) .SetClass("w-full flex flex-col border-4 border-gray-300 rounded-3xl p-4") @@ -107,7 +106,7 @@ export class DownloadPanel extends Toggle { } return { - type:"FeatureCollection", + type: "FeatureCollection", features: resultFeatures } diff --git a/UI/BigComponents/FeaturedMessage.ts b/UI/BigComponents/FeaturedMessage.ts index 4c369b175..aede8e416 100644 --- a/UI/BigComponents/FeaturedMessage.ts +++ b/UI/BigComponents/FeaturedMessage.ts @@ -20,7 +20,7 @@ export default class FeaturedMessage extends Combine { if (wm.end_date <= now) { continue } - + if (welcome_message !== undefined) { console.warn("Multiple applicable messages today:", welcome_message.featured_theme) } @@ -62,7 +62,7 @@ export default class FeaturedMessage extends Combine { message: wm.message, featured_theme: wm.featured_theme }) - + } return all_messages } diff --git a/UI/BigComponents/FullWelcomePaneWithTabs.ts b/UI/BigComponents/FullWelcomePaneWithTabs.ts index da16326e4..38ad51ddb 100644 --- a/UI/BigComponents/FullWelcomePaneWithTabs.ts +++ b/UI/BigComponents/FullWelcomePaneWithTabs.ts @@ -28,8 +28,8 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen { osmConnection: OsmConnection, featureSwitchShareScreen: UIEventSource, featureSwitchMoreQuests: UIEventSource, - locationControl: UIEventSource, - backgroundLayer: UIEventSource, + locationControl: UIEventSource, + backgroundLayer: UIEventSource, filteredLayers: UIEventSource } & UserRelatedState) { const layoutToUse = state.layoutToUse; @@ -70,10 +70,10 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen { tabs.push({ header: Svg.add_img, content: - new Combine([ - Translations.t.general.morescreen.intro, - new MoreScreen(state) - ]).SetClass("flex flex-col") + new Combine([ + Translations.t.general.morescreen.intro, + new MoreScreen(state) + ]).SetClass("flex flex-col") }); } @@ -91,7 +91,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen { const tabs = FullWelcomePaneWithTabs.ConstructBaseTabs(state, isShown) const tabsWithAboutMc = [...FullWelcomePaneWithTabs.ConstructBaseTabs(state, isShown)] - + tabsWithAboutMc.push({ header: Svg.help, content: new Combine([Translations.t.general.aboutMapcomplete diff --git a/UI/BigComponents/ImportButton.ts b/UI/BigComponents/ImportButton.ts index 5175132d9..d03bfc45d 100644 --- a/UI/BigComponents/ImportButton.ts +++ b/UI/BigComponents/ImportButton.ts @@ -9,7 +9,6 @@ import Toggle from "../Input/Toggle"; import CreateNewNodeAction from "../../Logic/Osm/Actions/CreateNewNodeAction"; import {Tag} from "../../Logic/Tags/Tag"; import Loading from "../Base/Loading"; -import CreateNewWayAction from "../../Logic/Osm/Actions/CreateNewWayAction"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; import {OsmConnection} from "../../Logic/Osm/OsmConnection"; import {Changes} from "../../Logic/Osm/Changes"; @@ -32,7 +31,6 @@ import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeature import ShowDataMultiLayer from "../ShowDataLayer/ShowDataMultiLayer"; import BaseLayer from "../../Models/BaseLayer"; import ReplaceGeometryAction from "../../Logic/Osm/Actions/ReplaceGeometryAction"; -import FullNodeDatabaseSource from "../../Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource"; import CreateWayWithPointReuseAction from "../../Logic/Osm/Actions/CreateWayWithPointReuseAction"; import OsmChangeAction from "../../Logic/Osm/Actions/OsmChangeAction"; import FeatureSource from "../../Logic/FeatureSource/FeatureSource"; @@ -282,8 +280,8 @@ export default class ImportButton extends Toggle { } public static createConfirmForWay(o: ImportButtonState, - isImported: UIEventSource, - importClicked: UIEventSource): BaseUIElement { + isImported: UIEventSource, + importClicked: UIEventSource): BaseUIElement { const confirmationMap = Minimap.createMiniMap({ allowMoving: true, @@ -301,8 +299,8 @@ export default class ImportButton extends Toggle { allElements: o.state.allElements, layers: o.state.filteredLayers }) - - let action : OsmChangeAction & {getPreview() : Promise} + + let action: OsmChangeAction & { getPreview(): Promise } const theme = o.state.layoutToUse.id const changes = o.state.changes @@ -320,7 +318,7 @@ export default class ImportButton extends Toggle { ) confirm = async () => { - changes.applyAction (action) + changes.applyAction(action) return o.feature.properties.id } @@ -332,8 +330,8 @@ export default class ImportButton extends Toggle { } else if (geom.type === "Polygon") { coordinates = geom.coordinates[0] } - - + + action = new CreateWayWithPointReuseAction( o.newTags.data, coordinates, @@ -341,13 +339,13 @@ export default class ImportButton extends Toggle { o.state, [{ withinRangeOfM: 1, - ifMatches: new Tag("_is_part_of_building","true"), - mode:"move_osm_point" - + ifMatches: new Tag("_is_part_of_building", "true"), + mode: "move_osm_point" + }] ) - - + + confirm = async () => { changes.applyAction(action) return undefined diff --git a/UI/BigComponents/LeftControls.ts b/UI/BigComponents/LeftControls.ts index aff6b01f4..b0fc84da2 100644 --- a/UI/BigComponents/LeftControls.ts +++ b/UI/BigComponents/LeftControls.ts @@ -45,8 +45,8 @@ export default class LeftControls extends Combine { state, new ContributorCount(state).Contributors ), - "copyright", - guiState.copyrightViewIsOpened + "copyright", + guiState.copyrightViewIsOpened ); const copyrightButton = new Toggle( diff --git a/UI/BigComponents/MoreScreen.ts b/UI/BigComponents/MoreScreen.ts index 84475d3be..1432dade7 100644 --- a/UI/BigComponents/MoreScreen.ts +++ b/UI/BigComponents/MoreScreen.ts @@ -39,110 +39,6 @@ export default class MoreScreen extends Combine { ]); } - - private static createUnofficialThemeList(buttonClass: string, state: UserRelatedState, themeListClasses): BaseUIElement { - return new VariableUiElement(state.installedThemes.map(customThemes => { - if (customThemes.length <= 0) { - return undefined; - } - const customThemeButtons = customThemes.map(theme => MoreScreen.createLinkButton(state, theme.layout, theme.definition)?.SetClass(buttonClass)) - return new Combine([ - Translations.t.general.customThemeIntro.Clone(), - new Combine(customThemeButtons).SetClass(themeListClasses) - ]); - })); - } - - private static createPreviouslyVistedHiddenList(state: UserRelatedState, buttonClass: string, themeListStyle: string) { - const t = Translations.t.general.morescreen - const prefix = "mapcomplete-hidden-theme-" - const hiddenTotal = AllKnownLayouts.layoutsList.filter(layout => layout.hideFromOverview).length - return new Toggle( - new VariableUiElement( - state.osmConnection.preferencesHandler.preferences.map(allPreferences => { - const knownThemes = Utils.NoNull(Object.keys(allPreferences) - .filter(key => key.startsWith(prefix)) - .map(key => key.substring(prefix.length, key.length - "-enabled".length)) - .map(theme => { - return AllKnownLayouts.allKnownLayouts.get(theme); - })) - if (knownThemes.length === 0) { - return undefined - } - - const knownLayouts = new Combine(knownThemes.map(layout => - MoreScreen.createLinkButton(state, layout)?.SetClass(buttonClass) - )).SetClass(themeListStyle) - - return new Combine([ - new Title(t.previouslyHiddenTitle), - t.hiddenExplanation.Subs({hidden_discovered: ""+knownThemes.length,total_hidden: ""+hiddenTotal}), - knownLayouts - ]) - - }) - ).SetClass("flex flex-col"), - undefined, - state.osmConnection.isLoggedIn - ) - - - } - - private static createOfficialThemesList(state: { osmConnection: OsmConnection, locationControl?: UIEventSource }, buttonClass: string): BaseUIElement { - let officialThemes = AllKnownLayouts.layoutsList - - let buttons = officialThemes.map((layout) => { - if (layout === undefined) { - console.trace("Layout is undefined") - return undefined - } - if(layout.hideFromOverview){ - return undefined; - } - const button = MoreScreen.createLinkButton(state, layout)?.SetClass(buttonClass); - if (layout.id === personal.id) { - return new VariableUiElement( - state.osmConnection.userDetails.map(userdetails => userdetails.csCount) - .map(csCount => { - if (csCount < Constants.userJourney.personalLayoutUnlock) { - return undefined - } else { - return button - } - }) - ) - } - return button; - }) - - let customGeneratorLink = MoreScreen.createCustomGeneratorButton(state) - buttons.splice(0, 0, customGeneratorLink); - - return new Combine(buttons) - } - - /* - * Returns either a link to the issue tracker or a link to the custom generator, depending on the achieved number of changesets - * */ - private static createCustomGeneratorButton(state: { osmConnection: OsmConnection }): VariableUiElement { - const tr = Translations.t.general.morescreen; - return new VariableUiElement( - state.osmConnection.userDetails.map(userDetails => { - if (userDetails.csCount < Constants.userJourney.themeGeneratorReadOnlyUnlock) { - return new SubtleButton(null, tr.requestATheme.Clone(), { - url: "https://github.com/pietervdvn/MapComplete/issues", - newTab: true - }); - } - return new SubtleButton(Svg.pencil_ui(), tr.createYourOwnTheme.Clone(), { - url: "https://pietervdvn.github.io/mc/legacy/070/customGenerator.html", - newTab: false - }); - }) - ) - } - /** * Creates a button linking to the given theme * @private @@ -161,7 +57,7 @@ export default class MoreScreen extends Combine { console.error("ID is undefined for layout", layout); return undefined; } - + if (layout.id === state?.layoutToUse?.id) { return undefined; } @@ -210,5 +106,111 @@ export default class MoreScreen extends Combine { ]), {url: linkText, newTab: false}); } + private static createUnofficialThemeList(buttonClass: string, state: UserRelatedState, themeListClasses): BaseUIElement { + return new VariableUiElement(state.installedThemes.map(customThemes => { + if (customThemes.length <= 0) { + return undefined; + } + const customThemeButtons = customThemes.map(theme => MoreScreen.createLinkButton(state, theme.layout, theme.definition)?.SetClass(buttonClass)) + return new Combine([ + Translations.t.general.customThemeIntro.Clone(), + new Combine(customThemeButtons).SetClass(themeListClasses) + ]); + })); + } + + private static createPreviouslyVistedHiddenList(state: UserRelatedState, buttonClass: string, themeListStyle: string) { + const t = Translations.t.general.morescreen + const prefix = "mapcomplete-hidden-theme-" + const hiddenTotal = AllKnownLayouts.layoutsList.filter(layout => layout.hideFromOverview).length + return new Toggle( + new VariableUiElement( + state.osmConnection.preferencesHandler.preferences.map(allPreferences => { + const knownThemes = Utils.NoNull(Object.keys(allPreferences) + .filter(key => key.startsWith(prefix)) + .map(key => key.substring(prefix.length, key.length - "-enabled".length)) + .map(theme => { + return AllKnownLayouts.allKnownLayouts.get(theme); + })) + if (knownThemes.length === 0) { + return undefined + } + + const knownLayouts = new Combine(knownThemes.map(layout => + MoreScreen.createLinkButton(state, layout)?.SetClass(buttonClass) + )).SetClass(themeListStyle) + + return new Combine([ + new Title(t.previouslyHiddenTitle), + t.hiddenExplanation.Subs({ + hidden_discovered: "" + knownThemes.length, + total_hidden: "" + hiddenTotal + }), + knownLayouts + ]) + + }) + ).SetClass("flex flex-col"), + undefined, + state.osmConnection.isLoggedIn + ) + + + } + + private static createOfficialThemesList(state: { osmConnection: OsmConnection, locationControl?: UIEventSource }, buttonClass: string): BaseUIElement { + let officialThemes = AllKnownLayouts.layoutsList + + let buttons = officialThemes.map((layout) => { + if (layout === undefined) { + console.trace("Layout is undefined") + return undefined + } + if (layout.hideFromOverview) { + return undefined; + } + const button = MoreScreen.createLinkButton(state, layout)?.SetClass(buttonClass); + if (layout.id === personal.id) { + return new VariableUiElement( + state.osmConnection.userDetails.map(userdetails => userdetails.csCount) + .map(csCount => { + if (csCount < Constants.userJourney.personalLayoutUnlock) { + return undefined + } else { + return button + } + }) + ) + } + return button; + }) + + let customGeneratorLink = MoreScreen.createCustomGeneratorButton(state) + buttons.splice(0, 0, customGeneratorLink); + + return new Combine(buttons) + } + + /* + * Returns either a link to the issue tracker or a link to the custom generator, depending on the achieved number of changesets + * */ + private static createCustomGeneratorButton(state: { osmConnection: OsmConnection }): VariableUiElement { + const tr = Translations.t.general.morescreen; + return new VariableUiElement( + state.osmConnection.userDetails.map(userDetails => { + if (userDetails.csCount < Constants.userJourney.themeGeneratorReadOnlyUnlock) { + return new SubtleButton(null, tr.requestATheme.Clone(), { + url: "https://github.com/pietervdvn/MapComplete/issues", + newTab: true + }); + } + return new SubtleButton(Svg.pencil_ui(), tr.createYourOwnTheme.Clone(), { + url: "https://pietervdvn.github.io/mc/legacy/070/customGenerator.html", + newTab: false + }); + }) + ) + } + } \ No newline at end of file diff --git a/UI/BigComponents/RightControls.ts b/UI/BigComponents/RightControls.ts index 35f11754c..9dbcd08a4 100644 --- a/UI/BigComponents/RightControls.ts +++ b/UI/BigComponents/RightControls.ts @@ -9,19 +9,19 @@ import AllKnownLayers from "../../Customizations/AllKnownLayers"; export default class RightControls extends Combine { - constructor(state:MapState) { - + constructor(state: MapState) { + const geolocatioHandler = new GeoLocationHandler( state ) - + new ShowDataLayer({ layerToShow: AllKnownLayers.sharedLayers.get("gps_location"), leafletMap: state.leafletMap, enablePopups: true, features: geolocatioHandler.currentLocation }) - + const geolocationButton = new Toggle( new MapControlButton( geolocatioHandler diff --git a/UI/BigComponents/ShareScreen.ts b/UI/BigComponents/ShareScreen.ts index 9fc7dde91..0f3bd5bae 100644 --- a/UI/BigComponents/ShareScreen.ts +++ b/UI/BigComponents/ShareScreen.ts @@ -15,7 +15,7 @@ import FilteredLayer from "../../Models/FilteredLayer"; export default class ShareScreen extends Combine { - constructor(state: {layoutToUse: LayoutConfig, locationControl: UIEventSource, backgroundLayer: UIEventSource, filteredLayers: UIEventSource}) { + constructor(state: { layoutToUse: LayoutConfig, locationControl: UIEventSource, backgroundLayer: UIEventSource, filteredLayers: UIEventSource }) { const layout = state?.layoutToUse; const tr = Translations.t.general.sharescreen; @@ -62,40 +62,39 @@ export default class ShareScreen extends Combine { } - - const currentLayer: UIEventSource<{ id: string, name: string, layer: any }> = state.backgroundLayer; - const currentBackground = new VariableUiElement(currentLayer.map(layer => { - return tr.fsIncludeCurrentBackgroundMap.Subs({name: layer?.name ?? ""}); - })); - const includeCurrentBackground = new Toggle( - new Combine([check(), currentBackground]), - new Combine([nocheck(), currentBackground]), - new UIEventSource(true) - ).ToggleOnClick() - optionCheckboxes.push(includeCurrentBackground); - optionParts.push(includeCurrentBackground.isEnabled.map((includeBG) => { - if (includeBG) { - return "background=" + currentLayer.data.id - } else { - return null - } - }, [currentLayer])); + const currentLayer: UIEventSource<{ id: string, name: string, layer: any }> = state.backgroundLayer; + const currentBackground = new VariableUiElement(currentLayer.map(layer => { + return tr.fsIncludeCurrentBackgroundMap.Subs({name: layer?.name ?? ""}); + })); + const includeCurrentBackground = new Toggle( + new Combine([check(), currentBackground]), + new Combine([nocheck(), currentBackground]), + new UIEventSource(true) + ).ToggleOnClick() + optionCheckboxes.push(includeCurrentBackground); + optionParts.push(includeCurrentBackground.isEnabled.map((includeBG) => { + if (includeBG) { + return "background=" + currentLayer.data.id + } else { + return null + } + }, [currentLayer])); - const includeLayerChoices = new Toggle( - new Combine([check(), tr.fsIncludeCurrentLayers.Clone()]), - new Combine([nocheck(), tr.fsIncludeCurrentLayers.Clone()]), - new UIEventSource(true) - ).ToggleOnClick() - optionCheckboxes.push(includeLayerChoices); + const includeLayerChoices = new Toggle( + new Combine([check(), tr.fsIncludeCurrentLayers.Clone()]), + new Combine([nocheck(), tr.fsIncludeCurrentLayers.Clone()]), + new UIEventSource(true) + ).ToggleOnClick() + optionCheckboxes.push(includeLayerChoices); - optionParts.push(includeLayerChoices.isEnabled.map((includeLayerSelection) => { - if (includeLayerSelection) { - return Utils.NoNull(state.filteredLayers.data.map(fLayerToParam)).join("&") - } else { - return null - } - }, state.filteredLayers.data.map((flayer) => flayer.isDisplayed))); + optionParts.push(includeLayerChoices.isEnabled.map((includeLayerSelection) => { + if (includeLayerSelection) { + return Utils.NoNull(state.filteredLayers.data.map(fLayerToParam)).join("&") + } else { + return null + } + }, state.filteredLayers.data.map((flayer) => flayer.isDisplayed))); const switches = [ diff --git a/UI/BigComponents/SimpleAddUI.ts b/UI/BigComponents/SimpleAddUI.ts index f7931b853..04a3aa314 100644 --- a/UI/BigComponents/SimpleAddUI.ts +++ b/UI/BigComponents/SimpleAddUI.ts @@ -105,7 +105,7 @@ export default class SimpleAddUI extends Toggle { selectedPreset.setData(undefined) } - const message =Translations.t.general.add.addNew.Subs({category: preset.name}); + const message = Translations.t.general.add.addNew.Subs({category: preset.name}); return new ConfirmLocationOfPoint(state, filterViewIsOpened, preset, message, state.LastClickLocation.data, diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts index 0c93e4bf8..d57dbbd5b 100644 --- a/UI/DefaultGUI.ts +++ b/UI/DefaultGUI.ts @@ -46,123 +46,6 @@ export default class DefaultGUI { this.SetupMap() } - - private SetupMap(){ - const state = this.state; - const guiState = this._guiState; - - // Attach the map - state.mainMapObject.SetClass("w-full h-full") - .AttachTo("leafletDiv") - - this.setupClickDialogOnMap( - guiState.filterViewIsOpened, - state - ) - - - new ShowDataLayer({ - leafletMap: state.leafletMap, - layerToShow: AllKnownLayers.sharedLayers.get("home_location"), - features: state.homeLocation, - enablePopups: false, - }) - - state.leafletMap.addCallbackAndRunD(_ => { - // Lets assume that all showDataLayers are initialized at this point - state.selectedElement.ping() - State.state.locationControl.ping(); - return true; - }) - - } - - private SetupUIElements(){ - const state = this.state; - const guiState = this._guiState; - - const self =this - Toggle.If(state.featureSwitchUserbadge, - () => new UserBadge(state) - ).AttachTo("userbadge") - - Toggle.If(state.featureSwitchSearch, - () => new SearchAndGo(state)) - .AttachTo("searchbox"); - - - let iframePopout: () => BaseUIElement = undefined; - - if (window !== window.top) { - // MapComplete is running in an iframe - iframePopout = () => new VariableUiElement(state.locationControl.map(loc => { - const url = `${window.location.origin}${window.location.pathname}?z=${loc.zoom ?? 0}&lat=${loc.lat ?? 0}&lon=${loc.lon ?? 0}`; - const link = new Link(Svg.pop_out_img, url, true).SetClass("block w-full h-full p-1.5") - return new MapControlButton(link) - })) - - } - - new Toggle(new Lazy(() => self.InitWelcomeMessage()), - Toggle.If(state.featureSwitchIframePopoutEnabled, iframePopout), - state.featureSwitchWelcomeMessage - ).AttachTo("messagesbox"); - - - new LeftControls(state, guiState).AttachTo("bottom-left"); - new RightControls(state).AttachTo("bottom-right"); - - new CenterMessageBox(state).AttachTo("centermessage"); - document - .getElementById("centermessage") - .classList.add("pointer-events-none"); - - // We have to ping the welcomeMessageIsOpened and other isOpened-stuff to activate the FullScreenMessage if needed - for (const state of guiState.allFullScreenStates) { - if(state.data){ - state.ping() - } - } - - /** - * At last, if the map moves or an element is selected, we close all the panels just as well - */ - - state.selectedElement.addCallbackAndRunD((_) => { - guiState.allFullScreenStates.forEach(s => s.setData(false)) - }); - } - - private InitWelcomeMessage() : BaseUIElement{ - const isOpened = this._guiState.welcomeMessageIsOpened - const fullOptions = new FullWelcomePaneWithTabs(isOpened, this._guiState.welcomeMessageOpenedTab, this.state); - - // ?-Button on Desktop, opens panel with close-X. - const help = new MapControlButton(Svg.help_svg()); - help.onClick(() => isOpened.setData(true)); - - - const openedTime = new Date().getTime(); - this.state.locationControl.addCallback(() => { - if (new Date().getTime() - openedTime < 15 * 1000) { - // Don't autoclose the first 15 secs when the map is moving - return; - } - isOpened.setData(false); - }); - - this.state.selectedElement.addCallbackAndRunD((_) => { - isOpened.setData(false); - }); - - return new Toggle( - fullOptions.SetClass("welcomeMessage pointer-events-auto"), - help.SetClass("pointer-events-auto"), - isOpened - ) - - } - public setupClickDialogOnMap(filterViewIsOpened: UIEventSource, state: FeaturePipelineState) { function setup() { @@ -207,4 +90,120 @@ export default class DefaultGUI { } + private SetupMap() { + const state = this.state; + const guiState = this._guiState; + + // Attach the map + state.mainMapObject.SetClass("w-full h-full") + .AttachTo("leafletDiv") + + this.setupClickDialogOnMap( + guiState.filterViewIsOpened, + state + ) + + + new ShowDataLayer({ + leafletMap: state.leafletMap, + layerToShow: AllKnownLayers.sharedLayers.get("home_location"), + features: state.homeLocation, + enablePopups: false, + }) + + state.leafletMap.addCallbackAndRunD(_ => { + // Lets assume that all showDataLayers are initialized at this point + state.selectedElement.ping() + State.state.locationControl.ping(); + return true; + }) + + } + + private SetupUIElements() { + const state = this.state; + const guiState = this._guiState; + + const self = this + Toggle.If(state.featureSwitchUserbadge, + () => new UserBadge(state) + ).AttachTo("userbadge") + + Toggle.If(state.featureSwitchSearch, + () => new SearchAndGo(state)) + .AttachTo("searchbox"); + + + let iframePopout: () => BaseUIElement = undefined; + + if (window !== window.top) { + // MapComplete is running in an iframe + iframePopout = () => new VariableUiElement(state.locationControl.map(loc => { + const url = `${window.location.origin}${window.location.pathname}?z=${loc.zoom ?? 0}&lat=${loc.lat ?? 0}&lon=${loc.lon ?? 0}`; + const link = new Link(Svg.pop_out_img, url, true).SetClass("block w-full h-full p-1.5") + return new MapControlButton(link) + })) + + } + + new Toggle(new Lazy(() => self.InitWelcomeMessage()), + Toggle.If(state.featureSwitchIframePopoutEnabled, iframePopout), + state.featureSwitchWelcomeMessage + ).AttachTo("messagesbox"); + + + new LeftControls(state, guiState).AttachTo("bottom-left"); + new RightControls(state).AttachTo("bottom-right"); + + new CenterMessageBox(state).AttachTo("centermessage"); + document + .getElementById("centermessage") + .classList.add("pointer-events-none"); + + // We have to ping the welcomeMessageIsOpened and other isOpened-stuff to activate the FullScreenMessage if needed + for (const state of guiState.allFullScreenStates) { + if (state.data) { + state.ping() + } + } + + /** + * At last, if the map moves or an element is selected, we close all the panels just as well + */ + + state.selectedElement.addCallbackAndRunD((_) => { + guiState.allFullScreenStates.forEach(s => s.setData(false)) + }); + } + + private InitWelcomeMessage(): BaseUIElement { + const isOpened = this._guiState.welcomeMessageIsOpened + const fullOptions = new FullWelcomePaneWithTabs(isOpened, this._guiState.welcomeMessageOpenedTab, this.state); + + // ?-Button on Desktop, opens panel with close-X. + const help = new MapControlButton(Svg.help_svg()); + help.onClick(() => isOpened.setData(true)); + + + const openedTime = new Date().getTime(); + this.state.locationControl.addCallback(() => { + if (new Date().getTime() - openedTime < 15 * 1000) { + // Don't autoclose the first 15 secs when the map is moving + return; + } + isOpened.setData(false); + }); + + this.state.selectedElement.addCallbackAndRunD((_) => { + isOpened.setData(false); + }); + + return new Toggle( + fullOptions.SetClass("welcomeMessage pointer-events-auto"), + help.SetClass("pointer-events-auto"), + isOpened + ) + + } + } \ No newline at end of file diff --git a/UI/DefaultGuiState.ts b/UI/DefaultGuiState.ts index 7c5cae139..537eb4b70 100644 --- a/UI/DefaultGuiState.ts +++ b/UI/DefaultGuiState.ts @@ -4,13 +4,13 @@ import Constants from "../Models/Constants"; import Hash from "../Logic/Web/Hash"; export class DefaultGuiState { + static state: DefaultGuiState; public readonly welcomeMessageIsOpened: UIEventSource; public readonly downloadControlIsOpened: UIEventSource; public readonly filterViewIsOpened: UIEventSource; public readonly copyrightViewIsOpened: UIEventSource; public readonly welcomeMessageOpenedTab: UIEventSource public readonly allFullScreenStates: UIEventSource[] = [] - static state: DefaultGuiState; constructor() { diff --git a/UI/ExportPDF.ts b/UI/ExportPDF.ts index e03103322..6f27794f8 100644 --- a/UI/ExportPDF.ts +++ b/UI/ExportPDF.ts @@ -11,6 +11,7 @@ import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; import FeaturePipeline from "../Logic/FeatureSource/FeaturePipeline"; import ShowDataLayer from "./ShowDataLayer/ShowDataLayer"; import {BBox} from "../Logic/BBox"; + /** * Creates screenshoter to take png screenshot * Creates jspdf and downloads it @@ -79,10 +80,10 @@ export default class ExportPDF { minimap.AttachTo(options.freeDivId) // Next: we prepare the features. Only fully contained features are shown - minimap.leafletMap .addCallbackAndRunD(leaflet => { + minimap.leafletMap.addCallbackAndRunD(leaflet => { const bounds = BBox.fromLeafletBounds(leaflet.getBounds().pad(0.2)) options.features.GetTilesPerLayerWithin(bounds, tile => { - if(tile.layer.layerDef.minzoom > l.zoom){ + if (tile.layer.layerDef.minzoom > l.zoom) { return } new ShowDataLayer( @@ -95,7 +96,7 @@ export default class ExportPDF { } ) }) - + }) State.state.AddAllOverlaysToMap(minimap.leafletMap) @@ -107,9 +108,8 @@ export default class ExportPDF { } private async CreatePdf(minimap: MinimapObj) { - - - + + console.log("PDF creation started") const t = Translations.t.general.pdf; const layout = this._layout diff --git a/UI/Image/AttributedImage.ts b/UI/Image/AttributedImage.ts index b0bb60d80..031f81ced 100644 --- a/UI/Image/AttributedImage.ts +++ b/UI/Image/AttributedImage.ts @@ -12,10 +12,10 @@ export class AttributedImage extends Combine { let img: BaseUIElement; let attr: BaseUIElement img = new Img(imageInfo.url, false, { - fallbackImage: imageInfo.provider === Mapillary.singleton ? "./assets/svg/blocked.svg" : undefined + fallbackImage: imageInfo.provider === Mapillary.singleton ? "./assets/svg/blocked.svg" : undefined }); attr = new Attribution(imageInfo.provider.GetAttributionFor(imageInfo.url), - imageInfo.provider.SourceIcon(), + imageInfo.provider.SourceIcon(), ) diff --git a/UI/Image/Attribution.ts b/UI/Image/Attribution.ts index 713b228c6..3db016da0 100644 --- a/UI/Image/Attribution.ts +++ b/UI/Image/Attribution.ts @@ -13,10 +13,10 @@ export default class Attribution extends VariableUiElement { } super( license.map((license: LicenseInfo) => { - if(license === undefined){ + if (license === undefined) { return undefined } - + return new Combine([ icon?.SetClass("block left").SetStyle("height: 2em; width: 2em; padding-right: 0.5em;"), diff --git a/UI/Image/DeleteImage.ts b/UI/Image/DeleteImage.ts index 68afbb3fc..eca3dc738 100644 --- a/UI/Image/DeleteImage.ts +++ b/UI/Image/DeleteImage.ts @@ -15,19 +15,19 @@ export default class DeleteImage extends Toggle { const isDeletedBadge = Translations.t.image.isDeleted.Clone() .SetClass("rounded-full p-1") .SetStyle("color:white;background:#ff8c8c") - .onClick(async() => { - await State.state?.changes?.applyAction(new ChangeTagAction(tags.data.id, new Tag(key, oldValue), tags.data, { - changeType: "answer", - theme: "test" - })) + .onClick(async () => { + await State.state?.changes?.applyAction(new ChangeTagAction(tags.data.id, new Tag(key, oldValue), tags.data, { + changeType: "answer", + theme: "test" + })) }); const deleteButton = Translations.t.image.doDelete.Clone() .SetClass("block w-full pl-4 pr-4") .SetStyle("color:white;background:#ff8c8c; border-top-left-radius:30rem; border-top-right-radius: 30rem;") - .onClick( async() => { - await State.state?.changes?.applyAction( - new ChangeTagAction(tags.data.id, new Tag(key, ""), tags.data,{ + .onClick(async () => { + await State.state?.changes?.applyAction( + new ChangeTagAction(tags.data.id, new Tag(key, ""), tags.data, { changeType: "answer", theme: "test" }) diff --git a/UI/Image/ImageCarousel.ts b/UI/Image/ImageCarousel.ts index 43ce32682..c0fc52eda 100644 --- a/UI/Image/ImageCarousel.ts +++ b/UI/Image/ImageCarousel.ts @@ -9,7 +9,7 @@ import ImageProvider from "../../Logic/ImageProviders/ImageProvider"; export class ImageCarousel extends Toggle { - constructor(images: UIEventSource<{ key: string, url: string, provider: ImageProvider }[]>, + constructor(images: UIEventSource<{ key: string, url: string, provider: ImageProvider }[]>, tags: UIEventSource, keys: string[]) { const uiElements = images.map((imageURLS: { key: string, url: string, provider: ImageProvider }[]) => { diff --git a/UI/Image/ImageUploadFlow.ts b/UI/Image/ImageUploadFlow.ts index c0407c208..5a49d8d72 100644 --- a/UI/Image/ImageUploadFlow.ts +++ b/UI/Image/ImageUploadFlow.ts @@ -16,13 +16,13 @@ import {VariableUiElement} from "../Base/VariableUIElement"; export class ImageUploadFlow extends Toggle { - + private static readonly uploadCountsPerId = new Map>() - + constructor(tagsSource: UIEventSource, imagePrefix: string = "image", text: string = undefined) { const perId = ImageUploadFlow.uploadCountsPerId const id = tagsSource.data.id - if(!perId.has(id)){ + if (!perId.has(id)) { perId.set(id, new UIEventSource(0)) } const uploadedCount = perId.get(id) @@ -39,7 +39,7 @@ export class ImageUploadFlow extends Toggle { key = imagePrefix + ":" + freeIndex; } console.log("Adding image:" + key, url); - uploadedCount.data ++ + uploadedCount.data++ uploadedCount.ping() Promise.resolve(State.state.changes .applyAction(new ChangeTagAction( @@ -50,17 +50,17 @@ export class ImageUploadFlow extends Toggle { } ))) }) - + const licensePicker = new LicensePicker() const t = Translations.t.image; - - let labelContent : BaseUIElement - if(text === undefined) { - labelContent = Translations.t.image.addPicture.Clone().SetClass("block align-middle mt-1 ml-3 text-4xl ") - }else{ - labelContent = new FixedUiElement(text).SetClass("block align-middle mt-1 ml-3 text-2xl ") - } + + let labelContent: BaseUIElement + if (text === undefined) { + labelContent = Translations.t.image.addPicture.Clone().SetClass("block align-middle mt-1 ml-3 text-4xl ") + } else { + labelContent = new FixedUiElement(text).SetClass("block align-middle mt-1 ml-3 text-2xl ") + } const label = new Combine([ Svg.camera_plus_ui().SetClass("block w-12 h-12 p-1 text-4xl "), labelContent @@ -74,17 +74,17 @@ export class ImageUploadFlow extends Toggle { for (var i = 0; i < filelist.length; i++) { - const sizeInBytes= filelist[i].size + const sizeInBytes = filelist[i].size console.log(filelist[i].name + " has a size of " + sizeInBytes + " Bytes"); - if(sizeInBytes > uploader.maxFileSizeInMegabytes * 1000000){ + if (sizeInBytes > uploader.maxFileSizeInMegabytes * 1000000) { alert(Translations.t.image.toBig.Subs({ actual_size: (Math.floor(sizeInBytes / 1000000)) + "MB", - max_size: uploader.maxFileSizeInMegabytes+"MB" + max_size: uploader.maxFileSizeInMegabytes + "MB" }).txt) return; } } - + console.log("Received images from the user, starting upload") const license = licensePicker.GetValue()?.data ?? "CC0" @@ -114,31 +114,31 @@ export class ImageUploadFlow extends Toggle { const uploadFlow: BaseUIElement = new Combine([ new VariableUiElement(uploader.queue.map(q => q.length).map(l => { - if(l == 0){ + if (l == 0) { return undefined; } - if(l == 1){ - return t.uploadingPicture.Clone().SetClass("alert") - }else{ + if (l == 1) { + return t.uploadingPicture.Clone().SetClass("alert") + } else { return t.uploadingMultiple.Subs({count: "" + l}).SetClass("alert") } })), new VariableUiElement(uploader.failed.map(q => q.length).map(l => { - if(l==0){ + if (l == 0) { return undefined } return t.uploadFailed.Clone().SetClass("alert"); })), new VariableUiElement(uploadedCount.map(l => { - if(l == 0){ - return undefined; + if (l == 0) { + return undefined; } - if(l == 1){ + if (l == 1) { return t.uploadDone.Clone().SetClass("thanks"); } return t.uploadMultipleDone.Subs({count: l}).SetClass("thanks") })), - + fileSelector, Translations.t.image.respectPrivacy.Clone().SetStyle("font-size:small;"), licensePicker diff --git a/UI/Input/FixedInputElement.ts b/UI/Input/FixedInputElement.ts index 479aba16c..37e025b79 100644 --- a/UI/Input/FixedInputElement.ts +++ b/UI/Input/FixedInputElement.ts @@ -15,9 +15,9 @@ export class FixedInputElement extends InputElement { comparator: ((t0: T, t1: T) => boolean) = undefined) { super(); this._comparator = comparator ?? ((t0, t1) => t0 == t1); - if(value instanceof UIEventSource){ + if (value instanceof UIEventSource) { this.value = value - }else{ + } else { this.value = new UIEventSource(value); } diff --git a/UI/Input/LengthInput.ts b/UI/Input/LengthInput.ts index 2875f4362..7935cde35 100644 --- a/UI/Input/LengthInput.ts +++ b/UI/Input/LengthInput.ts @@ -45,7 +45,7 @@ export default class LengthInput extends InputElement { background: this.background, allowMoving: false, location: this._location, - attribution:true, + attribution: true, leafletOptions: { tap: true } diff --git a/UI/Input/LocationInput.ts b/UI/Input/LocationInput.ts index 21cfdebe7..880f8810b 100644 --- a/UI/Input/LocationInput.ts +++ b/UI/Input/LocationInput.ts @@ -96,22 +96,22 @@ export default class LocationInput extends InputElement implements MinimapO let min = undefined; let matchedWay = undefined; for (const feature of self._snapTo.data ?? []) { - try{ - - const nearestPointOnLine = GeoOperations.nearestPoint(feature.feature, [loc.lon, loc.lat]) - if (min === undefined) { - min = nearestPointOnLine - matchedWay = feature.feature; - continue; - } + try { - if (min.properties.dist > nearestPointOnLine.properties.dist) { - min = nearestPointOnLine - matchedWay = feature.feature; + const nearestPointOnLine = GeoOperations.nearestPoint(feature.feature, [loc.lon, loc.lat]) + if (min === undefined) { + min = nearestPointOnLine + matchedWay = feature.feature; + continue; + } - } - }catch(e){ - console.log("Snapping to a nearest point failed for ", feature.feature,"due to ", e) + if (min.properties.dist > nearestPointOnLine.properties.dist) { + min = nearestPointOnLine + matchedWay = feature.feature; + + } + } catch (e) { + console.log("Snapping to a nearest point failed for ", feature.feature, "due to ", e) } } @@ -167,8 +167,9 @@ export default class LocationInput extends InputElement implements MinimapO installBounds(factor: number | BBox, showRange?: boolean): void { this.map.installBounds(factor, showRange) } + TakeScreenshot(): Promise { - return this.map.TakeScreenshot() + return this.map.TakeScreenshot() } protected InnerConstructElement(): HTMLElement { diff --git a/UI/Input/Toggle.ts b/UI/Input/Toggle.ts index 886412352..f62298601 100644 --- a/UI/Input/Toggle.ts +++ b/UI/Input/Toggle.ts @@ -18,16 +18,8 @@ export default class Toggle extends VariableUiElement { this.isEnabled = isEnabled } - public ToggleOnClick(): Toggle { - const self = this; - this.onClick(() => { - self.isEnabled.setData(!self.isEnabled.data); - }) - return this; - } - - public static If(condition: UIEventSource, constructor: () => BaseUIElement): BaseUIElement { - if(constructor === undefined){ + public static If(condition: UIEventSource, constructor: () => BaseUIElement): BaseUIElement { + if (constructor === undefined) { return undefined } return new Toggle( @@ -35,6 +27,14 @@ export default class Toggle extends VariableUiElement { undefined, condition ) - + + } + + public ToggleOnClick(): Toggle { + const self = this; + this.onClick(() => { + self.isEnabled.setData(!self.isEnabled.data); + }) + return this; } } \ No newline at end of file diff --git a/UI/Input/ValidatedTextField.ts b/UI/Input/ValidatedTextField.ts index 77cc5c433..a6aef8131 100644 --- a/UI/Input/ValidatedTextField.ts +++ b/UI/Input/ValidatedTextField.ts @@ -271,7 +271,7 @@ export default class ValidatedTextField { if (args[0]) { zoom = Number(args[0]) if (isNaN(zoom)) { - console.error("Invalid zoom level for argument at 'length'-input. The offending argument is: ",args[0]," (using 19 instead)") + console.error("Invalid zoom level for argument at 'length'-input. The offending argument is: ", args[0], " (using 19 instead)") zoom = 19 } } diff --git a/UI/Input/VariableInputElement.ts b/UI/Input/VariableInputElement.ts index 1918dfe9a..f7bb2d8f8 100644 --- a/UI/Input/VariableInputElement.ts +++ b/UI/Input/VariableInputElement.ts @@ -5,9 +5,9 @@ import {VariableUiElement} from "../Base/VariableUIElement"; export default class VariableInputElement extends InputElement { + public readonly IsSelected: UIEventSource; private readonly value: UIEventSource; private readonly element: BaseUIElement - public readonly IsSelected: UIEventSource; private readonly upstream: UIEventSource>; constructor(upstream: UIEventSource>) { @@ -23,13 +23,12 @@ export default class VariableInputElement extends InputElement { return this.value; } - protected InnerConstructElement(): HTMLElement { - return this.element.ConstructElement(); - } - - IsValid(t: T): boolean { return this.upstream.data.IsValid(t); } + protected InnerConstructElement(): HTMLElement { + return this.element.ConstructElement(); + } + } \ No newline at end of file diff --git a/UI/OpeningHours/OpeningHoursInput.ts b/UI/OpeningHours/OpeningHoursInput.ts index 88b061a3d..50aa52cf4 100644 --- a/UI/OpeningHours/OpeningHoursInput.ts +++ b/UI/OpeningHours/OpeningHoursInput.ts @@ -28,12 +28,12 @@ export default class OpeningHoursInput extends InputElement { this._value = value; let valueWithoutPrefix = value if (prefix !== "" && postfix !== "") { - + valueWithoutPrefix = value.map(str => { if (str === undefined) { return undefined; } - if(str === ""){ + if (str === "") { return "" } if (str.startsWith(prefix) && str.endsWith(postfix)) { @@ -44,7 +44,7 @@ export default class OpeningHoursInput extends InputElement { if (noPrefix === undefined) { return undefined; } - if(noPrefix === ""){ + if (noPrefix === "") { return "" } if (noPrefix.startsWith(prefix) && noPrefix.endsWith(postfix)) { diff --git a/UI/Popup/EditableTagRendering.ts b/UI/Popup/EditableTagRendering.ts index be9634b2f..48cd669ef 100644 --- a/UI/Popup/EditableTagRendering.ts +++ b/UI/Popup/EditableTagRendering.ts @@ -16,9 +16,9 @@ export default class EditableTagRendering extends Toggle { constructor(tags: UIEventSource, configuration: TagRenderingConfig, units: Unit [], - options:{ - editMode? : UIEventSource , - innerElementClasses?: string + options: { + editMode?: UIEventSource, + innerElementClasses?: string } ) { @@ -28,7 +28,7 @@ export default class EditableTagRendering extends Toggle { const renderingIsShown = tags.map(tags => configuration.IsKnown(tags) && (configuration?.condition?.matchesProperties(tags) ?? true)) - + super( new Lazy(() => { const editMode = options.editMode ?? new UIEventSource(false) @@ -40,8 +40,8 @@ export default class EditableTagRendering extends Toggle { renderingIsShown ) } - - private static CreateRendering(tags: UIEventSource, configuration: TagRenderingConfig, units: Unit[], editMode: UIEventSource) : BaseUIElement{ + + private static CreateRendering(tags: UIEventSource, configuration: TagRenderingConfig, units: Unit[], editMode: UIEventSource): BaseUIElement { const answer: BaseUIElement = new TagRenderingAnswer(tags, configuration) answer.SetClass("w-full") let rendering = answer; diff --git a/UI/Popup/FeatureInfoBox.ts b/UI/Popup/FeatureInfoBox.ts index 3ec287856..542f6b4f0 100644 --- a/UI/Popup/FeatureInfoBox.ts +++ b/UI/Popup/FeatureInfoBox.ts @@ -77,23 +77,23 @@ export default class FeatureInfoBox extends ScrollableFullScreen { renderingsForGroup.push(questionBox) } else { let classes = innerClasses - let isHeader = renderingsForGroup.length === 0 && i > 0 - if(isHeader){ + let isHeader = renderingsForGroup.length === 0 && i > 0 + if (isHeader) { // This is the first element of a group! // It should act as header and be sticky - classes= "" + classes = "" } - - const etr = new EditableTagRendering(tags, tr, layerConfig.units,{ + + const etr = new EditableTagRendering(tags, tr, layerConfig.units, { innerElementClasses: innerClasses }) - if(isHeader){ + if (isHeader) { etr.SetClass("sticky top-0") } renderingsForGroup.push(etr) } } - + allRenderings.push(...renderingsForGroup) } diff --git a/UI/Popup/MoveWizard.ts b/UI/Popup/MoveWizard.ts index 254c7a0ca..b86a55937 100644 --- a/UI/Popup/MoveWizard.ts +++ b/UI/Popup/MoveWizard.ts @@ -42,7 +42,7 @@ export default class MoveWizard extends Toggle { changes: Changes, layoutToUse: LayoutConfig, allElements: ElementStorage - }, options : MoveConfig) { + }, options: MoveConfig) { const t = Translations.t.move const loginButton = new Toggle( @@ -64,7 +64,7 @@ export default class MoveWizard extends Toggle { minZoom: 6 }) } - if(options.enableImproveAccuracy){ + if (options.enableImproveAccuracy) { reasons.push({ text: t.reasons.reasonInaccurate, invitingText: t.inviteToMove.reasonInaccurate, @@ -79,8 +79,8 @@ export default class MoveWizard extends Toggle { const currentStep = new UIEventSource<"start" | "reason" | "pick_location" | "moved">("start") const moveReason = new UIEventSource(undefined) - let moveButton : BaseUIElement; - if(reasons.length === 1){ + let moveButton: BaseUIElement; + if (reasons.length === 1) { const reason = reasons[0] moveReason.setData(reason) moveButton = new SubtleButton( @@ -89,7 +89,7 @@ export default class MoveWizard extends Toggle { ).onClick(() => { currentStep.setData("pick_location") }) - }else{ + } else { moveButton = new SubtleButton( Svg.move_ui().SetStyle("height: 1.5rem; width: auto"), t.inviteToMove.generic @@ -97,7 +97,7 @@ export default class MoveWizard extends Toggle { currentStep.setData("reason") }) } - + const moveAgainButton = new SubtleButton( Svg.move_ui(), @@ -107,8 +107,6 @@ export default class MoveWizard extends Toggle { }) - - const selectReason = new Combine(reasons.map(r => new SubtleButton(r.icon, r.text).onClick(() => { moveReason.setData(r) currentStep.setData("pick_location") @@ -129,16 +127,16 @@ export default class MoveWizard extends Toggle { }) let background: string[] - if(typeof reason.background == "string"){ + if (typeof reason.background == "string") { background = [reason.background] - }else{ + } else { background = reason.background } - + const locationInput = new LocationInput({ minZoom: reason.minZoom, centerLocation: loc, - mapBackground:AvailableBaseLayers.SelectBestLayerAccordingTo(loc, new UIEventSource(background)) + mapBackground: AvailableBaseLayers.SelectBestLayerAccordingTo(loc, new UIEventSource(background)) }) if (reason.lockBounds) { @@ -198,8 +196,8 @@ export default class MoveWizard extends Toggle { moveDisallowedReason.setData(t.isWay) } else if (id.startsWith("relation")) { moveDisallowedReason.setData(t.isRelation) - } else if(id.indexOf("-") < 0) { - + } else if (id.indexOf("-") < 0) { + OsmObject.DownloadReferencingWays(id).then(referencing => { if (referencing.length > 0) { console.log("Got a referencing way, move not allowed") @@ -207,7 +205,7 @@ export default class MoveWizard extends Toggle { } }) OsmObject.DownloadReferencingRelations(id).then(partOf => { - if(partOf.length > 0){ + if (partOf.length > 0) { moveDisallowedReason.setData(t.partOfRelation) } }) diff --git a/UI/Popup/MultiApply.ts b/UI/Popup/MultiApply.ts index 159bdd321..1f13f7d02 100644 --- a/UI/Popup/MultiApply.ts +++ b/UI/Popup/MultiApply.ts @@ -32,6 +32,7 @@ export interface MultiApplyParams { class MultiApplyExecutor { + private static executorCache = new Map() private readonly originalValues = new Map() private readonly params: MultiApplyParams; @@ -48,7 +49,7 @@ class MultiApplyExecutor { const self = this; const relevantValues = p.tagsSource.map(tags => { const currentValues = p.keysToApply.map(key => tags[key]) - // By stringifying, we have a very clear ping when they changec + // By stringifying, we have a very clear ping when they changec return JSON.stringify(currentValues); }) relevantValues.addCallbackD(_ => { @@ -57,6 +58,15 @@ class MultiApplyExecutor { } } + public static GetApplicator(id: string, params: MultiApplyParams): MultiApplyExecutor { + if (MultiApplyExecutor.executorCache.has(id)) { + return MultiApplyExecutor.executorCache.get(id) + } + const applicator = new MultiApplyExecutor(params) + MultiApplyExecutor.executorCache.set(id, applicator) + return applicator + } + public applyTaggingOnOtherFeatures() { console.log("Multi-applying changes...") const featuresToChange = this.params.featureIds.data @@ -103,17 +113,6 @@ class MultiApplyExecutor { } } - private static executorCache = new Map() - - public static GetApplicator(id: string, params: MultiApplyParams): MultiApplyExecutor { - if (MultiApplyExecutor.executorCache.has(id)) { - return MultiApplyExecutor.executorCache.get(id) - } - const applicator = new MultiApplyExecutor(params) - MultiApplyExecutor.executorCache.set(id, applicator) - return applicator - } - } export default class MultiApply extends Toggle { diff --git a/UI/Popup/QuestionBox.ts b/UI/Popup/QuestionBox.ts index 5dfa062ea..08ae151a3 100644 --- a/UI/Popup/QuestionBox.ts +++ b/UI/Popup/QuestionBox.ts @@ -16,7 +16,7 @@ import Lazy from "../Base/Lazy"; export default class QuestionBox extends VariableUiElement { constructor(tagsSource: UIEventSource, tagRenderings: TagRenderingConfig[], units: Unit[]) { - + const skippedQuestions: UIEventSource = new UIEventSource([]) tagRenderings = tagRenderings @@ -31,20 +31,20 @@ export default class QuestionBox extends VariableUiElement { const tagRenderingQuestions = tagRenderings .map((tagRendering, i) => new Lazy(() => new TagRenderingQuestion(tagsSource, tagRendering, - { - units: units, - afterSave: () => { - // We save and indicate progress by pinging and recalculating - skippedQuestions.ping(); - }, - cancelButton: Translations.t.general.skip.Clone() - .SetClass("btn btn-secondary mr-3") - .onClick(() => { - skippedQuestions.data.push(i); + { + units: units, + afterSave: () => { + // We save and indicate progress by pinging and recalculating skippedQuestions.ping(); - }) - } - ))); + }, + cancelButton: Translations.t.general.skip.Clone() + .SetClass("btn btn-secondary mr-3") + .onClick(() => { + skippedQuestions.data.push(i); + skippedQuestions.ping(); + }) + } + ))); const skippedQuestionsButton = Translations.t.general.skippedQuestions .onClick(() => { diff --git a/UI/Popup/SplitRoadWizard.ts b/UI/Popup/SplitRoadWizard.ts index 9ee39f683..0490f8479 100644 --- a/UI/Popup/SplitRoadWizard.ts +++ b/UI/Popup/SplitRoadWizard.ts @@ -23,7 +23,7 @@ export default class SplitRoadWizard extends Toggle { source: {osmTags: "_cutposition=yes"}, mapRendering: [ { - location: ["point","centroid"], + location: ["point", "centroid"], icon: {render: "circle:white;./assets/svg/scissors.svg"}, iconSize: {render: "30,30,center"} } diff --git a/UI/ShowDataLayer/ShowDataLayer.ts b/UI/ShowDataLayer/ShowDataLayer.ts index 497c9282b..44c5dcad8 100644 --- a/UI/ShowDataLayer/ShowDataLayer.ts +++ b/UI/ShowDataLayer/ShowDataLayer.ts @@ -1,4 +1,3 @@ - import {UIEventSource} from "../../Logic/UIEventSource"; import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; import FeatureInfoBox from "../Popup/FeatureInfoBox"; @@ -20,6 +19,7 @@ We don't actually import it here. It is imported in the 'MinimapImplementation'- */ export default class ShowDataLayer { + private static dataLayerIds = 0 private readonly _leafletMap: UIEventSource; private readonly _enablePopups: boolean; private readonly _features: RenderingMultiPlexerFeatureSource @@ -30,7 +30,6 @@ export default class ShowDataLayer { private _cleanCount = 0; private geoLayer = undefined; private isDirty = false; - /** * If the selected element triggers, this is used to lookup the correct layer and to open the popup * Used to avoid a lot of callbacks on the selected element @@ -39,9 +38,7 @@ export default class ShowDataLayer { * @private */ private readonly leafletLayersPerId = new Map() - private readonly showDataLayerid: number; - private static dataLayerIds = 0 constructor(options: ShowDataLayerOptions & { layerToShow: LayerConfig }) { this._leafletMap = options.leafletMap; @@ -161,24 +158,24 @@ export default class ShowDataLayer { const tagsSource = this.allElements?.addOrGetElement(feat) ?? new UIEventSource(feat.properties); let offsettedLine; tagsSource - .map(tags => this._layerToShow.lineRendering[feat.lineRenderingIndex].GenerateLeafletStyle(tags)) + .map(tags => this._layerToShow.lineRendering[feat.lineRenderingIndex].GenerateLeafletStyle(tags)) .withEqualityStabilized((a, b) => { - if(a === b){ + if (a === b) { return true } - if(a === undefined || b === undefined){ + if (a === undefined || b === undefined) { return false } return a.offset === b.offset && a.color === b.color && a.weight === b.weight && a.dashArray === b.dashArray }) .addCallbackAndRunD(lineStyle => { - if (offsettedLine !== undefined) { - self.geoLayer.removeLayer(offsettedLine) - } - offsettedLine = L.polyline(coords, lineStyle); - this.postProcessFeature(feat, offsettedLine) - offsettedLine.addTo(this.geoLayer) - }) + if (offsettedLine !== undefined) { + self.geoLayer.removeLayer(offsettedLine) + } + offsettedLine = L.polyline(coords, lineStyle); + this.postProcessFeature(feat, offsettedLine) + offsettedLine.addTo(this.geoLayer) + }) } else { this.geoLayer.addData(feat); } @@ -192,7 +189,7 @@ export default class ShowDataLayer { const bounds = this.geoLayer.getBounds() mp.fitBounds(bounds, {animate: false}) } catch (e) { - console.debug("Invalid bounds",e) + console.debug("Invalid bounds", e) } } @@ -292,7 +289,7 @@ export default class ShowDataLayer { } }); - + // Add the feature to the index to open the popup when needed this.leafletLayersPerId.set(feature.properties.id + feature.geometry.type, { diff --git a/UI/ShowDataLayer/ShowOverlayLayer.ts b/UI/ShowDataLayer/ShowOverlayLayer.ts index e75d26390..8d9a49784 100644 --- a/UI/ShowDataLayer/ShowOverlayLayer.ts +++ b/UI/ShowDataLayer/ShowOverlayLayer.ts @@ -1,19 +1,18 @@ import TilesourceConfig from "../../Models/ThemeConfig/TilesourceConfig"; import {UIEventSource} from "../../Logic/UIEventSource"; -import * as L from "leaflet"; export default class ShowOverlayLayer { public static implementation: (config: TilesourceConfig, leafletMap: UIEventSource, isShown?: UIEventSource) => void; - + constructor(config: TilesourceConfig, leafletMap: UIEventSource, isShown: UIEventSource = undefined) { - if(ShowOverlayLayer.implementation === undefined){ + if (ShowOverlayLayer.implementation === undefined) { throw "Call ShowOverlayLayerImplemenation.initialize() first before using this" } - ShowOverlayLayer.implementation(config, leafletMap, isShown) + ShowOverlayLayer.implementation(config, leafletMap, isShown) } } \ No newline at end of file diff --git a/UI/ShowDataLayer/ShowOverlayLayerImplementation.ts b/UI/ShowDataLayer/ShowOverlayLayerImplementation.ts index ef92aef4e..d9201fec5 100644 --- a/UI/ShowDataLayer/ShowOverlayLayerImplementation.ts +++ b/UI/ShowDataLayer/ShowOverlayLayerImplementation.ts @@ -4,14 +4,14 @@ import {UIEventSource} from "../../Logic/UIEventSource"; import ShowOverlayLayer from "./ShowOverlayLayer"; export default class ShowOverlayLayerImplementation { - - public static Implement(){ + + public static Implement() { ShowOverlayLayer.implementation = ShowOverlayLayerImplementation.AddToMap } - + public static AddToMap(config: TilesourceConfig, leafletMap: UIEventSource, - isShown: UIEventSource = undefined){ + isShown: UIEventSource = undefined) { leafletMap.map(leaflet => { if (leaflet === undefined) { return; @@ -41,5 +41,5 @@ export default class ShowOverlayLayerImplementation { }) } - + } \ No newline at end of file diff --git a/UI/ShowDataLayer/ShowTileInfo.ts b/UI/ShowDataLayer/ShowTileInfo.ts index 1bb636727..e2ba01adf 100644 --- a/UI/ShowDataLayer/ShowTileInfo.ts +++ b/UI/ShowDataLayer/ShowTileInfo.ts @@ -6,6 +6,7 @@ import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeature import {GeoOperations} from "../../Logic/GeoOperations"; import {Tiles} from "../../Models/TileRange"; import * as clusterstyle from "../../assets/layers/cluster_style/cluster_style.json" + export default class ShowTileInfo { public static readonly styling = new LayerConfig( clusterstyle, "tileinfo", true) diff --git a/UI/ShowDataLayer/TileHierarchyAggregator.ts b/UI/ShowDataLayer/TileHierarchyAggregator.ts index 42878131c..49007a78a 100644 --- a/UI/ShowDataLayer/TileHierarchyAggregator.ts +++ b/UI/ShowDataLayer/TileHierarchyAggregator.ts @@ -10,6 +10,12 @@ import FilteredLayer from "../../Models/FilteredLayer"; * A feature source containing but a single feature, which keeps stats about a tile */ export class TileHierarchyAggregator implements FeatureSource { + private static readonly empty = [] + public totalValue: number = 0 + public showCount: number = 0 + public hiddenCount: number = 0 + public readonly features = new UIEventSource<{ feature: any, freshness: Date }[]>(TileHierarchyAggregator.empty) + public readonly name; private _parent: TileHierarchyAggregator; private _root: TileHierarchyAggregator; private _z: number; @@ -17,21 +23,12 @@ export class TileHierarchyAggregator implements FeatureSource { private _y: number; private _tileIndex: number private _counter: SingleTileCounter - private _subtiles: [TileHierarchyAggregator, TileHierarchyAggregator, TileHierarchyAggregator, TileHierarchyAggregator] = [undefined, undefined, undefined, undefined] - public totalValue: number = 0 - public showCount: number = 0 - public hiddenCount: number = 0 - - private static readonly empty = [] - public readonly features = new UIEventSource<{ feature: any, freshness: Date }[]>(TileHierarchyAggregator.empty) - public readonly name; - private readonly featuresStatic = [] private readonly featureProperties: { count: string, kilocount: string, tileId: string, id: string, showCount: string, totalCount: string }; private readonly _state: { filteredLayers: UIEventSource }; private readonly updateSignal = new UIEventSource(undefined) - + private constructor(parent: TileHierarchyAggregator, state: { filteredLayers: UIEventSource @@ -45,7 +42,7 @@ export class TileHierarchyAggregator implements FeatureSource { this._y = y; this._tileIndex = Tiles.tile_index(z, x, y) this.name = "Count(" + this._tileIndex + ")" - + const totals = { id: "" + this._tileIndex, tileId: "" + this._tileIndex, @@ -87,6 +84,10 @@ export class TileHierarchyAggregator implements FeatureSource { this.featuresStatic.push({feature: box, freshness: now}) } + public static createHierarchy(state: { filteredLayers: UIEventSource }) { + return new TileHierarchyAggregator(undefined, state, 0, 0, 0) + } + public getTile(tileIndex): TileHierarchyAggregator { if (tileIndex === this._tileIndex) { return this; @@ -103,6 +104,61 @@ export class TileHierarchyAggregator implements FeatureSource { return this._subtiles[subtileIndex]?.getTile(tileIndex) } + public addTile(source: FeatureSourceForLayer & Tiled) { + const self = this; + if (source.tileIndex === this._tileIndex) { + if (this._counter === undefined) { + this._counter = new SingleTileCounter(this._tileIndex) + this._counter.countsPerLayer.addCallbackAndRun(_ => self.update()) + } + this._counter.addTileCount(source) + } else { + + // We have to give it to one of the subtiles + let [tileZ, tileX, tileY] = Tiles.tile_from_index(source.tileIndex) + while (tileZ - 1 > this._z) { + tileX = Math.floor(tileX / 2) + tileY = Math.floor(tileY / 2) + tileZ-- + } + const xDiff = tileX - (2 * this._x) + const yDiff = tileY - (2 * this._y) + + const subtileIndex = yDiff * 2 + xDiff; + if (this._subtiles[subtileIndex] === undefined) { + this._subtiles[subtileIndex] = new TileHierarchyAggregator(this, this._state, tileZ, tileX, tileY) + } + this._subtiles[subtileIndex].addTile(source) + } + this.updateSignal.setData(source) + } + + getCountsForZoom(clusteringConfig: { maxZoom: number }, locationControl: UIEventSource<{ zoom: number }>, cutoff: number = 0): FeatureSource { + const self = this + const empty = [] + const features = locationControl.map(loc => loc.zoom).map(targetZoom => { + if (targetZoom - 1 > clusteringConfig.maxZoom) { + return empty + } + + const features = [] + self.visitSubTiles(aggr => { + if (aggr.showCount < cutoff) { + return false + } + if (aggr._z === targetZoom) { + features.push(...aggr.features.data) + return false + } + return aggr._z <= targetZoom; + }) + + return features + }, [this.updateSignal.stabilized(500)]) + + return new StaticFeatureSource(features, true); + } + private update() { const newMap = new Map() let total = 0 @@ -162,71 +218,12 @@ export class TileHierarchyAggregator implements FeatureSource { } } - public addTile(source: FeatureSourceForLayer & Tiled) { - const self = this; - if (source.tileIndex === this._tileIndex) { - if (this._counter === undefined) { - this._counter = new SingleTileCounter(this._tileIndex) - this._counter.countsPerLayer.addCallbackAndRun(_ => self.update()) - } - this._counter.addTileCount(source) - } else { - - // We have to give it to one of the subtiles - let [tileZ, tileX, tileY] = Tiles.tile_from_index(source.tileIndex) - while (tileZ - 1 > this._z) { - tileX = Math.floor(tileX / 2) - tileY = Math.floor(tileY / 2) - tileZ-- - } - const xDiff = tileX - (2 * this._x) - const yDiff = tileY - (2 * this._y) - - const subtileIndex = yDiff * 2 + xDiff; - if (this._subtiles[subtileIndex] === undefined) { - this._subtiles[subtileIndex] = new TileHierarchyAggregator(this, this._state, tileZ, tileX, tileY) - } - this._subtiles[subtileIndex].addTile(source) - } - this.updateSignal.setData(source) - } - - public static createHierarchy(state: { filteredLayers: UIEventSource }) { - return new TileHierarchyAggregator(undefined, state, 0, 0, 0) - } - private visitSubTiles(f: (aggr: TileHierarchyAggregator) => boolean) { const visitFurther = f(this) if (visitFurther) { this._subtiles.forEach(tile => tile?.visitSubTiles(f)) } } - - getCountsForZoom(clusteringConfig: { maxZoom: number }, locationControl: UIEventSource<{ zoom: number }>, cutoff: number = 0): FeatureSource { - const self = this - const empty = [] - const features = locationControl.map(loc => loc.zoom).map(targetZoom => { - if (targetZoom - 1 > clusteringConfig.maxZoom) { - return empty - } - - const features = [] - self.visitSubTiles(aggr => { - if (aggr.showCount < cutoff) { - return false - } - if (aggr._z === targetZoom) { - features.push(...aggr.features.data) - return false - } - return aggr._z <= targetZoom; - }) - - return features - }, [this.updateSignal.stabilized(500)]) - - return new StaticFeatureSource(features, true); - } } /** @@ -236,11 +233,10 @@ class SingleTileCounter implements Tiled { public readonly bbox: BBox; public readonly tileIndex: number; public readonly countsPerLayer: UIEventSource> = new UIEventSource>(new Map()) - private readonly registeredLayers: Map = new Map(); public readonly z: number public readonly x: number public readonly y: number - + private readonly registeredLayers: Map = new Map(); constructor(tileIndex: number) { this.tileIndex = tileIndex diff --git a/UI/SpecialVisualizations.ts b/UI/SpecialVisualizations.ts index 674b44499..7922ef04e 100644 --- a/UI/SpecialVisualizations.ts +++ b/UI/SpecialVisualizations.ts @@ -33,13 +33,10 @@ import AllKnownLayers from "../Customizations/AllKnownLayers"; import ShowDataLayer from "./ShowDataLayer/ShowDataLayer"; import Link from "./Base/Link"; import List from "./Base/List"; -import {OsmConnection} from "../Logic/Osm/OsmConnection"; import {SubtleButton} from "./Base/SubtleButton"; import ChangeTagAction from "../Logic/Osm/Actions/ChangeTagAction"; import {And} from "../Logic/Tags/And"; import Toggle from "./Input/Toggle"; -import Img from "./Base/Img"; -import FilteredLayer from "../Models/FilteredLayer"; import {DefaultGuiState} from "./DefaultGuiState"; export interface SpecialVisualization { @@ -568,22 +565,22 @@ export default class SpecialVisualizations { } const targetIdKey = args[3] const t = Translations.t.general.apply_button - + const tagsExplanation = new VariableUiElement(tagsToApply.map(tagsToApply => { const tagsStr = tagsToApply.map(t => t.asHumanString(false, true)).join("&"); let el: BaseUIElement = new FixedUiElement(tagsStr) - if(targetIdKey !== undefined){ - const targetId = tags.data[targetIdKey] ?? tags.data.id - el = t.appliedOnAnotherObject.Subs({tags: tagsStr , id: targetId }) + if (targetIdKey !== undefined) { + const targetId = tags.data[targetIdKey] ?? tags.data.id + el = t.appliedOnAnotherObject.Subs({tags: tagsStr, id: targetId}) } return el; } )).SetClass("subtle") - + const applied = new UIEventSource(false) const applyButton = new SubtleButton(image, new Combine([msg, tagsExplanation]).SetClass("flex flex-col")) .onClick(() => { - const targetId = tags.data[ targetIdKey] ?? tags.data.id + const targetId = tags.data[targetIdKey] ?? tags.data.id const changeAction = new ChangeTagAction(targetId, new And(tagsToApply.data), tags.data, // We pass in the tags of the selected element, not the tags of the target element! @@ -596,11 +593,11 @@ export default class SpecialVisualizations { applied.setData(true) }) - + return new Toggle( new Toggle( - t.isApplied.SetClass("thanks"), - applyButton, + t.isApplied.SetClass("thanks"), + applyButton, applied ) , undefined, state.osmConnection.isLoggedIn) diff --git a/UI/Wikipedia/WikidataPreviewBox.ts b/UI/Wikipedia/WikidataPreviewBox.ts index 1d7595e6d..525e102b5 100644 --- a/UI/Wikipedia/WikidataPreviewBox.ts +++ b/UI/Wikipedia/WikidataPreviewBox.ts @@ -4,7 +4,6 @@ import Wikidata, {WikidataResponse} from "../../Logic/Web/Wikidata"; import {Translation} from "../i18n/Translation"; import {FixedUiElement} from "../Base/FixedUiElement"; import Loading from "../Base/Loading"; -import {Transform} from "stream"; import Translations from "../i18n/Translations"; import Combine from "../Base/Combine"; import Img from "../Base/Img"; @@ -16,6 +15,43 @@ import {Utils} from "../../Utils"; export default class WikidataPreviewBox extends VariableUiElement { + private static isHuman = [ + {p: 31/*is a*/, q: 5 /* human */}, + ] + // @ts-ignore + private static extraProperties: { + requires?: { p: number, q?: number }[], + property: string, + display: Translation | Map BaseUIElement) /*If translation: Subs({value: * }) */> + }[] = [ + { + requires: WikidataPreviewBox.isHuman, + property: "P21", + display: new Map([ + ['Q6581097', () => Svg.gender_male_ui().SetStyle("width: 1rem; height: auto")], + ['Q6581072', () => Svg.gender_female_ui().SetStyle("width: 1rem; height: auto")], + ['Q1097630', () => Svg.gender_inter_ui().SetStyle("width: 1rem; height: auto")], + ['Q1052281', () => Svg.gender_trans_ui().SetStyle("width: 1rem; height: auto")/*'transwomen'*/], + ['Q2449503', () => Svg.gender_trans_ui().SetStyle("width: 1rem; height: auto")/*'transmen'*/], + ['Q48270', () => Svg.gender_queer_ui().SetStyle("width: 1rem; height: auto")] + ]) + }, + { + property: "P569", + requires: WikidataPreviewBox.isHuman, + display: new Translation({ + "*": "Born: {value}" + }) + }, + { + property: "P570", + requires: WikidataPreviewBox.isHuman, + display: new Translation({ + "*": "Died: {value}" + }) + } + ] + constructor(wikidataId: UIEventSource) { let inited = false; const wikidata = wikidataId @@ -45,6 +81,7 @@ export default class WikidataPreviewBox extends VariableUiElement { })) } + // @ts-ignore public static WikidataResponsePreview(wikidata: WikidataResponse): BaseUIElement { let link = new Link( @@ -57,7 +94,7 @@ export default class WikidataPreviewBox extends VariableUiElement { let info = new Combine([ new Combine( [Translation.fromMap(wikidata.labels)?.SetClass("font-bold"), - link]).SetClass("flex justify-between"), + link]).SetClass("flex justify-between"), Translation.fromMap(wikidata.descriptions), WikidataPreviewBox.QuickFacts(wikidata) ]).SetClass("flex flex-col link-underline") @@ -80,87 +117,49 @@ export default class WikidataPreviewBox extends VariableUiElement { return info } - private static isHuman = [ - {p: 31/*is a*/, q: 5 /* human */}, - ] - // @ts-ignore - // @ts-ignore - private static extraProperties: { - requires?: { p: number, q?: number }[], - property: string, - display: Translation | Map BaseUIElement) /*If translation: Subs({value: * }) */> - }[] = [ - { - requires: WikidataPreviewBox.isHuman, - property: "P21", - display: new Map([ - ['Q6581097', () => Svg.gender_male_ui().SetStyle("width: 1rem; height: auto")], - ['Q6581072', () => Svg.gender_female_ui().SetStyle("width: 1rem; height: auto")], - ['Q1097630',() => Svg.gender_inter_ui().SetStyle("width: 1rem; height: auto")], - ['Q1052281',() => Svg.gender_trans_ui().SetStyle("width: 1rem; height: auto")/*'transwomen'*/], - ['Q2449503',() => Svg.gender_trans_ui().SetStyle("width: 1rem; height: auto")/*'transmen'*/], - ['Q48270',() => Svg.gender_queer_ui().SetStyle("width: 1rem; height: auto")] - ]) - }, - { - property: "P569", - requires: WikidataPreviewBox.isHuman, - display: new Translation({ - "*":"Born: {value}" - }) - }, - { - property: "P570", - requires: WikidataPreviewBox.isHuman, - display: new Translation({ - "*":"Died: {value}" - }) - } - ] - public static QuickFacts(wikidata: WikidataResponse): BaseUIElement { - - const els : BaseUIElement[] = [] + + const els: BaseUIElement[] = [] for (const extraProperty of WikidataPreviewBox.extraProperties) { let hasAllRequirements = true for (const requirement of extraProperty.requires) { - if(!wikidata.claims?.has("P"+requirement.p)){ + if (!wikidata.claims?.has("P" + requirement.p)) { hasAllRequirements = false; break } - if(!wikidata.claims?.get("P"+requirement.p).has("Q"+requirement.q)){ + if (!wikidata.claims?.get("P" + requirement.p).has("Q" + requirement.q)) { hasAllRequirements = false; break } } - if(!hasAllRequirements){ + if (!hasAllRequirements) { continue } - + const key = extraProperty.property const display = extraProperty.display const value: string[] = Array.from(wikidata.claims.get(key)) - if(value === undefined){ + if (value === undefined) { continue } - if(display instanceof Translation){ + if (display instanceof Translation) { els.push(display.Subs({value: value.join(", ")}).SetClass("m-2")) continue } const constructors = Utils.NoNull(value.map(property => display.get(property))) const elems = constructors.map(v => { - if(typeof v === "string"){ + if (typeof v === "string") { return new FixedUiElement(v) - }else{ + } else { return v(); } }) els.push(new Combine(elems).SetClass("flex m-2")) } - if(els.length === 0){ + if (els.length === 0) { return undefined; } - + return new Combine(els).SetClass("flex") } diff --git a/UI/Wikipedia/WikipediaBox.ts b/UI/Wikipedia/WikipediaBox.ts index 28fd62dc7..b1a28fd46 100644 --- a/UI/Wikipedia/WikipediaBox.ts +++ b/UI/Wikipedia/WikipediaBox.ts @@ -88,7 +88,7 @@ export default class WikipediaBox extends Combine { } const wikidata = maybewikidata["success"] - if(wikidata === undefined){ + if (wikidata === undefined) { return "failed" } if (wikidata.wikisites.size === 0) { @@ -118,13 +118,13 @@ export default class WikipediaBox extends Combine { return wp.failed.Clone().SetClass("alert p-4") } if (status[0] == "no page") { - const [_, wd] = <[string, WikidataResponse]> status + const [_, wd] = <[string, WikidataResponse]>status return new Combine([ WikidataPreviewBox.WikidataResponsePreview(wd), wp.noWikipediaPage.Clone().SetClass("subtle")]).SetClass("flex flex-col p-4") } - const [pagetitle, language, wd] = <[string, string, WikidataResponse]> status + const [pagetitle, language, wd] = <[string, string, WikidataResponse]>status return WikipediaBox.createContents(pagetitle, language, wd) }) @@ -134,27 +134,27 @@ export default class WikipediaBox extends Combine { const titleElement = new VariableUiElement(wikiLink.map(state => { if (typeof state !== "string") { const [pagetitle, _] = state - if(pagetitle === "no page"){ - const wd = state[1] - return new Title( Translation.fromMap(wd.labels),3) + if (pagetitle === "no page") { + const wd = state[1] + return new Title(Translation.fromMap(wd.labels), 3) } return new Title(pagetitle, 3) } //return new Title(Translations.t.general.wikipedia.wikipediaboxTitle.Clone(), 2) - return new Title(wikidataId,3) + return new Title(wikidataId, 3) })) const linkElement = new VariableUiElement(wikiLink.map(state => { if (typeof state !== "string") { const [pagetitle, language] = state - if(pagetitle === "no page"){ - const wd = state[1] - return new Link(Svg.pop_out_ui().SetStyle("width: 1.2rem").SetClass("block "), - "https://www.wikidata.org/wiki/"+wd.id + if (pagetitle === "no page") { + const wd = state[1] + return new Link(Svg.pop_out_ui().SetStyle("width: 1.2rem").SetClass("block "), + "https://www.wikidata.org/wiki/" + wd.id , true) } - + const url = `https://${language}.wikipedia.org/wiki/${pagetitle}` return new Link(Svg.pop_out_ui().SetStyle("width: 1.2rem").SetClass("block "), url, true) } @@ -202,7 +202,7 @@ export default class WikipediaBox extends Combine { return new Combine([ quickFacts?.SetClass("border-2 border-grey rounded-lg m-1 mb-0"), new VariableUiElement(contents) - .SetClass("block pl-6 pt-2")]) + .SetClass("block pl-6 pt-2")]) } } \ No newline at end of file diff --git a/UI/i18n/Translation.ts b/UI/i18n/Translation.ts index 87dddde40..60c04ee9e 100644 --- a/UI/i18n/Translation.ts +++ b/UI/i18n/Translation.ts @@ -34,6 +34,38 @@ export class Translation extends BaseUIElement { return this.textFor(Translation.forcedLanguage ?? Locale.language.data) } + static ExtractAllTranslationsFrom(object: any, context = ""): { context: string, tr: Translation }[] { + const allTranslations: { context: string, tr: Translation }[] = [] + for (const key in object) { + const v = object[key] + if (v === undefined || v === null) { + continue + } + if (v instanceof Translation) { + allTranslations.push({context: context + "." + key, tr: v}) + continue + } + if (typeof v === "object") { + allTranslations.push(...Translation.ExtractAllTranslationsFrom(v, context + "." + key)) + + } + } + return allTranslations + } + + static fromMap(transl: Map) { + const translations = {} + let hasTranslation = false; + transl?.forEach((value, key) => { + translations[key] = value + hasTranslation = true + }) + if (!hasTranslation) { + return undefined + } + return new Translation(translations); + } + public textFor(language: string): string { if (this.translations["*"]) { return this.translations["*"]; @@ -195,36 +227,4 @@ export class Translation extends BaseUIElement { } return allIcons.filter(icon => icon != undefined) } - - static ExtractAllTranslationsFrom(object: any, context = ""): { context: string, tr: Translation }[] { - const allTranslations: { context: string, tr: Translation }[] = [] - for (const key in object) { - const v = object[key] - if (v === undefined || v === null) { - continue - } - if (v instanceof Translation) { - allTranslations.push({context: context +"." + key, tr: v}) - continue - } - if (typeof v === "object") { - allTranslations.push(...Translation.ExtractAllTranslationsFrom(v, context + "." + key)) - continue - } - } - return allTranslations - } - - static fromMap(transl: Map) { - const translations = {} - let hasTranslation = false; - transl?.forEach((value, key) => { - translations[key] = value - hasTranslation = true - }) - if(!hasTranslation){ - return undefined - } - return new Translation(translations); - } } \ No newline at end of file diff --git a/UI/i18n/Translations.ts b/UI/i18n/Translations.ts index fa5c0da7b..62a99f216 100644 --- a/UI/i18n/Translations.ts +++ b/UI/i18n/Translations.ts @@ -25,8 +25,8 @@ export default class Translations { if (t === undefined || t === null) { return undefined; } - if(typeof t === "number"){ - t = ""+t + if (typeof t === "number") { + t = "" + t } if (typeof t === "string") { return new Translation({"*": t}, context); diff --git a/Utils.ts b/Utils.ts index e0dbf2641..2fd29533a 100644 --- a/Utils.ts +++ b/Utils.ts @@ -10,12 +10,7 @@ export class Utils { public static runningFromConsole = typeof window === "undefined"; public static readonly assets_path = "./assets/svg/"; public static externalDownloadFunction: (url: string, headers?: any) => Promise; - private static knownKeys = ["addExtraTags", "and", "calculatedTags", "changesetmessage", "clustering", "color", "condition", "customCss", "dashArray", "defaultBackgroundId", "description", "descriptionTail", "doNotDownload", "enableAddNewPoints", "enableBackgroundLayerSelection", "enableGeolocation", "enableLayers", "enableMoreQuests", "enableSearch", "enableShareScreen", "enableUserBadge", "freeform", "hideFromOverview", "hideInAnswer", "icon", "iconOverlays", "iconSize", "id", "if", "ifnot", "isShown", "key", "language", "layers", "lockLocation", "maintainer", "mappings", "maxzoom", "maxZoom", "minNeededElements", "minzoom", "multiAnswer", "name", "or", "osmTags", "passAllFeatures", "presets", "question", "render", "roaming", "roamingRenderings", "rotation", "shortDescription", "socialImage", "source", "startLat", "startLon", "startZoom", "tagRenderings", "tags", "then", "title", "titleIcons", "type", "version", "wayHandling", "widenFactor", "width"] - private static extraKeys = ["nl", "en", "fr", "de", "pt", "es", "name", "phone", "email", "amenity", "leisure", "highway", "building", "yes", "no", "true", "false"] - private static injectedDownloads = {} - private static _download_cache = new Map, timestamp: number }>() - - public static Special_visualizations_tagsToApplyHelpText = `These can either be a tag to add, such as \`amenity=fast_food\` or can use a substitution, e.g. \`addr:housenumber=$number\`. + public static Special_visualizations_tagsToApplyHelpText = `These can either be a tag to add, such as \`amenity=fast_food\` or can use a substitution, e.g. \`addr:housenumber=$number\`. This new point will then have the tags \`amenity=fast_food\` and \`addr:housenumber\` with the value that was saved in \`number\` in the original feature. If a value to substitute is undefined, empty string will be used instead. @@ -26,7 +21,11 @@ Remark that the syntax is slightly different then expected; it uses '$' to note Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) ` - + private static knownKeys = ["addExtraTags", "and", "calculatedTags", "changesetmessage", "clustering", "color", "condition", "customCss", "dashArray", "defaultBackgroundId", "description", "descriptionTail", "doNotDownload", "enableAddNewPoints", "enableBackgroundLayerSelection", "enableGeolocation", "enableLayers", "enableMoreQuests", "enableSearch", "enableShareScreen", "enableUserBadge", "freeform", "hideFromOverview", "hideInAnswer", "icon", "iconOverlays", "iconSize", "id", "if", "ifnot", "isShown", "key", "language", "layers", "lockLocation", "maintainer", "mappings", "maxzoom", "maxZoom", "minNeededElements", "minzoom", "multiAnswer", "name", "or", "osmTags", "passAllFeatures", "presets", "question", "render", "roaming", "roamingRenderings", "rotation", "shortDescription", "socialImage", "source", "startLat", "startLon", "startZoom", "tagRenderings", "tags", "then", "title", "titleIcons", "type", "version", "wayHandling", "widenFactor", "width"] + private static extraKeys = ["nl", "en", "fr", "de", "pt", "es", "name", "phone", "email", "amenity", "leisure", "highway", "building", "yes", "no", "true", "false"] + private static injectedDownloads = {} + private static _download_cache = new Map, timestamp: number }>() + static EncodeXmlValue(str) { if (typeof str !== "string") { str = "" + str @@ -473,7 +472,7 @@ Note that these values can be prepare with javascript in the theme by using a [c if (theme !== undefined) { osmcha_link = osmcha_link + "," + `"comment":[{"label":"#${theme}","value":"#${theme}"}]` } - return "https://osmcha.org/?filters=" + encodeURIComponent("{"+osmcha_link+"}") + return "https://osmcha.org/?filters=" + encodeURIComponent("{" + osmcha_link + "}") } private static colorDiff(c0: { r: number, g: number, b: number }, c1: { r: number, g: number, b: number }) { diff --git a/assets/layers/binocular/telescope.svg b/assets/layers/binocular/telescope.svg index 2fea44f0e..b33456606 100644 --- a/assets/layers/binocular/telescope.svg +++ b/assets/layers/binocular/telescope.svg @@ -1,8 +1,8 @@ - + - - diff --git a/assets/layers/charging_station/README.md b/assets/layers/charging_station/README.md index bc88af2d7..4c57a9c15 100644 --- a/assets/layers/charging_station/README.md +++ b/assets/layers/charging_station/README.md @@ -9,12 +9,15 @@ If you want to add a missing socket type, then: - Add all the properties in 'types.csv' - Add an icon. (Note: icons are way better as pictures as they are perceived more abstractly) -- Update license_info.json with the copyright info of the new icon. Note that we strive to have Creative-commons icons only (though there are exceptions) +- Update license_info.json with the copyright info of the new icon. Note that we strive to have Creative-commons icons + only (though there are exceptions) -AT this point, most of the work should be done; feel free to send a PR. If you would like to test it locally first (which is recommended) and have a working dev environment, then run: +AT this point, most of the work should be done; feel free to send a PR. If you would like to test it locally first ( +which is recommended) and have a working dev environment, then run: - Run 'ts-node csvToJson.ts' which will generate a new charging_station.json based on the protojson -- Run`npm run query:licenses` to get an interactive program to add the license of your artwork, followed by `npm run generate:licenses` +- Run`npm run query:licenses` to get an interactive program to add the license of your artwork, followed + by `npm run generate:licenses` - Run `npm run generate:layeroverview` to generate the layer files - Run `npm run start` to run the instance @@ -30,6 +33,6 @@ The columns in the CSV file are: - countryWhiteList: Only show this plug type in these countries - countryBlackList: Don't show this plug type in these countries. NOt compatibel with the whiteList - commonVoltages, commonCurrents, commonOutputs: common values for these tags -- associatedVehicleTypes and neverAssociatedWith: these work in tandem to hide options. - If every associated vehicle type is `no`, then the option is hidden - If at least one `neverAssociatedVehicleType` is `yes` and none of the associated types is yes, then the option is hidden too +- associatedVehicleTypes and neverAssociatedWith: these work in tandem to hide options. If every associated vehicle type + is `no`, then the option is hidden If at least one `neverAssociatedVehicleType` is `yes` and none of the associated + types is yes, then the option is hidden too diff --git a/assets/layers/charging_station/bosch-3pin.svg b/assets/layers/charging_station/bosch-3pin.svg index 266bc34f4..515136803 100644 --- a/assets/layers/charging_station/bosch-3pin.svg +++ b/assets/layers/charging_station/bosch-3pin.svg @@ -2,111 +2,110 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="46.74284mm" + height="36.190933mm" + viewBox="0 0 46.74284 36.190933" + version="1.1" + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="bosch-3pin.svg"> + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/assets/layers/charging_station/bosch-5pin.svg b/assets/layers/charging_station/bosch-5pin.svg index aa8168629..1a2962422 100644 --- a/assets/layers/charging_station/bosch-5pin.svg +++ b/assets/layers/charging_station/bosch-5pin.svg @@ -2,127 +2,126 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="46.74284mm" + height="36.190933mm" + viewBox="0 0 46.74284 36.190933" + version="1.1" + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="bosch-5pin.svg"> + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson index 3d0465068..93522bb06 100644 --- a/assets/layers/charging_station/charging_station.protojson +++ b/assets/layers/charging_station/charging_station.protojson @@ -413,7 +413,12 @@ } ], "condition": { - "or": ["maxstay~*","motorcar=yes","hgv=yes","bus=yes"] + "or": [ + "maxstay~*", + "motorcar=yes", + "hgv=yes", + "bus=yes" + ] } }, { @@ -497,7 +502,8 @@ "nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?" }, "render": { - "en": "In case of problems, call {phone}", "nl": "Bij problemen, bel naar {phone}" + "en": "In case of problems, call {phone}", + "nl": "Bij problemen, bel naar {phone}" }, "freeform": { "key": "phone", @@ -548,8 +554,8 @@ "freeform": { "key": "ref" }, - "#": "Only asked if part of a bigger network. Small operators typically don't have a reference number", - "condition":"network!=" + "#": "Only asked if part of a bigger network. Small operators typically don't have a reference number", + "condition": "network!=" }, { "id": "Operational status", @@ -589,7 +595,7 @@ } }, { - "if":{ + "if": { "and": [ "planned:amenity=", "construction:amenity=charging_station", diff --git a/assets/layers/charging_station/csvToJson.ts b/assets/layers/charging_station/csvToJson.ts index 4b2490b90..f5c1aaa9d 100644 --- a/assets/layers/charging_station/csvToJson.ts +++ b/assets/layers/charging_station/csvToJson.ts @@ -115,7 +115,6 @@ function run(file, protojson) { } - overview_question_answers.push(json) // We add a second time for any amount to trigger a visualisation; but this is not an answer option diff --git a/assets/layers/charging_station/usb_port.svg b/assets/layers/charging_station/usb_port.svg index f813f20f0..f48417a79 100644 --- a/assets/layers/charging_station/usb_port.svg +++ b/assets/layers/charging_station/usb_port.svg @@ -1,74 +1,82 @@ image/svg+xml + + + + + + + + \ No newline at end of file + inkscape:connector-curvature="0" /> + \ No newline at end of file diff --git a/assets/layers/etymology/logo.svg b/assets/layers/etymology/logo.svg index 6d6c9a0f6..bb88d3040 100644 --- a/assets/layers/etymology/logo.svg +++ b/assets/layers/etymology/logo.svg @@ -2,106 +2,105 @@ - - - - - - image/svg+xml - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="31.41128mm" + height="21.6535mm" + viewBox="0 0 31.41128 21.6535" + version="1.1" + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="logo.svg"> + + + + + + image/svg+xml + + + + + + - - - - - - - - - - + transform="matrix(0.21233122,0,0,0.21233122,6.7520733,38.096318)" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + id="flowRoot10"> + + + + + + + + + + + + - - diff --git a/assets/layers/observation_tower/Tower_observation.svg b/assets/layers/observation_tower/Tower_observation.svg index 2dd693970..cda4271f8 100644 --- a/assets/layers/observation_tower/Tower_observation.svg +++ b/assets/layers/observation_tower/Tower_observation.svg @@ -1,38 +1,37 @@ - - - - image/svgxml - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + width="14" + height="14" + viewBox="0 0 14 14" + id="svg2"> + + + + image/svgxml + + + + + + + + \ No newline at end of file diff --git a/assets/layers/street_lamps/bent_pole_1.svg b/assets/layers/street_lamps/bent_pole_1.svg index ed33e232b..c702d8b44 100644 --- a/assets/layers/street_lamps/bent_pole_1.svg +++ b/assets/layers/street_lamps/bent_pole_1.svg @@ -1,100 +1,99 @@ - - - - - - - - image/svg+xml - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="400" + height="400" + viewBox="0 0 105.83333 105.83334" + version="1.1" + id="svg8" + sodipodi:docname="bent-pole-1.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> + + + + + + + + image/svg+xml + + + + + - + inkscape:label="Laag 1" + inkscape:groupmode="layer" + id="layer1"> - - - - - + id="g864" + transform="translate(-9.1324516,-2.7737965)"> + + + + + + + + + - - diff --git a/assets/layers/street_lamps/bent_pole_2.svg b/assets/layers/street_lamps/bent_pole_2.svg index f41cdeaf9..f015028aa 100644 --- a/assets/layers/street_lamps/bent_pole_2.svg +++ b/assets/layers/street_lamps/bent_pole_2.svg @@ -1,138 +1,137 @@ - - - - - - - - image/svg+xml - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="400" + height="400" + viewBox="0 0 105.83333 105.83334" + version="1.1" + id="svg8" + sodipodi:docname="bent-pole-2.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> + + + + + + + + image/svg+xml + + + + + - + inkscape:label="Laag 1" + inkscape:groupmode="layer" + id="layer1"> - + id="g864" + transform="translate(-9.1324516,-2.7737965)"> - - - - - - - - + id="g969" + transform="translate(11.842268)"> - - + id="g1568" + transform="matrix(1.75,0,0,1.75,-37.655138,-41.767847)"> + + + + + + + + + + + + + + + + + - - - - diff --git a/assets/layers/street_lamps/straight_pole.svg b/assets/layers/street_lamps/straight_pole.svg index c59f755d6..38c030041 100644 --- a/assets/layers/street_lamps/straight_pole.svg +++ b/assets/layers/street_lamps/straight_pole.svg @@ -1,160 +1,159 @@ - - - - - - - - image/svg+xml - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="100mm" + height="100mm" + viewBox="0 0 99.999987 99.999992" + version="1.1" + id="svg8" + sodipodi:docname="straight_pole.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> + + + + + + + + image/svg+xml + + + + + - + inkscape:label="Laag 1" + inkscape:groupmode="layer" + id="layer1"> - + id="g864" + transform="translate(-9.1324516,-2.7737965)"> - + id="g869"> - - + id="g1550" + transform="matrix(1.75,0,0,1.75,-46.536839,-41.767847)"> + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - diff --git a/assets/layers/street_lamps/street_lamp.svg b/assets/layers/street_lamps/street_lamp.svg index 72602af3d..2942456b4 100644 --- a/assets/layers/street_lamps/street_lamp.svg +++ b/assets/layers/street_lamps/street_lamp.svg @@ -1,4 +1,6 @@ - - + + diff --git a/assets/layers/toilet/wheelchair.svg b/assets/layers/toilet/wheelchair.svg index d113492ad..2c191b190 100644 --- a/assets/layers/toilet/wheelchair.svg +++ b/assets/layers/toilet/wheelchair.svg @@ -2,54 +2,53 @@ image/svg+xml + rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + id="defs9"/> + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="999" + id="namedview7" + showgrid="false" + inkscape:zoom="0.8559553" + inkscape:cx="-16.568588" + inkscape:cy="292.29436" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="layer2"/> \ No newline at end of file + inkscape:connector-curvature="0" + style="clip-rule:evenodd;fill:#000000;fill-rule:evenodd;stroke-width:0.66635805" + d="m 310.84431,395.24795 c -20.28873,40.10642 -62.75413,66.52908 -108.0502,66.52908 -66.52908,0 -120.790412,-54.26133 -120.790412,-120.79041 0,-46.71209 28.310452,-90.1207 70.555212,-109.36341 l 2.73376,35.67521 c -24.98647,15.74498 -40.3895,44.15435 -40.3895,73.93288 0,48.26215 39.36263,87.62413 87.62413,87.62413 44.15407,0 81.80523,-33.88535 86.93958,-77.35545 z" + id="path4"/> \ No newline at end of file diff --git a/assets/svg/blocked.svg b/assets/svg/blocked.svg index 36ac431e6..b55236407 100644 --- a/assets/svg/blocked.svg +++ b/assets/svg/blocked.svg @@ -2,828 +2,827 @@ - - - - - - image/svg+xml - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="86.927155mm" + height="94.009796mm" + viewBox="0 0 86.927157 94.009797" + version="1.1" + id="svg8" + sodipodi:docname="blocked.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + + + + + + image/svg+xml + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-116.61719,-98.361256)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/assets/svg/close.svg b/assets/svg/close.svg index ded2ef0e4..9ccf69a14 100644 --- a/assets/svg/close.svg +++ b/assets/svg/close.svg @@ -2,80 +2,79 @@ - - - - - - - - - image/svg+xml - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="100" + height="100" + viewBox="0 0 26.458333 26.458334" + version="1.1" + id="svg8" + sodipodi:docname="close.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets/svg/delete_not_allowed.svg b/assets/svg/delete_not_allowed.svg index 6f1b3a486..e6e9d9322 100644 --- a/assets/svg/delete_not_allowed.svg +++ b/assets/svg/delete_not_allowed.svg @@ -1,86 +1,85 @@ - - - - image/svg+xml - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + viewBox="0 -256 2801.2319 2801.2319" + id="svg3741" + version="1.1" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="2801.2319" + height="2801.2319" + sodipodi:docname="delete_not_allowed.svg"> + + + + image/svg+xml + + + + + + + cx="1405.9852" + cy="1149.9852" + id="circle4-3" + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:28.47442627;stroke-opacity:1" + r="1395.2467"/> - - + id="g881" + transform="matrix(1.255247,0,0,1.255247,149.11911,-316.26492)"> + + + + + + - diff --git a/assets/svg/gender_bi.svg b/assets/svg/gender_bi.svg index 9ae9cf5c1..033f83fad 100644 --- a/assets/svg/gender_bi.svg +++ b/assets/svg/gender_bi.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/gender_female.svg b/assets/svg/gender_female.svg index 6af923135..57b9e57b7 100644 --- a/assets/svg/gender_female.svg +++ b/assets/svg/gender_female.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/gender_inter.svg b/assets/svg/gender_inter.svg index 95f3932de..00be6806e 100644 --- a/assets/svg/gender_inter.svg +++ b/assets/svg/gender_inter.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/gender_male.svg b/assets/svg/gender_male.svg index b70e6e50a..ff408991d 100644 --- a/assets/svg/gender_male.svg +++ b/assets/svg/gender_male.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/gender_queer.svg b/assets/svg/gender_queer.svg index c8bcf16b7..7073042e4 100644 --- a/assets/svg/gender_queer.svg +++ b/assets/svg/gender_queer.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/gender_trans.svg b/assets/svg/gender_trans.svg index d39540182..6d6d3d4f9 100644 --- a/assets/svg/gender_trans.svg +++ b/assets/svg/gender_trans.svg @@ -1,10 +1,14 @@ - + Created with Fabric.js 1.7.22 - + - - - + + + \ No newline at end of file diff --git a/assets/svg/hand.svg b/assets/svg/hand.svg index bbef4187a..9e2c50c2c 100644 --- a/assets/svg/hand.svg +++ b/assets/svg/hand.svg @@ -1,30 +1,29 @@ - - - - image/svg+xml - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://www.w3.org/2000/svg" + id="svg6" + height="39.557907" + width="28.561806" + version="1.1"> + + + + image/svg+xml + + + + + + + diff --git a/assets/svg/josm_logo.svg b/assets/svg/josm_logo.svg index 671e70fae..0922d7679 100644 --- a/assets/svg/josm_logo.svg +++ b/assets/svg/josm_logo.svg @@ -1,5 +1,6 @@ - JOSM Logotype 2019 diff --git a/assets/svg/liberapay.svg b/assets/svg/liberapay.svg index 23a0df206..0374269c9 100644 --- a/assets/svg/liberapay.svg +++ b/assets/svg/liberapay.svg @@ -1 +1,10 @@ - + + + + + + + + + diff --git a/assets/svg/loading.svg b/assets/svg/loading.svg index 27dc3ac6c..d06aa4471 100644 --- a/assets/svg/loading.svg +++ b/assets/svg/loading.svg @@ -1,78 +1,78 @@ - - - - image/svg+xml - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 24.022156 24.021992" + version="1.1" + id="svg9" + sodipodi:docname="loading.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="24.022156" + height="24.021992"> + + + + image/svg+xml + + + + + + + + + + + diff --git a/assets/svg/move-arrows.svg b/assets/svg/move-arrows.svg index d7a8333f4..d31f779ce 100644 --- a/assets/svg/move-arrows.svg +++ b/assets/svg/move-arrows.svg @@ -2,114 +2,113 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="150.52238" + height="150" + viewBox="0 0 39.825713 39.687501" + version="1.1" + id="svg8" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="move-arrows.svg"> + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/assets/svg/move.svg b/assets/svg/move.svg index 806cb7d63..097261675 100644 --- a/assets/svg/move.svg +++ b/assets/svg/move.svg @@ -1,7 +1,7 @@ - - move - - + + move + + diff --git a/assets/svg/move_confirm.svg b/assets/svg/move_confirm.svg index 5aa8ac888..f38038b63 100644 --- a/assets/svg/move_confirm.svg +++ b/assets/svg/move_confirm.svg @@ -1,281 +1,280 @@ - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - move - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="20" + height="20" + viewBox="0 0 20 20" + version="1.1" + id="svg6" + sodipodi:docname="move_confirm.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + move + - + d="M19 10l-4-3v2h-4V5h2l-3-4-3 4h2v4H5V7l-4 3 4 3v-2h4v4H7l3 4 3-4h-2v-4h4v2l4-3z" + id="path4"/> + + + + diff --git a/assets/svg/move_not_allowed.svg b/assets/svg/move_not_allowed.svg index 1abd15a03..ace1ddd2a 100644 --- a/assets/svg/move_not_allowed.svg +++ b/assets/svg/move_not_allowed.svg @@ -1,285 +1,284 @@ - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - move - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="20" + height="20" + viewBox="0 0 20 20" + version="1.1" + id="svg6" + sodipodi:docname="move_not_allowed.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + move + - - + d="M19 10l-4-3v2h-4V5h2l-3-4-3 4h2v4H5V7l-4 3 4 3v-2h4v4H7l3 4 3-4h-2v-4h4v2l4-3z" + id="path4"/> + + + + + diff --git a/assets/svg/osm-logo.svg b/assets/svg/osm-logo.svg index 982a4fb32..246a82440 100644 --- a/assets/svg/osm-logo.svg +++ b/assets/svg/osm-logo.svg @@ -2,7 +2,8 @@ - - - - image/svg+xml - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + width="97.287025" + height="97.287033" + viewBox="0 0 97.287025 97.287033" + version="1.1" + id="svg132" + style="fill:none" + sodipodi:docname="plus.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + + + + image/svg+xml + + + + + + + + diff --git a/assets/svg/relocation.svg b/assets/svg/relocation.svg index c9caaffcb..44ca579a1 100644 --- a/assets/svg/relocation.svg +++ b/assets/svg/relocation.svg @@ -1,61 +1,64 @@ image/svg+xml + rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + + - \ No newline at end of file + d="M 15.968433,9.4957631 14.991526,8.5195302 V 6.1271188 c 0,-0.3705509 -0.303177,-0.6737288 -0.673729,-0.6737288 h -0.673728 c -0.370553,0 -0.67373,0.3031779 -0.67373,0.6737288 v 0.372572 L 11.622881,5.1535806 C 11.438954,4.9797587 11.270522,4.7796611 10.949152,4.7796611 c -0.321369,0 -0.489801,0.2000976 -0.67373,0.3739195 L 5.9298726,9.4957631 c -0.2102033,0.21896 -0.3705508,0.378636 -0.3705508,0.6737279 0,0.379309 0.2910508,0.673729 0.6737289,0.673729 h 0.6737287 v 4.042372 c 0,0.370553 0.303178,0.67373 0.6737289,0.67373 h 2.0211871 v -3.368645 c 0,-0.37055 0.303178,-0.673727 0.6737266,-0.673727 h 1.347459 c 0.37055,0 0.673728,0.303177 0.673728,0.673727 v 3.368645 h 2.021188 c 0.370552,0 0.673729,-0.303177 0.673729,-0.67373 V 10.84322 h 0.673729 c 0.382678,0 0.673729,-0.29442 0.673729,-0.673729 0,-0.2950919 -0.160347,-0.4547679 -0.370551,-0.6737279 z" + id="path2" + inkscape:connector-curvature="0" + style="stroke-width:0.67372882"/> + + + \ No newline at end of file diff --git a/assets/svg/scissors.svg b/assets/svg/scissors.svg index 7c8df5cd0..584b51240 100644 --- a/assets/svg/scissors.svg +++ b/assets/svg/scissors.svg @@ -1 +1,6 @@ - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/assets/svg/teardrop.svg b/assets/svg/teardrop.svg index 1cc113c57..87cc9fc39 100644 --- a/assets/svg/teardrop.svg +++ b/assets/svg/teardrop.svg @@ -2,103 +2,102 @@ - - - - image/svg+xml - - - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + id="svg2816" + version="1.1" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="94" + height="128" + sodipodi:docname="teardrop.svg"> + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/assets/svg/teardrop_with_hole_green.svg b/assets/svg/teardrop_with_hole_green.svg index cc32242cd..88d908a60 100644 --- a/assets/svg/teardrop_with_hole_green.svg +++ b/assets/svg/teardrop_with_hole_green.svg @@ -2,129 +2,128 @@ - - - - image/svg+xml - - - - - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + id="svg2816" + version="1.1" + inkscape:version="0.91 r13725" + width="94" + height="128" + sodipodi:docname="Map_pin_icon_green.svg"> + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/assets/themes/grb_import/README.md b/assets/themes/grb_import/README.md index 2ed7bfbbf..8481ce379 100644 --- a/assets/themes/grb_import/README.md +++ b/assets/themes/grb_import/README.md @@ -1,4 +1,4 @@ - GRB Import helper +GRB Import helper =================== diff --git a/assets/themes/hailhydrant/logo.svg b/assets/themes/hailhydrant/logo.svg index 359f5df65..0c153b65f 100644 --- a/assets/themes/hailhydrant/logo.svg +++ b/assets/themes/hailhydrant/logo.svg @@ -1,6 +1,7 @@ - diff --git a/assets/themes/postboxes/post_office.svg b/assets/themes/postboxes/post_office.svg index ebdd76b49..fbf0b1943 100644 --- a/assets/themes/postboxes/post_office.svg +++ b/assets/themes/postboxes/post_office.svg @@ -1 +1,28 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/themes/postboxes/postbox.svg b/assets/themes/postboxes/postbox.svg index 05e6d95d4..aaa8d5103 100644 --- a/assets/themes/postboxes/postbox.svg +++ b/assets/themes/postboxes/postbox.svg @@ -1,7 +1,7 @@ - + - + - - - - - - - + + + - - - - - - - - + - - - + + + diff --git a/assets/themes/uk_addresses/housenumber_add.svg b/assets/themes/uk_addresses/housenumber_add.svg index e156438b1..526c2378c 100644 --- a/assets/themes/uk_addresses/housenumber_add.svg +++ b/assets/themes/uk_addresses/housenumber_add.svg @@ -1,289 +1,288 @@ - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + viewBox="0 0 94.602035 93.872619" + id="svg12" + sodipodi:docname="housenumber_add.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="94.602036" + height="93.87262"> + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + style="fill:none" + id="g912" + transform="matrix(0.45212065,0,0,0.45212065,50.29421,49.55511)"> + + + + - diff --git a/assets/themes/uk_addresses/housenumber_ok.svg b/assets/themes/uk_addresses/housenumber_ok.svg index bf5f1b9db..b3f9447d4 100644 --- a/assets/themes/uk_addresses/housenumber_ok.svg +++ b/assets/themes/uk_addresses/housenumber_ok.svg @@ -1,75 +1,74 @@ - - - - image/svg+xml - - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + viewBox="0 0 87.992996 87.883003" + id="svg12" + sodipodi:docname="housenumber_ok.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="87.992996" + height="87.883003"> + + + + image/svg+xml + + + + + + + + d="m 14.044,0 h 59.905 c 7.7801,0 14.044,6.2634 14.044,14.044 v 59.795 c 0,7.7801 -6.2634,14.044 -14.044,14.044 H 14.044 C 6.2639,87.883 0,81.6196 0,73.839 V 14.044 C 0,6.2639 6.2634,0 14.044,0 Z" + style="fill:#495aad;paint-order:normal" + id="path6" + inkscape:connector-curvature="0"/> - + d="m 8.747,22.773 v 42.233 c 7.0389,0 14.078,7.0389 14.078,14.078 h 42.233 c 0,-7.0389 7.0389,-14.078 14.078,-14.078 V 22.773 c -7.0389,0 -14.078,-7.0389 -14.078,-14.078 H 22.825 c 0,7.0389 -7.0389,14.078 -14.078,14.078 z" + id="path8" + inkscape:connector-curvature="0" + style="fill:none;stroke:#ffffff;stroke-width:5.01520014"/> + + + + diff --git a/assets/themes/uk_addresses/housenumber_text.svg b/assets/themes/uk_addresses/housenumber_text.svg index 56d57373e..4becd5d9b 100644 --- a/assets/themes/uk_addresses/housenumber_text.svg +++ b/assets/themes/uk_addresses/housenumber_text.svg @@ -1,72 +1,73 @@ - - - - image/svg+xml - - - - - - - - - + + + + image/svg+xml + + + + + + + + + OK + y="47.845253" /> + OK + diff --git a/assets/themes/uk_addresses/housenumber_unknown.svg b/assets/themes/uk_addresses/housenumber_unknown.svg index 0c6c0e5c4..1d39b086b 100644 --- a/assets/themes/uk_addresses/housenumber_unknown.svg +++ b/assets/themes/uk_addresses/housenumber_unknown.svg @@ -1,70 +1,69 @@ - - - - image/svg+xml - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + viewBox="0 0 87.992996 87.883003" + id="svg12" + sodipodi:docname="housenumber.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="87.992996" + height="87.883003"> + + + + image/svg+xml + + + + + + - + d="m 14.044,0 h 59.905 c 7.7801,0 14.044,6.2634 14.044,14.044 v 59.795 c 0,7.7801 -6.2634,14.044 -14.044,14.044 H 14.044 C 6.2639,87.883 0,81.6196 0,73.839 V 14.044 C 0,6.2639 6.2634,0 14.044,0 Z" + style="fill:#495aad;paint-order:normal" + id="path6" + inkscape:connector-curvature="0"/> + + + + diff --git a/assets/themes/uk_addresses/housenumber_unknown_small.svg b/assets/themes/uk_addresses/housenumber_unknown_small.svg index f02f8e643..ef3a91c53 100644 --- a/assets/themes/uk_addresses/housenumber_unknown_small.svg +++ b/assets/themes/uk_addresses/housenumber_unknown_small.svg @@ -1,65 +1,64 @@ - - - - image/svg+xml - - - - - - - - - + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + viewBox="0 0 87.992996 87.883003" + id="svg12" + sodipodi:docname="housenumber_unknown_small.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + width="87.992996" + height="87.883003"> + + + + image/svg+xml + + + + + + + + + diff --git a/assets/themes/uk_addresses/islington_small_piece.geojson b/assets/themes/uk_addresses/islington_small_piece.geojson index ced6a1fb1..b6c9c14b3 100644 --- a/assets/themes/uk_addresses/islington_small_piece.geojson +++ b/assets/themes/uk_addresses/islington_small_piece.geojson @@ -1,2163 +1,2162 @@ - { - "type": "FeatureCollection", - "generator": "JOSM", - "features": [ - { - "type": "Feature", - "properties": { - "inspireid": "44760782", - "uprn_count": "19" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08528530407, - 51.52103754846 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760166", - "uprn_count": "18" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08518862375, - 51.52302887251 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53875715", - "uprn_count": "176" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08768220681, - 51.52027207654 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "48199892", - "uprn_count": "32" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09051161088, - 51.52328524465 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760298", - "uprn_count": "21" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08519096645, - 51.52229137569 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760648", - "uprn_count": "43" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09039984580, - 51.52168966695 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760158", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08979845152, - 51.52470373164 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760268", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08584518403, - 51.52362781792 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760606", - "uprn_count": "34" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08574285775, - 51.52447487890 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760147", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08478417875, - 51.52230226544 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760181", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08597751642, - 51.52262480980 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "59756691", - "uprn_count": "68" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09000674703, - 51.52412334790 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53839893", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08632490840, - 51.51956380364 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760254", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08445931332, - 51.52362994921 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760985", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08550522898, - 51.52481338112 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53517508", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08531729267, - 51.52055437518 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760172", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08621709906, - 51.52245066605 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53815743", - "uprn_count": "28" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08609559738, - 51.52000280555 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760229", - "uprn_count": "2" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08466859613, - 51.52247735237 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "52054693", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08869160634, - 51.52496110557 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760329", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08610136910, - 51.52318693588 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760753", - "uprn_count": "9" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08538513949, - 51.52424009690 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760164", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09008514341, - 51.52505292621 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760216", - "uprn_count": "190" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08700282926, - 51.52503663329 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760279", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08530920735, - 51.52549852437 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613792", - "uprn_count": "72" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08833908631, - 51.52631952661 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760639", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08580868931, - 51.52429800891 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760153", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08456440427, - 51.52329504288 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760200", - "uprn_count": "95" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08770188351, - 51.52407460026 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "47582675", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08892578863, - 51.52706921088 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760263", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08583263531, - 51.52548367268 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613655", - "uprn_count": "18" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08843733386, - 51.52669877413 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760564", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09046694451, - 51.52125764642 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760143", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08576039998, - 51.52479998964 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "57943078", - "uprn_count": "80" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08990077541, - 51.52590434415 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760178", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08479378350, - 51.52288142387 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760247", - "uprn_count": "16" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08570423028, - 51.52383831047 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "60347715", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08913137569, - 51.52638282816 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760169", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08741982002, - 51.52232472527 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53876178", - "uprn_count": "14" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08848929384, - 51.51968662476 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "58831132", - "uprn_count": "120" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08811742827, - 51.52524678003 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760702", - "uprn_count": "17" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08626679662, - 51.52229285532 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "56996893", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08961930563, - 51.52736429296 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760161", - "uprn_count": "30" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08903973308, - 51.52443351442 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "57212602", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09025128250, - 51.52349660479 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760214", - "uprn_count": "30" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08491766007, - 51.52195690215 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760274", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08710416098, - 51.52394294309 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613782", - "uprn_count": "11" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08630939921, - 51.52567781493 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760635", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08591747289, - 51.52406421610 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760150", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08736624492, - 51.52184217908 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760190", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08950436522, - 51.52301269883 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53842347", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08629952517, - 51.51902467199 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760261", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08870422830, - 51.52481415717 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613643", - "uprn_count": "108" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08522752552, - 51.52590169102 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760506", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08680870061, - 51.52270885497 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53529840", - "uprn_count": "14" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08752332940, - 51.52076211974 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "55694053", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08582489157, - 51.52423214013 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760232", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08460415534, - 51.52252827681 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "55841333", - "uprn_count": "23" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09046401124, - 51.52500845422 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760366", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08665901033, - 51.52347731730 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760167", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08523817483, - 51.52199801036 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53875840", - "uprn_count": "21" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08790573136, - 51.52005170198 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760300", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08523971621, - 51.52550166079 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760673", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08740702488, - 51.52227145851 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760159", - "uprn_count": "37" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09015395806, - 51.52469077487 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760210", - "uprn_count": "10" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08735406455, - 51.52190815063 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760269", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08517606458, - 51.52360663718 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613767", - "uprn_count": "38" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08894666543, - 51.52728330710 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760630", - "uprn_count": "9" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08596436686, - 51.52399163027 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760148", - "uprn_count": "90" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08559244253, - 51.52179703997 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53555715", - "uprn_count": "23" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09069974009, - 51.52099643929 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "54843927", - "uprn_count": "36" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08536900467, - 51.52258204957 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760186", - "uprn_count": "60" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08749154622, - 51.52123763708 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "59797478", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08460319625, - 51.52285695300 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53842288", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08651616784, - 51.51911374360 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760258", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08880030229, - 51.52508388296 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760450", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08877219383, - 51.52489267275 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760989", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09008638232, - 51.52338474772 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53523418", - "uprn_count": "36" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08833393118, - 51.52076103473 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760173", - "uprn_count": "17" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08907044601, - 51.52478857712 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "56354285", - "uprn_count": "41" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08708248675, - 51.51950432943 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53815989", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08712150084, - 51.52007985063 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760230", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08459866660, - 51.52256307871 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53894914", - "uprn_count": "53" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08932705394, - 51.52020780589 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760340", - "uprn_count": "57" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08700821071, - 51.52470369200 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760757", - "uprn_count": "94" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08629573687, - 51.52185922605 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760165", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08568241478, - 51.52253231799 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760289", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08494465189, - 51.52548899801 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760645", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08589810776, - 51.52411473063 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "57797640", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08496788091, - 51.52179114697 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "56970529", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08673035105, - 51.52606173015 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760156", - "uprn_count": "11" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08743964400, - 51.52240633893 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53673626", - "uprn_count": "20" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08457962682, - 51.52315791127 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760202", - "uprn_count": "63" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08514280715, - 51.52153941124 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "47582725", - "uprn_count": "2" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08903179064, - 51.52700439325 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760266", - "uprn_count": "66" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08958919395, - 51.52486571171 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613662", - "uprn_count": "2" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09055456990, - 51.52704347329 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760589", - "uprn_count": "10" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08739339578, - 51.52221604989 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "47863432", - "uprn_count": "20" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08656652832, - 51.52377354927 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760179", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08735058986, - 51.52204111283 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760248", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08545068911, - 51.52547159555 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760404", - "uprn_count": "23" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08569047233, - 51.52316678822 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "60347880", - "uprn_count": "156" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08873887407, - 51.52589244765 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760981", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08508447894, - 51.52250703445 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53517488", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08540249619, - 51.52063943555 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760170", - "uprn_count": "23" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08950340680, - 51.52518881505 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53815719", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08580214812, - 51.51976909788 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760228", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08461864254, - 51.52260180398 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53877676", - "uprn_count": "29" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08850676500, - 51.52023902397 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760314", - "uprn_count": "15" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08872036555, - 51.52471439061 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760751", - "uprn_count": "180" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08677326589, - 51.52308738524 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760162", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08893070202, - 51.52527974813 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760215", - "uprn_count": "13" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08750749576, - 51.52270832689 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760278", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08509855123, - 51.52550722342 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613787", - "uprn_count": "11" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09045829084, - 51.52773739133 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760638", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08587468014, - 51.52417859166 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760151", - "uprn_count": "15" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08738616252, - 51.52175540266 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760195", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08577241806, - 51.52228063806 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760262", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08881139622, - 51.52515946758 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613654", - "uprn_count": "30" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08841210101, - 51.52660740062 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760559", - "uprn_count": "2" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09036979446, - 51.52201621806 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760051", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08651408714, - 51.52230407716 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53530202", - "uprn_count": "21" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08558143776, - 51.52017053246 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760177", - "uprn_count": "115" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09011378562, - 51.52279114581 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760235", - "uprn_count": "41" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08631542933, - 51.52256625361 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760839", - "uprn_count": "19" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.09069863118, - 51.52235527530 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760168", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08591546179, - 51.52346670045 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53876171", - "uprn_count": "112" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08780026547, - 51.51966975438 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760301", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08517005909, - 51.52550434483 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760686", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08683964335, - 51.52238336083 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760160", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08554780465, - 51.52227517161 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "54668028", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08868565970, - 51.52707814958 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760271", - "uprn_count": "9" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08511551871, - 51.52564108792 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613778", - "uprn_count": "4" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08556279304, - 51.52566116202 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "58775318", - "uprn_count": "5" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08476391706, - 51.52322955215 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760634", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08575556474, - 51.52523072818 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760149", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08736477713, - 51.52209660754 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "57099529", - "uprn_count": "14" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08747715586, - 51.52255778464 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760189", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08645676995, - 51.52485658336 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53842336", - "uprn_count": "16" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08644851873, - 51.51932417520 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "55728650", - "uprn_count": "15" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08606772431, - 51.51932747399 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760259", - "uprn_count": "7" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08879089932, - 51.52501718371 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "56517732", - "uprn_count": "16" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08537944456, - 51.52045732895 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44613640", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08508351171, - 51.52602201951 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760498", - "uprn_count": "9" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08737904118, - 51.52215533460 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "60457716", - "uprn_count": "12" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08741608314, - 51.52162504468 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "50741600", - "uprn_count": "11" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08601118306, - 51.52237364065 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53528831", - "uprn_count": "18" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08796303430, - 51.52075390699 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760174", - "uprn_count": "3" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08975339083, - 51.52521825973 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "53815990", - "uprn_count": "6" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08698937756, - 51.52000181841 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760231", - "uprn_count": "1" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08485451783, - 51.52255188290 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "51082874", - "uprn_count": "15" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08930634369, - 51.52701309542 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "44760352", - "uprn_count": "14" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08734604831, - 51.52197314390 - ] - } - }, - { - "type": "Feature", - "properties": { - "inspireid": "56669648", - "uprn_count": "8" - }, - "geometry": { - "type": "Point", - "coordinates": [ - -0.08851621061, - 51.52684922637 - ] - } - } - ] + "type": "FeatureCollection", + "generator": "JOSM", + "features": [ + { + "type": "Feature", + "properties": { + "inspireid": "44760782", + "uprn_count": "19" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08528530407, + 51.52103754846 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760166", + "uprn_count": "18" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08518862375, + 51.52302887251 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53875715", + "uprn_count": "176" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08768220681, + 51.52027207654 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "48199892", + "uprn_count": "32" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09051161088, + 51.52328524465 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760298", + "uprn_count": "21" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08519096645, + 51.52229137569 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760648", + "uprn_count": "43" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09039984580, + 51.52168966695 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760158", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08979845152, + 51.52470373164 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760268", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08584518403, + 51.52362781792 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760606", + "uprn_count": "34" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08574285775, + 51.52447487890 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760147", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08478417875, + 51.52230226544 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760181", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08597751642, + 51.52262480980 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "59756691", + "uprn_count": "68" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09000674703, + 51.52412334790 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53839893", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08632490840, + 51.51956380364 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760254", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08445931332, + 51.52362994921 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760985", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08550522898, + 51.52481338112 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53517508", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08531729267, + 51.52055437518 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760172", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08621709906, + 51.52245066605 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53815743", + "uprn_count": "28" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08609559738, + 51.52000280555 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760229", + "uprn_count": "2" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08466859613, + 51.52247735237 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "52054693", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08869160634, + 51.52496110557 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760329", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08610136910, + 51.52318693588 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760753", + "uprn_count": "9" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08538513949, + 51.52424009690 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760164", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09008514341, + 51.52505292621 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760216", + "uprn_count": "190" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08700282926, + 51.52503663329 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760279", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08530920735, + 51.52549852437 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613792", + "uprn_count": "72" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08833908631, + 51.52631952661 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760639", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08580868931, + 51.52429800891 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760153", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08456440427, + 51.52329504288 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760200", + "uprn_count": "95" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08770188351, + 51.52407460026 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "47582675", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08892578863, + 51.52706921088 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760263", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08583263531, + 51.52548367268 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613655", + "uprn_count": "18" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08843733386, + 51.52669877413 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760564", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09046694451, + 51.52125764642 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760143", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08576039998, + 51.52479998964 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "57943078", + "uprn_count": "80" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08990077541, + 51.52590434415 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760178", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08479378350, + 51.52288142387 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760247", + "uprn_count": "16" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08570423028, + 51.52383831047 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "60347715", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08913137569, + 51.52638282816 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760169", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08741982002, + 51.52232472527 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53876178", + "uprn_count": "14" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08848929384, + 51.51968662476 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "58831132", + "uprn_count": "120" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08811742827, + 51.52524678003 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760702", + "uprn_count": "17" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08626679662, + 51.52229285532 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "56996893", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08961930563, + 51.52736429296 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760161", + "uprn_count": "30" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08903973308, + 51.52443351442 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "57212602", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09025128250, + 51.52349660479 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760214", + "uprn_count": "30" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08491766007, + 51.52195690215 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760274", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08710416098, + 51.52394294309 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613782", + "uprn_count": "11" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08630939921, + 51.52567781493 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760635", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08591747289, + 51.52406421610 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760150", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08736624492, + 51.52184217908 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760190", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08950436522, + 51.52301269883 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53842347", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08629952517, + 51.51902467199 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760261", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08870422830, + 51.52481415717 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613643", + "uprn_count": "108" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08522752552, + 51.52590169102 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760506", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08680870061, + 51.52270885497 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53529840", + "uprn_count": "14" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08752332940, + 51.52076211974 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "55694053", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08582489157, + 51.52423214013 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760232", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08460415534, + 51.52252827681 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "55841333", + "uprn_count": "23" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09046401124, + 51.52500845422 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760366", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08665901033, + 51.52347731730 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760167", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08523817483, + 51.52199801036 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53875840", + "uprn_count": "21" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08790573136, + 51.52005170198 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760300", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08523971621, + 51.52550166079 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760673", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08740702488, + 51.52227145851 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760159", + "uprn_count": "37" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09015395806, + 51.52469077487 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760210", + "uprn_count": "10" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08735406455, + 51.52190815063 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760269", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08517606458, + 51.52360663718 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613767", + "uprn_count": "38" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08894666543, + 51.52728330710 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760630", + "uprn_count": "9" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08596436686, + 51.52399163027 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760148", + "uprn_count": "90" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08559244253, + 51.52179703997 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53555715", + "uprn_count": "23" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09069974009, + 51.52099643929 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "54843927", + "uprn_count": "36" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08536900467, + 51.52258204957 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760186", + "uprn_count": "60" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08749154622, + 51.52123763708 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "59797478", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08460319625, + 51.52285695300 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53842288", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08651616784, + 51.51911374360 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760258", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08880030229, + 51.52508388296 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760450", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08877219383, + 51.52489267275 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760989", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09008638232, + 51.52338474772 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53523418", + "uprn_count": "36" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08833393118, + 51.52076103473 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760173", + "uprn_count": "17" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08907044601, + 51.52478857712 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "56354285", + "uprn_count": "41" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08708248675, + 51.51950432943 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53815989", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08712150084, + 51.52007985063 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760230", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08459866660, + 51.52256307871 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53894914", + "uprn_count": "53" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08932705394, + 51.52020780589 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760340", + "uprn_count": "57" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08700821071, + 51.52470369200 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760757", + "uprn_count": "94" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08629573687, + 51.52185922605 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760165", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08568241478, + 51.52253231799 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760289", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08494465189, + 51.52548899801 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760645", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08589810776, + 51.52411473063 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "57797640", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08496788091, + 51.52179114697 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "56970529", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08673035105, + 51.52606173015 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760156", + "uprn_count": "11" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08743964400, + 51.52240633893 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53673626", + "uprn_count": "20" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08457962682, + 51.52315791127 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760202", + "uprn_count": "63" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08514280715, + 51.52153941124 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "47582725", + "uprn_count": "2" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08903179064, + 51.52700439325 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760266", + "uprn_count": "66" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08958919395, + 51.52486571171 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613662", + "uprn_count": "2" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09055456990, + 51.52704347329 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760589", + "uprn_count": "10" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08739339578, + 51.52221604989 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "47863432", + "uprn_count": "20" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08656652832, + 51.52377354927 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760179", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08735058986, + 51.52204111283 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760248", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08545068911, + 51.52547159555 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760404", + "uprn_count": "23" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08569047233, + 51.52316678822 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "60347880", + "uprn_count": "156" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08873887407, + 51.52589244765 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760981", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08508447894, + 51.52250703445 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53517488", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08540249619, + 51.52063943555 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760170", + "uprn_count": "23" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08950340680, + 51.52518881505 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53815719", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08580214812, + 51.51976909788 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760228", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08461864254, + 51.52260180398 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53877676", + "uprn_count": "29" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08850676500, + 51.52023902397 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760314", + "uprn_count": "15" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08872036555, + 51.52471439061 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760751", + "uprn_count": "180" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08677326589, + 51.52308738524 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760162", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08893070202, + 51.52527974813 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760215", + "uprn_count": "13" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08750749576, + 51.52270832689 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760278", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08509855123, + 51.52550722342 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613787", + "uprn_count": "11" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09045829084, + 51.52773739133 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760638", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08587468014, + 51.52417859166 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760151", + "uprn_count": "15" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08738616252, + 51.52175540266 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760195", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08577241806, + 51.52228063806 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760262", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08881139622, + 51.52515946758 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613654", + "uprn_count": "30" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08841210101, + 51.52660740062 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760559", + "uprn_count": "2" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09036979446, + 51.52201621806 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760051", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08651408714, + 51.52230407716 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53530202", + "uprn_count": "21" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08558143776, + 51.52017053246 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760177", + "uprn_count": "115" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09011378562, + 51.52279114581 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760235", + "uprn_count": "41" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08631542933, + 51.52256625361 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760839", + "uprn_count": "19" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.09069863118, + 51.52235527530 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760168", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08591546179, + 51.52346670045 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53876171", + "uprn_count": "112" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08780026547, + 51.51966975438 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760301", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08517005909, + 51.52550434483 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760686", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08683964335, + 51.52238336083 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760160", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08554780465, + 51.52227517161 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "54668028", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08868565970, + 51.52707814958 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760271", + "uprn_count": "9" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08511551871, + 51.52564108792 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613778", + "uprn_count": "4" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08556279304, + 51.52566116202 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "58775318", + "uprn_count": "5" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08476391706, + 51.52322955215 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760634", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08575556474, + 51.52523072818 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760149", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08736477713, + 51.52209660754 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "57099529", + "uprn_count": "14" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08747715586, + 51.52255778464 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760189", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08645676995, + 51.52485658336 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53842336", + "uprn_count": "16" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08644851873, + 51.51932417520 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "55728650", + "uprn_count": "15" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08606772431, + 51.51932747399 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760259", + "uprn_count": "7" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08879089932, + 51.52501718371 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "56517732", + "uprn_count": "16" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08537944456, + 51.52045732895 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44613640", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08508351171, + 51.52602201951 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760498", + "uprn_count": "9" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08737904118, + 51.52215533460 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "60457716", + "uprn_count": "12" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08741608314, + 51.52162504468 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "50741600", + "uprn_count": "11" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08601118306, + 51.52237364065 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53528831", + "uprn_count": "18" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08796303430, + 51.52075390699 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760174", + "uprn_count": "3" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08975339083, + 51.52521825973 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "53815990", + "uprn_count": "6" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08698937756, + 51.52000181841 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760231", + "uprn_count": "1" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08485451783, + 51.52255188290 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "51082874", + "uprn_count": "15" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08930634369, + 51.52701309542 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "44760352", + "uprn_count": "14" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08734604831, + 51.52197314390 + ] + } + }, + { + "type": "Feature", + "properties": { + "inspireid": "56669648", + "uprn_count": "8" + }, + "geometry": { + "type": "Point", + "coordinates": [ + -0.08851621061, + 51.52684922637 + ] + } + } + ] } \ No newline at end of file diff --git a/assets/welcome_message.json b/assets/welcome_message.json index d2a3fc257..0d53ded19 100644 --- a/assets/welcome_message.json +++ b/assets/welcome_message.json @@ -29,9 +29,6 @@ "message": "In more normal circumstances, there would be a very cool gathering in Leipzig around this time with thousands of tech-minded people. However, due to some well-known circumstances, it is a virtual-only event this year as well. However, there might be a local hackerspace nearby to fill in this void", "featured_theme": "hackerspaces" }, - - - { "start_date": "2021-11-01", "end_date": "2021-11-07", diff --git a/css/index-tailwind-output.css b/css/index-tailwind-output.css index 658e97769..642d24a0f 100644 --- a/css/index-tailwind-output.css +++ b/css/index-tailwind-output.css @@ -25,7 +25,7 @@ Use a better box model (opinionated). *, ::before, ::after { - box-sizing: border-box; + box-sizing: border-box; } /** @@ -33,9 +33,9 @@ Use a more readable tab size (opinionated). */ html { - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; } /** @@ -44,10 +44,10 @@ html { */ html { - line-height: 1.15; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ + line-height: 1.15; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ } /* @@ -60,7 +60,7 @@ Remove the margin in all browsers. */ body { - margin: 0; + margin: 0; } /** @@ -68,16 +68,14 @@ Improve consistency of default fonts in all browsers. (https://github.com/sindre */ body { - font-family: - system-ui, - -apple-system, /* Firefox supports this but not yet `system-ui` */ - 'Segoe UI', - Roboto, - Helvetica, - Arial, - sans-serif, - 'Apple Color Emoji', - 'Segoe UI Emoji'; + font-family: system-ui, + -apple-system, /* Firefox supports this but not yet `system-ui` */ 'Segoe UI', + Roboto, + Helvetica, + Arial, + sans-serif, + 'Apple Color Emoji', + 'Segoe UI Emoji'; } /* @@ -91,10 +89,10 @@ Grouping content */ hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ + height: 0; + /* 1 */ + color: inherit; + /* 2 */ } /* @@ -107,8 +105,8 @@ Add the correct text decoration in Chrome, Edge, and Safari. */ abbr[title] { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; } /** @@ -117,7 +115,7 @@ Add the correct font weight in Edge and Safari. b, strong { - font-weight: bolder; + font-weight: bolder; } /** @@ -129,16 +127,15 @@ code, kbd, samp, pre { - font-family: - ui-monospace, - SFMono-Regular, - Consolas, - 'Liberation Mono', - Menlo, - monospace; - /* 1 */ - font-size: 1em; - /* 2 */ + font-family: ui-monospace, + SFMono-Regular, + Consolas, + 'Liberation Mono', + Menlo, + monospace; + /* 1 */ + font-size: 1em; + /* 2 */ } /** @@ -146,7 +143,7 @@ Add the correct font size in all browsers. */ small { - font-size: 80%; + font-size: 80%; } /** @@ -155,18 +152,18 @@ Prevent 'sub' and 'sup' elements from affecting the line height in all browsers. sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } sub { - bottom: -0.25em; + bottom: -0.25em; } sup { - top: -0.5em; + top: -0.5em; } /* @@ -180,10 +177,10 @@ Tabular data */ table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ } /* @@ -201,14 +198,14 @@ input, optgroup, select, textarea { - font-family: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - line-height: 1.15; - /* 1 */ - margin: 0; - /* 2 */ + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ } /** @@ -218,8 +215,8 @@ Remove the inheritance of text transform in Edge and Firefox. button, select { - /* 1 */ - text-transform: none; + /* 1 */ + text-transform: none; } /** @@ -230,7 +227,7 @@ button, [type='button'], [type='reset'], [type='submit'] { - -webkit-appearance: button; + -webkit-appearance: button; } /** @@ -238,8 +235,8 @@ Remove the inner border and padding in Firefox. */ ::-moz-focus-inner { - border-style: none; - padding: 0; + border-style: none; + padding: 0; } /** @@ -247,7 +244,7 @@ Restore the focus styles unset by the previous rule. */ :-moz-focusring { - outline: 1px dotted ButtonText; + outline: 1px dotted ButtonText; } /** @@ -256,7 +253,7 @@ See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d4 */ :-moz-ui-invalid { - box-shadow: none; + box-shadow: none; } /** @@ -264,7 +261,7 @@ Remove the padding so developers are not caught out when they zero out 'fieldset */ legend { - padding: 0; + padding: 0; } /** @@ -272,7 +269,7 @@ Add the correct vertical alignment in Chrome and Firefox. */ progress { - vertical-align: baseline; + vertical-align: baseline; } /** @@ -281,7 +278,7 @@ Correct the cursor style of increment and decrement buttons in Safari. ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { - height: auto; + height: auto; } /** @@ -290,10 +287,10 @@ Correct the cursor style of increment and decrement buttons in Safari. */ [type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ } /** @@ -301,7 +298,7 @@ Remove the inner padding in Chrome and Safari on macOS. */ ::-webkit-search-decoration { - -webkit-appearance: none; + -webkit-appearance: none; } /** @@ -310,10 +307,10 @@ Remove the inner padding in Chrome and Safari on macOS. */ ::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ } /* @@ -326,7 +323,7 @@ Add the correct display in Chrome and Safari. */ summary { - display: list-item; + display: list-item; } /** @@ -352,24 +349,24 @@ hr, figure, p, pre { - margin: 0; + margin: 0; } button { - background-color: transparent; - background-image: none; + background-color: transparent; + background-image: none; } fieldset { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } ol, ul { - list-style: none; - margin: 0; - padding: 0; + list-style: none; + margin: 0; + padding: 0; } /** @@ -384,10 +381,10 @@ ul { */ html { - font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 1 */ - line-height: 1.5; - /* 2 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 1 */ + line-height: 1.5; + /* 2 */ } /** @@ -396,8 +393,8 @@ html { */ body { - font-family: inherit; - line-height: inherit; + font-family: inherit; + line-height: inherit; } /** @@ -429,14 +426,14 @@ body { *, ::before, ::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: currentColor; - /* 2 */ + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: currentColor; + /* 2 */ } /* @@ -444,7 +441,7 @@ body { */ hr { - border-top-width: 1px; + border-top-width: 1px; } /** @@ -458,32 +455,32 @@ hr { */ img { - border-style: solid; + border-style: solid; } textarea { - resize: vertical; + resize: vertical; } input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - color: #9ca3af; + opacity: 1; + color: #9ca3af; } input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - color: #9ca3af; + opacity: 1; + color: #9ca3af; } input::placeholder, textarea::placeholder { - opacity: 1; - color: #9ca3af; + opacity: 1; + color: #9ca3af; } button, [role="button"] { - cursor: pointer; + cursor: pointer; } /** @@ -495,11 +492,11 @@ button, */ :-moz-focusring { - outline: auto; + outline: auto; } table { - border-collapse: collapse; + border-collapse: collapse; } h1, @@ -508,8 +505,8 @@ h3, h4, h5, h6 { - font-size: inherit; - font-weight: inherit; + font-size: inherit; + font-weight: inherit; } /** @@ -518,8 +515,8 @@ h6 { */ a { - color: inherit; - text-decoration: inherit; + color: inherit; + text-decoration: inherit; } /** @@ -535,9 +532,9 @@ input, optgroup, select, textarea { - padding: 0; - line-height: inherit; - color: inherit; + padding: 0; + line-height: inherit; + color: inherit; } /** @@ -551,7 +548,7 @@ pre, code, kbd, samp { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } /** @@ -579,10 +576,10 @@ audio, iframe, embed, object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ } /** @@ -594,8 +591,8 @@ object { img, video { - max-width: 100%; - height: auto; + max-width: 100%; + height: auto; } /** @@ -603,1907 +600,1907 @@ video { */ [hidden] { - display: none; + display: none; } *, ::before, ::after { - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - --tw-border-opacity: 1; - border-color: rgba(229, 231, 235, var(--tw-border-opacity)); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgba(59, 130, 246, 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-blur: var(--tw-empty,/*!*/ /*!*/); - --tw-brightness: var(--tw-empty,/*!*/ /*!*/); - --tw-contrast: var(--tw-empty,/*!*/ /*!*/); - --tw-grayscale: var(--tw-empty,/*!*/ /*!*/); - --tw-hue-rotate: var(--tw-empty,/*!*/ /*!*/); - --tw-invert: var(--tw-empty,/*!*/ /*!*/); - --tw-saturate: var(--tw-empty,/*!*/ /*!*/); - --tw-sepia: var(--tw-empty,/*!*/ /*!*/); - --tw-drop-shadow: var(--tw-empty,/*!*/ /*!*/); - --tw-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-border-opacity: 1; + border-color: rgba(229, 231, 235, var(--tw-border-opacity)); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgba(59, 130, 246, 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-blur: var(--tw-empty, /*!*/ /*!*/); + --tw-brightness: var(--tw-empty, /*!*/ /*!*/); + --tw-contrast: var(--tw-empty, /*!*/ /*!*/); + --tw-grayscale: var(--tw-empty, /*!*/ /*!*/); + --tw-hue-rotate: var(--tw-empty, /*!*/ /*!*/); + --tw-invert: var(--tw-empty, /*!*/ /*!*/); + --tw-saturate: var(--tw-empty, /*!*/ /*!*/); + --tw-sepia: var(--tw-empty, /*!*/ /*!*/); + --tw-drop-shadow: var(--tw-empty, /*!*/ /*!*/); + --tw-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .container { - width: 100%; + width: 100%; } @media (min-width: 640px) { - .container { - max-width: 640px; - } + .container { + max-width: 640px; + } } @media (min-width: 768px) { - .container { - max-width: 768px; - } + .container { + max-width: 768px; + } } @media (min-width: 1024px) { - .container { - max-width: 1024px; - } + .container { + max-width: 1024px; + } } @media (min-width: 1280px) { - .container { - max-width: 1280px; - } + .container { + max-width: 1280px; + } } @media (min-width: 1536px) { - .container { - max-width: 1536px; - } + .container { + max-width: 1536px; + } } .pointer-events-none { - pointer-events: none; + pointer-events: none; } .pointer-events-auto { - pointer-events: auto; + pointer-events: auto; } .visible { - visibility: visible; + visibility: visible; } .invisible { - visibility: hidden; + visibility: hidden; } .static { - position: static; + position: static; } .fixed { - position: fixed; + position: fixed; } .absolute { - position: absolute; + position: absolute; } .relative { - position: relative; + position: relative; } .sticky { - position: sticky; + position: sticky; } .inset-0 { - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; } .bottom-3 { - bottom: 0.75rem; + bottom: 0.75rem; } .left-3 { - left: 0.75rem; + left: 0.75rem; } .right-2 { - right: 0.5rem; + right: 0.5rem; } .left-24 { - left: 6rem; + left: 6rem; } .right-24 { - right: 6rem; + right: 6rem; } .top-56 { - top: 14rem; + top: 14rem; } .top-2 { - top: 0.5rem; + top: 0.5rem; } .right-3 { - right: 0.75rem; + right: 0.75rem; } .bottom-0 { - bottom: 0px; + bottom: 0px; } .right-1\/3 { - right: 33.333333%; + right: 33.333333%; } .top-0 { - top: 0px; + top: 0px; } .left-0 { - left: 0px; + left: 0px; } .right-0 { - right: 0px; + right: 0px; } .isolate { - isolation: isolate; + isolation: isolate; } .z-10 { - z-index: 10; + z-index: 10; } .z-0 { - z-index: 0; + z-index: 0; } .float-right { - float: right; + float: right; } .float-left { - float: left; + float: left; } .float-none { - float: none; + float: none; } .m-8 { - margin: 2rem; + margin: 2rem; } .m-11 { - margin: 2.75rem; + margin: 2.75rem; } .m-1 { - margin: 0.25rem; + margin: 0.25rem; } .m-5 { - margin: 1.25rem; + margin: 1.25rem; } .m-0\.5 { - margin: 0.125rem; + margin: 0.125rem; } .m-0 { - margin: 0px; + margin: 0px; } .m-2 { - margin: 0.5rem; + margin: 0.5rem; } .m-4 { - margin: 1rem; + margin: 1rem; } .m-3 { - margin: 0.75rem; + margin: 0.75rem; } .m-6 { - margin: 1.5rem; + margin: 1.5rem; } .m-px { - margin: 1px; + margin: 1px; } .my-2 { - margin-top: 0.5rem; - margin-bottom: 0.5rem; + margin-top: 0.5rem; + margin-bottom: 0.5rem; } .mx-10 { - margin-left: 2.5rem; - margin-right: 2.5rem; + margin-left: 2.5rem; + margin-right: 2.5rem; } .my-3 { - margin-top: 0.75rem; - margin-bottom: 0.75rem; + margin-top: 0.75rem; + margin-bottom: 0.75rem; } .mx-4 { - margin-left: 1rem; - margin-right: 1rem; + margin-left: 1rem; + margin-right: 1rem; } .ml-3 { - margin-left: 0.75rem; + margin-left: 0.75rem; } .mt-1 { - margin-top: 0.25rem; + margin-top: 0.25rem; } .mr-4 { - margin-right: 1rem; + margin-right: 1rem; } .mt-4 { - margin-top: 1rem; + margin-top: 1rem; } .ml-2 { - margin-left: 0.5rem; + margin-left: 0.5rem; } .mt-3 { - margin-top: 0.75rem; + margin-top: 0.75rem; } .ml-8 { - margin-left: 2rem; + margin-left: 2rem; } .mr-2 { - margin-right: 0.5rem; + margin-right: 0.5rem; } .mt-2 { - margin-top: 0.5rem; + margin-top: 0.5rem; } .mb-10 { - margin-bottom: 2.5rem; + margin-bottom: 2.5rem; } .mt-0 { - margin-top: 0px; + margin-top: 0px; } .mb-4 { - margin-bottom: 1rem; + margin-bottom: 1rem; } .mb-8 { - margin-bottom: 2rem; + margin-bottom: 2rem; } .ml-1 { - margin-left: 0.25rem; + margin-left: 0.25rem; } .mr-0 { - margin-right: 0px; + margin-right: 0px; } .mb-1 { - margin-bottom: 0.25rem; + margin-bottom: 0.25rem; } .mr-3 { - margin-right: 0.75rem; + margin-right: 0.75rem; } .mb-2 { - margin-bottom: 0.5rem; + margin-bottom: 0.5rem; } .mb-0 { - margin-bottom: 0px; + margin-bottom: 0px; } .box-border { - box-sizing: border-box; + box-sizing: border-box; } .box-content { - box-sizing: content-box; + box-sizing: content-box; } .block { - display: block; + display: block; } .inline-block { - display: inline-block; + display: inline-block; } .inline { - display: inline; + display: inline; } .flex { - display: flex; + display: flex; } .inline-flex { - display: inline-flex; + display: inline-flex; } .table { - display: table; + display: table; } .grid { - display: grid; + display: grid; } .contents { - display: contents; + display: contents; } .hidden { - display: none; + display: none; } .h-24 { - height: 6rem; + height: 6rem; } .h-full { - height: 100%; + height: 100%; } .h-10 { - height: 2.5rem; + height: 2.5rem; } .h-8 { - height: 2rem; + height: 2rem; } .h-1\/2 { - height: 50%; + height: 50%; } .h-12 { - height: 3rem; + height: 3rem; } .h-screen { - height: 100vh; + height: 100vh; } .h-11 { - height: 2.75rem; + height: 2.75rem; } .h-32 { - height: 8rem; + height: 8rem; } .h-16 { - height: 4rem; + height: 4rem; } .h-0 { - height: 0px; + height: 0px; } .h-6 { - height: 1.5rem; + height: 1.5rem; } .h-3 { - height: 0.75rem; + height: 0.75rem; } .max-h-20vh { - max-height: 20vh; + max-height: 20vh; } .max-h-32 { - max-height: 8rem; + max-height: 8rem; } .max-h-4 { - max-height: 1rem; + max-height: 1rem; } .w-full { - width: 100%; + width: 100%; } .w-10 { - width: 2.5rem; + width: 2.5rem; } .w-8 { - width: 2rem; + width: 2rem; } .w-0 { - width: 0px; + width: 0px; } .w-12 { - width: 3rem; + width: 3rem; } .w-screen { - width: 100vw; + width: 100vw; } .w-11 { - width: 2.75rem; + width: 2.75rem; } .w-16 { - width: 4rem; + width: 4rem; } .w-min { - width: -webkit-min-content; - width: -moz-min-content; - width: min-content; + width: -webkit-min-content; + width: -moz-min-content; + width: min-content; } .w-6 { - width: 1.5rem; + width: 1.5rem; } .w-max { - width: -webkit-max-content; - width: -moz-max-content; - width: max-content; + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; } .min-w-min { - min-width: -webkit-min-content; - min-width: -moz-min-content; - min-width: min-content; + min-width: -webkit-min-content; + min-width: -moz-min-content; + min-width: min-content; } .min-w-\[20em\] { - min-width: 20em; + min-width: 20em; } .max-w-full { - max-width: 100%; + max-width: 100%; } .flex-none { - flex: none; + flex: none; } .flex-auto { - flex: 1 1 auto; + flex: 1 1 auto; } .flex-shrink-0 { - flex-shrink: 0; + flex-shrink: 0; } .flex-grow { - flex-grow: 1; + flex-grow: 1; } .border-collapse { - border-collapse: collapse; + border-collapse: collapse; } .transform { - transform: var(--tw-transform); + transform: var(--tw-transform); } @-webkit-keyframes spin { - to { - transform: rotate(360deg); - } + to { + transform: rotate(360deg); + } } @keyframes spin { - to { - transform: rotate(360deg); - } + to { + transform: rotate(360deg); + } } .animate-spin { - -webkit-animation: spin 1s linear infinite; - animation: spin 1s linear infinite; + -webkit-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; } @-webkit-keyframes pulse { - 50% { - opacity: .5; - } + 50% { + opacity: .5; + } } @keyframes pulse { - 50% { - opacity: .5; - } + 50% { + opacity: .5; + } } .animate-pulse { - -webkit-animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; - animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; + -webkit-animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; } .cursor-pointer { - cursor: pointer; + cursor: pointer; } .cursor-wait { - cursor: wait; + cursor: wait; } .resize { - resize: both; + resize: both; } .flex-row { - flex-direction: row; + flex-direction: row; } .flex-col { - flex-direction: column; + flex-direction: column; } .flex-wrap { - flex-wrap: wrap; + flex-wrap: wrap; } .items-end { - align-items: flex-end; + align-items: flex-end; } .items-center { - align-items: center; + align-items: center; } .items-baseline { - align-items: baseline; + align-items: baseline; } .justify-end { - justify-content: flex-end; + justify-content: flex-end; } .justify-center { - justify-content: center; + justify-content: center; } .justify-between { - justify-content: space-between; + justify-content: space-between; } .gap-4 { - gap: 1rem; + gap: 1rem; } .self-center { - align-self: center; + align-self: center; } .overflow-auto { - overflow: auto; + overflow: auto; } .overflow-hidden { - overflow: hidden; + overflow: hidden; } .overflow-y-auto { - overflow-y: auto; + overflow-y: auto; } .truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .overflow-ellipsis { - text-overflow: ellipsis; + text-overflow: ellipsis; } .whitespace-nowrap { - white-space: nowrap; + white-space: nowrap; } .break-normal { - overflow-wrap: normal; - word-break: normal; + overflow-wrap: normal; + word-break: normal; } .break-words { - overflow-wrap: break-word; + overflow-wrap: break-word; } .break-all { - word-break: break-all; + word-break: break-all; } .rounded-full { - border-radius: 9999px; + border-radius: 9999px; } .rounded-3xl { - border-radius: 1.5rem; + border-radius: 1.5rem; } .rounded { - border-radius: 0.25rem; + border-radius: 0.25rem; } .rounded-lg { - border-radius: 0.5rem; + border-radius: 0.5rem; } .rounded-xl { - border-radius: 0.75rem; + border-radius: 0.75rem; } .border { - border-width: 1px; + border-width: 1px; } .border-4 { - border-width: 4px; + border-width: 4px; } .border-2 { - border-width: 2px; + border-width: 2px; } .border-b { - border-bottom-width: 1px; + border-bottom-width: 1px; } .border-black { - --tw-border-opacity: 1; - border-color: rgba(0, 0, 0, var(--tw-border-opacity)); + --tw-border-opacity: 1; + border-color: rgba(0, 0, 0, var(--tw-border-opacity)); } .border-gray-300 { - --tw-border-opacity: 1; - border-color: rgba(209, 213, 219, var(--tw-border-opacity)); + --tw-border-opacity: 1; + border-color: rgba(209, 213, 219, var(--tw-border-opacity)); } .border-gray-400 { - --tw-border-opacity: 1; - border-color: rgba(156, 163, 175, var(--tw-border-opacity)); + --tw-border-opacity: 1; + border-color: rgba(156, 163, 175, var(--tw-border-opacity)); } .border-gray-200 { - --tw-border-opacity: 1; - border-color: rgba(229, 231, 235, var(--tw-border-opacity)); + --tw-border-opacity: 1; + border-color: rgba(229, 231, 235, var(--tw-border-opacity)); } .border-opacity-50 { - --tw-border-opacity: 0.5; + --tw-border-opacity: 0.5; } .bg-white { - --tw-bg-opacity: 1; - background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); } .bg-blue-100 { - --tw-bg-opacity: 1; - background-color: rgba(219, 234, 254, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(219, 234, 254, var(--tw-bg-opacity)); } .bg-gray-400 { - --tw-bg-opacity: 1; - background-color: rgba(156, 163, 175, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(156, 163, 175, var(--tw-bg-opacity)); } .bg-indigo-100 { - --tw-bg-opacity: 1; - background-color: rgba(224, 231, 255, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(224, 231, 255, var(--tw-bg-opacity)); } .bg-gray-300 { - --tw-bg-opacity: 1; - background-color: rgba(209, 213, 219, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(209, 213, 219, var(--tw-bg-opacity)); } .bg-black { - --tw-bg-opacity: 1; - background-color: rgba(0, 0, 0, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(0, 0, 0, var(--tw-bg-opacity)); } .bg-gray-200 { - --tw-bg-opacity: 1; - background-color: rgba(229, 231, 235, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(229, 231, 235, var(--tw-bg-opacity)); } .bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgba(243, 244, 246, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(243, 244, 246, var(--tw-bg-opacity)); } .bg-red-500 { - --tw-bg-opacity: 1; - background-color: rgba(239, 68, 68, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(239, 68, 68, var(--tw-bg-opacity)); } .bg-red-200 { - --tw-bg-opacity: 1; - background-color: rgba(254, 202, 202, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(254, 202, 202, var(--tw-bg-opacity)); } .p-3 { - padding: 0.75rem; + padding: 0.75rem; } .p-4 { - padding: 1rem; + padding: 1rem; } .p-1\.5 { - padding: 0.375rem; + padding: 0.375rem; } .p-1 { - padding: 0.25rem; + padding: 0.25rem; } .p-2 { - padding: 0.5rem; + padding: 0.5rem; } .p-0 { - padding: 0px; + padding: 0px; } .p-0\.5 { - padding: 0.125rem; + padding: 0.125rem; } .pl-2 { - padding-left: 0.5rem; + padding-left: 0.5rem; } .pb-20 { - padding-bottom: 5rem; + padding-bottom: 5rem; } .pt-1 { - padding-top: 0.25rem; + padding-top: 0.25rem; } .pb-1 { - padding-bottom: 0.25rem; + padding-bottom: 0.25rem; } .pl-1 { - padding-left: 0.25rem; + padding-left: 0.25rem; } .pr-1 { - padding-right: 0.25rem; + padding-right: 0.25rem; } .pl-5 { - padding-left: 1.25rem; + padding-left: 1.25rem; } .pr-3 { - padding-right: 0.75rem; + padding-right: 0.75rem; } .pl-4 { - padding-left: 1rem; + padding-left: 1rem; } .pr-4 { - padding-right: 1rem; + padding-right: 1rem; } .pl-3 { - padding-left: 0.75rem; + padding-left: 0.75rem; } .pr-0 { - padding-right: 0px; + padding-right: 0px; } .pt-0\.5 { - padding-top: 0.125rem; + padding-top: 0.125rem; } .pt-0 { - padding-top: 0px; + padding-top: 0px; } .pb-2 { - padding-bottom: 0.5rem; + padding-bottom: 0.5rem; } .pr-2 { - padding-right: 0.5rem; + padding-right: 0.5rem; } .pl-6 { - padding-left: 1.5rem; + padding-left: 1.5rem; } .pt-2 { - padding-top: 0.5rem; + padding-top: 0.5rem; } .text-center { - text-align: center; + text-align: center; } .align-baseline { - vertical-align: baseline; + vertical-align: baseline; } .align-middle { - vertical-align: middle; + vertical-align: middle; } .text-xl { - font-size: 1.25rem; - line-height: 1.75rem; + font-size: 1.25rem; + line-height: 1.75rem; } .text-sm { - font-size: 0.875rem; - line-height: 1.25rem; + font-size: 0.875rem; + line-height: 1.25rem; } .text-2xl { - font-size: 1.5rem; - line-height: 2rem; + font-size: 1.5rem; + line-height: 2rem; } .text-base { - font-size: 1rem; - line-height: 1.5rem; + font-size: 1rem; + line-height: 1.5rem; } .text-lg { - font-size: 1.125rem; - line-height: 1.75rem; + font-size: 1.125rem; + line-height: 1.75rem; } .text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; + font-size: 2.25rem; + line-height: 2.5rem; } .font-bold { - font-weight: 700; + font-weight: 700; } .font-extrabold { - font-weight: 800; + font-weight: 800; } .font-semibold { - font-weight: 600; + font-weight: 600; } .font-medium { - font-weight: 500; + font-weight: 500; } .uppercase { - text-transform: uppercase; + text-transform: uppercase; } .lowercase { - text-transform: lowercase; + text-transform: lowercase; } .italic { - font-style: italic; + font-style: italic; } .ordinal, .slashed-zero, .lining-nums, .oldstyle-nums, .proportional-nums, .tabular-nums, .diagonal-fractions, .stacked-fractions { - --tw-ordinal: var(--tw-empty,/*!*/ /*!*/); - --tw-slashed-zero: var(--tw-empty,/*!*/ /*!*/); - --tw-numeric-figure: var(--tw-empty,/*!*/ /*!*/); - --tw-numeric-spacing: var(--tw-empty,/*!*/ /*!*/); - --tw-numeric-fraction: var(--tw-empty,/*!*/ /*!*/); - font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); + --tw-ordinal: var(--tw-empty, /*!*/ /*!*/); + --tw-slashed-zero: var(--tw-empty, /*!*/ /*!*/); + --tw-numeric-figure: var(--tw-empty, /*!*/ /*!*/); + --tw-numeric-spacing: var(--tw-empty, /*!*/ /*!*/); + --tw-numeric-fraction: var(--tw-empty, /*!*/ /*!*/); + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); } .ordinal { - --tw-ordinal: ordinal; + --tw-ordinal: ordinal; } .leading-6 { - line-height: 1.5rem; + line-height: 1.5rem; } .tracking-tight { - letter-spacing: -0.025em; + letter-spacing: -0.025em; } .text-white { - --tw-text-opacity: 1; - color: rgba(255, 255, 255, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(255, 255, 255, var(--tw-text-opacity)); } .text-gray-900 { - --tw-text-opacity: 1; - color: rgba(17, 24, 39, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(17, 24, 39, var(--tw-text-opacity)); } .text-gray-800 { - --tw-text-opacity: 1; - color: rgba(31, 41, 55, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(31, 41, 55, var(--tw-text-opacity)); } .text-gray-500 { - --tw-text-opacity: 1; - color: rgba(107, 114, 128, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(107, 114, 128, var(--tw-text-opacity)); } .text-green-600 { - --tw-text-opacity: 1; - color: rgba(5, 150, 105, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(5, 150, 105, var(--tw-text-opacity)); } .underline { - text-decoration: underline; + text-decoration: underline; } .opacity-50 { - opacity: 0.5; + opacity: 0.5; } .opacity-0 { - opacity: 0; + opacity: 0; } .opacity-40 { - opacity: 0.4; + opacity: 0.4; } .shadow { - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .ring { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } .blur { - --tw-blur: blur(8px); - filter: var(--tw-filter); + --tw-blur: blur(8px); + filter: var(--tw-filter); } .drop-shadow { - --tw-drop-shadow: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1)) drop-shadow(0 1px 1px rgba(0, 0, 0, 0.06)); - filter: var(--tw-filter); + --tw-drop-shadow: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1)) drop-shadow(0 1px 1px rgba(0, 0, 0, 0.06)); + filter: var(--tw-filter); } .invert { - --tw-invert: invert(100%); - filter: var(--tw-filter); + --tw-invert: invert(100%); + filter: var(--tw-filter); } .filter { - filter: var(--tw-filter); + filter: var(--tw-filter); } .transition { - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; } .transition-colors { - transition-property: background-color, border-color, color, fill, stroke; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; + transition-property: background-color, border-color, color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; } .transition-opacity { - transition-property: opacity; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; } .\!transition { - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter !important; - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter !important; - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter !important; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; - transition-duration: 150ms !important; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter !important; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter !important; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; + transition-duration: 150ms !important; } .duration-500 { - transition-duration: 500ms; + transition-duration: 500ms; } .ease-in { - transition-timing-function: cubic-bezier(0.4, 0, 1, 1); + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); } .z-above-map { - z-index: 10000 + z-index: 10000 } .z-above-controls { - z-index: 10001 + z-index: 10001 } .btn { - display: inline-flex; - justify-content: center; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - padding-right: 1rem; - border-width: 1px; - border-color: transparent; - --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); - border-radius: 1.5rem; - --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); - --tw-ring-opacity: 1; - --tw-ring-color: rgba(191, 219, 254, var(--tw-ring-opacity)); + display: inline-flex; + justify-content: center; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + padding-right: 1rem; + border-width: 1px; + border-color: transparent; + --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + border-radius: 1.5rem; + --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-opacity: 1; + --tw-ring-color: rgba(191, 219, 254, var(--tw-ring-opacity)); } .btn:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgba(147, 197, 253, var(--tw-ring-opacity)); + --tw-ring-opacity: 1; + --tw-ring-color: rgba(147, 197, 253, var(--tw-ring-opacity)); } .btn { - margin-top: 0.25rem; - margin-right: 0.25rem; - font-size: 0.875rem; - line-height: 1.25rem; - font-weight: 500; - --tw-text-opacity: 1; - color: rgba(255, 255, 255, var(--tw-text-opacity)); - --tw-bg-opacity: 1; - background-color: rgba(37, 99, 235, var(--tw-bg-opacity)); + margin-top: 0.25rem; + margin-right: 0.25rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 500; + --tw-text-opacity: 1; + color: rgba(255, 255, 255, var(--tw-text-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(37, 99, 235, var(--tw-bg-opacity)); } .btn:hover { - --tw-bg-opacity: 1; - background-color: rgba(29, 78, 216, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(29, 78, 216, var(--tw-bg-opacity)); } .btn:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-opacity: 1; - --tw-ring-color: rgba(29, 78, 216, var(--tw-ring-opacity)); + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-opacity: 1; + --tw-ring-color: rgba(29, 78, 216, var(--tw-ring-opacity)); } .btn-secondary { - --tw-bg-opacity: 1; - background-color: rgba(75, 85, 99, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(75, 85, 99, var(--tw-bg-opacity)); } .btn-secondary:hover { - --tw-bg-opacity: 1; - background-color: rgba(55, 65, 81, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(55, 65, 81, var(--tw-bg-opacity)); } .btn-disabled { - --tw-bg-opacity: 1; - background-color: rgba(107, 114, 128, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(107, 114, 128, var(--tw-bg-opacity)); } .btn-disabled:hover { - --tw-bg-opacity: 1; - background-color: rgba(107, 114, 128, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(107, 114, 128, var(--tw-bg-opacity)); } .btn-disabled { - --tw-text-opacity: 1; - color: rgba(209, 213, 219, var(--tw-text-opacity)); - --tw-ring-opacity: 1; - --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); + --tw-text-opacity: 1; + color: rgba(209, 213, 219, var(--tw-text-opacity)); + --tw-ring-opacity: 1; + --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); } .btn-disabled:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); + --tw-ring-opacity: 1; + --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); } .btn-disabled:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); + --tw-ring-opacity: 1; + --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); } .btn-disabled { - cursor: default; + cursor: default; } :root { - --subtle-detail-color: #e5f5ff; - --subtle-detail-color-contrast: black; - --subtle-detail-color-light-contrast: lightgrey; - --catch-detail-color: #3a3aeb; - --catch-detail-color-contrast: white; - --alert-color: #fee4d1; - --background-color: white; - --foreground-color: black; - --popup-border: white; - --shadow-color: #00000066; - --variable-title-height: 0px; - /* Set by javascript */ - --return-to-the-map-height: 2em; - --image-carousel-height: 350px; + --subtle-detail-color: #e5f5ff; + --subtle-detail-color-contrast: black; + --subtle-detail-color-light-contrast: lightgrey; + --catch-detail-color: #3a3aeb; + --catch-detail-color-contrast: white; + --alert-color: #fee4d1; + --background-color: white; + --foreground-color: black; + --popup-border: white; + --shadow-color: #00000066; + --variable-title-height: 0px; + /* Set by javascript */ + --return-to-the-map-height: 2em; + --image-carousel-height: 350px; } html, body { - height: 100%; - min-height: 100vh; - min-height: -webkit-fill-available; - margin: 0; - padding: 0; - background-color: var(--background-color); - color: var(--foreground-color); - font-family: 'Helvetica Neue', Arial, sans-serif; + height: 100%; + min-height: 100vh; + min-height: -webkit-fill-available; + margin: 0; + padding: 0; + background-color: var(--background-color); + color: var(--foreground-color); + font-family: 'Helvetica Neue', Arial, sans-serif; } .leaflet-overlay-pane .leaflet-zoom-animated { - /* Another workaround to keep leaflet working */ - width: initial !important; - height: initial !important; - box-sizing: initial !important; + /* Another workaround to keep leaflet working */ + width: initial !important; + height: initial !important; + box-sizing: initial !important; } .leaflet-control-attribution { - display: block ruby; + display: block ruby; } .badge { } .badge svg { - /*Workaround for leaflet*/ - width: unset !important; - height: 100% !important; + /*Workaround for leaflet*/ + width: unset !important; + height: 100% !important; } svg, img { - box-sizing: content-box; - width: 100%; - height: 100%; + box-sizing: content-box; + width: 100%; + height: 100%; } .no-images img { - display: none; + display: none; } .mapcontrol svg path { - fill: var(--subtle-detail-color-contrast) !important; + fill: var(--subtle-detail-color-contrast) !important; } .red-svg svg path { - stroke: #d71010 !important; + stroke: #d71010 !important; } a { - color: var(--foreground-color); + color: var(--foreground-color); } btn { - margin-top: 0.25rem; - margin-right: 0.25rem; - font-size: 0.875rem; - line-height: 1.25rem; - font-weight: 500; - --tw-text-opacity: 1; - color: var(--catch-detail-color-contrast); - --tw-bg-opacity: 1; - background-color: var(--catch-detail-color); + margin-top: 0.25rem; + margin-right: 0.25rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 500; + --tw-text-opacity: 1; + color: var(--catch-detail-color-contrast); + --tw-bg-opacity: 1; + background-color: var(--catch-detail-color); } .h-min { - height: -webkit-min-content; - height: -moz-min-content; - height: min-content; + height: -webkit-min-content; + height: -moz-min-content; + height: min-content; } .w-min { - width: -webkit-min-content; - width: -moz-min-content; - width: min-content; + width: -webkit-min-content; + width: -moz-min-content; + width: min-content; } .w-16-imp { - width: 4rem !important; + width: 4rem !important; } .link-underline a { - -webkit-text-decoration: underline 1px #0078a855; - text-decoration: underline 1px #0078a855; - color: #0078A8; + -webkit-text-decoration: underline 1px #0078a855; + text-decoration: underline 1px #0078a855; + color: #0078A8; } .link-no-underline a { - text-decoration: none; + text-decoration: none; } li { - margin-left: 0.5em; - padding-left: 0.2em; - margin-top: 0.1em; + margin-left: 0.5em; + padding-left: 0.2em; + margin-top: 0.1em; } h2 { - font-size: large; - margin-top: 0.5em; - margin-bottom: 0.3em; - font-weight: bold; + font-size: large; + margin-top: 0.5em; + margin-bottom: 0.3em; + font-weight: bold; } h3 { - font-size: larger; - margin-top: 0.6em; - margin-bottom: 0; - font-weight: bold; - font-size: larger; - margin-top: 0.6em; - margin-bottom: 0; - font-weight: bolder; + font-size: larger; + margin-top: 0.6em; + margin-bottom: 0; + font-weight: bold; + font-size: larger; + margin-top: 0.6em; + margin-bottom: 0; + font-weight: bolder; } p { - padding-top: 0.1em; + padding-top: 0.1em; } li::marker { - content: "•" + content: "•" } .subtle-background { - background: var(--subtle-detail-color); - color: var(--subtle-detail-color-contrast); + background: var(--subtle-detail-color); + color: var(--subtle-detail-color-contrast); } .normal-background { - background: var(--background-color); - color: var(--foreground-color) + background: var(--background-color); + color: var(--foreground-color) } .subtle-lighter { - color: var(--subtle-detail-color-light-contrast); + color: var(--subtle-detail-color-light-contrast); } .border-attention-catch { - border: 5px solid var(--catch-detail-color); + border: 5px solid var(--catch-detail-color); } .border-attention { - border-color: var(--catch-detail-color); + border-color: var(--catch-detail-color); } .direction-svg svg path { - fill: var(--catch-detail-color) !important; + fill: var(--catch-detail-color) !important; } #leafletDiv { - height: 100%; + height: 100%; } .leaflet-popup-content-wrapper { - background-color: var(--background-color); - color: var(--foreground-color); - border: 2px solid var(--popup-border); - box-shadow: 0 3px 14px var(--shadow-color) !important; + background-color: var(--background-color); + color: var(--foreground-color); + border: 2px solid var(--popup-border); + box-shadow: 0 3px 14px var(--shadow-color) !important; } .leaflet-container { - background-color: var(--background-color) !important; + background-color: var(--background-color) !important; } .leaflet-popup-tip { - background-color: var(--popup-border) !important; - color: var(--popup-border) !important; - box-shadow: 0 3px 14px var(--shadow-color) !important; + background-color: var(--popup-border) !important; + color: var(--popup-border) !important; + box-shadow: 0 3px 14px var(--shadow-color) !important; } .single-layer-selection-toggle { - position: relative; - width: 2em; - height: 2em; - flex-shrink: 0; + position: relative; + width: 2em; + height: 2em; + flex-shrink: 0; } .single-layer-selection-toggle img { - max-height: 2em !important; - max-width: 2em !important; + max-height: 2em !important; + max-width: 2em !important; } .single-layer-selection-toggle svg { - max-height: 2em !important; - max-width: 2em !important; + max-height: 2em !important; + max-width: 2em !important; } .block-ruby { - display: block ruby; + display: block ruby; } .disable-links a { - pointer-events: none; - text-decoration: none !important; - color: var(--subtle-detail-color-contrast) !important; + pointer-events: none; + text-decoration: none !important; + color: var(--subtle-detail-color-contrast) !important; } .enable-links a { - pointer-events: unset; - text-decoration: underline !important; - color: unset !important; + pointer-events: unset; + text-decoration: underline !important; + color: unset !important; } .disable-links a.must-link, .disable-links .must-link a { - /* Hide links if they are disabled */ - display: none; + /* Hide links if they are disabled */ + display: none; } /**************** GENERIC ****************/ .alert { - background-color: var(--alert-color); - font-weight: bold; - border-radius: 1em; - margin: 0.25em; - text-align: center; - padding: 0.15em 0.3em; + background-color: var(--alert-color); + font-weight: bold; + border-radius: 1em; + margin: 0.25em; + text-align: center; + padding: 0.15em 0.3em; } .question form { - display: inline-block; - max-width: 90vw; - width: 100%; + display: inline-block; + max-width: 90vw; + width: 100%; } .invalid { - box-shadow: 0 0 10px #ff5353; - height: -webkit-min-content; - height: -moz-min-content; - height: min-content; + box-shadow: 0 0 10px #ff5353; + height: -webkit-min-content; + height: -moz-min-content; + height: min-content; } .shadow { - box-shadow: 0 0 10px var(--shadow-color); + box-shadow: 0 0 10px var(--shadow-color); } .title-font span { - font-size: xx-large !important; - font-weight: bold; + font-size: xx-large !important; + font-weight: bold; } .soft { - background-color: var(--subtle-detail-color); - color: var(--subtle-detail-color-contrast); - font-weight: bold; - border-radius: 1em; - margin: 0.25em; - text-align: center; - padding: 0.15em 0.3em; + background-color: var(--subtle-detail-color); + color: var(--subtle-detail-color-contrast); + font-weight: bold; + border-radius: 1em; + margin: 0.25em; + text-align: center; + padding: 0.15em 0.3em; } .subtle { - color: #999; + color: #999; } .link-underline .subtle a { - -webkit-text-decoration: underline 1px #7193bb88; - text-decoration: underline 1px #7193bb88; - color: #7193bb; + -webkit-text-decoration: underline 1px #7193bb88; + text-decoration: underline 1px #7193bb88; + color: #7193bb; } .thanks { - background-color: #43d904; - font-weight: bold; - border-radius: 1em; - margin: 0.25em; - text-align: center; - padding: 0.15em 0.3em; + background-color: #43d904; + font-weight: bold; + border-radius: 1em; + margin: 0.25em; + text-align: center; + padding: 0.15em 0.3em; } .clickable { - pointer-events: all; + pointer-events: all; } .unclickable { - pointer-events: none !important; + pointer-events: none !important; } @-webkit-keyframes slide { - /* This is the animation on the marker to add a new point - it slides through all the possible presets */ + /* This is the animation on the marker to add a new point - it slides through all the possible presets */ - from { - transform: translateX(0%); - } + from { + transform: translateX(0%); + } - to { - transform: translateX(calc(-100% + 42px)); - } + to { + transform: translateX(calc(-100% + 42px)); + } } @keyframes slide { - /* This is the animation on the marker to add a new point - it slides through all the possible presets */ + /* This is the animation on the marker to add a new point - it slides through all the possible presets */ - from { - transform: translateX(0%); - } + from { + transform: translateX(0%); + } - to { - transform: translateX(calc(-100% + 42px)); - } + to { + transform: translateX(calc(-100% + 42px)); + } } .hand-drag-animation { - -webkit-animation: hand-drag-animation 6s ease-in-out infinite; - animation: hand-drag-animation 6s ease-in-out infinite; - transform-origin: 50% 125%; + -webkit-animation: hand-drag-animation 6s ease-in-out infinite; + animation: hand-drag-animation 6s ease-in-out infinite; + transform-origin: 50% 125%; } @-webkit-keyframes hand-drag-animation { - /* This is the animation on the little extra hand on the location input. If fades in, invites the user to interact/drag the map */ + /* This is the animation on the little extra hand on the location input. If fades in, invites the user to interact/drag the map */ - 0% { - opacity: 0; - transform: rotate(-30deg); - } + 0% { + opacity: 0; + transform: rotate(-30deg); + } - 6% { - opacity: 1; - transform: rotate(-30deg); - } + 6% { + opacity: 1; + transform: rotate(-30deg); + } - 12% { - opacity: 1; - transform: rotate(-45deg); - } + 12% { + opacity: 1; + transform: rotate(-45deg); + } - 24% { - opacity: 1; - transform: rotate(-00deg); - } + 24% { + opacity: 1; + transform: rotate(-00deg); + } - 30% { - opacity: 1; - transform: rotate(-30deg); - } + 30% { + opacity: 1; + transform: rotate(-30deg); + } - 36% { - opacity: 0; - transform: rotate(-30deg); - } + 36% { + opacity: 0; + transform: rotate(-30deg); + } - 100% { - opacity: 0; - transform: rotate(-30deg); - } + 100% { + opacity: 0; + transform: rotate(-30deg); + } } @keyframes hand-drag-animation { - /* This is the animation on the little extra hand on the location input. If fades in, invites the user to interact/drag the map */ + /* This is the animation on the little extra hand on the location input. If fades in, invites the user to interact/drag the map */ - 0% { - opacity: 0; - transform: rotate(-30deg); - } + 0% { + opacity: 0; + transform: rotate(-30deg); + } - 6% { - opacity: 1; - transform: rotate(-30deg); - } + 6% { + opacity: 1; + transform: rotate(-30deg); + } - 12% { - opacity: 1; - transform: rotate(-45deg); - } + 12% { + opacity: 1; + transform: rotate(-45deg); + } - 24% { - opacity: 1; - transform: rotate(-00deg); - } + 24% { + opacity: 1; + transform: rotate(-00deg); + } - 30% { - opacity: 1; - transform: rotate(-30deg); - } + 30% { + opacity: 1; + transform: rotate(-30deg); + } - 36% { - opacity: 0; - transform: rotate(-30deg); - } + 36% { + opacity: 0; + transform: rotate(-30deg); + } - 100% { - opacity: 0; - transform: rotate(-30deg); - } + 100% { + opacity: 0; + transform: rotate(-30deg); + } } /**************************************/ #topleft-tools { - display: block; - position: absolute; - z-index: 5000; - transition: all 500ms linear; - left: 0; - right: 0; + display: block; + position: absolute; + z-index: 5000; + transition: all 500ms linear; + left: 0; + right: 0; } .welcomeMessage { - display: block; - max-width: calc(100vw - 5em); - width: 40em; - max-height: calc(100vh - 15em); - overflow-y: auto; - border-radius: 1em; - background-color: var(--background-color); - color: var(--foreground-color); + display: block; + max-width: calc(100vw - 5em); + width: 40em; + max-height: calc(100vh - 15em); + overflow-y: auto; + border-radius: 1em; + background-color: var(--background-color); + color: var(--foreground-color); } /***************** Info box (box containing features and questions ******************/ .leaflet-popup-content { - width: 45em !important; - margin: 0.25rem !important; + width: 45em !important; + margin: 0.25rem !important; } .leaflet-div-icon { - background-color: unset !important; - border: unset !important; + background-color: unset !important; + border: unset !important; } .leaflet-div-icon svg { - width: calc(100%); - height: calc(100%); + width: calc(100%); + height: calc(100%); } /****** ShareScreen *****/ .literal-code { - display: inline-block; - background-color: lightgray; - padding: 0.5em; - word-break: break-word; - color: black; - box-sizing: border-box; + display: inline-block; + background-color: lightgray; + padding: 0.5em; + word-break: break-word; + color: black; + box-sizing: border-box; } /** Switch layout **/ .small-image img { - height: 1em; - max-width: 1em; + height: 1em; + max-width: 1em; } .small-image { - height: 1em; - max-width: 1em; + height: 1em; + max-width: 1em; } .slideshow-item img { - height: var(--image-carousel-height); - width: unset; + height: var(--image-carousel-height); + width: unset; } .hover\:bg-blue-200:hover { - --tw-bg-opacity: 1; - background-color: rgba(191, 219, 254, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(191, 219, 254, var(--tw-bg-opacity)); } .hover\:bg-indigo-200:hover { - --tw-bg-opacity: 1; - background-color: rgba(199, 210, 254, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(199, 210, 254, var(--tw-bg-opacity)); } .hover\:text-blue-800:hover { - --tw-text-opacity: 1; - color: rgba(30, 64, 175, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(30, 64, 175, var(--tw-text-opacity)); } .hover\:opacity-100:hover { - opacity: 1; + opacity: 1; } .hover\:shadow-xl:hover { - --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .group:hover .group-hover\:text-blue-800 { - --tw-text-opacity: 1; - color: rgba(30, 64, 175, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(30, 64, 175, var(--tw-text-opacity)); } .group:hover .group-hover\:text-blue-900 { - --tw-text-opacity: 1; - color: rgba(30, 58, 138, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(30, 58, 138, var(--tw-text-opacity)); } @media (min-width: 640px) { - .sm\:mx-auto { - margin-left: auto; - margin-right: auto; - } + .sm\:mx-auto { + margin-left: auto; + margin-right: auto; + } - .sm\:mt-5 { - margin-top: 1.25rem; - } + .sm\:mt-5 { + margin-top: 1.25rem; + } - .sm\:h-24 { - height: 6rem; - } + .sm\:h-24 { + height: 6rem; + } - .sm\:w-24 { - width: 6rem; - } + .sm\:w-24 { + width: 6rem; + } - .sm\:w-auto { - width: auto; - } + .sm\:w-auto { + width: auto; + } - .sm\:max-w-sm { - max-width: 24rem; - } + .sm\:max-w-sm { + max-width: 24rem; + } - .sm\:max-w-xl { - max-width: 36rem; - } + .sm\:max-w-xl { + max-width: 36rem; + } - .sm\:flex-row { - flex-direction: row; - } + .sm\:flex-row { + flex-direction: row; + } - .sm\:flex-wrap { - flex-wrap: wrap; - } + .sm\:flex-wrap { + flex-wrap: wrap; + } - .sm\:items-start { - align-items: flex-start; - } + .sm\:items-start { + align-items: flex-start; + } - .sm\:justify-between { - justify-content: space-between; - } + .sm\:justify-between { + justify-content: space-between; + } - .sm\:border-4 { - border-width: 4px; - } + .sm\:border-4 { + border-width: 4px; + } - .sm\:p-0\.5 { - padding: 0.125rem; - } + .sm\:p-0\.5 { + padding: 0.125rem; + } - .sm\:p-1\.5 { - padding: 0.375rem; - } + .sm\:p-1\.5 { + padding: 0.375rem; + } - .sm\:p-0 { - padding: 0px; - } + .sm\:p-0 { + padding: 0px; + } - .sm\:p-1 { - padding: 0.25rem; - } + .sm\:p-1 { + padding: 0.25rem; + } - .sm\:p-2 { - padding: 0.5rem; - } + .sm\:p-2 { + padding: 0.5rem; + } - .sm\:pl-2 { - padding-left: 0.5rem; - } + .sm\:pl-2 { + padding-left: 0.5rem; + } - .sm\:pt-1 { - padding-top: 0.25rem; - } + .sm\:pt-1 { + padding-top: 0.25rem; + } - .sm\:text-center { - text-align: center; - } + .sm\:text-center { + text-align: center; + } - .sm\:text-xl { - font-size: 1.25rem; - line-height: 1.75rem; - } + .sm\:text-xl { + font-size: 1.25rem; + line-height: 1.75rem; + } - .sm\:text-5xl { - font-size: 3rem; - line-height: 1; - } + .sm\:text-5xl { + font-size: 3rem; + line-height: 1; + } - .sm\:text-lg { - font-size: 1.125rem; - line-height: 1.75rem; - } + .sm\:text-lg { + font-size: 1.125rem; + line-height: 1.75rem; + } } @media (min-width: 768px) { - .md\:relative { - position: relative; - } + .md\:relative { + position: relative; + } - .md\:m-1 { - margin: 0.25rem; - } + .md\:m-1 { + margin: 0.25rem; + } - .md\:m-2 { - margin: 0.5rem; - } + .md\:m-2 { + margin: 0.5rem; + } - .md\:mt-5 { - margin-top: 1.25rem; - } + .md\:mt-5 { + margin-top: 1.25rem; + } - .md\:mt-4 { - margin-top: 1rem; - } + .md\:mt-4 { + margin-top: 1rem; + } - .md\:block { - display: block; - } + .md\:block { + display: block; + } - .md\:grid { - display: grid; - } + .md\:grid { + display: grid; + } - .md\:hidden { - display: none; - } + .md\:hidden { + display: none; + } - .md\:h-12 { - height: 3rem; - } + .md\:h-12 { + height: 3rem; + } - .md\:max-h-65vh { - max-height: 65vh; - } + .md\:max-h-65vh { + max-height: 65vh; + } - .md\:w-auto { - width: auto; - } + .md\:w-auto { + width: auto; + } - .md\:w-max { - width: -webkit-max-content; - width: -moz-max-content; - width: max-content; - } + .md\:w-max { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + } - .md\:grid-flow-row { - grid-auto-flow: row; - } + .md\:grid-flow-row { + grid-auto-flow: row; + } - .md\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } - .md\:flex-row { - flex-direction: row; - } + .md\:flex-row { + flex-direction: row; + } - .md\:rounded-xl { - border-radius: 0.75rem; - } + .md\:rounded-xl { + border-radius: 0.75rem; + } - .md\:p-1 { - padding: 0.25rem; - } + .md\:p-1 { + padding: 0.25rem; + } - .md\:p-2 { - padding: 0.5rem; - } + .md\:p-2 { + padding: 0.5rem; + } - .md\:p-4 { - padding: 1rem; - } + .md\:p-4 { + padding: 1rem; + } - .md\:p-3 { - padding: 0.75rem; - } + .md\:p-3 { + padding: 0.75rem; + } - .md\:pt-0 { - padding-top: 0px; - } + .md\:pt-0 { + padding-top: 0px; + } - .md\:pb-0 { - padding-bottom: 0px; - } + .md\:pb-0 { + padding-bottom: 0px; + } - .md\:pt-4 { - padding-top: 1rem; - } + .md\:pt-4 { + padding-top: 1rem; + } - .md\:text-2xl { - font-size: 1.5rem; - line-height: 2rem; - } + .md\:text-2xl { + font-size: 1.5rem; + line-height: 2rem; + } - .md\:text-6xl { - font-size: 3.75rem; - line-height: 1; - } + .md\:text-6xl { + font-size: 3.75rem; + line-height: 1; + } - .md\:text-xl { - font-size: 1.25rem; - line-height: 1.75rem; - } + .md\:text-xl { + font-size: 1.25rem; + line-height: 1.75rem; + } - .md\:w-160 { - width: 40rem; - } + .md\:w-160 { + width: 40rem; + } } @media (min-width: 1024px) { - .lg\:mx-0 { - margin-left: 0px; - margin-right: 0px; - } + .lg\:mx-0 { + margin-left: 0px; + margin-right: 0px; + } - .lg\:ml-40 { - margin-left: 10rem; - } + .lg\:ml-40 { + margin-left: 10rem; + } - .lg\:w-3\/4 { - width: 75%; - } + .lg\:w-3\/4 { + width: 75%; + } - .lg\:grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } + .lg\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } - .lg\:text-left { - text-align: left; - } + .lg\:text-left { + text-align: left; + } } @media (min-width: 1280px) { - .xl\:inline { - display: inline; - } + .xl\:inline { + display: inline; + } } diff --git a/index.css b/index.css index d72c0a3e6..746aceb30 100644 --- a/index.css +++ b/index.css @@ -20,7 +20,7 @@ .z-above-controls { z-index: 10001 } - + .w-160 { width: 40rem; } @@ -370,12 +370,12 @@ li::marker { opacity: 0; transform: rotate(-30deg); } - + 6% { opacity: 1; transform: rotate(-30deg); } - + 12% { opacity: 1; transform: rotate(-45deg); @@ -396,7 +396,7 @@ li::marker { opacity: 0; transform: rotate(-30deg); } - + 100% { opacity: 0; transform: rotate(-30deg); diff --git a/index.html b/index.html index 499018fe6..68e3f9fc4 100644 --- a/index.html +++ b/index.html @@ -11,8 +11,8 @@ - - + + diff --git a/index.manifest b/index.manifest index 1eb1aec3c..8a99d1fa0 100644 --- a/index.manifest +++ b/index.manifest @@ -1,66 +1,66 @@ { - "name": "index", - "short_name": "MapComplete", - "start_url": "index.html", - "display": "standalone", - "background_color": "#fff", - "description": "A thematic map viewer and editor based on OpenStreetMap", - "orientation": "portrait-primary, landscape-primary", - "icons": [ - { - "src": "assets/generated/svg_mapcomplete_logo72.png", - "sizes": "72x72", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo96.png", - "sizes": "96x96", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo120.png", - "sizes": "120x120", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo128.png", - "sizes": "128x128", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo144.png", - "sizes": "144x144", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo152.png", - "sizes": "152x152", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo180.png", - "sizes": "180x180", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo384.png", - "sizes": "384x384", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo512.png", - "sizes": "512x512", - "type": "image/png" - }, - { - "src": "./assets/svg/mapcomplete_logo.svg", - "sizes": "513x513", - "type": "image/svg" - } - ] -} \ No newline at end of file + "name": "index", + "short_name": "MapComplete", + "start_url": "index.html", + "display": "standalone", + "background_color": "#fff", + "description": "A thematic map viewer and editor based on OpenStreetMap", + "orientation": "portrait-primary, landscape-primary", + "icons": [ + { + "src": "assets/generated/svg_mapcomplete_logo72.png", + "sizes": "72x72", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo96.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo120.png", + "sizes": "120x120", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo128.png", + "sizes": "128x128", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo152.png", + "sizes": "152x152", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo180.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "./assets/svg/mapcomplete_logo.svg", + "sizes": "513x513", + "type": "image/svg" + } + ] + } \ No newline at end of file diff --git a/index.ts b/index.ts index dcf030c48..6496e1cdc 100644 --- a/index.ts +++ b/index.ts @@ -35,11 +35,11 @@ if (location.href.startsWith("http://buurtnatuur.be")) { class Init { public static Init(layoutToUse: LayoutConfig, encoded: string) { - if(layoutToUse === null){ + if (layoutToUse === null) { // Something went wrong, error message is already on screen return; } - + if (layoutToUse === undefined) { // No layout found new AllThemesGui() @@ -69,7 +69,7 @@ class Init { // This 'leaks' the global state via the window object, useful for debugging // @ts-ignore window.mapcomplete_state = State.state; - + new DefaultGUI(State.state, guiState) if (encoded !== undefined && encoded.length > 10) { diff --git a/langs/de.json b/langs/de.json index 72539a730..eb52de784 100644 --- a/langs/de.json +++ b/langs/de.json @@ -1,288 +1,288 @@ { - "image": { - "addPicture": "Bild hinzufügen", - "uploadingPicture": "Bild wird hochgeladen…", - "uploadingMultiple": "{count} Bilder hochladen…", - "pleaseLogin": "Bitte einloggen, um ein Bild hinzuzufügen", - "willBePublished": "Ihr Bild wird veröffentlicht: ", - "cco": "als 'Public Domain'", - "ccbs": "unter der 'CC-BY-SA-Lizenz'", - "ccb": "unter der 'CC-BY-Lizenz'", - "uploadFailed": "Wir konnten Ihr Bild nicht hochladen. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.", - "respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.", - "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!", - "dontDelete": "Abbrechen", - "doDelete": "Bild entfernen", - "isDeleted": "Gelöscht", - "uploadMultipleDone": "{count} Bilder wurden hinzugefügt. Vielen Dank für die Hilfe!", - "toBig": "Ihr Bild ist zu groß, da es {actual_size} ist. Bitte verwenden Sie Bilder von höchstens {max_size}" + "image": { + "addPicture": "Bild hinzufügen", + "uploadingPicture": "Bild wird hochgeladen…", + "uploadingMultiple": "{count} Bilder hochladen…", + "pleaseLogin": "Bitte einloggen, um ein Bild hinzuzufügen", + "willBePublished": "Ihr Bild wird veröffentlicht: ", + "cco": "als 'Public Domain'", + "ccbs": "unter der 'CC-BY-SA-Lizenz'", + "ccb": "unter der 'CC-BY-Lizenz'", + "uploadFailed": "Wir konnten Ihr Bild nicht hochladen. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.", + "respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.", + "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!", + "dontDelete": "Abbrechen", + "doDelete": "Bild entfernen", + "isDeleted": "Gelöscht", + "uploadMultipleDone": "{count} Bilder wurden hinzugefügt. Vielen Dank für die Hilfe!", + "toBig": "Ihr Bild ist zu groß, da es {actual_size} ist. Bitte verwenden Sie Bilder von höchstens {max_size}" + }, + "centerMessage": { + "loadingData": "Daten werden geladen…", + "zoomIn": "Ausschnitt vergrößern, um Daten anzuzeigen oder zu bearbeiten", + "ready": "Erledigt!", + "retrying": "Laden von Daten fehlgeschlagen. Erneuter Versuch in {count} Sekunden …" + }, + "index": { + "#": "Dieser Text wird über die Thema-Auswahlschaltfläche gezeigt, wenn kein Thema geladen ist", + "title": "Willkommen bei MapComplete", + "intro": "MapComplete ist eine OpenStreetMap-Anwendung, mit der Informationen zu Objekten eines bestimmten Themas angezeigt und angepasst werden können.", + "pickTheme": "Wähle unten ein Thema, um zu starten.", + "featuredThemeTitle": "Diese Woche im Blickpunkt" + }, + "general": { + "loginWithOpenStreetMap": "Bei OpenStreetMap anmelden", + "welcomeBack": "Sie sind eingeloggt, willkommen zurück!", + "loginToStart": "Anmelden, um diese Frage zu beantworten", + "search": { + "search": "Einen Ort suchen", + "searching": "Suchen …", + "nothing": "Nichts gefunden…", + "error": "Etwas ging schief…" }, - "centerMessage": { - "loadingData": "Daten werden geladen…", - "zoomIn": "Ausschnitt vergrößern, um Daten anzuzeigen oder zu bearbeiten", - "ready": "Erledigt!", - "retrying": "Laden von Daten fehlgeschlagen. Erneuter Versuch in {count} Sekunden …" + "returnToTheMap": "Zurück zur Karte", + "save": "Speichern", + "cancel": "Abbrechen", + "skip": "Frage überspringen", + "oneSkippedQuestion": "Eine Frage wurde übersprungen", + "skippedQuestions": "Einige Fragen wurden übersprungen", + "number": "Zahl", + "osmLinkTooltip": "Dieses Element auf OpenStreetMap durchsuchen für den Verlauf und weitere Bearbeitungsmöglichkeiten", + "add": { + "addNew": "Hier eine neue {category} hinzufügen", + "title": "Punkt hinzufügen?", + "intro": "Sie haben irgendwo geklickt, wo noch keine Daten bekannt sind.
", + "pleaseLogin": "Bitte loggen Sie sich ein, um einen neuen Punkt hinzuzufügen", + "zoomInFurther": "Weiter einzoomen, um einen Punkt hinzuzufügen.", + "stillLoading": "Die Daten werden noch geladen. Bitte warten Sie etwas, bevor Sie einen neuen Punkt hinzufügen.", + "confirmIntro": "

Hier einen {title} hinzufügen?

Der Punkt, den Sie hier anlegen, wird für alle sichtbar sein. Bitte fügen Sie der Karte nur dann Dinge hinzu, wenn sie wirklich existieren. Viele Anwendungen verwenden diese Daten.", + "confirmButton": "Fügen Sie hier eine {category} hinzu.
Ihre Ergänzung ist für alle sichtbar
", + "openLayerControl": "Das Ebenen-Kontrollkästchen öffnen", + "layerNotEnabled": "Die Ebene {layer} ist nicht aktiviert. Aktivieren Sie diese Ebene, um einen Punkt hinzuzufügen", + "addNewMapLabel": "Neues Element hinzufügen", + "presetInfo": "Der neue POI hat {tags}", + "disableFiltersExplanation": "Einige Elemente können durch einen Filter ausgeblendet sein", + "disableFilters": "Alle Filter deaktivieren", + "hasBeenImported": "Dieser Punkt wurde bereits importiert", + "zoomInMore": "Vergrößern Sie die Ansicht, um dieses Element zu importieren", + "warnVisibleForEveryone": "Ihre Ergänzung wird für alle sichtbar sein" }, - "index": { - "#": "Dieser Text wird über die Thema-Auswahlschaltfläche gezeigt, wenn kein Thema geladen ist", - "title": "Willkommen bei MapComplete", - "intro": "MapComplete ist eine OpenStreetMap-Anwendung, mit der Informationen zu Objekten eines bestimmten Themas angezeigt und angepasst werden können.", - "pickTheme": "Wähle unten ein Thema, um zu starten.", - "featuredThemeTitle": "Diese Woche im Blickpunkt" + "pickLanguage": "Sprache wählen: ", + "about": "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen", + "nameInlineQuestion": "Der Name dieser {category} ist $$$", + "noNameCategory": "{category} ohne Namen", + "questions": { + "phoneNumberOf": "Wie lautet die Telefonnummer der {category}?", + "phoneNumberIs": "Die Telefonnummer der {category} lautet {phone}", + "websiteOf": "Was ist die Website der {category}?", + "websiteIs": "Webseite: {website}", + "emailOf": "Wie lautet die E-Mail-Adresse der {category}?", + "emailIs": "Die E-Mail-Adresse dieser {category} lautet {email}" }, - "general": { - "loginWithOpenStreetMap": "Bei OpenStreetMap anmelden", - "welcomeBack": "Sie sind eingeloggt, willkommen zurück!", - "loginToStart": "Anmelden, um diese Frage zu beantworten", - "search": { - "search": "Einen Ort suchen", - "searching": "Suchen …", - "nothing": "Nichts gefunden…", - "error": "Etwas ging schief…" - }, - "returnToTheMap": "Zurück zur Karte", - "save": "Speichern", - "cancel": "Abbrechen", - "skip": "Frage überspringen", - "oneSkippedQuestion": "Eine Frage wurde übersprungen", - "skippedQuestions": "Einige Fragen wurden übersprungen", - "number": "Zahl", - "osmLinkTooltip": "Dieses Element auf OpenStreetMap durchsuchen für den Verlauf und weitere Bearbeitungsmöglichkeiten", - "add": { - "addNew": "Hier eine neue {category} hinzufügen", - "title": "Punkt hinzufügen?", - "intro": "Sie haben irgendwo geklickt, wo noch keine Daten bekannt sind.
", - "pleaseLogin": "Bitte loggen Sie sich ein, um einen neuen Punkt hinzuzufügen", - "zoomInFurther": "Weiter einzoomen, um einen Punkt hinzuzufügen.", - "stillLoading": "Die Daten werden noch geladen. Bitte warten Sie etwas, bevor Sie einen neuen Punkt hinzufügen.", - "confirmIntro": "

Hier einen {title} hinzufügen?

Der Punkt, den Sie hier anlegen, wird für alle sichtbar sein. Bitte fügen Sie der Karte nur dann Dinge hinzu, wenn sie wirklich existieren. Viele Anwendungen verwenden diese Daten.", - "confirmButton": "Fügen Sie hier eine {category} hinzu.
Ihre Ergänzung ist für alle sichtbar
", - "openLayerControl": "Das Ebenen-Kontrollkästchen öffnen", - "layerNotEnabled": "Die Ebene {layer} ist nicht aktiviert. Aktivieren Sie diese Ebene, um einen Punkt hinzuzufügen", - "addNewMapLabel": "Neues Element hinzufügen", - "presetInfo": "Der neue POI hat {tags}", - "disableFiltersExplanation": "Einige Elemente können durch einen Filter ausgeblendet sein", - "disableFilters": "Alle Filter deaktivieren", - "hasBeenImported": "Dieser Punkt wurde bereits importiert", - "zoomInMore": "Vergrößern Sie die Ansicht, um dieses Element zu importieren", - "warnVisibleForEveryone": "Ihre Ergänzung wird für alle sichtbar sein" - }, - "pickLanguage": "Sprache wählen: ", - "about": "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen", - "nameInlineQuestion": "Der Name dieser {category} ist $$$", - "noNameCategory": "{category} ohne Namen", - "questions": { - "phoneNumberOf": "Wie lautet die Telefonnummer der {category}?", - "phoneNumberIs": "Die Telefonnummer der {category} lautet {phone}", - "websiteOf": "Was ist die Website der {category}?", - "websiteIs": "Webseite: {website}", - "emailOf": "Wie lautet die E-Mail-Adresse der {category}?", - "emailIs": "Die E-Mail-Adresse dieser {category} lautet {email}" - }, - "openStreetMapIntro": "

Eine freie Karte

Wäre es nicht toll, wenn es eine freie Karte gäbe, die von jedem angepasst und genutzt werden könnte? Eine Karte, zu der jeder Informationen hinzufügen kann? Dann bräuchte man all diese Webseiten mit unterschiedlichen, eingeschränkten und veralteten Karten nicht mehr.

OpenStreetMap ist diese freie Karte. Alle Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Webseite basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.

Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram, ...<br/>Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!

Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.

", - "sharescreen": { - "intro": "

Diese Karte teilen

Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:", - "addToHomeScreen": "

Zum Startbildschirm hinzufügen

Sie können diese Webseite zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der Adressleiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.", - "embedIntro": "

Auf Ihrer Website einbetten

Bitte betten Sie diese Karte in Ihre Webseite ein.
Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen.
Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie.", - "copiedToClipboard": "Link in die Zwischenablage kopiert", - "thanksForSharing": "Danke für das Teilen!", - "editThisTheme": "Dieses Thema bearbeiten", - "editThemeDescription": "Fragen zu diesem Kartenthema hinzufügen oder ändern", - "fsUserbadge": "Anmelde-Knopf aktivieren", - "fsSearch": "Suchleiste aktivieren", - "fsWelcomeMessage": "Popup der Begrüßungsnachricht und zugehörige Registerkarten anzeigen", - "fsLayers": "Aktivieren der Layersteuerung", - "fsLayerControlToggle": "Mit der erweiterten Ebenenkontrolle beginnen", - "fsAddNew": "Schaltfläche 'neuen POI hinzufügen' aktivieren", - "fsGeolocation": "Die Schaltfläche 'Mich geolokalisieren' aktivieren (nur für Mobil)", - "fsIncludeCurrentBackgroundMap": "Die aktuelle Hintergrundwahl einschließen {name}", - "fsIncludeCurrentLayers": "Die aktuelle Ebenenauswahl einbeziehen", - "fsIncludeCurrentLocation": "Aktuelle Position einbeziehen" - }, - "morescreen": { - "intro": "

Mehr thematische Karten?

Sammeln Sie gerne Geodaten?
Es sind weitere Themen verfügbar.", - "requestATheme": "Wenn Sie ein benutzerdefiniertes Thema wünschen, fordern Sie es im Issue Tracker an", - "streetcomplete": "Eine andere, ähnliche Anwendung ist StreetComplete.", - "createYourOwnTheme": "Erstellen Sie Ihr eigenes MapComplete-Thema von Grund auf neu", - "previouslyHiddenTitle": "Zuvor besuchte versteckte Themen", - "hiddenExplanation": "Diese Themen sind nur für Personen zugänglich, die einen Link erhalten haben. Sie haben {hidden_discovered} von {total_hidden} versteckten Themen entdeckt." - }, - "readYourMessages": "Bitte lesen Sie alle Ihre OpenStreetMap-Nachrichten, bevor Sie einen neuen Punkt hinzufügen.", - "fewChangesBefore": "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen.", - "goToInbox": "Posteingang öffnen", - "getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen", - "getStartedNewAccount": " oder ein neues Konto anlegen", - "noTagsSelected": "Keine Tags ausgewählt", - "customThemeIntro": "

Benutzerdefinierte Themes

Dies sind zuvor besuchte benutzergenerierte Themen.", - "aboutMapcomplete": "

Über MapComplete

Mit MapComplete können Sie OpenStreetMap mit Informationen zu einem einzigen Thema anreichern. Beantworten Sie ein paar Fragen, und innerhalb von Minuten werden Ihre Beiträge rund um den Globus verfügbar sein! Der Themen-Maintainer definiert Elemente, Fragen und Sprachen für das Thema.

Mehr erfahren

MapComplete bietet immer den nächsten Schritt, um mehr über OpenStreetMap zu erfahren.

  • Wenn es in eine Website eingebettet wird, verlinkt der Iframe zu einer Vollbildversion von MapComplete
  • Die Vollbildversion bietet Informationen über OpenStreetMap
  • Das Betrachten funktioniert ohne Login, aber das Bearbeiten erfordert ein OSM-Login.
  • Wenn Sie nicht eingeloggt sind, werden Sie aufgefordert, sich anzumelden
  • Nach der Beantwortung einer einzelnen Frage können Sie der Karte neue Punkte hinzufügen
  • Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt sind


Haben Sie ein Problem bemerkt? Haben Sie einen Funktionswunsch? Möchten Sie bei der Übersetzung helfen? Besuchen Sie den Quellcode oder den Issue Tracker

Möchten Sie Ihren Fortschritt sehen? Verfolgen Sie die Anzahl der Änderungen auf OsmCha.

", - "backgroundMap": "Hintergrundkarte", - "layerSelection": { - "zoomInToSeeThisLayer": "Ausschnitt vergrößern, um diese Ebene anzuzeigen", - "title": "Ebenen auswählen" - }, - "weekdays": { - "abbreviations": { - "monday": "Mo", - "tuesday": "Di", - "wednesday": "Mi", - "thursday": "Do", - "friday": "Fr", - "saturday": "Sa", - "sunday": "So" - }, - "monday": "Montag", - "tuesday": "Dienstag", - "wednesday": "Mittwoch", - "thursday": "Donnerstag", - "friday": "Freitag", - "saturday": "Samstag", - "sunday": "Sonntag" - }, - "opening_hours": { - "error_loading": "Fehler: Diese Öffnungszeiten können nicht angezeigt werden.", - "open_during_ph": "An Feiertagen ist diese Einrichtung", - "opensAt": "von", - "openTill": "bis", - "not_all_rules_parsed": "Die Öffnungszeiten dieses Geschäfts sind abweichend. Die folgenden Regeln werden im Eingabeelement ignoriert:", - "closed_until": "Geschlossen bis {date}", - "closed_permanently": "Geschlossen auf unbestimmte Zeit", - "open_24_7": "Durchgehend geöffnet", - "ph_not_known": " ", - "ph_closed": "geschlossen", - "ph_open": "geöffnet", - "loadingCountry": "Land ermitteln…", - "ph_open_as_usual": "geöffnet wie üblich" - }, - "attribution": { - "mapContributionsByAndHidden": "Die aktuell sichtbaren Daten wurden editiert durch {contributors} und {hiddenCount} weitere Beitragende", - "mapContributionsBy": "Die aktuell sichtbaren Daten wurden editiert durch {contributors}", - "iconAttribution": { - "title": "Verwendete Icons" - }, - "attributionTitle": "Danksagung", - "codeContributionsBy": "MapComplete wurde von {contributors} und {hiddenCount} weiteren Beitragenden erstellt", - "themeBy": "Thema betreut von {author}", - "attributionContent": "

Alle Daten wurden bereitgestellt von OpenStreetMap, frei verwendbar unter der Open Database License.

" - }, - "download": { - "downloadCSVHelper": "Kompatibel mit LibreOffice Calc, Excel, …", - "downloadCSV": "Sichtbare Daten als CSV herunterladen", - "downloadAsPdfHelper": "Ideal zum Drucken der aktuellen Karte", - "downloadGeoJsonHelper": "Kompatibel mit QGIS, ArcGIS, ESRI, …", - "downloadAsPdf": "PDF der aktuellen Karte herunterladen", - "downloadGeojson": "Sichtbare Daten als GeoJSON herunterladen", - "includeMetaData": "Metadaten übernehmen (letzter Bearbeiter, berechnete Werte, ...)", - "noDataLoaded": "Noch keine Daten geladen. Download ist in Kürze verfügbar", - "licenseInfo": "

Copyright-Hinweis

Die bereitgestellten Daten sind unter ODbL verfügbar. Die Wiederverwendung ist für jeden Zweck frei, aber
  • die Namensnennung © OpenStreetMap contributors ist erforderlich
  • Jede Änderung unter der gleichen Lizenz veröffentlicht werden
Bitte lesen Sie den vollständigen Copyright-Hinweis für weitere Details.", - "title": "Sichtbare Daten herunterladen", - "exporting": "Exportieren…" - }, - "pdf": { - "versionInfo": "v{version} - erstellt am {date}", - "attr": "Kartendaten © OpenStreetMap Contributors, wiederverwendbar unter ODbL", - "generatedWith": "Erstellt mit MapComplete.osm.be", - "attrBackground": "Hintergrund-Ebene: {background}" - }, - "loginOnlyNeededToEdit": "zum Bearbeiten der Karte", - "wikipedia": { - "wikipediaboxTitle": "Wikipedia", - "searchWikidata": "Suche auf Wikidata", - "loading": "Wikipedia laden...", - "noResults": "Nichts gefunden für {search}", - "doSearch": "Suche oben, um Ergebnisse zu sehen", - "noWikipediaPage": "Dieses Wikidata-Element hat noch keine entsprechende Wikipedia-Seite.", - "createNewWikidata": "Einen neuen Wikidata-Eintrag erstellen", - "failed": "Laden des Wikipedia-Eintrags fehlgeschlagen" - }, - "testing": "Testen - Änderungen werden nicht gespeichert", - "openTheMap": "Karte öffnen", - "loading": "Laden...", - "histogram": { - "error_loading": "Das Histogramm konnte nicht geladen werden" - } + "openStreetMapIntro": "

Eine freie Karte

Wäre es nicht toll, wenn es eine freie Karte gäbe, die von jedem angepasst und genutzt werden könnte? Eine Karte, zu der jeder Informationen hinzufügen kann? Dann bräuchte man all diese Webseiten mit unterschiedlichen, eingeschränkten und veralteten Karten nicht mehr.

OpenStreetMap ist diese freie Karte. Alle Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Webseite basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.

Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram, ...<br/>Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!

Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.

", + "sharescreen": { + "intro": "

Diese Karte teilen

Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:", + "addToHomeScreen": "

Zum Startbildschirm hinzufügen

Sie können diese Webseite zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der Adressleiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.", + "embedIntro": "

Auf Ihrer Website einbetten

Bitte betten Sie diese Karte in Ihre Webseite ein.
Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen.
Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie.", + "copiedToClipboard": "Link in die Zwischenablage kopiert", + "thanksForSharing": "Danke für das Teilen!", + "editThisTheme": "Dieses Thema bearbeiten", + "editThemeDescription": "Fragen zu diesem Kartenthema hinzufügen oder ändern", + "fsUserbadge": "Anmelde-Knopf aktivieren", + "fsSearch": "Suchleiste aktivieren", + "fsWelcomeMessage": "Popup der Begrüßungsnachricht und zugehörige Registerkarten anzeigen", + "fsLayers": "Aktivieren der Layersteuerung", + "fsLayerControlToggle": "Mit der erweiterten Ebenenkontrolle beginnen", + "fsAddNew": "Schaltfläche 'neuen POI hinzufügen' aktivieren", + "fsGeolocation": "Die Schaltfläche 'Mich geolokalisieren' aktivieren (nur für Mobil)", + "fsIncludeCurrentBackgroundMap": "Die aktuelle Hintergrundwahl einschließen {name}", + "fsIncludeCurrentLayers": "Die aktuelle Ebenenauswahl einbeziehen", + "fsIncludeCurrentLocation": "Aktuelle Position einbeziehen" }, - "favourite": { - "panelIntro": "

Ihr persönliches Thema

Aktivieren Sie Ihre Lieblingsebenen aus allen offiziellen Themen", - "loginNeeded": "

Anmelden

Ein persönliches Layout ist nur für OpenStreetMap-Benutzer verfügbar", - "reload": "Daten neu laden" + "morescreen": { + "intro": "

Mehr thematische Karten?

Sammeln Sie gerne Geodaten?
Es sind weitere Themen verfügbar.", + "requestATheme": "Wenn Sie ein benutzerdefiniertes Thema wünschen, fordern Sie es im Issue Tracker an", + "streetcomplete": "Eine andere, ähnliche Anwendung ist StreetComplete.", + "createYourOwnTheme": "Erstellen Sie Ihr eigenes MapComplete-Thema von Grund auf neu", + "previouslyHiddenTitle": "Zuvor besuchte versteckte Themen", + "hiddenExplanation": "Diese Themen sind nur für Personen zugänglich, die einen Link erhalten haben. Sie haben {hidden_discovered} von {total_hidden} versteckten Themen entdeckt." }, - "reviews": { - "title": "{count} Rezensionen", - "title_singular": "Eine Rezension", - "name_required": "Der Name des Objekts ist notwendig, um eine Bewertung erstellen zu können", - "no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!", - "write_a_comment": "Schreibe einen Kommentar…", - "no_rating": "Keine Bewertung vorhanden", - "posting_as": "Angemeldet als", - "i_am_affiliated": "Ich bin angehörig
Überprüfe, ob du Eigentümer, Ersteller, Angestellter etc. bist", - "saving_review": "Speichern…", - "saved": "Bewertung gespeichert. Danke fürs Teilen!", - "tos": "Mit deiner Rezension stimmst du den AGB und den Datenschutzrichtlinien von Mangrove.reviews zu", - "plz_login": "Anmelden, um eine Bewertung abzugeben", - "affiliated_reviewer_warning": "(Partner-Rezension)", - "attribution": "Rezensionen werden bereitgestellt von Mangrove Reviews und sind unter CC-BY 4.0 verfügbar." + "readYourMessages": "Bitte lesen Sie alle Ihre OpenStreetMap-Nachrichten, bevor Sie einen neuen Punkt hinzufügen.", + "fewChangesBefore": "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen.", + "goToInbox": "Posteingang öffnen", + "getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen", + "getStartedNewAccount": " oder ein neues Konto anlegen", + "noTagsSelected": "Keine Tags ausgewählt", + "customThemeIntro": "

Benutzerdefinierte Themes

Dies sind zuvor besuchte benutzergenerierte Themen.", + "aboutMapcomplete": "

Über MapComplete

Mit MapComplete können Sie OpenStreetMap mit Informationen zu einem einzigen Thema anreichern. Beantworten Sie ein paar Fragen, und innerhalb von Minuten werden Ihre Beiträge rund um den Globus verfügbar sein! Der Themen-Maintainer definiert Elemente, Fragen und Sprachen für das Thema.

Mehr erfahren

MapComplete bietet immer den nächsten Schritt, um mehr über OpenStreetMap zu erfahren.

  • Wenn es in eine Website eingebettet wird, verlinkt der Iframe zu einer Vollbildversion von MapComplete
  • Die Vollbildversion bietet Informationen über OpenStreetMap
  • Das Betrachten funktioniert ohne Login, aber das Bearbeiten erfordert ein OSM-Login.
  • Wenn Sie nicht eingeloggt sind, werden Sie aufgefordert, sich anzumelden
  • Nach der Beantwortung einer einzelnen Frage können Sie der Karte neue Punkte hinzufügen
  • Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt sind


Haben Sie ein Problem bemerkt? Haben Sie einen Funktionswunsch? Möchten Sie bei der Übersetzung helfen? Besuchen Sie den Quellcode oder den Issue Tracker

Möchten Sie Ihren Fortschritt sehen? Verfolgen Sie die Anzahl der Änderungen auf OsmCha.

", + "backgroundMap": "Hintergrundkarte", + "layerSelection": { + "zoomInToSeeThisLayer": "Ausschnitt vergrößern, um diese Ebene anzuzeigen", + "title": "Ebenen auswählen" }, - "delete": { - "explanations": { - "selectReason": "Bitte wähle aus, warum dieses Element gelöscht werden soll", - "hardDelete": "Dieser Punkt wird in OpenStreetMap gelöscht. Er kann von einem erfahrenen Mitwirkenden wiederhergestellt werden", - "softDelete": "Dieses Element wird aktualisiert und in dieser Anwendung ausgeblendet. {reason}" - }, - "reasons": { - "test": "Dies war ein Testpunkt - das Element war nie wirklich vorhanden", - "notFound": "Dieses Element konnte nicht gefunden werden", - "disused": "Dieses Element wird nicht mehr verwendet oder entfernt", - "duplicate": "Dieser Punkt ist ein Duplikat eines anderen Elements" - }, - "readMessages": "Du hast ungelesene Nachrichten. Bitte beachte diese, bevor Du einen Punkt löschst - vielleicht hat jemand eine Rückmeldung", - "loginToDelete": "Sie müssen angemeldet sein, um einen Punkt zu löschen", - "useSomethingElse": "Verwenden Sie zum Löschen stattdessen einen anderen OpenStreetMap-Editor", - "partOfOthers": "Dieser Punkt ist Teil eines Weges oder einer Relation und kann nicht direkt gelöscht werden.", - "loading": "Untersuchung der Eigenschaften, um zu prüfen, ob dieses Element gelöscht werden kann.", - "onlyEditedByLoggedInUser": "Dieser Punkt wurde nur von Ihnen selbst bearbeitet, Sie können ihn sicher löschen.", - "isntAPoint": "Es können nur Punkte gelöscht werden, das ausgewählte Element ist ein Weg, eine Fläche oder eine Relation.", - "cannotBeDeleted": "Dieses Element kann nicht gelöscht werden", - "delete": "Löschen", - "isDeleted": "Dieses Element wurde gelöscht", - "whyDelete": "Warum sollte dieser Punkt gelöscht werden?", - "cancel": "Abbrechen", - "safeDelete": "Dieser Punkt kann sicher gelöscht werden.", - "notEnoughExperience": "Dieser Punkt wurde von jemand anderem erstellt." + "weekdays": { + "abbreviations": { + "monday": "Mo", + "tuesday": "Di", + "wednesday": "Mi", + "thursday": "Do", + "friday": "Fr", + "saturday": "Sa", + "sunday": "So" + }, + "monday": "Montag", + "tuesday": "Dienstag", + "wednesday": "Mittwoch", + "thursday": "Donnerstag", + "friday": "Freitag", + "saturday": "Samstag", + "sunday": "Sonntag" }, - "move": { - "inviteToMove": { - "reasonRelocation": "Dieses Element an einen anderen Ort verschieben, weil es sich verlagert hat", - "generic": "Verschiebe diesen Punkt", - "reasonInaccurate": "Genauigkeit dieses Punktes verbessern" - }, - "partOfAWay": "Dieses Element ist Teil eines anderen Weges. Verwenden Sie einen anderen Editor, um es zu verschieben.", - "cannotBeMoved": "Dieses Element kann nicht verschoben werden.", - "cancel": "Verschieben abbrechen", - "whyMove": "Warum wollen Sie diesen Punkt verschieben?", - "pointIsMoved": "Der Punkt wurde verschoben", - "reasons": { - "reasonRelocation": "Das Element wurde an einen völlig anderen Ort verlegt", - "reasonInaccurate": "Der Standort dieses Elements ist ungenau und sollte um einige Meter verschoben werden" - }, - "loginToMove": "Sie müssen eingeloggt sein, um einen Punkt zu verschieben", - "zoomInFurther": "Weiter vergrößern, um die Verschiebung zu bestätigen", - "selectReason": "Warum verschieben Sie dieses Element?", - "inviteToMoveAgain": "Diesen Punkt erneut verschieben", - "moveTitle": "Diesen Punkt verschieben", - "confirmMove": "Hierhin verschieben", - "partOfRelation": "Dieses Element ist Teil einer Relation. Verwenden Sie einen anderen Editor, um es zu verschieben.", - "isWay": "Dieses Element ist ein Weg. Verwenden Sie einen anderen OpenStreetMap-Editor, um ihn zu verschieben.", - "isRelation": "Dieses Element ist eine Relation und kann nicht verschoben werden" + "opening_hours": { + "error_loading": "Fehler: Diese Öffnungszeiten können nicht angezeigt werden.", + "open_during_ph": "An Feiertagen ist diese Einrichtung", + "opensAt": "von", + "openTill": "bis", + "not_all_rules_parsed": "Die Öffnungszeiten dieses Geschäfts sind abweichend. Die folgenden Regeln werden im Eingabeelement ignoriert:", + "closed_until": "Geschlossen bis {date}", + "closed_permanently": "Geschlossen auf unbestimmte Zeit", + "open_24_7": "Durchgehend geöffnet", + "ph_not_known": " ", + "ph_closed": "geschlossen", + "ph_open": "geöffnet", + "loadingCountry": "Land ermitteln…", + "ph_open_as_usual": "geöffnet wie üblich" }, - "split": { - "split": "Teilen", - "cancel": "Abbrechen", - "loginToSplit": "Sie müssen angemeldet sein, um eine Straße aufzuteilen", - "splitTitle": "Wählen Sie auf der Karte aus, wo die Straße geteilt werden soll", - "hasBeenSplit": "Dieser Weg wurde geteilt", - "inviteToSplit": "Teilen Sie diese Straße in kleinere Segmente auf. Dies ermöglicht es, Straßenabschnitten unterschiedliche Eigenschaften zu geben." + "attribution": { + "mapContributionsByAndHidden": "Die aktuell sichtbaren Daten wurden editiert durch {contributors} und {hiddenCount} weitere Beitragende", + "mapContributionsBy": "Die aktuell sichtbaren Daten wurden editiert durch {contributors}", + "iconAttribution": { + "title": "Verwendete Icons" + }, + "attributionTitle": "Danksagung", + "codeContributionsBy": "MapComplete wurde von {contributors} und {hiddenCount} weiteren Beitragenden erstellt", + "themeBy": "Thema betreut von {author}", + "attributionContent": "

Alle Daten wurden bereitgestellt von OpenStreetMap, frei verwendbar unter der Open Database License.

" }, - "multi_apply": { - "autoApply": "Wenn Sie die Attribute {attr_names} ändern, werden diese Attribute automatisch auch auf {count} anderen Objekten geändert" + "download": { + "downloadCSVHelper": "Kompatibel mit LibreOffice Calc, Excel, …", + "downloadCSV": "Sichtbare Daten als CSV herunterladen", + "downloadAsPdfHelper": "Ideal zum Drucken der aktuellen Karte", + "downloadGeoJsonHelper": "Kompatibel mit QGIS, ArcGIS, ESRI, …", + "downloadAsPdf": "PDF der aktuellen Karte herunterladen", + "downloadGeojson": "Sichtbare Daten als GeoJSON herunterladen", + "includeMetaData": "Metadaten übernehmen (letzter Bearbeiter, berechnete Werte, ...)", + "noDataLoaded": "Noch keine Daten geladen. Download ist in Kürze verfügbar", + "licenseInfo": "

Copyright-Hinweis

Die bereitgestellten Daten sind unter ODbL verfügbar. Die Wiederverwendung ist für jeden Zweck frei, aber
  • die Namensnennung © OpenStreetMap contributors ist erforderlich
  • Jede Änderung unter der gleichen Lizenz veröffentlicht werden
Bitte lesen Sie den vollständigen Copyright-Hinweis für weitere Details.", + "title": "Sichtbare Daten herunterladen", + "exporting": "Exportieren…" + }, + "pdf": { + "versionInfo": "v{version} - erstellt am {date}", + "attr": "Kartendaten © OpenStreetMap Contributors, wiederverwendbar unter ODbL", + "generatedWith": "Erstellt mit MapComplete.osm.be", + "attrBackground": "Hintergrund-Ebene: {background}" + }, + "loginOnlyNeededToEdit": "zum Bearbeiten der Karte", + "wikipedia": { + "wikipediaboxTitle": "Wikipedia", + "searchWikidata": "Suche auf Wikidata", + "loading": "Wikipedia laden...", + "noResults": "Nichts gefunden für {search}", + "doSearch": "Suche oben, um Ergebnisse zu sehen", + "noWikipediaPage": "Dieses Wikidata-Element hat noch keine entsprechende Wikipedia-Seite.", + "createNewWikidata": "Einen neuen Wikidata-Eintrag erstellen", + "failed": "Laden des Wikipedia-Eintrags fehlgeschlagen" + }, + "testing": "Testen - Änderungen werden nicht gespeichert", + "openTheMap": "Karte öffnen", + "loading": "Laden...", + "histogram": { + "error_loading": "Das Histogramm konnte nicht geladen werden" } + }, + "favourite": { + "panelIntro": "

Ihr persönliches Thema

Aktivieren Sie Ihre Lieblingsebenen aus allen offiziellen Themen", + "loginNeeded": "

Anmelden

Ein persönliches Layout ist nur für OpenStreetMap-Benutzer verfügbar", + "reload": "Daten neu laden" + }, + "reviews": { + "title": "{count} Rezensionen", + "title_singular": "Eine Rezension", + "name_required": "Der Name des Objekts ist notwendig, um eine Bewertung erstellen zu können", + "no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!", + "write_a_comment": "Schreibe einen Kommentar…", + "no_rating": "Keine Bewertung vorhanden", + "posting_as": "Angemeldet als", + "i_am_affiliated": "Ich bin angehörig
Überprüfe, ob du Eigentümer, Ersteller, Angestellter etc. bist", + "saving_review": "Speichern…", + "saved": "Bewertung gespeichert. Danke fürs Teilen!", + "tos": "Mit deiner Rezension stimmst du den AGB und den Datenschutzrichtlinien von Mangrove.reviews zu", + "plz_login": "Anmelden, um eine Bewertung abzugeben", + "affiliated_reviewer_warning": "(Partner-Rezension)", + "attribution": "Rezensionen werden bereitgestellt von Mangrove Reviews und sind unter CC-BY 4.0 verfügbar." + }, + "delete": { + "explanations": { + "selectReason": "Bitte wähle aus, warum dieses Element gelöscht werden soll", + "hardDelete": "Dieser Punkt wird in OpenStreetMap gelöscht. Er kann von einem erfahrenen Mitwirkenden wiederhergestellt werden", + "softDelete": "Dieses Element wird aktualisiert und in dieser Anwendung ausgeblendet. {reason}" + }, + "reasons": { + "test": "Dies war ein Testpunkt - das Element war nie wirklich vorhanden", + "notFound": "Dieses Element konnte nicht gefunden werden", + "disused": "Dieses Element wird nicht mehr verwendet oder entfernt", + "duplicate": "Dieser Punkt ist ein Duplikat eines anderen Elements" + }, + "readMessages": "Du hast ungelesene Nachrichten. Bitte beachte diese, bevor Du einen Punkt löschst - vielleicht hat jemand eine Rückmeldung", + "loginToDelete": "Sie müssen angemeldet sein, um einen Punkt zu löschen", + "useSomethingElse": "Verwenden Sie zum Löschen stattdessen einen anderen OpenStreetMap-Editor", + "partOfOthers": "Dieser Punkt ist Teil eines Weges oder einer Relation und kann nicht direkt gelöscht werden.", + "loading": "Untersuchung der Eigenschaften, um zu prüfen, ob dieses Element gelöscht werden kann.", + "onlyEditedByLoggedInUser": "Dieser Punkt wurde nur von Ihnen selbst bearbeitet, Sie können ihn sicher löschen.", + "isntAPoint": "Es können nur Punkte gelöscht werden, das ausgewählte Element ist ein Weg, eine Fläche oder eine Relation.", + "cannotBeDeleted": "Dieses Element kann nicht gelöscht werden", + "delete": "Löschen", + "isDeleted": "Dieses Element wurde gelöscht", + "whyDelete": "Warum sollte dieser Punkt gelöscht werden?", + "cancel": "Abbrechen", + "safeDelete": "Dieser Punkt kann sicher gelöscht werden.", + "notEnoughExperience": "Dieser Punkt wurde von jemand anderem erstellt." + }, + "move": { + "inviteToMove": { + "reasonRelocation": "Dieses Element an einen anderen Ort verschieben, weil es sich verlagert hat", + "generic": "Verschiebe diesen Punkt", + "reasonInaccurate": "Genauigkeit dieses Punktes verbessern" + }, + "partOfAWay": "Dieses Element ist Teil eines anderen Weges. Verwenden Sie einen anderen Editor, um es zu verschieben.", + "cannotBeMoved": "Dieses Element kann nicht verschoben werden.", + "cancel": "Verschieben abbrechen", + "whyMove": "Warum wollen Sie diesen Punkt verschieben?", + "pointIsMoved": "Der Punkt wurde verschoben", + "reasons": { + "reasonRelocation": "Das Element wurde an einen völlig anderen Ort verlegt", + "reasonInaccurate": "Der Standort dieses Elements ist ungenau und sollte um einige Meter verschoben werden" + }, + "loginToMove": "Sie müssen eingeloggt sein, um einen Punkt zu verschieben", + "zoomInFurther": "Weiter vergrößern, um die Verschiebung zu bestätigen", + "selectReason": "Warum verschieben Sie dieses Element?", + "inviteToMoveAgain": "Diesen Punkt erneut verschieben", + "moveTitle": "Diesen Punkt verschieben", + "confirmMove": "Hierhin verschieben", + "partOfRelation": "Dieses Element ist Teil einer Relation. Verwenden Sie einen anderen Editor, um es zu verschieben.", + "isWay": "Dieses Element ist ein Weg. Verwenden Sie einen anderen OpenStreetMap-Editor, um ihn zu verschieben.", + "isRelation": "Dieses Element ist eine Relation und kann nicht verschoben werden" + }, + "split": { + "split": "Teilen", + "cancel": "Abbrechen", + "loginToSplit": "Sie müssen angemeldet sein, um eine Straße aufzuteilen", + "splitTitle": "Wählen Sie auf der Karte aus, wo die Straße geteilt werden soll", + "hasBeenSplit": "Dieser Weg wurde geteilt", + "inviteToSplit": "Teilen Sie diese Straße in kleinere Segmente auf. Dies ermöglicht es, Straßenabschnitten unterschiedliche Eigenschaften zu geben." + }, + "multi_apply": { + "autoApply": "Wenn Sie die Attribute {attr_names} ändern, werden diese Attribute automatisch auch auf {count} anderen Objekten geändert" + } } diff --git a/langs/en.json b/langs/en.json index e93a28ade..d414af49c 100644 --- a/langs/en.json +++ b/langs/en.json @@ -1,301 +1,301 @@ { - "image": { - "addPicture": "Add picture", - "uploadingPicture": "Uploading your picture…", - "uploadingMultiple": "Uploading {count} pictures…", - "pleaseLogin": "Please log in to add a picture", - "willBePublished": "Your picture will be published: ", - "cco": "in the public domain", - "ccbs": "under the CC-BY-SA-license", - "ccb": "under the CC-BY-license", - "uploadFailed": "Could not upload your picture. Are you connected to the Internet, and allow third party API's? The Brave browser or the uMatrix plugin might block them.", - "respectPrivacy": "Do not photograph people nor license plates. Do not upload Google Maps, Google Streetview or other copyrighted sources.", - "uploadDone": "Your picture has been added. Thanks for helping out!", - "uploadMultipleDone": "{count} pictures have been added. Thanks for helping out!", - "dontDelete": "Cancel", - "doDelete": "Remove image", - "isDeleted": "Deleted", - "toBig": "Your image is too large as it is {actual_size}. Please use images of at most {max_size}" + "image": { + "addPicture": "Add picture", + "uploadingPicture": "Uploading your picture…", + "uploadingMultiple": "Uploading {count} pictures…", + "pleaseLogin": "Please log in to add a picture", + "willBePublished": "Your picture will be published: ", + "cco": "in the public domain", + "ccbs": "under the CC-BY-SA-license", + "ccb": "under the CC-BY-license", + "uploadFailed": "Could not upload your picture. Are you connected to the Internet, and allow third party API's? The Brave browser or the uMatrix plugin might block them.", + "respectPrivacy": "Do not photograph people nor license plates. Do not upload Google Maps, Google Streetview or other copyrighted sources.", + "uploadDone": "Your picture has been added. Thanks for helping out!", + "uploadMultipleDone": "{count} pictures have been added. Thanks for helping out!", + "dontDelete": "Cancel", + "doDelete": "Remove image", + "isDeleted": "Deleted", + "toBig": "Your image is too large as it is {actual_size}. Please use images of at most {max_size}" + }, + "centerMessage": { + "loadingData": "Loading data…", + "zoomIn": "Zoom in to view or edit the data", + "ready": "Done!", + "retrying": "Loading data failed. Trying again in {count} seconds…" + }, + "index": { + "#": "These texts are shown above the theme buttons when no theme is loaded", + "title": "Welcome to MapComplete", + "featuredThemeTitle": "Featured this week", + "intro": "MapComplete is an OpenStreetMap-viewer and editor, which shows you information about features of a specific theme and allows to update it.", + "pickTheme": "Pick a theme below to get started." + }, + "split": { + "split": "Split", + "cancel": "Cancel", + "inviteToSplit": "Split this road in smaller segments. This allows to give different properties to parts of the road.", + "loginToSplit": "You must be logged in to split a road", + "splitTitle": "Choose on the map where to split this road", + "hasBeenSplit": "This way has been split" + }, + "delete": { + "delete": "Delete", + "cancel": "Cancel", + "isDeleted": "This feature is deleted", + "cannotBeDeleted": "This feature can not be deleted", + "loginToDelete": "You must be logged in to delete a point", + "safeDelete": "This point can be safely deleted.", + "isntAPoint": "Only points can be deleted, the selected feature is a way, area or relation.", + "onlyEditedByLoggedInUser": "This point has only be edited by yourself, you can safely delete it.", + "notEnoughExperience": "This point was made by someone else.", + "useSomethingElse": "Use another OpenStreetMap-editor to delete it instead", + "partOfOthers": "This point is part of some way or relation and can not be deleted directly.", + "loading": "Inspecting properties to check if this feature can be deleted.", + "whyDelete": "Why should this point be deleted?", + "reasons": { + "test": "This was a testing point - the feature was never actually there", + "disused": "This feature is disused or removed", + "notFound": "This feature couldn't be found", + "duplicate": "This point is a duplicate of another feature" }, - "centerMessage": { - "loadingData": "Loading data…", - "zoomIn": "Zoom in to view or edit the data", - "ready": "Done!", - "retrying": "Loading data failed. Trying again in {count} seconds…" + "explanations": { + "selectReason": "Please, select why this feature should be deleted", + "hardDelete": "This point will be deleted in OpenStreetMap. It can be recovered by an experienced contributor", + "softDelete": "This feature will be updated and hidden from this application. {reason}" }, - "index": { - "#": "These texts are shown above the theme buttons when no theme is loaded", - "title": "Welcome to MapComplete", - "featuredThemeTitle": "Featured this week", - "intro": "MapComplete is an OpenStreetMap-viewer and editor, which shows you information about features of a specific theme and allows to update it.", - "pickTheme": "Pick a theme below to get started." + "readMessages": "You have unread messages. Read these before deleting a point - someone might have feedback" + }, + "general": { + "loading": "Loading...", + "pdf": { + "generatedWith": "Generated with MapComplete.osm.be", + "attr": "Map data © OpenStreetMap Contributors, reusable under ODbL", + "attrBackground": "Background layer: {background}", + "versionInfo": "v{version} - generated on {date}" }, - "split": { - "split": "Split", - "cancel": "Cancel", - "inviteToSplit": "Split this road in smaller segments. This allows to give different properties to parts of the road.", - "loginToSplit": "You must be logged in to split a road", - "splitTitle": "Choose on the map where to split this road", - "hasBeenSplit": "This way has been split" + "loginWithOpenStreetMap": "Login with OpenStreetMap", + "welcomeBack": "You are logged in, welcome back!", + "loginToStart": "Log in to answer this question", + "openStreetMapIntro": "

An Open Map

One that everyone can use and edit freely. A single place to store all geo-info. Different, small, incompatible and outdated maps are not needed anywhere.

OpenStreetMap is not the enemy map. The map data can be used freely (with attribution and publication of changes to that data). Everyone can add new data and fix errors. This website uses OpenStreetMap. All the data is from there, and your answers and corrections are used all over.

Many people and apps already use OpenStreetMap: Organic Maps, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap.

", + "search": { + "search": "Search a location", + "searching": "Searching…", + "nothing": "Nothing found…", + "error": "Something went wrong…" }, - "delete": { - "delete": "Delete", - "cancel": "Cancel", - "isDeleted": "This feature is deleted", - "cannotBeDeleted": "This feature can not be deleted", - "loginToDelete": "You must be logged in to delete a point", - "safeDelete": "This point can be safely deleted.", - "isntAPoint": "Only points can be deleted, the selected feature is a way, area or relation.", - "onlyEditedByLoggedInUser": "This point has only be edited by yourself, you can safely delete it.", - "notEnoughExperience": "This point was made by someone else.", - "useSomethingElse": "Use another OpenStreetMap-editor to delete it instead", - "partOfOthers": "This point is part of some way or relation and can not be deleted directly.", - "loading": "Inspecting properties to check if this feature can be deleted.", - "whyDelete": "Why should this point be deleted?", - "reasons": { - "test": "This was a testing point - the feature was never actually there", - "disused": "This feature is disused or removed", - "notFound": "This feature couldn't be found", - "duplicate": "This point is a duplicate of another feature" - }, - "explanations": { - "selectReason": "Please, select why this feature should be deleted", - "hardDelete": "This point will be deleted in OpenStreetMap. It can be recovered by an experienced contributor", - "softDelete": "This feature will be updated and hidden from this application. {reason}" - }, - "readMessages": "You have unread messages. Read these before deleting a point - someone might have feedback" + "returnToTheMap": "Return to the map", + "save": "Save", + "cancel": "Cancel", + "skip": "Skip this question", + "oneSkippedQuestion": "One question is skipped", + "skippedQuestions": "Some questions are skipped", + "number": "number", + "osmLinkTooltip": "Browse this object on OpenStreetMap for history and more editing options", + "add": { + "addNewMapLabel": "Add new item", + "disableFiltersExplanation": "Some features might be hidden by a filter", + "disableFilters": "Disable all filters", + "addNew": "Add a new {category} here", + "presetInfo": "The new POI will have {tags}", + "warnVisibleForEveryone": "Your addition will be visible for everyone", + "title": "Add a new point?", + "intro": "You clicked somewhere where no data is known yet.
", + "pleaseLogin": "Please log in to add a new point", + "zoomInFurther": "Zoom in further to add a point.", + "stillLoading": "The data is still loading. Please wait a bit before you add a new point.", + "confirmIntro": "

Add a {title} here?

The point you create here will be visible for everyone. Please, only add things on to the map if they truly exist. A lot of applications use this data.", + "confirmButton": "Add a {category} here.
Your addition is visible for everyone
", + "openLayerControl": "Open the layer control box", + "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point", + "hasBeenImported": "This point has already been imported", + "zoomInMore": "Zoom in more to import this feature", + "wrongType": "This element is not a point or a way and can not be imported" }, - "general": { - "loading": "Loading...", - "pdf": { - "generatedWith": "Generated with MapComplete.osm.be", - "attr": "Map data © OpenStreetMap Contributors, reusable under ODbL", - "attrBackground": "Background layer: {background}", - "versionInfo": "v{version} - generated on {date}" - }, - "loginWithOpenStreetMap": "Login with OpenStreetMap", - "welcomeBack": "You are logged in, welcome back!", - "loginToStart": "Log in to answer this question", - "openStreetMapIntro": "

An Open Map

One that everyone can use and edit freely. A single place to store all geo-info. Different, small, incompatible and outdated maps are not needed anywhere.

OpenStreetMap is not the enemy map. The map data can be used freely (with attribution and publication of changes to that data). Everyone can add new data and fix errors. This website uses OpenStreetMap. All the data is from there, and your answers and corrections are used all over.

Many people and apps already use OpenStreetMap: Organic Maps, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap.

", - "search": { - "search": "Search a location", - "searching": "Searching…", - "nothing": "Nothing found…", - "error": "Something went wrong…" - }, - "returnToTheMap": "Return to the map", - "save": "Save", - "cancel": "Cancel", - "skip": "Skip this question", - "oneSkippedQuestion": "One question is skipped", - "skippedQuestions": "Some questions are skipped", - "number": "number", - "osmLinkTooltip": "Browse this object on OpenStreetMap for history and more editing options", - "add": { - "addNewMapLabel": "Add new item", - "disableFiltersExplanation": "Some features might be hidden by a filter", - "disableFilters": "Disable all filters", - "addNew": "Add a new {category} here", - "presetInfo": "The new POI will have {tags}", - "warnVisibleForEveryone": "Your addition will be visible for everyone", - "title": "Add a new point?", - "intro": "You clicked somewhere where no data is known yet.
", - "pleaseLogin": "Please log in to add a new point", - "zoomInFurther": "Zoom in further to add a point.", - "stillLoading": "The data is still loading. Please wait a bit before you add a new point.", - "confirmIntro": "

Add a {title} here?

The point you create here will be visible for everyone. Please, only add things on to the map if they truly exist. A lot of applications use this data.", - "confirmButton": "Add a {category} here.
Your addition is visible for everyone
", - "openLayerControl": "Open the layer control box", - "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point", - "hasBeenImported": "This point has already been imported", - "zoomInMore": "Zoom in more to import this feature", - "wrongType": "This element is not a point or a way and can not be imported" - }, - "pickLanguage": "Choose a language: ", - "about": "Easily edit and add OpenStreetMap for a certain theme", - "nameInlineQuestion": "The name of this {category} is $$$", - "noNameCategory": "{category} without a name", - "questions": { - "phoneNumberOf": "What is the phone number of {category}?", - "phoneNumberIs": "The phone number of this {category} is {phone}", - "websiteOf": "What is the website of {category}?", - "websiteIs": "Website: {website}", - "emailOf": "What is the email address of {category}?", - "emailIs": "The email address of this {category} is {email}" - }, - "morescreen": { - "intro": "

More thematic maps?

Do you enjoy collecting geodata?
There are more themes available.", - "requestATheme": "If you want a custom-built theme, request it in the issue tracker", - "streetcomplete": "Another, similar application is StreetComplete.", - "createYourOwnTheme": "Create your own MapComplete theme from scratch", - "previouslyHiddenTitle": "Previously visited hidden themes", - "hiddenExplanation": "These themes are only accessible to those with the link. You have discovered {hidden_discovered} of {total_hidden} hidden themes." - }, - "sharescreen": { - "intro": "

Share this map

Share this map by copying the link below and sending it to friends and family:", - "addToHomeScreen": "

Add to your home screen

You can easily add this website to your smartphone home screen for a native feel. Click the 'Add to home screen' button in the URL bar to do this.", - "embedIntro": "

Embed on your website

Please, embed this map into your website.
We encourage you to do it - you don't even have to ask permission.
It is free, and always will be. The more people are using this, the more valuable it becomes.", - "copiedToClipboard": "Link copied to clipboard", - "thanksForSharing": "Thanks for sharing!", - "editThisTheme": "Edit this theme", - "editThemeDescription": "Add or change questions to this map theme", - "fsUserbadge": "Enable the login button", - "fsSearch": "Enable the search bar", - "fsWelcomeMessage": "Show the welcome message popup and associated tabs", - "fsLayers": "Enable the layer control", - "fsLayerControlToggle": "Start with the layer control expanded", - "fsAddNew": "Enable the 'add new POI' button", - "fsGeolocation": "Enable the 'geolocate-me' button (mobile only)", - "fsIncludeCurrentBackgroundMap": "Include the current background choice {name}", - "fsIncludeCurrentLayers": "Include the current layer choices", - "fsIncludeCurrentLocation": "Include current location" - }, - "attribution": { - "attributionTitle": "Attribution notice", - "attributionContent": "

All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.

", - "themeBy": "Theme maintained by {author}", - "iconAttribution": { - "title": "Used icons" - }, - "mapContributionsBy": "The current visible data has edits made by {contributors}", - "mapContributionsByAndHidden": "The current visible data has edits made by {contributors} and {hiddenCount} more contributors", - "codeContributionsBy": "MapComplete has been built by {contributors} and {hiddenCount} more contributors", - "openOsmcha": "See latest edits made with {theme}", - "openMapillary": "Open Mapillary here", - "openIssueTracker": "File a bug", - "josmOpened": "JOSM is opened", - "josmNotOpened": "JOSM could not be reached. Make sure it is opened and remote control is enabled", - "editJosm": "Edit here with JOSM", - "editId": "Open the OpenStreetMap online editor here", - "donate": "Support MapComplete financially" - }, - "readYourMessages": "Please, read all your OpenStreetMap-messages before adding a new point.", - "fewChangesBefore": "Please, answer a few questions of existing points before adding a new point.", - "goToInbox": "Open inbox", - "getStartedLogin": "Log in with OpenStreetMap to get started", - "getStartedNewAccount": " or create a new account", - "noTagsSelected": "No tags selected", - "testing": "Testing - changes won't be saved", - "customThemeIntro": "

Custom themes

These are previously visited user-generated themes.", - "aboutMapcomplete": "

About MapComplete

Use it to add OpenStreetMap info on a single theme. Answer questions, and within minutes your contributions are available everywhere. The theme maintainer defines elements, questions and languages for it.

Find out more

MapComplete always offers the next step to learn more about OpenStreetMap.

  • When embedded in a website, the iframe links to a full-screen MapComplete
  • The fullscreen version offers info about OpenStreetMap
  • Viewing works without login, but editing requires an OSM account.
  • If you are not logged in, you are asked to do so
  • Once you answered a single question, you can add new points to the map
  • After a while, actual OSM-tags are shown, later linking to the wiki


Did you notice an issue? Do you have a feature request? Want to help translate? Head over to the source code or issue tracker.

Want to see your progress? Follow the edit count on OsmCha.

", - "backgroundMap": "Background map", - "openTheMap": "Open the map", - "loginOnlyNeededToEdit": "if you want to edit the map", - "layerSelection": { - "zoomInToSeeThisLayer": "Zoom in to see this layer", - "title": "Select layers" - }, - "download": { - "title": "Download visible data", - "downloadAsPdf": "Download a PDF of the current map", - "downloadAsPdfHelper": "Ideal to print the current map", - "downloadGeojson": "Download visible data as GeoJSON", - "exporting": "Exporting…", - "downloadGeoJsonHelper": "Compatible with QGIS, ArcGIS, ESRI, …", - "downloadCSV": "Download visible data as CSV", - "downloadCSVHelper": "Compatible with LibreOffice Calc, Excel, …", - "includeMetaData": "Include metadata (last editor, calculated values, …)", - "licenseInfo": "

Copyright notice

The provided data is available under ODbL. Reusing it is gratis for any purpose, but
  • the attribution © OpenStreetMap contributors is required
  • Any change must be use the license
Please read the full copyright notice for details.", - "noDataLoaded": "No data is loaded yet. Download will be available soon" - }, - "weekdays": { - "abbreviations": { - "monday": "Mon", - "tuesday": "Tue", - "wednesday": "Wed", - "thursday": "Thu", - "friday": "Fri", - "saturday": "Sat", - "sunday": "Sun" - }, - "monday": "Monday", - "tuesday": "Tuesday", - "wednesday": "Wednesday", - "thursday": "Thursday", - "friday": "Friday", - "saturday": "Saturday", - "sunday": "Sunday" - }, - "opening_hours": { - "error_loading": "Error: could not visualize these opening hours.", - "open_during_ph": "During a public holiday, this is", - "opensAt": "from", - "openTill": "till", - "not_all_rules_parsed": "These opening hours are complicated. The following rules are ignored in the input element:", - "closed_until": "Closed until {date}", - "closed_permanently": "Closed for an unkown duration", - "open_24_7": "Opened around the clock", - "ph_not_known": " ", - "ph_closed": "closed", - "ph_open": "opened", - "ph_open_as_usual": "opened as usual", - "loadingCountry": "Determining country…" - }, - "histogram": { - "error_loading": "Could not load the histogram" - }, - "wikipedia": { - "wikipediaboxTitle": "Wikipedia", - "failed": "Loading the Wikipedia entry failed", - "loading": "Loading Wikipedia...", - "noWikipediaPage": "This Wikidata item has no corresponding Wikipedia page yet.", - "searchWikidata": "Search on Wikidata", - "noResults": "Nothing found for {search}", - "doSearch": "Search above to see results", - "createNewWikidata": "Create a new Wikidata item" - }, - "apply_button": { - "isApplied": "The changes are applied", - "appliedOnAnotherObject": "The object {id} will receive {tags}" - } + "pickLanguage": "Choose a language: ", + "about": "Easily edit and add OpenStreetMap for a certain theme", + "nameInlineQuestion": "The name of this {category} is $$$", + "noNameCategory": "{category} without a name", + "questions": { + "phoneNumberOf": "What is the phone number of {category}?", + "phoneNumberIs": "The phone number of this {category} is {phone}", + "websiteOf": "What is the website of {category}?", + "websiteIs": "Website: {website}", + "emailOf": "What is the email address of {category}?", + "emailIs": "The email address of this {category} is {email}" }, - "favourite": { - "panelIntro": "

Your personal theme

Activate your favourite layers from all the official themes", - "loginNeeded": "

Log in

A personal layout is only available for OpenStreetMap users", - "reload": "Reload the data" + "morescreen": { + "intro": "

More thematic maps?

Do you enjoy collecting geodata?
There are more themes available.", + "requestATheme": "If you want a custom-built theme, request it in the issue tracker", + "streetcomplete": "Another, similar application is StreetComplete.", + "createYourOwnTheme": "Create your own MapComplete theme from scratch", + "previouslyHiddenTitle": "Previously visited hidden themes", + "hiddenExplanation": "These themes are only accessible to those with the link. You have discovered {hidden_discovered} of {total_hidden} hidden themes." }, - "reviews": { - "title": "{count} reviews", - "title_singular": "One review", - "name_required": "A name is required in order to display and create reviews", - "no_reviews_yet": "There are no reviews yet. Be the first to write one and help open data and the business!", - "write_a_comment": "Leave a review…", - "no_rating": "No rating given", - "posting_as": "Posting as", - "i_am_affiliated": "I am affiliated with this object
Check if you are an owner, creator, employee, …", - "affiliated_reviewer_warning": "(Affiliated review)", - "saving_review": "Saving…", - "saved": "Review saved. Thanks for sharing!", - "tos": "If you create a review, you agree to the TOS and privacy policy of Mangrove.reviews", - "attribution": "Reviews are powered by Mangrove Reviews and are available under CC-BY 4.0.", - "plz_login": "Log in to leave a review" + "sharescreen": { + "intro": "

Share this map

Share this map by copying the link below and sending it to friends and family:", + "addToHomeScreen": "

Add to your home screen

You can easily add this website to your smartphone home screen for a native feel. Click the 'Add to home screen' button in the URL bar to do this.", + "embedIntro": "

Embed on your website

Please, embed this map into your website.
We encourage you to do it - you don't even have to ask permission.
It is free, and always will be. The more people are using this, the more valuable it becomes.", + "copiedToClipboard": "Link copied to clipboard", + "thanksForSharing": "Thanks for sharing!", + "editThisTheme": "Edit this theme", + "editThemeDescription": "Add or change questions to this map theme", + "fsUserbadge": "Enable the login button", + "fsSearch": "Enable the search bar", + "fsWelcomeMessage": "Show the welcome message popup and associated tabs", + "fsLayers": "Enable the layer control", + "fsLayerControlToggle": "Start with the layer control expanded", + "fsAddNew": "Enable the 'add new POI' button", + "fsGeolocation": "Enable the 'geolocate-me' button (mobile only)", + "fsIncludeCurrentBackgroundMap": "Include the current background choice {name}", + "fsIncludeCurrentLayers": "Include the current layer choices", + "fsIncludeCurrentLocation": "Include current location" }, - "multi_apply": { - "autoApply": "When changing the attributes {attr_names}, these attributes will automatically be changed on {count} other objects too" + "attribution": { + "attributionTitle": "Attribution notice", + "attributionContent": "

All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.

", + "themeBy": "Theme maintained by {author}", + "iconAttribution": { + "title": "Used icons" + }, + "mapContributionsBy": "The current visible data has edits made by {contributors}", + "mapContributionsByAndHidden": "The current visible data has edits made by {contributors} and {hiddenCount} more contributors", + "codeContributionsBy": "MapComplete has been built by {contributors} and {hiddenCount} more contributors", + "openOsmcha": "See latest edits made with {theme}", + "openMapillary": "Open Mapillary here", + "openIssueTracker": "File a bug", + "josmOpened": "JOSM is opened", + "josmNotOpened": "JOSM could not be reached. Make sure it is opened and remote control is enabled", + "editJosm": "Edit here with JOSM", + "editId": "Open the OpenStreetMap online editor here", + "donate": "Support MapComplete financially" }, - "move": { - "loginToMove": "You must be logged in to move a point", - "inviteToMoveAgain": "Move this point again", - "moveTitle": "Move this point", - "whyMove": "Why do you want to move this point?", - "confirmMove": "Move here", - "pointIsMoved": "The point has been moved", - "zoomInFurther": "Zoom in further to confirm this move", - "selectReason": "Why do you move this object?", - "reasons": { - "reasonRelocation": "The object has been relocated to a totally different location", - "reasonInaccurate": "The location of this object is inaccurate and should be moved a few meter" - }, - "inviteToMove": { - "generic": "Move this point", - "reasonInaccurate": "Improve the accuracy of this point", - "reasonRelocation": "Move this object to a another place because it has relocated" - }, - "cannotBeMoved": "This feature cannot be moved.", - "isWay": "This feature is a way. Use another OpenStreetMap editor to move it.", - "isRelation": "This feature is a relation and can not be moved", - "partOfAWay": "This feature is part of another way. Use another editor to move it.", - "partOfRelation": "This feature is part of a relation. Use another editor to move it.", - "cancel": "Cancel move" + "readYourMessages": "Please, read all your OpenStreetMap-messages before adding a new point.", + "fewChangesBefore": "Please, answer a few questions of existing points before adding a new point.", + "goToInbox": "Open inbox", + "getStartedLogin": "Log in with OpenStreetMap to get started", + "getStartedNewAccount": " or create a new account", + "noTagsSelected": "No tags selected", + "testing": "Testing - changes won't be saved", + "customThemeIntro": "

Custom themes

These are previously visited user-generated themes.", + "aboutMapcomplete": "

About MapComplete

Use it to add OpenStreetMap info on a single theme. Answer questions, and within minutes your contributions are available everywhere. The theme maintainer defines elements, questions and languages for it.

Find out more

MapComplete always offers the next step to learn more about OpenStreetMap.

  • When embedded in a website, the iframe links to a full-screen MapComplete
  • The fullscreen version offers info about OpenStreetMap
  • Viewing works without login, but editing requires an OSM account.
  • If you are not logged in, you are asked to do so
  • Once you answered a single question, you can add new points to the map
  • After a while, actual OSM-tags are shown, later linking to the wiki


Did you notice an issue? Do you have a feature request? Want to help translate? Head over to the source code or issue tracker.

Want to see your progress? Follow the edit count on OsmCha.

", + "backgroundMap": "Background map", + "openTheMap": "Open the map", + "loginOnlyNeededToEdit": "if you want to edit the map", + "layerSelection": { + "zoomInToSeeThisLayer": "Zoom in to see this layer", + "title": "Select layers" + }, + "download": { + "title": "Download visible data", + "downloadAsPdf": "Download a PDF of the current map", + "downloadAsPdfHelper": "Ideal to print the current map", + "downloadGeojson": "Download visible data as GeoJSON", + "exporting": "Exporting…", + "downloadGeoJsonHelper": "Compatible with QGIS, ArcGIS, ESRI, …", + "downloadCSV": "Download visible data as CSV", + "downloadCSVHelper": "Compatible with LibreOffice Calc, Excel, …", + "includeMetaData": "Include metadata (last editor, calculated values, …)", + "licenseInfo": "

Copyright notice

The provided data is available under ODbL. Reusing it is gratis for any purpose, but
  • the attribution © OpenStreetMap contributors is required
  • Any change must be use the license
Please read the full copyright notice for details.", + "noDataLoaded": "No data is loaded yet. Download will be available soon" + }, + "weekdays": { + "abbreviations": { + "monday": "Mon", + "tuesday": "Tue", + "wednesday": "Wed", + "thursday": "Thu", + "friday": "Fri", + "saturday": "Sat", + "sunday": "Sun" + }, + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday" + }, + "opening_hours": { + "error_loading": "Error: could not visualize these opening hours.", + "open_during_ph": "During a public holiday, this is", + "opensAt": "from", + "openTill": "till", + "not_all_rules_parsed": "These opening hours are complicated. The following rules are ignored in the input element:", + "closed_until": "Closed until {date}", + "closed_permanently": "Closed for an unkown duration", + "open_24_7": "Opened around the clock", + "ph_not_known": " ", + "ph_closed": "closed", + "ph_open": "opened", + "ph_open_as_usual": "opened as usual", + "loadingCountry": "Determining country…" + }, + "histogram": { + "error_loading": "Could not load the histogram" + }, + "wikipedia": { + "wikipediaboxTitle": "Wikipedia", + "failed": "Loading the Wikipedia entry failed", + "loading": "Loading Wikipedia...", + "noWikipediaPage": "This Wikidata item has no corresponding Wikipedia page yet.", + "searchWikidata": "Search on Wikidata", + "noResults": "Nothing found for {search}", + "doSearch": "Search above to see results", + "createNewWikidata": "Create a new Wikidata item" + }, + "apply_button": { + "isApplied": "The changes are applied", + "appliedOnAnotherObject": "The object {id} will receive {tags}" } + }, + "favourite": { + "panelIntro": "

Your personal theme

Activate your favourite layers from all the official themes", + "loginNeeded": "

Log in

A personal layout is only available for OpenStreetMap users", + "reload": "Reload the data" + }, + "reviews": { + "title": "{count} reviews", + "title_singular": "One review", + "name_required": "A name is required in order to display and create reviews", + "no_reviews_yet": "There are no reviews yet. Be the first to write one and help open data and the business!", + "write_a_comment": "Leave a review…", + "no_rating": "No rating given", + "posting_as": "Posting as", + "i_am_affiliated": "I am affiliated with this object
Check if you are an owner, creator, employee, …", + "affiliated_reviewer_warning": "(Affiliated review)", + "saving_review": "Saving…", + "saved": "Review saved. Thanks for sharing!", + "tos": "If you create a review, you agree to the TOS and privacy policy of Mangrove.reviews", + "attribution": "Reviews are powered by Mangrove Reviews and are available under CC-BY 4.0.", + "plz_login": "Log in to leave a review" + }, + "multi_apply": { + "autoApply": "When changing the attributes {attr_names}, these attributes will automatically be changed on {count} other objects too" + }, + "move": { + "loginToMove": "You must be logged in to move a point", + "inviteToMoveAgain": "Move this point again", + "moveTitle": "Move this point", + "whyMove": "Why do you want to move this point?", + "confirmMove": "Move here", + "pointIsMoved": "The point has been moved", + "zoomInFurther": "Zoom in further to confirm this move", + "selectReason": "Why do you move this object?", + "reasons": { + "reasonRelocation": "The object has been relocated to a totally different location", + "reasonInaccurate": "The location of this object is inaccurate and should be moved a few meter" + }, + "inviteToMove": { + "generic": "Move this point", + "reasonInaccurate": "Improve the accuracy of this point", + "reasonRelocation": "Move this object to a another place because it has relocated" + }, + "cannotBeMoved": "This feature cannot be moved.", + "isWay": "This feature is a way. Use another OpenStreetMap editor to move it.", + "isRelation": "This feature is a relation and can not be moved", + "partOfAWay": "This feature is part of another way. Use another editor to move it.", + "partOfRelation": "This feature is part of a relation. Use another editor to move it.", + "cancel": "Cancel move" + } } diff --git a/langs/eo.json b/langs/eo.json index 9c6a1e92d..b2d149e7d 100644 --- a/langs/eo.json +++ b/langs/eo.json @@ -1,104 +1,104 @@ { - "image": { - "ccb": "laŭ la permesilo CC-BY", - "addPicture": "Aldoni bildon", - "uploadingPicture": "Alŝutante vian bildon…", - "dontDelete": "Nuligi", - "ccbs": "laŭ la permesilo CC-BY-SA", - "cco": "kiel publika havaĵo", - "pleaseLogin": "Bonvolu saluti por aldoni bildon", - "uploadingMultiple": "Alŝutante {count} bildojn…" + "image": { + "ccb": "laŭ la permesilo CC-BY", + "addPicture": "Aldoni bildon", + "uploadingPicture": "Alŝutante vian bildon…", + "dontDelete": "Nuligi", + "ccbs": "laŭ la permesilo CC-BY-SA", + "cco": "kiel publika havaĵo", + "pleaseLogin": "Bonvolu saluti por aldoni bildon", + "uploadingMultiple": "Alŝutante {count} bildojn…" + }, + "general": { + "opening_hours": { + "ph_open": "malfermita", + "opensAt": "ekde", + "openTill": "ĝis", + "ph_closed": "fermita", + "ph_not_known": " " }, - "general": { - "opening_hours": { - "ph_open": "malfermita", - "opensAt": "ekde", - "openTill": "ĝis", - "ph_closed": "fermita", - "ph_not_known": " " - }, - "questions": { - "websiteIs": "Retejo: {website}" - }, - "weekdays": { - "sunday": "dimanĉo", - "abbreviations": { - "friday": "ve", - "saturday": "sa", - "tuesday": "ma", - "wednesday": "me", - "thursday": "ĵa", - "sunday": "di", - "monday": "lu" - }, - "thursday": "ĵaŭdo", - "friday": "vendredo", - "saturday": "sabato", - "tuesday": "mardo", - "wednesday": "merkredo", - "monday": "lundo" - }, - "loading": "Ŝargante…", - "pdf": { - "generatedWith": "Generita per MapComplete.osm.be", - "versionInfo": "v{version} - generita je {date}", - "attrBackground": "Fona tavolo: {background}", - "attr": "Mapaj datenoj © Kontribuintoj al OpenStreetMap, reuzeblaj laŭ ODbL" - }, - "loginWithOpenStreetMap": "Saluti per OpenStreetMap", - "search": { - "search": "Serĉi lokon", - "nothing": "Nenio troviĝis…", - "error": "Io fiaskis…", - "searching": "Serĉante…" - }, - "returnToTheMap": "Reen al la mapo", - "save": "Konservi", - "skip": "Preterpasi ĉi tiun demandon", - "add": { - "title": "Enmeti novan punkton?" - }, - "pickLanguage": "Elektu lingvon: ", - "noNameCategory": "{category} sen nomo", - "sharescreen": { - "editThisTheme": "Modifi ĉi tiun etoson", - "fsSearch": "Ŝalti la serĉbreton", - "fsUserbadge": "Ŝalti la salutbutonon" - }, - "backgroundMap": "Fona mapo", - "openTheMap": "Malfermi la mapon", - "wikipedia": { - "wikipediaboxTitle": "Vikipedio", - "loading": "Ŝargante Vikipedion…", - "searchWikidata": "Serĉi Vikidatumojn", - "noResults": "Nenio troviĝis pri {search}" - }, - "cancel": "Nuligi", - "attribution": { - "iconAttribution": { - "title": "Uzitaj piktogramoj" - } - }, - "download": { - "exporting": "Elportante…" - } + "questions": { + "websiteIs": "Retejo: {website}" }, - "favourite": { - "reload": "Reŝargi la datenojn" + "weekdays": { + "sunday": "dimanĉo", + "abbreviations": { + "friday": "ve", + "saturday": "sa", + "tuesday": "ma", + "wednesday": "me", + "thursday": "ĵa", + "sunday": "di", + "monday": "lu" + }, + "thursday": "ĵaŭdo", + "friday": "vendredo", + "saturday": "sabato", + "tuesday": "mardo", + "wednesday": "merkredo", + "monday": "lundo" }, - "reviews": { - "saving_review": "Konservante…", - "title": "{count} recenzoj", - "title_singular": "Unu recenzo" + "loading": "Ŝargante…", + "pdf": { + "generatedWith": "Generita per MapComplete.osm.be", + "versionInfo": "v{version} - generita je {date}", + "attrBackground": "Fona tavolo: {background}", + "attr": "Mapaj datenoj © Kontribuintoj al OpenStreetMap, reuzeblaj laŭ ODbL" }, - "centerMessage": { - "ready": "Farite!", - "loadingData": "Ŝargante datenojn…" + "loginWithOpenStreetMap": "Saluti per OpenStreetMap", + "search": { + "search": "Serĉi lokon", + "nothing": "Nenio troviĝis…", + "error": "Io fiaskis…", + "searching": "Serĉante…" }, - "index": { - "title": "Bonvenon al MapComplete" + "returnToTheMap": "Reen al la mapo", + "save": "Konservi", + "skip": "Preterpasi ĉi tiun demandon", + "add": { + "title": "Enmeti novan punkton?" }, - "delete": { - "cancel": "Nuligi" + "pickLanguage": "Elektu lingvon: ", + "noNameCategory": "{category} sen nomo", + "sharescreen": { + "editThisTheme": "Modifi ĉi tiun etoson", + "fsSearch": "Ŝalti la serĉbreton", + "fsUserbadge": "Ŝalti la salutbutonon" + }, + "backgroundMap": "Fona mapo", + "openTheMap": "Malfermi la mapon", + "wikipedia": { + "wikipediaboxTitle": "Vikipedio", + "loading": "Ŝargante Vikipedion…", + "searchWikidata": "Serĉi Vikidatumojn", + "noResults": "Nenio troviĝis pri {search}" + }, + "cancel": "Nuligi", + "attribution": { + "iconAttribution": { + "title": "Uzitaj piktogramoj" + } + }, + "download": { + "exporting": "Elportante…" } + }, + "favourite": { + "reload": "Reŝargi la datenojn" + }, + "reviews": { + "saving_review": "Konservante…", + "title": "{count} recenzoj", + "title_singular": "Unu recenzo" + }, + "centerMessage": { + "ready": "Farite!", + "loadingData": "Ŝargante datenojn…" + }, + "index": { + "title": "Bonvenon al MapComplete" + }, + "delete": { + "cancel": "Nuligi" + } } diff --git a/langs/fr.json b/langs/fr.json index 82b456e72..45c9c2711 100644 --- a/langs/fr.json +++ b/langs/fr.json @@ -1,181 +1,181 @@ { - "image": { - "addPicture": "Ajoutez une photo", - "uploadingPicture": "Mise en ligne de votre photo…", - "uploadingMultiple": "Mise en ligne de {count} photos…", - "pleaseLogin": "Connectez-vous pour téléverser une photo", - "willBePublished": "Votre photo va être publiée : ", - "cco": "dans le domaine public", - "ccbs": "sous la license CC-BY-SA", - "ccb": "sous la license CC-BY", - "uploadFailed": "L'ajout de la photo a échoué. Avez-vous accès à Internet ? Les API tierces sont-elles autorisées ? Le navigateur Brave ou UMatrix peuvent les bloquer.", - "respectPrivacy": "Merci de respecter la vie privée. Ne publiez pas les plaques d'immatriculation.", - "uploadDone": "Votre photo est ajoutée. Merci beaucoup !", - "dontDelete": "Annuler", - "doDelete": "Supprimer l'image", - "isDeleted": "Supprimé" + "image": { + "addPicture": "Ajoutez une photo", + "uploadingPicture": "Mise en ligne de votre photo…", + "uploadingMultiple": "Mise en ligne de {count} photos…", + "pleaseLogin": "Connectez-vous pour téléverser une photo", + "willBePublished": "Votre photo va être publiée : ", + "cco": "dans le domaine public", + "ccbs": "sous la license CC-BY-SA", + "ccb": "sous la license CC-BY", + "uploadFailed": "L'ajout de la photo a échoué. Avez-vous accès à Internet ? Les API tierces sont-elles autorisées ? Le navigateur Brave ou UMatrix peuvent les bloquer.", + "respectPrivacy": "Merci de respecter la vie privée. Ne publiez pas les plaques d'immatriculation.", + "uploadDone": "Votre photo est ajoutée. Merci beaucoup !", + "dontDelete": "Annuler", + "doDelete": "Supprimer l'image", + "isDeleted": "Supprimé" + }, + "centerMessage": { + "loadingData": "Chargement des données…", + "zoomIn": "Rapprochez-vous sur la carte pour voir ou éditer les données", + "ready": "Fini !", + "retrying": "Le chargement a échoué. Nouvel essai dans {count} secondes…" + }, + "index": { + "#": "Ces textes sont affichés au dessus des boutons de thème quand aucun thème n'est chargé", + "title": "Bienvenue sur MapComplete", + "intro": "MapComplete est une application qui permet de voir des informations d'OpenStreetMap sur un thème spécifique et de les éditer.", + "pickTheme": "Choisissez un thème ci-dessous pour commencer." + }, + "general": { + "loginWithOpenStreetMap": "Se connecter avec OpenStreeMap", + "welcomeBack": "Vous êtes connecté. Bienvenue !", + "loginToStart": "Connectez-vous pour répondre à cette question", + "search": { + "search": "Chercher un lieu", + "searching": "Chargement…", + "nothing": "Rien n'a été trouvé…", + "error": "Quelque chose n'a pas marché…" }, - "centerMessage": { - "loadingData": "Chargement des données…", - "zoomIn": "Rapprochez-vous sur la carte pour voir ou éditer les données", - "ready": "Fini !", - "retrying": "Le chargement a échoué. Nouvel essai dans {count} secondes…" + "returnToTheMap": "Retourner sur la carte", + "save": "Sauvegarder", + "cancel": "Annuler", + "skip": "Passer la question", + "oneSkippedQuestion": "Une question a été passée", + "skippedQuestions": "Questions passées", + "number": "nombre", + "osmLinkTooltip": "Voir l'historique de cet objet sur OpenStreetMap et plus d'options d'édition", + "add": { + "addNew": "Ajouter un/une {category} ici", + "title": "Ajouter un nouveau point ?", + "intro": "Vous avez cliqué sur un endroit où il n'y a pas encore de données.
", + "pleaseLogin": "Vous devez vous connecter pour ajouter un point", + "zoomInFurther": "Rapprochez vous pour ajouter un point.", + "stillLoading": "Chargement des données en cours. Patientez un instant avant d'ajouter un nouveau point.", + "confirmIntro": "

Ajouter un/une {title} ici?

Le point que vous ajouterez sera visible par tout le monde. Merci de vous assurer que ce point existe réellement. Beaucoup d'autres applications utilisent ces données.", + "confirmButton": "Ajouter un/une {category} ici.
Votre ajout sera visible par tout le monde
", + "openLayerControl": "Ouvrir la panneau de contrôle", + "layerNotEnabled": "La couche {layer} est désactivée. Activez-la pour ajouter un point" }, - "index": { - "#": "Ces textes sont affichés au dessus des boutons de thème quand aucun thème n'est chargé", - "title": "Bienvenue sur MapComplete", - "intro": "MapComplete est une application qui permet de voir des informations d'OpenStreetMap sur un thème spécifique et de les éditer.", - "pickTheme": "Choisissez un thème ci-dessous pour commencer." + "pickLanguage": "Choisir la langue : ", + "about": "Éditer facilement et ajouter OpenStreetMap pour un certain thème", + "nameInlineQuestion": "Le nom de cet/cette {category} est $$$", + "noNameCategory": "{category} sans nom", + "questions": { + "phoneNumberOf": "Quel est le numéro de téléphone de {category} ?", + "phoneNumberIs": "Le numéro de téléphone de {category} est {phone}", + "websiteOf": "Quel est le site internet de {category} ?", + "websiteIs": "Site Web : {website}", + "emailOf": "Quelle est l'adresse électronique de {category} ?", + "emailIs": "L'adresse électronique de {category} est {email}" }, - "general": { - "loginWithOpenStreetMap": "Se connecter avec OpenStreeMap", - "welcomeBack": "Vous êtes connecté. Bienvenue !", - "loginToStart": "Connectez-vous pour répondre à cette question", - "search": { - "search": "Chercher un lieu", - "searching": "Chargement…", - "nothing": "Rien n'a été trouvé…", - "error": "Quelque chose n'a pas marché…" - }, - "returnToTheMap": "Retourner sur la carte", - "save": "Sauvegarder", - "cancel": "Annuler", - "skip": "Passer la question", - "oneSkippedQuestion": "Une question a été passée", - "skippedQuestions": "Questions passées", - "number": "nombre", - "osmLinkTooltip": "Voir l'historique de cet objet sur OpenStreetMap et plus d'options d'édition", - "add": { - "addNew": "Ajouter un/une {category} ici", - "title": "Ajouter un nouveau point ?", - "intro": "Vous avez cliqué sur un endroit où il n'y a pas encore de données.
", - "pleaseLogin": "Vous devez vous connecter pour ajouter un point", - "zoomInFurther": "Rapprochez vous pour ajouter un point.", - "stillLoading": "Chargement des données en cours. Patientez un instant avant d'ajouter un nouveau point.", - "confirmIntro": "

Ajouter un/une {title} ici?

Le point que vous ajouterez sera visible par tout le monde. Merci de vous assurer que ce point existe réellement. Beaucoup d'autres applications utilisent ces données.", - "confirmButton": "Ajouter un/une {category} ici.
Votre ajout sera visible par tout le monde
", - "openLayerControl": "Ouvrir la panneau de contrôle", - "layerNotEnabled": "La couche {layer} est désactivée. Activez-la pour ajouter un point" - }, - "pickLanguage": "Choisir la langue : ", - "about": "Éditer facilement et ajouter OpenStreetMap pour un certain thème", - "nameInlineQuestion": "Le nom de cet/cette {category} est $$$", - "noNameCategory": "{category} sans nom", - "questions": { - "phoneNumberOf": "Quel est le numéro de téléphone de {category} ?", - "phoneNumberIs": "Le numéro de téléphone de {category} est {phone}", - "websiteOf": "Quel est le site internet de {category} ?", - "websiteIs": "Site Web : {website}", - "emailOf": "Quelle est l'adresse électronique de {category} ?", - "emailIs": "L'adresse électronique de {category} est {email}" - }, - "openStreetMapIntro": "

Une carte ouverte

Ne serait-il pas génial d'avoir sur une carte que tout le monde pourrait éditer ouvertement ? Une seule et unique plateforme regroupant toutes les informations géographiques ? Ainsi nous n'aurons plus besoin de toutes ces cartes petites et incompatibles (souvent non mises à jour).

OpenStreetMap est la carte qu'il vous faut ! Toutes les données de cette carte peuvent être utilisé gratuitement (avec d'attribution et de publication des changements de données). De plus tout le monde est libre d'ajouter de nouvelles données et de corriger les erreurs. Ce site internet utilise également OpenStreetMap. Toutes les données en proviennent et tous les ajouts et modifications y seront également ajoutés.

De nombreux individus et applications utilisent déjà OpenStreetMap : Maps.me, OsmAnd, mais aussi les cartes de Facebook, Instagram, Apple-maps et Bing-maps sont (en partie) supportés par OpenStreetMap. Si vous modifiez quelque chose ici, ces changements seront incorporés dans ces applications dès leurs mises à jour !

", - "attribution": { - "attributionTitle": "Crédits", - "attributionContent": "

Toutes les données sont fournies par OpenStreetMap, librement réutilisables sous Open DataBase License.

", - "themeBy": "Thème maintenu par {author}", - "iconAttribution": { - "title": "Icônes utilisées" - }, - "mapContributionsByAndHidden": "La partie actuellement visible des données comporte des modifications par {contributors} et {hiddenCount} contributeurs de plus", - "mapContributionsBy": "La partie actuellement visible des données comporte des modifications par {contributors}", - "codeContributionsBy": "MapComplete a été construit par {contributors} et {hiddenCount} autres contributeurs" - }, - "sharescreen": { - "intro": "

Partager cette carte

Partagez cette carte en copiant le lien suivant et envoyez-le à vos amis :", - "addToHomeScreen": "

Ajouter à votre page d'accueil

Vous pouvez facilement ajouter la carte à votre écran d'accueil de téléphone. Cliquer sur le boutton 'ajouter à l'ecran d'accueil' dans la barre d'adresse pour éffectuer cette tâche.", - "embedIntro": "

Incorporer à votre site Web

Ajouter la carte à votre site Web.
Nous vous y encourageons – pas besoin de permission.
C'est gratuit et pour toujours. Plus des personnes l'utilisent, mieux c'est.", - "copiedToClipboard": "Lien copié dans le presse-papier", - "thanksForSharing": "Merci d'avoir partagé !", - "editThisTheme": "Editer ce thème", - "editThemeDescription": "Ajouter ou modifier des questions à ce thème", - "fsUserbadge": "Activer le bouton de connexion", - "fsSearch": "Activer la barre de recherche", - "fsWelcomeMessage": "Afficher le message de bienvenue et les onglets associés", - "fsLayers": "Activer le contrôle des couches", - "fsLayerControlToggle": "Démarrer avec le contrôle des couches ouvert", - "fsAddNew": "Activer le bouton 'ajouter un POI'", - "fsGeolocation": "Activer le bouton 'Localisez-moi' (seulement sur mobile)", - "fsIncludeCurrentBackgroundMap": "Include le choix actuel d'arrière plan {name}", - "fsIncludeCurrentLayers": "Inclure la couche selectionnée", - "fsIncludeCurrentLocation": "Inclure l'emplacement actuel" - }, - "morescreen": { - "intro": "

Plus de thèmes ?

Vous aimez collecter des données géographiques ?
Il y a plus de thèmes disponibles.", - "requestATheme": "Si vous voulez une autre carte thématique, demandez-la dans le suivi des problèmes", - "streetcomplete": "Une autre application similaire est StreetComplete.", - "createYourOwnTheme": "Créez votre propre MapComplete carte" - }, - "readYourMessages": "Merci de lire tous vos messages sur OpenStreetMap avant d'ajouter un nouveau point.", - "fewChangesBefore": "Merci de répondre à quelques questions à propos de points déjà existants avant d'ajouter de nouveaux points.", - "goToInbox": "Ouvrir les messages", - "getStartedLogin": "Connectez-vous avec OpenStreetMap pour commencer", - "getStartedNewAccount": " ou créez un compte", - "noTagsSelected": "Aucune balise sélectionnée", - "customThemeIntro": "

Thèmes personnalisés

Vous avez déjà visité ces thèmes personnalisés.", - "aboutMapcomplete": "

À propos de MapComplete

Avec MapComplete vous pouvez enrichir OpenStreetMap d'informations sur un thème unique. Répondez à quelques questions, et en quelques minutes vos contributions seront disponible dans le monde entier ! Le concepteur du thème définis les éléments, questions et langues pour le thème.

En savoir plus

MapComplete propose toujours l'étape suivante pour en apprendre plus sur OpenStreetMap.

  • Lorsqu'il est intégré dans un site Web, l'<i>iframe</i> pointe vers MapComplete en plein écran
  • La version plein écran donne des informations sur OpenStreetMap
  • Il est possible de regarder sans se connecter, mais l'édition demande une connexion à OSM.
  • Si vous n'êtes pas connecté, il vous est demandé de le faire
  • Une fois que vous avez répondu à une seule question, vous pouvez ajouter de nouveaux points à la carte
  • Au bout d'un moment, les vrais tags OSM sont montrés, qui pointent ensuite vers le wiki


Vous avez remarqué un problème ? Vous souhaitez demander une fonctionnalité ? Vous voulez aider à traduire ? Allez voir le code source ou l'<i>issue tracker.</i>

Vous voulez visualiser votre progression ? Suivez le compteur d'édition sur OsmCha.

", - "backgroundMap": "Carte de fonds", - "layerSelection": { - "zoomInToSeeThisLayer": "Aggrandissez la carte pour voir cette couche", - "title": "Selectionner des couches" - }, - "weekdays": { - "abbreviations": { - "monday": "Lun", - "tuesday": "Mar", - "wednesday": "Mer", - "thursday": "Jeu", - "friday": "Ven", - "saturday": "Sam", - "sunday": "Dim" - }, - "monday": "Lundi", - "tuesday": "Mardi", - "wednesday": "Mercredi", - "thursday": "Jeudi", - "friday": "Vendredi", - "saturday": "Samedi", - "sunday": "Dimanche" - }, - "opening_hours": { - "error_loading": "Erreur : impossible de visualiser ces horaires d'ouverture.", - "open_during_ph": "Pendant les congés, ce lieu est", - "opensAt": "à partir de", - "openTill": "jusqu'à", - "not_all_rules_parsed": "Les heures d'ouvertures de ce magasin sont trop compliquées. Les heures suivantes ont été ignorées :", - "closed_until": "Fermé jusqu'au {date}", - "closed_permanently": "Fermé", - "open_24_7": "Ouvert en permanence", - "ph_closed": "fermé", - "ph_open": "ouvert", - "ph_not_known": " " - } + "openStreetMapIntro": "

Une carte ouverte

Ne serait-il pas génial d'avoir sur une carte que tout le monde pourrait éditer ouvertement ? Une seule et unique plateforme regroupant toutes les informations géographiques ? Ainsi nous n'aurons plus besoin de toutes ces cartes petites et incompatibles (souvent non mises à jour).

OpenStreetMap est la carte qu'il vous faut ! Toutes les données de cette carte peuvent être utilisé gratuitement (avec d'attribution et de publication des changements de données). De plus tout le monde est libre d'ajouter de nouvelles données et de corriger les erreurs. Ce site internet utilise également OpenStreetMap. Toutes les données en proviennent et tous les ajouts et modifications y seront également ajoutés.

De nombreux individus et applications utilisent déjà OpenStreetMap : Maps.me, OsmAnd, mais aussi les cartes de Facebook, Instagram, Apple-maps et Bing-maps sont (en partie) supportés par OpenStreetMap. Si vous modifiez quelque chose ici, ces changements seront incorporés dans ces applications dès leurs mises à jour !

", + "attribution": { + "attributionTitle": "Crédits", + "attributionContent": "

Toutes les données sont fournies par OpenStreetMap, librement réutilisables sous Open DataBase License.

", + "themeBy": "Thème maintenu par {author}", + "iconAttribution": { + "title": "Icônes utilisées" + }, + "mapContributionsByAndHidden": "La partie actuellement visible des données comporte des modifications par {contributors} et {hiddenCount} contributeurs de plus", + "mapContributionsBy": "La partie actuellement visible des données comporte des modifications par {contributors}", + "codeContributionsBy": "MapComplete a été construit par {contributors} et {hiddenCount} autres contributeurs" }, - "favourite": { - "panelIntro": "

Votre thème personnel

Activer vos couches favorites depuis les thèmes officiels", - "loginNeeded": "

Connexion

La mise en forme personnalisée requiert un compte OpenStreetMap", - "reload": "Recharger les données" + "sharescreen": { + "intro": "

Partager cette carte

Partagez cette carte en copiant le lien suivant et envoyez-le à vos amis :", + "addToHomeScreen": "

Ajouter à votre page d'accueil

Vous pouvez facilement ajouter la carte à votre écran d'accueil de téléphone. Cliquer sur le boutton 'ajouter à l'ecran d'accueil' dans la barre d'adresse pour éffectuer cette tâche.", + "embedIntro": "

Incorporer à votre site Web

Ajouter la carte à votre site Web.
Nous vous y encourageons – pas besoin de permission.
C'est gratuit et pour toujours. Plus des personnes l'utilisent, mieux c'est.", + "copiedToClipboard": "Lien copié dans le presse-papier", + "thanksForSharing": "Merci d'avoir partagé !", + "editThisTheme": "Editer ce thème", + "editThemeDescription": "Ajouter ou modifier des questions à ce thème", + "fsUserbadge": "Activer le bouton de connexion", + "fsSearch": "Activer la barre de recherche", + "fsWelcomeMessage": "Afficher le message de bienvenue et les onglets associés", + "fsLayers": "Activer le contrôle des couches", + "fsLayerControlToggle": "Démarrer avec le contrôle des couches ouvert", + "fsAddNew": "Activer le bouton 'ajouter un POI'", + "fsGeolocation": "Activer le bouton 'Localisez-moi' (seulement sur mobile)", + "fsIncludeCurrentBackgroundMap": "Include le choix actuel d'arrière plan {name}", + "fsIncludeCurrentLayers": "Inclure la couche selectionnée", + "fsIncludeCurrentLocation": "Inclure l'emplacement actuel" }, - "reviews": { - "title": "{count} avis", - "title_singular": "Un avis", - "name_required": "Un nom est requis pour afficher et créer des avis", - "no_reviews_yet": "Il n'y a pas encore d'avis. Soyez le premier à en écrire un et aidez le lieu et les données ouvertes !", - "write_a_comment": "Laisser un avis…", - "no_rating": "Aucun score donné", - "posting_as": "Envoi en tant que", - "i_am_affiliated": "Je suis affilié à cet objet
Cochez si vous en êtes le propriétaire, créateur, employé, …", - "affiliated_reviewer_warning": "(Avis affilié)", - "saving_review": "Enregistrement…", - "saved": "Avis enregistré. Merci du partage !", - "tos": "En publiant un avis, vous êtes d'accord avec les conditions d'utilisation et la politique de confidentialité de Mangrove.reviews", - "attribution": "Les avis sont fournis par Mangrove Reviews et sont disponibles sous licence CC-BY 4.0.", - "plz_login": "Connectez vous pour laisser un avis" + "morescreen": { + "intro": "

Plus de thèmes ?

Vous aimez collecter des données géographiques ?
Il y a plus de thèmes disponibles.", + "requestATheme": "Si vous voulez une autre carte thématique, demandez-la dans le suivi des problèmes", + "streetcomplete": "Une autre application similaire est StreetComplete.", + "createYourOwnTheme": "Créez votre propre MapComplete carte" }, - "split": { - "cancel": "Annuler" + "readYourMessages": "Merci de lire tous vos messages sur OpenStreetMap avant d'ajouter un nouveau point.", + "fewChangesBefore": "Merci de répondre à quelques questions à propos de points déjà existants avant d'ajouter de nouveaux points.", + "goToInbox": "Ouvrir les messages", + "getStartedLogin": "Connectez-vous avec OpenStreetMap pour commencer", + "getStartedNewAccount": " ou créez un compte", + "noTagsSelected": "Aucune balise sélectionnée", + "customThemeIntro": "

Thèmes personnalisés

Vous avez déjà visité ces thèmes personnalisés.", + "aboutMapcomplete": "

À propos de MapComplete

Avec MapComplete vous pouvez enrichir OpenStreetMap d'informations sur un thème unique. Répondez à quelques questions, et en quelques minutes vos contributions seront disponible dans le monde entier ! Le concepteur du thème définis les éléments, questions et langues pour le thème.

En savoir plus

MapComplete propose toujours l'étape suivante pour en apprendre plus sur OpenStreetMap.

  • Lorsqu'il est intégré dans un site Web, l'<i>iframe</i> pointe vers MapComplete en plein écran
  • La version plein écran donne des informations sur OpenStreetMap
  • Il est possible de regarder sans se connecter, mais l'édition demande une connexion à OSM.
  • Si vous n'êtes pas connecté, il vous est demandé de le faire
  • Une fois que vous avez répondu à une seule question, vous pouvez ajouter de nouveaux points à la carte
  • Au bout d'un moment, les vrais tags OSM sont montrés, qui pointent ensuite vers le wiki


Vous avez remarqué un problème ? Vous souhaitez demander une fonctionnalité ? Vous voulez aider à traduire ? Allez voir le code source ou l'<i>issue tracker.</i>

Vous voulez visualiser votre progression ? Suivez le compteur d'édition sur OsmCha.

", + "backgroundMap": "Carte de fonds", + "layerSelection": { + "zoomInToSeeThisLayer": "Aggrandissez la carte pour voir cette couche", + "title": "Selectionner des couches" }, - "delete": { - "cancel": "Annuler" + "weekdays": { + "abbreviations": { + "monday": "Lun", + "tuesday": "Mar", + "wednesday": "Mer", + "thursday": "Jeu", + "friday": "Ven", + "saturday": "Sam", + "sunday": "Dim" + }, + "monday": "Lundi", + "tuesday": "Mardi", + "wednesday": "Mercredi", + "thursday": "Jeudi", + "friday": "Vendredi", + "saturday": "Samedi", + "sunday": "Dimanche" + }, + "opening_hours": { + "error_loading": "Erreur : impossible de visualiser ces horaires d'ouverture.", + "open_during_ph": "Pendant les congés, ce lieu est", + "opensAt": "à partir de", + "openTill": "jusqu'à", + "not_all_rules_parsed": "Les heures d'ouvertures de ce magasin sont trop compliquées. Les heures suivantes ont été ignorées :", + "closed_until": "Fermé jusqu'au {date}", + "closed_permanently": "Fermé", + "open_24_7": "Ouvert en permanence", + "ph_closed": "fermé", + "ph_open": "ouvert", + "ph_not_known": " " } + }, + "favourite": { + "panelIntro": "

Votre thème personnel

Activer vos couches favorites depuis les thèmes officiels", + "loginNeeded": "

Connexion

La mise en forme personnalisée requiert un compte OpenStreetMap", + "reload": "Recharger les données" + }, + "reviews": { + "title": "{count} avis", + "title_singular": "Un avis", + "name_required": "Un nom est requis pour afficher et créer des avis", + "no_reviews_yet": "Il n'y a pas encore d'avis. Soyez le premier à en écrire un et aidez le lieu et les données ouvertes !", + "write_a_comment": "Laisser un avis…", + "no_rating": "Aucun score donné", + "posting_as": "Envoi en tant que", + "i_am_affiliated": "Je suis affilié à cet objet
Cochez si vous en êtes le propriétaire, créateur, employé, …", + "affiliated_reviewer_warning": "(Avis affilié)", + "saving_review": "Enregistrement…", + "saved": "Avis enregistré. Merci du partage !", + "tos": "En publiant un avis, vous êtes d'accord avec les conditions d'utilisation et la politique de confidentialité de Mangrove.reviews", + "attribution": "Les avis sont fournis par Mangrove Reviews et sont disponibles sous licence CC-BY 4.0.", + "plz_login": "Connectez vous pour laisser un avis" + }, + "split": { + "cancel": "Annuler" + }, + "delete": { + "cancel": "Annuler" + } } diff --git a/langs/gl.json b/langs/gl.json index a5b2c73e8..13725975f 100644 --- a/langs/gl.json +++ b/langs/gl.json @@ -70,9 +70,9 @@ "emailIs": "O enderezo de correo electrónico de {category} é {email}" }, "index": { - "pickTheme": "Escolle un tema para comezar.", - "intro": "O MapComplete é un visor e editor do OpenStreetMap, que te amosa información sobre un tema específico.", - "title": "Benvido ao MapComplete" + "pickTheme": "Escolle un tema para comezar.", + "intro": "O MapComplete é un visor e editor do OpenStreetMap, que te amosa información sobre un tema específico.", + "title": "Benvido ao MapComplete" }, "openStreetMapIntro": "

Un mapa aberto

Non sería xenial se houbera un só mapa, que todos puideran empregar e editar de xeito libre?Un só lugar para almacenar toda a información xeográfica? Entón, todos eses sitios web con mapas diferentes, pequenos e incompatíbeis (que sempre están desactualizados) xa non serían necesarios.

OpenStreetMap é ese mapa. Os datos do mapa pódense empregar de balde (con atribución e publicación de modificacións neses datos). Ademais diso, todos poden engadir de xeito ceibe novos datos e corrixir erros. Este sitio web tamén emprega o OpenStreetMap. Todos os datos proveñen de alí, e as túas respostas e correccións tamén serán engadidas alí.

Moitas persoas e aplicacións xa empregan o OpenStreetMap: Maps.me, OsmAnd, pero tamén os mapas do Facebook, Instagram, Apple e Bing son (en parte) impulsados ​​polo OpenStreetMap. Se mudas algo aquí, tamén será reflexado nesas aplicacións, na súa seguinte actualización!

", "sharescreen": { diff --git a/langs/id.json b/langs/id.json index 096cbf6ce..9c78ab6e7 100644 --- a/langs/id.json +++ b/langs/id.json @@ -1,109 +1,109 @@ { - "general": { - "questions": { - "phoneNumberOf": "Apakah nombor telepon {category} ini?", - "websiteIs": "Website: {website}", - "emailOf": "Apa alamat email {category}?" - }, - "nameInlineQuestion": "Name {category} ini adalah $$$", - "pickLanguage": "Pilih bahasa: ", - "layerSelection": { - "title": "Pilih lapisan" - }, - "backgroundMap": "Peta latar belakang", - "search": { - "searching": "Sdg mencari…" - }, - "opening_hours": { - "ph_not_known": " ", - "ph_open": "buka", - "ph_closed": "tutup", - "open_24_7": "Dibuka sekitar jam", - "closed_permanently": "Ditutup sampai pemberitahuan lebih lanjut", - "openTill": "sampai", - "opensAt": "dari", - "closed_until": "Ditutup sampai {date}" - }, - "noTagsSelected": "Tidak ada tag yang dipilih", - "getStartedNewAccount": " atau membuat akun baru", - "getStartedLogin": "Masuk dengan OpenStreetMap untuk memulai", - "sharescreen": { - "fsIncludeCurrentLocation": "Sertakan lokasi saat ini", - "fsIncludeCurrentLayers": "Sertakan pilihan lapisan saat ini", - "fsIncludeCurrentBackgroundMap": "Sertakan pilihan latar belakang saat ini {name}", - "fsGeolocation": "Aktifkan tombol 'geolocate-me' (hanya seluler)", - "fsAddNew": "Aktifkan tombol 'tambah POI baru'", - "fsLayers": "Aktifkan kontrol lapisan", - "fsWelcomeMessage": "Tampilkan popup pesan selamat datang dan tab terkait", - "fsSearch": "Aktifkan bilah pencarian", - "fsUserbadge": "Aktifkan tombol masuk", - "editThemeDescription": "Tambahkan atau ubah pertanyaan ke tema peta ini", - "editThisTheme": "Sunting tema ini", - "thanksForSharing": "Terima kasih telah berbagi!", - "copiedToClipboard": "Tautan disalin ke papan klip" - }, - "goToInbox": "Buka kotak masuk", - "weekdays": { - "abbreviations": { - "sunday": "Min", - "saturday": "Sab", - "friday": "Jum", - "thursday": "Kam", - "wednesday": "Rab", - "tuesday": "Sel", - "monday": "Sen" - }, - "sunday": "Minggu", - "saturday": "Sabtu", - "friday": "Jum'at", - "thursday": "Kamis", - "wednesday": "Rabu", - "tuesday": "Selasa", - "monday": "Senin" - }, - "cancel": "Batal" + "general": { + "questions": { + "phoneNumberOf": "Apakah nombor telepon {category} ini?", + "websiteIs": "Website: {website}", + "emailOf": "Apa alamat email {category}?" }, - "image": { - "doDelete": "Buang gambar", - "ccb": "di bawah lisensi CC-BY", - "ccbs": "di bawah lisensi CC-BY-SA", - "cco": "di domain publik", - "willBePublished": "Gambarmu akan dipublikasikan: ", - "pleaseLogin": "Silakan masuk untuk menambah gambar", - "uploadingMultiple": "Mengunggah {count} gambar…", - "uploadingPicture": "Mengunggah gambar Anda…", - "addPicture": "Tambahkan foto", - "isDeleted": "Dihapus", - "dontDelete": "Batal" + "nameInlineQuestion": "Name {category} ini adalah $$$", + "pickLanguage": "Pilih bahasa: ", + "layerSelection": { + "title": "Pilih lapisan" }, - "centerMessage": { - "ready": "Selesai!", - "loadingData": "Memuat data…" + "backgroundMap": "Peta latar belakang", + "search": { + "searching": "Sdg mencari…" }, - "favourite": { - "reload": "Muat ulang data" + "opening_hours": { + "ph_not_known": " ", + "ph_open": "buka", + "ph_closed": "tutup", + "open_24_7": "Dibuka sekitar jam", + "closed_permanently": "Ditutup sampai pemberitahuan lebih lanjut", + "openTill": "sampai", + "opensAt": "dari", + "closed_until": "Ditutup sampai {date}" }, - "reviews": { - "attribution": "Ulasan didukung oleh Mangrove Reviews dan tersedia di bawah CC-BY 4.0.", - "tos": "Jika Anda membuat ulasan, Anda menyetujui TOS dan kebijakan privasi Mangrove.reviews", - "saved": " Ulasan disimpan. Terima kasih sudah berbagi! ", - "saving_review": "Menyimpan…", - "posting_as": "Posting sebagai", - "no_rating": "Tidak ada peringkat yang diberikan", - "write_a_comment": "Beri ulasan…", - "title_singular": "Satu ulasan", - "title": "{count} ulasan", - "plz_login": "Masuk untuk meninggalkan ulasan" + "noTagsSelected": "Tidak ada tag yang dipilih", + "getStartedNewAccount": " atau membuat akun baru", + "getStartedLogin": "Masuk dengan OpenStreetMap untuk memulai", + "sharescreen": { + "fsIncludeCurrentLocation": "Sertakan lokasi saat ini", + "fsIncludeCurrentLayers": "Sertakan pilihan lapisan saat ini", + "fsIncludeCurrentBackgroundMap": "Sertakan pilihan latar belakang saat ini {name}", + "fsGeolocation": "Aktifkan tombol 'geolocate-me' (hanya seluler)", + "fsAddNew": "Aktifkan tombol 'tambah POI baru'", + "fsLayers": "Aktifkan kontrol lapisan", + "fsWelcomeMessage": "Tampilkan popup pesan selamat datang dan tab terkait", + "fsSearch": "Aktifkan bilah pencarian", + "fsUserbadge": "Aktifkan tombol masuk", + "editThemeDescription": "Tambahkan atau ubah pertanyaan ke tema peta ini", + "editThisTheme": "Sunting tema ini", + "thanksForSharing": "Terima kasih telah berbagi!", + "copiedToClipboard": "Tautan disalin ke papan klip" }, - "index": { - "pickTheme": "Pilih tema di bawah ini untuk memulai.", - "intro": "MapComplete adalah penampil dan editor OpenStreetMap, yang menunjukkan informasi tentang tema tertentu.", - "title": "Selamat datang di MapComplete" + "goToInbox": "Buka kotak masuk", + "weekdays": { + "abbreviations": { + "sunday": "Min", + "saturday": "Sab", + "friday": "Jum", + "thursday": "Kam", + "wednesday": "Rab", + "tuesday": "Sel", + "monday": "Sen" + }, + "sunday": "Minggu", + "saturday": "Sabtu", + "friday": "Jum'at", + "thursday": "Kamis", + "wednesday": "Rabu", + "tuesday": "Selasa", + "monday": "Senin" }, - "split": { - "cancel": "Batal" - }, - "delete": { - "cancel": "Batal" - } + "cancel": "Batal" + }, + "image": { + "doDelete": "Buang gambar", + "ccb": "di bawah lisensi CC-BY", + "ccbs": "di bawah lisensi CC-BY-SA", + "cco": "di domain publik", + "willBePublished": "Gambarmu akan dipublikasikan: ", + "pleaseLogin": "Silakan masuk untuk menambah gambar", + "uploadingMultiple": "Mengunggah {count} gambar…", + "uploadingPicture": "Mengunggah gambar Anda…", + "addPicture": "Tambahkan foto", + "isDeleted": "Dihapus", + "dontDelete": "Batal" + }, + "centerMessage": { + "ready": "Selesai!", + "loadingData": "Memuat data…" + }, + "favourite": { + "reload": "Muat ulang data" + }, + "reviews": { + "attribution": "Ulasan didukung oleh Mangrove Reviews dan tersedia di bawah CC-BY 4.0.", + "tos": "Jika Anda membuat ulasan, Anda menyetujui TOS dan kebijakan privasi Mangrove.reviews", + "saved": " Ulasan disimpan. Terima kasih sudah berbagi! ", + "saving_review": "Menyimpan…", + "posting_as": "Posting sebagai", + "no_rating": "Tidak ada peringkat yang diberikan", + "write_a_comment": "Beri ulasan…", + "title_singular": "Satu ulasan", + "title": "{count} ulasan", + "plz_login": "Masuk untuk meninggalkan ulasan" + }, + "index": { + "pickTheme": "Pilih tema di bawah ini untuk memulai.", + "intro": "MapComplete adalah penampil dan editor OpenStreetMap, yang menunjukkan informasi tentang tema tertentu.", + "title": "Selamat datang di MapComplete" + }, + "split": { + "cancel": "Batal" + }, + "delete": { + "cancel": "Batal" + } } diff --git a/langs/it.json b/langs/it.json index dee1190af..19d0394ed 100644 --- a/langs/it.json +++ b/langs/it.json @@ -1,288 +1,288 @@ { - "reviews": { - "attribution": "Le recensioni sono fornite da Mangrove Reviews e sono disponibili con licenza CC-BY 4.0.", - "tos": "Quando pubblichi una recensione, accetti i termini di utilizzo e la informativa sulla privacy di Mangrove.reviews", - "plz_login": "Accedi per lasciare una recensione", - "saved": "Recensione salvata. Grazie per averla condivisa!", - "saving_review": "Salvataggio…", - "affiliated_reviewer_warning": "(Recensione di un affiliato)", - "i_am_affiliated": "Sono associato con questo oggetto
Spunta se sei il proprietario, creatore, dipendente, etc.", - "posting_as": "Pubblica come", - "no_rating": "Nessun voto ricevuto", - "write_a_comment": "Lascia una recensione…", - "no_reviews_yet": "Non ci sono ancora recensioni. Sii il primo a scriverne una aiutando così i dati liberi e l’attività!", - "name_required": "È richiesto un nome per poter mostrare e creare recensioni", - "title_singular": "Una recensione", - "title": "{count} recensioni" + "reviews": { + "attribution": "Le recensioni sono fornite da Mangrove Reviews e sono disponibili con licenza CC-BY 4.0.", + "tos": "Quando pubblichi una recensione, accetti i termini di utilizzo e la informativa sulla privacy di Mangrove.reviews", + "plz_login": "Accedi per lasciare una recensione", + "saved": "Recensione salvata. Grazie per averla condivisa!", + "saving_review": "Salvataggio…", + "affiliated_reviewer_warning": "(Recensione di un affiliato)", + "i_am_affiliated": "Sono associato con questo oggetto
Spunta se sei il proprietario, creatore, dipendente, etc.", + "posting_as": "Pubblica come", + "no_rating": "Nessun voto ricevuto", + "write_a_comment": "Lascia una recensione…", + "no_reviews_yet": "Non ci sono ancora recensioni. Sii il primo a scriverne una aiutando così i dati liberi e l’attività!", + "name_required": "È richiesto un nome per poter mostrare e creare recensioni", + "title_singular": "Una recensione", + "title": "{count} recensioni" + }, + "general": { + "aboutMapcomplete": "

Informazioni su MapComplete

Con MapComplete puoi arricchire OpenStreetMap con informazioni su un singolo argomento. Rispondi a poche domande e in pochi minuti i tuoi contributi saranno disponibili a tutto il mondo! L’utente gestore del tema definisce gli elementi, le domande e le lingue per quel tema.

Scopri altro

MapComplete propone sempre un passo in più per imparare qualcosa di nuovo su OpenStreetMap.

  • Quando viene incorporato in un sito web, il collegamento dell’iframe punta a MapComplete a tutto schermo
  • La versione a tutto schermo fornisce informazioni su OpenStreetMap
  • La visualizzazione non necessita di alcun accesso ma per modificare occorre aver effettuato l’accesso su OSM.
  • Se non hai effettuato l’accesso, ti verrà richiesto di farlo
  • Dopo aver risposto ad una sola domanda potrai aggiungere dei nuovi punti alla mappa
  • Dopo qualche momento verranno mostrate le etichette effettive, in seguito i collegamenti alla wiki


Hai trovato un errore? Vuoi richiedere nuove funzionalità? Vuoi aiutare con la traduzione? Dai un’occhiata al codice sorgente oppure al tracker degli errori.

Vuoi vedere i tuoi progressi?Segui il contatore delle modifiche su OsmCha.

", + "morescreen": { + "requestATheme": "Se hai bisogno di una mappa tematica personalizzata, puoi chiederla nel tracker degli errori", + "createYourOwnTheme": "Crea il tuo tema di MapComplete personalizzato da zero", + "streetcomplete": "Un’altra simile applicazione è StreetComplete.", + "intro": "

Altre mappe tematiche?

Ti diverti a raccogliere dati geografici?
Sono disponibili altri temi.", + "previouslyHiddenTitle": "Temi nascosti precedentemente visitati", + "hiddenExplanation": "Questi temi sono solo accessibili se si dispone del collegamento. Hai scoperto {hidden_discovered} su {total_hidden} temi nascosti." }, - "general": { - "aboutMapcomplete": "

Informazioni su MapComplete

Con MapComplete puoi arricchire OpenStreetMap con informazioni su un singolo argomento. Rispondi a poche domande e in pochi minuti i tuoi contributi saranno disponibili a tutto il mondo! L’utente gestore del tema definisce gli elementi, le domande e le lingue per quel tema.

Scopri altro

MapComplete propone sempre un passo in più per imparare qualcosa di nuovo su OpenStreetMap.

  • Quando viene incorporato in un sito web, il collegamento dell’iframe punta a MapComplete a tutto schermo
  • La versione a tutto schermo fornisce informazioni su OpenStreetMap
  • La visualizzazione non necessita di alcun accesso ma per modificare occorre aver effettuato l’accesso su OSM.
  • Se non hai effettuato l’accesso, ti verrà richiesto di farlo
  • Dopo aver risposto ad una sola domanda potrai aggiungere dei nuovi punti alla mappa
  • Dopo qualche momento verranno mostrate le etichette effettive, in seguito i collegamenti alla wiki


Hai trovato un errore? Vuoi richiedere nuove funzionalità? Vuoi aiutare con la traduzione? Dai un’occhiata al codice sorgente oppure al tracker degli errori.

Vuoi vedere i tuoi progressi?Segui il contatore delle modifiche su OsmCha.

", - "morescreen": { - "requestATheme": "Se hai bisogno di una mappa tematica personalizzata, puoi chiederla nel tracker degli errori", - "createYourOwnTheme": "Crea il tuo tema di MapComplete personalizzato da zero", - "streetcomplete": "Un’altra simile applicazione è StreetComplete.", - "intro": "

Altre mappe tematiche?

Ti diverti a raccogliere dati geografici?
Sono disponibili altri temi.", - "previouslyHiddenTitle": "Temi nascosti precedentemente visitati", - "hiddenExplanation": "Questi temi sono solo accessibili se si dispone del collegamento. Hai scoperto {hidden_discovered} su {total_hidden} temi nascosti." - }, - "sharescreen": { - "embedIntro": "

Incorpora nel tuo sito web

Siamo lieti se vorrai includere questa cartina nel tuo sito web.
Ti incoraggiamo a farlo (non devi neanche chieder il permesso).
È gratuito e lo sarà per sempre. Più persone lo useranno e più valore acquisirà.", - "addToHomeScreen": "

Aggiungi alla tua schermata Home

Puoi aggiungere facilmente questo sito web alla schermata Home del tuo smartphone. Per farlo, clicca sul pulsante ‘Aggiungi a schermata Home’ nella barra degli indirizzi.", - "fsIncludeCurrentLocation": "Includi la posizione attuale", - "fsIncludeCurrentBackgroundMap": "Includi lo sfondo attualmente selezionato {name}", - "fsIncludeCurrentLayers": "Includi i livelli correntemente selezionati", - "fsGeolocation": "Abilita il pusante ‘geo-localizzami’ (solo da mobile)", - "fsAddNew": "Abilita il pulsante ‘aggiungi nuovo PDI’", - "fsLayerControlToggle": "Inizia con il pannello dei livelli aperto", - "fsLayers": "Abilita il controllo dei livelli", - "fsWelcomeMessage": "Mostra il messaggio di benvenuto e le schede associate", - "fsSearch": "Abilita la barra di ricerca", - "fsUserbadge": "Abilita il pulsante di accesso", - "editThemeDescription": "Aggiungi o modifica le domande a questo tema della mappa", - "editThisTheme": "Modifica questo tema", - "thanksForSharing": "Grazie per la condivisione!", - "copiedToClipboard": "Collegamento copiato negli appunti", - "intro": "

Condividi questa mappa

Condividi questa mappa copiando il collegamento qua sotto e inviandolo ad amici o parenti:" - }, - "attribution": { - "attributionContent": "

Tutti i dati sono forniti da OpenStreetMap, riutilizzabili liberamente con Open Database License

", - "attributionTitle": "Crediti", - "codeContributionsBy": "MapComplete è stato realizzato da {contributors} e {hiddenCount} altri collaboratori", - "mapContributionsByAndHidden": "I dati attualmente visibili sono stati modificati da {contributors} e {hiddenCount} altri contributori", - "mapContributionsBy": "I dati attualmente visibili sono stati creati da {contributors}", - "iconAttribution": { - "title": "Icone utilizzate" - }, - "themeBy": "Tema manutenuto da {author}" - }, - "openStreetMapIntro": "

Una mappa libera

Non sarebbe perfetto se esistesse una carta geografica che chiunque può modificare e utilizzare liberamente? Un unico posto in un cui conservare tutte le informazioni geografiche? In questo modo tutti questi siti web con mappe diverse, piccole e incompatibili (che sono sempre obsolete) diverrebbero istantaneamente inutili.

OpenStreetMap è proprio questa mappa. I dati geografici possono essere usati liberamente (rispettando l’attribuzione e la pubblicazione delle modifiche di quei dati). In più, chiunque può aggiungere liberamente nuovi dati e correggere gli errori. Anche questo sito usa OpenStreetMap. Tutti i dati provengono da lì e le tue risposte e correzioni finiscono sempre lì.

Moltissime persone e applicazioni già usano OpenStreetmap: Maps.me, OsmAnd ma anche le cartine di Facebook, Instagram, Apple e Bing si basano (parzialmente) su OpenStreetMap. Tutto quello che cambi qua si rifletterà anche su quelle applicazioni (non appena avranno aggiornato i loro dati!)

", - "opening_hours": { - "ph_open": "aperto", - "ph_closed": "chiuso", - "ph_not_known": " ", - "open_24_7": "Sempre aperto", - "closed_permanently": "Chiuso per un periodo sconosciuto", - "closed_until": "Chiuso fino al {date}", - "not_all_rules_parsed": "Gli orari di apertura di questo negozio sono complicati. Le seguenti regole sono state ignorate per l’oggetto in ingresso:", - "openTill": "fino a", - "opensAt": "da", - "open_during_ph": "Durante le festività questo luogo è", - "error_loading": "Errore: impossibile visualizzare questi orari di apertura.", - "ph_open_as_usual": "aperto come di consueto", - "loadingCountry": "Determinazione del Paese…" - }, - "weekdays": { - "sunday": "Domenica", - "saturday": "Sabato", - "friday": "Venerdì", - "thursday": "Giovedì", - "wednesday": "Mercoledì", - "tuesday": "Martedì", - "monday": "Lunedì", - "abbreviations": { - "sunday": "Dom", - "saturday": "Sab", - "friday": "Ven", - "thursday": "Gio", - "wednesday": "Mer", - "tuesday": "Mar", - "monday": "Lun" - } - }, - "layerSelection": { - "title": "Seleziona livelli", - "zoomInToSeeThisLayer": "Ingrandisci la mappa per vedere questo livello" - }, - "backgroundMap": "Mappa di sfondo", - "customThemeIntro": "

Temi personalizzati

Questi sono i temi degli utenti che hai già visitato.", - "noTagsSelected": "Nessuna etichetta selezionata", - "getStartedNewAccount": " oppure crea un nuovo account", - "getStartedLogin": "Accedi con OpenStreetMap per iniziare", - "goToInbox": "Apri posta in arrivo", - "fewChangesBefore": "Rispondi ad alcune domande di punti esistenti prima di aggiungere un nuovo punto.", - "readYourMessages": "Leggi tutti i tuoi messaggi OpenStreetMap prima di aggiungere un nuovo punto.", - "questions": { - "emailIs": "L’indirizzo email di questa {category} è {email}", - "emailOf": "Qual è l’indirizzo email di {category}?", - "websiteIs": "Sito web: {website}", - "websiteOf": "Qual è il sito web di {category}?", - "phoneNumberIs": "Il numero di telefono di questa {category} è {phone}", - "phoneNumberOf": "Qual è il numero di telefono di {category}?" - }, - "noNameCategory": "{category} senza nome", - "nameInlineQuestion": "Il nome di questa {category} è $$$", - "about": "Modifica e aggiungi con semplicità OpenStreetMap per un certo tema", - "pickLanguage": "Scegli una lingua: ", - "add": { - "layerNotEnabled": "Il livello {layer} non è abilitato. Abilita questo livello per aggiungere un punto", - "openLayerControl": "Apri il pannello di controllo dei livelli", - "confirmButton": "Aggiungi una {category} qua.
La tua aggiunta è visibile a chiunque
", - "confirmIntro": "

Aggiungere un {title} qua?

Il punto che hai creato qua sarà visibile da chiunque. Per favore, aggiungi sulla mappa solo oggetti realmente esistenti. Molte applicazioni usano questi dati.", - "stillLoading": "Caricamento dei dati ancora in corso. Attendi un po’ prima di aggiungere un nuovo punto.", - "zoomInFurther": "Ingrandisci la mappa per aggiungere un punto.", - "pleaseLogin": "Accedi per aggiungere un punto", - "intro": "Hai cliccato in un punto dove non ci sono ancora dei dati.
", - "title": "Aggiungi un nuovo punto?", - "addNew": "Aggiungi una nuova {category} qua", - "presetInfo": "Il nuovo PDI avrà {tags}", - "warnVisibleForEveryone": "La tua aggiunta sarà visibile a tutti", - "zoomInMore": "Ingrandisci ancora per importare questo oggetto", - "hasBeenImported": "Questo punto è stato già importato", - "disableFilters": "Disabilita tutti i filtri", - "addNewMapLabel": "Aggiungi nuovo elemento", - "disableFiltersExplanation": "Alcuni oggetti potrebbero essere nascosti da un filtro" - }, - "osmLinkTooltip": "Visita questo oggetto su OpenStreetMap per la cronologia o altre opzioni di modifica", - "number": "numero", - "skippedQuestions": "Alcune domande sono state scartate", - "oneSkippedQuestion": "Una domanda è stata scartata", - "skip": "Salta questa domanda", - "cancel": "Annulla", - "save": "Salva", - "returnToTheMap": "Ritorna alla mappa", - "search": { - "error": "Qualcosa è andato storto…", - "nothing": "Non è stato trovato nulla…", - "searching": "Ricerca…", - "search": "Cerca un luogo" - }, - "loginToStart": "Accedi per rispondere alla domanda", - "welcomeBack": "Hai effettuato l’accesso. Bentornato/a!", - "loginWithOpenStreetMap": "Accedi con OpenStreetMap", - "loading": "Caricamento…", - "download": { - "downloadAsPdf": "Scarica un PDF della mappa corrente", - "downloadCSV": "Scarica i dati visibili come CSV", - "noDataLoaded": "Nessun dato è stato ancora caricato. Lo scaricamento sarà disponibile a breve", - "downloadGeojson": "Scarica i dati visibili come GeoJSON", - "downloadAsPdfHelper": "Ideale per stampare la mappa corrente", - "downloadGeoJsonHelper": "Compatibile con QGIS, ArcGIS, ESRI, etc.", - "title": "Scarica i dati visibili", - "downloadCSVHelper": "Compatibile con LibreOffice Calc, Excel, etc.", - "includeMetaData": "Includi metadati (ultimo utente, valori calcolati, etc.)", - "licenseInfo": "

Informativa sul copyright

I dati forniti sono disponibili con licenza ODbL. Il riutilizzo di tali dati è libero per qualsiasi scopo ma
  • è richiesta l’attribuzione © OpenStreetMap contributors
  • qualsiasi modifica di questi data deve essere rilasciata con la stessa licenza
Per ulteriori dettagli si prega di leggere l’informativa completa sul copyright", - "exporting": "Esportazione in corso…" - }, - "testing": "Prova (le modifiche non verranno salvate)", - "pdf": { - "versionInfo": "v{version} - generato il {date}", - "attr": "Dati della mappa © OpenStreetMap Contributors, riutilizzabile con licenza ODbL", - "generatedWith": "Generato con MapComplete.osm.be", - "attrBackground": "Livello di sfondo: {background}" - }, - "openTheMap": "Apri la mappa", - "histogram": { - "error_loading": "Impossibile caricare l'istogramma" - }, - "wikipedia": { - "loading": "Caricamento Wikipedia…", - "noResults": "Nessun elemento trovato per {search}", - "doSearch": "Cerca qui sopra per vedere i risultati", - "noWikipediaPage": "Questo elemento Wikidata non ha ancora una pagina Wikipedia corrispondente.", - "searchWikidata": "Cerca su Wikidata", - "createNewWikidata": "Crea un nuovo elemento Wikidata", - "wikipediaboxTitle": "Wikipedia", - "failed": "Caricamento della voce Wikipedia fallito" - }, - "loginOnlyNeededToEdit": "se vuoi modificare la mappa" + "sharescreen": { + "embedIntro": "

Incorpora nel tuo sito web

Siamo lieti se vorrai includere questa cartina nel tuo sito web.
Ti incoraggiamo a farlo (non devi neanche chieder il permesso).
È gratuito e lo sarà per sempre. Più persone lo useranno e più valore acquisirà.", + "addToHomeScreen": "

Aggiungi alla tua schermata Home

Puoi aggiungere facilmente questo sito web alla schermata Home del tuo smartphone. Per farlo, clicca sul pulsante ‘Aggiungi a schermata Home’ nella barra degli indirizzi.", + "fsIncludeCurrentLocation": "Includi la posizione attuale", + "fsIncludeCurrentBackgroundMap": "Includi lo sfondo attualmente selezionato {name}", + "fsIncludeCurrentLayers": "Includi i livelli correntemente selezionati", + "fsGeolocation": "Abilita il pusante ‘geo-localizzami’ (solo da mobile)", + "fsAddNew": "Abilita il pulsante ‘aggiungi nuovo PDI’", + "fsLayerControlToggle": "Inizia con il pannello dei livelli aperto", + "fsLayers": "Abilita il controllo dei livelli", + "fsWelcomeMessage": "Mostra il messaggio di benvenuto e le schede associate", + "fsSearch": "Abilita la barra di ricerca", + "fsUserbadge": "Abilita il pulsante di accesso", + "editThemeDescription": "Aggiungi o modifica le domande a questo tema della mappa", + "editThisTheme": "Modifica questo tema", + "thanksForSharing": "Grazie per la condivisione!", + "copiedToClipboard": "Collegamento copiato negli appunti", + "intro": "

Condividi questa mappa

Condividi questa mappa copiando il collegamento qua sotto e inviandolo ad amici o parenti:" }, - "index": { - "#": "Questi testi sono mostrati sopra ai pulsanti del tema quando nessun tema è stato caricato", - "pickTheme": "Scegli un tema qui sotto per iniziare.", - "intro": "MapComplete è un visualizzatore/editore di OpenStreetMap che mostra le informazioni riguardanti gli oggetti di uno specifico tema e permette di aggiornarle.", - "title": "Benvenuto/a su MapComplete", - "featuredThemeTitle": "Questa settimana in vetrina" + "attribution": { + "attributionContent": "

Tutti i dati sono forniti da OpenStreetMap, riutilizzabili liberamente con Open Database License

", + "attributionTitle": "Crediti", + "codeContributionsBy": "MapComplete è stato realizzato da {contributors} e {hiddenCount} altri collaboratori", + "mapContributionsByAndHidden": "I dati attualmente visibili sono stati modificati da {contributors} e {hiddenCount} altri contributori", + "mapContributionsBy": "I dati attualmente visibili sono stati creati da {contributors}", + "iconAttribution": { + "title": "Icone utilizzate" + }, + "themeBy": "Tema manutenuto da {author}" }, - "favourite": { - "reload": "Ricarica i dati", - "loginNeeded": "

Accedi

Il layout personale è disponibile soltanto per gli utenti OpenStreetMap", - "panelIntro": "

Il tuo tema personale

Attiva i tuoi livelli preferiti fra tutti i temi ufficiali" + "openStreetMapIntro": "

Una mappa libera

Non sarebbe perfetto se esistesse una carta geografica che chiunque può modificare e utilizzare liberamente? Un unico posto in un cui conservare tutte le informazioni geografiche? In questo modo tutti questi siti web con mappe diverse, piccole e incompatibili (che sono sempre obsolete) diverrebbero istantaneamente inutili.

OpenStreetMap è proprio questa mappa. I dati geografici possono essere usati liberamente (rispettando l’attribuzione e la pubblicazione delle modifiche di quei dati). In più, chiunque può aggiungere liberamente nuovi dati e correggere gli errori. Anche questo sito usa OpenStreetMap. Tutti i dati provengono da lì e le tue risposte e correzioni finiscono sempre lì.

Moltissime persone e applicazioni già usano OpenStreetmap: Maps.me, OsmAnd ma anche le cartine di Facebook, Instagram, Apple e Bing si basano (parzialmente) su OpenStreetMap. Tutto quello che cambi qua si rifletterà anche su quelle applicazioni (non appena avranno aggiornato i loro dati!)

", + "opening_hours": { + "ph_open": "aperto", + "ph_closed": "chiuso", + "ph_not_known": " ", + "open_24_7": "Sempre aperto", + "closed_permanently": "Chiuso per un periodo sconosciuto", + "closed_until": "Chiuso fino al {date}", + "not_all_rules_parsed": "Gli orari di apertura di questo negozio sono complicati. Le seguenti regole sono state ignorate per l’oggetto in ingresso:", + "openTill": "fino a", + "opensAt": "da", + "open_during_ph": "Durante le festività questo luogo è", + "error_loading": "Errore: impossibile visualizzare questi orari di apertura.", + "ph_open_as_usual": "aperto come di consueto", + "loadingCountry": "Determinazione del Paese…" }, - "centerMessage": { - "retrying": "Caricamento dei dati fallito. Nuovo tentativo tra {count} secondi…", - "ready": "Finito!", - "zoomIn": "Ingrandisci la mappa per vedere e modificare i dati", - "loadingData": "Caricamento dei dati…" + "weekdays": { + "sunday": "Domenica", + "saturday": "Sabato", + "friday": "Venerdì", + "thursday": "Giovedì", + "wednesday": "Mercoledì", + "tuesday": "Martedì", + "monday": "Lunedì", + "abbreviations": { + "sunday": "Dom", + "saturday": "Sab", + "friday": "Ven", + "thursday": "Gio", + "wednesday": "Mer", + "tuesday": "Mar", + "monday": "Lun" + } }, - "image": { - "isDeleted": "Cancellata", - "doDelete": "Rimuovi immagine", - "dontDelete": "Annulla", - "uploadDone": "La tua foto è stata aggiunta. Grazie per l’aiuto!", - "respectPrivacy": "Non fotografare persone o targhe dei veicoli. Non caricare da Google Maps, Google Streetview o da altre fonti coperte da copyright.", - "uploadFailed": "Impossibile caricare la tua foto. La connessione internet è attiva e le API di terze parti sono abilitate? Il browser Brave o il plugin uMatrix potrebbero bloccarle.", - "ccb": "con licenza CC-BY", - "ccbs": "con licenza CC-BY-SA", - "cco": "nel pubblico dominio", - "willBePublished": "La tua foto sarà pubblicata: ", - "pleaseLogin": "Accedi per caricare una foto", - "uploadingMultiple": "Caricamento di {count} foto…", - "uploadingPicture": "Caricamento della tua foto…", - "addPicture": "Aggiungi foto", - "uploadMultipleDone": "Sono state aggiunte {count} immagini. Grazie per l’aiuto!", - "toBig": "La tua immagine è troppo grande in quanto è di {actual_size}. Cerca di usare immagini non più grandi di {max_size}" + "layerSelection": { + "title": "Seleziona livelli", + "zoomInToSeeThisLayer": "Ingrandisci la mappa per vedere questo livello" }, - "delete": { - "reasons": { - "test": "Si tratta di un punto di prova (l’oggetto non è mai esistito in quel punto)", - "disused": "L’oggetto è in disuso o è stato smantellato", - "notFound": "Non è stato possibile trovare l’oggetto", - "duplicate": "Questo punto è un duplicato di un altro oggetto" - }, - "explanations": { - "selectReason": "Si prega di selezionare il motivo della rimozione di questo oggetto", - "hardDelete": "Questo punto verrà rimosso da OpenStreetMap. Un utente esperto potrebbe recuperarlo", - "softDelete": "Questo oggetto verrà aggiornato e nascosto da questa applicazione. {reason}" - }, - "loginToDelete": "Devi aver effettuato l’accesso per poter rimuovere un punto", - "safeDelete": "Questo punto può essere rimosso in sicurezza.", - "isntAPoint": "Solo i punti possono essere rimossi, l’oggetto selezionato è un percorso, un’area oppure una relazione.", - "onlyEditedByLoggedInUser": "Questo punto è stato modificato soltanto da te, puoi rimuoverlo in sicurezza.", - "notEnoughExperience": "Questo nodo è stato creato da un altro utente.", - "delete": "Rimuovi", - "isDeleted": "Questo oggetto è stato rimosso", - "cannotBeDeleted": "Questo oggetto non può essere rimosso", - "useSomethingElse": "Per rimuoverlo usa un altro editor OpenStreetMap", - "loading": "Controllo delle proprietà per verificare se questo oggetto può essere rimosso.", - "partOfOthers": "Questo punto fa parte di qualche percorso o relazione e non può essere rimosso direttamente.", - "whyDelete": "Perché questo nodo andrebbe rimosso?", - "cancel": "Annulla", - "readMessages": "Hai dei messaggi non letti. Leggili prima di rimuovere un punto (qualcuno potrebbe aver lasciato un commento)" + "backgroundMap": "Mappa di sfondo", + "customThemeIntro": "

Temi personalizzati

Questi sono i temi degli utenti che hai già visitato.", + "noTagsSelected": "Nessuna etichetta selezionata", + "getStartedNewAccount": " oppure crea un nuovo account", + "getStartedLogin": "Accedi con OpenStreetMap per iniziare", + "goToInbox": "Apri posta in arrivo", + "fewChangesBefore": "Rispondi ad alcune domande di punti esistenti prima di aggiungere un nuovo punto.", + "readYourMessages": "Leggi tutti i tuoi messaggi OpenStreetMap prima di aggiungere un nuovo punto.", + "questions": { + "emailIs": "L’indirizzo email di questa {category} è {email}", + "emailOf": "Qual è l’indirizzo email di {category}?", + "websiteIs": "Sito web: {website}", + "websiteOf": "Qual è il sito web di {category}?", + "phoneNumberIs": "Il numero di telefono di questa {category} è {phone}", + "phoneNumberOf": "Qual è il numero di telefono di {category}?" }, - "move": { - "loginToMove": "Devi aver effettuato l’accesso per spostare un punto", - "partOfAWay": "Quest’oggetto fa parte di un altro percorso. Usa un altro editor per spostarlo.", - "partOfRelation": "Quest’oggetto fa parte di una relazione. Usa un altro editor per spostarlo.", - "isWay": "Quest’oggetto è un percorso. Usa un altro editor OpenStreetMap per spostarlo.", - "isRelation": "Quest’oggetto è una relazione e non può essere spostato", - "cancel": "Annulla lo spostamento", - "pointIsMoved": "Questo punto è stato spostato", - "zoomInFurther": "Ingrandisci ulteriormente per confermare questo spostamento", - "moveTitle": "Sposta questo punto", - "whyMove": "Perché vuoi spostare questo punto?", - "confirmMove": "Spostalo qua", - "inviteToMove": { - "reasonInaccurate": "Migliora la precisione di questo punto", - "generic": "Sposta questo punto", - "reasonRelocation": "Sposta quest’oggetto in un altro luogo perché è stato ricollocato" - }, - "selectReason": "Perché vuoi spostare quest’oggetto?", - "reasons": { - "reasonInaccurate": "La posizione di questo oggetto non è precisa e dovrebbe essere spostato di alcuni metri", - "reasonRelocation": "Questo oggetto è stato ricollocato in una posizione totalmente differente" - }, - "inviteToMoveAgain": "Sposta di nuovo questo punto", - "cannotBeMoved": "Questo oggetto non può essere spostato." + "noNameCategory": "{category} senza nome", + "nameInlineQuestion": "Il nome di questa {category} è $$$", + "about": "Modifica e aggiungi con semplicità OpenStreetMap per un certo tema", + "pickLanguage": "Scegli una lingua: ", + "add": { + "layerNotEnabled": "Il livello {layer} non è abilitato. Abilita questo livello per aggiungere un punto", + "openLayerControl": "Apri il pannello di controllo dei livelli", + "confirmButton": "Aggiungi una {category} qua.
La tua aggiunta è visibile a chiunque
", + "confirmIntro": "

Aggiungere un {title} qua?

Il punto che hai creato qua sarà visibile da chiunque. Per favore, aggiungi sulla mappa solo oggetti realmente esistenti. Molte applicazioni usano questi dati.", + "stillLoading": "Caricamento dei dati ancora in corso. Attendi un po’ prima di aggiungere un nuovo punto.", + "zoomInFurther": "Ingrandisci la mappa per aggiungere un punto.", + "pleaseLogin": "Accedi per aggiungere un punto", + "intro": "Hai cliccato in un punto dove non ci sono ancora dei dati.
", + "title": "Aggiungi un nuovo punto?", + "addNew": "Aggiungi una nuova {category} qua", + "presetInfo": "Il nuovo PDI avrà {tags}", + "warnVisibleForEveryone": "La tua aggiunta sarà visibile a tutti", + "zoomInMore": "Ingrandisci ancora per importare questo oggetto", + "hasBeenImported": "Questo punto è stato già importato", + "disableFilters": "Disabilita tutti i filtri", + "addNewMapLabel": "Aggiungi nuovo elemento", + "disableFiltersExplanation": "Alcuni oggetti potrebbero essere nascosti da un filtro" }, - "multi_apply": { - "autoApply": "Quando si modificano gli attributi {attr_names}, questi attributi vengono anche automaticamente cambiati su altri {count} oggetti" + "osmLinkTooltip": "Visita questo oggetto su OpenStreetMap per la cronologia o altre opzioni di modifica", + "number": "numero", + "skippedQuestions": "Alcune domande sono state scartate", + "oneSkippedQuestion": "Una domanda è stata scartata", + "skip": "Salta questa domanda", + "cancel": "Annulla", + "save": "Salva", + "returnToTheMap": "Ritorna alla mappa", + "search": { + "error": "Qualcosa è andato storto…", + "nothing": "Non è stato trovato nulla…", + "searching": "Ricerca…", + "search": "Cerca un luogo" }, - "split": { - "hasBeenSplit": "Questa strada è stata divisa", - "cancel": "Annulla", - "splitTitle": "Scegli sulla cartina il punto dove vuoi dividere la strada", - "inviteToSplit": "Dividi questa strada in segmenti più piccoli. Ciò permette di assegnare proprietà differenti a ciascun pezzo di strada.", - "split": "Dividi", - "loginToSplit": "Devi aver effettuato l’accesso per dividere una strada" - } + "loginToStart": "Accedi per rispondere alla domanda", + "welcomeBack": "Hai effettuato l’accesso. Bentornato/a!", + "loginWithOpenStreetMap": "Accedi con OpenStreetMap", + "loading": "Caricamento…", + "download": { + "downloadAsPdf": "Scarica un PDF della mappa corrente", + "downloadCSV": "Scarica i dati visibili come CSV", + "noDataLoaded": "Nessun dato è stato ancora caricato. Lo scaricamento sarà disponibile a breve", + "downloadGeojson": "Scarica i dati visibili come GeoJSON", + "downloadAsPdfHelper": "Ideale per stampare la mappa corrente", + "downloadGeoJsonHelper": "Compatibile con QGIS, ArcGIS, ESRI, etc.", + "title": "Scarica i dati visibili", + "downloadCSVHelper": "Compatibile con LibreOffice Calc, Excel, etc.", + "includeMetaData": "Includi metadati (ultimo utente, valori calcolati, etc.)", + "licenseInfo": "

Informativa sul copyright

I dati forniti sono disponibili con licenza ODbL. Il riutilizzo di tali dati è libero per qualsiasi scopo ma
  • è richiesta l’attribuzione © OpenStreetMap contributors
  • qualsiasi modifica di questi data deve essere rilasciata con la stessa licenza
Per ulteriori dettagli si prega di leggere l’informativa completa sul copyright", + "exporting": "Esportazione in corso…" + }, + "testing": "Prova (le modifiche non verranno salvate)", + "pdf": { + "versionInfo": "v{version} - generato il {date}", + "attr": "Dati della mappa © OpenStreetMap Contributors, riutilizzabile con licenza ODbL", + "generatedWith": "Generato con MapComplete.osm.be", + "attrBackground": "Livello di sfondo: {background}" + }, + "openTheMap": "Apri la mappa", + "histogram": { + "error_loading": "Impossibile caricare l'istogramma" + }, + "wikipedia": { + "loading": "Caricamento Wikipedia…", + "noResults": "Nessun elemento trovato per {search}", + "doSearch": "Cerca qui sopra per vedere i risultati", + "noWikipediaPage": "Questo elemento Wikidata non ha ancora una pagina Wikipedia corrispondente.", + "searchWikidata": "Cerca su Wikidata", + "createNewWikidata": "Crea un nuovo elemento Wikidata", + "wikipediaboxTitle": "Wikipedia", + "failed": "Caricamento della voce Wikipedia fallito" + }, + "loginOnlyNeededToEdit": "se vuoi modificare la mappa" + }, + "index": { + "#": "Questi testi sono mostrati sopra ai pulsanti del tema quando nessun tema è stato caricato", + "pickTheme": "Scegli un tema qui sotto per iniziare.", + "intro": "MapComplete è un visualizzatore/editore di OpenStreetMap che mostra le informazioni riguardanti gli oggetti di uno specifico tema e permette di aggiornarle.", + "title": "Benvenuto/a su MapComplete", + "featuredThemeTitle": "Questa settimana in vetrina" + }, + "favourite": { + "reload": "Ricarica i dati", + "loginNeeded": "

Accedi

Il layout personale è disponibile soltanto per gli utenti OpenStreetMap", + "panelIntro": "

Il tuo tema personale

Attiva i tuoi livelli preferiti fra tutti i temi ufficiali" + }, + "centerMessage": { + "retrying": "Caricamento dei dati fallito. Nuovo tentativo tra {count} secondi…", + "ready": "Finito!", + "zoomIn": "Ingrandisci la mappa per vedere e modificare i dati", + "loadingData": "Caricamento dei dati…" + }, + "image": { + "isDeleted": "Cancellata", + "doDelete": "Rimuovi immagine", + "dontDelete": "Annulla", + "uploadDone": "La tua foto è stata aggiunta. Grazie per l’aiuto!", + "respectPrivacy": "Non fotografare persone o targhe dei veicoli. Non caricare da Google Maps, Google Streetview o da altre fonti coperte da copyright.", + "uploadFailed": "Impossibile caricare la tua foto. La connessione internet è attiva e le API di terze parti sono abilitate? Il browser Brave o il plugin uMatrix potrebbero bloccarle.", + "ccb": "con licenza CC-BY", + "ccbs": "con licenza CC-BY-SA", + "cco": "nel pubblico dominio", + "willBePublished": "La tua foto sarà pubblicata: ", + "pleaseLogin": "Accedi per caricare una foto", + "uploadingMultiple": "Caricamento di {count} foto…", + "uploadingPicture": "Caricamento della tua foto…", + "addPicture": "Aggiungi foto", + "uploadMultipleDone": "Sono state aggiunte {count} immagini. Grazie per l’aiuto!", + "toBig": "La tua immagine è troppo grande in quanto è di {actual_size}. Cerca di usare immagini non più grandi di {max_size}" + }, + "delete": { + "reasons": { + "test": "Si tratta di un punto di prova (l’oggetto non è mai esistito in quel punto)", + "disused": "L’oggetto è in disuso o è stato smantellato", + "notFound": "Non è stato possibile trovare l’oggetto", + "duplicate": "Questo punto è un duplicato di un altro oggetto" + }, + "explanations": { + "selectReason": "Si prega di selezionare il motivo della rimozione di questo oggetto", + "hardDelete": "Questo punto verrà rimosso da OpenStreetMap. Un utente esperto potrebbe recuperarlo", + "softDelete": "Questo oggetto verrà aggiornato e nascosto da questa applicazione. {reason}" + }, + "loginToDelete": "Devi aver effettuato l’accesso per poter rimuovere un punto", + "safeDelete": "Questo punto può essere rimosso in sicurezza.", + "isntAPoint": "Solo i punti possono essere rimossi, l’oggetto selezionato è un percorso, un’area oppure una relazione.", + "onlyEditedByLoggedInUser": "Questo punto è stato modificato soltanto da te, puoi rimuoverlo in sicurezza.", + "notEnoughExperience": "Questo nodo è stato creato da un altro utente.", + "delete": "Rimuovi", + "isDeleted": "Questo oggetto è stato rimosso", + "cannotBeDeleted": "Questo oggetto non può essere rimosso", + "useSomethingElse": "Per rimuoverlo usa un altro editor OpenStreetMap", + "loading": "Controllo delle proprietà per verificare se questo oggetto può essere rimosso.", + "partOfOthers": "Questo punto fa parte di qualche percorso o relazione e non può essere rimosso direttamente.", + "whyDelete": "Perché questo nodo andrebbe rimosso?", + "cancel": "Annulla", + "readMessages": "Hai dei messaggi non letti. Leggili prima di rimuovere un punto (qualcuno potrebbe aver lasciato un commento)" + }, + "move": { + "loginToMove": "Devi aver effettuato l’accesso per spostare un punto", + "partOfAWay": "Quest’oggetto fa parte di un altro percorso. Usa un altro editor per spostarlo.", + "partOfRelation": "Quest’oggetto fa parte di una relazione. Usa un altro editor per spostarlo.", + "isWay": "Quest’oggetto è un percorso. Usa un altro editor OpenStreetMap per spostarlo.", + "isRelation": "Quest’oggetto è una relazione e non può essere spostato", + "cancel": "Annulla lo spostamento", + "pointIsMoved": "Questo punto è stato spostato", + "zoomInFurther": "Ingrandisci ulteriormente per confermare questo spostamento", + "moveTitle": "Sposta questo punto", + "whyMove": "Perché vuoi spostare questo punto?", + "confirmMove": "Spostalo qua", + "inviteToMove": { + "reasonInaccurate": "Migliora la precisione di questo punto", + "generic": "Sposta questo punto", + "reasonRelocation": "Sposta quest’oggetto in un altro luogo perché è stato ricollocato" + }, + "selectReason": "Perché vuoi spostare quest’oggetto?", + "reasons": { + "reasonInaccurate": "La posizione di questo oggetto non è precisa e dovrebbe essere spostato di alcuni metri", + "reasonRelocation": "Questo oggetto è stato ricollocato in una posizione totalmente differente" + }, + "inviteToMoveAgain": "Sposta di nuovo questo punto", + "cannotBeMoved": "Questo oggetto non può essere spostato." + }, + "multi_apply": { + "autoApply": "Quando si modificano gli attributi {attr_names}, questi attributi vengono anche automaticamente cambiati su altri {count} oggetti" + }, + "split": { + "hasBeenSplit": "Questa strada è stata divisa", + "cancel": "Annulla", + "splitTitle": "Scegli sulla cartina il punto dove vuoi dividere la strada", + "inviteToSplit": "Dividi questa strada in segmenti più piccoli. Ciò permette di assegnare proprietà differenti a ciascun pezzo di strada.", + "split": "Dividi", + "loginToSplit": "Devi aver effettuato l’accesso per dividere una strada" + } } diff --git a/langs/nb_NO.json b/langs/nb_NO.json index 7b3748873..df74de38d 100644 --- a/langs/nb_NO.json +++ b/langs/nb_NO.json @@ -1,276 +1,276 @@ { - "general": { - "skip": "Hopp over dette spørsmålet", - "cancel": "Avbryt", - "save": "Lagre", - "search": { - "searching": "Søker …", - "search": "Søk etter et sted", - "nothing": "Resultatløst …", - "error": "Noe gikk galt ." - }, - "welcomeBack": "Du er innlogget. Velkommen tilbake.", - "pdf": { - "versionInfo": "v{version}. Generert {date}", - "attr": "Kartdata © OpenStreetMap-bidragsytere, gjenbrukbart med ODbL-lisens", - "generatedWith": "Generert av MapComplete.osm.be", - "attrBackground": "Bakgrunnslag: {background}" - }, - "loginToStart": "Logg inn for å besvare dette spørsmålet", - "osmLinkTooltip": "Vis dette objektet på OpenStreetMap for historikk og flere redigeringsvalg", - "add": { - "presetInfo": "Det nye interessepunktet vil få {tags}", - "zoomInFurther": "Forstørr mer for å legge til et punkt.", - "title": "Legg til et nytt punkt?", - "intro": "Du klikket et sted der ingen data er kjent enda.
", - "addNewMapLabel": "Legg til nytt element", - "confirmIntro": "

Legg til {title} her?

Punktet du oppretter her vil være synlig for alle. Kun legg til ting på kartet hvis de virkelig finnes. Mange programmer bruker denne dataen.", - "layerNotEnabled": "Laget {layer} er ikke påslått. Skru på dette laget for å legge til et punkt.", - "confirmButton": "Legg til en {category} her.
Din endring er synlig for alle
", - "openLayerControl": "Åpne lagkontrollboksen", - "hasBeenImported": "Dette punktet har allerede blitt importert", - "stillLoading": "Dataen lastes fremdeles inn. Vent litt før du legger til et nytt punkt.", - "warnVisibleForEveryone": "Din endring vil være synlig for alle", - "zoomInMore": "Forstørr mer for å importere denne funksjonen", - "disableFilters": "Skru av alle filtre", - "disableFiltersExplanation": "Det kan hende noen funksjoner er skjult av et filter", - "addNew": "Legg til en ny {category} her", - "pleaseLogin": "Logg inn for å legge til et nytt punkt" - }, - "noNameCategory": "{category} uten navn", - "morescreen": { - "requestATheme": "Hvis du ønsker et brukerdefinert tema kan du forespørre det i feilsporeren", - "intro": "

Flere temakart?

Liker du å samle inn geodata?
Det er flere tilgjengelige temaer.", - "createYourOwnTheme": "Opprett ditt eget MapComplete-tema fra grunnen av", - "hiddenExplanation": "Disse temaene er kun tilgjengelige hvis du kjenner lenken. Du har oppdaget {hidden_discovered} av {total_hidden} hidden tema.", - "previouslyHiddenTitle": "Tidligere besøkte skjulte tema", - "streetcomplete": "Et annet lignende program er StreetComplete." - }, - "questions": { - "emailIs": "E-postadressen til {category} er {email}", - "websiteIs": "Nettside: {website}", - "emailOf": "Hva er e-postadressen til {category}?", - "phoneNumberOf": "Hva er telefonnummeret til {category}?", - "websiteOf": "Hva er nettsiden til {category}?", - "phoneNumberIs": "Telefonnummeret til denne {category} er {phone}" - }, - "sharescreen": { - "thanksForSharing": "Takk for at du bidrar.", - "copiedToClipboard": "Lenke kopiert til utklippstavle", - "intro": "

Del dette kartet

Del dette kartet ved å kopiere lenken nedenfor og sende den til venner og familie:", - "fsUserbadge": "Skru på innloggingsknappen", - "fsSearch": "Skru på søkefeltet", - "fsWelcomeMessage": "Vis velkomst-oppsprettsmeldinger og tilknyttede faner", - "editThisTheme": "Rediger dette temaet", - "fsGeolocation": "Skru på «Geolokaliser meg»-knappen (kun for mobil)", - "fsIncludeCurrentBackgroundMap": "Inkluder nåværende bakgrunnsvalg {name}", - "fsLayerControlToggle": "Start med lagkontrollen utvidet", - "addToHomeScreen": "

Legg til på hjemmeskjermen din

Du kan enkelt legge til denne nettsiden på din smarttelefon-hjemmeskjerm for å få det hele integrert. Klikk på «Legg til på hjemmeskjerm»-knappen i nettadressefeltet for å gjøre dette.", - "fsLayers": "Skru på lagkontrollen", - "fsIncludeCurrentLayers": "Inkluder nåværende lagvalg", - "fsIncludeCurrentLocation": "Inkluder nåværende posisjon", - "embedIntro": "

Bygg inn på nettsiden din

Legg til dette kartet på nettsiden din.
Du oppfordres til å gjøre dette, og trenger ikke å spørre om tillatelse.
Det er fritt, og vil alltid være det. Desto flere som bruker dette, desto mer verdifullt blir det." - }, - "attribution": { - "mapContributionsBy": "Den dataen som er synlig nå har redigeringer gjort av {contributors}", - "attributionContent": "

All data er fra OpenStreetMap, fritt gjenbrukbart med Open DataBase-lisens.

", - "codeContributionsBy": "MapComplete har blitt bygd av {contributors} og {hiddenCount} bidragsytere til", - "mapContributionsByAndHidden": "Data som vises nå har redigeringer gjort av {contributors} og {hiddenCount} andre bidragsytere", - "iconAttribution": { - "title": "Brukte ikoner" - }, - "themeBy": "Tema vedlikeholdt av {author}", - "attributionTitle": "Tilskrivelsesmerknad" - }, - "backgroundMap": "Bakgrunnskart", - "loginOnlyNeededToEdit": "hvis du ønsker å redigere kartet", - "readYourMessages": "Les alle OpenStreetMap-meldingene dine før du legger til et nytt punkt.", - "noTagsSelected": "Ingen etiketter valgt", - "customThemeIntro": "

Egendefinerte tema

Dette er tidligere besøkte brukergenererte tema.", - "layerSelection": { - "zoomInToSeeThisLayer": "Forstørr kartet hvis du vil se dette kartet", - "title": "Velg lag" - }, - "download": { - "downloadCSV": "Last ned synlig data som CSV", - "downloadAsPdfHelper": "Ideelt for utskrift av nåværende kart", - "noDataLoaded": "Ingen data innlastet enda. Nedlasting vil være tilgjengelig snart.", - "downloadAsPdf": "Last ned PDF av nåværende kart", - "downloadCSVHelper": "Kompatibelt med LibreOffice Calc, Excel, …", - "title": "Last ned synlig data", - "downloadGeojson": "Last ned synlig data som GeoJSON", - "licenseInfo": "

Opphavsrettsmerknad

Tilbudt data er tilgjengelig med ODbL-lisens. Gjenbruk er gratis for alle formål, men
  • tilskrivelsen© OpenStreetMap-bidragsytere kreves
  • Enhver endring må publiseres under samme lisens
Les hele opphavsrettsmerknaden for detaljer.", - "exporting": "Eksporterer …", - "includeMetaData": "Inkluder metadata (siste bidragsytere, utregnede verdier, …)", - "downloadGeoJsonHelper": "Kompatibelt med QGIS, ArcGIS, ESRI, …" - }, - "weekdays": { - "friday": "Fredag", - "saturday": "Lørdag", - "sunday": "Søndag", - "wednesday": "Onsdag", - "abbreviations": { - "thursday": "Tor", - "sunday": "Søn", - "monday": "Man", - "wednesday": "Ons", - "tuesday": "Tir", - "saturday": "Lør", - "friday": "Fre" - }, - "thursday": "Torsdag", - "monday": "Mandag", - "tuesday": "Tirsdag" - }, - "opening_hours": { - "openTill": "til", - "closed_until": "Stengt til {date}", - "open_24_7": "Døgnåpent", - "closed_permanently": "Stengt på ubestemt tid", - "ph_open_as_usual": "åpen som vanlig", - "loadingCountry": "Bestemmer land …", - "error_loading": "Feil: Kunne ikke visualisere disse åpningstidene.", - "open_during_ph": "På offentlige helligdager og ferier er dette stedet", - "not_all_rules_parsed": "Åpningstidene for dette stedet er kompliserte. Følgende regler ble sett bort fra i inndataelementet:", - "ph_not_known": " ", - "ph_closed": "stengt", - "opensAt": "fra", - "ph_open": "åpen" - }, - "histogram": { - "error_loading": "Kunne ikke laste inn histogrammet" - }, - "loading": "Laster inn …", - "openTheMap": "Åpne kartet", - "testing": "Testing. ingen endringer vil bli lagret.", - "wikipedia": { - "wikipediaboxTitle": "Wikipedia", - "loading": "Laster inn Wikipedia …", - "doSearch": "Søk ovenfor for å se resultater", - "noResults": "Fant ikke noe for {search}", - "noWikipediaPage": "Dette Wikipedia-elementet har ingen tilknyttet Wikipedia-side enda.", - "searchWikidata": "Søk på Wikipedia", - "createNewWikidata": "Opprett et nytt Wikipedia-element", - "failed": "Innlasting av Wikipedia-artikkel mislyktes" - }, - "returnToTheMap": "Gå tilbake til kartet", - "skippedQuestions": "Noen spørsmål ble hoppet over", - "oneSkippedQuestion": "Et spørsmål ble hoppet over", - "number": "tall", - "pickLanguage": "Velg språk: ", - "goToInbox": "Åpne innboks", - "getStartedNewAccount": " eller opprett en ny konto", - "getStartedLogin": "Logg inn med OpenStreetMap for å begynne", - "fewChangesBefore": "Besvar et par spørsmål for eksisterende punkter før du legger til et nytt." + "general": { + "skip": "Hopp over dette spørsmålet", + "cancel": "Avbryt", + "save": "Lagre", + "search": { + "searching": "Søker …", + "search": "Søk etter et sted", + "nothing": "Resultatløst …", + "error": "Noe gikk galt ." }, - "index": { - "pickTheme": "Begynn ved å velge et av temaene nedenfor.", - "title": "Velkommen til MapComplete", - "intro": "MapComplete er en OpenStreetMap-viser og redigerer, som viser deg info om funksjoner for et gitt tema og tillater oppdatering av det.", - "featuredThemeTitle": "Framhevet denne uken" + "welcomeBack": "Du er innlogget. Velkommen tilbake.", + "pdf": { + "versionInfo": "v{version}. Generert {date}", + "attr": "Kartdata © OpenStreetMap-bidragsytere, gjenbrukbart med ODbL-lisens", + "generatedWith": "Generert av MapComplete.osm.be", + "attrBackground": "Bakgrunnslag: {background}" }, - "centerMessage": { - "ready": "Ferdig", - "zoomIn": "Forstørr for å vise eller redigere data", - "loadingData": "Laster inn data …", - "retrying": "Kunne ikke laste inn data. Prøver igjen om {count} sekunder …" + "loginToStart": "Logg inn for å besvare dette spørsmålet", + "osmLinkTooltip": "Vis dette objektet på OpenStreetMap for historikk og flere redigeringsvalg", + "add": { + "presetInfo": "Det nye interessepunktet vil få {tags}", + "zoomInFurther": "Forstørr mer for å legge til et punkt.", + "title": "Legg til et nytt punkt?", + "intro": "Du klikket et sted der ingen data er kjent enda.
", + "addNewMapLabel": "Legg til nytt element", + "confirmIntro": "

Legg til {title} her?

Punktet du oppretter her vil være synlig for alle. Kun legg til ting på kartet hvis de virkelig finnes. Mange programmer bruker denne dataen.", + "layerNotEnabled": "Laget {layer} er ikke påslått. Skru på dette laget for å legge til et punkt.", + "confirmButton": "Legg til en {category} her.
Din endring er synlig for alle
", + "openLayerControl": "Åpne lagkontrollboksen", + "hasBeenImported": "Dette punktet har allerede blitt importert", + "stillLoading": "Dataen lastes fremdeles inn. Vent litt før du legger til et nytt punkt.", + "warnVisibleForEveryone": "Din endring vil være synlig for alle", + "zoomInMore": "Forstørr mer for å importere denne funksjonen", + "disableFilters": "Skru av alle filtre", + "disableFiltersExplanation": "Det kan hende noen funksjoner er skjult av et filter", + "addNew": "Legg til en ny {category} her", + "pleaseLogin": "Logg inn for å legge til et nytt punkt" }, - "image": { - "isDeleted": "Slettet", - "doDelete": "Fjern bilde", - "dontDelete": "Avbryt", - "uploadingMultiple": "Laster opp {count} bilder …", - "uploadingPicture": "Laster opp bildet ditt …", - "addPicture": "Legg til bilde", - "pleaseLogin": "Logg inn for å legge til et bilde", - "ccbs": "med CC-BY-SA-lisens", - "ccb": "med CC-BY-lisens", - "willBePublished": "Ditt bilde vil bli publisert: ", - "uploadFailed": "Kunne ikke laste opp bildet ditt. Er du tilkoblet Internett og tillater tredjeparts-API-er? Brave-nettleseren eller uMatrix-programtillegget kan blokkere dem.", - "uploadDone": "Bildet ditt ble lagt til. Takk for at du hjelper til.", - "uploadMultipleDone": "{count} bilder har blitt lagt til. Takk for at du hjelper til.", - "toBig": "Bildet ditt på {actual_size} er for stort. Det kan maksimalt være {max_size}." + "noNameCategory": "{category} uten navn", + "morescreen": { + "requestATheme": "Hvis du ønsker et brukerdefinert tema kan du forespørre det i feilsporeren", + "intro": "

Flere temakart?

Liker du å samle inn geodata?
Det er flere tilgjengelige temaer.", + "createYourOwnTheme": "Opprett ditt eget MapComplete-tema fra grunnen av", + "hiddenExplanation": "Disse temaene er kun tilgjengelige hvis du kjenner lenken. Du har oppdaget {hidden_discovered} av {total_hidden} hidden tema.", + "previouslyHiddenTitle": "Tidligere besøkte skjulte tema", + "streetcomplete": "Et annet lignende program er StreetComplete." }, - "delete": { - "explanations": { - "hardDelete": "Dette punktet vil bli slettet i OpenStreetMap. Det kan gjenopprettes av en dreven bidragsyter.", - "softDelete": "Denne funksjonen vil bli oppdatert og skjult fra programmet. {reason}", - "selectReason": "Velg hvorfor denne funksjonen skal slettes" - }, - "delete": "Slett", - "isDeleted": "Denne funksjonen har blitt slettet", - "loginToDelete": "Du må være innlogget for å slette et punkt", - "cancel": "Avbryt", - "cannotBeDeleted": "Denne funksjonen kan ikke slettes", - "notEnoughExperience": "Dette punktet ble opprettet av noen andre.", - "loading": "Inspiserer egenskaper for å sjekke om denne funksjonen kan slettes.", - "whyDelete": "Hvorfor bør dette punktet slettes?", - "reasons": { - "duplicate": "Dette punktet er et duplikat av en annen funksjon", - "disused": "Denne funksjonen er ute av bruk eller fjernet", - "test": "Dette var et testpunkt, funksjonen var aldri operativ", - "notFound": "Fant ikke funksjonen" - }, - "safeDelete": "Dette punktet kan trygt slettes.", - "onlyEditedByLoggedInUser": "Dette punktet har kun blitt redigert av deg. Du kan trygt slette det.", - "useSomethingElse": "Bruk en annen OpenStreetMap-redigerer til å slette det istedenfor.", - "isntAPoint": "Kun punkter kan slettes, valgt funksjon er en vei, et område, eller en relasjon.", - "partOfOthers": "Dette punktet er en del av en vei eller relasjon, og kan derfor ikke slettes direkte.", - "readMessages": "Du har uleste meldinger. Les dette før sletting av et punkt, fordi noen kan ha tilbakemeldinger å komme med." + "questions": { + "emailIs": "E-postadressen til {category} er {email}", + "websiteIs": "Nettside: {website}", + "emailOf": "Hva er e-postadressen til {category}?", + "phoneNumberOf": "Hva er telefonnummeret til {category}?", + "websiteOf": "Hva er nettsiden til {category}?", + "phoneNumberIs": "Telefonnummeret til denne {category} er {phone}" }, - "reviews": { - "posting_as": "Anmelder som", - "saving_review": "Lagrer …", - "title": "{count} vurderinger", - "no_rating": "Ingen vurdering gitt", - "plz_login": "Logg inn for å legge igjen en vurdering", - "write_a_comment": "Legg igjen en vurdering …", - "title_singular": "Én vurdering", - "name_required": "Et navn kreves for å vise og opprette vurderinger", - "affiliated_reviewer_warning": "(Tilknyttet vurdering)", - "saved": "Vurdering lagret. Takk for at du deler din mening.", - "no_reviews_yet": "Ingen vurderinger enda. Vær først til å skrive en og hjelp åpen data og bevegelsen.", - "tos": "Hvis du lager en vurdering, samtykker du til tjenestevilkårene til Mangrove.reviews", - "attribution": "Vurderinger er muliggjort av Mangrove Reviews og er tilgjengelige som CC-BY 4.0.", - "i_am_affiliated": "Jeg har en tilknytning til dette objektet
Sjekk om du er eier, skaper, ansatt, …" + "sharescreen": { + "thanksForSharing": "Takk for at du bidrar.", + "copiedToClipboard": "Lenke kopiert til utklippstavle", + "intro": "

Del dette kartet

Del dette kartet ved å kopiere lenken nedenfor og sende den til venner og familie:", + "fsUserbadge": "Skru på innloggingsknappen", + "fsSearch": "Skru på søkefeltet", + "fsWelcomeMessage": "Vis velkomst-oppsprettsmeldinger og tilknyttede faner", + "editThisTheme": "Rediger dette temaet", + "fsGeolocation": "Skru på «Geolokaliser meg»-knappen (kun for mobil)", + "fsIncludeCurrentBackgroundMap": "Inkluder nåværende bakgrunnsvalg {name}", + "fsLayerControlToggle": "Start med lagkontrollen utvidet", + "addToHomeScreen": "

Legg til på hjemmeskjermen din

Du kan enkelt legge til denne nettsiden på din smarttelefon-hjemmeskjerm for å få det hele integrert. Klikk på «Legg til på hjemmeskjerm»-knappen i nettadressefeltet for å gjøre dette.", + "fsLayers": "Skru på lagkontrollen", + "fsIncludeCurrentLayers": "Inkluder nåværende lagvalg", + "fsIncludeCurrentLocation": "Inkluder nåværende posisjon", + "embedIntro": "

Bygg inn på nettsiden din

Legg til dette kartet på nettsiden din.
Du oppfordres til å gjøre dette, og trenger ikke å spørre om tillatelse.
Det er fritt, og vil alltid være det. Desto flere som bruker dette, desto mer verdifullt blir det." }, - "move": { - "cancel": "Avbryt flytting", - "pointIsMoved": "Punktet har blitt flyttet", - "selectReason": "Hvorfor flytter du dette objektet?", - "loginToMove": "Du må være innlogget for å flytte et punkt", - "inviteToMoveAgain": "Flytt dette punktet igjen", - "moveTitle": "Flytt dette punktet", - "whyMove": "Hvorfor vil du flytte dette punktet?", - "confirmMove": "Flytt hit", - "reasons": { - "reasonInaccurate": "Posisjonen til dette objektet er unøyaktig og bør flyttes noen meter", - "reasonRelocation": "Objektet har blitt flyttet til et helt annet sted" - }, - "inviteToMove": { - "reasonInaccurate": "Forbedre nøyaktigheten for dette punktet", - "generic": "Flytt dette punktet", - "reasonRelocation": "Flytt dette objektet til et annet sted fordi det har blitt flyttet" - }, - "isRelation": "Denne funksjonen er en relasjon og kan ikke flyttes", - "cannotBeMoved": "Denne funksjonen kan ikke flyttes.", - "isWay": "Denne funksjonen er en vei. Bruk en annen OpenStreetMap-redigerer for å flytte den.", - "partOfRelation": "Denne funksjonen er en del av en relasjon. Bruk en annen redigerer for å flytte den.", - "partOfAWay": "Denne funksjonen er en del av en annen vei. Bruk en annen redigerer for å flytte den.", - "zoomInFurther": "Forstørr mer for å bekrefte denne flyttingen" + "attribution": { + "mapContributionsBy": "Den dataen som er synlig nå har redigeringer gjort av {contributors}", + "attributionContent": "

All data er fra OpenStreetMap, fritt gjenbrukbart med Open DataBase-lisens.

", + "codeContributionsBy": "MapComplete har blitt bygd av {contributors} og {hiddenCount} bidragsytere til", + "mapContributionsByAndHidden": "Data som vises nå har redigeringer gjort av {contributors} og {hiddenCount} andre bidragsytere", + "iconAttribution": { + "title": "Brukte ikoner" + }, + "themeBy": "Tema vedlikeholdt av {author}", + "attributionTitle": "Tilskrivelsesmerknad" }, - "favourite": { - "reload": "Last inn dataen igjen" + "backgroundMap": "Bakgrunnskart", + "loginOnlyNeededToEdit": "hvis du ønsker å redigere kartet", + "readYourMessages": "Les alle OpenStreetMap-meldingene dine før du legger til et nytt punkt.", + "noTagsSelected": "Ingen etiketter valgt", + "customThemeIntro": "

Egendefinerte tema

Dette er tidligere besøkte brukergenererte tema.", + "layerSelection": { + "zoomInToSeeThisLayer": "Forstørr kartet hvis du vil se dette kartet", + "title": "Velg lag" }, - "split": { - "cancel": "Avbryt", - "loginToSplit": "Du må være innlogget for å dele en vei", - "split": "Del", - "splitTitle": "Velg hvor på kartet veien skal deles", - "hasBeenSplit": "Denne veien har blitt delt", - "inviteToSplit": "Inndel denne veien i mindre segmenter. Dette lar deg gi den forskjellige egenskaper for forskjellige strekk." + "download": { + "downloadCSV": "Last ned synlig data som CSV", + "downloadAsPdfHelper": "Ideelt for utskrift av nåværende kart", + "noDataLoaded": "Ingen data innlastet enda. Nedlasting vil være tilgjengelig snart.", + "downloadAsPdf": "Last ned PDF av nåværende kart", + "downloadCSVHelper": "Kompatibelt med LibreOffice Calc, Excel, …", + "title": "Last ned synlig data", + "downloadGeojson": "Last ned synlig data som GeoJSON", + "licenseInfo": "

Opphavsrettsmerknad

Tilbudt data er tilgjengelig med ODbL-lisens. Gjenbruk er gratis for alle formål, men
  • tilskrivelsen© OpenStreetMap-bidragsytere kreves
  • Enhver endring må publiseres under samme lisens
Les hele opphavsrettsmerknaden for detaljer.", + "exporting": "Eksporterer …", + "includeMetaData": "Inkluder metadata (siste bidragsytere, utregnede verdier, …)", + "downloadGeoJsonHelper": "Kompatibelt med QGIS, ArcGIS, ESRI, …" }, - "multi_apply": { - "autoApply": "Ved endring av attributteene {attr_names}, legges de automatisk til for {count} andre objekter også" - } + "weekdays": { + "friday": "Fredag", + "saturday": "Lørdag", + "sunday": "Søndag", + "wednesday": "Onsdag", + "abbreviations": { + "thursday": "Tor", + "sunday": "Søn", + "monday": "Man", + "wednesday": "Ons", + "tuesday": "Tir", + "saturday": "Lør", + "friday": "Fre" + }, + "thursday": "Torsdag", + "monday": "Mandag", + "tuesday": "Tirsdag" + }, + "opening_hours": { + "openTill": "til", + "closed_until": "Stengt til {date}", + "open_24_7": "Døgnåpent", + "closed_permanently": "Stengt på ubestemt tid", + "ph_open_as_usual": "åpen som vanlig", + "loadingCountry": "Bestemmer land …", + "error_loading": "Feil: Kunne ikke visualisere disse åpningstidene.", + "open_during_ph": "På offentlige helligdager og ferier er dette stedet", + "not_all_rules_parsed": "Åpningstidene for dette stedet er kompliserte. Følgende regler ble sett bort fra i inndataelementet:", + "ph_not_known": " ", + "ph_closed": "stengt", + "opensAt": "fra", + "ph_open": "åpen" + }, + "histogram": { + "error_loading": "Kunne ikke laste inn histogrammet" + }, + "loading": "Laster inn …", + "openTheMap": "Åpne kartet", + "testing": "Testing. ingen endringer vil bli lagret.", + "wikipedia": { + "wikipediaboxTitle": "Wikipedia", + "loading": "Laster inn Wikipedia …", + "doSearch": "Søk ovenfor for å se resultater", + "noResults": "Fant ikke noe for {search}", + "noWikipediaPage": "Dette Wikipedia-elementet har ingen tilknyttet Wikipedia-side enda.", + "searchWikidata": "Søk på Wikipedia", + "createNewWikidata": "Opprett et nytt Wikipedia-element", + "failed": "Innlasting av Wikipedia-artikkel mislyktes" + }, + "returnToTheMap": "Gå tilbake til kartet", + "skippedQuestions": "Noen spørsmål ble hoppet over", + "oneSkippedQuestion": "Et spørsmål ble hoppet over", + "number": "tall", + "pickLanguage": "Velg språk: ", + "goToInbox": "Åpne innboks", + "getStartedNewAccount": " eller opprett en ny konto", + "getStartedLogin": "Logg inn med OpenStreetMap for å begynne", + "fewChangesBefore": "Besvar et par spørsmål for eksisterende punkter før du legger til et nytt." + }, + "index": { + "pickTheme": "Begynn ved å velge et av temaene nedenfor.", + "title": "Velkommen til MapComplete", + "intro": "MapComplete er en OpenStreetMap-viser og redigerer, som viser deg info om funksjoner for et gitt tema og tillater oppdatering av det.", + "featuredThemeTitle": "Framhevet denne uken" + }, + "centerMessage": { + "ready": "Ferdig", + "zoomIn": "Forstørr for å vise eller redigere data", + "loadingData": "Laster inn data …", + "retrying": "Kunne ikke laste inn data. Prøver igjen om {count} sekunder …" + }, + "image": { + "isDeleted": "Slettet", + "doDelete": "Fjern bilde", + "dontDelete": "Avbryt", + "uploadingMultiple": "Laster opp {count} bilder …", + "uploadingPicture": "Laster opp bildet ditt …", + "addPicture": "Legg til bilde", + "pleaseLogin": "Logg inn for å legge til et bilde", + "ccbs": "med CC-BY-SA-lisens", + "ccb": "med CC-BY-lisens", + "willBePublished": "Ditt bilde vil bli publisert: ", + "uploadFailed": "Kunne ikke laste opp bildet ditt. Er du tilkoblet Internett og tillater tredjeparts-API-er? Brave-nettleseren eller uMatrix-programtillegget kan blokkere dem.", + "uploadDone": "Bildet ditt ble lagt til. Takk for at du hjelper til.", + "uploadMultipleDone": "{count} bilder har blitt lagt til. Takk for at du hjelper til.", + "toBig": "Bildet ditt på {actual_size} er for stort. Det kan maksimalt være {max_size}." + }, + "delete": { + "explanations": { + "hardDelete": "Dette punktet vil bli slettet i OpenStreetMap. Det kan gjenopprettes av en dreven bidragsyter.", + "softDelete": "Denne funksjonen vil bli oppdatert og skjult fra programmet. {reason}", + "selectReason": "Velg hvorfor denne funksjonen skal slettes" + }, + "delete": "Slett", + "isDeleted": "Denne funksjonen har blitt slettet", + "loginToDelete": "Du må være innlogget for å slette et punkt", + "cancel": "Avbryt", + "cannotBeDeleted": "Denne funksjonen kan ikke slettes", + "notEnoughExperience": "Dette punktet ble opprettet av noen andre.", + "loading": "Inspiserer egenskaper for å sjekke om denne funksjonen kan slettes.", + "whyDelete": "Hvorfor bør dette punktet slettes?", + "reasons": { + "duplicate": "Dette punktet er et duplikat av en annen funksjon", + "disused": "Denne funksjonen er ute av bruk eller fjernet", + "test": "Dette var et testpunkt, funksjonen var aldri operativ", + "notFound": "Fant ikke funksjonen" + }, + "safeDelete": "Dette punktet kan trygt slettes.", + "onlyEditedByLoggedInUser": "Dette punktet har kun blitt redigert av deg. Du kan trygt slette det.", + "useSomethingElse": "Bruk en annen OpenStreetMap-redigerer til å slette det istedenfor.", + "isntAPoint": "Kun punkter kan slettes, valgt funksjon er en vei, et område, eller en relasjon.", + "partOfOthers": "Dette punktet er en del av en vei eller relasjon, og kan derfor ikke slettes direkte.", + "readMessages": "Du har uleste meldinger. Les dette før sletting av et punkt, fordi noen kan ha tilbakemeldinger å komme med." + }, + "reviews": { + "posting_as": "Anmelder som", + "saving_review": "Lagrer …", + "title": "{count} vurderinger", + "no_rating": "Ingen vurdering gitt", + "plz_login": "Logg inn for å legge igjen en vurdering", + "write_a_comment": "Legg igjen en vurdering …", + "title_singular": "Én vurdering", + "name_required": "Et navn kreves for å vise og opprette vurderinger", + "affiliated_reviewer_warning": "(Tilknyttet vurdering)", + "saved": "Vurdering lagret. Takk for at du deler din mening.", + "no_reviews_yet": "Ingen vurderinger enda. Vær først til å skrive en og hjelp åpen data og bevegelsen.", + "tos": "Hvis du lager en vurdering, samtykker du til tjenestevilkårene til Mangrove.reviews", + "attribution": "Vurderinger er muliggjort av Mangrove Reviews og er tilgjengelige som CC-BY 4.0.", + "i_am_affiliated": "Jeg har en tilknytning til dette objektet
Sjekk om du er eier, skaper, ansatt, …" + }, + "move": { + "cancel": "Avbryt flytting", + "pointIsMoved": "Punktet har blitt flyttet", + "selectReason": "Hvorfor flytter du dette objektet?", + "loginToMove": "Du må være innlogget for å flytte et punkt", + "inviteToMoveAgain": "Flytt dette punktet igjen", + "moveTitle": "Flytt dette punktet", + "whyMove": "Hvorfor vil du flytte dette punktet?", + "confirmMove": "Flytt hit", + "reasons": { + "reasonInaccurate": "Posisjonen til dette objektet er unøyaktig og bør flyttes noen meter", + "reasonRelocation": "Objektet har blitt flyttet til et helt annet sted" + }, + "inviteToMove": { + "reasonInaccurate": "Forbedre nøyaktigheten for dette punktet", + "generic": "Flytt dette punktet", + "reasonRelocation": "Flytt dette objektet til et annet sted fordi det har blitt flyttet" + }, + "isRelation": "Denne funksjonen er en relasjon og kan ikke flyttes", + "cannotBeMoved": "Denne funksjonen kan ikke flyttes.", + "isWay": "Denne funksjonen er en vei. Bruk en annen OpenStreetMap-redigerer for å flytte den.", + "partOfRelation": "Denne funksjonen er en del av en relasjon. Bruk en annen redigerer for å flytte den.", + "partOfAWay": "Denne funksjonen er en del av en annen vei. Bruk en annen redigerer for å flytte den.", + "zoomInFurther": "Forstørr mer for å bekrefte denne flyttingen" + }, + "favourite": { + "reload": "Last inn dataen igjen" + }, + "split": { + "cancel": "Avbryt", + "loginToSplit": "Du må være innlogget for å dele en vei", + "split": "Del", + "splitTitle": "Velg hvor på kartet veien skal deles", + "hasBeenSplit": "Denne veien har blitt delt", + "inviteToSplit": "Inndel denne veien i mindre segmenter. Dette lar deg gi den forskjellige egenskaper for forskjellige strekk." + }, + "multi_apply": { + "autoApply": "Ved endring av attributteene {attr_names}, legges de automatisk til for {count} andre objekter også" + } } diff --git a/langs/nl.json b/langs/nl.json index 8aaad1ad0..8cf786e46 100644 --- a/langs/nl.json +++ b/langs/nl.json @@ -1,316 +1,316 @@ { - "image": { - "addPicture": "Voeg foto toe", - "uploadingPicture": "Bezig met een foto te uploaden…", - "uploadingMultiple": "Bezig met {count} foto's te uploaden…", - "pleaseLogin": "Gelieve je aan te melden om een foto toe te voegen", - "willBePublished": "Jouw foto wordt gepubliceerd: ", - "cco": "in het publiek domein", - "ccbs": "onder de CC-BY-SA-licentie", - "ccb": "onder de CC-BY-licentie", - "uploadFailed": "Afbeelding uploaden mislukt. Heb je internet? Gebruik je Brave of UMatrix? Dan moet je derde partijen toelaten.", - "respectPrivacy": "Fotografeer geen mensen of nummerplaten. Voeg geen Google Maps, Google Streetview of foto's met auteursrechten toe.", - "uploadDone": "Je afbeelding is toegevoegd. Bedankt om te helpen!", - "dontDelete": "Annuleren", - "doDelete": "Verwijder afbeelding", - "isDeleted": "Verwijderd", - "uploadMultipleDone": "{count} afbeeldingen zijn toegevoegd. Bedankt voor je bijdrage!", - "toBig": "Je afbeelding is te groot, namelijk {actual_size}. Gelieve afbeeldingen van maximaal {max_size} te gebruiken" + "image": { + "addPicture": "Voeg foto toe", + "uploadingPicture": "Bezig met een foto te uploaden…", + "uploadingMultiple": "Bezig met {count} foto's te uploaden…", + "pleaseLogin": "Gelieve je aan te melden om een foto toe te voegen", + "willBePublished": "Jouw foto wordt gepubliceerd: ", + "cco": "in het publiek domein", + "ccbs": "onder de CC-BY-SA-licentie", + "ccb": "onder de CC-BY-licentie", + "uploadFailed": "Afbeelding uploaden mislukt. Heb je internet? Gebruik je Brave of UMatrix? Dan moet je derde partijen toelaten.", + "respectPrivacy": "Fotografeer geen mensen of nummerplaten. Voeg geen Google Maps, Google Streetview of foto's met auteursrechten toe.", + "uploadDone": "Je afbeelding is toegevoegd. Bedankt om te helpen!", + "dontDelete": "Annuleren", + "doDelete": "Verwijder afbeelding", + "isDeleted": "Verwijderd", + "uploadMultipleDone": "{count} afbeeldingen zijn toegevoegd. Bedankt voor je bijdrage!", + "toBig": "Je afbeelding is te groot, namelijk {actual_size}. Gelieve afbeeldingen van maximaal {max_size} te gebruiken" + }, + "centerMessage": { + "loadingData": "Data wordt geladen...", + "zoomIn": "Zoom in om de data te zien en te bewerken", + "ready": "Klaar!", + "retrying": "Data inladen mislukt - wordt opnieuw geprobeerd over {count} seconden" + }, + "index": { + "#": "These texts are shown above the theme buttons when no theme is loaded", + "title": "Welkom bij MapComplete", + "intro": "MapComplete is een OpenStreetMap-applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.", + "pickTheme": "Kies hieronder een thema om te beginnen.", + "featuredThemeTitle": "Thema van de week" + }, + "general": { + "loginWithOpenStreetMap": "Aanmelden met OpenStreetMap", + "welcomeBack": "Je bent aangemeld. Welkom terug!", + "loginToStart": "Meld je aan om deze vraag te beantwoorden", + "search": { + "search": "Zoek naar een locatie", + "searching": "Aan het zoeken...", + "nothing": "Niet gevonden...", + "error": "Niet gelukt..." + }, + "add": { + "addNewMapLabel": "Voeg item toe", + "addNew": "Voeg hier een {category} toe", + "title": "Nieuw punt toevoegen?", + "intro": "Je klikte ergens waar er nog geen data is. Kies hieronder welk punt je wilt toevoegen
", + "pleaseLogin": "Gelieve je aan te melden om een punt to te voegen", + "zoomInFurther": "Gelieve verder in te zoomen om een punt toe te voegen.", + "stillLoading": "De data worden nog geladen. Nog even geduld en dan kan je een punt toevoegen.", + "confirmIntro": "

Voeg hier een {title} toe?

Het punt dat je hier toevoegt, is zichtbaar voor iedereen. Veel applicaties gebruiken deze data, voeg dus enkel punten toe die echt bestaan.", + "confirmButton": "Voeg hier een {category} toe
Je toevoeging is voor iedereen zichtbaar
", + "openLayerControl": "Open de laag-instellingen", + "layerNotEnabled": "De laag {layer} is gedeactiveerd. Activeer deze om een punt toe te voegen", + "presetInfo": "Het nieuwe punt krijgt de attributen {tags}", + "disableFiltersExplanation": "Interessepunten kunnen verborgen zijn door een filter", + "disableFilters": "Zet alle filters af", + "hasBeenImported": "Dit punt is reeds geimporteerd", + "warnVisibleForEveryone": "Je toevoeging is voor iedereen zichtbaar", + "zoomInMore": "Zoom meer in om dit punt te importeren" + }, + "pickLanguage": "Kies je taal: ", + "about": "Bewerk en voeg data toe aan OpenStreetMap over een specifiek onderwerp op een gemakkelijke manier", + "nameInlineQuestion": "De naam van dit {category} is $$$", + "noNameCategory": "{category} zonder naam", + "questions": { + "phoneNumberOf": "Wat is het telefoonnummer van {category}?", + "phoneNumberIs": "Het telefoonnummer van {category} is {phone}", + "websiteOf": "Wat is de website van {category}?", + "websiteIs": "Website: {website}", + "emailOf": "Wat is het email-adres van {category}?", + "emailIs": "Het email-adres van {category} is {email}" + }, + "openStreetMapIntro": "

Een open kaart

Zou het niet fantastisch zijn als er een open kaart zou zijn die door iedereen aangepast én gebruikt kan worden? Een kaart waar iedereen zijn interesses aan zou kunnen toevoegen? Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn

OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt. Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe

Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Organic Maps, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram,...
Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!

Kortom, als je hier een punt toevoegd of een vraag beantwoord, zal dat na een tijdje ook in al dié applicaties te zien zijn.

", + "attribution": { + "attributionTitle": "Met dank aan", + "attributionContent": "

Alle data is voorzien door OpenStreetMap, gratis en vrij te hergebruiken onder de Open DataBase Licentie.

", + "themeBy": "Thema gemaakt door {author}", + "iconAttribution": { + "title": "Iconen en afbeeldingen" + }, + "mapContributionsByAndHidden": "De zichtbare data heeft bijdragen van {contributors} en {hiddenCount} andere bijdragers", + "mapContributionsBy": "De huidige data is bijgedragen door {contributors}", + "codeContributionsBy": "MapComplete is gebouwd door {contributors} en {hiddenCount} andere bijdragers" + }, + "sharescreen": { + "intro": "

Deel deze kaart

Kopieer onderstaande link om deze kaart naar vrienden en familie door te sturen:", + "addToHomeScreen": "

Voeg toe aan je thuis-scherm

Je kan deze website aan je thuisscherm van je smartphone toevoegen voor een native feel", + "embedIntro": "

Plaats dit op je website

Voeg dit kaartje toe op je eigen website.
We moedigen dit zelfs aan - je hoeft geen toestemming te vragen.
Het is gratis en zal dat altijd blijven. Hoe meer het gebruikt wordt, hoe waardevoller", + "copiedToClipboard": "Link gekopieerd naar klembord", + "thanksForSharing": "Bedankt om te delen!", + "editThisTheme": "Pas dit thema aan", + "editThemeDescription": "Pas vragen aan of voeg vragen toe aan dit kaartthema", + "fsUserbadge": "Activeer de login-knop", + "fsSearch": "Activeer de zoekbalk", + "fsWelcomeMessage": "Toon het welkomstbericht en de bijhorende tabbladen", + "fsLayers": "Toon de knop voor laagbediening", + "fsLayerControlToggle": "Toon de laagbediening meteen volledig", + "fsAddNew": "Activeer het toevoegen van nieuwe POI", + "fsGeolocation": "Toon het knopje voor geolocalisatie (enkel op mobiel)", + "fsIncludeCurrentBackgroundMap": "Gebruik de huidige achtergrond {name}", + "fsIncludeCurrentLayers": "Toon enkel de huidig getoonde lagen", + "fsIncludeCurrentLocation": "Start op de huidige locatie" }, "centerMessage": { - "loadingData": "Data wordt geladen...", - "zoomIn": "Zoom in om de data te zien en te bewerken", - "ready": "Klaar!", - "retrying": "Data inladen mislukt - wordt opnieuw geprobeerd over {count} seconden" + "loadingData": "Data wordt geladen…", + "zoomIn": "Zoom in om de data te zien en te bewerken", + "ready": "Klaar!", + "retrying": "Data inladen mislukt. Opnieuw proberen over {count} seconden…" }, "index": { - "#": "These texts are shown above the theme buttons when no theme is loaded", - "title": "Welkom bij MapComplete", - "intro": "MapComplete is een OpenStreetMap-applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.", - "pickTheme": "Kies hieronder een thema om te beginnen.", - "featuredThemeTitle": "Thema van de week" - }, - "general": { - "loginWithOpenStreetMap": "Aanmelden met OpenStreetMap", - "welcomeBack": "Je bent aangemeld. Welkom terug!", - "loginToStart": "Meld je aan om deze vraag te beantwoorden", - "search": { - "search": "Zoek naar een locatie", - "searching": "Aan het zoeken...", - "nothing": "Niet gevonden...", - "error": "Niet gelukt..." - }, - "add": { - "addNewMapLabel": "Voeg item toe", - "addNew": "Voeg hier een {category} toe", - "title": "Nieuw punt toevoegen?", - "intro": "Je klikte ergens waar er nog geen data is. Kies hieronder welk punt je wilt toevoegen
", - "pleaseLogin": "Gelieve je aan te melden om een punt to te voegen", - "zoomInFurther": "Gelieve verder in te zoomen om een punt toe te voegen.", - "stillLoading": "De data worden nog geladen. Nog even geduld en dan kan je een punt toevoegen.", - "confirmIntro": "

Voeg hier een {title} toe?

Het punt dat je hier toevoegt, is zichtbaar voor iedereen. Veel applicaties gebruiken deze data, voeg dus enkel punten toe die echt bestaan.", - "confirmButton": "Voeg hier een {category} toe
Je toevoeging is voor iedereen zichtbaar
", - "openLayerControl": "Open de laag-instellingen", - "layerNotEnabled": "De laag {layer} is gedeactiveerd. Activeer deze om een punt toe te voegen", - "presetInfo": "Het nieuwe punt krijgt de attributen {tags}", - "disableFiltersExplanation": "Interessepunten kunnen verborgen zijn door een filter", - "disableFilters": "Zet alle filters af", - "hasBeenImported": "Dit punt is reeds geimporteerd", - "warnVisibleForEveryone": "Je toevoeging is voor iedereen zichtbaar", - "zoomInMore": "Zoom meer in om dit punt te importeren" - }, - "pickLanguage": "Kies je taal: ", - "about": "Bewerk en voeg data toe aan OpenStreetMap over een specifiek onderwerp op een gemakkelijke manier", - "nameInlineQuestion": "De naam van dit {category} is $$$", - "noNameCategory": "{category} zonder naam", - "questions": { - "phoneNumberOf": "Wat is het telefoonnummer van {category}?", - "phoneNumberIs": "Het telefoonnummer van {category} is {phone}", - "websiteOf": "Wat is de website van {category}?", - "websiteIs": "Website: {website}", - "emailOf": "Wat is het email-adres van {category}?", - "emailIs": "Het email-adres van {category} is {email}" - }, - "openStreetMapIntro": "

Een open kaart

Zou het niet fantastisch zijn als er een open kaart zou zijn die door iedereen aangepast én gebruikt kan worden? Een kaart waar iedereen zijn interesses aan zou kunnen toevoegen? Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn

OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt. Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe

Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Organic Maps, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram,...
Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!

Kortom, als je hier een punt toevoegd of een vraag beantwoord, zal dat na een tijdje ook in al dié applicaties te zien zijn.

", - "attribution": { - "attributionTitle": "Met dank aan", - "attributionContent": "

Alle data is voorzien door OpenStreetMap, gratis en vrij te hergebruiken onder de Open DataBase Licentie.

", - "themeBy": "Thema gemaakt door {author}", - "iconAttribution": { - "title": "Iconen en afbeeldingen" - }, - "mapContributionsByAndHidden": "De zichtbare data heeft bijdragen van {contributors} en {hiddenCount} andere bijdragers", - "mapContributionsBy": "De huidige data is bijgedragen door {contributors}", - "codeContributionsBy": "MapComplete is gebouwd door {contributors} en {hiddenCount} andere bijdragers" - }, - "sharescreen": { - "intro": "

Deel deze kaart

Kopieer onderstaande link om deze kaart naar vrienden en familie door te sturen:", - "addToHomeScreen": "

Voeg toe aan je thuis-scherm

Je kan deze website aan je thuisscherm van je smartphone toevoegen voor een native feel", - "embedIntro": "

Plaats dit op je website

Voeg dit kaartje toe op je eigen website.
We moedigen dit zelfs aan - je hoeft geen toestemming te vragen.
Het is gratis en zal dat altijd blijven. Hoe meer het gebruikt wordt, hoe waardevoller", - "copiedToClipboard": "Link gekopieerd naar klembord", - "thanksForSharing": "Bedankt om te delen!", - "editThisTheme": "Pas dit thema aan", - "editThemeDescription": "Pas vragen aan of voeg vragen toe aan dit kaartthema", - "fsUserbadge": "Activeer de login-knop", - "fsSearch": "Activeer de zoekbalk", - "fsWelcomeMessage": "Toon het welkomstbericht en de bijhorende tabbladen", - "fsLayers": "Toon de knop voor laagbediening", - "fsLayerControlToggle": "Toon de laagbediening meteen volledig", - "fsAddNew": "Activeer het toevoegen van nieuwe POI", - "fsGeolocation": "Toon het knopje voor geolocalisatie (enkel op mobiel)", - "fsIncludeCurrentBackgroundMap": "Gebruik de huidige achtergrond {name}", - "fsIncludeCurrentLayers": "Toon enkel de huidig getoonde lagen", - "fsIncludeCurrentLocation": "Start op de huidige locatie" - }, - "centerMessage": { - "loadingData": "Data wordt geladen…", - "zoomIn": "Zoom in om de data te zien en te bewerken", - "ready": "Klaar!", - "retrying": "Data inladen mislukt. Opnieuw proberen over {count} seconden…" - }, - "index": { - "#": "Deze teksten worden getoond boven de themaknoppen als er geen thema is geladen", - "title": "Welkom bij MapComplete", - "intro": "MapComplete is een OpenStreetMap applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.", - "pickTheme": "Kies hieronder een thema om te beginnen." - }, - "reviews": { - "title": "{count} beoordelingen", - "title_singular": "Eén beoordeling", - "name_required": "De naam van dit object moet gekend zijn om een review te kunnen maken", - "no_reviews_yet": "Er zijn nog geen beoordelingen. Wees de eerste om een beoordeling te schrijven en help open data en het bedrijf!", - "write_a_comment": "Schrijf een beoordeling…", - "no_rating": "Geen score bekend", - "posting_as": "Ingelogd als", - "i_am_affiliated": "Ik ben persoonlijk betrokken
Vink aan indien je de oprichter, maker, werknemer, ... of dergelijke bent", - "affiliated_reviewer_warning": "(Review door betrokkene)", - "saving_review": "Opslaan…", - "saved": "Bedankt om je beoordeling te delen!", - "tos": "Als je je review publiceert, ga je akkoord met de de gebruiksvoorwaarden en privacy policy van Mangrove.reviews", - "attribution": "De beoordelingen worden voorzien door Mangrove Reviews en zijn beschikbaar onder deCC-BY 4.0-licentie.", - "plz_login": "Meld je aan om een beoordeling te geven" - }, - "morescreen": { - "intro": "

Meer thematische kaarten

Vind je het leuk om geodata te verzamelen?
Hier vind je meer kaartthemas.", - "requestATheme": "Wil je een eigen kaartthema, vraag dit in de issue tracker.", - "streetcomplete": "Een andere, gelijkaardige Android-applicatie is StreetComplete.", - "createYourOwnTheme": "Maak je eigen MapComplete-kaart", - "previouslyHiddenTitle": "Eerder bezochte verborgen themas", - "hiddenExplanation": "Deze thema's zijn enkel zichtbaar indien je de link kent. Je hebt {hidden_discovered} van {total_hidden} verborgen thema's ontdekt" - }, - "readYourMessages": "Gelieve eerst je berichten op OpenStreetMap te lezen alvorens nieuwe punten toe te voegen.", - "fewChangesBefore": "Gelieve eerst enkele vragen van bestaande punten te beantwoorden vooraleer zelf punten toe te voegen.", - "goToInbox": "Ga naar de berichten", - "getStartedLogin": "Login met OpenStreetMap om te beginnen", - "getStartedNewAccount": " of maak een nieuwe account aan", - "noTagsSelected": "Geen tags geselecteerd", - "customThemeIntro": "

Onofficiële thema's

De onderstaande thema's heb je eerder bezocht en zijn gemaakt door andere OpenStreetMappers.", - "aboutMapcomplete": "

Over MapComplete

Met MapComplete kun je OpenStreetMap verrijken met informatie over een bepaald thema. Beantwoord enkele vragen, en binnen een paar minuten is jouw bijdrage wereldwijd beschikbaar! De maker van het thema bepaalt de elementen, vragen en taalversies voor het thema.

Ontdek meer

MapComplete biedt altijd de volgende stap naar meer OpenStreetMap:

  • Indien ingebed in een website linkt het iframe naar de volledige MapComplete
  • De volledige versie heeft uitleg over OpenStreetMap
  • Bekijken kan altijd, maar wijzigen vereist een OSM-account
  • Als je niet aangemeld bent, wordt je gevraagd dit te doen
  • Als je minstens één vraag hebt beantwoord, kan je ook elementen toevoegen
  • Heb je genoeg changesets, dan verschijnen de OSM-tags, nog later links naar de wiki

Merk je een bug of wil je een extra feature? Wil je helpen vertalen? Bezoek dan de broncode en issue tracker.

Wil je je vorderingen zien? Volg de edits op OsmCha.

", - "backgroundMap": "Achtergrondkaart", - "layerSelection": { - "zoomInToSeeThisLayer": "Vergroot de kaart om deze laag te zien", - "title": "Selecteer lagen" - }, - "weekdays": { - "abbreviations": { - "monday": "Maan", - "tuesday": "Din", - "wednesday": "Woe", - "thursday": "Don", - "friday": "Vrij", - "saturday": "Zat", - "sunday": "Zon" - }, - "monday": "Maandag", - "tuesday": "Dinsdag", - "wednesday": "Woensdag", - "thursday": "Donderdag", - "friday": "Vrijdag", - "saturday": "Zaterdag", - "sunday": "Zondag" - }, - "opening_hours": { - "error_loading": "Sorry, deze openingsuren kunnen niet getoond worden", - "open_during_ph": "Op een feestdag is dit", - "opensAt": "vanaf", - "openTill": "tot", - "closed_until": "Gesloten - open op {date}", - "closed_permanently": "Gesloten voor onbepaalde tijd", - "open_24_7": "Dag en nacht open", - "ph_not_known": " ", - "ph_closed": "gesloten", - "ph_open": "open", - "ph_open_as_usual": "geopend zoals gewoonlijk", - "not_all_rules_parsed": "De openingsuren zijn ingewikkeld. De volgende regels worden niet getoond bij het ingeven:", - "loadingCountry": "Het land wordt nog bepaald…" - }, - "skippedQuestions": "Enkele vragen werden overgeslaan", - "skip": "Sla deze vraag over", - "save": "Opslaan", - "returnToTheMap": "Ga terug naar de kaart", - "pdf": { - "versionInfo": "v{version} - gemaakt op {date}", - "attr": "Kaartgegevens © OpenStreetMap-bijdragers, herbruikbaar volgens ODbL", - "generatedWith": "Gemaakt met MapComplete.osm.be", - "attrBackground": "Achtergrondlaag: {background}" - }, - "osmLinkTooltip": "Bekijk dit object op OpenStreetMap om de geschiedenis te zien en meer te kunnen aanpassen", - "oneSkippedQuestion": "Een vraag werd overgeslaan", - "number": "getal", - "loginOnlyNeededToEdit": "als je de kaart wilt aanpassen", - "download": { - "noDataLoaded": "Er is nog geen data ingeladen. Downloaden kan zodra de data geladen is.", - "licenseInfo": "

Copyright

De voorziene data is beschikbaar onder de ODbL. Het hergebruiken van deze data is gratis voor elke toepassing, maar
  • de bronvermelding © OpenStreetMap bijdragers is vereist
  • Elke wijziging aan deze data moet opnieuw gepubliceerd worden onder dezelfde licentie
Gelieve de volledige licentie te lezen voor details", - "includeMetaData": "Exporteer metadata (zoals laatste aanpassing, berekende waardes, …)", - "downloadCSVHelper": "Compatibel met LibreOffice Calc, Excel, …", - "downloadCSV": "Download de zichtbare data als CSV", - "downloadGeoJsonHelper": "Compatibel met QGIS, ArcGIS, ESRI, …", - "downloadGeojson": "Download de zichtbare data als GeoJSON", - "downloadAsPdfHelper": "Perfect om de huidige kaart af te printen", - "downloadAsPdf": "Download een PDF van de huidig zichtbare kaart", - "title": "Download de zichtbare data", - "exporting": "Aan het exporteren..." - }, - "cancel": "Annuleren", - "testing": "Testmode - wijzigingen worden niet opgeslaan", - "openTheMap": "Naar de kaart", - "wikipedia": { - "failed": "Het Wikipedia-artikel inladen is mislukt", - "wikipediaboxTitle": "Wikipedia", - "loading": "Wikipedia aan het laden...", - "noWikipediaPage": "Dit Wikidata-item heeft nog geen overeenkomstig Wikipedia-artikel", - "createNewWikidata": "Maak een nieuw Wikidata-item", - "searchWikidata": "Zoek op Wikidata", - "noResults": "Niet gevonden voor {search}", - "doSearch": "Zoek hierboven om resultaten te zien" - }, - "histogram": { - "error_loading": "Kan het histogram niet laden" - }, - "loading": "Aan het laden..." + "#": "Deze teksten worden getoond boven de themaknoppen als er geen thema is geladen", + "title": "Welkom bij MapComplete", + "intro": "MapComplete is een OpenStreetMap applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.", + "pickTheme": "Kies hieronder een thema om te beginnen." }, "reviews": { - "title": "{count} beoordelingen", - "title_singular": "Eén beoordeling", - "name_required": "De naam van dit object moet gekend zijn om een review te kunnen maken", - "no_reviews_yet": "Er zijn nog geen beoordelingen. Wees de eerste om een beoordeling te schrijven en help open data en het bedrijf!", - "write_a_comment": "Schrijf een beoordeling...", - "no_rating": "Geen score bekend", - "posting_as": "Ingelogd als", - "i_am_affiliated": "Ik ben persoonlijk betrokken
Vink aan indien je de oprichter, maker, werknemer, ... of dergelijke bent", - "affiliated_reviewer_warning": "(Review door betrokkene)", - "saving_review": "Opslaan...", - "saved": "Bedankt om je beoordeling te delen!", - "tos": "Als je je review publiceert, ga je akkoord met de de gebruiksvoorwaarden en privacy policy van Mangrove.reviews", - "attribution": "De beoordelingen worden voorzien door Mangrove Reviews en zijn beschikbaar onder deCC-BY 4.0-licentie. ", - "plz_login": "Meld je aan om een beoordeling te geven" + "title": "{count} beoordelingen", + "title_singular": "Eén beoordeling", + "name_required": "De naam van dit object moet gekend zijn om een review te kunnen maken", + "no_reviews_yet": "Er zijn nog geen beoordelingen. Wees de eerste om een beoordeling te schrijven en help open data en het bedrijf!", + "write_a_comment": "Schrijf een beoordeling…", + "no_rating": "Geen score bekend", + "posting_as": "Ingelogd als", + "i_am_affiliated": "Ik ben persoonlijk betrokken
Vink aan indien je de oprichter, maker, werknemer, ... of dergelijke bent", + "affiliated_reviewer_warning": "(Review door betrokkene)", + "saving_review": "Opslaan…", + "saved": "Bedankt om je beoordeling te delen!", + "tos": "Als je je review publiceert, ga je akkoord met de de gebruiksvoorwaarden en privacy policy van Mangrove.reviews", + "attribution": "De beoordelingen worden voorzien door Mangrove Reviews en zijn beschikbaar onder deCC-BY 4.0-licentie.", + "plz_login": "Meld je aan om een beoordeling te geven" }, - "favourite": { - "reload": "Herlaad de data", - "loginNeeded": "

Log in

Je moet je aanmelden met OpenStreetMap om een persoonlijk thema te gebruiken", - "panelIntro": "

Jouw persoonlijke thema

Activeer je favorite lagen van alle andere themas" + "morescreen": { + "intro": "

Meer thematische kaarten

Vind je het leuk om geodata te verzamelen?
Hier vind je meer kaartthemas.", + "requestATheme": "Wil je een eigen kaartthema, vraag dit in de issue tracker.", + "streetcomplete": "Een andere, gelijkaardige Android-applicatie is StreetComplete.", + "createYourOwnTheme": "Maak je eigen MapComplete-kaart", + "previouslyHiddenTitle": "Eerder bezochte verborgen themas", + "hiddenExplanation": "Deze thema's zijn enkel zichtbaar indien je de link kent. Je hebt {hidden_discovered} van {total_hidden} verborgen thema's ontdekt" }, - "delete": { - "readMessages": "Je hebt ongelezen berichten. Je moet deze lezen voordat je een punt verwijderd, een andere bijdrager heeft misschien feedback", - "explanations": { - "softDelete": "Dit punt zal aangepast worden en zal in deze applicatie niet meer getoond worden. {reason}", - "hardDelete": "Dit punt zal verwijderd worden in OpenStreetMap. Een ervaren bijdrager kan dit ongedaan maken.", - "selectReason": "Gelieve aan te duiden waarom dit punt verwijderd moet worden" - }, - "reasons": { - "notFound": "Het kon niet gevonden worden", - "disused": "Het wordt niet meer onderhouden of is verwijderd", - "test": "Dit punt was een test en was nooit echt aanwezig", - "duplicate": "Dit punt is een duplicaat van een ander punt" - }, - "cancel": "Annuleren", - "isDeleted": "Dit object is verwijderd", - "delete": "Verwijder", - "partOfOthers": "Dit punt maakt deel uit van een lijn, oppervlakte of een relatie en kan niet verwijderd worden.", - "whyDelete": "Waarom moet dit punt van de kaart verwijderd worden?", - "loginToDelete": "Je moet aangemeld zijn om een object van de kaart te verwijderen", - "onlyEditedByLoggedInUser": "Dit punt is enkel door jezelf bewerkt, je kan dit veilig verwijderen.", - "cannotBeDeleted": "Dit object kan niet van de kaart verwijderd worden", - "safeDelete": "Dit punt kan veilig verwijderd worden van de kaart.", - "isntAPoint": "Enkel punten kunnen verwijderd worden, het geselecteerde object is een lijn, een oppervlakte of een relatie.", - "notEnoughExperience": "Dit punt is door iemand anders gemaakt.", - "useSomethingElse": "Gebruik een ander OpenStreetMap-editeerprogramma om dit object te verwijderen", - "loading": "Aan het bekijken of dit object veilig verwijderd kan worden." + "readYourMessages": "Gelieve eerst je berichten op OpenStreetMap te lezen alvorens nieuwe punten toe te voegen.", + "fewChangesBefore": "Gelieve eerst enkele vragen van bestaande punten te beantwoorden vooraleer zelf punten toe te voegen.", + "goToInbox": "Ga naar de berichten", + "getStartedLogin": "Login met OpenStreetMap om te beginnen", + "getStartedNewAccount": " of maak een nieuwe account aan", + "noTagsSelected": "Geen tags geselecteerd", + "customThemeIntro": "

Onofficiële thema's

De onderstaande thema's heb je eerder bezocht en zijn gemaakt door andere OpenStreetMappers.", + "aboutMapcomplete": "

Over MapComplete

Met MapComplete kun je OpenStreetMap verrijken met informatie over een bepaald thema. Beantwoord enkele vragen, en binnen een paar minuten is jouw bijdrage wereldwijd beschikbaar! De maker van het thema bepaalt de elementen, vragen en taalversies voor het thema.

Ontdek meer

MapComplete biedt altijd de volgende stap naar meer OpenStreetMap:

  • Indien ingebed in een website linkt het iframe naar de volledige MapComplete
  • De volledige versie heeft uitleg over OpenStreetMap
  • Bekijken kan altijd, maar wijzigen vereist een OSM-account
  • Als je niet aangemeld bent, wordt je gevraagd dit te doen
  • Als je minstens één vraag hebt beantwoord, kan je ook elementen toevoegen
  • Heb je genoeg changesets, dan verschijnen de OSM-tags, nog later links naar de wiki

Merk je een bug of wil je een extra feature? Wil je helpen vertalen? Bezoek dan de broncode en issue tracker.

Wil je je vorderingen zien? Volg de edits op OsmCha.

", + "backgroundMap": "Achtergrondkaart", + "layerSelection": { + "zoomInToSeeThisLayer": "Vergroot de kaart om deze laag te zien", + "title": "Selecteer lagen" }, - "move": { - "cannotBeMoved": "Dit object kan niet verplaatst worden.", - "inviteToMove": { - "reasonRelocation": "Verplaats dit punt naar een andere locatie omdat het verhuisd is", - "reasonInaccurate": "Verbeter de precieze locatie van dit punt", - "generic": "Verplaats dit punt" - }, - "pointIsMoved": "Dit punt is verplaatst", - "confirmMove": "Verplaats", - "reasons": { - "reasonRelocation": "Dit object is verhuisd naar een andere locatie", - "reasonInaccurate": "De locatie van dit object is niet accuraat en moet een paar meter verschoven worden" - }, - "partOfAWay": "Dit punt is deel van een lijn of een oppervlakte. Gebruik een ander OpenStreetMap-bewerkprogramma om het te verplaatsen", - "partOfRelation": "Dit punt maakt deel uit van een relatie. Gebruik een ander OpenStreetMap-bewerkprogramma om het te verplaatsen", - "cancel": "Annuleer verplaatsing", - "loginToMove": "Je moet aangemeld zijn om een punt te verplaatsen", - "zoomInFurther": "Zoom verder in om de verplaatsing te bevestigen", - "isRelation": "Dit object is een relatie en kan niet verplaatst worden", - "inviteToMoveAgain": "Verplaats dit punt opnieuw", - "moveTitle": "Verplaats dit punt", - "whyMove": "Waarom verplaats je dit punt?", - "selectReason": "Waarom verplaats je dit object?", - "isWay": "Dit object is een lijn of een oppervlakte. Gebruik een ander OpenStreetMap-bewerkprogramma op het te verplaatsen." + "weekdays": { + "abbreviations": { + "monday": "Maan", + "tuesday": "Din", + "wednesday": "Woe", + "thursday": "Don", + "friday": "Vrij", + "saturday": "Zat", + "sunday": "Zon" + }, + "monday": "Maandag", + "tuesday": "Dinsdag", + "wednesday": "Woensdag", + "thursday": "Donderdag", + "friday": "Vrijdag", + "saturday": "Zaterdag", + "sunday": "Zondag" }, - "split": { - "cancel": "Annuleren", - "split": "Knip weg", - "splitTitle": "Duid op de kaart aan waar de weg geknipt moet worden", - "inviteToSplit": "Knip deze weg in kleinere segmenten (om andere eigenschappen per segment toe te kennen)", - "loginToSplit": "Je moet aangemeld zijn om een weg te knippen", - "hasBeenSplit": "Deze weg is verknipt" + "opening_hours": { + "error_loading": "Sorry, deze openingsuren kunnen niet getoond worden", + "open_during_ph": "Op een feestdag is dit", + "opensAt": "vanaf", + "openTill": "tot", + "closed_until": "Gesloten - open op {date}", + "closed_permanently": "Gesloten voor onbepaalde tijd", + "open_24_7": "Dag en nacht open", + "ph_not_known": " ", + "ph_closed": "gesloten", + "ph_open": "open", + "ph_open_as_usual": "geopend zoals gewoonlijk", + "not_all_rules_parsed": "De openingsuren zijn ingewikkeld. De volgende regels worden niet getoond bij het ingeven:", + "loadingCountry": "Het land wordt nog bepaald…" }, - "multi_apply": { - "autoApply": "Wijzigingen aan eigenschappen {attr_names} zullen ook worden uitgevoerd op {count} andere objecten." - } + "skippedQuestions": "Enkele vragen werden overgeslaan", + "skip": "Sla deze vraag over", + "save": "Opslaan", + "returnToTheMap": "Ga terug naar de kaart", + "pdf": { + "versionInfo": "v{version} - gemaakt op {date}", + "attr": "Kaartgegevens © OpenStreetMap-bijdragers, herbruikbaar volgens ODbL", + "generatedWith": "Gemaakt met MapComplete.osm.be", + "attrBackground": "Achtergrondlaag: {background}" + }, + "osmLinkTooltip": "Bekijk dit object op OpenStreetMap om de geschiedenis te zien en meer te kunnen aanpassen", + "oneSkippedQuestion": "Een vraag werd overgeslaan", + "number": "getal", + "loginOnlyNeededToEdit": "als je de kaart wilt aanpassen", + "download": { + "noDataLoaded": "Er is nog geen data ingeladen. Downloaden kan zodra de data geladen is.", + "licenseInfo": "

Copyright

De voorziene data is beschikbaar onder de ODbL. Het hergebruiken van deze data is gratis voor elke toepassing, maar
  • de bronvermelding © OpenStreetMap bijdragers is vereist
  • Elke wijziging aan deze data moet opnieuw gepubliceerd worden onder dezelfde licentie
Gelieve de volledige licentie te lezen voor details", + "includeMetaData": "Exporteer metadata (zoals laatste aanpassing, berekende waardes, …)", + "downloadCSVHelper": "Compatibel met LibreOffice Calc, Excel, …", + "downloadCSV": "Download de zichtbare data als CSV", + "downloadGeoJsonHelper": "Compatibel met QGIS, ArcGIS, ESRI, …", + "downloadGeojson": "Download de zichtbare data als GeoJSON", + "downloadAsPdfHelper": "Perfect om de huidige kaart af te printen", + "downloadAsPdf": "Download een PDF van de huidig zichtbare kaart", + "title": "Download de zichtbare data", + "exporting": "Aan het exporteren..." + }, + "cancel": "Annuleren", + "testing": "Testmode - wijzigingen worden niet opgeslaan", + "openTheMap": "Naar de kaart", + "wikipedia": { + "failed": "Het Wikipedia-artikel inladen is mislukt", + "wikipediaboxTitle": "Wikipedia", + "loading": "Wikipedia aan het laden...", + "noWikipediaPage": "Dit Wikidata-item heeft nog geen overeenkomstig Wikipedia-artikel", + "createNewWikidata": "Maak een nieuw Wikidata-item", + "searchWikidata": "Zoek op Wikidata", + "noResults": "Niet gevonden voor {search}", + "doSearch": "Zoek hierboven om resultaten te zien" + }, + "histogram": { + "error_loading": "Kan het histogram niet laden" + }, + "loading": "Aan het laden..." + }, + "reviews": { + "title": "{count} beoordelingen", + "title_singular": "Eén beoordeling", + "name_required": "De naam van dit object moet gekend zijn om een review te kunnen maken", + "no_reviews_yet": "Er zijn nog geen beoordelingen. Wees de eerste om een beoordeling te schrijven en help open data en het bedrijf!", + "write_a_comment": "Schrijf een beoordeling...", + "no_rating": "Geen score bekend", + "posting_as": "Ingelogd als", + "i_am_affiliated": "Ik ben persoonlijk betrokken
Vink aan indien je de oprichter, maker, werknemer, ... of dergelijke bent", + "affiliated_reviewer_warning": "(Review door betrokkene)", + "saving_review": "Opslaan...", + "saved": "Bedankt om je beoordeling te delen!", + "tos": "Als je je review publiceert, ga je akkoord met de de gebruiksvoorwaarden en privacy policy van Mangrove.reviews", + "attribution": "De beoordelingen worden voorzien door Mangrove Reviews en zijn beschikbaar onder deCC-BY 4.0-licentie. ", + "plz_login": "Meld je aan om een beoordeling te geven" + }, + "favourite": { + "reload": "Herlaad de data", + "loginNeeded": "

Log in

Je moet je aanmelden met OpenStreetMap om een persoonlijk thema te gebruiken", + "panelIntro": "

Jouw persoonlijke thema

Activeer je favorite lagen van alle andere themas" + }, + "delete": { + "readMessages": "Je hebt ongelezen berichten. Je moet deze lezen voordat je een punt verwijderd, een andere bijdrager heeft misschien feedback", + "explanations": { + "softDelete": "Dit punt zal aangepast worden en zal in deze applicatie niet meer getoond worden. {reason}", + "hardDelete": "Dit punt zal verwijderd worden in OpenStreetMap. Een ervaren bijdrager kan dit ongedaan maken.", + "selectReason": "Gelieve aan te duiden waarom dit punt verwijderd moet worden" + }, + "reasons": { + "notFound": "Het kon niet gevonden worden", + "disused": "Het wordt niet meer onderhouden of is verwijderd", + "test": "Dit punt was een test en was nooit echt aanwezig", + "duplicate": "Dit punt is een duplicaat van een ander punt" + }, + "cancel": "Annuleren", + "isDeleted": "Dit object is verwijderd", + "delete": "Verwijder", + "partOfOthers": "Dit punt maakt deel uit van een lijn, oppervlakte of een relatie en kan niet verwijderd worden.", + "whyDelete": "Waarom moet dit punt van de kaart verwijderd worden?", + "loginToDelete": "Je moet aangemeld zijn om een object van de kaart te verwijderen", + "onlyEditedByLoggedInUser": "Dit punt is enkel door jezelf bewerkt, je kan dit veilig verwijderen.", + "cannotBeDeleted": "Dit object kan niet van de kaart verwijderd worden", + "safeDelete": "Dit punt kan veilig verwijderd worden van de kaart.", + "isntAPoint": "Enkel punten kunnen verwijderd worden, het geselecteerde object is een lijn, een oppervlakte of een relatie.", + "notEnoughExperience": "Dit punt is door iemand anders gemaakt.", + "useSomethingElse": "Gebruik een ander OpenStreetMap-editeerprogramma om dit object te verwijderen", + "loading": "Aan het bekijken of dit object veilig verwijderd kan worden." + }, + "move": { + "cannotBeMoved": "Dit object kan niet verplaatst worden.", + "inviteToMove": { + "reasonRelocation": "Verplaats dit punt naar een andere locatie omdat het verhuisd is", + "reasonInaccurate": "Verbeter de precieze locatie van dit punt", + "generic": "Verplaats dit punt" + }, + "pointIsMoved": "Dit punt is verplaatst", + "confirmMove": "Verplaats", + "reasons": { + "reasonRelocation": "Dit object is verhuisd naar een andere locatie", + "reasonInaccurate": "De locatie van dit object is niet accuraat en moet een paar meter verschoven worden" + }, + "partOfAWay": "Dit punt is deel van een lijn of een oppervlakte. Gebruik een ander OpenStreetMap-bewerkprogramma om het te verplaatsen", + "partOfRelation": "Dit punt maakt deel uit van een relatie. Gebruik een ander OpenStreetMap-bewerkprogramma om het te verplaatsen", + "cancel": "Annuleer verplaatsing", + "loginToMove": "Je moet aangemeld zijn om een punt te verplaatsen", + "zoomInFurther": "Zoom verder in om de verplaatsing te bevestigen", + "isRelation": "Dit object is een relatie en kan niet verplaatst worden", + "inviteToMoveAgain": "Verplaats dit punt opnieuw", + "moveTitle": "Verplaats dit punt", + "whyMove": "Waarom verplaats je dit punt?", + "selectReason": "Waarom verplaats je dit object?", + "isWay": "Dit object is een lijn of een oppervlakte. Gebruik een ander OpenStreetMap-bewerkprogramma op het te verplaatsen." + }, + "split": { + "cancel": "Annuleren", + "split": "Knip weg", + "splitTitle": "Duid op de kaart aan waar de weg geknipt moet worden", + "inviteToSplit": "Knip deze weg in kleinere segmenten (om andere eigenschappen per segment toe te kennen)", + "loginToSplit": "Je moet aangemeld zijn om een weg te knippen", + "hasBeenSplit": "Deze weg is verknipt" + }, + "multi_apply": { + "autoApply": "Wijzigingen aan eigenschappen {attr_names} zullen ook worden uitgevoerd op {count} andere objecten." + } } \ No newline at end of file diff --git a/langs/pt.json b/langs/pt.json index 50537983e..fabdb6a7a 100644 --- a/langs/pt.json +++ b/langs/pt.json @@ -1,42 +1,42 @@ { - "centerMessage": { - "retrying": "Surgiu uma falha ao carregar os dados. A tentar novamente dentro de {count} segundos…", - "ready": "Concluído!", - "zoomIn": "Amplie para ver ou editar os dados", - "loadingData": "A carregar os dados…" + "centerMessage": { + "retrying": "Surgiu uma falha ao carregar os dados. A tentar novamente dentro de {count} segundos…", + "ready": "Concluído!", + "zoomIn": "Amplie para ver ou editar os dados", + "loadingData": "A carregar os dados…" + }, + "image": { + "isDeleted": "Eliminada", + "doDelete": "Remover imagem", + "dontDelete": "Cancelar", + "uploadDone": "A sua imagem foi adicionada. Obrigado pela ajuda!", + "respectPrivacy": "Não fotografe pessoas nem placas de veículos. Não envie imagens do Google Maps, do Google Streetview ou outras fontes protegidas por direitos de autor.", + "uploadFailed": "Não foi possível enviar a sua imagem. Está conectado à Internet e permite APIs de terceiros? O navegador \"Brave\" ou o plugin \"uMatrix\" podem estar a bloqueá-los.", + "ccb": "sob a licença CC-BY", + "ccbs": "sob a licença CC-BY-SA", + "cco": "no domínio público", + "willBePublished": "A sua imagem será publicada: ", + "pleaseLogin": "Entre na sua conta para adicionar uma imagem", + "uploadingMultiple": "A enviar {count} imagens…", + "uploadingPicture": "A enviar a sua imagem…", + "addPicture": "Adicionar imagem", + "uploadMultipleDone": "Foram adicionadas {count} fotografias. Obrigado por ajudar!", + "toBig": "A sua imagem é muito grande porque tem {actual_size}. Use imagens com o máximo {max_size}" + }, + "index": { + "#": "Estes textos são mostrados acima dos botões do tema quando nenhum tema é carregado", + "title": "Bem-vindo(a) ao MapComplete", + "intro": "O MapComplete é um visualizador e editor do OpenStreetMap, que mostra informações sobre um tema específico.", + "pickTheme": "Escolha um tema abaixo para começar.", + "featuredThemeTitle": "Destaque desta semana" + }, + "delete": { + "reasons": { + "notFound": "Não foi possível encontrar este elemento" }, - "image": { - "isDeleted": "Eliminada", - "doDelete": "Remover imagem", - "dontDelete": "Cancelar", - "uploadDone": "A sua imagem foi adicionada. Obrigado pela ajuda!", - "respectPrivacy": "Não fotografe pessoas nem placas de veículos. Não envie imagens do Google Maps, do Google Streetview ou outras fontes protegidas por direitos de autor.", - "uploadFailed": "Não foi possível enviar a sua imagem. Está conectado à Internet e permite APIs de terceiros? O navegador \"Brave\" ou o plugin \"uMatrix\" podem estar a bloqueá-los.", - "ccb": "sob a licença CC-BY", - "ccbs": "sob a licença CC-BY-SA", - "cco": "no domínio público", - "willBePublished": "A sua imagem será publicada: ", - "pleaseLogin": "Entre na sua conta para adicionar uma imagem", - "uploadingMultiple": "A enviar {count} imagens…", - "uploadingPicture": "A enviar a sua imagem…", - "addPicture": "Adicionar imagem", - "uploadMultipleDone": "Foram adicionadas {count} fotografias. Obrigado por ajudar!", - "toBig": "A sua imagem é muito grande porque tem {actual_size}. Use imagens com o máximo {max_size}" - }, - "index": { - "#": "Estes textos são mostrados acima dos botões do tema quando nenhum tema é carregado", - "title": "Bem-vindo(a) ao MapComplete", - "intro": "O MapComplete é um visualizador e editor do OpenStreetMap, que mostra informações sobre um tema específico.", - "pickTheme": "Escolha um tema abaixo para começar.", - "featuredThemeTitle": "Destaque desta semana" - }, - "delete": { - "reasons": { - "notFound": "Não foi possível encontrar este elemento" - }, - "explanations": { - "selectReason": "Por favor, selecione a razão porque este elemento deve ser eliminado", - "hardDelete": "Este ponto será eliminado no OpenStreetMap. Pode ser recuperado por um contribuidor com experiência" - } + "explanations": { + "selectReason": "Por favor, selecione a razão porque este elemento deve ser eliminado", + "hardDelete": "Este ponto será eliminado no OpenStreetMap. Pode ser recuperado por um contribuidor com experiência" } + } } diff --git a/langs/sv.json b/langs/sv.json index a3dd6a81f..842df07e7 100644 --- a/langs/sv.json +++ b/langs/sv.json @@ -1,63 +1,63 @@ { - "general": { - "opening_hours": { - "ph_open": "öppet", - "ph_closed": "stängt", - "ph_not_known": " ", - "open_24_7": "Öppet dygnet runt", - "closed_permanently": "Stängt tills vidare", - "closed_until": "Stängt till", - "openTill": "till", - "opensAt": "från", - "open_during_ph": "Om det är en röd dag är det här stället", - "error_loading": "Fel: kunde inte visualisera öppettiderna." - }, - "weekdays": { - "sunday": "Söndag", - "saturday": "Lördag", - "friday": "Fredag", - "thursday": "Torsdag", - "wednesday": "Onsdag", - "tuesday": "Tisdag", - "monday": "Måndag", - "abbreviations": { - "friday": "Fre", - "wednesday": "Ons", - "tuesday": "Tis", - "thursday": "Tor", - "sunday": "Sön", - "saturday": "Lör", - "monday": "Mån" - } - }, - "cancel": "Avbryt" + "general": { + "opening_hours": { + "ph_open": "öppet", + "ph_closed": "stängt", + "ph_not_known": " ", + "open_24_7": "Öppet dygnet runt", + "closed_permanently": "Stängt tills vidare", + "closed_until": "Stängt till", + "openTill": "till", + "opensAt": "från", + "open_during_ph": "Om det är en röd dag är det här stället", + "error_loading": "Fel: kunde inte visualisera öppettiderna." }, - "centerMessage": { - "ready": "Klar!", - "zoomIn": "Zooma in för att visa eller redigera data", - "loadingData": "Laddar data…", - "retrying": "Det gick inte att ladda in data. Försöker igen om {count} sekunder…" + "weekdays": { + "sunday": "Söndag", + "saturday": "Lördag", + "friday": "Fredag", + "thursday": "Torsdag", + "wednesday": "Onsdag", + "tuesday": "Tisdag", + "monday": "Måndag", + "abbreviations": { + "friday": "Fre", + "wednesday": "Ons", + "tuesday": "Tis", + "thursday": "Tor", + "sunday": "Sön", + "saturday": "Lör", + "monday": "Mån" + } }, - "image": { - "isDeleted": "Borttagen", - "doDelete": "Ta bort bild", - "dontDelete": "Avbryt", - "uploadDone": "Din bild har lagts till. Tack för att du bidrar!", - "respectPrivacy": "Fotografera inte personer eller registreringsskyltar. Ladda inte upp från Google Maps, Google Streetview eller andra upphovsrättsskyddade källor.", - "uploadFailed": "Misslyckades med att ladda upp din bild. Är du säker på att du är uppkopplad och tredjeparts-API:er tillåts? Brave eller uMatrix kanske blockerar dem.", - "ccb": "under CC-BY-licensen", - "ccbs": "under CC-BY-SA-licensen", - "cco": "med fri användning (public domain)", - "willBePublished": "Din bild kommer att publiceras: ", - "pleaseLogin": "Logga in för att lägga till en bild", - "uploadingMultiple": "Laddar upp {count} bilder…", - "uploadingPicture": "Laddar upp din bild…", - "addPicture": "Lägg till bild" - }, - "split": { - "cancel": "Avbryt" - }, - "delete": { - "cancel": "Avbryt" - } + "cancel": "Avbryt" + }, + "centerMessage": { + "ready": "Klar!", + "zoomIn": "Zooma in för att visa eller redigera data", + "loadingData": "Laddar data…", + "retrying": "Det gick inte att ladda in data. Försöker igen om {count} sekunder…" + }, + "image": { + "isDeleted": "Borttagen", + "doDelete": "Ta bort bild", + "dontDelete": "Avbryt", + "uploadDone": "Din bild har lagts till. Tack för att du bidrar!", + "respectPrivacy": "Fotografera inte personer eller registreringsskyltar. Ladda inte upp från Google Maps, Google Streetview eller andra upphovsrättsskyddade källor.", + "uploadFailed": "Misslyckades med att ladda upp din bild. Är du säker på att du är uppkopplad och tredjeparts-API:er tillåts? Brave eller uMatrix kanske blockerar dem.", + "ccb": "under CC-BY-licensen", + "ccbs": "under CC-BY-SA-licensen", + "cco": "med fri användning (public domain)", + "willBePublished": "Din bild kommer att publiceras: ", + "pleaseLogin": "Logga in för att lägga till en bild", + "uploadingMultiple": "Laddar upp {count} bilder…", + "uploadingPicture": "Laddar upp din bild…", + "addPicture": "Lägg till bild" + }, + "split": { + "cancel": "Avbryt" + }, + "delete": { + "cancel": "Avbryt" + } } diff --git a/langs/zh_Hant.json b/langs/zh_Hant.json index 8c72b001d..20603e2d1 100644 --- a/langs/zh_Hant.json +++ b/langs/zh_Hant.json @@ -53,128 +53,128 @@ } }, "general": { - "opening_hours": { - "ph_closed": "無營業", - "ph_open": "有營業", - "ph_not_known": " ", - "open_24_7": "24小時營業", - "closed_permanently": "不清楚關閉多久了", - "closed_until": "{date} 起關閉", - "not_all_rules_parsed": "這間店的開放時間相當複雜,在輸入元素時忽略接下來的規則:", - "openTill": "結束時間", - "opensAt": "開始時間", - "open_during_ph": "國定假日的時候,這個場所是", - "error_loading": "錯誤:無法視覺化開放時間。" + "opening_hours": { + "ph_closed": "無營業", + "ph_open": "有營業", + "ph_not_known": " ", + "open_24_7": "24小時營業", + "closed_permanently": "不清楚關閉多久了", + "closed_until": "{date} 起關閉", + "not_all_rules_parsed": "這間店的開放時間相當複雜,在輸入元素時忽略接下來的規則:", + "openTill": "結束時間", + "opensAt": "開始時間", + "open_during_ph": "國定假日的時候,這個場所是", + "error_loading": "錯誤:無法視覺化開放時間。" + }, + "weekdays": { + "sunday": "星期日", + "saturday": "星期六", + "friday": "星期五", + "thursday": "星期四", + "wednesday": "星期三", + "tuesday": "星期二", + "monday": "星期一", + "abbreviations": { + "sunday": "星期日", + "saturday": "星期六", + "friday": "星期五", + "thursday": "星期四", + "wednesday": "星期三", + "tuesday": "星期二", + "monday": "星期一" + } + }, + "layerSelection": { + "title": "選擇圖層", + "zoomInToSeeThisLayer": "放大來看這個圖層" + }, + "backgroundMap": "背景地圖", + "aboutMapcomplete": "

關於 MapComplete

使用 MapComplete 你可以藉由單一主題豐富開放街圖的圖資。回答幾個問題,然後幾分鐘之內你的貢獻立刻就傳遍全球!主題維護者定議主題的元素、問題與語言。

發現更多

MapComplete 總是提供學習更多開放街圖下一步的知識

  • 當你內嵌網站,網頁內嵌會連結到全螢幕的 MapComplete
  • 全螢幕的版本提供關於開放街圖的資訊
  • 不登入檢視成果,但是要編輯則需登入 OSM。
  • 如果你沒有登入,你會被要求先登入
  • 當你回答單一問題時,你可以在地圖新增新的節點
  • 過了一陣子,實際的 OSM-標籤會顯示,之後會連結到 wiki


你有注意到問題嗎?你想請求功能嗎?想要幫忙翻譯嗎?來到原始碼或是問題追蹤器。

想要看到你的進度嗎?到OsmCha追蹤編輯數。

", + "customThemeIntro": "

客製化主題

觀看這些先前使用者創造的主題。", + "noTagsSelected": "沒有選取標籤", + "getStartedNewAccount": " 或是 註冊新帳號", + "getStartedLogin": "登入開放街圖帳號來開始", + "goToInbox": "開啟訊息框", + "fewChangesBefore": "請先回答有關既有節點的問題再來新增新節點。", + "readYourMessages": "請先閱讀開放街圖訊息之前再來新增新節點。", + "morescreen": { + "createYourOwnTheme": "從零開始建立你的 MapComplete 主題", + "streetcomplete": "行動裝置另有類似的應用程式 StreetComplete。", + "requestATheme": "如果你有客製化要求,請到問題追踪器那邊提出要求", + "intro": "

看更多主題地圖?

您喜歡蒐集地理資料嗎?
還有更多主題。" + }, + "sharescreen": { + "fsIncludeCurrentLocation": "包含目前位置", + "fsIncludeCurrentLayers": "包含目前選擇圖層", + "fsIncludeCurrentBackgroundMap": "包含目前背景選擇{name}", + "fsGeolocation": "啟用'地理定位自身'按鈕 (只有行動版本)", + "fsAddNew": "啟用'新增新的興趣點'按鈕", + "fsLayerControlToggle": "開始時擴展圖層控制", + "fsLayers": "啟用圖層控制", + "fsWelcomeMessage": "顯示歡迎訊息以及相關頁籤", + "fsSearch": "啟用搜尋列", + "fsUserbadge": "啟用登入按鈕", + "editThemeDescription": "新增或改變這個地圖的問題", + "editThisTheme": "編輯這個主題", + "thanksForSharing": "感謝分享!", + "copiedToClipboard": "複製連結到簡貼簿", + "embedIntro": "

嵌入到你的網站

請考慮將這份地圖嵌入您的網站。
地圖毋須額外授權,非常歡迎您多加利用。
一切都是免費的,而且之後也是免費的,越有更多人使用,則越顯得它的價值。", + "addToHomeScreen": "

新增到您的主畫面

您可以輕易將這網站新增到您智慧型手機的主畫面,在網址列點選「新增到主畫面按鈕」來做這件事情。", + "intro": "

分享這地圖

複製下面的連結來向朋友與家人分享這份地圖:" + }, + "attribution": { + "codeContributionsBy": "MapComplete 是由 {contributors} 和其他 {hiddenCount} 位貢獻者構建而成", + "mapContributionsByAndHidden": "目前顯到的資料是由 {contributors} 和其他 {hiddenCount} 位貢獻者編輯貢獻", + "mapContributionsBy": "目前檢視的資料由 {contributors} 貢獻編輯", + "iconAttribution": { + "title": "使用的圖示" }, - "weekdays": { - "sunday": "星期日", - "saturday": "星期六", - "friday": "星期五", - "thursday": "星期四", - "wednesday": "星期三", - "tuesday": "星期二", - "monday": "星期一", - "abbreviations": { - "sunday": "星期日", - "saturday": "星期六", - "friday": "星期五", - "thursday": "星期四", - "wednesday": "星期三", - "tuesday": "星期二", - "monday": "星期一" - } - }, - "layerSelection": { - "title": "選擇圖層", - "zoomInToSeeThisLayer": "放大來看這個圖層" - }, - "backgroundMap": "背景地圖", - "aboutMapcomplete": "

關於 MapComplete

使用 MapComplete 你可以藉由單一主題豐富開放街圖的圖資。回答幾個問題,然後幾分鐘之內你的貢獻立刻就傳遍全球!主題維護者定議主題的元素、問題與語言。

發現更多

MapComplete 總是提供學習更多開放街圖下一步的知識

  • 當你內嵌網站,網頁內嵌會連結到全螢幕的 MapComplete
  • 全螢幕的版本提供關於開放街圖的資訊
  • 不登入檢視成果,但是要編輯則需登入 OSM。
  • 如果你沒有登入,你會被要求先登入
  • 當你回答單一問題時,你可以在地圖新增新的節點
  • 過了一陣子,實際的 OSM-標籤會顯示,之後會連結到 wiki


你有注意到問題嗎?你想請求功能嗎?想要幫忙翻譯嗎?來到原始碼或是問題追蹤器。

想要看到你的進度嗎?到OsmCha追蹤編輯數。

", - "customThemeIntro": "

客製化主題

觀看這些先前使用者創造的主題。", - "noTagsSelected": "沒有選取標籤", - "getStartedNewAccount": " 或是 註冊新帳號", - "getStartedLogin": "登入開放街圖帳號來開始", - "goToInbox": "開啟訊息框", - "fewChangesBefore": "請先回答有關既有節點的問題再來新增新節點。", - "readYourMessages": "請先閱讀開放街圖訊息之前再來新增新節點。", - "morescreen": { - "createYourOwnTheme": "從零開始建立你的 MapComplete 主題", - "streetcomplete": "行動裝置另有類似的應用程式 StreetComplete。", - "requestATheme": "如果你有客製化要求,請到問題追踪器那邊提出要求", - "intro": "

看更多主題地圖?

您喜歡蒐集地理資料嗎?
還有更多主題。" - }, - "sharescreen": { - "fsIncludeCurrentLocation": "包含目前位置", - "fsIncludeCurrentLayers": "包含目前選擇圖層", - "fsIncludeCurrentBackgroundMap": "包含目前背景選擇{name}", - "fsGeolocation": "啟用'地理定位自身'按鈕 (只有行動版本)", - "fsAddNew": "啟用'新增新的興趣點'按鈕", - "fsLayerControlToggle": "開始時擴展圖層控制", - "fsLayers": "啟用圖層控制", - "fsWelcomeMessage": "顯示歡迎訊息以及相關頁籤", - "fsSearch": "啟用搜尋列", - "fsUserbadge": "啟用登入按鈕", - "editThemeDescription": "新增或改變這個地圖的問題", - "editThisTheme": "編輯這個主題", - "thanksForSharing": "感謝分享!", - "copiedToClipboard": "複製連結到簡貼簿", - "embedIntro": "

嵌入到你的網站

請考慮將這份地圖嵌入您的網站。
地圖毋須額外授權,非常歡迎您多加利用。
一切都是免費的,而且之後也是免費的,越有更多人使用,則越顯得它的價值。", - "addToHomeScreen": "

新增到您的主畫面

您可以輕易將這網站新增到您智慧型手機的主畫面,在網址列點選「新增到主畫面按鈕」來做這件事情。", - "intro": "

分享這地圖

複製下面的連結來向朋友與家人分享這份地圖:" - }, - "attribution": { - "codeContributionsBy": "MapComplete 是由 {contributors} 和其他 {hiddenCount} 位貢獻者構建而成", - "mapContributionsByAndHidden": "目前顯到的資料是由 {contributors} 和其他 {hiddenCount} 位貢獻者編輯貢獻", - "mapContributionsBy": "目前檢視的資料由 {contributors} 貢獻編輯", - "iconAttribution": { - "title": "使用的圖示" - }, - "themeBy": "由 {author} 維護主題", - "attributionContent": "

所有資料由開放街圖提供,在開放資料庫授權條款之下自由再利用。

", - "attributionTitle": "署名通知" - }, - "openStreetMapIntro": "

開放的地圖

如果有一份地圖,任何人都能自由使用與編輯,單一的地圖能夠儲存所有地理相關資訊?這樣不就很酷嗎?接著,所有的網站使用不同的、範圍小的,不相容的地圖 (通常也都過時了),也就不再需要了。

開放街圖就是這樣的地圖,人人都能免費這些圖資 (只要署名與公開變動這資料)。只要遵循這些,任何人都能自由新增新資料與修正錯誤,這些網站也都使用開放街圖,資料也都來自開放街圖,你的答案與修正也會加到開放街圖上面。

許多人與應用程式已經採用開放街圖了:Organic MapsOsmAnd,還有 Facebook、Instagram,蘋果地圖、Bing 地圖(部分)採用開放街圖。如果你在開放街圖上變動資料,也會同時影響這些應用 - 在他們下次更新資料之後!

", - "questions": { - "emailIs": "{category} 的電子郵件地址是{email}", - "emailOf": "{category} 的電子郵件地址是?", - "websiteIs": "網站:{website}", - "websiteOf": "{category} 的網站網址是?", - "phoneNumberIs": "此 {category} 的電話號碼為 {phone}", - "phoneNumberOf": "{category} 的電話號碼是?" - }, - "noNameCategory": "{category} 沒有名稱", - "nameInlineQuestion": "這個 {category} 的名稱是 $$$", - "about": "相當容易編輯,而且能為開放街圖新增特定主題", - "pickLanguage": "選擇語言: ", - "add": { - "layerNotEnabled": "圖層 {layer} 目前無法使用,請先啟用這圖層再加新的節點", - "openLayerControl": "開啟圖層控制框", - "confirmButton": "在此新增 {category}。
大家都可以看到您新增的內容
", - "confirmIntro": "

在這裡新增 {title} ?

你在這裡新增的節點所有人都看得到。請只有在確定有物件存在的情形下才新增上去,許多應用程式都使用這份資料。", - "stillLoading": "目前仍在載入資料,請稍後再來新增節點。", - "zoomInFurther": "放大來新增新的節點。", - "pleaseLogin": "請先登入來新增節點", - "intro": "您點擊處目前未有已知的資料。
", - "title": "新增新的節點?", - "addNew": "在這裡新增新的 {category}" - }, - "osmLinkTooltip": "在開放街圖歷史和更多編輯選項下面來檢視這物件", - "number": "號碼", - "skippedQuestions": "有些問題已經跳過了", - "oneSkippedQuestion": "跳過一個問題", - "skip": "跳過這問題", - "cancel": "取消", - "save": "儲存", - "returnToTheMap": "回到地圖", - "search": { - "error": "有狀況發生了…", - "nothing": "沒有找到…", - "searching": "搜尋中…", - "search": "搜尋地點" - }, - "loginToStart": "登入之後來回答這問題", - "welcomeBack": "你已經登入了,歡迎回來!", - "loginWithOpenStreetMap": "用開放街圖帳號登入" + "themeBy": "由 {author} 維護主題", + "attributionContent": "

所有資料由開放街圖提供,在開放資料庫授權條款之下自由再利用。

", + "attributionTitle": "署名通知" + }, + "openStreetMapIntro": "

開放的地圖

如果有一份地圖,任何人都能自由使用與編輯,單一的地圖能夠儲存所有地理相關資訊?這樣不就很酷嗎?接著,所有的網站使用不同的、範圍小的,不相容的地圖 (通常也都過時了),也就不再需要了。

開放街圖就是這樣的地圖,人人都能免費這些圖資 (只要署名與公開變動這資料)。只要遵循這些,任何人都能自由新增新資料與修正錯誤,這些網站也都使用開放街圖,資料也都來自開放街圖,你的答案與修正也會加到開放街圖上面。

許多人與應用程式已經採用開放街圖了:Organic MapsOsmAnd,還有 Facebook、Instagram,蘋果地圖、Bing 地圖(部分)採用開放街圖。如果你在開放街圖上變動資料,也會同時影響這些應用 - 在他們下次更新資料之後!

", + "questions": { + "emailIs": "{category} 的電子郵件地址是{email}", + "emailOf": "{category} 的電子郵件地址是?", + "websiteIs": "網站:{website}", + "websiteOf": "{category} 的網站網址是?", + "phoneNumberIs": "此 {category} 的電話號碼為 {phone}", + "phoneNumberOf": "{category} 的電話號碼是?" + }, + "noNameCategory": "{category} 沒有名稱", + "nameInlineQuestion": "這個 {category} 的名稱是 $$$", + "about": "相當容易編輯,而且能為開放街圖新增特定主題", + "pickLanguage": "選擇語言: ", + "add": { + "layerNotEnabled": "圖層 {layer} 目前無法使用,請先啟用這圖層再加新的節點", + "openLayerControl": "開啟圖層控制框", + "confirmButton": "在此新增 {category}。
大家都可以看到您新增的內容
", + "confirmIntro": "

在這裡新增 {title} ?

你在這裡新增的節點所有人都看得到。請只有在確定有物件存在的情形下才新增上去,許多應用程式都使用這份資料。", + "stillLoading": "目前仍在載入資料,請稍後再來新增節點。", + "zoomInFurther": "放大來新增新的節點。", + "pleaseLogin": "請先登入來新增節點", + "intro": "您點擊處目前未有已知的資料。
", + "title": "新增新的節點?", + "addNew": "在這裡新增新的 {category}" + }, + "osmLinkTooltip": "在開放街圖歷史和更多編輯選項下面來檢視這物件", + "number": "號碼", + "skippedQuestions": "有些問題已經跳過了", + "oneSkippedQuestion": "跳過一個問題", + "skip": "跳過這問題", + "cancel": "取消", + "save": "儲存", + "returnToTheMap": "回到地圖", + "search": { + "error": "有狀況發生了…", + "nothing": "沒有找到…", + "searching": "搜尋中…", + "search": "搜尋地點" + }, + "loginToStart": "登入之後來回答這問題", + "welcomeBack": "你已經登入了,歡迎回來!", + "loginWithOpenStreetMap": "用開放街圖帳號登入" }, "backgroundMap": "背景地圖", "aboutMapcomplete": "

關於 MapComplete

使用 MapComplete 你可以藉由單一主題豐富開放街圖的圖資。回答幾個問題,然後幾分鐘之內你的貢獻立刻就傳遍全球!主題維護者定議主題的元素、問題與語言。

發現更多

MapComplete 總是提供學習更多開放街圖下一步的知識

  • 當你內嵌網站,網頁內嵌會連結到全螢幕的 MapComplete
  • 全螢幕的版本提供關於開放街圖的資訊
  • 不登入檢視成果,但是要編輯則需登入 OSM。
  • 如果你沒有登入,你會被要求先登入
  • 當你回答單一問題時,你可以在地圖新增新的節點
  • 過了一陣子,實際的 OSM-標籤會顯示,之後會連結到 wiki


你有注意到問題嗎?你想請求功能嗎?想要幫忙翻譯嗎?來到原始碼或是問題追蹤器。

想要看到你的進度嗎?到OsmCha追蹤編輯數。

", diff --git a/preferences.ts b/preferences.ts index c96912b5d..bef8b6d5d 100644 --- a/preferences.ts +++ b/preferences.ts @@ -3,7 +3,6 @@ import Combine from "./UI/Base/Combine"; import {Button} from "./UI/Base/Button"; import {TextField} from "./UI/Input/TextField"; import {FixedUiElement} from "./UI/Base/FixedUiElement"; -import {UIEventSource} from "./Logic/UIEventSource"; import {Utils} from "./Utils"; import {SubtleButton} from "./UI/Base/SubtleButton"; import LZString from "lz-string"; @@ -28,24 +27,27 @@ function salvageThemes(preferences: any) { const knownThemeNames = new Set(); const correctThemeNames = [] for (const key in preferences) { - try{ - if (!(typeof key === "string")) { - continue; - } - const prefix = "mapcomplete-installed-theme-"; - // mapcomplete-installed-theme-arbres_llefia-combined-11 - //mapcomplete-installed-theme-1roadAlllanes-combined-length - if (!key.startsWith(prefix)) { - continue; - } - const theme = key.substring(prefix.length, key.indexOf("-combined-")) + try { + if (!(typeof key === "string")) { + continue; + } + const prefix = "mapcomplete-installed-theme-"; + // mapcomplete-installed-theme-arbres_llefia-combined-11 + //mapcomplete-installed-theme-1roadAlllanes-combined-length + if (!key.startsWith(prefix)) { + continue; + } + const theme = key.substring(prefix.length, key.indexOf("-combined-")) - if (key.endsWith("-length")) { - correctThemeNames.push(theme) - } else { - knownThemeNames.add(theme); + if (key.endsWith("-length")) { + correctThemeNames.push(theme) + } else { + knownThemeNames.add(theme); + } + } catch (e) { + console.error(e) } - }catch(e){console.error(e)}} + } for (const correctThemeName of correctThemeNames) { knownThemeNames.delete(correctThemeName); @@ -74,12 +76,12 @@ function salvageThemes(preferences: any) { try { jsonObject = JSON.parse(atob(combined)); } catch (e) { - try{ - - // We try to decode with lz-string - jsonObject = JSON.parse(Utils.UnMinify(LZString.decompressFromBase64(combined))) as LayoutConfigJson; - }catch(e0){ - console.log("Could not salvage theme. Initial parsing failed due to:", e,"\nWith LZ failed due ", e0) + try { + + // We try to decode with lz-string + jsonObject = JSON.parse(Utils.UnMinify(LZString.decompressFromBase64(combined))) as LayoutConfigJson; + } catch (e0) { + console.log("Could not salvage theme. Initial parsing failed due to:", e, "\nWith LZ failed due ", e0) } } diff --git a/scripts/ScriptUtils.ts b/scripts/ScriptUtils.ts index 5469b5645..9ed725d96 100644 --- a/scripts/ScriptUtils.ts +++ b/scripts/ScriptUtils.ts @@ -53,7 +53,7 @@ export default class ScriptUtils { try { headers = headers ?? {} headers.accept = "application/json" - console.log("ScriptUtils.DownloadJson(", url.substring(0,40), url.length > 40 ? "...":"" ,")") + console.log("ScriptUtils.DownloadJson(", url.substring(0, 40), url.length > 40 ? "..." : "", ")") const urlObj = new URL(url) https.get({ host: urlObj.host, diff --git a/scripts/fixTheme.ts b/scripts/fixTheme.ts index cf66d45d1..fa98e8b48 100644 --- a/scripts/fixTheme.ts +++ b/scripts/fixTheme.ts @@ -2,15 +2,14 @@ * This script attempt to automatically fix some basic issues when a theme from the custom generator is loaded */ import {Utils} from "../Utils" -Utils.runningFromConsole = true; import {readFileSync, writeFileSync} from "fs"; import SmallLicense from "../Models/smallLicense"; -import AllKnownLayers from "../Customizations/AllKnownLayers"; import ScriptUtils from "./ScriptUtils"; import AllImageProviders from "../Logic/ImageProviders/AllImageProviders"; import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; +Utils.runningFromConsole = true; ScriptUtils.fixUtils() diff --git a/scripts/generateCache.ts b/scripts/generateCache.ts index 9bf879023..5731a9ac4 100644 --- a/scripts/generateCache.ts +++ b/scripts/generateCache.ts @@ -86,9 +86,9 @@ async function downloadRaw(targetdir: string, r: TileRange, theme: LayoutConfig, } const runningSeconds = (new Date().getTime() - startTime) / 1000 const resting = failed + (r.total - downloaded) - const perTile= (runningSeconds / (downloaded - skipped)) - const estimated =Math.floor(resting * perTile) - console.log("total: ", downloaded, "/", r.total, "failed: ", failed, "skipped: ", skipped, "running time: ",Utils.toHumanTime(runningSeconds)+"s", "estimated left: ", Utils.toHumanTime(estimated), "("+Math.floor(perTile)+"s/tile)") + const perTile = (runningSeconds / (downloaded - skipped)) + const estimated = Math.floor(resting * perTile) + console.log("total: ", downloaded, "/", r.total, "failed: ", failed, "skipped: ", skipped, "running time: ", Utils.toHumanTime(runningSeconds) + "s", "estimated left: ", Utils.toHumanTime(estimated), "(" + Math.floor(perTile) + "s/tile)") const boundsArr = Tiles.tile_bounds(r.zoomlevel, x, y) const bounds = { @@ -106,13 +106,13 @@ async function downloadRaw(targetdir: string, r: TileRange, theme: LayoutConfig, if ((json.remark ?? "").startsWith("runtime error")) { console.error("Got a runtime error: ", json.remark) failed++; - }else if (json.elements.length === 0) { + } else if (json.elements.length === 0) { console.log("Got an empty response! Writing anyway") } - - console.log("Got the response - writing to ", filename) - writeFileSync(filename, JSON.stringify(json, null, " ")); + + console.log("Got the response - writing to ", filename) + writeFileSync(filename, JSON.stringify(json, null, " ")); } catch (err) { console.log(url) console.log("Could not download - probably hit the rate limit; waiting a bit. (" + err + ")") @@ -180,7 +180,7 @@ function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relations function handleLayer(source: FeatureSourceForLayer) { const layer = source.layer.layerDef; const targetZoomLevel = layer.source.geojsonZoomLevel ?? 0 - + const layerId = layer.id if (layer.source.isOsmCacheLayer !== true) { return; @@ -245,11 +245,11 @@ function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relations writeFileSync(path, JSON.stringify(perX)) // And, if needed, to create a points-only layer - if(pointsOnlyLayers.indexOf(layer.id) >= 0){ + if (pointsOnlyLayers.indexOf(layer.id) >= 0) { const features = source.features.data.map(f => f.feature) const points = features.map(feature => GeoOperations.centerpoint(feature)) console.log("Writing points overview for ", layerId) - const targetPath = targetdir+"_"+layerId+"_points.geojson" + const targetPath = targetdir + "_" + layerId + "_points.geojson" // This is the geojson file containing all features for this tile writeFileSync(targetPath, JSON.stringify({ type: "FeatureCollection", @@ -270,7 +270,6 @@ function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relations } - async function main(args: string[]) { if (args.length == 0) { @@ -284,12 +283,12 @@ async function main(args: string[]) { const lon0 = Number(args[4]) const lat1 = Number(args[5]) const lon1 = Number(args[6]) - + let generatePointLayersFor = [] - if(args[7] == "--generate-point-overview"){ + if (args[7] == "--generate-point-overview") { generatePointLayersFor = args[8].split(",") } - + const tileRange = Tiles.TileRangeBetween(zoomlevel, lat0, lon0, lat1, lon1) diff --git a/scripts/generateDocs.ts b/scripts/generateDocs.ts index 9d7951d0f..af34c38e1 100644 --- a/scripts/generateDocs.ts +++ b/scripts/generateDocs.ts @@ -1,6 +1,4 @@ import {Utils} from "../Utils"; - -Utils.runningFromConsole = true; import SpecialVisualizations from "../UI/SpecialVisualizations"; import SimpleMetaTagger from "../Logic/SimpleMetaTagger"; import Combine from "../UI/Base/Combine"; @@ -9,12 +7,13 @@ import ValidatedTextField from "../UI/Input/ValidatedTextField"; import BaseUIElement from "../UI/BaseUIElement"; import Translations from "../UI/i18n/Translations"; import {writeFileSync} from "fs"; -import State from "../State"; import {QueryParameters} from "../Logic/Web/QueryParameters"; import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; import Minimap from "../UI/Base/Minimap"; import FeatureSwitchState from "../Logic/State/FeatureSwitchState"; +Utils.runningFromConsole = true; + function WriteFile(filename, html: string | BaseUIElement, autogenSource: string[]): void { writeFileSync(filename, new Combine([Translations.W(html), diff --git a/scripts/generateLayouts.ts b/scripts/generateLayouts.ts index 3b747a4a0..5335a7a39 100644 --- a/scripts/generateLayouts.ts +++ b/scripts/generateLayouts.ts @@ -1,6 +1,4 @@ import {Utils} from "../Utils"; -// We HAVE to mark this while importing -Utils.runningFromConsole = true; import {existsSync, mkdirSync, readFileSync, writeFile, writeFileSync} from "fs"; import Locale from "../UI/i18n/Locale"; import Translations from "../UI/i18n/Translations"; @@ -9,6 +7,8 @@ import Constants from "../Models/Constants"; import * as all_known_layouts from "../assets/generated/known_layers_and_themes.json" import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; +// We HAVE to mark this while importing +Utils.runningFromConsole = true; const sharp = require('sharp'); diff --git a/scripts/generateTaginfoProjectFiles.ts b/scripts/generateTaginfoProjectFiles.ts index 7345e8918..58166a11c 100644 --- a/scripts/generateTaginfoProjectFiles.ts +++ b/scripts/generateTaginfoProjectFiles.ts @@ -1,5 +1,4 @@ import {Utils} from "../Utils"; -Utils.runningFromConsole = true; import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; import Locale from "../UI/i18n/Locale"; import {Translation} from "../UI/i18n/Translation"; @@ -7,6 +6,8 @@ import {readFileSync, writeFileSync} from "fs"; import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; +Utils.runningFromConsole = true; + /** * Generates all the files in "Docs/TagInfo". These are picked up by the taginfo project, showing a link to the mapcomplete theme if the key is used diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index 947ef687b..41d4f0ebe 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -31,8 +31,8 @@ class TranslationPart { if (!translations.hasOwnProperty(translationsKey)) { continue; } - if(translationsKey == "then"){ - throw "Suspicious translation at "+context + if (translationsKey == "then") { + throw "Suspicious translation at " + context } const v = translations[translationsKey] if (typeof (v) != "string") { diff --git a/scripts/lint.ts b/scripts/lint.ts index e883fa3ae..94a6df6c2 100644 --- a/scripts/lint.ts +++ b/scripts/lint.ts @@ -1,8 +1,5 @@ - import ScriptUtils from "./ScriptUtils"; import {writeFileSync} from "fs"; -import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; -import LineRenderingConfigJson from "../Models/ThemeConfig/Json/LineRenderingConfigJson"; import LegacyJsonConvert from "../Models/ThemeConfig/LegacyJsonConvert"; /* @@ -12,12 +9,12 @@ import LegacyJsonConvert from "../Models/ThemeConfig/LegacyJsonConvert"; const layerFiles = ScriptUtils.getLayerFiles(); for (const layerFile of layerFiles) { - LegacyJsonConvert. fixLayerConfig(layerFile.parsed) + LegacyJsonConvert.fixLayerConfig(layerFile.parsed) writeFileSync(layerFile.path, JSON.stringify(layerFile.parsed, null, " ")) } const themeFiles = ScriptUtils.getThemeFiles() for (const themeFile of themeFiles) { - LegacyJsonConvert.fixThemeConfig(themeFile.parsed) + LegacyJsonConvert.fixThemeConfig(themeFile.parsed) writeFileSync(themeFile.path, JSON.stringify(themeFile.parsed, null, " ")) } diff --git a/tailwind.config.js b/tailwind.config.js index fe744d0b2..5c38cadf2 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -21,9 +21,9 @@ module.exports = { } }, plugins: [ - plugin(function ({ addVariant, e }) { - addVariant('landscape', ({ modifySelectors, separator }) => { - modifySelectors(({ className }) => { + plugin(function ({addVariant, e}) { + addVariant('landscape', ({modifySelectors, separator}) => { + modifySelectors(({className}) => { return `.${e(`landscape${separator}${className}`)}:landscape` }) }) diff --git a/test.ts b/test.ts index 7bc8c81d8..7141bb366 100644 --- a/test.ts +++ b/test.ts @@ -7,12 +7,136 @@ import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers"; import BaseLayer from "./Models/BaseLayer"; import {UIEventSource} from "./Logic/UIEventSource"; import AvailableBaseLayersImplementation from "./Logic/Actors/AvailableBaseLayersImplementation"; + MinimapImplementation.initialize() AvailableBaseLayers.implement(new AvailableBaseLayersImplementation()) const confirmationMap = Minimap.createMiniMap({ background: new UIEventSource(AvailableBaseLayers.osmCarto) }) -const features = [{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":1728823483},"geometry":{"type":"LineString","coordinates":[[3.216693,51.2147409],[3.2166930000000225,51.214740500000055]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":1728823481},"geometry":{"type":"LineString","coordinates":[[3.2167247,51.2146969],[3.21671060000004,51.2147159000002]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":1728823481},"geometry":{"type":"LineString","coordinates":[[3.2167247,51.2146969],[3.2167241999999976,51.214696799999714]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":1728823549},"geometry":{"type":"LineString","coordinates":[[3.2168871,51.2147399],[3.2168876999999547,51.21474009999989]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":4978289383},"geometry":{"type":"LineString","coordinates":[[3.2169973,51.2147676],[3.2169969000000034,51.21476780000005]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":4978289388},"geometry":{"type":"LineString","coordinates":[[3.2169829,51.2147884],[3.2169673999999895,51.21481170000002]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":4978289388},"geometry":{"type":"LineString","coordinates":[[3.2169829,51.2147884],[3.216949899999979,51.214808000000225]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":4978289388},"geometry":{"type":"LineString","coordinates":[[3.2169829,51.2147884],[3.2169306,51.21480400000028]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":4978289388},"geometry":{"type":"LineString","coordinates":[[3.2169829,51.2147884],[3.2169465999999756,51.214779199999825]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":4978288381},"geometry":{"type":"LineString","coordinates":[[3.2168856,51.2147638],[3.216885599999961,51.214763799999986]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":4978289386},"geometry":{"type":"LineString","coordinates":[[3.2168815,51.2147718],[3.216881100000038,51.21477160000009]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":4978289384},"geometry":{"type":"LineString","coordinates":[[3.2168674,51.2147683],[3.216867399999983,51.214768400000224]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":1728823514},"geometry":{"type":"LineString","coordinates":[[3.2168551,51.2147863],[3.2168551000000436,51.21478629999984]]}},"freshness":"2021-11-02T20:06:53.088Z"},{"feature":{"type":"Feature","properties":{"move":"yes","osm-id":1728823483},"geometry":{"type":"LineString","coordinates":[[3.216693,51.2147409],[3.2166930000000225,51.214740500000055]]}},"freshness":"2021-11-02T20:06:53.088Z"}] +const features = [{ + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823483}, + "geometry": { + "type": "LineString", + "coordinates": [[3.216693, 51.2147409], [3.2166930000000225, 51.214740500000055]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823481}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2167247, 51.2146969], [3.21671060000004, 51.2147159000002]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823481}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2167247, 51.2146969], [3.2167241999999976, 51.214696799999714]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823549}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2168871, 51.2147399], [3.2168876999999547, 51.21474009999989]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289383}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2169973, 51.2147676], [3.2169969000000034, 51.21476780000005]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289388}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2169829, 51.2147884], [3.2169673999999895, 51.21481170000002]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289388}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2169829, 51.2147884], [3.216949899999979, 51.214808000000225]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289388}, + "geometry": {"type": "LineString", "coordinates": [[3.2169829, 51.2147884], [3.2169306, 51.21480400000028]]} + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289388}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2169829, 51.2147884], [3.2169465999999756, 51.214779199999825]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978288381}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2168856, 51.2147638], [3.216885599999961, 51.214763799999986]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289386}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2168815, 51.2147718], [3.216881100000038, 51.21477160000009]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 4978289384}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2168674, 51.2147683], [3.216867399999983, 51.214768400000224]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823514}, + "geometry": { + "type": "LineString", + "coordinates": [[3.2168551, 51.2147863], [3.2168551000000436, 51.21478629999984]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}, { + "feature": { + "type": "Feature", + "properties": {"move": "yes", "osm-id": 1728823483}, + "geometry": { + "type": "LineString", + "coordinates": [[3.216693, 51.2147409], [3.2166930000000225, 51.214740500000055]] + } + }, "freshness": "2021-11-02T20:06:53.088Z" +}] const changePreview = new StaticFeatureSource(features.map(f => f.feature), false) console.log("ChangePreview", changePreview.features.data) new ShowDataLayer({ @@ -22,5 +146,5 @@ new ShowDataLayer({ features: changePreview, layerToShow: AllKnownLayers.sharedLayers.get("conflation") }) - + confirmationMap.SetStyle("height: 20rem").SetClass("w-full").AttachTo("maindiv") \ No newline at end of file diff --git a/test/Actors.spec.ts b/test/Actors.spec.ts index b53cfd5c7..38c2a7c17 100644 --- a/test/Actors.spec.ts +++ b/test/Actors.spec.ts @@ -1,10 +1,8 @@ import T from "./TestHelper"; -import State from "../State"; import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; import SelectedElementTagsUpdater from "../Logic/Actors/SelectedElementTagsUpdater"; import UserRelatedState from "../Logic/State/UserRelatedState"; import {Utils} from "../Utils"; -import ScriptUtils from "../scripts/ScriptUtils"; import SelectedFeatureHandler from "../Logic/Actors/SelectedFeatureHandler"; import {UIEventSource} from "../Logic/UIEventSource"; import {ElementStorage} from "../Logic/ElementStorage"; @@ -113,14 +111,14 @@ export default class ActorsSpec extends T { lon: 0, zoom: 0 }) - - + + loc.addCallback(_ => { T.equals("node/5568693115", selected.data.properties.id) T.equals(14, loc.data.zoom) - T.equals( 51.2179199, loc.data.lat) + T.equals(51.2179199, loc.data.lat) }) - + new SelectedFeatureHandler(hash, { selectedElement: selected, allElements: new ElementStorage(), @@ -128,9 +126,7 @@ export default class ActorsSpec extends T { locationControl: loc, layoutToUse: undefined }) - - - + }] diff --git a/test/GeoOperations.spec.ts b/test/GeoOperations.spec.ts index 56e07acaf..a615efb0c 100644 --- a/test/GeoOperations.spec.ts +++ b/test/GeoOperations.spec.ts @@ -1,8 +1,8 @@ import {Utils} from "../Utils"; import * as Assert from "assert"; +import {equal} from "assert"; import T from "./TestHelper"; import {GeoOperations} from "../Logic/GeoOperations"; -import {equal} from "assert"; import {BBox} from "../Logic/BBox"; Utils.runningFromConsole = true; diff --git a/test/ImageProvider.spec.ts b/test/ImageProvider.spec.ts index 898f05c7c..e00311986 100644 --- a/test/ImageProvider.spec.ts +++ b/test/ImageProvider.spec.ts @@ -4,23 +4,24 @@ import {UIEventSource} from "../Logic/UIEventSource"; import {Utils} from "../Utils"; export default class ImageProviderSpec extends T { - + constructor() { super("ImageProvider", [ ["Search images", () => { - + let i = 0 + function expects(url, tags, providerName = undefined) { - tags.id = "test/"+i + tags.id = "test/" + i i++ AllImageProviders.LoadImagesFor(new UIEventSource(tags)).addCallbackD(images => { console.log("ImageProvider test", tags.id, "for", tags) const img = images[0] - if(img === undefined){ + if (img === undefined) { throw "No image found" } T.equals(url, img.url, tags.id) - if(providerName){ + if (providerName) { T.equals(img.provider.constructor.name, providerName) } console.log("OK") @@ -30,51 +31,53 @@ export default class ImageProviderSpec extends T { const muntpoort_expected = "https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABr%C3%BCgge-Muntpoort_6-29510-58192.jpg?width=500&height=400" expects( muntpoort_expected, - { "wikimedia_commons":"File:Brügge-Muntpoort_6-29510-58192.jpg" - } , "WikimediaImageProvider") - + { + "wikimedia_commons": "File:Brügge-Muntpoort_6-29510-58192.jpg" + }, "WikimediaImageProvider") expects(muntpoort_expected, - { "wikimedia_commons":"https://upload.wikimedia.org/wikipedia/commons/c/cd/Br%C3%BCgge-Muntpoort_6-29510-58192.jpg" - } , "WikimediaImageProvider") - - expects(muntpoort_expected , { - "image":"https://upload.wikimedia.org/wikipedia/commons/c/cd/Br%C3%BCgge-Muntpoort_6-29510-58192.jpg" - } , "WikimediaImageProvider") + { + "wikimedia_commons": "https://upload.wikimedia.org/wikipedia/commons/c/cd/Br%C3%BCgge-Muntpoort_6-29510-58192.jpg" + }, "WikimediaImageProvider") - - expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABelgium-5955_-_Simon_Stevin_(13746657193).jpg?width=500&height=400" , { - "image":"File:Belgium-5955_-_Simon_Stevin_(13746657193).jpg" - } , "WikimediaImageProvider") - - expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABelgium-5955_-_Simon_Stevin_(13746657193).jpg?width=500&height=400" , { - "wikimedia_commons":"File:Belgium-5955_-_Simon_Stevin_(13746657193).jpg" - } , "WikimediaImageProvider") - - - - - expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABrugge_Leeuwstraat_zonder_nummer_Leeuwbrug_-_119334_-_onroerenderfgoed.jpg?width=500&height=400",{ - image:"File:Brugge_Leeuwstraat_zonder_nummer_Leeuwbrug_-_119334_-_onroerenderfgoed.jpg" + expects(muntpoort_expected, { + "image": "https://upload.wikimedia.org/wikipedia/commons/c/cd/Br%C3%BCgge-Muntpoort_6-29510-58192.jpg" }, "WikimediaImageProvider") - expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3APapageno_Jef_Claerhout.jpg?width=500&height=400",{ - "wikimedia_commons": "File:Papageno_Jef_Claerhout.jpg" + + expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABelgium-5955_-_Simon_Stevin_(13746657193).jpg?width=500&height=400", { + "image": "File:Belgium-5955_-_Simon_Stevin_(13746657193).jpg" + }, "WikimediaImageProvider") + + expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABelgium-5955_-_Simon_Stevin_(13746657193).jpg?width=500&height=400", { + "wikimedia_commons": "File:Belgium-5955_-_Simon_Stevin_(13746657193).jpg" + }, "WikimediaImageProvider") + + + expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3ABrugge_Leeuwstraat_zonder_nummer_Leeuwbrug_-_119334_-_onroerenderfgoed.jpg?width=500&height=400", { + image: "File:Brugge_Leeuwstraat_zonder_nummer_Leeuwbrug_-_119334_-_onroerenderfgoed.jpg" + }, "WikimediaImageProvider") + + expects("https://commons.wikimedia.org/wiki/Special:FilePath/File%3APapageno_Jef_Claerhout.jpg?width=500&height=400", { + "wikimedia_commons": "File:Papageno_Jef_Claerhout.jpg" }, "WikimediaImageProvider") Utils.injectJsonDownloadForTests( - "https://graph.mapillary.com/196804715753265?fields=thumb_1024_url&&access_token=MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85" , - {"thumb_1024_url":"https://scontent-bru2-1.xx.fbcdn.net/m1/v/t6/An8HQ3DrfU76tWMC602spvM_e_rqOHyiUcYUTetXM7K52DDBEY5J4FWg4WKQqVUlMsWJn4nLXk0pxlBLx31146FqZ2Kg65z7lJUfR6wpW6WPSR5_y7RKdv4YEuzPjwIN0lagBnQONV3UjmXnEGpMouU?stp=s1024x768&ccb=10-5&oh=d460b401c505714ee1cb8bd6baf8ae5d&oe=61731FC3&_nc_sid=122ab1","id":"196804715753265"} + "https://graph.mapillary.com/196804715753265?fields=thumb_1024_url&&access_token=MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85", + { + "thumb_1024_url": "https://scontent-bru2-1.xx.fbcdn.net/m1/v/t6/An8HQ3DrfU76tWMC602spvM_e_rqOHyiUcYUTetXM7K52DDBEY5J4FWg4WKQqVUlMsWJn4nLXk0pxlBLx31146FqZ2Kg65z7lJUfR6wpW6WPSR5_y7RKdv4YEuzPjwIN0lagBnQONV3UjmXnEGpMouU?stp=s1024x768&ccb=10-5&oh=d460b401c505714ee1cb8bd6baf8ae5d&oe=61731FC3&_nc_sid=122ab1", + "id": "196804715753265" + } ) expects("https://scontent-bru2-1.xx.fbcdn.net/m1/v/t6/An8HQ3DrfU76tWMC602spvM_e_rqOHyiUcYUTetXM7K52DDBEY5J4FWg4WKQqVUlMsWJn4nLXk0pxlBLx31146FqZ2Kg65z7lJUfR6wpW6WPSR5_y7RKdv4YEuzPjwIN0lagBnQONV3UjmXnEGpMouU?stp=s1024x768&ccb=10-5&oh=d460b401c505714ee1cb8bd6baf8ae5d&oe=61731FC3&_nc_sid=122ab1", { - "mapillary":"https://www.mapillary.com/app/?pKey=196804715753265" + "mapillary": "https://www.mapillary.com/app/?pKey=196804715753265" }) - - + + }] ]); } - + } \ No newline at end of file diff --git a/test/OsmConnection.spec.ts b/test/OsmConnection.spec.ts index 9d7b114f5..3bd69ac9b 100644 --- a/test/OsmConnection.spec.ts +++ b/test/OsmConnection.spec.ts @@ -2,7 +2,6 @@ import T from "./TestHelper"; import UserDetails, {OsmConnection} from "../Logic/Osm/OsmConnection"; import {UIEventSource} from "../Logic/UIEventSource"; import ScriptUtils from "../scripts/ScriptUtils"; -import {AllKnownLayouts} from "../Customizations/AllKnownLayouts"; import {ElementStorage} from "../Logic/ElementStorage"; import {Changes} from "../Logic/Osm/Changes"; diff --git a/test/OsmObject.spec.ts b/test/OsmObject.spec.ts index e26dae4d6..9cf60e354 100644 --- a/test/OsmObject.spec.ts +++ b/test/OsmObject.spec.ts @@ -1,26 +1,13 @@ import T from "./TestHelper"; import {OsmObject} from "../Logic/Osm/OsmObject"; -import ScriptUtils from "../scripts/ScriptUtils"; -import {UIEventSource} from "../Logic/UIEventSource"; export default class OsmObjectSpec extends T { - private static async runTest(){ - const ways = await OsmObject.DownloadReferencingWays("node/1124134958") - if(ways === undefined){ - throw "Did not get the ways" - } - if (ways.length !== 4) { - throw "Expected 4 ways but got "+ways.length - } - } - - constructor() { super("osmobject", [ [ "Download referencing ways", () => { - OsmObjectSpec.runTest().then(_ => console.log("Referencing ways test is done (async)")) + OsmObjectSpec.runTest().then(_ => console.log("Referencing ways test is done (async)")) } ] @@ -28,4 +15,14 @@ export default class OsmObjectSpec extends T { ]); } + + private static async runTest() { + const ways = await OsmObject.DownloadReferencingWays("node/1124134958") + if (ways === undefined) { + throw "Did not get the ways" + } + if (ways.length !== 4) { + throw "Expected 4 ways but got " + ways.length + } + } } \ No newline at end of file diff --git a/test/RelationSplitHandler.spec.ts b/test/RelationSplitHandler.spec.ts index 0d13e7dc5..76c605a78 100644 --- a/test/RelationSplitHandler.spec.ts +++ b/test/RelationSplitHandler.spec.ts @@ -266,13 +266,285 @@ export default class RelationSplitHandlerSpec extends T { } ) Utils.injectJsonDownloadForTests( - "https://www.openstreetmap.org/api/0.6/relation/4374576" , - {"version":"0.6","generator":"CGImap 0.8.5 (1266692 spike-06.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"relation","id":4374576,"timestamp":"2014-12-23T21:42:27Z","version":2,"changeset":27660623,"user":"escada","uid":436365,"members":[{"type":"way","ref":318616190,"role":"from"},{"type":"node","ref":1407529979,"role":"via"},{"type":"way","ref":143298912,"role":"to"}],"tags":{"restriction":"no_right_turn","type":"restriction"}}]} + "https://www.openstreetmap.org/api/0.6/relation/4374576", + { + "version": "0.6", + "generator": "CGImap 0.8.5 (1266692 spike-06.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [{ + "type": "relation", + "id": 4374576, + "timestamp": "2014-12-23T21:42:27Z", + "version": 2, + "changeset": 27660623, + "user": "escada", + "uid": 436365, + "members": [{"type": "way", "ref": 318616190, "role": "from"}, { + "type": "node", + "ref": 1407529979, + "role": "via" + }, {"type": "way", "ref": 143298912, "role": "to"}], + "tags": {"restriction": "no_right_turn", "type": "restriction"} + }] + } ) Utils.injectJsonDownloadForTests( - "https://www.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","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"node","id":26343912,"lat":51.2146847,"lon":3.2397007,"timestamp":"2015-04-11T10:40:56Z","version":5,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":26343913,"lat":51.2161912,"lon":3.2386907,"timestamp":"2015-04-11T10:40:56Z","version":6,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":26343914,"lat":51.2193456,"lon":3.2360696,"timestamp":"2015-04-11T10:40:56Z","version":5,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":26343915,"lat":51.2202816,"lon":3.2352429,"timestamp":"2015-04-11T10:40:56Z","version":5,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":875668688,"lat":51.2131868,"lon":3.2406009,"timestamp":"2015-04-11T10:40:56Z","version":4,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1109632153,"lat":51.2207068,"lon":3.234882,"timestamp":"2015-04-11T10:40:55Z","version":3,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1109632154,"lat":51.220784,"lon":3.2348394,"timestamp":"2021-05-30T08:01:17Z","version":4,"changeset":105557550,"user":"albertino","uid":499281},{"type":"node","id":1109632177,"lat":51.2205082,"lon":3.2350441,"timestamp":"2015-04-11T10:40:55Z","version":3,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1407529961,"lat":51.2168476,"lon":3.2381772,"timestamp":"2015-04-11T10:40:55Z","version":2,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1407529969,"lat":51.2155155,"lon":3.23917,"timestamp":"2011-08-21T20:08:27Z","version":1,"changeset":9088257,"user":"toeklk","uid":219908},{"type":"node","id":1407529979,"lat":51.212694,"lon":3.2409595,"timestamp":"2015-04-11T10:40:55Z","version":6,"changeset":30139621,"user":"M!dgard","uid":763799,"tags":{"highway":"traffic_signals"}},{"type":"node","id":1634435395,"lat":51.2129189,"lon":3.2408257,"timestamp":"2012-02-15T19:37:51Z","version":1,"changeset":10695640,"user":"Eimai","uid":6072},{"type":"node","id":1634435396,"lat":51.2132508,"lon":3.2405417,"timestamp":"2012-02-15T19:37:51Z","version":1,"changeset":10695640,"user":"Eimai","uid":6072},{"type":"node","id":1634435397,"lat":51.2133918,"lon":3.2404416,"timestamp":"2015-04-11T10:40:55Z","version":2,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":1974988033,"lat":51.2127459,"lon":3.240928,"timestamp":"2012-10-20T12:24:13Z","version":1,"changeset":13566903,"user":"skyman81","uid":955688},{"type":"node","id":3250129361,"lat":51.2127906,"lon":3.2409016,"timestamp":"2018-12-19T00:00:33Z","version":2,"changeset":65596519,"user":"beardhatcode","uid":5439560,"tags":{"crossing":"traffic_signals","highway":"crossing"}},{"type":"node","id":3250129363,"lat":51.2149189,"lon":3.2395571,"timestamp":"2015-04-11T10:40:56Z","version":2,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":3450326133,"lat":51.2139571,"lon":3.2401205,"timestamp":"2015-04-11T10:40:26Z","version":1,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":3450326135,"lat":51.2181385,"lon":3.2370893,"timestamp":"2015-04-11T10:40:26Z","version":1,"changeset":30139621,"user":"M!dgard","uid":763799},{"type":"node","id":4794847239,"lat":51.2191224,"lon":3.2362584,"timestamp":"2019-08-27T23:07:05Z","version":2,"changeset":73816461,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":8493044168,"lat":51.2130348,"lon":3.2407284,"timestamp":"2021-03-06T21:52:51Z","version":1,"changeset":100555232,"user":"kaart_fietser","uid":11022240,"tags":{"highway":"traffic_signals","traffic_signals":"traffic_lights"}},{"type":"node","id":8792687918,"lat":51.2207505,"lon":3.2348579,"timestamp":"2021-06-02T18:27:15Z","version":1,"changeset":105735092,"user":"albertino","uid":499281},{"type":"way","id":143298912,"timestamp":"2021-06-02T18:27:15Z","version":15,"changeset":105735092,"user":"albertino","uid":499281,"nodes":[1407529979,1974988033,3250129361,1634435395,8493044168,875668688,1634435396,1634435397,3450326133,26343912,3250129363,1407529969,26343913,1407529961,3450326135,4794847239,26343914,26343915,1109632177,1109632153,8792687918,1109632154],"tags":{"cycleway:right":"track","highway":"primary","lanes":"2","lit":"yes","maxspeed":"70","name":"Buiten Kruisvest","oneway":"yes","ref":"R30","surface":"asphalt","wikipedia":"nl:Buiten Kruisvest"}}]} + "https://www.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", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [{ + "type": "node", + "id": 26343912, + "lat": 51.2146847, + "lon": 3.2397007, + "timestamp": "2015-04-11T10:40:56Z", + "version": 5, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 26343913, + "lat": 51.2161912, + "lon": 3.2386907, + "timestamp": "2015-04-11T10:40:56Z", + "version": 6, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 26343914, + "lat": 51.2193456, + "lon": 3.2360696, + "timestamp": "2015-04-11T10:40:56Z", + "version": 5, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 26343915, + "lat": 51.2202816, + "lon": 3.2352429, + "timestamp": "2015-04-11T10:40:56Z", + "version": 5, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 875668688, + "lat": 51.2131868, + "lon": 3.2406009, + "timestamp": "2015-04-11T10:40:56Z", + "version": 4, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 1109632153, + "lat": 51.2207068, + "lon": 3.234882, + "timestamp": "2015-04-11T10:40:55Z", + "version": 3, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 1109632154, + "lat": 51.220784, + "lon": 3.2348394, + "timestamp": "2021-05-30T08:01:17Z", + "version": 4, + "changeset": 105557550, + "user": "albertino", + "uid": 499281 + }, { + "type": "node", + "id": 1109632177, + "lat": 51.2205082, + "lon": 3.2350441, + "timestamp": "2015-04-11T10:40:55Z", + "version": 3, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 1407529961, + "lat": 51.2168476, + "lon": 3.2381772, + "timestamp": "2015-04-11T10:40:55Z", + "version": 2, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 1407529969, + "lat": 51.2155155, + "lon": 3.23917, + "timestamp": "2011-08-21T20:08:27Z", + "version": 1, + "changeset": 9088257, + "user": "toeklk", + "uid": 219908 + }, { + "type": "node", + "id": 1407529979, + "lat": 51.212694, + "lon": 3.2409595, + "timestamp": "2015-04-11T10:40:55Z", + "version": 6, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799, + "tags": {"highway": "traffic_signals"} + }, { + "type": "node", + "id": 1634435395, + "lat": 51.2129189, + "lon": 3.2408257, + "timestamp": "2012-02-15T19:37:51Z", + "version": 1, + "changeset": 10695640, + "user": "Eimai", + "uid": 6072 + }, { + "type": "node", + "id": 1634435396, + "lat": 51.2132508, + "lon": 3.2405417, + "timestamp": "2012-02-15T19:37:51Z", + "version": 1, + "changeset": 10695640, + "user": "Eimai", + "uid": 6072 + }, { + "type": "node", + "id": 1634435397, + "lat": 51.2133918, + "lon": 3.2404416, + "timestamp": "2015-04-11T10:40:55Z", + "version": 2, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 1974988033, + "lat": 51.2127459, + "lon": 3.240928, + "timestamp": "2012-10-20T12:24:13Z", + "version": 1, + "changeset": 13566903, + "user": "skyman81", + "uid": 955688 + }, { + "type": "node", + "id": 3250129361, + "lat": 51.2127906, + "lon": 3.2409016, + "timestamp": "2018-12-19T00:00:33Z", + "version": 2, + "changeset": 65596519, + "user": "beardhatcode", + "uid": 5439560, + "tags": {"crossing": "traffic_signals", "highway": "crossing"} + }, { + "type": "node", + "id": 3250129363, + "lat": 51.2149189, + "lon": 3.2395571, + "timestamp": "2015-04-11T10:40:56Z", + "version": 2, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 3450326133, + "lat": 51.2139571, + "lon": 3.2401205, + "timestamp": "2015-04-11T10:40:26Z", + "version": 1, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 3450326135, + "lat": 51.2181385, + "lon": 3.2370893, + "timestamp": "2015-04-11T10:40:26Z", + "version": 1, + "changeset": 30139621, + "user": "M!dgard", + "uid": 763799 + }, { + "type": "node", + "id": 4794847239, + "lat": 51.2191224, + "lon": 3.2362584, + "timestamp": "2019-08-27T23:07:05Z", + "version": 2, + "changeset": 73816461, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 8493044168, + "lat": 51.2130348, + "lon": 3.2407284, + "timestamp": "2021-03-06T21:52:51Z", + "version": 1, + "changeset": 100555232, + "user": "kaart_fietser", + "uid": 11022240, + "tags": {"highway": "traffic_signals", "traffic_signals": "traffic_lights"} + }, { + "type": "node", + "id": 8792687918, + "lat": 51.2207505, + "lon": 3.2348579, + "timestamp": "2021-06-02T18:27:15Z", + "version": 1, + "changeset": 105735092, + "user": "albertino", + "uid": 499281 + }, { + "type": "way", + "id": 143298912, + "timestamp": "2021-06-02T18:27:15Z", + "version": 15, + "changeset": 105735092, + "user": "albertino", + "uid": 499281, + "nodes": [1407529979, 1974988033, 3250129361, 1634435395, 8493044168, 875668688, 1634435396, 1634435397, 3450326133, 26343912, 3250129363, 1407529969, 26343913, 1407529961, 3450326135, 4794847239, 26343914, 26343915, 1109632177, 1109632153, 8792687918, 1109632154], + "tags": { + "cycleway:right": "track", + "highway": "primary", + "lanes": "2", + "lit": "yes", + "maxspeed": "70", + "name": "Buiten Kruisvest", + "oneway": "yes", + "ref": "R30", + "surface": "asphalt", + "wikipedia": "nl:Buiten Kruisvest" + } + }] + } ) @@ -394,7 +666,7 @@ export default class RelationSplitHandlerSpec extends T { allWaysNodesInOrder: withSplit }, "no-theme") const changeDescription = await splitter.CreateChangeDescriptions(new Changes()) - const allIds = changeDescription[0].changes["members"].map(m => m.type+"/"+ m.ref+"-->"+m.role).join(",") + const allIds = changeDescription[0].changes["members"].map(m => m.type + "/" + m.ref + "-->" + m.role).join(",") const expected = "way/318616190-->from,node/1407529979-->via,way/-1-->to" T.equals(expected, allIds) diff --git a/test/ReplaceGeometry.spec.ts b/test/ReplaceGeometry.spec.ts index 40c3e53bb..4919914cc 100644 --- a/test/ReplaceGeometry.spec.ts +++ b/test/ReplaceGeometry.spec.ts @@ -1,5 +1,4 @@ import T from "./TestHelper"; -import FullNodeDatabaseSource from "../Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource"; import {Utils} from "../Utils"; export default class ReplaceGeometrySpec extends T { @@ -177,8 +176,6 @@ export default class ReplaceGeometrySpec extends T { const rawData = await Utils.downloadJsonCached(url, 1000) - - }] ]); } diff --git a/test/SplitAction.spec.ts b/test/SplitAction.spec.ts index d251c9b21..c476207a4 100644 --- a/test/SplitAction.spec.ts +++ b/test/SplitAction.spec.ts @@ -7,6 +7,290 @@ import {Utils} from "../Utils"; export default class SplitActionSpec extends T { + constructor() { + super("splitaction", [ + ["split 295132739", + () => SplitActionSpec.split().then(_ => console.log("OK"))], + ["split 295132739 on already existing node", + () => SplitActionSpec.splitWithPointReuse().then(_ => console.log("OK"))], + ["split 61435323 on already existing node", + () => SplitActionSpec.SplitHoutkaai().then(_ => console.log("OK"))], + ["Split test line", + async () => { + + Utils.injectJsonDownloadForTests( + "https://www.openstreetmap.org/api/0.6/way/941079939/full", + { + "version": "0.6", + "generator": "CGImap 0.8.5 (957273 spike-08.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [{ + "type": "node", + "id": 6490126559, + "lat": 51.2332219, + "lon": 3.1429387, + "timestamp": "2021-05-09T19:04:53Z", + "version": 2, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"highway": "street_lamp", "power": "pole", "support": "pole"} + }, { + "type": "node", + "id": 8715440363, + "lat": 51.2324011, + "lon": 3.1367377, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"fixme": "continue"} + }, { + "type": "node", + "id": 8715440364, + "lat": 51.232455, + "lon": 3.1368759, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440365, + "lat": 51.2325883, + "lon": 3.1373986, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440366, + "lat": 51.232688, + "lon": 3.1379837, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440367, + "lat": 51.2327354, + "lon": 3.1385649, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440368, + "lat": 51.2327042, + "lon": 3.1392187, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"highway": "street_lamp", "power": "pole", "support": "pole"} + }, { + "type": "node", + "id": 8715440369, + "lat": 51.2323902, + "lon": 3.139353, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440370, + "lat": 51.2321027, + "lon": 3.139601, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"highway": "street_lamp", "power": "pole", "ref": "242", "support": "pole"} + }, { + "type": "node", + "id": 8715440371, + "lat": 51.2322614, + "lon": 3.1401564, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440372, + "lat": 51.232378, + "lon": 3.1407909, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440373, + "lat": 51.2325532, + "lon": 3.1413659, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440374, + "lat": 51.2327611, + "lon": 3.1418877, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "node", + "id": 8715440375, + "lat": 51.2330037, + "lon": 3.142418, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "tags": {"power": "pole"} + }, { + "type": "way", + "id": 941079939, + "timestamp": "2021-05-09T19:04:53Z", + "version": 1, + "changeset": 104407928, + "user": "M!dgard", + "uid": 763799, + "nodes": [6490126559, 8715440375, 8715440374, 8715440373, 8715440372, 8715440371, 8715440370, 8715440369, 8715440368, 8715440367, 8715440366, 8715440365, 8715440364, 8715440363], + "tags": {"power": "minor_line"} + }] + } + ) + + Utils.injectJsonDownloadForTests( + "https://www.openstreetmap.org/api/0.6/way/941079939/relations", + { + "version": "0.6", + "generator": "CGImap 0.8.5 (2419440 spike-07.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [] + } + ) + + // Split points are lon,lat + const splitPointAroundP3: [number, number] = [3.1392198801040645, 51.232701022376745] + const splitAction = new SplitAction("way/941079939", [splitPointAroundP3], {theme: "test"}) + const changes = await splitAction.Perform(new Changes()) + console.log(changes) + // 8715440368 is the expected point of the split + + /* Nodes are + 6490126559 (part of ways 941079941 and 941079940) + 8715440375 + 8715440374 + 8715440373 + 8715440372 + 8715440371 + 8715440370 + 8715440369 + 8715440368 <--- split here + 8715440367 + 8715440366 + 8715440365 + 8715440364 + 8715440363 + */ + + const nodeList0 = [6490126559, + 8715440375, + 8715440374, + 8715440373, + 8715440372, + 8715440371, + 8715440370, + 8715440369, + 8715440368] + + const nodeList1 = [ + 8715440368, + 8715440367, + 8715440366, + 8715440365, + 8715440364, + 8715440363 + ] + + T.listIdentical(nodeList0, changes[0].changes["nodes"]) + T.listIdentical(nodeList1, changes[1].changes["nodes"]) + } + ], + ["Split minor powerline halfway", async () => { + + + const splitPointHalfway: [number, number] = [3.1392842531204224, 51.23255322710106] + const splitAction = new SplitAction("way/941079939", [splitPointHalfway], {theme: "test"}, 1) + const changes = await splitAction.Perform(new Changes()) + + const nodeList0 = [6490126559, + 8715440375, + 8715440374, + 8715440373, + 8715440372, + 8715440371, + 8715440370, + 8715440369, + -1] + + const nodeList1 = [ + -1, + 8715440368, + 8715440367, + 8715440366, + 8715440365, + 8715440364, + 8715440363 + ] + // THe first change is the creation of the new node + T.equals("node", changes[0].type) + T.equals(-1, changes[0].id) + + T.listIdentical(nodeList0, changes[1].changes["nodes"]) + T.listIdentical(nodeList1, changes[2].changes["nodes"]) + + } + ] + ]); + } + private static async split(): Promise { Utils.injectJsonDownloadForTests( @@ -214,7 +498,6 @@ export default class SplitActionSpec extends T { equal(changeDescription[2].changes["coordinates"][0][1], splitPoint[1]) } - private static async SplitHoutkaai(): Promise { Utils.injectJsonDownloadForTests( @@ -1824,288 +2107,4 @@ export default class SplitActionSpec extends T { equal(nodes0[nodes0.length - 1], nodes1[0]) equal(1507524610, nodes1[0]) } - - constructor() { - super("splitaction", [ - ["split 295132739", - () => SplitActionSpec.split().then(_ => console.log("OK"))], - ["split 295132739 on already existing node", - () => SplitActionSpec.splitWithPointReuse().then(_ => console.log("OK"))], - ["split 61435323 on already existing node", - () => SplitActionSpec.SplitHoutkaai().then(_ => console.log("OK"))], - ["Split test line", - async () => { - - Utils.injectJsonDownloadForTests( - "https://www.openstreetmap.org/api/0.6/way/941079939/full", - { - "version": "0.6", - "generator": "CGImap 0.8.5 (957273 spike-08.openstreetmap.org)", - "copyright": "OpenStreetMap and contributors", - "attribution": "http://www.openstreetmap.org/copyright", - "license": "http://opendatacommons.org/licenses/odbl/1-0/", - "elements": [{ - "type": "node", - "id": 6490126559, - "lat": 51.2332219, - "lon": 3.1429387, - "timestamp": "2021-05-09T19:04:53Z", - "version": 2, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"highway": "street_lamp", "power": "pole", "support": "pole"} - }, { - "type": "node", - "id": 8715440363, - "lat": 51.2324011, - "lon": 3.1367377, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"fixme": "continue"} - }, { - "type": "node", - "id": 8715440364, - "lat": 51.232455, - "lon": 3.1368759, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440365, - "lat": 51.2325883, - "lon": 3.1373986, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440366, - "lat": 51.232688, - "lon": 3.1379837, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440367, - "lat": 51.2327354, - "lon": 3.1385649, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440368, - "lat": 51.2327042, - "lon": 3.1392187, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"highway": "street_lamp", "power": "pole", "support": "pole"} - }, { - "type": "node", - "id": 8715440369, - "lat": 51.2323902, - "lon": 3.139353, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440370, - "lat": 51.2321027, - "lon": 3.139601, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"highway": "street_lamp", "power": "pole", "ref": "242", "support": "pole"} - }, { - "type": "node", - "id": 8715440371, - "lat": 51.2322614, - "lon": 3.1401564, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440372, - "lat": 51.232378, - "lon": 3.1407909, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440373, - "lat": 51.2325532, - "lon": 3.1413659, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440374, - "lat": 51.2327611, - "lon": 3.1418877, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "node", - "id": 8715440375, - "lat": 51.2330037, - "lon": 3.142418, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "tags": {"power": "pole"} - }, { - "type": "way", - "id": 941079939, - "timestamp": "2021-05-09T19:04:53Z", - "version": 1, - "changeset": 104407928, - "user": "M!dgard", - "uid": 763799, - "nodes": [6490126559, 8715440375, 8715440374, 8715440373, 8715440372, 8715440371, 8715440370, 8715440369, 8715440368, 8715440367, 8715440366, 8715440365, 8715440364, 8715440363], - "tags": {"power": "minor_line"} - }] - } - ) - - Utils.injectJsonDownloadForTests( - "https://www.openstreetmap.org/api/0.6/way/941079939/relations", - { - "version": "0.6", - "generator": "CGImap 0.8.5 (2419440 spike-07.openstreetmap.org)", - "copyright": "OpenStreetMap and contributors", - "attribution": "http://www.openstreetmap.org/copyright", - "license": "http://opendatacommons.org/licenses/odbl/1-0/", - "elements": [] - } - ) - - // Split points are lon,lat - const splitPointAroundP3: [number, number] = [3.1392198801040645, 51.232701022376745] - const splitAction = new SplitAction("way/941079939", [splitPointAroundP3], {theme: "test"}) - const changes = await splitAction.Perform(new Changes()) - console.log(changes) - // 8715440368 is the expected point of the split - - /* Nodes are - 6490126559 (part of ways 941079941 and 941079940) - 8715440375 - 8715440374 - 8715440373 - 8715440372 - 8715440371 - 8715440370 - 8715440369 - 8715440368 <--- split here - 8715440367 - 8715440366 - 8715440365 - 8715440364 - 8715440363 - */ - - const nodeList0 = [6490126559, - 8715440375, - 8715440374, - 8715440373, - 8715440372, - 8715440371, - 8715440370, - 8715440369, - 8715440368] - - const nodeList1 = [ - 8715440368, - 8715440367, - 8715440366, - 8715440365, - 8715440364, - 8715440363 - ] - - T.listIdentical(nodeList0, changes[0].changes["nodes"]) - T.listIdentical(nodeList1, changes[1].changes["nodes"]) - } - ], - ["Split minor powerline halfway", async () => { - - - const splitPointHalfway: [number, number] = [3.1392842531204224, 51.23255322710106] - const splitAction = new SplitAction("way/941079939", [splitPointHalfway], {theme: "test"}, 1) - const changes = await splitAction.Perform(new Changes()) - - const nodeList0 = [6490126559, - 8715440375, - 8715440374, - 8715440373, - 8715440372, - 8715440371, - 8715440370, - 8715440369, - -1] - - const nodeList1 = [ - -1, - 8715440368, - 8715440367, - 8715440366, - 8715440365, - 8715440364, - 8715440363 - ] - // THe first change is the creation of the new node - T.equals("node", changes[0].type) - T.equals(-1, changes[0].id) - - T.listIdentical(nodeList0, changes[1].changes["nodes"]) - T.listIdentical(nodeList1, changes[2].changes["nodes"]) - - } - ] - ]); - } } \ No newline at end of file diff --git a/test/Tag.spec.ts b/test/Tag.spec.ts index 790d641b5..0180a1512 100644 --- a/test/Tag.spec.ts +++ b/test/Tag.spec.ts @@ -9,7 +9,6 @@ import {Tag} from "../Logic/Tags/Tag"; import {And} from "../Logic/Tags/And"; import {TagUtils} from "../Logic/Tags/TagUtils"; import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig"; -import {RegexTag} from "../Logic/Tags/RegexTag"; Utils.runningFromConsole = true; diff --git a/test/TestAll.ts b/test/TestAll.ts index c6f64d62e..e6dc4f9e7 100644 --- a/test/TestAll.ts +++ b/test/TestAll.ts @@ -38,7 +38,7 @@ Utils.externalDownloadFunction = async (url) => { console.error("Fetching ", url, "blocked in tests, use Utils.injectJsonDownloadForTests") const data = await ScriptUtils.DownloadJSON(url) console.log("\n\n ----------- \nBLOCKED DATA\n Utils.injectJsonDownloadForTests(\n" + - " ", JSON.stringify(url),", \n", + " ", JSON.stringify(url), ", \n", " ", JSON.stringify(data), "\n )\n------------------\n\n") throw "Detected internet access for URL " + url + ", please inject it with Utils.injectJsonDownloadForTests" } @@ -55,7 +55,7 @@ if (args.length > 0) { } if (testsToRun.length == 0) { - throw "No tests found. Try one of "+allTests.map(t => t.name).join(", ") + throw "No tests found. Try one of " + allTests.map(t => t.name).join(", ") } for (let i = 0; i < testsToRun.length; i++) { diff --git a/test/TestHelper.ts b/test/TestHelper.ts index ab7139160..3e31130f2 100644 --- a/test/TestHelper.ts +++ b/test/TestHelper.ts @@ -8,28 +8,6 @@ export default class T { this._tests = tests; } - /** - * RUns the test, returns the error messages. - * Returns an empty list if successful - * @constructor - */ - public Run(): ({ testsuite: string, name: string, msg: string } []) { - const failures: { testsuite: string, name: string, msg: string } [] = [] - for (const [name, test] of this._tests) { - try { - test(); - } catch (e) { - console.log("ERROR: ", e, e.stack) - failures.push({testsuite: this.name, name: name, msg: "" + e}); - } - } - if (failures.length == 0) { - return undefined - } else { - return failures - } - } - static assertContains(needle: string, actual: string) { if (actual.indexOf(needle) < 0) { throw `The substring ${needle} was not found` @@ -57,10 +35,10 @@ export default class T { } static listIdentical(expected: T[], actual: T[]): void { - if(expected === undefined){ + if (expected === undefined) { throw "ListIdentical failed: expected list is undefined" } - if(actual === undefined){ + if (actual === undefined) { throw "ListIdentical failed: actual list is undefined" } if (expected.length !== actual.length) { @@ -68,8 +46,30 @@ export default class T { } for (let i = 0; i < expected.length; i++) { if (expected[i] !== actual[i]) { - throw `ListIdentical failed at index ${i}: expected ${expected[i]} but got ${actual[i]}` + throw `ListIdentical failed at index ${i}: expected ${expected[i]} but got ${actual[i]}` } } } + + /** + * RUns the test, returns the error messages. + * Returns an empty list if successful + * @constructor + */ + public Run(): ({ testsuite: string, name: string, msg: string } []) { + const failures: { testsuite: string, name: string, msg: string } [] = [] + for (const [name, test] of this._tests) { + try { + test(); + } catch (e) { + console.log("ERROR: ", e, e.stack) + failures.push({testsuite: this.name, name: name, msg: "" + e}); + } + } + if (failures.length == 0) { + return undefined + } else { + return failures + } + } } diff --git a/test/TileFreshnessCalculator.spec.ts b/test/TileFreshnessCalculator.spec.ts index 6305b9a5d..7f5540d15 100644 --- a/test/TileFreshnessCalculator.spec.ts +++ b/test/TileFreshnessCalculator.spec.ts @@ -19,9 +19,9 @@ export default class TileFreshnessCalculatorSpec extends T { equal(42, calc.freshnessFor(20, 266406 * 2, 175534 * 2 + 1).getTime()) equal(undefined, calc.freshnessFor(19, 266406, 175535)) equal(undefined, calc.freshnessFor(18, 266406 / 2, 175534 / 2)) - calc.addTileLoad(Tiles.tile_index(19, 266406, 175534+1), date) - calc.addTileLoad(Tiles.tile_index(19, 266406+1, 175534), date) - calc.addTileLoad(Tiles.tile_index(19, 266406+1, 175534+1), date) + calc.addTileLoad(Tiles.tile_index(19, 266406, 175534 + 1), date) + calc.addTileLoad(Tiles.tile_index(19, 266406 + 1, 175534), date) + calc.addTileLoad(Tiles.tile_index(19, 266406 + 1, 175534 + 1), date) equal(42, calc.freshnessFor(18, 266406 / 2, 175534 / 2).getTime()) } ] diff --git a/test/Utils.spec.ts b/test/Utils.spec.ts index fd630257d..4a592bf3c 100644 --- a/test/Utils.spec.ts +++ b/test/Utils.spec.ts @@ -43,7 +43,7 @@ export default class UtilsSpec extends T { ["Sort object keys", () => { const o = { x: 'x', - abc: {'x':'x','a':'a'}, + abc: {'x': 'x', 'a': 'a'}, def: 'def' } equal('{"x":"x","abc":{"x":"x","a":"a"},"def":"def"}', JSON.stringify(o)) diff --git a/test/Wikidata.spec.test.ts b/test/Wikidata.spec.test.ts index f2a7bb25a..cf636ffc2 100644 --- a/test/Wikidata.spec.test.ts +++ b/test/Wikidata.spec.test.ts @@ -1,17 +1,7266 @@ import Wikidata from "../Logic/Web/Wikidata"; -import * as assert from "assert"; import {equal} from "assert"; import T from "./TestHelper"; import {Utils} from "../Utils"; export default class WikidataSpecTest extends T { + private static Q140 = { + "entities": { + "Q140": { + "pageid": 275, + "ns": 0, + "title": "Q140", + "lastrevid": 1503881580, + "modified": "2021-09-26T19:53:55Z", + "type": "item", + "id": "Q140", + "labels": { + "fr": {"language": "fr", "value": "lion"}, + "it": {"language": "it", "value": "leone"}, + "nb": {"language": "nb", "value": "l\u00f8ve"}, + "ru": {"language": "ru", "value": "\u043b\u0435\u0432"}, + "de": {"language": "de", "value": "L\u00f6we"}, + "es": {"language": "es", "value": "le\u00f3n"}, + "nn": {"language": "nn", "value": "l\u00f8ve"}, + "da": {"language": "da", "value": "l\u00f8ve"}, + "af": {"language": "af", "value": "leeu"}, + "ar": {"language": "ar", "value": "\u0623\u0633\u062f"}, + "bg": {"language": "bg", "value": "\u043b\u044a\u0432"}, + "bn": {"language": "bn", "value": "\u09b8\u09bf\u0982\u09b9"}, + "br": {"language": "br", "value": "leon"}, + "bs": {"language": "bs", "value": "lav"}, + "ca": {"language": "ca", "value": "lle\u00f3"}, + "cs": {"language": "cs", "value": "lev"}, + "el": {"language": "el", "value": "\u03bb\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9"}, + "fi": {"language": "fi", "value": "leijona"}, + "ga": {"language": "ga", "value": "leon"}, + "gl": {"language": "gl", "value": "Le\u00f3n"}, + "gu": {"language": "gu", "value": "\u0ab8\u0abf\u0a82\u0ab9"}, + "he": {"language": "he", "value": "\u05d0\u05e8\u05d9\u05d4"}, + "hi": {"language": "hi", "value": "\u0938\u093f\u0902\u0939"}, + "hu": {"language": "hu", "value": "oroszl\u00e1n"}, + "id": {"language": "id", "value": "Singa"}, + "ja": {"language": "ja", "value": "\u30e9\u30a4\u30aa\u30f3"}, + "ko": {"language": "ko", "value": "\uc0ac\uc790"}, + "mk": {"language": "mk", "value": "\u043b\u0430\u0432"}, + "ml": {"language": "ml", "value": "\u0d38\u0d3f\u0d02\u0d39\u0d02"}, + "mr": {"language": "mr", "value": "\u0938\u093f\u0902\u0939"}, + "my": {"language": "my", "value": "\u1001\u103c\u1004\u103a\u1039\u101e\u1031\u1037"}, + "ne": {"language": "ne", "value": "\u0938\u093f\u0902\u0939"}, + "nl": {"language": "nl", "value": "leeuw"}, + "pl": {"language": "pl", "value": "lew afryka\u0144ski"}, + "pt": {"language": "pt", "value": "le\u00e3o"}, + "pt-br": {"language": "pt-br", "value": "le\u00e3o"}, + "scn": {"language": "scn", "value": "liuni"}, + "sq": {"language": "sq", "value": "Luani"}, + "sr": {"language": "sr", "value": "\u043b\u0430\u0432"}, + "sw": {"language": "sw", "value": "simba"}, + "ta": {"language": "ta", "value": "\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd"}, + "te": {"language": "te", "value": "\u0c38\u0c3f\u0c02\u0c39\u0c02"}, + "th": {"language": "th", "value": "\u0e2a\u0e34\u0e07\u0e42\u0e15"}, + "tr": {"language": "tr", "value": "aslan"}, + "uk": {"language": "uk", "value": "\u043b\u0435\u0432"}, + "vi": {"language": "vi", "value": "s\u01b0 t\u1eed"}, + "zh": {"language": "zh", "value": "\u7345\u5b50"}, + "sco": {"language": "sco", "value": "lion"}, + "zh-hant": {"language": "zh-hant", "value": "\u7345\u5b50"}, + "fa": {"language": "fa", "value": "\u0634\u06cc\u0631"}, + "zh-hans": {"language": "zh-hans", "value": "\u72ee\u5b50"}, + "ee": {"language": "ee", "value": "Dzata"}, + "ilo": {"language": "ilo", "value": "leon"}, + "ksh": {"language": "ksh", "value": "L\u00f6hv"}, + "zh-hk": {"language": "zh-hk", "value": "\u7345\u5b50"}, + "as": {"language": "as", "value": "\u09b8\u09bf\u0982\u09b9"}, + "zh-cn": {"language": "zh-cn", "value": "\u72ee\u5b50"}, + "zh-mo": {"language": "zh-mo", "value": "\u7345\u5b50"}, + "zh-my": {"language": "zh-my", "value": "\u72ee\u5b50"}, + "zh-sg": {"language": "zh-sg", "value": "\u72ee\u5b50"}, + "zh-tw": {"language": "zh-tw", "value": "\u7345\u5b50"}, + "ast": {"language": "ast", "value": "lle\u00f3n"}, + "sat": {"language": "sat", "value": "\u1c61\u1c5f\u1c74\u1c5f\u1c60\u1c69\u1c5e"}, + "bho": {"language": "bho", "value": "\u0938\u093f\u0902\u0939"}, + "en": {"language": "en", "value": "lion"}, + "ks": {"language": "ks", "value": "\u067e\u0627\u062f\u064e\u0631 \u0633\u0655\u06c1\u06c1"}, + "be-tarask": {"language": "be-tarask", "value": "\u043b\u0435\u045e"}, + "nan": {"language": "nan", "value": "Sai"}, + "la": {"language": "la", "value": "leo"}, + "en-ca": {"language": "en-ca", "value": "Lion"}, + "en-gb": {"language": "en-gb", "value": "lion"}, + "ab": {"language": "ab", "value": "\u0410\u043b\u044b\u043c"}, + "am": {"language": "am", "value": "\u12a0\u1295\u1260\u1233"}, + "an": {"language": "an", "value": "Panthera leo"}, + "ang": {"language": "ang", "value": "L\u0113o"}, + "arc": {"language": "arc", "value": "\u0710\u072a\u071d\u0710"}, + "arz": {"language": "arz", "value": "\u0633\u0628\u0639"}, + "av": {"language": "av", "value": "\u0413\u044a\u0430\u043b\u0431\u0430\u0446\u04c0"}, + "az": {"language": "az", "value": "\u015eir"}, + "ba": {"language": "ba", "value": "\u0410\u0440\u044b\u04ab\u043b\u0430\u043d"}, + "be": {"language": "be", "value": "\u043b\u0435\u045e"}, + "bo": {"language": "bo", "value": "\u0f66\u0f7a\u0f44\u0f0b\u0f42\u0f7a\u0f0d"}, + "bpy": {"language": "bpy", "value": "\u09a8\u0982\u09b8\u09be"}, + "bxr": {"language": "bxr", "value": "\u0410\u0440\u0441\u0430\u043b\u0430\u043d"}, + "ce": {"language": "ce", "value": "\u041b\u043e\u043c"}, + "chr": {"language": "chr", "value": "\u13e2\u13d3\u13e5 \u13a4\u13cd\u13c6\u13b4\u13c2"}, + "chy": {"language": "chy", "value": "P\u00e9hpe'\u00e9nan\u00f3se'hame"}, + "ckb": {"language": "ckb", "value": "\u0634\u06ce\u0631"}, + "co": {"language": "co", "value": "Lionu"}, + "csb": {"language": "csb", "value": "Lew"}, + "cu": {"language": "cu", "value": "\u041b\u044c\u0432\u044a"}, + "cv": {"language": "cv", "value": "\u0410\u0440\u0103\u0441\u043b\u0430\u043d"}, + "cy": {"language": "cy", "value": "Llew"}, + "dsb": {"language": "dsb", "value": "law"}, + "eo": {"language": "eo", "value": "leono"}, + "et": {"language": "et", "value": "l\u00f5vi"}, + "eu": {"language": "eu", "value": "lehoi"}, + "fo": {"language": "fo", "value": "leyvur"}, + "frr": {"language": "frr", "value": "l\u00f6\u00f6w"}, + "gag": {"language": "gag", "value": "aslan"}, + "gd": {"language": "gd", "value": "le\u00f2mhann"}, + "gn": {"language": "gn", "value": "Le\u00f5"}, + "got": {"language": "got", "value": "\ud800\udf3b\ud800\udf39\ud800\udf45\ud800\udf30/Liwa"}, + "ha": {"language": "ha", "value": "Zaki"}, + "hak": {"language": "hak", "value": "S\u1e73\u0302-\u00e9"}, + "haw": {"language": "haw", "value": "Liona"}, + "hif": {"language": "hif", "value": "Ser"}, + "hr": {"language": "hr", "value": "lav"}, + "hsb": {"language": "hsb", "value": "law"}, + "ht": {"language": "ht", "value": "Lyon"}, + "hy": {"language": "hy", "value": "\u0561\u057c\u0575\u0578\u0582\u056e"}, + "ia": {"language": "ia", "value": "Panthera leo"}, + "ig": {"language": "ig", "value": "Od\u00fam"}, + "io": {"language": "io", "value": "leono"}, + "is": {"language": "is", "value": "lj\u00f3n"}, + "jbo": {"language": "jbo", "value": "cinfo"}, + "jv": {"language": "jv", "value": "Singa"}, + "ka": {"language": "ka", "value": "\u10da\u10dd\u10db\u10d8"}, + "kab": {"language": "kab", "value": "Izem"}, + "kbd": {"language": "kbd", "value": "\u0425\u044c\u044d\u0449"}, + "kg": {"language": "kg", "value": "Nkosi"}, + "kk": {"language": "kk", "value": "\u0410\u0440\u044b\u0441\u0442\u0430\u043d"}, + "kn": {"language": "kn", "value": "\u0cb8\u0cbf\u0c82\u0cb9"}, + "ku": {"language": "ku", "value": "\u015e\u00ear"}, + "lb": {"language": "lb", "value": "L\u00e9iw"}, + "lbe": {"language": "lbe", "value": "\u0410\u0441\u043b\u0430\u043d"}, + "lez": {"language": "lez", "value": "\u0410\u0441\u043b\u0430\u043d"}, + "li": {"language": "li", "value": "Liew"}, + "lij": {"language": "lij", "value": "Lion"}, + "ln": {"language": "ln", "value": "Nk\u0254\u0301si"}, + "lt": {"language": "lt", "value": "li\u016btas"}, + "ltg": {"language": "ltg", "value": "\u013bovs"}, + "lv": {"language": "lv", "value": "lauva"}, + "mdf": {"language": "mdf", "value": "\u041e\u0440\u043a\u0441\u043e\u0444\u0442\u0430"}, + "mhr": {"language": "mhr", "value": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d"}, + "mn": {"language": "mn", "value": "\u0410\u0440\u0441\u043b\u0430\u043d"}, + "mrj": {"language": "mrj", "value": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d"}, + "ms": {"language": "ms", "value": "Singa"}, + "mt": {"language": "mt", "value": "iljun"}, + "nah": {"language": "nah", "value": "Cu\u0101miztli"}, + "nrm": {"language": "nrm", "value": "lion"}, + "su": {"language": "su", "value": "Singa"}, + "de-ch": {"language": "de-ch", "value": "L\u00f6we"}, + "ky": {"language": "ky", "value": "\u0410\u0440\u0441\u0442\u0430\u043d"}, + "lmo": {"language": "lmo", "value": "Panthera leo"}, + "ceb": {"language": "ceb", "value": "Panthera leo"}, + "diq": {"language": "diq", "value": "\u015e\u00ear"}, + "new": {"language": "new", "value": "\u0938\u093f\u0902\u0939"}, + "nds": {"language": "nds", "value": "L\u00f6\u00f6w"}, + "ak": {"language": "ak", "value": "Gyata"}, + "cdo": {"language": "cdo", "value": "S\u0103i"}, + "ady": {"language": "ady", "value": "\u0410\u0441\u043b\u044a\u0430\u043d"}, + "azb": {"language": "azb", "value": "\u0622\u0633\u0644\u0627\u0646"}, + "lfn": {"language": "lfn", "value": "Leon"}, + "kbp": {"language": "kbp", "value": "T\u0254\u0254y\u028b\u028b"}, + "gsw": {"language": "gsw", "value": "L\u00f6we"}, + "din": {"language": "din", "value": "K\u00f6r"}, + "inh": {"language": "inh", "value": "\u041b\u043e\u043c"}, + "bm": {"language": "bm", "value": "Waraba"}, + "hyw": {"language": "hyw", "value": "\u0531\u057c\u056b\u0582\u056e"}, + "nds-nl": {"language": "nds-nl", "value": "leeuw"}, + "kw": {"language": "kw", "value": "Lew"}, + "ext": {"language": "ext", "value": "Le\u00f3n"}, + "bcl": {"language": "bcl", "value": "Leon"}, + "mg": {"language": "mg", "value": "Liona"}, + "lld": {"language": "lld", "value": "Lion"}, + "lzh": {"language": "lzh", "value": "\u7345"}, + "ary": {"language": "ary", "value": "\u0633\u0628\u0639"}, + "sv": {"language": "sv", "value": "lejon"}, + "nso": {"language": "nso", "value": "Tau"}, + "nv": { + "language": "nv", + "value": "N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed" + }, + "oc": {"language": "oc", "value": "panthera leo"}, + "or": {"language": "or", "value": "\u0b38\u0b3f\u0b02\u0b39"}, + "os": {"language": "os", "value": "\u0426\u043e\u043c\u0430\u0445\u044a"}, + "pa": {"language": "pa", "value": "\u0a38\u0a3c\u0a47\u0a30"}, + "pam": {"language": "pam", "value": "Leon"}, + "pcd": {"language": "pcd", "value": "Lion"}, + "pms": {"language": "pms", "value": "Lion"}, + "pnb": {"language": "pnb", "value": "\u0628\u0628\u0631 \u0634\u06cc\u0631"}, + "ps": {"language": "ps", "value": "\u0632\u0645\u0631\u06cc"}, + "qu": {"language": "qu", "value": "Liyun"}, + "rn": {"language": "rn", "value": "Intare"}, + "ro": {"language": "ro", "value": "Leul"}, + "sl": {"language": "sl", "value": "lev"}, + "sn": {"language": "sn", "value": "Shumba"}, + "so": {"language": "so", "value": "Libaax"}, + "ss": {"language": "ss", "value": "Libubesi"}, + "st": {"language": "st", "value": "Tau"}, + "stq": {"language": "stq", "value": "Leeuwe"}, + "sr-ec": {"language": "sr-ec", "value": "\u043b\u0430\u0432"}, + "sr-el": {"language": "sr-el", "value": "lav"}, + "rm": {"language": "rm", "value": "Liun"}, + "sm": {"language": "sm", "value": "Leona"}, + "tcy": {"language": "tcy", "value": "\u0cb8\u0cbf\u0cae\u0ccd\u0cae"}, + "szl": {"language": "szl", "value": "Lew"}, + "rue": {"language": "rue", "value": "\u041b\u0435\u0432"}, + "rw": {"language": "rw", "value": "Intare"}, + "sah": {"language": "sah", "value": "\u0425\u0430\u0445\u0430\u0439"}, + "sh": {"language": "sh", "value": "Lav"}, + "sk": {"language": "sk", "value": "lev p\u00fa\u0161\u0165ov\u00fd"}, + "tg": {"language": "tg", "value": "\u0428\u0435\u0440"}, + "ti": {"language": "ti", "value": "\u12a3\u1295\u1260\u1233"}, + "tl": {"language": "tl", "value": "Leon"}, + "tum": {"language": "tum", "value": "Nkhalamu"}, + "udm": {"language": "udm", "value": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d"}, + "ug": {"language": "ug", "value": "\u0634\u0649\u0631"}, + "ur": {"language": "ur", "value": "\u0628\u0628\u0631"}, + "vec": {"language": "vec", "value": "Leon"}, + "vep": {"language": "vep", "value": "lev"}, + "vls": {"language": "vls", "value": "l\u00eaeuw"}, + "war": {"language": "war", "value": "leon"}, + "wo": {"language": "wo", "value": "gaynde"}, + "xal": {"language": "xal", "value": "\u0410\u0440\u0441\u043b\u04a3"}, + "xmf": {"language": "xmf", "value": "\u10dc\u10ef\u10d8\u10da\u10dd"}, + "yi": {"language": "yi", "value": "\u05dc\u05d9\u05d9\u05d1"}, + "yo": {"language": "yo", "value": "K\u00ecn\u00ec\u00fan"}, + "yue": {"language": "yue", "value": "\u7345\u5b50"}, + "zu": {"language": "zu", "value": "ibhubesi"}, + "tk": {"language": "tk", "value": "\u00ddolbars"}, + "tt": {"language": "tt", "value": "\u0430\u0440\u044b\u0441\u043b\u0430\u043d"}, + "uz": {"language": "uz", "value": "Arslon"}, + "se": {"language": "se", "value": "Ledjon"}, + "si": {"language": "si", "value": "\u0dc3\u0dd2\u0d82\u0dc4\u0dba\u0dcf"}, + "sgs": {"language": "sgs", "value": "Li\u016bts"}, + "vro": {"language": "vro", "value": "L\u00f5vi"}, + "xh": {"language": "xh", "value": "Ingonyama"}, + "sa": {"language": "sa", "value": "\u0938\u093f\u0902\u0939\u0903 \u092a\u0936\u0941\u0903"}, + "za": {"language": "za", "value": "Saeceij"}, + "sd": {"language": "sd", "value": "\u0628\u0628\u0631 \u0634\u064a\u0646\u0647\u0646"}, + "wuu": {"language": "wuu", "value": "\u72ee"}, + "shn": {"language": "shn", "value": "\u101e\u1062\u1004\u103a\u1087\u101e\u102e\u1088"}, + "alt": {"language": "alt", "value": "\u0410\u0440\u0441\u043b\u0430\u043d"}, + "avk": {"language": "avk", "value": "Krapol (Panthera leo)"}, + "dag": {"language": "dag", "value": "Gbu\u0263inli"}, + "shi": {"language": "shi", "value": "Agrzam"}, + "mni": {"language": "mni", "value": "\uabc5\uabe3\uabe1\uabc1\uabe5"} + }, + "descriptions": { + "fr": {"language": "fr", "value": "esp\u00e8ce de mammif\u00e8res carnivores"}, + "it": {"language": "it", "value": "mammifero carnivoro della famiglia dei Felidi"}, + "nb": {"language": "nb", "value": "kattedyr"}, + "ru": { + "language": "ru", + "value": "\u0432\u0438\u0434 \u0445\u0438\u0449\u043d\u044b\u0445 \u043c\u043b\u0435\u043a\u043e\u043f\u0438\u0442\u0430\u044e\u0449\u0438\u0445" + }, + "de": {"language": "de", "value": "Art der Gattung Eigentliche Gro\u00dfkatzen (Panthera)"}, + "es": {"language": "es", "value": "mam\u00edfero carn\u00edvoro de la familia de los f\u00e9lidos"}, + "en": {"language": "en", "value": "species of big cat"}, + "ko": { + "language": "ko", + "value": "\uace0\uc591\uc774\uacfc\uc5d0 \uc18d\ud558\ub294 \uc721\uc2dd\ub3d9\ubb3c" + }, + "ca": {"language": "ca", "value": "mam\u00edfer carn\u00edvor de la fam\u00edlia dels f\u00e8lids"}, + "fi": {"language": "fi", "value": "suuri kissael\u00e4in"}, + "pt-br": { + "language": "pt-br", + "value": "esp\u00e9cie de mam\u00edfero carn\u00edvoro do g\u00eanero Panthera e da fam\u00edlia Felidae" + }, + "ta": {"language": "ta", "value": "\u0bb5\u0bbf\u0bb2\u0b99\u0bcd\u0b95\u0bc1"}, + "nl": {"language": "nl", "value": "groot roofdier uit de familie der katachtigen"}, + "he": { + "language": "he", + "value": "\u05de\u05d9\u05df \u05d1\u05e1\u05d5\u05d2 \u05e4\u05e0\u05ea\u05e8, \u05d8\u05d5\u05e8\u05e3 \u05d2\u05d3\u05d5\u05dc \u05d1\u05de\u05e9\u05e4\u05d7\u05ea \u05d4\u05d7\u05ea\u05d5\u05dc\u05d9\u05d9\u05dd" + }, + "pt": {"language": "pt", "value": "esp\u00e9cie de felino"}, + "sco": {"language": "sco", "value": "species o big cat"}, + "zh-hans": {"language": "zh-hans", "value": "\u5927\u578b\u732b\u79d1\u52a8\u7269"}, + "uk": { + "language": "uk", + "value": "\u0432\u0438\u0434 \u043a\u043b\u0430\u0441\u0443 \u0441\u0441\u0430\u0432\u0446\u0456\u0432, \u0440\u044f\u0434\u0443 \u0445\u0438\u0436\u0438\u0445, \u0440\u043e\u0434\u0438\u043d\u0438 \u043a\u043e\u0442\u044f\u0447\u0438\u0445" + }, + "hu": { + "language": "hu", + "value": "macskaf\u00e9l\u00e9k csal\u00e1dj\u00e1ba tartoz\u00f3 eml\u0151sfaj" + }, + "bn": { + "language": "bn", + "value": "\u099c\u0999\u09cd\u0997\u09b2\u09c7\u09b0 \u09b0\u09be\u099c\u09be" + }, + "hi": {"language": "hi", "value": "\u091c\u0902\u0917\u0932 \u0915\u093e \u0930\u093e\u091c\u093e"}, + "ilo": {"language": "ilo", "value": "sebbangan ti dakkel a pusa"}, + "ksh": { + "language": "ksh", + "value": "et jr\u00fch\u00dfde Kazedier op der \u00c4hd, der K\u00fcnning vun de Diehre" + }, + "fa": { + "language": "fa", + "value": "\u06af\u0631\u0628\u0647\u200c \u0628\u0632\u0631\u06af \u0628\u0648\u0645\u06cc \u0622\u0641\u0631\u06cc\u0642\u0627 \u0648 \u0622\u0633\u06cc\u0627" + }, + "gl": { + "language": "gl", + "value": "\u00e9 un mam\u00edfero carn\u00edvoro da familia dos f\u00e9lidos e unha das 4 especies do x\u00e9nero Panthera" + }, + "sq": {"language": "sq", "value": "mace e madhe e familjes Felidae"}, + "el": { + "language": "el", + "value": "\u03b5\u03af\u03b4\u03bf\u03c2 \u03c3\u03b1\u03c1\u03ba\u03bf\u03c6\u03ac\u03b3\u03bf \u03b8\u03b7\u03bb\u03b1\u03c3\u03c4\u03b9\u03ba\u03cc" + }, + "scn": {"language": "scn", "value": "specia di mamm\u00ecfiru"}, + "bg": { + "language": "bg", + "value": "\u0432\u0438\u0434 \u0431\u043e\u0437\u0430\u0439\u043d\u0438\u043a" + }, + "ne": { + "language": "ne", + "value": "\u0920\u0942\u0932\u094b \u092c\u093f\u0930\u093e\u0932\u094b\u0915\u094b \u092a\u094d\u0930\u091c\u093e\u0924\u093f" + }, + "pl": {"language": "pl", "value": "gatunek ssaka z rodziny kotowatych"}, + "af": { + "language": "af", + "value": "Soogdier en roofdier van die familie Felidae, een van die \"groot katte\"" + }, + "mk": { + "language": "mk", + "value": "\u0432\u0438\u0434 \u0433\u043e\u043b\u0435\u043c\u0430 \u043c\u0430\u0447\u043a\u0430" + }, + "nn": {"language": "nn", "value": "kattedyr"}, + "zh-hant": {"language": "zh-hant", "value": "\u5927\u578b\u8c93\u79d1\u52d5\u7269"}, + "zh": { + "language": "zh", + "value": "\u4ea7\u81ea\u975e\u6d32\u548c\u4e9a\u6d32\u7684\u5927\u578b\u732b\u79d1\u52a8\u7269" + }, + "zh-cn": {"language": "zh-cn", "value": "\u5927\u578b\u732b\u79d1\u52a8\u7269"}, + "zh-hk": {"language": "zh-hk", "value": "\u5927\u578b\u8c93\u79d1\u52d5\u7269"}, + "zh-mo": {"language": "zh-mo", "value": "\u5927\u578b\u8c93\u79d1\u52d5\u7269"}, + "zh-my": {"language": "zh-my", "value": "\u5927\u578b\u732b\u79d1\u52a8\u7269"}, + "zh-sg": {"language": "zh-sg", "value": "\u5927\u578b\u732b\u79d1\u52a8\u7269"}, + "zh-tw": {"language": "zh-tw", "value": "\u5927\u578b\u8c93\u79d1\u52d5\u7269"}, + "sw": {"language": "sw", "value": "mnyama mla nyama kama paka mkubwa"}, + "th": { + "language": "th", + "value": "\u0e0a\u0e37\u0e48\u0e2d\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e1b\u0e48\u0e32\u0e0a\u0e19\u0e34\u0e14\u0e2b\u0e19\u0e36\u0e48\u0e07 \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e2a\u0e32\u0e22\u0e1e\u0e31\u0e19\u0e18\u0e38\u0e4c\u0e02\u0e2d\u0e07\u0e41\u0e21\u0e27\u0e43\u0e2b\u0e0d\u0e48" + }, + "ar": { + "language": "ar", + "value": "\u062d\u064a\u0648\u0627\u0646 \u0645\u0646 \u0627\u0644\u062b\u062f\u064a\u064a\u0627\u062a \u0645\u0646 \u0641\u0635\u064a\u0644\u0629 \u0627\u0644\u0633\u0646\u0648\u0631\u064a\u0627\u062a \u0648\u0623\u062d\u062f \u0627\u0644\u0633\u0646\u0648\u0631\u064a\u0627\u062a \u0627\u0644\u0623\u0631\u0628\u0639\u0629 \u0627\u0644\u0643\u0628\u064a\u0631\u0629 \u0627\u0644\u0645\u0646\u062a\u0645\u064a\u0629 \u0644\u062c\u0646\u0633 \u0627\u0644\u0646\u0645\u0631" + }, + "ml": { + "language": "ml", + "value": "\u0d38\u0d38\u0d4d\u0d24\u0d28\u0d3f\u0d15\u0d33\u0d3f\u0d32\u0d46 \u0d2b\u0d46\u0d32\u0d3f\u0d21\u0d47 \u0d15\u0d41\u0d1f\u0d41\u0d02\u0d2c\u0d24\u0d4d\u0d24\u0d3f\u0d32\u0d46 \u0d2a\u0d3e\u0d28\u0d4d\u0d24\u0d31 \u0d1c\u0d28\u0d41\u0d38\u0d4d\u0d38\u0d3f\u0d7d \u0d09\u0d7e\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f \u0d12\u0d30\u0d41 \u0d35\u0d28\u0d4d\u0d2f\u0d1c\u0d40\u0d35\u0d3f\u0d2f\u0d3e\u0d23\u0d4d \u0d38\u0d3f\u0d02\u0d39\u0d02" + }, + "cs": {"language": "cs", "value": "ko\u010dkovit\u00e1 \u0161elma"}, + "gu": { + "language": "gu", + "value": "\u0aac\u0abf\u0ab2\u0abe\u0aa1\u0ac0 \u0ab5\u0a82\u0ab6\u0aa8\u0ac1\u0a82 \u0ab8\u0ab8\u0acd\u0aa4\u0aa8 \u0aaa\u0acd\u0ab0\u0abe\u0aa3\u0ac0" + }, + "mr": { + "language": "mr", + "value": "\u092e\u093e\u0902\u091c\u0930\u093e\u091a\u0940 \u092e\u094b\u0920\u0940 \u091c\u093e\u0924" + }, + "sr": { + "language": "sr", + "value": "\u0432\u0435\u043b\u0438\u043a\u0438 \u0441\u0438\u0441\u0430\u0440 \u0438\u0437 \u043f\u043e\u0440\u043e\u0434\u0438\u0446\u0435 \u043c\u0430\u0447\u0430\u043a\u0430" + }, + "ast": {"language": "ast", "value": "especie de mam\u00edferu carn\u00edvoru"}, + "te": { + "language": "te", + "value": "\u0c2a\u0c46\u0c26\u0c4d\u0c26 \u0c2a\u0c3f\u0c32\u0c4d\u0c32\u0c3f \u0c1c\u0c24\u0c3f" + }, + "bho": { + "language": "bho", + "value": "\u092c\u093f\u0932\u093e\u0930\u092c\u0902\u0938 \u0915\u0947 \u092c\u0921\u093c\u0939\u0928 \u091c\u093e\u0928\u0935\u0930" + }, + "da": {"language": "da", "value": "en af de fem store katte i sl\u00e6gten Panthera"}, + "vi": {"language": "vi", "value": "M\u1ed9t lo\u00e0i m\u00e8o l\u1edbn thu\u1ed9c chi Panthera"}, + "ja": {"language": "ja", "value": "\u98df\u8089\u76ee\u30cd\u30b3\u79d1\u306e\u52d5\u7269"}, + "ga": {"language": "ga", "value": "speiceas cat"}, + "bs": {"language": "bs", "value": "vrsta velike ma\u010dke"}, + "tr": {"language": "tr", "value": "Afrika ve Asya'ya \u00f6zg\u00fc b\u00fcy\u00fck bir kedi"}, + "as": { + "language": "as", + "value": "\u09b8\u09cd\u09a4\u09a8\u09cd\u09af\u09aa\u09be\u09af\u09bc\u09c0 \u09aa\u09cd\u09f0\u09be\u09a3\u09c0" + }, + "my": { + "language": "my", + "value": "\u1014\u102d\u102f\u1037\u1010\u102d\u102f\u1000\u103a\u101e\u1010\u1039\u1010\u101d\u102b \u1019\u103b\u102d\u102f\u1038\u1005\u102d\u1010\u103a (\u1000\u103c\u1031\u102c\u1004\u103a\u1019\u103b\u102d\u102f\u1038\u101b\u1004\u103a\u1038\u101d\u1004\u103a)" + }, + "id": {"language": "id", "value": "spesies hewan keluarga jenis kucing"}, + "ks": { + "language": "ks", + "value": "\u0628\u062c \u0628\u0631\u0627\u0631\u0646 \u06be\u0646\u062f \u06a9\u0633\u0645 \u06cc\u0633 \u0627\u0634\u06cc\u0627 \u062a\u06c1 \u0627\u0641\u0631\u06cc\u06a9\u0627 \u0645\u0646\u0632 \u0645\u0644\u0627\u0646 \u0686\u06be\u06c1" + }, + "br": {"language": "br", "value": "bronneg kigdebrer"}, + "sat": { + "language": "sat", + "value": "\u1c75\u1c64\u1c68 \u1c68\u1c6e\u1c71 \u1c68\u1c5f\u1c61\u1c5f" + }, + "mni": { + "language": "mni", + "value": "\uabc2\uabdd\uabc2\uabdb\uabc0\uabe4 \uabc1\uabe5\uabcd\uabe4\uabe1 \uabc6\uabe5\uabd5 \uabc1\uabe5 \uabd1\uabc6\uabe7\uabd5\uabc1\uabe4\uabe1\uabd2\uabe4 \uabc3\uabc5\uabe8\uabe1\uabd7 \uabd1\uabc3" + }, + "ro": {"language": "ro", "value": "mamifer carnivor"} + }, + "aliases": { + "es": [{"language": "es", "value": "Panthera leo"}, {"language": "es", "value": "leon"}], + "en": [{"language": "en", "value": "Asiatic Lion"}, { + "language": "en", + "value": "Panthera leo" + }, {"language": "en", "value": "African lion"}, { + "language": "en", + "value": "the lion" + }, {"language": "en", "value": "\ud83e\udd81"}], + "pt-br": [{"language": "pt-br", "value": "Panthera leo"}], + "fr": [{"language": "fr", "value": "lionne"}, {"language": "fr", "value": "lionceau"}], + "zh": [{"language": "zh", "value": "\u9b03\u6bdb"}, { + "language": "zh", + "value": "\u72ee\u5b50" + }, {"language": "zh", "value": "\u7345"}, { + "language": "zh", + "value": "\u525b\u679c\u7345" + }, {"language": "zh", "value": "\u975e\u6d32\u72ee"}], + "de": [{"language": "de", "value": "Panthera leo"}], + "ca": [{"language": "ca", "value": "Panthera leo"}], + "sco": [{"language": "sco", "value": "Panthera leo"}], + "hu": [{"language": "hu", "value": "P. leo"}, {"language": "hu", "value": "Panthera leo"}], + "ilo": [{"language": "ilo", "value": "Panthera leo"}, {"language": "ilo", "value": "Felis leo"}], + "ksh": [{"language": "ksh", "value": "L\u00f6hw"}, { + "language": "ksh", + "value": "L\u00f6hf" + }, {"language": "ksh", "value": "L\u00f6v"}], + "gl": [{"language": "gl", "value": "Panthera leo"}], + "ja": [{"language": "ja", "value": "\u767e\u7363\u306e\u738b"}, { + "language": "ja", + "value": "\u7345\u5b50" + }, {"language": "ja", "value": "\u30b7\u30b7"}], + "sq": [{"language": "sq", "value": "Mbreti i Kafsh\u00ebve"}], + "el": [{"language": "el", "value": "\u03c0\u03b1\u03bd\u03b8\u03ae\u03c1"}], + "pl": [{"language": "pl", "value": "Panthera leo"}, {"language": "pl", "value": "lew"}], + "zh-hk": [{"language": "zh-hk", "value": "\u7345"}], + "af": [{"language": "af", "value": "Panthera leo"}], + "mk": [{"language": "mk", "value": "Panthera leo"}], + "ar": [{"language": "ar", "value": "\u0644\u064a\u062b"}], + "zh-hant": [{"language": "zh-hant", "value": "\u7345"}], + "zh-cn": [{"language": "zh-cn", "value": "\u72ee"}], + "zh-hans": [{"language": "zh-hans", "value": "\u72ee"}], + "zh-mo": [{"language": "zh-mo", "value": "\u7345"}], + "zh-my": [{"language": "zh-my", "value": "\u72ee"}], + "zh-sg": [{"language": "zh-sg", "value": "\u72ee"}], + "zh-tw": [{"language": "zh-tw", "value": "\u7345"}], + "gu": [{"language": "gu", "value": "\u0ab5\u0aa8\u0ab0\u0abe\u0a9c"}, { + "language": "gu", + "value": "\u0ab8\u0abe\u0ab5\u0a9c" + }, {"language": "gu", "value": "\u0a95\u0ac7\u0ab8\u0ab0\u0ac0"}], + "ast": [{"language": "ast", "value": "Panthera leo"}, { + "language": "ast", + "value": "lle\u00f3n africanu" + }], + "hi": [{ + "language": "hi", + "value": "\u092a\u0947\u0902\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b" + }], + "te": [{ + "language": "te", + "value": "\u0c2a\u0c3e\u0c02\u0c25\u0c47\u0c30\u0c3e \u0c32\u0c3f\u0c2f\u0c4b" + }], + "nl": [{"language": "nl", "value": "Panthera leo"}], + "bho": [{ + "language": "bho", + "value": "\u092a\u0948\u0928\u094d\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b" + }, { + "language": "bho", + "value": "\u092a\u0948\u0902\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b" + }], + "ru": [{ + "language": "ru", + "value": "\u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0439 \u043b\u0435\u0432" + }, { + "language": "ru", + "value": "\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u0448\u043a\u0430" + }, { + "language": "ru", + "value": "\u0446\u0430\u0440\u044c \u0437\u0432\u0435\u0440\u0435\u0439" + }, { + "language": "ru", + "value": "\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439 \u043b\u0435\u0432" + }], + "ga": [{"language": "ga", "value": "Panthera leo"}], + "bg": [{"language": "bg", "value": "Panthera leo"}, { + "language": "bg", + "value": "\u043b\u044a\u0432\u0438\u0446\u0430" + }], + "sat": [{"language": "sat", "value": "\u1c60\u1c69\u1c5e"}], + "nan": [{"language": "nan", "value": "Panthera leo"}], + "la": [{"language": "la", "value": "Panthera leo"}], + "nds-nl": [{"language": "nds-nl", "value": "leywe"}] + }, + "claims": { + "P225": [{ + "mainsnak": { + "snaktype": "value", + "property": "P225", + "hash": "e2be083a19a0c5e1a3f8341be88c5ec0e347580f", + "datavalue": {"value": "Panthera leo", "type": "string"}, + "datatype": "string" + }, + "type": "statement", + "qualifiers": { + "P405": [{ + "snaktype": "value", + "property": "P405", + "hash": "a817d3670bc2f9a3586b6377a65d54fff72ef888", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 1043, "id": "Q1043"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P574": [{ + "snaktype": "value", + "property": "P574", + "hash": "506af9838b7d37b45786395b95170263f1951a31", + "datavalue": { + "value": { + "time": "+1758-01-01T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 9, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }], + "P31": [{ + "snaktype": "value", + "property": "P31", + "hash": "60a983bb1006c765614eb370c3854e64ec50599f", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 14594740, + "id": "Q14594740" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P405", "P574", "P31"], + "id": "q140$8CCA0B07-C81F-4456-ABAA-A7348C86C9B4", + "rank": "normal", + "references": [{ + "hash": "89e96b63b05055cc80c950cf5fea109c7d453658", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c26dbcef1202a7d198982ed24f6ea69b704f95fe", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 82575, "id": "Q82575"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "539fa499b6ea982e64006270bb26f52a57a8e32b", + "datavalue": { + "value": { + "time": "+1996-06-13T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "96dfb8481e184edb40553947f8fe08ce080f1553", + "datavalue": { + "value": { + "time": "+2013-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P577", "P813"] + }, { + "hash": "f2fcc71ba228fd0db2b328c938e601507006fa46", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "603c636b2210e4a74b7d40c9e969b7e503bbe252", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1538807, + "id": "Q1538807" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "6892402e621d2b47092e15284d64cdbb395e71f7", + "datavalue": { + "value": { + "time": "+2015-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P105": [{ + "mainsnak": { + "snaktype": "value", + "property": "P105", + "hash": "aebf3611b23ed90c7c0fc80f6cd1cb7be110ea59", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 7432, "id": "Q7432"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "q140$CD2903E5-743A-4B4F-AE9E-9C0C83426B11", + "rank": "normal", + "references": [{ + "hash": "89e96b63b05055cc80c950cf5fea109c7d453658", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c26dbcef1202a7d198982ed24f6ea69b704f95fe", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 82575, "id": "Q82575"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "539fa499b6ea982e64006270bb26f52a57a8e32b", + "datavalue": { + "value": { + "time": "+1996-06-13T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "96dfb8481e184edb40553947f8fe08ce080f1553", + "datavalue": { + "value": { + "time": "+2013-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P577", "P813"] + }, { + "hash": "f2fcc71ba228fd0db2b328c938e601507006fa46", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "603c636b2210e4a74b7d40c9e969b7e503bbe252", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1538807, + "id": "Q1538807" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "6892402e621d2b47092e15284d64cdbb395e71f7", + "datavalue": { + "value": { + "time": "+2015-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P171": [{ + "mainsnak": { + "snaktype": "value", + "property": "P171", + "hash": "cbf0d3943e6cbac8afbec1ff11525c84ee04e442", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 127960, "id": "Q127960"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "q140$C1CA40D8-39C3-4DB4-B763-207A22796D85", + "rank": "normal", + "references": [{ + "hash": "89e96b63b05055cc80c950cf5fea109c7d453658", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c26dbcef1202a7d198982ed24f6ea69b704f95fe", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 82575, "id": "Q82575"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "539fa499b6ea982e64006270bb26f52a57a8e32b", + "datavalue": { + "value": { + "time": "+1996-06-13T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "96dfb8481e184edb40553947f8fe08ce080f1553", + "datavalue": { + "value": { + "time": "+2013-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P577", "P813"] + }, { + "hash": "f2fcc71ba228fd0db2b328c938e601507006fa46", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "603c636b2210e4a74b7d40c9e969b7e503bbe252", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1538807, + "id": "Q1538807" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "6892402e621d2b47092e15284d64cdbb395e71f7", + "datavalue": { + "value": { + "time": "+2015-09-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P1403": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1403", + "hash": "baa11a4c668601014a48e2998ab76aa1ea7a5b99", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 15294488, "id": "Q15294488"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$816d2b99-4aa5-5eb9-784b-34e2704d2927", "rank": "normal" + }], + "P141": [{ + "mainsnak": { + "snaktype": "value", + "property": "P141", + "hash": "80026ea5b2066a2538fee5c0897b459bb6770689", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 278113, "id": "Q278113"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "q140$B12A2FD5-692F-4D9A-8FC7-144AA45A16F8", + "rank": "normal", + "references": [{ + "hash": "355df53bb7c6d100219cd2a331afd51719337d88", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "eb153b77c6029ffa1ca09f9128b8e47fe58fce5a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 56011232, + "id": "Q56011232" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P627": [{ + "snaktype": "value", + "property": "P627", + "hash": "3642ac96e05180279c47a035c129d3af38d85027", + "datavalue": {"value": "15951", "type": "string"}, + "datatype": "string" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "76bc602d4f902d015c358223e7c0917bd65095e0", + "datavalue": { + "value": { + "time": "+2018-08-10T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P627", "P813"] + }] + }], + "P181": [{ + "mainsnak": { + "snaktype": "value", + "property": "P181", + "hash": "8467347aac1f01e518c1b94d5bb68c65f9efe84a", + "datavalue": {"value": "Lion distribution.png", "type": "string"}, + "datatype": "commonsMedia" + }, "type": "statement", "id": "q140$12F383DD-D831-4AE9-A0ED-98C27A8C5BA7", "rank": "normal" + }], + "P830": [{ + "mainsnak": { + "snaktype": "value", + "property": "P830", + "hash": "8cafbfe99d80fcfabbd236d4cc01d33cc8a8b41d", + "datavalue": {"value": "328672", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$486d7ab8-4af8-b6e1-85bb-e0749b02c2d9", + "rank": "normal", + "references": [{ + "hash": "7e71b7ede7931e7e2ee9ce54e832816fe948b402", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "6e81987ab11fb1740bd862639411d0700be3b22c", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 82486, "id": "Q82486"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "7c1a33cf9a0bf6cdd57b66f089065ba44b6a8953", + "datavalue": { + "value": { + "time": "+2014-10-30T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P815": [{ + "mainsnak": { + "snaktype": "value", + "property": "P815", + "hash": "27f6bd8fb4504eb79b92e6b63679b83af07d5fed", + "datavalue": {"value": "183803", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$71177A4F-4308-463D-B370-8B354EC2D2C3", + "rank": "normal", + "references": [{ + "hash": "ff0dd9eabf88b0dcefa74b223d065dd644e42050", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c26dbcef1202a7d198982ed24f6ea69b704f95fe", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 82575, "id": "Q82575"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "6b8fcfa6afb3911fecec93ae1dff2b6b6cde5659", + "datavalue": { + "value": { + "time": "+2013-12-07T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P685": [{ + "mainsnak": { + "snaktype": "value", + "property": "P685", + "hash": "c863e255c042b2b9b6a788ebd6e24f38a46dfa88", + "datavalue": {"value": "9689", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$A9F4ABE4-D079-4868-BC18-F685479BB244", + "rank": "normal", + "references": [{ + "hash": "5667273d9f2899620fec2016bb2afd29aa7080ce", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "1851bc60ddfbcf6f76bd45aa7124fc0d5857a379", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 13711410, + "id": "Q13711410" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "6b8fcfa6afb3911fecec93ae1dff2b6b6cde5659", + "datavalue": { + "value": { + "time": "+2013-12-07T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P959": [{ + "mainsnak": { + "snaktype": "value", + "property": "P959", + "hash": "55cab2a9d2af860a89a8d0e2eaefedb64202a3d8", + "datavalue": {"value": "14000228", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$A967D17D-485D-434F-BBF2-E6226E63BA42", + "rank": "normal", + "references": [{ + "hash": "3e398e6df20323ce88e644e5a1e4ec0bc77a5f41", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "603c636b2210e4a74b7d40c9e969b7e503bbe252", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1538807, + "id": "Q1538807" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "d2bace4e146678a5e5f761e9a441b53b95dc2e87", + "datavalue": { + "value": { + "time": "+2014-01-10T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P842": [{ + "mainsnak": { + "snaktype": "value", + "property": "P842", + "hash": "991987fc3fa4d1cfd3a601dcfc9dd1f802255de7", + "datavalue": {"value": "49734", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$3FF45860-DBC3-4629-AAF8-F2899B6C6876", + "rank": "normal", + "references": [{ + "hash": "1111bfc1dc63ee739fb9dd3f5534346c7fd478f0", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "00fe2206a3342fa25c0cfe1d08783c49a1986f12", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 796451, + "id": "Q796451" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "14c5b75e8d3f4c43cb5b570380dd98e421bb9751", + "datavalue": { + "value": { + "time": "+2014-01-30T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P227": [{ + "mainsnak": { + "snaktype": "value", + "property": "P227", + "hash": "3343c5fd594f8f0264332d87ce95e76ffeaebffd", + "datavalue": {"value": "4140572-9", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$0059e08d-4308-8401-58e8-2cb683c03837", "rank": "normal" + }], + "P349": [{ + "mainsnak": { + "snaktype": "value", + "property": "P349", + "hash": "08812c4ef85f397bf00b015d1baf3b00d81cb9bf", + "datavalue": {"value": "00616831", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$B7933772-D27D-49D4-B1BB-AA36ADCA81B0", "rank": "normal" + }], + "P1014": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1014", + "hash": "3d27204feb184f21c042777dc9674150cb07ee92", + "datavalue": {"value": "300310388", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$8e3c9dc3-442e-2e61-8617-f4a41b5be668", "rank": "normal" + }], + "P646": [{ + "mainsnak": { + "snaktype": "value", + "property": "P646", + "hash": "0c053bce57fe07b05c300a09b322d9f89236884b", + "datavalue": {"value": "/m/096mb", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$D94D8A4F-3414-4BE0-82C1-306BD136C017", + "rank": "normal", + "references": [{ + "hash": "2b00cb481cddcac7623114367489b5c194901c4a", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "a94b740202b097dd33355e0e6c00e54b9395e5e0", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 15241312, + "id": "Q15241312" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "fde79ecb015112d2f29229ccc1ec514ed3e71fa2", + "datavalue": { + "value": { + "time": "+2013-10-28T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P577"] + }] + }], + "P1036": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1036", + "hash": "02435ba66ab8e5fb26652ae1a84695be24b3e22a", + "datavalue": {"value": "599.757", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$e75ed89a-408d-9bc1-8d99-41663921debd", "rank": "normal" + }], + "P1245": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1245", + "hash": "f3da4ca7d35fc3e02a9ea1662688d8f6c4658df0", + "datavalue": {"value": "5961", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$010e79a0-475e-fcf4-a554-375b64943783", "rank": "normal" + }], + "P910": [{ + "mainsnak": { + "snaktype": "value", + "property": "P910", + "hash": "056367b51cd51edd6c2840134fde01cf40469172", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 6987175, "id": "Q6987175"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$BC4DE2D4-BF45-49AF-A9A6-C0A976F60825", "rank": "normal" + }], + "P373": [{ + "mainsnak": { + "snaktype": "value", + "property": "P373", + "hash": "76c006bc5e2975bcda2e7d60ddcbaaa8c84f69e5", + "datavalue": {"value": "Panthera leo", "type": "string"}, + "datatype": "string" + }, "type": "statement", "id": "q140$939BA4B2-28D3-4C74-B143-A0EA6F423B43", "rank": "normal" + }], + "P846": [{ + "mainsnak": { + "snaktype": "value", + "property": "P846", + "hash": "d0428680cd2b36efde61dc69ccc5a8ff7a735cb5", + "datavalue": {"value": "5219404", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$4CE8E6D4-E9A1-46F1-8EEF-B469E8485F9E", + "rank": "normal", + "references": [{ + "hash": "5b8345ffc93a361b71f5d201a97f587e5e57efe5", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "dbb8dd1efbe0158a5227213bd628eeac27a1da65", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1531570, + "id": "Q1531570" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "3eb17b10ce02d44f47540a6fbdbb3cbb7e77d5f5", + "datavalue": { + "value": { + "time": "+2015-05-15T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P487": [{ + "mainsnak": { + "snaktype": "value", + "property": "P487", + "hash": "5f93415dd33bfde6a546fdd65e5a7013e012c336", + "datavalue": {"value": "\ud83e\udd81", "type": "string"}, + "datatype": "string" + }, "type": "statement", "id": "Q140$da5262fc-4ac5-390b-b424-4f296b2d711d", "rank": "normal" + }], + "P2040": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2040", + "hash": "5b13a3fa0fde6ba09d8e417738c05268bd065e32", + "datavalue": {"value": "6353", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$E97A1A2E-D146-4C62-AE92-5AF5F7E146EF", + "rank": "normal", + "references": [{ + "hash": "348b5187938d682071c94e22f1b30659af715dc7", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "213dc0d84ed983cbb28466ebb0c45bf8b0730ea2", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 20962955, + "id": "Q20962955" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "3d2c713dec9143721ae196af88fee0fde5ae20f2", + "datavalue": { + "value": { + "time": "+2015-09-10T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P935": [{ + "mainsnak": { + "snaktype": "value", + "property": "P935", + "hash": "c3518a9944958337bcce384587f3abc3de6ddf34", + "datavalue": {"value": "Panthera leo", "type": "string"}, + "datatype": "string" + }, "type": "statement", "id": "Q140$F7AAEE1F-4D18-4538-99F0-1A2B5AD7269F", "rank": "normal" + }], + "P1417": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1417", + "hash": "492d3483075b6915990940a4392f5ec035cbe05e", + "datavalue": {"value": "animal/lion", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$FE89C38F-6C79-4F06-8C15-81DCAC8D745F", "rank": "normal" + }], + "P244": [{ + "mainsnak": { + "snaktype": "value", + "property": "P244", + "hash": "2e41780263804dd45d7deaf7955a2d1d221f6096", + "datavalue": {"value": "sh85077276", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$634d86d1-45b1-920d-e9ef-78d5f4023288", + "rank": "normal", + "references": [{ + "hash": "88d810dd1ff791aeb0b5779876b0c9f19acb59b6", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c120f07504c77593a9d734f50361ea829f601960", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 620946, + "id": "Q620946" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "0980c2f2b51e6b2d4c1dd9a77b9fb95dc282bc79", + "datavalue": { + "value": { + "time": "+2016-06-01T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P1843": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "3b1cfb68cc46255ceba7ff7893ac1cabbb4ddd92", + "datavalue": {"value": {"text": "Lion", "language": "en"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "qualifiers": { + "P7018": [{ + "snaktype": "value", + "property": "P7018", + "hash": "40a60b39201df345ffbf5aa724269d5fd61ae028", + "datavalue": { + "value": {"entity-type": "sense", "id": "L17815-S1"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-sense" + }] + }, + "qualifiers-order": ["P7018"], + "id": "Q140$6E257597-55C7-4AF3-B3D6-0F2204FAD35C", + "rank": "normal", + "references": [{ + "hash": "eada84c58a38325085267509899037535799e978", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 32059, "id": "Q32059"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "3e51c3c32949f8a45f2c3331f55ea6ae68ecf3fe", + "datavalue": { + "value": { + "time": "+2016-10-21T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }, { + "hash": "cdc389b112247cb50b855fb86e98b7a7892e96f0", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "e17975e5c866df46673c91b2287a82cf23d14f5a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 27310853, + "id": "Q27310853" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P304": [{ + "snaktype": "value", + "property": "P304", + "hash": "ff7ad3502ff7a4a9b0feeb4248a7bed9767a1ec6", + "datavalue": {"value": "166", "type": "string"}, + "datatype": "string" + }] + }, + "snaks-order": ["P248", "P304"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "38a9c57a5c62a707adc86decd2bd00be89eab6f3", + "datavalue": {"value": {"text": "Leeu", "language": "af"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$5E731B05-20D6-491B-97E7-94D90CBB70F0", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "a4455f1ef49d7d17896563760a420031c41d65c1", + "datavalue": {"value": {"text": "Gyata", "language": "ak"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$721B4D81-D948-4002-A13E-0B2567626FD6", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "b955c9239d6ced23c0db577e20219b0417a2dd9b", + "datavalue": {"value": {"text": "Ley\u00f3n", "language": "an"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$E2B52F3D-B12D-48B5-86EA-6A4DCBC091D3", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "e18a8ecb17321c203fcf8f402e82558ce0599b39", + "datavalue": {"value": {"text": "Li\u00f3n", "language": "an"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$339ADC90-41C6-4CDB-B6C3-DA9F952FCC15", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "297bf417fff1510d19b27c08fa9f34e2653b9510", + "datavalue": { + "value": {"text": "\u0623\u064e\u0633\u064e\u062f\u064c", "language": "ar"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$F1849268-0E70-4EC0-A630-EC0D2DCBB298", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "5577ef6920a3ade2365d878740d1d097fcdae399", + "datavalue": {"value": {"text": "L\u00e9we", "language": "bar"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$BDD65B40-7ECB-4725-B33F-417A83AF5102", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "de8fa35eca4e61dfb8fe2df360e734fb1cd37092", + "datavalue": {"value": {"text": "L\u00f6we", "language": "bar"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$486EE5F1-9AB5-4789-98AC-E435D81E784F", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "246c27f44da8bedd2e3313de393fe648b2b40ea9", + "datavalue": { + "value": {"text": "\u041b\u0435\u045e (Lew)", "language": "be"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$47AA6BD4-0B09-4B20-9092-0AEAD8056157", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "64c42db53ef288871161f0a656808f06daae817d", + "datavalue": { + "value": {"text": "\u041b\u044a\u0432 (L\u0103v)", "language": "bg"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$ADF0B08A-9626-4821-8118-0A875CBE5FB9", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "6041e2730af3095f4f0cbf331382e22b596d2305", + "datavalue": { + "value": {"text": "\u09b8\u09bf\u0982\u09b9", "language": "bn"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$8DF5BDCD-B470-46C3-A44A-7375B8A5DCDE", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "8499f437dc8678b0c4b740b40cab41031fce874d", + "datavalue": {"value": {"text": "Lle\u00f3", "language": "ca"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$F55C3E63-DB2C-4F6D-B10B-4C1BB70C06A0", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "b973abb618a6f17b8a9547b852e5817b5c4da00b", + "datavalue": { + "value": {"text": "\u041b\u043e\u044c\u043c", "language": "ce"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$F32B0BFA-3B85-4A26-A888-78FD8F09F943", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "62f53c7229efad1620a5cce4dc5a535d88c4989f", + "datavalue": {"value": {"text": "Lev", "language": "cs"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$1630DAB7-C4D0-4268-A598-8BBB9480221E", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "0df7e23666c947b42aea5572a9f5a987229718d3", + "datavalue": {"value": {"text": "Llew", "language": "cy"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$F33991E8-A532-47F5-B135-A13761DB2E95", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "14942ad0830a0eb7b06704234eea637f99b53a24", + "datavalue": {"value": {"text": "L\u00f8ve", "language": "da"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$478F0603-640A-44BE-9453-700FDD32100F", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "8af089542ef6207b918f656bcf9a96e745970915", + "datavalue": {"value": {"text": "L\u00f6we", "language": "de"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "qualifiers": { + "P7018": [{ + "snaktype": "value", + "property": "P7018", + "hash": "2da239e18a0208847a72fbeab011c8c2fb3b4d99", + "datavalue": { + "value": {"entity-type": "sense", "id": "L41680-S1"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-sense" + }] + }, + "qualifiers-order": ["P7018"], + "id": "Q140$11F5F498-3688-4F4B-B2FA-7121BE5AA701", + "rank": "normal", + "references": [{ + "hash": "cdc389b112247cb50b855fb86e98b7a7892e96f0", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "e17975e5c866df46673c91b2287a82cf23d14f5a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 27310853, + "id": "Q27310853" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P304": [{ + "snaktype": "value", + "property": "P304", + "hash": "ff7ad3502ff7a4a9b0feeb4248a7bed9767a1ec6", + "datavalue": {"value": "166", "type": "string"}, + "datatype": "string" + }] + }, + "snaks-order": ["P248", "P304"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "c0c8b50001810c1ec643b88479df82ea85c819a2", + "datavalue": {"value": {"text": "Dzata", "language": "ee"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$8F6EC307-A293-4AFC-8154-E3FF187C0D7D", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "57a3384eeb13d1bcffeb3cf0efd0f3e3f511b35d", + "datavalue": { + "value": { + "text": "\u039b\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9 (Liond\u00e1ri)", + "language": "el" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$560B3341-3E06-4D09-8869-FC47C841D14C", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "ee7109a46f8259ae6f52791cfe599b7c4c272831", + "datavalue": {"value": {"text": "Leono", "language": "eo"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$67F2B7A6-1C81-407A-AA61-A1BFF148EC69", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "3b8f4f61c3a18792bfaff5d332f03c80932dce05", + "datavalue": {"value": {"text": "Le\u00f3n", "language": "es"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$DB29EAF7-4405-4030-8056-ED17089B3805", + "rank": "normal", + "references": [{ + "hash": "d3a8e536300044db1d823eae6891b2c7baa49f66", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 32059, "id": "Q32059"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "620d2e76d21bb1d326fc360db5bece2070115240", + "datavalue": { + "value": { + "time": "+2016-10-19T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "41fffb83f35736829d60f782bdce68463f0ab47c", + "datavalue": {"value": {"text": "L\u00f5vi", "language": "et"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$19B76CC4-AA11-443B-BC76-DB2D0DA5B9CB", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "b96549e5ae538fb7e0b48089508333b31aec8fe7", + "datavalue": {"value": {"text": "Lehoi", "language": "eu"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$88F712C1-4EEF-4E42-8C61-84E55CF2DCE0", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "b343c833d8de3dfd5c8b31336afd137380ab42dc", + "datavalue": { + "value": {"text": "\u0634\u06cc\u0631 (\u0160ayr)", "language": "fa"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$B72DB989-EF39-42F5-8FA8-5FC669079DB7", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "51aaf9a4a7c5e77ba931a5280d1fec984c91963b", + "datavalue": {"value": {"text": "Leijona", "language": "fi"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$6861CDE9-707D-43AD-B352-3BCD7B9D4267", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "038249fb112acc26895af45fab412395f999ae11", + "datavalue": {"value": {"text": "Leyva", "language": "fo"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$A044100A-C49F-4AA6-8861-F0300F28126E", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "92ec25b64605d026b07b0cda6e623fbbf2f3dfb4", + "datavalue": {"value": {"text": "Lion", "language": "fr"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$122623FD-3915-49E9-8890-0B6883317507", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "59be091f7839e7a6061c6d1690ed77f3b21b9ff4", + "datavalue": { + "value": {"text": "L\u00f6\u00f6w", "language": "frr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$76B87E52-A02C-4E99-A4B3-D6105B642521", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "126b0f2c5ed11124233dfefff8bd132a1fe1218a", + "datavalue": { + "value": {"text": "Le\u00f3n-leoa", "language": "gl"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$A4864784-EED3-4898-83FE-A2FCC0C3982E", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "49e0d3858de566edce1a28b0e96f42b2d0df718f", + "datavalue": { + "value": {"text": "\u0ab8\u0abf\u0a82\u0ab9", "language": "gu"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$4EE122CE-7671-480E-86A4-4A4DDABC04BA", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "dff0c422f7403c50d28dd51ca2989d03108b7584", + "datavalue": {"value": {"text": "Liona", "language": "haw"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$FBB6AC65-A224-4C29-8024-079C0687E9FB", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "c174addd56c0f42f6ec3e87c72fb9651e4923a00", + "datavalue": { + "value": {"text": "\u05d0\u05e8\u05d9\u05d4", "language": "he"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$B72D9BDB-A2CC-471D-AF20-8F7FB677D533", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "c38a63a06b569fc8fee3e98c4cf8d5501990811e", + "datavalue": { + "value": {"text": "si\u1e45ha)", "language": "hi"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$9AA9171C-E912-41F2-AB26-643AA538E644", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "94f073519a5b64c48398c73a5f0f135a4f0f4306", + "datavalue": { + "value": {"text": "\u0936\u0947\u0930", "language": "hi"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$0714B97B-03E0-4ACC-80A0-6A17874DDBA8", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "1fbda5b1494db298c698fc28ed0fe68b1c137b2e", + "datavalue": { + "value": {"text": "\u0938\u093f\u0902\u0939", "language": "hi"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$3CE22F68-038C-4A94-9A1F-96B82760DEB9", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "fac41ebd8d1da777acd93720267c7a70016156e4", + "datavalue": {"value": {"text": "Lav", "language": "hr"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$C5351C11-E287-4D3B-A9B2-56716F0E69E5", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "71e0bda709fb17d58f4bd8e12fff7f937a61673c", + "datavalue": { + "value": {"text": "Oroszl\u00e1n", "language": "hu"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$AD06E7D2-3B1F-4D14-B2E9-DD2513BE8B4B", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "05e86680d70a2c0adf9a6e6eb51bbdf8c6ae44bc", + "datavalue": { + "value": {"text": "\u0531\u057c\u0575\u0578\u0582\u056e", "language": "hy"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$3E02B802-8F7B-4C48-A3F9-FBBFDB0D8DB3", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "979f25bee6af37e19471530c6344a0d22a0d594c", + "datavalue": {"value": {"text": "Lj\u00f3n", "language": "is"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$59788C31-A354-4229-AD89-361CB6076EF7", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "789e5f5a7ec6003076bc7fd2996faf8ca8468719", + "datavalue": {"value": {"text": "Leone", "language": "it"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$4901AE59-7749-43D1-BC65-DEEC0DFEB72F", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "4a5bdf9bb40f1cab9a92b7dba1d1d74a8440c7ed", + "datavalue": { + "value": {"text": "\u30e9\u30a4\u30aa\u30f3 (Raion)", "language": "ja"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$4CF2E0D9-5CF3-46A3-A197-938E94270CE2", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "ebba3893211c78dad7ae74a51448e8c7f6e73309", + "datavalue": { + "value": {"text": "\uc0ac\uc790 (saja)", "language": "ko"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$64B6CECD-5FFE-4612-819F-CAB2E726B228", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "ed1fe1812cee80102262dd3b7e170759fbeab86a", + "datavalue": { + "value": {"text": "\u0410\u0440\u0441\u0442\u0430\u043d", "language": "ky"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$3D9597D3-E35F-4EFF-9CAF-E013B45F283F", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "a0868f5f83bb886a408aa9b25b95dbfc59bde4dc", + "datavalue": {"value": {"text": "Leo", "language": "la"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$4D650414-6AFE-430F-892F-B7774AC7AF70", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "054af77b10151632045612df9b96313dfcc3550c", + "datavalue": {"value": {"text": "Liew", "language": "li"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$D5B466A8-AEFB-4083-BF3E-194C5CE45CD3", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "9193a46891a365ee1b0a17dd6e2591babc642811", + "datavalue": {"value": {"text": "Nkosi", "language": "ln"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$55F213DF-5AAB-4490-83CB-B9E5D2B894CD", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "c5952ec6b650f1c66f37194eb88c2889560740b2", + "datavalue": { + "value": {"text": "Li\u016btas", "language": "lt"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$8551F80C-A244-4351-A98A-8A9F37A736A2", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "e3541d0807682631f8fff2d224b2cb1b3d2a4c11", + "datavalue": {"value": {"text": "Lauva", "language": "lv"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$488A2D59-533A-4C02-8AC3-01241FE63D94", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "22e20da399aff10787267691b5211b6fc0bddf38", + "datavalue": { + "value": {"text": "\u041b\u0430\u0432 (lav)", "language": "mk"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$9E2377E9-1D37-4BBC-A409-1C40CDD99A86", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "fe4c9bc3b3cce21a779f72fae808f8ed213d226b", + "datavalue": { + "value": { + "text": "\u0d38\u0d3f\u0d02\u0d39\u0d02 (simham)", + "language": "ml" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$8BEA9E08-4687-434A-9FB4-4B23B2C40838", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "85aa09066722caf2181681a24575ad89ca76210e", + "datavalue": { + "value": {"text": "si\u1e45ha)", "language": "mr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$46B51EF5-7ADB-4637-B744-89AD1E3B5D19", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "441f3832d6e3c4439c6986075096c7021a0939dd", + "datavalue": { + "value": {"text": "\u0936\u0947\u0930 (\u015a\u0113ra)", "language": "mr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$12BBC825-32E3-4026-A5E5-0330DEB21D79", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "89b35a359c3891dce190d778e9ae0a9634cfd71f", + "datavalue": { + "value": {"text": "\u0938\u093f\u0902\u0939 (singh", "language": "mr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$006148E2-658F-4C74-9C3E-26488B7AEB8D", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "5723b45deee51dfe5a2555f2db17bad14acb298a", + "datavalue": {"value": {"text": "Iljun", "language": "mt"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$13D221F5-9763-4550-9CC3-9A697286B785", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "d1ce3ab04f25af38248152eb8caa286b63366c2a", + "datavalue": {"value": {"text": "Leeuw", "language": "nl"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$65E80D17-6F20-4BAE-A2B4-DD934C0BE153", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "12f3384cc32e65dfb501e2fee19ccf709f9df757", + "datavalue": {"value": {"text": "L\u00f8ve", "language": "nn"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$78E95514-1969-4DA3-97CD-0DBADF1223E7", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "a3fedaf780a0d004ba318881f6adbe173750d09e", + "datavalue": {"value": {"text": "L\u00f8ve", "language": "nb"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$809DE1EA-861E-4813-BED7-D9C465341CB3", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "695d2ef10540ba13cf8b3541daa1d39fd720eea0", + "datavalue": { + "value": { + "text": "N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed", + "language": "nv" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$E9EDAF16-6650-40ED-B888-C524BD00DF40", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "3c143e8a8cebf92d76d3ae2d7e3bb3f87e963fb4", + "datavalue": { + "value": { + "text": "\u0a2c\u0a71\u0a2c\u0a30 \u0a38\u0a3c\u0a47\u0a30", + "language": "pa" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$13AE1DAB-4B29-49A5-9893-C0014C61D21E", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "195e48d11222aec830fb1d5c2de898c9528abc57", + "datavalue": { + "value": {"text": "lew afryka\u0144ski", "language": "pl"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$6966C1C3-9DD6-48BC-B511-B0827642E41D", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "8bd3ae632e7731ae9e72c50744383006ec6eb73e", + "datavalue": {"value": {"text": "Le\u00e3o", "language": "pt"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$BD454649-347E-4AE5-81B8-360C16C7CDA7", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "79d3336733b7bf4b7dadffd6d6ebabdb892074d1", + "datavalue": {"value": {"text": "Leu", "language": "ro"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$7323EF68-7AA0-4D38-82D8-0A94E61A26F0", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "376b852a92b6472e969ae7b995c4aacea23955eb", + "datavalue": { + "value": {"text": "\u041b\u0435\u0432 (Lev)", "language": "ru"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$A7C413B9-0916-4534-941D-C24BA0334816", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "aa323e0bea79d79900227699b3d42d689a772ca1", + "datavalue": {"value": {"text": "Lioni", "language": "sc"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$2EF83D2C-0DB9-4D3C-8FDD-86237E566260", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "a290fe08983742eac8b5bc479022564fb6b2ce81", + "datavalue": {"value": {"text": "Lev", "language": "sl"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$B276673A-08C1-47E2-99A9-D0861321E157", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "d3b070ff1452d47f87c109a9e0bfa52e61b24a4e", + "datavalue": {"value": {"text": "Libubesi", "language": "ss"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$86BFAB38-1DB8-4903-A17D-A6B8E81819CC", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "3adea59d97f3caf9bb6b1c3d7ae6365f7f656dca", + "datavalue": {"value": {"text": "Tau", "language": "st"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$2FA8893D-2401-42E9-8DC3-288CC1DEDB0C", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "0e73b32fe31a107a95de83706a12f2db419c6909", + "datavalue": {"value": {"text": "Lejon", "language": "sv"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$1A8E006E-CC7B-4066-9DE7-9B82D096779E", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "34550af2fdc48f77cf66cabc5c59d1acf1d8afd0", + "datavalue": {"value": {"text": "Simba", "language": "sw"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$B02CA616-44CF-4AA6-9734-2C05810131EB", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "701f87cf9926c9af2c41434ff130dcb234a6cd95", + "datavalue": { + "value": { + "text": "\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd", + "language": "ta" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$DA87A994-A002-45AD-A71F-99FB72F8B92F", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "856fd4809c90e3c34c6876e4410661dc04f5da8d", + "datavalue": { + "value": {"text": "\u0e2a\u0e34\u0e07\u0e42\u0e15", "language": "th"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$BDA8E989-3537-4662-8CC3-33534705A7F1", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "f8598a8369426da0c86bf8bab356a927487eae66", + "datavalue": {"value": {"text": "Aslan", "language": "tr"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$AAE5F227-C0DB-4DF3-B1F4-517699BBDDF1", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "f3c8320bd46913aee164999ab7f68388c1bd9920", + "datavalue": { + "value": {"text": "\u041b\u0435\u0432 (Lev)", "language": "uk"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$494C3503-6016-4539-83AF-6344173C2DCB", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "6cc2d534293320533e15dc713f1d2c07b3811b6a", + "datavalue": {"value": {"text": "Leon", "language": "vec"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$E6F1DA81-9F36-4CC8-B57E-95E3BDC2F5D0", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "32553481e45abf6f5e6292baea486e978c36f8fe", + "datavalue": { + "value": {"text": "S\u01b0 t\u1eed", "language": "vi"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$11D7996C-0492-41CC-AEE7-3C136172DFC7", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "69077fc29f9251d1de124cd3f3c45cd6f0bb6b65", + "datavalue": { + "value": {"text": "\u05dc\u05d9\u05d9\u05d1", "language": "yi"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$969FEF9A-C1C7-41FE-8181-07F6D87B0346", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "e3aaa8cde18be4ea6b4af6ca62b83e7dc23d76e1", + "datavalue": { + "value": {"text": "\u72ee\u5b50 (sh\u012bzi)", "language": "zh"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$3BC22F6C-F460-4354-9BA2-28CEDA9FF170", + "rank": "normal", + "references": [{ + "hash": "2e0c13df5b13edc9b3db9d8129e466c0894710ac", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "2b1e96d67dc01973d72472f712fd98ce87c6f0d7", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 13679, "id": "Q13679"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "98f5efae94b2bb9f8ffee6c677ee71f836743ef6", + "datavalue": { + "value": {"text": "Lion d'Afrique", "language": "fr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$62D09BBF-718A-4139-AF50-DA4185ED67F2", + "rank": "normal", + "references": [{ + "hash": "362e3c5d6de1d193ef97205ba38834ba075191fc", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 32059, "id": "Q32059"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "c7813bad20c2553e26e45c37e3502ce7252312df", + "datavalue": { + "value": { + "time": "+2016-10-20T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "c584bdbd3cdc1215292a4971b920c684d103ea06", + "datavalue": { + "value": {"text": "African Lion", "language": "en"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q140$C871BB58-C689-4DBA-A088-DAC205377979", + "rank": "normal", + "references": [{ + "hash": "eada84c58a38325085267509899037535799e978", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 32059, "id": "Q32059"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "3e51c3c32949f8a45f2c3331f55ea6ae68ecf3fe", + "datavalue": { + "value": { + "time": "+2016-10-21T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "1d03eace9366816c6fda340c0390caac2f3cea8e", + "datavalue": {"value": {"text": "L\u00e9iw", "language": "lb"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$c65c7614-4d6e-3a87-9771-4f8c13618249", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "925c7abced1e89fa7e8000dc9dc78627cdac9769", + "datavalue": { + "value": {"text": "Lle\u00f3n", "language": "ast"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$1024eadb-45dd-7d9a-15f6-8602946ba661", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "0bda7868c3f498ba6fde78d46d0fbcf286e42dd8", + "datavalue": { + "value": {"text": "\u0644\u064e\u064a\u0652\u062b\u064c", "language": "ar"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$c226ff70-48dd-7b4d-00ff-7a683fe510aa", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "28de99c4aa35cc049cf8c9dd18af1791944137d9", + "datavalue": { + "value": {"text": "\u10da\u10dd\u10db\u10d8", "language": "ka"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$8fe60d1a-465a-9614-cbe4-595e22429b0c", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "4550db0f44e21c5eadeaa5a1d8fc614c9eb05f52", + "datavalue": {"value": {"text": "leon", "language": "ga"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$4950cb9c-4f1e-ce27-0d8c-ba3f18096044", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1843", + "hash": "9d268eb76ed921352c205b3f890d1f9428f638f3", + "datavalue": {"value": {"text": "Singa", "language": "ms"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }, "type": "statement", "id": "Q140$67401360-49dd-b13c-8269-e703b30c9a53", "rank": "normal" + }], + "P627": [{ + "mainsnak": { + "snaktype": "value", + "property": "P627", + "hash": "3642ac96e05180279c47a035c129d3af38d85027", + "datavalue": {"value": "15951", "type": "string"}, + "datatype": "string" + }, + "type": "statement", + "id": "Q140$6BE03095-BC68-4CE5-BB99-9F3E33A6F31D", + "rank": "normal", + "references": [{ + "hash": "182efbdb9110d036ca433f3b49bd3a1ae312858b", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 32059, "id": "Q32059"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "8c1c5174f4811115ea8a0def725fdc074c2ef036", + "datavalue": { + "value": { + "time": "+2016-07-10T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P2833": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2833", + "hash": "519877b77b20416af2401e5c0645954c6700d6fd", + "datavalue": {"value": "panthera-leo", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$C0A723AE-ED2E-4FDC-827F-496E4CF29A52", "rank": "normal" + }], + "P3063": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3063", + "hash": "81cdb0273eaf0a0126b62e2ff43b8e09505eea54", + "datavalue": { + "value": { + "amount": "+108", + "unit": "http://www.wikidata.org/entity/Q573", + "upperBound": "+116", + "lowerBound": "+100" + }, "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "id": "Q140$878ff87d-40d0-bb2b-c83d-4cef682c2687", + "rank": "normal", + "references": [{ + "hash": "7d748004a43983fabae420123742fda0e9b52840", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "f618501ace3a6524b053661d067b775547f96f58", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 26706243, + "id": "Q26706243" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P478": [{ + "snaktype": "value", + "property": "P478", + "hash": "ca3c5e6054c169ee3d0dfaf660f3eecd77942070", + "datavalue": {"value": "4", "type": "string"}, + "datatype": "string" + }], + "P304": [{ + "snaktype": "value", + "property": "P304", + "hash": "dd1977567f22f4cf510adfaadf5e3574813b3521", + "datavalue": {"value": "46", "type": "string"}, + "datatype": "string" + }] + }, + "snaks-order": ["P248", "P478", "P304"] + }] + }], + "P3031": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3031", + "hash": "e6271e8d12b20c9735d2bbd80eed58581059bf3a", + "datavalue": {"value": "PNTHLE", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$65AD2857-AB65-4CC0-9AB9-9D6C924784FE", "rank": "normal" + }], + "P3151": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3151", + "hash": "e85e5599d303d9a6bb360f3133fb69a76d98d0e2", + "datavalue": {"value": "41964", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$15D7A4EB-F0A3-4C61-8D2B-E557D7BF5CF7", "rank": "normal" + }], + "P3186": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3186", + "hash": "85ec7843064210afdfef6ec565a47f229c6d15e5", + "datavalue": {"value": "644245", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$6903E136-2DB2-42C9-98CB-82F61208FDAD", + "rank": "normal", + "references": [{ + "hash": "5790a745e549ea7e4e6d7ca467148b544529ba96", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "c897ca3efd1604ef7b80a14ac0d2b8d6849c0856", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 26936509, + "id": "Q26936509" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "555ca5385c445e4fd4762281d4873682eff2ce30", + "datavalue": { + "value": { + "time": "+2016-09-24T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }, { + "hash": "3edd37192f877cad0ff97acc3db56ef2cc83945b", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4f7c4fd187630ba8cbb174c2756113983df4ce82", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45029859, + "id": "Q45029859" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "56b6aa0388c9a2711946589902bc195718bb0675", + "datavalue": { + "value": { + "time": "+2017-12-26T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }, { + "hash": "1318ed8ea451b84fe98461305665d8688603bab3", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "0fbeeecce08896108ed797d8ec22c7c10a6015e2", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45029998, + "id": "Q45029998" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "4bac1c0d2ffc45d91b51fc0881eb6bcc7916e854", + "datavalue": { + "value": { + "time": "+2018-01-02T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }, { + "hash": "6f761664a6f331d95bbaa1434447d82afd597a93", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "6c09d1d89e83bd0dfa6c94e01d24a9a47489d83e", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 58035056, + "id": "Q58035056" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "03182012ca72fcd757b8a1fe05ba927cbe9ef374", + "datavalue": { + "value": { + "time": "+2018-11-02T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P3485": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3485", + "hash": "df4e58fc2a196833ab3e33483099e2481e61ba9e", + "datavalue": {"value": {"amount": "+112", "unit": "1"}, "type": "quantity"}, + "datatype": "quantity" + }, + "type": "statement", + "id": "Q140$4B70AA09-AE2F-4F4C-9BAF-09890CDA11B8", + "rank": "normal", + "references": [{ + "hash": "fa278ebfc458360e5aed63d5058cca83c46134f1", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "e4f6d9441d0600513c4533c672b5ab472dc73694", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 328, "id": "Q328"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P3827": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3827", + "hash": "6bb26d581721d7330c407259d46ab5e25cc4a6b1", + "datavalue": {"value": "lions", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$CCDE6F7D-B4EA-4875-A4D6-5649ACFA8E2F", "rank": "normal" + }], + "P268": [{ + "mainsnak": { + "snaktype": "value", + "property": "P268", + "hash": "a20cdf81e39cd47f4da30073671792380029924c", + "datavalue": {"value": "11932251d", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$000FDB77-C70C-4464-9F00-605787964BBA", + "rank": "normal", + "references": [{ + "hash": "d4bd87b862b12d99d26e86472d44f26858dee639", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "f30cbd35620c4ea6d0633aaf0210a8916130469b", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 8447, "id": "Q8447"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P3417": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3417", + "hash": "e3b5d21350aef37f27ad8b24142d6b83d9eec0a6", + "datavalue": {"value": "Lions", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$1f96d096-4e4b-06de-740f-7b7215e5ae3f", "rank": "normal" + }], + "P4024": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4024", + "hash": "a698e7dcd6f9b0b00ee8e02846c668db83064833", + "datavalue": {"value": "Panthera_leo", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$F5DC21E8-BF52-4A0D-9A15-63B89297BD70", + "rank": "normal", + "references": [{ + "hash": "d4bd87b862b12d99d26e86472d44f26858dee639", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "f30cbd35620c4ea6d0633aaf0210a8916130469b", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 8447, "id": "Q8447"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P1225": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1225", + "hash": "9af40267f10f15926877e9a3f78faeab7b0dda82", + "datavalue": {"value": "10665610", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$268074ED-3CD7-46C9-A8FF-8C3679C45547", "rank": "normal" + }], + "P4728": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4728", + "hash": "37eafa980604019b327b1a3552313fb7ae256697", + "datavalue": {"value": "105514", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$50C24ECC-C42C-4A58-8F34-6AF0AC6C4EFE", + "rank": "normal", + "references": [{ + "hash": "d4bd87b862b12d99d26e86472d44f26858dee639", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "f30cbd35620c4ea6d0633aaf0210a8916130469b", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 8447, "id": "Q8447"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P3219": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3219", + "hash": "dedb8825588940caff5a34d04a0e69af296f05dd", + "datavalue": {"value": "lion", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$2A5A2CA3-AB6E-4F68-927F-042D1BD22915", "rank": "normal" + }], + "P1343": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "5b0ef3d5413cd39d887fbe70d2d3b3f4a94ea9d8", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 1138524, "id": "Q1138524"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "f7bf629d348040dd1a59dc5a3199edb50279e8f5", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 19997008, + "id": "Q19997008" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$DFE4D4B0-0D84-41F2-B448-4A81AC982927", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "6bc15c6f82feca4f3b173c90209a416f99464cac", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 4086271, "id": "Q4086271"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "69ace59e966574e4ffb454d26940a58fb45ed7de", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 25295952, + "id": "Q25295952" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$b82b0461-4ff0-10ac-9825-d4b95fc7a85a", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "ecb04d74140f2ee856c06658b03ec90a21c2edf2", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 1970746, "id": "Q1970746"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "169607f1510535f3e1c5e7debce48d1903510f74", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 30202801, + "id": "Q30202801" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$bd49e319-477f-0cd2-a404-642156321081", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "88389772f86dcd7d415ddd029f601412e5cc894a", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 602358, "id": "Q602358"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "67f2e59eb3f6480bdbaa3954055dfbf8fd045bc4", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 24451091, + "id": "Q24451091" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$906ae22e-4c63-d325-c91e-dc3ee6b7504d", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "42346dfe9209b7359c1f5db829a368b38d407797", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 19180675, "id": "Q19180675"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "195bd04166c04364a657fcd18abd1a082dad3cb0", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 24758519, + "id": "Q24758519" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$92e7eeb1-4a72-9abf-4260-a96abc32bc42", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "7d6f86cef085693a10b0e0663a0960f58d0e15e2", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 4173137, "id": "Q4173137"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "75e5bdfbbf8498b195840749ef3a9bd309b796f7", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 25054587, + "id": "Q25054587" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$6c9c319a-4e71-540e-8866-a6017f0e6bae", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "75dd89e79770a3e631dbba27144940f8f1bc1773", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 1768721, "id": "Q1768721"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "a1b448ff5f8818a2254835e0816a03a785bac665", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 96599885, + "id": "Q96599885" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$A0FD93F4-A401-47A1-BC8E-F0D35A8E8BAD", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "4cfd4eb1fe49d401455df557a7d9b1154f22a725", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 3181656, "id": "Q3181656"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P1932": [{ + "snaktype": "value", + "property": "P1932", + "hash": "a3f6e8ce10c4527693415dbc99b5ea285b2f411c", + "datavalue": {"value": "Lion, The", "type": "string"}, + "datatype": "string" + }] + }, + "qualifiers-order": ["P1932"], + "id": "Q140$100f480e-4ad9-b340-8251-4e875d00315d", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "d5011798f92464584d8ccfc5f19f18f3659668bb", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 106727050, "id": "Q106727050"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ + "snaktype": "value", + "property": "P1810", + "hash": "7d78547303d5e9e014a7c8cef6072faee91088ce", + "datavalue": {"value": "Lions", "type": "string"}, + "datatype": "string" + }], + "P585": [{ + "snaktype": "value", + "property": "P585", + "hash": "ffb837135313cad3b2545c4b9ce5ee416deda3e2", + "datavalue": { + "value": { + "time": "+2021-05-07T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "qualifiers-order": ["P1810", "P585"], + "id": "Q140$A4D208BD-6A69-4561-B402-2E17AAE6E028", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "d12a9ecb0df8fce076df898533fea0339e5881bd", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 10886720, "id": "Q10886720"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "52ddab8de77b01303d508a1de615ca13060ec188", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 107513600, + "id": "Q107513600" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q140$07daf548-4c8d-fa7c-16f4-4c7062f7e48a", + "rank": "normal" + }], + "P4733": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4733", + "hash": "fc789f67f6d4d9b5879a8631eefe61f51a60f979", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 3177438, "id": "Q3177438"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q140$3773ba15-4723-261a-f9a8-544496938efa", + "rank": "normal", + "references": [{ + "hash": "649ae5511d5389d870d19e83543fa435de796536", + "snaks": { + "P143": [{ + "snaktype": "value", + "property": "P143", + "hash": "9931bb1a17358e94590f8fa0b9550de881616d97", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 784031, + "id": "Q784031" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P5019": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5019", + "hash": "44aac3d8a2bd240b4bc81741a0980dc48781181b", + "datavalue": {"value": "l\u00f6we", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$2be40b22-49f1-c9e7-1812-8e3fd69d662d", "rank": "normal" + }], + "P2924": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2924", + "hash": "710d75c07e28936461d03b20b2fc7455599301a1", + "datavalue": {"value": "2135124", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$6326B120-CE04-4F02-94CA-D7BBC2589A39", "rank": "normal" + }], + "P5055": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5055", + "hash": "c5264fc372b7e66566d54d73f86c8ab8c43fb033", + "datavalue": {"value": "10196306", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$F8D43B92-CC3A-4967-A28F-C3E6308946F6", + "rank": "normal", + "references": [{ + "hash": "7131076724beb97fed351cb7e7f6ac6d61dd05b9", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "1e3ad3cb9e0170e28b7c7c335fba55cafa6ef789", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 51885189, + "id": "Q51885189" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "2b1446fcfcd471ab6d36521b4ad2ac183ff8bc0d", + "datavalue": { + "value": { + "time": "+2018-06-07T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P5221": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5221", + "hash": "623ca9614dd0d8b8720bf35b4d57be91dcef5fe6", + "datavalue": {"value": "123566", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$472fe544-402d-2574-6b2e-98c5b01bb294", "rank": "normal" + }], + "P5698": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5698", + "hash": "e966694183143d709403fae7baabb5fdf98d219a", + "datavalue": {"value": "70719", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$EF3F712D-B0E5-4151-81E4-67804D6241E6", "rank": "normal" + }], + "P5397": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5397", + "hash": "49a827bc1853a3b5612b437dd61eb5c28dc0bab0", + "datavalue": {"value": "12799", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$DE37BF10-A59D-48F1-926A-7303EDEEDDD0", "rank": "normal" + }], + "P6033": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6033", + "hash": "766727ded3adbbfec0bed77affc89ea4e5214d65", + "datavalue": {"value": "panthera-leo", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$A27BADCC-0F72-45A5-814B-BDE62BD7A1B4", "rank": "normal" + }], + "P18": [{ + "mainsnak": { + "snaktype": "value", + "property": "P18", + "hash": "d3ceb5bb683335c91781e4d52906d2fb1cc0c35d", + "datavalue": {"value": "Lion waiting in Namibia.jpg", "type": "string"}, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P21": [{ + "snaktype": "value", + "property": "P21", + "hash": "0576a008261e5b2544d1ff3328c94bd529379536", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 44148, "id": "Q44148"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P2096": [{ + "snaktype": "value", + "property": "P2096", + "hash": "6923fafa02794ae7d0773e565de7dd49a2694b38", + "datavalue": { + "value": {"text": "Lle\u00f3", "language": "ca"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, { + "snaktype": "value", + "property": "P2096", + "hash": "563784f05211416fda8662a0773f52165ccf6c2a", + "datavalue": { + "value": {"text": "Machu de lle\u00f3n en Namibia", "language": "ast"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, { + "snaktype": "value", + "property": "P2096", + "hash": "52722803d98964d77b79d3ed62bd24b4f25e6993", + "datavalue": { + "value": {"text": "\u043b\u044a\u0432", "language": "bg"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }] + }, + "qualifiers-order": ["P21", "P2096"], + "id": "q140$5903FDF3-DBBD-4527-A738-450EAEAA45CB", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P18", + "hash": "6907d4c168377a18d6a5eb390ab32a7da42d8218", + "datavalue": {"value": "Okonjima Lioness.jpg", "type": "string"}, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P21": [{ + "snaktype": "value", + "property": "P21", + "hash": "a274865baccd3ff04c28d5ffdcc12e0079f5a201", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 43445, "id": "Q43445"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P2096": [{ + "snaktype": "value", + "property": "P2096", + "hash": "a9d1363e8fc83ba822c45a81de59fe5b8eb434cf", + "datavalue": { + "value": { + "text": "\u043b\u044a\u0432\u0438\u0446\u0430", + "language": "bg" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, { + "snaktype": "value", + "property": "P2096", + "hash": "b36ab7371664b7b62ee7be65db4e248074a5330c", + "datavalue": { + "value": {"text": "Lleona n'Okonjima Lodge, Namibia", "language": "ast"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, { + "snaktype": "value", + "property": "P2096", + "hash": "31c78a574eabc0426d7984aa4988752e35b71f0c", + "datavalue": {"value": {"text": "lwica", "language": "pl"}, "type": "monolingualtext"}, + "datatype": "monolingualtext" + }] + }, + "qualifiers-order": ["P21", "P2096"], + "id": "Q140$4da15225-f7dc-4942-a685-0669e5d3af14", + "rank": "normal" + }], + "P6573": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6573", + "hash": "c27b457b12eeecb053d60af6ecf9b0baa133bef5", + "datavalue": {"value": "L\u00f6we", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$45B1C3EB-E335-4245-A193-8C48B4953E51", "rank": "normal" + }], + "P443": [{ + "mainsnak": { + "snaktype": "value", + "property": "P443", + "hash": "8a9afb9293804f976c415060900bf9afbc2cfdff", + "datavalue": {"value": "LL-Q188 (deu)-Sebastian Wallroth-L\u00f6we.wav", "type": "string"}, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P407": [{ + "snaktype": "value", + "property": "P407", + "hash": "46bfd327b830f66f7061ea92d1be430c135fa91f", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 188, "id": "Q188"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P407"], + "id": "Q140$5EC64299-429F-45E8-B18F-19325401189C", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P443", + "hash": "7d058dfd1e8a41f026974faec3dc0588e29c6854", + "datavalue": {"value": "LL-Q150 (fra)-Ash Crow-lion.wav", "type": "string"}, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P407": [{ + "snaktype": "value", + "property": "P407", + "hash": "d197d0a5efa4b4c23a302a829dd3ef43684fe002", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 150, "id": "Q150"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P407"], + "id": "Q140$A4575261-6577-4EF6-A0C9-DA5FA523D1C2", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P443", + "hash": "79b9f51c9b4eec305813d5bb697b403d798cf1c5", + "datavalue": { + "value": "LL-Q33965 (sat)-Joy sagar Murmu-\u1c60\u1c69\u1c5e.wav", + "type": "string" + }, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P407": [{ + "snaktype": "value", + "property": "P407", + "hash": "58ae6998321952889f733126c11c582eeef20e72", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 33965, "id": "Q33965"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P407"], + "id": "Q140$7eedc8fa-4d1c-7ee9-3c67-0c89ef464d9f", + "rank": "normal", + "references": [{ + "hash": "d0b5c88b6f49dda9160c706291a9b8645825d99c", + "snaks": { + "P854": [{ + "snaktype": "value", + "property": "P854", + "hash": "38c1012cea9eb73cf1bd11eba0c2f745d2463340", + "datavalue": {"value": "https://lingualibre.org/wiki/Q403065", "type": "string"}, + "datatype": "url" + }] + }, + "snaks-order": ["P854"] + }] + }], + "P1296": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1296", + "hash": "c1f872d4cd22219a7315c0198a83c1918ded97ee", + "datavalue": {"value": "0120024", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$6C51384B-2EBF-4E6B-9201-A44F0A145C04", "rank": "normal" + }], + "P486": [{ + "mainsnak": { + "snaktype": "value", + "property": "P486", + "hash": "b7003b0fb28287301200b6b3871a5437d877913b", + "datavalue": {"value": "D008045", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$B2F98DD2-B679-43DD-B731-FA33FB1EE4B9", "rank": "normal" + }], + "P989": [{ + "mainsnak": { + "snaktype": "value", + "property": "P989", + "hash": "132884b2a696a8b56c8b1460e126f745e2fa6d01", + "datavalue": {"value": "Ru-Lion (intro).ogg", "type": "string"}, + "datatype": "commonsMedia" + }, + "type": "statement", + "qualifiers": { + "P407": [{ + "snaktype": "value", + "property": "P407", + "hash": "d291ddb7cd77c94a7bd709a8395934147e0864fc", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 7737, "id": "Q7737"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P407"], + "id": "Q140$857D8831-673B-427E-A182-6A9FFA980424", + "rank": "normal" + }], + "P51": [{ + "mainsnak": { + "snaktype": "value", + "property": "P51", + "hash": "73b0e8c8458ebc27374fd08d8ef5241f2f28e3e9", + "datavalue": {"value": "Lion raring-sound1TamilNadu178.ogg", "type": "string"}, + "datatype": "commonsMedia" + }, "type": "statement", "id": "Q140$1c254aff-48b1-d3c5-930c-b360ce6fe043", "rank": "normal" + }], + "P4212": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4212", + "hash": "e006ce3295d617a4818dc758c28f444446538019", + "datavalue": {"value": "pcrt5TAeZsO7W4", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$AD6CD534-1FD2-4AC7-9CF8-9D2B4C46927C", "rank": "normal" + }], + "P2067": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2067", + "hash": "97a863433c30b47a6175abb95941d185397ea14a", + "datavalue": { + "value": {"amount": "+1.65", "unit": "http://www.wikidata.org/entity/Q11570"}, + "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "qualifiers": { + "P642": [{ + "snaktype": "value", + "property": "P642", + "hash": "f5e24bc6ec443d6cb3678e4561bc298090b54f60", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 4128476, "id": "Q4128476"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P642"], + "id": "Q140$198da244-7e66-4258-9434-537e9ce0ffab", + "rank": "normal", + "references": [{ + "hash": "94a79329d5eac70f7ddb005e0d1dc78c53e77797", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4a7fef7ea264a7c71765ce60e3d42f4c043c9646", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45106562, + "id": "Q45106562" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2067", + "hash": "ba9933059ce368e3afde1e96d78b1217172c954e", + "datavalue": { + "value": {"amount": "+188", "unit": "http://www.wikidata.org/entity/Q11570"}, + "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "qualifiers": { + "P642": [{ + "snaktype": "value", + "property": "P642", + "hash": "b388540fc86300a506b3a753ec58dec445525ffa", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 78101716, + "id": "Q78101716" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P21": [{ + "snaktype": "value", + "property": "P21", + "hash": "0576a008261e5b2544d1ff3328c94bd529379536", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 44148, "id": "Q44148"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P642", "P21"], + "id": "Q140$a3092626-4295-efb8-bbb6-eed913d02fc7", + "rank": "normal", + "references": [{ + "hash": "94a79329d5eac70f7ddb005e0d1dc78c53e77797", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4a7fef7ea264a7c71765ce60e3d42f4c043c9646", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45106562, + "id": "Q45106562" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2067", + "hash": "6951281811b2a8a3a78044e2003d6c162d5ba1a3", + "datavalue": { + "value": {"amount": "+126", "unit": "http://www.wikidata.org/entity/Q11570"}, + "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "qualifiers": { + "P642": [{ + "snaktype": "value", + "property": "P642", + "hash": "b388540fc86300a506b3a753ec58dec445525ffa", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 78101716, + "id": "Q78101716" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P21": [{ + "snaktype": "value", + "property": "P21", + "hash": "a274865baccd3ff04c28d5ffdcc12e0079f5a201", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 43445, "id": "Q43445"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P642", "P21"], + "id": "Q140$20d80fe2-4796-23d1-42c2-c103546aa874", + "rank": "normal", + "references": [{ + "hash": "94a79329d5eac70f7ddb005e0d1dc78c53e77797", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4a7fef7ea264a7c71765ce60e3d42f4c043c9646", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45106562, + "id": "Q45106562" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }], + "P7725": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7725", + "hash": "e9338e052dfaa9267c2357bec2e167ca625af667", + "datavalue": { + "value": { + "amount": "+2.5", + "unit": "1", + "upperBound": "+4.0", + "lowerBound": "+1.0" + }, "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "id": "Q140$f1f04a23-0d34-484a-9419-78d12958170c", + "rank": "normal", + "references": [{ + "hash": "94a79329d5eac70f7ddb005e0d1dc78c53e77797", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4a7fef7ea264a7c71765ce60e3d42f4c043c9646", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45106562, + "id": "Q45106562" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }], + "P4214": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4214", + "hash": "5a112dbdaed17b1ee3fe7a63b1f978e5fd41008a", + "datavalue": { + "value": {"amount": "+27", "unit": "http://www.wikidata.org/entity/Q577"}, + "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "id": "Q140$ec1ccab2-f506-4c81-9179-4625bbbbbe27", + "rank": "normal", + "references": [{ + "hash": "a8ccf5105b0e2623ae145dd8a9b927c9bd957ddf", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "5b45c23ddb076fe9c5accfe4a4bbd1c24c4c87cb", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 83566668, + "id": "Q83566668" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }], + "P7862": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7862", + "hash": "6e74ddb544498b93407179cc9a7f9b8610762ff5", + "datavalue": { + "value": {"amount": "+8", "unit": "http://www.wikidata.org/entity/Q5151"}, + "type": "quantity" + }, + "datatype": "quantity" + }, + "type": "statement", + "id": "Q140$17b64a1e-4a13-9e2a-f8a2-a9317890aa53", + "rank": "normal", + "references": [{ + "hash": "94a79329d5eac70f7ddb005e0d1dc78c53e77797", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4a7fef7ea264a7c71765ce60e3d42f4c043c9646", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 45106562, + "id": "Q45106562" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }], + "P7818": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7818", + "hash": "5c7bac858cf66d079e6c13c88f3f001eb446cdce", + "datavalue": {"value": "Lion", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$C2D3546E-C42A-404A-A288-580F9C705E12", "rank": "normal" + }], + "P7829": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7829", + "hash": "17fbb02db65a7e80691f58be750382d61148406e", + "datavalue": {"value": "Lion", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$74998F51-E783-40CB-A56A-3189647AB3D4", "rank": "normal" + }], + "P7827": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7827", + "hash": "f85db9fe2c187554aefc51e5529d75e0c5af4767", + "datavalue": {"value": "Le\u00f3n", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$5DA64E1B-F1F1-4254-8629-985DFE8672A2", "rank": "normal" + }], + "P7822": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7822", + "hash": "3cd23fddc416227c2ba85d91aa03dc80a8e95836", + "datavalue": {"value": "Leone", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$DF657EF2-67A8-4272-871D-E95B3719A8B6", "rank": "normal" + }], + "P6105": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6105", + "hash": "8bbda0afe53fc428d3a0d9528c97d2145ee41dce", + "datavalue": {"value": "79432", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$2AE92335-1BC6-4B92-BAF3-9AB41608E638", "rank": "normal" + }], + "P6864": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6864", + "hash": "6f87ce0800057dbe88f27748b3077938973eb5c8", + "datavalue": {"value": "85426", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$9089C4B9-59A8-45A6-821B-05C1BB4C107C", "rank": "normal" + }], + "P2347": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2347", + "hash": "41e41b306cdd5e55007ac02da022d9f4ce230b03", + "datavalue": {"value": "7345", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$3CEB44D7-6C0B-4E66-87ED-37D723A1CCC8", + "rank": "normal", + "references": [{ + "hash": "f9bf1a1f034ddd51bd9928ac535e0f57d748e2cf", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "7133f11674741f52cadaae6029068fad9cbb52e3", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 89345680, + "id": "Q89345680" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }], + "P7033": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7033", + "hash": "e31b2e07ae0ce3d3a087d3c818c7bf29c7b04b72", + "datavalue": {"value": "scot/9244", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$F8148EB5-7934-4491-9B40-3378B7D292A6", "rank": "normal" + }], + "P8408": [{ + "mainsnak": { + "snaktype": "value", + "property": "P8408", + "hash": "51c04ed4f03488e8f428256ee41eb20eabe3ff38", + "datavalue": {"value": "Lion", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q140$2855E519-BCD1-4AB3-B3E9-BB53C5CB2E22", + "rank": "normal", + "references": [{ + "hash": "9a681f9dd95c90224547c404e11295f4f7dcf54e", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "9d5780dddffa8746637a9929a936ab6b0f601e24", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 64139102, + "id": "Q64139102" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "622a5a27fa5b25e7e7984974e9db494cf8460990", + "datavalue": { + "value": { + "time": "+2020-07-09T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P813"] + }] + }], + "P8519": [{ + "mainsnak": { + "snaktype": "value", + "property": "P8519", + "hash": "ad8031a668b5310633a04a9223714b3482d388b2", + "datavalue": {"value": "64570", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$ba4fa085-0e54-4226-a46b-770f7d5a995f", "rank": "normal" + }], + "P279": [{ + "mainsnak": { + "snaktype": "value", + "property": "P279", + "hash": "761c3439637add8f8fe3a351d6231333693835f6", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 6667323, "id": "Q6667323"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$cb41b7d3-46f0-e6d9-ced6-c2803e0c06b7", "rank": "normal" + }], + "P2670": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2670", + "hash": "6563f1e596253f1574515891267de01c5c1e688e", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 17611534, "id": "Q17611534"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$24984be4-4813-b6ad-ec83-1a37b7332c8a", "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2670", + "hash": "684855138cc32d11b487d0178c194f10c63f5f86", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 98520146, "id": "Q98520146"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$56e8c9b3-4892-e95d-f7c5-02b10ffe77e8", "rank": "normal" + }], + "P31": [{ + "mainsnak": { + "snaktype": "value", + "property": "P31", + "hash": "06629d890d7ab0ff85c403d8aadf57ce9809c01f", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 16521, "id": "Q16521"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "q140$8EE98E5B-4A9C-4BF5-B456-FB77E8EE4E69", "rank": "normal" + }], + "P2581": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2581", + "hash": "beca27cf7dd079eb27b7690e13a446d98448ae91", + "datavalue": {"value": "00049156n", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$90562c9a-4e9c-082d-d577-e0869524d9a1", "rank": "normal" + }], + "P7506": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7506", + "hash": "0562f57f9a54c65a2d45711f6dd5dd53ce37f6f8", + "datavalue": {"value": "1107856", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$00d453bf-4786-bde9-63f4-2db9f3610e88", "rank": "normal" + }], + "P5184": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5184", + "hash": "201d8de9b05ae85fe4f917c7e54c4a0218517888", + "datavalue": {"value": "b11s0701a", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$a2b832c9-4c5c-e402-e10d-cf2b08d35a56", "rank": "normal" + }], + "P6900": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6900", + "hash": "f7218c6984cd57078497a62ad595b089bdd97c49", + "datavalue": {"value": "\u30e9\u30a4\u30aa\u30f3", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$d15d143d-4826-4860-9aa3-6a350d6bc36f", "rank": "normal" + }], + "P3553": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3553", + "hash": "c82c6e1156e098d5ef396248c412371b90e0dc56", + "datavalue": {"value": "19563862", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$5edb95fa-4647-2e9a-9dbf-b68e1326eb79", "rank": "normal" + }], + "P5337": [{ + "mainsnak": { + "snaktype": "value", + "property": "P5337", + "hash": "793cfa52df3c5a6747c0cb5db959db944b04dbed", + "datavalue": { + "value": "CAAqIQgKIhtDQkFTRGdvSUwyMHZNRGsyYldJU0FtcGhLQUFQAQ", + "type": "string" + }, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$6137dbc1-4c6a-af60-00ee-2a32c63bfdfa", "rank": "normal" + }], + "P6200": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6200", + "hash": "0ce08dd38017230d41f530f6e97baf484f607235", + "datavalue": {"value": "ce2gz91pyv2t", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$01ed0f16-4a4a-213d-e457-0d4d5d670d49", "rank": "normal" + }], + "P4527": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4527", + "hash": "b07d29aa5112080a9294a7421e46ed0b73ac96c7", + "datavalue": {"value": "430792", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ + "snaktype": "value", + "property": "P1810", + "hash": "7d78547303d5e9e014a7c8cef6072faee91088ce", + "datavalue": {"value": "Lions", "type": "string"}, + "datatype": "string" + }] + }, + "qualifiers-order": ["P1810"], + "id": "Q140$C37C600C-4929-4203-A06E-8D797BA9B22A", + "rank": "normal" + }], + "P8989": [{ + "mainsnak": { + "snaktype": "value", + "property": "P8989", + "hash": "37087c42c921d83773f62d77e7360dc44504c122", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 104595349, "id": "Q104595349"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$1ece61f5-c008-4750-8b67-e15337f28e86", "rank": "normal" + }], + "P1552": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1552", + "hash": "1aa7db66bfad11e427c40ec79f3295de877967f1", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 120446, "id": "Q120446"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, "type": "statement", "id": "Q140$0bd4b0d9-49ff-b5b4-5c10-9500bc0ce19d", "rank": "normal" + }], + "P9198": [{ + "mainsnak": { + "snaktype": "value", + "property": "P9198", + "hash": "d3ab4ab9d788dc348d16e13fc77164ea71cef2ae", + "datavalue": {"value": "352", "type": "string"}, + "datatype": "external-id" + }, "type": "statement", "id": "Q140$C5D80C89-2862-490F-AA85-C260F32BE30B", "rank": "normal" + }], + "P9566": [{ + "mainsnak": { + "snaktype": "value", + "property": "P9566", + "hash": "053e0b7c15c8e5a61a71077c4cffa73b9d03005b", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 3255068, "id": "Q3255068"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q140$C7DAEA4E-B613-48A6-BFCD-88B551D1EF7A", + "rank": "normal", + "references": [{ + "hash": "0eedf63ac49c9b21aa7ff0a5e70b71aa6069a8ed", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "abfcfc68aa085f872d633958be83cba2ab96ce4a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1637051, + "id": "Q1637051" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }, { + "hash": "6db51e3163554f674ff270c93a2871c8d859a49e", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "abfcfc68aa085f872d633958be83cba2ab96ce4a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1637051, + "id": "Q1637051" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "ccd6ea06a2c9c0f54f5b1f45991a659225b5f4ef", + "datavalue": { + "value": { + "time": "+2013-01-01T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 9, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P577"] + }] + }], + "P508": [{ + "mainsnak": { + "snaktype": "value", + "property": "P508", + "hash": "e87c854abf600fb5de7b9b677d94a06e18851333", + "datavalue": {"value": "34922", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ + "snaktype": "value", + "property": "P1810", + "hash": "137692b9bcc178e7b7d232631cb607d45e2f543d", + "datavalue": {"value": "Leoni", "type": "string"}, + "datatype": "string" + }], + "P4970": [{ + "snaktype": "value", + "property": "P4970", + "hash": "271ec192bf14b9eb639120c60d5961ab8692444d", + "datavalue": {"value": "Panthera leo", "type": "string"}, + "datatype": "string" + }] + }, + "qualifiers-order": ["P1810", "P4970"], + "id": "Q140$52702f98-7843-4e0e-b646-76629e04e555", + "rank": "normal" + }], + "P950": [{ + "mainsnak": { + "snaktype": "value", + "property": "P950", + "hash": "f447323110fd744383394f91c2dfba2fc3187242", + "datavalue": {"value": "XX530613", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ + "snaktype": "value", + "property": "P1810", + "hash": "e2b2bda5457e0d5f7859e5c54996e1884062dfd1", + "datavalue": {"value": "Leones", "type": "string"}, + "datatype": "string" + }] + }, + "qualifiers-order": ["P1810"], + "id": "Q140$773f47cf-3133-4892-80eb-9d4dc5e97582", + "rank": "normal", + "references": [{ + "hash": "184729506e049d06de85686ede30c92b3e52451d", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "3b090a7bae73c288393b2c8b9846cc7ed9a58f91", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 16583225, + "id": "Q16583225" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P854": [{ + "snaktype": "value", + "property": "P854", + "hash": "b16c3ffac23bb97abe5d0c4d6ccffe4d010ab71a", + "datavalue": { + "value": "https://thes.bncf.firenze.sbn.it/termine.php?id=34922", + "type": "string" + }, + "datatype": "url" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "7721e97431215c374db84a9df785dc964a16bd17", + "datavalue": { + "value": { + "time": "+2021-06-15T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P854", "P813"] + }] + }], + "P7603": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7603", + "hash": "c86436e278d690f057cfecc86babf982948015f3", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 2851528, "id": "Q2851528"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P17": [{ + "snaktype": "value", + "property": "P17", + "hash": "18fb076bdc1c07e578546d1670ba193b768531ac", + "datavalue": { + "value": {"entity-type": "item", "numeric-id": 668, "id": "Q668"}, + "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P17"], + "id": "Q140$64262d09-4a19-3945-8a09-c2195b7614a7", + "rank": "normal" + }], + "P6800": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6800", + "hash": "1da99908e2ffdf6de901a1b8a2dbab0c62886565", + "datavalue": {"value": "http://www.ensembl.org/Panthera_leo", "type": "string"}, + "datatype": "url" + }, + "type": "statement", + "id": "Q140$87DC0D37-FC9E-4FFE-B92D-1A3A7C019A1D", + "rank": "normal", + "references": [{ + "hash": "53eb51e25c6356d2d4673dc249ea837dd14feca0", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "4ec639fccc9ddb8e079f7d27ca43220e3c512c20", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 1344256, + "id": "Q1344256" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P248"] + }] + }] + }, + "sitelinks": { + "abwiki": { + "site": "abwiki", + "title": "\u0410\u043b\u044b\u043c", + "badges": [], + "url": "https://ab.wikipedia.org/wiki/%D0%90%D0%BB%D1%8B%D0%BC" + }, + "adywiki": { + "site": "adywiki", + "title": "\u0410\u0441\u043b\u044a\u0430\u043d", + "badges": [], + "url": "https://ady.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D1%8A%D0%B0%D0%BD" + }, + "afwiki": { + "site": "afwiki", + "title": "Leeu", + "badges": ["Q17437796"], + "url": "https://af.wikipedia.org/wiki/Leeu" + }, + "alswiki": { + "site": "alswiki", + "title": "L\u00f6we", + "badges": [], + "url": "https://als.wikipedia.org/wiki/L%C3%B6we" + }, + "altwiki": { + "site": "altwiki", + "title": "\u0410\u0440\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://alt.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D0%B0%D0%BD" + }, + "amwiki": { + "site": "amwiki", + "title": "\u12a0\u1295\u1260\u1233", + "badges": [], + "url": "https://am.wikipedia.org/wiki/%E1%8A%A0%E1%8A%95%E1%89%A0%E1%88%B3" + }, + "angwiki": { + "site": "angwiki", + "title": "L\u0113o", + "badges": [], + "url": "https://ang.wikipedia.org/wiki/L%C4%93o" + }, + "anwiki": { + "site": "anwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://an.wikipedia.org/wiki/Panthera_leo" + }, + "arcwiki": { + "site": "arcwiki", + "title": "\u0710\u072a\u071d\u0710", + "badges": [], + "url": "https://arc.wikipedia.org/wiki/%DC%90%DC%AA%DC%9D%DC%90" + }, + "arwiki": { + "site": "arwiki", + "title": "\u0623\u0633\u062f", + "badges": ["Q17437796"], + "url": "https://ar.wikipedia.org/wiki/%D8%A3%D8%B3%D8%AF" + }, + "arywiki": { + "site": "arywiki", + "title": "\u0633\u0628\u0639", + "badges": [], + "url": "https://ary.wikipedia.org/wiki/%D8%B3%D8%A8%D8%B9" + }, + "arzwiki": { + "site": "arzwiki", + "title": "\u0633\u0628\u0639", + "badges": [], + "url": "https://arz.wikipedia.org/wiki/%D8%B3%D8%A8%D8%B9" + }, + "astwiki": { + "site": "astwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://ast.wikipedia.org/wiki/Panthera_leo" + }, + "aswiki": { + "site": "aswiki", + "title": "\u09b8\u09bf\u0982\u09b9", + "badges": [], + "url": "https://as.wikipedia.org/wiki/%E0%A6%B8%E0%A6%BF%E0%A6%82%E0%A6%B9" + }, + "avkwiki": { + "site": "avkwiki", + "title": "Krapol (Panthera leo)", + "badges": [], + "url": "https://avk.wikipedia.org/wiki/Krapol_(Panthera_leo)" + }, + "avwiki": { + "site": "avwiki", + "title": "\u0413\u044a\u0430\u043b\u0431\u0430\u0446\u04c0", + "badges": [], + "url": "https://av.wikipedia.org/wiki/%D0%93%D1%8A%D0%B0%D0%BB%D0%B1%D0%B0%D1%86%D3%80" + }, + "azbwiki": { + "site": "azbwiki", + "title": "\u0622\u0633\u0644\u0627\u0646", + "badges": [], + "url": "https://azb.wikipedia.org/wiki/%D8%A2%D8%B3%D9%84%D8%A7%D9%86" + }, + "azwiki": { + "site": "azwiki", + "title": "\u015eir", + "badges": [], + "url": "https://az.wikipedia.org/wiki/%C5%9Eir" + }, + "bat_smgwiki": { + "site": "bat_smgwiki", + "title": "Li\u016bts", + "badges": [], + "url": "https://bat-smg.wikipedia.org/wiki/Li%C5%ABts" + }, + "bawiki": { + "site": "bawiki", + "title": "\u0410\u0440\u044b\u04ab\u043b\u0430\u043d", + "badges": [], + "url": "https://ba.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D2%AB%D0%BB%D0%B0%D0%BD" + }, + "bclwiki": { + "site": "bclwiki", + "title": "Leon", + "badges": [], + "url": "https://bcl.wikipedia.org/wiki/Leon" + }, + "be_x_oldwiki": { + "site": "be_x_oldwiki", + "title": "\u041b\u0435\u045e", + "badges": [], + "url": "https://be-tarask.wikipedia.org/wiki/%D0%9B%D0%B5%D1%9E" + }, + "bewiki": { + "site": "bewiki", + "title": "\u041b\u0435\u045e", + "badges": [], + "url": "https://be.wikipedia.org/wiki/%D0%9B%D0%B5%D1%9E" + }, + "bgwiki": { + "site": "bgwiki", + "title": "\u041b\u044a\u0432", + "badges": [], + "url": "https://bg.wikipedia.org/wiki/%D0%9B%D1%8A%D0%B2" + }, + "bhwiki": { + "site": "bhwiki", + "title": "\u0938\u093f\u0902\u0939", + "badges": [], + "url": "https://bh.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9" + }, + "bmwiki": { + "site": "bmwiki", + "title": "Waraba", + "badges": [], + "url": "https://bm.wikipedia.org/wiki/Waraba" + }, + "bnwiki": { + "site": "bnwiki", + "title": "\u09b8\u09bf\u0982\u09b9", + "badges": [], + "url": "https://bn.wikipedia.org/wiki/%E0%A6%B8%E0%A6%BF%E0%A6%82%E0%A6%B9" + }, + "bowiki": { + "site": "bowiki", + "title": "\u0f66\u0f7a\u0f44\u0f0b\u0f42\u0f7a\u0f0d", + "badges": [], + "url": "https://bo.wikipedia.org/wiki/%E0%BD%A6%E0%BD%BA%E0%BD%84%E0%BC%8B%E0%BD%82%E0%BD%BA%E0%BC%8D" + }, + "bpywiki": { + "site": "bpywiki", + "title": "\u09a8\u0982\u09b8\u09be", + "badges": [], + "url": "https://bpy.wikipedia.org/wiki/%E0%A6%A8%E0%A6%82%E0%A6%B8%E0%A6%BE" + }, + "brwiki": { + "site": "brwiki", + "title": "Leon (loen)", + "badges": [], + "url": "https://br.wikipedia.org/wiki/Leon_(loen)" + }, + "bswiki": { + "site": "bswiki", + "title": "Lav", + "badges": [], + "url": "https://bs.wikipedia.org/wiki/Lav" + }, + "bswikiquote": { + "site": "bswikiquote", + "title": "Lav", + "badges": [], + "url": "https://bs.wikiquote.org/wiki/Lav" + }, + "bxrwiki": { + "site": "bxrwiki", + "title": "\u0410\u0440\u0441\u0430\u043b\u0430\u043d", + "badges": [], + "url": "https://bxr.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%B0%D0%BB%D0%B0%D0%BD" + }, + "cawiki": { + "site": "cawiki", + "title": "Lle\u00f3", + "badges": ["Q17437796"], + "url": "https://ca.wikipedia.org/wiki/Lle%C3%B3" + }, + "cawikiquote": { + "site": "cawikiquote", + "title": "Lle\u00f3", + "badges": [], + "url": "https://ca.wikiquote.org/wiki/Lle%C3%B3" + }, + "cdowiki": { + "site": "cdowiki", + "title": "S\u0103i (m\u00e0-ku\u014f d\u00f4ng-\u016dk)", + "badges": [], + "url": "https://cdo.wikipedia.org/wiki/S%C4%83i_(m%C3%A0-ku%C5%8F_d%C3%B4ng-%C5%ADk)" + }, + "cebwiki": { + "site": "cebwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://ceb.wikipedia.org/wiki/Panthera_leo" + }, + "cewiki": { + "site": "cewiki", + "title": "\u041b\u043e\u043c", + "badges": [], + "url": "https://ce.wikipedia.org/wiki/%D0%9B%D0%BE%D0%BC" + }, + "chrwiki": { + "site": "chrwiki", + "title": "\u13e2\u13d3\u13e5 \u13a4\u13c3\u13d5\u13be", + "badges": [], + "url": "https://chr.wikipedia.org/wiki/%E1%8F%A2%E1%8F%93%E1%8F%A5_%E1%8E%A4%E1%8F%83%E1%8F%95%E1%8E%BE" + }, + "chywiki": { + "site": "chywiki", + "title": "P\u00e9hpe'\u00e9nan\u00f3se'hame", + "badges": [], + "url": "https://chy.wikipedia.org/wiki/P%C3%A9hpe%27%C3%A9nan%C3%B3se%27hame" + }, + "ckbwiki": { + "site": "ckbwiki", + "title": "\u0634\u06ce\u0631", + "badges": [], + "url": "https://ckb.wikipedia.org/wiki/%D8%B4%DB%8E%D8%B1" + }, + "commonswiki": { + "site": "commonswiki", + "title": "Panthera leo", + "badges": [], + "url": "https://commons.wikimedia.org/wiki/Panthera_leo" + }, + "cowiki": { + "site": "cowiki", + "title": "Lionu", + "badges": [], + "url": "https://co.wikipedia.org/wiki/Lionu" + }, + "csbwiki": { + "site": "csbwiki", + "title": "Lew", + "badges": [], + "url": "https://csb.wikipedia.org/wiki/Lew" + }, + "cswiki": { + "site": "cswiki", + "title": "Lev", + "badges": [], + "url": "https://cs.wikipedia.org/wiki/Lev" + }, + "cswikiquote": { + "site": "cswikiquote", + "title": "Lev", + "badges": [], + "url": "https://cs.wikiquote.org/wiki/Lev" + }, + "cuwiki": { + "site": "cuwiki", + "title": "\u041b\u044c\u0432\u044a", + "badges": [], + "url": "https://cu.wikipedia.org/wiki/%D0%9B%D1%8C%D0%B2%D1%8A" + }, + "cvwiki": { + "site": "cvwiki", + "title": "\u0410\u0440\u0103\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://cv.wikipedia.org/wiki/%D0%90%D1%80%C4%83%D1%81%D0%BB%D0%B0%D0%BD" + }, + "cywiki": { + "site": "cywiki", + "title": "Llew", + "badges": [], + "url": "https://cy.wikipedia.org/wiki/Llew" + }, + "dagwiki": { + "site": "dagwiki", + "title": "Gbu\u0263inli", + "badges": [], + "url": "https://dag.wikipedia.org/wiki/Gbu%C9%A3inli" + }, + "dawiki": { + "site": "dawiki", + "title": "L\u00f8ve", + "badges": ["Q17559452"], + "url": "https://da.wikipedia.org/wiki/L%C3%B8ve" + }, + "dewiki": { + "site": "dewiki", + "title": "L\u00f6we", + "badges": ["Q17437796"], + "url": "https://de.wikipedia.org/wiki/L%C3%B6we" + }, + "dewikiquote": { + "site": "dewikiquote", + "title": "L\u00f6we", + "badges": [], + "url": "https://de.wikiquote.org/wiki/L%C3%B6we" + }, + "dinwiki": { + "site": "dinwiki", + "title": "K\u00f6r", + "badges": [], + "url": "https://din.wikipedia.org/wiki/K%C3%B6r" + }, + "diqwiki": { + "site": "diqwiki", + "title": "\u015e\u00ear", + "badges": [], + "url": "https://diq.wikipedia.org/wiki/%C5%9E%C3%AAr" + }, + "dsbwiki": { + "site": "dsbwiki", + "title": "Law", + "badges": [], + "url": "https://dsb.wikipedia.org/wiki/Law" + }, + "eewiki": { + "site": "eewiki", + "title": "Dzata", + "badges": [], + "url": "https://ee.wikipedia.org/wiki/Dzata" + }, + "elwiki": { + "site": "elwiki", + "title": "\u039b\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9", + "badges": [], + "url": "https://el.wikipedia.org/wiki/%CE%9B%CE%B9%CE%BF%CE%BD%CF%84%CE%AC%CF%81%CE%B9" + }, + "enwiki": { + "site": "enwiki", + "title": "Lion", + "badges": ["Q17437796"], + "url": "https://en.wikipedia.org/wiki/Lion" + }, + "enwikiquote": { + "site": "enwikiquote", + "title": "Lions", + "badges": [], + "url": "https://en.wikiquote.org/wiki/Lions" + }, + "eowiki": { + "site": "eowiki", + "title": "Leono", + "badges": [], + "url": "https://eo.wikipedia.org/wiki/Leono" + }, + "eowikiquote": { + "site": "eowikiquote", + "title": "Leono", + "badges": [], + "url": "https://eo.wikiquote.org/wiki/Leono" + }, + "eswiki": { + "site": "eswiki", + "title": "Panthera leo", + "badges": ["Q17437796"], + "url": "https://es.wikipedia.org/wiki/Panthera_leo" + }, + "eswikiquote": { + "site": "eswikiquote", + "title": "Le\u00f3n", + "badges": [], + "url": "https://es.wikiquote.org/wiki/Le%C3%B3n" + }, + "etwiki": { + "site": "etwiki", + "title": "L\u00f5vi", + "badges": [], + "url": "https://et.wikipedia.org/wiki/L%C3%B5vi" + }, + "etwikiquote": { + "site": "etwikiquote", + "title": "L\u00f5vi", + "badges": [], + "url": "https://et.wikiquote.org/wiki/L%C3%B5vi" + }, + "euwiki": { + "site": "euwiki", + "title": "Lehoi", + "badges": [], + "url": "https://eu.wikipedia.org/wiki/Lehoi" + }, + "extwiki": { + "site": "extwiki", + "title": "Li\u00f3n (animal)", + "badges": [], + "url": "https://ext.wikipedia.org/wiki/Li%C3%B3n_(animal)" + }, + "fawiki": { + "site": "fawiki", + "title": "\u0634\u06cc\u0631 (\u06af\u0631\u0628\u0647\u200c\u0633\u0627\u0646)", + "badges": ["Q17437796"], + "url": "https://fa.wikipedia.org/wiki/%D8%B4%DB%8C%D8%B1_(%DA%AF%D8%B1%D8%A8%D9%87%E2%80%8C%D8%B3%D8%A7%D9%86)" + }, + "fawikiquote": { + "site": "fawikiquote", + "title": "\u0634\u06cc\u0631", + "badges": [], + "url": "https://fa.wikiquote.org/wiki/%D8%B4%DB%8C%D8%B1" + }, + "fiu_vrowiki": { + "site": "fiu_vrowiki", + "title": "L\u00f5vi", + "badges": [], + "url": "https://fiu-vro.wikipedia.org/wiki/L%C3%B5vi" + }, + "fiwiki": { + "site": "fiwiki", + "title": "Leijona", + "badges": ["Q17437796"], + "url": "https://fi.wikipedia.org/wiki/Leijona" + }, + "fowiki": { + "site": "fowiki", + "title": "Leyva", + "badges": [], + "url": "https://fo.wikipedia.org/wiki/Leyva" + }, + "frrwiki": { + "site": "frrwiki", + "title": "L\u00f6\u00f6w", + "badges": [], + "url": "https://frr.wikipedia.org/wiki/L%C3%B6%C3%B6w" + }, + "frwiki": { + "site": "frwiki", + "title": "Lion", + "badges": ["Q17437796"], + "url": "https://fr.wikipedia.org/wiki/Lion" + }, + "frwikiquote": { + "site": "frwikiquote", + "title": "Lion", + "badges": [], + "url": "https://fr.wikiquote.org/wiki/Lion" + }, + "gagwiki": { + "site": "gagwiki", + "title": "Aslan", + "badges": [], + "url": "https://gag.wikipedia.org/wiki/Aslan" + }, + "gawiki": { + "site": "gawiki", + "title": "Leon", + "badges": [], + "url": "https://ga.wikipedia.org/wiki/Leon" + }, + "gdwiki": { + "site": "gdwiki", + "title": "Le\u00f2mhann", + "badges": [], + "url": "https://gd.wikipedia.org/wiki/Le%C3%B2mhann" + }, + "glwiki": { + "site": "glwiki", + "title": "Le\u00f3n", + "badges": [], + "url": "https://gl.wikipedia.org/wiki/Le%C3%B3n" + }, + "gnwiki": { + "site": "gnwiki", + "title": "Le\u00f5", + "badges": [], + "url": "https://gn.wikipedia.org/wiki/Le%C3%B5" + }, + "gotwiki": { + "site": "gotwiki", + "title": "\ud800\udf3b\ud800\udf39\ud800\udf45\ud800\udf30", + "badges": [], + "url": "https://got.wikipedia.org/wiki/%F0%90%8C%BB%F0%90%8C%B9%F0%90%8D%85%F0%90%8C%B0" + }, + "guwiki": { + "site": "guwiki", + "title": "\u0a8f\u0ab6\u0abf\u0aaf\u0abe\u0a87 \u0ab8\u0abf\u0a82\u0ab9", + "badges": [], + "url": "https://gu.wikipedia.org/wiki/%E0%AA%8F%E0%AA%B6%E0%AA%BF%E0%AA%AF%E0%AA%BE%E0%AA%87_%E0%AA%B8%E0%AA%BF%E0%AA%82%E0%AA%B9" + }, + "hakwiki": { + "site": "hakwiki", + "title": "S\u1e73\u0302-\u00e9", + "badges": [], + "url": "https://hak.wikipedia.org/wiki/S%E1%B9%B3%CC%82-%C3%A9" + }, + "hawiki": { + "site": "hawiki", + "title": "Zaki", + "badges": [], + "url": "https://ha.wikipedia.org/wiki/Zaki" + }, + "hawwiki": { + "site": "hawwiki", + "title": "Liona", + "badges": [], + "url": "https://haw.wikipedia.org/wiki/Liona" + }, + "hewiki": { + "site": "hewiki", + "title": "\u05d0\u05e8\u05d9\u05d4", + "badges": [], + "url": "https://he.wikipedia.org/wiki/%D7%90%D7%A8%D7%99%D7%94" + }, + "hewikiquote": { + "site": "hewikiquote", + "title": "\u05d0\u05e8\u05d9\u05d4", + "badges": [], + "url": "https://he.wikiquote.org/wiki/%D7%90%D7%A8%D7%99%D7%94" + }, + "hifwiki": { + "site": "hifwiki", + "title": "Ser", + "badges": [], + "url": "https://hif.wikipedia.org/wiki/Ser" + }, + "hiwiki": { + "site": "hiwiki", + "title": "\u0938\u093f\u0902\u0939 (\u092a\u0936\u0941)", + "badges": [], + "url": "https://hi.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9_(%E0%A4%AA%E0%A4%B6%E0%A5%81)" + }, + "hrwiki": { + "site": "hrwiki", + "title": "Lav", + "badges": [], + "url": "https://hr.wikipedia.org/wiki/Lav" + }, + "hrwikiquote": { + "site": "hrwikiquote", + "title": "Lav", + "badges": [], + "url": "https://hr.wikiquote.org/wiki/Lav" + }, + "hsbwiki": { + "site": "hsbwiki", + "title": "Law", + "badges": [], + "url": "https://hsb.wikipedia.org/wiki/Law" + }, + "htwiki": { + "site": "htwiki", + "title": "Lyon", + "badges": [], + "url": "https://ht.wikipedia.org/wiki/Lyon" + }, + "huwiki": { + "site": "huwiki", + "title": "Oroszl\u00e1n", + "badges": [], + "url": "https://hu.wikipedia.org/wiki/Oroszl%C3%A1n" + }, + "hywiki": { + "site": "hywiki", + "title": "\u0531\u057c\u0575\u0578\u0582\u056e", + "badges": [], + "url": "https://hy.wikipedia.org/wiki/%D4%B1%D5%BC%D5%B5%D5%B8%D6%82%D5%AE" + }, + "hywikiquote": { + "site": "hywikiquote", + "title": "\u0531\u057c\u0575\u0578\u0582\u056e", + "badges": [], + "url": "https://hy.wikiquote.org/wiki/%D4%B1%D5%BC%D5%B5%D5%B8%D6%82%D5%AE" + }, + "hywwiki": { + "site": "hywwiki", + "title": "\u0531\u057c\u056b\u0582\u056e", + "badges": [], + "url": "https://hyw.wikipedia.org/wiki/%D4%B1%D5%BC%D5%AB%D6%82%D5%AE" + }, + "iawiki": { + "site": "iawiki", + "title": "Leon", + "badges": [], + "url": "https://ia.wikipedia.org/wiki/Leon" + }, + "idwiki": { + "site": "idwiki", + "title": "Singa", + "badges": [], + "url": "https://id.wikipedia.org/wiki/Singa" + }, + "igwiki": { + "site": "igwiki", + "title": "Od\u00fam", + "badges": [], + "url": "https://ig.wikipedia.org/wiki/Od%C3%BAm" + }, + "ilowiki": { + "site": "ilowiki", + "title": "Leon", + "badges": [], + "url": "https://ilo.wikipedia.org/wiki/Leon" + }, + "inhwiki": { + "site": "inhwiki", + "title": "\u041b\u043e\u043c", + "badges": [], + "url": "https://inh.wikipedia.org/wiki/%D0%9B%D0%BE%D0%BC" + }, + "iowiki": { + "site": "iowiki", + "title": "Leono (mamifero)", + "badges": [], + "url": "https://io.wikipedia.org/wiki/Leono_(mamifero)" + }, + "iswiki": { + "site": "iswiki", + "title": "Lj\u00f3n", + "badges": [], + "url": "https://is.wikipedia.org/wiki/Lj%C3%B3n" + }, + "itwiki": { + "site": "itwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://it.wikipedia.org/wiki/Panthera_leo" + }, + "itwikiquote": { + "site": "itwikiquote", + "title": "Leone", + "badges": [], + "url": "https://it.wikiquote.org/wiki/Leone" + }, + "jawiki": { + "site": "jawiki", + "title": "\u30e9\u30a4\u30aa\u30f3", + "badges": [], + "url": "https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%82%AA%E3%83%B3" + }, + "jawikiquote": { + "site": "jawikiquote", + "title": "\u7345\u5b50", + "badges": [], + "url": "https://ja.wikiquote.org/wiki/%E7%8D%85%E5%AD%90" + }, + "jbowiki": { + "site": "jbowiki", + "title": "cinfo", + "badges": [], + "url": "https://jbo.wikipedia.org/wiki/cinfo" + }, + "jvwiki": { + "site": "jvwiki", + "title": "Singa", + "badges": [], + "url": "https://jv.wikipedia.org/wiki/Singa" + }, + "kabwiki": { + "site": "kabwiki", + "title": "Izem", + "badges": [], + "url": "https://kab.wikipedia.org/wiki/Izem" + }, + "kawiki": { + "site": "kawiki", + "title": "\u10da\u10dd\u10db\u10d8", + "badges": [], + "url": "https://ka.wikipedia.org/wiki/%E1%83%9A%E1%83%9D%E1%83%9B%E1%83%98" + }, + "kbdwiki": { + "site": "kbdwiki", + "title": "\u0425\u044c\u044d\u0449", + "badges": [], + "url": "https://kbd.wikipedia.org/wiki/%D0%A5%D1%8C%D1%8D%D1%89" + }, + "kbpwiki": { + "site": "kbpwiki", + "title": "T\u0254\u0254y\u028b\u028b", + "badges": [], + "url": "https://kbp.wikipedia.org/wiki/T%C9%94%C9%94y%CA%8B%CA%8B" + }, + "kgwiki": { + "site": "kgwiki", + "title": "Nkosi", + "badges": [], + "url": "https://kg.wikipedia.org/wiki/Nkosi" + }, + "kkwiki": { + "site": "kkwiki", + "title": "\u0410\u0440\u044b\u0441\u0442\u0430\u043d", + "badges": [], + "url": "https://kk.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D1%82%D0%B0%D0%BD" + }, + "knwiki": { + "site": "knwiki", + "title": "\u0cb8\u0cbf\u0c82\u0cb9", + "badges": [], + "url": "https://kn.wikipedia.org/wiki/%E0%B2%B8%E0%B2%BF%E0%B2%82%E0%B2%B9" + }, + "kowiki": { + "site": "kowiki", + "title": "\uc0ac\uc790", + "badges": [], + "url": "https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9E%90" + }, + "kowikiquote": { + "site": "kowikiquote", + "title": "\uc0ac\uc790", + "badges": [], + "url": "https://ko.wikiquote.org/wiki/%EC%82%AC%EC%9E%90" + }, + "kswiki": { + "site": "kswiki", + "title": "\u067e\u0627\u062f\u064e\u0631 \u0633\u0655\u06c1\u06c1", + "badges": [], + "url": "https://ks.wikipedia.org/wiki/%D9%BE%D8%A7%D8%AF%D9%8E%D8%B1_%D8%B3%D9%95%DB%81%DB%81" + }, + "kuwiki": { + "site": "kuwiki", + "title": "\u015e\u00ear", + "badges": [], + "url": "https://ku.wikipedia.org/wiki/%C5%9E%C3%AAr" + }, + "kwwiki": { + "site": "kwwiki", + "title": "Lew", + "badges": [], + "url": "https://kw.wikipedia.org/wiki/Lew" + }, + "kywiki": { + "site": "kywiki", + "title": "\u0410\u0440\u0441\u0442\u0430\u043d", + "badges": [], + "url": "https://ky.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D1%82%D0%B0%D0%BD" + }, + "lawiki": { + "site": "lawiki", + "title": "Leo", + "badges": [], + "url": "https://la.wikipedia.org/wiki/Leo" + }, + "lawikiquote": { + "site": "lawikiquote", + "title": "Leo", + "badges": [], + "url": "https://la.wikiquote.org/wiki/Leo" + }, + "lbewiki": { + "site": "lbewiki", + "title": "\u0410\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://lbe.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D0%B0%D0%BD" + }, + "lbwiki": { + "site": "lbwiki", + "title": "L\u00e9iw", + "badges": [], + "url": "https://lb.wikipedia.org/wiki/L%C3%A9iw" + }, + "lezwiki": { + "site": "lezwiki", + "title": "\u0410\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://lez.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D0%B0%D0%BD" + }, + "lfnwiki": { + "site": "lfnwiki", + "title": "Leon", + "badges": [], + "url": "https://lfn.wikipedia.org/wiki/Leon" + }, + "lijwiki": { + "site": "lijwiki", + "title": "Lion (bestia)", + "badges": [], + "url": "https://lij.wikipedia.org/wiki/Lion_(bestia)" + }, + "liwiki": { + "site": "liwiki", + "title": "Liew", + "badges": ["Q17437796"], + "url": "https://li.wikipedia.org/wiki/Liew" + }, + "lldwiki": { + "site": "lldwiki", + "title": "Lion", + "badges": [], + "url": "https://lld.wikipedia.org/wiki/Lion" + }, + "lmowiki": { + "site": "lmowiki", + "title": "Panthera leo", + "badges": [], + "url": "https://lmo.wikipedia.org/wiki/Panthera_leo" + }, + "lnwiki": { + "site": "lnwiki", + "title": "Nk\u0254\u0301si", + "badges": [], + "url": "https://ln.wikipedia.org/wiki/Nk%C9%94%CC%81si" + }, + "ltgwiki": { + "site": "ltgwiki", + "title": "\u013bovs", + "badges": [], + "url": "https://ltg.wikipedia.org/wiki/%C4%BBovs" + }, + "ltwiki": { + "site": "ltwiki", + "title": "Li\u016btas", + "badges": [], + "url": "https://lt.wikipedia.org/wiki/Li%C5%ABtas" + }, + "ltwikiquote": { + "site": "ltwikiquote", + "title": "Li\u016btas", + "badges": [], + "url": "https://lt.wikiquote.org/wiki/Li%C5%ABtas" + }, + "lvwiki": { + "site": "lvwiki", + "title": "Lauva", + "badges": ["Q17437796"], + "url": "https://lv.wikipedia.org/wiki/Lauva" + }, + "mdfwiki": { + "site": "mdfwiki", + "title": "\u041e\u0440\u043a\u0441\u043e\u0444\u0442\u0430", + "badges": ["Q17437796"], + "url": "https://mdf.wikipedia.org/wiki/%D0%9E%D1%80%D0%BA%D1%81%D0%BE%D1%84%D1%82%D0%B0" + }, + "mgwiki": { + "site": "mgwiki", + "title": "Liona", + "badges": [], + "url": "https://mg.wikipedia.org/wiki/Liona" + }, + "mhrwiki": { + "site": "mhrwiki", + "title": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://mhr.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD" + }, + "mkwiki": { + "site": "mkwiki", + "title": "\u041b\u0430\u0432", + "badges": [], + "url": "https://mk.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B2" + }, + "mlwiki": { + "site": "mlwiki", + "title": "\u0d38\u0d3f\u0d02\u0d39\u0d02", + "badges": [], + "url": "https://ml.wikipedia.org/wiki/%E0%B4%B8%E0%B4%BF%E0%B4%82%E0%B4%B9%E0%B4%82" + }, + "mniwiki": { + "site": "mniwiki", + "title": "\uabc5\uabe3\uabe1\uabc1\uabe5", + "badges": [], + "url": "https://mni.wikipedia.org/wiki/%EA%AF%85%EA%AF%A3%EA%AF%A1%EA%AF%81%EA%AF%A5" + }, + "mnwiki": { + "site": "mnwiki", + "title": "\u0410\u0440\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://mn.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D0%B0%D0%BD" + }, + "mrjwiki": { + "site": "mrjwiki", + "title": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://mrj.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD" + }, + "mrwiki": { + "site": "mrwiki", + "title": "\u0938\u093f\u0902\u0939", + "badges": [], + "url": "https://mr.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9" + }, + "mswiki": { + "site": "mswiki", + "title": "Singa", + "badges": ["Q17437796"], + "url": "https://ms.wikipedia.org/wiki/Singa" + }, + "mtwiki": { + "site": "mtwiki", + "title": "Iljun", + "badges": [], + "url": "https://mt.wikipedia.org/wiki/Iljun" + }, + "mywiki": { + "site": "mywiki", + "title": "\u1001\u103c\u1004\u103a\u1039\u101e\u1031\u1037", + "badges": [], + "url": "https://my.wikipedia.org/wiki/%E1%80%81%E1%80%BC%E1%80%84%E1%80%BA%E1%80%B9%E1%80%9E%E1%80%B1%E1%80%B7" + }, + "newiki": { + "site": "newiki", + "title": "\u0938\u093f\u0902\u0939", + "badges": [], + "url": "https://ne.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9" + }, + "newwiki": { + "site": "newwiki", + "title": "\u0938\u093f\u0902\u0939", + "badges": [], + "url": "https://new.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9" + }, + "nlwiki": { + "site": "nlwiki", + "title": "Leeuw (dier)", + "badges": [], + "url": "https://nl.wikipedia.org/wiki/Leeuw_(dier)" + }, + "nnwiki": { + "site": "nnwiki", + "title": "L\u00f8ve", + "badges": [], + "url": "https://nn.wikipedia.org/wiki/L%C3%B8ve" + }, + "nowiki": { + "site": "nowiki", + "title": "L\u00f8ve", + "badges": [], + "url": "https://no.wikipedia.org/wiki/L%C3%B8ve" + }, + "nrmwiki": { + "site": "nrmwiki", + "title": "Lion", + "badges": [], + "url": "https://nrm.wikipedia.org/wiki/Lion" + }, + "nsowiki": { + "site": "nsowiki", + "title": "Tau", + "badges": [], + "url": "https://nso.wikipedia.org/wiki/Tau" + }, + "nvwiki": { + "site": "nvwiki", + "title": "N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed", + "badges": [], + "url": "https://nv.wikipedia.org/wiki/N%C3%A1shd%C3%B3%C3%ADtsoh_bitsiij%C4%AF%CA%BC_dadit%C5%82%CA%BCoo%C3%ADg%C3%AD%C3%AD" + }, + "ocwiki": { + "site": "ocwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://oc.wikipedia.org/wiki/Panthera_leo" + }, + "orwiki": { + "site": "orwiki", + "title": "\u0b38\u0b3f\u0b02\u0b39", + "badges": [], + "url": "https://or.wikipedia.org/wiki/%E0%AC%B8%E0%AC%BF%E0%AC%82%E0%AC%B9" + }, + "oswiki": { + "site": "oswiki", + "title": "\u0426\u043e\u043c\u0430\u0445\u044a", + "badges": [], + "url": "https://os.wikipedia.org/wiki/%D0%A6%D0%BE%D0%BC%D0%B0%D1%85%D1%8A" + }, + "pamwiki": { + "site": "pamwiki", + "title": "Leon (animal)", + "badges": ["Q17437796"], + "url": "https://pam.wikipedia.org/wiki/Leon_(animal)" + }, + "pawiki": { + "site": "pawiki", + "title": "\u0a2c\u0a71\u0a2c\u0a30 \u0a38\u0a3c\u0a47\u0a30", + "badges": [], + "url": "https://pa.wikipedia.org/wiki/%E0%A8%AC%E0%A9%B1%E0%A8%AC%E0%A8%B0_%E0%A8%B8%E0%A8%BC%E0%A9%87%E0%A8%B0" + }, + "pcdwiki": { + "site": "pcdwiki", + "title": "Lion", + "badges": [], + "url": "https://pcd.wikipedia.org/wiki/Lion" + }, + "plwiki": { + "site": "plwiki", + "title": "Lew afryka\u0144ski", + "badges": ["Q17437796"], + "url": "https://pl.wikipedia.org/wiki/Lew_afryka%C5%84ski" + }, + "plwikiquote": { + "site": "plwikiquote", + "title": "Lew", + "badges": [], + "url": "https://pl.wikiquote.org/wiki/Lew" + }, + "pmswiki": { + "site": "pmswiki", + "title": "Lion", + "badges": [], + "url": "https://pms.wikipedia.org/wiki/Lion" + }, + "pnbwiki": { + "site": "pnbwiki", + "title": "\u0628\u0628\u0631 \u0634\u06cc\u0631", + "badges": [], + "url": "https://pnb.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%DB%8C%D8%B1" + }, + "pswiki": { + "site": "pswiki", + "title": "\u0632\u0645\u0631\u06cc", + "badges": [], + "url": "https://ps.wikipedia.org/wiki/%D8%B2%D9%85%D8%B1%DB%8C" + }, + "ptwiki": { + "site": "ptwiki", + "title": "Le\u00e3o", + "badges": [], + "url": "https://pt.wikipedia.org/wiki/Le%C3%A3o" + }, + "ptwikiquote": { + "site": "ptwikiquote", + "title": "Le\u00e3o", + "badges": [], + "url": "https://pt.wikiquote.org/wiki/Le%C3%A3o" + }, + "quwiki": { + "site": "quwiki", + "title": "Liyun", + "badges": [], + "url": "https://qu.wikipedia.org/wiki/Liyun" + }, + "rmwiki": { + "site": "rmwiki", + "title": "Liun", + "badges": [], + "url": "https://rm.wikipedia.org/wiki/Liun" + }, + "rnwiki": { + "site": "rnwiki", + "title": "Intare", + "badges": [], + "url": "https://rn.wikipedia.org/wiki/Intare" + }, + "rowiki": { + "site": "rowiki", + "title": "Leu", + "badges": [], + "url": "https://ro.wikipedia.org/wiki/Leu" + }, + "ruewiki": { + "site": "ruewiki", + "title": "\u041b\u0435\u0432", + "badges": [], + "url": "https://rue.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2" + }, + "ruwiki": { + "site": "ruwiki", + "title": "\u041b\u0435\u0432", + "badges": ["Q17437798"], + "url": "https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2" + }, + "ruwikinews": { + "site": "ruwikinews", + "title": "\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f:\u041b\u044c\u0432\u044b", + "badges": [], + "url": "https://ru.wikinews.org/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9B%D1%8C%D0%B2%D1%8B" + }, + "rwwiki": { + "site": "rwwiki", + "title": "Intare", + "badges": [], + "url": "https://rw.wikipedia.org/wiki/Intare" + }, + "sahwiki": { + "site": "sahwiki", + "title": "\u0425\u0430\u0445\u0430\u0439", + "badges": [], + "url": "https://sah.wikipedia.org/wiki/%D0%A5%D0%B0%D1%85%D0%B0%D0%B9" + }, + "satwiki": { + "site": "satwiki", + "title": "\u1c61\u1c5f\u1c74\u1c5f\u1c60\u1c69\u1c5e", + "badges": [], + "url": "https://sat.wikipedia.org/wiki/%E1%B1%A1%E1%B1%9F%E1%B1%B4%E1%B1%9F%E1%B1%A0%E1%B1%A9%E1%B1%9E" + }, + "sawiki": { + "site": "sawiki", + "title": "\u0938\u093f\u0902\u0939\u0903 \u092a\u0936\u0941\u0903", + "badges": [], + "url": "https://sa.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9%E0%A4%83_%E0%A4%AA%E0%A4%B6%E0%A5%81%E0%A4%83" + }, + "scnwiki": { + "site": "scnwiki", + "title": "Panthera leo", + "badges": [], + "url": "https://scn.wikipedia.org/wiki/Panthera_leo" + }, + "scowiki": { + "site": "scowiki", + "title": "Lion", + "badges": ["Q17437796"], + "url": "https://sco.wikipedia.org/wiki/Lion" + }, + "sdwiki": { + "site": "sdwiki", + "title": "\u0628\u0628\u0631 \u0634\u064a\u0646\u0647\u0646", + "badges": [], + "url": "https://sd.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%D9%8A%D9%86%D9%87%D9%86" + }, + "sewiki": { + "site": "sewiki", + "title": "Ledjon", + "badges": [], + "url": "https://se.wikipedia.org/wiki/Ledjon" + }, + "shiwiki": { + "site": "shiwiki", + "title": "Agrzam", + "badges": [], + "url": "https://shi.wikipedia.org/wiki/Agrzam" + }, + "shnwiki": { + "site": "shnwiki", + "title": "\u101e\u1062\u1004\u103a\u1087\u101e\u102e\u1088", + "badges": [], + "url": "https://shn.wikipedia.org/wiki/%E1%80%9E%E1%81%A2%E1%80%84%E1%80%BA%E1%82%87%E1%80%9E%E1%80%AE%E1%82%88" + }, + "shwiki": { + "site": "shwiki", + "title": "Lav", + "badges": [], + "url": "https://sh.wikipedia.org/wiki/Lav" + }, + "simplewiki": { + "site": "simplewiki", + "title": "Lion", + "badges": [], + "url": "https://simple.wikipedia.org/wiki/Lion" + }, + "siwiki": { + "site": "siwiki", + "title": "\u0dc3\u0dd2\u0d82\u0dc4\u0dba\u0dcf", + "badges": [], + "url": "https://si.wikipedia.org/wiki/%E0%B7%83%E0%B7%92%E0%B6%82%E0%B7%84%E0%B6%BA%E0%B7%8F" + }, + "skwiki": { + "site": "skwiki", + "title": "Lev p\u00fa\u0161\u0165ov\u00fd", + "badges": [], + "url": "https://sk.wikipedia.org/wiki/Lev_p%C3%BA%C5%A1%C5%A5ov%C3%BD" + }, + "skwikiquote": { + "site": "skwikiquote", + "title": "Lev", + "badges": [], + "url": "https://sk.wikiquote.org/wiki/Lev" + }, + "slwiki": { + "site": "slwiki", + "title": "Lev", + "badges": [], + "url": "https://sl.wikipedia.org/wiki/Lev" + }, + "smwiki": { + "site": "smwiki", + "title": "Leona", + "badges": [], + "url": "https://sm.wikipedia.org/wiki/Leona" + }, + "snwiki": { + "site": "snwiki", + "title": "Shumba", + "badges": [], + "url": "https://sn.wikipedia.org/wiki/Shumba" + }, + "sowiki": { + "site": "sowiki", + "title": "Libaax", + "badges": [], + "url": "https://so.wikipedia.org/wiki/Libaax" + }, + "specieswiki": { + "site": "specieswiki", + "title": "Panthera leo", + "badges": [], + "url": "https://species.wikimedia.org/wiki/Panthera_leo" + }, + "sqwiki": { + "site": "sqwiki", + "title": "Luani", + "badges": [], + "url": "https://sq.wikipedia.org/wiki/Luani" + }, + "srwiki": { + "site": "srwiki", + "title": "\u041b\u0430\u0432", + "badges": [], + "url": "https://sr.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B2" + }, + "sswiki": { + "site": "sswiki", + "title": "Libhubesi", + "badges": [], + "url": "https://ss.wikipedia.org/wiki/Libhubesi" + }, + "stqwiki": { + "site": "stqwiki", + "title": "Leeuwe", + "badges": [], + "url": "https://stq.wikipedia.org/wiki/Leeuwe" + }, + "stwiki": { + "site": "stwiki", + "title": "Tau", + "badges": [], + "url": "https://st.wikipedia.org/wiki/Tau" + }, + "suwiki": { + "site": "suwiki", + "title": "Singa", + "badges": [], + "url": "https://su.wikipedia.org/wiki/Singa" + }, + "svwiki": { + "site": "svwiki", + "title": "Lejon", + "badges": [], + "url": "https://sv.wikipedia.org/wiki/Lejon" + }, + "swwiki": { + "site": "swwiki", + "title": "Simba", + "badges": [], + "url": "https://sw.wikipedia.org/wiki/Simba" + }, + "szlwiki": { + "site": "szlwiki", + "title": "Lew", + "badges": [], + "url": "https://szl.wikipedia.org/wiki/Lew" + }, + "tawiki": { + "site": "tawiki", + "title": "\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd", + "badges": [], + "url": "https://ta.wikipedia.org/wiki/%E0%AE%9A%E0%AE%BF%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%AE%E0%AF%8D" + }, + "tcywiki": { + "site": "tcywiki", + "title": "\u0cb8\u0cbf\u0c82\u0cb9", + "badges": [], + "url": "https://tcy.wikipedia.org/wiki/%E0%B2%B8%E0%B2%BF%E0%B2%82%E0%B2%B9" + }, + "tewiki": { + "site": "tewiki", + "title": "\u0c38\u0c3f\u0c02\u0c39\u0c02", + "badges": [], + "url": "https://te.wikipedia.org/wiki/%E0%B0%B8%E0%B0%BF%E0%B0%82%E0%B0%B9%E0%B0%82" + }, + "tgwiki": { + "site": "tgwiki", + "title": "\u0428\u0435\u0440", + "badges": [], + "url": "https://tg.wikipedia.org/wiki/%D0%A8%D0%B5%D1%80" + }, + "thwiki": { + "site": "thwiki", + "title": "\u0e2a\u0e34\u0e07\u0e42\u0e15", + "badges": [], + "url": "https://th.wikipedia.org/wiki/%E0%B8%AA%E0%B8%B4%E0%B8%87%E0%B9%82%E0%B8%95" + }, + "tiwiki": { + "site": "tiwiki", + "title": "\u12a3\u1295\u1260\u1233", + "badges": [], + "url": "https://ti.wikipedia.org/wiki/%E1%8A%A3%E1%8A%95%E1%89%A0%E1%88%B3" + }, + "tkwiki": { + "site": "tkwiki", + "title": "\u00ddolbars", + "badges": [], + "url": "https://tk.wikipedia.org/wiki/%C3%9Dolbars" + }, + "tlwiki": { + "site": "tlwiki", + "title": "Leon", + "badges": [], + "url": "https://tl.wikipedia.org/wiki/Leon" + }, + "trwiki": { + "site": "trwiki", + "title": "Aslan", + "badges": [], + "url": "https://tr.wikipedia.org/wiki/Aslan" + }, + "ttwiki": { + "site": "ttwiki", + "title": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://tt.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD" + }, + "tumwiki": { + "site": "tumwiki", + "title": "Nkhalamu", + "badges": [], + "url": "https://tum.wikipedia.org/wiki/Nkhalamu" + }, + "udmwiki": { + "site": "udmwiki", + "title": "\u0410\u0440\u044b\u0441\u043b\u0430\u043d", + "badges": [], + "url": "https://udm.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD" + }, + "ugwiki": { + "site": "ugwiki", + "title": "\u0634\u0649\u0631", + "badges": [], + "url": "https://ug.wikipedia.org/wiki/%D8%B4%D9%89%D8%B1" + }, + "ukwiki": { + "site": "ukwiki", + "title": "\u041b\u0435\u0432", + "badges": [], + "url": "https://uk.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2" + }, + "ukwikiquote": { + "site": "ukwikiquote", + "title": "\u041b\u0435\u0432", + "badges": [], + "url": "https://uk.wikiquote.org/wiki/%D0%9B%D0%B5%D0%B2" + }, + "urwiki": { + "site": "urwiki", + "title": "\u0628\u0628\u0631 \u0634\u06cc\u0631", + "badges": ["Q17437796"], + "url": "https://ur.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%DB%8C%D8%B1" + }, + "uzwiki": { + "site": "uzwiki", + "title": "Arslon", + "badges": [], + "url": "https://uz.wikipedia.org/wiki/Arslon" + }, + "vecwiki": { + "site": "vecwiki", + "title": "Leon", + "badges": [], + "url": "https://vec.wikipedia.org/wiki/Leon" + }, + "vepwiki": { + "site": "vepwiki", + "title": "Lev", + "badges": [], + "url": "https://vep.wikipedia.org/wiki/Lev" + }, + "viwiki": { + "site": "viwiki", + "title": "S\u01b0 t\u1eed", + "badges": [], + "url": "https://vi.wikipedia.org/wiki/S%C6%B0_t%E1%BB%AD" + }, + "vlswiki": { + "site": "vlswiki", + "title": "L\u00eaeuw (b\u00eaeste)", + "badges": [], + "url": "https://vls.wikipedia.org/wiki/L%C3%AAeuw_(b%C3%AAeste)" + }, + "warwiki": { + "site": "warwiki", + "title": "Leon", + "badges": [], + "url": "https://war.wikipedia.org/wiki/Leon" + }, + "wowiki": { + "site": "wowiki", + "title": "Gaynde", + "badges": [], + "url": "https://wo.wikipedia.org/wiki/Gaynde" + }, + "wuuwiki": { + "site": "wuuwiki", + "title": "\u72ee", + "badges": [], + "url": "https://wuu.wikipedia.org/wiki/%E7%8B%AE" + }, + "xalwiki": { + "site": "xalwiki", + "title": "\u0410\u0440\u0441\u043b\u04a3", + "badges": [], + "url": "https://xal.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D2%A3" + }, + "xhwiki": { + "site": "xhwiki", + "title": "Ingonyama", + "badges": [], + "url": "https://xh.wikipedia.org/wiki/Ingonyama" + }, + "xmfwiki": { + "site": "xmfwiki", + "title": "\u10dc\u10ef\u10d8\u10da\u10dd", + "badges": [], + "url": "https://xmf.wikipedia.org/wiki/%E1%83%9C%E1%83%AF%E1%83%98%E1%83%9A%E1%83%9D" + }, + "yiwiki": { + "site": "yiwiki", + "title": "\u05dc\u05d9\u05d9\u05d1", + "badges": [], + "url": "https://yi.wikipedia.org/wiki/%D7%9C%D7%99%D7%99%D7%91" + }, + "yowiki": { + "site": "yowiki", + "title": "K\u00ecn\u00ec\u00fan", + "badges": [], + "url": "https://yo.wikipedia.org/wiki/K%C3%ACn%C3%AC%C3%BAn" + }, + "zawiki": { + "site": "zawiki", + "title": "Saeceij", + "badges": [], + "url": "https://za.wikipedia.org/wiki/Saeceij" + }, + "zh_min_nanwiki": { + "site": "zh_min_nanwiki", + "title": "Sai", + "badges": [], + "url": "https://zh-min-nan.wikipedia.org/wiki/Sai" + }, + "zh_yuewiki": { + "site": "zh_yuewiki", + "title": "\u7345\u5b50", + "badges": ["Q17437796"], + "url": "https://zh-yue.wikipedia.org/wiki/%E7%8D%85%E5%AD%90" + }, + "zhwiki": { + "site": "zhwiki", + "title": "\u72ee", + "badges": [], + "url": "https://zh.wikipedia.org/wiki/%E7%8B%AE" + }, + "zuwiki": { + "site": "zuwiki", + "title": "Ibhubesi", + "badges": [], + "url": "https://zu.wikipedia.org/wiki/Ibhubesi" + } + } + } + } + } + constructor() { super("Wikidata", [ ["Download Lion", async () => { Utils.injectJsonDownloadForTests( - "https://www.wikidata.org/wiki/Special:EntityData/Q140.json" , + "https://www.wikidata.org/wiki/Special:EntityData/Q140.json", WikidataSpecTest.Q140 ) @@ -1884,7 +9133,7 @@ export default class WikidataSpecTest extends T { }], ["Extract key from a lexeme", () => { Utils.injectJsonDownloadForTests( - "https://www.wikidata.org/wiki/Special:EntityData/L614072.json" , + "https://www.wikidata.org/wiki/Special:EntityData/L614072.json", { "entities": { "L614072": { @@ -1920,7 +9169,7 @@ export default class WikidataSpecTest extends T { const key = Wikidata.ExtractKey("https://www.wikidata.org/wiki/Lexeme:L614072") T.equals("L614072", key) - + }], ["Download a lexeme", async () => { @@ -1928,10 +9177,7 @@ export default class WikidataSpecTest extends T { T.isTrue(response !== undefined, "Response is undefined") }] - + ]); } - - - private static Q140 = {"entities":{"Q140":{"pageid":275,"ns":0,"title":"Q140","lastrevid":1503881580,"modified":"2021-09-26T19:53:55Z","type":"item","id":"Q140","labels":{"fr":{"language":"fr","value":"lion"},"it":{"language":"it","value":"leone"},"nb":{"language":"nb","value":"l\u00f8ve"},"ru":{"language":"ru","value":"\u043b\u0435\u0432"},"de":{"language":"de","value":"L\u00f6we"},"es":{"language":"es","value":"le\u00f3n"},"nn":{"language":"nn","value":"l\u00f8ve"},"da":{"language":"da","value":"l\u00f8ve"},"af":{"language":"af","value":"leeu"},"ar":{"language":"ar","value":"\u0623\u0633\u062f"},"bg":{"language":"bg","value":"\u043b\u044a\u0432"},"bn":{"language":"bn","value":"\u09b8\u09bf\u0982\u09b9"},"br":{"language":"br","value":"leon"},"bs":{"language":"bs","value":"lav"},"ca":{"language":"ca","value":"lle\u00f3"},"cs":{"language":"cs","value":"lev"},"el":{"language":"el","value":"\u03bb\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9"},"fi":{"language":"fi","value":"leijona"},"ga":{"language":"ga","value":"leon"},"gl":{"language":"gl","value":"Le\u00f3n"},"gu":{"language":"gu","value":"\u0ab8\u0abf\u0a82\u0ab9"},"he":{"language":"he","value":"\u05d0\u05e8\u05d9\u05d4"},"hi":{"language":"hi","value":"\u0938\u093f\u0902\u0939"},"hu":{"language":"hu","value":"oroszl\u00e1n"},"id":{"language":"id","value":"Singa"},"ja":{"language":"ja","value":"\u30e9\u30a4\u30aa\u30f3"},"ko":{"language":"ko","value":"\uc0ac\uc790"},"mk":{"language":"mk","value":"\u043b\u0430\u0432"},"ml":{"language":"ml","value":"\u0d38\u0d3f\u0d02\u0d39\u0d02"},"mr":{"language":"mr","value":"\u0938\u093f\u0902\u0939"},"my":{"language":"my","value":"\u1001\u103c\u1004\u103a\u1039\u101e\u1031\u1037"},"ne":{"language":"ne","value":"\u0938\u093f\u0902\u0939"},"nl":{"language":"nl","value":"leeuw"},"pl":{"language":"pl","value":"lew afryka\u0144ski"},"pt":{"language":"pt","value":"le\u00e3o"},"pt-br":{"language":"pt-br","value":"le\u00e3o"},"scn":{"language":"scn","value":"liuni"},"sq":{"language":"sq","value":"Luani"},"sr":{"language":"sr","value":"\u043b\u0430\u0432"},"sw":{"language":"sw","value":"simba"},"ta":{"language":"ta","value":"\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd"},"te":{"language":"te","value":"\u0c38\u0c3f\u0c02\u0c39\u0c02"},"th":{"language":"th","value":"\u0e2a\u0e34\u0e07\u0e42\u0e15"},"tr":{"language":"tr","value":"aslan"},"uk":{"language":"uk","value":"\u043b\u0435\u0432"},"vi":{"language":"vi","value":"s\u01b0 t\u1eed"},"zh":{"language":"zh","value":"\u7345\u5b50"},"sco":{"language":"sco","value":"lion"},"zh-hant":{"language":"zh-hant","value":"\u7345\u5b50"},"fa":{"language":"fa","value":"\u0634\u06cc\u0631"},"zh-hans":{"language":"zh-hans","value":"\u72ee\u5b50"},"ee":{"language":"ee","value":"Dzata"},"ilo":{"language":"ilo","value":"leon"},"ksh":{"language":"ksh","value":"L\u00f6hv"},"zh-hk":{"language":"zh-hk","value":"\u7345\u5b50"},"as":{"language":"as","value":"\u09b8\u09bf\u0982\u09b9"},"zh-cn":{"language":"zh-cn","value":"\u72ee\u5b50"},"zh-mo":{"language":"zh-mo","value":"\u7345\u5b50"},"zh-my":{"language":"zh-my","value":"\u72ee\u5b50"},"zh-sg":{"language":"zh-sg","value":"\u72ee\u5b50"},"zh-tw":{"language":"zh-tw","value":"\u7345\u5b50"},"ast":{"language":"ast","value":"lle\u00f3n"},"sat":{"language":"sat","value":"\u1c61\u1c5f\u1c74\u1c5f\u1c60\u1c69\u1c5e"},"bho":{"language":"bho","value":"\u0938\u093f\u0902\u0939"},"en":{"language":"en","value":"lion"},"ks":{"language":"ks","value":"\u067e\u0627\u062f\u064e\u0631 \u0633\u0655\u06c1\u06c1"},"be-tarask":{"language":"be-tarask","value":"\u043b\u0435\u045e"},"nan":{"language":"nan","value":"Sai"},"la":{"language":"la","value":"leo"},"en-ca":{"language":"en-ca","value":"Lion"},"en-gb":{"language":"en-gb","value":"lion"},"ab":{"language":"ab","value":"\u0410\u043b\u044b\u043c"},"am":{"language":"am","value":"\u12a0\u1295\u1260\u1233"},"an":{"language":"an","value":"Panthera leo"},"ang":{"language":"ang","value":"L\u0113o"},"arc":{"language":"arc","value":"\u0710\u072a\u071d\u0710"},"arz":{"language":"arz","value":"\u0633\u0628\u0639"},"av":{"language":"av","value":"\u0413\u044a\u0430\u043b\u0431\u0430\u0446\u04c0"},"az":{"language":"az","value":"\u015eir"},"ba":{"language":"ba","value":"\u0410\u0440\u044b\u04ab\u043b\u0430\u043d"},"be":{"language":"be","value":"\u043b\u0435\u045e"},"bo":{"language":"bo","value":"\u0f66\u0f7a\u0f44\u0f0b\u0f42\u0f7a\u0f0d"},"bpy":{"language":"bpy","value":"\u09a8\u0982\u09b8\u09be"},"bxr":{"language":"bxr","value":"\u0410\u0440\u0441\u0430\u043b\u0430\u043d"},"ce":{"language":"ce","value":"\u041b\u043e\u043c"},"chr":{"language":"chr","value":"\u13e2\u13d3\u13e5 \u13a4\u13cd\u13c6\u13b4\u13c2"},"chy":{"language":"chy","value":"P\u00e9hpe'\u00e9nan\u00f3se'hame"},"ckb":{"language":"ckb","value":"\u0634\u06ce\u0631"},"co":{"language":"co","value":"Lionu"},"csb":{"language":"csb","value":"Lew"},"cu":{"language":"cu","value":"\u041b\u044c\u0432\u044a"},"cv":{"language":"cv","value":"\u0410\u0440\u0103\u0441\u043b\u0430\u043d"},"cy":{"language":"cy","value":"Llew"},"dsb":{"language":"dsb","value":"law"},"eo":{"language":"eo","value":"leono"},"et":{"language":"et","value":"l\u00f5vi"},"eu":{"language":"eu","value":"lehoi"},"fo":{"language":"fo","value":"leyvur"},"frr":{"language":"frr","value":"l\u00f6\u00f6w"},"gag":{"language":"gag","value":"aslan"},"gd":{"language":"gd","value":"le\u00f2mhann"},"gn":{"language":"gn","value":"Le\u00f5"},"got":{"language":"got","value":"\ud800\udf3b\ud800\udf39\ud800\udf45\ud800\udf30/Liwa"},"ha":{"language":"ha","value":"Zaki"},"hak":{"language":"hak","value":"S\u1e73\u0302-\u00e9"},"haw":{"language":"haw","value":"Liona"},"hif":{"language":"hif","value":"Ser"},"hr":{"language":"hr","value":"lav"},"hsb":{"language":"hsb","value":"law"},"ht":{"language":"ht","value":"Lyon"},"hy":{"language":"hy","value":"\u0561\u057c\u0575\u0578\u0582\u056e"},"ia":{"language":"ia","value":"Panthera leo"},"ig":{"language":"ig","value":"Od\u00fam"},"io":{"language":"io","value":"leono"},"is":{"language":"is","value":"lj\u00f3n"},"jbo":{"language":"jbo","value":"cinfo"},"jv":{"language":"jv","value":"Singa"},"ka":{"language":"ka","value":"\u10da\u10dd\u10db\u10d8"},"kab":{"language":"kab","value":"Izem"},"kbd":{"language":"kbd","value":"\u0425\u044c\u044d\u0449"},"kg":{"language":"kg","value":"Nkosi"},"kk":{"language":"kk","value":"\u0410\u0440\u044b\u0441\u0442\u0430\u043d"},"kn":{"language":"kn","value":"\u0cb8\u0cbf\u0c82\u0cb9"},"ku":{"language":"ku","value":"\u015e\u00ear"},"lb":{"language":"lb","value":"L\u00e9iw"},"lbe":{"language":"lbe","value":"\u0410\u0441\u043b\u0430\u043d"},"lez":{"language":"lez","value":"\u0410\u0441\u043b\u0430\u043d"},"li":{"language":"li","value":"Liew"},"lij":{"language":"lij","value":"Lion"},"ln":{"language":"ln","value":"Nk\u0254\u0301si"},"lt":{"language":"lt","value":"li\u016btas"},"ltg":{"language":"ltg","value":"\u013bovs"},"lv":{"language":"lv","value":"lauva"},"mdf":{"language":"mdf","value":"\u041e\u0440\u043a\u0441\u043e\u0444\u0442\u0430"},"mhr":{"language":"mhr","value":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d"},"mn":{"language":"mn","value":"\u0410\u0440\u0441\u043b\u0430\u043d"},"mrj":{"language":"mrj","value":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d"},"ms":{"language":"ms","value":"Singa"},"mt":{"language":"mt","value":"iljun"},"nah":{"language":"nah","value":"Cu\u0101miztli"},"nrm":{"language":"nrm","value":"lion"},"su":{"language":"su","value":"Singa"},"de-ch":{"language":"de-ch","value":"L\u00f6we"},"ky":{"language":"ky","value":"\u0410\u0440\u0441\u0442\u0430\u043d"},"lmo":{"language":"lmo","value":"Panthera leo"},"ceb":{"language":"ceb","value":"Panthera leo"},"diq":{"language":"diq","value":"\u015e\u00ear"},"new":{"language":"new","value":"\u0938\u093f\u0902\u0939"},"nds":{"language":"nds","value":"L\u00f6\u00f6w"},"ak":{"language":"ak","value":"Gyata"},"cdo":{"language":"cdo","value":"S\u0103i"},"ady":{"language":"ady","value":"\u0410\u0441\u043b\u044a\u0430\u043d"},"azb":{"language":"azb","value":"\u0622\u0633\u0644\u0627\u0646"},"lfn":{"language":"lfn","value":"Leon"},"kbp":{"language":"kbp","value":"T\u0254\u0254y\u028b\u028b"},"gsw":{"language":"gsw","value":"L\u00f6we"},"din":{"language":"din","value":"K\u00f6r"},"inh":{"language":"inh","value":"\u041b\u043e\u043c"},"bm":{"language":"bm","value":"Waraba"},"hyw":{"language":"hyw","value":"\u0531\u057c\u056b\u0582\u056e"},"nds-nl":{"language":"nds-nl","value":"leeuw"},"kw":{"language":"kw","value":"Lew"},"ext":{"language":"ext","value":"Le\u00f3n"},"bcl":{"language":"bcl","value":"Leon"},"mg":{"language":"mg","value":"Liona"},"lld":{"language":"lld","value":"Lion"},"lzh":{"language":"lzh","value":"\u7345"},"ary":{"language":"ary","value":"\u0633\u0628\u0639"},"sv":{"language":"sv","value":"lejon"},"nso":{"language":"nso","value":"Tau"},"nv":{"language":"nv","value":"N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed"},"oc":{"language":"oc","value":"panthera leo"},"or":{"language":"or","value":"\u0b38\u0b3f\u0b02\u0b39"},"os":{"language":"os","value":"\u0426\u043e\u043c\u0430\u0445\u044a"},"pa":{"language":"pa","value":"\u0a38\u0a3c\u0a47\u0a30"},"pam":{"language":"pam","value":"Leon"},"pcd":{"language":"pcd","value":"Lion"},"pms":{"language":"pms","value":"Lion"},"pnb":{"language":"pnb","value":"\u0628\u0628\u0631 \u0634\u06cc\u0631"},"ps":{"language":"ps","value":"\u0632\u0645\u0631\u06cc"},"qu":{"language":"qu","value":"Liyun"},"rn":{"language":"rn","value":"Intare"},"ro":{"language":"ro","value":"Leul"},"sl":{"language":"sl","value":"lev"},"sn":{"language":"sn","value":"Shumba"},"so":{"language":"so","value":"Libaax"},"ss":{"language":"ss","value":"Libubesi"},"st":{"language":"st","value":"Tau"},"stq":{"language":"stq","value":"Leeuwe"},"sr-ec":{"language":"sr-ec","value":"\u043b\u0430\u0432"},"sr-el":{"language":"sr-el","value":"lav"},"rm":{"language":"rm","value":"Liun"},"sm":{"language":"sm","value":"Leona"},"tcy":{"language":"tcy","value":"\u0cb8\u0cbf\u0cae\u0ccd\u0cae"},"szl":{"language":"szl","value":"Lew"},"rue":{"language":"rue","value":"\u041b\u0435\u0432"},"rw":{"language":"rw","value":"Intare"},"sah":{"language":"sah","value":"\u0425\u0430\u0445\u0430\u0439"},"sh":{"language":"sh","value":"Lav"},"sk":{"language":"sk","value":"lev p\u00fa\u0161\u0165ov\u00fd"},"tg":{"language":"tg","value":"\u0428\u0435\u0440"},"ti":{"language":"ti","value":"\u12a3\u1295\u1260\u1233"},"tl":{"language":"tl","value":"Leon"},"tum":{"language":"tum","value":"Nkhalamu"},"udm":{"language":"udm","value":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d"},"ug":{"language":"ug","value":"\u0634\u0649\u0631"},"ur":{"language":"ur","value":"\u0628\u0628\u0631"},"vec":{"language":"vec","value":"Leon"},"vep":{"language":"vep","value":"lev"},"vls":{"language":"vls","value":"l\u00eaeuw"},"war":{"language":"war","value":"leon"},"wo":{"language":"wo","value":"gaynde"},"xal":{"language":"xal","value":"\u0410\u0440\u0441\u043b\u04a3"},"xmf":{"language":"xmf","value":"\u10dc\u10ef\u10d8\u10da\u10dd"},"yi":{"language":"yi","value":"\u05dc\u05d9\u05d9\u05d1"},"yo":{"language":"yo","value":"K\u00ecn\u00ec\u00fan"},"yue":{"language":"yue","value":"\u7345\u5b50"},"zu":{"language":"zu","value":"ibhubesi"},"tk":{"language":"tk","value":"\u00ddolbars"},"tt":{"language":"tt","value":"\u0430\u0440\u044b\u0441\u043b\u0430\u043d"},"uz":{"language":"uz","value":"Arslon"},"se":{"language":"se","value":"Ledjon"},"si":{"language":"si","value":"\u0dc3\u0dd2\u0d82\u0dc4\u0dba\u0dcf"},"sgs":{"language":"sgs","value":"Li\u016bts"},"vro":{"language":"vro","value":"L\u00f5vi"},"xh":{"language":"xh","value":"Ingonyama"},"sa":{"language":"sa","value":"\u0938\u093f\u0902\u0939\u0903 \u092a\u0936\u0941\u0903"},"za":{"language":"za","value":"Saeceij"},"sd":{"language":"sd","value":"\u0628\u0628\u0631 \u0634\u064a\u0646\u0647\u0646"},"wuu":{"language":"wuu","value":"\u72ee"},"shn":{"language":"shn","value":"\u101e\u1062\u1004\u103a\u1087\u101e\u102e\u1088"},"alt":{"language":"alt","value":"\u0410\u0440\u0441\u043b\u0430\u043d"},"avk":{"language":"avk","value":"Krapol (Panthera leo)"},"dag":{"language":"dag","value":"Gbu\u0263inli"},"shi":{"language":"shi","value":"Agrzam"},"mni":{"language":"mni","value":"\uabc5\uabe3\uabe1\uabc1\uabe5"}},"descriptions":{"fr":{"language":"fr","value":"esp\u00e8ce de mammif\u00e8res carnivores"},"it":{"language":"it","value":"mammifero carnivoro della famiglia dei Felidi"},"nb":{"language":"nb","value":"kattedyr"},"ru":{"language":"ru","value":"\u0432\u0438\u0434 \u0445\u0438\u0449\u043d\u044b\u0445 \u043c\u043b\u0435\u043a\u043e\u043f\u0438\u0442\u0430\u044e\u0449\u0438\u0445"},"de":{"language":"de","value":"Art der Gattung Eigentliche Gro\u00dfkatzen (Panthera)"},"es":{"language":"es","value":"mam\u00edfero carn\u00edvoro de la familia de los f\u00e9lidos"},"en":{"language":"en","value":"species of big cat"},"ko":{"language":"ko","value":"\uace0\uc591\uc774\uacfc\uc5d0 \uc18d\ud558\ub294 \uc721\uc2dd\ub3d9\ubb3c"},"ca":{"language":"ca","value":"mam\u00edfer carn\u00edvor de la fam\u00edlia dels f\u00e8lids"},"fi":{"language":"fi","value":"suuri kissael\u00e4in"},"pt-br":{"language":"pt-br","value":"esp\u00e9cie de mam\u00edfero carn\u00edvoro do g\u00eanero Panthera e da fam\u00edlia Felidae"},"ta":{"language":"ta","value":"\u0bb5\u0bbf\u0bb2\u0b99\u0bcd\u0b95\u0bc1"},"nl":{"language":"nl","value":"groot roofdier uit de familie der katachtigen"},"he":{"language":"he","value":"\u05de\u05d9\u05df \u05d1\u05e1\u05d5\u05d2 \u05e4\u05e0\u05ea\u05e8, \u05d8\u05d5\u05e8\u05e3 \u05d2\u05d3\u05d5\u05dc \u05d1\u05de\u05e9\u05e4\u05d7\u05ea \u05d4\u05d7\u05ea\u05d5\u05dc\u05d9\u05d9\u05dd"},"pt":{"language":"pt","value":"esp\u00e9cie de felino"},"sco":{"language":"sco","value":"species o big cat"},"zh-hans":{"language":"zh-hans","value":"\u5927\u578b\u732b\u79d1\u52a8\u7269"},"uk":{"language":"uk","value":"\u0432\u0438\u0434 \u043a\u043b\u0430\u0441\u0443 \u0441\u0441\u0430\u0432\u0446\u0456\u0432, \u0440\u044f\u0434\u0443 \u0445\u0438\u0436\u0438\u0445, \u0440\u043e\u0434\u0438\u043d\u0438 \u043a\u043e\u0442\u044f\u0447\u0438\u0445"},"hu":{"language":"hu","value":"macskaf\u00e9l\u00e9k csal\u00e1dj\u00e1ba tartoz\u00f3 eml\u0151sfaj"},"bn":{"language":"bn","value":"\u099c\u0999\u09cd\u0997\u09b2\u09c7\u09b0 \u09b0\u09be\u099c\u09be"},"hi":{"language":"hi","value":"\u091c\u0902\u0917\u0932 \u0915\u093e \u0930\u093e\u091c\u093e"},"ilo":{"language":"ilo","value":"sebbangan ti dakkel a pusa"},"ksh":{"language":"ksh","value":"et jr\u00fch\u00dfde Kazedier op der \u00c4hd, der K\u00fcnning vun de Diehre"},"fa":{"language":"fa","value":"\u06af\u0631\u0628\u0647\u200c \u0628\u0632\u0631\u06af \u0628\u0648\u0645\u06cc \u0622\u0641\u0631\u06cc\u0642\u0627 \u0648 \u0622\u0633\u06cc\u0627"},"gl":{"language":"gl","value":"\u00e9 un mam\u00edfero carn\u00edvoro da familia dos f\u00e9lidos e unha das 4 especies do x\u00e9nero Panthera"},"sq":{"language":"sq","value":"mace e madhe e familjes Felidae"},"el":{"language":"el","value":"\u03b5\u03af\u03b4\u03bf\u03c2 \u03c3\u03b1\u03c1\u03ba\u03bf\u03c6\u03ac\u03b3\u03bf \u03b8\u03b7\u03bb\u03b1\u03c3\u03c4\u03b9\u03ba\u03cc"},"scn":{"language":"scn","value":"specia di mamm\u00ecfiru"},"bg":{"language":"bg","value":"\u0432\u0438\u0434 \u0431\u043e\u0437\u0430\u0439\u043d\u0438\u043a"},"ne":{"language":"ne","value":"\u0920\u0942\u0932\u094b \u092c\u093f\u0930\u093e\u0932\u094b\u0915\u094b \u092a\u094d\u0930\u091c\u093e\u0924\u093f"},"pl":{"language":"pl","value":"gatunek ssaka z rodziny kotowatych"},"af":{"language":"af","value":"Soogdier en roofdier van die familie Felidae, een van die \"groot katte\""},"mk":{"language":"mk","value":"\u0432\u0438\u0434 \u0433\u043e\u043b\u0435\u043c\u0430 \u043c\u0430\u0447\u043a\u0430"},"nn":{"language":"nn","value":"kattedyr"},"zh-hant":{"language":"zh-hant","value":"\u5927\u578b\u8c93\u79d1\u52d5\u7269"},"zh":{"language":"zh","value":"\u4ea7\u81ea\u975e\u6d32\u548c\u4e9a\u6d32\u7684\u5927\u578b\u732b\u79d1\u52a8\u7269"},"zh-cn":{"language":"zh-cn","value":"\u5927\u578b\u732b\u79d1\u52a8\u7269"},"zh-hk":{"language":"zh-hk","value":"\u5927\u578b\u8c93\u79d1\u52d5\u7269"},"zh-mo":{"language":"zh-mo","value":"\u5927\u578b\u8c93\u79d1\u52d5\u7269"},"zh-my":{"language":"zh-my","value":"\u5927\u578b\u732b\u79d1\u52a8\u7269"},"zh-sg":{"language":"zh-sg","value":"\u5927\u578b\u732b\u79d1\u52a8\u7269"},"zh-tw":{"language":"zh-tw","value":"\u5927\u578b\u8c93\u79d1\u52d5\u7269"},"sw":{"language":"sw","value":"mnyama mla nyama kama paka mkubwa"},"th":{"language":"th","value":"\u0e0a\u0e37\u0e48\u0e2d\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e1b\u0e48\u0e32\u0e0a\u0e19\u0e34\u0e14\u0e2b\u0e19\u0e36\u0e48\u0e07 \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e2a\u0e32\u0e22\u0e1e\u0e31\u0e19\u0e18\u0e38\u0e4c\u0e02\u0e2d\u0e07\u0e41\u0e21\u0e27\u0e43\u0e2b\u0e0d\u0e48"},"ar":{"language":"ar","value":"\u062d\u064a\u0648\u0627\u0646 \u0645\u0646 \u0627\u0644\u062b\u062f\u064a\u064a\u0627\u062a \u0645\u0646 \u0641\u0635\u064a\u0644\u0629 \u0627\u0644\u0633\u0646\u0648\u0631\u064a\u0627\u062a \u0648\u0623\u062d\u062f \u0627\u0644\u0633\u0646\u0648\u0631\u064a\u0627\u062a \u0627\u0644\u0623\u0631\u0628\u0639\u0629 \u0627\u0644\u0643\u0628\u064a\u0631\u0629 \u0627\u0644\u0645\u0646\u062a\u0645\u064a\u0629 \u0644\u062c\u0646\u0633 \u0627\u0644\u0646\u0645\u0631"},"ml":{"language":"ml","value":"\u0d38\u0d38\u0d4d\u0d24\u0d28\u0d3f\u0d15\u0d33\u0d3f\u0d32\u0d46 \u0d2b\u0d46\u0d32\u0d3f\u0d21\u0d47 \u0d15\u0d41\u0d1f\u0d41\u0d02\u0d2c\u0d24\u0d4d\u0d24\u0d3f\u0d32\u0d46 \u0d2a\u0d3e\u0d28\u0d4d\u0d24\u0d31 \u0d1c\u0d28\u0d41\u0d38\u0d4d\u0d38\u0d3f\u0d7d \u0d09\u0d7e\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f \u0d12\u0d30\u0d41 \u0d35\u0d28\u0d4d\u0d2f\u0d1c\u0d40\u0d35\u0d3f\u0d2f\u0d3e\u0d23\u0d4d \u0d38\u0d3f\u0d02\u0d39\u0d02"},"cs":{"language":"cs","value":"ko\u010dkovit\u00e1 \u0161elma"},"gu":{"language":"gu","value":"\u0aac\u0abf\u0ab2\u0abe\u0aa1\u0ac0 \u0ab5\u0a82\u0ab6\u0aa8\u0ac1\u0a82 \u0ab8\u0ab8\u0acd\u0aa4\u0aa8 \u0aaa\u0acd\u0ab0\u0abe\u0aa3\u0ac0"},"mr":{"language":"mr","value":"\u092e\u093e\u0902\u091c\u0930\u093e\u091a\u0940 \u092e\u094b\u0920\u0940 \u091c\u093e\u0924"},"sr":{"language":"sr","value":"\u0432\u0435\u043b\u0438\u043a\u0438 \u0441\u0438\u0441\u0430\u0440 \u0438\u0437 \u043f\u043e\u0440\u043e\u0434\u0438\u0446\u0435 \u043c\u0430\u0447\u0430\u043a\u0430"},"ast":{"language":"ast","value":"especie de mam\u00edferu carn\u00edvoru"},"te":{"language":"te","value":"\u0c2a\u0c46\u0c26\u0c4d\u0c26 \u0c2a\u0c3f\u0c32\u0c4d\u0c32\u0c3f \u0c1c\u0c24\u0c3f"},"bho":{"language":"bho","value":"\u092c\u093f\u0932\u093e\u0930\u092c\u0902\u0938 \u0915\u0947 \u092c\u0921\u093c\u0939\u0928 \u091c\u093e\u0928\u0935\u0930"},"da":{"language":"da","value":"en af de fem store katte i sl\u00e6gten Panthera"},"vi":{"language":"vi","value":"M\u1ed9t lo\u00e0i m\u00e8o l\u1edbn thu\u1ed9c chi Panthera"},"ja":{"language":"ja","value":"\u98df\u8089\u76ee\u30cd\u30b3\u79d1\u306e\u52d5\u7269"},"ga":{"language":"ga","value":"speiceas cat"},"bs":{"language":"bs","value":"vrsta velike ma\u010dke"},"tr":{"language":"tr","value":"Afrika ve Asya'ya \u00f6zg\u00fc b\u00fcy\u00fck bir kedi"},"as":{"language":"as","value":"\u09b8\u09cd\u09a4\u09a8\u09cd\u09af\u09aa\u09be\u09af\u09bc\u09c0 \u09aa\u09cd\u09f0\u09be\u09a3\u09c0"},"my":{"language":"my","value":"\u1014\u102d\u102f\u1037\u1010\u102d\u102f\u1000\u103a\u101e\u1010\u1039\u1010\u101d\u102b \u1019\u103b\u102d\u102f\u1038\u1005\u102d\u1010\u103a (\u1000\u103c\u1031\u102c\u1004\u103a\u1019\u103b\u102d\u102f\u1038\u101b\u1004\u103a\u1038\u101d\u1004\u103a)"},"id":{"language":"id","value":"spesies hewan keluarga jenis kucing"},"ks":{"language":"ks","value":"\u0628\u062c \u0628\u0631\u0627\u0631\u0646 \u06be\u0646\u062f \u06a9\u0633\u0645 \u06cc\u0633 \u0627\u0634\u06cc\u0627 \u062a\u06c1 \u0627\u0641\u0631\u06cc\u06a9\u0627 \u0645\u0646\u0632 \u0645\u0644\u0627\u0646 \u0686\u06be\u06c1"},"br":{"language":"br","value":"bronneg kigdebrer"},"sat":{"language":"sat","value":"\u1c75\u1c64\u1c68 \u1c68\u1c6e\u1c71 \u1c68\u1c5f\u1c61\u1c5f"},"mni":{"language":"mni","value":"\uabc2\uabdd\uabc2\uabdb\uabc0\uabe4 \uabc1\uabe5\uabcd\uabe4\uabe1 \uabc6\uabe5\uabd5 \uabc1\uabe5 \uabd1\uabc6\uabe7\uabd5\uabc1\uabe4\uabe1\uabd2\uabe4 \uabc3\uabc5\uabe8\uabe1\uabd7 \uabd1\uabc3"},"ro":{"language":"ro","value":"mamifer carnivor"}},"aliases":{"es":[{"language":"es","value":"Panthera leo"},{"language":"es","value":"leon"}],"en":[{"language":"en","value":"Asiatic Lion"},{"language":"en","value":"Panthera leo"},{"language":"en","value":"African lion"},{"language":"en","value":"the lion"},{"language":"en","value":"\ud83e\udd81"}],"pt-br":[{"language":"pt-br","value":"Panthera leo"}],"fr":[{"language":"fr","value":"lionne"},{"language":"fr","value":"lionceau"}],"zh":[{"language":"zh","value":"\u9b03\u6bdb"},{"language":"zh","value":"\u72ee\u5b50"},{"language":"zh","value":"\u7345"},{"language":"zh","value":"\u525b\u679c\u7345"},{"language":"zh","value":"\u975e\u6d32\u72ee"}],"de":[{"language":"de","value":"Panthera leo"}],"ca":[{"language":"ca","value":"Panthera leo"}],"sco":[{"language":"sco","value":"Panthera leo"}],"hu":[{"language":"hu","value":"P. leo"},{"language":"hu","value":"Panthera leo"}],"ilo":[{"language":"ilo","value":"Panthera leo"},{"language":"ilo","value":"Felis leo"}],"ksh":[{"language":"ksh","value":"L\u00f6hw"},{"language":"ksh","value":"L\u00f6hf"},{"language":"ksh","value":"L\u00f6v"}],"gl":[{"language":"gl","value":"Panthera leo"}],"ja":[{"language":"ja","value":"\u767e\u7363\u306e\u738b"},{"language":"ja","value":"\u7345\u5b50"},{"language":"ja","value":"\u30b7\u30b7"}],"sq":[{"language":"sq","value":"Mbreti i Kafsh\u00ebve"}],"el":[{"language":"el","value":"\u03c0\u03b1\u03bd\u03b8\u03ae\u03c1"}],"pl":[{"language":"pl","value":"Panthera leo"},{"language":"pl","value":"lew"}],"zh-hk":[{"language":"zh-hk","value":"\u7345"}],"af":[{"language":"af","value":"Panthera leo"}],"mk":[{"language":"mk","value":"Panthera leo"}],"ar":[{"language":"ar","value":"\u0644\u064a\u062b"}],"zh-hant":[{"language":"zh-hant","value":"\u7345"}],"zh-cn":[{"language":"zh-cn","value":"\u72ee"}],"zh-hans":[{"language":"zh-hans","value":"\u72ee"}],"zh-mo":[{"language":"zh-mo","value":"\u7345"}],"zh-my":[{"language":"zh-my","value":"\u72ee"}],"zh-sg":[{"language":"zh-sg","value":"\u72ee"}],"zh-tw":[{"language":"zh-tw","value":"\u7345"}],"gu":[{"language":"gu","value":"\u0ab5\u0aa8\u0ab0\u0abe\u0a9c"},{"language":"gu","value":"\u0ab8\u0abe\u0ab5\u0a9c"},{"language":"gu","value":"\u0a95\u0ac7\u0ab8\u0ab0\u0ac0"}],"ast":[{"language":"ast","value":"Panthera leo"},{"language":"ast","value":"lle\u00f3n africanu"}],"hi":[{"language":"hi","value":"\u092a\u0947\u0902\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b"}],"te":[{"language":"te","value":"\u0c2a\u0c3e\u0c02\u0c25\u0c47\u0c30\u0c3e \u0c32\u0c3f\u0c2f\u0c4b"}],"nl":[{"language":"nl","value":"Panthera leo"}],"bho":[{"language":"bho","value":"\u092a\u0948\u0928\u094d\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b"},{"language":"bho","value":"\u092a\u0948\u0902\u0925\u0947\u0930\u093e \u0932\u093f\u092f\u094b"}],"ru":[{"language":"ru","value":"\u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0439 \u043b\u0435\u0432"},{"language":"ru","value":"\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u0448\u043a\u0430"},{"language":"ru","value":"\u0446\u0430\u0440\u044c \u0437\u0432\u0435\u0440\u0435\u0439"},{"language":"ru","value":"\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439 \u043b\u0435\u0432"}],"ga":[{"language":"ga","value":"Panthera leo"}],"bg":[{"language":"bg","value":"Panthera leo"},{"language":"bg","value":"\u043b\u044a\u0432\u0438\u0446\u0430"}],"sat":[{"language":"sat","value":"\u1c60\u1c69\u1c5e"}],"nan":[{"language":"nan","value":"Panthera leo"}],"la":[{"language":"la","value":"Panthera leo"}],"nds-nl":[{"language":"nds-nl","value":"leywe"}]},"claims":{"P225":[{"mainsnak":{"snaktype":"value","property":"P225","hash":"e2be083a19a0c5e1a3f8341be88c5ec0e347580f","datavalue":{"value":"Panthera leo","type":"string"},"datatype":"string"},"type":"statement","qualifiers":{"P405":[{"snaktype":"value","property":"P405","hash":"a817d3670bc2f9a3586b6377a65d54fff72ef888","datavalue":{"value":{"entity-type":"item","numeric-id":1043,"id":"Q1043"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P574":[{"snaktype":"value","property":"P574","hash":"506af9838b7d37b45786395b95170263f1951a31","datavalue":{"value":{"time":"+1758-01-01T00:00:00Z","timezone":0,"before":0,"after":0,"precision":9,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}],"P31":[{"snaktype":"value","property":"P31","hash":"60a983bb1006c765614eb370c3854e64ec50599f","datavalue":{"value":{"entity-type":"item","numeric-id":14594740,"id":"Q14594740"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P405","P574","P31"],"id":"q140$8CCA0B07-C81F-4456-ABAA-A7348C86C9B4","rank":"normal","references":[{"hash":"89e96b63b05055cc80c950cf5fea109c7d453658","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c26dbcef1202a7d198982ed24f6ea69b704f95fe","datavalue":{"value":{"entity-type":"item","numeric-id":82575,"id":"Q82575"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P577":[{"snaktype":"value","property":"P577","hash":"539fa499b6ea982e64006270bb26f52a57a8e32b","datavalue":{"value":{"time":"+1996-06-13T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}],"P813":[{"snaktype":"value","property":"P813","hash":"96dfb8481e184edb40553947f8fe08ce080f1553","datavalue":{"value":{"time":"+2013-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P577","P813"]},{"hash":"f2fcc71ba228fd0db2b328c938e601507006fa46","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"603c636b2210e4a74b7d40c9e969b7e503bbe252","datavalue":{"value":{"entity-type":"item","numeric-id":1538807,"id":"Q1538807"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"6892402e621d2b47092e15284d64cdbb395e71f7","datavalue":{"value":{"time":"+2015-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P105":[{"mainsnak":{"snaktype":"value","property":"P105","hash":"aebf3611b23ed90c7c0fc80f6cd1cb7be110ea59","datavalue":{"value":{"entity-type":"item","numeric-id":7432,"id":"Q7432"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"q140$CD2903E5-743A-4B4F-AE9E-9C0C83426B11","rank":"normal","references":[{"hash":"89e96b63b05055cc80c950cf5fea109c7d453658","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c26dbcef1202a7d198982ed24f6ea69b704f95fe","datavalue":{"value":{"entity-type":"item","numeric-id":82575,"id":"Q82575"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P577":[{"snaktype":"value","property":"P577","hash":"539fa499b6ea982e64006270bb26f52a57a8e32b","datavalue":{"value":{"time":"+1996-06-13T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}],"P813":[{"snaktype":"value","property":"P813","hash":"96dfb8481e184edb40553947f8fe08ce080f1553","datavalue":{"value":{"time":"+2013-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P577","P813"]},{"hash":"f2fcc71ba228fd0db2b328c938e601507006fa46","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"603c636b2210e4a74b7d40c9e969b7e503bbe252","datavalue":{"value":{"entity-type":"item","numeric-id":1538807,"id":"Q1538807"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"6892402e621d2b47092e15284d64cdbb395e71f7","datavalue":{"value":{"time":"+2015-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P171":[{"mainsnak":{"snaktype":"value","property":"P171","hash":"cbf0d3943e6cbac8afbec1ff11525c84ee04e442","datavalue":{"value":{"entity-type":"item","numeric-id":127960,"id":"Q127960"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"q140$C1CA40D8-39C3-4DB4-B763-207A22796D85","rank":"normal","references":[{"hash":"89e96b63b05055cc80c950cf5fea109c7d453658","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c26dbcef1202a7d198982ed24f6ea69b704f95fe","datavalue":{"value":{"entity-type":"item","numeric-id":82575,"id":"Q82575"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P577":[{"snaktype":"value","property":"P577","hash":"539fa499b6ea982e64006270bb26f52a57a8e32b","datavalue":{"value":{"time":"+1996-06-13T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}],"P813":[{"snaktype":"value","property":"P813","hash":"96dfb8481e184edb40553947f8fe08ce080f1553","datavalue":{"value":{"time":"+2013-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P577","P813"]},{"hash":"f2fcc71ba228fd0db2b328c938e601507006fa46","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"603c636b2210e4a74b7d40c9e969b7e503bbe252","datavalue":{"value":{"entity-type":"item","numeric-id":1538807,"id":"Q1538807"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"6892402e621d2b47092e15284d64cdbb395e71f7","datavalue":{"value":{"time":"+2015-09-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P1403":[{"mainsnak":{"snaktype":"value","property":"P1403","hash":"baa11a4c668601014a48e2998ab76aa1ea7a5b99","datavalue":{"value":{"entity-type":"item","numeric-id":15294488,"id":"Q15294488"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$816d2b99-4aa5-5eb9-784b-34e2704d2927","rank":"normal"}],"P141":[{"mainsnak":{"snaktype":"value","property":"P141","hash":"80026ea5b2066a2538fee5c0897b459bb6770689","datavalue":{"value":{"entity-type":"item","numeric-id":278113,"id":"Q278113"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"q140$B12A2FD5-692F-4D9A-8FC7-144AA45A16F8","rank":"normal","references":[{"hash":"355df53bb7c6d100219cd2a331afd51719337d88","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"eb153b77c6029ffa1ca09f9128b8e47fe58fce5a","datavalue":{"value":{"entity-type":"item","numeric-id":56011232,"id":"Q56011232"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P627":[{"snaktype":"value","property":"P627","hash":"3642ac96e05180279c47a035c129d3af38d85027","datavalue":{"value":"15951","type":"string"},"datatype":"string"}],"P813":[{"snaktype":"value","property":"P813","hash":"76bc602d4f902d015c358223e7c0917bd65095e0","datavalue":{"value":{"time":"+2018-08-10T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P627","P813"]}]}],"P181":[{"mainsnak":{"snaktype":"value","property":"P181","hash":"8467347aac1f01e518c1b94d5bb68c65f9efe84a","datavalue":{"value":"Lion distribution.png","type":"string"},"datatype":"commonsMedia"},"type":"statement","id":"q140$12F383DD-D831-4AE9-A0ED-98C27A8C5BA7","rank":"normal"}],"P830":[{"mainsnak":{"snaktype":"value","property":"P830","hash":"8cafbfe99d80fcfabbd236d4cc01d33cc8a8b41d","datavalue":{"value":"328672","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$486d7ab8-4af8-b6e1-85bb-e0749b02c2d9","rank":"normal","references":[{"hash":"7e71b7ede7931e7e2ee9ce54e832816fe948b402","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"6e81987ab11fb1740bd862639411d0700be3b22c","datavalue":{"value":{"entity-type":"item","numeric-id":82486,"id":"Q82486"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"7c1a33cf9a0bf6cdd57b66f089065ba44b6a8953","datavalue":{"value":{"time":"+2014-10-30T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P815":[{"mainsnak":{"snaktype":"value","property":"P815","hash":"27f6bd8fb4504eb79b92e6b63679b83af07d5fed","datavalue":{"value":"183803","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$71177A4F-4308-463D-B370-8B354EC2D2C3","rank":"normal","references":[{"hash":"ff0dd9eabf88b0dcefa74b223d065dd644e42050","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c26dbcef1202a7d198982ed24f6ea69b704f95fe","datavalue":{"value":{"entity-type":"item","numeric-id":82575,"id":"Q82575"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"6b8fcfa6afb3911fecec93ae1dff2b6b6cde5659","datavalue":{"value":{"time":"+2013-12-07T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P685":[{"mainsnak":{"snaktype":"value","property":"P685","hash":"c863e255c042b2b9b6a788ebd6e24f38a46dfa88","datavalue":{"value":"9689","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$A9F4ABE4-D079-4868-BC18-F685479BB244","rank":"normal","references":[{"hash":"5667273d9f2899620fec2016bb2afd29aa7080ce","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"1851bc60ddfbcf6f76bd45aa7124fc0d5857a379","datavalue":{"value":{"entity-type":"item","numeric-id":13711410,"id":"Q13711410"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"6b8fcfa6afb3911fecec93ae1dff2b6b6cde5659","datavalue":{"value":{"time":"+2013-12-07T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P959":[{"mainsnak":{"snaktype":"value","property":"P959","hash":"55cab2a9d2af860a89a8d0e2eaefedb64202a3d8","datavalue":{"value":"14000228","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$A967D17D-485D-434F-BBF2-E6226E63BA42","rank":"normal","references":[{"hash":"3e398e6df20323ce88e644e5a1e4ec0bc77a5f41","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"603c636b2210e4a74b7d40c9e969b7e503bbe252","datavalue":{"value":{"entity-type":"item","numeric-id":1538807,"id":"Q1538807"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"d2bace4e146678a5e5f761e9a441b53b95dc2e87","datavalue":{"value":{"time":"+2014-01-10T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P842":[{"mainsnak":{"snaktype":"value","property":"P842","hash":"991987fc3fa4d1cfd3a601dcfc9dd1f802255de7","datavalue":{"value":"49734","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$3FF45860-DBC3-4629-AAF8-F2899B6C6876","rank":"normal","references":[{"hash":"1111bfc1dc63ee739fb9dd3f5534346c7fd478f0","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"00fe2206a3342fa25c0cfe1d08783c49a1986f12","datavalue":{"value":{"entity-type":"item","numeric-id":796451,"id":"Q796451"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"14c5b75e8d3f4c43cb5b570380dd98e421bb9751","datavalue":{"value":{"time":"+2014-01-30T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P227":[{"mainsnak":{"snaktype":"value","property":"P227","hash":"3343c5fd594f8f0264332d87ce95e76ffeaebffd","datavalue":{"value":"4140572-9","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$0059e08d-4308-8401-58e8-2cb683c03837","rank":"normal"}],"P349":[{"mainsnak":{"snaktype":"value","property":"P349","hash":"08812c4ef85f397bf00b015d1baf3b00d81cb9bf","datavalue":{"value":"00616831","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$B7933772-D27D-49D4-B1BB-AA36ADCA81B0","rank":"normal"}],"P1014":[{"mainsnak":{"snaktype":"value","property":"P1014","hash":"3d27204feb184f21c042777dc9674150cb07ee92","datavalue":{"value":"300310388","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$8e3c9dc3-442e-2e61-8617-f4a41b5be668","rank":"normal"}],"P646":[{"mainsnak":{"snaktype":"value","property":"P646","hash":"0c053bce57fe07b05c300a09b322d9f89236884b","datavalue":{"value":"/m/096mb","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$D94D8A4F-3414-4BE0-82C1-306BD136C017","rank":"normal","references":[{"hash":"2b00cb481cddcac7623114367489b5c194901c4a","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"a94b740202b097dd33355e0e6c00e54b9395e5e0","datavalue":{"value":{"entity-type":"item","numeric-id":15241312,"id":"Q15241312"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P577":[{"snaktype":"value","property":"P577","hash":"fde79ecb015112d2f29229ccc1ec514ed3e71fa2","datavalue":{"value":{"time":"+2013-10-28T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P577"]}]}],"P1036":[{"mainsnak":{"snaktype":"value","property":"P1036","hash":"02435ba66ab8e5fb26652ae1a84695be24b3e22a","datavalue":{"value":"599.757","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$e75ed89a-408d-9bc1-8d99-41663921debd","rank":"normal"}],"P1245":[{"mainsnak":{"snaktype":"value","property":"P1245","hash":"f3da4ca7d35fc3e02a9ea1662688d8f6c4658df0","datavalue":{"value":"5961","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$010e79a0-475e-fcf4-a554-375b64943783","rank":"normal"}],"P910":[{"mainsnak":{"snaktype":"value","property":"P910","hash":"056367b51cd51edd6c2840134fde01cf40469172","datavalue":{"value":{"entity-type":"item","numeric-id":6987175,"id":"Q6987175"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$BC4DE2D4-BF45-49AF-A9A6-C0A976F60825","rank":"normal"}],"P373":[{"mainsnak":{"snaktype":"value","property":"P373","hash":"76c006bc5e2975bcda2e7d60ddcbaaa8c84f69e5","datavalue":{"value":"Panthera leo","type":"string"},"datatype":"string"},"type":"statement","id":"q140$939BA4B2-28D3-4C74-B143-A0EA6F423B43","rank":"normal"}],"P846":[{"mainsnak":{"snaktype":"value","property":"P846","hash":"d0428680cd2b36efde61dc69ccc5a8ff7a735cb5","datavalue":{"value":"5219404","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$4CE8E6D4-E9A1-46F1-8EEF-B469E8485F9E","rank":"normal","references":[{"hash":"5b8345ffc93a361b71f5d201a97f587e5e57efe5","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"dbb8dd1efbe0158a5227213bd628eeac27a1da65","datavalue":{"value":{"entity-type":"item","numeric-id":1531570,"id":"Q1531570"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"3eb17b10ce02d44f47540a6fbdbb3cbb7e77d5f5","datavalue":{"value":{"time":"+2015-05-15T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P487":[{"mainsnak":{"snaktype":"value","property":"P487","hash":"5f93415dd33bfde6a546fdd65e5a7013e012c336","datavalue":{"value":"\ud83e\udd81","type":"string"},"datatype":"string"},"type":"statement","id":"Q140$da5262fc-4ac5-390b-b424-4f296b2d711d","rank":"normal"}],"P2040":[{"mainsnak":{"snaktype":"value","property":"P2040","hash":"5b13a3fa0fde6ba09d8e417738c05268bd065e32","datavalue":{"value":"6353","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$E97A1A2E-D146-4C62-AE92-5AF5F7E146EF","rank":"normal","references":[{"hash":"348b5187938d682071c94e22f1b30659af715dc7","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"213dc0d84ed983cbb28466ebb0c45bf8b0730ea2","datavalue":{"value":{"entity-type":"item","numeric-id":20962955,"id":"Q20962955"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"3d2c713dec9143721ae196af88fee0fde5ae20f2","datavalue":{"value":{"time":"+2015-09-10T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P935":[{"mainsnak":{"snaktype":"value","property":"P935","hash":"c3518a9944958337bcce384587f3abc3de6ddf34","datavalue":{"value":"Panthera leo","type":"string"},"datatype":"string"},"type":"statement","id":"Q140$F7AAEE1F-4D18-4538-99F0-1A2B5AD7269F","rank":"normal"}],"P1417":[{"mainsnak":{"snaktype":"value","property":"P1417","hash":"492d3483075b6915990940a4392f5ec035cbe05e","datavalue":{"value":"animal/lion","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$FE89C38F-6C79-4F06-8C15-81DCAC8D745F","rank":"normal"}],"P244":[{"mainsnak":{"snaktype":"value","property":"P244","hash":"2e41780263804dd45d7deaf7955a2d1d221f6096","datavalue":{"value":"sh85077276","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$634d86d1-45b1-920d-e9ef-78d5f4023288","rank":"normal","references":[{"hash":"88d810dd1ff791aeb0b5779876b0c9f19acb59b6","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c120f07504c77593a9d734f50361ea829f601960","datavalue":{"value":{"entity-type":"item","numeric-id":620946,"id":"Q620946"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"0980c2f2b51e6b2d4c1dd9a77b9fb95dc282bc79","datavalue":{"value":{"time":"+2016-06-01T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P1843":[{"mainsnak":{"snaktype":"value","property":"P1843","hash":"3b1cfb68cc46255ceba7ff7893ac1cabbb4ddd92","datavalue":{"value":{"text":"Lion","language":"en"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","qualifiers":{"P7018":[{"snaktype":"value","property":"P7018","hash":"40a60b39201df345ffbf5aa724269d5fd61ae028","datavalue":{"value":{"entity-type":"sense","id":"L17815-S1"},"type":"wikibase-entityid"},"datatype":"wikibase-sense"}]},"qualifiers-order":["P7018"],"id":"Q140$6E257597-55C7-4AF3-B3D6-0F2204FAD35C","rank":"normal","references":[{"hash":"eada84c58a38325085267509899037535799e978","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a","datavalue":{"value":{"entity-type":"item","numeric-id":32059,"id":"Q32059"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"3e51c3c32949f8a45f2c3331f55ea6ae68ecf3fe","datavalue":{"value":{"time":"+2016-10-21T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]},{"hash":"cdc389b112247cb50b855fb86e98b7a7892e96f0","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"e17975e5c866df46673c91b2287a82cf23d14f5a","datavalue":{"value":{"entity-type":"item","numeric-id":27310853,"id":"Q27310853"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P304":[{"snaktype":"value","property":"P304","hash":"ff7ad3502ff7a4a9b0feeb4248a7bed9767a1ec6","datavalue":{"value":"166","type":"string"},"datatype":"string"}]},"snaks-order":["P248","P304"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"38a9c57a5c62a707adc86decd2bd00be89eab6f3","datavalue":{"value":{"text":"Leeu","language":"af"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$5E731B05-20D6-491B-97E7-94D90CBB70F0","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"a4455f1ef49d7d17896563760a420031c41d65c1","datavalue":{"value":{"text":"Gyata","language":"ak"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$721B4D81-D948-4002-A13E-0B2567626FD6","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"b955c9239d6ced23c0db577e20219b0417a2dd9b","datavalue":{"value":{"text":"Ley\u00f3n","language":"an"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$E2B52F3D-B12D-48B5-86EA-6A4DCBC091D3","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"e18a8ecb17321c203fcf8f402e82558ce0599b39","datavalue":{"value":{"text":"Li\u00f3n","language":"an"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$339ADC90-41C6-4CDB-B6C3-DA9F952FCC15","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"297bf417fff1510d19b27c08fa9f34e2653b9510","datavalue":{"value":{"text":"\u0623\u064e\u0633\u064e\u062f\u064c","language":"ar"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$F1849268-0E70-4EC0-A630-EC0D2DCBB298","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"5577ef6920a3ade2365d878740d1d097fcdae399","datavalue":{"value":{"text":"L\u00e9we","language":"bar"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$BDD65B40-7ECB-4725-B33F-417A83AF5102","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"de8fa35eca4e61dfb8fe2df360e734fb1cd37092","datavalue":{"value":{"text":"L\u00f6we","language":"bar"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$486EE5F1-9AB5-4789-98AC-E435D81E784F","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"246c27f44da8bedd2e3313de393fe648b2b40ea9","datavalue":{"value":{"text":"\u041b\u0435\u045e (Lew)","language":"be"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$47AA6BD4-0B09-4B20-9092-0AEAD8056157","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"64c42db53ef288871161f0a656808f06daae817d","datavalue":{"value":{"text":"\u041b\u044a\u0432 (L\u0103v)","language":"bg"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$ADF0B08A-9626-4821-8118-0A875CBE5FB9","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"6041e2730af3095f4f0cbf331382e22b596d2305","datavalue":{"value":{"text":"\u09b8\u09bf\u0982\u09b9","language":"bn"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$8DF5BDCD-B470-46C3-A44A-7375B8A5DCDE","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"8499f437dc8678b0c4b740b40cab41031fce874d","datavalue":{"value":{"text":"Lle\u00f3","language":"ca"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$F55C3E63-DB2C-4F6D-B10B-4C1BB70C06A0","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"b973abb618a6f17b8a9547b852e5817b5c4da00b","datavalue":{"value":{"text":"\u041b\u043e\u044c\u043c","language":"ce"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$F32B0BFA-3B85-4A26-A888-78FD8F09F943","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"62f53c7229efad1620a5cce4dc5a535d88c4989f","datavalue":{"value":{"text":"Lev","language":"cs"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$1630DAB7-C4D0-4268-A598-8BBB9480221E","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"0df7e23666c947b42aea5572a9f5a987229718d3","datavalue":{"value":{"text":"Llew","language":"cy"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$F33991E8-A532-47F5-B135-A13761DB2E95","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"14942ad0830a0eb7b06704234eea637f99b53a24","datavalue":{"value":{"text":"L\u00f8ve","language":"da"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$478F0603-640A-44BE-9453-700FDD32100F","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"8af089542ef6207b918f656bcf9a96e745970915","datavalue":{"value":{"text":"L\u00f6we","language":"de"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","qualifiers":{"P7018":[{"snaktype":"value","property":"P7018","hash":"2da239e18a0208847a72fbeab011c8c2fb3b4d99","datavalue":{"value":{"entity-type":"sense","id":"L41680-S1"},"type":"wikibase-entityid"},"datatype":"wikibase-sense"}]},"qualifiers-order":["P7018"],"id":"Q140$11F5F498-3688-4F4B-B2FA-7121BE5AA701","rank":"normal","references":[{"hash":"cdc389b112247cb50b855fb86e98b7a7892e96f0","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"e17975e5c866df46673c91b2287a82cf23d14f5a","datavalue":{"value":{"entity-type":"item","numeric-id":27310853,"id":"Q27310853"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P304":[{"snaktype":"value","property":"P304","hash":"ff7ad3502ff7a4a9b0feeb4248a7bed9767a1ec6","datavalue":{"value":"166","type":"string"},"datatype":"string"}]},"snaks-order":["P248","P304"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"c0c8b50001810c1ec643b88479df82ea85c819a2","datavalue":{"value":{"text":"Dzata","language":"ee"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$8F6EC307-A293-4AFC-8154-E3FF187C0D7D","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"57a3384eeb13d1bcffeb3cf0efd0f3e3f511b35d","datavalue":{"value":{"text":"\u039b\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9 (Liond\u00e1ri)","language":"el"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$560B3341-3E06-4D09-8869-FC47C841D14C","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"ee7109a46f8259ae6f52791cfe599b7c4c272831","datavalue":{"value":{"text":"Leono","language":"eo"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$67F2B7A6-1C81-407A-AA61-A1BFF148EC69","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"3b8f4f61c3a18792bfaff5d332f03c80932dce05","datavalue":{"value":{"text":"Le\u00f3n","language":"es"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$DB29EAF7-4405-4030-8056-ED17089B3805","rank":"normal","references":[{"hash":"d3a8e536300044db1d823eae6891b2c7baa49f66","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a","datavalue":{"value":{"entity-type":"item","numeric-id":32059,"id":"Q32059"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"620d2e76d21bb1d326fc360db5bece2070115240","datavalue":{"value":{"time":"+2016-10-19T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"41fffb83f35736829d60f782bdce68463f0ab47c","datavalue":{"value":{"text":"L\u00f5vi","language":"et"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$19B76CC4-AA11-443B-BC76-DB2D0DA5B9CB","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"b96549e5ae538fb7e0b48089508333b31aec8fe7","datavalue":{"value":{"text":"Lehoi","language":"eu"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$88F712C1-4EEF-4E42-8C61-84E55CF2DCE0","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"b343c833d8de3dfd5c8b31336afd137380ab42dc","datavalue":{"value":{"text":"\u0634\u06cc\u0631 (\u0160ayr)","language":"fa"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$B72DB989-EF39-42F5-8FA8-5FC669079DB7","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"51aaf9a4a7c5e77ba931a5280d1fec984c91963b","datavalue":{"value":{"text":"Leijona","language":"fi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$6861CDE9-707D-43AD-B352-3BCD7B9D4267","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"038249fb112acc26895af45fab412395f999ae11","datavalue":{"value":{"text":"Leyva","language":"fo"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$A044100A-C49F-4AA6-8861-F0300F28126E","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"92ec25b64605d026b07b0cda6e623fbbf2f3dfb4","datavalue":{"value":{"text":"Lion","language":"fr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$122623FD-3915-49E9-8890-0B6883317507","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"59be091f7839e7a6061c6d1690ed77f3b21b9ff4","datavalue":{"value":{"text":"L\u00f6\u00f6w","language":"frr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$76B87E52-A02C-4E99-A4B3-D6105B642521","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"126b0f2c5ed11124233dfefff8bd132a1fe1218a","datavalue":{"value":{"text":"Le\u00f3n-leoa","language":"gl"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$A4864784-EED3-4898-83FE-A2FCC0C3982E","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"49e0d3858de566edce1a28b0e96f42b2d0df718f","datavalue":{"value":{"text":"\u0ab8\u0abf\u0a82\u0ab9","language":"gu"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$4EE122CE-7671-480E-86A4-4A4DDABC04BA","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"dff0c422f7403c50d28dd51ca2989d03108b7584","datavalue":{"value":{"text":"Liona","language":"haw"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$FBB6AC65-A224-4C29-8024-079C0687E9FB","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"c174addd56c0f42f6ec3e87c72fb9651e4923a00","datavalue":{"value":{"text":"\u05d0\u05e8\u05d9\u05d4","language":"he"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$B72D9BDB-A2CC-471D-AF20-8F7FB677D533","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"c38a63a06b569fc8fee3e98c4cf8d5501990811e","datavalue":{"value":{"text":"si\u1e45ha)","language":"hi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$9AA9171C-E912-41F2-AB26-643AA538E644","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"94f073519a5b64c48398c73a5f0f135a4f0f4306","datavalue":{"value":{"text":"\u0936\u0947\u0930","language":"hi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$0714B97B-03E0-4ACC-80A0-6A17874DDBA8","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"1fbda5b1494db298c698fc28ed0fe68b1c137b2e","datavalue":{"value":{"text":"\u0938\u093f\u0902\u0939","language":"hi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$3CE22F68-038C-4A94-9A1F-96B82760DEB9","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"fac41ebd8d1da777acd93720267c7a70016156e4","datavalue":{"value":{"text":"Lav","language":"hr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$C5351C11-E287-4D3B-A9B2-56716F0E69E5","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"71e0bda709fb17d58f4bd8e12fff7f937a61673c","datavalue":{"value":{"text":"Oroszl\u00e1n","language":"hu"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$AD06E7D2-3B1F-4D14-B2E9-DD2513BE8B4B","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"05e86680d70a2c0adf9a6e6eb51bbdf8c6ae44bc","datavalue":{"value":{"text":"\u0531\u057c\u0575\u0578\u0582\u056e","language":"hy"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$3E02B802-8F7B-4C48-A3F9-FBBFDB0D8DB3","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"979f25bee6af37e19471530c6344a0d22a0d594c","datavalue":{"value":{"text":"Lj\u00f3n","language":"is"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$59788C31-A354-4229-AD89-361CB6076EF7","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"789e5f5a7ec6003076bc7fd2996faf8ca8468719","datavalue":{"value":{"text":"Leone","language":"it"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$4901AE59-7749-43D1-BC65-DEEC0DFEB72F","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"4a5bdf9bb40f1cab9a92b7dba1d1d74a8440c7ed","datavalue":{"value":{"text":"\u30e9\u30a4\u30aa\u30f3 (Raion)","language":"ja"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$4CF2E0D9-5CF3-46A3-A197-938E94270CE2","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"ebba3893211c78dad7ae74a51448e8c7f6e73309","datavalue":{"value":{"text":"\uc0ac\uc790 (saja)","language":"ko"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$64B6CECD-5FFE-4612-819F-CAB2E726B228","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"ed1fe1812cee80102262dd3b7e170759fbeab86a","datavalue":{"value":{"text":"\u0410\u0440\u0441\u0442\u0430\u043d","language":"ky"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$3D9597D3-E35F-4EFF-9CAF-E013B45F283F","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"a0868f5f83bb886a408aa9b25b95dbfc59bde4dc","datavalue":{"value":{"text":"Leo","language":"la"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$4D650414-6AFE-430F-892F-B7774AC7AF70","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"054af77b10151632045612df9b96313dfcc3550c","datavalue":{"value":{"text":"Liew","language":"li"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$D5B466A8-AEFB-4083-BF3E-194C5CE45CD3","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"9193a46891a365ee1b0a17dd6e2591babc642811","datavalue":{"value":{"text":"Nkosi","language":"ln"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$55F213DF-5AAB-4490-83CB-B9E5D2B894CD","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"c5952ec6b650f1c66f37194eb88c2889560740b2","datavalue":{"value":{"text":"Li\u016btas","language":"lt"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$8551F80C-A244-4351-A98A-8A9F37A736A2","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"e3541d0807682631f8fff2d224b2cb1b3d2a4c11","datavalue":{"value":{"text":"Lauva","language":"lv"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$488A2D59-533A-4C02-8AC3-01241FE63D94","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"22e20da399aff10787267691b5211b6fc0bddf38","datavalue":{"value":{"text":"\u041b\u0430\u0432 (lav)","language":"mk"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$9E2377E9-1D37-4BBC-A409-1C40CDD99A86","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"fe4c9bc3b3cce21a779f72fae808f8ed213d226b","datavalue":{"value":{"text":"\u0d38\u0d3f\u0d02\u0d39\u0d02 (simham)","language":"ml"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$8BEA9E08-4687-434A-9FB4-4B23B2C40838","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"85aa09066722caf2181681a24575ad89ca76210e","datavalue":{"value":{"text":"si\u1e45ha)","language":"mr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$46B51EF5-7ADB-4637-B744-89AD1E3B5D19","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"441f3832d6e3c4439c6986075096c7021a0939dd","datavalue":{"value":{"text":"\u0936\u0947\u0930 (\u015a\u0113ra)","language":"mr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$12BBC825-32E3-4026-A5E5-0330DEB21D79","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"89b35a359c3891dce190d778e9ae0a9634cfd71f","datavalue":{"value":{"text":"\u0938\u093f\u0902\u0939 (singh","language":"mr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$006148E2-658F-4C74-9C3E-26488B7AEB8D","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"5723b45deee51dfe5a2555f2db17bad14acb298a","datavalue":{"value":{"text":"Iljun","language":"mt"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$13D221F5-9763-4550-9CC3-9A697286B785","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"d1ce3ab04f25af38248152eb8caa286b63366c2a","datavalue":{"value":{"text":"Leeuw","language":"nl"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$65E80D17-6F20-4BAE-A2B4-DD934C0BE153","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"12f3384cc32e65dfb501e2fee19ccf709f9df757","datavalue":{"value":{"text":"L\u00f8ve","language":"nn"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$78E95514-1969-4DA3-97CD-0DBADF1223E7","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"a3fedaf780a0d004ba318881f6adbe173750d09e","datavalue":{"value":{"text":"L\u00f8ve","language":"nb"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$809DE1EA-861E-4813-BED7-D9C465341CB3","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"695d2ef10540ba13cf8b3541daa1d39fd720eea0","datavalue":{"value":{"text":"N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed","language":"nv"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$E9EDAF16-6650-40ED-B888-C524BD00DF40","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"3c143e8a8cebf92d76d3ae2d7e3bb3f87e963fb4","datavalue":{"value":{"text":"\u0a2c\u0a71\u0a2c\u0a30 \u0a38\u0a3c\u0a47\u0a30","language":"pa"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$13AE1DAB-4B29-49A5-9893-C0014C61D21E","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"195e48d11222aec830fb1d5c2de898c9528abc57","datavalue":{"value":{"text":"lew afryka\u0144ski","language":"pl"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$6966C1C3-9DD6-48BC-B511-B0827642E41D","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"8bd3ae632e7731ae9e72c50744383006ec6eb73e","datavalue":{"value":{"text":"Le\u00e3o","language":"pt"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$BD454649-347E-4AE5-81B8-360C16C7CDA7","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"79d3336733b7bf4b7dadffd6d6ebabdb892074d1","datavalue":{"value":{"text":"Leu","language":"ro"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$7323EF68-7AA0-4D38-82D8-0A94E61A26F0","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"376b852a92b6472e969ae7b995c4aacea23955eb","datavalue":{"value":{"text":"\u041b\u0435\u0432 (Lev)","language":"ru"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$A7C413B9-0916-4534-941D-C24BA0334816","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"aa323e0bea79d79900227699b3d42d689a772ca1","datavalue":{"value":{"text":"Lioni","language":"sc"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$2EF83D2C-0DB9-4D3C-8FDD-86237E566260","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"a290fe08983742eac8b5bc479022564fb6b2ce81","datavalue":{"value":{"text":"Lev","language":"sl"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$B276673A-08C1-47E2-99A9-D0861321E157","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"d3b070ff1452d47f87c109a9e0bfa52e61b24a4e","datavalue":{"value":{"text":"Libubesi","language":"ss"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$86BFAB38-1DB8-4903-A17D-A6B8E81819CC","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"3adea59d97f3caf9bb6b1c3d7ae6365f7f656dca","datavalue":{"value":{"text":"Tau","language":"st"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$2FA8893D-2401-42E9-8DC3-288CC1DEDB0C","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"0e73b32fe31a107a95de83706a12f2db419c6909","datavalue":{"value":{"text":"Lejon","language":"sv"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$1A8E006E-CC7B-4066-9DE7-9B82D096779E","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"34550af2fdc48f77cf66cabc5c59d1acf1d8afd0","datavalue":{"value":{"text":"Simba","language":"sw"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$B02CA616-44CF-4AA6-9734-2C05810131EB","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"701f87cf9926c9af2c41434ff130dcb234a6cd95","datavalue":{"value":{"text":"\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd","language":"ta"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$DA87A994-A002-45AD-A71F-99FB72F8B92F","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"856fd4809c90e3c34c6876e4410661dc04f5da8d","datavalue":{"value":{"text":"\u0e2a\u0e34\u0e07\u0e42\u0e15","language":"th"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$BDA8E989-3537-4662-8CC3-33534705A7F1","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"f8598a8369426da0c86bf8bab356a927487eae66","datavalue":{"value":{"text":"Aslan","language":"tr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$AAE5F227-C0DB-4DF3-B1F4-517699BBDDF1","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"f3c8320bd46913aee164999ab7f68388c1bd9920","datavalue":{"value":{"text":"\u041b\u0435\u0432 (Lev)","language":"uk"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$494C3503-6016-4539-83AF-6344173C2DCB","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"6cc2d534293320533e15dc713f1d2c07b3811b6a","datavalue":{"value":{"text":"Leon","language":"vec"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$E6F1DA81-9F36-4CC8-B57E-95E3BDC2F5D0","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"32553481e45abf6f5e6292baea486e978c36f8fe","datavalue":{"value":{"text":"S\u01b0 t\u1eed","language":"vi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$11D7996C-0492-41CC-AEE7-3C136172DFC7","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"69077fc29f9251d1de124cd3f3c45cd6f0bb6b65","datavalue":{"value":{"text":"\u05dc\u05d9\u05d9\u05d1","language":"yi"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$969FEF9A-C1C7-41FE-8181-07F6D87B0346","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"e3aaa8cde18be4ea6b4af6ca62b83e7dc23d76e1","datavalue":{"value":{"text":"\u72ee\u5b50 (sh\u012bzi)","language":"zh"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$3BC22F6C-F460-4354-9BA2-28CEDA9FF170","rank":"normal","references":[{"hash":"2e0c13df5b13edc9b3db9d8129e466c0894710ac","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"2b1e96d67dc01973d72472f712fd98ce87c6f0d7","datavalue":{"value":{"entity-type":"item","numeric-id":13679,"id":"Q13679"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"98f5efae94b2bb9f8ffee6c677ee71f836743ef6","datavalue":{"value":{"text":"Lion d'Afrique","language":"fr"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$62D09BBF-718A-4139-AF50-DA4185ED67F2","rank":"normal","references":[{"hash":"362e3c5d6de1d193ef97205ba38834ba075191fc","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a","datavalue":{"value":{"entity-type":"item","numeric-id":32059,"id":"Q32059"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"c7813bad20c2553e26e45c37e3502ce7252312df","datavalue":{"value":{"time":"+2016-10-20T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"c584bdbd3cdc1215292a4971b920c684d103ea06","datavalue":{"value":{"text":"African Lion","language":"en"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$C871BB58-C689-4DBA-A088-DAC205377979","rank":"normal","references":[{"hash":"eada84c58a38325085267509899037535799e978","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a","datavalue":{"value":{"entity-type":"item","numeric-id":32059,"id":"Q32059"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"3e51c3c32949f8a45f2c3331f55ea6ae68ecf3fe","datavalue":{"value":{"time":"+2016-10-21T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"1d03eace9366816c6fda340c0390caac2f3cea8e","datavalue":{"value":{"text":"L\u00e9iw","language":"lb"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$c65c7614-4d6e-3a87-9771-4f8c13618249","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"925c7abced1e89fa7e8000dc9dc78627cdac9769","datavalue":{"value":{"text":"Lle\u00f3n","language":"ast"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$1024eadb-45dd-7d9a-15f6-8602946ba661","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"0bda7868c3f498ba6fde78d46d0fbcf286e42dd8","datavalue":{"value":{"text":"\u0644\u064e\u064a\u0652\u062b\u064c","language":"ar"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$c226ff70-48dd-7b4d-00ff-7a683fe510aa","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"28de99c4aa35cc049cf8c9dd18af1791944137d9","datavalue":{"value":{"text":"\u10da\u10dd\u10db\u10d8","language":"ka"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$8fe60d1a-465a-9614-cbe4-595e22429b0c","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"4550db0f44e21c5eadeaa5a1d8fc614c9eb05f52","datavalue":{"value":{"text":"leon","language":"ga"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$4950cb9c-4f1e-ce27-0d8c-ba3f18096044","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1843","hash":"9d268eb76ed921352c205b3f890d1f9428f638f3","datavalue":{"value":{"text":"Singa","language":"ms"},"type":"monolingualtext"},"datatype":"monolingualtext"},"type":"statement","id":"Q140$67401360-49dd-b13c-8269-e703b30c9a53","rank":"normal"}],"P627":[{"mainsnak":{"snaktype":"value","property":"P627","hash":"3642ac96e05180279c47a035c129d3af38d85027","datavalue":{"value":"15951","type":"string"},"datatype":"string"},"type":"statement","id":"Q140$6BE03095-BC68-4CE5-BB99-9F3E33A6F31D","rank":"normal","references":[{"hash":"182efbdb9110d036ca433f3b49bd3a1ae312858b","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"ba14d022d7e0c8b74595e7b8aaa1bc2451dd806a","datavalue":{"value":{"entity-type":"item","numeric-id":32059,"id":"Q32059"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"8c1c5174f4811115ea8a0def725fdc074c2ef036","datavalue":{"value":{"time":"+2016-07-10T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P2833":[{"mainsnak":{"snaktype":"value","property":"P2833","hash":"519877b77b20416af2401e5c0645954c6700d6fd","datavalue":{"value":"panthera-leo","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$C0A723AE-ED2E-4FDC-827F-496E4CF29A52","rank":"normal"}],"P3063":[{"mainsnak":{"snaktype":"value","property":"P3063","hash":"81cdb0273eaf0a0126b62e2ff43b8e09505eea54","datavalue":{"value":{"amount":"+108","unit":"http://www.wikidata.org/entity/Q573","upperBound":"+116","lowerBound":"+100"},"type":"quantity"},"datatype":"quantity"},"type":"statement","id":"Q140$878ff87d-40d0-bb2b-c83d-4cef682c2687","rank":"normal","references":[{"hash":"7d748004a43983fabae420123742fda0e9b52840","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"f618501ace3a6524b053661d067b775547f96f58","datavalue":{"value":{"entity-type":"item","numeric-id":26706243,"id":"Q26706243"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P478":[{"snaktype":"value","property":"P478","hash":"ca3c5e6054c169ee3d0dfaf660f3eecd77942070","datavalue":{"value":"4","type":"string"},"datatype":"string"}],"P304":[{"snaktype":"value","property":"P304","hash":"dd1977567f22f4cf510adfaadf5e3574813b3521","datavalue":{"value":"46","type":"string"},"datatype":"string"}]},"snaks-order":["P248","P478","P304"]}]}],"P3031":[{"mainsnak":{"snaktype":"value","property":"P3031","hash":"e6271e8d12b20c9735d2bbd80eed58581059bf3a","datavalue":{"value":"PNTHLE","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$65AD2857-AB65-4CC0-9AB9-9D6C924784FE","rank":"normal"}],"P3151":[{"mainsnak":{"snaktype":"value","property":"P3151","hash":"e85e5599d303d9a6bb360f3133fb69a76d98d0e2","datavalue":{"value":"41964","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$15D7A4EB-F0A3-4C61-8D2B-E557D7BF5CF7","rank":"normal"}],"P3186":[{"mainsnak":{"snaktype":"value","property":"P3186","hash":"85ec7843064210afdfef6ec565a47f229c6d15e5","datavalue":{"value":"644245","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$6903E136-2DB2-42C9-98CB-82F61208FDAD","rank":"normal","references":[{"hash":"5790a745e549ea7e4e6d7ca467148b544529ba96","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"c897ca3efd1604ef7b80a14ac0d2b8d6849c0856","datavalue":{"value":{"entity-type":"item","numeric-id":26936509,"id":"Q26936509"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"555ca5385c445e4fd4762281d4873682eff2ce30","datavalue":{"value":{"time":"+2016-09-24T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]},{"hash":"3edd37192f877cad0ff97acc3db56ef2cc83945b","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4f7c4fd187630ba8cbb174c2756113983df4ce82","datavalue":{"value":{"entity-type":"item","numeric-id":45029859,"id":"Q45029859"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"56b6aa0388c9a2711946589902bc195718bb0675","datavalue":{"value":{"time":"+2017-12-26T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]},{"hash":"1318ed8ea451b84fe98461305665d8688603bab3","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"0fbeeecce08896108ed797d8ec22c7c10a6015e2","datavalue":{"value":{"entity-type":"item","numeric-id":45029998,"id":"Q45029998"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"4bac1c0d2ffc45d91b51fc0881eb6bcc7916e854","datavalue":{"value":{"time":"+2018-01-02T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]},{"hash":"6f761664a6f331d95bbaa1434447d82afd597a93","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"6c09d1d89e83bd0dfa6c94e01d24a9a47489d83e","datavalue":{"value":{"entity-type":"item","numeric-id":58035056,"id":"Q58035056"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"03182012ca72fcd757b8a1fe05ba927cbe9ef374","datavalue":{"value":{"time":"+2018-11-02T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P3485":[{"mainsnak":{"snaktype":"value","property":"P3485","hash":"df4e58fc2a196833ab3e33483099e2481e61ba9e","datavalue":{"value":{"amount":"+112","unit":"1"},"type":"quantity"},"datatype":"quantity"},"type":"statement","id":"Q140$4B70AA09-AE2F-4F4C-9BAF-09890CDA11B8","rank":"normal","references":[{"hash":"fa278ebfc458360e5aed63d5058cca83c46134f1","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"e4f6d9441d0600513c4533c672b5ab472dc73694","datavalue":{"value":{"entity-type":"item","numeric-id":328,"id":"Q328"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]}],"P3827":[{"mainsnak":{"snaktype":"value","property":"P3827","hash":"6bb26d581721d7330c407259d46ab5e25cc4a6b1","datavalue":{"value":"lions","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$CCDE6F7D-B4EA-4875-A4D6-5649ACFA8E2F","rank":"normal"}],"P268":[{"mainsnak":{"snaktype":"value","property":"P268","hash":"a20cdf81e39cd47f4da30073671792380029924c","datavalue":{"value":"11932251d","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$000FDB77-C70C-4464-9F00-605787964BBA","rank":"normal","references":[{"hash":"d4bd87b862b12d99d26e86472d44f26858dee639","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"f30cbd35620c4ea6d0633aaf0210a8916130469b","datavalue":{"value":{"entity-type":"item","numeric-id":8447,"id":"Q8447"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]}],"P3417":[{"mainsnak":{"snaktype":"value","property":"P3417","hash":"e3b5d21350aef37f27ad8b24142d6b83d9eec0a6","datavalue":{"value":"Lions","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$1f96d096-4e4b-06de-740f-7b7215e5ae3f","rank":"normal"}],"P4024":[{"mainsnak":{"snaktype":"value","property":"P4024","hash":"a698e7dcd6f9b0b00ee8e02846c668db83064833","datavalue":{"value":"Panthera_leo","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$F5DC21E8-BF52-4A0D-9A15-63B89297BD70","rank":"normal","references":[{"hash":"d4bd87b862b12d99d26e86472d44f26858dee639","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"f30cbd35620c4ea6d0633aaf0210a8916130469b","datavalue":{"value":{"entity-type":"item","numeric-id":8447,"id":"Q8447"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]}],"P1225":[{"mainsnak":{"snaktype":"value","property":"P1225","hash":"9af40267f10f15926877e9a3f78faeab7b0dda82","datavalue":{"value":"10665610","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$268074ED-3CD7-46C9-A8FF-8C3679C45547","rank":"normal"}],"P4728":[{"mainsnak":{"snaktype":"value","property":"P4728","hash":"37eafa980604019b327b1a3552313fb7ae256697","datavalue":{"value":"105514","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$50C24ECC-C42C-4A58-8F34-6AF0AC6C4EFE","rank":"normal","references":[{"hash":"d4bd87b862b12d99d26e86472d44f26858dee639","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"f30cbd35620c4ea6d0633aaf0210a8916130469b","datavalue":{"value":{"entity-type":"item","numeric-id":8447,"id":"Q8447"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]}],"P3219":[{"mainsnak":{"snaktype":"value","property":"P3219","hash":"dedb8825588940caff5a34d04a0e69af296f05dd","datavalue":{"value":"lion","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$2A5A2CA3-AB6E-4F68-927F-042D1BD22915","rank":"normal"}],"P1343":[{"mainsnak":{"snaktype":"value","property":"P1343","hash":"5b0ef3d5413cd39d887fbe70d2d3b3f4a94ea9d8","datavalue":{"value":{"entity-type":"item","numeric-id":1138524,"id":"Q1138524"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"f7bf629d348040dd1a59dc5a3199edb50279e8f5","datavalue":{"value":{"entity-type":"item","numeric-id":19997008,"id":"Q19997008"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$DFE4D4B0-0D84-41F2-B448-4A81AC982927","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"6bc15c6f82feca4f3b173c90209a416f99464cac","datavalue":{"value":{"entity-type":"item","numeric-id":4086271,"id":"Q4086271"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"69ace59e966574e4ffb454d26940a58fb45ed7de","datavalue":{"value":{"entity-type":"item","numeric-id":25295952,"id":"Q25295952"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$b82b0461-4ff0-10ac-9825-d4b95fc7a85a","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"ecb04d74140f2ee856c06658b03ec90a21c2edf2","datavalue":{"value":{"entity-type":"item","numeric-id":1970746,"id":"Q1970746"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"169607f1510535f3e1c5e7debce48d1903510f74","datavalue":{"value":{"entity-type":"item","numeric-id":30202801,"id":"Q30202801"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$bd49e319-477f-0cd2-a404-642156321081","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"88389772f86dcd7d415ddd029f601412e5cc894a","datavalue":{"value":{"entity-type":"item","numeric-id":602358,"id":"Q602358"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"67f2e59eb3f6480bdbaa3954055dfbf8fd045bc4","datavalue":{"value":{"entity-type":"item","numeric-id":24451091,"id":"Q24451091"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$906ae22e-4c63-d325-c91e-dc3ee6b7504d","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"42346dfe9209b7359c1f5db829a368b38d407797","datavalue":{"value":{"entity-type":"item","numeric-id":19180675,"id":"Q19180675"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"195bd04166c04364a657fcd18abd1a082dad3cb0","datavalue":{"value":{"entity-type":"item","numeric-id":24758519,"id":"Q24758519"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$92e7eeb1-4a72-9abf-4260-a96abc32bc42","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"7d6f86cef085693a10b0e0663a0960f58d0e15e2","datavalue":{"value":{"entity-type":"item","numeric-id":4173137,"id":"Q4173137"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"75e5bdfbbf8498b195840749ef3a9bd309b796f7","datavalue":{"value":{"entity-type":"item","numeric-id":25054587,"id":"Q25054587"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$6c9c319a-4e71-540e-8866-a6017f0e6bae","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"75dd89e79770a3e631dbba27144940f8f1bc1773","datavalue":{"value":{"entity-type":"item","numeric-id":1768721,"id":"Q1768721"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"a1b448ff5f8818a2254835e0816a03a785bac665","datavalue":{"value":{"entity-type":"item","numeric-id":96599885,"id":"Q96599885"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$A0FD93F4-A401-47A1-BC8E-F0D35A8E8BAD","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"4cfd4eb1fe49d401455df557a7d9b1154f22a725","datavalue":{"value":{"entity-type":"item","numeric-id":3181656,"id":"Q3181656"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P1932":[{"snaktype":"value","property":"P1932","hash":"a3f6e8ce10c4527693415dbc99b5ea285b2f411c","datavalue":{"value":"Lion, The","type":"string"},"datatype":"string"}]},"qualifiers-order":["P1932"],"id":"Q140$100f480e-4ad9-b340-8251-4e875d00315d","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"d5011798f92464584d8ccfc5f19f18f3659668bb","datavalue":{"value":{"entity-type":"item","numeric-id":106727050,"id":"Q106727050"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P1810":[{"snaktype":"value","property":"P1810","hash":"7d78547303d5e9e014a7c8cef6072faee91088ce","datavalue":{"value":"Lions","type":"string"},"datatype":"string"}],"P585":[{"snaktype":"value","property":"P585","hash":"ffb837135313cad3b2545c4b9ce5ee416deda3e2","datavalue":{"value":{"time":"+2021-05-07T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"qualifiers-order":["P1810","P585"],"id":"Q140$A4D208BD-6A69-4561-B402-2E17AAE6E028","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P1343","hash":"d12a9ecb0df8fce076df898533fea0339e5881bd","datavalue":{"value":{"entity-type":"item","numeric-id":10886720,"id":"Q10886720"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P805":[{"snaktype":"value","property":"P805","hash":"52ddab8de77b01303d508a1de615ca13060ec188","datavalue":{"value":{"entity-type":"item","numeric-id":107513600,"id":"Q107513600"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P805"],"id":"Q140$07daf548-4c8d-fa7c-16f4-4c7062f7e48a","rank":"normal"}],"P4733":[{"mainsnak":{"snaktype":"value","property":"P4733","hash":"fc789f67f6d4d9b5879a8631eefe61f51a60f979","datavalue":{"value":{"entity-type":"item","numeric-id":3177438,"id":"Q3177438"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$3773ba15-4723-261a-f9a8-544496938efa","rank":"normal","references":[{"hash":"649ae5511d5389d870d19e83543fa435de796536","snaks":{"P143":[{"snaktype":"value","property":"P143","hash":"9931bb1a17358e94590f8fa0b9550de881616d97","datavalue":{"value":{"entity-type":"item","numeric-id":784031,"id":"Q784031"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P143"]}]}],"P5019":[{"mainsnak":{"snaktype":"value","property":"P5019","hash":"44aac3d8a2bd240b4bc81741a0980dc48781181b","datavalue":{"value":"l\u00f6we","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$2be40b22-49f1-c9e7-1812-8e3fd69d662d","rank":"normal"}],"P2924":[{"mainsnak":{"snaktype":"value","property":"P2924","hash":"710d75c07e28936461d03b20b2fc7455599301a1","datavalue":{"value":"2135124","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$6326B120-CE04-4F02-94CA-D7BBC2589A39","rank":"normal"}],"P5055":[{"mainsnak":{"snaktype":"value","property":"P5055","hash":"c5264fc372b7e66566d54d73f86c8ab8c43fb033","datavalue":{"value":"10196306","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$F8D43B92-CC3A-4967-A28F-C3E6308946F6","rank":"normal","references":[{"hash":"7131076724beb97fed351cb7e7f6ac6d61dd05b9","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"1e3ad3cb9e0170e28b7c7c335fba55cafa6ef789","datavalue":{"value":{"entity-type":"item","numeric-id":51885189,"id":"Q51885189"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"2b1446fcfcd471ab6d36521b4ad2ac183ff8bc0d","datavalue":{"value":{"time":"+2018-06-07T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P5221":[{"mainsnak":{"snaktype":"value","property":"P5221","hash":"623ca9614dd0d8b8720bf35b4d57be91dcef5fe6","datavalue":{"value":"123566","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$472fe544-402d-2574-6b2e-98c5b01bb294","rank":"normal"}],"P5698":[{"mainsnak":{"snaktype":"value","property":"P5698","hash":"e966694183143d709403fae7baabb5fdf98d219a","datavalue":{"value":"70719","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$EF3F712D-B0E5-4151-81E4-67804D6241E6","rank":"normal"}],"P5397":[{"mainsnak":{"snaktype":"value","property":"P5397","hash":"49a827bc1853a3b5612b437dd61eb5c28dc0bab0","datavalue":{"value":"12799","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$DE37BF10-A59D-48F1-926A-7303EDEEDDD0","rank":"normal"}],"P6033":[{"mainsnak":{"snaktype":"value","property":"P6033","hash":"766727ded3adbbfec0bed77affc89ea4e5214d65","datavalue":{"value":"panthera-leo","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$A27BADCC-0F72-45A5-814B-BDE62BD7A1B4","rank":"normal"}],"P18":[{"mainsnak":{"snaktype":"value","property":"P18","hash":"d3ceb5bb683335c91781e4d52906d2fb1cc0c35d","datavalue":{"value":"Lion waiting in Namibia.jpg","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P21":[{"snaktype":"value","property":"P21","hash":"0576a008261e5b2544d1ff3328c94bd529379536","datavalue":{"value":{"entity-type":"item","numeric-id":44148,"id":"Q44148"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P2096":[{"snaktype":"value","property":"P2096","hash":"6923fafa02794ae7d0773e565de7dd49a2694b38","datavalue":{"value":{"text":"Lle\u00f3","language":"ca"},"type":"monolingualtext"},"datatype":"monolingualtext"},{"snaktype":"value","property":"P2096","hash":"563784f05211416fda8662a0773f52165ccf6c2a","datavalue":{"value":{"text":"Machu de lle\u00f3n en Namibia","language":"ast"},"type":"monolingualtext"},"datatype":"monolingualtext"},{"snaktype":"value","property":"P2096","hash":"52722803d98964d77b79d3ed62bd24b4f25e6993","datavalue":{"value":{"text":"\u043b\u044a\u0432","language":"bg"},"type":"monolingualtext"},"datatype":"monolingualtext"}]},"qualifiers-order":["P21","P2096"],"id":"q140$5903FDF3-DBBD-4527-A738-450EAEAA45CB","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P18","hash":"6907d4c168377a18d6a5eb390ab32a7da42d8218","datavalue":{"value":"Okonjima Lioness.jpg","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P21":[{"snaktype":"value","property":"P21","hash":"a274865baccd3ff04c28d5ffdcc12e0079f5a201","datavalue":{"value":{"entity-type":"item","numeric-id":43445,"id":"Q43445"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P2096":[{"snaktype":"value","property":"P2096","hash":"a9d1363e8fc83ba822c45a81de59fe5b8eb434cf","datavalue":{"value":{"text":"\u043b\u044a\u0432\u0438\u0446\u0430","language":"bg"},"type":"monolingualtext"},"datatype":"monolingualtext"},{"snaktype":"value","property":"P2096","hash":"b36ab7371664b7b62ee7be65db4e248074a5330c","datavalue":{"value":{"text":"Lleona n'Okonjima Lodge, Namibia","language":"ast"},"type":"monolingualtext"},"datatype":"monolingualtext"},{"snaktype":"value","property":"P2096","hash":"31c78a574eabc0426d7984aa4988752e35b71f0c","datavalue":{"value":{"text":"lwica","language":"pl"},"type":"monolingualtext"},"datatype":"monolingualtext"}]},"qualifiers-order":["P21","P2096"],"id":"Q140$4da15225-f7dc-4942-a685-0669e5d3af14","rank":"normal"}],"P6573":[{"mainsnak":{"snaktype":"value","property":"P6573","hash":"c27b457b12eeecb053d60af6ecf9b0baa133bef5","datavalue":{"value":"L\u00f6we","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$45B1C3EB-E335-4245-A193-8C48B4953E51","rank":"normal"}],"P443":[{"mainsnak":{"snaktype":"value","property":"P443","hash":"8a9afb9293804f976c415060900bf9afbc2cfdff","datavalue":{"value":"LL-Q188 (deu)-Sebastian Wallroth-L\u00f6we.wav","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P407":[{"snaktype":"value","property":"P407","hash":"46bfd327b830f66f7061ea92d1be430c135fa91f","datavalue":{"value":{"entity-type":"item","numeric-id":188,"id":"Q188"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P407"],"id":"Q140$5EC64299-429F-45E8-B18F-19325401189C","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P443","hash":"7d058dfd1e8a41f026974faec3dc0588e29c6854","datavalue":{"value":"LL-Q150 (fra)-Ash Crow-lion.wav","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P407":[{"snaktype":"value","property":"P407","hash":"d197d0a5efa4b4c23a302a829dd3ef43684fe002","datavalue":{"value":{"entity-type":"item","numeric-id":150,"id":"Q150"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P407"],"id":"Q140$A4575261-6577-4EF6-A0C9-DA5FA523D1C2","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P443","hash":"79b9f51c9b4eec305813d5bb697b403d798cf1c5","datavalue":{"value":"LL-Q33965 (sat)-Joy sagar Murmu-\u1c60\u1c69\u1c5e.wav","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P407":[{"snaktype":"value","property":"P407","hash":"58ae6998321952889f733126c11c582eeef20e72","datavalue":{"value":{"entity-type":"item","numeric-id":33965,"id":"Q33965"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P407"],"id":"Q140$7eedc8fa-4d1c-7ee9-3c67-0c89ef464d9f","rank":"normal","references":[{"hash":"d0b5c88b6f49dda9160c706291a9b8645825d99c","snaks":{"P854":[{"snaktype":"value","property":"P854","hash":"38c1012cea9eb73cf1bd11eba0c2f745d2463340","datavalue":{"value":"https://lingualibre.org/wiki/Q403065","type":"string"},"datatype":"url"}]},"snaks-order":["P854"]}]}],"P1296":[{"mainsnak":{"snaktype":"value","property":"P1296","hash":"c1f872d4cd22219a7315c0198a83c1918ded97ee","datavalue":{"value":"0120024","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$6C51384B-2EBF-4E6B-9201-A44F0A145C04","rank":"normal"}],"P486":[{"mainsnak":{"snaktype":"value","property":"P486","hash":"b7003b0fb28287301200b6b3871a5437d877913b","datavalue":{"value":"D008045","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$B2F98DD2-B679-43DD-B731-FA33FB1EE4B9","rank":"normal"}],"P989":[{"mainsnak":{"snaktype":"value","property":"P989","hash":"132884b2a696a8b56c8b1460e126f745e2fa6d01","datavalue":{"value":"Ru-Lion (intro).ogg","type":"string"},"datatype":"commonsMedia"},"type":"statement","qualifiers":{"P407":[{"snaktype":"value","property":"P407","hash":"d291ddb7cd77c94a7bd709a8395934147e0864fc","datavalue":{"value":{"entity-type":"item","numeric-id":7737,"id":"Q7737"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P407"],"id":"Q140$857D8831-673B-427E-A182-6A9FFA980424","rank":"normal"}],"P51":[{"mainsnak":{"snaktype":"value","property":"P51","hash":"73b0e8c8458ebc27374fd08d8ef5241f2f28e3e9","datavalue":{"value":"Lion raring-sound1TamilNadu178.ogg","type":"string"},"datatype":"commonsMedia"},"type":"statement","id":"Q140$1c254aff-48b1-d3c5-930c-b360ce6fe043","rank":"normal"}],"P4212":[{"mainsnak":{"snaktype":"value","property":"P4212","hash":"e006ce3295d617a4818dc758c28f444446538019","datavalue":{"value":"pcrt5TAeZsO7W4","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$AD6CD534-1FD2-4AC7-9CF8-9D2B4C46927C","rank":"normal"}],"P2067":[{"mainsnak":{"snaktype":"value","property":"P2067","hash":"97a863433c30b47a6175abb95941d185397ea14a","datavalue":{"value":{"amount":"+1.65","unit":"http://www.wikidata.org/entity/Q11570"},"type":"quantity"},"datatype":"quantity"},"type":"statement","qualifiers":{"P642":[{"snaktype":"value","property":"P642","hash":"f5e24bc6ec443d6cb3678e4561bc298090b54f60","datavalue":{"value":{"entity-type":"item","numeric-id":4128476,"id":"Q4128476"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P642"],"id":"Q140$198da244-7e66-4258-9434-537e9ce0ffab","rank":"normal","references":[{"hash":"94a79329d5eac70f7ddb005e0d1dc78c53e77797","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4a7fef7ea264a7c71765ce60e3d42f4c043c9646","datavalue":{"value":{"entity-type":"item","numeric-id":45106562,"id":"Q45106562"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]},{"mainsnak":{"snaktype":"value","property":"P2067","hash":"ba9933059ce368e3afde1e96d78b1217172c954e","datavalue":{"value":{"amount":"+188","unit":"http://www.wikidata.org/entity/Q11570"},"type":"quantity"},"datatype":"quantity"},"type":"statement","qualifiers":{"P642":[{"snaktype":"value","property":"P642","hash":"b388540fc86300a506b3a753ec58dec445525ffa","datavalue":{"value":{"entity-type":"item","numeric-id":78101716,"id":"Q78101716"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P21":[{"snaktype":"value","property":"P21","hash":"0576a008261e5b2544d1ff3328c94bd529379536","datavalue":{"value":{"entity-type":"item","numeric-id":44148,"id":"Q44148"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P642","P21"],"id":"Q140$a3092626-4295-efb8-bbb6-eed913d02fc7","rank":"normal","references":[{"hash":"94a79329d5eac70f7ddb005e0d1dc78c53e77797","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4a7fef7ea264a7c71765ce60e3d42f4c043c9646","datavalue":{"value":{"entity-type":"item","numeric-id":45106562,"id":"Q45106562"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]},{"mainsnak":{"snaktype":"value","property":"P2067","hash":"6951281811b2a8a3a78044e2003d6c162d5ba1a3","datavalue":{"value":{"amount":"+126","unit":"http://www.wikidata.org/entity/Q11570"},"type":"quantity"},"datatype":"quantity"},"type":"statement","qualifiers":{"P642":[{"snaktype":"value","property":"P642","hash":"b388540fc86300a506b3a753ec58dec445525ffa","datavalue":{"value":{"entity-type":"item","numeric-id":78101716,"id":"Q78101716"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P21":[{"snaktype":"value","property":"P21","hash":"a274865baccd3ff04c28d5ffdcc12e0079f5a201","datavalue":{"value":{"entity-type":"item","numeric-id":43445,"id":"Q43445"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P642","P21"],"id":"Q140$20d80fe2-4796-23d1-42c2-c103546aa874","rank":"normal","references":[{"hash":"94a79329d5eac70f7ddb005e0d1dc78c53e77797","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4a7fef7ea264a7c71765ce60e3d42f4c043c9646","datavalue":{"value":{"entity-type":"item","numeric-id":45106562,"id":"Q45106562"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}],"P7725":[{"mainsnak":{"snaktype":"value","property":"P7725","hash":"e9338e052dfaa9267c2357bec2e167ca625af667","datavalue":{"value":{"amount":"+2.5","unit":"1","upperBound":"+4.0","lowerBound":"+1.0"},"type":"quantity"},"datatype":"quantity"},"type":"statement","id":"Q140$f1f04a23-0d34-484a-9419-78d12958170c","rank":"normal","references":[{"hash":"94a79329d5eac70f7ddb005e0d1dc78c53e77797","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4a7fef7ea264a7c71765ce60e3d42f4c043c9646","datavalue":{"value":{"entity-type":"item","numeric-id":45106562,"id":"Q45106562"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}],"P4214":[{"mainsnak":{"snaktype":"value","property":"P4214","hash":"5a112dbdaed17b1ee3fe7a63b1f978e5fd41008a","datavalue":{"value":{"amount":"+27","unit":"http://www.wikidata.org/entity/Q577"},"type":"quantity"},"datatype":"quantity"},"type":"statement","id":"Q140$ec1ccab2-f506-4c81-9179-4625bbbbbe27","rank":"normal","references":[{"hash":"a8ccf5105b0e2623ae145dd8a9b927c9bd957ddf","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"5b45c23ddb076fe9c5accfe4a4bbd1c24c4c87cb","datavalue":{"value":{"entity-type":"item","numeric-id":83566668,"id":"Q83566668"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}],"P7862":[{"mainsnak":{"snaktype":"value","property":"P7862","hash":"6e74ddb544498b93407179cc9a7f9b8610762ff5","datavalue":{"value":{"amount":"+8","unit":"http://www.wikidata.org/entity/Q5151"},"type":"quantity"},"datatype":"quantity"},"type":"statement","id":"Q140$17b64a1e-4a13-9e2a-f8a2-a9317890aa53","rank":"normal","references":[{"hash":"94a79329d5eac70f7ddb005e0d1dc78c53e77797","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4a7fef7ea264a7c71765ce60e3d42f4c043c9646","datavalue":{"value":{"entity-type":"item","numeric-id":45106562,"id":"Q45106562"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}],"P7818":[{"mainsnak":{"snaktype":"value","property":"P7818","hash":"5c7bac858cf66d079e6c13c88f3f001eb446cdce","datavalue":{"value":"Lion","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$C2D3546E-C42A-404A-A288-580F9C705E12","rank":"normal"}],"P7829":[{"mainsnak":{"snaktype":"value","property":"P7829","hash":"17fbb02db65a7e80691f58be750382d61148406e","datavalue":{"value":"Lion","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$74998F51-E783-40CB-A56A-3189647AB3D4","rank":"normal"}],"P7827":[{"mainsnak":{"snaktype":"value","property":"P7827","hash":"f85db9fe2c187554aefc51e5529d75e0c5af4767","datavalue":{"value":"Le\u00f3n","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$5DA64E1B-F1F1-4254-8629-985DFE8672A2","rank":"normal"}],"P7822":[{"mainsnak":{"snaktype":"value","property":"P7822","hash":"3cd23fddc416227c2ba85d91aa03dc80a8e95836","datavalue":{"value":"Leone","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$DF657EF2-67A8-4272-871D-E95B3719A8B6","rank":"normal"}],"P6105":[{"mainsnak":{"snaktype":"value","property":"P6105","hash":"8bbda0afe53fc428d3a0d9528c97d2145ee41dce","datavalue":{"value":"79432","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$2AE92335-1BC6-4B92-BAF3-9AB41608E638","rank":"normal"}],"P6864":[{"mainsnak":{"snaktype":"value","property":"P6864","hash":"6f87ce0800057dbe88f27748b3077938973eb5c8","datavalue":{"value":"85426","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$9089C4B9-59A8-45A6-821B-05C1BB4C107C","rank":"normal"}],"P2347":[{"mainsnak":{"snaktype":"value","property":"P2347","hash":"41e41b306cdd5e55007ac02da022d9f4ce230b03","datavalue":{"value":"7345","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$3CEB44D7-6C0B-4E66-87ED-37D723A1CCC8","rank":"normal","references":[{"hash":"f9bf1a1f034ddd51bd9928ac535e0f57d748e2cf","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"7133f11674741f52cadaae6029068fad9cbb52e3","datavalue":{"value":{"entity-type":"item","numeric-id":89345680,"id":"Q89345680"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}],"P7033":[{"mainsnak":{"snaktype":"value","property":"P7033","hash":"e31b2e07ae0ce3d3a087d3c818c7bf29c7b04b72","datavalue":{"value":"scot/9244","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$F8148EB5-7934-4491-9B40-3378B7D292A6","rank":"normal"}],"P8408":[{"mainsnak":{"snaktype":"value","property":"P8408","hash":"51c04ed4f03488e8f428256ee41eb20eabe3ff38","datavalue":{"value":"Lion","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$2855E519-BCD1-4AB3-B3E9-BB53C5CB2E22","rank":"normal","references":[{"hash":"9a681f9dd95c90224547c404e11295f4f7dcf54e","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"9d5780dddffa8746637a9929a936ab6b0f601e24","datavalue":{"value":{"entity-type":"item","numeric-id":64139102,"id":"Q64139102"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P813":[{"snaktype":"value","property":"P813","hash":"622a5a27fa5b25e7e7984974e9db494cf8460990","datavalue":{"value":{"time":"+2020-07-09T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P813"]}]}],"P8519":[{"mainsnak":{"snaktype":"value","property":"P8519","hash":"ad8031a668b5310633a04a9223714b3482d388b2","datavalue":{"value":"64570","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$ba4fa085-0e54-4226-a46b-770f7d5a995f","rank":"normal"}],"P279":[{"mainsnak":{"snaktype":"value","property":"P279","hash":"761c3439637add8f8fe3a351d6231333693835f6","datavalue":{"value":{"entity-type":"item","numeric-id":6667323,"id":"Q6667323"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$cb41b7d3-46f0-e6d9-ced6-c2803e0c06b7","rank":"normal"}],"P2670":[{"mainsnak":{"snaktype":"value","property":"P2670","hash":"6563f1e596253f1574515891267de01c5c1e688e","datavalue":{"value":{"entity-type":"item","numeric-id":17611534,"id":"Q17611534"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$24984be4-4813-b6ad-ec83-1a37b7332c8a","rank":"normal"},{"mainsnak":{"snaktype":"value","property":"P2670","hash":"684855138cc32d11b487d0178c194f10c63f5f86","datavalue":{"value":{"entity-type":"item","numeric-id":98520146,"id":"Q98520146"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$56e8c9b3-4892-e95d-f7c5-02b10ffe77e8","rank":"normal"}],"P31":[{"mainsnak":{"snaktype":"value","property":"P31","hash":"06629d890d7ab0ff85c403d8aadf57ce9809c01f","datavalue":{"value":{"entity-type":"item","numeric-id":16521,"id":"Q16521"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"q140$8EE98E5B-4A9C-4BF5-B456-FB77E8EE4E69","rank":"normal"}],"P2581":[{"mainsnak":{"snaktype":"value","property":"P2581","hash":"beca27cf7dd079eb27b7690e13a446d98448ae91","datavalue":{"value":"00049156n","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$90562c9a-4e9c-082d-d577-e0869524d9a1","rank":"normal"}],"P7506":[{"mainsnak":{"snaktype":"value","property":"P7506","hash":"0562f57f9a54c65a2d45711f6dd5dd53ce37f6f8","datavalue":{"value":"1107856","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$00d453bf-4786-bde9-63f4-2db9f3610e88","rank":"normal"}],"P5184":[{"mainsnak":{"snaktype":"value","property":"P5184","hash":"201d8de9b05ae85fe4f917c7e54c4a0218517888","datavalue":{"value":"b11s0701a","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$a2b832c9-4c5c-e402-e10d-cf2b08d35a56","rank":"normal"}],"P6900":[{"mainsnak":{"snaktype":"value","property":"P6900","hash":"f7218c6984cd57078497a62ad595b089bdd97c49","datavalue":{"value":"\u30e9\u30a4\u30aa\u30f3","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$d15d143d-4826-4860-9aa3-6a350d6bc36f","rank":"normal"}],"P3553":[{"mainsnak":{"snaktype":"value","property":"P3553","hash":"c82c6e1156e098d5ef396248c412371b90e0dc56","datavalue":{"value":"19563862","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$5edb95fa-4647-2e9a-9dbf-b68e1326eb79","rank":"normal"}],"P5337":[{"mainsnak":{"snaktype":"value","property":"P5337","hash":"793cfa52df3c5a6747c0cb5db959db944b04dbed","datavalue":{"value":"CAAqIQgKIhtDQkFTRGdvSUwyMHZNRGsyYldJU0FtcGhLQUFQAQ","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$6137dbc1-4c6a-af60-00ee-2a32c63bfdfa","rank":"normal"}],"P6200":[{"mainsnak":{"snaktype":"value","property":"P6200","hash":"0ce08dd38017230d41f530f6e97baf484f607235","datavalue":{"value":"ce2gz91pyv2t","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$01ed0f16-4a4a-213d-e457-0d4d5d670d49","rank":"normal"}],"P4527":[{"mainsnak":{"snaktype":"value","property":"P4527","hash":"b07d29aa5112080a9294a7421e46ed0b73ac96c7","datavalue":{"value":"430792","type":"string"},"datatype":"external-id"},"type":"statement","qualifiers":{"P1810":[{"snaktype":"value","property":"P1810","hash":"7d78547303d5e9e014a7c8cef6072faee91088ce","datavalue":{"value":"Lions","type":"string"},"datatype":"string"}]},"qualifiers-order":["P1810"],"id":"Q140$C37C600C-4929-4203-A06E-8D797BA9B22A","rank":"normal"}],"P8989":[{"mainsnak":{"snaktype":"value","property":"P8989","hash":"37087c42c921d83773f62d77e7360dc44504c122","datavalue":{"value":{"entity-type":"item","numeric-id":104595349,"id":"Q104595349"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$1ece61f5-c008-4750-8b67-e15337f28e86","rank":"normal"}],"P1552":[{"mainsnak":{"snaktype":"value","property":"P1552","hash":"1aa7db66bfad11e427c40ec79f3295de877967f1","datavalue":{"value":{"entity-type":"item","numeric-id":120446,"id":"Q120446"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$0bd4b0d9-49ff-b5b4-5c10-9500bc0ce19d","rank":"normal"}],"P9198":[{"mainsnak":{"snaktype":"value","property":"P9198","hash":"d3ab4ab9d788dc348d16e13fc77164ea71cef2ae","datavalue":{"value":"352","type":"string"},"datatype":"external-id"},"type":"statement","id":"Q140$C5D80C89-2862-490F-AA85-C260F32BE30B","rank":"normal"}],"P9566":[{"mainsnak":{"snaktype":"value","property":"P9566","hash":"053e0b7c15c8e5a61a71077c4cffa73b9d03005b","datavalue":{"value":{"entity-type":"item","numeric-id":3255068,"id":"Q3255068"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","id":"Q140$C7DAEA4E-B613-48A6-BFCD-88B551D1EF7A","rank":"normal","references":[{"hash":"0eedf63ac49c9b21aa7ff0a5e70b71aa6069a8ed","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"abfcfc68aa085f872d633958be83cba2ab96ce4a","datavalue":{"value":{"entity-type":"item","numeric-id":1637051,"id":"Q1637051"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]},{"hash":"6db51e3163554f674ff270c93a2871c8d859a49e","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"abfcfc68aa085f872d633958be83cba2ab96ce4a","datavalue":{"value":{"entity-type":"item","numeric-id":1637051,"id":"Q1637051"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P577":[{"snaktype":"value","property":"P577","hash":"ccd6ea06a2c9c0f54f5b1f45991a659225b5f4ef","datavalue":{"value":{"time":"+2013-01-01T00:00:00Z","timezone":0,"before":0,"after":0,"precision":9,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P577"]}]}],"P508":[{"mainsnak":{"snaktype":"value","property":"P508","hash":"e87c854abf600fb5de7b9b677d94a06e18851333","datavalue":{"value":"34922","type":"string"},"datatype":"external-id"},"type":"statement","qualifiers":{"P1810":[{"snaktype":"value","property":"P1810","hash":"137692b9bcc178e7b7d232631cb607d45e2f543d","datavalue":{"value":"Leoni","type":"string"},"datatype":"string"}],"P4970":[{"snaktype":"value","property":"P4970","hash":"271ec192bf14b9eb639120c60d5961ab8692444d","datavalue":{"value":"Panthera leo","type":"string"},"datatype":"string"}]},"qualifiers-order":["P1810","P4970"],"id":"Q140$52702f98-7843-4e0e-b646-76629e04e555","rank":"normal"}],"P950":[{"mainsnak":{"snaktype":"value","property":"P950","hash":"f447323110fd744383394f91c2dfba2fc3187242","datavalue":{"value":"XX530613","type":"string"},"datatype":"external-id"},"type":"statement","qualifiers":{"P1810":[{"snaktype":"value","property":"P1810","hash":"e2b2bda5457e0d5f7859e5c54996e1884062dfd1","datavalue":{"value":"Leones","type":"string"},"datatype":"string"}]},"qualifiers-order":["P1810"],"id":"Q140$773f47cf-3133-4892-80eb-9d4dc5e97582","rank":"normal","references":[{"hash":"184729506e049d06de85686ede30c92b3e52451d","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"3b090a7bae73c288393b2c8b9846cc7ed9a58f91","datavalue":{"value":{"entity-type":"item","numeric-id":16583225,"id":"Q16583225"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}],"P854":[{"snaktype":"value","property":"P854","hash":"b16c3ffac23bb97abe5d0c4d6ccffe4d010ab71a","datavalue":{"value":"https://thes.bncf.firenze.sbn.it/termine.php?id=34922","type":"string"},"datatype":"url"}],"P813":[{"snaktype":"value","property":"P813","hash":"7721e97431215c374db84a9df785dc964a16bd17","datavalue":{"value":{"time":"+2021-06-15T00:00:00Z","timezone":0,"before":0,"after":0,"precision":11,"calendarmodel":"http://www.wikidata.org/entity/Q1985727"},"type":"time"},"datatype":"time"}]},"snaks-order":["P248","P854","P813"]}]}],"P7603":[{"mainsnak":{"snaktype":"value","property":"P7603","hash":"c86436e278d690f057cfecc86babf982948015f3","datavalue":{"value":{"entity-type":"item","numeric-id":2851528,"id":"Q2851528"},"type":"wikibase-entityid"},"datatype":"wikibase-item"},"type":"statement","qualifiers":{"P17":[{"snaktype":"value","property":"P17","hash":"18fb076bdc1c07e578546d1670ba193b768531ac","datavalue":{"value":{"entity-type":"item","numeric-id":668,"id":"Q668"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"qualifiers-order":["P17"],"id":"Q140$64262d09-4a19-3945-8a09-c2195b7614a7","rank":"normal"}],"P6800":[{"mainsnak":{"snaktype":"value","property":"P6800","hash":"1da99908e2ffdf6de901a1b8a2dbab0c62886565","datavalue":{"value":"http://www.ensembl.org/Panthera_leo","type":"string"},"datatype":"url"},"type":"statement","id":"Q140$87DC0D37-FC9E-4FFE-B92D-1A3A7C019A1D","rank":"normal","references":[{"hash":"53eb51e25c6356d2d4673dc249ea837dd14feca0","snaks":{"P248":[{"snaktype":"value","property":"P248","hash":"4ec639fccc9ddb8e079f7d27ca43220e3c512c20","datavalue":{"value":{"entity-type":"item","numeric-id":1344256,"id":"Q1344256"},"type":"wikibase-entityid"},"datatype":"wikibase-item"}]},"snaks-order":["P248"]}]}]},"sitelinks":{"abwiki":{"site":"abwiki","title":"\u0410\u043b\u044b\u043c","badges":[],"url":"https://ab.wikipedia.org/wiki/%D0%90%D0%BB%D1%8B%D0%BC"},"adywiki":{"site":"adywiki","title":"\u0410\u0441\u043b\u044a\u0430\u043d","badges":[],"url":"https://ady.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D1%8A%D0%B0%D0%BD"},"afwiki":{"site":"afwiki","title":"Leeu","badges":["Q17437796"],"url":"https://af.wikipedia.org/wiki/Leeu"},"alswiki":{"site":"alswiki","title":"L\u00f6we","badges":[],"url":"https://als.wikipedia.org/wiki/L%C3%B6we"},"altwiki":{"site":"altwiki","title":"\u0410\u0440\u0441\u043b\u0430\u043d","badges":[],"url":"https://alt.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D0%B0%D0%BD"},"amwiki":{"site":"amwiki","title":"\u12a0\u1295\u1260\u1233","badges":[],"url":"https://am.wikipedia.org/wiki/%E1%8A%A0%E1%8A%95%E1%89%A0%E1%88%B3"},"angwiki":{"site":"angwiki","title":"L\u0113o","badges":[],"url":"https://ang.wikipedia.org/wiki/L%C4%93o"},"anwiki":{"site":"anwiki","title":"Panthera leo","badges":[],"url":"https://an.wikipedia.org/wiki/Panthera_leo"},"arcwiki":{"site":"arcwiki","title":"\u0710\u072a\u071d\u0710","badges":[],"url":"https://arc.wikipedia.org/wiki/%DC%90%DC%AA%DC%9D%DC%90"},"arwiki":{"site":"arwiki","title":"\u0623\u0633\u062f","badges":["Q17437796"],"url":"https://ar.wikipedia.org/wiki/%D8%A3%D8%B3%D8%AF"},"arywiki":{"site":"arywiki","title":"\u0633\u0628\u0639","badges":[],"url":"https://ary.wikipedia.org/wiki/%D8%B3%D8%A8%D8%B9"},"arzwiki":{"site":"arzwiki","title":"\u0633\u0628\u0639","badges":[],"url":"https://arz.wikipedia.org/wiki/%D8%B3%D8%A8%D8%B9"},"astwiki":{"site":"astwiki","title":"Panthera leo","badges":[],"url":"https://ast.wikipedia.org/wiki/Panthera_leo"},"aswiki":{"site":"aswiki","title":"\u09b8\u09bf\u0982\u09b9","badges":[],"url":"https://as.wikipedia.org/wiki/%E0%A6%B8%E0%A6%BF%E0%A6%82%E0%A6%B9"},"avkwiki":{"site":"avkwiki","title":"Krapol (Panthera leo)","badges":[],"url":"https://avk.wikipedia.org/wiki/Krapol_(Panthera_leo)"},"avwiki":{"site":"avwiki","title":"\u0413\u044a\u0430\u043b\u0431\u0430\u0446\u04c0","badges":[],"url":"https://av.wikipedia.org/wiki/%D0%93%D1%8A%D0%B0%D0%BB%D0%B1%D0%B0%D1%86%D3%80"},"azbwiki":{"site":"azbwiki","title":"\u0622\u0633\u0644\u0627\u0646","badges":[],"url":"https://azb.wikipedia.org/wiki/%D8%A2%D8%B3%D9%84%D8%A7%D9%86"},"azwiki":{"site":"azwiki","title":"\u015eir","badges":[],"url":"https://az.wikipedia.org/wiki/%C5%9Eir"},"bat_smgwiki":{"site":"bat_smgwiki","title":"Li\u016bts","badges":[],"url":"https://bat-smg.wikipedia.org/wiki/Li%C5%ABts"},"bawiki":{"site":"bawiki","title":"\u0410\u0440\u044b\u04ab\u043b\u0430\u043d","badges":[],"url":"https://ba.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D2%AB%D0%BB%D0%B0%D0%BD"},"bclwiki":{"site":"bclwiki","title":"Leon","badges":[],"url":"https://bcl.wikipedia.org/wiki/Leon"},"be_x_oldwiki":{"site":"be_x_oldwiki","title":"\u041b\u0435\u045e","badges":[],"url":"https://be-tarask.wikipedia.org/wiki/%D0%9B%D0%B5%D1%9E"},"bewiki":{"site":"bewiki","title":"\u041b\u0435\u045e","badges":[],"url":"https://be.wikipedia.org/wiki/%D0%9B%D0%B5%D1%9E"},"bgwiki":{"site":"bgwiki","title":"\u041b\u044a\u0432","badges":[],"url":"https://bg.wikipedia.org/wiki/%D0%9B%D1%8A%D0%B2"},"bhwiki":{"site":"bhwiki","title":"\u0938\u093f\u0902\u0939","badges":[],"url":"https://bh.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9"},"bmwiki":{"site":"bmwiki","title":"Waraba","badges":[],"url":"https://bm.wikipedia.org/wiki/Waraba"},"bnwiki":{"site":"bnwiki","title":"\u09b8\u09bf\u0982\u09b9","badges":[],"url":"https://bn.wikipedia.org/wiki/%E0%A6%B8%E0%A6%BF%E0%A6%82%E0%A6%B9"},"bowiki":{"site":"bowiki","title":"\u0f66\u0f7a\u0f44\u0f0b\u0f42\u0f7a\u0f0d","badges":[],"url":"https://bo.wikipedia.org/wiki/%E0%BD%A6%E0%BD%BA%E0%BD%84%E0%BC%8B%E0%BD%82%E0%BD%BA%E0%BC%8D"},"bpywiki":{"site":"bpywiki","title":"\u09a8\u0982\u09b8\u09be","badges":[],"url":"https://bpy.wikipedia.org/wiki/%E0%A6%A8%E0%A6%82%E0%A6%B8%E0%A6%BE"},"brwiki":{"site":"brwiki","title":"Leon (loen)","badges":[],"url":"https://br.wikipedia.org/wiki/Leon_(loen)"},"bswiki":{"site":"bswiki","title":"Lav","badges":[],"url":"https://bs.wikipedia.org/wiki/Lav"},"bswikiquote":{"site":"bswikiquote","title":"Lav","badges":[],"url":"https://bs.wikiquote.org/wiki/Lav"},"bxrwiki":{"site":"bxrwiki","title":"\u0410\u0440\u0441\u0430\u043b\u0430\u043d","badges":[],"url":"https://bxr.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%B0%D0%BB%D0%B0%D0%BD"},"cawiki":{"site":"cawiki","title":"Lle\u00f3","badges":["Q17437796"],"url":"https://ca.wikipedia.org/wiki/Lle%C3%B3"},"cawikiquote":{"site":"cawikiquote","title":"Lle\u00f3","badges":[],"url":"https://ca.wikiquote.org/wiki/Lle%C3%B3"},"cdowiki":{"site":"cdowiki","title":"S\u0103i (m\u00e0-ku\u014f d\u00f4ng-\u016dk)","badges":[],"url":"https://cdo.wikipedia.org/wiki/S%C4%83i_(m%C3%A0-ku%C5%8F_d%C3%B4ng-%C5%ADk)"},"cebwiki":{"site":"cebwiki","title":"Panthera leo","badges":[],"url":"https://ceb.wikipedia.org/wiki/Panthera_leo"},"cewiki":{"site":"cewiki","title":"\u041b\u043e\u043c","badges":[],"url":"https://ce.wikipedia.org/wiki/%D0%9B%D0%BE%D0%BC"},"chrwiki":{"site":"chrwiki","title":"\u13e2\u13d3\u13e5 \u13a4\u13c3\u13d5\u13be","badges":[],"url":"https://chr.wikipedia.org/wiki/%E1%8F%A2%E1%8F%93%E1%8F%A5_%E1%8E%A4%E1%8F%83%E1%8F%95%E1%8E%BE"},"chywiki":{"site":"chywiki","title":"P\u00e9hpe'\u00e9nan\u00f3se'hame","badges":[],"url":"https://chy.wikipedia.org/wiki/P%C3%A9hpe%27%C3%A9nan%C3%B3se%27hame"},"ckbwiki":{"site":"ckbwiki","title":"\u0634\u06ce\u0631","badges":[],"url":"https://ckb.wikipedia.org/wiki/%D8%B4%DB%8E%D8%B1"},"commonswiki":{"site":"commonswiki","title":"Panthera leo","badges":[],"url":"https://commons.wikimedia.org/wiki/Panthera_leo"},"cowiki":{"site":"cowiki","title":"Lionu","badges":[],"url":"https://co.wikipedia.org/wiki/Lionu"},"csbwiki":{"site":"csbwiki","title":"Lew","badges":[],"url":"https://csb.wikipedia.org/wiki/Lew"},"cswiki":{"site":"cswiki","title":"Lev","badges":[],"url":"https://cs.wikipedia.org/wiki/Lev"},"cswikiquote":{"site":"cswikiquote","title":"Lev","badges":[],"url":"https://cs.wikiquote.org/wiki/Lev"},"cuwiki":{"site":"cuwiki","title":"\u041b\u044c\u0432\u044a","badges":[],"url":"https://cu.wikipedia.org/wiki/%D0%9B%D1%8C%D0%B2%D1%8A"},"cvwiki":{"site":"cvwiki","title":"\u0410\u0440\u0103\u0441\u043b\u0430\u043d","badges":[],"url":"https://cv.wikipedia.org/wiki/%D0%90%D1%80%C4%83%D1%81%D0%BB%D0%B0%D0%BD"},"cywiki":{"site":"cywiki","title":"Llew","badges":[],"url":"https://cy.wikipedia.org/wiki/Llew"},"dagwiki":{"site":"dagwiki","title":"Gbu\u0263inli","badges":[],"url":"https://dag.wikipedia.org/wiki/Gbu%C9%A3inli"},"dawiki":{"site":"dawiki","title":"L\u00f8ve","badges":["Q17559452"],"url":"https://da.wikipedia.org/wiki/L%C3%B8ve"},"dewiki":{"site":"dewiki","title":"L\u00f6we","badges":["Q17437796"],"url":"https://de.wikipedia.org/wiki/L%C3%B6we"},"dewikiquote":{"site":"dewikiquote","title":"L\u00f6we","badges":[],"url":"https://de.wikiquote.org/wiki/L%C3%B6we"},"dinwiki":{"site":"dinwiki","title":"K\u00f6r","badges":[],"url":"https://din.wikipedia.org/wiki/K%C3%B6r"},"diqwiki":{"site":"diqwiki","title":"\u015e\u00ear","badges":[],"url":"https://diq.wikipedia.org/wiki/%C5%9E%C3%AAr"},"dsbwiki":{"site":"dsbwiki","title":"Law","badges":[],"url":"https://dsb.wikipedia.org/wiki/Law"},"eewiki":{"site":"eewiki","title":"Dzata","badges":[],"url":"https://ee.wikipedia.org/wiki/Dzata"},"elwiki":{"site":"elwiki","title":"\u039b\u03b9\u03bf\u03bd\u03c4\u03ac\u03c1\u03b9","badges":[],"url":"https://el.wikipedia.org/wiki/%CE%9B%CE%B9%CE%BF%CE%BD%CF%84%CE%AC%CF%81%CE%B9"},"enwiki":{"site":"enwiki","title":"Lion","badges":["Q17437796"],"url":"https://en.wikipedia.org/wiki/Lion"},"enwikiquote":{"site":"enwikiquote","title":"Lions","badges":[],"url":"https://en.wikiquote.org/wiki/Lions"},"eowiki":{"site":"eowiki","title":"Leono","badges":[],"url":"https://eo.wikipedia.org/wiki/Leono"},"eowikiquote":{"site":"eowikiquote","title":"Leono","badges":[],"url":"https://eo.wikiquote.org/wiki/Leono"},"eswiki":{"site":"eswiki","title":"Panthera leo","badges":["Q17437796"],"url":"https://es.wikipedia.org/wiki/Panthera_leo"},"eswikiquote":{"site":"eswikiquote","title":"Le\u00f3n","badges":[],"url":"https://es.wikiquote.org/wiki/Le%C3%B3n"},"etwiki":{"site":"etwiki","title":"L\u00f5vi","badges":[],"url":"https://et.wikipedia.org/wiki/L%C3%B5vi"},"etwikiquote":{"site":"etwikiquote","title":"L\u00f5vi","badges":[],"url":"https://et.wikiquote.org/wiki/L%C3%B5vi"},"euwiki":{"site":"euwiki","title":"Lehoi","badges":[],"url":"https://eu.wikipedia.org/wiki/Lehoi"},"extwiki":{"site":"extwiki","title":"Li\u00f3n (animal)","badges":[],"url":"https://ext.wikipedia.org/wiki/Li%C3%B3n_(animal)"},"fawiki":{"site":"fawiki","title":"\u0634\u06cc\u0631 (\u06af\u0631\u0628\u0647\u200c\u0633\u0627\u0646)","badges":["Q17437796"],"url":"https://fa.wikipedia.org/wiki/%D8%B4%DB%8C%D8%B1_(%DA%AF%D8%B1%D8%A8%D9%87%E2%80%8C%D8%B3%D8%A7%D9%86)"},"fawikiquote":{"site":"fawikiquote","title":"\u0634\u06cc\u0631","badges":[],"url":"https://fa.wikiquote.org/wiki/%D8%B4%DB%8C%D8%B1"},"fiu_vrowiki":{"site":"fiu_vrowiki","title":"L\u00f5vi","badges":[],"url":"https://fiu-vro.wikipedia.org/wiki/L%C3%B5vi"},"fiwiki":{"site":"fiwiki","title":"Leijona","badges":["Q17437796"],"url":"https://fi.wikipedia.org/wiki/Leijona"},"fowiki":{"site":"fowiki","title":"Leyva","badges":[],"url":"https://fo.wikipedia.org/wiki/Leyva"},"frrwiki":{"site":"frrwiki","title":"L\u00f6\u00f6w","badges":[],"url":"https://frr.wikipedia.org/wiki/L%C3%B6%C3%B6w"},"frwiki":{"site":"frwiki","title":"Lion","badges":["Q17437796"],"url":"https://fr.wikipedia.org/wiki/Lion"},"frwikiquote":{"site":"frwikiquote","title":"Lion","badges":[],"url":"https://fr.wikiquote.org/wiki/Lion"},"gagwiki":{"site":"gagwiki","title":"Aslan","badges":[],"url":"https://gag.wikipedia.org/wiki/Aslan"},"gawiki":{"site":"gawiki","title":"Leon","badges":[],"url":"https://ga.wikipedia.org/wiki/Leon"},"gdwiki":{"site":"gdwiki","title":"Le\u00f2mhann","badges":[],"url":"https://gd.wikipedia.org/wiki/Le%C3%B2mhann"},"glwiki":{"site":"glwiki","title":"Le\u00f3n","badges":[],"url":"https://gl.wikipedia.org/wiki/Le%C3%B3n"},"gnwiki":{"site":"gnwiki","title":"Le\u00f5","badges":[],"url":"https://gn.wikipedia.org/wiki/Le%C3%B5"},"gotwiki":{"site":"gotwiki","title":"\ud800\udf3b\ud800\udf39\ud800\udf45\ud800\udf30","badges":[],"url":"https://got.wikipedia.org/wiki/%F0%90%8C%BB%F0%90%8C%B9%F0%90%8D%85%F0%90%8C%B0"},"guwiki":{"site":"guwiki","title":"\u0a8f\u0ab6\u0abf\u0aaf\u0abe\u0a87 \u0ab8\u0abf\u0a82\u0ab9","badges":[],"url":"https://gu.wikipedia.org/wiki/%E0%AA%8F%E0%AA%B6%E0%AA%BF%E0%AA%AF%E0%AA%BE%E0%AA%87_%E0%AA%B8%E0%AA%BF%E0%AA%82%E0%AA%B9"},"hakwiki":{"site":"hakwiki","title":"S\u1e73\u0302-\u00e9","badges":[],"url":"https://hak.wikipedia.org/wiki/S%E1%B9%B3%CC%82-%C3%A9"},"hawiki":{"site":"hawiki","title":"Zaki","badges":[],"url":"https://ha.wikipedia.org/wiki/Zaki"},"hawwiki":{"site":"hawwiki","title":"Liona","badges":[],"url":"https://haw.wikipedia.org/wiki/Liona"},"hewiki":{"site":"hewiki","title":"\u05d0\u05e8\u05d9\u05d4","badges":[],"url":"https://he.wikipedia.org/wiki/%D7%90%D7%A8%D7%99%D7%94"},"hewikiquote":{"site":"hewikiquote","title":"\u05d0\u05e8\u05d9\u05d4","badges":[],"url":"https://he.wikiquote.org/wiki/%D7%90%D7%A8%D7%99%D7%94"},"hifwiki":{"site":"hifwiki","title":"Ser","badges":[],"url":"https://hif.wikipedia.org/wiki/Ser"},"hiwiki":{"site":"hiwiki","title":"\u0938\u093f\u0902\u0939 (\u092a\u0936\u0941)","badges":[],"url":"https://hi.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9_(%E0%A4%AA%E0%A4%B6%E0%A5%81)"},"hrwiki":{"site":"hrwiki","title":"Lav","badges":[],"url":"https://hr.wikipedia.org/wiki/Lav"},"hrwikiquote":{"site":"hrwikiquote","title":"Lav","badges":[],"url":"https://hr.wikiquote.org/wiki/Lav"},"hsbwiki":{"site":"hsbwiki","title":"Law","badges":[],"url":"https://hsb.wikipedia.org/wiki/Law"},"htwiki":{"site":"htwiki","title":"Lyon","badges":[],"url":"https://ht.wikipedia.org/wiki/Lyon"},"huwiki":{"site":"huwiki","title":"Oroszl\u00e1n","badges":[],"url":"https://hu.wikipedia.org/wiki/Oroszl%C3%A1n"},"hywiki":{"site":"hywiki","title":"\u0531\u057c\u0575\u0578\u0582\u056e","badges":[],"url":"https://hy.wikipedia.org/wiki/%D4%B1%D5%BC%D5%B5%D5%B8%D6%82%D5%AE"},"hywikiquote":{"site":"hywikiquote","title":"\u0531\u057c\u0575\u0578\u0582\u056e","badges":[],"url":"https://hy.wikiquote.org/wiki/%D4%B1%D5%BC%D5%B5%D5%B8%D6%82%D5%AE"},"hywwiki":{"site":"hywwiki","title":"\u0531\u057c\u056b\u0582\u056e","badges":[],"url":"https://hyw.wikipedia.org/wiki/%D4%B1%D5%BC%D5%AB%D6%82%D5%AE"},"iawiki":{"site":"iawiki","title":"Leon","badges":[],"url":"https://ia.wikipedia.org/wiki/Leon"},"idwiki":{"site":"idwiki","title":"Singa","badges":[],"url":"https://id.wikipedia.org/wiki/Singa"},"igwiki":{"site":"igwiki","title":"Od\u00fam","badges":[],"url":"https://ig.wikipedia.org/wiki/Od%C3%BAm"},"ilowiki":{"site":"ilowiki","title":"Leon","badges":[],"url":"https://ilo.wikipedia.org/wiki/Leon"},"inhwiki":{"site":"inhwiki","title":"\u041b\u043e\u043c","badges":[],"url":"https://inh.wikipedia.org/wiki/%D0%9B%D0%BE%D0%BC"},"iowiki":{"site":"iowiki","title":"Leono (mamifero)","badges":[],"url":"https://io.wikipedia.org/wiki/Leono_(mamifero)"},"iswiki":{"site":"iswiki","title":"Lj\u00f3n","badges":[],"url":"https://is.wikipedia.org/wiki/Lj%C3%B3n"},"itwiki":{"site":"itwiki","title":"Panthera leo","badges":[],"url":"https://it.wikipedia.org/wiki/Panthera_leo"},"itwikiquote":{"site":"itwikiquote","title":"Leone","badges":[],"url":"https://it.wikiquote.org/wiki/Leone"},"jawiki":{"site":"jawiki","title":"\u30e9\u30a4\u30aa\u30f3","badges":[],"url":"https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%82%AA%E3%83%B3"},"jawikiquote":{"site":"jawikiquote","title":"\u7345\u5b50","badges":[],"url":"https://ja.wikiquote.org/wiki/%E7%8D%85%E5%AD%90"},"jbowiki":{"site":"jbowiki","title":"cinfo","badges":[],"url":"https://jbo.wikipedia.org/wiki/cinfo"},"jvwiki":{"site":"jvwiki","title":"Singa","badges":[],"url":"https://jv.wikipedia.org/wiki/Singa"},"kabwiki":{"site":"kabwiki","title":"Izem","badges":[],"url":"https://kab.wikipedia.org/wiki/Izem"},"kawiki":{"site":"kawiki","title":"\u10da\u10dd\u10db\u10d8","badges":[],"url":"https://ka.wikipedia.org/wiki/%E1%83%9A%E1%83%9D%E1%83%9B%E1%83%98"},"kbdwiki":{"site":"kbdwiki","title":"\u0425\u044c\u044d\u0449","badges":[],"url":"https://kbd.wikipedia.org/wiki/%D0%A5%D1%8C%D1%8D%D1%89"},"kbpwiki":{"site":"kbpwiki","title":"T\u0254\u0254y\u028b\u028b","badges":[],"url":"https://kbp.wikipedia.org/wiki/T%C9%94%C9%94y%CA%8B%CA%8B"},"kgwiki":{"site":"kgwiki","title":"Nkosi","badges":[],"url":"https://kg.wikipedia.org/wiki/Nkosi"},"kkwiki":{"site":"kkwiki","title":"\u0410\u0440\u044b\u0441\u0442\u0430\u043d","badges":[],"url":"https://kk.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D1%82%D0%B0%D0%BD"},"knwiki":{"site":"knwiki","title":"\u0cb8\u0cbf\u0c82\u0cb9","badges":[],"url":"https://kn.wikipedia.org/wiki/%E0%B2%B8%E0%B2%BF%E0%B2%82%E0%B2%B9"},"kowiki":{"site":"kowiki","title":"\uc0ac\uc790","badges":[],"url":"https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9E%90"},"kowikiquote":{"site":"kowikiquote","title":"\uc0ac\uc790","badges":[],"url":"https://ko.wikiquote.org/wiki/%EC%82%AC%EC%9E%90"},"kswiki":{"site":"kswiki","title":"\u067e\u0627\u062f\u064e\u0631 \u0633\u0655\u06c1\u06c1","badges":[],"url":"https://ks.wikipedia.org/wiki/%D9%BE%D8%A7%D8%AF%D9%8E%D8%B1_%D8%B3%D9%95%DB%81%DB%81"},"kuwiki":{"site":"kuwiki","title":"\u015e\u00ear","badges":[],"url":"https://ku.wikipedia.org/wiki/%C5%9E%C3%AAr"},"kwwiki":{"site":"kwwiki","title":"Lew","badges":[],"url":"https://kw.wikipedia.org/wiki/Lew"},"kywiki":{"site":"kywiki","title":"\u0410\u0440\u0441\u0442\u0430\u043d","badges":[],"url":"https://ky.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D1%82%D0%B0%D0%BD"},"lawiki":{"site":"lawiki","title":"Leo","badges":[],"url":"https://la.wikipedia.org/wiki/Leo"},"lawikiquote":{"site":"lawikiquote","title":"Leo","badges":[],"url":"https://la.wikiquote.org/wiki/Leo"},"lbewiki":{"site":"lbewiki","title":"\u0410\u0441\u043b\u0430\u043d","badges":[],"url":"https://lbe.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D0%B0%D0%BD"},"lbwiki":{"site":"lbwiki","title":"L\u00e9iw","badges":[],"url":"https://lb.wikipedia.org/wiki/L%C3%A9iw"},"lezwiki":{"site":"lezwiki","title":"\u0410\u0441\u043b\u0430\u043d","badges":[],"url":"https://lez.wikipedia.org/wiki/%D0%90%D1%81%D0%BB%D0%B0%D0%BD"},"lfnwiki":{"site":"lfnwiki","title":"Leon","badges":[],"url":"https://lfn.wikipedia.org/wiki/Leon"},"lijwiki":{"site":"lijwiki","title":"Lion (bestia)","badges":[],"url":"https://lij.wikipedia.org/wiki/Lion_(bestia)"},"liwiki":{"site":"liwiki","title":"Liew","badges":["Q17437796"],"url":"https://li.wikipedia.org/wiki/Liew"},"lldwiki":{"site":"lldwiki","title":"Lion","badges":[],"url":"https://lld.wikipedia.org/wiki/Lion"},"lmowiki":{"site":"lmowiki","title":"Panthera leo","badges":[],"url":"https://lmo.wikipedia.org/wiki/Panthera_leo"},"lnwiki":{"site":"lnwiki","title":"Nk\u0254\u0301si","badges":[],"url":"https://ln.wikipedia.org/wiki/Nk%C9%94%CC%81si"},"ltgwiki":{"site":"ltgwiki","title":"\u013bovs","badges":[],"url":"https://ltg.wikipedia.org/wiki/%C4%BBovs"},"ltwiki":{"site":"ltwiki","title":"Li\u016btas","badges":[],"url":"https://lt.wikipedia.org/wiki/Li%C5%ABtas"},"ltwikiquote":{"site":"ltwikiquote","title":"Li\u016btas","badges":[],"url":"https://lt.wikiquote.org/wiki/Li%C5%ABtas"},"lvwiki":{"site":"lvwiki","title":"Lauva","badges":["Q17437796"],"url":"https://lv.wikipedia.org/wiki/Lauva"},"mdfwiki":{"site":"mdfwiki","title":"\u041e\u0440\u043a\u0441\u043e\u0444\u0442\u0430","badges":["Q17437796"],"url":"https://mdf.wikipedia.org/wiki/%D0%9E%D1%80%D0%BA%D1%81%D0%BE%D1%84%D1%82%D0%B0"},"mgwiki":{"site":"mgwiki","title":"Liona","badges":[],"url":"https://mg.wikipedia.org/wiki/Liona"},"mhrwiki":{"site":"mhrwiki","title":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d","badges":[],"url":"https://mhr.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD"},"mkwiki":{"site":"mkwiki","title":"\u041b\u0430\u0432","badges":[],"url":"https://mk.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B2"},"mlwiki":{"site":"mlwiki","title":"\u0d38\u0d3f\u0d02\u0d39\u0d02","badges":[],"url":"https://ml.wikipedia.org/wiki/%E0%B4%B8%E0%B4%BF%E0%B4%82%E0%B4%B9%E0%B4%82"},"mniwiki":{"site":"mniwiki","title":"\uabc5\uabe3\uabe1\uabc1\uabe5","badges":[],"url":"https://mni.wikipedia.org/wiki/%EA%AF%85%EA%AF%A3%EA%AF%A1%EA%AF%81%EA%AF%A5"},"mnwiki":{"site":"mnwiki","title":"\u0410\u0440\u0441\u043b\u0430\u043d","badges":[],"url":"https://mn.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D0%B0%D0%BD"},"mrjwiki":{"site":"mrjwiki","title":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d","badges":[],"url":"https://mrj.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD"},"mrwiki":{"site":"mrwiki","title":"\u0938\u093f\u0902\u0939","badges":[],"url":"https://mr.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9"},"mswiki":{"site":"mswiki","title":"Singa","badges":["Q17437796"],"url":"https://ms.wikipedia.org/wiki/Singa"},"mtwiki":{"site":"mtwiki","title":"Iljun","badges":[],"url":"https://mt.wikipedia.org/wiki/Iljun"},"mywiki":{"site":"mywiki","title":"\u1001\u103c\u1004\u103a\u1039\u101e\u1031\u1037","badges":[],"url":"https://my.wikipedia.org/wiki/%E1%80%81%E1%80%BC%E1%80%84%E1%80%BA%E1%80%B9%E1%80%9E%E1%80%B1%E1%80%B7"},"newiki":{"site":"newiki","title":"\u0938\u093f\u0902\u0939","badges":[],"url":"https://ne.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9"},"newwiki":{"site":"newwiki","title":"\u0938\u093f\u0902\u0939","badges":[],"url":"https://new.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9"},"nlwiki":{"site":"nlwiki","title":"Leeuw (dier)","badges":[],"url":"https://nl.wikipedia.org/wiki/Leeuw_(dier)"},"nnwiki":{"site":"nnwiki","title":"L\u00f8ve","badges":[],"url":"https://nn.wikipedia.org/wiki/L%C3%B8ve"},"nowiki":{"site":"nowiki","title":"L\u00f8ve","badges":[],"url":"https://no.wikipedia.org/wiki/L%C3%B8ve"},"nrmwiki":{"site":"nrmwiki","title":"Lion","badges":[],"url":"https://nrm.wikipedia.org/wiki/Lion"},"nsowiki":{"site":"nsowiki","title":"Tau","badges":[],"url":"https://nso.wikipedia.org/wiki/Tau"},"nvwiki":{"site":"nvwiki","title":"N\u00e1shd\u00f3\u00edtsoh bitsiij\u012f\u02bc dadit\u0142\u02bcoo\u00edg\u00ed\u00ed","badges":[],"url":"https://nv.wikipedia.org/wiki/N%C3%A1shd%C3%B3%C3%ADtsoh_bitsiij%C4%AF%CA%BC_dadit%C5%82%CA%BCoo%C3%ADg%C3%AD%C3%AD"},"ocwiki":{"site":"ocwiki","title":"Panthera leo","badges":[],"url":"https://oc.wikipedia.org/wiki/Panthera_leo"},"orwiki":{"site":"orwiki","title":"\u0b38\u0b3f\u0b02\u0b39","badges":[],"url":"https://or.wikipedia.org/wiki/%E0%AC%B8%E0%AC%BF%E0%AC%82%E0%AC%B9"},"oswiki":{"site":"oswiki","title":"\u0426\u043e\u043c\u0430\u0445\u044a","badges":[],"url":"https://os.wikipedia.org/wiki/%D0%A6%D0%BE%D0%BC%D0%B0%D1%85%D1%8A"},"pamwiki":{"site":"pamwiki","title":"Leon (animal)","badges":["Q17437796"],"url":"https://pam.wikipedia.org/wiki/Leon_(animal)"},"pawiki":{"site":"pawiki","title":"\u0a2c\u0a71\u0a2c\u0a30 \u0a38\u0a3c\u0a47\u0a30","badges":[],"url":"https://pa.wikipedia.org/wiki/%E0%A8%AC%E0%A9%B1%E0%A8%AC%E0%A8%B0_%E0%A8%B8%E0%A8%BC%E0%A9%87%E0%A8%B0"},"pcdwiki":{"site":"pcdwiki","title":"Lion","badges":[],"url":"https://pcd.wikipedia.org/wiki/Lion"},"plwiki":{"site":"plwiki","title":"Lew afryka\u0144ski","badges":["Q17437796"],"url":"https://pl.wikipedia.org/wiki/Lew_afryka%C5%84ski"},"plwikiquote":{"site":"plwikiquote","title":"Lew","badges":[],"url":"https://pl.wikiquote.org/wiki/Lew"},"pmswiki":{"site":"pmswiki","title":"Lion","badges":[],"url":"https://pms.wikipedia.org/wiki/Lion"},"pnbwiki":{"site":"pnbwiki","title":"\u0628\u0628\u0631 \u0634\u06cc\u0631","badges":[],"url":"https://pnb.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%DB%8C%D8%B1"},"pswiki":{"site":"pswiki","title":"\u0632\u0645\u0631\u06cc","badges":[],"url":"https://ps.wikipedia.org/wiki/%D8%B2%D9%85%D8%B1%DB%8C"},"ptwiki":{"site":"ptwiki","title":"Le\u00e3o","badges":[],"url":"https://pt.wikipedia.org/wiki/Le%C3%A3o"},"ptwikiquote":{"site":"ptwikiquote","title":"Le\u00e3o","badges":[],"url":"https://pt.wikiquote.org/wiki/Le%C3%A3o"},"quwiki":{"site":"quwiki","title":"Liyun","badges":[],"url":"https://qu.wikipedia.org/wiki/Liyun"},"rmwiki":{"site":"rmwiki","title":"Liun","badges":[],"url":"https://rm.wikipedia.org/wiki/Liun"},"rnwiki":{"site":"rnwiki","title":"Intare","badges":[],"url":"https://rn.wikipedia.org/wiki/Intare"},"rowiki":{"site":"rowiki","title":"Leu","badges":[],"url":"https://ro.wikipedia.org/wiki/Leu"},"ruewiki":{"site":"ruewiki","title":"\u041b\u0435\u0432","badges":[],"url":"https://rue.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2"},"ruwiki":{"site":"ruwiki","title":"\u041b\u0435\u0432","badges":["Q17437798"],"url":"https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2"},"ruwikinews":{"site":"ruwikinews","title":"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f:\u041b\u044c\u0432\u044b","badges":[],"url":"https://ru.wikinews.org/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9B%D1%8C%D0%B2%D1%8B"},"rwwiki":{"site":"rwwiki","title":"Intare","badges":[],"url":"https://rw.wikipedia.org/wiki/Intare"},"sahwiki":{"site":"sahwiki","title":"\u0425\u0430\u0445\u0430\u0439","badges":[],"url":"https://sah.wikipedia.org/wiki/%D0%A5%D0%B0%D1%85%D0%B0%D0%B9"},"satwiki":{"site":"satwiki","title":"\u1c61\u1c5f\u1c74\u1c5f\u1c60\u1c69\u1c5e","badges":[],"url":"https://sat.wikipedia.org/wiki/%E1%B1%A1%E1%B1%9F%E1%B1%B4%E1%B1%9F%E1%B1%A0%E1%B1%A9%E1%B1%9E"},"sawiki":{"site":"sawiki","title":"\u0938\u093f\u0902\u0939\u0903 \u092a\u0936\u0941\u0903","badges":[],"url":"https://sa.wikipedia.org/wiki/%E0%A4%B8%E0%A4%BF%E0%A4%82%E0%A4%B9%E0%A4%83_%E0%A4%AA%E0%A4%B6%E0%A5%81%E0%A4%83"},"scnwiki":{"site":"scnwiki","title":"Panthera leo","badges":[],"url":"https://scn.wikipedia.org/wiki/Panthera_leo"},"scowiki":{"site":"scowiki","title":"Lion","badges":["Q17437796"],"url":"https://sco.wikipedia.org/wiki/Lion"},"sdwiki":{"site":"sdwiki","title":"\u0628\u0628\u0631 \u0634\u064a\u0646\u0647\u0646","badges":[],"url":"https://sd.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%D9%8A%D9%86%D9%87%D9%86"},"sewiki":{"site":"sewiki","title":"Ledjon","badges":[],"url":"https://se.wikipedia.org/wiki/Ledjon"},"shiwiki":{"site":"shiwiki","title":"Agrzam","badges":[],"url":"https://shi.wikipedia.org/wiki/Agrzam"},"shnwiki":{"site":"shnwiki","title":"\u101e\u1062\u1004\u103a\u1087\u101e\u102e\u1088","badges":[],"url":"https://shn.wikipedia.org/wiki/%E1%80%9E%E1%81%A2%E1%80%84%E1%80%BA%E1%82%87%E1%80%9E%E1%80%AE%E1%82%88"},"shwiki":{"site":"shwiki","title":"Lav","badges":[],"url":"https://sh.wikipedia.org/wiki/Lav"},"simplewiki":{"site":"simplewiki","title":"Lion","badges":[],"url":"https://simple.wikipedia.org/wiki/Lion"},"siwiki":{"site":"siwiki","title":"\u0dc3\u0dd2\u0d82\u0dc4\u0dba\u0dcf","badges":[],"url":"https://si.wikipedia.org/wiki/%E0%B7%83%E0%B7%92%E0%B6%82%E0%B7%84%E0%B6%BA%E0%B7%8F"},"skwiki":{"site":"skwiki","title":"Lev p\u00fa\u0161\u0165ov\u00fd","badges":[],"url":"https://sk.wikipedia.org/wiki/Lev_p%C3%BA%C5%A1%C5%A5ov%C3%BD"},"skwikiquote":{"site":"skwikiquote","title":"Lev","badges":[],"url":"https://sk.wikiquote.org/wiki/Lev"},"slwiki":{"site":"slwiki","title":"Lev","badges":[],"url":"https://sl.wikipedia.org/wiki/Lev"},"smwiki":{"site":"smwiki","title":"Leona","badges":[],"url":"https://sm.wikipedia.org/wiki/Leona"},"snwiki":{"site":"snwiki","title":"Shumba","badges":[],"url":"https://sn.wikipedia.org/wiki/Shumba"},"sowiki":{"site":"sowiki","title":"Libaax","badges":[],"url":"https://so.wikipedia.org/wiki/Libaax"},"specieswiki":{"site":"specieswiki","title":"Panthera leo","badges":[],"url":"https://species.wikimedia.org/wiki/Panthera_leo"},"sqwiki":{"site":"sqwiki","title":"Luani","badges":[],"url":"https://sq.wikipedia.org/wiki/Luani"},"srwiki":{"site":"srwiki","title":"\u041b\u0430\u0432","badges":[],"url":"https://sr.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B2"},"sswiki":{"site":"sswiki","title":"Libhubesi","badges":[],"url":"https://ss.wikipedia.org/wiki/Libhubesi"},"stqwiki":{"site":"stqwiki","title":"Leeuwe","badges":[],"url":"https://stq.wikipedia.org/wiki/Leeuwe"},"stwiki":{"site":"stwiki","title":"Tau","badges":[],"url":"https://st.wikipedia.org/wiki/Tau"},"suwiki":{"site":"suwiki","title":"Singa","badges":[],"url":"https://su.wikipedia.org/wiki/Singa"},"svwiki":{"site":"svwiki","title":"Lejon","badges":[],"url":"https://sv.wikipedia.org/wiki/Lejon"},"swwiki":{"site":"swwiki","title":"Simba","badges":[],"url":"https://sw.wikipedia.org/wiki/Simba"},"szlwiki":{"site":"szlwiki","title":"Lew","badges":[],"url":"https://szl.wikipedia.org/wiki/Lew"},"tawiki":{"site":"tawiki","title":"\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0bae\u0bcd","badges":[],"url":"https://ta.wikipedia.org/wiki/%E0%AE%9A%E0%AE%BF%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%AE%E0%AF%8D"},"tcywiki":{"site":"tcywiki","title":"\u0cb8\u0cbf\u0c82\u0cb9","badges":[],"url":"https://tcy.wikipedia.org/wiki/%E0%B2%B8%E0%B2%BF%E0%B2%82%E0%B2%B9"},"tewiki":{"site":"tewiki","title":"\u0c38\u0c3f\u0c02\u0c39\u0c02","badges":[],"url":"https://te.wikipedia.org/wiki/%E0%B0%B8%E0%B0%BF%E0%B0%82%E0%B0%B9%E0%B0%82"},"tgwiki":{"site":"tgwiki","title":"\u0428\u0435\u0440","badges":[],"url":"https://tg.wikipedia.org/wiki/%D0%A8%D0%B5%D1%80"},"thwiki":{"site":"thwiki","title":"\u0e2a\u0e34\u0e07\u0e42\u0e15","badges":[],"url":"https://th.wikipedia.org/wiki/%E0%B8%AA%E0%B8%B4%E0%B8%87%E0%B9%82%E0%B8%95"},"tiwiki":{"site":"tiwiki","title":"\u12a3\u1295\u1260\u1233","badges":[],"url":"https://ti.wikipedia.org/wiki/%E1%8A%A3%E1%8A%95%E1%89%A0%E1%88%B3"},"tkwiki":{"site":"tkwiki","title":"\u00ddolbars","badges":[],"url":"https://tk.wikipedia.org/wiki/%C3%9Dolbars"},"tlwiki":{"site":"tlwiki","title":"Leon","badges":[],"url":"https://tl.wikipedia.org/wiki/Leon"},"trwiki":{"site":"trwiki","title":"Aslan","badges":[],"url":"https://tr.wikipedia.org/wiki/Aslan"},"ttwiki":{"site":"ttwiki","title":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d","badges":[],"url":"https://tt.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD"},"tumwiki":{"site":"tumwiki","title":"Nkhalamu","badges":[],"url":"https://tum.wikipedia.org/wiki/Nkhalamu"},"udmwiki":{"site":"udmwiki","title":"\u0410\u0440\u044b\u0441\u043b\u0430\u043d","badges":[],"url":"https://udm.wikipedia.org/wiki/%D0%90%D1%80%D1%8B%D1%81%D0%BB%D0%B0%D0%BD"},"ugwiki":{"site":"ugwiki","title":"\u0634\u0649\u0631","badges":[],"url":"https://ug.wikipedia.org/wiki/%D8%B4%D9%89%D8%B1"},"ukwiki":{"site":"ukwiki","title":"\u041b\u0435\u0432","badges":[],"url":"https://uk.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B2"},"ukwikiquote":{"site":"ukwikiquote","title":"\u041b\u0435\u0432","badges":[],"url":"https://uk.wikiquote.org/wiki/%D0%9B%D0%B5%D0%B2"},"urwiki":{"site":"urwiki","title":"\u0628\u0628\u0631 \u0634\u06cc\u0631","badges":["Q17437796"],"url":"https://ur.wikipedia.org/wiki/%D8%A8%D8%A8%D8%B1_%D8%B4%DB%8C%D8%B1"},"uzwiki":{"site":"uzwiki","title":"Arslon","badges":[],"url":"https://uz.wikipedia.org/wiki/Arslon"},"vecwiki":{"site":"vecwiki","title":"Leon","badges":[],"url":"https://vec.wikipedia.org/wiki/Leon"},"vepwiki":{"site":"vepwiki","title":"Lev","badges":[],"url":"https://vep.wikipedia.org/wiki/Lev"},"viwiki":{"site":"viwiki","title":"S\u01b0 t\u1eed","badges":[],"url":"https://vi.wikipedia.org/wiki/S%C6%B0_t%E1%BB%AD"},"vlswiki":{"site":"vlswiki","title":"L\u00eaeuw (b\u00eaeste)","badges":[],"url":"https://vls.wikipedia.org/wiki/L%C3%AAeuw_(b%C3%AAeste)"},"warwiki":{"site":"warwiki","title":"Leon","badges":[],"url":"https://war.wikipedia.org/wiki/Leon"},"wowiki":{"site":"wowiki","title":"Gaynde","badges":[],"url":"https://wo.wikipedia.org/wiki/Gaynde"},"wuuwiki":{"site":"wuuwiki","title":"\u72ee","badges":[],"url":"https://wuu.wikipedia.org/wiki/%E7%8B%AE"},"xalwiki":{"site":"xalwiki","title":"\u0410\u0440\u0441\u043b\u04a3","badges":[],"url":"https://xal.wikipedia.org/wiki/%D0%90%D1%80%D1%81%D0%BB%D2%A3"},"xhwiki":{"site":"xhwiki","title":"Ingonyama","badges":[],"url":"https://xh.wikipedia.org/wiki/Ingonyama"},"xmfwiki":{"site":"xmfwiki","title":"\u10dc\u10ef\u10d8\u10da\u10dd","badges":[],"url":"https://xmf.wikipedia.org/wiki/%E1%83%9C%E1%83%AF%E1%83%98%E1%83%9A%E1%83%9D"},"yiwiki":{"site":"yiwiki","title":"\u05dc\u05d9\u05d9\u05d1","badges":[],"url":"https://yi.wikipedia.org/wiki/%D7%9C%D7%99%D7%99%D7%91"},"yowiki":{"site":"yowiki","title":"K\u00ecn\u00ec\u00fan","badges":[],"url":"https://yo.wikipedia.org/wiki/K%C3%ACn%C3%AC%C3%BAn"},"zawiki":{"site":"zawiki","title":"Saeceij","badges":[],"url":"https://za.wikipedia.org/wiki/Saeceij"},"zh_min_nanwiki":{"site":"zh_min_nanwiki","title":"Sai","badges":[],"url":"https://zh-min-nan.wikipedia.org/wiki/Sai"},"zh_yuewiki":{"site":"zh_yuewiki","title":"\u7345\u5b50","badges":["Q17437796"],"url":"https://zh-yue.wikipedia.org/wiki/%E7%8D%85%E5%AD%90"},"zhwiki":{"site":"zhwiki","title":"\u72ee","badges":[],"url":"https://zh.wikipedia.org/wiki/%E7%8B%AE"},"zuwiki":{"site":"zuwiki","title":"Ibhubesi","badges":[],"url":"https://zu.wikipedia.org/wiki/Ibhubesi"}}}}} } \ No newline at end of file