Просмотр исходного кода

git 删除大多数无效文件及依赖

Jay 1 неделя назад
Родитель
Сommit
907ebdb7e1
62 измененных файлов с 1802 добавлено и 10942 удалено
  1. 0 40
      .gitlab-ci.yml
  2. 0 123
      CHANGELOG.md
  3. 0 46
      CODE_OF_CONDUCT.md
  4. 0 25
      CONTRIBUTING.md
  5. 0 63
      DEVELOP.md
  6. 1 1
      craco.config.js
  7. 0 7
      embed_git_hash.sh
  8. 0 58
      fix_i18n_files.js
  9. 3 154
      package-lock.json
  10. 2 13
      package.json
  11. 1 1
      public/index.html
  12. 0 665
      src/config/locales/presets/cn.json
  13. 0 665
      src/config/locales/presets/de.json
  14. 0 665
      src/config/locales/presets/en.json
  15. 0 665
      src/config/locales/presets/fr.json
  16. 0 665
      src/config/locales/presets/it.json
  17. 0 164
      src/config/locales/ui/cn.json
  18. 0 164
      src/config/locales/ui/de.json
  19. 0 164
      src/config/locales/ui/default.json
  20. 0 164
      src/config/locales/ui/en.json
  21. 0 164
      src/config/locales/ui/fr.json
  22. 0 30
      src/config/locales/ui/index.js
  23. 0 164
      src/config/locales/ui/it.json
  24. 0 15
      src/ctrl/PresetsManager.js
  25. 810 807
      src/ctrl/VectorDataManager.js
  26. 11 18
      src/index.js
  27. 7 26
      src/view/App.js
  28. 953 1176
      src/view/Body.js
  29. 0 164
      src/view/Header.js
  30. 0 96
      src/view/LeftPanel.js
  31. 13 10
      src/view/Map.js
  32. 0 26
      src/view/RightPanel.js
  33. 0 238
      src/view/Toolbar.js
  34. 0 54
      src/view/common/ChangesetDiff.js
  35. 0 102
      src/view/common/FloorImageryButtons.js
  36. 0 48
      src/view/common/GeometryButtons.js
  37. 0 53
      src/view/common/GeometryTypeSelect.js
  38. 0 187
      src/view/common/IndoorEditButtons.js
  39. 0 140
      src/view/common/MapManageList.js
  40. 0 60
      src/view/common/Navigator.js
  41. 0 92
      src/view/common/PresetCard.js
  42. 0 257
      src/view/common/PresetInputField.js
  43. 0 142
      src/view/common/PresetSelect.js
  44. 0 156
      src/view/common/SearchPlace.js
  45. 0 121
      src/view/common/SelectList.js
  46. 0 37
      src/view/common/SidePanelButton.js
  47. 0 206
      src/view/common/TagsTable.js
  48. 0 37
      src/view/dialogs/CompleteFloorImagery.js
  49. 0 46
      src/view/dialogs/ConfirmDeletion.js
  50. 0 174
      src/view/dialogs/Login.js
  51. 0 69
      src/view/dialogs/MissingLevelOutlines.js
  52. 1 1
      src/view/dialogs/OutOfBoundsGeometry.js
  53. 0 116
      src/view/panes/BuildingEdit.js
  54. 0 176
      src/view/panes/Changeset.js
  55. 0 216
      src/view/panes/FloorImagery.js
  56. 0 191
      src/view/panes/Imagery.js
  57. 0 92
      src/view/panes/MapDashboard.js
  58. 0 70
      src/view/panes/features/Create.js
  59. 0 345
      src/view/panes/features/Edit.js
  60. 0 113
      src/view/panes/features/View.js
  61. 0 111
      src/view/panes/levels/EditAll.js
  62. 0 84
      src/view/panes/levels/EditOne.js

Разница между файлами не показана из-за своего большого размера
+ 0 - 40
.gitlab-ci.yml


+ 0 - 123
CHANGELOG.md

@@ -1,123 +0,0 @@
-# Changelog
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
-## Unreleased
-
-
-## 1.0.15 - 2024-03-19
-
-### Changed
-- Switched OSM authentication to OAuth 2
-
-
-## 1.0.14 - 2023-08-16
-
-### Fixed
-- Mapbox tiles without token were breaking the editor (thanks to [Elian Doran](https://framagit.org/elian) for the fix)
-
-
-## 1.0.13 - 2023-03-30
-
-### Changed
-- Update Mapbox tiles URLs to use a dedicated access token
-
-
-## 1.0.12 - 2022-05-12
-
-### Fixed
-- Updated broken libraries (thanks to Alejandro Nigrelli)
-
-
-## 1.0.11 - 2022-01-04
-
-### Added
-- Allow preview current edits on [indoor=](https://indoorequal.org/) (thanks to François de Metz)
-
-### Fixed
-- Prevent empty tag key or value to be sent to OSM
-
-
-## 1.0.10 - 2021-08-16
-
-### Added
-- Button to ask for review when sending changeset (`review_request=yes` changeset tag)
-
-### Fixed
-- Tile providers with `crs` parameter defined caused freeze of UI
-
-
-## 1.0.9 - 2020-03-28
-
-### Fixed
-- Fix duplicate values in `level` tag
-- Better handling of existing `repeat_on` tag
-
-
-## 1.0.8 - 2020-03-05
-
-### Fixed
-- Handle outdoor sports centre as landuse
-- Read URL with hash missing part of level info
-
-
-## 1.0.7 - 2020-02-12
-
-### Changed
-- Updated de + it translations
-
-
-## 1.0.6 - 2019-11-12
-
-### Fixed
-- Deletion of features being part of a non-geometrical relation
-
-
-## 1.0.5 - 2019-10-10
-
-### Added
-- List of used imagery is added to changeset informations (tag `imagery_used`)
-- User can add used source for edits (tag `source` in changeset)
-
-### Changed
-- Support decimal levels when editing (they are visible in level selector)
-
-
-## 1.0.4 - 2019-10-10
-
-### Added
-- 🇩🇪 German translation (thanks to TuringTux and schwukas)
-
-
-## 1.0.3 - 2019-10-05
-
-### Changed
-- Buildings are now filtered on map according to selected level
-- Level selector properly handles areas with many levels
-
-
-## 1.0.2 - 2019-09-26
-
-### Changed
-- Improved metadata in `index.html` file
-
-### Fixed
-- Door nodes are now merged with vertex node if they are overlapping
-- List of edits in changeset pane always display correct name
-
-
-## 1.0.1 - 2019-09-25
-
-### Added
-- 🇮🇹 Italian translation (thanks to napolnx)
-
-### Changed
-- Allow double click zoom on explore mode
-
-
-# 1.0.0 - 2019-09-19
-
-### Added
-- Initial release of the editor, which allows to view indoor data, manage floor plan images, edit OpenStreetMap indoor data and send changes.

+ 0 - 46
CODE_OF_CONDUCT.md

@@ -1,46 +0,0 @@
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
-
-## Our Standards
-
-Examples of behavior that contributes to creating a positive environment include:
-
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
-
-Examples of unacceptable behavior by participants include:
-
-* The use of sexualized language or imagery and unwelcome sexual attention or advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a professional setting
-
-## Our Responsibilities
-
-Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
-
-Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
-
-## Scope
-
-This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [panieravide@riseup.net](mailto:panieravide@riseup.net). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
-
-Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]
-
-[homepage]: https://contributor-covenant.org
-[version]: https://contributor-covenant.org/version/1/4/

+ 0 - 25
CONTRIBUTING.md

@@ -1,25 +0,0 @@
-# Contributing
-
-:+1: :tada: First off, thanks for taking the time to contribute! :tada: :+1:
-
-
-## Code of Conduct
-
-This project and everyone participating in it is governed by a [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [panieravide@riseup.net](mailto:panieravide@riseup.net).
-
-
-## Reporting Bugs
-
-If you encountered an unexpected behaviour in the editor, or want to share your awesome ideas, please feel free to [open an issue](https://framagit.org/PanierAvide/osminedit/issues) on this repository. Before doing so, you might have a look at existing issues to see if you can join discussion instead.
-
-
-## Translate the application
-
-We use Transifex, which is a simple platform for translating applications. We have all the [labels there](https://www.transifex.com/openlevelup/osminedit), in English, so you can write translations into your language. Let us know when you're done, that way we will update the application to make your language available.
-
-If you run into any issue for doing this (like your language isn't available in the list), please [contact us](mailto:panieravide@riseup.net) or [open an issue](https://framagit.org/PanierAvide/osminedit/issues/new).
-
-
-## Develop feature, offer pull requests
-
-If you are a developer, you can see the [list of open issues](https://framagit.org/PanierAvide/osminedit/issues) and start working on one of them. To start development, please read [development documentation](DEVELOP.md). When you think your work is done, you can open a pull request, so we can integrate your contribution in the editor.

+ 0 - 63
DEVELOP.md

@@ -1,63 +0,0 @@
-# Develop
-
-This application is based on web technologies, and mainly written in ECMAScript 6 (modern JavaScript). This documentation is for people who want to build by themselves or develop the project.
-
-
-## Dependencies
-
-You need to install the given tools before starting:
-* NodeJS (>= 9) - [Documentation](https://nodejs.org/en/download/)
-* Transifex CLI - [Documentation](https://docs.transifex.com/client/installing-the-client)
-
-
-## Run
-
-To run the project locally, you need to first `git clone` this repository.
-
-Then, install project dependencies using `npm install`. Now, you can use following commands to work.
-
-### `npm start`
-
-Runs the app in the development mode.<br>
-Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
-
-The page will reload if you make edits.<br>
-You will also see any lint errors in the console.
-
-### `npm test`
-
-Launches the test runner in the interactive watch mode.<br>
-See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
-
-### `npm run build`
-
-Builds the app for production to the `build` folder.<br>
-It correctly bundles React in production mode and optimizes the build for the best performance.
-
-The build is minified and the filenames include the hashes.<br>
-Your app is ready to be deployed!
-
-See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
-
-
-## Translations
-
-Translations of user interface labels are managed using JSON configuration files, automatically generated using `i18nline` tool. When editing code, launch manually `npm run i18n:build` to update these configuration files.
-
-To retrieve translated labels from Transifex, run command `npm run i18n:pull`.
-
-
-## Documentation
-
-Documentation of the source code uses [JSDoc syntax](http://usejsdoc.org/). Readable documentation can be generated using `npm run doc` command, and will be available as an HTML page in `doc/` folder.
-
-
-## Configuration
-
-Various components of the editor can be configured for the instance manager. Main files you can edit are :
-
-* `public/config.json` : various configurations, in particular [OAuth tokens](https://wiki.openstreetmap.org/wiki/Oauth) and [OSM API URL](https://wiki.openstreetmap.org/wiki/API_v0.6#URL_.2B_authentication) to use
-* `public/style.mapcss` : [MapCSS](https://wiki.openstreetmap.org/wiki/MapCSS) stylesheet for map features
-* `public/presets/*.xml` : [JOSM tagging presets](https://josm.openstreetmap.de/wiki/TaggingPresets) for simple creation and editing of features
-
-You can either make temporary changes by editing these files in your `build/` folder, or making changes permanent by editing in `public/` folder (and rebuild using described procedure above).

+ 1 - 1
craco.config.js

@@ -18,7 +18,7 @@ module.exports = {
       entry: path.resolve(__dirname, 'src/index.js'),
       output: {
         path: path.resolve(__dirname, 'build'),
-        filename: '3x.umd.js',
+        filename: 'BunnyBlitz.umd.js',
         // publicPath: './sdk',
         library: 'ThreeX',
         libraryTarget: 'umd',

+ 0 - 7
embed_git_hash.sh

@@ -1,7 +0,0 @@
-#!/bin/bash
-
-# This script changes config.json file to include last Git hash (for client-side display)
-# This should be run only on production pipelines
-# config.json source file should have a "GIT_HASH" label properly defined
-
-sed -i "s/GIT_HASH/`git rev-parse --short HEAD`/g" ./public/config.json

+ 0 - 58
fix_i18n_files.js

@@ -1,58 +0,0 @@
-/**
- * Changes the language in the translation files retrieved from Transifex.
- */
-
-const fs = require('fs');
-
-const I18N_DIRS = [ "./src/config/locales/ui", "./src/config/locales/presets" ];
-const JSON_RGX = /^[A-Za-z0-9_\-]+\.json$/;
-
-//Read translation files
-I18N_DIRS.forEach(i18n_dir => {
-	fs.readdirSync(i18n_dir).forEach((file) => {
-		if(JSON_RGX.test(file)) {
-			const lng = file.substring(0, file.length - 5).replace("_", "-");
-			try {
-				//Read file
-				const lngData = JSON.parse(fs.readFileSync(i18n_dir+"/"+file, 'utf8'));
-
-				//If not already fixed
-				if(lngData[lng] === undefined) {
-					//Check if en available
-					if(lngData["en"] !== undefined) {
-						//Edit object, put en into lng locale
-						const outData = {};
-						outData[lng] = lngData.en;
-
-						//Overwrite file
-						fs.writeFile(i18n_dir+"/"+file, JSON.stringify(outData, null, 2), function(err) {
-							if(err) {
-								throw new Error(err);
-							}
-							else {
-								console.log("[INFO] Translation file "+i18n_dir+"/"+file+" updated");
-							}
-						});
-					}
-					else {
-						throw new Error("Unknown translation locale: "+i18n_dir+"/"+file);
-					}
-				}
-				else {
-					console.log("[INFO] Translation file "+i18n_dir+"/"+file+" already OK");
-				}
-			}
-			catch(e) {
-				if(e instanceof SyntaxError) {
-					throw new Error("Invalid translation file: "+i18n_dir+"/"+file+" ("+e.message+")");
-				}
-				else {
-					throw e;
-				}
-			}
-		}
-		else {
-			console.log("[INFO] Ignored file "+i18n_dir+"/"+file);
-		}
-	});
-});

+ 3 - 154
package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "indoor-monitor",
-  "version": "0.0.15",
+  "version": "0.1.0",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "indoor-monitor",
-      "version": "0.0.15",
+      "version": "0.1.0",
       "license": "ISC",
       "dependencies": {
         "@turf/along": "^6.0.1",
@@ -69,8 +69,7 @@
       "devDependencies": {
         "@craco/craco": "^5.0.0",
         "assert": "^1.5.0",
-        "documentation": "^9.3.1",
-        "i18nline": "^2.0.1"
+        "documentation": "^9.3.1"
       }
     },
     "node_modules/@babel/code-frame": {
@@ -7293,18 +7292,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/crc32": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/crc32/-/crc32-0.2.2.tgz",
-      "integrity": "sha1-etIg1v/c0Rn5/BJ6d3LKzqOQpLo=",
-      "dev": true,
-      "bin": {
-        "crc32": "bin/runner.js"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
     "node_modules/create-ecdh": {
       "version": "4.0.3",
       "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
@@ -11257,12 +11244,6 @@
         "assert-plus": "^1.0.0"
       }
     },
-    "node_modules/gglobby": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/gglobby/-/gglobby-0.0.3.tgz",
-      "integrity": "sha1-x9aGwf8spOiCpYrfOKfeJpG6f5k=",
-      "dev": true
-    },
     "node_modules/git-up": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/git-up/-/git-up-2.1.0.tgz",
@@ -12091,49 +12072,6 @@
       "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
       "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
     },
-    "node_modules/i18n-js": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-3.5.1.tgz",
-      "integrity": "sha512-nJgbE5Vj9qzOQfjdVd/uoMoO8ppVaB/3LB6KOmMfD8IQ1vNNh307iHyQLK8ZnLYWkAszfPvVpYmUt1Le/RuHMQ==",
-      "dev": true
-    },
-    "node_modules/i18nline": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/i18nline/-/i18nline-2.0.1.tgz",
-      "integrity": "sha512-abACtOMahZSwCDL2C1Flqr+WxSQaWgVNCd74UGvsvkVdrt6mFyas2i6XUX74hio5hnGkc9u862t/4y68rIv8nQ==",
-      "dev": true,
-      "dependencies": {
-        "babel-traverse": "^6.0.0",
-        "babylon": "^6.0.0",
-        "chalk": "^2.3.2",
-        "crc32": "~0.2.2",
-        "esprima": "^4.0.0",
-        "extend": "^3.0.1",
-        "gglobby": "0.0.3",
-        "i18n-js": "^3.0.3",
-        "minimist": "^1.2.0",
-        "mkdirp": "^0.5.1",
-        "speakingurl": "^14.0.1",
-        "uevents": "^1.0.0",
-        "ulog": "^1.1.0"
-      },
-      "bin": {
-        "i18nline": "bin/i18nline.js"
-      }
-    },
-    "node_modules/i18nline/node_modules/esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true,
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -22319,15 +22257,6 @@
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
-    "node_modules/speakingurl": {
-      "version": "14.0.1",
-      "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
-      "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/splaytree": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-0.1.4.tgz",
@@ -23518,15 +23447,6 @@
       "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
       "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
     },
-    "node_modules/uevents": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/uevents/-/uevents-1.0.0.tgz",
-      "integrity": "sha1-IAXppHL7CkbIJuz9GJrtmI7F6+E=",
-      "dev": true,
-      "engines": {
-        "node": ">=4.x.x"
-      }
-    },
     "node_modules/uglify-js": {
       "version": "3.4.10",
       "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
@@ -23555,12 +23475,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/ulog": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ulog/-/ulog-1.1.0.tgz",
-      "integrity": "sha512-oQDYGh4w/ykGSpffEuwkqFnL5BYJa5HeV5PhpkjuAFwJCyjp2KjT2YDcFa8y4ie8kejdXMwpFCSF6HNM5Kia4g==",
-      "dev": true
-    },
     "node_modules/ultron": {
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/ultron/-/ultron-1.1.1.tgz",
@@ -31048,12 +30962,6 @@
         "parse-json": "^4.0.0"
       }
     },
-    "crc32": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/crc32/-/crc32-0.2.2.tgz",
-      "integrity": "sha1-etIg1v/c0Rn5/BJ6d3LKzqOQpLo=",
-      "dev": true
-    },
     "create-ecdh": {
       "version": "4.0.3",
       "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
@@ -34254,12 +34162,6 @@
         "assert-plus": "^1.0.0"
       }
     },
-    "gglobby": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/gglobby/-/gglobby-0.0.3.tgz",
-      "integrity": "sha1-x9aGwf8spOiCpYrfOKfeJpG6f5k=",
-      "dev": true
-    },
     "git-up": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/git-up/-/git-up-2.1.0.tgz",
@@ -34955,41 +34857,6 @@
       "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
       "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
     },
-    "i18n-js": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-3.5.1.tgz",
-      "integrity": "sha512-nJgbE5Vj9qzOQfjdVd/uoMoO8ppVaB/3LB6KOmMfD8IQ1vNNh307iHyQLK8ZnLYWkAszfPvVpYmUt1Le/RuHMQ==",
-      "dev": true
-    },
-    "i18nline": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/i18nline/-/i18nline-2.0.1.tgz",
-      "integrity": "sha512-abACtOMahZSwCDL2C1Flqr+WxSQaWgVNCd74UGvsvkVdrt6mFyas2i6XUX74hio5hnGkc9u862t/4y68rIv8nQ==",
-      "dev": true,
-      "requires": {
-        "babel-traverse": "^6.0.0",
-        "babylon": "^6.0.0",
-        "chalk": "^2.3.2",
-        "crc32": "~0.2.2",
-        "esprima": "^4.0.0",
-        "extend": "^3.0.1",
-        "gglobby": "0.0.3",
-        "i18n-js": "^3.0.3",
-        "minimist": "^1.2.0",
-        "mkdirp": "^0.5.1",
-        "speakingurl": "^14.0.1",
-        "uevents": "^1.0.0",
-        "ulog": "^1.1.0"
-      },
-      "dependencies": {
-        "esprima": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-          "dev": true
-        }
-      }
-    },
     "iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -43032,12 +42899,6 @@
         }
       }
     },
-    "speakingurl": {
-      "version": "14.0.1",
-      "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
-      "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
-      "dev": true
-    },
     "splaytree": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-0.1.4.tgz",
@@ -43986,12 +43847,6 @@
       "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
       "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
     },
-    "uevents": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/uevents/-/uevents-1.0.0.tgz",
-      "integrity": "sha1-IAXppHL7CkbIJuz9GJrtmI7F6+E=",
-      "dev": true
-    },
     "uglify-js": {
       "version": "3.4.10",
       "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
@@ -44013,12 +43868,6 @@
         }
       }
     },
-    "ulog": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ulog/-/ulog-1.1.0.tgz",
-      "integrity": "sha512-oQDYGh4w/ykGSpffEuwkqFnL5BYJa5HeV5PhpkjuAFwJCyjp2KjT2YDcFa8y4ie8kejdXMwpFCSF6HNM5Kia4g==",
-      "dev": true
-    },
     "ultron": {
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/ultron/-/ultron-1.1.1.tgz",

+ 2 - 13
package.json

@@ -10,11 +10,6 @@
     "doc": "npm run doc:js:check && npm run doc:js",
     "doc:js": "documentation build ./src/*.js ./src/ctrl ./src/model ./src/view -f html -o doc/ --shallow",
     "doc:js:check": "documentation lint ./src/*.js ./src/ctrl ./src/model ./src/view --shallow",
-    "i18n:build": "i18nline synch && node presets_extract_labels.js",
-    "i18n:add": "tx set --auto-local -r osminedit.ui 'src/config/locales/ui/<lang>.json' --source-lang cn --type KEYVALUEJSON",
-    "i18n:push": "tx push -s",
-    "i18n:pull": "tx pull -a --minimum-perc=75 && node fix_i18n_files.js && i18nline index && node presets_merge_labels.js",
-    "i18n:clean": "rm -rf ./src/config/locales/**/*.js*",
     "icons": "for i in public/img/icons/*.svg ; do inkscape -z -e ${i%.*}.png -w 32 -h 32 $i ; done",
     "clean": "rm -rf build/* doc/*"
   },
@@ -25,9 +20,7 @@
   "keywords": [
     "openstreetmap",
     "indoor",
-    "editor",
-    "osm",
-    "building"
+    "osm"
   ],
   "author": "Adrien PAVIE, Daimler AG",
   "license": "ISC",
@@ -92,8 +85,7 @@
   "devDependencies": {
     "@craco/craco": "^5.0.0",
     "assert": "^1.5.0",
-    "documentation": "^9.3.1",
-    "i18nline": "^2.0.1"
+    "documentation": "^9.3.1"
   },
   "eslintConfig": {
     "extends": "react-app"
@@ -104,8 +96,5 @@
     "not ie <= 11",
     "not op_mini all"
   ],
-  "i18n": {
-    "out": "src/config/locales/ui"
-  },
   "homepage": "."
 }

+ 1 - 1
public/index.html

@@ -16,7 +16,7 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH RE
 <html lang="en">
 <head>
 	<meta charset="utf-8" />
-	<title>OsmInEdit</title>
+	<title>飞兔地图</title>
 	<meta name="description" content="Simple indoor editor for OpenStreetMap. Let's map inside buildings, the easy way !" />
 	<meta name="keywords" content="osminedit, openstreetmap, osm, building, indoor, editor, level, floor, map, viewer" />
 	<meta name="author" content="Adrien PAVIE (PanierAvide)" />

+ 0 - 665
src/config/locales/presets/cn.json

@@ -1,665 +0,0 @@
-{
-  "en": {
-    "8cba1ac208566c60dac434d54f7844364a1cb6d6": "Surface",
-    "d388f2ab79305958e022b915f7595e88b3f1878a": "Smoothness",
-    "d62a2e61f010efadd90b6833c0861768b8ecff2f": "Bridge",
-    "5e1d404c35fc1d26617e5796d25ce63325ec38de": "Tunnel",
-    "6653488e47a68c98f962098d94ccfe02d238d857": "Cutting",
-    "5ec95c3cae1eda810a87f935fc6e6c7b03f065be": "Embankment",
-    "b492e85954c9a57734925e1051f9b9e65859ea32": "Incline",
-    "c53e94489b2557fdba88689b234cb347c4699b1e": "Oneway",
-    "325755812dd94be9f4631a2c6620f6370a9c9994": "Lit",
-    "bd1464606a57b5e483f318630798addc4b663d8a": "Width (meters)",
-    "a93bbf623ea6890872a3591e19df565fb0006231": "Sidewalk",
-    "7fc65a69aeec2b9f9e7016334c09bf26139d4bd7": "Service type",
-    "33258756f753e172545b0a98b7e583e47800ecde": "Electrified",
-    "ca50416f8d2560601b643d74f1c506b080b682d0": "Voltage in Volts (V)",
-    "343033feb08a61ccd975c927a5ccd9fe9f10f86a": "Frequency in Hertz (Hz)",
-    "282cec95c7986a3c21706b2e7e8aa7a2512ca37c": "Tracks",
-    "9c99dacb329b3899b9784da23875ced3780e39ea": "Gauge (mm)",
-    "7008c24c567d9a4bd2083103474df81ad1f53a5d": "Minimum age",
-    "40d0e4c70053932860c43cb30201e29b43dde5a9": "Maximum age",
-    "b45a978022a0f3b40568737412efe19caec314c7": "Name",
-    "459bfca3bee7cf89e8d3c732548ed883c487ab9b": "Reference",
-    "62a9ba46f945aa5cda1a9ca9dc3dba6120b6831f": "Operator",
-    "04af3c879938f0361ef6da64c640b9d2bffc3003": "Layer",
-    "07f4daa0376b390d81b08a78453b053bffd55f04": "Service Times",
-    "1285dda58e2520e690fa61928d34b02227b37ae1": "Opening Hours",
-    "559a6b0e9c2f8dba3110ad4cacf3b27a639e3b9e": "Wheelchairs",
-    "4f02f52c08e6611dcce3db0a4797825fdcf471be": "Brand",
-    "313e88ea551b37aba96d224e638252506234adb5": "Cuisine",
-    "72bd73c4f73f5dbb08527b223a0a56c4b30ca0fe": "Internet access",
-    "c7a0619eb78db79c9e450d9e2f5235482aa81896": "Internet access fee",
-    "2ba34186eff9e8255ba58c59d6994584089b0099": "Smoking",
-    "a50aa4dfbf1f4bc16db254a295df72111c40d036": "Sport",
-    "db0151c61508a2c42c2fc5361a45c2a21d1dae98": "Fee",
-    "2a15ef203cbff75298fae6c2b168381d7e9a8085": "Reference number",
-    "2e4ac3b73782fdefa3864986f741afa168757398": "Type",
-    "a6e9a2684235ab1adfee3e79aa603fe48126680d": "Access",
-    "6c45e83b9623cd6eb5f1e02e4fd90d5da63453ce": "Time Limit (minutes)",
-    "06ef33fc94a1d8d3a847371a3fee0f423fb62a3e": "Supervised",
-    "4d12b1a77c26ac10b7e6211c8a40f3743db95586": "Wikipedia",
-    "a652863cde9de3d48a04ba39504973266e4bf368": "Religion",
-    "ec53f865681cfd8052c92c98c18bf82cbc5415a9": "Denomination",
-    "816378cfc41f13c5d85c7e5eb060d042bfd78e73": "Branch operator",
-    "5a65e97153c1717e74b43c48cad94696064a1cc1": "Support",
-    "ccec131c049514b2daa422663e8adc36e82411ff": "IATA",
-    "314d9f810258af8844a07e91f197b5e1d60fc4de": "ICAO",
-    "950acab68d329a33a845b632b226a70b9a34622b": "Car brand",
-    "d4666f560f10847ebccc79406b5b5c79ac6bfa68": "Motorcycle brand",
-    "9769b608aca265bb7dec7bb93aa9eb5b68304aed": "Barriers",
-    "17b48b5c55c0c2c09dd9054a3142fcf080a737be": "Hedge",
-    "cff646dd265f590a04363e9fe01bfc1600564947": "Height (meters)",
-    "26b2a7ac433932f6bacea6cb082169302512df4c": "Fence",
-    "c30d366040fbe6ece556eb540dd0c6ebba66155b": "Handrail",
-    "a5c589a98abae116ae3f774a709bb958fdbb8f18": "Material",
-    "b413dfc8633c1ea168831173d519246f1811ef37": "Color (HTML name or hexadecimal code)",
-    "eb3c9b77c28fa522c6bb08825bb04ca15e8639e5": "Guard Rail",
-    "d0ae64596a4d0a7fd9edb13451b1709d0ec89923": "Gate",
-    "a223d3f0e2327363b8630136a4c74c5aef276c67": "Lift Gate",
-    "5e94362b973ddf684a1e5f993ecf8b61f68d6ec4": "Swing Gate",
-    "2a581b93e76a6e9426ae3c410ade74c7ac8f499a": "Turnstile",
-    "aa2bbe66b68a2c9633ee3979e91bb75610f3bef1": "Transport",
-    "3d078c543d3a48ecd9a023d431d8068815b58649": "Railway",
-    "a5b3b774dfd86f56935da242c5cd60cb0c4abd66": "Rail",
-    "73ba164183160c158d26437413810762b100f5b1": "Usage",
-    "26685bb17e48db05f30ab2706e756a4d509aad8d": "Narrow Gauge Rail",
-    "f61bb216230b165b39c80066724c950d85a9f9be": "Monorail",
-    "427628309e3a69a6a1e1d3bbfff06d7f90e10dd5": "Preserved",
-    "b9abad24efa6f5520b4439cdc56d4e2a6a4e612d": "Light Rail",
-    "c7daebc1b8902d891ad74c4189a2ec431820ae59": "Subway",
-    "433b41fb0831550fb6da6fd4d551ea7c5fb865aa": "Tram",
-    "5019f7210478663ac4f642e1c1396cd6f6b8fbc5": "Funicular",
-    "94a84cbd5312626a55bcad4772af7156e47d9ebe": "Bus Guideway",
-    "db44d40650fd660694c2818e32060c5146de7cf2": "Max. speed (km/h)",
-    "a439a9c446e6a6970c6bf26a9d73ae59b6f2d04c": "Crossing",
-    "4d44ee3b569c73515531badaaeecac8c0b17a906": "Crossing type",
-    "cd16f5f0b295aedbfd4749aa695e8fd5321718fe": "Barrier",
-    "8f43bfc047ab59083b52692bbc586c1f41392eac": "Cross on horseback",
-    "9c8275cf62286d082516156cf175f0e58b433d25": "Cross by bicycle",
-    "cfe583fac332b290ea8849c78437dc0918f3509f": "Traffic lights",
-    "5a5527e098f8c756291485ff209a0e45083b3098": "Sound signals",
-    "0403a7ce11bdddcdb2dfcf601674b248e39deccb": "Buffer Stop",
-    "c340855ccac6241a874b08ff6ecfb8bd49702119": "Car",
-    "29a5b9d0854dd6ea33be9f9b4921dabd745316b6": "Parking",
-    "f127e5fc92739e596b6d320cdabfffc5ac9139a3": "Max. height (meters)",
-    "9ec7fb6f5a24072a6e1bc5cdec778f47b99504de": "Capacity (overall)",
-    "2b0ffc44a7bc78656a66561aa67b392cf41662dd": "Park and Ride",
-    "a26945a0f6e3fc4f0c8ba4fafd8943dce34800ff": "Spaces for Disabled",
-    "176681d5f3d0bef67d9f03a8e27176dcaf7c656d": "Spaces for Women",
-    "ff0531683a42d9746edad527aeaa4f4ac8a62e42": "Spaces for Parents",
-    "e5a529a4d8c27212241b73d0499181b0f0520a83": "See the Wiki for other capacity:[types]=*.",
-    "3e714b01a797840927cd64d48b50f85a910089c0": "Parking Space",
-    "a92c961c86af5d35926d74af43b72c7ad794f324": "Capacity",
-    "5b77e5a66691c0e789b3897f51b18bda69a892cd": "Covered (with roof)",
-    "6085b4a782626ea16b0a82fb9384e0ef44db013e": "Parking Entrance",
-    "bae3ad2e142659acb6c508e0335d27dcd9303c37": "Fuel",
-    "6644a23512d717fd6c829c5d7f31dbd60c402ad5": "With shop",
-    "19f20f52c49e3bce26f8ac40425c1e3400330c93": "Fuel types:",
-    "2fe0bfbc883d588bb3b491d4d8235297e41008a3": "Additives:",
-    "198f02612dca552422d3bdf5a6b23ddf9eafff5d": "Fuel cards:",
-    "3a2d3c359edb3c36b17f3ac52a563d8051cd18ec": "Diesel",
-    "7b46cc993648ee06971347e15dc875dfa1d41a89": "Bio Diesel",
-    "71a2aa4761708ecb3164b05be277b393cff73cf4": "Diesel (Gas To Liquid - ultimate diesel)",
-    "01af22c942d6ea4f1bef39916a304e01b5463422": "Diesel for Heavy Good Vehicles",
-    "d23c7271106de577b47dc547dad4780d92bab520": "Octane 80",
-    "1dab2ae489c274c27d1a5aafa20d9eafbb5e4ff8": "Octane 87",
-    "f7969b70b141398cebf925d89ae05028e8f476e3": "Octane 91",
-    "ac618d35afd82297cdb46183d3e55d1438b522a0": "Octane 92",
-    "1ae288a8d953b4701808eac6cb0bc2aab0611e5e": "Octane 95",
-    "19d3a740f5f428b9f99eda2c924642df3b775dd9": "Octane 98",
-    "bc9c615cd6fb345b7bb30de54a9a5521707a9dba": "Octane 100",
-    "62ef5373f985decf7d3f58fa24b13c2c45fe0711": "E10 (10% Ethanol mix)",
-    "befd411268feb7ab0a613fbee47438398713579b": "E85 (85% Ethanol mix)",
-    "6a3165942abd1537c60aed6d07f73b5551e897ac": "Ethanol (alcohol)",
-    "62a66aa3c1ed9099127f53efafdfdd49535c5bb6": "1/25 mix (mofa/moped)",
-    "e9e04964f2470c3fa01b8769da2a3ca8cbcba864": "1/50 mix (mofa/moped)",
-    "4783236ee22ea0ac78cdd13febc763bd23610dc5": "LPG (Liquefied petroleum gas)",
-    "63a07d98bedf51831049e2dcd94830dbedf7d97f": "CNG (Compressed Natural Gas)",
-    "385a797f63466e352339046e5b588e32ad83601e": "Biogas",
-    "c98fa32540ce31e31b8816473a42c2f9ac2775ed": "DKV",
-    "7bb8c4aca85abf2791f9d6cfdf64191c988d9bd0": "Routex",
-    "c4cba6139c22ac7de2e215280fd4dbc1c5247848": "UTA",
-    "536ea35870b8a23e9e0703e3b166e68e891055fd": "Diesel Exhaust Fluid (AdBlue/AUS32)",
-    "f76afe037d948f142a4428fe61e616cf3f193532": "Charging Station",
-    "6417685705ccc35beb67189aad9f02895f196c90": "Voltage",
-    "bfebe98b407a9ef682f1c90caae68e97d3505161": "Amperage",
-    "0ccd7ec0217a198bcbc8292b8812286aa9f3d040": "SAE J1772 (IEC Type 1)",
-    "e37535d2bdd4c3deddb07559d1892b8b08aa49f5": "SAE J1772 Combo (DC)",
-    "da677d9150f70ef9bbe4c81405de03b5e33a6026": "IEC Type 2 (Mennekes)",
-    "43a2f9def5db66d60235c8b29b00ac5b654a02ed": "IEC Type 2 Combo (DC)",
-    "7aa616c074c101546258e018c0e93cfca8b0743c": "Type 3 (SCAME)",
-    "54933cea935aecb602a320140e4caab6aea04696": "CHAdeMO",
-    "efb289af80a5f9520431e36be9651685bcf7c095": "Tesla Supercharger",
-    "655b564161a921ee9cbc1a9eff131233a37dc081": "Schuko",
-    "5ea4abdd0cab689195cd71c77950e7d2b15416e7": "CEE blue",
-    "cc24b13bd0232214917aed865e121576c1eb9d9b": "CEE red 16A",
-    "8e332cb5cc12e1f8841dc3b6c19c413c450c928c": "CEE red 32A",
-    "2f138cea8758550b8e7b8f1178743ad1f70c5389": "NEMA 5-15",
-    "0a8065d49d45eb5884cc060f5c5cb980c4525c1a": "NEMA 5-20",
-    "5b1daff47792f2a69d8c3a3a2124c7b8f75a7c3c": "Membership card",
-    "d6707b8c758cb65c95e04efce8fed50d331779a5": "Types of vehicles which can be charged:",
-    "c70f01b3f3c1eeee52dd7acc2d8ec19888c232bf": "Number of Sockets:",
-    "54cfd9e3f60ade5faa6d6caa31b7d9633bb8d27e": "Authentication:",
-    "da051e4f0edd6f44a2335e5f99be77cc573a4239": "Bicycle",
-    "869d4ed2769005e01de8917101f55fcdd106be39": "Scooter",
-    "b31635293774abe28d4181c7132e4c77b32768c8": "Truck",
-    "49d9674dae8a29e5fc698763eb3374d7f3372118": "None",
-    "b1dca6ce2054e54417b715c6ebf8b7e41eca5765": "Phone call",
-    "637f3c9fe1d8edb9477571b294bc87bd598e5988": "Short message",
-    "9076da279e7ec1cbca8404732bdf03bacbd1e1e7": "NFC",
-    "96edfa7a8a71aab3742015675d7a4bd407b1139d": "Wash",
-    "4c2c653a66a7a2b8f50712e082ab2d153acac207": "Self Service",
-    "08fa44b9ac2c4f6c4c6a9ee1daa83ceec3615b51": "Car Dealer",
-    "66b0e4416eed45fe4c0ca25fb3ce43d16df356fc": "Second hand",
-    "243cc98ce98838b21946b9644b698e6ce551385f": "Repair",
-    "6c9a4f1432e468bec7c322c634411287de3aa387": "Service",
-    "f56669f4cfc5457be5196a48efbbe31bca54da0e": "Parts",
-    "50b159d6544828a120bd5d62e7c21bfa35054fce": "Tires",
-    "77a8bfdda81ba80231cd7f392eaaf146e73d1fe6": "Rental",
-    "7522c95fab7a7f0d73c2ad51273ec027271cf102": "Sharing",
-    "e07600390f68df7435fd9f127fd4f06600129d40": "Website",
-    "5619650f27cdde129ab662a0eb99c95975fc9594": "Motorcycle",
-    "0d3f32e71b6a2f69f63fe5e5460a5f6c6562f217": "Motorcycle Dealer",
-    "c7f7152769491bc8ef67a4ada12d8d49abe50894": "Services:",
-    "49df8c0e1b1d8403df9c89717b43c2906e2a48d2": "Sale",
-    "17a6cad5f87b32f3d7ddb0bb7129c3c3b8c74441": "Safety inspection",
-    "bd36f99ababc5f8d5bf932fe78c1e3a43909f979": "Clothes",
-    "15a9f10bf7b59de7bcacb3daa3e928e210cc2044": "Other",
-    "93dd379628f0eb9811685b5c04df26c1d88c8da3": "Covered",
-    "a2563eece3ed529dfecf375b02a9377b926e7c2e": "Bike Dealer",
-    "7846e37c2a241f7b57638bfa0feb3a9f0cf3aa7a": "Bicycles are sold",
-    "5ca2bb12894b00c8a4839369ffe98a34cab7caa6": "Second-hand bicycles are sold",
-    "dc595226caa17e96d6fa8933615dd27f60894651": "Bicycles are repaired",
-    "8f28d8988bda94dd14776fb0f0abacbad0afe5d1": "Bicycles are rented",
-    "22172272a22882cf41b320210ebb0e3618e28095": "Free bicycle pump",
-    "bc8d405fe4af35a8ccbab7070cb8c3fcd67a8b94": "Tools for do-it-yourself repair (may be a bike co-operative)",
-    "5c917726ef3e13f45c0c5f92594e519829cc4ae2": "Bicycles are washed (for a fee)",
-    "4c9c398356af4056e43b1b8cc406ef92ab4505d4": "Public Bicycle Repair Station",
-    "f3c821f7735bcefee7764cb97b4bc5dd572d820a": "Chain tool",
-    "0f3333eec45b91127396c7d3d96e146657b6c06f": "Public Transport",
-    "bae9fe67109eb33919321963cd2e4ac2e1d242d8": "Stop Position",
-    "650e04f7353a4f4d73cffa66e85a70ade81e9dc9": "UIC reference",
-    "5f05c89dbed178dbedb1f6b863e0ff2c301d54d5": "UIC name",
-    "eedeffc76b1f5869cc82cacdfe266ccc376f7e05": "Network",
-    "0c618cb7f85429eb1776e1ed1ae3f18c5b6a48ee": "Tactile Paving",
-    "7dd9baa5f12b2b1ba7bb7a3e3d54f5f96effd9b0": "Bus",
-    "d9032c0b32e1c0c095f14209befc068253523391": "Bus stop (legacy)",
-    "ccef3807318579fd226a30b1faf4834677bfdacb": "Tram stop (legacy)",
-    "a5cdb6d810a275eb7771294734b3835ef83c3a13": "Train",
-    "1d68cd9b4c13a64ae775bf8b57934f1a5f07e21e": "Railway halt (legacy)",
-    "3cc78f46480af3f3a3a3b90555362dd88a59d34e": "Trolleybus",
-    "bbb158b34222cad8320ee1d9362d76173cc47239": "Share taxi",
-    "73058cc47f59f8ad0554c90c79f7d1820d3f33f0": "Aerialway",
-    "b93c94013e88f8666cfc1d37180458453def3dbf": "Ferry",
-    "66501ca5bddb0f3869d5bd6d6cfe5011443a5b49": "Platform",
-    "a0619677da4f50e6445a3cb9e97d8b6261c19d99": "Bench",
-    "b3f0115d621f5e869219fe6e9ff5c68270822b71": "Shelter",
-    "b286bb123111ab536048ad3e4be2f41d0133c3e1": "Waste Basket/Trash Can",
-    "162bd58a61cc29d1b4cc0aa01bea9b63cfdaae9b": "Station",
-    "ba6b9a41577507380e2efb273bba4a4e6f48319f": "Area",
-    "086e10a0e26827a42c333b5ceb500660a111c25c": "Building",
-    "e8c8fe9e24803f4b9eff2f9d414ef55ee17f8de1": "Subway Entrance",
-    "fa412a10c689a57b63f2ac78ada67f181d43410f": "Ticket Machine",
-    "78e6c061697068262837f96f70a512fc7a37d268": "Airport",
-    "6f45e5552eee36a75b63492f21c1f0a0bcf3c101": "Airport Ground",
-    "2c74a1dce3b722d8c7b76bcaf349262994ca0e00": "Runway",
-    "8029a5aee1bde5765bd39ea3d8cafa9abec68d2d": "Taxiway",
-    "b2c2b02cf155c512632745ababedd8e2a7de0a60": "Helipad",
-    "f4cd98d041e30bedd8217356de5976b26614fe8b": "Apron",
-    "20242751512b7d8dded3546a7891953afd91c2d2": "Plane Parking Position",
-    "23323e67740f3b80fddeb5488eabd9f0aae911ff": "Terminal",
-    "ef00d6ce7e8590661a465cd9fa3125e03a0d0b16": "Taxi",
-    "e6265e1a1289b82ac8a3e01c212bd873823f98e9": "Facilities",
-    "f794e3e2f1a3cd51a2712d2df83321a8063e83fb": "Accommodation",
-    "9938a3ce668ca4a032b8382dd57e7e1b28bccc66": "Hotel",
-    "5817798470c555f35ebeb8dcc327457f5e2e5d44": "Stars",
-    "ddd88c645aa072cda3532180b4ca14e87c9aa666": "Rooms",
-    "e2acded36680915ff7d604862c058b73741bfeec": "Beds",
-    "3a3a084129a41e9c8e189e7002da09a1177e2442": "Motel",
-    "4ed765c05d44d584bbe6122835e232e5ef0978dd": "Guest House/Bed & Breakfast",
-    "cf2dab630a43f49cb45d9a381709a7ede8ed2461": "Apartment",
-    "370dd1ee7a31cb87427c29549ff88de9637ce963": "Number of apartments",
-    "88f08ea7211f203f92e2f034699e25b602bad48a": "Chalet",
-    "106e44ec3f5fbeef8c8d7b9a656b701b87bf537a": "Hostel",
-    "d4eae5bfe7a4f791f14bb7044d57b74e57a97997": "Food+Drinks",
-    "cdcf20533032e7afaed7606310b4ad201185d827": "Restaurant",
-    "95be518be4fd7ef1c236ebbf143619c83386c04a": "Microbrewery",
-    "3f866fe3792089a290b3c7fd5744930cdd5e195e": "Outdoor seating",
-    "c2949a050e768b4ef999012bfec8733dfde2e5cb": "Takeaway",
-    "7426c0dba164848df58cf9dd54726532d805efa1": "Delivery",
-    "a8ceca6c32d758dc1d0197e679bb938375e89d1e": "Fast Food",
-    "51fd168ce4431a5801ff9c6feb3e6bdbd9374630": "Food Court",
-    "01763b0bf177e4652ff03d16dc1dcc50fd6250da": "Cafe",
-    "ea4233533dc4447c84b56c42990662bbe00041f1": "Ice cream",
-    "e44d6f19b4e15b9d877b832d4b2ff397d28ee640": "Pub",
-    "83d826955b21b473d94a674320ec484bd2f008d4": "Beer Garden",
-    "46651c409f45402a1a3bd7497b343986a2c2ae5e": "Bar",
-    "76fa7f1b22ebfade9763dc5a3e8c837080eccd69": "Tourism",
-    "5eea09a4f024e692c6d16093808837355d0d68ca": "Attraction",
-    "d5e6fb8ddd14ee31a2a441724783b718dda8b41e": "Information Office",
-    "5dd9909fc80912f4b5b5de5ff594387dd2013043": "An office where you can get information about a town or region.",
-    "6f58a3a8c5e48afeedb29afb8d58a408026760c1": "Map",
-    "86ed0d33e714327ecd916cd29096dfa2fe62e427": "A board with a map.",
-    "5a05f7b00959671743f991b8084ab0d5cf267a5d": "Closer description",
-    "fb1669a7018c0e1473c8420c207f83a1786ca6ba": "Detail Grade",
-    "ce1a8d726cdadfba3b51d790bfc9df147633a880": "Shown Area",
-    "33a6660f28456a0b44235f52ff440fa2c160dfde": "Routes shown for:",
-    "d3b46f68dd1595ce308e95db5a0036c6c006d931": "Hiking",
-    "5d8ac3f662045deee7ff4b0312f23567add9e54b": "Cycling",
-    "0125aead430b1f6761649e7d5afeca96d62c5649": "Mountainbiking",
-    "e28ac2794063ceda8a9b2b2565926da61895a068": "Skiing",
-    "a279cd8945df125b76a13651c5236593231cf259": "Riding",
-    "cbfcede7bba09f933638b9d43af4aea4b2bdfbd9": "... other transportation modes possible",
-    "7fc1dac55d54c820d8128a158ea74659804dd520": "Information Board",
-    "a2236c78372c3ecd62aedb65ed67c0fb24485292": "A board with information.",
-    "28e7e6fffdbd8a91b26f4954aa00d55aacdf62a9": "Board Content",
-    "41f2cfefadf3eefbaf32fc72f134d75b424cd000": "Guidepost",
-    "a185d625934dfe468afdadd257ea64155c73b1ec": "A Signpost/Guidepost to indicate the directions to different destinations.",
-    "43dc525ac32b8485fd797b732c87f50e53253877": "Elevation",
-    "508bdb6f697d05f165c2e691c30398c150243e98": "Information Terminal",
-    "4831f09d5c5b5ba455c0b3703ecfe144efaf2017": "Information access via electronic methods.",
-    "175ab25d2d030c7638ce3820c32e709ac24e00a9": "Audio Guide",
-    "70c1a9293fb1dc711b68626eb467024c3c3b8fac": "Information using headphones or a mobile phone.",
-    "066ec1d6fbe485b383261844521d1dd29995a399": "Audioguide via mobile phone?",
-    "af7822e2604b5698fb5a75b8f35d768d2651c635": "Use E.123 format, e.g. +49 11223 456 7890",
-    "46c1bc32ff96786d7d907e60ea45a44060f55f3b": "Phone number",
-    "71a827996961d7d2a5fae24b2fc74dc7b7bb59da": "Other Information Point",
-    "bad3ddc26b397a55bab546ea6327b5a5abb3eb50": "Leisure",
-    "38532cd37d2ef2f2405f7fec593d3e30c6f931e1": "Movie Theater/Cinema",
-    "8b7ba503602407c4d006cbcb318169806339951d": "Drive-in theater",
-    "799bf0793b6b2803d69a97b487c71c0513f78e66": "3D",
-    "3ab6eed05fa2d44bd8abebe261d6d34e9492d899": "Number of screens",
-    "21d2a00664a46c67092b6035678ae2bcaf2f9c30": "Bandstand",
-    "220dd4b05569e4c89cbc36b269fb48a0cc81c011": "Zoo",
-    "7df59b2a55c0d93e484e2bf22502d68001f074b6": "Animal enclosure",
-    "fe24587c77d94fe7e9428df21e5716170ea96ece": "Dog Park",
-    "d673020d47e4e6721422522173df2ab181ceecdb": "Amusement/Theme Park",
-    "5d9068c43e1fdb1b2d8f07bc0cf8b12794301e3b": "Water Park",
-    "1067f8ed2e0c68b21a8ae01f43924fdaf4ea6eeb": "Resort",
-    "1b33eaa6be195a498ea3383eb145a8ef2bb4b022": "Swimming Pool",
-    "07c50f002352b6944c2885607bd4fe0a64fdd2eb": "Used for the water area only.",
-    "808a909f025c74f6ed26c71ffc74af37f7fa02e1": "Fitness Station",
-    "2a501eea14c7328fdb7d5f475ccbad844188d3f9": "Description",
-    "f5f35662ac2b534dca9f909ef2e8e96232555cde": "Sauna",
-    "908d8f3570c1c53027ea808bfcb01d3800fde0d3": "Playground",
-    "a06b72ccdd2f70f4087876719de5071549830392": "Picnic Site",
-    "4eba0c16a69c499b23d4dcf41372b5f28d779107": "Fireplace",
-    "5b104052f7b1dadf3348a22d69d59e5eb348a594": "Picnic Table",
-    "0c61c13303ee0352848d1db73ea3605cac1cfd36": "Public Grill",
-    "1621c961f2623b7da09b7b762519fac88eb1d9c9": "Firepit",
-    "8ca717c3de79d717dc559f1e1331241eb35f4a55": "Night Club",
-    "047fed2cd6e5bf5936dba34d07b7758821a09c83": "Casino",
-    "3895513a1bd146996a4f37a7ec550afe7cc95a72": "Strip Club",
-    "387b7f2dd50c97ce5868b821a273bbd6687f158b": "Brothel",
-    "ee4ebe9cff4e4b2de886262673f9d2f075d633c1": "Culture",
-    "e98d42cc36d372b9abdb884cdb256f63b6ef0a1f": "Museum",
-    "7d58d7daddd61f563c2d1fa7462dfa04cda66d91": "Theatre",
-    "376128992d204921fc1afbf30818599321ae5f4a": "Library",
-    "606ee76def5da95ffd2889413f0b606e05c79070": "Arts Centre",
-    "d96b4d6b1a537ee52fdb4e24be3f9055bbf422d7": "Artwork",
-    "542494945768ce01e6dc6a6417fa6ff221916a51": "Subject",
-    "8b03daba4bdec9233cbc5aef6229eff2cbb3468b": "Artist Name",
-    "30bba22332155e4413f06f9eb1dd460700552ab3": "Start date",
-    "054e13ba92847928561d3f3cb6efb212e686da27": "Studio",
-    "ce2fa99177dec3167e057d8b2d4ac707b3409565": "Place of Worship",
-    "f7178891d9b87f13f7a3cbe6bdc7cda537354196": "Church",
-    "f42bdfdba644d125bd47aa453156da8213124b9e": "Building type",
-    "62bc77a87a8624418fcd4a779c3851989cbe61c2": "Mosque",
-    "5e4ce2de47e842329b94a6a647d15d19ae3e30d0": "Synagogue",
-    "28f5cb8f63ca3d7c3c350f32e90178bc50c50fd3": "Buddhist Temple",
-    "d304487d732dd1742bd113d41e488f24f462086a": "Hindu Temple",
-    "fdb7be1683db04004a02d54d5a1fc64c5676ccbc": "Shinto Shrine",
-    "a543030938155bfa31ec8c2ee07c46ff5e89558b": "Other Place of Worship",
-    "9c4475a5a144938bd2a846c1b4168492cda11059": "Public Building",
-    "7f1754e88def3aae503e5cb517d5e1888a61b68e": "Town Hall",
-    "7748088c168bc09a030c6dcdf07e9bfb9cd3dea9": "Community Centre",
-    "832dbc8fe7e0455fc36e29e6523da69ca55a6db0": "Embassy",
-    "98d7d371eb2d97e31e44127ef4c509f136603622": "Courthouse",
-    "e39787818f943b76967c1191257093dfab2accd6": "Prison",
-    "d3ca9616c94522a040aadaed6a07577103a4dfce": "Police",
-    "375038d080f8e55929a93c5cfa5010d6b336969d": "Ranger Station",
-    "63c8e15285581173805b2a442824c42b15d53cdf": "Fire Station",
-    "8d8c3038045b9b328baf7ea49fe998313d720793": "Post Office",
-    "7db652d3fa86aa83de05b73868fc27cea87176e1": "Education",
-    "f5852ccd69391c018e9cbb735fd53b15c288da6a": "Kindergarten",
-    "507acbea512ee0d5e430bf58f0ae0a0a2b61854d": "School",
-    "5070ef2fe01f0e776431bfc43d7cc8fb48058a4c": "University",
-    "6b35092d5ee2f547660e976226362e1288412ddb": "College",
-    "03f24ba2f1bfdbae6d6aa9dfc11ea37961cc44b2": "Driving School",
-    "f1cff7cb9c0f05d6ba280c5e629db5cb6ee581cc": "License Classes",
-    "a6174dacced692dc6ef2f3b6a22bbf9cb24168e6": "Health",
-    "b1b81554db90c32e06f95ca96612c3f2913f5eff": "Hospital",
-    "0f7b057b3e917251f962ca33357601ae71df7111": "Clinic",
-    "360abeabdf00327aa566476ace1594105dc5aa97": "Doctor's Office",
-    "a43a71bc368df8a2c1257240a734feb0e2852e5c": "Dentist",
-    "6d44c437ed696a13d0c8f30df058cb166e04414b": "Pharmacy",
-    "d61f9995a298f7b5485cf122e037edd052778a8a": "Dispensing",
-    "9fd12d3aecddb6f936f5d702ede4567b5c3318ef": "Baby Hatch/Safe Haven",
-    "2d223d9a62e792af62a83875a944d71aeddf0b3b": "Emergency Access Point",
-    "9fc90ff8746922cbd40b2863a18dcb8825c3a171": "Point Number",
-    "8e218973fb97e5633c2b84a8fd94554938fb4a99": "Point Name",
-    "a3984b73943483d85f84e3339a283840bc34b021": "Emergency Phone Number",
-    "001f71c43bb3b106d70b231fe6ec008ceef4156a": "(Use number as shown on plate.)",
-    "ffba8ca59d1c3c6746b982e63e0ceb9a858a57ce": "Veterinary",
-    "b78cef21a5bfd9a9baac70f63725b9674baaf5bf": "Emergency",
-    "960e928357349002f63b92714c9fe8290f5fe2b3": "Ambulance Station",
-    "68889c39f89c9023c0f49ea8d196aa7eca84e3ef": "Automated Defibrillator",
-    "d8a5f46c83eb36bcddef602f2e36fb2a34c1cba6": "Location description",
-    "5477ef1de1c4fef8d6c74a505c1c52527c665d91": "Located inside a building?",
-    "4705e017aaf2bcdca8f583a98b3896fee137244e": "Fire Extinguisher",
-    "54c332db5ba733792edd733bb88293c6a7a49cb6": "Indoor",
-    "c7fd88d9fb181098306af7839a327c5bc2e6d248": "Fire Hose",
-    "93e587b937c322b66d096ce4d87c94270913a454": "Fire Hydrant",
-    "1caa358d335874cb22c220dcd25289cde5deb8f8": "Shape",
-    "7b7f3ffcfe3734f26790abac6b20f09d970b4954": "Diameter (mm)",
-    "afa03ab38132f8c46a2fd44b5f70f06d4a010b14": "Pressure (bar) or suction",
-    "6ea23d2433cba518f44690a50911de6f9633a2eb": "Flow rate with unit of measure",
-    "82e87e1f4c21f1404fbafe547088e19cea0cd79c": "Each coupling diameter (separated by ;)",
-    "760746e5461a6862184bf94381bce477b177191d": "Manufacturer",
-    "dc9188ebae1968b46e7866f6fea9885986153461": "Water source",
-    "ffa2b74bbf6fdbdda5d5e3b4a98840106353f988": "Hydrant Position",
-    "16145c7061de549b724fe6195594ce14df346583": "Pillar type",
-    "5c49a4bb14120892fe8f1c941f85e0d1dee750fc": "Number of couplings",
-    "54362c751bc9558cdb5c62238307f35e0aa73da6": "Colour",
-    "a21ca8160f57948b6085a7befaac13c66c004234": "Colour of the top section (bonnet)",
-    "16637693ef0daa596ce9f16bb0f9a1f576c1571f": "Colour of the caps",
-    "a0efc393612caf039c83e78901ee60380063b783": "Water Tank",
-    "e4a328d1c6a6f17355682436bd3ac97dfa41717e": "Volume (in liters)",
-    "4793bd7243a646f0ac71822f699bdd53e3913039": "Assembly Point",
-    "2d6db004ae9bb9b7a1e5153537f91c8db2f7c87f": "Emergency Phone",
-    "8337904de8ba94dad03ab02546d526fa74315700": "Siren",
-    "e7756d19c97b14a0122b721013e959d330815a91": "Range (in meters)",
-    "742faad81db0bb715b6baee9addad1f6b350c4d6": "Purpose",
-    "7495891c30399c092dd83b7e04f055db787b61eb": "Social Facility",
-    "f6ad773865f026211ac34b999efa4212c515feff": "Nursing Home",
-    "ef414bc347a5dfacbdf36e0705f7dcc068fd8154": "Group Home",
-    "a788cbb1b0b13f3b1b35394942d86a8267b2f2c6": "For",
-    "e86affdd9d48fd1de046824fd9eb0ba8f9e71340": "Assisted Living",
-    "69156314800d7895b14c57a2ce68facc957e2931": "Outreach",
-    "d0e63c557c0cac5c10740433105452db3ea63742": "Food Bank",
-    "8fbc094504b550f46e981d1e66c7e20892a471db": "Toilets/Restrooms",
-    "605557cae5faaec653dc9d442c94e7a1040f483a": "Access rights",
-    "5a973bf3053311cf653fe6de0f9dd71eacdfc78a": "Usage Position",
-    "1ce9d5855079dcbfcb2f154df4ba3821530a6511": "Diaper",
-    "bf7e977aafbfd1555892e3567ede2156bf77e701": "Female",
-    "ea3f770d14f9289d34c6f3d958432480b314e1d6": "Male",
-    "2ae2cd3f1138a5423673121e6239021942d08f95": "Unisex",
-    "6364aea801c8117efebfcb1a142c8b976ff23c7c": "Drinking Water",
-    "ae3448e3e9c82da15fdd2f93e99cca5159db3ebc": "Shower",
-    "5e9ba2afdeaee6d1117f52785e8549cdc6e1cf3c": "Post Box",
-    "94e08daf21e226c46b8afbb3f158dffa8c58c774": "Collection times",
-    "5233f579c394551f9fee5cad0764cad3efd7e7f4": "Drive through",
-    "3e9f5d5ff853ac80469521015922529982849994": "Telephone",
-    "2669dcdd9655a0a927a5b491b487e493812f226d": "Coins",
-    "b887f8dc356f1db75bc586d5a829a002fea07dbf": "Notes",
-    "22113ccaca7a1974512af3e8b7a9b2ea51ae3013": "Telephone cards",
-    "7efce123b38ea741f4bf3e3b99b4b8bf2a9d0ac0": "Internet Cafe",
-    "af2ae5c3b81eb0fc9998cf07a2859f9993b44c79": "Clock",
-    "0155f9f63b49ea0058418b4b8be3f85d0faef70c": "Display",
-    "6ac469c2a00424a031a8730041118ec6b8958b28": "Faces",
-    "8fc5529b71605379545ccc84129defb5eaf08006": "Visibility/readability",
-    "8727935e3bde1a762c0cb60466ee15e19c4c5c40": "house (up to 5m),street (up to 20m),area (more than 20m)",
-    "6f7a6f39cc8383eee690d501f182fe6fc8b357c7": "Shows current date",
-    "c85bcb29e6a17bb2fcbe071962f4c43d87ff7c3b": "Shows temperature",
-    "51bfc9ae7ff8052fcbc6a94a596a8c5868821caa": "Shows barometric pressure",
-    "aecbe1fd89b3bf202662bede19dbaf776c81c137": "Shows humidity",
-    "f2dc0590b8a04319e9d292ec2f71a6ee93a3c66f": "Photo booth",
-    "1c0133f440184ef1381da358fdf6f85f880ae07f": "Recycling Container",
-    "b3fe1ab6a17a0a2a7deb9900903482cb9a10d1a3": "Batteries",
-    "beb3f931ccacd019e0627cb014a4f60f862cdc3c": "Cans",
-    "53e5f13eb382023bb03d97c5feff444c7a58d4ca": "Cardboard",
-    "140445b480588e2e2d866d9deadb879b8b7899a3": "Electrical Appliances",
-    "4d1e2634b0507518287d9bf3fd2f06d4c1f6cc4e": "Glass",
-    "6c94aab188d041be2b8751b0b2430ae8074425ed": "Glass Bottles",
-    "8b7457bfa02da16c160f57245a83cdc7404e819f": "Green Waste",
-    "6508f0fcd15490b49958853b5419d48b4b43d07b": "Paper",
-    "0f8663514f63f77c388e25c02f285c1905702a10": "Plastic",
-    "b65e1509c4ae4f6c712fd375de9b8f80423f747b": "Plastic Bottles",
-    "757c20c9665e1e4880682f8f95c555aa97986bf3": "Plastic Packaging",
-    "ce0aa75c829a6ac821fba50741d217ea3c7e076c": "Scrap Metal",
-    "2a4f5aabf9c8b3da323d495efc09051a094a0a37": "Shoes",
-    "8bd8d3641e085b63555ff6c25ca72ab74f2f8c0d": "Small Appliances",
-    "638232e39a47059ae9d5fd04cdd7ba5e55315c02": "Waste",
-    "c2a37da5a39f602697d6b7620a9a9346624d9b83": "Waste Disposal/Dumpster",
-    "99a2c86318f9aa75a76b2ca5c010654767bbbe91": "Sanitary Dump Station",
-    "530934114d240f65175c463e25f0bde541e46592": "Suction pumpout",
-    "06c616e194077d31d9b6225d9542a7ade1ab92f3": "Gravity drain for hose",
-    "773e7c0b8c85f8c7e6a99066630a0e6c29730f05": "Casette or Elsan Disposal",
-    "91ec07e1bfddc0d899a3864ab25931e923272ad2": "Operation times",
-    "77100e10cebe13141acbb848e05bc15d797fba32": "Backrest",
-    "b1c2f19c06899f533a3b6dc0321196436633e2ed": "Amount of Seats",
-    "3a4f4fd6824765e92125d45ddc2f3635c7052c21": "Type of shelter",
-    "a861de731d17d33ba4bfddc2f88efba31fe99ce4": "Water Point",
-    "292fa3e4f59f8561f2f78425e1f06e48db987acf": "Animal watering place",
-    "72164237eaafe6eb38ef60a1a0dad65d94356484": "Compressed Air",
-    "c467cad9f8bc24de93084cacd56350c53e2021cc": "Valves",
-    "fbf2b002291bc9503dacc8822d3d0dafeb319dc9": "Dunlop (Woods);Schrader;Sclaverand (Presta);Regina",
-    "2d58baee0eced70545e94a9c9ac9eb8976972ed0": "Advertising Column",
-    "982103b53016cc795f7896e17d96101f7cf52bcc": "Billboard",
-    "28f2d79b3e76d0fba8de5bcb7ef20f672b807294": "Sports",
-    "1b326d905db391f205f575a1840394e99c87637f": "Stadium",
-    "dbdec847d466a0ee5b38360be7c2898df8451570": "Sports Centre",
-    "74dfa355513a4f195082196b84dc54b9b2c87869": "Fitness Centre",
-    "02257084caaca65e71c456be4abe19d92b9a6c16": "Pitch",
-    "8c03d66e77f8d65298454c1f11059b2004ec35b5": "Golf Course",
-    "ac37022a948deb0c4aca88ff5d6dc087f7b1e070": "Man Made",
-    "cc58514f1c30d8f4f353f0b1d10e42ff47f7b970": "Historic Places",
-    "0c109e0a18155c4ff986b71f120479220eda5785": "Castle",
-    "97795a734fa006834e278ab6e4fd62f52193a22c": "Ruins",
-    "f368843c94d74155ddef4f05725e2bcc25bde341": "Grave",
-    "bc699df69689273fb357ec7f10c9e1aa10c13187": "Tomb",
-    "a9bf6bad315d9ccf9d2b00f387d6e9b181c54d77": "Monument",
-    "88ab8137bcd163305abe125f3543eef9c26fb3c4": "Memorial",
-    "e78aa4bdbf211ddd99a006c9e023e8ab943b8089": "Inscription",
-    "9746294a2c204ff40d2a9a58702762539a530ba5": "Wayside Cross",
-    "2dd130e42ac946bcef9f7a41b1e1a86bcb424f27": "Wayside Shrine",
-    "e3ac332b47a54dbc7e5d9e9597e2a137ff4bed1e": "Place of worship",
-    "9361f42ce14c9686ab78710a87e5c274f295afb1": "Boundary Stone",
-    "c0a89e0df25232c9ae1b46e2a09e98c9ebf4ea69": "Tower",
-    "0a667c89b92c3f9f5697dba72a36b5d24a80be58": "Tower type",
-    "a729bc7b8e73bae8abc9e9e35145d2ffcdd74c5b": "Flagpole",
-    "2a5c9261abdd5b7530c1fcd7347cf9ab44c7e888": "Cross",
-    "e65382fdd2e499489b89667bde4d514454fc83c9": "Crane",
-    "9ccc1c0118b017850eb2d9207367b4014bbb4f72": "Fountain",
-    "243673fb18b4637e5d2f398761e1acb5e9a0574a": "Water Well",
-    "4ab137c31ca57f1b156ff44a61e1df5d0953cfde": "Pump",
-    "0b1a57305ff71c89c551b4b68ef561c1c0c0f124": "Street Lamp",
-    "7fb3e6fa9b15f8a7ecc275c313b341d89278e4cc": "Survey Point",
-    "c52e4e25ae51f4919cf017e41a79f5acaace0655": "Surveillance Camera",
-    "7b9b48e3878d4f420fc3dd476c36d70cdf35b0b8": "Zone",
-    "6574d5951216c0fb888afeb278b02a0a2fe20cc8": "Mounted on",
-    "1029bd4b7b1b30de60f2b96f4fe25e3912dd635a": "Direction in degrees",
-    "c8395db7ea7a38de472172036f218f170766b40a": "Inclination in degrees",
-    "df2bbd50cb88352bf43829364a62da34ea033ab5": "Camera",
-    "8af639564d9b45a5bc7e25f089ee352fd5704cc2": "Shops",
-    "6e925438383d3b88e00bcc7252e85a05898dfc3b": "Food",
-    "e57ea4f49abfe710d2230f611899ffebdc69acce": "Supermarket",
-    "ab4bcb1919f949cd5d16475405d121f6e1dd7b85": "Convenience Store",
-    "dc0e291bfdaad7163d9ded008008e31522d507c9": "Kiosk",
-    "cb8f461a7159ea01f90a4b11d5173c4e5eccd576": "Bakery",
-    "054c0bec7f2275234784beecebeb95507c02c5db": "Butcher",
-    "fd5c4c67ea3b7cfaea88ab279a55ff7373bf8f01": "Seafood",
-    "bcdc42dc1fd4bac493ac7c017d9296f6e49e2c6f": "Dairy",
-    "ef5442c6ee3cfabe55832b1667797040fb66f237": "Cheese",
-    "78f21be65ca690c6f2d6ca9381cf692d4cf5afc7": "Deli (Fine Food)",
-    "218e8f306f92d5e0051cc9bfb0d8cccfc482dfbf": "Pastry",
-    "bdbbf0c7ee150eb10e82b51a316872b00c6f3a37": "Confectionery",
-    "d2b51c214901280ad8fbf82fa05902a17a208e12": "Tea",
-    "febbbf4e992859115011da47ed3ba611d5e243fd": "Coffee",
-    "009051c50834ca9d88046afcdf9f3117e7786515": "Public Market",
-    "9697102277498e5c7af2b65fe851bcd9fc748f75": "Organic",
-    "64484d268a47c8ed2226c6995a2d4d8bc0f27fe7": "Greengrocer",
-    "10628667c3a499a9b03815f074c091abf9ac069e": "Farm Stand",
-    "95e025a64a632a847252f04bc378a45dff7b965e": "Organic/Bio",
-    "d74db986cefacee3964f906860ab68a66016bff6": "Fair Trade",
-    "f5a2cc2c324ca43cf30d3114b5ddd61501f95279": "Alcohol",
-    "a25d15b94056fb0cc6a25d9c34e67569cc61b34d": "Beverages",
-    "93ab2690fa30e5ab5d12d7efc0a2b43e3df817f7": "Wine",
-    "1ec961e20a254b24572ee76d5d67b82e573bf1c6": "Boutique",
-    "da8e1d26455640fe9d11ee11ac8dc0dca2aa063c": "Offers repairs",
-    "429ede1ff15f522f088095519c15f0060b02820f": "Outdoor",
-    "acc49d8c0d4686ead5a980b57061b184bacef24d": "Dry Cleaning",
-    "a86a87455494da336e7f739c05d834d6c84f22fe": "Laundry",
-    "03fb78c5351f9e491c39790b3406a63de3396a28": "Laundry Service",
-    "c0d00277d95621650e474e9172bdd2106c1853d4": "Tailor",
-    "a289af1d2d11f931ff1b9b3714c42226782e9ed3": "Fabric",
-    "d3b0d4c72ab68c6f918f01eada3de99e04751b46": "Electronic",
-    "483aa33013b8a04f7315364e37b8b36a28df5d73": "Computer",
-    "dd142f410bf85ff9be99f18967c9dc1d502c48de": "Electronics",
-    "cbff2ca42f72362f87c5dcbcbe63b5175cd4d46a": "Mobile Phone",
-    "15681794d6d3a04454367d24af5d95dbfad0c2ef": "Vacuum Cleaner",
-    "d8c55cb03234a8217199a447d0f3cf85dc03ee50": "Hifi",
-    "8973097a480fdf160611b7f84c0ad3c9c992d52b": "Video",
-    "180896f967c4642032c9a781f856c9edf65728a0": "Video Games",
-    "8f9e23442f63e719ed45bbcadfa43d010b1a2f55": "Music",
-    "8525f3a5e5016c581102fdd9aae15df93b2a59ea": "Cash",
-    "0b782ff5730a47353236b3a3c80bab201e638065": "Bank",
-    "cba748c1fcbeea9a92fd0809a7616472116d1604": "Automated Teller Machine",
-    "17d282ce78683183e96c87351f2379e0d7975d37": "Money Exchange",
-    "b58274088ef235f51b64aaeda072a4be927ded7e": "Pawnbroker",
-    "6043e5934c45010f38d52bb953aa1bf8d3860d54": "Home decoration",
-    "72af5d97af36c3c3584fb7050cf4300975cd1261": "Furniture",
-    "048da5cb3e281ad572d08ed47148cc72a5ca057f": "Kitchen",
-    "97f8af9e97bd4629bef3406b0fbf07a03998147e": "Houseware",
-    "8f4369c6a8a2cf11fb6d4077833dc28d07d85b2c": "Curtain",
-    "ac48382a7ad88f84edf712e3e44802fed07ba20a": "Art",
-    "ffc5eca14433a4d22ba3902c987c35aa210efc37": "Frame",
-    "c7260b09039a4ade7e0f08beef9a31a0ed19b792": "Bed",
-    "78db6a7d5dc65dfd604b8532b78be7fe13414170": "Carpet",
-    "cd76e8de45b41afb595ea7462fe9c7e5fd5cd925": "Interior Decoration",
-    "132652e26f8daf4192ca9aac9ec6c16b1f583974": "Antiques",
-    "29c02a327df880a9b230752da552a2d811807445": "Printed Material",
-    "0da6a8c83c3527a29525d420d3813482e72b71ab": "Stationery",
-    "eec434e1aa251a8d4af64483f4130003c47c1724": "Copy Shop",
-    "0e20a03355cbe32fa4a2609ee85fa5d122343cd3": "Book Store",
-    "85b55a2aaa3bef9961b239ff7807ed6fd94f324e": "Newspaper Stand",
-    "ab8078399dccf2dcfeedc93366b4ccf60cef1297": "Ticket",
-    "819157d6ead9041ee2f0a0028afbad20c0e96f2e": "For the body",
-    "b1f3f32a6e098fc4aa3b26df85ca731b1ce81a97": "Chemist",
-    "c31e153e406a4d04a1e74f6cb14cc42c982ff12d": "Cosmetics",
-    "bcf5a383877e1e890a7ef1f47e5f1e4fc04f8373": "Perfumery",
-    "949db9ab1b83ffd7e8915c3b5cb802c309181f3d": "Beauty",
-    "ab262b8678a7e356ff401c1869481de8e902b387": "Tobacco",
-    "237a4c2ccb391e955136381db7c94d6c1b9877c0": "Hairdresser/Barber",
-    "4d4a3bb45a16cd8e6f906890721ef3a9e41eea3f": "Massage",
-    "fe638564bb92db19e322c49e373307d5d7ee9a41": "Tattoo",
-    "f80273cb377860904944430497699e4962deb16c": "Optician",
-    "52e02734694d342fbf83be51bdfc352d3c837bad": "Hearing Aids",
-    "0e389340a515ee89d4fa095d020a5278e68e07f8": "Medical Supply",
-    "eb3b3e50c1aa02ba7fc85493e64110cc766b9a06": "Jewellery",
-    "670e6cf7fc4651217137fb44daa9c44b0afd00a7": "Erotic",
-    "8bae32c66a8bbefdd74622b31ca7fab74d09cfc3": "Department Store",
-    "1ccbca59579c34174f82b4cecd9d862ba61e1920": "Mall",
-    "bdf1bbc9ea6720ec00cd8cedf88615317bd5e9d3": "Florist",
-    "2b8686e8aa2275778525f42466d9a110b7fe3640": "Garden Centre",
-    "ac47d8ad77b4828e3827315bea4eea23ad9a028d": "Do-It-Yourself Store",
-    "3c794a28da0a341ca7ec72fa7de3e4ee8e93095a": "Hardware",
-    "52c444722cdb05e3e6841fd300b4dc8b14de0cfe": "Paint",
-    "85bccdc203b71e7a465121b728af0e9e1e6fad8a": "Gas",
-    "5da9eefe3f5528bad553af9274e8d3cf3550bbc5": "Travel Agency",
-    "85f8fef7dea3221502b82279ddaef1b807bc8338": "Musical Instrument",
-    "a709f0f93e89d06b53b0d506cf64b7dd91c17d88": "Toys",
-    "9191b48f77ff162691aee4b05d50471c012ac2f5": "Gift/Souvenir",
-    "932ab0533f595ef44857e8cd918faaed7d79b084": "Variety Store",
-    "8c54ce4d14dbf62b0770f100ab3e14201276fab0": "Charity",
-    "3087046de3f8946a65ba8540d8eda9e16b80abb0": "Bookmaker",
-    "498f8325b5b12e858cfe03328ed9b1317a9f41d6": "Lottery",
-    "ae50cf94450852176731ff8c00a0ec724653dd75": "Bag",
-    "dedbe37ec5281a8d0d43e79aa6b426e45dba44b0": "Pet",
-    "d6e28b14ff9cd7bb3935f763c8056faf3d6f79a9": "Photo",
-    "0196716d697307f5356f0659c3ada161fc754f46": "Funeral Directors",
-    "622abe17ab6249f3832a59aab739b09f47e5f3c1": "Vending Machine",
-    "f374658108a3b28af9223791bd4e47e97485c2ec": "Vending products",
-    "c801f384393e5196e59492066420a598984a5458": "Offices",
-    "1f55300512d2c2e7d1e7dd727f42b9e8a64bf19b": "Accountant",
-    "cee5fbceeb1aa4cc1db31ea954ba506365297e83": "Administrative",
-    "e27a872e3158f0a5306a9c4b23c47acd2adfea28": "Advertising agency",
-    "ea5138e2cce97211b31499f810f2f373ee3d8085": "Architect",
-    "7a83e28dee200ffd90175c2bec397e9bb8ab3f73": "Association",
-    "0fd73359ec7b3c3209cc0bc0d70cb04b210edbbd": "Private company",
-    "a966399c76a93058f68312df3eac520dd1c382db": "Educational institution",
-    "4a92f9cd8420f021c6442d95821987468dc00044": "Employment agency",
-    "80647fcec97a29da9fec13e4f9faa0e70dc35976": "Estate agent",
-    "7631c2d2155a3bd7bf35333a587c21742c7d8be3": "Foundation",
-    "bb9a6e8b13591a5d37e7929fa2b79357c59908b6": "Government",
-    "9eb67e597b6098a8b2cf5b89b4d2faa38af5160a": "Insurance",
-    "51122d533e861790e57f6ff6aacfd4e20ea929fc": "It specialist",
-    "5239b13d146d70716690fbe18270d668aeeacd56": "Lawyer",
-    "b91f160d8dd516ece414f6a270ed79f100c27767": "Newspaper",
-    "1a412d542c6d935929b04d953a8471efe9e82246": "Non-governmental organisation (NGO)",
-    "f4d29dc5ad5006c1f7e80a334cba7c213a3a1b26": "Notary",
-    "36913568d51c0b52e7f818f72b809f11b7267bd5": "Political party",
-    "6664dea99ae0b975e4b3ae5c638658d206579920": "Research",
-    "9f9a33cf7a1d48ad226fddb24e458ed5e43b0ca8": "Tax advisor",
-    "de8d04696b6e036ea05ed7a2b1c86608e5e82d0c": "Telecommunication",
-    "e77de9fcc30ac4a4a3aa0b953e8b78a5944bdac0": "Craft",
-    "fcfe110143bce627f475cacdcdeb744d82d373dd": "Beekeeper",
-    "9dd516fc39e09084bad27604c108fde7ae10c50e": "Brewery",
-    "0dc3743caedf40f18ed481b6ba03cf913182441d": "Winery",
-    "727fed9b8403368032405c8c9694a538bf6748f1": "Caterer",
-    "c0a79c6cc56270c03266d2d0d080ebc48f71eb87": "Upholsterer",
-    "726efb82ed8d7f9952589a68610e95a06336ae19": "Key cutter",
-    "637755e5d5ae01f0c0b775d3b653f3b9d64a7853": "Locksmith",
-    "3d3adb04aacdf0eb1884a5830f3f247137bbd50a": "Electrician",
-    "dc1a1591cb80febc988974429d4c9a1f0a6e79ad": "Plumber",
-    "7a5728380bde3b4a2b3d38cd8c28e1a82e71ba5f": "Hvac",
-    "b6213d559653cfc7ebc91663e1bcb6f760288120": "Painter",
-    "b4f8467588fb6d1366a73d64e60dd88cb6945752": "Tiler",
-    "23567c4278770b20ed9f191725d568d014453d60": "Window construction",
-    "49eaca754d4a65756952c3e77a15a3b8f74c9ea2": "Carpenter",
-    "5c9b045b84b31a07ff18c5b030ca2e7e2c976e8a": "Roofer",
-    "c565ec5cdc28fe77430f8ed274b7c432aee6c011": "Photographer",
-    "c9833288981bb884ab4556473cc4dd1ff4291f43": "Handicraft",
-    "81325ec26b9d802250c3cacfcd5acdb30dbb8418": "Pottery",
-    "fba8ff0c5f94b7c2dc2f30cd79cca1349a822b48": "Gardener",
-    "b0f0a68b08ae44e145a4569fe4671ced9904e1c7": "Shoemaker",
-    "efda4ead56cb01574648170afcf43badea031d51": "Sawmill",
-    "d26facf1b9154b142c8c9da3a051e4f5d5d5949c": "Stonemason",
-    "65baf858b8f4d08fc3a92464bc7501a383e9394a": "Blacksmith",
-    "97b76e5c97e640edf698a1804266e5d99109e522": "Metal construction",
-    "9445b1e398045e6a6c1feca51dce60db7a936a27": "Level",
-    "7c8825825fb85efe285129f45a88f3c80d402ab5": "Wheelchair access",
-    "d78b520568d12c4a920ddecc285519636a1cbdb6": "Going up in way direction",
-    "f845387d8700c0eca71aa4c05c7d284426c6a689": "Going down in way direction",
-    "aaf6d426ff3014c40fbdbd3e9111fd714faee43b": "Private,Customers only,Permissive,No public access,Open to public",
-    "f72c64724cb7ceaa4772ee9d82989278e778d3b0": "Escalator",
-    "fd118a4d3d091ee1ae670052f892e3daaf13238f": "escalator with unspecified direction",
-    "b2494f66bf9d76158be1b04a12d95fe2baf90adc": "movement in way direction",
-    "e0def19af70ede1a1180309a7ccfad160c7ccce4": "movement opposite to way direction",
-    "f122c4f686d34c1c7254bd11e08bf3f3565a41df": "changing direction",
-    "a0f954597569628ca4176af7b4d16ce3a0b279e3": "not an escalator",
-    "536c2ecc9b69d363f91596cdd53fe1cdb31a41c7": "Building structure",
-    "f6b43bfcf459b78caca46c61eed1ff75fabda1c6": "Room",
-    "d33da3827574202fd87fe590e2dbb8d0c87194b6": "Conventional room with walls",
-    "c6788df8d5cb7d884e435bd5b31efbea494951c6": "Type of room",
-    "03375837f9441d631fa0e809d7ffcfdae70cf21a": "Area without walls",
-    "830b634cd6d4669c643dfee2b6a5c06feaa320f2": "Wall",
-    "236d210bb33874b321166b36b0037b90ea57e548": "Individual (non-passable) wall element, when not already defined by indoor=room",
-    "ea8e29bb7eece57a6cf7603b614636020a99442c": "Solid wall",
-    "de39a8dd19ab05e6bce77fdb06336e95f22dfbc6": "Door",
-    "a072cf69a730c8606c548e9f3765e9de1b3a76ec": "Building entrance",
-    "fe86fcdd9f31cf9008b592f60e74c52ddb673f52": "Main building entrance",
-    "5bccbffc8069e6763af09d8322d7b2bfc4279ff0": "Backdoor entrance for employees",
-    "7d630e33300e7f36f5cf5f5508fa2b3080adcfd4": "One-way only building exit",
-    "6fe429af5143b1c159e1e8cf2f2c6f345eb4038c": "Emergency only building exit",
-    "af8c43ef00a4d0c9d94b05bd6b24c8897c946e07": "Entrance leading to a staircase",
-    "726a7837069558d42ee36047d530b24f3ce09579": "Entrance for a private house/apartment",
-    "f3b3973cbef3e1fa0b350af14f29a88f70dd9e5c": "Unspecified type of building entrance",
-    "d2ffa49782089255c6b699fcfed104e2354af1be": "Not a building entrance",
-    "ab88e180cc4a47fdba81abb10c446e09d2d0d7db": "Automatic door",
-    "0f67bdbd37cd4e97d76fc44e1cb5681464a40e52": "Corridor",
-    "fe1426fcb5ce99ca8aa92928829b9b3a90236283": "Unwalled connecting passage",
-    "7a34227bb68a6c0bb81e4d2510d653122373f6b9": "Staircase",
-    "838ee0d9cc4765b88e1137e8b187c9f0c4c2ea7b": "Stairs",
-    "22ae8b3f64f417ae2e0d8ac0f063692318ca29a1": "Elevator",
-    "a2dd555ee212b68263ab0230110c8e7d4b5a4d6d": "Footway",
-    "bb911796e522dcc2bcbcfa9e564d0197f63e78f5": "Service road",
-    "e57055ce26b9b56d96c29743d295ac30a90bec5b": "Service way type",
-    "6b29ebc5bfe4639f798dfd3b094fb00d7894a4b5": "Level connection",
-    "78e513dc3b9d44ab4f4a3ed2b536aa72a4256d9b": "Table",
-    "0c0fe7dcab398596f5c7c950638322b748856c4d": "Length (meters)",
-    "07b6b9637911d53eda7e468d1e175aa0200738f4": "Chair",
-    "781f52ec5b1abf5196cb3a0781de8c5fd33ec8af": "Shelf"
-  }
-}

+ 0 - 665
src/config/locales/presets/de.json

@@ -1,665 +0,0 @@
-{
-  "de": {
-    "8cba1ac208566c60dac434d54f7844364a1cb6d6": "Oberfläche",
-    "d388f2ab79305958e022b915f7595e88b3f1878a": "Oberflächenglattheit",
-    "d62a2e61f010efadd90b6833c0861768b8ecff2f": "Brücke",
-    "5e1d404c35fc1d26617e5796d25ce63325ec38de": "Tunnel",
-    "6653488e47a68c98f962098d94ccfe02d238d857": "Einschnitt",
-    "5ec95c3cae1eda810a87f935fc6e6c7b03f065be": "Böschung",
-    "b492e85954c9a57734925e1051f9b9e65859ea32": "Gefälle",
-    "c53e94489b2557fdba88689b234cb347c4699b1e": "Einbahnstraße",
-    "325755812dd94be9f4631a2c6620f6370a9c9994": "Beleuchtet",
-    "bd1464606a57b5e483f318630798addc4b663d8a": "Breite (in Metern)",
-    "a93bbf623ea6890872a3591e19df565fb0006231": "Gehweg",
-    "7fc65a69aeec2b9f9e7016334c09bf26139d4bd7": "Gleistyp",
-    "33258756f753e172545b0a98b7e583e47800ecde": "Elektrifiziert",
-    "ca50416f8d2560601b643d74f1c506b080b682d0": "Spannung in Volt (V)",
-    "343033feb08a61ccd975c927a5ccd9fe9f10f86a": "Frequenz in Hertz (Hz)",
-    "282cec95c7986a3c21706b2e7e8aa7a2512ca37c": "Gleise",
-    "9c99dacb329b3899b9784da23875ced3780e39ea": "Maß (mm)",
-    "7008c24c567d9a4bd2083103474df81ad1f53a5d": "Mindestalter",
-    "40d0e4c70053932860c43cb30201e29b43dde5a9": "Höchstalter",
-    "b45a978022a0f3b40568737412efe19caec314c7": "Name",
-    "459bfca3bee7cf89e8d3c732548ed883c487ab9b": "Referenz",
-    "62a9ba46f945aa5cda1a9ca9dc3dba6120b6831f": "Betreiber",
-    "04af3c879938f0361ef6da64c640b9d2bffc3003": "Ebene",
-    "07f4daa0376b390d81b08a78453b053bffd55f04": "Betriebszeiten",
-    "1285dda58e2520e690fa61928d34b02227b37ae1": "Öffnungszeiten",
-    "559a6b0e9c2f8dba3110ad4cacf3b27a639e3b9e": "Rollstühle",
-    "4f02f52c08e6611dcce3db0a4797825fdcf471be": "Marke",
-    "313e88ea551b37aba96d224e638252506234adb5": "Küche",
-    "72bd73c4f73f5dbb08527b223a0a56c4b30ca0fe": "Internetzugang",
-    "c7a0619eb78db79c9e450d9e2f5235482aa81896": "Internetgebühr",
-    "2ba34186eff9e8255ba58c59d6994584089b0099": "Rauchen",
-    "a50aa4dfbf1f4bc16db254a295df72111c40d036": "Sport",
-    "db0151c61508a2c42c2fc5361a45c2a21d1dae98": "Gebühr",
-    "2a15ef203cbff75298fae6c2b168381d7e9a8085": "Referenznummer",
-    "2e4ac3b73782fdefa3864986f741afa168757398": "Typ",
-    "a6e9a2684235ab1adfee3e79aa603fe48126680d": "Zugang",
-    "6c45e83b9623cd6eb5f1e02e4fd90d5da63453ce": "Zeitlimit (Minuten)",
-    "06ef33fc94a1d8d3a847371a3fee0f423fb62a3e": "Bewacht",
-    "4d12b1a77c26ac10b7e6211c8a40f3743db95586": "Wikipedia",
-    "a652863cde9de3d48a04ba39504973266e4bf368": "Religion",
-    "ec53f865681cfd8052c92c98c18bf82cbc5415a9": "Konfession",
-    "816378cfc41f13c5d85c7e5eb060d042bfd78e73": "Filialleiter",
-    "5a65e97153c1717e74b43c48cad94696064a1cc1": "Unterstützung",
-    "ccec131c049514b2daa422663e8adc36e82411ff": "IATA",
-    "314d9f810258af8844a07e91f197b5e1d60fc4de": "ICAO",
-    "950acab68d329a33a845b632b226a70b9a34622b": "Automarke",
-    "d4666f560f10847ebccc79406b5b5c79ac6bfa68": "Motorradmarke",
-    "9769b608aca265bb7dec7bb93aa9eb5b68304aed": "Barrieren",
-    "17b48b5c55c0c2c09dd9054a3142fcf080a737be": "Hecke",
-    "cff646dd265f590a04363e9fe01bfc1600564947": "Höhe (Meter)",
-    "26b2a7ac433932f6bacea6cb082169302512df4c": "Zaun",
-    "c30d366040fbe6ece556eb540dd0c6ebba66155b": "Geländer",
-    "a5c589a98abae116ae3f774a709bb958fdbb8f18": "Material",
-    "b413dfc8633c1ea168831173d519246f1811ef37": "Farbe (HTML-Name oder hexadezimaler Code)",
-    "eb3c9b77c28fa522c6bb08825bb04ca15e8639e5": "Leitplanke",
-    "d0ae64596a4d0a7fd9edb13451b1709d0ec89923": "Tor",
-    "a223d3f0e2327363b8630136a4c74c5aef276c67": "Hubtor",
-    "5e94362b973ddf684a1e5f993ecf8b61f68d6ec4": "Schwingtor",
-    "2a581b93e76a6e9426ae3c410ade74c7ac8f499a": "Drehkreuz",
-    "aa2bbe66b68a2c9633ee3979e91bb75610f3bef1": "Transport",
-    "3d078c543d3a48ecd9a023d431d8068815b58649": "Eisenbahn",
-    "a5b3b774dfd86f56935da242c5cd60cb0c4abd66": "Schiene",
-    "73ba164183160c158d26437413810762b100f5b1": "Benutzung",
-    "26685bb17e48db05f30ab2706e756a4d509aad8d": "Schmalspurbahn",
-    "f61bb216230b165b39c80066724c950d85a9f9be": "Einschienenbahn",
-    "427628309e3a69a6a1e1d3bbfff06d7f90e10dd5": "Konserviert",
-    "b9abad24efa6f5520b4439cdc56d4e2a6a4e612d": "Stadtbahn",
-    "c7daebc1b8902d891ad74c4189a2ec431820ae59": "U-Bahn",
-    "433b41fb0831550fb6da6fd4d551ea7c5fb865aa": "Straßenbahn",
-    "5019f7210478663ac4f642e1c1396cd6f6b8fbc5": "Drahtbahn",
-    "94a84cbd5312626a55bcad4772af7156e47d9ebe": "Spurbusstrecke",
-    "db44d40650fd660694c2818e32060c5146de7cf2": "Höchstgeschwindigkeit (km/h)",
-    "a439a9c446e6a6970c6bf26a9d73ae59b6f2d04c": "Übergang",
-    "4d44ee3b569c73515531badaaeecac8c0b17a906": "Art des Übergangs",
-    "cd16f5f0b295aedbfd4749aa695e8fd5321718fe": "Barriere",
-    "8f43bfc047ab59083b52692bbc586c1f41392eac": "Kann auf einem Pferd überquert werden",
-    "9c8275cf62286d082516156cf175f0e58b433d25": "Kann mit dem Fahrrad überquert werden",
-    "cfe583fac332b290ea8849c78437dc0918f3509f": "Ampel",
-    "5a5527e098f8c756291485ff209a0e45083b3098": "Geräuschsignale",
-    "0403a7ce11bdddcdb2dfcf601674b248e39deccb": "Prellbock",
-    "c340855ccac6241a874b08ff6ecfb8bd49702119": "Auto",
-    "29a5b9d0854dd6ea33be9f9b4921dabd745316b6": "Parkplatz",
-    "f127e5fc92739e596b6d320cdabfffc5ac9139a3": "Maximalhöhe (Meter)",
-    "9ec7fb6f5a24072a6e1bc5cdec778f47b99504de": "Kapazität (insgesamt)",
-    "2b0ffc44a7bc78656a66561aa67b392cf41662dd": "Park and Ride",
-    "a26945a0f6e3fc4f0c8ba4fafd8943dce34800ff": "Behindertenparkplätze",
-    "176681d5f3d0bef67d9f03a8e27176dcaf7c656d": "Frauenparkplätze",
-    "ff0531683a42d9746edad527aeaa4f4ac8a62e42": "Familienparkplätze",
-    "e5a529a4d8c27212241b73d0499181b0f0520a83": "Für weitere capacity:[types]=* schaue in's Wiki",
-    "3e714b01a797840927cd64d48b50f85a910089c0": "Parkplatz",
-    "a92c961c86af5d35926d74af43b72c7ad794f324": "Kapazität",
-    "5b77e5a66691c0e789b3897f51b18bda69a892cd": "Überdacht",
-    "6085b4a782626ea16b0a82fb9384e0ef44db013e": "Parkplatzeinfahrt/-eingang",
-    "bae3ad2e142659acb6c508e0335d27dcd9303c37": "Kraftstoff",
-    "6644a23512d717fd6c829c5d7f31dbd60c402ad5": "Mit Geschäft",
-    "19f20f52c49e3bce26f8ac40425c1e3400330c93": "Kraftstoffarten:",
-    "2fe0bfbc883d588bb3b491d4d8235297e41008a3": "Additive:",
-    "198f02612dca552422d3bdf5a6b23ddf9eafff5d": "Tankkarten:",
-    "3a2d3c359edb3c36b17f3ac52a563d8051cd18ec": "Diesel",
-    "7b46cc993648ee06971347e15dc875dfa1d41a89": "Biodiesel",
-    "71a2aa4761708ecb3164b05be277b393cff73cf4": "Diesel (GtL - Synfuel)",
-    "01af22c942d6ea4f1bef39916a304e01b5463422": "LKW-Diesel",
-    "d23c7271106de577b47dc547dad4780d92bab520": "80 Oktan",
-    "1dab2ae489c274c27d1a5aafa20d9eafbb5e4ff8": "87 Oktan",
-    "f7969b70b141398cebf925d89ae05028e8f476e3": "91 Oktan",
-    "ac618d35afd82297cdb46183d3e55d1438b522a0": "92 Oktan",
-    "1ae288a8d953b4701808eac6cb0bc2aab0611e5e": "95 Oktan",
-    "19d3a740f5f428b9f99eda2c924642df3b775dd9": "98 Oktan",
-    "bc9c615cd6fb345b7bb30de54a9a5521707a9dba": "100 Oktan",
-    "62ef5373f985decf7d3f58fa24b13c2c45fe0711": "E10 (10% Ethanol)",
-    "befd411268feb7ab0a613fbee47438398713579b": "E85 (85% Ethanol)",
-    "6a3165942abd1537c60aed6d07f73b5551e897ac": "Ethanol (Alkohol)",
-    "62a66aa3c1ed9099127f53efafdfdd49535c5bb6": "Zweitaktgemisch 1:25 (Mofa/Moped)",
-    "e9e04964f2470c3fa01b8769da2a3ca8cbcba864": "Zweitaktgemisch 1:50 (Mofa/Moped)",
-    "4783236ee22ea0ac78cdd13febc763bd23610dc5": "LPG (Flüssiggas/Autogas)",
-    "63a07d98bedf51831049e2dcd94830dbedf7d97f": "CNG (Erdgas)",
-    "385a797f63466e352339046e5b588e32ad83601e": "Biogas",
-    "c98fa32540ce31e31b8816473a42c2f9ac2775ed": "DKV",
-    "7bb8c4aca85abf2791f9d6cfdf64191c988d9bd0": "Routex",
-    "c4cba6139c22ac7de2e215280fd4dbc1c5247848": "UTA",
-    "536ea35870b8a23e9e0703e3b166e68e891055fd": "Abgasnachbehandlungsflüssigkeit (AdBlue/AUS32)",
-    "f76afe037d948f142a4428fe61e616cf3f193532": "Ladestation",
-    "6417685705ccc35beb67189aad9f02895f196c90": "Spannung",
-    "bfebe98b407a9ef682f1c90caae68e97d3505161": "Stromstärke",
-    "0ccd7ec0217a198bcbc8292b8812286aa9f3d040": "SAE J1772 (IEC Typ 1)",
-    "e37535d2bdd4c3deddb07559d1892b8b08aa49f5": "SAE J1772 Combo (DC)",
-    "da677d9150f70ef9bbe4c81405de03b5e33a6026": "IEC Typ 2 (Mennekes)",
-    "43a2f9def5db66d60235c8b29b00ac5b654a02ed": "IEC Typ 2 Combo (DC)",
-    "7aa616c074c101546258e018c0e93cfca8b0743c": "Typ 3 (SCAME)",
-    "54933cea935aecb602a320140e4caab6aea04696": "CHAdeMO",
-    "efb289af80a5f9520431e36be9651685bcf7c095": "Tesla Supercharger",
-    "655b564161a921ee9cbc1a9eff131233a37dc081": "Schuko",
-    "5ea4abdd0cab689195cd71c77950e7d2b15416e7": "CEE blau",
-    "cc24b13bd0232214917aed865e121576c1eb9d9b": "CEE rot 16A",
-    "8e332cb5cc12e1f8841dc3b6c19c413c450c928c": "CEE rot 32A",
-    "2f138cea8758550b8e7b8f1178743ad1f70c5389": "NEMA 5-15",
-    "0a8065d49d45eb5884cc060f5c5cb980c4525c1a": "NEMA 5-20",
-    "5b1daff47792f2a69d8c3a3a2124c7b8f75a7c3c": "Mitgliedskarte",
-    "d6707b8c758cb65c95e04efce8fed50d331779a5": "Fahrzeugtypen, die geladen werden können:",
-    "c70f01b3f3c1eeee52dd7acc2d8ec19888c232bf": "Anzahl an Steckdosen:",
-    "54cfd9e3f60ade5faa6d6caa31b7d9633bb8d27e": "Authentifikation:",
-    "da051e4f0edd6f44a2335e5f99be77cc573a4239": "Fahrrad",
-    "869d4ed2769005e01de8917101f55fcdd106be39": "Roller",
-    "b31635293774abe28d4181c7132e4c77b32768c8": "LKW",
-    "49d9674dae8a29e5fc698763eb3374d7f3372118": "Keine",
-    "b1dca6ce2054e54417b715c6ebf8b7e41eca5765": "Telefonat",
-    "637f3c9fe1d8edb9477571b294bc87bd598e5988": "Kurznachricht",
-    "9076da279e7ec1cbca8404732bdf03bacbd1e1e7": "NFC",
-    "96edfa7a8a71aab3742015675d7a4bd407b1139d": "Wäsche",
-    "4c2c653a66a7a2b8f50712e082ab2d153acac207": "Selbstbedienung",
-    "08fa44b9ac2c4f6c4c6a9ee1daa83ceec3615b51": "Autohändler",
-    "66b0e4416eed45fe4c0ca25fb3ce43d16df356fc": "Secondhand",
-    "243cc98ce98838b21946b9644b698e6ce551385f": "Reparatur",
-    "6c9a4f1432e468bec7c322c634411287de3aa387": "Service",
-    "f56669f4cfc5457be5196a48efbbe31bca54da0e": "Teile",
-    "50b159d6544828a120bd5d62e7c21bfa35054fce": "Reifen",
-    "77a8bfdda81ba80231cd7f392eaaf146e73d1fe6": "Verleih",
-    "7522c95fab7a7f0d73c2ad51273ec027271cf102": "gemeinsame Nutzung",
-    "e07600390f68df7435fd9f127fd4f06600129d40": "Website",
-    "5619650f27cdde129ab662a0eb99c95975fc9594": "Motorrad",
-    "0d3f32e71b6a2f69f63fe5e5460a5f6c6562f217": "Motorradhändler",
-    "c7f7152769491bc8ef67a4ada12d8d49abe50894": "Dienstleistungen:",
-    "49df8c0e1b1d8403df9c89717b43c2906e2a48d2": "Verkauf",
-    "17a6cad5f87b32f3d7ddb0bb7129c3c3b8c74441": "Sicherheitsinspektion",
-    "bd36f99ababc5f8d5bf932fe78c1e3a43909f979": "Kleidung",
-    "15a9f10bf7b59de7bcacb3daa3e928e210cc2044": "Sonstiges",
-    "93dd379628f0eb9811685b5c04df26c1d88c8da3": "Überdacht",
-    "a2563eece3ed529dfecf375b02a9377b926e7c2e": "Fahrradhändler",
-    "7846e37c2a241f7b57638bfa0feb3a9f0cf3aa7a": "Fahrräder werden verkauft",
-    "5ca2bb12894b00c8a4839369ffe98a34cab7caa6": "Gebrauchtfahrräder werden verkauft",
-    "dc595226caa17e96d6fa8933615dd27f60894651": "Fahrräder werden repariert",
-    "8f28d8988bda94dd14776fb0f0abacbad0afe5d1": "Fahrräder werden verliehen",
-    "22172272a22882cf41b320210ebb0e3618e28095": "Kostenlose Fahrradpumpe",
-    "bc8d405fe4af35a8ccbab7070cb8c3fcd67a8b94": "Werkzeug für DIY-Reparatur (z. B. eine Fahrradkooperative)",
-    "5c917726ef3e13f45c0c5f92594e519829cc4ae2": "Fahrräder werden gewaschen (gegen Gebühr)",
-    "4c9c398356af4056e43b1b8cc406ef92ab4505d4": "Öffentliche Fahrradreparaturstation",
-    "f3c821f7735bcefee7764cb97b4bc5dd572d820a": "Kettenwerkzeug",
-    "0f3333eec45b91127396c7d3d96e146657b6c06f": "Öffentliche Verkehrsmittel",
-    "bae9fe67109eb33919321963cd2e4ac2e1d242d8": "Haltestelle",
-    "650e04f7353a4f4d73cffa66e85a70ade81e9dc9": "UIC-Referenz",
-    "5f05c89dbed178dbedb1f6b863e0ff2c301d54d5": "UIC-Name",
-    "eedeffc76b1f5869cc82cacdfe266ccc376f7e05": "Netzwerk",
-    "0c618cb7f85429eb1776e1ed1ae3f18c5b6a48ee": "Blindenleitsystem",
-    "7dd9baa5f12b2b1ba7bb7a3e3d54f5f96effd9b0": "Bus",
-    "d9032c0b32e1c0c095f14209befc068253523391": "Bushaltestelle (alt)",
-    "ccef3807318579fd226a30b1faf4834677bfdacb": "Straßenbahnhaltestelle (alt)",
-    "a5cdb6d810a275eb7771294734b3835ef83c3a13": "Zug",
-    "1d68cd9b4c13a64ae775bf8b57934f1a5f07e21e": "Eisenbahnhaltestelle (alt)",
-    "3cc78f46480af3f3a3a3b90555362dd88a59d34e": "Oberleitungsbus",
-    "bbb158b34222cad8320ee1d9362d76173cc47239": "Sammeltaxi",
-    "73058cc47f59f8ad0554c90c79f7d1820d3f33f0": "Luftweg",
-    "b93c94013e88f8666cfc1d37180458453def3dbf": "Fähre",
-    "66501ca5bddb0f3869d5bd6d6cfe5011443a5b49": "Gleis",
-    "a0619677da4f50e6445a3cb9e97d8b6261c19d99": "Bank",
-    "b3f0115d621f5e869219fe6e9ff5c68270822b71": "Unterstand",
-    "b286bb123111ab536048ad3e4be2f41d0133c3e1": "Abfalleimer",
-    "162bd58a61cc29d1b4cc0aa01bea9b63cfdaae9b": "Haltestelle",
-    "ba6b9a41577507380e2efb273bba4a4e6f48319f": "Bereich",
-    "086e10a0e26827a42c333b5ceb500660a111c25c": "Gebäude",
-    "e8c8fe9e24803f4b9eff2f9d414ef55ee17f8de1": "U-Bahneingang",
-    "fa412a10c689a57b63f2ac78ada67f181d43410f": "Fahrkartenautomat",
-    "78e6c061697068262837f96f70a512fc7a37d268": "Flughafen",
-    "6f45e5552eee36a75b63492f21c1f0a0bcf3c101": "Flughafengrundstück",
-    "2c74a1dce3b722d8c7b76bcaf349262994ca0e00": "Startbahn",
-    "8029a5aee1bde5765bd39ea3d8cafa9abec68d2d": "Taxispur",
-    "b2c2b02cf155c512632745ababedd8e2a7de0a60": "Hubschrauberlandeplatz",
-    "f4cd98d041e30bedd8217356de5976b26614fe8b": "Schürze",
-    "20242751512b7d8dded3546a7891953afd91c2d2": "Flugzeugparkposition",
-    "23323e67740f3b80fddeb5488eabd9f0aae911ff": "Terminal",
-    "ef00d6ce7e8590661a465cd9fa3125e03a0d0b16": "Taxi",
-    "e6265e1a1289b82ac8a3e01c212bd873823f98e9": "Einrichtungen",
-    "f794e3e2f1a3cd51a2712d2df83321a8063e83fb": "Unterkunft",
-    "9938a3ce668ca4a032b8382dd57e7e1b28bccc66": "Hotel",
-    "5817798470c555f35ebeb8dcc327457f5e2e5d44": "Sterne",
-    "ddd88c645aa072cda3532180b4ca14e87c9aa666": "Zimmer",
-    "e2acded36680915ff7d604862c058b73741bfeec": "Betten",
-    "3a3a084129a41e9c8e189e7002da09a1177e2442": "Motel",
-    "4ed765c05d44d584bbe6122835e232e5ef0978dd": "Gästehaus/Bed & Breakfast",
-    "cf2dab630a43f49cb45d9a381709a7ede8ed2461": "Apartment",
-    "370dd1ee7a31cb87427c29549ff88de9637ce963": "Anzahl an Apartments",
-    "88f08ea7211f203f92e2f034699e25b602bad48a": "Hütte",
-    "106e44ec3f5fbeef8c8d7b9a656b701b87bf537a": "Hostel",
-    "d4eae5bfe7a4f791f14bb7044d57b74e57a97997": "Essen und Trinken",
-    "cdcf20533032e7afaed7606310b4ad201185d827": "Restaurant",
-    "95be518be4fd7ef1c236ebbf143619c83386c04a": "Kleinbrauerei",
-    "3f866fe3792089a290b3c7fd5744930cdd5e195e": "Sitzgelegenheit im Freien",
-    "c2949a050e768b4ef999012bfec8733dfde2e5cb": "Zum Mitnehmen",
-    "7426c0dba164848df58cf9dd54726532d805efa1": "Lieferdienst",
-    "a8ceca6c32d758dc1d0197e679bb938375e89d1e": "Fastfood",
-    "51fd168ce4431a5801ff9c6feb3e6bdbd9374630": "Food-Court",
-    "01763b0bf177e4652ff03d16dc1dcc50fd6250da": "Café",
-    "ea4233533dc4447c84b56c42990662bbe00041f1": "Eis",
-    "e44d6f19b4e15b9d877b832d4b2ff397d28ee640": "Pub",
-    "83d826955b21b473d94a674320ec484bd2f008d4": "Biergarten",
-    "46651c409f45402a1a3bd7497b343986a2c2ae5e": "Bar",
-    "76fa7f1b22ebfade9763dc5a3e8c837080eccd69": "Tourismus",
-    "5eea09a4f024e692c6d16093808837355d0d68ca": "Attraktion",
-    "d5e6fb8ddd14ee31a2a441724783b718dda8b41e": "Tourismusbüro",
-    "5dd9909fc80912f4b5b5de5ff594387dd2013043": "Ein Ort, an dem Du Informationen über eine Stadt oder Region bekommen kannst.",
-    "6f58a3a8c5e48afeedb29afb8d58a408026760c1": "Karte",
-    "86ed0d33e714327ecd916cd29096dfa2fe62e427": "Eine Tafel mit einer Karte.",
-    "5a05f7b00959671743f991b8084ab0d5cf267a5d": "Genauere Beschreibung",
-    "fb1669a7018c0e1473c8420c207f83a1786ca6ba": "Detailliertheit",
-    "ce1a8d726cdadfba3b51d790bfc9df147633a880": "Angezeigter Bereich",
-    "33a6660f28456a0b44235f52ff440fa2c160dfde": "Routen werden angezeigt für:",
-    "d3b46f68dd1595ce308e95db5a0036c6c006d931": "Wandern",
-    "5d8ac3f662045deee7ff4b0312f23567add9e54b": "Radfahren",
-    "0125aead430b1f6761649e7d5afeca96d62c5649": "Moutainbiken",
-    "e28ac2794063ceda8a9b2b2565926da61895a068": "Skifahren",
-    "a279cd8945df125b76a13651c5236593231cf259": "Reiten",
-    "cbfcede7bba09f933638b9d43af4aea4b2bdfbd9": "... andere mögliche Transportarten",
-    "7fc1dac55d54c820d8128a158ea74659804dd520": "Informationstafel",
-    "a2236c78372c3ecd62aedb65ed67c0fb24485292": "Eine Tafel mit Informationen.",
-    "28e7e6fffdbd8a91b26f4954aa00d55aacdf62a9": "Inhalt der Tafel",
-    "41f2cfefadf3eefbaf32fc72f134d75b424cd000": "Wegweiser",
-    "a185d625934dfe468afdadd257ea64155c73b1ec": "Ein Wegweiser der die Richtungen zu verschiedenen Zielen anzeigt.",
-    "43dc525ac32b8485fd797b732c87f50e53253877": "Höhe",
-    "508bdb6f697d05f165c2e691c30398c150243e98": "Informationsterminal",
-    "4831f09d5c5b5ba455c0b3703ecfe144efaf2017": "Zugriff auf Informationen über elektronische Mittel",
-    "175ab25d2d030c7638ce3820c32e709ac24e00a9": "Audioguide",
-    "70c1a9293fb1dc711b68626eb467024c3c3b8fac": "Zugriff auf Informationen mittels Kopfhörern oder Handys",
-    "066ec1d6fbe485b383261844521d1dd29995a399": "Audioguide über das Handy?",
-    "af7822e2604b5698fb5a75b8f35d768d2651c635": "E.123-Format nutzen, z. B. +49 11223 456 7890",
-    "46c1bc32ff96786d7d907e60ea45a44060f55f3b": "Telefonnummer",
-    "71a827996961d7d2a5fae24b2fc74dc7b7bb59da": "Sonstiger Touristeninformationspunkt",
-    "bad3ddc26b397a55bab546ea6327b5a5abb3eb50": "Freizeit",
-    "38532cd37d2ef2f2405f7fec593d3e30c6f931e1": "Kino",
-    "8b7ba503602407c4d006cbcb318169806339951d": "Drive-in Kino",
-    "799bf0793b6b2803d69a97b487c71c0513f78e66": "3D",
-    "3ab6eed05fa2d44bd8abebe261d6d34e9492d899": "Anzahl der Leinwände",
-    "21d2a00664a46c67092b6035678ae2bcaf2f9c30": "Bühne",
-    "220dd4b05569e4c89cbc36b269fb48a0cc81c011": "Zoo",
-    "7df59b2a55c0d93e484e2bf22502d68001f074b6": "Tierkäfig",
-    "fe24587c77d94fe7e9428df21e5716170ea96ece": "Hundepark",
-    "d673020d47e4e6721422522173df2ab181ceecdb": "Freizeitpark",
-    "5d9068c43e1fdb1b2d8f07bc0cf8b12794301e3b": "Wasserpark",
-    "1067f8ed2e0c68b21a8ae01f43924fdaf4ea6eeb": "Resort",
-    "1b33eaa6be195a498ea3383eb145a8ef2bb4b022": "Schwimmbecken",
-    "07c50f002352b6944c2885607bd4fe0a64fdd2eb": "Nur in dem Bereich verwenden, der tatsächlich Wasser enthält",
-    "808a909f025c74f6ed26c71ffc74af37f7fa02e1": "Fitnessstation",
-    "2a501eea14c7328fdb7d5f475ccbad844188d3f9": "Beschreibung",
-    "f5f35662ac2b534dca9f909ef2e8e96232555cde": "Sauna",
-    "908d8f3570c1c53027ea808bfcb01d3800fde0d3": "Spielplatz",
-    "a06b72ccdd2f70f4087876719de5071549830392": "Picknickplatz",
-    "4eba0c16a69c499b23d4dcf41372b5f28d779107": "Feuerstelle",
-    "5b104052f7b1dadf3348a22d69d59e5eb348a594": "Picknicktisch",
-    "0c61c13303ee0352848d1db73ea3605cac1cfd36": "Öffentlicher Grill",
-    "1621c961f2623b7da09b7b762519fac88eb1d9c9": "Feuerstelle",
-    "8ca717c3de79d717dc559f1e1331241eb35f4a55": "Nachtclub",
-    "047fed2cd6e5bf5936dba34d07b7758821a09c83": "Casino",
-    "3895513a1bd146996a4f37a7ec550afe7cc95a72": "Stripclub",
-    "387b7f2dd50c97ce5868b821a273bbd6687f158b": "Bordell",
-    "ee4ebe9cff4e4b2de886262673f9d2f075d633c1": "Kultur",
-    "e98d42cc36d372b9abdb884cdb256f63b6ef0a1f": "Museum",
-    "7d58d7daddd61f563c2d1fa7462dfa04cda66d91": "Theater",
-    "376128992d204921fc1afbf30818599321ae5f4a": "Bibliothek",
-    "606ee76def5da95ffd2889413f0b606e05c79070": "Kunstzentrum",
-    "d96b4d6b1a537ee52fdb4e24be3f9055bbf422d7": "Kunstwerk",
-    "542494945768ce01e6dc6a6417fa6ff221916a51": "Kunstrichtung",
-    "8b03daba4bdec9233cbc5aef6229eff2cbb3468b": "Name des Künstlers",
-    "30bba22332155e4413f06f9eb1dd460700552ab3": "Anfangsdatum",
-    "054e13ba92847928561d3f3cb6efb212e686da27": "Studio",
-    "ce2fa99177dec3167e057d8b2d4ac707b3409565": "Anbetungsort",
-    "f7178891d9b87f13f7a3cbe6bdc7cda537354196": "Kirche",
-    "f42bdfdba644d125bd47aa453156da8213124b9e": "Gebäudetyp",
-    "62bc77a87a8624418fcd4a779c3851989cbe61c2": "Moschee",
-    "5e4ce2de47e842329b94a6a647d15d19ae3e30d0": "Synagoge",
-    "28f5cb8f63ca3d7c3c350f32e90178bc50c50fd3": "Buddhistischer Tempel",
-    "d304487d732dd1742bd113d41e488f24f462086a": "Hinduistischer Tempel",
-    "fdb7be1683db04004a02d54d5a1fc64c5676ccbc": "Shinto-Schrein",
-    "a543030938155bfa31ec8c2ee07c46ff5e89558b": "Anderer Anbetungsort",
-    "9c4475a5a144938bd2a846c1b4168492cda11059": "Öffentliches Gebäude",
-    "7f1754e88def3aae503e5cb517d5e1888a61b68e": "Rathaus",
-    "7748088c168bc09a030c6dcdf07e9bfb9cd3dea9": "Gemeindezentrum",
-    "832dbc8fe7e0455fc36e29e6523da69ca55a6db0": "Botschaft",
-    "98d7d371eb2d97e31e44127ef4c509f136603622": "Gericht",
-    "e39787818f943b76967c1191257093dfab2accd6": "Gefängnis",
-    "d3ca9616c94522a040aadaed6a07577103a4dfce": "Polizei",
-    "375038d080f8e55929a93c5cfa5010d6b336969d": "Rangerstation",
-    "63c8e15285581173805b2a442824c42b15d53cdf": "Feuerwache",
-    "8d8c3038045b9b328baf7ea49fe998313d720793": "Post",
-    "7db652d3fa86aa83de05b73868fc27cea87176e1": "Bildung",
-    "f5852ccd69391c018e9cbb735fd53b15c288da6a": "Kindergarten",
-    "507acbea512ee0d5e430bf58f0ae0a0a2b61854d": "Schule",
-    "5070ef2fe01f0e776431bfc43d7cc8fb48058a4c": "Universität",
-    "6b35092d5ee2f547660e976226362e1288412ddb": "College",
-    "03f24ba2f1bfdbae6d6aa9dfc11ea37961cc44b2": "Fahrschule",
-    "f1cff7cb9c0f05d6ba280c5e629db5cb6ee581cc": "Führerscheinklassen",
-    "a6174dacced692dc6ef2f3b6a22bbf9cb24168e6": "Gesundheit",
-    "b1b81554db90c32e06f95ca96612c3f2913f5eff": "Krankenhaus",
-    "0f7b057b3e917251f962ca33357601ae71df7111": "Klinik",
-    "360abeabdf00327aa566476ace1594105dc5aa97": "Arztpraxis",
-    "a43a71bc368df8a2c1257240a734feb0e2852e5c": "Zahnarzt",
-    "6d44c437ed696a13d0c8f30df058cb166e04414b": "Apotheke",
-    "d61f9995a298f7b5485cf122e037edd052778a8a": "Medikamentenausgabe",
-    "9fd12d3aecddb6f936f5d702ede4567b5c3318ef": "Babyklappe",
-    "2d223d9a62e792af62a83875a944d71aeddf0b3b": "Rettungspunkt",
-    "9fc90ff8746922cbd40b2863a18dcb8825c3a171": "Rettungspunktnummer",
-    "8e218973fb97e5633c2b84a8fd94554938fb4a99": "Rettungspunktname",
-    "a3984b73943483d85f84e3339a283840bc34b021": "Notrufnummer",
-    "001f71c43bb3b106d70b231fe6ec008ceef4156a": "(Nummer so verwenden wie auf der Plakette angegeben.)",
-    "ffba8ca59d1c3c6746b982e63e0ceb9a858a57ce": "Tierarzt",
-    "b78cef21a5bfd9a9baac70f63725b9674baaf5bf": "Notfall",
-    "960e928357349002f63b92714c9fe8290f5fe2b3": "Rettungsstation",
-    "68889c39f89c9023c0f49ea8d196aa7eca84e3ef": "Automatisierter Externer Defibrillator",
-    "d8a5f46c83eb36bcddef602f2e36fb2a34c1cba6": "Ortsbezeichnung",
-    "5477ef1de1c4fef8d6c74a505c1c52527c665d91": "Befindet sich in einem Gebäude?",
-    "4705e017aaf2bcdca8f583a98b3896fee137244e": "Feuerlöscher",
-    "54c332db5ba733792edd733bb88293c6a7a49cb6": "Innen",
-    "c7fd88d9fb181098306af7839a327c5bc2e6d248": "Feuerwehrschlauch",
-    "93e587b937c322b66d096ce4d87c94270913a454": "Hydrant",
-    "1caa358d335874cb22c220dcd25289cde5deb8f8": "Form",
-    "7b7f3ffcfe3734f26790abac6b20f09d970b4954": "Durchmesser (mm)",
-    "afa03ab38132f8c46a2fd44b5f70f06d4a010b14": "Druck (bar) oder Saugkraft",
-    "6ea23d2433cba518f44690a50911de6f9633a2eb": "Durchflussrate mit Maßeinheit",
-    "82e87e1f4c21f1404fbafe547088e19cea0cd79c": "Durchmesser aller Hydrantenanschlüsse (getrennt durch Semikolon ;)",
-    "760746e5461a6862184bf94381bce477b177191d": "Hersteller",
-    "dc9188ebae1968b46e7866f6fea9885986153461": "Trinkwasserquelle",
-    "ffa2b74bbf6fdbdda5d5e3b4a98840106353f988": "Position des Hydranten",
-    "16145c7061de549b724fe6195594ce14df346583": "Typ der Säule",
-    "5c49a4bb14120892fe8f1c941f85e0d1dee750fc": "Anzahl der Anschlüsse",
-    "54362c751bc9558cdb5c62238307f35e0aa73da6": "Farbe",
-    "a21ca8160f57948b6085a7befaac13c66c004234": "Farbe des obersten Teils (Haube)",
-    "16637693ef0daa596ce9f16bb0f9a1f576c1571f": "Farbe der Deckkapseln",
-    "a0efc393612caf039c83e78901ee60380063b783": "Wassertank",
-    "e4a328d1c6a6f17355682436bd3ac97dfa41717e": "Volumen (in Liter)",
-    "4793bd7243a646f0ac71822f699bdd53e3913039": "Sammelpunkt",
-    "2d6db004ae9bb9b7a1e5153537f91c8db2f7c87f": "Notfalltelefon",
-    "8337904de8ba94dad03ab02546d526fa74315700": "Sirene",
-    "e7756d19c97b14a0122b721013e959d330815a91": "Reichweite (in Metern)",
-    "742faad81db0bb715b6baee9addad1f6b350c4d6": "Zweck",
-    "7495891c30399c092dd83b7e04f055db787b61eb": "Soziale Einrichtung",
-    "f6ad773865f026211ac34b999efa4212c515feff": "Pflegeheim",
-    "ef414bc347a5dfacbdf36e0705f7dcc068fd8154": "Gruppenhaus",
-    "a788cbb1b0b13f3b1b35394942d86a8267b2f2c6": "Für",
-    "e86affdd9d48fd1de046824fd9eb0ba8f9e71340": "Betreutes Wohnen",
-    "69156314800d7895b14c57a2ce68facc957e2931": "Sozialdienst",
-    "d0e63c557c0cac5c10740433105452db3ea63742": "Essensausgabe",
-    "8fbc094504b550f46e981d1e66c7e20892a471db": "Toiletten",
-    "605557cae5faaec653dc9d442c94e7a1040f483a": "Zugangsrechte",
-    "5a973bf3053311cf653fe6de0f9dd71eacdfc78a": "Toilettentyp",
-    "1ce9d5855079dcbfcb2f154df4ba3821530a6511": "Windel",
-    "bf7e977aafbfd1555892e3567ede2156bf77e701": "Weiblich",
-    "ea3f770d14f9289d34c6f3d958432480b314e1d6": "Männlich",
-    "2ae2cd3f1138a5423673121e6239021942d08f95": "Unisex",
-    "6364aea801c8117efebfcb1a142c8b976ff23c7c": "Trinkwasser",
-    "ae3448e3e9c82da15fdd2f93e99cca5159db3ebc": "Dusche",
-    "5e9ba2afdeaee6d1117f52785e8549cdc6e1cf3c": "Briefkasten",
-    "94e08daf21e226c46b8afbb3f158dffa8c58c774": "Leerungszeiten",
-    "5233f579c394551f9fee5cad0764cad3efd7e7f4": "Drive-in",
-    "3e9f5d5ff853ac80469521015922529982849994": "Telefon",
-    "2669dcdd9655a0a927a5b491b487e493812f226d": "Münzen",
-    "b887f8dc356f1db75bc586d5a829a002fea07dbf": "Notizen",
-    "22113ccaca7a1974512af3e8b7a9b2ea51ae3013": "Telefonkarten",
-    "7efce123b38ea741f4bf3e3b99b4b8bf2a9d0ac0": "Internetcaf",
-    "af2ae5c3b81eb0fc9998cf07a2859f9993b44c79": "Uhr",
-    "0155f9f63b49ea0058418b4b8be3f85d0faef70c": "Anzeige",
-    "6ac469c2a00424a031a8730041118ec6b8958b28": "Ziffernblätter",
-    "8fc5529b71605379545ccc84129defb5eaf08006": "Sichtbarkeit/Lesbarkeit",
-    "8727935e3bde1a762c0cb60466ee15e19c4c5c40": "Haus (bis zu 5m), Straße (bis zu 20m), Gebiet (mehr als 20m)",
-    "6f7a6f39cc8383eee690d501f182fe6fc8b357c7": "Zeigt das aktuelle Datum an",
-    "c85bcb29e6a17bb2fcbe071962f4c43d87ff7c3b": "Zeigt die Temperatur",
-    "51bfc9ae7ff8052fcbc6a94a596a8c5868821caa": "Zeigt Athmosphärendruck an",
-    "aecbe1fd89b3bf202662bede19dbaf776c81c137": "Zeigt die Luftfeuchtigkeit an",
-    "f2dc0590b8a04319e9d292ec2f71a6ee93a3c66f": "Fotoautomat",
-    "1c0133f440184ef1381da358fdf6f85f880ae07f": "Müllcontainer",
-    "b3fe1ab6a17a0a2a7deb9900903482cb9a10d1a3": "Batterien",
-    "beb3f931ccacd019e0627cb014a4f60f862cdc3c": "Dosen",
-    "53e5f13eb382023bb03d97c5feff444c7a58d4ca": "Karton",
-    "140445b480588e2e2d866d9deadb879b8b7899a3": "Elektrogeräte",
-    "4d1e2634b0507518287d9bf3fd2f06d4c1f6cc4e": "Glas",
-    "6c94aab188d041be2b8751b0b2430ae8074425ed": "Glasflaschen",
-    "8b7457bfa02da16c160f57245a83cdc7404e819f": "Gartenabfälle",
-    "6508f0fcd15490b49958853b5419d48b4b43d07b": "Papier",
-    "0f8663514f63f77c388e25c02f285c1905702a10": "Kunststoff",
-    "b65e1509c4ae4f6c712fd375de9b8f80423f747b": "Plastikflaschen",
-    "757c20c9665e1e4880682f8f95c555aa97986bf3": "Kunststoffverpackungen",
-    "ce0aa75c829a6ac821fba50741d217ea3c7e076c": "Altmetall",
-    "2a4f5aabf9c8b3da323d495efc09051a094a0a37": "Schuhe",
-    "8bd8d3641e085b63555ff6c25ca72ab74f2f8c0d": "Kleingeräte",
-    "638232e39a47059ae9d5fd04cdd7ba5e55315c02": "Abfall",
-    "c2a37da5a39f602697d6b7620a9a9346624d9b83": "Müllcontainer",
-    "99a2c86318f9aa75a76b2ca5c010654767bbbe91": "Fäkalienentsorgunsstation",
-    "530934114d240f65175c463e25f0bde541e46592": "Absaugpumpe",
-    "06c616e194077d31d9b6225d9542a7ade1ab92f3": "Schwerkraftentleerung für den Schlauch",
-    "773e7c0b8c85f8c7e6a99066630a0e6c29730f05": "Kassetten- oder Elsanentleerung",
-    "91ec07e1bfddc0d899a3864ab25931e923272ad2": "Betriebszeiten",
-    "77100e10cebe13141acbb848e05bc15d797fba32": "Rückenlehne",
-    "b1c2f19c06899f533a3b6dc0321196436633e2ed": "Anzahl der Sitze",
-    "3a4f4fd6824765e92125d45ddc2f3635c7052c21": "Art des Unterstandes",
-    "a861de731d17d33ba4bfddc2f88efba31fe99ce4": "Trinkwasserzapfstelle",
-    "292fa3e4f59f8561f2f78425e1f06e48db987acf": "Tränke",
-    "72164237eaafe6eb38ef60a1a0dad65d94356484": "Druckluft",
-    "c467cad9f8bc24de93084cacd56350c53e2021cc": "Ventile",
-    "fbf2b002291bc9503dacc8822d3d0dafeb319dc9": "Dunlop (Blitz);Schrader;Sclaverand;Regina",
-    "2d58baee0eced70545e94a9c9ac9eb8976972ed0": "Litfaßsäule",
-    "982103b53016cc795f7896e17d96101f7cf52bcc": "Plakatwand",
-    "28f2d79b3e76d0fba8de5bcb7ef20f672b807294": "Sport",
-    "1b326d905db391f205f575a1840394e99c87637f": "Stadion",
-    "dbdec847d466a0ee5b38360be7c2898df8451570": "Sportzentrum",
-    "74dfa355513a4f195082196b84dc54b9b2c87869": "Fitnesscenter",
-    "02257084caaca65e71c456be4abe19d92b9a6c16": "Spielfeld",
-    "8c03d66e77f8d65298454c1f11059b2004ec35b5": "Golfplatz",
-    "ac37022a948deb0c4aca88ff5d6dc087f7b1e070": "Von Menschen erschaffen",
-    "cc58514f1c30d8f4f353f0b1d10e42ff47f7b970": "Geschichtsträchtige Orte",
-    "0c109e0a18155c4ff986b71f120479220eda5785": "Schloss",
-    "97795a734fa006834e278ab6e4fd62f52193a22c": "Ruine",
-    "f368843c94d74155ddef4f05725e2bcc25bde341": "Grab",
-    "bc699df69689273fb357ec7f10c9e1aa10c13187": "Grab",
-    "a9bf6bad315d9ccf9d2b00f387d6e9b181c54d77": "Monument",
-    "88ab8137bcd163305abe125f3543eef9c26fb3c4": "Gedenkstätte",
-    "e78aa4bdbf211ddd99a006c9e023e8ab943b8089": "Inschrift",
-    "9746294a2c204ff40d2a9a58702762539a530ba5": "Wegekreuz",
-    "2dd130e42ac946bcef9f7a41b1e1a86bcb424f27": "Bildstock",
-    "e3ac332b47a54dbc7e5d9e9597e2a137ff4bed1e": "Anbetungsort",
-    "9361f42ce14c9686ab78710a87e5c274f295afb1": "Grenzstein",
-    "c0a89e0df25232c9ae1b46e2a09e98c9ebf4ea69": "Turm",
-    "0a667c89b92c3f9f5697dba72a36b5d24a80be58": "Turmtyp",
-    "a729bc7b8e73bae8abc9e9e35145d2ffcdd74c5b": "Fahnenmast",
-    "2a5c9261abdd5b7530c1fcd7347cf9ab44c7e888": "Kreuz",
-    "e65382fdd2e499489b89667bde4d514454fc83c9": "Kran",
-    "9ccc1c0118b017850eb2d9207367b4014bbb4f72": "Springbrunnen",
-    "243673fb18b4637e5d2f398761e1acb5e9a0574a": "Brunnen",
-    "4ab137c31ca57f1b156ff44a61e1df5d0953cfde": "Pumpe",
-    "0b1a57305ff71c89c551b4b68ef561c1c0c0f124": "Straßenlaterne",
-    "7fb3e6fa9b15f8a7ecc275c313b341d89278e4cc": "Vermessungspunkt",
-    "c52e4e25ae51f4919cf017e41a79f5acaace0655": "Überwachungskamera",
-    "7b9b48e3878d4f420fc3dd476c36d70cdf35b0b8": "Zone",
-    "6574d5951216c0fb888afeb278b02a0a2fe20cc8": "Befestigt an",
-    "1029bd4b7b1b30de60f2b96f4fe25e3912dd635a": "Richtung in Grad",
-    "c8395db7ea7a38de472172036f218f170766b40a": "Neigung in Grad",
-    "df2bbd50cb88352bf43829364a62da34ea033ab5": "Kamera",
-    "8af639564d9b45a5bc7e25f089ee352fd5704cc2": "Läden",
-    "6e925438383d3b88e00bcc7252e85a05898dfc3b": "Essen",
-    "e57ea4f49abfe710d2230f611899ffebdc69acce": "Supermarkt",
-    "ab4bcb1919f949cd5d16475405d121f6e1dd7b85": "Gemischtwarenladen",
-    "dc0e291bfdaad7163d9ded008008e31522d507c9": "Kiosk",
-    "cb8f461a7159ea01f90a4b11d5173c4e5eccd576": "Bäckerei",
-    "054c0bec7f2275234784beecebeb95507c02c5db": "Metzger",
-    "fd5c4c67ea3b7cfaea88ab279a55ff7373bf8f01": "Meeresfrüchte",
-    "bcdc42dc1fd4bac493ac7c017d9296f6e49e2c6f": "Molkereiprodukte",
-    "ef5442c6ee3cfabe55832b1667797040fb66f237": "Käse",
-    "78f21be65ca690c6f2d6ca9381cf692d4cf5afc7": "Delikatessen",
-    "218e8f306f92d5e0051cc9bfb0d8cccfc482dfbf": "Gebäck",
-    "bdbbf0c7ee150eb10e82b51a316872b00c6f3a37": "Konfekt",
-    "d2b51c214901280ad8fbf82fa05902a17a208e12": "Tee",
-    "febbbf4e992859115011da47ed3ba611d5e243fd": "Kaffee",
-    "009051c50834ca9d88046afcdf9f3117e7786515": "Öffentlicher Markt",
-    "9697102277498e5c7af2b65fe851bcd9fc748f75": "Bio",
-    "64484d268a47c8ed2226c6995a2d4d8bc0f27fe7": "Gemüsehändler",
-    "10628667c3a499a9b03815f074c091abf9ac069e": "Bauernmarkstand",
-    "95e025a64a632a847252f04bc378a45dff7b965e": "Bio",
-    "d74db986cefacee3964f906860ab68a66016bff6": "Fairtrade",
-    "f5a2cc2c324ca43cf30d3114b5ddd61501f95279": "Alkohol",
-    "a25d15b94056fb0cc6a25d9c34e67569cc61b34d": "Getränke",
-    "93ab2690fa30e5ab5d12d7efc0a2b43e3df817f7": "Wein",
-    "1ec961e20a254b24572ee76d5d67b82e573bf1c6": "Boutique",
-    "da8e1d26455640fe9d11ee11ac8dc0dca2aa063c": "Bietet Reparaturen an",
-    "429ede1ff15f522f088095519c15f0060b02820f": "Outdoor",
-    "acc49d8c0d4686ead5a980b57061b184bacef24d": "Reinigung",
-    "a86a87455494da336e7f739c05d834d6c84f22fe": "Wäsche",
-    "03fb78c5351f9e491c39790b3406a63de3396a28": "Wäscheservice",
-    "c0d00277d95621650e474e9172bdd2106c1853d4": "Schneider",
-    "a289af1d2d11f931ff1b9b3714c42226782e9ed3": "Stoff",
-    "d3b0d4c72ab68c6f918f01eada3de99e04751b46": "Elektronik",
-    "483aa33013b8a04f7315364e37b8b36a28df5d73": "Computer",
-    "dd142f410bf85ff9be99f18967c9dc1d502c48de": "Elektrogeräte",
-    "cbff2ca42f72362f87c5dcbcbe63b5175cd4d46a": "Handy",
-    "15681794d6d3a04454367d24af5d95dbfad0c2ef": "Staubsauger",
-    "d8c55cb03234a8217199a447d0f3cf85dc03ee50": "HiFi",
-    "8973097a480fdf160611b7f84c0ad3c9c992d52b": "Video",
-    "180896f967c4642032c9a781f856c9edf65728a0": "Computerspiele",
-    "8f9e23442f63e719ed45bbcadfa43d010b1a2f55": "Musik",
-    "8525f3a5e5016c581102fdd9aae15df93b2a59ea": "Bargeld",
-    "0b782ff5730a47353236b3a3c80bab201e638065": "Bank",
-    "cba748c1fcbeea9a92fd0809a7616472116d1604": "Geldautomat",
-    "17d282ce78683183e96c87351f2379e0d7975d37": "Wechselstube",
-    "b58274088ef235f51b64aaeda072a4be927ded7e": "Leihhaus",
-    "6043e5934c45010f38d52bb953aa1bf8d3860d54": "Inneneinrichtung",
-    "72af5d97af36c3c3584fb7050cf4300975cd1261": "Möbel",
-    "048da5cb3e281ad572d08ed47148cc72a5ca057f": "Küche",
-    "97f8af9e97bd4629bef3406b0fbf07a03998147e": "Haushaltswaren",
-    "8f4369c6a8a2cf11fb6d4077833dc28d07d85b2c": "Vorhang",
-    "ac48382a7ad88f84edf712e3e44802fed07ba20a": "Kunst",
-    "ffc5eca14433a4d22ba3902c987c35aa210efc37": "Rahmen",
-    "c7260b09039a4ade7e0f08beef9a31a0ed19b792": "Bett",
-    "78db6a7d5dc65dfd604b8532b78be7fe13414170": "Teppich",
-    "cd76e8de45b41afb595ea7462fe9c7e5fd5cd925": "Inneneinrichtung",
-    "132652e26f8daf4192ca9aac9ec6c16b1f583974": "Antiquitäten",
-    "29c02a327df880a9b230752da552a2d811807445": "Gedrucktes",
-    "0da6a8c83c3527a29525d420d3813482e72b71ab": "Schreibwaren",
-    "eec434e1aa251a8d4af64483f4130003c47c1724": "Copyshop",
-    "0e20a03355cbe32fa4a2609ee85fa5d122343cd3": "Buchhandlung",
-    "85b55a2aaa3bef9961b239ff7807ed6fd94f324e": "Zeitungskiosk",
-    "ab8078399dccf2dcfeedc93366b4ccf60cef1297": "Fahrkarte",
-    "819157d6ead9041ee2f0a0028afbad20c0e96f2e": "Für den Körper",
-    "b1f3f32a6e098fc4aa3b26df85ca731b1ce81a97": "Drogerie",
-    "c31e153e406a4d04a1e74f6cb14cc42c982ff12d": "Kosmetik",
-    "bcf5a383877e1e890a7ef1f47e5f1e4fc04f8373": "Parfümerie",
-    "949db9ab1b83ffd7e8915c3b5cb802c309181f3d": "Schönheit",
-    "ab262b8678a7e356ff401c1869481de8e902b387": "Tabak",
-    "237a4c2ccb391e955136381db7c94d6c1b9877c0": "Friseur",
-    "4d4a3bb45a16cd8e6f906890721ef3a9e41eea3f": "Massage",
-    "fe638564bb92db19e322c49e373307d5d7ee9a41": "Tattoo",
-    "f80273cb377860904944430497699e4962deb16c": "Optiker",
-    "52e02734694d342fbf83be51bdfc352d3c837bad": "Hörgeräte",
-    "0e389340a515ee89d4fa095d020a5278e68e07f8": "Medizinische Versorgung",
-    "eb3b3e50c1aa02ba7fc85493e64110cc766b9a06": "Schmuck",
-    "670e6cf7fc4651217137fb44daa9c44b0afd00a7": "Erotik",
-    "8bae32c66a8bbefdd74622b31ca7fab74d09cfc3": "Kaufhaus",
-    "1ccbca59579c34174f82b4cecd9d862ba61e1920": "Einkaufszentrum",
-    "bdf1bbc9ea6720ec00cd8cedf88615317bd5e9d3": "Florist",
-    "2b8686e8aa2275778525f42466d9a110b7fe3640": "Gartencenter",
-    "ac47d8ad77b4828e3827315bea4eea23ad9a028d": "Baumarkt",
-    "3c794a28da0a341ca7ec72fa7de3e4ee8e93095a": "Werkzeug",
-    "52c444722cdb05e3e6841fd300b4dc8b14de0cfe": "Farbe",
-    "85bccdc203b71e7a465121b728af0e9e1e6fad8a": "Gas",
-    "5da9eefe3f5528bad553af9274e8d3cf3550bbc5": "Reisebüro",
-    "85f8fef7dea3221502b82279ddaef1b807bc8338": "Musikinstrument",
-    "a709f0f93e89d06b53b0d506cf64b7dd91c17d88": "Spielzeug",
-    "9191b48f77ff162691aee4b05d50471c012ac2f5": "Geschnke/Souvenirs",
-    "932ab0533f595ef44857e8cd918faaed7d79b084": "Gemischtwarenladen",
-    "8c54ce4d14dbf62b0770f100ab3e14201276fab0": "Wohltätige Organisation",
-    "3087046de3f8946a65ba8540d8eda9e16b80abb0": "Buchmacher",
-    "498f8325b5b12e858cfe03328ed9b1317a9f41d6": "Lotterie",
-    "ae50cf94450852176731ff8c00a0ec724653dd75": "Tasche",
-    "dedbe37ec5281a8d0d43e79aa6b426e45dba44b0": "Haustier",
-    "d6e28b14ff9cd7bb3935f763c8056faf3d6f79a9": "Foto",
-    "0196716d697307f5356f0659c3ada161fc754f46": "Bestattungsinstitut",
-    "622abe17ab6249f3832a59aab739b09f47e5f3c1": "Snackautomat",
-    "f374658108a3b28af9223791bd4e47e97485c2ec": "Verkaufte Produkte",
-    "c801f384393e5196e59492066420a598984a5458": "Büros",
-    "1f55300512d2c2e7d1e7dd727f42b9e8a64bf19b": "Buchhalter",
-    "cee5fbceeb1aa4cc1db31ea954ba506365297e83": "Administrativ",
-    "e27a872e3158f0a5306a9c4b23c47acd2adfea28": "Werbeagentur",
-    "ea5138e2cce97211b31499f810f2f373ee3d8085": "Architekt",
-    "7a83e28dee200ffd90175c2bec397e9bb8ab3f73": "Vereinigung",
-    "0fd73359ec7b3c3209cc0bc0d70cb04b210edbbd": "Privatunternehmen",
-    "a966399c76a93058f68312df3eac520dd1c382db": "Bildungseinrichtung",
-    "4a92f9cd8420f021c6442d95821987468dc00044": "Arbeitsagentur",
-    "80647fcec97a29da9fec13e4f9faa0e70dc35976": "Immobilienmakler",
-    "7631c2d2155a3bd7bf35333a587c21742c7d8be3": "Fundament",
-    "bb9a6e8b13591a5d37e7929fa2b79357c59908b6": "Regierung",
-    "9eb67e597b6098a8b2cf5b89b4d2faa38af5160a": "Versicherung",
-    "51122d533e861790e57f6ff6aacfd4e20ea929fc": "IT-Spezialist",
-    "5239b13d146d70716690fbe18270d668aeeacd56": "Anwalt",
-    "b91f160d8dd516ece414f6a270ed79f100c27767": "Zeitung",
-    "1a412d542c6d935929b04d953a8471efe9e82246": "Nichtregierungsorganisation (NGO)",
-    "f4d29dc5ad5006c1f7e80a334cba7c213a3a1b26": "Notar",
-    "36913568d51c0b52e7f818f72b809f11b7267bd5": "Partei",
-    "6664dea99ae0b975e4b3ae5c638658d206579920": "Forschung",
-    "9f9a33cf7a1d48ad226fddb24e458ed5e43b0ca8": "Steuerberater",
-    "de8d04696b6e036ea05ed7a2b1c86608e5e82d0c": "Telekommunikation",
-    "e77de9fcc30ac4a4a3aa0b953e8b78a5944bdac0": "Handarbeit",
-    "fcfe110143bce627f475cacdcdeb744d82d373dd": "Imker",
-    "9dd516fc39e09084bad27604c108fde7ae10c50e": "Brauerei",
-    "0dc3743caedf40f18ed481b6ba03cf913182441d": "Winzer",
-    "727fed9b8403368032405c8c9694a538bf6748f1": "Partyservice",
-    "c0a79c6cc56270c03266d2d0d080ebc48f71eb87": "Polsterei",
-    "726efb82ed8d7f9952589a68610e95a06336ae19": "Schlüsselmacher",
-    "637755e5d5ae01f0c0b775d3b653f3b9d64a7853": "Schlüsseldienst",
-    "3d3adb04aacdf0eb1884a5830f3f247137bbd50a": "Elektriker",
-    "dc1a1591cb80febc988974429d4c9a1f0a6e79ad": "Klempner",
-    "7a5728380bde3b4a2b3d38cd8c28e1a82e71ba5f": "Heizungs- und Klimatechnik",
-    "b6213d559653cfc7ebc91663e1bcb6f760288120": "Maler",
-    "b4f8467588fb6d1366a73d64e60dd88cb6945752": "Fliesenleger",
-    "23567c4278770b20ed9f191725d568d014453d60": "Fensterbauer",
-    "49eaca754d4a65756952c3e77a15a3b8f74c9ea2": "Schreiner",
-    "5c9b045b84b31a07ff18c5b030ca2e7e2c976e8a": "Dachdecker",
-    "c565ec5cdc28fe77430f8ed274b7c432aee6c011": "Fotograf",
-    "c9833288981bb884ab4556473cc4dd1ff4291f43": "Handarbeit",
-    "81325ec26b9d802250c3cacfcd5acdb30dbb8418": "Töpferei",
-    "fba8ff0c5f94b7c2dc2f30cd79cca1349a822b48": "Gärtner",
-    "b0f0a68b08ae44e145a4569fe4671ced9904e1c7": "Schuhmacher",
-    "efda4ead56cb01574648170afcf43badea031d51": "Sägewerk",
-    "d26facf1b9154b142c8c9da3a051e4f5d5d5949c": "Steinmetz",
-    "65baf858b8f4d08fc3a92464bc7501a383e9394a": "Schmied",
-    "97b76e5c97e640edf698a1804266e5d99109e522": "Metallbauer",
-    "9445b1e398045e6a6c1feca51dce60db7a936a27": "Stockwerk",
-    "7c8825825fb85efe285129f45a88f3c80d402ab5": "Rollstuhlzugang",
-    "d78b520568d12c4a920ddecc285519636a1cbdb6": "Anstieg in Laufrichtung",
-    "f845387d8700c0eca71aa4c05c7d284426c6a689": "Abstieg in Laufrichtung",
-    "aaf6d426ff3014c40fbdbd3e9111fd714faee43b": "Privat,Nur für Kunden,Erlaubt,Kein öffentlicher Zugang,Öffentlich ",
-    "f72c64724cb7ceaa4772ee9d82989278e778d3b0": "Rolltreppe",
-    "fd118a4d3d091ee1ae670052f892e3daaf13238f": "Rolltreppe ohne festgelegte Richtung",
-    "b2494f66bf9d76158be1b04a12d95fe2baf90adc": "Bewegung in Wegrichtung",
-    "e0def19af70ede1a1180309a7ccfad160c7ccce4": "Bewegung entgegen der Wegrichtung",
-    "f122c4f686d34c1c7254bd11e08bf3f3565a41df": "Ändernde Richtung",
-    "a0f954597569628ca4176af7b4d16ce3a0b279e3": "keine Rolltreppe",
-    "536c2ecc9b69d363f91596cdd53fe1cdb31a41c7": "Gebäudestruktur",
-    "f6b43bfcf459b78caca46c61eed1ff75fabda1c6": "Raum",
-    "d33da3827574202fd87fe590e2dbb8d0c87194b6": "Gewöhnlicher Raum mit Wänden",
-    "c6788df8d5cb7d884e435bd5b31efbea494951c6": "Raumtyp",
-    "03375837f9441d631fa0e809d7ffcfdae70cf21a": "Gelände ohne Wände",
-    "830b634cd6d4669c643dfee2b6a5c06feaa320f2": "Mauer",
-    "236d210bb33874b321166b36b0037b90ea57e548": "Individuelle (nicht-passierbare) Wand, die nicht bereits durch indoor=room definiert wird",
-    "ea8e29bb7eece57a6cf7603b614636020a99442c": "Solide Mauer",
-    "de39a8dd19ab05e6bce77fdb06336e95f22dfbc6": "Türe",
-    "a072cf69a730c8606c548e9f3765e9de1b3a76ec": "Gebäudeeingang",
-    "fe86fcdd9f31cf9008b592f60e74c52ddb673f52": "Haupteingang",
-    "5bccbffc8069e6763af09d8322d7b2bfc4279ff0": "Hintereingang für Mitarbeiter",
-    "7d630e33300e7f36f5cf5f5508fa2b3080adcfd4": "Ausgang (ohne Eingangsmöglichkeit)",
-    "6fe429af5143b1c159e1e8cf2f2c6f345eb4038c": "Notausgang",
-    "af8c43ef00a4d0c9d94b05bd6b24c8897c946e07": "Eingang zum Treppenhaus",
-    "726a7837069558d42ee36047d530b24f3ce09579": "Privater Haus-/Wohnungseingang",
-    "f3b3973cbef3e1fa0b350af14f29a88f70dd9e5c": "Kein Typ des Gebäudeeingangs angegeben",
-    "d2ffa49782089255c6b699fcfed104e2354af1be": "Kein Gebäudeeingang",
-    "ab88e180cc4a47fdba81abb10c446e09d2d0d7db": "Automatiktür",
-    "0f67bdbd37cd4e97d76fc44e1cb5681464a40e52": "Gang",
-    "fe1426fcb5ce99ca8aa92928829b9b3a90236283": "Verbindender Durchgang, standardmäßig ohne Wände",
-    "7a34227bb68a6c0bb81e4d2510d653122373f6b9": "Treppenhaus",
-    "838ee0d9cc4765b88e1137e8b187c9f0c4c2ea7b": "Treppen",
-    "22ae8b3f64f417ae2e0d8ac0f063692318ca29a1": "Aufzug",
-    "a2dd555ee212b68263ab0230110c8e7d4b5a4d6d": "Fußweg",
-    "bb911796e522dcc2bcbcfa9e564d0197f63e78f5": "Zufahrtsweg",
-    "e57055ce26b9b56d96c29743d295ac30a90bec5b": "Typ des Zufahrtswegs",
-    "6b29ebc5bfe4639f798dfd3b094fb00d7894a4b5": "Verbindung zwischen Stockwerken",
-    "78e513dc3b9d44ab4f4a3ed2b536aa72a4256d9b": "Tisch",
-    "0c0fe7dcab398596f5c7c950638322b748856c4d": "Länge (Meter)",
-    "07b6b9637911d53eda7e468d1e175aa0200738f4": "Stuhl",
-    "781f52ec5b1abf5196cb3a0781de8c5fd33ec8af": "Regal"
-  }
-}

+ 0 - 665
src/config/locales/presets/en.json

@@ -1,665 +0,0 @@
-{
-  "en": {
-    "8cba1ac208566c60dac434d54f7844364a1cb6d6": "Surface",
-    "d388f2ab79305958e022b915f7595e88b3f1878a": "Smoothness",
-    "d62a2e61f010efadd90b6833c0861768b8ecff2f": "Bridge",
-    "5e1d404c35fc1d26617e5796d25ce63325ec38de": "Tunnel",
-    "6653488e47a68c98f962098d94ccfe02d238d857": "Cutting",
-    "5ec95c3cae1eda810a87f935fc6e6c7b03f065be": "Embankment",
-    "b492e85954c9a57734925e1051f9b9e65859ea32": "Incline",
-    "c53e94489b2557fdba88689b234cb347c4699b1e": "Oneway",
-    "325755812dd94be9f4631a2c6620f6370a9c9994": "Lit",
-    "bd1464606a57b5e483f318630798addc4b663d8a": "Width (meters)",
-    "a93bbf623ea6890872a3591e19df565fb0006231": "Sidewalk",
-    "7fc65a69aeec2b9f9e7016334c09bf26139d4bd7": "Service type",
-    "33258756f753e172545b0a98b7e583e47800ecde": "Electrified",
-    "ca50416f8d2560601b643d74f1c506b080b682d0": "Voltage in Volts (V)",
-    "343033feb08a61ccd975c927a5ccd9fe9f10f86a": "Frequency in Hertz (Hz)",
-    "282cec95c7986a3c21706b2e7e8aa7a2512ca37c": "Tracks",
-    "9c99dacb329b3899b9784da23875ced3780e39ea": "Gauge (mm)",
-    "7008c24c567d9a4bd2083103474df81ad1f53a5d": "Minimum age",
-    "40d0e4c70053932860c43cb30201e29b43dde5a9": "Maximum age",
-    "b45a978022a0f3b40568737412efe19caec314c7": "Name",
-    "459bfca3bee7cf89e8d3c732548ed883c487ab9b": "Reference",
-    "62a9ba46f945aa5cda1a9ca9dc3dba6120b6831f": "Operator",
-    "04af3c879938f0361ef6da64c640b9d2bffc3003": "Layer",
-    "07f4daa0376b390d81b08a78453b053bffd55f04": "Service Times",
-    "1285dda58e2520e690fa61928d34b02227b37ae1": "Opening Hours",
-    "559a6b0e9c2f8dba3110ad4cacf3b27a639e3b9e": "Wheelchairs",
-    "4f02f52c08e6611dcce3db0a4797825fdcf471be": "Brand",
-    "313e88ea551b37aba96d224e638252506234adb5": "Cuisine",
-    "72bd73c4f73f5dbb08527b223a0a56c4b30ca0fe": "Internet access",
-    "c7a0619eb78db79c9e450d9e2f5235482aa81896": "Internet access fee",
-    "2ba34186eff9e8255ba58c59d6994584089b0099": "Smoking",
-    "a50aa4dfbf1f4bc16db254a295df72111c40d036": "Sport",
-    "db0151c61508a2c42c2fc5361a45c2a21d1dae98": "Fee",
-    "2a15ef203cbff75298fae6c2b168381d7e9a8085": "Reference number",
-    "2e4ac3b73782fdefa3864986f741afa168757398": "Type",
-    "a6e9a2684235ab1adfee3e79aa603fe48126680d": "Access",
-    "6c45e83b9623cd6eb5f1e02e4fd90d5da63453ce": "Time Limit (minutes)",
-    "06ef33fc94a1d8d3a847371a3fee0f423fb62a3e": "Supervised",
-    "4d12b1a77c26ac10b7e6211c8a40f3743db95586": "Wikipedia",
-    "a652863cde9de3d48a04ba39504973266e4bf368": "Religion",
-    "ec53f865681cfd8052c92c98c18bf82cbc5415a9": "Denomination",
-    "816378cfc41f13c5d85c7e5eb060d042bfd78e73": "Branch operator",
-    "5a65e97153c1717e74b43c48cad94696064a1cc1": "Support",
-    "ccec131c049514b2daa422663e8adc36e82411ff": "IATA",
-    "314d9f810258af8844a07e91f197b5e1d60fc4de": "ICAO",
-    "950acab68d329a33a845b632b226a70b9a34622b": "Car brand",
-    "d4666f560f10847ebccc79406b5b5c79ac6bfa68": "Motorcycle brand",
-    "9769b608aca265bb7dec7bb93aa9eb5b68304aed": "Barriers",
-    "17b48b5c55c0c2c09dd9054a3142fcf080a737be": "Hedge",
-    "cff646dd265f590a04363e9fe01bfc1600564947": "Height (meters)",
-    "26b2a7ac433932f6bacea6cb082169302512df4c": "Fence",
-    "c30d366040fbe6ece556eb540dd0c6ebba66155b": "Handrail",
-    "a5c589a98abae116ae3f774a709bb958fdbb8f18": "Material",
-    "b413dfc8633c1ea168831173d519246f1811ef37": "Color (HTML name or hexadecimal code)",
-    "eb3c9b77c28fa522c6bb08825bb04ca15e8639e5": "Guard Rail",
-    "d0ae64596a4d0a7fd9edb13451b1709d0ec89923": "Gate",
-    "a223d3f0e2327363b8630136a4c74c5aef276c67": "Lift Gate",
-    "5e94362b973ddf684a1e5f993ecf8b61f68d6ec4": "Swing Gate",
-    "2a581b93e76a6e9426ae3c410ade74c7ac8f499a": "Turnstile",
-    "aa2bbe66b68a2c9633ee3979e91bb75610f3bef1": "Transport",
-    "3d078c543d3a48ecd9a023d431d8068815b58649": "Railway",
-    "a5b3b774dfd86f56935da242c5cd60cb0c4abd66": "Rail",
-    "73ba164183160c158d26437413810762b100f5b1": "Usage",
-    "26685bb17e48db05f30ab2706e756a4d509aad8d": "Narrow Gauge Rail",
-    "f61bb216230b165b39c80066724c950d85a9f9be": "Monorail",
-    "427628309e3a69a6a1e1d3bbfff06d7f90e10dd5": "Preserved",
-    "b9abad24efa6f5520b4439cdc56d4e2a6a4e612d": "Light Rail",
-    "c7daebc1b8902d891ad74c4189a2ec431820ae59": "Subway",
-    "433b41fb0831550fb6da6fd4d551ea7c5fb865aa": "Tram",
-    "5019f7210478663ac4f642e1c1396cd6f6b8fbc5": "Funicular",
-    "94a84cbd5312626a55bcad4772af7156e47d9ebe": "Bus Guideway",
-    "db44d40650fd660694c2818e32060c5146de7cf2": "Max. speed (km/h)",
-    "a439a9c446e6a6970c6bf26a9d73ae59b6f2d04c": "Crossing",
-    "4d44ee3b569c73515531badaaeecac8c0b17a906": "Crossing type",
-    "cd16f5f0b295aedbfd4749aa695e8fd5321718fe": "Barrier",
-    "8f43bfc047ab59083b52692bbc586c1f41392eac": "Cross on horseback",
-    "9c8275cf62286d082516156cf175f0e58b433d25": "Cross by bicycle",
-    "cfe583fac332b290ea8849c78437dc0918f3509f": "Traffic lights",
-    "5a5527e098f8c756291485ff209a0e45083b3098": "Sound signals",
-    "0403a7ce11bdddcdb2dfcf601674b248e39deccb": "Buffer Stop",
-    "c340855ccac6241a874b08ff6ecfb8bd49702119": "Car",
-    "29a5b9d0854dd6ea33be9f9b4921dabd745316b6": "Parking",
-    "f127e5fc92739e596b6d320cdabfffc5ac9139a3": "Max. height (meters)",
-    "9ec7fb6f5a24072a6e1bc5cdec778f47b99504de": "Capacity (overall)",
-    "2b0ffc44a7bc78656a66561aa67b392cf41662dd": "Park and Ride",
-    "a26945a0f6e3fc4f0c8ba4fafd8943dce34800ff": "Spaces for Disabled",
-    "176681d5f3d0bef67d9f03a8e27176dcaf7c656d": "Spaces for Women",
-    "ff0531683a42d9746edad527aeaa4f4ac8a62e42": "Spaces for Parents",
-    "e5a529a4d8c27212241b73d0499181b0f0520a83": "See the Wiki for other capacity:[types]=*.",
-    "3e714b01a797840927cd64d48b50f85a910089c0": "Parking Space",
-    "a92c961c86af5d35926d74af43b72c7ad794f324": "Capacity",
-    "5b77e5a66691c0e789b3897f51b18bda69a892cd": "Covered (with roof)",
-    "6085b4a782626ea16b0a82fb9384e0ef44db013e": "Parking Entrance",
-    "bae3ad2e142659acb6c508e0335d27dcd9303c37": "Fuel",
-    "6644a23512d717fd6c829c5d7f31dbd60c402ad5": "With shop",
-    "19f20f52c49e3bce26f8ac40425c1e3400330c93": "Fuel types:",
-    "2fe0bfbc883d588bb3b491d4d8235297e41008a3": "Additives:",
-    "198f02612dca552422d3bdf5a6b23ddf9eafff5d": "Fuel cards:",
-    "3a2d3c359edb3c36b17f3ac52a563d8051cd18ec": "Diesel",
-    "7b46cc993648ee06971347e15dc875dfa1d41a89": "Bio Diesel",
-    "71a2aa4761708ecb3164b05be277b393cff73cf4": "Diesel (Gas To Liquid - ultimate diesel)",
-    "01af22c942d6ea4f1bef39916a304e01b5463422": "Diesel for Heavy Good Vehicles",
-    "d23c7271106de577b47dc547dad4780d92bab520": "Octane 80",
-    "1dab2ae489c274c27d1a5aafa20d9eafbb5e4ff8": "Octane 87",
-    "f7969b70b141398cebf925d89ae05028e8f476e3": "Octane 91",
-    "ac618d35afd82297cdb46183d3e55d1438b522a0": "Octane 92",
-    "1ae288a8d953b4701808eac6cb0bc2aab0611e5e": "Octane 95",
-    "19d3a740f5f428b9f99eda2c924642df3b775dd9": "Octane 98",
-    "bc9c615cd6fb345b7bb30de54a9a5521707a9dba": "Octane 100",
-    "62ef5373f985decf7d3f58fa24b13c2c45fe0711": "E10 (10% Ethanol mix)",
-    "befd411268feb7ab0a613fbee47438398713579b": "E85 (85% Ethanol mix)",
-    "6a3165942abd1537c60aed6d07f73b5551e897ac": "Ethanol (alcohol)",
-    "62a66aa3c1ed9099127f53efafdfdd49535c5bb6": "1/25 mix (mofa/moped)",
-    "e9e04964f2470c3fa01b8769da2a3ca8cbcba864": "1/50 mix (mofa/moped)",
-    "4783236ee22ea0ac78cdd13febc763bd23610dc5": "LPG (Liquefied petroleum gas)",
-    "63a07d98bedf51831049e2dcd94830dbedf7d97f": "CNG (Compressed Natural Gas)",
-    "385a797f63466e352339046e5b588e32ad83601e": "Biogas",
-    "c98fa32540ce31e31b8816473a42c2f9ac2775ed": "DKV",
-    "7bb8c4aca85abf2791f9d6cfdf64191c988d9bd0": "Routex",
-    "c4cba6139c22ac7de2e215280fd4dbc1c5247848": "UTA",
-    "536ea35870b8a23e9e0703e3b166e68e891055fd": "Diesel Exhaust Fluid (AdBlue/AUS32)",
-    "f76afe037d948f142a4428fe61e616cf3f193532": "Charging Station",
-    "6417685705ccc35beb67189aad9f02895f196c90": "Voltage",
-    "bfebe98b407a9ef682f1c90caae68e97d3505161": "Amperage",
-    "0ccd7ec0217a198bcbc8292b8812286aa9f3d040": "SAE J1772 (IEC Type 1)",
-    "e37535d2bdd4c3deddb07559d1892b8b08aa49f5": "SAE J1772 Combo (DC)",
-    "da677d9150f70ef9bbe4c81405de03b5e33a6026": "IEC Type 2 (Mennekes)",
-    "43a2f9def5db66d60235c8b29b00ac5b654a02ed": "IEC Type 2 Combo (DC)",
-    "7aa616c074c101546258e018c0e93cfca8b0743c": "Type 3 (SCAME)",
-    "54933cea935aecb602a320140e4caab6aea04696": "CHAdeMO",
-    "efb289af80a5f9520431e36be9651685bcf7c095": "Tesla Supercharger",
-    "655b564161a921ee9cbc1a9eff131233a37dc081": "Schuko",
-    "5ea4abdd0cab689195cd71c77950e7d2b15416e7": "CEE blue",
-    "cc24b13bd0232214917aed865e121576c1eb9d9b": "CEE red 16A",
-    "8e332cb5cc12e1f8841dc3b6c19c413c450c928c": "CEE red 32A",
-    "2f138cea8758550b8e7b8f1178743ad1f70c5389": "NEMA 5-15",
-    "0a8065d49d45eb5884cc060f5c5cb980c4525c1a": "NEMA 5-20",
-    "5b1daff47792f2a69d8c3a3a2124c7b8f75a7c3c": "Membership card",
-    "d6707b8c758cb65c95e04efce8fed50d331779a5": "Types of vehicles which can be charged:",
-    "c70f01b3f3c1eeee52dd7acc2d8ec19888c232bf": "Number of Sockets:",
-    "54cfd9e3f60ade5faa6d6caa31b7d9633bb8d27e": "Authentication:",
-    "da051e4f0edd6f44a2335e5f99be77cc573a4239": "Bicycle",
-    "869d4ed2769005e01de8917101f55fcdd106be39": "Scooter",
-    "b31635293774abe28d4181c7132e4c77b32768c8": "Truck",
-    "49d9674dae8a29e5fc698763eb3374d7f3372118": "None",
-    "b1dca6ce2054e54417b715c6ebf8b7e41eca5765": "Phone call",
-    "637f3c9fe1d8edb9477571b294bc87bd598e5988": "Short message",
-    "9076da279e7ec1cbca8404732bdf03bacbd1e1e7": "NFC",
-    "96edfa7a8a71aab3742015675d7a4bd407b1139d": "Wash",
-    "4c2c653a66a7a2b8f50712e082ab2d153acac207": "Self Service",
-    "08fa44b9ac2c4f6c4c6a9ee1daa83ceec3615b51": "Car Dealer",
-    "66b0e4416eed45fe4c0ca25fb3ce43d16df356fc": "Second hand",
-    "243cc98ce98838b21946b9644b698e6ce551385f": "Repair",
-    "6c9a4f1432e468bec7c322c634411287de3aa387": "Service",
-    "f56669f4cfc5457be5196a48efbbe31bca54da0e": "Parts",
-    "50b159d6544828a120bd5d62e7c21bfa35054fce": "Tires",
-    "77a8bfdda81ba80231cd7f392eaaf146e73d1fe6": "Rental",
-    "7522c95fab7a7f0d73c2ad51273ec027271cf102": "Sharing",
-    "e07600390f68df7435fd9f127fd4f06600129d40": "Website",
-    "5619650f27cdde129ab662a0eb99c95975fc9594": "Motorcycle",
-    "0d3f32e71b6a2f69f63fe5e5460a5f6c6562f217": "Motorcycle Dealer",
-    "c7f7152769491bc8ef67a4ada12d8d49abe50894": "Services:",
-    "49df8c0e1b1d8403df9c89717b43c2906e2a48d2": "Sale",
-    "17a6cad5f87b32f3d7ddb0bb7129c3c3b8c74441": "Safety inspection",
-    "bd36f99ababc5f8d5bf932fe78c1e3a43909f979": "Clothes",
-    "15a9f10bf7b59de7bcacb3daa3e928e210cc2044": "Other",
-    "93dd379628f0eb9811685b5c04df26c1d88c8da3": "Covered",
-    "a2563eece3ed529dfecf375b02a9377b926e7c2e": "Bike Dealer",
-    "7846e37c2a241f7b57638bfa0feb3a9f0cf3aa7a": "Bicycles are sold",
-    "5ca2bb12894b00c8a4839369ffe98a34cab7caa6": "Second-hand bicycles are sold",
-    "dc595226caa17e96d6fa8933615dd27f60894651": "Bicycles are repaired",
-    "8f28d8988bda94dd14776fb0f0abacbad0afe5d1": "Bicycles are rented",
-    "22172272a22882cf41b320210ebb0e3618e28095": "Free bicycle pump",
-    "bc8d405fe4af35a8ccbab7070cb8c3fcd67a8b94": "Tools for do-it-yourself repair (may be a bike co-operative)",
-    "5c917726ef3e13f45c0c5f92594e519829cc4ae2": "Bicycles are washed (for a fee)",
-    "4c9c398356af4056e43b1b8cc406ef92ab4505d4": "Public Bicycle Repair Station",
-    "f3c821f7735bcefee7764cb97b4bc5dd572d820a": "Chain tool",
-    "0f3333eec45b91127396c7d3d96e146657b6c06f": "Public Transport",
-    "bae9fe67109eb33919321963cd2e4ac2e1d242d8": "Stop Position",
-    "650e04f7353a4f4d73cffa66e85a70ade81e9dc9": "UIC reference",
-    "5f05c89dbed178dbedb1f6b863e0ff2c301d54d5": "UIC name",
-    "eedeffc76b1f5869cc82cacdfe266ccc376f7e05": "Network",
-    "0c618cb7f85429eb1776e1ed1ae3f18c5b6a48ee": "Tactile Paving",
-    "7dd9baa5f12b2b1ba7bb7a3e3d54f5f96effd9b0": "Bus",
-    "d9032c0b32e1c0c095f14209befc068253523391": "Bus stop (legacy)",
-    "ccef3807318579fd226a30b1faf4834677bfdacb": "Tram stop (legacy)",
-    "a5cdb6d810a275eb7771294734b3835ef83c3a13": "Train",
-    "1d68cd9b4c13a64ae775bf8b57934f1a5f07e21e": "Railway halt (legacy)",
-    "3cc78f46480af3f3a3a3b90555362dd88a59d34e": "Trolleybus",
-    "bbb158b34222cad8320ee1d9362d76173cc47239": "Share taxi",
-    "73058cc47f59f8ad0554c90c79f7d1820d3f33f0": "Aerialway",
-    "b93c94013e88f8666cfc1d37180458453def3dbf": "Ferry",
-    "66501ca5bddb0f3869d5bd6d6cfe5011443a5b49": "Platform",
-    "a0619677da4f50e6445a3cb9e97d8b6261c19d99": "Bench",
-    "b3f0115d621f5e869219fe6e9ff5c68270822b71": "Shelter",
-    "b286bb123111ab536048ad3e4be2f41d0133c3e1": "Waste Basket/Trash Can",
-    "162bd58a61cc29d1b4cc0aa01bea9b63cfdaae9b": "Station",
-    "ba6b9a41577507380e2efb273bba4a4e6f48319f": "Area",
-    "086e10a0e26827a42c333b5ceb500660a111c25c": "Building",
-    "e8c8fe9e24803f4b9eff2f9d414ef55ee17f8de1": "Subway Entrance",
-    "fa412a10c689a57b63f2ac78ada67f181d43410f": "Ticket Machine",
-    "78e6c061697068262837f96f70a512fc7a37d268": "Airport",
-    "6f45e5552eee36a75b63492f21c1f0a0bcf3c101": "Airport Ground",
-    "2c74a1dce3b722d8c7b76bcaf349262994ca0e00": "Runway",
-    "8029a5aee1bde5765bd39ea3d8cafa9abec68d2d": "Taxiway",
-    "b2c2b02cf155c512632745ababedd8e2a7de0a60": "Helipad",
-    "f4cd98d041e30bedd8217356de5976b26614fe8b": "Apron",
-    "20242751512b7d8dded3546a7891953afd91c2d2": "Plane Parking Position",
-    "23323e67740f3b80fddeb5488eabd9f0aae911ff": "Terminal",
-    "ef00d6ce7e8590661a465cd9fa3125e03a0d0b16": "Taxi",
-    "e6265e1a1289b82ac8a3e01c212bd873823f98e9": "Facilities",
-    "f794e3e2f1a3cd51a2712d2df83321a8063e83fb": "Accommodation",
-    "9938a3ce668ca4a032b8382dd57e7e1b28bccc66": "Hotel",
-    "5817798470c555f35ebeb8dcc327457f5e2e5d44": "Stars",
-    "ddd88c645aa072cda3532180b4ca14e87c9aa666": "Rooms",
-    "e2acded36680915ff7d604862c058b73741bfeec": "Beds",
-    "3a3a084129a41e9c8e189e7002da09a1177e2442": "Motel",
-    "4ed765c05d44d584bbe6122835e232e5ef0978dd": "Guest House/Bed & Breakfast",
-    "cf2dab630a43f49cb45d9a381709a7ede8ed2461": "Apartment",
-    "370dd1ee7a31cb87427c29549ff88de9637ce963": "Number of apartments",
-    "88f08ea7211f203f92e2f034699e25b602bad48a": "Chalet",
-    "106e44ec3f5fbeef8c8d7b9a656b701b87bf537a": "Hostel",
-    "d4eae5bfe7a4f791f14bb7044d57b74e57a97997": "Food+Drinks",
-    "cdcf20533032e7afaed7606310b4ad201185d827": "Restaurant",
-    "95be518be4fd7ef1c236ebbf143619c83386c04a": "Microbrewery",
-    "3f866fe3792089a290b3c7fd5744930cdd5e195e": "Outdoor seating",
-    "c2949a050e768b4ef999012bfec8733dfde2e5cb": "Takeaway",
-    "7426c0dba164848df58cf9dd54726532d805efa1": "Delivery",
-    "a8ceca6c32d758dc1d0197e679bb938375e89d1e": "Fast Food",
-    "51fd168ce4431a5801ff9c6feb3e6bdbd9374630": "Food Court",
-    "01763b0bf177e4652ff03d16dc1dcc50fd6250da": "Cafe",
-    "ea4233533dc4447c84b56c42990662bbe00041f1": "Ice cream",
-    "e44d6f19b4e15b9d877b832d4b2ff397d28ee640": "Pub",
-    "83d826955b21b473d94a674320ec484bd2f008d4": "Beer Garden",
-    "46651c409f45402a1a3bd7497b343986a2c2ae5e": "Bar",
-    "76fa7f1b22ebfade9763dc5a3e8c837080eccd69": "Tourism",
-    "5eea09a4f024e692c6d16093808837355d0d68ca": "Attraction",
-    "d5e6fb8ddd14ee31a2a441724783b718dda8b41e": "Information Office",
-    "5dd9909fc80912f4b5b5de5ff594387dd2013043": "An office where you can get information about a town or region.",
-    "6f58a3a8c5e48afeedb29afb8d58a408026760c1": "Map",
-    "86ed0d33e714327ecd916cd29096dfa2fe62e427": "A board with a map.",
-    "5a05f7b00959671743f991b8084ab0d5cf267a5d": "Closer description",
-    "fb1669a7018c0e1473c8420c207f83a1786ca6ba": "Detail Grade",
-    "ce1a8d726cdadfba3b51d790bfc9df147633a880": "Shown Area",
-    "33a6660f28456a0b44235f52ff440fa2c160dfde": "Routes shown for:",
-    "d3b46f68dd1595ce308e95db5a0036c6c006d931": "Hiking",
-    "5d8ac3f662045deee7ff4b0312f23567add9e54b": "Cycling",
-    "0125aead430b1f6761649e7d5afeca96d62c5649": "Mountainbiking",
-    "e28ac2794063ceda8a9b2b2565926da61895a068": "Skiing",
-    "a279cd8945df125b76a13651c5236593231cf259": "Riding",
-    "cbfcede7bba09f933638b9d43af4aea4b2bdfbd9": "... other transportation modes possible",
-    "7fc1dac55d54c820d8128a158ea74659804dd520": "Information Board",
-    "a2236c78372c3ecd62aedb65ed67c0fb24485292": "A board with information.",
-    "28e7e6fffdbd8a91b26f4954aa00d55aacdf62a9": "Board Content",
-    "41f2cfefadf3eefbaf32fc72f134d75b424cd000": "Guidepost",
-    "a185d625934dfe468afdadd257ea64155c73b1ec": "A Signpost/Guidepost to indicate the directions to different destinations.",
-    "43dc525ac32b8485fd797b732c87f50e53253877": "Elevation",
-    "508bdb6f697d05f165c2e691c30398c150243e98": "Information Terminal",
-    "4831f09d5c5b5ba455c0b3703ecfe144efaf2017": "Information access via electronic methods.",
-    "175ab25d2d030c7638ce3820c32e709ac24e00a9": "Audio Guide",
-    "70c1a9293fb1dc711b68626eb467024c3c3b8fac": "Information using headphones or a mobile phone.",
-    "066ec1d6fbe485b383261844521d1dd29995a399": "Audioguide via mobile phone?",
-    "af7822e2604b5698fb5a75b8f35d768d2651c635": "Use E.123 format, e.g. +49 11223 456 7890",
-    "46c1bc32ff96786d7d907e60ea45a44060f55f3b": "Phone number",
-    "71a827996961d7d2a5fae24b2fc74dc7b7bb59da": "Other Information Point",
-    "bad3ddc26b397a55bab546ea6327b5a5abb3eb50": "Leisure",
-    "38532cd37d2ef2f2405f7fec593d3e30c6f931e1": "Movie Theater/Cinema",
-    "8b7ba503602407c4d006cbcb318169806339951d": "Drive-in theater",
-    "799bf0793b6b2803d69a97b487c71c0513f78e66": "3D",
-    "3ab6eed05fa2d44bd8abebe261d6d34e9492d899": "Number of screens",
-    "21d2a00664a46c67092b6035678ae2bcaf2f9c30": "Bandstand",
-    "220dd4b05569e4c89cbc36b269fb48a0cc81c011": "Zoo",
-    "7df59b2a55c0d93e484e2bf22502d68001f074b6": "Animal enclosure",
-    "fe24587c77d94fe7e9428df21e5716170ea96ece": "Dog Park",
-    "d673020d47e4e6721422522173df2ab181ceecdb": "Amusement/Theme Park",
-    "5d9068c43e1fdb1b2d8f07bc0cf8b12794301e3b": "Water Park",
-    "1067f8ed2e0c68b21a8ae01f43924fdaf4ea6eeb": "Resort",
-    "1b33eaa6be195a498ea3383eb145a8ef2bb4b022": "Swimming Pool",
-    "07c50f002352b6944c2885607bd4fe0a64fdd2eb": "Used for the water area only.",
-    "808a909f025c74f6ed26c71ffc74af37f7fa02e1": "Fitness Station",
-    "2a501eea14c7328fdb7d5f475ccbad844188d3f9": "Description",
-    "f5f35662ac2b534dca9f909ef2e8e96232555cde": "Sauna",
-    "908d8f3570c1c53027ea808bfcb01d3800fde0d3": "Playground",
-    "a06b72ccdd2f70f4087876719de5071549830392": "Picnic Site",
-    "4eba0c16a69c499b23d4dcf41372b5f28d779107": "Fireplace",
-    "5b104052f7b1dadf3348a22d69d59e5eb348a594": "Picnic Table",
-    "0c61c13303ee0352848d1db73ea3605cac1cfd36": "Public Grill",
-    "1621c961f2623b7da09b7b762519fac88eb1d9c9": "Firepit",
-    "8ca717c3de79d717dc559f1e1331241eb35f4a55": "Night Club",
-    "047fed2cd6e5bf5936dba34d07b7758821a09c83": "Casino",
-    "3895513a1bd146996a4f37a7ec550afe7cc95a72": "Strip Club",
-    "387b7f2dd50c97ce5868b821a273bbd6687f158b": "Brothel",
-    "ee4ebe9cff4e4b2de886262673f9d2f075d633c1": "Culture",
-    "e98d42cc36d372b9abdb884cdb256f63b6ef0a1f": "Museum",
-    "7d58d7daddd61f563c2d1fa7462dfa04cda66d91": "Theatre",
-    "376128992d204921fc1afbf30818599321ae5f4a": "Library",
-    "606ee76def5da95ffd2889413f0b606e05c79070": "Arts Centre",
-    "d96b4d6b1a537ee52fdb4e24be3f9055bbf422d7": "Artwork",
-    "542494945768ce01e6dc6a6417fa6ff221916a51": "Subject",
-    "8b03daba4bdec9233cbc5aef6229eff2cbb3468b": "Artist Name",
-    "30bba22332155e4413f06f9eb1dd460700552ab3": "Start date",
-    "054e13ba92847928561d3f3cb6efb212e686da27": "Studio",
-    "ce2fa99177dec3167e057d8b2d4ac707b3409565": "Place of Worship",
-    "f7178891d9b87f13f7a3cbe6bdc7cda537354196": "Church",
-    "f42bdfdba644d125bd47aa453156da8213124b9e": "Building type",
-    "62bc77a87a8624418fcd4a779c3851989cbe61c2": "Mosque",
-    "5e4ce2de47e842329b94a6a647d15d19ae3e30d0": "Synagogue",
-    "28f5cb8f63ca3d7c3c350f32e90178bc50c50fd3": "Buddhist Temple",
-    "d304487d732dd1742bd113d41e488f24f462086a": "Hindu Temple",
-    "fdb7be1683db04004a02d54d5a1fc64c5676ccbc": "Shinto Shrine",
-    "a543030938155bfa31ec8c2ee07c46ff5e89558b": "Other Place of Worship",
-    "9c4475a5a144938bd2a846c1b4168492cda11059": "Public Building",
-    "7f1754e88def3aae503e5cb517d5e1888a61b68e": "Town Hall",
-    "7748088c168bc09a030c6dcdf07e9bfb9cd3dea9": "Community Centre",
-    "832dbc8fe7e0455fc36e29e6523da69ca55a6db0": "Embassy",
-    "98d7d371eb2d97e31e44127ef4c509f136603622": "Courthouse",
-    "e39787818f943b76967c1191257093dfab2accd6": "Prison",
-    "d3ca9616c94522a040aadaed6a07577103a4dfce": "Police",
-    "375038d080f8e55929a93c5cfa5010d6b336969d": "Ranger Station",
-    "63c8e15285581173805b2a442824c42b15d53cdf": "Fire Station",
-    "8d8c3038045b9b328baf7ea49fe998313d720793": "Post Office",
-    "7db652d3fa86aa83de05b73868fc27cea87176e1": "Education",
-    "f5852ccd69391c018e9cbb735fd53b15c288da6a": "Kindergarten",
-    "507acbea512ee0d5e430bf58f0ae0a0a2b61854d": "School",
-    "5070ef2fe01f0e776431bfc43d7cc8fb48058a4c": "University",
-    "6b35092d5ee2f547660e976226362e1288412ddb": "College",
-    "03f24ba2f1bfdbae6d6aa9dfc11ea37961cc44b2": "Driving School",
-    "f1cff7cb9c0f05d6ba280c5e629db5cb6ee581cc": "License Classes",
-    "a6174dacced692dc6ef2f3b6a22bbf9cb24168e6": "Health",
-    "b1b81554db90c32e06f95ca96612c3f2913f5eff": "Hospital",
-    "0f7b057b3e917251f962ca33357601ae71df7111": "Clinic",
-    "360abeabdf00327aa566476ace1594105dc5aa97": "Doctor's Office",
-    "a43a71bc368df8a2c1257240a734feb0e2852e5c": "Dentist",
-    "6d44c437ed696a13d0c8f30df058cb166e04414b": "Pharmacy",
-    "d61f9995a298f7b5485cf122e037edd052778a8a": "Dispensing",
-    "9fd12d3aecddb6f936f5d702ede4567b5c3318ef": "Baby Hatch/Safe Haven",
-    "2d223d9a62e792af62a83875a944d71aeddf0b3b": "Emergency Access Point",
-    "9fc90ff8746922cbd40b2863a18dcb8825c3a171": "Point Number",
-    "8e218973fb97e5633c2b84a8fd94554938fb4a99": "Point Name",
-    "a3984b73943483d85f84e3339a283840bc34b021": "Emergency Phone Number",
-    "001f71c43bb3b106d70b231fe6ec008ceef4156a": "(Use number as shown on plate.)",
-    "ffba8ca59d1c3c6746b982e63e0ceb9a858a57ce": "Veterinary",
-    "b78cef21a5bfd9a9baac70f63725b9674baaf5bf": "Emergency",
-    "960e928357349002f63b92714c9fe8290f5fe2b3": "Ambulance Station",
-    "68889c39f89c9023c0f49ea8d196aa7eca84e3ef": "Automated Defibrillator",
-    "d8a5f46c83eb36bcddef602f2e36fb2a34c1cba6": "Location description",
-    "5477ef1de1c4fef8d6c74a505c1c52527c665d91": "Located inside a building?",
-    "4705e017aaf2bcdca8f583a98b3896fee137244e": "Fire Extinguisher",
-    "54c332db5ba733792edd733bb88293c6a7a49cb6": "Indoor",
-    "c7fd88d9fb181098306af7839a327c5bc2e6d248": "Fire Hose",
-    "93e587b937c322b66d096ce4d87c94270913a454": "Fire Hydrant",
-    "1caa358d335874cb22c220dcd25289cde5deb8f8": "Shape",
-    "7b7f3ffcfe3734f26790abac6b20f09d970b4954": "Diameter (mm)",
-    "afa03ab38132f8c46a2fd44b5f70f06d4a010b14": "Pressure (bar) or suction",
-    "6ea23d2433cba518f44690a50911de6f9633a2eb": "Flow rate with unit of measure",
-    "82e87e1f4c21f1404fbafe547088e19cea0cd79c": "Each coupling diameter (separated by ;)",
-    "760746e5461a6862184bf94381bce477b177191d": "Manufacturer",
-    "dc9188ebae1968b46e7866f6fea9885986153461": "Water source",
-    "ffa2b74bbf6fdbdda5d5e3b4a98840106353f988": "Hydrant Position",
-    "16145c7061de549b724fe6195594ce14df346583": "Pillar type",
-    "5c49a4bb14120892fe8f1c941f85e0d1dee750fc": "Number of couplings",
-    "54362c751bc9558cdb5c62238307f35e0aa73da6": "Colour",
-    "a21ca8160f57948b6085a7befaac13c66c004234": "Colour of the top section (bonnet)",
-    "16637693ef0daa596ce9f16bb0f9a1f576c1571f": "Colour of the caps",
-    "a0efc393612caf039c83e78901ee60380063b783": "Water Tank",
-    "e4a328d1c6a6f17355682436bd3ac97dfa41717e": "Volume (in liters)",
-    "4793bd7243a646f0ac71822f699bdd53e3913039": "Assembly Point",
-    "2d6db004ae9bb9b7a1e5153537f91c8db2f7c87f": "Emergency Phone",
-    "8337904de8ba94dad03ab02546d526fa74315700": "Siren",
-    "e7756d19c97b14a0122b721013e959d330815a91": "Range (in meters)",
-    "742faad81db0bb715b6baee9addad1f6b350c4d6": "Purpose",
-    "7495891c30399c092dd83b7e04f055db787b61eb": "Social Facility",
-    "f6ad773865f026211ac34b999efa4212c515feff": "Nursing Home",
-    "ef414bc347a5dfacbdf36e0705f7dcc068fd8154": "Group Home",
-    "a788cbb1b0b13f3b1b35394942d86a8267b2f2c6": "For",
-    "e86affdd9d48fd1de046824fd9eb0ba8f9e71340": "Assisted Living",
-    "69156314800d7895b14c57a2ce68facc957e2931": "Outreach",
-    "d0e63c557c0cac5c10740433105452db3ea63742": "Food Bank",
-    "8fbc094504b550f46e981d1e66c7e20892a471db": "Toilets/Restrooms",
-    "605557cae5faaec653dc9d442c94e7a1040f483a": "Access rights",
-    "5a973bf3053311cf653fe6de0f9dd71eacdfc78a": "Usage Position",
-    "1ce9d5855079dcbfcb2f154df4ba3821530a6511": "Diaper",
-    "bf7e977aafbfd1555892e3567ede2156bf77e701": "Female",
-    "ea3f770d14f9289d34c6f3d958432480b314e1d6": "Male",
-    "2ae2cd3f1138a5423673121e6239021942d08f95": "Unisex",
-    "6364aea801c8117efebfcb1a142c8b976ff23c7c": "Drinking Water",
-    "ae3448e3e9c82da15fdd2f93e99cca5159db3ebc": "Shower",
-    "5e9ba2afdeaee6d1117f52785e8549cdc6e1cf3c": "Post Box",
-    "94e08daf21e226c46b8afbb3f158dffa8c58c774": "Collection times",
-    "5233f579c394551f9fee5cad0764cad3efd7e7f4": "Drive through",
-    "3e9f5d5ff853ac80469521015922529982849994": "Telephone",
-    "2669dcdd9655a0a927a5b491b487e493812f226d": "Coins",
-    "b887f8dc356f1db75bc586d5a829a002fea07dbf": "Notes",
-    "22113ccaca7a1974512af3e8b7a9b2ea51ae3013": "Telephone cards",
-    "7efce123b38ea741f4bf3e3b99b4b8bf2a9d0ac0": "Internet Cafe",
-    "af2ae5c3b81eb0fc9998cf07a2859f9993b44c79": "Clock",
-    "0155f9f63b49ea0058418b4b8be3f85d0faef70c": "Display",
-    "6ac469c2a00424a031a8730041118ec6b8958b28": "Faces",
-    "8fc5529b71605379545ccc84129defb5eaf08006": "Visibility/readability",
-    "8727935e3bde1a762c0cb60466ee15e19c4c5c40": "house (up to 5m),street (up to 20m),area (more than 20m)",
-    "6f7a6f39cc8383eee690d501f182fe6fc8b357c7": "Shows current date",
-    "c85bcb29e6a17bb2fcbe071962f4c43d87ff7c3b": "Shows temperature",
-    "51bfc9ae7ff8052fcbc6a94a596a8c5868821caa": "Shows barometric pressure",
-    "aecbe1fd89b3bf202662bede19dbaf776c81c137": "Shows humidity",
-    "f2dc0590b8a04319e9d292ec2f71a6ee93a3c66f": "Photo booth",
-    "1c0133f440184ef1381da358fdf6f85f880ae07f": "Recycling Container",
-    "b3fe1ab6a17a0a2a7deb9900903482cb9a10d1a3": "Batteries",
-    "beb3f931ccacd019e0627cb014a4f60f862cdc3c": "Cans",
-    "53e5f13eb382023bb03d97c5feff444c7a58d4ca": "Cardboard",
-    "140445b480588e2e2d866d9deadb879b8b7899a3": "Electrical Appliances",
-    "4d1e2634b0507518287d9bf3fd2f06d4c1f6cc4e": "Glass",
-    "6c94aab188d041be2b8751b0b2430ae8074425ed": "Glass Bottles",
-    "8b7457bfa02da16c160f57245a83cdc7404e819f": "Green Waste",
-    "6508f0fcd15490b49958853b5419d48b4b43d07b": "Paper",
-    "0f8663514f63f77c388e25c02f285c1905702a10": "Plastic",
-    "b65e1509c4ae4f6c712fd375de9b8f80423f747b": "Plastic Bottles",
-    "757c20c9665e1e4880682f8f95c555aa97986bf3": "Plastic Packaging",
-    "ce0aa75c829a6ac821fba50741d217ea3c7e076c": "Scrap Metal",
-    "2a4f5aabf9c8b3da323d495efc09051a094a0a37": "Shoes",
-    "8bd8d3641e085b63555ff6c25ca72ab74f2f8c0d": "Small Appliances",
-    "638232e39a47059ae9d5fd04cdd7ba5e55315c02": "Waste",
-    "c2a37da5a39f602697d6b7620a9a9346624d9b83": "Waste Disposal/Dumpster",
-    "99a2c86318f9aa75a76b2ca5c010654767bbbe91": "Sanitary Dump Station",
-    "530934114d240f65175c463e25f0bde541e46592": "Suction pumpout",
-    "06c616e194077d31d9b6225d9542a7ade1ab92f3": "Gravity drain for hose",
-    "773e7c0b8c85f8c7e6a99066630a0e6c29730f05": "Casette or Elsan Disposal",
-    "91ec07e1bfddc0d899a3864ab25931e923272ad2": "Operation times",
-    "77100e10cebe13141acbb848e05bc15d797fba32": "Backrest",
-    "b1c2f19c06899f533a3b6dc0321196436633e2ed": "Amount of Seats",
-    "3a4f4fd6824765e92125d45ddc2f3635c7052c21": "Type of shelter",
-    "a861de731d17d33ba4bfddc2f88efba31fe99ce4": "Water Point",
-    "292fa3e4f59f8561f2f78425e1f06e48db987acf": "Animal watering place",
-    "72164237eaafe6eb38ef60a1a0dad65d94356484": "Compressed Air",
-    "c467cad9f8bc24de93084cacd56350c53e2021cc": "Valves",
-    "fbf2b002291bc9503dacc8822d3d0dafeb319dc9": "Dunlop (Woods);Schrader;Sclaverand (Presta);Regina",
-    "2d58baee0eced70545e94a9c9ac9eb8976972ed0": "Advertising Column",
-    "982103b53016cc795f7896e17d96101f7cf52bcc": "Billboard",
-    "28f2d79b3e76d0fba8de5bcb7ef20f672b807294": "Sports",
-    "1b326d905db391f205f575a1840394e99c87637f": "Stadium",
-    "dbdec847d466a0ee5b38360be7c2898df8451570": "Sports Centre",
-    "74dfa355513a4f195082196b84dc54b9b2c87869": "Fitness Centre",
-    "02257084caaca65e71c456be4abe19d92b9a6c16": "Pitch",
-    "8c03d66e77f8d65298454c1f11059b2004ec35b5": "Golf Course",
-    "ac37022a948deb0c4aca88ff5d6dc087f7b1e070": "Man Made",
-    "cc58514f1c30d8f4f353f0b1d10e42ff47f7b970": "Historic Places",
-    "0c109e0a18155c4ff986b71f120479220eda5785": "Castle",
-    "97795a734fa006834e278ab6e4fd62f52193a22c": "Ruins",
-    "f368843c94d74155ddef4f05725e2bcc25bde341": "Grave",
-    "bc699df69689273fb357ec7f10c9e1aa10c13187": "Tomb",
-    "a9bf6bad315d9ccf9d2b00f387d6e9b181c54d77": "Monument",
-    "88ab8137bcd163305abe125f3543eef9c26fb3c4": "Memorial",
-    "e78aa4bdbf211ddd99a006c9e023e8ab943b8089": "Inscription",
-    "9746294a2c204ff40d2a9a58702762539a530ba5": "Wayside Cross",
-    "2dd130e42ac946bcef9f7a41b1e1a86bcb424f27": "Wayside Shrine",
-    "e3ac332b47a54dbc7e5d9e9597e2a137ff4bed1e": "Place of worship",
-    "9361f42ce14c9686ab78710a87e5c274f295afb1": "Boundary Stone",
-    "c0a89e0df25232c9ae1b46e2a09e98c9ebf4ea69": "Tower",
-    "0a667c89b92c3f9f5697dba72a36b5d24a80be58": "Tower type",
-    "a729bc7b8e73bae8abc9e9e35145d2ffcdd74c5b": "Flagpole",
-    "2a5c9261abdd5b7530c1fcd7347cf9ab44c7e888": "Cross",
-    "e65382fdd2e499489b89667bde4d514454fc83c9": "Crane",
-    "9ccc1c0118b017850eb2d9207367b4014bbb4f72": "Fountain",
-    "243673fb18b4637e5d2f398761e1acb5e9a0574a": "Water Well",
-    "4ab137c31ca57f1b156ff44a61e1df5d0953cfde": "Pump",
-    "0b1a57305ff71c89c551b4b68ef561c1c0c0f124": "Street Lamp",
-    "7fb3e6fa9b15f8a7ecc275c313b341d89278e4cc": "Survey Point",
-    "c52e4e25ae51f4919cf017e41a79f5acaace0655": "Surveillance Camera",
-    "7b9b48e3878d4f420fc3dd476c36d70cdf35b0b8": "Zone",
-    "6574d5951216c0fb888afeb278b02a0a2fe20cc8": "Mounted on",
-    "1029bd4b7b1b30de60f2b96f4fe25e3912dd635a": "Direction in degrees",
-    "c8395db7ea7a38de472172036f218f170766b40a": "Inclination in degrees",
-    "df2bbd50cb88352bf43829364a62da34ea033ab5": "Camera",
-    "8af639564d9b45a5bc7e25f089ee352fd5704cc2": "Shops",
-    "6e925438383d3b88e00bcc7252e85a05898dfc3b": "Food",
-    "e57ea4f49abfe710d2230f611899ffebdc69acce": "Supermarket",
-    "ab4bcb1919f949cd5d16475405d121f6e1dd7b85": "Convenience Store",
-    "dc0e291bfdaad7163d9ded008008e31522d507c9": "Kiosk",
-    "cb8f461a7159ea01f90a4b11d5173c4e5eccd576": "Bakery",
-    "054c0bec7f2275234784beecebeb95507c02c5db": "Butcher",
-    "fd5c4c67ea3b7cfaea88ab279a55ff7373bf8f01": "Seafood",
-    "bcdc42dc1fd4bac493ac7c017d9296f6e49e2c6f": "Dairy",
-    "ef5442c6ee3cfabe55832b1667797040fb66f237": "Cheese",
-    "78f21be65ca690c6f2d6ca9381cf692d4cf5afc7": "Deli (Fine Food)",
-    "218e8f306f92d5e0051cc9bfb0d8cccfc482dfbf": "Pastry",
-    "bdbbf0c7ee150eb10e82b51a316872b00c6f3a37": "Confectionery",
-    "d2b51c214901280ad8fbf82fa05902a17a208e12": "Tea",
-    "febbbf4e992859115011da47ed3ba611d5e243fd": "Coffee",
-    "009051c50834ca9d88046afcdf9f3117e7786515": "Public Market",
-    "9697102277498e5c7af2b65fe851bcd9fc748f75": "Organic",
-    "64484d268a47c8ed2226c6995a2d4d8bc0f27fe7": "Greengrocer",
-    "10628667c3a499a9b03815f074c091abf9ac069e": "Farm Stand",
-    "95e025a64a632a847252f04bc378a45dff7b965e": "Organic/Bio",
-    "d74db986cefacee3964f906860ab68a66016bff6": "Fair Trade",
-    "f5a2cc2c324ca43cf30d3114b5ddd61501f95279": "Alcohol",
-    "a25d15b94056fb0cc6a25d9c34e67569cc61b34d": "Beverages",
-    "93ab2690fa30e5ab5d12d7efc0a2b43e3df817f7": "Wine",
-    "1ec961e20a254b24572ee76d5d67b82e573bf1c6": "Boutique",
-    "da8e1d26455640fe9d11ee11ac8dc0dca2aa063c": "Offers repairs",
-    "429ede1ff15f522f088095519c15f0060b02820f": "Outdoor",
-    "acc49d8c0d4686ead5a980b57061b184bacef24d": "Dry Cleaning",
-    "a86a87455494da336e7f739c05d834d6c84f22fe": "Laundry",
-    "03fb78c5351f9e491c39790b3406a63de3396a28": "Laundry Service",
-    "c0d00277d95621650e474e9172bdd2106c1853d4": "Tailor",
-    "a289af1d2d11f931ff1b9b3714c42226782e9ed3": "Fabric",
-    "d3b0d4c72ab68c6f918f01eada3de99e04751b46": "Electronic",
-    "483aa33013b8a04f7315364e37b8b36a28df5d73": "Computer",
-    "dd142f410bf85ff9be99f18967c9dc1d502c48de": "Electronics",
-    "cbff2ca42f72362f87c5dcbcbe63b5175cd4d46a": "Mobile Phone",
-    "15681794d6d3a04454367d24af5d95dbfad0c2ef": "Vacuum Cleaner",
-    "d8c55cb03234a8217199a447d0f3cf85dc03ee50": "Hifi",
-    "8973097a480fdf160611b7f84c0ad3c9c992d52b": "Video",
-    "180896f967c4642032c9a781f856c9edf65728a0": "Video Games",
-    "8f9e23442f63e719ed45bbcadfa43d010b1a2f55": "Music",
-    "8525f3a5e5016c581102fdd9aae15df93b2a59ea": "Cash",
-    "0b782ff5730a47353236b3a3c80bab201e638065": "Bank",
-    "cba748c1fcbeea9a92fd0809a7616472116d1604": "Automated Teller Machine",
-    "17d282ce78683183e96c87351f2379e0d7975d37": "Money Exchange",
-    "b58274088ef235f51b64aaeda072a4be927ded7e": "Pawnbroker",
-    "6043e5934c45010f38d52bb953aa1bf8d3860d54": "Home decoration",
-    "72af5d97af36c3c3584fb7050cf4300975cd1261": "Furniture",
-    "048da5cb3e281ad572d08ed47148cc72a5ca057f": "Kitchen",
-    "97f8af9e97bd4629bef3406b0fbf07a03998147e": "Houseware",
-    "8f4369c6a8a2cf11fb6d4077833dc28d07d85b2c": "Curtain",
-    "ac48382a7ad88f84edf712e3e44802fed07ba20a": "Art",
-    "ffc5eca14433a4d22ba3902c987c35aa210efc37": "Frame",
-    "c7260b09039a4ade7e0f08beef9a31a0ed19b792": "Bed",
-    "78db6a7d5dc65dfd604b8532b78be7fe13414170": "Carpet",
-    "cd76e8de45b41afb595ea7462fe9c7e5fd5cd925": "Interior Decoration",
-    "132652e26f8daf4192ca9aac9ec6c16b1f583974": "Antiques",
-    "29c02a327df880a9b230752da552a2d811807445": "Printed Material",
-    "0da6a8c83c3527a29525d420d3813482e72b71ab": "Stationery",
-    "eec434e1aa251a8d4af64483f4130003c47c1724": "Copy Shop",
-    "0e20a03355cbe32fa4a2609ee85fa5d122343cd3": "Book Store",
-    "85b55a2aaa3bef9961b239ff7807ed6fd94f324e": "Newspaper Stand",
-    "ab8078399dccf2dcfeedc93366b4ccf60cef1297": "Ticket",
-    "819157d6ead9041ee2f0a0028afbad20c0e96f2e": "For the body",
-    "b1f3f32a6e098fc4aa3b26df85ca731b1ce81a97": "Chemist",
-    "c31e153e406a4d04a1e74f6cb14cc42c982ff12d": "Cosmetics",
-    "bcf5a383877e1e890a7ef1f47e5f1e4fc04f8373": "Perfumery",
-    "949db9ab1b83ffd7e8915c3b5cb802c309181f3d": "Beauty",
-    "ab262b8678a7e356ff401c1869481de8e902b387": "Tobacco",
-    "237a4c2ccb391e955136381db7c94d6c1b9877c0": "Hairdresser/Barber",
-    "4d4a3bb45a16cd8e6f906890721ef3a9e41eea3f": "Massage",
-    "fe638564bb92db19e322c49e373307d5d7ee9a41": "Tattoo",
-    "f80273cb377860904944430497699e4962deb16c": "Optician",
-    "52e02734694d342fbf83be51bdfc352d3c837bad": "Hearing Aids",
-    "0e389340a515ee89d4fa095d020a5278e68e07f8": "Medical Supply",
-    "eb3b3e50c1aa02ba7fc85493e64110cc766b9a06": "Jewellery",
-    "670e6cf7fc4651217137fb44daa9c44b0afd00a7": "Erotic",
-    "8bae32c66a8bbefdd74622b31ca7fab74d09cfc3": "Department Store",
-    "1ccbca59579c34174f82b4cecd9d862ba61e1920": "Mall",
-    "bdf1bbc9ea6720ec00cd8cedf88615317bd5e9d3": "Florist",
-    "2b8686e8aa2275778525f42466d9a110b7fe3640": "Garden Centre",
-    "ac47d8ad77b4828e3827315bea4eea23ad9a028d": "Do-It-Yourself Store",
-    "3c794a28da0a341ca7ec72fa7de3e4ee8e93095a": "Hardware",
-    "52c444722cdb05e3e6841fd300b4dc8b14de0cfe": "Paint",
-    "85bccdc203b71e7a465121b728af0e9e1e6fad8a": "Gas",
-    "5da9eefe3f5528bad553af9274e8d3cf3550bbc5": "Travel Agency",
-    "85f8fef7dea3221502b82279ddaef1b807bc8338": "Musical Instrument",
-    "a709f0f93e89d06b53b0d506cf64b7dd91c17d88": "Toys",
-    "9191b48f77ff162691aee4b05d50471c012ac2f5": "Gift/Souvenir",
-    "932ab0533f595ef44857e8cd918faaed7d79b084": "Variety Store",
-    "8c54ce4d14dbf62b0770f100ab3e14201276fab0": "Charity",
-    "3087046de3f8946a65ba8540d8eda9e16b80abb0": "Bookmaker",
-    "498f8325b5b12e858cfe03328ed9b1317a9f41d6": "Lottery",
-    "ae50cf94450852176731ff8c00a0ec724653dd75": "Bag",
-    "dedbe37ec5281a8d0d43e79aa6b426e45dba44b0": "Pet",
-    "d6e28b14ff9cd7bb3935f763c8056faf3d6f79a9": "Photo",
-    "0196716d697307f5356f0659c3ada161fc754f46": "Funeral Directors",
-    "622abe17ab6249f3832a59aab739b09f47e5f3c1": "Vending Machine",
-    "f374658108a3b28af9223791bd4e47e97485c2ec": "Vending products",
-    "c801f384393e5196e59492066420a598984a5458": "Offices",
-    "1f55300512d2c2e7d1e7dd727f42b9e8a64bf19b": "Accountant",
-    "cee5fbceeb1aa4cc1db31ea954ba506365297e83": "Administrative",
-    "e27a872e3158f0a5306a9c4b23c47acd2adfea28": "Advertising agency",
-    "ea5138e2cce97211b31499f810f2f373ee3d8085": "Architect",
-    "7a83e28dee200ffd90175c2bec397e9bb8ab3f73": "Association",
-    "0fd73359ec7b3c3209cc0bc0d70cb04b210edbbd": "Private company",
-    "a966399c76a93058f68312df3eac520dd1c382db": "Educational institution",
-    "4a92f9cd8420f021c6442d95821987468dc00044": "Employment agency",
-    "80647fcec97a29da9fec13e4f9faa0e70dc35976": "Estate agent",
-    "7631c2d2155a3bd7bf35333a587c21742c7d8be3": "Foundation",
-    "bb9a6e8b13591a5d37e7929fa2b79357c59908b6": "Government",
-    "9eb67e597b6098a8b2cf5b89b4d2faa38af5160a": "Insurance",
-    "51122d533e861790e57f6ff6aacfd4e20ea929fc": "It specialist",
-    "5239b13d146d70716690fbe18270d668aeeacd56": "Lawyer",
-    "b91f160d8dd516ece414f6a270ed79f100c27767": "Newspaper",
-    "1a412d542c6d935929b04d953a8471efe9e82246": "Non-governmental organisation (NGO)",
-    "f4d29dc5ad5006c1f7e80a334cba7c213a3a1b26": "Notary",
-    "36913568d51c0b52e7f818f72b809f11b7267bd5": "Political party",
-    "6664dea99ae0b975e4b3ae5c638658d206579920": "Research",
-    "9f9a33cf7a1d48ad226fddb24e458ed5e43b0ca8": "Tax advisor",
-    "de8d04696b6e036ea05ed7a2b1c86608e5e82d0c": "Telecommunication",
-    "e77de9fcc30ac4a4a3aa0b953e8b78a5944bdac0": "Craft",
-    "fcfe110143bce627f475cacdcdeb744d82d373dd": "Beekeeper",
-    "9dd516fc39e09084bad27604c108fde7ae10c50e": "Brewery",
-    "0dc3743caedf40f18ed481b6ba03cf913182441d": "Winery",
-    "727fed9b8403368032405c8c9694a538bf6748f1": "Caterer",
-    "c0a79c6cc56270c03266d2d0d080ebc48f71eb87": "Upholsterer",
-    "726efb82ed8d7f9952589a68610e95a06336ae19": "Key cutter",
-    "637755e5d5ae01f0c0b775d3b653f3b9d64a7853": "Locksmith",
-    "3d3adb04aacdf0eb1884a5830f3f247137bbd50a": "Electrician",
-    "dc1a1591cb80febc988974429d4c9a1f0a6e79ad": "Plumber",
-    "7a5728380bde3b4a2b3d38cd8c28e1a82e71ba5f": "Hvac",
-    "b6213d559653cfc7ebc91663e1bcb6f760288120": "Painter",
-    "b4f8467588fb6d1366a73d64e60dd88cb6945752": "Tiler",
-    "23567c4278770b20ed9f191725d568d014453d60": "Window construction",
-    "49eaca754d4a65756952c3e77a15a3b8f74c9ea2": "Carpenter",
-    "5c9b045b84b31a07ff18c5b030ca2e7e2c976e8a": "Roofer",
-    "c565ec5cdc28fe77430f8ed274b7c432aee6c011": "Photographer",
-    "c9833288981bb884ab4556473cc4dd1ff4291f43": "Handicraft",
-    "81325ec26b9d802250c3cacfcd5acdb30dbb8418": "Pottery",
-    "fba8ff0c5f94b7c2dc2f30cd79cca1349a822b48": "Gardener",
-    "b0f0a68b08ae44e145a4569fe4671ced9904e1c7": "Shoemaker",
-    "efda4ead56cb01574648170afcf43badea031d51": "Sawmill",
-    "d26facf1b9154b142c8c9da3a051e4f5d5d5949c": "Stonemason",
-    "65baf858b8f4d08fc3a92464bc7501a383e9394a": "Blacksmith",
-    "97b76e5c97e640edf698a1804266e5d99109e522": "Metal construction",
-    "9445b1e398045e6a6c1feca51dce60db7a936a27": "Level",
-    "7c8825825fb85efe285129f45a88f3c80d402ab5": "Wheelchair access",
-    "d78b520568d12c4a920ddecc285519636a1cbdb6": "Going up in way direction",
-    "f845387d8700c0eca71aa4c05c7d284426c6a689": "Going down in way direction",
-    "aaf6d426ff3014c40fbdbd3e9111fd714faee43b": "Private,Customers only,Permissive,No public access,Open to public",
-    "f72c64724cb7ceaa4772ee9d82989278e778d3b0": "Escalator",
-    "fd118a4d3d091ee1ae670052f892e3daaf13238f": "escalator with unspecified direction",
-    "b2494f66bf9d76158be1b04a12d95fe2baf90adc": "movement in way direction",
-    "e0def19af70ede1a1180309a7ccfad160c7ccce4": "movement opposite to way direction",
-    "f122c4f686d34c1c7254bd11e08bf3f3565a41df": "changing direction",
-    "a0f954597569628ca4176af7b4d16ce3a0b279e3": "not an escalator",
-    "536c2ecc9b69d363f91596cdd53fe1cdb31a41c7": "Building structure",
-    "f6b43bfcf459b78caca46c61eed1ff75fabda1c6": "Room",
-    "d33da3827574202fd87fe590e2dbb8d0c87194b6": "Conventional room with walls",
-    "c6788df8d5cb7d884e435bd5b31efbea494951c6": "Type of room",
-    "03375837f9441d631fa0e809d7ffcfdae70cf21a": "Area without walls",
-    "830b634cd6d4669c643dfee2b6a5c06feaa320f2": "Wall",
-    "236d210bb33874b321166b36b0037b90ea57e548": "Individual (non-passable) wall element, when not already defined by indoor=room",
-    "ea8e29bb7eece57a6cf7603b614636020a99442c": "Solid wall",
-    "de39a8dd19ab05e6bce77fdb06336e95f22dfbc6": "Door",
-    "a072cf69a730c8606c548e9f3765e9de1b3a76ec": "Building entrance",
-    "fe86fcdd9f31cf9008b592f60e74c52ddb673f52": "Main building entrance",
-    "5bccbffc8069e6763af09d8322d7b2bfc4279ff0": "Backdoor entrance for employees",
-    "7d630e33300e7f36f5cf5f5508fa2b3080adcfd4": "One-way only building exit",
-    "6fe429af5143b1c159e1e8cf2f2c6f345eb4038c": "Emergency only building exit",
-    "af8c43ef00a4d0c9d94b05bd6b24c8897c946e07": "Entrance leading to a staircase",
-    "726a7837069558d42ee36047d530b24f3ce09579": "Entrance for a private house/apartment",
-    "f3b3973cbef3e1fa0b350af14f29a88f70dd9e5c": "Unspecified type of building entrance",
-    "d2ffa49782089255c6b699fcfed104e2354af1be": "Not a building entrance",
-    "ab88e180cc4a47fdba81abb10c446e09d2d0d7db": "Automatic door",
-    "0f67bdbd37cd4e97d76fc44e1cb5681464a40e52": "Corridor",
-    "fe1426fcb5ce99ca8aa92928829b9b3a90236283": "Unwalled connecting passage",
-    "7a34227bb68a6c0bb81e4d2510d653122373f6b9": "Staircase",
-    "838ee0d9cc4765b88e1137e8b187c9f0c4c2ea7b": "Stairs",
-    "22ae8b3f64f417ae2e0d8ac0f063692318ca29a1": "Elevator",
-    "a2dd555ee212b68263ab0230110c8e7d4b5a4d6d": "Footway",
-    "bb911796e522dcc2bcbcfa9e564d0197f63e78f5": "Service road",
-    "e57055ce26b9b56d96c29743d295ac30a90bec5b": "Service way type",
-    "6b29ebc5bfe4639f798dfd3b094fb00d7894a4b5": "Level connection",
-    "78e513dc3b9d44ab4f4a3ed2b536aa72a4256d9b": "Table",
-    "0c0fe7dcab398596f5c7c950638322b748856c4d": "Length (meters)",
-    "07b6b9637911d53eda7e468d1e175aa0200738f4": "Chair",
-    "781f52ec5b1abf5196cb3a0781de8c5fd33ec8af": "Shelf"
-  }
-}

+ 0 - 665
src/config/locales/presets/fr.json

@@ -1,665 +0,0 @@
-{
-  "fr": {
-    "8cba1ac208566c60dac434d54f7844364a1cb6d6": "Surface",
-    "d388f2ab79305958e022b915f7595e88b3f1878a": "Lissage",
-    "d62a2e61f010efadd90b6833c0861768b8ecff2f": "Pont",
-    "5e1d404c35fc1d26617e5796d25ce63325ec38de": "Tunnel",
-    "6653488e47a68c98f962098d94ccfe02d238d857": "découpage",
-    "5ec95c3cae1eda810a87f935fc6e6c7b03f065be": "Talus",
-    "b492e85954c9a57734925e1051f9b9e65859ea32": "Inclinaison",
-    "c53e94489b2557fdba88689b234cb347c4699b1e": "Sens unique",
-    "325755812dd94be9f4631a2c6620f6370a9c9994": "Éclairage",
-    "bd1464606a57b5e483f318630798addc4b663d8a": "Largeur (mètres)",
-    "a93bbf623ea6890872a3591e19df565fb0006231": "Trottoir",
-    "7fc65a69aeec2b9f9e7016334c09bf26139d4bd7": "Type de route de service",
-    "33258756f753e172545b0a98b7e583e47800ecde": "Électrifié",
-    "ca50416f8d2560601b643d74f1c506b080b682d0": "Voltage (en Volts)",
-    "343033feb08a61ccd975c927a5ccd9fe9f10f86a": "Fréquence (en Hertz)",
-    "282cec95c7986a3c21706b2e7e8aa7a2512ca37c": "Voies",
-    "9c99dacb329b3899b9784da23875ced3780e39ea": "Écartement (mm)",
-    "7008c24c567d9a4bd2083103474df81ad1f53a5d": "Âge minimal",
-    "40d0e4c70053932860c43cb30201e29b43dde5a9": "Âge maximal",
-    "b45a978022a0f3b40568737412efe19caec314c7": "Nom",
-    "459bfca3bee7cf89e8d3c732548ed883c487ab9b": "Référence",
-    "62a9ba46f945aa5cda1a9ca9dc3dba6120b6831f": "Opérateur",
-    "04af3c879938f0361ef6da64c640b9d2bffc3003": "Couche",
-    "07f4daa0376b390d81b08a78453b053bffd55f04": "Heures de service",
-    "1285dda58e2520e690fa61928d34b02227b37ae1": "Horaires d'ouverture",
-    "559a6b0e9c2f8dba3110ad4cacf3b27a639e3b9e": "Fauteuils roulants",
-    "4f02f52c08e6611dcce3db0a4797825fdcf471be": "Marque",
-    "313e88ea551b37aba96d224e638252506234adb5": "Cuisine",
-    "72bd73c4f73f5dbb08527b223a0a56c4b30ca0fe": "Accès à Internet",
-    "c7a0619eb78db79c9e450d9e2f5235482aa81896": "Frais d'accès à Internet",
-    "2ba34186eff9e8255ba58c59d6994584089b0099": "Fumeur",
-    "a50aa4dfbf1f4bc16db254a295df72111c40d036": "Sport",
-    "db0151c61508a2c42c2fc5361a45c2a21d1dae98": "Payant",
-    "2a15ef203cbff75298fae6c2b168381d7e9a8085": "Numéro de référence",
-    "2e4ac3b73782fdefa3864986f741afa168757398": "Type",
-    "a6e9a2684235ab1adfee3e79aa603fe48126680d": "Accès",
-    "6c45e83b9623cd6eb5f1e02e4fd90d5da63453ce": "Limite de durée (minutes)",
-    "06ef33fc94a1d8d3a847371a3fee0f423fb62a3e": "Surveillé",
-    "4d12b1a77c26ac10b7e6211c8a40f3743db95586": "Wikipédia",
-    "a652863cde9de3d48a04ba39504973266e4bf368": "Religion",
-    "ec53f865681cfd8052c92c98c18bf82cbc5415a9": "Dénomination",
-    "816378cfc41f13c5d85c7e5eb060d042bfd78e73": "Opérateur de la branche",
-    "5a65e97153c1717e74b43c48cad94696064a1cc1": "Support",
-    "ccec131c049514b2daa422663e8adc36e82411ff": "Code IATA",
-    "314d9f810258af8844a07e91f197b5e1d60fc4de": "Code ICAO",
-    "950acab68d329a33a845b632b226a70b9a34622b": "Marque de voiture",
-    "d4666f560f10847ebccc79406b5b5c79ac6bfa68": "Marque de moto",
-    "9769b608aca265bb7dec7bb93aa9eb5b68304aed": "Barrières",
-    "17b48b5c55c0c2c09dd9054a3142fcf080a737be": "Haie",
-    "cff646dd265f590a04363e9fe01bfc1600564947": "Hauteur (mètres)",
-    "26b2a7ac433932f6bacea6cb082169302512df4c": "Grillage",
-    "c30d366040fbe6ece556eb540dd0c6ebba66155b": "Main courante",
-    "a5c589a98abae116ae3f774a709bb958fdbb8f18": "Matériau",
-    "b413dfc8633c1ea168831173d519246f1811ef37": "Couleur (nom HTML ou code hexadécimal)",
-    "eb3c9b77c28fa522c6bb08825bb04ca15e8639e5": "Garde-fou",
-    "d0ae64596a4d0a7fd9edb13451b1709d0ec89923": "Porte",
-    "a223d3f0e2327363b8630136a4c74c5aef276c67": "Barrière levante",
-    "5e94362b973ddf684a1e5f993ecf8b61f68d6ec4": "Barrière pivotante",
-    "2a581b93e76a6e9426ae3c410ade74c7ac8f499a": "Tourniquet",
-    "aa2bbe66b68a2c9633ee3979e91bb75610f3bef1": "Transport",
-    "3d078c543d3a48ecd9a023d431d8068815b58649": "Voie ferrée",
-    "a5b3b774dfd86f56935da242c5cd60cb0c4abd66": "Rail",
-    "73ba164183160c158d26437413810762b100f5b1": "Usage",
-    "26685bb17e48db05f30ab2706e756a4d509aad8d": "Rail à faible écartement",
-    "f61bb216230b165b39c80066724c950d85a9f9be": "Monorai",
-    "427628309e3a69a6a1e1d3bbfff06d7f90e10dd5": "Préservé",
-    "b9abad24efa6f5520b4439cdc56d4e2a6a4e612d": "Rail léger",
-    "c7daebc1b8902d891ad74c4189a2ec431820ae59": "Métro",
-    "433b41fb0831550fb6da6fd4d551ea7c5fb865aa": "Tramway",
-    "5019f7210478663ac4f642e1c1396cd6f6b8fbc5": "Funiculaire",
-    "94a84cbd5312626a55bcad4772af7156e47d9ebe": "Bus guidé",
-    "db44d40650fd660694c2818e32060c5146de7cf2": "Vitesse limite (km/h)",
-    "a439a9c446e6a6970c6bf26a9d73ae59b6f2d04c": "Passage piéton",
-    "4d44ee3b569c73515531badaaeecac8c0b17a906": "Type de passage",
-    "cd16f5f0b295aedbfd4749aa695e8fd5321718fe": "Barrière",
-    "8f43bfc047ab59083b52692bbc586c1f41392eac": "Traversée à cheval",
-    "9c8275cf62286d082516156cf175f0e58b433d25": "Traversée à cheval",
-    "cfe583fac332b290ea8849c78437dc0918f3509f": "Feux de signalisation",
-    "5a5527e098f8c756291485ff209a0e45083b3098": "Signaux sonores",
-    "0403a7ce11bdddcdb2dfcf601674b248e39deccb": "Butée",
-    "c340855ccac6241a874b08ff6ecfb8bd49702119": "Voiture",
-    "29a5b9d0854dd6ea33be9f9b4921dabd745316b6": "Parking",
-    "f127e5fc92739e596b6d320cdabfffc5ac9139a3": "Hauteur max. (mètres)",
-    "9ec7fb6f5a24072a6e1bc5cdec778f47b99504de": "Capacité (globale)",
-    "2b0ffc44a7bc78656a66561aa67b392cf41662dd": "Parc relais",
-    "a26945a0f6e3fc4f0c8ba4fafd8943dce34800ff": "Places pour PMR",
-    "176681d5f3d0bef67d9f03a8e27176dcaf7c656d": "Places pour femmes",
-    "ff0531683a42d9746edad527aeaa4f4ac8a62e42": "Places pour parents",
-    "e5a529a4d8c27212241b73d0499181b0f0520a83": "Voir le wiki pour d'autres valeurs de capacity:[types]=*.",
-    "3e714b01a797840927cd64d48b50f85a910089c0": "Place de parking",
-    "a92c961c86af5d35926d74af43b72c7ad794f324": "Capacité",
-    "5b77e5a66691c0e789b3897f51b18bda69a892cd": "Couvert (avec toit)",
-    "6085b4a782626ea16b0a82fb9384e0ef44db013e": "Entrée de parking",
-    "bae3ad2e142659acb6c508e0335d27dcd9303c37": "Essence",
-    "6644a23512d717fd6c829c5d7f31dbd60c402ad5": "Avec boutique",
-    "19f20f52c49e3bce26f8ac40425c1e3400330c93": "Types de carburants :",
-    "2fe0bfbc883d588bb3b491d4d8235297e41008a3": "Additifs :",
-    "198f02612dca552422d3bdf5a6b23ddf9eafff5d": "Cartes carburants :",
-    "3a2d3c359edb3c36b17f3ac52a563d8051cd18ec": "Diesel",
-    "7b46cc993648ee06971347e15dc875dfa1d41a89": "Bio-diesel",
-    "71a2aa4761708ecb3164b05be277b393cff73cf4": "Diesel",
-    "01af22c942d6ea4f1bef39916a304e01b5463422": "Diesel pour poids-lourds",
-    "d23c7271106de577b47dc547dad4780d92bab520": "Octane 80",
-    "1dab2ae489c274c27d1a5aafa20d9eafbb5e4ff8": "Octane 87",
-    "f7969b70b141398cebf925d89ae05028e8f476e3": "Octane 91",
-    "ac618d35afd82297cdb46183d3e55d1438b522a0": "Octane 92",
-    "1ae288a8d953b4701808eac6cb0bc2aab0611e5e": "Octane 95",
-    "19d3a740f5f428b9f99eda2c924642df3b775dd9": "Octane 98",
-    "bc9c615cd6fb345b7bb30de54a9a5521707a9dba": "Octane 100",
-    "62ef5373f985decf7d3f58fa24b13c2c45fe0711": "E10 (10% d'éthanol)",
-    "befd411268feb7ab0a613fbee47438398713579b": "E85 (85% d'éthanol)",
-    "6a3165942abd1537c60aed6d07f73b5551e897ac": "Éthanol (alcool)",
-    "62a66aa3c1ed9099127f53efafdfdd49535c5bb6": "1/25 mix (mofa/moped)",
-    "e9e04964f2470c3fa01b8769da2a3ca8cbcba864": "1/50 mix (mofa/moped)",
-    "4783236ee22ea0ac78cdd13febc763bd23610dc5": "GPL (gaz de pétrole liquéfié)",
-    "63a07d98bedf51831049e2dcd94830dbedf7d97f": "GNC (gaz naturel comprimé)",
-    "385a797f63466e352339046e5b588e32ad83601e": "Biogaz",
-    "c98fa32540ce31e31b8816473a42c2f9ac2775ed": "DKV",
-    "7bb8c4aca85abf2791f9d6cfdf64191c988d9bd0": "Routex",
-    "c4cba6139c22ac7de2e215280fd4dbc1c5247848": "UTA",
-    "536ea35870b8a23e9e0703e3b166e68e891055fd": "Diesel Exhaust Fluid (AdBlue/AUS32)",
-    "f76afe037d948f142a4428fe61e616cf3f193532": "Station de recharge",
-    "6417685705ccc35beb67189aad9f02895f196c90": "Voltage",
-    "bfebe98b407a9ef682f1c90caae68e97d3505161": "Ampérage",
-    "0ccd7ec0217a198bcbc8292b8812286aa9f3d040": "SAE J1772 (IEC Type 1)",
-    "e37535d2bdd4c3deddb07559d1892b8b08aa49f5": "SAE J1772 Combo (DC)",
-    "da677d9150f70ef9bbe4c81405de03b5e33a6026": "IEC Type 2 (Mennekes)",
-    "43a2f9def5db66d60235c8b29b00ac5b654a02ed": "IEC Type 2 Combo (DC)",
-    "7aa616c074c101546258e018c0e93cfca8b0743c": "Type 3 (SCAME)",
-    "54933cea935aecb602a320140e4caab6aea04696": "CHAdeMO",
-    "efb289af80a5f9520431e36be9651685bcf7c095": "Superchargeur Tesla",
-    "655b564161a921ee9cbc1a9eff131233a37dc081": "Schuko",
-    "5ea4abdd0cab689195cd71c77950e7d2b15416e7": "CEE blue",
-    "cc24b13bd0232214917aed865e121576c1eb9d9b": "CEE red 16A",
-    "8e332cb5cc12e1f8841dc3b6c19c413c450c928c": "CEE red 32A",
-    "2f138cea8758550b8e7b8f1178743ad1f70c5389": "NEMA 5-15",
-    "0a8065d49d45eb5884cc060f5c5cb980c4525c1a": "NEMA 5-20",
-    "5b1daff47792f2a69d8c3a3a2124c7b8f75a7c3c": "Carte de membre",
-    "d6707b8c758cb65c95e04efce8fed50d331779a5": "Types de véhicules pouvant être chargés :",
-    "c70f01b3f3c1eeee52dd7acc2d8ec19888c232bf": "Nombre de prises :",
-    "54cfd9e3f60ade5faa6d6caa31b7d9633bb8d27e": "Authentification :",
-    "da051e4f0edd6f44a2335e5f99be77cc573a4239": "Vélo",
-    "869d4ed2769005e01de8917101f55fcdd106be39": "Scooter",
-    "b31635293774abe28d4181c7132e4c77b32768c8": "Camion",
-    "49d9674dae8a29e5fc698763eb3374d7f3372118": "Aucun",
-    "b1dca6ce2054e54417b715c6ebf8b7e41eca5765": "Appel téléphonique",
-    "637f3c9fe1d8edb9477571b294bc87bd598e5988": "Message court",
-    "9076da279e7ec1cbca8404732bdf03bacbd1e1e7": "NFC",
-    "96edfa7a8a71aab3742015675d7a4bd407b1139d": "Lavage",
-    "4c2c653a66a7a2b8f50712e082ab2d153acac207": "Self-service",
-    "08fa44b9ac2c4f6c4c6a9ee1daa83ceec3615b51": "Vendeur de voitures",
-    "66b0e4416eed45fe4c0ca25fb3ce43d16df356fc": "Occasion",
-    "243cc98ce98838b21946b9644b698e6ce551385f": "Réparation",
-    "6c9a4f1432e468bec7c322c634411287de3aa387": "Service",
-    "f56669f4cfc5457be5196a48efbbe31bca54da0e": "Pièces détachées",
-    "50b159d6544828a120bd5d62e7c21bfa35054fce": "Pneus",
-    "77a8bfdda81ba80231cd7f392eaaf146e73d1fe6": "Location",
-    "7522c95fab7a7f0d73c2ad51273ec027271cf102": "Partage",
-    "e07600390f68df7435fd9f127fd4f06600129d40": "Site web",
-    "5619650f27cdde129ab662a0eb99c95975fc9594": "Moto",
-    "0d3f32e71b6a2f69f63fe5e5460a5f6c6562f217": "Vendeur de motos",
-    "c7f7152769491bc8ef67a4ada12d8d49abe50894": "Services :",
-    "49df8c0e1b1d8403df9c89717b43c2906e2a48d2": "Vente",
-    "17a6cad5f87b32f3d7ddb0bb7129c3c3b8c74441": "Contrôle technique",
-    "bd36f99ababc5f8d5bf932fe78c1e3a43909f979": "Vêtements",
-    "15a9f10bf7b59de7bcacb3daa3e928e210cc2044": "Autre",
-    "93dd379628f0eb9811685b5c04df26c1d88c8da3": "Couvert",
-    "a2563eece3ed529dfecf375b02a9377b926e7c2e": "Vendeur de vélos",
-    "7846e37c2a241f7b57638bfa0feb3a9f0cf3aa7a": "Des vélos y sont vendus",
-    "5ca2bb12894b00c8a4839369ffe98a34cab7caa6": "Des vélos d'occasion y sont vendus",
-    "dc595226caa17e96d6fa8933615dd27f60894651": "Les vélos sont réparés",
-    "8f28d8988bda94dd14776fb0f0abacbad0afe5d1": "Les vélos peuvent être loués",
-    "22172272a22882cf41b320210ebb0e3618e28095": "Pompe à vélo gratuite",
-    "bc8d405fe4af35a8ccbab7070cb8c3fcd67a8b94": "Outils pour réparer soi-même (peut être une coopérative vélo)",
-    "5c917726ef3e13f45c0c5f92594e519829cc4ae2": "Les vélos sont nettoyés (payant)",
-    "4c9c398356af4056e43b1b8cc406ef92ab4505d4": "Station de réparation vélo publique",
-    "f3c821f7735bcefee7764cb97b4bc5dd572d820a": "Outil pour chaîne",
-    "0f3333eec45b91127396c7d3d96e146657b6c06f": "Transport public",
-    "bae9fe67109eb33919321963cd2e4ac2e1d242d8": "Point d'arrêt",
-    "650e04f7353a4f4d73cffa66e85a70ade81e9dc9": "Référence UIC",
-    "5f05c89dbed178dbedb1f6b863e0ff2c301d54d5": "Nom UIC",
-    "eedeffc76b1f5869cc82cacdfe266ccc376f7e05": "Réseau",
-    "0c618cb7f85429eb1776e1ed1ae3f18c5b6a48ee": "Bande podotactile",
-    "7dd9baa5f12b2b1ba7bb7a3e3d54f5f96effd9b0": "Bus",
-    "d9032c0b32e1c0c095f14209befc068253523391": "Arrêt de bus (ancien modèle)",
-    "ccef3807318579fd226a30b1faf4834677bfdacb": "Arrêt de tramway (ancien modèle)",
-    "a5cdb6d810a275eb7771294734b3835ef83c3a13": "Train",
-    "1d68cd9b4c13a64ae775bf8b57934f1a5f07e21e": "Halte ferroviaire (ancien modèle)",
-    "3cc78f46480af3f3a3a3b90555362dd88a59d34e": "Trolleybus",
-    "bbb158b34222cad8320ee1d9362d76173cc47239": "Taxi partagé",
-    "73058cc47f59f8ad0554c90c79f7d1820d3f33f0": "Voie aérienne",
-    "b93c94013e88f8666cfc1d37180458453def3dbf": "Ferry",
-    "66501ca5bddb0f3869d5bd6d6cfe5011443a5b49": "Plateforme",
-    "a0619677da4f50e6445a3cb9e97d8b6261c19d99": "Banc",
-    "b3f0115d621f5e869219fe6e9ff5c68270822b71": "Abri",
-    "b286bb123111ab536048ad3e4be2f41d0133c3e1": "Poubelle",
-    "162bd58a61cc29d1b4cc0aa01bea9b63cfdaae9b": "Station",
-    "ba6b9a41577507380e2efb273bba4a4e6f48319f": "Zone",
-    "086e10a0e26827a42c333b5ceb500660a111c25c": "Bâtiment",
-    "e8c8fe9e24803f4b9eff2f9d414ef55ee17f8de1": "Entrée de métro",
-    "fa412a10c689a57b63f2ac78ada67f181d43410f": "Distributeur de tickets",
-    "78e6c061697068262837f96f70a512fc7a37d268": "Aéroport",
-    "6f45e5552eee36a75b63492f21c1f0a0bcf3c101": "Terrain d'aéroport",
-    "2c74a1dce3b722d8c7b76bcaf349262994ca0e00": "Piste",
-    "8029a5aee1bde5765bd39ea3d8cafa9abec68d2d": "Voie de circulation",
-    "b2c2b02cf155c512632745ababedd8e2a7de0a60": "Hélipad",
-    "f4cd98d041e30bedd8217356de5976b26614fe8b": "Aire de stationnement",
-    "20242751512b7d8dded3546a7891953afd91c2d2": "Stationnement pour avion",
-    "23323e67740f3b80fddeb5488eabd9f0aae911ff": "Terminal",
-    "ef00d6ce7e8590661a465cd9fa3125e03a0d0b16": "Taxi",
-    "e6265e1a1289b82ac8a3e01c212bd873823f98e9": "Équipements",
-    "f794e3e2f1a3cd51a2712d2df83321a8063e83fb": "Hébergement",
-    "9938a3ce668ca4a032b8382dd57e7e1b28bccc66": "Hôtel",
-    "5817798470c555f35ebeb8dcc327457f5e2e5d44": "Étoiles",
-    "ddd88c645aa072cda3532180b4ca14e87c9aa666": "Chambres",
-    "e2acded36680915ff7d604862c058b73741bfeec": "Lits",
-    "3a3a084129a41e9c8e189e7002da09a1177e2442": "Motel",
-    "4ed765c05d44d584bbe6122835e232e5ef0978dd": "Maison d'hôtes / B&B",
-    "cf2dab630a43f49cb45d9a381709a7ede8ed2461": "Appartement",
-    "370dd1ee7a31cb87427c29549ff88de9637ce963": "Nombre d'appartements",
-    "88f08ea7211f203f92e2f034699e25b602bad48a": "Châlet",
-    "106e44ec3f5fbeef8c8d7b9a656b701b87bf537a": "Auberge de jeunesse",
-    "d4eae5bfe7a4f791f14bb7044d57b74e57a97997": "Nourriture + boissons",
-    "cdcf20533032e7afaed7606310b4ad201185d827": "Restaurant",
-    "95be518be4fd7ef1c236ebbf143619c83386c04a": "Micro-brasserie",
-    "3f866fe3792089a290b3c7fd5744930cdd5e195e": "Places en terrasse",
-    "c2949a050e768b4ef999012bfec8733dfde2e5cb": "À emporter",
-    "7426c0dba164848df58cf9dd54726532d805efa1": "Livraison à domicile",
-    "a8ceca6c32d758dc1d0197e679bb938375e89d1e": "Restauration rapide",
-    "51fd168ce4431a5801ff9c6feb3e6bdbd9374630": "Aire de restauration",
-    "01763b0bf177e4652ff03d16dc1dcc50fd6250da": "Café",
-    "ea4233533dc4447c84b56c42990662bbe00041f1": "Glacier",
-    "e44d6f19b4e15b9d877b832d4b2ff397d28ee640": "Bistro",
-    "83d826955b21b473d94a674320ec484bd2f008d4": "Jardin de brasseurs",
-    "46651c409f45402a1a3bd7497b343986a2c2ae5e": "Bar",
-    "76fa7f1b22ebfade9763dc5a3e8c837080eccd69": "Tourisme",
-    "5eea09a4f024e692c6d16093808837355d0d68ca": "Attraction",
-    "d5e6fb8ddd14ee31a2a441724783b718dda8b41e": "Office de Tourisme",
-    "5dd9909fc80912f4b5b5de5ff594387dd2013043": "Un lieu où l'on peut trouver des informations touristiques à propos d'une ville ou région.",
-    "6f58a3a8c5e48afeedb29afb8d58a408026760c1": "Carte",
-    "86ed0d33e714327ecd916cd29096dfa2fe62e427": "Un panneau avec une carte",
-    "5a05f7b00959671743f991b8084ab0d5cf267a5d": "Description détaillée",
-    "fb1669a7018c0e1473c8420c207f83a1786ca6ba": "Niveau de détail",
-    "ce1a8d726cdadfba3b51d790bfc9df147633a880": "Zone visible",
-    "33a6660f28456a0b44235f52ff440fa2c160dfde": "Itinéraires montrés pour :",
-    "d3b46f68dd1595ce308e95db5a0036c6c006d931": "Randonnée pédestre",
-    "5d8ac3f662045deee7ff4b0312f23567add9e54b": "Vélo",
-    "0125aead430b1f6761649e7d5afeca96d62c5649": "VTT",
-    "e28ac2794063ceda8a9b2b2565926da61895a068": "Ski",
-    "a279cd8945df125b76a13651c5236593231cf259": "Riding",
-    "cbfcede7bba09f933638b9d43af4aea4b2bdfbd9": "D'autres modes de transport possibles",
-    "7fc1dac55d54c820d8128a158ea74659804dd520": "Panneau d'information",
-    "a2236c78372c3ecd62aedb65ed67c0fb24485292": "Un panneau avec des informations",
-    "28e7e6fffdbd8a91b26f4954aa00d55aacdf62a9": "Contenu du panneau",
-    "41f2cfefadf3eefbaf32fc72f134d75b424cd000": "Panneau directionnel",
-    "a185d625934dfe468afdadd257ea64155c73b1ec": "Un panneau pour indiquer les directions vers différentes destinations",
-    "43dc525ac32b8485fd797b732c87f50e53253877": "Élévation",
-    "508bdb6f697d05f165c2e691c30398c150243e98": "Terminal d'information",
-    "4831f09d5c5b5ba455c0b3703ecfe144efaf2017": "Accès à des informations à l'aide d'un appareil électronique",
-    "175ab25d2d030c7638ce3820c32e709ac24e00a9": "Guide audio",
-    "70c1a9293fb1dc711b68626eb467024c3c3b8fac": "Informations accessibles à l'aide de haut-parleur ou d'un téléphone",
-    "066ec1d6fbe485b383261844521d1dd29995a399": "Utilisable via un téléphone portable ?",
-    "af7822e2604b5698fb5a75b8f35d768d2651c635": "Utilisez le format international, exemple +33 123456789",
-    "46c1bc32ff96786d7d907e60ea45a44060f55f3b": "Numéro de téléphone",
-    "71a827996961d7d2a5fae24b2fc74dc7b7bb59da": "Autre point d'information",
-    "bad3ddc26b397a55bab546ea6327b5a5abb3eb50": "Loisirs",
-    "38532cd37d2ef2f2405f7fec593d3e30c6f931e1": "Cinéma",
-    "8b7ba503602407c4d006cbcb318169806339951d": "Cinéma drive",
-    "799bf0793b6b2803d69a97b487c71c0513f78e66": "3D",
-    "3ab6eed05fa2d44bd8abebe261d6d34e9492d899": "Nombre d'écrans",
-    "21d2a00664a46c67092b6035678ae2bcaf2f9c30": "Kiosque à musique",
-    "220dd4b05569e4c89cbc36b269fb48a0cc81c011": "Zoo",
-    "7df59b2a55c0d93e484e2bf22502d68001f074b6": "Enclos pour animaux",
-    "fe24587c77d94fe7e9428df21e5716170ea96ece": "Parc à chien",
-    "d673020d47e4e6721422522173df2ab181ceecdb": "Parc d'attractions",
-    "5d9068c43e1fdb1b2d8f07bc0cf8b12794301e3b": "Parc aquatique",
-    "1067f8ed2e0c68b21a8ae01f43924fdaf4ea6eeb": "Complexe touristique",
-    "1b33eaa6be195a498ea3383eb145a8ef2bb4b022": "Piscine",
-    "07c50f002352b6944c2885607bd4fe0a64fdd2eb": "À utiliser uniquement pour le bassin",
-    "808a909f025c74f6ed26c71ffc74af37f7fa02e1": "Station de fitness",
-    "2a501eea14c7328fdb7d5f475ccbad844188d3f9": "Description",
-    "f5f35662ac2b534dca9f909ef2e8e96232555cde": "Sauna",
-    "908d8f3570c1c53027ea808bfcb01d3800fde0d3": "Aire de jeux",
-    "a06b72ccdd2f70f4087876719de5071549830392": "Aire de pique-nique",
-    "4eba0c16a69c499b23d4dcf41372b5f28d779107": "Cheminée",
-    "5b104052f7b1dadf3348a22d69d59e5eb348a594": "Table de pique-nique",
-    "0c61c13303ee0352848d1db73ea3605cac1cfd36": "Grill public",
-    "1621c961f2623b7da09b7b762519fac88eb1d9c9": "Fosse à feu",
-    "8ca717c3de79d717dc559f1e1331241eb35f4a55": "Boîte de nuit",
-    "047fed2cd6e5bf5936dba34d07b7758821a09c83": "Casino",
-    "3895513a1bd146996a4f37a7ec550afe7cc95a72": "Club de strip-tease",
-    "387b7f2dd50c97ce5868b821a273bbd6687f158b": "Bordel",
-    "ee4ebe9cff4e4b2de886262673f9d2f075d633c1": "Culture",
-    "e98d42cc36d372b9abdb884cdb256f63b6ef0a1f": "Musée",
-    "7d58d7daddd61f563c2d1fa7462dfa04cda66d91": "Théâtre",
-    "376128992d204921fc1afbf30818599321ae5f4a": "Bibliothèque",
-    "606ee76def5da95ffd2889413f0b606e05c79070": "Centre artistique",
-    "d96b4d6b1a537ee52fdb4e24be3f9055bbf422d7": "Œuvres d'art",
-    "542494945768ce01e6dc6a6417fa6ff221916a51": "Sujet",
-    "8b03daba4bdec9233cbc5aef6229eff2cbb3468b": "Nom de l'artiste",
-    "30bba22332155e4413f06f9eb1dd460700552ab3": "Date de début",
-    "054e13ba92847928561d3f3cb6efb212e686da27": "Studio",
-    "ce2fa99177dec3167e057d8b2d4ac707b3409565": "Centre religieux",
-    "f7178891d9b87f13f7a3cbe6bdc7cda537354196": "Église",
-    "f42bdfdba644d125bd47aa453156da8213124b9e": "Type de bâtiment",
-    "62bc77a87a8624418fcd4a779c3851989cbe61c2": "Mosquée",
-    "5e4ce2de47e842329b94a6a647d15d19ae3e30d0": "Synagogue",
-    "28f5cb8f63ca3d7c3c350f32e90178bc50c50fd3": "Temple boudhiste",
-    "d304487d732dd1742bd113d41e488f24f462086a": "Temple hindu",
-    "fdb7be1683db04004a02d54d5a1fc64c5676ccbc": "Temple Shinto",
-    "a543030938155bfa31ec8c2ee07c46ff5e89558b": "Autre centre religieux",
-    "9c4475a5a144938bd2a846c1b4168492cda11059": "Bâtiment public",
-    "7f1754e88def3aae503e5cb517d5e1888a61b68e": "Hôtel de ville",
-    "7748088c168bc09a030c6dcdf07e9bfb9cd3dea9": "Centre communautaire",
-    "832dbc8fe7e0455fc36e29e6523da69ca55a6db0": "Embassade",
-    "98d7d371eb2d97e31e44127ef4c509f136603622": "Palais de Justice",
-    "e39787818f943b76967c1191257093dfab2accd6": "Prison",
-    "d3ca9616c94522a040aadaed6a07577103a4dfce": "Police",
-    "375038d080f8e55929a93c5cfa5010d6b336969d": "Station de Ranger",
-    "63c8e15285581173805b2a442824c42b15d53cdf": "Caserne de pompiers",
-    "8d8c3038045b9b328baf7ea49fe998313d720793": "Bureau de poste",
-    "7db652d3fa86aa83de05b73868fc27cea87176e1": "Enseignement",
-    "f5852ccd69391c018e9cbb735fd53b15c288da6a": "Maternelle",
-    "507acbea512ee0d5e430bf58f0ae0a0a2b61854d": "École",
-    "5070ef2fe01f0e776431bfc43d7cc8fb48058a4c": "Université",
-    "6b35092d5ee2f547660e976226362e1288412ddb": "Enseignement supérieur",
-    "03f24ba2f1bfdbae6d6aa9dfc11ea37961cc44b2": "Auto-école",
-    "f1cff7cb9c0f05d6ba280c5e629db5cb6ee581cc": "Catégories de permis",
-    "a6174dacced692dc6ef2f3b6a22bbf9cb24168e6": "Santé",
-    "b1b81554db90c32e06f95ca96612c3f2913f5eff": "Hôpital",
-    "0f7b057b3e917251f962ca33357601ae71df7111": "Clinique",
-    "360abeabdf00327aa566476ace1594105dc5aa97": "Cabinet de médecin",
-    "a43a71bc368df8a2c1257240a734feb0e2852e5c": "Dentiste",
-    "6d44c437ed696a13d0c8f30df058cb166e04414b": "Pharmacie",
-    "d61f9995a298f7b5485cf122e037edd052778a8a": "Délivre des médicaments avec ordonnance",
-    "9fd12d3aecddb6f936f5d702ede4567b5c3318ef": "Baby Hatch/Safe Haven",
-    "2d223d9a62e792af62a83875a944d71aeddf0b3b": "Point de rassemblement",
-    "9fc90ff8746922cbd40b2863a18dcb8825c3a171": "Numéro du point",
-    "8e218973fb97e5633c2b84a8fd94554938fb4a99": "Nom du point",
-    "a3984b73943483d85f84e3339a283840bc34b021": "Téléphone d'urgence",
-    "001f71c43bb3b106d70b231fe6ec008ceef4156a": "(utilisez le numéro tel qu'affiché sur la plaque)",
-    "ffba8ca59d1c3c6746b982e63e0ceb9a858a57ce": "Vétérinaire",
-    "b78cef21a5bfd9a9baac70f63725b9674baaf5bf": "Urgence",
-    "960e928357349002f63b92714c9fe8290f5fe2b3": "Station d'ambulances",
-    "68889c39f89c9023c0f49ea8d196aa7eca84e3ef": "Défibrillateur automatique",
-    "d8a5f46c83eb36bcddef602f2e36fb2a34c1cba6": "Localisation",
-    "5477ef1de1c4fef8d6c74a505c1c52527c665d91": "À l'intérieur d'un bâtiment ?",
-    "4705e017aaf2bcdca8f583a98b3896fee137244e": "Extincteur",
-    "54c332db5ba733792edd733bb88293c6a7a49cb6": "Intérieur",
-    "c7fd88d9fb181098306af7839a327c5bc2e6d248": "Lance incendie",
-    "93e587b937c322b66d096ce4d87c94270913a454": "Borne incendie",
-    "1caa358d335874cb22c220dcd25289cde5deb8f8": "Forme",
-    "7b7f3ffcfe3734f26790abac6b20f09d970b4954": "Diamètre (mm)",
-    "afa03ab38132f8c46a2fd44b5f70f06d4a010b14": "Pression (bar)",
-    "6ea23d2433cba518f44690a50911de6f9633a2eb": "Débit avec unité de mesure",
-    "82e87e1f4c21f1404fbafe547088e19cea0cd79c": "Diamètres de couplage (séparés par un ; )",
-    "760746e5461a6862184bf94381bce477b177191d": "Fabriquant",
-    "dc9188ebae1968b46e7866f6fea9885986153461": "Source de l'eau",
-    "ffa2b74bbf6fdbdda5d5e3b4a98840106353f988": "Position",
-    "16145c7061de549b724fe6195594ce14df346583": "Type de poteau",
-    "5c49a4bb14120892fe8f1c941f85e0d1dee750fc": "Nombre de couplages",
-    "54362c751bc9558cdb5c62238307f35e0aa73da6": "Couleur",
-    "a21ca8160f57948b6085a7befaac13c66c004234": "Couleur de la partie supérieure (bonnet)",
-    "16637693ef0daa596ce9f16bb0f9a1f576c1571f": "Couleur du capuchon",
-    "a0efc393612caf039c83e78901ee60380063b783": "Réservoir d'eau",
-    "e4a328d1c6a6f17355682436bd3ac97dfa41717e": "Volume (en litres)",
-    "4793bd7243a646f0ac71822f699bdd53e3913039": "Point de rassemblent",
-    "2d6db004ae9bb9b7a1e5153537f91c8db2f7c87f": "Téléphone d'urgence",
-    "8337904de8ba94dad03ab02546d526fa74315700": "Sirène",
-    "e7756d19c97b14a0122b721013e959d330815a91": "Portée (en mètres)",
-    "742faad81db0bb715b6baee9addad1f6b350c4d6": "But",
-    "7495891c30399c092dd83b7e04f055db787b61eb": "Centre social",
-    "f6ad773865f026211ac34b999efa4212c515feff": "Maison de repos",
-    "ef414bc347a5dfacbdf36e0705f7dcc068fd8154": "Résidence collective",
-    "a788cbb1b0b13f3b1b35394942d86a8267b2f2c6": "Pour",
-    "e86affdd9d48fd1de046824fd9eb0ba8f9e71340": "Résidence d'aide à la personne",
-    "69156314800d7895b14c57a2ce68facc957e2931": "Service d'aide sociale",
-    "d0e63c557c0cac5c10740433105452db3ea63742": "Banque alimentaire",
-    "8fbc094504b550f46e981d1e66c7e20892a471db": "Toilettes",
-    "605557cae5faaec653dc9d442c94e7a1040f483a": "Droits d'accès",
-    "5a973bf3053311cf653fe6de0f9dd71eacdfc78a": "Position d'utilisation",
-    "1ce9d5855079dcbfcb2f154df4ba3821530a6511": "Table à langer",
-    "bf7e977aafbfd1555892e3567ede2156bf77e701": "Femme",
-    "ea3f770d14f9289d34c6f3d958432480b314e1d6": "Homme",
-    "2ae2cd3f1138a5423673121e6239021942d08f95": "Unisexe",
-    "6364aea801c8117efebfcb1a142c8b976ff23c7c": "Eau potable",
-    "ae3448e3e9c82da15fdd2f93e99cca5159db3ebc": "Douche",
-    "5e9ba2afdeaee6d1117f52785e8549cdc6e1cf3c": "Boîte aux lettres",
-    "94e08daf21e226c46b8afbb3f158dffa8c58c774": "Heures de levée",
-    "5233f579c394551f9fee5cad0764cad3efd7e7f4": "Drive",
-    "3e9f5d5ff853ac80469521015922529982849994": "Téléphone",
-    "2669dcdd9655a0a927a5b491b487e493812f226d": "Pièces",
-    "b887f8dc356f1db75bc586d5a829a002fea07dbf": "Billets",
-    "22113ccaca7a1974512af3e8b7a9b2ea51ae3013": "Cartes téléphoniques",
-    "7efce123b38ea741f4bf3e3b99b4b8bf2a9d0ac0": "Cybercafé",
-    "af2ae5c3b81eb0fc9998cf07a2859f9993b44c79": "Horloge",
-    "0155f9f63b49ea0058418b4b8be3f85d0faef70c": "Affichage",
-    "6ac469c2a00424a031a8730041118ec6b8958b28": "Nombre de côtés",
-    "8fc5529b71605379545ccc84129defb5eaf08006": "Visibilité",
-    "8727935e3bde1a762c0cb60466ee15e19c4c5c40": "maison (jusque 5m),rue (jusque 20m),zone (plus de 20m)",
-    "6f7a6f39cc8383eee690d501f182fe6fc8b357c7": "Affiche la date actuelle",
-    "c85bcb29e6a17bb2fcbe071962f4c43d87ff7c3b": "Affiche la température",
-    "51bfc9ae7ff8052fcbc6a94a596a8c5868821caa": "Affiche la pression barométrique",
-    "aecbe1fd89b3bf202662bede19dbaf776c81c137": "Affiche l'humidité",
-    "f2dc0590b8a04319e9d292ec2f71a6ee93a3c66f": "Photomaton",
-    "1c0133f440184ef1381da358fdf6f85f880ae07f": "Container de recyclage",
-    "b3fe1ab6a17a0a2a7deb9900903482cb9a10d1a3": "Batteries",
-    "beb3f931ccacd019e0627cb014a4f60f862cdc3c": "Canettes",
-    "53e5f13eb382023bb03d97c5feff444c7a58d4ca": "Carton épais",
-    "140445b480588e2e2d866d9deadb879b8b7899a3": "Appareils électriques",
-    "4d1e2634b0507518287d9bf3fd2f06d4c1f6cc4e": "Verre",
-    "6c94aab188d041be2b8751b0b2430ae8074425ed": "Bouteilles en verre",
-    "8b7457bfa02da16c160f57245a83cdc7404e819f": "Déchets verts",
-    "6508f0fcd15490b49958853b5419d48b4b43d07b": "Papier",
-    "0f8663514f63f77c388e25c02f285c1905702a10": "Plastique",
-    "b65e1509c4ae4f6c712fd375de9b8f80423f747b": "Bouteilles en plastique",
-    "757c20c9665e1e4880682f8f95c555aa97986bf3": "Emballages en plastique",
-    "ce0aa75c829a6ac821fba50741d217ea3c7e076c": "Métal",
-    "2a4f5aabf9c8b3da323d495efc09051a094a0a37": "Chaussures",
-    "8bd8d3641e085b63555ff6c25ca72ab74f2f8c0d": "Petits appareils",
-    "638232e39a47059ae9d5fd04cdd7ba5e55315c02": "Déchets mélangés",
-    "c2a37da5a39f602697d6b7620a9a9346624d9b83": "Benne à ordures",
-    "99a2c86318f9aa75a76b2ca5c010654767bbbe91": "Point de vidange sanitaire",
-    "530934114d240f65175c463e25f0bde541e46592": "Pompe d'aspiration",
-    "06c616e194077d31d9b6225d9542a7ade1ab92f3": "Gravity drain for hose",
-    "773e7c0b8c85f8c7e6a99066630a0e6c29730f05": "Casette or Elsan Disposal",
-    "91ec07e1bfddc0d899a3864ab25931e923272ad2": "Heures de service",
-    "77100e10cebe13141acbb848e05bc15d797fba32": "Dossier",
-    "b1c2f19c06899f533a3b6dc0321196436633e2ed": "Nombre de places",
-    "3a4f4fd6824765e92125d45ddc2f3635c7052c21": "Type d'abri",
-    "a861de731d17d33ba4bfddc2f88efba31fe99ce4": "Point d'eau",
-    "292fa3e4f59f8561f2f78425e1f06e48db987acf": "Point d'eau pour animaux",
-    "72164237eaafe6eb38ef60a1a0dad65d94356484": "Pompe à air",
-    "c467cad9f8bc24de93084cacd56350c53e2021cc": "Valves",
-    "fbf2b002291bc9503dacc8822d3d0dafeb319dc9": "Dunlop (Woods);Schrader;Sclaverand (Presta);Regina",
-    "2d58baee0eced70545e94a9c9ac9eb8976972ed0": "Colonne publicitaire",
-    "982103b53016cc795f7896e17d96101f7cf52bcc": "Grand panneau",
-    "28f2d79b3e76d0fba8de5bcb7ef20f672b807294": "Sports",
-    "1b326d905db391f205f575a1840394e99c87637f": "Stade",
-    "dbdec847d466a0ee5b38360be7c2898df8451570": "Centre sportif",
-    "74dfa355513a4f195082196b84dc54b9b2c87869": "Centre de fitness",
-    "02257084caaca65e71c456be4abe19d92b9a6c16": "Terrain",
-    "8c03d66e77f8d65298454c1f11059b2004ec35b5": "Terrain de golf",
-    "ac37022a948deb0c4aca88ff5d6dc087f7b1e070": "Infrastructure",
-    "cc58514f1c30d8f4f353f0b1d10e42ff47f7b970": "Lieux historiques",
-    "0c109e0a18155c4ff986b71f120479220eda5785": "Château",
-    "97795a734fa006834e278ab6e4fd62f52193a22c": "Ruines",
-    "f368843c94d74155ddef4f05725e2bcc25bde341": "Pierre tombale",
-    "bc699df69689273fb357ec7f10c9e1aa10c13187": "Tombe d'intérêt historique",
-    "a9bf6bad315d9ccf9d2b00f387d6e9b181c54d77": "Monument",
-    "88ab8137bcd163305abe125f3543eef9c26fb3c4": "Mémorial",
-    "e78aa4bdbf211ddd99a006c9e023e8ab943b8089": "Inscription",
-    "9746294a2c204ff40d2a9a58702762539a530ba5": "Croix",
-    "2dd130e42ac946bcef9f7a41b1e1a86bcb424f27": "Sanctuaire",
-    "e3ac332b47a54dbc7e5d9e9597e2a137ff4bed1e": "Lieu de culte",
-    "9361f42ce14c9686ab78710a87e5c274f295afb1": "Pierre de limite",
-    "c0a89e0df25232c9ae1b46e2a09e98c9ebf4ea69": "Tour",
-    "0a667c89b92c3f9f5697dba72a36b5d24a80be58": "Type de tour",
-    "a729bc7b8e73bae8abc9e9e35145d2ffcdd74c5b": "Poteau pour drapeau",
-    "2a5c9261abdd5b7530c1fcd7347cf9ab44c7e888": "Croix",
-    "e65382fdd2e499489b89667bde4d514454fc83c9": "Grue",
-    "9ccc1c0118b017850eb2d9207367b4014bbb4f72": "Fontaine",
-    "243673fb18b4637e5d2f398761e1acb5e9a0574a": "Puit",
-    "4ab137c31ca57f1b156ff44a61e1df5d0953cfde": "Pompe",
-    "0b1a57305ff71c89c551b4b68ef561c1c0c0f124": "Lampadaire",
-    "7fb3e6fa9b15f8a7ecc275c313b341d89278e4cc": "Point de triangulation",
-    "c52e4e25ae51f4919cf017e41a79f5acaace0655": "Caméra de surveillance",
-    "7b9b48e3878d4f420fc3dd476c36d70cdf35b0b8": "Zone",
-    "6574d5951216c0fb888afeb278b02a0a2fe20cc8": "Fixé sur",
-    "1029bd4b7b1b30de60f2b96f4fe25e3912dd635a": "Orientation en degrés",
-    "c8395db7ea7a38de472172036f218f170766b40a": "Inclinaison en degrés",
-    "df2bbd50cb88352bf43829364a62da34ea033ab5": "Caméra",
-    "8af639564d9b45a5bc7e25f089ee352fd5704cc2": "Commerces",
-    "6e925438383d3b88e00bcc7252e85a05898dfc3b": "Alimentaire",
-    "e57ea4f49abfe710d2230f611899ffebdc69acce": "Supermarché",
-    "ab4bcb1919f949cd5d16475405d121f6e1dd7b85": "Épicerie",
-    "dc0e291bfdaad7163d9ded008008e31522d507c9": "Kiosque",
-    "cb8f461a7159ea01f90a4b11d5173c4e5eccd576": "Boulangerie",
-    "054c0bec7f2275234784beecebeb95507c02c5db": "Boucherie",
-    "fd5c4c67ea3b7cfaea88ab279a55ff7373bf8f01": "Poissonerie",
-    "bcdc42dc1fd4bac493ac7c017d9296f6e49e2c6f": "Laiterie",
-    "ef5442c6ee3cfabe55832b1667797040fb66f237": "Fromagerie",
-    "78f21be65ca690c6f2d6ca9381cf692d4cf5afc7": "Épicerie fine",
-    "218e8f306f92d5e0051cc9bfb0d8cccfc482dfbf": "Pâtisserie",
-    "bdbbf0c7ee150eb10e82b51a316872b00c6f3a37": "Magasin de bonbons",
-    "d2b51c214901280ad8fbf82fa05902a17a208e12": "Thé",
-    "febbbf4e992859115011da47ed3ba611d5e243fd": "Café",
-    "009051c50834ca9d88046afcdf9f3117e7786515": "Marché public",
-    "9697102277498e5c7af2b65fe851bcd9fc748f75": "Biologique",
-    "64484d268a47c8ed2226c6995a2d4d8bc0f27fe7": "Fruits et légumes",
-    "10628667c3a499a9b03815f074c091abf9ac069e": "Magasin à la ferme",
-    "95e025a64a632a847252f04bc378a45dff7b965e": "Biologique",
-    "d74db986cefacee3964f906860ab68a66016bff6": "Équitable",
-    "f5a2cc2c324ca43cf30d3114b5ddd61501f95279": "Alcool",
-    "a25d15b94056fb0cc6a25d9c34e67569cc61b34d": "Boissons",
-    "93ab2690fa30e5ab5d12d7efc0a2b43e3df817f7": "Vin",
-    "1ec961e20a254b24572ee76d5d67b82e573bf1c6": "Boutique",
-    "da8e1d26455640fe9d11ee11ac8dc0dca2aa063c": "Propose des réparations",
-    "429ede1ff15f522f088095519c15f0060b02820f": "Équipement pour l'extérieur",
-    "acc49d8c0d4686ead5a980b57061b184bacef24d": "Nettoyage à sec",
-    "a86a87455494da336e7f739c05d834d6c84f22fe": "Laverie",
-    "03fb78c5351f9e491c39790b3406a63de3396a28": "Service de laverie",
-    "c0d00277d95621650e474e9172bdd2106c1853d4": "Tailleur",
-    "a289af1d2d11f931ff1b9b3714c42226782e9ed3": "Tissus",
-    "d3b0d4c72ab68c6f918f01eada3de99e04751b46": "Appareil électronique",
-    "483aa33013b8a04f7315364e37b8b36a28df5d73": "Informatique",
-    "dd142f410bf85ff9be99f18967c9dc1d502c48de": "Appareils électroniques",
-    "cbff2ca42f72362f87c5dcbcbe63b5175cd4d46a": "Téléphonie",
-    "15681794d6d3a04454367d24af5d95dbfad0c2ef": "Aspirateur",
-    "d8c55cb03234a8217199a447d0f3cf85dc03ee50": "Hi-Fi",
-    "8973097a480fdf160611b7f84c0ad3c9c992d52b": "Vidéo-club",
-    "180896f967c4642032c9a781f856c9edf65728a0": "Jeux-vidéos",
-    "8f9e23442f63e719ed45bbcadfa43d010b1a2f55": "Musique",
-    "8525f3a5e5016c581102fdd9aae15df93b2a59ea": "Argent",
-    "0b782ff5730a47353236b3a3c80bab201e638065": "Banque",
-    "cba748c1fcbeea9a92fd0809a7616472116d1604": "Distributeur de billets",
-    "17d282ce78683183e96c87351f2379e0d7975d37": "Bureau de change",
-    "b58274088ef235f51b64aaeda072a4be927ded7e": "Prêteur sur gages",
-    "6043e5934c45010f38d52bb953aa1bf8d3860d54": "Décoration intérieure",
-    "72af5d97af36c3c3584fb7050cf4300975cd1261": "Mobilier",
-    "048da5cb3e281ad572d08ed47148cc72a5ca057f": "Cuisine",
-    "97f8af9e97bd4629bef3406b0fbf07a03998147e": "Équipement pour la maison",
-    "8f4369c6a8a2cf11fb6d4077833dc28d07d85b2c": "Rideaux",
-    "ac48382a7ad88f84edf712e3e44802fed07ba20a": "Art",
-    "ffc5eca14433a4d22ba3902c987c35aa210efc37": "Cadres",
-    "c7260b09039a4ade7e0f08beef9a31a0ed19b792": "Literie",
-    "78db6a7d5dc65dfd604b8532b78be7fe13414170": "Tapis",
-    "cd76e8de45b41afb595ea7462fe9c7e5fd5cd925": "Décoration intérieure",
-    "132652e26f8daf4192ca9aac9ec6c16b1f583974": "Antiquaire",
-    "29c02a327df880a9b230752da552a2d811807445": "Imprimerie",
-    "0da6a8c83c3527a29525d420d3813482e72b71ab": "Papeterie",
-    "eec434e1aa251a8d4af64483f4130003c47c1724": "Photocopies",
-    "0e20a03355cbe32fa4a2609ee85fa5d122343cd3": "Libraire",
-    "85b55a2aaa3bef9961b239ff7807ed6fd94f324e": "Kiosque à journaux",
-    "ab8078399dccf2dcfeedc93366b4ccf60cef1297": "Tickets",
-    "819157d6ead9041ee2f0a0028afbad20c0e96f2e": "Soin du corps",
-    "b1f3f32a6e098fc4aa3b26df85ca731b1ce81a97": "Droguerie",
-    "c31e153e406a4d04a1e74f6cb14cc42c982ff12d": "Cosmétiques",
-    "bcf5a383877e1e890a7ef1f47e5f1e4fc04f8373": "Parfumerie",
-    "949db9ab1b83ffd7e8915c3b5cb802c309181f3d": "Beauté",
-    "ab262b8678a7e356ff401c1869481de8e902b387": "Bureau de tabac",
-    "237a4c2ccb391e955136381db7c94d6c1b9877c0": "Coiffeur / barbier",
-    "4d4a3bb45a16cd8e6f906890721ef3a9e41eea3f": "Salon de massage",
-    "fe638564bb92db19e322c49e373307d5d7ee9a41": "Salon de tatouage",
-    "f80273cb377860904944430497699e4962deb16c": "Opticien",
-    "52e02734694d342fbf83be51bdfc352d3c837bad": "Appareils auditifs",
-    "0e389340a515ee89d4fa095d020a5278e68e07f8": "Matériel médical",
-    "eb3b3e50c1aa02ba7fc85493e64110cc766b9a06": "Bijouterie",
-    "670e6cf7fc4651217137fb44daa9c44b0afd00a7": "Sex-shop",
-    "8bae32c66a8bbefdd74622b31ca7fab74d09cfc3": "Grand magasin",
-    "1ccbca59579c34174f82b4cecd9d862ba61e1920": "Galerie commerciale",
-    "bdf1bbc9ea6720ec00cd8cedf88615317bd5e9d3": "Fleuriste",
-    "2b8686e8aa2275778525f42466d9a110b7fe3640": "Jardinerie",
-    "ac47d8ad77b4828e3827315bea4eea23ad9a028d": "Magasin de bricolage",
-    "3c794a28da0a341ca7ec72fa7de3e4ee8e93095a": "Matériel",
-    "52c444722cdb05e3e6841fd300b4dc8b14de0cfe": "Peinture",
-    "85bccdc203b71e7a465121b728af0e9e1e6fad8a": "Carburant",
-    "5da9eefe3f5528bad553af9274e8d3cf3550bbc5": "Agence de voyages",
-    "85f8fef7dea3221502b82279ddaef1b807bc8338": "Instrument de musique",
-    "a709f0f93e89d06b53b0d506cf64b7dd91c17d88": "Jouets",
-    "9191b48f77ff162691aee4b05d50471c012ac2f5": "Cadeaux / souvenirs",
-    "932ab0533f595ef44857e8cd918faaed7d79b084": "Magasin d'articles à petit prix",
-    "8c54ce4d14dbf62b0770f100ab3e14201276fab0": "Magasin caritatif",
-    "3087046de3f8946a65ba8540d8eda9e16b80abb0": "Preneur de paris",
-    "498f8325b5b12e858cfe03328ed9b1317a9f41d6": "Loterie",
-    "ae50cf94450852176731ff8c00a0ec724653dd75": "Maroquinerie",
-    "dedbe37ec5281a8d0d43e79aa6b426e45dba44b0": "Animalerie",
-    "d6e28b14ff9cd7bb3935f763c8056faf3d6f79a9": "Photo",
-    "0196716d697307f5356f0659c3ada161fc754f46": "Pompes funèbres",
-    "622abe17ab6249f3832a59aab739b09f47e5f3c1": "Distributeur automatique",
-    "f374658108a3b28af9223791bd4e47e97485c2ec": "Produits vendus",
-    "c801f384393e5196e59492066420a598984a5458": "Bureaux",
-    "1f55300512d2c2e7d1e7dd727f42b9e8a64bf19b": "Comptable",
-    "cee5fbceeb1aa4cc1db31ea954ba506365297e83": "Administratif",
-    "e27a872e3158f0a5306a9c4b23c47acd2adfea28": "Agence de publicité",
-    "ea5138e2cce97211b31499f810f2f373ee3d8085": "Architecte",
-    "7a83e28dee200ffd90175c2bec397e9bb8ab3f73": "Association",
-    "0fd73359ec7b3c3209cc0bc0d70cb04b210edbbd": "Société privée",
-    "a966399c76a93058f68312df3eac520dd1c382db": "Établissement d'enseignement",
-    "4a92f9cd8420f021c6442d95821987468dc00044": "Agence pour l'emploi",
-    "80647fcec97a29da9fec13e4f9faa0e70dc35976": "Agence immobilière",
-    "7631c2d2155a3bd7bf35333a587c21742c7d8be3": "Fondatio",
-    "bb9a6e8b13591a5d37e7929fa2b79357c59908b6": "Agence gouvernementale",
-    "9eb67e597b6098a8b2cf5b89b4d2faa38af5160a": "Assurances",
-    "51122d533e861790e57f6ff6aacfd4e20ea929fc": "Société d'informatique",
-    "5239b13d146d70716690fbe18270d668aeeacd56": "Juriste",
-    "b91f160d8dd516ece414f6a270ed79f100c27767": "Journal",
-    "1a412d542c6d935929b04d953a8471efe9e82246": "Organisation non-gouvernementale (ONG)",
-    "f4d29dc5ad5006c1f7e80a334cba7c213a3a1b26": "Notaire",
-    "36913568d51c0b52e7f818f72b809f11b7267bd5": "Parti politique",
-    "6664dea99ae0b975e4b3ae5c638658d206579920": "Recherche",
-    "9f9a33cf7a1d48ad226fddb24e458ed5e43b0ca8": "Conseil fiscal",
-    "de8d04696b6e036ea05ed7a2b1c86608e5e82d0c": "Télécommunications",
-    "e77de9fcc30ac4a4a3aa0b953e8b78a5944bdac0": "Artisanat",
-    "fcfe110143bce627f475cacdcdeb744d82d373dd": "Apiculteur",
-    "9dd516fc39e09084bad27604c108fde7ae10c50e": "Brasserie",
-    "0dc3743caedf40f18ed481b6ba03cf913182441d": "Vigneron",
-    "727fed9b8403368032405c8c9694a538bf6748f1": "Traiteur",
-    "c0a79c6cc56270c03266d2d0d080ebc48f71eb87": "Tapissier",
-    "726efb82ed8d7f9952589a68610e95a06336ae19": "Fabriquant de clés",
-    "637755e5d5ae01f0c0b775d3b653f3b9d64a7853": "Serrurier",
-    "3d3adb04aacdf0eb1884a5830f3f247137bbd50a": "Électricien",
-    "dc1a1591cb80febc988974429d4c9a1f0a6e79ad": "Plombier",
-    "7a5728380bde3b4a2b3d38cd8c28e1a82e71ba5f": "Climatisation",
-    "b6213d559653cfc7ebc91663e1bcb6f760288120": "Peintre",
-    "b4f8467588fb6d1366a73d64e60dd88cb6945752": "Toiturier",
-    "23567c4278770b20ed9f191725d568d014453d60": "Poseur de fenêtre",
-    "49eaca754d4a65756952c3e77a15a3b8f74c9ea2": "Charpentier",
-    "5c9b045b84b31a07ff18c5b030ca2e7e2c976e8a": "Toiturier",
-    "c565ec5cdc28fe77430f8ed274b7c432aee6c011": "Photographe",
-    "c9833288981bb884ab4556473cc4dd1ff4291f43": "Artisanat",
-    "81325ec26b9d802250c3cacfcd5acdb30dbb8418": "Potterie",
-    "fba8ff0c5f94b7c2dc2f30cd79cca1349a822b48": "Jardinier",
-    "b0f0a68b08ae44e145a4569fe4671ced9904e1c7": "Coordonnier",
-    "efda4ead56cb01574648170afcf43badea031d51": "Scierie",
-    "d26facf1b9154b142c8c9da3a051e4f5d5d5949c": "Maçon",
-    "65baf858b8f4d08fc3a92464bc7501a383e9394a": "Forgeron",
-    "97b76e5c97e640edf698a1804266e5d99109e522": "Construction métallique",
-    "9445b1e398045e6a6c1feca51dce60db7a936a27": "Niveau",
-    "7c8825825fb85efe285129f45a88f3c80d402ab5": "Accès en fauteuil roulant",
-    "d78b520568d12c4a920ddecc285519636a1cbdb6": "Monte dans le sens du tracé",
-    "f845387d8700c0eca71aa4c05c7d284426c6a689": "Descend dans le sens du tracé",
-    "aaf6d426ff3014c40fbdbd3e9111fd714faee43b": "Privé,Réservé aux clients,Permissif,Pas d'accès au public,Ouvert au public",
-    "f72c64724cb7ceaa4772ee9d82989278e778d3b0": "Escalator",
-    "fd118a4d3d091ee1ae670052f892e3daaf13238f": "Escalator dont la direction est inconnue",
-    "b2494f66bf9d76158be1b04a12d95fe2baf90adc": "Mouvement dans le sens du tracé",
-    "e0def19af70ede1a1180309a7ccfad160c7ccce4": "Mouvement dans le sens contraire du tracé",
-    "f122c4f686d34c1c7254bd11e08bf3f3565a41df": "Direction variable",
-    "a0f954597569628ca4176af7b4d16ce3a0b279e3": "N'est pas un escalator",
-    "536c2ecc9b69d363f91596cdd53fe1cdb31a41c7": "Structure du bâtiment",
-    "f6b43bfcf459b78caca46c61eed1ff75fabda1c6": "Pièce",
-    "d33da3827574202fd87fe590e2dbb8d0c87194b6": "Salle traditionnelle avec murs",
-    "c6788df8d5cb7d884e435bd5b31efbea494951c6": "Type de salle",
-    "03375837f9441d631fa0e809d7ffcfdae70cf21a": "Espace sans murs",
-    "830b634cd6d4669c643dfee2b6a5c06feaa320f2": "Mur",
-    "236d210bb33874b321166b36b0037b90ea57e548": "Mur individuel qui ne serait pas déjà défini par une pièce (indoor=room)",
-    "ea8e29bb7eece57a6cf7603b614636020a99442c": "Mur plein",
-    "de39a8dd19ab05e6bce77fdb06336e95f22dfbc6": "Porte",
-    "a072cf69a730c8606c548e9f3765e9de1b3a76ec": "Entrée de bâtiment",
-    "fe86fcdd9f31cf9008b592f60e74c52ddb673f52": "Entrée principale du bâtiment",
-    "5bccbffc8069e6763af09d8322d7b2bfc4279ff0": "Entrée de service pour les employés",
-    "7d630e33300e7f36f5cf5f5508fa2b3080adcfd4": "Porte de sortie uniquement",
-    "6fe429af5143b1c159e1e8cf2f2c6f345eb4038c": "Porte de secours",
-    "af8c43ef00a4d0c9d94b05bd6b24c8897c946e07": "Entrée menant à une cage d'escaliers",
-    "726a7837069558d42ee36047d530b24f3ce09579": "Entrée d'un logement/appartement",
-    "f3b3973cbef3e1fa0b350af14f29a88f70dd9e5c": "Type d'entrée de bâtiment non précisé",
-    "d2ffa49782089255c6b699fcfed104e2354af1be": "N'est pas une entrée de bâtiment",
-    "ab88e180cc4a47fdba81abb10c446e09d2d0d7db": "Porte automatique",
-    "0f67bdbd37cd4e97d76fc44e1cb5681464a40e52": "Corridor",
-    "fe1426fcb5ce99ca8aa92928829b9b3a90236283": "Passage sans murs",
-    "7a34227bb68a6c0bb81e4d2510d653122373f6b9": "Cage d'escaliers",
-    "838ee0d9cc4765b88e1137e8b187c9f0c4c2ea7b": "Escaliers",
-    "22ae8b3f64f417ae2e0d8ac0f063692318ca29a1": "Ascenseur",
-    "a2dd555ee212b68263ab0230110c8e7d4b5a4d6d": "Chemin piéton",
-    "bb911796e522dcc2bcbcfa9e564d0197f63e78f5": "Route de service",
-    "e57055ce26b9b56d96c29743d295ac30a90bec5b": "Type de voie de service",
-    "6b29ebc5bfe4639f798dfd3b094fb00d7894a4b5": "Connexion à l'étage",
-    "78e513dc3b9d44ab4f4a3ed2b536aa72a4256d9b": "Table",
-    "0c0fe7dcab398596f5c7c950638322b748856c4d": "Longueur (en mètres)",
-    "07b6b9637911d53eda7e468d1e175aa0200738f4": "Chaise",
-    "781f52ec5b1abf5196cb3a0781de8c5fd33ec8af": "Étagère"
-  }
-}

+ 0 - 665
src/config/locales/presets/it.json

@@ -1,665 +0,0 @@
-{
-  "it": {
-    "8cba1ac208566c60dac434d54f7844364a1cb6d6": "Superficie",
-    "d388f2ab79305958e022b915f7595e88b3f1878a": "Levigatezza",
-    "d62a2e61f010efadd90b6833c0861768b8ecff2f": "Ponte",
-    "5e1d404c35fc1d26617e5796d25ce63325ec38de": "Tunnel",
-    "6653488e47a68c98f962098d94ccfe02d238d857": "Taglio",
-    "5ec95c3cae1eda810a87f935fc6e6c7b03f065be": "Argine",
-    "b492e85954c9a57734925e1051f9b9e65859ea32": "Inclinazione",
-    "c53e94489b2557fdba88689b234cb347c4699b1e": "Senso unico",
-    "325755812dd94be9f4631a2c6620f6370a9c9994": "Illuminazione",
-    "bd1464606a57b5e483f318630798addc4b663d8a": "Larghezza (metri)",
-    "a93bbf623ea6890872a3591e19df565fb0006231": "Marciapiede",
-    "7fc65a69aeec2b9f9e7016334c09bf26139d4bd7": "Tipo di servizio",
-    "33258756f753e172545b0a98b7e583e47800ecde": "Elettrificato",
-    "ca50416f8d2560601b643d74f1c506b080b682d0": "Voltaggio in Volt (v)",
-    "343033feb08a61ccd975c927a5ccd9fe9f10f86a": "Frequenza in Hertz (Hz)",
-    "282cec95c7986a3c21706b2e7e8aa7a2512ca37c": "Tracce",
-    "9c99dacb329b3899b9784da23875ced3780e39ea": "Calibro (mm)",
-    "7008c24c567d9a4bd2083103474df81ad1f53a5d": "Età minima",
-    "40d0e4c70053932860c43cb30201e29b43dde5a9": "Età massima",
-    "b45a978022a0f3b40568737412efe19caec314c7": "Nome",
-    "459bfca3bee7cf89e8d3c732548ed883c487ab9b": "Referenza",
-    "62a9ba46f945aa5cda1a9ca9dc3dba6120b6831f": "Operatore",
-    "04af3c879938f0361ef6da64c640b9d2bffc3003": "Layer",
-    "07f4daa0376b390d81b08a78453b053bffd55f04": "Orari del servizio",
-    "1285dda58e2520e690fa61928d34b02227b37ae1": "Orario di apertura",
-    "559a6b0e9c2f8dba3110ad4cacf3b27a639e3b9e": "Sedie a rotelle",
-    "4f02f52c08e6611dcce3db0a4797825fdcf471be": "Brand",
-    "313e88ea551b37aba96d224e638252506234adb5": "Cucina",
-    "72bd73c4f73f5dbb08527b223a0a56c4b30ca0fe": "Accesso ad internet",
-    "c7a0619eb78db79c9e450d9e2f5235482aa81896": "Accesso internet a pagamento",
-    "2ba34186eff9e8255ba58c59d6994584089b0099": "Permesso fumare",
-    "a50aa4dfbf1f4bc16db254a295df72111c40d036": "Sport",
-    "db0151c61508a2c42c2fc5361a45c2a21d1dae98": "Costo",
-    "2a15ef203cbff75298fae6c2b168381d7e9a8085": "Numero di referenza",
-    "2e4ac3b73782fdefa3864986f741afa168757398": "Tipo",
-    "a6e9a2684235ab1adfee3e79aa603fe48126680d": "Accesso",
-    "6c45e83b9623cd6eb5f1e02e4fd90d5da63453ce": "Tempo massimo (iminuti)",
-    "06ef33fc94a1d8d3a847371a3fee0f423fb62a3e": "Supervisionato",
-    "4d12b1a77c26ac10b7e6211c8a40f3743db95586": "Wikipedia",
-    "a652863cde9de3d48a04ba39504973266e4bf368": "Religione",
-    "ec53f865681cfd8052c92c98c18bf82cbc5415a9": "Denominazione",
-    "816378cfc41f13c5d85c7e5eb060d042bfd78e73": "Operatore di filiale",
-    "5a65e97153c1717e74b43c48cad94696064a1cc1": "Supporto",
-    "ccec131c049514b2daa422663e8adc36e82411ff": "IATA",
-    "314d9f810258af8844a07e91f197b5e1d60fc4de": "ICAO",
-    "950acab68d329a33a845b632b226a70b9a34622b": "Marca auto",
-    "d4666f560f10847ebccc79406b5b5c79ac6bfa68": "Marca moto",
-    "9769b608aca265bb7dec7bb93aa9eb5b68304aed": "Barriere",
-    "17b48b5c55c0c2c09dd9054a3142fcf080a737be": "Siepe",
-    "cff646dd265f590a04363e9fe01bfc1600564947": "Altezza (metri)",
-    "26b2a7ac433932f6bacea6cb082169302512df4c": "Recinzione",
-    "c30d366040fbe6ece556eb540dd0c6ebba66155b": "Corrimano",
-    "a5c589a98abae116ae3f774a709bb958fdbb8f18": "Materiale",
-    "b413dfc8633c1ea168831173d519246f1811ef37": "Colore (usare il nome HTML o il codice esadecimale)",
-    "eb3c9b77c28fa522c6bb08825bb04ca15e8639e5": "Guard Rail",
-    "d0ae64596a4d0a7fd9edb13451b1709d0ec89923": "Cancello",
-    "a223d3f0e2327363b8630136a4c74c5aef276c67": "Cancello dell'ascensore",
-    "5e94362b973ddf684a1e5f993ecf8b61f68d6ec4": "Cancello battente",
-    "2a581b93e76a6e9426ae3c410ade74c7ac8f499a": "Tornello",
-    "aa2bbe66b68a2c9633ee3979e91bb75610f3bef1": "Trasporto",
-    "3d078c543d3a48ecd9a023d431d8068815b58649": "Ferrovia",
-    "a5b3b774dfd86f56935da242c5cd60cb0c4abd66": "Rotaia",
-    "73ba164183160c158d26437413810762b100f5b1": "Utilizzo",
-    "26685bb17e48db05f30ab2706e756a4d509aad8d": "Guida a scartamento ridotto",
-    "f61bb216230b165b39c80066724c950d85a9f9be": "Monorotaia",
-    "427628309e3a69a6a1e1d3bbfff06d7f90e10dd5": "Preservato",
-    "b9abad24efa6f5520b4439cdc56d4e2a6a4e612d": "Binario leggero",
-    "c7daebc1b8902d891ad74c4189a2ec431820ae59": "Metropolitana",
-    "433b41fb0831550fb6da6fd4d551ea7c5fb865aa": "Tram",
-    "5019f7210478663ac4f642e1c1396cd6f6b8fbc5": "Funiculare",
-    "94a84cbd5312626a55bcad4772af7156e47d9ebe": "Percorso autobus",
-    "db44d40650fd660694c2818e32060c5146de7cf2": "Velocità massima (km/h)",
-    "a439a9c446e6a6970c6bf26a9d73ae59b6f2d04c": "Incrocio",
-    "4d44ee3b569c73515531badaaeecac8c0b17a906": "Tipo di incrocio",
-    "cd16f5f0b295aedbfd4749aa695e8fd5321718fe": "Barriera",
-    "8f43bfc047ab59083b52692bbc586c1f41392eac": "Croce a cavallo",
-    "9c8275cf62286d082516156cf175f0e58b433d25": "Attraversabile in bicicletta",
-    "cfe583fac332b290ea8849c78437dc0918f3509f": "Semafori",
-    "5a5527e098f8c756291485ff209a0e45083b3098": "Segnali audio",
-    "0403a7ce11bdddcdb2dfcf601674b248e39deccb": "Negozio di tamponi",
-    "c340855ccac6241a874b08ff6ecfb8bd49702119": "Auto",
-    "29a5b9d0854dd6ea33be9f9b4921dabd745316b6": "Parcheggio",
-    "f127e5fc92739e596b6d320cdabfffc5ac9139a3": "Altezza massima (metri)",
-    "9ec7fb6f5a24072a6e1bc5cdec778f47b99504de": "Capacità (massima)",
-    "2b0ffc44a7bc78656a66561aa67b392cf41662dd": "Park&Ride",
-    "a26945a0f6e3fc4f0c8ba4fafd8943dce34800ff": "Spazi per disabili",
-    "176681d5f3d0bef67d9f03a8e27176dcaf7c656d": "Spazi per donne",
-    "ff0531683a42d9746edad527aeaa4f4ac8a62e42": "Spazi per genitori",
-    "e5a529a4d8c27212241b73d0499181b0f0520a83": "La la pagina wiki per altri capacity:[types]=*.",
-    "3e714b01a797840927cd64d48b50f85a910089c0": "Area parcheggio",
-    "a92c961c86af5d35926d74af43b72c7ad794f324": "Capacità",
-    "5b77e5a66691c0e789b3897f51b18bda69a892cd": "Coperto (con tetto)",
-    "6085b4a782626ea16b0a82fb9384e0ef44db013e": "Ingresso parcheggio",
-    "bae3ad2e142659acb6c508e0335d27dcd9303c37": "Carburante",
-    "6644a23512d717fd6c829c5d7f31dbd60c402ad5": "con negozio",
-    "19f20f52c49e3bce26f8ac40425c1e3400330c93": "Tipi di carburante:",
-    "2fe0bfbc883d588bb3b491d4d8235297e41008a3": "Additivi:",
-    "198f02612dca552422d3bdf5a6b23ddf9eafff5d": "Carte carburanti:",
-    "3a2d3c359edb3c36b17f3ac52a563d8051cd18ec": "Diesel",
-    "7b46cc993648ee06971347e15dc875dfa1d41a89": "Bio Diesel",
-    "71a2aa4761708ecb3164b05be277b393cff73cf4": "Diesel (da gas a  liquido - ultimate diesel)",
-    "01af22c942d6ea4f1bef39916a304e01b5463422": "Diesel per veicoli pesanti",
-    "d23c7271106de577b47dc547dad4780d92bab520": "80 ottani",
-    "1dab2ae489c274c27d1a5aafa20d9eafbb5e4ff8": "87 ottani",
-    "f7969b70b141398cebf925d89ae05028e8f476e3": "91 ottani",
-    "ac618d35afd82297cdb46183d3e55d1438b522a0": "92 ottani",
-    "1ae288a8d953b4701808eac6cb0bc2aab0611e5e": "95 ottani",
-    "19d3a740f5f428b9f99eda2c924642df3b775dd9": "98 ottani",
-    "bc9c615cd6fb345b7bb30de54a9a5521707a9dba": "100 ottani",
-    "62ef5373f985decf7d3f58fa24b13c2c45fe0711": "E10 (10% mix etanolo)",
-    "befd411268feb7ab0a613fbee47438398713579b": "E85 (85% mix etanolo)",
-    "6a3165942abd1537c60aed6d07f73b5551e897ac": "Etanolo (alcool)",
-    "62a66aa3c1ed9099127f53efafdfdd49535c5bb6": "1/25 mix (moto/motocicli)",
-    "e9e04964f2470c3fa01b8769da2a3ca8cbcba864": "1/50 mix (moto/motocicli)",
-    "4783236ee22ea0ac78cdd13febc763bd23610dc5": "GPL (Gas Propano Liquido)",
-    "63a07d98bedf51831049e2dcd94830dbedf7d97f": "GNC (Gas Naturale Compresso)",
-    "385a797f63466e352339046e5b588e32ad83601e": "Biogas",
-    "c98fa32540ce31e31b8816473a42c2f9ac2775ed": "DKV",
-    "7bb8c4aca85abf2791f9d6cfdf64191c988d9bd0": "Routex",
-    "c4cba6139c22ac7de2e215280fd4dbc1c5247848": "UTA",
-    "536ea35870b8a23e9e0703e3b166e68e891055fd": "Liquido di scarico diesel (AdBlue / AUS32)",
-    "f76afe037d948f142a4428fe61e616cf3f193532": "Stazione di ricarica",
-    "6417685705ccc35beb67189aad9f02895f196c90": "Voltaggio",
-    "bfebe98b407a9ef682f1c90caae68e97d3505161": "Amperaggio",
-    "0ccd7ec0217a198bcbc8292b8812286aa9f3d040": "SAE J1772 (IEC Tipo 1)",
-    "e37535d2bdd4c3deddb07559d1892b8b08aa49f5": "SAE J1772 Combo (DC)",
-    "da677d9150f70ef9bbe4c81405de03b5e33a6026": "IEC Type 2 (Mennekes)",
-    "43a2f9def5db66d60235c8b29b00ac5b654a02ed": "IEC Tipo 2 Combo (DC)",
-    "7aa616c074c101546258e018c0e93cfca8b0743c": "Tipo 3 (SCAME)",
-    "54933cea935aecb602a320140e4caab6aea04696": "CHAdeMO",
-    "efb289af80a5f9520431e36be9651685bcf7c095": "Tesla Supercharger",
-    "655b564161a921ee9cbc1a9eff131233a37dc081": "Schuko",
-    "5ea4abdd0cab689195cd71c77950e7d2b15416e7": "CEE blu",
-    "cc24b13bd0232214917aed865e121576c1eb9d9b": "CEE rosso 16A",
-    "8e332cb5cc12e1f8841dc3b6c19c413c450c928c": "CEE rosso 32A",
-    "2f138cea8758550b8e7b8f1178743ad1f70c5389": "NEMA 5-15",
-    "0a8065d49d45eb5884cc060f5c5cb980c4525c1a": "NEMA 5-20",
-    "5b1daff47792f2a69d8c3a3a2124c7b8f75a7c3c": "Carta membroi",
-    "d6707b8c758cb65c95e04efce8fed50d331779a5": "Tipo di veicoli che possono essere caricati",
-    "c70f01b3f3c1eeee52dd7acc2d8ec19888c232bf": "Numero di Scoket: ",
-    "54cfd9e3f60ade5faa6d6caa31b7d9633bb8d27e": "Autenticazione",
-    "da051e4f0edd6f44a2335e5f99be77cc573a4239": "Bicicletta",
-    "869d4ed2769005e01de8917101f55fcdd106be39": "Scooter",
-    "b31635293774abe28d4181c7132e4c77b32768c8": "Camion",
-    "49d9674dae8a29e5fc698763eb3374d7f3372118": "Nulla",
-    "b1dca6ce2054e54417b715c6ebf8b7e41eca5765": "Telefonata",
-    "637f3c9fe1d8edb9477571b294bc87bd598e5988": "Messaggio breve",
-    "9076da279e7ec1cbca8404732bdf03bacbd1e1e7": "NFC",
-    "96edfa7a8a71aab3742015675d7a4bd407b1139d": "Lavaggio",
-    "4c2c653a66a7a2b8f50712e082ab2d153acac207": "Self Service",
-    "08fa44b9ac2c4f6c4c6a9ee1daa83ceec3615b51": "Rivenditore auto",
-    "66b0e4416eed45fe4c0ca25fb3ce43d16df356fc": "Seconda mano",
-    "243cc98ce98838b21946b9644b698e6ce551385f": "Riparazione",
-    "6c9a4f1432e468bec7c322c634411287de3aa387": "Servizio",
-    "f56669f4cfc5457be5196a48efbbe31bca54da0e": "Parti",
-    "50b159d6544828a120bd5d62e7c21bfa35054fce": "Pneumatici",
-    "77a8bfdda81ba80231cd7f392eaaf146e73d1fe6": "Noleggio",
-    "7522c95fab7a7f0d73c2ad51273ec027271cf102": "Condivisione",
-    "e07600390f68df7435fd9f127fd4f06600129d40": "Sito web",
-    "5619650f27cdde129ab662a0eb99c95975fc9594": "Motociclo",
-    "0d3f32e71b6a2f69f63fe5e5460a5f6c6562f217": "Rivenditore motocicli",
-    "c7f7152769491bc8ef67a4ada12d8d49abe50894": "Servizi",
-    "49df8c0e1b1d8403df9c89717b43c2906e2a48d2": "Vendita",
-    "17a6cad5f87b32f3d7ddb0bb7129c3c3b8c74441": "Ispezione sanitaria",
-    "bd36f99ababc5f8d5bf932fe78c1e3a43909f979": "Vestiti",
-    "15a9f10bf7b59de7bcacb3daa3e928e210cc2044": "Altro",
-    "93dd379628f0eb9811685b5c04df26c1d88c8da3": "Coperto",
-    "a2563eece3ed529dfecf375b02a9377b926e7c2e": "Rivenditore biciclette",
-    "7846e37c2a241f7b57638bfa0feb3a9f0cf3aa7a": "Vendita biciclette",
-    "5ca2bb12894b00c8a4839369ffe98a34cab7caa6": "Vendita biciclette di seconda mano",
-    "dc595226caa17e96d6fa8933615dd27f60894651": "Riparazione biciclette",
-    "8f28d8988bda94dd14776fb0f0abacbad0afe5d1": "Noleggio biciclette",
-    "22172272a22882cf41b320210ebb0e3618e28095": "Pompa per le biciclette gratuita",
-    "bc8d405fe4af35a8ccbab7070cb8c3fcd67a8b94": "Strumenti per riparazioni fai-da-te (può essere una cooperativa per biciclette)",
-    "5c917726ef3e13f45c0c5f92594e519829cc4ae2": "Lavaggio biciclette (a pagamento)",
-    "4c9c398356af4056e43b1b8cc406ef92ab4505d4": "Stazione pubblica per riparare biciclette",
-    "f3c821f7735bcefee7764cb97b4bc5dd572d820a": "Strumento a catena",
-    "0f3333eec45b91127396c7d3d96e146657b6c06f": "Trasporto pubblico",
-    "bae9fe67109eb33919321963cd2e4ac2e1d242d8": "Fermata",
-    "650e04f7353a4f4d73cffa66e85a70ade81e9dc9": "referenza UIC",
-    "5f05c89dbed178dbedb1f6b863e0ff2c301d54d5": "nome UIC",
-    "eedeffc76b1f5869cc82cacdfe266ccc376f7e05": "Rete",
-    "0c618cb7f85429eb1776e1ed1ae3f18c5b6a48ee": "Pavimento tattile",
-    "7dd9baa5f12b2b1ba7bb7a3e3d54f5f96effd9b0": "Bus",
-    "d9032c0b32e1c0c095f14209befc068253523391": "Fermata autobus (legacy)",
-    "ccef3807318579fd226a30b1faf4834677bfdacb": "Fermata tram (legacy)",
-    "a5cdb6d810a275eb7771294734b3835ef83c3a13": "Treno",
-    "1d68cd9b4c13a64ae775bf8b57934f1a5f07e21e": "Arresto ferroviario (legacy)",
-    "3cc78f46480af3f3a3a3b90555362dd88a59d34e": "Filobus",
-    "bbb158b34222cad8320ee1d9362d76173cc47239": "Condivisione taxi",
-    "73058cc47f59f8ad0554c90c79f7d1820d3f33f0": "Impianto a fune",
-    "b93c94013e88f8666cfc1d37180458453def3dbf": "Traghetto",
-    "66501ca5bddb0f3869d5bd6d6cfe5011443a5b49": "Piattaforma",
-    "a0619677da4f50e6445a3cb9e97d8b6261c19d99": "Panchina",
-    "b3f0115d621f5e869219fe6e9ff5c68270822b71": "Riparo",
-    "b286bb123111ab536048ad3e4be2f41d0133c3e1": "Cestino",
-    "162bd58a61cc29d1b4cc0aa01bea9b63cfdaae9b": "Stazione",
-    "ba6b9a41577507380e2efb273bba4a4e6f48319f": "Area",
-    "086e10a0e26827a42c333b5ceb500660a111c25c": "Edificio",
-    "e8c8fe9e24803f4b9eff2f9d414ef55ee17f8de1": "Ingresso metropolitana",
-    "fa412a10c689a57b63f2ac78ada67f181d43410f": "Biglietteria automatica",
-    "78e6c061697068262837f96f70a512fc7a37d268": "Aeroporto",
-    "6f45e5552eee36a75b63492f21c1f0a0bcf3c101": "Area aeroportuale",
-    "2c74a1dce3b722d8c7b76bcaf349262994ca0e00": "Pista di decollo",
-    "8029a5aee1bde5765bd39ea3d8cafa9abec68d2d": "Percorso taxi",
-    "b2c2b02cf155c512632745ababedd8e2a7de0a60": "Eliporto",
-    "f4cd98d041e30bedd8217356de5976b26614fe8b": "Area di stazionamento",
-    "20242751512b7d8dded3546a7891953afd91c2d2": "Posizione parcheggio piana",
-    "23323e67740f3b80fddeb5488eabd9f0aae911ff": "Terminale",
-    "ef00d6ce7e8590661a465cd9fa3125e03a0d0b16": "Taxi",
-    "e6265e1a1289b82ac8a3e01c212bd873823f98e9": "Strutture",
-    "f794e3e2f1a3cd51a2712d2df83321a8063e83fb": "Alloggio",
-    "9938a3ce668ca4a032b8382dd57e7e1b28bccc66": "Hotel",
-    "5817798470c555f35ebeb8dcc327457f5e2e5d44": "Stelle",
-    "ddd88c645aa072cda3532180b4ca14e87c9aa666": "Stanze",
-    "e2acded36680915ff7d604862c058b73741bfeec": "Letti",
-    "3a3a084129a41e9c8e189e7002da09a1177e2442": "Motel",
-    "4ed765c05d44d584bbe6122835e232e5ef0978dd": "Guest House/Bed & Breakfast",
-    "cf2dab630a43f49cb45d9a381709a7ede8ed2461": "Appartamento",
-    "370dd1ee7a31cb87427c29549ff88de9637ce963": "Numero di appartamenti",
-    "88f08ea7211f203f92e2f034699e25b602bad48a": "Chalet",
-    "106e44ec3f5fbeef8c8d7b9a656b701b87bf537a": "Ostello",
-    "d4eae5bfe7a4f791f14bb7044d57b74e57a97997": "Cibo+Bevande",
-    "cdcf20533032e7afaed7606310b4ad201185d827": "Ristorante",
-    "95be518be4fd7ef1c236ebbf143619c83386c04a": "Microbirrificio",
-    "3f866fe3792089a290b3c7fd5744930cdd5e195e": "Posti a sedere all'aperto",
-    "c2949a050e768b4ef999012bfec8733dfde2e5cb": "D'asporto",
-    "7426c0dba164848df58cf9dd54726532d805efa1": "Consegna",
-    "a8ceca6c32d758dc1d0197e679bb938375e89d1e": "Fast Food",
-    "51fd168ce4431a5801ff9c6feb3e6bdbd9374630": "Area ristoro",
-    "01763b0bf177e4652ff03d16dc1dcc50fd6250da": "Caffè",
-    "ea4233533dc4447c84b56c42990662bbe00041f1": "Gelato",
-    "e44d6f19b4e15b9d877b832d4b2ff397d28ee640": "Pub",
-    "83d826955b21b473d94a674320ec484bd2f008d4": "Beer Garden",
-    "46651c409f45402a1a3bd7497b343986a2c2ae5e": "Bar",
-    "76fa7f1b22ebfade9763dc5a3e8c837080eccd69": "Turismo",
-    "5eea09a4f024e692c6d16093808837355d0d68ca": "Attrazione",
-    "d5e6fb8ddd14ee31a2a441724783b718dda8b41e": "Ufficio Informazioni",
-    "5dd9909fc80912f4b5b5de5ff594387dd2013043": "Un ufficio dove ricevere informazioni riguardo una città o regione.",
-    "6f58a3a8c5e48afeedb29afb8d58a408026760c1": "Mappa",
-    "86ed0d33e714327ecd916cd29096dfa2fe62e427": "Una bacheca con una mappa",
-    "5a05f7b00959671743f991b8084ab0d5cf267a5d": "Descrizione più dettagliata",
-    "fb1669a7018c0e1473c8420c207f83a1786ca6ba": "Grado di dettaglio",
-    "ce1a8d726cdadfba3b51d790bfc9df147633a880": "Area indicata",
-    "33a6660f28456a0b44235f52ff440fa2c160dfde": "Percorso per:",
-    "d3b46f68dd1595ce308e95db5a0036c6c006d931": "Escursionismo",
-    "5d8ac3f662045deee7ff4b0312f23567add9e54b": "Bicicletta",
-    "0125aead430b1f6761649e7d5afeca96d62c5649": "Mountain bike",
-    "e28ac2794063ceda8a9b2b2565926da61895a068": "Sciare",
-    "a279cd8945df125b76a13651c5236593231cf259": "Equitazione",
-    "cbfcede7bba09f933638b9d43af4aea4b2bdfbd9": "... altri possibili modalità di trasporto",
-    "7fc1dac55d54c820d8128a158ea74659804dd520": "Cartello informativo",
-    "a2236c78372c3ecd62aedb65ed67c0fb24485292": "Un cartello con delle informazioni",
-    "28e7e6fffdbd8a91b26f4954aa00d55aacdf62a9": "Contenuto del cartello",
-    "41f2cfefadf3eefbaf32fc72f134d75b424cd000": "Indicatore stradale",
-    "a185d625934dfe468afdadd257ea64155c73b1ec": "Un cartello / guida con indicazioni per diverse destinazioni.",
-    "43dc525ac32b8485fd797b732c87f50e53253877": "Elevazione",
-    "508bdb6f697d05f165c2e691c30398c150243e98": "Terminale informativo",
-    "4831f09d5c5b5ba455c0b3703ecfe144efaf2017": "Accesso alle informazioni tramite metodi elettronici.",
-    "175ab25d2d030c7638ce3820c32e709ac24e00a9": "Guida Audio",
-    "70c1a9293fb1dc711b68626eb467024c3c3b8fac": "Informazioni fruibili via cuffie o con un cellulare",
-    "066ec1d6fbe485b383261844521d1dd29995a399": "Audioguida attraverso cellulare?",
-    "af7822e2604b5698fb5a75b8f35d768d2651c635": "Utilizzare il formato E123,. es. +49 11223 456 7890",
-    "46c1bc32ff96786d7d907e60ea45a44060f55f3b": "Numero di telefono",
-    "71a827996961d7d2a5fae24b2fc74dc7b7bb59da": "Altro punto informativo",
-    "bad3ddc26b397a55bab546ea6327b5a5abb3eb50": "Tempo libero",
-    "38532cd37d2ef2f2405f7fec593d3e30c6f931e1": "Cinema / Teatro",
-    "8b7ba503602407c4d006cbcb318169806339951d": "Drive-in",
-    "799bf0793b6b2803d69a97b487c71c0513f78e66": "3D",
-    "3ab6eed05fa2d44bd8abebe261d6d34e9492d899": "Numero di schermi",
-    "21d2a00664a46c67092b6035678ae2bcaf2f9c30": "Parco per orchestra",
-    "220dd4b05569e4c89cbc36b269fb48a0cc81c011": "Zoo",
-    "7df59b2a55c0d93e484e2bf22502d68001f074b6": "Recinto per animali",
-    "fe24587c77d94fe7e9428df21e5716170ea96ece": "Dog Park",
-    "d673020d47e4e6721422522173df2ab181ceecdb": "Parco divertimenti/tematico",
-    "5d9068c43e1fdb1b2d8f07bc0cf8b12794301e3b": "Parco acquatico",
-    "1067f8ed2e0c68b21a8ae01f43924fdaf4ea6eeb": "Resort",
-    "1b33eaa6be195a498ea3383eb145a8ef2bb4b022": "Piscina",
-    "07c50f002352b6944c2885607bd4fe0a64fdd2eb": "Utilizzato solo per area acquatica",
-    "808a909f025c74f6ed26c71ffc74af37f7fa02e1": "Stazione di fitness",
-    "2a501eea14c7328fdb7d5f475ccbad844188d3f9": "Descrizione",
-    "f5f35662ac2b534dca9f909ef2e8e96232555cde": "Sauna",
-    "908d8f3570c1c53027ea808bfcb01d3800fde0d3": "Area di gioco",
-    "a06b72ccdd2f70f4087876719de5071549830392": "Area picnic",
-    "4eba0c16a69c499b23d4dcf41372b5f28d779107": "Focolare",
-    "5b104052f7b1dadf3348a22d69d59e5eb348a594": "Tavolo da picnic",
-    "0c61c13303ee0352848d1db73ea3605cac1cfd36": "Grill pubblico",
-    "1621c961f2623b7da09b7b762519fac88eb1d9c9": "Area falò",
-    "8ca717c3de79d717dc559f1e1331241eb35f4a55": "Night Club",
-    "047fed2cd6e5bf5936dba34d07b7758821a09c83": "Casinò",
-    "3895513a1bd146996a4f37a7ec550afe7cc95a72": "Strip Club",
-    "387b7f2dd50c97ce5868b821a273bbd6687f158b": "Bordello",
-    "ee4ebe9cff4e4b2de886262673f9d2f075d633c1": "Cultura",
-    "e98d42cc36d372b9abdb884cdb256f63b6ef0a1f": "Museo",
-    "7d58d7daddd61f563c2d1fa7462dfa04cda66d91": "Teatro",
-    "376128992d204921fc1afbf30818599321ae5f4a": "Biblioteca",
-    "606ee76def5da95ffd2889413f0b606e05c79070": "Centro artistico",
-    "d96b4d6b1a537ee52fdb4e24be3f9055bbf422d7": "Opera d'arte",
-    "542494945768ce01e6dc6a6417fa6ff221916a51": "Soggetto",
-    "8b03daba4bdec9233cbc5aef6229eff2cbb3468b": "Nome dell'artista",
-    "30bba22332155e4413f06f9eb1dd460700552ab3": "Data di inizio",
-    "054e13ba92847928561d3f3cb6efb212e686da27": "Studio",
-    "ce2fa99177dec3167e057d8b2d4ac707b3409565": "Luogo di culto",
-    "f7178891d9b87f13f7a3cbe6bdc7cda537354196": "Chiesa",
-    "f42bdfdba644d125bd47aa453156da8213124b9e": "Tipo di edificio",
-    "62bc77a87a8624418fcd4a779c3851989cbe61c2": "Moschea",
-    "5e4ce2de47e842329b94a6a647d15d19ae3e30d0": "Sinagoga",
-    "28f5cb8f63ca3d7c3c350f32e90178bc50c50fd3": "Tempio buddista",
-    "d304487d732dd1742bd113d41e488f24f462086a": "Tempio Indu",
-    "fdb7be1683db04004a02d54d5a1fc64c5676ccbc": "Santuario scintoista",
-    "a543030938155bfa31ec8c2ee07c46ff5e89558b": "Altro luogo di culto",
-    "9c4475a5a144938bd2a846c1b4168492cda11059": "Edificio pubblico",
-    "7f1754e88def3aae503e5cb517d5e1888a61b68e": "Municipio",
-    "7748088c168bc09a030c6dcdf07e9bfb9cd3dea9": "Centro sociale",
-    "832dbc8fe7e0455fc36e29e6523da69ca55a6db0": "Ambasciata",
-    "98d7d371eb2d97e31e44127ef4c509f136603622": "Palazzo di giustizia",
-    "e39787818f943b76967c1191257093dfab2accd6": "Prigione",
-    "d3ca9616c94522a040aadaed6a07577103a4dfce": "Polizia",
-    "375038d080f8e55929a93c5cfa5010d6b336969d": "Ranger Station",
-    "63c8e15285581173805b2a442824c42b15d53cdf": "Caserma dei pompieri",
-    "8d8c3038045b9b328baf7ea49fe998313d720793": "Ufficio postale",
-    "7db652d3fa86aa83de05b73868fc27cea87176e1": "Formazione scolastica",
-    "f5852ccd69391c018e9cbb735fd53b15c288da6a": "Scuola materna",
-    "507acbea512ee0d5e430bf58f0ae0a0a2b61854d": "Scuola",
-    "5070ef2fe01f0e776431bfc43d7cc8fb48058a4c": "Università",
-    "6b35092d5ee2f547660e976226362e1288412ddb": "College",
-    "03f24ba2f1bfdbae6d6aa9dfc11ea37961cc44b2": "Scuola guida",
-    "f1cff7cb9c0f05d6ba280c5e629db5cb6ee581cc": "Categoria di licenza",
-    "a6174dacced692dc6ef2f3b6a22bbf9cb24168e6": "Salute",
-    "b1b81554db90c32e06f95ca96612c3f2913f5eff": "Ospedale",
-    "0f7b057b3e917251f962ca33357601ae71df7111": "Clinica",
-    "360abeabdf00327aa566476ace1594105dc5aa97": "Ambulatorio medico",
-    "a43a71bc368df8a2c1257240a734feb0e2852e5c": "Dentista",
-    "6d44c437ed696a13d0c8f30df058cb166e04414b": "Farmacia",
-    "d61f9995a298f7b5485cf122e037edd052778a8a": "Dispensario",
-    "9fd12d3aecddb6f936f5d702ede4567b5c3318ef": "Botola degli esposti",
-    "2d223d9a62e792af62a83875a944d71aeddf0b3b": "Punto di accesso di emergenza",
-    "9fc90ff8746922cbd40b2863a18dcb8825c3a171": "Numero punto",
-    "8e218973fb97e5633c2b84a8fd94554938fb4a99": "Nome del punto",
-    "a3984b73943483d85f84e3339a283840bc34b021": "Numero di telefono emergenze",
-    "001f71c43bb3b106d70b231fe6ec008ceef4156a": "(Utilizzare il numero come mostrato sulla piastra.)",
-    "ffba8ca59d1c3c6746b982e63e0ceb9a858a57ce": "Veterinario",
-    "b78cef21a5bfd9a9baac70f63725b9674baaf5bf": "Emergenza",
-    "960e928357349002f63b92714c9fe8290f5fe2b3": "Stazione per ambulanza",
-    "68889c39f89c9023c0f49ea8d196aa7eca84e3ef": "Defibrillatore automatico",
-    "d8a5f46c83eb36bcddef602f2e36fb2a34c1cba6": "Descrizione del luogo",
-    "5477ef1de1c4fef8d6c74a505c1c52527c665d91": "Si trova dentro ad un edificio?",
-    "4705e017aaf2bcdca8f583a98b3896fee137244e": "Estintore",
-    "54c332db5ba733792edd733bb88293c6a7a49cb6": "Al coperto",
-    "c7fd88d9fb181098306af7839a327c5bc2e6d248": "Manichetta antincendio",
-    "93e587b937c322b66d096ce4d87c94270913a454": "Idrante",
-    "1caa358d335874cb22c220dcd25289cde5deb8f8": "Forma",
-    "7b7f3ffcfe3734f26790abac6b20f09d970b4954": "Diametro (mm)",
-    "afa03ab38132f8c46a2fd44b5f70f06d4a010b14": "Pressione (bar) o aspirazione",
-    "6ea23d2433cba518f44690a50911de6f9633a2eb": "Portata con unità di misura",
-    "82e87e1f4c21f1404fbafe547088e19cea0cd79c": "Ciascun diametro del giunto (separato da;)",
-    "760746e5461a6862184bf94381bce477b177191d": "Produttore",
-    "dc9188ebae1968b46e7866f6fea9885986153461": "Sorgente dell'acqua",
-    "ffa2b74bbf6fdbdda5d5e3b4a98840106353f988": "Posizione dell'idrante",
-    "16145c7061de549b724fe6195594ce14df346583": "Tipo di pilastro",
-    "5c49a4bb14120892fe8f1c941f85e0d1dee750fc": "Numero di giunti",
-    "54362c751bc9558cdb5c62238307f35e0aa73da6": "Colore",
-    "a21ca8160f57948b6085a7befaac13c66c004234": "Colore della parte superiore (cofano)",
-    "16637693ef0daa596ce9f16bb0f9a1f576c1571f": "Colore dei tappi",
-    "a0efc393612caf039c83e78901ee60380063b783": "Serbatoio d'acqua",
-    "e4a328d1c6a6f17355682436bd3ac97dfa41717e": "Volume (in litri)",
-    "4793bd7243a646f0ac71822f699bdd53e3913039": "Punto di raccolta",
-    "2d6db004ae9bb9b7a1e5153537f91c8db2f7c87f": "Telefono emergenze",
-    "8337904de8ba94dad03ab02546d526fa74315700": "Sirena",
-    "e7756d19c97b14a0122b721013e959d330815a91": "Serie (in metri)",
-    "742faad81db0bb715b6baee9addad1f6b350c4d6": "Scopo",
-    "7495891c30399c092dd83b7e04f055db787b61eb": "Polo sociale",
-    "f6ad773865f026211ac34b999efa4212c515feff": "Casa di riposo",
-    "ef414bc347a5dfacbdf36e0705f7dcc068fd8154": "Casa di gruppo",
-    "a788cbb1b0b13f3b1b35394942d86a8267b2f2c6": "per",
-    "e86affdd9d48fd1de046824fd9eb0ba8f9e71340": "Assisted Living",
-    "69156314800d7895b14c57a2ce68facc957e2931": "Outreach",
-    "d0e63c557c0cac5c10740433105452db3ea63742": "Banca del cibo",
-    "8fbc094504b550f46e981d1e66c7e20892a471db": "Bagni / Servizi igienici",
-    "605557cae5faaec653dc9d442c94e7a1040f483a": "Diritti di accesso",
-    "5a973bf3053311cf653fe6de0f9dd71eacdfc78a": "Posizione d'uso",
-    "1ce9d5855079dcbfcb2f154df4ba3821530a6511": "Pannolino",
-    "bf7e977aafbfd1555892e3567ede2156bf77e701": "Femmine",
-    "ea3f770d14f9289d34c6f3d958432480b314e1d6": "Maschi",
-    "2ae2cd3f1138a5423673121e6239021942d08f95": "Unisex",
-    "6364aea801c8117efebfcb1a142c8b976ff23c7c": "Fontanella",
-    "ae3448e3e9c82da15fdd2f93e99cca5159db3ebc": "Doccia",
-    "5e9ba2afdeaee6d1117f52785e8549cdc6e1cf3c": "Casella postale",
-    "94e08daf21e226c46b8afbb3f158dffa8c58c774": "Tempi di raccolta",
-    "5233f579c394551f9fee5cad0764cad3efd7e7f4": "Percorribile in auto",
-    "3e9f5d5ff853ac80469521015922529982849994": "Telefono",
-    "2669dcdd9655a0a927a5b491b487e493812f226d": "Monete",
-    "b887f8dc356f1db75bc586d5a829a002fea07dbf": "Note",
-    "22113ccaca7a1974512af3e8b7a9b2ea51ae3013": "Carte telefoniche",
-    "7efce123b38ea741f4bf3e3b99b4b8bf2a9d0ac0": "Internet Caffè",
-    "af2ae5c3b81eb0fc9998cf07a2859f9993b44c79": "Orologio",
-    "0155f9f63b49ea0058418b4b8be3f85d0faef70c": "Schermo",
-    "6ac469c2a00424a031a8730041118ec6b8958b28": "Facce",
-    "8fc5529b71605379545ccc84129defb5eaf08006": "Visibilità/lettura",
-    "8727935e3bde1a762c0cb60466ee15e19c4c5c40": "casa (fino a 5 m), strada (fino a 20 m), area (oltre 20 m)",
-    "6f7a6f39cc8383eee690d501f182fe6fc8b357c7": "Mostra la data corrente",
-    "c85bcb29e6a17bb2fcbe071962f4c43d87ff7c3b": "Mostra la temperatura",
-    "51bfc9ae7ff8052fcbc6a94a596a8c5868821caa": "Mostra la pressione barometrica",
-    "aecbe1fd89b3bf202662bede19dbaf776c81c137": "Mostra l'umidità",
-    "f2dc0590b8a04319e9d292ec2f71a6ee93a3c66f": "Cabina fotografica",
-    "1c0133f440184ef1381da358fdf6f85f880ae07f": "Container per il riciclo",
-    "b3fe1ab6a17a0a2a7deb9900903482cb9a10d1a3": "Batterie",
-    "beb3f931ccacd019e0627cb014a4f60f862cdc3c": "Lattine",
-    "53e5f13eb382023bb03d97c5feff444c7a58d4ca": "Cartone",
-    "140445b480588e2e2d866d9deadb879b8b7899a3": "Apparecchi elettrici",
-    "4d1e2634b0507518287d9bf3fd2f06d4c1f6cc4e": "Vetro",
-    "6c94aab188d041be2b8751b0b2430ae8074425ed": "Bottiglie in vetro",
-    "8b7457bfa02da16c160f57245a83cdc7404e819f": "Rifiuti verdi",
-    "6508f0fcd15490b49958853b5419d48b4b43d07b": "Carta",
-    "0f8663514f63f77c388e25c02f285c1905702a10": "Plastica",
-    "b65e1509c4ae4f6c712fd375de9b8f80423f747b": "Bottiglie di plastica",
-    "757c20c9665e1e4880682f8f95c555aa97986bf3": "Confezioni di plastica",
-    "ce0aa75c829a6ac821fba50741d217ea3c7e076c": "Rottami metallici",
-    "2a4f5aabf9c8b3da323d495efc09051a094a0a37": "Scarpe",
-    "8bd8d3641e085b63555ff6c25ca72ab74f2f8c0d": "Piccoli elettrodomestici",
-    "638232e39a47059ae9d5fd04cdd7ba5e55315c02": "Rifiuti",
-    "c2a37da5a39f602697d6b7620a9a9346624d9b83": "Smaltimento / Cassonetto",
-    "99a2c86318f9aa75a76b2ca5c010654767bbbe91": "Stazione di scarico sanitaria",
-    "530934114d240f65175c463e25f0bde541e46592": "Pompa di aspirazione",
-    "06c616e194077d31d9b6225d9542a7ade1ab92f3": "Scarico a gravità per tubo",
-    "773e7c0b8c85f8c7e6a99066630a0e6c29730f05": "Smaltimento cassette o Elsan",
-    "91ec07e1bfddc0d899a3864ab25931e923272ad2": "Orario delle operazioni",
-    "77100e10cebe13141acbb848e05bc15d797fba32": "Schienale",
-    "b1c2f19c06899f533a3b6dc0321196436633e2ed": "Totale posti a sedere",
-    "3a4f4fd6824765e92125d45ddc2f3635c7052c21": "Tipo di rifugio",
-    "a861de731d17d33ba4bfddc2f88efba31fe99ce4": "Punto acqua",
-    "292fa3e4f59f8561f2f78425e1f06e48db987acf": "Luogo per abbeverare gli animali",
-    "72164237eaafe6eb38ef60a1a0dad65d94356484": "Aria compressa",
-    "c467cad9f8bc24de93084cacd56350c53e2021cc": "Valvole",
-    "fbf2b002291bc9503dacc8822d3d0dafeb319dc9": "Dunlop (Woods);Schrader;Sclaverand (Presta);Regina",
-    "2d58baee0eced70545e94a9c9ac9eb8976972ed0": "Colonna pubblicitaria",
-    "982103b53016cc795f7896e17d96101f7cf52bcc": "Tabellone",
-    "28f2d79b3e76d0fba8de5bcb7ef20f672b807294": "Sport",
-    "1b326d905db391f205f575a1840394e99c87637f": "Stadio",
-    "dbdec847d466a0ee5b38360be7c2898df8451570": "Centro sportivo",
-    "74dfa355513a4f195082196b84dc54b9b2c87869": "Centro Fitness",
-    "02257084caaca65e71c456be4abe19d92b9a6c16": "Campo polivalente",
-    "8c03d66e77f8d65298454c1f11059b2004ec35b5": "Percorso per il golf",
-    "ac37022a948deb0c4aca88ff5d6dc087f7b1e070": "Creato dall'uomo",
-    "cc58514f1c30d8f4f353f0b1d10e42ff47f7b970": "Luoghi storici",
-    "0c109e0a18155c4ff986b71f120479220eda5785": "Castello",
-    "97795a734fa006834e278ab6e4fd62f52193a22c": "Rovine",
-    "f368843c94d74155ddef4f05725e2bcc25bde341": "Sepolcro",
-    "bc699df69689273fb357ec7f10c9e1aa10c13187": "Tomba",
-    "a9bf6bad315d9ccf9d2b00f387d6e9b181c54d77": "Monumento",
-    "88ab8137bcd163305abe125f3543eef9c26fb3c4": "Memoriale",
-    "e78aa4bdbf211ddd99a006c9e023e8ab943b8089": "Iscrizione",
-    "9746294a2c204ff40d2a9a58702762539a530ba5": "Croce votiva",
-    "2dd130e42ac946bcef9f7a41b1e1a86bcb424f27": "Capitello votivo",
-    "e3ac332b47a54dbc7e5d9e9597e2a137ff4bed1e": "Luogo di culto",
-    "9361f42ce14c9686ab78710a87e5c274f295afb1": "Pietra di confine",
-    "c0a89e0df25232c9ae1b46e2a09e98c9ebf4ea69": "Torre",
-    "0a667c89b92c3f9f5697dba72a36b5d24a80be58": "Tipo di torre",
-    "a729bc7b8e73bae8abc9e9e35145d2ffcdd74c5b": "Pennone",
-    "2a5c9261abdd5b7530c1fcd7347cf9ab44c7e888": "Croce",
-    "e65382fdd2e499489b89667bde4d514454fc83c9": "Gru",
-    "9ccc1c0118b017850eb2d9207367b4014bbb4f72": "Fontana",
-    "243673fb18b4637e5d2f398761e1acb5e9a0574a": "Pozzo d'acqua",
-    "4ab137c31ca57f1b156ff44a61e1df5d0953cfde": "Pompa",
-    "0b1a57305ff71c89c551b4b68ef561c1c0c0f124": "Lampione",
-    "7fb3e6fa9b15f8a7ecc275c313b341d89278e4cc": "Punto di rilevamento",
-    "c52e4e25ae51f4919cf017e41a79f5acaace0655": "Videocamera di sorveglianza",
-    "7b9b48e3878d4f420fc3dd476c36d70cdf35b0b8": "Zona",
-    "6574d5951216c0fb888afeb278b02a0a2fe20cc8": "Montaggio",
-    "1029bd4b7b1b30de60f2b96f4fe25e3912dd635a": "Direzione in gradi",
-    "c8395db7ea7a38de472172036f218f170766b40a": "Inclinazione in gradi",
-    "df2bbd50cb88352bf43829364a62da34ea033ab5": "Videocamera",
-    "8af639564d9b45a5bc7e25f089ee352fd5704cc2": "Negozi",
-    "6e925438383d3b88e00bcc7252e85a05898dfc3b": "Cibo",
-    "e57ea4f49abfe710d2230f611899ffebdc69acce": "Supermercato",
-    "ab4bcb1919f949cd5d16475405d121f6e1dd7b85": "Minimarket",
-    "dc0e291bfdaad7163d9ded008008e31522d507c9": "Chiosco",
-    "cb8f461a7159ea01f90a4b11d5173c4e5eccd576": "Panificio",
-    "054c0bec7f2275234784beecebeb95507c02c5db": "Macellaio",
-    "fd5c4c67ea3b7cfaea88ab279a55ff7373bf8f01": "Frutti di mare",
-    "bcdc42dc1fd4bac493ac7c017d9296f6e49e2c6f": "Latteria",
-    "ef5442c6ee3cfabe55832b1667797040fb66f237": "Formaggio",
-    "78f21be65ca690c6f2d6ca9381cf692d4cf5afc7": "Gastronomia",
-    "218e8f306f92d5e0051cc9bfb0d8cccfc482dfbf": "Pasticceria",
-    "bdbbf0c7ee150eb10e82b51a316872b00c6f3a37": "Confetteria",
-    "d2b51c214901280ad8fbf82fa05902a17a208e12": "Tè",
-    "febbbf4e992859115011da47ed3ba611d5e243fd": "Caffè",
-    "009051c50834ca9d88046afcdf9f3117e7786515": "Mercato pubblico",
-    "9697102277498e5c7af2b65fe851bcd9fc748f75": "Organico",
-    "64484d268a47c8ed2226c6995a2d4d8bc0f27fe7": "Fruttivendolo",
-    "10628667c3a499a9b03815f074c091abf9ac069e": "Stand Agricolo",
-    "95e025a64a632a847252f04bc378a45dff7b965e": "Organico/Biologico",
-    "d74db986cefacee3964f906860ab68a66016bff6": "Commercio equosolidale",
-    "f5a2cc2c324ca43cf30d3114b5ddd61501f95279": "Alcool",
-    "a25d15b94056fb0cc6a25d9c34e67569cc61b34d": "Bevande",
-    "93ab2690fa30e5ab5d12d7efc0a2b43e3df817f7": "Vino",
-    "1ec961e20a254b24572ee76d5d67b82e573bf1c6": "Boutique",
-    "da8e1d26455640fe9d11ee11ac8dc0dca2aa063c": "Riparazioni",
-    "429ede1ff15f522f088095519c15f0060b02820f": "Outdoor",
-    "acc49d8c0d4686ead5a980b57061b184bacef24d": "Lavaggio a secco",
-    "a86a87455494da336e7f739c05d834d6c84f22fe": "Lavanderia",
-    "03fb78c5351f9e491c39790b3406a63de3396a28": "Servizio lavanderia",
-    "c0d00277d95621650e474e9172bdd2106c1853d4": "Sartoria",
-    "a289af1d2d11f931ff1b9b3714c42226782e9ed3": "Tessuto",
-    "d3b0d4c72ab68c6f918f01eada3de99e04751b46": "Elettronica",
-    "483aa33013b8a04f7315364e37b8b36a28df5d73": "Computer",
-    "dd142f410bf85ff9be99f18967c9dc1d502c48de": "Elettrici",
-    "cbff2ca42f72362f87c5dcbcbe63b5175cd4d46a": "Cellulare",
-    "15681794d6d3a04454367d24af5d95dbfad0c2ef": "Aspirapolvere",
-    "d8c55cb03234a8217199a447d0f3cf85dc03ee50": "Hifi",
-    "8973097a480fdf160611b7f84c0ad3c9c992d52b": "Video",
-    "180896f967c4642032c9a781f856c9edf65728a0": "Video Games",
-    "8f9e23442f63e719ed45bbcadfa43d010b1a2f55": "Musica",
-    "8525f3a5e5016c581102fdd9aae15df93b2a59ea": "Contanti",
-    "0b782ff5730a47353236b3a3c80bab201e638065": "Banca",
-    "cba748c1fcbeea9a92fd0809a7616472116d1604": "Bancomat",
-    "17d282ce78683183e96c87351f2379e0d7975d37": "Cambia valute",
-    "b58274088ef235f51b64aaeda072a4be927ded7e": "Banco dei pegni",
-    "6043e5934c45010f38d52bb953aa1bf8d3860d54": "Decorazioni per la casa",
-    "72af5d97af36c3c3584fb7050cf4300975cd1261": "Arredamento",
-    "048da5cb3e281ad572d08ed47148cc72a5ca057f": "Cucina",
-    "97f8af9e97bd4629bef3406b0fbf07a03998147e": "Casalinghi",
-    "8f4369c6a8a2cf11fb6d4077833dc28d07d85b2c": "Tenda",
-    "ac48382a7ad88f84edf712e3e44802fed07ba20a": "Arte",
-    "ffc5eca14433a4d22ba3902c987c35aa210efc37": "Cornice",
-    "c7260b09039a4ade7e0f08beef9a31a0ed19b792": "Letto",
-    "78db6a7d5dc65dfd604b8532b78be7fe13414170": "Tappeto",
-    "cd76e8de45b41afb595ea7462fe9c7e5fd5cd925": "Decorazione d'interni",
-    "132652e26f8daf4192ca9aac9ec6c16b1f583974": "Antiquariato",
-    "29c02a327df880a9b230752da552a2d811807445": "Materiale stampato",
-    "0da6a8c83c3527a29525d420d3813482e72b71ab": "Cartoleria",
-    "eec434e1aa251a8d4af64483f4130003c47c1724": "Copisteria",
-    "0e20a03355cbe32fa4a2609ee85fa5d122343cd3": "Libreria",
-    "85b55a2aaa3bef9961b239ff7807ed6fd94f324e": "Edicola",
-    "ab8078399dccf2dcfeedc93366b4ccf60cef1297": "Biglietto",
-    "819157d6ead9041ee2f0a0028afbad20c0e96f2e": "Per il corpo",
-    "b1f3f32a6e098fc4aa3b26df85ca731b1ce81a97": "Chimica",
-    "c31e153e406a4d04a1e74f6cb14cc42c982ff12d": "Cosmetici",
-    "bcf5a383877e1e890a7ef1f47e5f1e4fc04f8373": "Profumeria",
-    "949db9ab1b83ffd7e8915c3b5cb802c309181f3d": "Bellezza",
-    "ab262b8678a7e356ff401c1869481de8e902b387": "Tabacco",
-    "237a4c2ccb391e955136381db7c94d6c1b9877c0": "Parrucchiere/Barbiere",
-    "4d4a3bb45a16cd8e6f906890721ef3a9e41eea3f": "Massaggio",
-    "fe638564bb92db19e322c49e373307d5d7ee9a41": "Tatuaggi",
-    "f80273cb377860904944430497699e4962deb16c": "Ottico",
-    "52e02734694d342fbf83be51bdfc352d3c837bad": "Apparecchi acustici",
-    "0e389340a515ee89d4fa095d020a5278e68e07f8": "Rifornimento medico",
-    "eb3b3e50c1aa02ba7fc85493e64110cc766b9a06": "Gioielleria",
-    "670e6cf7fc4651217137fb44daa9c44b0afd00a7": "Erotico",
-    "8bae32c66a8bbefdd74622b31ca7fab74d09cfc3": "Grande magazzino",
-    "1ccbca59579c34174f82b4cecd9d862ba61e1920": "Centro commerciale",
-    "bdf1bbc9ea6720ec00cd8cedf88615317bd5e9d3": "Fiorista",
-    "2b8686e8aa2275778525f42466d9a110b7fe3640": "Centro giardinaggio",
-    "ac47d8ad77b4828e3827315bea4eea23ad9a028d": "Negozio Fai-da-te",
-    "3c794a28da0a341ca7ec72fa7de3e4ee8e93095a": "Ferramenta",
-    "52c444722cdb05e3e6841fd300b4dc8b14de0cfe": "Pittura",
-    "85bccdc203b71e7a465121b728af0e9e1e6fad8a": "Gas",
-    "5da9eefe3f5528bad553af9274e8d3cf3550bbc5": "Agenzia viaggio",
-    "85f8fef7dea3221502b82279ddaef1b807bc8338": "Strumenti musicali",
-    "a709f0f93e89d06b53b0d506cf64b7dd91c17d88": "Giocattoli",
-    "9191b48f77ff162691aee4b05d50471c012ac2f5": "Articoli regalo/Souvenir",
-    "932ab0533f595ef44857e8cd918faaed7d79b084": "Negozio a prezzo fisso",
-    "8c54ce4d14dbf62b0770f100ab3e14201276fab0": "Carità",
-    "3087046de3f8946a65ba8540d8eda9e16b80abb0": "Allibratore",
-    "498f8325b5b12e858cfe03328ed9b1317a9f41d6": "Lotteria",
-    "ae50cf94450852176731ff8c00a0ec724653dd75": "Borsa",
-    "dedbe37ec5281a8d0d43e79aa6b426e45dba44b0": "Animale domestico",
-    "d6e28b14ff9cd7bb3935f763c8056faf3d6f79a9": "Foto",
-    "0196716d697307f5356f0659c3ada161fc754f46": "Pompe funebri",
-    "622abe17ab6249f3832a59aab739b09f47e5f3c1": "Distributore automatico",
-    "f374658108a3b28af9223791bd4e47e97485c2ec": "Prodotti di vendita",
-    "c801f384393e5196e59492066420a598984a5458": "Uffici",
-    "1f55300512d2c2e7d1e7dd727f42b9e8a64bf19b": "Contabile",
-    "cee5fbceeb1aa4cc1db31ea954ba506365297e83": "Amministrativo",
-    "e27a872e3158f0a5306a9c4b23c47acd2adfea28": "Agenzia pubblicitaria",
-    "ea5138e2cce97211b31499f810f2f373ee3d8085": "Architetto",
-    "7a83e28dee200ffd90175c2bec397e9bb8ab3f73": "Associazione",
-    "0fd73359ec7b3c3209cc0bc0d70cb04b210edbbd": "Compagnia privata",
-    "a966399c76a93058f68312df3eac520dd1c382db": "Istituto d'Istruzione",
-    "4a92f9cd8420f021c6442d95821987468dc00044": "Agenzia di collocamento",
-    "80647fcec97a29da9fec13e4f9faa0e70dc35976": "Agente immobiliare",
-    "7631c2d2155a3bd7bf35333a587c21742c7d8be3": "Fondazione",
-    "bb9a6e8b13591a5d37e7929fa2b79357c59908b6": "Governo",
-    "9eb67e597b6098a8b2cf5b89b4d2faa38af5160a": "Assicurazione",
-    "51122d533e861790e57f6ff6aacfd4e20ea929fc": "Specialista IT",
-    "5239b13d146d70716690fbe18270d668aeeacd56": "Avvocato",
-    "b91f160d8dd516ece414f6a270ed79f100c27767": "Giornale",
-    "1a412d542c6d935929b04d953a8471efe9e82246": "Organizzazione non governativa (OGN)",
-    "f4d29dc5ad5006c1f7e80a334cba7c213a3a1b26": "Notaio",
-    "36913568d51c0b52e7f818f72b809f11b7267bd5": "Partito politico",
-    "6664dea99ae0b975e4b3ae5c638658d206579920": "Ricerca",
-    "9f9a33cf7a1d48ad226fddb24e458ed5e43b0ca8": "Consulente fiscale",
-    "de8d04696b6e036ea05ed7a2b1c86608e5e82d0c": "Telecomunicazioni",
-    "e77de9fcc30ac4a4a3aa0b953e8b78a5944bdac0": "Artigiano",
-    "fcfe110143bce627f475cacdcdeb744d82d373dd": "Apicoltore",
-    "9dd516fc39e09084bad27604c108fde7ae10c50e": "Fabbrica di birra",
-    "0dc3743caedf40f18ed481b6ba03cf913182441d": "Azienda vinicola",
-    "727fed9b8403368032405c8c9694a538bf6748f1": "Catering",
-    "c0a79c6cc56270c03266d2d0d080ebc48f71eb87": "Tappezziere",
-    "726efb82ed8d7f9952589a68610e95a06336ae19": "Duplicato chiavi",
-    "637755e5d5ae01f0c0b775d3b653f3b9d64a7853": "Fabbro",
-    "3d3adb04aacdf0eb1884a5830f3f247137bbd50a": "Elettricista",
-    "dc1a1591cb80febc988974429d4c9a1f0a6e79ad": "Idraulico",
-    "7a5728380bde3b4a2b3d38cd8c28e1a82e71ba5f": "Sistemi di riscaldamento, ventilazione e condizionamento dell'aria",
-    "b6213d559653cfc7ebc91663e1bcb6f760288120": "Imbianchino",
-    "b4f8467588fb6d1366a73d64e60dd88cb6945752": "Piastrellista",
-    "23567c4278770b20ed9f191725d568d014453d60": "Costruzione di finestre",
-    "49eaca754d4a65756952c3e77a15a3b8f74c9ea2": "Falegname",
-    "5c9b045b84b31a07ff18c5b030ca2e7e2c976e8a": "Conciatetti",
-    "c565ec5cdc28fe77430f8ed274b7c432aee6c011": "Fotografo",
-    "c9833288981bb884ab4556473cc4dd1ff4291f43": "Artigianato",
-    "81325ec26b9d802250c3cacfcd5acdb30dbb8418": "Ceramica",
-    "fba8ff0c5f94b7c2dc2f30cd79cca1349a822b48": "Giardiniere",
-    "b0f0a68b08ae44e145a4569fe4671ced9904e1c7": "Calzolaio",
-    "efda4ead56cb01574648170afcf43badea031d51": "Segheria",
-    "d26facf1b9154b142c8c9da3a051e4f5d5d5949c": "Scalpellino",
-    "65baf858b8f4d08fc3a92464bc7501a383e9394a": "Maniscalco",
-    "97b76e5c97e640edf698a1804266e5d99109e522": "Costruzione in metallo",
-    "9445b1e398045e6a6c1feca51dce60db7a936a27": "Livello",
-    "7c8825825fb85efe285129f45a88f3c80d402ab5": "Accesso per sedia a rotelle",
-    "d78b520568d12c4a920ddecc285519636a1cbdb6": "nella direzione della salita",
-    "f845387d8700c0eca71aa4c05c7d284426c6a689": "nella direzione delle discesa",
-    "aaf6d426ff3014c40fbdbd3e9111fd714faee43b": "Privato, Solo clienti, Su permesso, Nessun accesso pubblico, Aperto al pubblico",
-    "f72c64724cb7ceaa4772ee9d82989278e778d3b0": "Scala mobile",
-    "fd118a4d3d091ee1ae670052f892e3daaf13238f": "scala mobile con direzione non specificata",
-    "b2494f66bf9d76158be1b04a12d95fe2baf90adc": "movimento nella direzione di marcia",
-    "e0def19af70ede1a1180309a7ccfad160c7ccce4": "movimento nella direzione opposta di marcia",
-    "f122c4f686d34c1c7254bd11e08bf3f3565a41df": "cambio di direzione",
-    "a0f954597569628ca4176af7b4d16ce3a0b279e3": "non una scala mobile",
-    "536c2ecc9b69d363f91596cdd53fe1cdb31a41c7": "Struttura dell'edificio",
-    "f6b43bfcf459b78caca46c61eed1ff75fabda1c6": "Stanza",
-    "d33da3827574202fd87fe590e2dbb8d0c87194b6": "Camera convenzionale con pareti",
-    "c6788df8d5cb7d884e435bd5b31efbea494951c6": "Tipo di stanza",
-    "03375837f9441d631fa0e809d7ffcfdae70cf21a": "Area senza pareti",
-    "830b634cd6d4669c643dfee2b6a5c06feaa320f2": "Parete",
-    "236d210bb33874b321166b36b0037b90ea57e548": "Parete individuale (non attraversabile), quando non è già stato definito dalla chiave/valore indoor = stanza",
-    "ea8e29bb7eece57a6cf7603b614636020a99442c": "Parete solida",
-    "de39a8dd19ab05e6bce77fdb06336e95f22dfbc6": "Porta",
-    "a072cf69a730c8606c548e9f3765e9de1b3a76ec": "Entrata dell'edificio",
-    "fe86fcdd9f31cf9008b592f60e74c52ddb673f52": "Entrata principale dell'edificio",
-    "5bccbffc8069e6763af09d8322d7b2bfc4279ff0": "Entrata secondaria per dipendenti",
-    "7d630e33300e7f36f5cf5f5508fa2b3080adcfd4": "Uscita",
-    "6fe429af5143b1c159e1e8cf2f2c6f345eb4038c": "Uscita di emergenza",
-    "af8c43ef00a4d0c9d94b05bd6b24c8897c946e07": "Ingresso che conduce ad una scala",
-    "726a7837069558d42ee36047d530b24f3ce09579": "Ingresso per una casa / appartamento privato",
-    "f3b3973cbef3e1fa0b350af14f29a88f70dd9e5c": "Tipo di ingresso non specificato",
-    "d2ffa49782089255c6b699fcfed104e2354af1be": "Non è un ingresso dell'edificio",
-    "ab88e180cc4a47fdba81abb10c446e09d2d0d7db": "Porta automatica",
-    "0f67bdbd37cd4e97d76fc44e1cb5681464a40e52": "Corridoio",
-    "fe1426fcb5ce99ca8aa92928829b9b3a90236283": "Passaggio di collegamento non protetto",
-    "7a34227bb68a6c0bb81e4d2510d653122373f6b9": "Scala",
-    "838ee0d9cc4765b88e1137e8b187c9f0c4c2ea7b": "Scale",
-    "22ae8b3f64f417ae2e0d8ac0f063692318ca29a1": "Ascensore",
-    "a2dd555ee212b68263ab0230110c8e7d4b5a4d6d": "Passerella",
-    "bb911796e522dcc2bcbcfa9e564d0197f63e78f5": "Strada di servizio",
-    "e57055ce26b9b56d96c29743d295ac30a90bec5b": "Tipo di percorso di servizio",
-    "6b29ebc5bfe4639f798dfd3b094fb00d7894a4b5": "Livello di collegamento",
-    "78e513dc3b9d44ab4f4a3ed2b536aa72a4256d9b": "Tavolo",
-    "0c0fe7dcab398596f5c7c950638322b748856c4d": "Lunghezza (metri)",
-    "07b6b9637911d53eda7e468d1e175aa0200738f4": "Sedia",
-    "781f52ec5b1abf5196cb3a0781de8c5fd33ec8af": "Mensola"
-  }
-}

+ 0 - 164
src/config/locales/ui/cn.json

@@ -1,164 +0,0 @@
-{
-  "en": {
-    "add_another_floor_part_d2e818cb": "添加另一个楼层部件",
-    "add_features_1ec54938": "添加功能",
-    "add_level_information_4713bb49": "添加级别信息",
-    "aerial_imagery_7a97acbc": "航空图像",
-    "all_buildings_33780621": "所有建筑",
-    "an_error_happened_when_searching_address_please_re_70aa298e": "An error happened when searching address. Please retry.",
-    "analyzing_your_changes_3db6e606": "Analyzing your changes...",
-    "apply_again_last_cancelled_operation_b8e652e6": "Apply again last cancelled operation",
-    "are_you_sure_you_want_to_delete_this_feature_you_c_39341ba5": "Are you sure you want to delete this feature ? You can either cancel this operation, delete only the contour of the feature, or delete the feature and everything inside (quite dangerous).",
-    "area_935a0975": "区域",
-    "back_2900f52a": "返回",
-    "background_1bc88842": "背景",
-    "building_5e8a3c1d": "建筑",
-    "building_b_levels_lvl_27dc4fac": "建筑 %{b} (级别 : %{lvl})",
-    "can_t_download_data_from_osm_server_please_retry_l_84cdaef9": "Can't download data from OSM server. Please retry later.",
-    "cancel_caeb1e68": "取消",
-    "cancel_last_operation_aba24851": "取消上一个操作",
-    "changeset_comment_b8439548": "Changeset comment",
-    "changeset_tags_e05307a0": "Changeset tags",
-    "click_on_the_map_to_start_drawing_the_feature_fd11baf7": "Click on the map to start drawing the feature",
-    "click_to_start_creating_a_new_building_from_scratc_e1f51bdb": "Click to start creating a new building from scratch",
-    "confirm_delete_of_f_6193d2e": "Confirm delete of %{f}",
-    "copy_level_73e49f32": "复制级别",
-    "copy_position_of_this_plan_26664c0a": "Copy position of this plan",
-    "copy_selected_level_data_in_the_current_level_9dec4af9": "Copy selected level data in the current level",
-    "create_a_new_floor_part_in_this_level_useful_for_g_dffe9516": "Create a new floor part in this level. Useful for giving different names to parts of a single level.",
-    "create_a_new_level_on_top_of_existing_ones_a5d88094": "Create a new level on top of existing ones",
-    "create_a_new_level_under_existing_ones_9b7fa708": "Create a new level under existing ones",
-    "custom_imagery_d88b2f98": "Custom imagery",
-    "custom_imagery_url_d44a400f": "Custom imagery URL",
-    "delete_everything_461bbc02": "Delete everything",
-    "delete_only_contour_7874606c": "Delete only contour",
-    "delete_this_building_217b1627": "Delete this building",
-    "delete_this_feature_329c0cb1": "Delete this feature",
-    "delete_this_floor_part_36ba9604": "Delete this floor part",
-    "delete_this_plan_39fd69cc": "Delete this plan",
-    "describe_briefly_but_explicitely_your_edits_requir_574b3a37": "Describe briefly but explicitely your edits (required)",
-    "did_you_save_all_your_changes_if_not_your_changes__edcf56f5": "Did you save all your changes ? If not, your changes will be lost.",
-    "distort_this_plan_40d437b4": "Distort this plan",
-    "done_54e3d4b6": "Done",
-    "drag_and_drop_your_images_here_or_click_to_open_fi_1c35713a": "Drag and drop your images here (or click to open file browser)",
-    "draw_this_floor_outline_89b57f0": "Draw this floor outline",
-    "edit_buildings_3a6fbbbf": "编辑建筑",
-    "edit_features_102eb3e9": "编辑功能",
-    "edit_features_name_c0b3f15a": "编辑建筑 (%{name})",
-    "edit_levels_outlines_name_9f925e60": "Edit levels outlines (%{name})",
-    "edit_map_d2428083": "编辑地图",
-    "edit_objects_contained_in_this_floor_ddeb4d47": "Edit objects contained in this floor",
-    "edit_outlines_64c7c954": "Edit outlines",
-    "edit_this_feature_ec33045a": "Edit this feature",
-    "edit_this_single_building_e4e0b8f6": "Edit this single building",
-    "edited_building_indoors_c5d46c": "Edited building indoors",
-    "emergency_map_1f6cbcf6": "Emergency map",
-    "features_level_lvl_e8c7edfc": "Features (level %{lvl})",
-    "floor_outlines_are_missing_fb5bddf6": "Floor outlines are missing",
-    "floor_plan_2d84db57": "Floor plan",
-    "floors_served_e84c1de4": "Floors served",
-    "for_long_but_not_large_features_63744737": "For long but not large features",
-    "for_small_features_size_less_than_2_meters_8412f8fb": "For small features (size less than 2 meters)",
-    "for_wide_features_surface_of_more_than_a_few_m_2da8616d": "For wide features (surface of more than a few m²)",
-    "geometry_outside_of_the_bounds_5c1da8c6": "Geometry outside of the bounds",
-    "go_back_to_building_selection_e155cec2": "Go back to building selection",
-    "go_back_to_editing_9300435c": "Go back to editing",
-    "go_back_to_editing_and_create_levels_outline_by_yo_e3e08921": "Go back to editing and create levels outline by yourself (recommended for complex buildings)",
-    "go_back_to_map_explorer_3e29368": "Go back to map explorer",
-    "ground_survey_df1399ae": "Ground survey",
-    "height_in_meters_38f77fb1": "Height (in meters)",
-    "help_4c4968b1": "Help",
-    "i_would_like_someone_to_review_my_edits_3ebac0a4": "I would like someone to review my edits",
-    "ignore_this_fd62cb5c": "Ignore this",
-    "ignore_this_warning_and_do_not_create_missing_leve_7aa9d23e": "Ignore this warning and do not create missing level outlines (not recommended)",
-    "imagery_a5c2904e": "Imagery",
-    "import_floor_plans_d80df63c": "Import floor plans",
-    "level_5fdf654a": "Level",
-    "level_lvl_7bb23fb1": "Level %{lvl}",
-    "levels_structure_level_lvl_aab3eddf": "Levels structure (level %{lvl})",
-    "line_95da80eb": "Line",
-    "list_all_sources_you_have_used_to_make_your_edits__b3622648": "List all sources you have used to make your edits (recommended)",
-    "loading_25990131": "Loading...",
-    "local_knowledge_b4f676d": "Local knowledge",
-    "login_or_create_account_b27ad227": "Login or create account",
-    "move_this_plan_to_copied_position_1bfd523e": "Move this plan to copied position",
-    "name_1aed4a1b": "Name",
-    "new_below_level_3d5af6df": "New below level",
-    "new_building_3fe98ea5": "New building",
-    "new_feature_9f6cad45": "New feature",
-    "new_floor_part_level_lvl_f9fd47da": "New floor part (level %{lvl})",
-    "new_upper_level_f21cef31": "New upper level",
-    "no_e16d9132": "No",
-    "no_selected_building_f3bff32c": "no selected building",
-    "number_of_levels_above_ground_roof_excluded_here_b_54f3d7da": "Number of levels above ground (roof excluded), here B + C + D = 3 levels",
-    "number_of_levels_completely_underground_here_e_1_l_73035260": "Number of levels completely underground, here E = 1 level",
-    "number_of_levels_under_roof_54fb5ef5": "Number of levels under roof",
-    "number_of_levels_under_the_roof_here_a_1_level_b18fea4c": "Number of levels under the roof, here A = 1 level",
-    "number_of_overground_levels_roof_excluded_ea5f28dd": "Number of overground levels (roof excluded)",
-    "number_of_underground_levels_5e49cfdc": "Number of underground levels",
-    "ok_c47544a2": "OK",
-    "oops_something_went_wrong_when_trying_to_log_you_i_97c911b6": "Oops ! Something went wrong when trying to log you in",
-    "oops_there_was_an_error_during_upload_f711b0f5": "Oops ! There was an error during upload...",
-    "opacity_a9787d84": "Opacity",
-    "openstreetmap_server_can_t_be_contacted_check_your_2268173": "OpenStreetMap server can't be contacted. Check your Internet connection and retry in a few minutes.",
-    "overlay_537a2c5c": "Overlay",
-    "please_choose_a_level_8e7c0347": "Please choose a level",
-    "please_select_how_you_want_to_represent_your_featu_fa7164b4": "Please select how you want to represent your feature.",
-    "please_select_the_floor_part_to_edit_using_the_map_e625fbfb": "Please select the floor part to edit using the map.",
-    "please_zoom_in_to_edit_data_7665ee0e": "Please zoom-in to edit data",
-    "point_72905a7d": "Point",
-    "preview_53003fd2": "Preview",
-    "preview_your_changes_on_indoor_cdc4ed41": "Preview your changes on indoor=",
-    "relative_floor_level_height_in_meters_6ff77df4": "Relative floor level height in meters",
-    "rotate_this_plan_7e160b6c": "Rotate this plan",
-    "save_11a80ec3": "Save",
-    "save_positionning_of_floor_plans_dc92bdde": "Save positionning of floor plans",
-    "scale_this_plan_cce6eeea": "Scale this plan",
-    "schema_explaining_how_should_be_set_amount_of_leve_dd0387a6": "Schema explaining how should be set amount of levels",
-    "schema_explaining_how_should_be_set_level_height_61aedc69": "Schema explaining how should be set level height",
-    "search_a_city_street_c591f2f6": "Search a city, street...",
-    "search_a_type_of_feature_339e8c43": "Search a type of feature...",
-    "searching_address_cc9a4350": "Searching address...",
-    "see_feature_history_on_openstreetmap_c9d451c2": "See feature history on OpenStreetMap",
-    "see_your_changes_on_openstreetmap_57e092a9": "See your changes on OpenStreetMap",
-    "select_a_preset_7a7db9a2": "Select a preset",
-    "selected_building_b076e8bd": "Selected building",
-    "selected_floor_b2f117a4": "Selected floor",
-    "send_changes_to_openstreetmap_2a56f963": "Send changes to OpenStreetMap",
-    "send_e3bd0ed0": "Send",
-    "send_your_changes_to_openstreetmap_9c74e15a": "Send your changes to OpenStreetMap",
-    "some_of_your_edits_could_have_been_lost_please_rel_5446e8c": "Some of your edits could have been lost, please reload and retry.",
-    "sources_38d87510": "Sources",
-    "square_this_building_2cea27a7": "Square this building",
-    "square_this_feature_cec7b23b": "Square this feature",
-    "square_this_floor_part_5ce703e4": "Square this floor part",
-    "street_level_imagery_2158b370": "Street-level imagery",
-    "structure_4c887763": "Structure",
-    "supported_formats_jpeg_png_imagery_json_3bfc7689": "Supported formats: JPEG, PNG, Imagery JSON",
-    "surrounded_by_walls_d4b4ec40": "Surrounded by walls",
-    "thanks_for_your_contribution_3c790eea": "Thanks for your contribution !",
-    "the_editor_doesn_t_support_yet_this_kind_of_comple_46362064": "The editor doesn't support yet this kind of complex geometry editing.",
-    "the_feature_contour_you_just_edited_is_partially_o_7cbfd0ed": "The feature contour you just edited is partially or completely outside of the level contour. Please make sure that the feature contour is mostly contained in the floor.",
-    "the_level_contour_you_just_edited_is_partially_or__870ff4e4": "The level contour you just edited is partially or completely outside of the building contour. Please make sure that the level contour is mostly contained in the building.",
-    "these_buildings_lack_some_floor_outlines_1ed7986f": "These buildings lack some floor outlines :",
-    "these_floor_outlines_are_optional_in_osm_but_are_u_c6e53110": "These floor outlines are optional in OSM, but are useful for various tools people use.",
-    "this_level_doesn_t_have_a_precise_floor_outline_de_d08cb793": "This level doesn't have a precise floor outline defined yet.",
-    "to_edit_map_data_you_need_to_connect_first_using_a_a0c85c4e": "To edit map data, you need to connect first using an OpenStreetMap account.",
-    "to_make_your_floor_plans_appear_correctly_when_edi_ceafcc87": "To make your floor plans appear correctly when editing indoors, please make sure you set on which level they should show up on the left panel.",
-    "to_view_and_edit_map_data_you_need_to_connect_firs_959b4121": "To view and edit map data, you need to connect first using an OpenStreetMap account.",
-    "total_height_in_meters_e6951830": "Total height (in meters)",
-    "type_of_building_dac64a5d": "Type of building",
-    "unknown_47a3b725": "Unknown",
-    "uploading_your_changes_b681c4b9": "Uploading your changes...",
-    "usage_15def729": "Usage",
-    "use_building_ones_79c60f86": "Use building ones",
-    "use_building_outline_as_default_level_outline_reco_22a90106": "Use building outline as default level outline (recommended for simple buildings)",
-    "use_the_whole_building_footprint_8dfe5828": "Use the whole building footprint",
-    "yes_dde87d5": "Yes",
-    "you_can_draw_your_feature_on_the_map_click_on_done_ee804fa9": "You can draw your feature on the map. Click on done button or click again on last node you created to finish.",
-    "you_can_use_any_tms_like_url_afc72061": "You can use any TMS-like URL",
-    "you_have_the_choice_between_following_options_b69ea4b4": "You have the choice between following options :",
-    "you_have_to_give_us_more_details_about_your_change_c3d8b397": "You have to give us more details about your changes using Changeset comment text field.",
-    "your_edits_75881b31": "Your edits"
-  }
-}

+ 0 - 164
src/config/locales/ui/de.json

@@ -1,164 +0,0 @@
-{
-  "de": {
-    "add_another_floor_part_d2e818cb": "Weiteren Stockwerksteil hinzufügen",
-    "add_features_1ec54938": "Objekte hinzufügen",
-    "add_level_information_4713bb49": "Stockwerksinformationen hinzufügen",
-    "aerial_imagery_7a97acbc": "Luftaufnahmen",
-    "all_buildings_33780621": "Alle Gebäude",
-    "an_error_happened_when_searching_address_please_re_70aa298e": "Bei der Adresssuche ist ein Fehler aufgetreten. Bitte erneut versuchen.",
-    "analyzing_your_changes_3db6e606": "Deine Änderungen werden analysiert...",
-    "apply_again_last_cancelled_operation_b8e652e6": "Die letzte abgebrochene Aktion noch einmal anwenden",
-    "are_you_sure_you_want_to_delete_this_feature_you_c_39341ba5": "Bist Du sicher, dass Du dieses Objekt löschen möchtest? Du kannst diesen Vorgang entweder abbrechen, nur die Kontur dieses Objekts löschen oder das Objekt und alles, was darin enthalten ist, entfernen (sehr gefährlich).",
-    "area_935a0975": "Gebiet",
-    "back_2900f52a": "Rückseite",
-    "background_1bc88842": "Hintergrund",
-    "building_5e8a3c1d": "Gebäude",
-    "building_b_levels_lvl_27dc4fac": "Gebäude %{b} (Stockwerke: %{lvl})",
-    "can_t_download_data_from_osm_server_please_retry_l_84cdaef9": "Die Daten konnten nicht vom OSM-Server heruntergeladen werden. Bitte später nochmal versuchen.",
-    "cancel_caeb1e68": "Abbrechen",
-    "cancel_last_operation_aba24851": "Letzten Vorgang abbrechen",
-    "changeset_comment_b8439548": "Kommentar zur Änderungssatzung",
-    "changeset_tags_e05307a0": "Änderungssatzungstags",
-    "click_on_the_map_to_start_drawing_the_feature_fd11baf7": "Auf die Karte klicken, um ein Objekt zu zeichnen",
-    "click_to_start_creating_a_new_building_from_scratc_e1f51bdb": "Klicken, um ein neues Gebäude zu erstellen",
-    "confirm_delete_of_f_6193d2e": "Löschen von %{f} bestätigen",
-    "copy_level_73e49f32": "Stockwerk kopieren",
-    "copy_position_of_this_plan_26664c0a": "Position dieses Plans kopieren",
-    "copy_selected_level_data_in_the_current_level_9dec4af9": "Ausgwählte Stockwerksdatan in das aktuelle Stockwerk kopieren",
-    "create_a_new_floor_part_in_this_level_useful_for_g_dffe9516": "Neuen Grundrissplan in diesem Stockwerk anlegen. Hilfreich, um Teilen eines Stockwerkes verschiedene Namen zu geben.",
-    "create_a_new_level_on_top_of_existing_ones_a5d88094": "Neues Stockwerk über bereits existierenden erstellen",
-    "create_a_new_level_under_existing_ones_9b7fa708": "Neues Stockwerk unter bereits existierenden erstellen",
-    "custom_imagery_d88b2f98": "Eigene Bilder",
-    "custom_imagery_url_d44a400f": "URL für eigene Bilder",
-    "delete_everything_461bbc02": "Alles löschen",
-    "delete_only_contour_7874606c": "Nur die Kontur löschen",
-    "delete_this_building_217b1627": "Dieses Gebäude löschen",
-    "delete_this_feature_329c0cb1": "Dieses Objekt löschen",
-    "delete_this_floor_part_36ba9604": "Diesen Stockwerksteil löschen",
-    "delete_this_plan_39fd69cc": "Diesen Plan löschen",
-    "describe_briefly_but_explicitely_your_edits_requir_574b3a37": "Beschreibe Deine Änderungen kurz, aber deutlich (erforderlich)",
-    "did_you_save_all_your_changes_if_not_your_changes__edcf56f5": "Hast Du all Deine Änderungen gespeichert? Falls nicht, werden Deine Änderungen verloren gehen.",
-    "distort_this_plan_40d437b4": "Diesen Plan verzerren",
-    "done_54e3d4b6": "Erledigt",
-    "drag_and_drop_your_images_here_or_click_to_open_fi_1c35713a": "Eigene Bilder hier per Drag and Drop ablegen (oder Klicken um den Dateibrowser zu öffnen)",
-    "draw_this_floor_outline_89b57f0": "Umriss dieses Stockwerks zeichnen",
-    "edit_buildings_3a6fbbbf": "Gebäude bearbeiten",
-    "edit_features_102eb3e9": "Objekte bearbeiten",
-    "edit_features_name_c0b3f15a": "Objekte bearbeiten (%{name})",
-    "edit_levels_outlines_name_9f925e60": "Stockwerksumriss bearbeiten (%{name})",
-    "edit_map_d2428083": "Karte bearbeiten",
-    "edit_objects_contained_in_this_floor_ddeb4d47": "Objekte innerhalb dieses Stockwerkes bearbeiten",
-    "edit_outlines_64c7c954": "Umrisse bearbeiten",
-    "edit_this_feature_ec33045a": "Dieses Objekt bearbeiten",
-    "edit_this_single_building_e4e0b8f6": "Nur dieses Gebäude bearbeiten",
-    "edited_building_indoors_c5d46c": "Gebäude innen bearbeitet",
-    "emergency_map_1f6cbcf6": "Flucht- und Rettungsplan",
-    "features_level_lvl_e8c7edfc": "Objekte (Stockwerk %{lvl})",
-    "floor_outlines_are_missing_fb5bddf6": "Umrisse des Stockwerks fehlen",
-    "floor_plan_2d84db57": "Grundrissplan",
-    "floors_served_e84c1de4": "Bediente Stockwerke",
-    "for_long_but_not_large_features_63744737": "Für lange, aber kleine Objekte",
-    "for_small_features_size_less_than_2_meters_8412f8fb": "Für kleine Objekte (weniger als 2 Meter groß)",
-    "for_wide_features_surface_of_more_than_a_few_m_2da8616d": "Für breite Objekte (Fläche größer als einige m²)",
-    "geometry_outside_of_the_bounds_5c1da8c6": "Geometrisches Objekt liegt außerhalb der Begrenzungen",
-    "go_back_to_building_selection_e155cec2": "Zurück zur Gebäudeauswahl gehen",
-    "go_back_to_editing_9300435c": "Zurück zur Bearbeitung",
-    "go_back_to_editing_and_create_levels_outline_by_yo_e3e08921": "Zurück zum Bearbeiten gehen und die Umrisse der Stockwerke selbst erstellen (für komplexe Gebäude empfohlen)",
-    "go_back_to_map_explorer_3e29368": "Zurück zur Kartenübersicht",
-    "ground_survey_df1399ae": "Vor Ort begutachtet",
-    "height_in_meters_38f77fb1": "Höhe (in Metern)",
-    "help_4c4968b1": "Hilfe",
-    "i_would_like_someone_to_review_my_edits_3ebac0a4": "I would like someone to review my edits",
-    "ignore_this_fd62cb5c": "Ignorieren",
-    "ignore_this_warning_and_do_not_create_missing_leve_7aa9d23e": "Diese Warnung ignorieren und keine fehlenden Stockwerksumrisse erstellen (nicht empfohlen)",
-    "imagery_a5c2904e": "Bilder",
-    "import_floor_plans_d80df63c": "Grundrissplan importieren",
-    "level_5fdf654a": "Stockwerk",
-    "level_lvl_7bb23fb1": "Stockwerk %{lvl}",
-    "levels_structure_level_lvl_aab3eddf": "Stockwerksstruktur (Stockwerk %{lvl})",
-    "line_95da80eb": "Linie",
-    "list_all_sources_you_have_used_to_make_your_edits__b3622648": "Liste alle Quellen auf, die Du bei deinen Bearbeitungen verwendet hast (empfohlen)",
-    "loading_25990131": "Lädt...",
-    "local_knowledge_b4f676d": "Ortskenntnis",
-    "login_or_create_account_b27ad227": "Einloggen oder Konto erstellen",
-    "move_this_plan_to_copied_position_1bfd523e": "Diesen Plan zur kopierten Position verschieben",
-    "name_1aed4a1b": "Name",
-    "new_below_level_3d5af6df": "Neues Stockwerk unterhalb",
-    "new_building_3fe98ea5": "Neues Gebäude",
-    "new_feature_9f6cad45": "Neues Objekt",
-    "new_floor_part_level_lvl_f9fd47da": "Neuer Stockwerksteil (Stockwerk ${lvl})",
-    "new_upper_level_f21cef31": "Neues Stockwerk oberhalb",
-    "no_e16d9132": "Nein",
-    "no_selected_building_f3bff32c": "Kein ausgewähltes Gebäude",
-    "number_of_levels_above_ground_roof_excluded_here_b_54f3d7da": "Anzahl der oberirdischen Stockwerke (ohne Dach), hier B + C + D = 3 Stockwerke",
-    "number_of_levels_completely_underground_here_e_1_l_73035260": "Anzahl der vollständig unterirdischen Stockwerke, hier E = 1 Stockwerk",
-    "number_of_levels_under_roof_54fb5ef5": "Anzahl der Stockwerke unter dem Dach",
-    "number_of_levels_under_the_roof_here_a_1_level_b18fea4c": "Anzahl der Stockwerke unter dem Dach, hier A = 1 Stockwerk",
-    "number_of_overground_levels_roof_excluded_ea5f28dd": "Anzahl der oberirdischen Stockwerke (ohne Dach)",
-    "number_of_underground_levels_5e49cfdc": "Anzahl der unterirdischen Stockwerke",
-    "ok_c47544a2": "OK",
-    "oops_something_went_wrong_when_trying_to_log_you_i_97c911b6": "Ups! Etwas ist beim Versuch, Dich einzuloggen, schiefgegangen",
-    "oops_there_was_an_error_during_upload_f711b0f5": "Ups! Es gab einen Fehler beim Hochladen...",
-    "opacity_a9787d84": "Transparenz",
-    "openstreetmap_server_can_t_be_contacted_check_your_2268173": "Der OpenStreetMap-Server kann nicht erreicht werden. Überprüfe Deine Internetverbindung und versuche es in ein paar Minuten erneut.",
-    "overlay_537a2c5c": "Überlagerung",
-    "please_choose_a_level_8e7c0347": "Bitte wähle ein Stockwerk",
-    "please_select_how_you_want_to_represent_your_featu_fa7164b4": "Bitte wähle aus, wie Dein Objekt dargestellt werden soll.",
-    "please_select_the_floor_part_to_edit_using_the_map_e625fbfb": "Bitte wähle den Teil des Stockwerkes aus, den Du mithilfe der Karte bearbeiten möchtest.",
-    "please_zoom_in_to_edit_data_7665ee0e": "Zum Bearbeiten bitte hineinzoomen",
-    "point_72905a7d": "Punkt",
-    "preview_53003fd2": "Preview",
-    "preview_your_changes_on_indoor_cdc4ed41": "Preview your changes on indoor=",
-    "relative_floor_level_height_in_meters_6ff77df4": "Relative Stockwerkshöhe in Metern",
-    "rotate_this_plan_7e160b6c": "Plan drehen",
-    "save_11a80ec3": "Speichern",
-    "save_positionning_of_floor_plans_dc92bdde": "Positionierung der Grundrisspläne speichern",
-    "scale_this_plan_cce6eeea": "Plan skalieren",
-    "schema_explaining_how_should_be_set_amount_of_leve_dd0387a6": "Zeichnung, die erklärt, wie die Anzahl der Stockwerke angegeben werden sollte",
-    "schema_explaining_how_should_be_set_level_height_61aedc69": "Zeichnung, die erklärt, wie die Stockwerkshöhe angegeben werden sollte",
-    "search_a_city_street_c591f2f6": "Suche nach einer Stadt, Straße...",
-    "search_a_type_of_feature_339e8c43": "Suche nach dem Typ eines Objekts...",
-    "searching_address_cc9a4350": "Suche Adresse...",
-    "see_feature_history_on_openstreetmap_c9d451c2": "Versionen dieses Objekts auf OpenStreetMap anzeigen",
-    "see_your_changes_on_openstreetmap_57e092a9": "Deine Änderungen auf OpenStreetMap ansehen",
-    "select_a_preset_7a7db9a2": "Vorlage wählen",
-    "selected_building_b076e8bd": "Ausgewähltes Gebäude",
-    "selected_floor_b2f117a4": "Ausgewähltes Stockwerk",
-    "send_changes_to_openstreetmap_2a56f963": "Änderungen an OpenStreetMap schicken",
-    "send_e3bd0ed0": "Abschicken",
-    "send_your_changes_to_openstreetmap_9c74e15a": "Schicke Deine Änderungen an OpenStreetMap",
-    "some_of_your_edits_could_have_been_lost_please_rel_5446e8c": "Einige Deiner Änderungen könnten möglicherweise verloren gegangen sein, bitte lade die Seite nochmals und versuche es erneut.",
-    "sources_38d87510": "Quellen",
-    "square_this_building_2cea27a7": "Gebäude rechtwinklig machen",
-    "square_this_feature_cec7b23b": "Dieses Objekt rechtwinklig machen",
-    "square_this_floor_part_5ce703e4": "Diesen Stockwerksteil rechteckig machen",
-    "street_level_imagery_2158b370": "Straßenbilder",
-    "structure_4c887763": "Struktur",
-    "supported_formats_jpeg_png_imagery_json_3bfc7689": "Unterstütze Formate: JPEG, PNG, Imagery JSON",
-    "surrounded_by_walls_d4b4ec40": "Von Wänden umgeben",
-    "thanks_for_your_contribution_3c790eea": "Danke für Deinen Beitrag!",
-    "the_editor_doesn_t_support_yet_this_kind_of_comple_46362064": "Der Editor unterstützt diese Art von komplexen Geometriebearbeitungen noch nicht.",
-    "the_feature_contour_you_just_edited_is_partially_o_7cbfd0ed": "Der gerade bearbeitete Umriss ist teilweise oder vollständig außerhalb des Stockwerksumrisses. Bitte stelle sicher, dass der Umriss weitestgehend innerhalb des Stockwerkes liegt.",
-    "the_level_contour_you_just_edited_is_partially_or__870ff4e4": "Der gerade bearbeitete Umriss ist teilweise oder vollständig außerhalb des Gebäudeumrisses. Bitte stelle sicher, dass der Umriss weitestgehend innerhalb des Gebäudes liegt.",
-    "these_buildings_lack_some_floor_outlines_1ed7986f": "Diesen Gebäude fehlen einige Stockwerksumrisse:",
-    "these_floor_outlines_are_optional_in_osm_but_are_u_c6e53110": "Diese Stockwerksumrisse sind in OSM optional, aber nützlich für verschiedene genutzte Werkzeuge.",
-    "this_level_doesn_t_have_a_precise_floor_outline_de_d08cb793": "Dieses Stockwerk hat noch keinen genauen Umriss definiert.",
-    "to_edit_map_data_you_need_to_connect_first_using_a_a0c85c4e": "Um Daten bearbeiten zu können, musst Du Dich erst mit einem OpenStreetMap-Konto anmelden.",
-    "to_make_your_floor_plans_appear_correctly_when_edi_ceafcc87": "Denke bitte daran, auf der linken Seite auszuwählen, in welchem Stockwerk welche Grundrisse angezeigt werden sollen.",
-    "to_view_and_edit_map_data_you_need_to_connect_firs_959b4121": "Um Daten bearbeiten und anzeigen zu können, musst Du Dich erst mit einem OpenStreetMap-Konto anmelden.",
-    "total_height_in_meters_e6951830": "Gesamthöhe (in Metern)",
-    "type_of_building_dac64a5d": "Art des Gebäudes",
-    "unknown_47a3b725": "Unbekannt",
-    "uploading_your_changes_b681c4b9": "Deine Änderungen werden hochgeladen...",
-    "usage_15def729": "Nutzung",
-    "use_building_ones_79c60f86": "Die des Gebäudes verwenden",
-    "use_building_outline_as_default_level_outline_reco_22a90106": "Nutze den Umriss des Gebäudes als Standardumriss für Stockwerke (empfohlen bei einfachen Gebäuden)",
-    "use_the_whole_building_footprint_8dfe5828": "Den vollständigen Gebäudeumriss verwenden",
-    "yes_dde87d5": "Ja",
-    "you_can_draw_your_feature_on_the_map_click_on_done_ee804fa9": "Du kannst das Objekt auf der Karte zeichnen. Klicke auf \"Erledigt\" oder nochmal auf den letzten von Dir erstellten Knoten, wenn Du fertig bist.",
-    "you_can_use_any_tms_like_url_afc72061": "Du kannst jede TMS-ähnliche URL verwenden",
-    "you_have_the_choice_between_following_options_b69ea4b4": "Du kannst zwischen folgenden Optionen wählen:",
-    "you_have_to_give_us_more_details_about_your_change_c3d8b397": "Bitte gib mehr Details zu Deinen Änderungen in das Kommentarfeld für Änderungssätze ein.",
-    "your_edits_75881b31": "Deine Änderungen"
-  }
-}

+ 0 - 164
src/config/locales/ui/default.json

@@ -1,164 +0,0 @@
-{
-  "default": {
-    "add_another_floor_part_d2e818cb": "Add another floor part",
-    "add_features_1ec54938": "Add features",
-    "add_level_information_4713bb49": "Add level information",
-    "aerial_imagery_7a97acbc": "Aerial imagery",
-    "all_buildings_33780621": "All buildings",
-    "an_error_happened_when_searching_address_please_re_70aa298e": "An error happened when searching address. Please retry.",
-    "analyzing_your_changes_3db6e606": "Analyzing your changes...",
-    "apply_again_last_cancelled_operation_b8e652e6": "Apply again last cancelled operation",
-    "are_you_sure_you_want_to_delete_this_feature_you_c_39341ba5": "Are you sure you want to delete this feature ? You can either cancel this operation, delete only the contour of the feature, or delete the feature and everything inside (quite dangerous).",
-    "area_935a0975": "Area",
-    "back_2900f52a": "Back",
-    "background_1bc88842": "Background",
-    "building_5e8a3c1d": "Building",
-    "building_b_levels_lvl_27dc4fac": "Building %{b} (levels : %{lvl})",
-    "can_t_download_data_from_osm_server_please_retry_l_84cdaef9": "Can't download data from OSM server. Please retry later.",
-    "cancel_caeb1e68": "Cancel",
-    "cancel_last_operation_aba24851": "Cancel last operation",
-    "changeset_comment_b8439548": "Changeset comment",
-    "changeset_tags_e05307a0": "Changeset tags",
-    "click_on_the_map_to_start_drawing_the_feature_fd11baf7": "Click on the map to start drawing the feature",
-    "click_to_start_creating_a_new_building_from_scratc_e1f51bdb": "Click to start creating a new building from scratch",
-    "confirm_delete_of_f_6193d2e": "Confirm delete of %{f}",
-    "copy_level_73e49f32": "Copy level",
-    "copy_position_of_this_plan_26664c0a": "Copy position of this plan",
-    "copy_selected_level_data_in_the_current_level_9dec4af9": "Copy selected level data in the current level",
-    "create_a_new_floor_part_in_this_level_useful_for_g_dffe9516": "Create a new floor part in this level. Useful for giving different names to parts of a single level.",
-    "create_a_new_level_on_top_of_existing_ones_a5d88094": "Create a new level on top of existing ones",
-    "create_a_new_level_under_existing_ones_9b7fa708": "Create a new level under existing ones",
-    "custom_imagery_d88b2f98": "Custom imagery",
-    "custom_imagery_url_d44a400f": "Custom imagery URL",
-    "delete_everything_461bbc02": "Delete everything",
-    "delete_only_contour_7874606c": "Delete only contour",
-    "delete_this_building_217b1627": "Delete this building",
-    "delete_this_feature_329c0cb1": "Delete this feature",
-    "delete_this_floor_part_36ba9604": "Delete this floor part",
-    "delete_this_plan_39fd69cc": "Delete this plan",
-    "describe_briefly_but_explicitely_your_edits_requir_574b3a37": "Describe briefly but explicitely your edits (required)",
-    "did_you_save_all_your_changes_if_not_your_changes__edcf56f5": "Did you save all your changes ? If not, your changes will be lost.",
-    "distort_this_plan_40d437b4": "Distort this plan",
-    "done_54e3d4b6": "Done",
-    "drag_and_drop_your_images_here_or_click_to_open_fi_1c35713a": "Drag and drop your images here (or click to open file browser)",
-    "draw_this_floor_outline_89b57f0": "Draw this floor outline",
-    "edit_buildings_3a6fbbbf": "Edit buildings",
-    "edit_features_102eb3e9": "Edit features",
-    "edit_features_name_c0b3f15a": "Edit features (%{name})",
-    "edit_levels_outlines_name_9f925e60": "Edit levels outlines (%{name})",
-    "edit_map_d2428083": "Edit map",
-    "edit_objects_contained_in_this_floor_ddeb4d47": "Edit objects contained in this floor",
-    "edit_outlines_64c7c954": "Edit outlines",
-    "edit_this_feature_ec33045a": "Edit this feature",
-    "edit_this_single_building_e4e0b8f6": "Edit this single building",
-    "edited_building_indoors_c5d46c": "Edited building indoors",
-    "emergency_map_1f6cbcf6": "Emergency map",
-    "features_level_lvl_e8c7edfc": "Features (level %{lvl})",
-    "floor_outlines_are_missing_fb5bddf6": "Floor outlines are missing",
-    "floor_plan_2d84db57": "Floor plan",
-    "floors_served_e84c1de4": "Floors served",
-    "for_long_but_not_large_features_63744737": "For long but not large features",
-    "for_small_features_size_less_than_2_meters_8412f8fb": "For small features (size less than 2 meters)",
-    "for_wide_features_surface_of_more_than_a_few_m_2da8616d": "For wide features (surface of more than a few m²)",
-    "geometry_outside_of_the_bounds_5c1da8c6": "Geometry outside of the bounds",
-    "go_back_to_building_selection_e155cec2": "Go back to building selection",
-    "go_back_to_editing_9300435c": "Go back to editing",
-    "go_back_to_editing_and_create_levels_outline_by_yo_e3e08921": "Go back to editing and create levels outline by yourself (recommended for complex buildings)",
-    "go_back_to_map_explorer_3e29368": "Go back to map explorer",
-    "ground_survey_df1399ae": "Ground survey",
-    "height_in_meters_38f77fb1": "Height (in meters)",
-    "help_4c4968b1": "Help",
-    "i_would_like_someone_to_review_my_edits_3ebac0a4": "I would like someone to review my edits",
-    "ignore_this_fd62cb5c": "Ignore this",
-    "ignore_this_warning_and_do_not_create_missing_leve_7aa9d23e": "Ignore this warning and do not create missing level outlines (not recommended)",
-    "imagery_a5c2904e": "Imagery",
-    "import_floor_plans_d80df63c": "Import floor plans",
-    "level_5fdf654a": "Level",
-    "level_lvl_7bb23fb1": "Level %{lvl}",
-    "levels_structure_level_lvl_aab3eddf": "Levels structure (level %{lvl})",
-    "line_95da80eb": "Line",
-    "list_all_sources_you_have_used_to_make_your_edits__b3622648": "List all sources you have used to make your edits (recommended)",
-    "loading_25990131": "Loading...",
-    "local_knowledge_b4f676d": "Local knowledge",
-    "login_or_create_account_b27ad227": "Login or create account",
-    "move_this_plan_to_copied_position_1bfd523e": "Move this plan to copied position",
-    "name_1aed4a1b": "Name",
-    "new_below_level_3d5af6df": "New below level",
-    "new_building_3fe98ea5": "New building",
-    "new_feature_9f6cad45": "New feature",
-    "new_floor_part_level_lvl_f9fd47da": "New floor part (level %{lvl})",
-    "new_upper_level_f21cef31": "New upper level",
-    "no_e16d9132": "No",
-    "no_selected_building_f3bff32c": "no selected building",
-    "number_of_levels_above_ground_roof_excluded_here_b_54f3d7da": "Number of levels above ground (roof excluded), here B + C + D = 3 levels",
-    "number_of_levels_completely_underground_here_e_1_l_73035260": "Number of levels completely underground, here E = 1 level",
-    "number_of_levels_under_roof_54fb5ef5": "Number of levels under roof",
-    "number_of_levels_under_the_roof_here_a_1_level_b18fea4c": "Number of levels under the roof, here A = 1 level",
-    "number_of_overground_levels_roof_excluded_ea5f28dd": "Number of overground levels (roof excluded)",
-    "number_of_underground_levels_5e49cfdc": "Number of underground levels",
-    "ok_c47544a2": "OK",
-    "oops_something_went_wrong_when_trying_to_log_you_i_97c911b6": "Oops ! Something went wrong when trying to log you in",
-    "oops_there_was_an_error_during_upload_f711b0f5": "Oops ! There was an error during upload...",
-    "opacity_a9787d84": "Opacity",
-    "openstreetmap_server_can_t_be_contacted_check_your_2268173": "OpenStreetMap server can't be contacted. Check your Internet connection and retry in a few minutes.",
-    "overlay_537a2c5c": "Overlay",
-    "please_choose_a_level_8e7c0347": "Please choose a level",
-    "please_select_how_you_want_to_represent_your_featu_fa7164b4": "Please select how you want to represent your feature.",
-    "please_select_the_floor_part_to_edit_using_the_map_e625fbfb": "Please select the floor part to edit using the map.",
-    "please_zoom_in_to_edit_data_7665ee0e": "Please zoom-in to edit data",
-    "point_72905a7d": "Point",
-    "preview_53003fd2": "Preview",
-    "preview_your_changes_on_indoor_cdc4ed41": "Preview your changes on indoor=",
-    "relative_floor_level_height_in_meters_6ff77df4": "Relative floor level height in meters",
-    "rotate_this_plan_7e160b6c": "Rotate this plan",
-    "save_11a80ec3": "Save",
-    "save_positionning_of_floor_plans_dc92bdde": "Save positionning of floor plans",
-    "scale_this_plan_cce6eeea": "Scale this plan",
-    "schema_explaining_how_should_be_set_amount_of_leve_dd0387a6": "Schema explaining how should be set amount of levels",
-    "schema_explaining_how_should_be_set_level_height_61aedc69": "Schema explaining how should be set level height",
-    "search_a_city_street_c591f2f6": "Search a city, street...",
-    "search_a_type_of_feature_339e8c43": "Search a type of feature...",
-    "searching_address_cc9a4350": "Searching address...",
-    "see_feature_history_on_openstreetmap_c9d451c2": "See feature history on OpenStreetMap",
-    "see_your_changes_on_openstreetmap_57e092a9": "See your changes on OpenStreetMap",
-    "select_a_preset_7a7db9a2": "Select a preset",
-    "selected_building_b076e8bd": "Selected building",
-    "selected_floor_b2f117a4": "Selected floor",
-    "send_changes_to_openstreetmap_2a56f963": "Send changes to OpenStreetMap",
-    "send_e3bd0ed0": "Send",
-    "send_your_changes_to_openstreetmap_9c74e15a": "Send your changes to OpenStreetMap",
-    "some_of_your_edits_could_have_been_lost_please_rel_5446e8c": "Some of your edits could have been lost, please reload and retry.",
-    "sources_38d87510": "Sources",
-    "square_this_building_2cea27a7": "Square this building",
-    "square_this_feature_cec7b23b": "Square this feature",
-    "square_this_floor_part_5ce703e4": "Square this floor part",
-    "street_level_imagery_2158b370": "Street-level imagery",
-    "structure_4c887763": "Structure",
-    "supported_formats_jpeg_png_imagery_json_3bfc7689": "Supported formats: JPEG, PNG, Imagery JSON",
-    "surrounded_by_walls_d4b4ec40": "Surrounded by walls",
-    "thanks_for_your_contribution_3c790eea": "Thanks for your contribution !",
-    "the_editor_doesn_t_support_yet_this_kind_of_comple_46362064": "The editor doesn't support yet this kind of complex geometry editing.",
-    "the_feature_contour_you_just_edited_is_partially_o_7cbfd0ed": "The feature contour you just edited is partially or completely outside of the level contour. Please make sure that the feature contour is mostly contained in the floor.",
-    "the_level_contour_you_just_edited_is_partially_or__870ff4e4": "The level contour you just edited is partially or completely outside of the building contour. Please make sure that the level contour is mostly contained in the building.",
-    "these_buildings_lack_some_floor_outlines_1ed7986f": "These buildings lack some floor outlines :",
-    "these_floor_outlines_are_optional_in_osm_but_are_u_c6e53110": "These floor outlines are optional in OSM, but are useful for various tools people use.",
-    "this_level_doesn_t_have_a_precise_floor_outline_de_d08cb793": "This level doesn't have a precise floor outline defined yet.",
-    "to_edit_map_data_you_need_to_connect_first_using_a_a0c85c4e": "To edit map data, you need to connect first using an OpenStreetMap account.",
-    "to_make_your_floor_plans_appear_correctly_when_edi_ceafcc87": "To make your floor plans appear correctly when editing indoors, please make sure you set on which level they should show up on the left panel.",
-    "to_view_and_edit_map_data_you_need_to_connect_firs_959b4121": "To view and edit map data, you need to connect first using an OpenStreetMap account.",
-    "total_height_in_meters_e6951830": "Total height (in meters)",
-    "type_of_building_dac64a5d": "Type of building",
-    "unknown_47a3b725": "Unknown",
-    "uploading_your_changes_b681c4b9": "Uploading your changes...",
-    "usage_15def729": "Usage",
-    "use_building_ones_79c60f86": "Use building ones",
-    "use_building_outline_as_default_level_outline_reco_22a90106": "Use building outline as default level outline (recommended for simple buildings)",
-    "use_the_whole_building_footprint_8dfe5828": "Use the whole building footprint",
-    "yes_dde87d5": "Yes",
-    "you_can_draw_your_feature_on_the_map_click_on_done_ee804fa9": "You can draw your feature on the map. Click on done button or click again on last node you created to finish.",
-    "you_can_use_any_tms_like_url_afc72061": "You can use any TMS-like URL",
-    "you_have_the_choice_between_following_options_b69ea4b4": "You have the choice between following options :",
-    "you_have_to_give_us_more_details_about_your_change_c3d8b397": "You have to give us more details about your changes using Changeset comment text field.",
-    "your_edits_75881b31": "Your edits"
-  }
-}

+ 0 - 164
src/config/locales/ui/en.json

@@ -1,164 +0,0 @@
-{
-  "en": {
-    "add_another_floor_part_d2e818cb": "Add another floor part",
-    "add_features_1ec54938": "Add features",
-    "add_level_information_4713bb49": "Add level information",
-    "aerial_imagery_7a97acbc": "Aerial imagery",
-    "all_buildings_33780621": "All buildings",
-    "an_error_happened_when_searching_address_please_re_70aa298e": "An error happened when searching address. Please retry.",
-    "analyzing_your_changes_3db6e606": "Analyzing your changes...",
-    "apply_again_last_cancelled_operation_b8e652e6": "Apply again last cancelled operation",
-    "are_you_sure_you_want_to_delete_this_feature_you_c_39341ba5": "Are you sure you want to delete this feature ? You can either cancel this operation, delete only the contour of the feature, or delete the feature and everything inside (quite dangerous).",
-    "area_935a0975": "Area",
-    "back_2900f52a": "Back",
-    "background_1bc88842": "Background",
-    "building_5e8a3c1d": "Building",
-    "building_b_levels_lvl_27dc4fac": "Building %{b} (levels : %{lvl})",
-    "can_t_download_data_from_osm_server_please_retry_l_84cdaef9": "Can't download data from OSM server. Please retry later.",
-    "cancel_caeb1e68": "Cancel",
-    "cancel_last_operation_aba24851": "Cancel last operation",
-    "changeset_comment_b8439548": "Changeset comment",
-    "changeset_tags_e05307a0": "Changeset tags",
-    "click_on_the_map_to_start_drawing_the_feature_fd11baf7": "Click on the map to start drawing the feature",
-    "click_to_start_creating_a_new_building_from_scratc_e1f51bdb": "Click to start creating a new building from scratch",
-    "confirm_delete_of_f_6193d2e": "Confirm delete of %{f}",
-    "copy_level_73e49f32": "Copy level",
-    "copy_position_of_this_plan_26664c0a": "Copy position of this plan",
-    "copy_selected_level_data_in_the_current_level_9dec4af9": "Copy selected level data in the current level",
-    "create_a_new_floor_part_in_this_level_useful_for_g_dffe9516": "Create a new floor part in this level. Useful for giving different names to parts of a single level.",
-    "create_a_new_level_on_top_of_existing_ones_a5d88094": "Create a new level on top of existing ones",
-    "create_a_new_level_under_existing_ones_9b7fa708": "Create a new level under existing ones",
-    "custom_imagery_d88b2f98": "Custom imagery",
-    "custom_imagery_url_d44a400f": "Custom imagery URL",
-    "delete_everything_461bbc02": "Delete everything",
-    "delete_only_contour_7874606c": "Delete only contour",
-    "delete_this_building_217b1627": "Delete this building",
-    "delete_this_feature_329c0cb1": "Delete this feature",
-    "delete_this_floor_part_36ba9604": "Delete this floor part",
-    "delete_this_plan_39fd69cc": "Delete this plan",
-    "describe_briefly_but_explicitely_your_edits_requir_574b3a37": "Describe briefly but explicitely your edits (required)",
-    "did_you_save_all_your_changes_if_not_your_changes__edcf56f5": "Did you save all your changes ? If not, your changes will be lost.",
-    "distort_this_plan_40d437b4": "Distort this plan",
-    "done_54e3d4b6": "Done",
-    "drag_and_drop_your_images_here_or_click_to_open_fi_1c35713a": "Drag and drop your images here (or click to open file browser)",
-    "draw_this_floor_outline_89b57f0": "Draw this floor outline",
-    "edit_buildings_3a6fbbbf": "Edit buildings",
-    "edit_features_102eb3e9": "Edit features",
-    "edit_features_name_c0b3f15a": "Edit features (%{name})",
-    "edit_levels_outlines_name_9f925e60": "Edit levels outlines (%{name})",
-    "edit_map_d2428083": "Edit map",
-    "edit_objects_contained_in_this_floor_ddeb4d47": "Edit objects contained in this floor",
-    "edit_outlines_64c7c954": "Edit outlines",
-    "edit_this_feature_ec33045a": "Edit this feature",
-    "edit_this_single_building_e4e0b8f6": "Edit this single building",
-    "edited_building_indoors_c5d46c": "Edited building indoors",
-    "emergency_map_1f6cbcf6": "Emergency map",
-    "features_level_lvl_e8c7edfc": "Features (level %{lvl})",
-    "floor_outlines_are_missing_fb5bddf6": "Floor outlines are missing",
-    "floor_plan_2d84db57": "Floor plan",
-    "floors_served_e84c1de4": "Floors served",
-    "for_long_but_not_large_features_63744737": "For long but not large features",
-    "for_small_features_size_less_than_2_meters_8412f8fb": "For small features (size less than 2 meters)",
-    "for_wide_features_surface_of_more_than_a_few_m_2da8616d": "For wide features (surface of more than a few m²)",
-    "geometry_outside_of_the_bounds_5c1da8c6": "Geometry outside of the bounds",
-    "go_back_to_building_selection_e155cec2": "Go back to building selection",
-    "go_back_to_editing_9300435c": "Go back to editing",
-    "go_back_to_editing_and_create_levels_outline_by_yo_e3e08921": "Go back to editing and create levels outline by yourself (recommended for complex buildings)",
-    "go_back_to_map_explorer_3e29368": "Go back to map explorer",
-    "ground_survey_df1399ae": "Ground survey",
-    "height_in_meters_38f77fb1": "Height (in meters)",
-    "help_4c4968b1": "Help",
-    "i_would_like_someone_to_review_my_edits_3ebac0a4": "I would like someone to review my edits",
-    "ignore_this_fd62cb5c": "Ignore this",
-    "ignore_this_warning_and_do_not_create_missing_leve_7aa9d23e": "Ignore this warning and do not create missing level outlines (not recommended)",
-    "imagery_a5c2904e": "Imagery",
-    "import_floor_plans_d80df63c": "Import floor plans",
-    "level_5fdf654a": "Level",
-    "level_lvl_7bb23fb1": "Level %{lvl}",
-    "levels_structure_level_lvl_aab3eddf": "Levels structure (level %{lvl})",
-    "line_95da80eb": "Line",
-    "list_all_sources_you_have_used_to_make_your_edits__b3622648": "List all sources you have used to make your edits (recommended)",
-    "loading_25990131": "Loading...",
-    "local_knowledge_b4f676d": "Local knowledge",
-    "login_or_create_account_b27ad227": "Login or create account",
-    "move_this_plan_to_copied_position_1bfd523e": "Move this plan to copied position",
-    "name_1aed4a1b": "Name",
-    "new_below_level_3d5af6df": "New below level",
-    "new_building_3fe98ea5": "New building",
-    "new_feature_9f6cad45": "New feature",
-    "new_floor_part_level_lvl_f9fd47da": "New floor part (level %{lvl})",
-    "new_upper_level_f21cef31": "New upper level",
-    "no_e16d9132": "No",
-    "no_selected_building_f3bff32c": "no selected building",
-    "number_of_levels_above_ground_roof_excluded_here_b_54f3d7da": "Number of levels above ground (roof excluded), here B + C + D = 3 levels",
-    "number_of_levels_completely_underground_here_e_1_l_73035260": "Number of levels completely underground, here E = 1 level",
-    "number_of_levels_under_roof_54fb5ef5": "Number of levels under roof",
-    "number_of_levels_under_the_roof_here_a_1_level_b18fea4c": "Number of levels under the roof, here A = 1 level",
-    "number_of_overground_levels_roof_excluded_ea5f28dd": "Number of overground levels (roof excluded)",
-    "number_of_underground_levels_5e49cfdc": "Number of underground levels",
-    "ok_c47544a2": "OK",
-    "oops_something_went_wrong_when_trying_to_log_you_i_97c911b6": "Oops ! Something went wrong when trying to log you in",
-    "oops_there_was_an_error_during_upload_f711b0f5": "Oops ! There was an error during upload...",
-    "opacity_a9787d84": "Opacity",
-    "openstreetmap_server_can_t_be_contacted_check_your_2268173": "OpenStreetMap server can't be contacted. Check your Internet connection and retry in a few minutes.",
-    "overlay_537a2c5c": "Overlay",
-    "please_choose_a_level_8e7c0347": "Please choose a level",
-    "please_select_how_you_want_to_represent_your_featu_fa7164b4": "Please select how you want to represent your feature.",
-    "please_select_the_floor_part_to_edit_using_the_map_e625fbfb": "Please select the floor part to edit using the map.",
-    "please_zoom_in_to_edit_data_7665ee0e": "Please zoom-in to edit data",
-    "point_72905a7d": "Point",
-    "preview_53003fd2": "Preview",
-    "preview_your_changes_on_indoor_cdc4ed41": "Preview your changes on indoor=",
-    "relative_floor_level_height_in_meters_6ff77df4": "Relative floor level height in meters",
-    "rotate_this_plan_7e160b6c": "Rotate this plan",
-    "save_11a80ec3": "Save",
-    "save_positionning_of_floor_plans_dc92bdde": "Save positionning of floor plans",
-    "scale_this_plan_cce6eeea": "Scale this plan",
-    "schema_explaining_how_should_be_set_amount_of_leve_dd0387a6": "Schema explaining how should be set amount of levels",
-    "schema_explaining_how_should_be_set_level_height_61aedc69": "Schema explaining how should be set level height",
-    "search_a_city_street_c591f2f6": "Search a city, street...",
-    "search_a_type_of_feature_339e8c43": "Search a type of feature...",
-    "searching_address_cc9a4350": "Searching address...",
-    "see_feature_history_on_openstreetmap_c9d451c2": "See feature history on OpenStreetMap",
-    "see_your_changes_on_openstreetmap_57e092a9": "See your changes on OpenStreetMap",
-    "select_a_preset_7a7db9a2": "Select a preset",
-    "selected_building_b076e8bd": "Selected building",
-    "selected_floor_b2f117a4": "Selected floor",
-    "send_changes_to_openstreetmap_2a56f963": "Send changes to OpenStreetMap",
-    "send_e3bd0ed0": "Send",
-    "send_your_changes_to_openstreetmap_9c74e15a": "Send your changes to OpenStreetMap",
-    "some_of_your_edits_could_have_been_lost_please_rel_5446e8c": "Some of your edits could have been lost, please reload and retry.",
-    "sources_38d87510": "Sources",
-    "square_this_building_2cea27a7": "Square this building",
-    "square_this_feature_cec7b23b": "Square this feature",
-    "square_this_floor_part_5ce703e4": "Square this floor part",
-    "street_level_imagery_2158b370": "Street-level imagery",
-    "structure_4c887763": "Structure",
-    "supported_formats_jpeg_png_imagery_json_3bfc7689": "Supported formats: JPEG, PNG, Imagery JSON",
-    "surrounded_by_walls_d4b4ec40": "Surrounded by walls",
-    "thanks_for_your_contribution_3c790eea": "Thanks for your contribution !",
-    "the_editor_doesn_t_support_yet_this_kind_of_comple_46362064": "The editor doesn't support yet this kind of complex geometry editing.",
-    "the_feature_contour_you_just_edited_is_partially_o_7cbfd0ed": "The feature contour you just edited is partially or completely outside of the level contour. Please make sure that the feature contour is mostly contained in the floor.",
-    "the_level_contour_you_just_edited_is_partially_or__870ff4e4": "The level contour you just edited is partially or completely outside of the building contour. Please make sure that the level contour is mostly contained in the building.",
-    "these_buildings_lack_some_floor_outlines_1ed7986f": "These buildings lack some floor outlines :",
-    "these_floor_outlines_are_optional_in_osm_but_are_u_c6e53110": "These floor outlines are optional in OSM, but are useful for various tools people use.",
-    "this_level_doesn_t_have_a_precise_floor_outline_de_d08cb793": "This level doesn't have a precise floor outline defined yet.",
-    "to_edit_map_data_you_need_to_connect_first_using_a_a0c85c4e": "To edit map data, you need to connect first using an OpenStreetMap account.",
-    "to_make_your_floor_plans_appear_correctly_when_edi_ceafcc87": "To make your floor plans appear correctly when editing indoors, please make sure you set on which level they should show up on the left panel.",
-    "to_view_and_edit_map_data_you_need_to_connect_firs_959b4121": "To view and edit map data, you need to connect first using an OpenStreetMap account.",
-    "total_height_in_meters_e6951830": "Total height (in meters)",
-    "type_of_building_dac64a5d": "Type of building",
-    "unknown_47a3b725": "Unknown",
-    "uploading_your_changes_b681c4b9": "Uploading your changes...",
-    "usage_15def729": "Usage",
-    "use_building_ones_79c60f86": "Use building ones",
-    "use_building_outline_as_default_level_outline_reco_22a90106": "Use building outline as default level outline (recommended for simple buildings)",
-    "use_the_whole_building_footprint_8dfe5828": "Use the whole building footprint",
-    "yes_dde87d5": "Yes",
-    "you_can_draw_your_feature_on_the_map_click_on_done_ee804fa9": "You can draw your feature on the map. Click on done button or click again on last node you created to finish.",
-    "you_can_use_any_tms_like_url_afc72061": "You can use any TMS-like URL",
-    "you_have_the_choice_between_following_options_b69ea4b4": "You have the choice between following options :",
-    "you_have_to_give_us_more_details_about_your_change_c3d8b397": "You have to give us more details about your changes using Changeset comment text field.",
-    "your_edits_75881b31": "Your edits"
-  }
-}

+ 0 - 164
src/config/locales/ui/fr.json

@@ -1,164 +0,0 @@
-{
-  "fr": {
-    "add_another_floor_part_d2e818cb": "Ajouter une partie à l'étage",
-    "add_features_1ec54938": "Ajouter des objets",
-    "add_level_information_4713bb49": "Ajouter les informations de l'étage",
-    "aerial_imagery_7a97acbc": "Images aériennes",
-    "all_buildings_33780621": "Tous bâtiments",
-    "an_error_happened_when_searching_address_please_re_70aa298e": "Une erreur s'est produite lors de la recherche d'adresse, merci de réessayer.",
-    "analyzing_your_changes_3db6e606": "Analyse des modifications...",
-    "apply_again_last_cancelled_operation_b8e652e6": "Réappliquer la dernière opération annulée",
-    "are_you_sure_you_want_to_delete_this_feature_you_c_39341ba5": "Êtes-vous sûr de vouloir supprimer cet objet ? Vous pouvez soit annuler cette opération, soit supprimer uniquement le contour de l'objet, ou supprimer l'objet et tout ce qu'il y a à l'intérieur (plutôt dangereux).",
-    "area_935a0975": "Zone",
-    "back_2900f52a": "Retour",
-    "background_1bc88842": "Arrière-plan",
-    "building_5e8a3c1d": "Bâtiment",
-    "building_b_levels_lvl_27dc4fac": "Bâtiment %{b} (étages :  %{lvl})",
-    "can_t_download_data_from_osm_server_please_retry_l_84cdaef9": "Erreur lors du téléchargement des données depuis OSM, veuillez réessayer plus tard.",
-    "cancel_caeb1e68": "Annuler",
-    "cancel_last_operation_aba24851": "Annuler la dernière opération",
-    "changeset_comment_b8439548": "Commentaire du groupe de modification",
-    "changeset_tags_e05307a0": "Attributs du groupe de modifications",
-    "click_on_the_map_to_start_drawing_the_feature_fd11baf7": "Cliquez sur la carte pour dessiner l'objet",
-    "click_to_start_creating_a_new_building_from_scratc_e1f51bdb": "Cliquez pour créer un bâtiment de zéro",
-    "confirm_delete_of_f_6193d2e": "Confirmer la suppression de %{f}",
-    "copy_level_73e49f32": "Copier l'étage",
-    "copy_position_of_this_plan_26664c0a": "Copier la position de ce plan",
-    "copy_selected_level_data_in_the_current_level_9dec4af9": "Copier les données de l'étage sélectionné dans l'étage courant",
-    "create_a_new_floor_part_in_this_level_useful_for_g_dffe9516": "Créer une nouvelle emprise d'étage dans ce niveau. Pratique pour donner des noms différents à des zones d'un même niveau.",
-    "create_a_new_level_on_top_of_existing_ones_a5d88094": "Créer un nouveau niveau au-dessus des niveaux existants",
-    "create_a_new_level_under_existing_ones_9b7fa708": "Créer un nouveau niveau en-dessous des niveaux existants",
-    "custom_imagery_d88b2f98": "Imagerie personnalisée",
-    "custom_imagery_url_d44a400f": "URL de l'imagerie",
-    "delete_everything_461bbc02": "Tout supprimer",
-    "delete_only_contour_7874606c": "Supprimer le contour",
-    "delete_this_building_217b1627": "Supprimer le bâtiment",
-    "delete_this_feature_329c0cb1": "Supprimer cet objet",
-    "delete_this_floor_part_36ba9604": "Supprimer cette emprise d'étage",
-    "delete_this_plan_39fd69cc": "Supprimer ce plan",
-    "describe_briefly_but_explicitely_your_edits_requir_574b3a37": "Décrivez de manière synthétique et explicite les modifications réalisées (obligatoire)",
-    "did_you_save_all_your_changes_if_not_your_changes__edcf56f5": "Avez-vous sauvegardé toutes vos modifications ? Si ce n'est pas le cas, elles seront perdues.",
-    "distort_this_plan_40d437b4": "Déformer ce plan",
-    "done_54e3d4b6": "Terminé",
-    "drag_and_drop_your_images_here_or_click_to_open_fi_1c35713a": "Glissez-déposez vos images ici (ou cliquez pour ouvrir le sélecteur de fichiers)",
-    "draw_this_floor_outline_89b57f0": "Dessiner l'emprise de cet étage",
-    "edit_buildings_3a6fbbbf": "Éditer les bâtiments",
-    "edit_features_102eb3e9": "Éditer les objets",
-    "edit_features_name_c0b3f15a": "Éditer les objets (%{name})",
-    "edit_levels_outlines_name_9f925e60": "Éditer les emprises d'étages (%{name})",
-    "edit_map_d2428083": "Éditer la carte",
-    "edit_objects_contained_in_this_floor_ddeb4d47": "Éditer les objet contenus dans cet étage",
-    "edit_outlines_64c7c954": "Éditer les emprises",
-    "edit_this_feature_ec33045a": "Éditer cet objet",
-    "edit_this_single_building_e4e0b8f6": "Éditer ce bâtiment précis",
-    "edited_building_indoors_c5d46c": "Édition de l'intérieur des bâtiments",
-    "emergency_map_1f6cbcf6": "Plan d'évacuation",
-    "features_level_lvl_e8c7edfc": "Objets (étage %{lvl})",
-    "floor_outlines_are_missing_fb5bddf6": "Les emprises d'étages sont manquantes",
-    "floor_plan_2d84db57": "Plan d'étage",
-    "floors_served_e84c1de4": "Niveaux desservis",
-    "for_long_but_not_large_features_63744737": "Pour les objets longs mais peu larges",
-    "for_small_features_size_less_than_2_meters_8412f8fb": "Pour les petits objets (moins de 2m de large)",
-    "for_wide_features_surface_of_more_than_a_few_m_2da8616d": "Pour les grands objets (surface > quelques m²)",
-    "geometry_outside_of_the_bounds_5c1da8c6": "Géométrie en dehors des limites",
-    "go_back_to_building_selection_e155cec2": "Retourner à la sélection du bâtiment",
-    "go_back_to_editing_9300435c": "Retourner à l'édition",
-    "go_back_to_editing_and_create_levels_outline_by_yo_e3e08921": "Retourner en mode édition et créer les emprises d'étages par vous-même (recommandé pour les bâtiments complexes)",
-    "go_back_to_map_explorer_3e29368": "Retourner à la visionneuse de carte",
-    "ground_survey_df1399ae": "Visite terrain",
-    "height_in_meters_38f77fb1": "Hauteur (en mètres)",
-    "help_4c4968b1": "Aide",
-    "i_would_like_someone_to_review_my_edits_3ebac0a4": "Je souhaite que quelqu'un vérifie mes modifications",
-    "ignore_this_fd62cb5c": "Ignorer",
-    "ignore_this_warning_and_do_not_create_missing_leve_7aa9d23e": "Ignorer cet avertissement et ne pas créer les emprises (non-recommandé)",
-    "imagery_a5c2904e": "Imagerie",
-    "import_floor_plans_d80df63c": "Importer des plans d'étages",
-    "level_5fdf654a": "Niveau",
-    "level_lvl_7bb23fb1": "Niveau %{lvl}",
-    "levels_structure_level_lvl_aab3eddf": "Structure des niveaux (étage %{lvl})",
-    "line_95da80eb": "Ligne",
-    "list_all_sources_you_have_used_to_make_your_edits__b3622648": "Listez toutes les sources utilisées pour réaliser vos modifications (recommandé)",
-    "loading_25990131": "Chargement...",
-    "local_knowledge_b4f676d": "Connaissance locale",
-    "login_or_create_account_b27ad227": "Se connecter ou créer un compte",
-    "move_this_plan_to_copied_position_1bfd523e": "Déplacer ce plan à la position copiée",
-    "name_1aed4a1b": "Nom",
-    "new_below_level_3d5af6df": "Nouveau niveau inférieur",
-    "new_building_3fe98ea5": "Nouveau bâtiment",
-    "new_feature_9f6cad45": "Nouvel objet",
-    "new_floor_part_level_lvl_f9fd47da": "Nouvelle emprise d'étage (niveau %{lvl})",
-    "new_upper_level_f21cef31": "Nouveau niveau supérieur",
-    "no_e16d9132": "Non",
-    "no_selected_building_f3bff32c": "aucun bâtiment sélectionné",
-    "number_of_levels_above_ground_roof_excluded_here_b_54f3d7da": "Nombre de niveaux au-dessus du sol (toit exclu), ici B + C + D = 3 niveaux",
-    "number_of_levels_completely_underground_here_e_1_l_73035260": "Nombre de niveaux entièrement souterrains, ici E = 1 niveau",
-    "number_of_levels_under_roof_54fb5ef5": "Nombre de niveaux sous les toits",
-    "number_of_levels_under_the_roof_here_a_1_level_b18fea4c": "Nombre de niveaux en-dessous de la toiture, ici A = 1 niveau",
-    "number_of_overground_levels_roof_excluded_ea5f28dd": "Nombre de niveaux en surface (toit exclu)",
-    "number_of_underground_levels_5e49cfdc": "Nombre de niveaux souterrains",
-    "ok_c47544a2": "OK",
-    "oops_something_went_wrong_when_trying_to_log_you_i_97c911b6": "Oups ! Une erreur s'est produit lors de la connexion",
-    "oops_there_was_an_error_during_upload_f711b0f5": "Oups ! Une erreur s'est produite lors de l'envoi...",
-    "opacity_a9787d84": "Opacité",
-    "openstreetmap_server_can_t_be_contacted_check_your_2268173": "Le serveur OpenStreetMap n'est pas joignable. Vérifiez votre connexion Internet et réessayez dans quelques instants.",
-    "overlay_537a2c5c": "Surcouche",
-    "please_choose_a_level_8e7c0347": "Choisissez un niveau",
-    "please_select_how_you_want_to_represent_your_featu_fa7164b4": "Merci de choisir comment vous souhaitez représenter cet objet.",
-    "please_select_the_floor_part_to_edit_using_the_map_e625fbfb": "Merci de choisir l'emprise d'étage à modifier à l'aide de la carte.",
-    "please_zoom_in_to_edit_data_7665ee0e": "Merci de zoomer pour éditer la carte",
-    "point_72905a7d": "Point",
-    "preview_53003fd2": "Aperçu",
-    "preview_your_changes_on_indoor_cdc4ed41": "Prévisualiser vos modifications sur indoor=",
-    "relative_floor_level_height_in_meters_6ff77df4": "Hauteur relative du niveau (en mètres)",
-    "rotate_this_plan_7e160b6c": "Tourner ce plan",
-    "save_11a80ec3": "Sauvegarder",
-    "save_positionning_of_floor_plans_dc92bdde": "Sauvegarder la position des plans d'étage",
-    "scale_this_plan_cce6eeea": "Redimensionner ce plan",
-    "schema_explaining_how_should_be_set_amount_of_leve_dd0387a6": "Schéma expliquant comment doit être renseigné le nombre de niveaux",
-    "schema_explaining_how_should_be_set_level_height_61aedc69": "Schéma expliquant comment doit être renseignée la hauteur de l'étage",
-    "search_a_city_street_c591f2f6": "Recherchez une ville, une rue...",
-    "search_a_type_of_feature_339e8c43": "Recherchez un type d'objet...",
-    "searching_address_cc9a4350": "Recherche de l'adresse en cours...",
-    "see_feature_history_on_openstreetmap_c9d451c2": "Voir l'historique sur OpenStreetMap",
-    "see_your_changes_on_openstreetmap_57e092a9": "Voir vos modifications sur OpenStreetMap",
-    "select_a_preset_7a7db9a2": "Choisir un modèle",
-    "selected_building_b076e8bd": "Bâtiment sélectionné",
-    "selected_floor_b2f117a4": "Étage sélectionné",
-    "send_changes_to_openstreetmap_2a56f963": "Envoyer vos modifications sur OpenStreetMap",
-    "send_e3bd0ed0": "Envoyer",
-    "send_your_changes_to_openstreetmap_9c74e15a": "Envoyer vos modifications sur OpenStreetMap",
-    "some_of_your_edits_could_have_been_lost_please_rel_5446e8c": "Certaines de vos modifications n'ont pu être envoyées. Merci de recharger la page et réessayer.",
-    "sources_38d87510": "Sources",
-    "square_this_building_2cea27a7": "Rendre carré ce bâtiment",
-    "square_this_feature_cec7b23b": "Rendre carré cet objet",
-    "square_this_floor_part_5ce703e4": "Rendre carré cette emprise d'étage",
-    "street_level_imagery_2158b370": "Photos de rue",
-    "structure_4c887763": "Structure",
-    "supported_formats_jpeg_png_imagery_json_3bfc7689": "Formats supportés : JPEG, PNG, fichier JSON d'imagerie",
-    "surrounded_by_walls_d4b4ec40": "Entouré par des murs",
-    "thanks_for_your_contribution_3c790eea": "Merci pour votre contribution !",
-    "the_editor_doesn_t_support_yet_this_kind_of_comple_46362064": "L'éditeur ne permet pas pour le moment d'éditer ce type de géométries complexes.",
-    "the_feature_contour_you_just_edited_is_partially_o_7cbfd0ed": "L'objet que vous avez modifié est partiellement ou complètement en dehors de l'emprise de l'étage. Merci de vérifier que votre objet est bien contenu dans l'étage.",
-    "the_level_contour_you_just_edited_is_partially_or__870ff4e4": "L'emprise d'étage que vous avez modifié est partiellement ou complètement en dehors de l'emprise du bâtiment. Merci de vérifier qu'elle est bien contenue dans le bâtiment.",
-    "these_buildings_lack_some_floor_outlines_1ed7986f": "Il manque des emprises d'étages sur les bâtiments suivants :",
-    "these_floor_outlines_are_optional_in_osm_but_are_u_c6e53110": "Ces emprises sont optionnelles, mais servent à de nombreux outils.",
-    "this_level_doesn_t_have_a_precise_floor_outline_de_d08cb793": "Ce niveau n'a pas d'emprise d'étage définie pour l'instant.",
-    "to_edit_map_data_you_need_to_connect_first_using_a_a0c85c4e": "Pour pouvoir éditer la carte, vous devez d'abord vous connecter à l'aide d'un compte OpenStreetMap.",
-    "to_make_your_floor_plans_appear_correctly_when_edi_ceafcc87": "Pour faire en sorte que vos plans d'étage apparaissent correctement lors de l'édition de la carte, merci de renseigner le niveau auquel ils doivent apparaître dans le panneau de gauche.",
-    "to_view_and_edit_map_data_you_need_to_connect_firs_959b4121": "Pour voir et éditer la carte, vous devez d'abord vous connecter à l'aide d'un compte OpenStreetMap.",
-    "total_height_in_meters_e6951830": "Hauteur totale (en mètres)",
-    "type_of_building_dac64a5d": "Type de bâtiment",
-    "unknown_47a3b725": "Inconnu",
-    "uploading_your_changes_b681c4b9": "Envoi de vos modifications en cours...",
-    "usage_15def729": "Usage",
-    "use_building_ones_79c60f86": "Utiliser celle du bâtiment",
-    "use_building_outline_as_default_level_outline_reco_22a90106": "Utiliser l'emprise du bâtiment par défaut (recommandé pour les bâtiments simples)",
-    "use_the_whole_building_footprint_8dfe5828": "Utiliser l'emprise complète du bâtiment",
-    "yes_dde87d5": "Oui",
-    "you_can_draw_your_feature_on_the_map_click_on_done_ee804fa9": "Vous pouvez dessiner votre objet sur la carte. Cliquez sur le bouton \"Terminé\" ou cliquez à nouveau sur le dernier point pour finaliser.",
-    "you_can_use_any_tms_like_url_afc72061": "Vous pouvez utiliser n'importe quelle URL de type TMS",
-    "you_have_the_choice_between_following_options_b69ea4b4": "Vous avez le choix entre différentes options :",
-    "you_have_to_give_us_more_details_about_your_change_c3d8b397": "Vous devez nous donner plus de détails sur vos modifications à l'aide du champ Commentaire.",
-    "your_edits_75881b31": "Vos modifications"
-  }
-}

+ 0 - 30
src/config/locales/ui/index.js

@@ -1,30 +0,0 @@
-// Generated by i18nline.
-import I18n from 'i18nline';
-
-I18n.supportedLocales = ['de','en','fr','it','cn'];
-I18n.defaultLocale = 'en';
-
-I18n.import = locale => {
-	// we use a switch here so the import statements are statically
-	// analyzable. the use of import() will make build tools generate
-	// separate bundles which are downloaded on-demand.
-	switch (locale) {
-		case 'de': return import(/* webpackChunkName: 'i18n.de' */ './de.json');
-		case 'en': return import(/* webpackChunkName: 'i18n.en' */ './en.json');
-		case 'fr': return import(/* webpackChunkName: 'i18n.fr' */ './fr.json');
-		case 'it': return import(/* webpackChunkName: 'i18n.it' */ './it.json');
-		case 'cn': return import(/* webpackChunkName: 'i18n.it' */ './cn.json');
-		default: return import(/* webpackChunkName: 'i18n.default' */ './default.json');
-	}
-};
-
-if ((typeof module === 'object') && module.hot) {
-	module.hot.accept('./de.json', I18n.reload('de'));
-	module.hot.accept('./en.json', I18n.reload('en'));
-	module.hot.accept('./fr.json', I18n.reload('fr'));
-	module.hot.accept('./it.json', I18n.reload('it'));
-	module.hot.accept('./cn.json', I18n.reload('cn'));
-	module.hot.accept('./default.json', I18n.reload('default'));
-}
-
-export default I18n;

+ 0 - 164
src/config/locales/ui/it.json

@@ -1,164 +0,0 @@
-{
-  "it": {
-    "add_another_floor_part_d2e818cb": "Aggiungi un'altra parte del piano",
-    "add_features_1ec54938": "Aggiungi caratteristiche",
-    "add_level_information_4713bb49": "Aggiungi un livello informativo",
-    "aerial_imagery_7a97acbc": "Immagini aeree",
-    "all_buildings_33780621": "Tutti gli edifici",
-    "an_error_happened_when_searching_address_please_re_70aa298e": "Ho riscontrato un errore cercando l'indirizzo. Ti prego di riprovare.",
-    "analyzing_your_changes_3db6e606": "Sto analizzando le tue modifiche ...",
-    "apply_again_last_cancelled_operation_b8e652e6": "Applica nuovamente l'ultima operazione annullata",
-    "are_you_sure_you_want_to_delete_this_feature_you_c_39341ba5": "Si è sicuri di di voler eliminare questo attributo? Puoi annullare questa operazione, eliminare solo cosa hai aggiunto o eliminare l'oggetto e tutto ciò che ne contiene (abbastanza pericoloso).",
-    "area_935a0975": "Area",
-    "back_2900f52a": "Indietro",
-    "background_1bc88842": "Sfondo",
-    "building_5e8a3c1d": "Edificio",
-    "building_b_levels_lvl_27dc4fac": "Edificio %{b} (piani : %{lvl})",
-    "can_t_download_data_from_osm_server_please_retry_l_84cdaef9": "Non riesco a scaricare i dati dal server OSM. Per cortesia riprova più tardi.",
-    "cancel_caeb1e68": "Elimina",
-    "cancel_last_operation_aba24851": "Elimina l'ultima operazione",
-    "changeset_comment_b8439548": "Commento al changeset",
-    "changeset_tags_e05307a0": "Tag del changeset",
-    "click_on_the_map_to_start_drawing_the_feature_fd11baf7": "Premi sulla mappa per cominciare a disegnare un oggetto",
-    "click_to_start_creating_a_new_building_from_scratc_e1f51bdb": "Clic per cominciare a creare un nuovo oggetto dal nulla",
-    "confirm_delete_of_f_6193d2e": "Conferma l'eliminazione di %{f}",
-    "copy_level_73e49f32": "Copia il livello",
-    "copy_position_of_this_plan_26664c0a": "Copia la posizione di questo piano",
-    "copy_selected_level_data_in_the_current_level_9dec4af9": "Copia il livello dei dati scelto al livello in uso",
-    "create_a_new_floor_part_in_this_level_useful_for_g_dffe9516": "Crea una nuova parte di pavimento in questo livello. Questo è utile per assegnare nomi diversi a parti di un singolo livello.",
-    "create_a_new_level_on_top_of_existing_ones_a5d88094": "Crea un nuovo livello al di sopra di quello esistente",
-    "create_a_new_level_under_existing_ones_9b7fa708": "Crea un nuovo livello al di sotto di quello esistente",
-    "custom_imagery_d88b2f98": "Immagine personalizzata",
-    "custom_imagery_url_d44a400f": "URL immagine personalizzata",
-    "delete_everything_461bbc02": "Cancella tutto",
-    "delete_only_contour_7874606c": "Elimina solo il contorno",
-    "delete_this_building_217b1627": "Elimina questo edificio",
-    "delete_this_feature_329c0cb1": "Elimina questo oggetto",
-    "delete_this_floor_part_36ba9604": "Elimina questa parte di pavimento",
-    "delete_this_plan_39fd69cc": "Cancella questo piano",
-    "describe_briefly_but_explicitely_your_edits_requir_574b3a37": "Descrivi brevemente ma in maniera esplicita le tue modifiche (obbligatorio)",
-    "did_you_save_all_your_changes_if_not_your_changes__edcf56f5": "Hai salvati tutte le modifiche? Se non è così, allora le perderai tutte.",
-    "distort_this_plan_40d437b4": "Distorcere questo piano",
-    "done_54e3d4b6": "Fatto",
-    "drag_and_drop_your_images_here_or_click_to_open_fi_1c35713a": "Trascina e rilascia le tue immagini qui (o fa clic su apri file del browser)",
-    "draw_this_floor_outline_89b57f0": "Disegna questo contorno del pavimento",
-    "edit_buildings_3a6fbbbf": "Modifica edifici",
-    "edit_features_102eb3e9": "Modifica oggetti",
-    "edit_features_name_c0b3f15a": "Modifica oggetti (%{name})",
-    "edit_levels_outlines_name_9f925e60": "Modifica i contorni dei livelli (%{name})",
-    "edit_map_d2428083": "Modifica la mappa",
-    "edit_objects_contained_in_this_floor_ddeb4d47": "Modifica gli oggetti che si trovano in questo piano",
-    "edit_outlines_64c7c954": "Modifica i contorni",
-    "edit_this_feature_ec33045a": "Modifica questo oggetto",
-    "edit_this_single_building_e4e0b8f6": "Modifica questo ufficio singolo",
-    "edited_building_indoors_c5d46c": "Modifica gli interni dell'edificio",
-    "emergency_map_1f6cbcf6": "Mappa di emergenza",
-    "features_level_lvl_e8c7edfc": "Oggetti (livello %{lvl})",
-    "floor_outlines_are_missing_fb5bddf6": "Mancano i contorni del piano",
-    "floor_plan_2d84db57": "Piano terra",
-    "floors_served_e84c1de4": "Piani serviti",
-    "for_long_but_not_large_features_63744737": "Per oggetti lunghi ma non grandi",
-    "for_small_features_size_less_than_2_meters_8412f8fb": "Per oggetti piccoli (dimensioni meno di 2 metri)",
-    "for_wide_features_surface_of_more_than_a_few_m_2da8616d": "Per oggetti estesi (superficie di oltre alcuni m²)",
-    "geometry_outside_of_the_bounds_5c1da8c6": "Geometria al di fuori dei limiti",
-    "go_back_to_building_selection_e155cec2": "Torna alla selezione dell'edificio",
-    "go_back_to_editing_9300435c": "Torna alla modifica",
-    "go_back_to_editing_and_create_levels_outline_by_yo_e3e08921": "Torna alla modifica e crea i livelli di contorno da solo (raccomandato per uffici complessi)",
-    "go_back_to_map_explorer_3e29368": "Torna alla mappa di esplorazione",
-    "ground_survey_df1399ae": "Misura sul campo",
-    "height_in_meters_38f77fb1": "Altezza (in metri)",
-    "help_4c4968b1": "Aiuto",
-    "i_would_like_someone_to_review_my_edits_3ebac0a4": "I would like someone to review my edits",
-    "ignore_this_fd62cb5c": "Ignoralo",
-    "ignore_this_warning_and_do_not_create_missing_leve_7aa9d23e": "Ignora questo avvertimento e non creare i contorni di livello mancanti (non raccomandato)",
-    "imagery_a5c2904e": "Immagine",
-    "import_floor_plans_d80df63c": "Importa planimetrie",
-    "level_5fdf654a": "Livello",
-    "level_lvl_7bb23fb1": "Livello %{lvl}",
-    "levels_structure_level_lvl_aab3eddf": "Struttura livelli (livello %{lvl})",
-    "line_95da80eb": "Linea",
-    "list_all_sources_you_have_used_to_make_your_edits__b3622648": "Indica tutte le fonti che hai utilizzato per fare le tue modifiche (raccomandato)",
-    "loading_25990131": "Caricamento in corso ...",
-    "local_knowledge_b4f676d": "Conoscenza locale",
-    "login_or_create_account_b27ad227": "Login o crea un account",
-    "move_this_plan_to_copied_position_1bfd523e": "Sposta questo piano nella posizione copiata",
-    "name_1aed4a1b": "Nome",
-    "new_below_level_3d5af6df": "Nuovo sotto livello",
-    "new_building_3fe98ea5": "Nuovo edificio",
-    "new_feature_9f6cad45": "Nuovo oggetto",
-    "new_floor_part_level_lvl_f9fd47da": "Nuova parte del piano (livello %{lvl})",
-    "new_upper_level_f21cef31": "Nuovo livello superiore",
-    "no_e16d9132": "No",
-    "no_selected_building_f3bff32c": "nessun edificio selezionato",
-    "number_of_levels_above_ground_roof_excluded_here_b_54f3d7da": "Numero di livelli fuori terra (tetto escluso), qui B + C + D = 3 livelli",
-    "number_of_levels_completely_underground_here_e_1_l_73035260": "Numero di livelli completamente sotterranei, qui E = 1 livello",
-    "number_of_levels_under_roof_54fb5ef5": "Numero di livelli sottotetto",
-    "number_of_levels_under_the_roof_here_a_1_level_b18fea4c": "Numero di livelli sotto il tetto, qui A = 1 livello",
-    "number_of_overground_levels_roof_excluded_ea5f28dd": "Numero di livelli fuori terra (tetto escluso)",
-    "number_of_underground_levels_5e49cfdc": "Numero di livelli sotterranei",
-    "ok_c47544a2": "OK",
-    "oops_something_went_wrong_when_trying_to_log_you_i_97c911b6": "Oops! Si è verificato un errore durante il tentativo di accesso",
-    "oops_there_was_an_error_during_upload_f711b0f5": "Oops! Si è verificato un errore durante il caricamento ...",
-    "opacity_a9787d84": "Opacità",
-    "openstreetmap_server_can_t_be_contacted_check_your_2268173": "Il server OpenStreetMap non può essere contattato. Controlla la tua connessione Internet e riprova tra qualche minuto.",
-    "overlay_537a2c5c": "Copertura",
-    "please_choose_a_level_8e7c0347": "Scegli un livello",
-    "please_select_how_you_want_to_represent_your_featu_fa7164b4": "Seleziona come vuoi rappresentare il tuo oggetto.",
-    "please_select_the_floor_part_to_edit_using_the_map_e625fbfb": "Seleziona la parte del pavimento da modificare utilizzando la mappa.",
-    "please_zoom_in_to_edit_data_7665ee0e": "Ingrandisci per modificare i dati",
-    "point_72905a7d": "Punto",
-    "preview_53003fd2": "Preview",
-    "preview_your_changes_on_indoor_cdc4ed41": "Preview your changes on indoor=",
-    "relative_floor_level_height_in_meters_6ff77df4": "Altezza relativa del livello del pavimento in metri",
-    "rotate_this_plan_7e160b6c": "Ruota questo piano",
-    "save_11a80ec3": "Salva",
-    "save_positionning_of_floor_plans_dc92bdde": "Salva il posizionamento delle planimetrie",
-    "scale_this_plan_cce6eeea": "Scala questo piano",
-    "schema_explaining_how_should_be_set_amount_of_leve_dd0387a6": "Schema che spiega come impostare la quantità di livelli",
-    "schema_explaining_how_should_be_set_level_height_61aedc69": "Schema che spiega come impostare l'altezza del livello",
-    "search_a_city_street_c591f2f6": "Cerca una città, via ...",
-    "search_a_type_of_feature_339e8c43": "Cerca un tipo di oggetto...",
-    "searching_address_cc9a4350": "Ricerca indirizzo ...",
-    "see_feature_history_on_openstreetmap_c9d451c2": "Vedi la cronologia delle funzionalità su OpenStreetMap",
-    "see_your_changes_on_openstreetmap_57e092a9": "Vedi le tue modifiche su OpenStreetMap",
-    "select_a_preset_7a7db9a2": "Seleziona un preset",
-    "selected_building_b076e8bd": "Edificio selezionato",
-    "selected_floor_b2f117a4": "Piano selezionato",
-    "send_changes_to_openstreetmap_2a56f963": "Invia le modifiche a OpenStreetMap",
-    "send_e3bd0ed0": "Invia",
-    "send_your_changes_to_openstreetmap_9c74e15a": "Invia le tue modifiche a OpenStreetMap",
-    "some_of_your_edits_could_have_been_lost_please_rel_5446e8c": "Alcune delle tue modifiche potrebbero essere andate perse, ricarica e riprova.",
-    "sources_38d87510": "Fonti",
-    "square_this_building_2cea27a7": "Squadra questo edificio",
-    "square_this_feature_cec7b23b": "Squadra questo oggetto",
-    "square_this_floor_part_5ce703e4": "Squadra questa parte del piano",
-    "street_level_imagery_2158b370": "Immagini a livello stradale",
-    "structure_4c887763": "Struttura",
-    "supported_formats_jpeg_png_imagery_json_3bfc7689": "Formati supportati: JPEG, PNG, Immagini JSON",
-    "surrounded_by_walls_d4b4ec40": "Circondato da mura",
-    "thanks_for_your_contribution_3c790eea": "Grazie per il tuo contributo!",
-    "the_editor_doesn_t_support_yet_this_kind_of_comple_46362064": "L'editor non supporta ancora questo tipo di modifica complessa della geometria.",
-    "the_feature_contour_you_just_edited_is_partially_o_7cbfd0ed": "Il contorno della geometria appena modificata è parzialmente o completamente dal limite del contorno del livello. Assicurarti che il contorno dell'oggetto sia contenuto principalmente sul pavimento.",
-    "the_level_contour_you_just_edited_is_partially_or__870ff4e4": "Il contorno del livello appena modificato è parzialmente o completamente al di fuori del contorno dell'edificio. Assicurati che il contorno del livello sia principalmente contenuto nell'edificio.",
-    "these_buildings_lack_some_floor_outlines_1ed7986f": "Questi edifici mancano di alcuni contorni del piano:",
-    "these_floor_outlines_are_optional_in_osm_but_are_u_c6e53110": "Questi contorni del pavimento sono opzionali in OSM, ma sono utili per vari strumenti che le persone usano.",
-    "this_level_doesn_t_have_a_precise_floor_outline_de_d08cb793": "Questo livello non ha ancora definito un profilo preciso del piano.",
-    "to_edit_map_data_you_need_to_connect_first_using_a_a0c85c4e": "Per modificare i dati della mappa, devi prima connetterti utilizzando un account OpenStreetMap.",
-    "to_make_your_floor_plans_appear_correctly_when_edi_ceafcc87": "Per fare in modo che le tue planimetrie appaiano correttamente quando modifichi in ambito indoor, assicurati di impostare a quale livello dovrebbero apparire sul pannello di sinistra.",
-    "to_view_and_edit_map_data_you_need_to_connect_firs_959b4121": "Per visualizzare e modificare i dati della mappa, devi prima connetterti utilizzando un account OpenStreetMap.",
-    "total_height_in_meters_e6951830": "Altezza totale (in metri)",
-    "type_of_building_dac64a5d": "Tipo di edificio",
-    "unknown_47a3b725": "Sconosciuto",
-    "uploading_your_changes_b681c4b9": "Caricamento delle tue modifiche...",
-    "usage_15def729": "Utilizzo",
-    "use_building_ones_79c60f86": "Utilizza uno degli edifici",
-    "use_building_outline_as_default_level_outline_reco_22a90106": "Usa il profilo dell'edificio come contorno del livello scelto (consigliato per edifici semplici)",
-    "use_the_whole_building_footprint_8dfe5828": "Usa l'intero footprint dell'edificio",
-    "yes_dde87d5": "Sì",
-    "you_can_draw_your_feature_on_the_map_click_on_done_ee804fa9": "Puoi disegnare il tuo oggetto sulla mappa. Fai clic sul pulsante fatto o fare nuovamente clic sull'ultimo nodo creato per terminare.",
-    "you_can_use_any_tms_like_url_afc72061": "Puoi usare un qualsiasi URL di tipo TMS",
-    "you_have_the_choice_between_following_options_b69ea4b4": "Tu puoi scegliere fra queste opzioni:",
-    "you_have_to_give_us_more_details_about_your_change_c3d8b397": "Devi fornirci maggiori dettagli sulle tue modifiche usando il campo di testo dei commenti del changeset.",
-    "your_edits_75881b31": "Le tue modifiche"
-  }
-}

+ 0 - 15
src/ctrl/PresetsManager.js

@@ -14,7 +14,6 @@ import request from 'request-promise-native';
 import { parseString } from 'xml2js';
 import { mergeDeep } from '../utils';
 import Fuse from 'fuse.js';
-import I18n from '../config/locales/ui';
 
 /**
  * Presets manager handles loading, listing and filtering of presets for OSM features.
@@ -296,20 +295,6 @@ class PresetsManager {
 			if(p.$ && p.$[prop]) { res[prop] = p.$[prop]; }
 		});
 
-		// Replace some properties by their translation (if available)
-		if(
-			I18n.locale && I18n.locale !== "en"
-			&& [ "group", "item", "label", "text", "combo", "multiselect", "list_entry", "check" ].includes(type)
-		) {
-			const i18nFields = [ "name", "text", "display_values", "display_value" ];
-
-			i18nFields.forEach(field => {
-				if(p.$[I18n.locale+"."+field]) {
-					res[field] = p.$[I18n.locale+"."+field];
-				}
-			});
-		}
-
 		// Object types
 		if(res.type) {
 			res.type = res.type.split(",");

Разница между файлами не показана из-за своего большого размера
+ 810 - 807
src/ctrl/VectorDataManager.js


+ 11 - 18
src/index.js

@@ -14,7 +14,7 @@
 // import LocationCard from './view/common/LocationCard';
 import App from './view/App'
 // import updateMarkerPos from './view/utils/moveMarker'
-import connectTestTool from './view/utils/connectTestTool'
+// import connectTestTool from './view/utils/connectTestTool'
 // import uploadMapData from './view/utils/uploadMapdata'
 
 
@@ -25,14 +25,6 @@ window.EDITOR_URL = window.location.origin + window.location.pathname.substring(
 window.UNUSABLE_ICONS = new Set();
 
 
-/*
- * Global variables definition
- */
-
-window.EDITOR_URL = window.location.origin + window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/')) + "/";
-console.log("EDITOR_URL", window.EDITOR_URL)
-window.UNUSABLE_ICONS = new Set();
-
 // Dynamically load config file
 // request(window.EDITOR_URL + "/config.json")
 // 	.then(configTxt => {
@@ -49,7 +41,7 @@ window.UNUSABLE_ICONS = new Set();
 // 	});
 
 window.CONFIG = JSON.parse(`{
-	"editor_name": "编辑器",
+	"editor_name": "飞兔地图",
 	"hash": "GIT_HASH",
 	"data_min_zoom": 18,
 	"map_initial_zoom": 18,
@@ -67,13 +59,14 @@ console.log(window.CONFIG)
 window.EDITOR_NAME = window.CONFIG.editor_name;
 
 // Create app
-// new App({ el: 'root', id: '123' }).init();
+// new App({ el: 'root', id: 'swa3s5ex', url:"ws://121.42.8.157:19702" }).init();
+new App({ el: 'root' }).init();
 
 
-const ThreeXMAP = {
-	MAP: App,
-	connectTestTool: connectTestTool,
-	// uploadMap: uploadMapData,
-	// moveMarker: updateMarkerPos,
-}
-export { ThreeXMAP }
+// const BunnyBlitz = {
+// 	MAP: App,
+// 	connectTestTool: connectTestTool,
+// 	// uploadMap: uploadMapData,
+// 	// moveMarker: updateMarkerPos,
+// }
+// export { BunnyBlitz }

+ 7 - 26
src/view/App.js

@@ -2,7 +2,6 @@
 import React from 'react';
 import ReactDOM from 'react-dom';
 import Body from './Body';
-import I18n from '../config/locales/ui';
 import ImageryManager from '../ctrl/ImageryManager';
 import AccountAuth from '../model/AccountAuth';
 import PresetsManager from '../ctrl/PresetsManager';
@@ -24,29 +23,11 @@ export default class App {
 	}
 
 	init() {
-		this._initI18n();
 		this._initCtrl();
 		this._initView();
 		this._initAuth();
 	}
 
-	/**
-	 * Initializes internationalization system
-	 * @private
-	 */
-	_initI18n() {
-		let locale = null;
-		if (window.navigator.languages) {
-			for (const l of window.navigator.languages) {
-				if (I18n.supportedLocales.includes(l)) {
-					locale = l;
-					break;
-				}
-			}
-		}
-
-		I18n.changeLocale(locale || window.navigator.userLanguage || window.navigator.language);
-	}
 
 	/**
 	 * Creates controller objects.
@@ -303,18 +284,18 @@ export default class App {
 	 * @param {Object} data - 根据data.type类型,将不同的标记按照data.data移动 * 
 	*/
 	moveMarker(data) {
-	  if (data.type === "card") {
-		let cards = data.data.map(card => {
-			return new LocationCard(card.lat, card.lng, card.loc_time, card.milli_time, card.card_id, card.info, card.src);
-		});
-		PubSub.publish('body.data.update', cards);
-	  }
+		if (data.type === "card") {
+			let cards = data.data.map(card => {
+				return new LocationCard(card.lat, card.lng, card.loc_time, card.milli_time, card.card_id, card.info, card.src);
+			});
+			PubSub.publish('body.data.update', cards);
+		}
 	}
 
 	/** * 加载地图文件 * * 
 	 * @param {String} url - 地图文件路径 * 
 	*/
-	loadMap(url) {   
+	loadMap(url) {
 		fetch(url)
 			.then(res => res.text())
 			.then(data => {

Разница между файлами не показана из-за своего большого размера
+ 953 - 1176
src/view/Body.js


+ 0 - 164
src/view/Header.js

@@ -1,164 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Body from './Body';
-import Button from 'react-bootstrap/Button';
-import ButtonToolbar from 'react-bootstrap/ButtonToolbar';
-import Dropdown from 'react-bootstrap/Dropdown';
-import Layers from 'mdi-react/LayersIcon';
-import Navbar from 'react-bootstrap/Navbar';
-import Navigator from './common/Navigator';
-import Pencil from 'mdi-react/PencilIcon';
-import Account from 'mdi-react/AccountIcon';
-import PubSub from 'pubsub-js';
-// import SearchPlace from './common/SearchPlace';
-
-/**
- * Header component handles the whole header bar.
- */
-class Header extends Component {
-	state = {
-		accountName: '请登录',
-	}
-
-	componentDidMount(){
-		PubSub.subscribe('app.user.ready', (msg, data) => {			
-			let name = window.editor_user.name;
-			this.setState({accountName: "已登录:" + name});
-		});
-	}
-
-	render() {
-		const isEditingIndoor = [Body.MODE_BUILDING, Body.MODE_LEVELS, Body.MODE_FEATURES].includes(this.props.mode);
-
-		return <Navbar className={this.props.className} bg="light" expand="xs">
-			<div className="d-flex">
-				<Navbar.Brand
-					className="app-brand"
-					style={{cursor: "pointer"}}
-					title="返回地图浏览"//{I18n.t("Go back to map explorer")}
-					onClick={() => PubSub.publish("body.mode.set", { mode: Body.MODE_EXPLORE })}
-				>
-					{window.EDITOR_NAME}
-				</Navbar.Brand>
-
-				<ButtonToolbar className="ml-2 hide-xsDown">
-					<Button
-						variant="primary"
-						className="mr-2 btn-mode-floorplan"
-						active={this.props.mode === Body.MODE_FLOOR_IMAGERY}
-						disabled={this.props.mode === Body.MODE_FLOOR_IMAGERY}
-						onClick={() => PubSub.publish("body.mode.set", { mode: Body.MODE_FLOOR_IMAGERY })}
-						title="导入平面图"//{I18n.t("Import floor plans")}
-					>
-						{/* <Layers /> <span className="hide-smDown">{I18n.t("Import floor plans")}</span> */}
-						<Layers /> <span className="hide-smDown">导入平面图</span>
-					</Button>
-
-					<Dropdown>
-						<Dropdown.Toggle
-							variant="primary"
-							className="mr-2 btn-mode-editindoor"
-							title="编辑地图"//{I18n.t("Edit map")}
-						>
-							{/* <Pencil /> <span className="hide-smDown">{I18n.t("Edit map")}</span> */}
-							<Pencil /> <span className="hide-smDown">编辑地图</span>
-						</Dropdown.Toggle>
-
-						<Dropdown.Menu>
-							<Dropdown.Item
-								active={this.props.mode === Body.MODE_BUILDING}
-								onClick={() => PubSub.publish("body.right_panel.change", { tab: "create" })}
-							>
-								新地图{/* {I18n.t("Edit buildings")} */}
-							</Dropdown.Item>
-							<Dropdown.Item
-								active={this.props.mode === Body.MODE_BUILDING}
-								onClick={() => PubSub.publish("body.mode.set", { mode: Body.MODE_BUILDING })}
-							>
-								编辑建筑{/* {I18n.t("Edit buildings")} */}
-							</Dropdown.Item>
-							<Dropdown.Item
-								active={this.props.mode === Body.MODE_LEVELS}
-								disabled={!this.props.building}
-								onClick={() => PubSub.publish("body.mode.set", { mode: Body.MODE_LEVELS })}
-							>
-								{`编辑楼层轮廓 ${this.props.building ? Body.GetFeatureName(this.props.building) : "未选择建筑"}`}
-								{/*I18n.t("Edit levels outlines (%{name})", {
-									name: this.props.building ? Body.GetFeatureName(this.props.building) : I18n.t("no selected building")
-								})*/}
-							</Dropdown.Item>
-							<Dropdown.Item
-								active={this.props.mode === Body.MODE_FEATURES}
-								disabled={!this.props.building}
-								onClick={() => PubSub.publish("body.mode.set", { mode: Body.MODE_FEATURES })}
-							>
-								{`编辑功能 ${this.props.building ? Body.GetFeatureName(this.props.building) : "未选择建筑"}`}
-								{/*I18n.t("Edit features (%{name})", {
-									name: this.props.building ? Body.GetFeatureName(this.props.building) : I18n.t("no selected building")
-								})*/}
-							</Dropdown.Item>
-						</Dropdown.Menu>
-					</Dropdown> 
-					
-					<Dropdown>
-						<Dropdown.Toggle
-							variant="primary"
-							className="btn-mode-editindoor"
-							title="账户操作"
-						>
-							<Account /> <span className="hide-smDown">账户操作</span>
-						</Dropdown.Toggle>
-
-						<Dropdown.Menu>
-							<Dropdown.Item
-								onClick={() => PubSub.publish("body.login.open")}
-								disabled={!window.editor_user_auth || window.editor_user_auth.authenticated()}
-							>
-								{this.state.accountName}
-							</Dropdown.Item>
-							<Dropdown.Item
-								onClick={() => PubSub.publish("body.right_panel.change", { tab: "manage" })}
-							>
-								管理地图
-							</Dropdown.Item>
-							<Dropdown.Divider />
-							<Dropdown.Item
-								// onClick={() => PubSub.publish("body.panel.toggle", { panel: "right" })}
-								disabled
-							>
-								切换账号
-							</Dropdown.Item>
-							<Dropdown.Item
-								// onClick={() => PubSub.publish("body.mode.set", { mode: Body.MODE_BUILDING })}
-								disabled
-							>
-								退出登录
-							</Dropdown.Item>
-						</Dropdown.Menu>
-					</Dropdown> 
-				</ButtonToolbar>
-			</div>
-
-			{isEditingIndoor &&
-				<div className="hide-mdDown"><Navigator {...this.props} /></div>
-			}
-
-			{/* {this.props.mode === Body.MODE_EXPLORE &&
-				<span className="hide-xsDown"><SearchPlace /></span>
-			} */}
-		</Navbar>;
-	}
-}
-
-export default Header;

+ 0 - 96
src/view/LeftPanel.js

@@ -1,96 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import BuildingEdit from './panes/BuildingEdit';
-import Changeset from './panes/Changeset';
-import FeatureCreate from './panes/features/Create';
-import FeatureEdit from './panes/features/Edit';
-import FeatureView from './panes/features/View';
-import FloorImagery from './panes/FloorImagery';
-import LevelsEditAll from './panes/levels/EditAll';
-import LevelsEditOne from './panes/levels/EditOne';
-
-/**
- * Left panel component handles everything being on the left of the map.
- * It manages mainly places search, various feature editing.
- */
-class LeftPanel extends Component {
-	/** ID for building edit pane **/
-	static PANE_BUILDING_EDIT = 1;
-
-	/** ID for adding new levels contour pane **/
-	static PANE_LEVELS_ADD = 2;
-
-	/** ID for all levels edit pane **/
-	static PANE_LEVELS_EDIT = 3;
-
-	/** ID for new feature pane **/
-	static PANE_FEATURE_ADD = 4;
-
-	/** ID for feature edit pane **/
-	static PANE_FEATURE_EDIT = 5;
-
-	/** ID for feature view pane **/
-	static PANE_FEATURE_VIEW = 6;
-
-	/** ID for review changeset pane **/
-	static PANE_CHANGESET = 7;
-
-	/** ID for floor imagery pane **/
-	static PANE_FLOOR_IMAGERY = 8;
-
-	render() {
-		let component;
-
-		switch(this.props.pane) {
-			case LeftPanel.PANE_BUILDING_EDIT:
-				component = <BuildingEdit {...this.props} />;
-				break;
-
-			case LeftPanel.PANE_LEVELS_ADD:
-				component = <LevelsEditAll {...this.props} />;
-				break;
-
-			case LeftPanel.PANE_LEVELS_EDIT:
-				component = <LevelsEditOne {...this.props} />;
-				break;
-
-			case LeftPanel.PANE_FEATURE_ADD:
-				component = <FeatureCreate {...this.props} />;
-				break;
-
-			case LeftPanel.PANE_FEATURE_EDIT:
-				component = <FeatureEdit {...this.props} />;
-				break;
-
-			case LeftPanel.PANE_FEATURE_VIEW:
-				component = <FeatureView {...this.props} />;
-				break;
-
-			case LeftPanel.PANE_CHANGESET:
-				component = <Changeset {...this.props} />;
-				break;
-
-			case LeftPanel.PANE_FLOOR_IMAGERY:
-				component = <FloorImagery {...this.props} />;
-				break;
-
-			default:
-				component = <div></div>;
-		}
-
-		return component;
-	}
-}
-
-export default LeftPanel;

+ 13 - 10
src/view/Map.js

@@ -14,24 +14,27 @@ import React, { Component } from 'react';
 import 'leaflet/dist/leaflet.css';
 import L from 'leaflet';
 import 'leaflet-hash';
-import { Map, TileLayer/*, WMSTileLayer*/, AttributionControl, ScaleControl } from 'react-leaflet';
+import { Map, TileLayer, /*WMSTileLayer,*/ AttributionControl, ScaleControl } from 'react-leaflet';
 // import { BingLayer } from 'react-leaflet-bing';
+import Spinner from 'react-bootstrap/Spinner';
+import PubSub from 'pubsub-js';
+
 import Body from './Body';
+import PACKAGE from '../../package.json';
+
 // import Building from './layers/Building';
 import Features from './layers/Features';
 import FloorImagery from './layers/FloorImagery';
-import I18n from '../config/locales/ui';
 // import Levels from './layers/Levels';
-import LevelSelector from './common/LevelSelector';
+import MoveableObject from './layers/MoveableObject';
+
 import MapStyler from '../model/mapcss/MapStyler';
+import LevelSelector from './common/LevelSelector';
 import NorthPointer from './common/NorthPointer';
-import PACKAGE from '../../package.json';
-import PubSub from 'pubsub-js';
 // import SidePanelButton from './common/SidePanelButton';
-import Spinner from 'react-bootstrap/Spinner';
-import MoveableObject from './layers/MoveableObject';
 // import PreviewButton from './common/PreviewButton';
 
+
 const MAP_MAX_ZOOM = 22;
 const MAP_MIN_ZOOM = 8;
 
@@ -195,7 +198,7 @@ class MyMap extends Component {
 							this.setState({ loading: false, dataready: result });
 						}
 						catch(e) {
-							alert(I18n.t("Can't download data from OSM server. Please retry later."));
+							alert("Can't download data from OSM server. Please retry later.");
 							this.setState({ loading: false, dataready: false });
 						}
 					}
@@ -292,8 +295,8 @@ class MyMap extends Component {
 			attribution="&copy 高德地图"
 			url={url}
 			// key={url}
-			minZoom={MAP_MIN_ZOOM}//{l.properties.min_zoom}
-			maxNativeZoom={18}//{l.properties.max_zoom}
+			minZoom={MAP_MIN_ZOOM}	//{l.properties.min_zoom}
+			maxNativeZoom={18}	//{l.properties.max_zoom}
 			maxZoom={MAP_MAX_ZOOM}
 			opacity={opacity}
 			tms={l.properties.url.indexOf("{-y}") > 0}

+ 0 - 26
src/view/RightPanel.js

@@ -1,26 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-// import Imagery from './panes/Imagery';
-import MapDashboard from './panes/MapDashboard'
-
-class RightPanel extends Component {
-	render() {
-		return <div>
-			{/* <Imagery {...this.props} /> */}
-			<MapDashboard {...this.props} />
-		</div>;
-	}
-}
-
-export default RightPanel;

+ 0 - 238
src/view/Toolbar.js

@@ -1,238 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Body from './Body';
-import Button from 'react-bootstrap/Button';
-import Dropzone from 'react-dropzone';
-import Modal from 'react-bootstrap/Modal';
-import ButtonGroup from 'react-bootstrap/ButtonGroup';
-import ContentSave from 'mdi-react/ContentSaveIcon';
-// import MapCheck from 'mdi-react/MapCheckIcon';
-import Import from 'mdi-react/ImportIcon';
-import Export from 'mdi-react/ExportIcon';
-import FloorImageryButtons from './common/FloorImageryButtons';
-// import I18n from '../config/locales/ui';
-import IndoorEditButtons from './common/IndoorEditButtons';
-import PubSub from 'pubsub-js';
-import Undo from 'mdi-react/UndoIcon';
-import Redo from 'mdi-react/RedoIcon';
-
-/**
- * Toolbar is a panel where user can access tools related to current mode of the editor.
- */
-class Toolbar extends Component {
-	state = {
-		isImport: false,
-		isImported: false
-	}
-
-	loadedData = null
-
-	_onSave() {
-		if(this.props.mode === Body.MODE_FLOOR_IMAGERY) {
-			PubSub.publish("body.floorimagery.save");
-		}
-		else {
-			PubSub.publish("body.mode.set", { mode: Body.MODE_CHANGESET })
-		}
-	}
-
-	_onImport = () => {
-		// console.log("click import");
-		this.setState({
-			isImport: true
-		});
-	}
-
-	_onExport = () => {
-		// console.log("click export");
-		PubSub.publish("body.draw.export");
-	}
-
-	_Import = () => {
-		if(this.state.isImported){
-			// console.log("import");
-			PubSub.publish("body.draw.loaded", this.loadedData);
-			this.setState({
-				isImported: false,
-				isImport: false
-			});
-		}
-	}
-
-	_onCancleImport = () => {
-		// console.log("_onCancleImport");
-		this.setState({
-			isImport: false
-		});
-	}
-	
-	_onDropImages(files) {
-		if(files.length > 0) {
-			// Full config file
-			if(files.length === 1 && files[0].type === "application/json") {
-				// Parse
-				const reader = new FileReader();
-				reader.onload = () => {
-					try {
-						const json = JSON.parse(reader.result);
-						// console.log(json);
-
-						if(json && "type" in json) {
-							if(json.type === "FeatureCollection"){
-								this.loadedData = json;
-								this.setState({
-									isImported: true
-								});
-								alert("文件上传成功!");
-							}
-						}
-					}
-					catch(e) { console.error(e); }
-				};
-				reader.readAsText(files[0]);
-			}
-		}
-	}
-
-	render() {
-		let canUndo, canRedo, canSave, nbEdits;
-
-		if(this.props.mode === Body.MODE_FLOOR_IMAGERY) {
-			canUndo = window.imageryManager.canUndo();
-			canRedo = window.imageryManager.canRedo();
-			canSave = window.imageryManager.getFloorImages().length > 0;
-			nbEdits = window.imageryManager.getAmountEdits();
-		}
-		else {
-			canUndo = window.vectorDataManager.canUndo();
-			canRedo = window.vectorDataManager.canRedo();
-			canSave = canUndo;
-			nbEdits = window.vectorDataManager.getAmountEdits();
-		}
-
-		return <div className="app-toolbar p-2">
-			<div className="d-flex justify-content-between">
-				<div>
-					{this.props.mode === Body.MODE_FLOOR_IMAGERY ?
-						<FloorImageryButtons {...this.props} />
-						:
-						<IndoorEditButtons {...this.props} />
-					}
-				</div>
-
-				<div>
-					<ButtonGroup className="mr-2" aria-label="Undo and redo">
-						<Button
-							variant="outline-secondary"
-							size="sm"
-							disabled={!canUndo}
-							title="取消上一步操作"//{I18n.t("Cancel last operation")}
-							onClick={() => PubSub.publish("body.action.undo")}
-						>
-							<Undo />
-						</Button>
-
-						<Button
-							variant="outline-secondary"
-							size="sm"
-							disabled={!canRedo}
-							title="应用上一步取消的操作"//{I18n.t("Apply again last cancelled operation")}
-							onClick={() => PubSub.publish("body.action.redo")}
-						>
-							<Redo />
-						</Button>
-					</ButtonGroup>
-
-					{/* <Button
-						variant="primary"
-						size="sm"
-						className="mr-2"
-						active={this.props.mode === Body.MODE_PREVIEW}
-						disabled={this.props.mode === Body.MODE_PREVIEW}
-						onClick={() => PubSub.publish("body.preview.open")}
-						title={I18n.t("Preview your changes on indoor=")}
-					>
-						<MapCheck />
-						<span className="hide-mdDown">{I18n.t("Preview")}</span>
-					</Button> */}
-					
-					<Button
-						variant="primary"
-						size="sm"
-						className="mr-2"
-						onClick={this._onImport}
-						title={"导入数据文件"}
-					>
-						{/* <MapCheck /> */}
-						<Import />
-						<span className="hide-mdDown">导入{/*I18n.t("Preview")*/}</span>
-					</Button>
-					
-					<Button
-						variant="primary"
-						size="sm"
-						className="mr-2"
-						onClick={this._onExport}
-						title={"导出数据文件并下载到本地"}
-					>
-						<Export />
-						<span className="hide-mdDown">导出</span>
-						{nbEdits > 0 && " ("+nbEdits+")"}
-					</Button>
-
-					<Button
-						variant={nbEdits < 30 ? "success" : (nbEdits < 100 ? "warning" : "danger")}
-						size="sm"
-						disabled={!canSave}
-						//title={this.props.mode === Body.MODE_FLOOR_IMAGERY ? I18n.t("Save positionning of floor plans") : I18n.t("Send your changes to OpenStreetMap")}
-						title={this.props.mode === Body.MODE_FLOOR_IMAGERY ? "保存平面图的定位" : "保存数据"}
-						onClick={() => this._onSave()}
-					>
-						<ContentSave />
-						<span className="hide-mdDown">保存{/*I18n.t("Save")*/}</span>
-						{nbEdits > 0 && " ("+nbEdits+")"}
-					</Button>
-				</div>
-				<Modal show={this.state.isImport} onHide={this._onCancleImport} size="lg">
-					<Modal.Header closeButton>
-						<Modal.Title>导入文件</Modal.Title>
-					</Modal.Header>
-					<Modal.Body>
-						<Dropzone
-							accept="application/json"
-							onDrop={files => this._onDropImages(files)}
-						>
-							{({getRootProps, getInputProps}) => (
-								<div className="dropzone m-0 mt-3 w-100" {...getRootProps()}>
-									<input {...getInputProps()} />
-									<p>
-									将您的数据文件拖放到此处(或单击打开文件浏览器)<br />
-										<small>支持的格式: JSON</small>
-									</p>
-								</div>
-							)}
-						</Dropzone>
-					</Modal.Body>
-					<Modal.Footer>
-						<Button variant="success" onClick={this._Import}>
-							导入
-						</Button>
-					</Modal.Footer>
-				</Modal>
-			</div>
-		</div>;
-	}
-}
-
-export default Toolbar;

+ 0 - 54
src/view/common/ChangesetDiff.js

@@ -1,54 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import DotsHorizontal from 'mdi-react/DotsHorizontalIcon';
-import ListGroup from 'react-bootstrap/ListGroup';
-import MapMarker from 'mdi-react/MapMarkerIcon';
-import VectorLine from 'mdi-react/VectorLineIcon';
-import VectorSquare from 'mdi-react/VectorSquareIcon';
-
-/**
- * Changeset diff component allows to show to user what edits have been done.
- */
-class ChangesetDiff extends Component {
-	render() {
-		const typeIcon = {
-			"Point": <MapMarker />,
-			"LineString": <VectorLine />,
-			"Polygon": <VectorSquare />,
-			"MultiPolygon": <VectorSquare />
-		};
-
-		return <ListGroup>
-			{Object.entries(this.props.diff)
-				.map(e => {
-					const [ elemId, elemDiff ] = e;
-					const color = elemDiff.created ? "green" : (elemDiff.deleted ? "red" : "orange");
-
-					return <ListGroup.Item
-						action
-						className="p-1"
-						key={elemId}
-						style={{color: color}}
-						title={Object.entries(elemDiff.metadata.tags).map(e => e.join(" = ")).join("\n")}
-					>
-						{typeIcon[elemDiff.metadata.geometry] || <DotsHorizontal />}
-						{elemDiff.metadata.name}
-					</ListGroup.Item>;
-				})
-			}
-		</ListGroup>;
-	}
-}
-
-export default ChangesetDiff;

+ 0 - 102
src/view/common/FloorImageryButtons.js

@@ -1,102 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import ArrowExpand from 'mdi-react/ArrowExpandIcon';
-import AxisArrow from 'mdi-react/AxisArrowIcon';
-import Button from 'react-bootstrap/Button';
-import ButtonGroup from 'react-bootstrap/ButtonGroup';
-import Close from 'mdi-react/CloseIcon';
-import ContentCopy from 'mdi-react/ContentCopyIcon';
-import ContentPaste from 'mdi-react/ContentPasteIcon';
-import I18n from '../../config/locales/ui';
-import PubSub from 'pubsub-js';
-import RotateRight from 'mdi-react/RotateRightIcon';
-
-/**
- * FloorImageryButtons component handles tool buttons to show in toolbar when editing floor plans.
- */
-class FloorImageryButtons extends Component {
-	render() {
-		const floorImgs = window.imageryManager.getFloorImages();
-		const f = floorImgs.find(f => f.selected);
-
-		return f ? <div>
-			<ButtonGroup>
-				<Button
-					size="sm"
-					variant={this.props.floorImageryMode === "distort" ? "primary" : "outline-secondary"}
-					onClick={() => PubSub.publish("body.floorimagery.mode", { mode: this.props.floorImageryMode === "distort" ? null : "distort" })}
-					disabled={!f.visible}
-					title={I18n.t("Distort this plan")}
-				>
-					<AxisArrow />
-				</Button>
-
-				<Button
-					size="sm"
-					variant={this.props.floorImageryMode === "scale" ? "primary" : "outline-secondary"}
-					onClick={() => PubSub.publish("body.floorimagery.mode", { mode: this.props.floorImageryMode === "scale" ? null : "scale" })}
-					disabled={!f.visible}
-					title={I18n.t("Scale this plan")}
-				>
-					<ArrowExpand />
-				</Button>
-
-				<Button
-					size="sm"
-					variant={this.props.floorImageryMode === "rotate" ? "primary" : "outline-secondary"}
-					onClick={() => PubSub.publish("body.floorimagery.mode", { mode: this.props.floorImageryMode === "rotate" ? null : "rotate" })}
-					disabled={!f.visible}
-					title={I18n.t("Rotate this plan")}
-				>
-					<RotateRight />
-				</Button>
-			</ButtonGroup>
-
-			<ButtonGroup>
-				<Button
-					size="sm"
-					variant="outline-secondary"
-					className="ml-1"
-					onClick={() => PubSub.publish("body.floorimagery.copyposition")}
-					disabled={!f.visible}
-					title={I18n.t("Copy position of this plan")}
-				>
-					<ContentCopy />
-				</Button>
-
-				<Button
-					size="sm"
-					variant="outline-secondary"
-					onClick={() => PubSub.publish("body.floorimagery.pasteposition")}
-					disabled={!f.visible || !this.props.floorImageryCopyPaste}
-					title={I18n.t("Move this plan to copied position")}
-				>
-					<ContentPaste />
-				</Button>
-			</ButtonGroup>
-
-			<Button
-				variant="outline-danger"
-				onClick={() => PubSub.publish("body.floorimagery.remove", { id: f.id })}
-				className="ml-1"
-				size="sm"
-				title={I18n.t("Delete this plan")}
-			>
-				<Close /> <span className="hide-mdDown">{I18n.t("Delete this plan")}</span>
-			</Button>
-		</div> : <div></div>;
-	}
-}
-
-export default FloorImageryButtons;

+ 0 - 48
src/view/common/GeometryButtons.js

@@ -1,48 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Button from 'react-bootstrap/Button';
-import ButtonGroup from 'react-bootstrap/ButtonGroup';
-import Check from 'mdi-react/CheckIcon';
-import Close from 'mdi-react/CloseIcon';
-// import I18n from '../../config/locales/ui';
-import PubSub from 'pubsub-js';
-
-/**
- * Geometry buttons component shows confirm/cancel buttons for editing geometries.
- */
-class GeometryButtons extends Component {
-	render() {
-		return <div>
-			点击地图开始绘制{/*I18n.t("Click on the map to start drawing the feature")*/}
-			<ButtonGroup style={{marginLeft: 10}}>
-				<Button
-					variant="success"
-					size="sm"
-					onClick={() => PubSub.publish("body.draw.stop")}
-				>
-					<Check size={24} /> 完成{/*I18n.t("Done")*/}
-				</Button>
-				<Button
-					variant="outline-danger"
-					size="sm"
-					onClick={() => PubSub.publish("body.draw.cancel")}
-				>
-					<Close size={24} /> 取消{/*I18n.t("Cancel")*/}
-				</Button>
-			</ButtonGroup>
-		</div>;
-	}
-}
-
-export default GeometryButtons;

+ 0 - 53
src/view/common/GeometryTypeSelect.js

@@ -1,53 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Col from 'react-bootstrap/Col';
-import Container from 'react-bootstrap/Container';
-// import I18n from '../../config/locales/ui';
-import MapMarker from 'mdi-react/MapMarkerIcon';
-import VectorLine from 'mdi-react/VectorLineIcon';
-import VectorSquare from 'mdi-react/VectorSquareIcon';
-import Row from 'react-bootstrap/Row';
-
-/**
- * Geometry type select allows user to choose one type of geometry between several available.
- */
-class GeometryTypeSelect extends Component {
-	render() {
-		const availableTypes = [
-			{ id: "node", name: "点"/*I18n.t("Point")*/, icon: <MapMarker />, desc: "用于小的功能区(大小在2米以下)" },//I18n.t("For small features (size less than 2 meters)") },
-			{ id: "way", name: "线"/*I18n.t("Line")*/, icon: <VectorLine />, desc: "用于长但是不大的功能" },//I18n.t("For long but not large features") },
-			{ id: "closedway", name: "区域"/*I18n.t("Area")*/, icon: <VectorSquare />, desc: "用于宽敞的功能区(面积大于几m²)" },//I18n.t("For wide features (surface of more than a few m²)") }
-		].filter(t => !this.props.types || this.props.types.length === 0 || this.props.types.includes(t.id));
-
-		return <Container>
-			{availableTypes.map((t,i) => (
-				<Row
-					key={i}
-					className="app-geomtype"
-					onClick={() => this.props.onClick(t.id)}
-				>
-					<Col xs={2}>
-						{t.icon}
-					</Col>
-					<Col className="app-geomtype-text">
-						<span>{t.name}</span>
-						<span>{t.desc}</span>
-					</Col>
-				</Row>
-			))}
-		</Container>;
-	}
-}
-
-export default GeometryTypeSelect;

+ 0 - 187
src/view/common/IndoorEditButtons.js

@@ -1,187 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import ArrowExpandDown from 'mdi-react/ArrowExpandDownIcon';
-import ArrowExpandUp from 'mdi-react/ArrowExpandUpIcon';
-import Body from '../Body';
-import Button from 'react-bootstrap/Button';
-import ButtonGroup from 'react-bootstrap/ButtonGroup';
-import Delete from 'mdi-react/DeleteIcon';
-import GeometryButtons from './GeometryButtons';
-// import I18n from '../../config/locales/ui';
-import Layers from 'mdi-react/LayersIcon';
-import OfficeBuilding from 'mdi-react/OfficeBuildingIcon';
-import PubSub from 'pubsub-js';
-import SquareEditOutline from 'mdi-react/SquareEditOutlineIcon';
-import VectorSquare from 'mdi-react/VectorSquareIcon';
-
-/**
- * Indoor edit buttons are buttons shown in the toolbar when editing indoor data.
- */
-class IndoorEditButtons extends Component {
-	render() {
-		// Drawing geometry
-		if(this.props.draw) {
-			return <GeometryButtons />;
-		}
-		else {
-			// Not zoomed enough
-			if(this.props.zoom && this.props.zoom < window.CONFIG.data_min_zoom) {
-				return <p>请放大以编辑数据{/*I18n.t("Please zoom-in to edit data")*/}</p>;
-			}
-			// Zoomed enough
-			else {
-				if(this.props.mode === Body.MODE_BUILDING) {
-					return <div>
-						{this.props.building && [
-							<Button
-								variant="primary"
-								title="编辑此楼层中包含的对象"//{I18n.t("Edit objects contained in this floor")}
-								onClick={() => PubSub.publish("body.mode.set", { mode: Body.MODE_FEATURES })}
-								size="sm"
-								className="mr-1"
-								key={0}
-							>
-								<Layers /> 编辑功能{/*I18n.t("Edit features")*/}
-							</Button>
-							,
-							<Button
-								variant="outline-danger"
-								onClick={() => PubSub.publish("body.delete.feature")}
-								size="sm"
-								className="mr-1"
-								key={1}
-								title="删除此建筑"//{I18n.t("Delete this building")}
-							>
-								<Delete />
-							</Button>
-						]}
-
-						{this.props.building &&
-							<Button
-								variant="outline-secondary"
-								onClick={() => PubSub.publish("body.square.feature")}
-								size="sm"
-								className="mr-1"
-								title="矩形化建筑"//{I18n.t("Square this building")}
-							>
-								<VectorSquare />
-							</Button>
-						}
-
-						<Button
-							variant={this.props.building ? "outline-secondary" : "primary"}
-							size="sm"
-							title="单击以从头开始创建新建筑"//{I18n.t("Click to start creating a new building from scratch")}
-							onClick={() => PubSub.publish("body.draw.building")}
-						>
-							<OfficeBuilding /> <span className={this.props.building ? "hide-mdDown" : ""}>新建筑{/*I18n.t("New building")*/}</span>
-						</Button>
-					</div>;
-				}
-				else if(this.props.mode === Body.MODE_LEVELS) {
-					const floorParts = window.vectorDataManager.getLevelFootprint(this.props.building, this.props.level || 0);
-
-					return <div>
-						{this.props.floor && [
-							<Button
-								variant="outline-secondary"
-								onClick={() => PubSub.publish("body.square.feature")}
-								size="sm"
-								className="mr-1"
-								key={0}
-								title="矩形化楼层部件"//{I18n.t("Square this floor part")}
-							>
-								<VectorSquare />
-							</Button>
-							,
-							<Button
-								variant="outline-danger"
-								onClick={() => PubSub.publish("body.delete.feature")}
-								size="sm"
-								className="mr-1"
-								key={1}
-								title="删除此楼层部件"//{I18n.t("Delete this floor part")}
-							>
-								<Delete />
-							</Button>
-						]}
-
-						{floorParts.length > 0 &&
-							<Button
-								variant="outline-secondary"
-								onClick={() => PubSub.publish("body.draw.floor")}
-								size="sm"
-								className="mr-1"
-								title="在这层中创建新的楼层部件。可用于为单个层的部件命名。"
-								//{I18n.t("Create a new floor part in this level. Useful for giving different names to parts of a single level.")}
-							>
-								<SquareEditOutline /> <span className="hide-mdDown">添加另一个楼层部件{/*I18n.t("Add another floor part")*/}</span>
-							</Button>
-						}
-
-						<ButtonGroup>
-							<Button
-								variant="outline-primary"
-								title="在最上层创建新楼层"//{I18n.t("Create a new level on top of existing ones")}
-								onClick={() => PubSub.publish("body.level.add", { where: "upper" })}
-								size="sm"
-							>
-								<ArrowExpandUp /> <span className="hide-mdDown">新顶层{/*I18n.t("New upper level")*/}</span>
-							</Button>
-							<Button
-								variant="outline-primary"
-								title="在最下层创建新楼层"//{I18n.t("Create a new level under existing ones")}
-								onClick={() => PubSub.publish("body.level.add", { where: "below" })}
-								size="sm"
-							>
-								<ArrowExpandDown /> <span className="hide-mdDown">新底层{/*I18n.t("New below level")*/}</span>
-							</Button>
-						</ButtonGroup>
-					</div>;
-				}
-				else if(this.props.mode === Body.MODE_FEATURES) {
-					return <div>
-						{this.props.feature && this.props.feature.id.startsWith("way/") &&
-							<Button
-								variant="outline-secondary"
-								onClick={() => PubSub.publish("body.square.feature")}
-								size="sm"
-								className="mr-1"
-								title="矩形化此功能"//{I18n.t("Square this feature")}
-							>
-								<VectorSquare />
-							</Button>
-						}
-
-						{this.props.feature &&
-							<Button
-								variant="outline-danger"
-								onClick={() => PubSub.publish("body.delete.feature")}
-								size="sm"
-								title="删除此功能"//{I18n.t("Delete this feature")}
-							>
-								<Delete />
-							</Button>
-						}
-					</div>;
-				}
-				else {
-					return <span></span>;
-				}
-			}
-		}
-	}
-}
-
-export default IndoorEditButtons;

+ 0 - 140
src/view/common/MapManageList.js

@@ -1,140 +0,0 @@
-import React, { Component } from 'react';
-import ListGroup from 'react-bootstrap/ListGroup';
-import Button from 'react-bootstrap/Button';
-import Modal from 'react-bootstrap/Modal';
-import PubSub from 'pubsub-js';
-
-function MapManageItem({map}){	
-	function convertToLocaleDateTime(utcTimeString) {
-		// 创建一个Date对象,传入UTC时间字符串
-		var utcDate = new Date(utcTimeString);
-	
-		// 获取年月日时分秒
-		var year = utcDate.getFullYear();
-		var month = ("0" + (utcDate.getMonth() + 1)).slice(-2); // 月份从0开始,所以加1
-		var day = ("0" + utcDate.getDate()).slice(-2);
-		var hours = ("0" + utcDate.getHours()).slice(-2);
-		var minutes = ("0" + utcDate.getMinutes()).slice(-2);
-		var seconds = ("0" + utcDate.getSeconds()).slice(-2);
-	
-		// 返回格式化的日期时间字符串
-		return `${year}年${month}月${day}日 ${hours}:${minutes}:${seconds}`;
-	}
-
-	function renameHandle(){
-		// PubSub.publish('editor.map.rename', {id: map.map_id});
-	}
-
-	function editHandle(){
-		PubSub.publish('editor.map.edit', {id: map.map_id});
-	}
-
-	function deleteHandle(){
-        PubSub.publish('manage.map.delete', map.map_id);
-	}
-
-	return (
-		<>
-			<ListGroup.Item>
-				<span style={{fontSize: "20px"}}>地图名:{map.map_name}</span><br/>
-				<span style={{fontSize: "16px"}}>地图ID:{map.map_uuid}</span><br/>
-				<span style={{fontSize: "13px"}}> 保存时间:{convertToLocaleDateTime(map.update_time)}</span><br/>
-				<span style={{fontSize: "13px"}}> 创建时间:{convertToLocaleDateTime(map.create_time)}</span><br/><br/>
-				<Button className="mr-2" variant="primary" size='sm' onClick={renameHandle} disabled>重命名</Button>
-				<Button className="mr-2" variant="primary" size='sm' onClick={editHandle}>编辑</Button>
-				<Button className="mr-2" variant="danger" size='sm' onClick={deleteHandle}>删除</Button>
-			</ListGroup.Item>
-		</>
-	)
-}
-
-class MapManageList extends Component {
-	state = {
-        items: [],
-        message: false,
-        showDelete: false,
-        deletingMap: 0,
-    }
-
-    componentDidMount(){
-        PubSub.subscribe('body.map.got', () => {       
-            // this.setState({items: []});
-            this.refreshData();
-            this.setState({message: true});
-            setTimeout(() => {
-                this.setState({message: false});
-            }, 1000);
-        });
-
-        PubSub.subscribe('manage.map.delete', (msg, data) => {            
-            this.setState({showDelete: true, deletingMap: data});
-        })
-
-        this.refreshData();
-    }
-
-	refreshData(){
-        let its = []
-		for (let i = 0; i < window.editor_user.maps.length; i++) {
-			const map = window.editor_user.maps[i];
-			its.push(<MapManageItem map={map} key={map.map_id}/>);
-		}
-        this.setState({items: its});
-        // console.log('refresh manage list', window.editor_user.maps, this.state.items);
-	}
-
-    closeDelete = () => {
-        // console.log('close');
-        this.setState({showDelete: false});
-    }
-
-    clickDelete = () => {
-		PubSub.publish('editor.map.delete', {id: this.state.deletingMap});
-        this.closeDelete();
-    }
-
-	render(){
-        return (
-            <>
-                <ListGroup style={{width: "100%"}}>
-                    {this.state.items}
-                </ListGroup>
-
-                <Modal
-                    size="sm"
-                    show={this.state.message}
-                    // onHide={() => setSmShow(false)}
-                    aria-labelledby="example-modal-sizes-title-sm"
-                >
-                    <Modal.Header>
-                        <Modal.Title id="example-modal-sizes-title-sm">
-                            操作成功
-                        </Modal.Title>
-                    </Modal.Header>
-                </Modal>
-                
-                <Modal size="sm" show={this.state.showDelete} style={{zIndex: 20010}}>
-                    <Modal.Header>
-                        <Modal.Title>删除地图</Modal.Title>
-                    </Modal.Header>
-
-                    <Modal.Body>
-                        确认删除这个地图吗?
-                    </Modal.Body>
-
-                    <Modal.Footer>
-                        <Button variant="secondary" onClick={this.closeDelete}>
-                            取消
-                        </Button>
-
-                        <Button variant="primary" onClick={this.clickDelete}>
-                            确认
-                        </Button>
-                    </Modal.Footer>
-                </Modal>
-            </>
-        )
-    } 
-}
-
-export default MapManageList;

+ 0 - 60
src/view/common/Navigator.js

@@ -1,60 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Body from '../Body';
-import Breadcrumb from 'react-bootstrap/Breadcrumb';
-import I18n from '../../config/locales/ui';
-import PubSub from 'pubsub-js';
-
-/**
- * Navigator is the breadcrumb allowing to travel through building hierarchy.
- */
-class Navigator extends Component {
-	render() {
-		return <Breadcrumb className="justify-content-center bc-dense breadcrumb-arrow">
-			<Breadcrumb.Item
-				onClick={e => {
-					PubSub.publishSync("body.mode.set", { mode: Body.MODE_BUILDING });
-					PubSub.publish("body.unselect.feature");
-				}}
-				active={this.props.mode === Body.MODE_BUILDING && !this.props.building}
-				title={I18n.t("Go back to building selection")}
-			>
-				{I18n.t("All buildings")}
-			</Breadcrumb.Item>
-
-			{this.props.building &&
-				<Breadcrumb.Item
-					onClick={e => PubSub.publish("body.mode.set", { mode: Body.MODE_BUILDING })}
-					active={this.props.mode === Body.MODE_BUILDING}
-					title={I18n.t("Edit this single building")}
-				>
-					{Body.GetFeatureName(this.props.building)}
-				</Breadcrumb.Item>
-			}
-
-			{[Body.MODE_LEVELS, Body.MODE_FEATURES].includes(this.props.mode) &&
-				<Breadcrumb.Item
-					onClick={e => PubSub.publish("body.unselect.feature")}
-					active={true}
-				>
-					{this.props.mode === Body.MODE_LEVELS ?
-						I18n.t("Levels structure (level %{lvl})", { lvl: this.props.level })
-						: I18n.t("Features (level %{lvl})", { lvl: this.props.level })}
-				</Breadcrumb.Item>
-			}
-		</Breadcrumb>;
-	}
-}
-
-export default Navigator;

+ 0 - 92
src/view/common/PresetCard.js

@@ -1,92 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import ChevronRight from 'mdi-react/ChevronRightIcon';
-import I18n from '../../config/locales/ui';
-import MapMarker from 'mdi-react/MapMarkerIcon';
-import MapMarkerMultiple from 'mdi-react/MapMarkerMultipleIcon';
-import MapMarkerPlus from 'mdi-react/MapMarkerPlusIcon';
-import Media from 'react-bootstrap/Media';
-
-const TAGS_ICONS = [ "amenity", "aeroway", "barrier", "emergency", "highway", "historic", "man_made", "railway", "shop", "tourism" ];
-
-/**
- * Preset card is a single entry of a PresetSelect list.
- */
-class PresetCard extends Component {
-	render() {
-		if(!this.props.preset) {
-			return <Media
-				className={(this.props.className || "")+" p-1 app-preset-card"}
-				onClick={() => this.props.onClick()}
-			>
-				<MapMarkerPlus size={32} className="align-self-center mr-2" style={{color: "gray"}} />
-
-				<Media.Body>
-					<h5>{I18n.t("Select a preset")}</h5>
-				</Media.Body>
-			</Media>;
-		}
-		else {
-			let icon = this.props.preset.icon || null;
-			const isGroup = this.props.preset.tags === undefined;
-
-			if(!icon && this.props.preset.tags) {
-				const tags = Object.entries(this.props.preset.tags).filter(e => TAGS_ICONS.includes(e[0]));
-				if(tags.length > 0) {
-					icon = window.EDITOR_URL + "img/icons/"+tags[0][0]+"_"+tags[0][1]+".png";
-
-					if(window.UNUSABLE_ICONS.has(icon)) {
-						icon = null;
-					}
-				}
-			}
-
-			return <Media
-				className={(this.props.className || "")+" p-1 app-preset-card"+(isGroup ? " app-preset-card-group" : "")}
-				onClick={() => this.props.onClick(this.props.preset)}
-			>
-				{icon &&
-					<img
-						width={32}
-						height={32}
-						className="align-self-center mr-2 app-preset-symbol"
-						src={icon}
-						alt={this.props.preset.name}
-						onError={e => {
-							e.target.style.display = "none";
-							window.UNUSABLE_ICONS.add(e.target.src);
-							this.forceUpdate();
-						}}
-					/>
-				}
-
-				{!icon && (this.props.preset.groups || this.props.preset.items ?
-					<MapMarkerMultiple size={32} className="align-self-center mr-2 app-preset-symbol" style={{color: "gray"}} />
-					:
-					<MapMarker size={32} className="align-self-center mr-2 app-preset-symbol" style={{color: "gray"}} />
-				)}
-
-				<Media.Body>
-					<h5>{this.props.preset.name}</h5>
-				</Media.Body>
-
-				{(this.props.preset.groups || this.props.preset.items) &&
-					<ChevronRight className="app-preset-enter align-self-center" size={32} />
-				}
-			</Media>;
-		}
-	}
-}
-
-export default PresetCard;

+ 0 - 257
src/view/common/PresetInputField.js

@@ -1,257 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Checkbox from 'react-three-state-checkbox';
-import Form from 'react-bootstrap/Form';
-import HelpCircle from 'mdi-react/HelpCircleIcon';
-import I18n from '../../config/locales/ui';
-import Multiselect from 'react-bootstrap-multiselect';
-import OverlayTrigger from 'react-bootstrap/OverlayTrigger';
-import Popover from 'react-bootstrap/Popover';
-import PubSub from 'pubsub-js';
-import 'react-bootstrap-multiselect/css/bootstrap-multiselect.css';
-
-/**
- * Preset input field is a component allowing user to set value for a certain tag, according to preset definition.
- */
-class PresetInputField extends Component {
-	constructor() {
-		super();
-
-		this.state = {
-			value: null
-		};
-	}
-
-	/**
-	 * Event handler for change in field value
-	 * @private
-	 */
-	_onEdit(val) {
-		this.setState({ value: val });
-
-		const applyChange = () => {
-			const newTags = Object.assign({}, this.props.tags, { [this.props.data.key]: val });
-
-			if(val === "null" || val.trim() === "") {
-				delete newTags[this.props.data.key];
-			}
-
-			PubSub.publish("body.tags.set", { tags: newTags });
-		};
-
-		// Should we delay tags change event or not (according to if its text input) ?
-		if(["combo", "check", "multiselect"].includes(this.props.type)) {
-			applyChange();
-		}
-		else {
-			if(this._timer) {
-				clearTimeout(this._timer);
-			}
-
-			this._timer = setTimeout(applyChange, 500);
-		}
-	}
-
-	render() {
-		const d = this.props.data;
-		const currentVal = typeof this.state.value === "string" ? this.state.value : (this.props.tags[d.key] || "");
-		let res = null;
-		let infoTip = null;
-
-		if(d.info) {
-			const popover = <Popover id="popover-basic" title={I18n.t("Help")} style={{padding: "5px 0px 5px 6px"}}>
-				{d.info}
-			</Popover>;
-			infoTip = <OverlayTrigger placement="right" overlay={popover} popperConfig={{modifiers:{preventOverflow:{boundariesElement: "window"}}}}>
-				<HelpCircle />
-			</OverlayTrigger>;
-		}
-
-		if(["text", "number"].includes(this.props.type)) {
-			res = <Form.Group className="m-0 mb-3">
-				<Form.Label>{d.text || d.key} {infoTip}</Form.Label>
-				<Form.Control
-					type={this.props.type}
-					placeholder={d.default}
-					value={currentVal}
-					onChange={e => this._onEdit(e.target.value)}
-					size="sm"
-				/>
-			</Form.Group>;
-		}
-		else if(this.props.type === "textarea") {
-			res = <Form.Group className="m-0 mb-3">
-				<Form.Label>{d.text || d.key} {infoTip}</Form.Label>
-				<Form.Control
-					as="textarea"
-					rows="3"
-					placeholder={d.default}
-					value={currentVal}
-					onChange={e => this._onEdit(e.target.value)}
-					size="sm"
-				/>
-			</Form.Group>;
-		}
-		else if(this.props.type === "combo") {
-			const values = d.list_entrys ? d.list_entrys.map(d => d.value) : (d.values || "").split("," || d.delimiter);
-			const displayValues = d.list_entrys ?
-				d.list_entrys.map(d => d.display_value || d.value)
-				: (d.display_values ?
-					d.display_values.split("," || d.delimiter)
-					: values);
-
-			res = <Form.Group className="m-0 mb-3">
-				<Form.Label>{d.text || d.key} {infoTip}</Form.Label>
-				<Form.Control
-					as="select"
-					onChange={e => this._onEdit(e.target.value)}
-					value={currentVal}
-					size="sm"
-				>
-					{(d.use_last_as_default === undefined || d.use_last_as_default === "false") &&
-						<option value={"null"}></option>
-					}
-					{values.map((e,i) => (
-						<option key={i} value={e || ""}>{displayValues[i]}</option>
-					))}
-				</Form.Control>
-			</Form.Group>;
-		}
-		else if(this.props.type === "check") {
-			const states = [
-				{ id: 0, val: d.value_on || "yes", label: I18n.t("Yes") },
-				{ id: 1, val: d.value_off || "no", label: I18n.t("No") },
-				{ id: 2, val: "null", label: I18n.t("Unknown") }
-			];
-
-			let currentState = 2;
-			const currentValState = states.filter(s => s.val === currentVal);
-			if(currentValState.length === 1) {
-				currentState = currentValState[0].id;
-			}
-
-			const onEvent = () => {
-				const newState = (currentState+1) % 3;
-				this._onEdit(states[newState].val);
-			};
-
-			res = <Form.Group className="m-0 mb-3 form-group-check">
-				<p className="m-0">{d.text || d.key} {infoTip}</p>
-
-				<Checkbox
-					checked={currentState === 0}
-					indeterminate={currentState === 2}
-					onChange={() => onEvent()}
-				/>
-
-				<Form.Check.Label onClick={() => onEvent()}>
-					{states[currentState].label}
-				</Form.Check.Label>
-			</Form.Group>;
-		}
-		else if(this.props.type === "binarycheck") {
-			const states = [
-				{ id: 0, val: d.value_on || "yes" },
-				{ id: 1, val: d.value_off || "null" }
-			];
-
-			let currentState = 1;
-			const currentValState = states.filter(s => s.val === currentVal);
-			if(currentValState.length === 1) {
-				currentState = currentValState[0].id;
-			}
-
-			const onEvent = () => {
-				const newState = (currentState+1) % 2;
-				this._onEdit(states[newState].val);
-			};
-
-			res = <Form.Group className="m-0 mb-3">
-				<Form.Check type="checkbox">
-					<Form.Check.Input
-						type="checkbox"
-						checked={currentState === 0}
-						onChange={() => onEvent()}
-					/>
-					<Form.Check.Label
-						onClick={() => onEvent()}
-					>
-						{d.text || d.key} {infoTip}
-					</Form.Check.Label>
-				</Form.Check>
-			</Form.Group>;
-		}
-		else if(this.props.type === "multiselect") {
-			let data = null;
-			const currentValues = currentVal.split(";");
-
-			if(d.list_entrys) {
-				data = d.list_entrys.map(e => ({
-					value: e.value,
-					label: e.display_value || e.value,
-					title: e.short_description,
-					selected: currentValues.includes(e.value)
-				}));
-			}
-			else {
-				data = d.values.split(";" || d.delimiter).map(e => ({ value: e, selected: currentValues.includes(e) }));
-				if(d.display_values) {
-					d.display_values.split(";" || d.delimiter).forEach((e,i) => {
-						data[i].label = e;
-					});
-				}
-			}
-
-			res = <Form.Group className="m-0 mb-3">
-				<Form.Label>{d.text || d.key} {infoTip}</Form.Label>
-				<Form.Control
-					as={Multiselect}
-					data={data}
-					multiple
-					ref={"multiselect-"+d.key}
-					size="sm"
-				/>
-			</Form.Group>;
-		}
-
-		return res;
-	}
-
-	componentDidMount() {
-		if(this.props.type === "multiselect") {
-			// Handle value changes on multiselect (is broken when using onChange prop on react component)
-			const ms = this.refs["multiselect-"+this.props.data.key]["$multiselect"][0];
-			ms.onchange = () => {
-				let val = [];
-				for(const elem of ms.selectedOptions) {
-					val.push(elem.value);
-				}
-				this._onEdit(val.join(";"));
-			};
-		}
-	}
-
-	componentDidUpdate(prevProps) {
-		// Re-sync internal state with value in component props
-		if(
-			(this.props.tags && this.props.data && this.props.data.key && this.props.tags[this.props.data.key] && (!prevProps.tags || !prevProps.data || !prevProps.data.key || !prevProps.tags[prevProps.data.key] || prevProps.tags[prevProps.data.key] !== this.props.tags[this.props.data.key]))
-			||
-			(prevProps.tags && prevProps.data && prevProps.data.key && prevProps.tags[prevProps.data.key] && (!this.props.tags || !this.props.data || !this.props.data.key || !this.props.tags[this.props.data.key] || prevProps.tags[prevProps.data.key] !== this.props.tags[this.props.data.key]))
-		) {
-			this.setState({ value: null });
-		}
-	}
-}
-
-export default PresetInputField;

+ 0 - 142
src/view/common/PresetSelect.js

@@ -1,142 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Button from 'react-bootstrap/Button';
-import ChevronLeft from 'mdi-react/ChevronLeftIcon';
-import Close from 'mdi-react/CloseIcon';
-import FormControl from 'react-bootstrap/FormControl';
-// import I18n from '../../config/locales/ui';
-import InputGroup from 'react-bootstrap/InputGroup';
-import Magnify from 'mdi-react/MagnifyIcon';
-import PresetCard from './PresetCard';
-
-/**
- * Preset select allows user to choose one preset between a structured list of presets.
- */
-class PresetSelect extends Component {
-	constructor() {
-		super();
-
-		this.state = {
-			path: "/",
-			text: ""
-		};
-	}
-
-	/**
-	 * Event handler for click on one entry
-	 * @private
-	 */
-	_onPresetClicked(preset) {
-		if(preset.groups || preset.items) {
-			this.setState({ path: this.state.path+preset.name+"/" });
-		}
-		else if(this.props.onSelect) {
-			this.props.onSelect(preset);
-		}
-	}
-
-	/**
-	 * Event handler for click on back button
-	 * @private
-	 */
-	_onBackClicked() {
-		if(this.state.path === "/" && this.props.onBack) {
-			this.props.onBack();
-		}
-		else {
-			const entries = this.state.path.split("/").filter(e => e !== "");
-			entries.pop();
-			this.setState({ path: entries.length > 0 ? "/"+entries.join("/")+"/" : "/" });
-		}
-	}
-
-	/**
-	 * Generate one entry for preset
-	 * @private
-	 */
-	_createEntry(key, item) {
-		return <PresetCard
-			key={key}
-			className="mb-2"
-			preset={item}
-			onClick={this._onPresetClicked.bind(this)}
-		/>;
-	}
-
-	render() {
-		let presets;
-		const hasSearch = this.state.text.trim().length > 0;
-
-		if(hasSearch) {
-			presets = window.presetsManager.findPresetsByName(this.state.text, this.props.filter);
-		}
-		else {
-			presets = window.presetsManager.getPresets(this.state.path, this.props.filter);
-		}
-
-		return <div className={this.props.className}>
-			<InputGroup className="mb-2">
-				{!hasSearch &&
-					<InputGroup.Prepend>
-						<InputGroup.Text>
-							<Magnify size={18} />
-						</InputGroup.Text>
-					</InputGroup.Prepend>
-				}
-
-				<FormControl
-					placeholder="搜索一个功能的类型..."//{I18n.t("Search a type of feature...")}
-					value={this.state.text}
-					onChange={e => this.setState({ text: e.target.value })}
-				/>
-
-				{hasSearch &&
-					<InputGroup.Append>
-						<Button
-							variant="outline-secondary"
-							onClick={() => this.setState({ text: "" })}
-						>
-							<Close size={16} />
-						</Button>
-					</InputGroup.Append>
-				}
-			</InputGroup>
-
-			{(this.state.path !== "/" || this.props.onBack) &&
-				<Button
-					variant="outline-secondary"
-					block
-					className="mb-2"
-					onClick={() => this._onBackClicked()}
-				>
-					<ChevronLeft style={{ float: "left" }} /> 返回{/*I18n.t("Back")*/}
-				</Button>
-			}
-
-			{this.state.path === "/" && !hasSearch && this.props.lastUsedPresets && this.props.lastUsedPresets.length > 0 &&
-				this.props.lastUsedPresets.map((p,i) => this._createEntry("lu"+i, p))
-			}
-			{presets && presets.groups && presets.groups.map((g,i) => this._createEntry("g"+i, g))}
-			{presets && presets.items && presets.items.map((it,i) => this._createEntry("i"+i, it))}
-		</div>;
-	}
-
-	componentDidMount() {
-		if(this.props.initialPath) {
-			this.setState({ path: this.props.initialPath });
-		}
-	}
-}
-
-export default PresetSelect;

+ 0 - 156
src/view/common/SearchPlace.js

@@ -1,156 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Button from 'react-bootstrap/Button';
-import FormControl from 'react-bootstrap/FormControl';
-import I18n from '../../config/locales/ui';
-import InputGroup from 'react-bootstrap/InputGroup';
-import Nominatim from 'nominatim-browser';
-import Magnify from 'mdi-react/MagnifyIcon';
-import Overlay from 'react-bootstrap/Overlay';
-import PubSub from 'pubsub-js';
-import SelectList from '../common/SelectList';
-import Spinner from 'react-bootstrap/Spinner';
-
-/**
- * SearchPlace is a search bar for searching cities or streets.
- */
-class SearchPlace extends Component {
-	constructor() {
-		super();
-
-		this.state = {
-			text: "",
-			loading: false,
-			searchResults: [],
-			showList: false
-		};
-	}
-
-	/**
-	 * @private
-	 */
-	_search(text, now) {
-		now = now || false;
-		this.setState({ text: text });
-
-		if(now || (text !== this.state.text && text.length >= 3)) {
-			this.setState({ loading: true, showList: true });
-
-			if(this._searchTimer) {
-				clearTimeout(this._searchTimer);
-			}
-			console.log(text);
-			this._searchTimer = setTimeout(() => {
-				Nominatim.geocode({
-					q: text,
-					// "accept-language": I18n.locale
-				})
-				.then(results => {
-					results = results.map(r => ({ label: r.display_name, coordinates: [ r.lat, r.lon ], bbox: r.boundingbox }));
-					this.setState({
-						loading: false,
-						showList: true,
-						searchResults: results
-					}, () => {
-						if(this._update) {
-							this._update();
-						}
-					});
-				})
-				.catch(error => {
-					console.error(error);
-					this.setState({ loading: false, searchResults: null, showList: false });
-				});
-			}, now ? 0 : 2000);
-		}
-	}
-
-	/**
-	 * @private
-	 */
-	_onSelect(addr) {
-		this.setState({ searchResults: [], text: "", showList: false });
-		PubSub.publish("map.position.set", addr);
-	}
-
-	render() {
-		return <div>
-			<Overlay
-				placement="bottom-end"
-				show={this.state.showList}
-				target={this.refs.input}
-				onHide={() => this.setState({ showList: false, searchResults: [] })}
-				rootClose={true}
-			>
-				{({
-					placement,
-					scheduleUpdate,
-					arrowProps,
-					outOfBoundaries,
-					show: _show,
-					...props
-				}) => {
-					this._update = scheduleUpdate;
-					return <div
-						{...props}
-						style={{...props.style, zIndex: 10000}}
-					>
-						{this.state.searchResults ?
-							<SelectList
-								data={this.state.searchResults}
-								type="oneshot"
-								onChange={selection => this._onSelect(selection[0])}
-								style={{fontSize: "0.8em"}}
-							/>
-							:
-							<p>{I18n.t("An error happened when searching address. Please retry.")}</p>
-						}
-
-						{this.state.loading &&
-							<div
-								className="text-center"
-								style={{
-									backgroundColor: "#f8f9fa",
-									borderRadius: "0.25rem",
-									border: "1px solid rgba(0, 0, 0, 0.125)",
-									padding: "0.5rem"
-								}}
-							>
-								<Spinner animation="grow" className="align-middle" /> {I18n.t("Searching address...")}
-							</div>
-						}
-					</div>;
-				}}
-			</Overlay>
-
-			<InputGroup className="mw-25" style={{width: 300}} ref="input">
-				<FormControl
-					placeholder="搜索城市街道名称"//{I18n.t("Search a city, street...")}
-					value={this.state.text}
-					onChange={e => this._search(e.target.value, false)}
-				/>
-				<InputGroup.Append>
-					<Button
-						variant="outline-secondary"
-						onClick={() => this._search(this.state.text, true)}
-					>
-						<Magnify size={16} />
-					</Button>
-				</InputGroup.Append>
-			</InputGroup>
-		</div>;
-	}
-}
-
-export default SearchPlace;

+ 0 - 121
src/view/common/SelectList.js

@@ -1,121 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import deepEqual from 'fast-deep-equal';
-import Form from 'react-bootstrap/Form';
-import ListGroup from 'react-bootstrap/ListGroup';
-
-/**
- * A select list takes a list of entries, and shows a list of selectable entries.
- * @property {Object[]} data The list of entries (each entry must have at least a "label" property). Entries could have a boolean "selected" property for setting their initial state.
- * @property {string} type Type of list (single, multi, oneshot)
- * @property {function} onChange Function called when one entry is clicked. First parameter is an array of currently selected items
- */
-class SelectList extends Component {
-	constructor() {
-		super();
-
-		this.state = {
-			selectedEntries: new Set()
-		};
-	}
-
-	/**
-	 * Event handler when one entry is selected
-	 * @private
-	 */
-	_onEntrySelected(id) {
-		//If single mode, replace selected entry
-		if(this.props.type === "single" || this.props.type === "oneshot") {
-			this.setState({ selectedEntries: new Set([ id ]) });
-			this.props.onChange([ this.props.data[id] ]);
-		}
-		//If multi mode, toggle value in selection set
-		else {
-			const newSelection = new Set(this.state.selectedEntries);
-
-			if(newSelection.has(id)) {
-				newSelection.delete(id);
-			}
-			else {
-				newSelection.add(id);
-			}
-
-			this.setState({ selectedEntries: newSelection });
-
-			//Convert set into selected data array
-			const result = [];
-			for(const v of newSelection.values()) {
-				result.push(this.props.data[v]);
-			}
-			this.props.onChange(result);
-		}
-	}
-
-	/**
-	 * Change selection if necessary
-	 * @private
-	 */
-	_reloadSelection(fromProps) {
-		if(!fromProps || !deepEqual(fromProps.data, this.props.data)) {
-			//Set default selection at first load
-			const selectionIds = [];
-			this.props.data.forEach((e, i) => {
-				if(e.selected) {
-					selectionIds.push(i);
-				}
-			});
-
-			if(selectionIds.length > 0) {
-				this.setState({ selectedEntries: new Set(selectionIds) });
-			}
-		}
-	}
-
-	render() {
-		return <ListGroup style={this.props.style}>
-			{this.props.data.map((entry, id) => {
-				const checked = this.state.selectedEntries.has(id);
-				const changeHandler = () => this._onEntrySelected(id);
-
-				return <ListGroup.Item
-					action
-					className="p-2"
-					key={id}
-					onClick={changeHandler}
-					active={checked}
-				>
-					{this.props.type === "single" &&
-						<Form.Check type="radio" checked={checked} onChange={changeHandler} label={entry.label} />
-					}
-					{this.props.type === "multi" &&
-						<Form.Check type="checkbox" checked={checked} onChange={changeHandler} label={entry.label} />
-					}
-					{this.props.type === "oneshot" &&
-						entry.label
-					}
-				</ListGroup.Item>
-			})}
-		</ListGroup>;
-	}
-
-	componentDidMount() {
-		this._reloadSelection();
-	}
-
-	componentDidUpdate(fromProps) {
-		this._reloadSelection(fromProps);
-	}
-}
-
-export default SelectList;

+ 0 - 37
src/view/common/SidePanelButton.js

@@ -1,37 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import { Control, DomUtil } from 'leaflet';
-import { withLeaflet, MapControl } from 'react-leaflet';
-import PubSub from 'pubsub-js';
-
-const SideButtonControl = Control.extend({
-	onAdd: function(map) {
-		this.container = DomUtil.create("div", "leaflet-bar leaflet-control-sidepanelbtn hide-xsDown");
-		const btn = DomUtil.create("a");
-		btn.innerHTML = "<svg><path d='M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z' /></svg>";
-		btn.addEventListener("click", () => PubSub.publish("body.panel.toggle", { panel: "right" }));
-		this.container.appendChild(btn);
-		return this.container;
-	}
-});
-
-/**
- * Side panel button is a react-leaflet control for opening right panel
- */
-class SidePanelButton extends MapControl {
-	createLeafletElement(props) {
-		return new SideButtonControl(props);
-	}
-}
-
-export default withLeaflet(SidePanelButton);

+ 0 - 206
src/view/common/TagsTable.js

@@ -1,206 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Button from 'react-bootstrap/Button';
-import Close from 'mdi-react/CloseIcon';
-import deepEqual from 'fast-deep-equal';
-import FormControl from 'react-bootstrap/FormControl';
-import InformationVariant from 'mdi-react/InformationVariantIcon';
-import InputGroup from 'react-bootstrap/InputGroup';
-import Plus from 'mdi-react/PlusIcon';
-import PubSub from 'pubsub-js';
-
-const WIKI_USE_TAG = [ "building", "highway", "natural", "surface", "landuse", "power", "waterway", "amenity", "barrier", "place", "leisure", "railway", "shop", "man_made", "public_transport", "tourism", "emergency", "historic", "indoor" ];
-
-/**
- * Tags table component allows display of raw OSM tags.
- * It also editing these tags, directly by user.
- *
- * @property {Object} tags Initial tag list
- */
-class TagsTable extends Component {
-	constructor() {
-		super();
-
-		this.state = {
-			tags: null,
-			newline: false,
-			focusKey: null,
-			focusVal: null
-		};
-	}
-
-	_tagsObjToArray(obj) {
-		return obj ? Object.entries(obj) : null;
-	}
-
-	_tagsArrayToObj(arr) {
-		if(!arr) { return null; }
-		else {
-			const obj = {};
-			arr.forEach(e => { obj[e[0]] = e[1]; });
-			return obj;
-		}
-	}
-
-	/**
-	 * Event handler for tag changes
-	 * @private
-	 */
-	_onTagsChanged() {
-		const tags = [];
-		const tagsDom = document.getElementsByClassName("app-tags-row");
-
-		// Read all tags from table
-		for(const d of tagsDom) {
-			const key = d.getElementsByClassName("app-tags-row-key")[0].value;
-			const val = d.getElementsByClassName("app-tags-row-val")[0].value;
-			tags.push([ key, val ]);
-		}
-
-		if(this._timer) {
-			clearTimeout(this._timer);
-			this._timer = null;
-		}
-
-		this._timer = setTimeout(() => {
-			PubSub.publish("body.tags.set", { tags: this._tagsArrayToObj(tags) });
-			this._timer = null;
-		}, 500);
-
-		const newState = { newline: false, tags: tags, focusKey: null, focusVal: null };
-
-		if(this.state.newline && document.activeElement) {
-			if(document.activeElement.classList.contains("app-tags-row-key")) {
-				newState.focusKey = document.activeElement.value;
-			}
-			else if(document.activeElement.classList.contains("app-tags-row-val")) {
-				newState.focusVal = document.activeElement.value;
-			}
-		}
-
-		this.setState(newState);
-	}
-
-	/**
-	 * Event handler for tag deletion
-	 * @private
-	 */
-	_onTagDeleted(k) {
-		const tagsObj = this._tagsArrayToObj(this.state.tags);
-		delete tagsObj[k];
-		PubSub.publish("body.tags.set", { tags: tagsObj });
-
-		if(this.state.newline) {
-			this.setState({ newline: false, focusKey: null, focusVal: null });
-		}
-	}
-
-	/**
-	 * Get the correct wiki URL for getting details about a tag
-	 * @private
-	 */
-	_getWikiURL(key, value) {
-		let url = "https://wiki.openstreetmap.org/wiki/";
-
-		if(WIKI_USE_TAG.includes(key)) {
-			url += "Tag:"+key+"="+value;
-		}
-		else {
-			url += "Key:"+key;
-		}
-
-		return url;
-	}
-
-	render() {
-		const entries = (this.state.tags || []).slice(0);
-
-		if(this.state.newline) {
-			entries.push([ "", "" ]);
-		}
-
-		return <div className={this.props.className}>
-			<div className="app-tags">
-				{entries.map((e,i) => (
-					<InputGroup size="sm" className="m-0 app-tags-row" key={i}>
-						<FormControl
-							className="app-tags-row-key"
-							type="text"
-							size="sm"
-							value={e[0]}
-							disabled={this.props.locked}
-							onChange={e => this._onTagsChanged()}
-							autoFocus={(this.state.newline && i === entries.length-1) || this.state.focusKey === e[0]}
-						/>
-
-						<FormControl
-							className="app-tags-row-val"
-							type="text"
-							size="sm"
-							value={e[1]}
-							disabled={this.props.locked}
-							onChange={e => this._onTagsChanged()}
-							autoFocus={!this.state.newline && this.state.focusVal === e[1]}
-						/>
-
-						<InputGroup.Append>
-							{!this.props.locked &&
-								<Button
-									variant="outline-danger"
-									tabIndex="-1"
-									disabled={this.props.noDelete && this.props.noDelete.includes(e[0])}
-									onClick={() => this._onTagDeleted(e[0])}
-								>
-									<Close size={16} />
-								</Button>
-							}
-							<Button
-								variant="outline-info"
-								href={this._getWikiURL(e[0], e[1])}
-								target="_blank"
-								tabIndex="-1"
-							>
-								<InformationVariant size={16} />
-							</Button>
-						</InputGroup.Append>
-					</InputGroup>
-				))}
-			</div>
-			{!this.props.locked &&
-				<Button
-					variant="secondary"
-					className="app-tags-add"
-					size="sm"
-					block
-					onClick={() => this.setState({ newline: true })}
-					tabIndex="-1"
-				>
-					<Plus size={16} />
-				</Button>
-			}
-		</div>;
-	}
-
-	componentDidMount() {
-		this.setState({ tags: this._tagsObjToArray(this.props.tags) });
-	}
-
-	componentDidUpdate(prevProps) {
-		if(!deepEqual(prevProps.tags, this.props.tags)) {
-			this.setState({ tags: this._tagsObjToArray(this.props.tags) });
-		}
-	}
-}
-
-export default TagsTable;

+ 0 - 37
src/view/dialogs/CompleteFloorImagery.js

@@ -1,37 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Button from 'react-bootstrap/Button';
-import I18n from '../../config/locales/ui';
-import Modal from 'react-bootstrap/Modal';
-
-/**
- * Complete floor imagery dialog asks user to set level information before leaving the floor imagery mode.
- */
-class CompleteFloorImageryDialog extends Component {
-	render() {
-		return <Modal show={this.props.show} onHide={this.props.onClose} size="lg">
-			<Modal.Header closeButton>
-				<Modal.Title>{I18n.t("Add level information")}</Modal.Title>
-			</Modal.Header>
-			<Modal.Body>{I18n.t("To make your floor plans appear correctly when editing indoors, please make sure you set on which level they should show up on the left panel.")}</Modal.Body>
-			<Modal.Footer>
-				<Button variant="secondary" onClick={this.props.onClose}>
-					{I18n.t("OK")}
-				</Button>
-			</Modal.Footer>
-		</Modal>;
-	}
-}
-
-export default CompleteFloorImageryDialog;

+ 0 - 46
src/view/dialogs/ConfirmDeletion.js

@@ -1,46 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Button from 'react-bootstrap/Button';
-import Close from 'mdi-react/CloseIcon';
-import Delete from 'mdi-react/DeleteIcon';
-import DeleteCircleOutline from 'mdi-react/DeleteCircleOutlineIcon';
-import I18n from '../../config/locales/ui';
-import Modal from 'react-bootstrap/Modal';
-
-/**
- * Confirm deletion dialog asks user if he wants to delete everything inside level/building
- */
-class ConfirmDeletionDialog extends Component {
-	render() {
-		return <Modal show={this.props.show} onHide={this.props.onCancel} size="lg">
-			<Modal.Header closeButton>
-				<Modal.Title>{I18n.t("Confirm delete of %{f}", { f: this.props.name })}</Modal.Title>
-			</Modal.Header>
-			<Modal.Body>{I18n.t("Are you sure you want to delete this feature ? You can either cancel this operation, delete only the contour of the feature, or delete the feature and everything inside (quite dangerous).")}</Modal.Body>
-			<Modal.Footer>
-				<Button variant="secondary" onClick={this.props.onCancel}>
-					<Close /> {I18n.t("Cancel")}
-				</Button>
-				<Button variant="warning" onClick={() => this.props.onConfirm(false)}>
-					<DeleteCircleOutline /> {I18n.t("Delete only contour")}
-				</Button>
-				<Button variant="danger" onClick={() => this.props.onConfirm(true)}>
-					<Delete /> {I18n.t("Delete everything")}
-				</Button>
-			</Modal.Footer>
-		</Modal>;
-	}
-}
-
-export default ConfirmDeletionDialog;

+ 0 - 174
src/view/dialogs/Login.js

@@ -1,174 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Button from 'react-bootstrap/Button';
-// import I18n from '../../config/locales/ui';
-import Modal from 'react-bootstrap/Modal';
-import InputGroup from 'react-bootstrap/InputGroup';
-import Form from 'react-bootstrap/Form';
-import Nav from 'react-bootstrap/Nav';
-
-/**
- * Login dialog asks user to login or create account on OSM.org before editing.
- */
-class LoginDialog extends Component {
-	state = {
-		loginMode: true,
-		form: undefined,
-		userData: {
-			account: "",
-			password: "",
-		},
-	}
-
-	loginForm = <Form>
-			<Form.Group>
-			<br />
-				<InputGroup >
-					<InputGroup.Text id="textAccount">账号</InputGroup.Text>
-					<Form.Control
-						type="text"
-						placeholder=""
-						aria-label="textAccount"
-						aria-describedby="textAccount"
-						onChange={e => {this.handleAccountInput(e)}}
-					/>
-				</InputGroup>
-				<br />
-				<InputGroup>
-					<InputGroup.Text id="textPassword">密码</InputGroup.Text>
-					<Form.Control
-						type="password"
-						placeholder=""
-						aria-label="textPassword"
-						aria-describedby="textPassword"
-						onChange={e => {this.handlePasswordInput(e)}}
-					/>
-				</InputGroup>
-				<br />
-				{window.CONFIG.always_authenticated ?
-					/*I18n.t("To view and edit map data, you need to connect first using an OpenStreetMap account.")*/
-					"要查看和编辑地图数据,您需要先使用帐户进行连接。"
-					: /*I18n.t("To edit map data, you need to connect first using an OpenStreetMap account.")*/
-					"要编辑地图数据,您需要先使用帐户进行连接。"
-				}
-			</Form.Group>
-		</Form>;
-
-	registerForm = <Form >
-			<Form.Group>
-			<br />
-				<InputGroup >
-					<InputGroup.Text id="textAccount">账号</InputGroup.Text>
-					<Form.Control
-						type="text"
-						placeholder=""
-						aria-label="textAccount"
-						aria-describedby="textAccount"
-						onChange={e => {this.handleAccountInput(e)}}
-					/>
-				</InputGroup>
-				<br />
-				<InputGroup>
-					<InputGroup.Text id="textPassword">密码</InputGroup.Text>
-					<Form.Control
-						type="password"
-						placeholder=""
-						aria-label="textPassword"
-						aria-describedby="textPassword"
-						onChange={e => {this.handlePasswordInput(e)}}
-					/>
-				</InputGroup>
-				<br />
-				<InputGroup>
-					<InputGroup.Text id="textConfirm">确认密码</InputGroup.Text>
-					<Form.Control
-						type="password"
-						placeholder=""
-						aria-label="textConfirm"
-						aria-describedby="textConfirm"
-						onChange={e => {this.handleConfirmInput(e)}}
-					/>
-				</InputGroup>
-			</Form.Group>
-		</Form>;
-	
-	componentDidMount(){
-		this.setState({form: this.loginForm});
-	}
-
-	selectMode = (key, event) => {
-		if(key === "login"){
-			this.setState({form: this.loginForm, loginMode: true});
-		} else {
-			this.setState({form: this.registerForm, loginMode: false});
-		}
-	}
-
-	handleAccountInput = (event) => {
-		this.setState({userData: {...this.state.userData, account: event.target.value}});
-	}
-
-	handlePasswordInput = (event) => {
-		this.setState({userData: {...this.state.userData, password: event.target.value}});
-	}
-
-	handleConfirmInput = (event) => {		
-		this.setState({userData: {...this.state.userData, confirm: event.target.value}});
-	}
-
-	clickOk = () => {
-
-
-
-		this.props.onLogin(this.state.userData)
-		// this.props.onClose();
-	}
-
-	render() {
-		const canClose = !window.CONFIG.always_authenticated;
-
-		return <Modal show={this.props.show} onHide={this.props.onClose} style={{zIndex: 20010}}>
-			<Modal.Header closeButton={canClose}>
-				<Modal.Title>登录或者注册账号{/*I18n.t("Login or create account")*/}</Modal.Title>
-			</Modal.Header>
-
-			<Modal.Body>
-				<Nav variant="tabs" defaultActiveKey="login" onSelect={this.selectMode}>
-					<Nav.Item>
-						<Nav.Link eventKey="login">登录</Nav.Link>
-					</Nav.Item>
-					<Nav.Item>
-						<Nav.Link eventKey="register" disabled>注册</Nav.Link>
-					</Nav.Item>
-				</Nav>
-				{this.state.form}
-				</Modal.Body>
-
-			<Modal.Footer>
-				{canClose &&
-					<Button variant="secondary" onClick={this.props.onClose}>
-						取消{/*I18n.t("Cancel")*/}
-					</Button>
-				}
-
-				<Button variant="primary" onClick={this.clickOk}>
-					{/*I18n.t("Login or create account")*/}
-					{this.state.loginMode ? "登录" : "注册"}
-				</Button>
-			</Modal.Footer>
-		</Modal>;
-	}
-}
-
-export default LoginDialog;

+ 0 - 69
src/view/dialogs/MissingLevelOutlines.js

@@ -1,69 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Alert from 'mdi-react/AlertIcon';
-import Button from 'react-bootstrap/Button';
-import I18n from '../../config/locales/ui';
-import Modal from 'react-bootstrap/Modal';
-import OfficeBuilding from 'mdi-react/OfficeBuildingIcon';
-import Pencil from 'mdi-react/PencilIcon';
-
-/**
- * Missing level outlines dialog asks user which action to perform if any level outline is missing.
- */
-class MissingLevelOutlinesDialog extends Component {
-	render() {
-		return <Modal
-			show={this.props.missingOutlines !== null && this.props.missingOutlines !== undefined && Object.keys(this.props.missingOutlines).length > 0}
-			size="lg"
-			style={{zIndex: 20050}}
-			onHide={this.props.onIgnore}
-		>
-			<Modal.Header closeButton>
-				<Modal.Title>{I18n.t("Floor outlines are missing")}</Modal.Title>
-			</Modal.Header>
-
-			<Modal.Body>
-				<p>{I18n.t("These buildings lack some floor outlines :")}</p>
-
-				<ul>
-					{this.props.missingOutlines && Object.values(this.props.missingOutlines).map((d,i) => (
-						<li key={i}>{I18n.t("Building %{b} (levels : %{lvl})", { b: d.name, lvl: d.levels.join(", ") })}</li>
-					))}
-				</ul>
-
-				<p>{I18n.t("These floor outlines are optional in OSM, but are useful for various tools people use.")}<br />{I18n.t("You have the choice between following options :")}</p>
-
-				<ul className="pl-3 pb-0 mb-0" style={{listStyle: "none"}}>
-					<li><Pencil /> {I18n.t("Go back to editing and create levels outline by yourself (recommended for complex buildings)")}</li>
-					<li><OfficeBuilding /> {I18n.t("Use building outline as default level outline (recommended for simple buildings)")}</li>
-					<li><Alert /> {I18n.t("Ignore this warning and do not create missing level outlines (not recommended)")}</li>
-				</ul>
-			</Modal.Body>
-
-			<Modal.Footer>
-				<Button variant="primary" onClick={this.props.onEdit}>
-					<Pencil /> {I18n.t("Edit outlines")}
-				</Button>
-				<Button variant="secondary" onClick={this.props.onUseDefault}>
-					<OfficeBuilding /> {I18n.t("Use building ones")}
-				</Button>
-				<Button variant="danger" onClick={this.props.onIgnore}>
-					<Alert /> {I18n.t("Ignore this")}
-				</Button>
-			</Modal.Footer>
-		</Modal>;
-	}
-}
-
-export default MissingLevelOutlinesDialog;

+ 1 - 1
src/view/dialogs/OutOfBoundsGeometry.js

@@ -13,7 +13,7 @@
 import React, { Component } from 'react';
 import Body from '../Body';
 import Button from 'react-bootstrap/Button';
-import I18n from '../../config/locales/ui';
+// import I18n from '../../config/locales/ui';
 import Modal from 'react-bootstrap/Modal';
 
 /**

+ 0 - 116
src/view/panes/BuildingEdit.js

@@ -1,116 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Body from '../Body';
-import Button from 'react-bootstrap/Button';
-import Check from 'mdi-react/CheckIcon';
-import Col from 'react-bootstrap/Col';
-import Container from 'react-bootstrap/Container';
-import I18n from '../../config/locales/ui';
-import PresetInputField from '../common/PresetInputField';
-import PubSub from 'pubsub-js';
-import Row from 'react-bootstrap/Row';
-import TagsTable from '../common/TagsTable';
-
-/**
- * BuildingEdit pane allows to change a building description for user.
- *
- * @property {Object} feature The building feature to edit
- */
-class BuildingEditPane extends Component {
-	/**
-	 * Event handler when "Done" button is clicked
-	 * @private
-	 */
-	_onDone() {
-		PubSub.publish("body.unselect.feature");
-	}
-
-	render() {
-		if(!this.props.building) { return <div></div>; }
-
-		const feature = this.props.building;
-		const tags = feature.properties.tags;
-		const infoLevels = <span>{I18n.t("Number of levels above ground (roof excluded), here B + C + D = 3 levels")}<img src='img/building_levels.png' style={{height: 200}} alt={I18n.t("Schema explaining how should be set amount of levels")} /></span>;
-		const infoLevelsUndergound = <span>{I18n.t("Number of levels completely underground, here E = 1 level")}<img src='img/building_levels.png' style={{height: 200}} alt={I18n.t("Schema explaining how should be set amount of levels")} /></span>;
-		const infoLevelsRoof = <span>{I18n.t("Number of levels under the roof, here A = 1 level")}<img src='img/building_levels.png' style={{height: 200}} alt={I18n.t("Schema explaining how should be set amount of levels")} /></span>;
-
-		return <div>
-			<Container className="m-0 pl-2 pr-2 mt-2">
-				<Row className="d-flex align-items-top justify-content-between">
-					<Col>
-						<h3 className="m-0 p-0">{Body.GetFeatureName(feature)}</h3>
-					</Col>
-
-					<Col className="text-right">
-						<Button
-							variant="outline-secondary"
-							size="sm"
-							title={I18n.t("Done")}
-							onClick={() => this._onDone()}
-						>
-							<Check />
-						</Button>
-					</Col>
-				</Row>
-			</Container>
-
-			<div className="m-2 mb-4">
-				<PresetInputField
-					type="text"
-					data={{ text: I18n.t("Name"), key: "name" }}
-					tags={tags}
-				/>
-
-				<PresetInputField
-					type="combo"
-					data={{ text: I18n.t("Type of building"), key: "building", values: "retail,commercial,parking,industrial,apartments,garage,school,church,warehouse,university,office,hospital,hotel,train_station,college,civic,public,yes" , use_last_as_default: "force" }}
-					tags={tags}
-				/>
-
-				<PresetInputField
-					type="text"
-					data={{ text: I18n.t("Total height (in meters)"), key: "building:height" }}
-					tags={tags}
-				/>
-
-				<PresetInputField
-					type="number"
-					data={{ text: I18n.t("Number of overground levels (roof excluded)"), info: infoLevels, key: "building:levels" }}
-					tags={tags}
-				/>
-
-				<PresetInputField
-					type="number"
-					data={{ text: I18n.t("Number of underground levels"), info: infoLevelsUndergound, key: "building:levels:underground" }}
-					tags={tags}
-				/>
-
-				<PresetInputField
-					type="number"
-					data={{ text: I18n.t("Number of levels under roof"), info: infoLevelsRoof, key: "roof:levels" }}
-					tags={tags}
-				/>
-			</div>
-
-			<div className="m-2">
-				<TagsTable
-					tags={tags}
-					noDelete={["building", "building:part"]}
-				/>
-			</div>
-		</div>;
-	}
-}
-
-export default BuildingEditPane;

+ 0 - 176
src/view/panes/Changeset.js

@@ -1,176 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Body from '../Body';
-import Button from 'react-bootstrap/Button';
-import ChangesetDiff from '../common/ChangesetDiff';
-import Check from 'mdi-react/CheckIcon';
-import CloseCircle from 'mdi-react/CloseCircleIcon';
-import I18n from '../../config/locales/ui';
-import Magnify from 'mdi-react/MagnifyIcon';
-import Pencil from 'mdi-react/PencilIcon';
-import PresetInputField from '../common/PresetInputField';
-import PubSub from 'pubsub-js';
-import Spinner from 'react-bootstrap/Spinner';
-import TagsTable from '../common/TagsTable';
-
-/**
- * Changeset pane allows user to review edits before sending to OSM.
- */
-class ChangesetPane extends Component {
-	render() {
-		if(!this.props.changeset) { return <div></div>; }
-
-		return <div>
-			<div className="m-2 mb-4">
-				<h3 className="m-0 p-0 mb-1">{I18n.t("Send changes to OpenStreetMap")}</h3>
-
-				{this.props.changeset.status === "preparing" &&
-					<div className="text-center">
-						<Spinner animation="grow" variant="secondary" className="align-middle" /> {I18n.t("Analyzing your changes...")}
-						{PubSub.publish("body.mode.set", { mode: Body.MODE_BUILDING })}
-					</div>
-				}
-
-				{this.props.changeset.status === "check" ?
-					<div>
-						<PresetInputField
-							type="textarea"
-							data={{ text: I18n.t("Changeset comment"), key: "comment", default: I18n.t("Describe briefly but explicitely your edits (required)") }}
-							tags={this.props.changeset.tags}
-						/>
-
-						<PresetInputField
-							type="multiselect"
-							data={{
-								text: I18n.t("Sources"),
-								key: "source",
-								list_entrys: [
-									{ value: "local knowledge", display_value: I18n.t("Local knowledge") },
-									{ value: "survey", display_value: I18n.t("Ground survey") },
-									{ value: "aerial imagery", display_value: I18n.t("Aerial imagery") },
-									{ value: "streetlevel imagery", display_value: I18n.t("Street-level imagery") },
-									{ value: "emergency map", display_value: I18n.t("Emergency map") }
-								],
-								info: I18n.t("List all sources you have used to make your edits (recommended)"),
-							}}
-							tags={this.props.changeset.tags}
-						/>
-
-						<PresetInputField
-							type="binarycheck"
-							data={{ text: I18n.t("I would like someone to review my edits"), key: "review_requested" }}
-							tags={this.props.changeset.tags}
-						/>
-					</div>
-					:
-					<div className="text-center">
-						{this.props.changeset.status === "upload" &&
-							<div><Spinner animation="grow" variant="success" className="align-middle" /> {I18n.t("Uploading your changes...")}</div>
-						}
-						{this.props.changeset.status === "sent" &&
-							<div>
-								<Check size={42} style={{color: "green"}} /> {I18n.t("Thanks for your contribution !")}<br />
-
-								<Button
-									variant="outline-success"
-									size="sm"
-									block
-									href={window.CONFIG.osm_api_url+"/changeset/"+this.props.changeset.id}
-									target="_blank"
-									rel="noopener noreferrer"
-								>
-									<Magnify size={24} /> {I18n.t("See your changes on OpenStreetMap")}
-								</Button>
-
-								<Button
-									variant="outline-primary"
-									size="sm"
-									block
-									onClick={() => PubSub.publish("body.action.cleanup")}
-								>
-									<Pencil size={24} /> {I18n.t("Go back to editing")}
-								</Button>
-							</div>
-						}
-						{this.props.changeset.status === "error" &&
-							<div>
-								<CloseCircle size={42} style={{color: "red"}} /> {I18n.t("Oops ! There was an error during upload...")}<br />
-
-								{this.props.changeset.reason === "changeset_failed" ?
-									I18n.t("OpenStreetMap server can't be contacted. Check your Internet connection and retry in a few minutes.")
-									:
-									I18n.t("Some of your edits could have been lost, please reload and retry.")
-								}
-
-								{this.props.changeset.reason === "changeset_failed" &&
-									<Button
-										variant="outline-secondary"
-										size="sm"
-										onClick={() => PubSub.publish("body.mode.set", { mode: Body.MODE_BUILDING })}
-										block
-									>
-										{I18n.t("Go back to editing")}
-									</Button>
-								}
-							</div>
-						}
-					</div>
-				}
-			</div>
-
-			{this.props.changeset.status === "check" &&
-				<div className="m-2 mb-4 d-flex justify-content-between">
-					<Button
-						variant="success"
-						size="sm"
-						onClick={() => {
-							PubSub.publish("body.action.save");
-							// if(this.props.changeset.tags && this.props.changeset.tags.comment && this.props.changeset.tags.comment.trim().length > 0) {
-							// 	PubSub.publish("body.action.save");
-							// }
-							// else {
-							// 	alert(I18n.t("You have to give us more details about your changes using Changeset comment text field."));
-							// }
-						}}
-						className="flex-grow-1 mr-1"
-					>
-						{I18n.t("Send")}
-					</Button>
-					<Button
-						variant="secondary"
-						size="sm"
-						onClick={() => PubSub.publish("body.mode.set", { mode: Body.MODE_BUILDING })}
-						className="flex-grow-1 ml-1"
-					>
-						{I18n.t("Cancel")}
-					</Button>
-				</div>
-			}
-
-			{this.props.changeset.status === "check" &&
-				<div className="m-2">
-					<h5 className="m-0 mt-2 p-0 mb-2">{I18n.t("Changeset tags")}</h5>
-					<TagsTable
-						tags={this.props.changeset.tags}
-					/>
-
-					<h5 className="m-0 mt-4 p-0 mb-2">{I18n.t("Your edits")}</h5>
-					<ChangesetDiff diff={this.props.changeset.diff} />
-				</div>
-			}
-		</div>;
-	}
-}
-
-export default ChangesetPane;

+ 0 - 216
src/view/panes/FloorImagery.js

@@ -1,216 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import { LatLng } from 'leaflet';
-import Dropzone from 'react-dropzone';
-import Eye from 'mdi-react/EyeIcon';
-import EyeOff from 'mdi-react/EyeOffIcon';
-import Form from 'react-bootstrap/Form';
-import FormControl from 'react-bootstrap/FormControl';
-import Hash from 'object-hash';
-import I18n from '../../config/locales/ui';
-import InputGroup from 'react-bootstrap/InputGroup';
-import ListGroup from 'react-bootstrap/ListGroup';
-import PubSub from 'pubsub-js';
-
-/**
- * Floor imagery component handles editing of floor plans
- */
-class FloorImageryPane extends Component {
-	/**
-	 * Event handler for opacity change
-	 * @private
-	 */
-	_onOpacityChanged(val) {
-		PubSub.publish("body.imagery.opacity", { opacity: parseInt(val)/100, type: "floor" });
-	}
-
-	/**
-	 * Event handler for floor plans being dropped
-	 * @private
-	 */
-	_onDropImages(files) {
-		if(files.length > 0) {
-			// Full config file
-			if(files.length === 1 && files[0].type === "application/json") {
-				// Parse
-				const reader = new FileReader();
-				reader.onload = () => {
-					try {
-						const json = JSON.parse(reader.result);
-
-						if(json && json.length > 0) {
-							PubSub.publish("body.floorimagery.remove");
-
-							json.forEach(e => {
-								if(!e.image || !e.label || !e.id) {
-									throw new Error("Read data from JSON is missing information");
-								}
-								else {
-									e.topleft = new LatLng(e.topleft.lat, e.topleft.lng);
-									e.topright = new LatLng(e.topright.lat, e.topright.lng);
-									e.bottomleft = new LatLng(e.bottomleft.lat, e.bottomleft.lng);
-									e.level = parseFloat(e.level);
-								}
-							});
-
-							PubSub.publish("body.floorimagery.add", { imagery: json });
-						}
-					}
-					catch(e) { console.error(e); }
-				};
-				reader.readAsText(files[0]);
-			}
-			// Classic images
-			else {
-				// Convert files into data URL
-				Promise.all(
-					files
-					.filter(f => f.type.startsWith("image/"))
-					.map(f => new Promise(resolve => {
-						const reader = new FileReader();
-						reader.onload = () => {
-							resolve({
-								label: f.name,
-								level: null,
-								image: reader.result,
-								id: Hash(reader.result)
-							});
-						};
-						reader.readAsDataURL(f);
-					}))
-				)
-				// Save loaded floors
-				.then(res => PubSub.publish("body.floorimagery.add", { imagery: res }));
-			}
-		}
-	}
-
-	render() {
-		const floorImgs = window.imageryManager.getFloorImages();
-		const selected = floorImgs && floorImgs.find(img => img.selected && img.visible);
-
-		if(selected && selected.opacity === undefined) { selected.opacity = 1; }
-
-		return <div className="m-0 pl-2 pr-2 mt-2">
-			<h3 className="m-0 p-0">平面图{/*I18n.t("Floor plan")*/}</h3>
-
-			<Dropzone
-				accept="image/jpeg, image/png, application/json"
-				onDrop={files => this._onDropImages(files)}
-			>
-				{({getRootProps, getInputProps}) => (
-					<div className="dropzone m-0 mt-3 w-100" {...getRootProps()}>
-						<input {...getInputProps()} />
-						<p>
-						将您的图像拖放到此处(或单击打开文件浏览器){/*I18n.t("Drag and drop your images here (or click to open file browser)")*/}<br />
-							<small>支持的格式: JPEG, PNG, Imagery JSON{/*I18n.t("Supported formats: JPEG, PNG, Imagery JSON")*/}</small>
-						</p>
-					</div>
-				)}
-			</Dropzone>
-
-			{selected &&
-				<InputGroup className="mt-3">
-					<InputGroup.Prepend>
-						<InputGroup.Text>{I18n.t("Opacity")}</InputGroup.Text>
-					</InputGroup.Prepend>
-
-					<div className="form-control" style={{flexGrow: 2}}>
-						<input
-							type="range"
-							min="0"
-							max="100"
-							step="5"
-							onChange={v => this._onOpacityChanged(v.target.value)}
-							value={selected.opacity*100}
-							style={{maxWidth: "100%"}}
-						/>
-					</div>
-
-					<FormControl
-						type="number"
-						min="0"
-						max="100"
-						onChange={v => this._onOpacityChanged(v.target.value)}
-						value={(selected.opacity*100).toFixed(0)}
-					/>
-
-					<InputGroup.Append>
-						<InputGroup.Text>%</InputGroup.Text>
-					</InputGroup.Append>
-				</InputGroup>
-			}
-
-			<ListGroup className="mt-3" style={{width: "100%"}}>
-				{floorImgs.map((f, i) => {
-					const showHideClick = evt => {
-						evt.stopPropagation();
-
-						PubSub.publish("body.floorimagery.update", {
-							imagery: floorImgs.map(d => {
-								const newD = Object.assign({}, d);
-								newD.visible = d.id === f.id ? !d.visible : d.visible;
-								return newD;
-							})
-						});
-					};
-
-					return <ListGroup.Item
-						key={i}
-						style={{display: "flex", alignItems: "center", paddingLeft: "0.5rem"}}
-						active={f.selected}
-						onClick={() => {
-							PubSub.publish("body.floorimagery.update", {
-								imagery: floorImgs.map(d => {
-									const newD = Object.assign({}, d);
-									newD.selected = d.id === f.id ? true : false;
-									return newD;
-								})
-							});
-							if(!this.props.floorImageryMode) { PubSub.publish("body.floorimagery.mode", { mode: "scale" }); }
-						}}
-					>
-						{f.visible ?
-							<Eye size={28} onClick={e => showHideClick(e)} />
-							:
-							<EyeOff size={28} onClick={e => showHideClick(e)} />
-						}
-						{console.log("fi--", f)}
-						<img src={f.image} style={{width: 30, height: 30, margin: "0 5px", border: "1px solid #ccc" }} alt="" />
-						{f.label.substring(0, f.label.lastIndexOf("."))}
-
-						<Form.Control
-							type="number"
-							placeholder={I18n.t("Level")}
-							value={f.level === null || isNaN(f.level) ? "" : f.level}
-							step="any"
-							onChange={e => PubSub.publish("body.floorimagery.update", {
-								imagery: [ Object.assign({}, f, { level: parseFloat(e.target.value) }) ]
-							})}
-							style={{width: 80, display: "inline-block", position: "absolute", right: 5}}
-							required
-							isInvalid={f.level === null || isNaN(f.level)}
-						/>
-
-						<Form.Control.Feedback type="invalid" style={f.selected ? { color: "white" } : {}}>
-							{I18n.t("Please choose a level")}
-						</Form.Control.Feedback>
-					</ListGroup.Item>;
-				})}
-			</ListGroup>
-		</div>;
-	}
-}
-
-export default FloorImageryPane;

+ 0 - 191
src/view/panes/Imagery.js

@@ -1,191 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Col from 'react-bootstrap/Col';
-import Container from 'react-bootstrap/Container';
-import deepEqual from 'fast-deep-equal';
-import Form from 'react-bootstrap/Form';
-import I18n from '../../config/locales/ui';
-import PubSub from 'pubsub-js';
-import Row from 'react-bootstrap/Row';
-import SelectList from '../common/SelectList';
-import Tab from 'react-bootstrap/Tab';
-import Tabs from 'react-bootstrap/Tabs';
-
-/**
- * Imagery component handles changing background and overlay imagery of map.
- */
-class ImageryPane extends Component {
-	constructor() {
-		super();
-
-		this.state = {
-			backgrounds: [],
-			overlays: [],
-			customUrl: ""
-		};
-	}
-
-	/**
-	 * Update list of imagery
-	 * @private
-	 */
-	_updateImagery(fromProps) {
-		if(this.props.imagery) {
-			const newState = { backgrounds: [], overlays: [] };
-
-			this.props.imagery.forEach(l => {
-				if(l.properties.overlay) {
-					newState.overlays.push(Object.assign({}, l, {
-						label: l.properties.name || l.properties.id,
-						selected: this.props.selectedOverlaysImagery && this.props.selectedOverlaysImagery.filter(l2 => l2.properties.id === l.properties.id).length > 0
-					}));
-				}
-				else {
-					newState.backgrounds.push(Object.assign({}, l, {
-						label: l.properties.name || l.properties.id || this._customImagery.label,
-						selected: this.props.selectedBaseImagery && this.props.selectedBaseImagery.properties.id === l.properties.id
-					}));
-				}
-			});
-
-			if(
-				!deepEqual(newState.backgrounds, this.state.backgrounds)
-				|| !deepEqual(newState.overlays, this.state.overlays)
-			) {
-				this.setState(newState);
-			}
-		}
-	}
-
-	/**
-	 * Event handler for imagery being clicked
-	 * @private
-	 */
-	_onSelect(img, type) {
-		PubSub.publish("body.imagery.set", { imagery: img, type: type });
-	}
-
-	/**
-	 * Event handler for opacity change
-	 * @private
-	 */
-	_onOpacityChanged(val, type) {
-		PubSub.publish("body.imagery.opacity", { opacity: parseInt(val)/100, type: type });
-	}
-
-	/**
-	 * Event handler for custom TMS URL change
-	 * @private
-	 */
-	_onCustomChanged(url) {
-		this.setState({ customUrl: url });
-
-		url = url.trim();
-		const newImg = Object.assign({}, this.props.selectedBaseImagery);
-		newImg.properties.url = url.length === 0 ? null : url;
-
-		this._onSelect([ newImg ], "background");
-	}
-
-	render() {
-		return <div className="m-2">
-			<h4>仪表盘</h4>
-
-			<Tabs defaultActiveKey="background" className="dense-tabs" id="imagery-tab">
-
-				<Tab eventKey="background" title={I18n.t("Background")}>
-					<Container className="mt-3 mb-3 p-0 d-flex overflow-hidden">
-						<Row className="flex-nowrap">
-							<Col className="m-0">{I18n.t("Opacity")} <span className="font-weight-light">{(this.props.baseImageryOpacity*100).toFixed(0)+"%"}</span></Col>
-							<Col className="m-0">
-								<input
-									type="range"
-									min="0"
-									max="100"
-									onChange={v => this._onOpacityChanged(v.target.value, "background")}
-									value={this.props.baseImageryOpacity*100}
-									className="p-0 m-0 w-100"
-								/>
-							</Col>
-						</Row>
-					</Container>
-
-					{this.state.backgrounds ?
-						<SelectList
-							data={this.state.backgrounds}
-							type="single"
-							onChange={selection => this._onSelect(selection, "background")}
-						/>
-						:
-						<p>{I18n.t("Loading...")}</p>
-					}
-
-					{this.props.selectedBaseImagery && this.props.selectedBaseImagery.properties.id === "custom" &&
-						<Form.Group controlId="imagery-custom" className="mt-2">
-							<Form.Label>{I18n.t("Custom imagery URL")}</Form.Label>
-							<Form.Control
-								type="text"
-								placeholder="https://mytil.es/{z}/{x}/{y}.jpg"
-								value={this.state.customUrl}
-								onChange={v => this._onCustomChanged(v.target.value)}
-							/>
-							<Form.Text className="text-muted">
-								{I18n.t("You can use any TMS-like URL")}
-							</Form.Text>
-						</Form.Group>
-					}
-				</Tab>
-
-				<Tab eventKey="overlay" title={I18n.t("Overlay")}>
-					<Container className="mt-3 mb-3 p-0 d-flex overflow-hidden">
-						<Row className="flex-nowrap">
-							<Col className="m-0">{I18n.t("Opacity")} <span className="font-weight-light">{(this.props.overlaysImageryOpacity*100).toFixed(0)+"%"}</span></Col>
-							<Col className="m-0">
-								<input
-									type="range"
-									min="0"
-									max="100"
-									onChange={v => this._onOpacityChanged(v.target.value, "overlay")}
-									value={this.props.overlaysImageryOpacity*100}
-									style={{width: "100%"}}
-									className="p-0 m-0 w-100"
-								/>
-							</Col>
-						</Row>
-					</Container>
-
-					{this.state.overlays ?
-						<SelectList
-							data={this.state.overlays}
-							type="multi"
-							onChange={selection => this._onSelect(selection, "overlay")}
-						/>
-						:
-						<p>{I18n.t("Loading...")}</p>
-					}
-				</Tab>
-			</Tabs>
-		</div>;
-	}
-
-	componentDidMount() {
-		this._updateImagery();
-	}
-
-	componentDidUpdate(fromProps) {
-		this._updateImagery(fromProps);
-	}
-}
-
-export default ImageryPane;

+ 0 - 92
src/view/panes/MapDashboard.js

@@ -1,92 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Tab from 'react-bootstrap/Tab';
-import Tabs from 'react-bootstrap/Tabs';
-import Container from 'react-bootstrap/Container';
-import Form from 'react-bootstrap/Form';
-import Button from 'react-bootstrap/Button';
-// import Row from 'react-bootstrap/Row';
-// import Col from 'react-bootstrap/Col';
-import MapManageList from '../common/MapManageList'
-import PubSub from 'pubsub-js';
-
-
-
-function CreateMapForm(){
-	let name = '';
-
-	function createHandle(){
-		if(name !== ''){
-			PubSub.publish('editor.map.create', {id:window.editor_user.id, name: name});
-		}
-	}
-
-	function changeHandle(e){
-		name = e.target.value;
-	}
-
-	return (
-		<>
-			<Form>
-				<Form.Group controlId="mapName">
-					<Form.Label>地图名称</Form.Label>
-					<Form.Control 
-						type="text"
-						placeholder=""
-						aria-label="mapName"
-						aria-describedby="mapName"
-						onChange={e => {changeHandle(e)}} 
-					/>
-				</Form.Group>
-				<Form.Label style={{color: 'red', fontSize: '12px'}}>请输入地图名称</Form.Label><br/><br/>
-				<Button variant="primary" type="submit" onClick={createHandle}>
-					创建
-				</Button>
-			</Form>
-		</>
-	)
-}
-
-class MapDashboardDialog extends Component {
-	state = {
-		list: null,
-	}
-
-	selectMode = (key, event) => {
-		console.log(key);
-	}
-
-	render() {
-		let activeTab = this.props.rightPanelTab;
-		return (<div className="m-2">
-				<h4>仪表盘</h4>
-				{/* {console.log(activeTab)} */}
-				<Tabs defaultActiveKey={activeTab}/*"manage"*/ className="dense-tabs" id="imagery-tab">
-					<Tab eventKey="manage" title="地图管理">
-						<Container className="mt-3 mb-3 p-0 d-flex overflow-hidden">
-							<MapManageList />
-						</Container>
-					</Tab>
-
-					<Tab eventKey="create" title="新建地图">
-						<Container className="mt-3 mb-3 p-0 d-flex overflow-hidden">
-							<CreateMapForm />
-						</Container>
-					</Tab>
-				</Tabs>
-			</div>);
-	}
-}
-
-export default MapDashboardDialog;

+ 0 - 70
src/view/panes/features/Create.js

@@ -1,70 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Button from 'react-bootstrap/Button';
-import Close from 'mdi-react/CloseIcon';
-import GeometryTypeSelect from '../../common/GeometryTypeSelect';
-// import I18n from '../../../config/locales/ui';
-import PresetSelect from '../../common/PresetSelect';
-import PubSub from 'pubsub-js';
-
-/**
- * Create feature pane allows user to choose the kind of feature to create.
- */
-class CreateFeaturePane extends Component {
-	render() {
-		return <div>
-			<h3 className="m-2">添加功能{/*I18n.t("Add features")*/}</h3>
-
-			{!this.props.preset &&
-				<PresetSelect
-					key={1}
-					className="m-2"
-					lastUsedPresets={this.props.lastUsedPresets}
-					onSelect={p => PubSub.publish("body.select.preset", { preset: p })}
-				/>
-			}
-
-			{this.props.preset && !this.props.draw &&
-				<div className="m-2">
-					<p>
-					请选择您希望如何表示您的功能。{/*I18n.t("Please select how you want to represent your feature.")*/}
-					</p>
-					<GeometryTypeSelect
-						types={this.props.preset.type}
-						onClick={type => PubSub.publish("body.select.preset", { preset: this.props.preset, type: type })}
-					/>
-					<Button
-						variant="outline-danger"
-						size="sm"
-						onClick={() => PubSub.publish("body.select.preset", { preset: null })}
-						block
-					>
-						<Close /> 取消{/*I18n.t("Cancel")*/}
-					</Button>
-				</div>
-			}
-
-			{this.props.preset && this.props.draw &&
-				<div className="m-2">
-					<p>
-					你可以在地图上画你的功能。单击完成按钮或再次单击您创建的最后一个节点以完成。
-						{/*I18n.t("You can draw your feature on the map. Click on done button or click again on last node you created to finish.")*/}
-					</p>
-				</div>
-			}
-		</div>;
-	}
-}
-
-export default CreateFeaturePane;

+ 0 - 345
src/view/panes/features/Edit.js

@@ -1,345 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Body from '../../Body';
-import Button from 'react-bootstrap/Button';
-import Check from 'mdi-react/CheckIcon';
-import Col from 'react-bootstrap/Col';
-import Container from 'react-bootstrap/Container';
-import History from 'mdi-react/HistoryIcon';
-import I18n from '../../../config/locales/ui';
-import PresetCard from '../../common/PresetCard';
-import PresetInputField from '../../common/PresetInputField';
-import PresetSelect from '../../common/PresetSelect';
-import PubSub from 'pubsub-js';
-import Row from 'react-bootstrap/Row';
-import Tab from 'react-bootstrap/Tab';
-import Tabs from 'react-bootstrap/Tabs';
-import TagsTable from '../../common/TagsTable';
-
-const GEOM_TO_OSM = { "Point": "node", "LineString": "way", "Polygon": "closedway", "MultiPolygon": "closedway" };
-
-/**
- * Edit feature pane allows user to change one feature description
- */
-class EditFeaturePane extends Component {
-	constructor() {
-		super();
-
-		this.state = {
-			tab: "functional",
-			showPresetSelect: false
-		};
-	}
-
-	/**
-	 * Event handler when "Done" button is clicked
-	 * @private
-	 */
-	_onDone() {
-		PubSub.publish("body.mode.set", { mode: this.props.mode });
-	}
-
-	/**
-	 * Transform a preset definition into components
-	 * @private
-	 */
-	_presetToComponent(p) {
-		let res = [];
-
-		if(!p) { return res; }
-
-		let showLevel = p.showLevel;
-
-		if(p.combos) {
-			res = res.concat(p.combos.map((c,i) => <PresetInputField type="combo" data={c} tags={this.props.feature.properties.tags} key={"c"+i} />));
-		}
-		if(p.texts) {
-			res = res.concat(p.texts.map((t,i) => <PresetInputField type="text" data={t} tags={this.props.feature.properties.tags} key={"t"+i} />));
-		}
-		if(p.multiselects) {
-			res = res.concat(
-				p.multiselects
-				.filter(m => {
-					if(m.key === "level") {
-						showLevel = true;
-						return false;
-					}
-					else { return true; }
-				})
-				.map((m,i) => <PresetInputField type="multiselect" data={m} tags={this.props.feature.properties.tags} key={"m"+i} />)
-			);
-		}
-		if(p.checks) {
-			res = res.concat(p.checks.map((ch,i) => <PresetInputField type="check" data={ch} tags={this.props.feature.properties.tags} key={"ch"+i} />));
-		}
-		if(p.optionals) {
-			res = res.concat(this._presetToComponent(p.optionals));
-		}
-
-		// Add level field
-		if(showLevel) {
-			// List available levels
-			let levels = (this.props.feature.properties.own && this.props.feature.properties.own.levels) || [-5,-4,-3,-2,-1,0,1,2,3,4,5];
-			if(this.props.building && this.props.building.properties.own && this.props.building.properties.own.levels) {
-				levels = levels.concat(this.props.building.properties.own.levels);
-			}
-			const mytags = Object.assign({}, this.props.feature.properties.tags, { level: this.props.feature.properties.own.levels.join(";") });
-			delete mytags.repeat_on;
-
-			// Create input
-			res.push(<PresetInputField
-				type="multiselect"
-				data={{
-					key: "level",
-					text: I18n.t("Floors served"),
-					values: [...new Set(levels)].map(a => parseFloat(a)).sort((a,b) => a-b).join(";")
-				}}
-				tags={mytags}
-				key={"lvl"}
-			/>);
-		}
-
-		return res;
-	}
-
-	/**
-	 * Merge and deduplicate presets fields
-	 * @private
-	 */
-	_combinePresets(presets) {
-		const result = {
-			name: Body.GetFeatureName(this.props.feature, [...new Set(presets.map(p => p.name))].join(", "))
-		};
-
-		const usedKeys = [];
-
-		presets.forEach(p => {
-			Object.entries(p).forEach(e => {
-				const [pk,pv] = e;
-
-				if(pk === "type") {
-					if(!result.type) { result.type = []; }
-
-					result.type = [...new Set(result.type.concat(pv))];
-				}
-				else if(Array.isArray(pv)) {
-					if(!result[pk]) { result[pk] = []; }
-
-					pv.forEach(v => {
-						if(!usedKeys.includes(v.key)) {
-							result[pk].push(v);
-							usedKeys.push(v.key);
-						}
-					});
-				}
-				else if(pk === "tags") {
-					if(!result.tags) { result.tags = {}; }
-
-					result.tags = Object.assign({}, result.tags, pv);
-				}
-			});
-		});
-
-		return result;
-	}
-
-	/**
-	 * @private
-	 */
-	_lookForPreset() {
-		this.setState({ showPresetSelect: true });
-	}
-
-	/**
-	 * @private
-	 */
-	_onChangePreset(prev, next) {
-		if(next && this.props.feature) {
-			let newTags = Object.assign({}, this.props.feature.properties.tags);
-
-			// Remove hard tags from previous preset
-			if(prev && prev.tags) {
-				Object.keys(prev.tags).forEach(k => delete newTags[k]);
-			}
-
-			// Add hard tags from new preset
-			if(next.tags) {
-				newTags = Object.assign(newTags, next.tags);
-			}
-
-			PubSub.publish("body.tags.set", { tags: newTags });
-		}
-
-		this.setState({ showPresetSelect: false });
-	}
-
-	render() {
-		if(!this.props.feature) { return <div></div>; }
-
-		const feature = this.props.feature;
-		const tags = feature.properties.tags;
-		let mightBeStructure = ["Polygon","MultiPolygon"].includes(feature.geometry.type);
-		const presets = window.presetsManager.findPresetsForFeature(feature);
-		const globalPreset = this._combinePresets(presets);
-
-		// Find functional presets (not structural ones)
-		let functionalPreset = presets.filter(p => !p.indoor_structure || p.indoor_structure === "no");
-		if(functionalPreset.length > 0) { functionalPreset = functionalPreset[functionalPreset.length-1]; }
-		else { functionalPreset = null; }
-
-		// Find structural presets (room, area, corridor...)
-		let structurePreset = presets.filter(p => ["only", "yes"].includes(p.indoor_structure));
-		if(structurePreset.length > 0) { structurePreset = structurePreset[structurePreset.length-1]; }
-		else { structurePreset = null; }
-
-		// Tabs management
-		this._tabFunDisabled = structurePreset && structurePreset.indoor_structure === "only";
-		this._tabStrDisabled = !mightBeStructure || (functionalPreset && functionalPreset.indoor_structure === "no");
-		this._hasFunPreset = functionalPreset !== null && functionalPreset !== undefined;
-		this._hasStrPreset = structurePreset !== null && structurePreset !== undefined;
-
-		const tabShown = this.state.tab === "functional" && !this._tabFunDisabled ? "functional" : "structural";
-
-		return <div>
-			<Container className="m-0 pl-2 pr-2 mt-2">
-				<Row className="d-flex align-items-top justify-content-between">
-					<Col>
-						<h3 className="m-0 p-0">{Body.GetFeatureName(feature)}</h3>
-					</Col>
-
-					<Col className="text-right">
-						<Button
-							variant="outline-secondary"
-							size="sm"
-							title={I18n.t("Done")}
-							onClick={() => this._onDone()}
-						>
-							<Check />
-						</Button>
-					</Col>
-				</Row>
-			</Container>
-
-			<div className="m-2">
-				<Tabs
-					activeKey={tabShown}
-					id="preset-tabs"
-					className="mb-2"
-					onSelect={k => this.setState({ showPresetSelect: false, tab: k })}
-				>
-					<Tab
-						eventKey="functional"
-						title={I18n.t("Usage")}
-						disabled={this._tabFunDisabled}
-					>
-						{!this.state.showPresetSelect &&
-							<PresetCard
-								preset={mightBeStructure ? functionalPreset : globalPreset}
-								onClick={this._lookForPreset.bind(this)}
-								className="mb-2"
-							/>
-						}
-
-						{!this.state.showPresetSelect && this._presetToComponent(mightBeStructure ? functionalPreset : globalPreset)}
-					</Tab>
-
-					<Tab
-						eventKey="structural"
-						title={I18n.t("Structure")}
-						disabled={this._tabStrDisabled}
-					>
-						{!this.state.showPresetSelect &&
-							<PresetCard
-								preset={structurePreset}
-								onClick={this._lookForPreset.bind(this)}
-								className="mb-2"
-							/>
-						}
-
-						{!this.state.showPresetSelect && this._presetToComponent(structurePreset)}
-					</Tab>
-				</Tabs>
-
-				{this.state.showPresetSelect &&
-					<PresetSelect
-						onSelect={preset => this._onChangePreset(tabShown === "functional" ? functionalPreset : structurePreset, preset)}
-						onBack={() => this.setState({ showPresetSelect: false })}
-						filter={p => (
-							(
-								!p.type
-								|| p.type.includes(GEOM_TO_OSM[feature.geometry.type])
-							) && (
-								tabShown === "functional"
-								|| ["yes","only"].includes(p.indoor_structure)
-							)
-						)}
-					/>
-				}
-
-				{!this.state.showPresetSelect &&
-					<TagsTable
-						className="mt-3"
-						tags={tags}
-					/>
-				}
-
-				{!this.state.showPresetSelect && (!feature.properties.own || !feature.properties.own.new) &&
-					<Button
-						className="mb-3 mt-3"
-						variant="outline-secondary"
-						block
-						size="sm"
-						href={window.CONFIG.osm_api_url+"/"+feature.id+"/history"}
-						target="_blank"
-					>
-						<History size={20} /> {I18n.t("See feature history on OpenStreetMap")}
-					</Button>
-				}
-			</div>
-		</div>;
-	}
-
-	componentDidMount() {
-		if(this.props.feature) {
-			const newTabVal =
-				(this._tabFunDisabled && !this._tabStrDisabled)
-				|| (!this._tabFunDisabled && !this._tabStrDisabled && !this._hasFunPreset && this._hasStrPreset) ?
-					"structural"
-					: "functional";
-
-			if(newTabVal !== this.state.tab) {
-				this.setState({ tab: newTabVal });
-			}
-		}
-	}
-
-	componentDidUpdate(prevProps) {
-		if(prevProps.feature && this.props.feature && prevProps.feature.id !== this.props.feature.id) {
-			const newState = { showPresetSelect: false };
-			const newTabVal =
-				(this._tabFunDisabled && !this._tabStrDisabled)
-				|| (!this._tabFunDisabled && !this._tabStrDisabled && !this._hasFunPreset && this._hasStrPreset) ?
-					"structural"
-					: "functional";
-
-			if(newTabVal !== this.state.tab) {
-				newState.tab = newTabVal;
-			}
-
-			this.setState(newState);
-		}
-	}
-}
-
-export default EditFeaturePane;

+ 0 - 113
src/view/panes/features/View.js

@@ -1,113 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Body from '../../Body';
-import Button from 'react-bootstrap/Button';
-import Check from 'mdi-react/CheckIcon';
-import Col from 'react-bootstrap/Col';
-import Container from 'react-bootstrap/Container';
-import History from 'mdi-react/HistoryIcon';
-import I18n from '../../../config/locales/ui';
-import Pencil from 'mdi-react/PencilIcon';
-import PubSub from 'pubsub-js';
-import Row from 'react-bootstrap/Row';
-import TagsTable from '../../common/TagsTable';
-
-/**
- * Edit feature pane allows user to change one feature description
- */
-class ViewFeaturePane extends Component {
-	_onEdit() {
-		if(this.props.feature && this.props.feature.properties.tags) {
-			const t = this.props.feature.properties.tags;
-
-			if(t.building) {
-				PubSub.publishSync("body.mode.set", { mode: Body.MODE_BUILDING });
-				PubSub.publishSync("body.select.building", { building: this.props.feature });
-			}
-			else if(t.indoor === "level" && this.props.building) {
-				PubSub.publishSync("body.mode.set", { mode: Body.MODE_LEVELS });
-				PubSub.publishSync("body.select.floor", { floor: this.props.feature });
-			}
-			else if(this.props.building) {
-				PubSub.publishSync("body.mode.set", { mode: Body.MODE_FEATURES });
-				PubSub.publishSync("body.select.feature", { feature: this.props.feature });
-			}
-		}
-	}
-
-	render() {
-		if(!this.props.feature) { return <div></div>; }
-
-		const feature = this.props.feature;
-		const tags = feature.properties.tags;
-		const presets = window.presetsManager.findPresetsForFeature(feature);
-		const name = Body.GetFeatureName(feature, [...new Set(presets.map(p => p.name))].join(", "))
-
-		return <div>
-			<Container className="m-0 pl-2 pr-2 mt-2">
-				<Row className="d-flex align-items-top justify-content-between">
-					<Col>
-						<h3 className="m-0 p-0">{name}</h3>
-					</Col>
-
-					<Col className="text-right">
-						<Button
-							variant="outline-secondary"
-							size="sm"
-							title={I18n.t("Done")}
-							onClick={() => PubSub.publish("body.unselect.feature")}
-						>
-							<Check />
-						</Button>
-					</Col>
-				</Row>
-			</Container>
-
-			<div className="m-2 mb-3">
-				{this.props.building &&
-					<Button
-						variant="outline-secondary"
-						block
-						size="sm"
-						onClick={() => this._onEdit()}
-					>
-						<Pencil /> {I18n.t("Edit this feature")}
-					</Button>
-				}
-			</div>
-
-			<div className="m-2">
-				<TagsTable
-					tags={tags}
-					locked={true}
-				/>
-
-				{(!feature.properties.own || !feature.properties.own.new) &&
-					<Button
-						className="mb-3 mt-3"
-						variant="outline-secondary"
-						block
-						size="sm"
-						href={window.CONFIG.osm_api_url+"/"+feature.id+"/history"}
-						target="_blank"
-					>
-						<History size={20} /> {I18n.t("See feature history on OpenStreetMap")}
-					</Button>
-				}
-			</div>
-		</div>;
-	}
-}
-
-export default ViewFeaturePane;

+ 0 - 111
src/view/panes/levels/EditAll.js

@@ -1,111 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Body from '../../Body';
-import Button from 'react-bootstrap/Button';
-import Check from 'mdi-react/CheckIcon';
-import ContentDuplicate from 'mdi-react/ContentDuplicateIcon';
-import I18n from '../../../config/locales/ui';
-import InputGroup from 'react-bootstrap/InputGroup';
-import Form from 'react-bootstrap/Form';
-import PubSub from 'pubsub-js';
-import ShapePolygonPlus from 'mdi-react/ShapePolygonPlusIcon';
-import SquareEditOutline from 'mdi-react/SquareEditOutlineIcon';
-
-/**
- * EditAllLevels pane allows to select and create levels in a given building.
- */
-class EditAllLevelsPane extends Component {
-	/**
-	 * Event handler for click on "Create using floor outline" button
-	 * @private
-	 */
-	_editWithoutFloorContour() {
-		PubSub.publish("body.select.floor", { floor: this.props.building });
-		PubSub.publish("body.mode.set", { mode: Body.MODE_FEATURES });
-	}
-
-	render() {
-		if(!this.props.building) { return <div></div>; }
-
-		const floorParts = window.vectorDataManager.getLevelFootprint(this.props.building, this.props.level || 0);
-		const levelsForCopy = window.vectorDataManager.getCopiableLevels(this.props.building).filter(lvl => lvl !== this.props.level);
-		levelsForCopy.reverse();
-
-		return <div className="m-0 pl-2 pr-2 mt-2">
-			<h3 className="m-0 mb-2 p-0">{I18n.t("Level %{lvl}", { lvl: this.props.level })}</h3>
-
-			{this.props.draw &&
-				<p>{I18n.t("You can draw your feature on the map. Click on done button or click again on last node you created to finish.")}</p>
-			}
-
-			{!this.props.draw && !this.props.floor && floorParts.length > 0 &&
-				<p>{I18n.t("Please select the floor part to edit using the map.")}</p>
-			}
-
-			{!this.props.draw && !this.props.floor && floorParts.length === 0 && [
-				<p className="m-0" key={0}>{I18n.t("This level doesn't have a precise floor outline defined yet.")}</p>
-				,
-				<Button
-					variant="outline-primary"
-					className="mt-2 w-100"
-					key={1}
-					onClick={() => PubSub.publish("body.create.floor", { feature: this.props.building })}
-				>
-					<ShapePolygonPlus /> {I18n.t("Use the whole building footprint")}
-				</Button>
-				,
-				<Button
-					variant="outline-secondary"
-					className="mt-2 w-100"
-					key={2}
-					onClick={() => PubSub.publish("body.draw.floor")}
-				>
-					<SquareEditOutline /> {I18n.t("Draw this floor outline")}
-				</Button>
-			]}
-
-			{!this.props.draw && !this.props.floor && floorParts.length === 0 && levelsForCopy.length > 0 &&
-				<InputGroup
-					className="mt-2 w-100"
-				>
-					<InputGroup.Prepend>
-
-						<InputGroup.Text><ContentDuplicate size={18} /> {I18n.t("Copy level")}</InputGroup.Text>
-
-					</InputGroup.Prepend>
-
-					<Form.Control as="select" ref="levelSelect">
-
-						{levelsForCopy.map((lvl,i) => (
-							<option key={i}>{lvl}</option>
-						))}
-					</Form.Control>
-
-					<InputGroup.Append>
-
-						<Button
-							variant="outline-secondary"
-							title={I18n.t("Copy selected level data in the current level")}
-							onClick={() => PubSub.publish("body.level.copy", { use: this.refs.levelSelect.value })}
-						>
-							<Check size={18} />
-						</Button>
-					</InputGroup.Append>
-				</InputGroup>
-			}
-		</div>;
-	}
-}
-
-export default EditAllLevelsPane;

+ 0 - 84
src/view/panes/levels/EditOne.js

@@ -1,84 +0,0 @@
-/*
- * This file is part of OsmInEdit, released under ISC license (see LICENSE.md)
- *
- * Copyright (c) Adrien Pavie 2019
- * Copyright (c) Daimler AG 2019
- *
- * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-import React, { Component } from 'react';
-import Body from '../../Body';
-import Button from 'react-bootstrap/Button';
-import Check from 'mdi-react/CheckIcon';
-import Col from 'react-bootstrap/Col';
-import Container from 'react-bootstrap/Container';
-import I18n from '../../../config/locales/ui';
-import PresetInputField from '../../common/PresetInputField';
-import PubSub from 'pubsub-js';
-import Row from 'react-bootstrap/Row';
-import TagsTable from '../../common/TagsTable';
-
-/**
- * EditOneLevel pane allows to change a level description.
- */
-class EditOneLevelPane extends Component {
-	render() {
-		if(!this.props.floor) { return <div></div>; }
-
-		const imgHeight = <span>{I18n.t("Relative floor level height in meters")}<img src='img/floor_height.jpg' style={{height: 200}} alt={I18n.t("Schema explaining how should be set level height")} /></span>;
-
-		return <Container className="m-0 pl-2 pr-2 mt-2">
-			<Row className="d-flex align-items-top justify-content-between">
-				<Col>
-					<h3 className="m-0 p-0">{Body.GetFeatureName(this.props.floor)}</h3>
-				</Col>
-
-				<Col className="text-right">
-					<Button
-						variant="outline-secondary"
-						size="sm"
-						title={I18n.t("Done")}
-						onClick={() => PubSub.publish("body.unselect.feature")}
-					>
-						<Check />
-					</Button>
-				</Col>
-			</Row>
-			<Row className="mt-2">
-				<Col className="m-0 p-2">
-					<div className="m-2 mb-4">
-						<PresetInputField
-							type="text"
-							data={{ text: I18n.t("Name"), key: "name" }}
-							tags={this.props.floor.properties.tags}
-						/>
-
-						<PresetInputField
-							type="text"
-							data={{ text: I18n.t("Height (in meters)"), key: "height", info: imgHeight }}
-							tags={this.props.floor.properties.tags}
-						/>
-
-						<PresetInputField
-							type="check"
-							data={{ text: I18n.t("Surrounded by walls"), key: "wall" }}
-							tags={this.props.floor.properties.tags}
-						/>
-					</div>
-
-					<div className="m-2">
-						<TagsTable
-							tags={this.props.floor.properties.tags}
-						/>
-					</div>
-				</Col>
-			</Row>
-		</Container>;
-	}
-}
-
-export default EditOneLevelPane;