Commit 54ae9a2a authored by Adrien Pavie's avatar Adrien Pavie
Browse files

Translation system added

parent 9a42ba44
[main]
host = https://www.transifex.com
[gribrouillon.ui]
file_filter = src/website/i18n/<lang>.json
source_file = src/website/i18n/en.json
source_lang = en
type = KEYVALUEJSON
......@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- If no map position is provided when loading an existing sketch, it zooms automatically to existing shapes
- Map background can be changed using left menu
- Geolocation button added
- Translation system
### Changed
- Drawn shapes are now more or less wide according to zoom level
......
......@@ -4,9 +4,27 @@
Gribrouillon ([gribrouillon.fr](https://gribrouillon.fr)) makes drawing over web maps easy. You can create sketchy maps in seconds, on mobile or desktop. [Give it a try !](https://gribrouillon.fr/)
## Contributing
Interested in helping us ? No worries, you don't need to be a developer to do so. Here are some ways to help improving Gribrouillon :
* There is a bug or some feature missing ? You can either send us [an email](mailto:panieravide@riseup.net) or [create a new issue](https://framagit.org/PanierAvide/gribrouillon/issues) on the repository.
* If you speak English and another language, you can [help translate the tool](https://www.transifex.com/openlevelup/gribrouillon/) on Transifex.
* And as always, you can help solve bugs or implement feature if you know code.
## Contributors
Gribrouillon exists and is everyday improving thanks to the __amazing people__ following :
* Adrien Pavie, main developer
* Florian Lainez, user experience expert
* And all users, for using the tool and sharing their ideas !
## Deploy your own instance
If you want to have your own Gribrouillon server running, you can follow these instructions.
If you want to have your own Gribrouillon server running (either for developing or hosting), you can follow these instructions.
### Requirements
......@@ -15,6 +33,7 @@ To run properly, Gribrouillon needs following software to be available :
* PostgreSQL >= 10
* PostGIS >= 2.4
* NodeJS >= 9
* Only for updating translations : [Transifex CLI](https://docs.transifex.com/client/installing-the-client)
### Install
......@@ -39,15 +58,10 @@ Edit `config.json` file according to your PostgreSQL setup.
```bash
npm run start
```
## Contributors
Gribrouillon exists and is everyday improving thanks to the __amazing people__ following :
* Adrien Pavie, main developer
* Florian Lainez, user experience expert
* And all users, for using the tool and sharing their ideas !
# Or alternatively, if you want to change port
PORT=12345 npm run start
```
## License
......
/**
* Changes the language in the translation files retrieved from Transifex.
*/
const fs = require('fs');
const I18N_DIRS = [ "./src/website/i18n" ];
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);
}
});
});
......@@ -1129,14 +1129,12 @@
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "1.9.3"
}
......@@ -1400,7 +1398,6 @@
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
"dev": true,
"requires": {
"chalk": "1.1.3",
"esutils": "2.0.3",
......@@ -1410,14 +1407,12 @@
"ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
"dev": true
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
},
"chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
"ansi-styles": "2.2.1",
"escape-string-regexp": "1.0.5",
......@@ -1429,14 +1424,12 @@
"js-tokens": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
"dev": true
"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
},
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
"dev": true
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
}
}
},
......@@ -1468,7 +1461,6 @@
"version": "6.23.0",
"resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
"integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
"dev": true,
"requires": {
"babel-runtime": "6.26.0"
}
......@@ -1486,7 +1478,6 @@
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"dev": true,
"requires": {
"core-js": "2.6.11",
"regenerator-runtime": "0.11.1"
......@@ -1509,7 +1500,6 @@
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
"integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
"dev": true,
"requires": {
"babel-code-frame": "6.26.0",
"babel-messages": "6.23.0",
......@@ -1525,8 +1515,7 @@
"globals": {
"version": "9.18.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
"integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
"dev": true
"integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
}
}
},
......@@ -1534,7 +1523,6 @@
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
"integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
"dev": true,
"requires": {
"babel-runtime": "6.26.0",
"esutils": "2.0.3",
......@@ -1545,8 +1533,7 @@
"to-fast-properties": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
"integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
"dev": true
"integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
}
}
},
......@@ -1559,8 +1546,7 @@
"babylon": {
"version": "6.18.0",
"resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
"dev": true
"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
},
"backo2": {
"version": "1.0.2",
......@@ -2052,7 +2038,6 @@
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "3.2.1",
"escape-string-regexp": "1.0.5",
......@@ -2222,7 +2207,6 @@
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
......@@ -2230,8 +2214,7 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"combine-source-map": {
"version": "0.8.0",
......@@ -2376,8 +2359,7 @@
"core-js": {
"version": "2.6.11",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
"dev": true
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
},
"core-js-compat": {
"version": "3.6.4",
......@@ -2411,6 +2393,11 @@
"vary": "1.1.2"
}
},
"crc32": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/crc32/-/crc32-0.2.2.tgz",
"integrity": "sha1-etIg1v/c0Rn5/BJ6d3LKzqOQpLo="
},
"create-ecdh": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
......@@ -2842,8 +2829,7 @@
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
},
"etag": {
"version": "1.8.1",
......@@ -3811,6 +3797,11 @@
"assert-plus": "1.0.0"
}
},
"gglobby": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/gglobby/-/gglobby-0.0.3.tgz",
"integrity": "sha1-x9aGwf8spOiCpYrfOKfeJpG6f5k="
},
"glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
......@@ -3899,7 +3890,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"dev": true,
"requires": {
"ansi-regex": "2.1.1"
}
......@@ -3927,8 +3917,7 @@
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"has-require": {
"version": "1.2.2",
......@@ -4061,6 +4050,38 @@
"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
"dev": true
},
"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=="
},
"i18nline": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/i18nline/-/i18nline-2.0.1.tgz",
"integrity": "sha512-abACtOMahZSwCDL2C1Flqr+WxSQaWgVNCd74UGvsvkVdrt6mFyas2i6XUX74hio5hnGkc9u862t/4y68rIv8nQ==",
"requires": {
"babel-traverse": "6.26.0",
"babylon": "6.18.0",
"chalk": "2.4.2",
"crc32": "0.2.2",
"esprima": "4.0.1",
"extend": "3.0.2",
"gglobby": "0.0.3",
"i18n-js": "3.5.1",
"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=="
}
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
......@@ -4132,7 +4153,6 @@
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"dev": true,
"requires": {
"loose-envify": "1.4.0"
}
......@@ -4346,8 +4366,7 @@
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"jsbn": {
"version": "0.1.1",
......@@ -4488,7 +4507,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dev": true,
"requires": {
"js-tokens": "4.0.0"
}
......@@ -4607,8 +4625,7 @@
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
},
"mixin-deep": {
"version": "1.3.2",
......@@ -4635,7 +4652,6 @@
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"requires": {
"minimist": "0.0.8"
},
......@@ -4643,8 +4659,7 @@
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
}
}
},
......@@ -5417,8 +5432,7 @@
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
"dev": true
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"regenerator-transform": {
"version": "0.14.1",
......@@ -6090,6 +6104,11 @@
"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
"dev": true
},
"speakingurl": {
"version": "14.0.1",
"resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
"integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="
},
"split": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
......@@ -6230,7 +6249,6 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "2.1.1"
}
......@@ -6263,7 +6281,6 @@
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "3.0.0"
}
......@@ -6509,6 +6526,11 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
"uevents": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/uevents/-/uevents-1.0.0.tgz",
"integrity": "sha1-IAXppHL7CkbIJuz9GJrtmI7F6+E="
},
"uglify-es": {
"version": "3.3.9",
"resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
......@@ -6554,6 +6576,11 @@
}
}
},
"ulog": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/ulog/-/ulog-1.1.0.tgz",
"integrity": "sha512-oQDYGh4w/ykGSpffEuwkqFnL5BYJa5HeV5PhpkjuAFwJCyjp2KjT2YDcFa8y4ie8kejdXMwpFCSF6HNM5Kia4g=="
},
"umd": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
......
......@@ -9,7 +9,12 @@
"build": "npm run build:assets && npm run build:js",
"build:assets": "mkdir -p build && cp -r src/website/*.html src/website/*.css src/website/img node_modules/bootstrap/dist/css/bootstrap.min.css node_modules/bootstrap/dist/js/bootstrap.min.js node_modules/jquery-slim/dist/jquery.slim.min.js node_modules/leaflet/dist/leaflet.js node_modules/leaflet/dist/leaflet.css node_modules/leaflet-hash/leaflet-hash.js node_modules/font-awesome/css/font-awesome.min.css node_modules/font-awesome/fonts node_modules/qrcode-svg/dist/qrcode.min.js node_modules/leaflet-bing-layer/leaflet-bing-layer.min.js node_modules/leaflet.locatecontrol/dist/L.Control.Locate.min.css node_modules/leaflet.locatecontrol/dist/L.Control.Locate.min.js build/",
"build:js": "simplifyify --minify --outfile \"build/*.min.js\" src/website/*.js",
"clean": "rm -rf ./build"
"clean": "rm -rf ./build",
"i18n:build": "i18nline synch",
"i18n:add": "tx set --auto-local -r gribrouillon.ui 'src/website/i18n/<lang>.json' --source-lang en --type KEYVALUEJSON",
"i18n:push": "tx push -s",
"i18n:pull": "tx pull -a --minimum-perc=75 && node fix_i18n_files.js && i18nline index",
"i18n:clean": "rm -rf ./src/website/i18n/*.js*"
},
"repository": {
"type": "git",
......@@ -31,6 +36,7 @@
"cors": "^2.8.5",
"express": "^4.17.1",
"font-awesome": "^4.7.0",
"i18nline": "^2.0.1",
"jquery-slim": "^3.0.0",
"leaflet": "^1.6.0",
"leaflet-bing-layer": "^3.3.1",
......@@ -48,6 +54,10 @@
"babelify": "^10.0.0",
"simplifyify": "^7.0.6"
},
"i18n": {
"directories": "src/website",
"out": "src/website/i18n"
},
"browserify": {
"transform": [
[
......
{
"default": {
"about_70c18bba": "About",
"by_email_17e53ec1": "By email",
"can_t_create_a_new_sketch_please_retry_later_c658f17c": "Can't create a new sketch. Please retry later.",
"can_t_find_given_sketch_check_url_or_retry_later_2b5a06fe": "Can't find given sketch. Check URL or retry later.",
"change_background_6c1240e2": "Change background",
"change_color_760725e9": "Change color",
"choose_a_color_711d6bf1": "Choose a color",
"choose_map_background_38da8c49": "Choose map background",
"copy_9748f9f": "Copy",
"feet_da0bcfec": "feet",
"large_9c5e80e7": "Large",
"loading_bde52856": "Loading",
"medium_5a8e9ead": "Medium",
"menu_39cb0e8e": "Menu",
"meters_b16f9ec4": "meters",
"no_result_for_your_search_please_check_given_addre_f7a680e1": "No result for your search, please check given address.",
"search_280d00bd": "Search",
"search_service_is_unavailable_please_retry_later_19aef6cc": "Search service is unavailable. Please retry later.",
"search_your_street_city_country_d2acc036": "Search your street, city, country...",
"share_your_map_8ce46090": "Share your map",
"share_your_sketch_29746764": "Share your sketch",
"show_my_location_on_map_44eff9a6": "Show my location on map",
"sketch_map_made_with_gribrouillon_adedf618": "Sketch map made with Gribrouillon",
"small_b070434a": "Small",
"source_code_2395ca74": "Source code",
"start_drawing_b72487df": "Start drawing",
"stop_drawing_fd3165a4": "Stop drawing",
"there_was_a_deletion_error_please_reload_the_page_cfa7e8cd": "There was a deletion error. Please reload the page.",
"there_was_an_error_when_saving_your_edits_please_r_7479c55f": "There was an error when saving your edits. Please reload the page.",
"undo_a7be8fef": "Undo",
"very_small_8ac77e7d": "Very small",
"you_are_located_outside_map_bounds_77c9f75b": "You are located outside map bounds",
"you_are_within_distance_unit_around_this_point_f63c6d59": "You are within {distance} {unit} around this point"
}
}
\ No newline at end of file
{
"en": {
"about_70c18bba": "About",
"by_email_17e53ec1": "By email",
"can_t_create_a_new_sketch_please_retry_later_c658f17c": "Can't create a new sketch. Please retry later.",
"can_t_find_given_sketch_check_url_or_retry_later_2b5a06fe": "Can't find given sketch. Check URL or retry later.",
"change_background_6c1240e2": "Change background",
"change_color_760725e9": "Change color",
"choose_a_color_711d6bf1": "Choose a color",
"choose_map_background_38da8c49": "Choose map background",
"copy_9748f9f": "Copy",
"feet_da0bcfec": "feet",
"large_9c5e80e7": "Large",
"loading_bde52856": "Loading",
"medium_5a8e9ead": "Medium",
"menu_39cb0e8e": "Menu",
"meters_b16f9ec4": "meters",
"no_result_for_your_search_please_check_given_addre_f7a680e1": "No result for your search, please check given address.",
"search_280d00bd": "Search",
"search_service_is_unavailable_please_retry_later_19aef6cc": "Search service is unavailable. Please retry later.",
"search_your_street_city_country_d2acc036": "Search your street, city, country...",
"share_your_map_8ce46090": "Share your map",
"share_your_sketch_29746764": "Share your sketch",
"show_my_location_on_map_44eff9a6": "Show my location on map",
"sketch_map_made_with_gribrouillon_adedf618": "Sketch map made with Gribrouillon",
"small_b070434a": "Small",
"source_code_2395ca74": "Source code",
"start_drawing_b72487df": "Start drawing",
"stop_drawing_fd3165a4": "Stop drawing",
"there_was_a_deletion_error_please_reload_the_page_cfa7e8cd": "There was a deletion error. Please reload the page.",
"there_was_an_error_when_saving_your_edits_please_r_7479c55f": "There was an error when saving your edits. Please reload the page.",
"undo_a7be8fef": "Undo",
"very_small_8ac77e7d": "Very small",
"you_are_located_outside_map_bounds_77c9f75b": "You are located outside map bounds",
"you_are_within_distance_unit_around_this_point_f63c6d59": "You are within {distance} {unit} around this point"
}
}
\ No newline at end of file
{
"fr": {
"about_70c18bba": "À propos",
"by_email_17e53ec1": "Par courriel",
"can_t_create_a_new_sketch_please_retry_later_c658f17c": "Impossible de créer un nouveau dessin. Merci de réessayer plus tard.",
"can_t_find_given_sketch_check_url_or_retry_later_2b5a06fe": "Ce dessin est introuvable. Vérifiez le lien ou réessayez plus tard.",
"change_background_6c1240e2": "Changer le fond de carte",
"change_color_760725e9": "Changer la couleur",
"choose_a_color_711d6bf1": "Choisir une couleur",
"choose_map_background_38da8c49": "Changer de fond de carte",
"copy_9748f9f": "Copier",
"feet_da0bcfec": "pieds",
"large_9c5e80e7": "Large",
"loading_bde52856": "Chargement",
"medium_5a8e9ead": "Intermédiaire",
"menu_39cb0e8e": "Menu",
"meters_b16f9ec4": "mètres",
"no_result_for_your_search_please_check_given_addre_f7a680e1": "Aucun résultat trouvé, vérifiez l'adresse saisie.",
"search_280d00bd": "Rechercher",
"search_service_is_unavailable_please_retry_later_19aef6cc": "Le moteur de recherche est indisponible. Merci de réessayer plus tard.",
"search_your_street_city_country_d2acc036": "Cherchez votre rue, ville, pays...",
"share_your_map_8ce46090": "Partager votre carte",
"share_your_sketch_29746764": "Partager votre dessin",
"show_my_location_on_map_44eff9a6": "Me localiser sur la carte",
"sketch_map_made_with_gribrouillon_adedf618": "Dessin réalisé avec Gribrouillon",
"small_b070434a": "Petit",
"source_code_2395ca74": "Code source",
"start_drawing_b72487df": "Commencer à dessiner",
"stop_drawing_fd3165a4": "Arrêter de dessiner",
"there_was_a_deletion_error_please_reload_the_page_cfa7e8cd": "Impossible de supprimer l'objet. Merci de recharger la page.",
"there_was_an_error_when_saving_your_edits_please_r_7479c55f": "Impossible de sauvegarder vos modifications. Merci de recharger la page.",
"undo_a7be8fef": "Annuler",
"very_small_8ac77e7d": "Très petit",