diff --git a/gulp/gulp-content.js b/gulp/gulp-content.js index dc1b32c435..c36bfeb125 100644 --- a/gulp/gulp-content.js +++ b/gulp/gulp-content.js @@ -6,7 +6,7 @@ gulp.task('content:cache', done => { // Requiring at runtime because these files access `common` // code which in production works only if transpiled so after // gulp build:babel:common has run - const { CONTENT_CACHE_PATH, getLocalizedContent } = require('../website/server/libs/content'); // eslint-disable-line global-require + const { CONTENT_CACHE_PATH, getLocalizedContentResponse } = require('../website/server/libs/content'); // eslint-disable-line global-require const { langCodes } = require('../website/server/libs/i18n'); // eslint-disable-line global-require try { @@ -23,7 +23,7 @@ gulp.task('content:cache', done => { langCodes.forEach(langCode => { fs.writeFileSync( `${CONTENT_CACHE_PATH}${langCode}.json`, - getLocalizedContent(langCode), + getLocalizedContentResponse(langCode), 'utf8', ); }); diff --git a/migrations/s3-upload.js b/migrations/archive/s3-upload.js similarity index 100% rename from migrations/s3-upload.js rename to migrations/archive/s3-upload.js diff --git a/package-lock.json b/package-lock.json index 9ce88d2eff..61d2c699cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -150,22 +150,27 @@ } }, "@babel/generator": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", - "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", + "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", "requires": { - "@babel/types": "^7.9.0", + "@babel/types": "^7.9.5", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -305,9 +310,9 @@ } }, "@babel/parser": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz", - "integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A==" + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" }, "@babel/template": { "version": "7.8.6", @@ -320,13 +325,20 @@ } }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + } } }, "chalk": { @@ -646,12 +658,13 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz", - "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz", + "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.9.5" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -789,18 +802,45 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", - "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", + "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + }, + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-computed-properties": { @@ -812,9 +852,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz", - "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", + "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -945,9 +985,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", - "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", + "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", "requires": { "@babel/helper-get-function-arity": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" @@ -1029,9 +1069,9 @@ } }, "@babel/preset-env": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", - "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.5.tgz", + "integrity": "sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ==", "requires": { "@babel/compat-data": "^7.9.0", "@babel/helper-compilation-targets": "^7.8.7", @@ -1042,7 +1082,7 @@ "@babel/plugin-proposal-json-strings": "^7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.0", + "@babel/plugin-proposal-object-rest-spread": "^7.9.5", "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", "@babel/plugin-proposal-optional-chaining": "^7.9.0", "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", @@ -1059,9 +1099,9 @@ "@babel/plugin-transform-async-to-generator": "^7.8.3", "@babel/plugin-transform-block-scoped-functions": "^7.8.3", "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.9.0", + "@babel/plugin-transform-classes": "^7.9.5", "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.9.5", "@babel/plugin-transform-dotall-regex": "^7.8.3", "@babel/plugin-transform-duplicate-keys": "^7.8.3", "@babel/plugin-transform-exponentiation-operator": "^7.8.3", @@ -1076,7 +1116,7 @@ "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", "@babel/plugin-transform-new-target": "^7.8.3", "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-parameters": "^7.9.5", "@babel/plugin-transform-property-literals": "^7.8.3", "@babel/plugin-transform-regenerator": "^7.8.7", "@babel/plugin-transform-reserved-words": "^7.8.3", @@ -1087,7 +1127,7 @@ "@babel/plugin-transform-typeof-symbol": "^7.8.4", "@babel/plugin-transform-unicode-regex": "^7.8.3", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.0", + "@babel/types": "^7.9.5", "browserslist": "^4.9.1", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -1095,12 +1135,17 @@ "semver": "^5.5.0" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1182,16 +1227,16 @@ } }, "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-split-export-declaration": "^7.8.3", "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/types": "^7.9.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -1205,6 +1250,16 @@ "@babel/highlight": "^7.8.3" } }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, "@babel/highlight": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", @@ -1216,18 +1271,25 @@ } }, "@babel/parser": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz", - "integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A==" + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + } } }, "chalk": { @@ -2385,48 +2447,6 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, - "aws-sdk": { - "version": "2.653.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.653.0.tgz", - "integrity": "sha512-vtpHfoAKoudNa5kknUgQeXzdnmkI63hqKYHuk5u7mx0HelP8iybTxmKfKENlOvkfKtBdCEbcmJRa3DxZUbQPHQ==", - "requires": { - "buffer": "4.9.1", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - } - } - }, "aws-sign2": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", @@ -3187,14 +3207,14 @@ "dev": true }, "browserslist": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.0.tgz", - "integrity": "sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", "requires": { - "caniuse-lite": "^1.0.30001035", - "electron-to-chromium": "^1.3.380", - "node-releases": "^1.1.52", - "pkg-up": "^3.1.0" + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" } }, "bson": { @@ -3202,16 +3222,6 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz", "integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==" }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", @@ -3360,9 +3370,9 @@ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, "caniuse-lite": { - "version": "1.0.30001036", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001036.tgz", - "integrity": "sha512-jU8CIFIj2oR7r4W+5AKcsvWNVIb6Q6OZE3UsrXrZBHFtreT4YgTeOJtTucp+zSedEpTi3L5wASSP0LYIE3if6w==" + "version": "1.0.30001041", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001041.tgz", + "integrity": "sha512-fqDtRCApddNrQuBxBS7kEiSGdBsgO4wiVw4G/IClfqzfhW45MbTumfN4cuUJGTM0YGFNn97DCXPJ683PS6zwvA==" }, "capture-stack-trace": { "version": "1.0.1", @@ -4016,11 +4026,11 @@ "dev": true }, "core-js-compat": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", - "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "requires": { - "browserslist": "^4.8.3", + "browserslist": "^4.8.5", "semver": "7.0.0" }, "dependencies": { @@ -4778,9 +4788,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.380", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.380.tgz", - "integrity": "sha512-2jhQxJKcjcSpVOQm0NAfuLq8o+130blrcawoumdXT6411xG/xIAOyZodO/y7WTaYlz/NHe3sCCAe/cJLnDsqTw==" + "version": "1.3.403", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.403.tgz", + "integrity": "sha512-JaoxV4RzdBAZOnsF4dAlZ2ijJW72MbqO5lNfOBHUWiBQl3Rwe+mk2RCUMrRI3rSClLJ8HSNQNqcry12H+0ZjFw==" }, "emitter-listener": { "version": "1.1.2", @@ -5286,11 +5296,6 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, "exec-buffer": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", @@ -7707,7 +7712,8 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "optional": true }, "ienoopen": { "version": "1.1.0", @@ -8630,11 +8636,6 @@ "is-object": "^1.0.1" } }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, "jpeg-js": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.6.tgz", @@ -10296,19 +10297,9 @@ } }, "node-releases": { - "version": "1.1.52", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz", - "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==", - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" }, "nodemon": { "version": "2.0.2", @@ -11258,11 +11249,51 @@ } }, "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "requires": { - "find-up": "^3.0.0" + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + } } }, "plugin-error": { @@ -11430,11 +11461,6 @@ "strict-uri-encode": "^1.0.0" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, "queue": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", @@ -13737,22 +13763,6 @@ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", diff --git a/package.json b/package.json index 38fef0518a..ad284fb3d4 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "./website/server/index.js", "dependencies": { "@babel/core": "^7.9.0", - "@babel/preset-env": "^7.9.0", + "@babel/preset-env": "^7.9.5", "@babel/register": "^7.9.0", "@google-cloud/trace-agent": "^4.2.5", "@slack/client": "^4.12.0", @@ -15,7 +15,6 @@ "apidoc": "^0.17.5", "apn": "^2.2.0", "apple-auth": "^1.0.5", - "aws-sdk": "^2.653.0", "bcrypt": "^3.0.8", "body-parser": "^1.18.3", "compression": "^1.7.4", diff --git a/test/api/unit/libs/content.test.js b/test/api/unit/libs/content.test.js index bd037ef4fb..368d8fe9fd 100644 --- a/test/api/unit/libs/content.test.js +++ b/test/api/unit/libs/content.test.js @@ -8,9 +8,9 @@ describe('contentLib', () => { }); }); - describe('getLocalizedContent', () => { + describe('getLocalizedContentResponse', () => { it('clones, not modify, the original content data', () => { - contentLib.getLocalizedContent(); + contentLib.getLocalizedContentResponse(); expect(typeof content.backgrounds.backgrounds062014.beach.text).to.equal('function'); }); }); diff --git a/test/api/unit/libs/localizeContentData.js b/test/api/unit/libs/localizeContentData.js new file mode 100644 index 0000000000..be43098b08 --- /dev/null +++ b/test/api/unit/libs/localizeContentData.js @@ -0,0 +1,22 @@ +import faq from '../../../../website/common/script/content/faq'; +import common from '../../../../website/common'; +import { localizeContentData } from '../../../../website/server/libs/content'; + +const { i18n } = common; + +describe('localizeContentData', () => { + it('Should take a an object with localization identifiers and ' + + 'return an object with actual translations in English', () => { + const faqInEnglish = localizeContentData(faq, 'en'); + + expect(faqInEnglish).to.have.property('stillNeedHelp'); + expect(faqInEnglish.stillNeedHelp.ios).to.equal(i18n.t('iosFaqStillNeedHelp', 'en')); + }); + it('Should take an object with localization identifiers and ' + + 'return an object with actual translations in German', () => { + const faqInEnglish = localizeContentData(faq, 'de'); + + expect(faqInEnglish).to.have.property('stillNeedHelp'); + expect(faqInEnglish.stillNeedHelp.ios).to.equal(i18n.t('iosFaqStillNeedHelp', 'de')); + }); +}); diff --git a/test/api/v4/faq/GET-faq.test.js b/test/api/v4/faq/GET-faq.test.js new file mode 100644 index 0000000000..5c7ab31ce6 --- /dev/null +++ b/test/api/v4/faq/GET-faq.test.js @@ -0,0 +1,65 @@ +import { + requester, + translate, +} from '../../../helpers/api-integration/v4'; +import i18n from '../../../../website/common/script/i18n'; + +describe('GET /faq', () => { + describe('language parameter', () => { + it('returns faq (and does not require authentication)', async () => { + const res = await requester().get('/faq'); + + expect(res).to.have.property('stillNeedHelp'); + expect(res.stillNeedHelp.ios).to.equal(translate('iosFaqStillNeedHelp')); + expect(res).to.have.property('questions'); + expect(res.questions[0].question).to.equal(translate('faqQuestion0')); + }); + + it('returns faq not in English', async () => { + const res = await requester().get('/faq?language=de'); + expect(res).to.have.nested.property('stillNeedHelp.ios'); + expect(res.stillNeedHelp.ios).to.equal(i18n.t('iosFaqStillNeedHelp', 'de')); + }); + + it('falls back to English if the desired language is not found', async () => { + const res = await requester().get('/faq?language=wrong'); + expect(res).to.have.nested.property('stillNeedHelp.ios'); + expect(res.stillNeedHelp.ios).to.equal(translate('iosFaqStillNeedHelp')); + }); + }); + + describe('platform parameter', () => { + it('returns faq with answers for ios platform only', async () => { + const res = await requester().get('/faq?platform=ios'); + + expect(res).to.have.property('stillNeedHelp'); + expect(res.stillNeedHelp).to.eql({ ios: translate('iosFaqStillNeedHelp') }); + + expect(res).to.have.property('questions'); + expect(res.questions[0]).to.eql({ + question: translate('faqQuestion0'), + ios: translate('iosFaqAnswer0'), + }); + }); + it('returns an error when invalid platform parameter is specified', async () => { + const request = requester().get('/faq?platform=wrong'); + await expect(request) + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: i18n.t('invalidReqParams'), + }); + }); + it('falls back to "web" description if there is no description for specified platform', async () => { + const res = await requester().get('/faq?platform=android'); + expect(res).to.have.property('stillNeedHelp'); + expect(res.stillNeedHelp).to.eql({ web: translate('webFaqStillNeedHelp') }); + + expect(res).to.have.property('questions'); + expect(res.questions[0]).to.eql({ + question: translate('faqQuestion0'), + android: translate('androidFaqAnswer0'), + }); + }); + }); +}); diff --git a/website/client/package-lock.json b/website/client/package-lock.json index 52a8ff0b3a..a216dfd250 100644 --- a/website/client/package-lock.json +++ b/website/client/package-lock.json @@ -39,14 +39,14 @@ } }, "caniuse-lite": { - "version": "1.0.30001039", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz", - "integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==" + "version": "1.0.30001041", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001041.tgz", + "integrity": "sha512-fqDtRCApddNrQuBxBS7kEiSGdBsgO4wiVw4G/IClfqzfhW45MbTumfN4cuUJGTM0YGFNn97DCXPJ683PS6zwvA==" }, "electron-to-chromium": { - "version": "1.3.397", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.397.tgz", - "integrity": "sha512-zcUd1p/7yzTSdWkCTrqGvbnEOASy96d0RJL/lc5BDJoO23Z3G/VHd0yIPbguDU9n8QNUTCigLO7oEdtOb7fp2A==" + "version": "1.3.403", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.403.tgz", + "integrity": "sha512-JaoxV4RzdBAZOnsF4dAlZ2ijJW72MbqO5lNfOBHUWiBQl3Rwe+mk2RCUMrRI3rSClLJ8HSNQNqcry12H+0ZjFw==" }, "node-releases": { "version": "1.1.53", @@ -87,16 +87,26 @@ } }, "@babel/generator": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", - "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", + "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", "requires": { - "@babel/types": "^7.9.0", + "@babel/types": "^7.9.5", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, "@babel/helper-module-imports": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", @@ -135,27 +145,27 @@ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" }, "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-split-export-declaration": "^7.8.3", "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/types": "^7.9.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -359,14 +369,14 @@ } }, "caniuse-lite": { - "version": "1.0.30001039", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz", - "integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==" + "version": "1.0.30001041", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001041.tgz", + "integrity": "sha512-fqDtRCApddNrQuBxBS7kEiSGdBsgO4wiVw4G/IClfqzfhW45MbTumfN4cuUJGTM0YGFNn97DCXPJ683PS6zwvA==" }, "electron-to-chromium": { - "version": "1.3.397", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.397.tgz", - "integrity": "sha512-zcUd1p/7yzTSdWkCTrqGvbnEOASy96d0RJL/lc5BDJoO23Z3G/VHd0yIPbguDU9n8QNUTCigLO7oEdtOb7fp2A==" + "version": "1.3.403", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.403.tgz", + "integrity": "sha512-JaoxV4RzdBAZOnsF4dAlZ2ijJW72MbqO5lNfOBHUWiBQl3Rwe+mk2RCUMrRI3rSClLJ8HSNQNqcry12H+0ZjFw==" }, "node-releases": { "version": "1.1.53", @@ -1117,9 +1127,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==" + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" }, "@babel/helper-wrap-function": { "version": "7.8.3", @@ -1249,16 +1259,26 @@ } }, "@babel/generator": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", - "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", + "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", "requires": { - "@babel/types": "^7.9.0", + "@babel/types": "^7.9.5", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, "@babel/highlight": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", @@ -1275,27 +1295,27 @@ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" }, "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-split-export-declaration": "^7.8.3", "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/types": "^7.9.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2174,6 +2194,27 @@ "regenerator-runtime": "^0.13.2" } }, + "@babel/runtime-corejs2": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.9.2.tgz", + "integrity": "sha512-ayjSOxuK2GaSDJFCtLgHnYjuMyIpViNujWrZo8GUpN60/n7juzJKK5yOo6RFVb0zdU9ACJFK+MsZrUnj3OmXMw==", + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "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==" + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, "@babel/template": { "version": "7.8.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", @@ -4574,9 +4615,9 @@ } }, "@vue/babel-preset-app": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.3.0.tgz", - "integrity": "sha512-6a/VIavCRPc6QCFigrC5Ok/xqtEssOC4A+Kif05YxEeEZwNHI+kfjnAyjA3skKs7XKpyJQpYcrx9X6UhUo8nTg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.3.1.tgz", + "integrity": "sha512-iNkySkbRWXGUA+Cvzj+/gEP0Y0uVAwwzfn21S7hkggSeIg9LJyZ+QzdxgKO0wgi01yTdb2mYWgeLQAfHZ65aew==", "requires": { "@babel/core": "^7.9.0", "@babel/helper-compilation-targets": "^7.8.7", @@ -4594,6 +4635,28 @@ "core-js-compat": "^3.6.4" }, "dependencies": { + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-module-imports": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", @@ -4617,11 +4680,11 @@ }, "dependencies": { "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -4629,12 +4692,13 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz", - "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz", + "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==", "requires": { "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.9.5" } }, "@babel/plugin-proposal-optional-chaining": { @@ -4647,13 +4711,13 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", - "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", + "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", "@babel/helper-replace-supers": "^7.8.6", @@ -4661,6 +4725,14 @@ "globals": "^11.1.0" } }, + "@babel/plugin-transform-destructuring": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", + "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@babel/plugin-transform-for-of": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", @@ -4711,9 +4783,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", - "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", + "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", "requires": { "@babel/helper-get-function-arity": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" @@ -4728,9 +4800,9 @@ } }, "@babel/preset-env": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", - "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.5.tgz", + "integrity": "sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ==", "requires": { "@babel/compat-data": "^7.9.0", "@babel/helper-compilation-targets": "^7.8.7", @@ -4741,7 +4813,7 @@ "@babel/plugin-proposal-json-strings": "^7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.0", + "@babel/plugin-proposal-object-rest-spread": "^7.9.5", "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", "@babel/plugin-proposal-optional-chaining": "^7.9.0", "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", @@ -4758,9 +4830,9 @@ "@babel/plugin-transform-async-to-generator": "^7.8.3", "@babel/plugin-transform-block-scoped-functions": "^7.8.3", "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.9.0", + "@babel/plugin-transform-classes": "^7.9.5", "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.9.5", "@babel/plugin-transform-dotall-regex": "^7.8.3", "@babel/plugin-transform-duplicate-keys": "^7.8.3", "@babel/plugin-transform-exponentiation-operator": "^7.8.3", @@ -4775,7 +4847,7 @@ "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", "@babel/plugin-transform-new-target": "^7.8.3", "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-parameters": "^7.9.5", "@babel/plugin-transform-property-literals": "^7.8.3", "@babel/plugin-transform-regenerator": "^7.8.7", "@babel/plugin-transform-reserved-words": "^7.8.3", @@ -4786,7 +4858,7 @@ "@babel/plugin-transform-typeof-symbol": "^7.8.4", "@babel/plugin-transform-unicode-regex": "^7.8.3", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.0", + "@babel/types": "^7.9.5", "browserslist": "^4.9.1", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -4795,11 +4867,11 @@ }, "dependencies": { "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -4826,14 +4898,14 @@ } }, "caniuse-lite": { - "version": "1.0.30001039", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz", - "integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==" + "version": "1.0.30001041", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001041.tgz", + "integrity": "sha512-fqDtRCApddNrQuBxBS7kEiSGdBsgO4wiVw4G/IClfqzfhW45MbTumfN4cuUJGTM0YGFNn97DCXPJ683PS6zwvA==" }, "electron-to-chromium": { - "version": "1.3.397", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.397.tgz", - "integrity": "sha512-zcUd1p/7yzTSdWkCTrqGvbnEOASy96d0RJL/lc5BDJoO23Z3G/VHd0yIPbguDU9n8QNUTCigLO7oEdtOb7fp2A==" + "version": "1.3.403", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.403.tgz", + "integrity": "sha512-JaoxV4RzdBAZOnsF4dAlZ2ijJW72MbqO5lNfOBHUWiBQl3Rwe+mk2RCUMrRI3rSClLJ8HSNQNqcry12H+0ZjFw==" }, "node-releases": { "version": "1.1.53", @@ -4909,106 +4981,30 @@ } }, "@vue/cli-overlay": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.3.0.tgz", - "integrity": "sha512-PWMPx2emRZR0tZmICXjFMkZflhWMorx5SnOguLzewuhayKR05tDCUxSydoy9Synre/d35mHAr3/iRc49uiLKuQ==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.3.1.tgz", + "integrity": "sha512-UA399aWHhre2VHrQFQSJhFLrFMqOYQ8ly+Ni6T+cpCjOwssjiaqaqrG5YiZBAqDwQvjrtYori4lU66qrY5DVhA==" }, "@vue/cli-plugin-babel": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.3.0.tgz", - "integrity": "sha512-PX4kwelO1b5SvDCpmn9V+de0NfXVuu1frNaQ5CDknL8NhujOhrRzFkTuz6CWO4Dl9lj2TG90WoHqg/F1OYFqYg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.3.1.tgz", + "integrity": "sha512-tBqu0v1l4LfWX8xuJmofpp+8xQzKddFNxdLmeVDOX/omDBQX0qaVDeMUtRxxSTazI06SKr605SnUQoa35qwbvw==", "requires": { "@babel/core": "^7.9.0", - "@vue/babel-preset-app": "^4.3.0", - "@vue/cli-shared-utils": "^4.3.0", + "@vue/babel-preset-app": "^4.3.1", + "@vue/cli-shared-utils": "^4.3.1", "babel-loader": "^8.1.0", "cache-loader": "^4.1.0", "thread-loader": "^2.1.3", "webpack": "^4.0.0" - }, - "dependencies": { - "@vue/cli-shared-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.3.0.tgz", - "integrity": "sha512-iGWoYvPZvsJqIeXfaJcf5LgsaiqyYSnXEHkW+52ELfniw6NZAr1mdn4vPzppAElhFd87TY3rq0DFXP8UBr+/6w==", - "requires": { - "@hapi/joi": "^15.0.1", - "chalk": "^2.4.2", - "execa": "^1.0.0", - "launch-editor": "^2.2.1", - "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", - "open": "^6.3.0", - "ora": "^3.4.0", - "read-pkg": "^5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "semver": "^6.1.0", - "strip-ansi": "^6.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } } }, "@vue/cli-plugin-eslint": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.3.0.tgz", - "integrity": "sha512-0M8U45JETVam/zS/9AQChcgf+thvvjNg2Dkeba6mCklEjT5Gjpql1hEFv+7lo1d3Co3pnCjfHI2PCJztc2Kvsg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.3.1.tgz", + "integrity": "sha512-5UEP93b8C/JQs9Rnuldsu8jMz0XO4wNXG0lL/GdChYBEheKCyXJXzan7qzEbIuvUwG3I+qlUkGsiyNokIgXejg==", "requires": { - "@vue/cli-shared-utils": "^4.3.0", + "@vue/cli-shared-utils": "^4.3.1", "eslint-loader": "^2.2.1", "globby": "^9.2.0", "inquirer": "^7.1.0", @@ -5016,26 +5012,6 @@ "yorkie": "^2.0.0" }, "dependencies": { - "@vue/cli-shared-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.3.0.tgz", - "integrity": "sha512-iGWoYvPZvsJqIeXfaJcf5LgsaiqyYSnXEHkW+52ELfniw6NZAr1mdn4vPzppAElhFd87TY3rq0DFXP8UBr+/6w==", - "requires": { - "@hapi/joi": "^15.0.1", - "chalk": "^2.4.2", - "execa": "^1.0.0", - "launch-editor": "^2.2.1", - "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", - "open": "^6.3.0", - "ora": "^3.4.0", - "read-pkg": "^5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "semver": "^6.1.0", - "strip-ansi": "^6.0.0" - } - }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -5050,6 +5026,15 @@ "color-convert": "^2.0.1" } }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5099,17 +5084,6 @@ "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } } }, "is-fullwidth-code-point": { @@ -5130,33 +5104,6 @@ "mimic-fn": "^2.1.0" } }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -5174,11 +5121,6 @@ "is-promise": "^2.1.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -5204,207 +5146,46 @@ "requires": { "has-flag": "^4.0.0" } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } } } }, "@vue/cli-plugin-router": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.3.0.tgz", - "integrity": "sha512-HBoJFWWcCkG7r0EvWMS6PcYBZ26SgcK2jjQh37WzeA2hNHlqfMfYMPSjz0sdqxIDUAga0P2Rbo/VpNQ38FJUWg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.3.1.tgz", + "integrity": "sha512-m0ntr5R6q62oNMODgoyHAVAd/sDtsH15GdBrScZsPNeyHxmzmNBDlsNM38yYGGY064zDRRWif15d1yaTREybrA==", "requires": { - "@vue/cli-shared-utils": "^4.3.0" - }, - "dependencies": { - "@vue/cli-shared-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.3.0.tgz", - "integrity": "sha512-iGWoYvPZvsJqIeXfaJcf5LgsaiqyYSnXEHkW+52ELfniw6NZAr1mdn4vPzppAElhFd87TY3rq0DFXP8UBr+/6w==", - "requires": { - "@hapi/joi": "^15.0.1", - "chalk": "^2.4.2", - "execa": "^1.0.0", - "launch-editor": "^2.2.1", - "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", - "open": "^6.3.0", - "ora": "^3.4.0", - "read-pkg": "^5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "semver": "^6.1.0", - "strip-ansi": "^6.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } + "@vue/cli-shared-utils": "^4.3.1" } }, "@vue/cli-plugin-unit-mocha": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-mocha/-/cli-plugin-unit-mocha-4.3.0.tgz", - "integrity": "sha512-OlPzpkqH/RPL2BGYq81tgaUgK0P9Rxgfnv4IWeKTpVV3x9tvKGqpwRcXt8WY0KequFruQrnvVKnEtgPR5GKWcQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-mocha/-/cli-plugin-unit-mocha-4.3.1.tgz", + "integrity": "sha512-h6MIgnS+H4N3ETeOUbrJ+3p8Ar9f4dZOB/gywe/PvLS/vhCRmyzoIJnTaehSm5cFUCVs7xFt4LLAdaKSbcjW7g==", "requires": { - "@vue/cli-shared-utils": "^4.3.0", + "@vue/cli-shared-utils": "^4.3.1", "jsdom": "^15.2.1", "jsdom-global": "^3.0.2", "mocha": "^6.2.2", "mochapack": "^1.1.13" - }, - "dependencies": { - "@vue/cli-shared-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.3.0.tgz", - "integrity": "sha512-iGWoYvPZvsJqIeXfaJcf5LgsaiqyYSnXEHkW+52ELfniw6NZAr1mdn4vPzppAElhFd87TY3rq0DFXP8UBr+/6w==", - "requires": { - "@hapi/joi": "^15.0.1", - "chalk": "^2.4.2", - "execa": "^1.0.0", - "launch-editor": "^2.2.1", - "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", - "open": "^6.3.0", - "ora": "^3.4.0", - "read-pkg": "^5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "semver": "^6.1.0", - "strip-ansi": "^6.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } } }, "@vue/cli-plugin-vuex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.3.0.tgz", - "integrity": "sha512-d1yHZHhNyWogyQpsXmBHDiLSyhBccFhqlC/IoTwsbu7X8TBawWrllm1N6wAgdmllQBHIJXlm/6Nk91XjECub7w==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.3.1.tgz", + "integrity": "sha512-mukwOlhZGBJhkqO2b3wHFFHjK5aP00b1WUHdrOfLR7M18euhaTyb4kA5nwZwEOmU3EzZx6kHzSFCRy/XaMkLug==" }, "@vue/cli-service": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.3.0.tgz", - "integrity": "sha512-dNy5FGIareDMTjwoYsZ5Zs74A5FIsAJgyjXVZkd4DwPsnDay27dRObMUi8/hY8AI7ssZ2Jg/HhUhoiyE6dIbKw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.3.1.tgz", + "integrity": "sha512-CsNGfHe+9oKZdRwJmweQ0KsMYM27ssg1eNQqRKL/t+IgDLO3Tu86uaOOCLn4ZAaU5oxxpq4aSFvz+A0YxQRSWw==", "requires": { "@intervolga/optimize-cssnano-plugin": "^1.0.5", "@soda/friendly-errors-webpack-plugin": "^1.7.1", "@soda/get-current-script": "^1.0.0", - "@vue/cli-overlay": "^4.3.0", - "@vue/cli-plugin-router": "^4.3.0", - "@vue/cli-plugin-vuex": "^4.3.0", - "@vue/cli-shared-utils": "^4.3.0", + "@vue/cli-overlay": "^4.3.1", + "@vue/cli-plugin-router": "^4.3.1", + "@vue/cli-plugin-vuex": "^4.3.1", + "@vue/cli-shared-utils": "^4.3.1", "@vue/component-compiler-utils": "^3.0.2", "@vue/preload-webpack-plugin": "^1.1.0", "@vue/web-component-wrapper": "^1.2.0", @@ -5452,34 +5233,6 @@ "webpack-merge": "^4.2.2" }, "dependencies": { - "@vue/cli-plugin-router": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.3.0.tgz", - "integrity": "sha512-HBoJFWWcCkG7r0EvWMS6PcYBZ26SgcK2jjQh37WzeA2hNHlqfMfYMPSjz0sdqxIDUAga0P2Rbo/VpNQ38FJUWg==", - "requires": { - "@vue/cli-shared-utils": "^4.3.0" - } - }, - "@vue/cli-shared-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.3.0.tgz", - "integrity": "sha512-iGWoYvPZvsJqIeXfaJcf5LgsaiqyYSnXEHkW+52ELfniw6NZAr1mdn4vPzppAElhFd87TY3rq0DFXP8UBr+/6w==", - "requires": { - "@hapi/joi": "^15.0.1", - "chalk": "^2.4.2", - "execa": "^1.0.0", - "launch-editor": "^2.2.1", - "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", - "open": "^6.3.0", - "ora": "^3.4.0", - "read-pkg": "^5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "semver": "^6.1.0", - "strip-ansi": "^6.0.0" - } - }, "acorn": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", @@ -5516,12 +5269,12 @@ } }, "autoprefixer": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz", - "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==", + "version": "9.7.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.6.tgz", + "integrity": "sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==", "requires": { - "browserslist": "^4.11.0", - "caniuse-lite": "^1.0.30001036", + "browserslist": "^4.11.1", + "caniuse-lite": "^1.0.30001039", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", @@ -5566,9 +5319,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001039", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz", - "integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==" + "version": "1.0.30001041", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001041.tgz", + "integrity": "sha512-fqDtRCApddNrQuBxBS7kEiSGdBsgO4wiVw4G/IClfqzfhW45MbTumfN4cuUJGTM0YGFNn97DCXPJ683PS6zwvA==" }, "cliui": { "version": "6.0.0", @@ -5594,9 +5347,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "electron-to-chromium": { - "version": "1.3.397", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.397.tgz", - "integrity": "sha512-zcUd1p/7yzTSdWkCTrqGvbnEOASy96d0RJL/lc5BDJoO23Z3G/VHd0yIPbguDU9n8QNUTCigLO7oEdtOb7fp2A==" + "version": "1.3.403", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.403.tgz", + "integrity": "sha512-JaoxV4RzdBAZOnsF4dAlZ2ijJW72MbqO5lNfOBHUWiBQl3Rwe+mk2RCUMrRI3rSClLJ8HSNQNqcry12H+0ZjFw==" }, "emoji-regex": { "version": "8.0.0", @@ -5715,33 +5468,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==" }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, "schema-utils": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", @@ -5812,15 +5538,6 @@ "webpack-sources": "^1.4.3" } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -5833,10 +5550,86 @@ } } }, + "@vue/cli-shared-utils": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.3.1.tgz", + "integrity": "sha512-lcfRalou7Z9jZgIh9PeTIpwDK7RIjr9OxfLGwbdR8czUZYUeUa67zVEMJD0OPYh/CCoREtzNbVfLPb/IYYxWEA==", + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, "@vue/component-compiler-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.1.1.tgz", - "integrity": "sha512-+lN3nsfJJDGMNz7fCpcoYIORrXo0K3OTsdr8jCM7FuqdI4+70TY6gxY6viJ2Xi1clqyPg7LpeOWwjF31vSMmUw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.1.2.tgz", + "integrity": "sha512-QLq9z8m79mCinpaEeSURhnNCN6djxpHw0lpP/bodMlt5kALfONpryMthvnrQOlTcIKoF+VoPi+lPHUYeDFPXug==", "requires": { "consolidate": "^0.15.1", "hash-sum": "^1.0.2", @@ -6179,9 +5972,9 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, "amplitude-js": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-5.10.0.tgz", - "integrity": "sha512-B6CAgzdOAwkVQou/zWXpauaA89EW0nJt4G9J/1e7wdZx2Hn8SXcfM2WESHJpnTCae6fWW3wRsZxKF1LxZRThPQ==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-5.11.0.tgz", + "integrity": "sha512-rH5CqWvnKK9E6uVI7h1t/ikkQK4vhiS7iy2fncE4K56MY0ty/XVF9cNFBq2NAujMo1VXvu8oG80MdIETPG1zsA==", "requires": { "@amplitude/ua-parser-js": "0.7.20", "blueimp-md5": "^2.10.0", @@ -7290,27 +7083,6 @@ "lodash": "^4.17.11" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "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==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -7416,9 +7188,9 @@ "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==" }, "blueimp-md5": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.12.0.tgz", - "integrity": "sha512-zo+HIdIhzojv6F1siQPqPFROyVy7C50KzHv/k/Iz+BtvtVzSHXiMXOpq2wCfNkeBqdCv+V8XOV96tsEt2W/3rQ==" + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.13.0.tgz", + "integrity": "sha512-lmp0m647R5e77ORduxLW5mISIDcvgJZa52vMBv5uVI3UmSWTQjkJsZVBfaFqQPw/QFogJwvY6e3Gl9nP+Loe+Q==" }, "bn.js": { "version": "4.11.8", @@ -7493,9 +7265,9 @@ "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" }, "bootstrap-vue": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.10.1.tgz", - "integrity": "sha512-rEQHjrYJePArWtOYAhyD1WranoZ87+AJd+KKOusqK40rUcQutopV2DKQJIf6g3bw4IZ4SQ3buWRnHP0QUo1NtQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.11.0.tgz", + "integrity": "sha512-T23+aVVSDifX1SsI5y69bYZzbm8iQHlmgiBUw9XxY1KTw/fb4xvUq4+Y01Tsaul04+zmrUah/5zvUGKLwTcH7A==", "requires": { "@nuxt/opencollective": "^0.3.0", "bootstrap": ">=4.4.1 <5.0.0", @@ -8735,9 +8507,9 @@ } }, "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" }, "core-js-compat": { "version": "3.6.4", @@ -11741,6 +11513,11 @@ "assert-plus": "^1.0.0" } }, + "gitbook-plugin-github": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gitbook-plugin-github/-/gitbook-plugin-github-2.0.0.tgz", + "integrity": "sha1-UWbnY8/MQC1DKIC3pshcHFS1ao0=" + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -13291,9 +13068,9 @@ } }, "jquery": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", - "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", + "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==" }, "js-message": { "version": "1.0.5", @@ -14252,13 +14029,14 @@ } }, "mochapack": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/mochapack/-/mochapack-1.1.13.tgz", - "integrity": "sha512-SQQn/0hsX5E3+tFxjmAm9ruEqLRYpnINssmul69PxnRdqxnNjs4UQvOQz1zTsoE7RfJl6FAprVjvMznZFIzytQ==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/mochapack/-/mochapack-1.1.14.tgz", + "integrity": "sha512-JlX7OCiMv+J9XzlTCVGDte7Uls/C7uEtozlk+ZYRAXqwtmEam+bcWZurqjFJP0J+BHz6zZ3uXu5STdR6iGxVzg==", "requires": { - "babel-runtime": "^6.26.0", + "@babel/runtime-corejs2": "^7.0.0", "chalk": "^2.4.2", "chokidar": "^2.0.0", + "gitbook-plugin-github": "^2.0.0", "glob-parent": "5.1.0", "globby": "^10.0.1", "interpret": "^1.2.0", @@ -16025,7 +15803,8 @@ "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "optional": true }, "pretty-error": { "version": "2.1.1", @@ -17198,9 +16977,9 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -17209,7 +16988,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -17219,9 +16998,20 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "request-promise-core": { diff --git a/website/client/package.json b/website/client/package.json index ce0860786a..c28e2dfd01 100644 --- a/website/client/package.json +++ b/website/client/package.json @@ -13,25 +13,25 @@ "test:unit": "vue-cli-service test:unit --require ./tests/unit/helpers.js" }, "dependencies": { - "@vue/cli-plugin-babel": "^4.3.0", - "@vue/cli-plugin-eslint": "^4.3.0", - "@vue/cli-plugin-router": "^4.3.0", - "@vue/cli-plugin-unit-mocha": "^4.3.0", - "@vue/cli-service": "^4.3.0", + "@vue/cli-plugin-babel": "^4.3.1", + "@vue/cli-plugin-eslint": "^4.3.1", + "@vue/cli-plugin-router": "^4.3.1", + "@vue/cli-plugin-unit-mocha": "^4.3.1", + "@vue/cli-service": "^4.3.1", "@storybook/addon-actions": "^5.3.18", "@storybook/addon-knobs": "^5.3.18", "@storybook/addon-links": "^5.3.18", "@storybook/addon-notes": "^5.3.18", "@storybook/vue": "^5.3.18", "@vue/test-utils": "1.0.0-beta.29", - "amplitude-js": "^5.10.0", + "amplitude-js": "^5.11.0", "axios": "^0.19.2", "axios-progress-bar": "^1.2.0", "babel-eslint": "^10.1.0", "bootstrap": "^4.4.1", - "bootstrap-vue": "^2.10.1", + "bootstrap-vue": "^2.11.0", "chai": "^4.1.2", - "core-js": "^3.6.4", + "core-js": "^3.6.5", "eslint": "^6.8.0", "eslint-config-habitrpg": "^6.2.0", "eslint-plugin-mocha": "^5.3.0", @@ -40,7 +40,7 @@ "hellojs": "^1.18.4", "inspectpack": "^4.4.0", "intro.js": "^2.9.3", - "jquery": "^3.4.1", + "jquery": "^3.5.0", "lodash": "^4.17.15", "moment": "^2.24.0", "nconf": "^0.10.0", diff --git a/website/client/src/app.vue b/website/client/src/app.vue index ff1a6ec44b..0f9fb26081 100644 --- a/website/client/src/app.vue +++ b/website/client/src/app.vue @@ -20,10 +20,6 @@ -
-

{{ $t('tipTitle', {tipNumber: currentTipNumber}) }}

-

{{ currentTip }}

-
-

{{ $t('congratulations') }}

+

+ {{ $t('onboardingComplete') }} +

+

+ {{ $t('onboardingCompleteDescSmall') }} +

diff --git a/website/client/src/components/userMenu/profile.vue b/website/client/src/components/userMenu/profile.vue index af8e740609..52fd90b66e 100644 --- a/website/client/src/components/userMenu/profile.vue +++ b/website/client/src/components/userMenu/profile.vue @@ -349,16 +349,16 @@
-
- {{ achievementsCategories[key].open ? - $t('hideAchievements', {category: $t(key+'Achievs')}) : - $t('showAllAchievements', {category: $t(key+'Achievs')}) - }} -
+
+ {{ achievementsCategories[key].open ? + $t('hideAchievements', {category: $t(key+'Achievs')}) : + $t('showAllAchievements', {category: $t(key+'Achievs')}) + }} +

diff --git a/website/common/locales/de/gear.json b/website/common/locales/de/gear.json index d7d1c71906..1e633d9613 100644 --- a/website/common/locales/de/gear.json +++ b/website/common/locales/de/gear.json @@ -2072,5 +2072,17 @@ "weaponSpecialSpring2020WarriorNotes": "Kämpfen oder Fliehen, dieser Flügel wird Dir einen guten Dienst erweisen! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2020 Frühlingsausrüstung.", "weaponSpecialSpring2020WarriorText": "Geschliffener Flügel", "weaponSpecialSpring2020RogueNotes": "Du wirst so schnell zuschlagen, dass sie NOCH blauer aussehen wird! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2020 Frühlingsausrüstung.", - "weaponSpecialSpring2020RogueText": "Lapislazuli Klinge" + "weaponSpecialSpring2020RogueText": "Lapislazuli Klinge", + "armorArmoireBoxArmorNotes": "Schachtelrüstung: Es passt, also sitzt Du… äh, also ziehst Du damit in die Schlacht, als stolzer Ritter, der Du bist! Erhöht Wahrnehmung und Ausdauer um je <%= attrs %>. Verzauberter Schrank: Papierritter-Set (Gegenstand 3 von 3). ", + "armorArmoireBoxArmorText": "Schachtelrüstung", + "armorSpecialSpring2020HealerNotes": "Wickle Dich in weiche Blätter und Blüten der Iris um Feinde zu verleiten, Deine heilenden Kräfte zu unterschätzen. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2020 Frühlingsausrüstung.", + "armorSpecialSpring2020MageNotes": "Wenn auch Du einer Regenwasserpfütze nicht widerstehen kannst, ist diese Rüstung wie gemacht für Dich! Verwandle einen kindischen Impuls in eine Vorführung eines mystischen Kunstwerks. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2020 Frühlingsausrüstung.", + "weaponArmoirePaperCutterNotes": "Das mag nicht furchteinflössend aussehen, aber hast Du schon mal einen Papierschnitt gehabt? Erhöht Stärke um <%= str %>. Verzauberter Schrank: Papierritter-Set (Gegenstand 1 von 3).", + "weaponArmoirePaperCutterText": "Papiermesser", + "shieldArmoireHobbyHorseText": "Steckenpferd", + "headSpecialSpring2020HealerNotes": "Fessle Deine Feinde mit diesem Kopfschmuck aus Blumen! Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2020 Frühlingsausrüstung.", + "headSpecialSpring2020MageNotes": "Ist der Himmel klar? Die Luftfeuchtigkeit niedrig? Keine Sorge, wir haben uns drum gekümmert. Versprühe Deine Magie, ohne Deine Stimmung zu trüben! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2020 Frühlingsausrüstung.", + "headSpecialSpring2020MageText": "Tropfkantenhut", + "headSpecialSpring2020WarriorNotes": "Die Schläge Deiner Gegener werden von diesem durch Käfer inspirierten Helm abprallen! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2020 Frühlingsausrüstung.", + "headSpecialSpring2020RogueNotes": "So knallig und kostbar, dass Du in Versuchung kommen wirst, ihn von Deinem eigenen Kopf zu stehlen. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2020 Frühlingsausrüstung." } diff --git a/website/common/locales/de/questscontent.json b/website/common/locales/de/questscontent.json index 883c946f60..03d761f992 100644 --- a/website/common/locales/de/questscontent.json +++ b/website/common/locales/de/questscontent.json @@ -686,7 +686,10 @@ "questRubyNotes": "Die normalerweise geschäftigen Gipfel der Stoïkalm-Vulkane liegen still im Schnee. \"Ich nehme an, die Wanderer und Seher halten Winterschlaf?\" @gully sagt zu dir und @Aspiring_Advocate. \"Das erleichtert uns die Suche.\"

Wenn Sie den Gipfel erreichen, verschmilzt der kühle Wind mit dem Dampf, der aus dem Krater aufsteigt. \"Dort!\" @Aspiring_Advocate ruft aus und zeigt auf eine heiße Quelle. \"Welchen besseren Ort gibt es, um kühle Runen des Wassermanns und leidenschaftliche Runen der Venus zu finden, als wo sich Eis und Feuer treffen?“

Sie drei beeilen sich in Richtung der heißen Quelle. \"Laut meiner Forschung\", sagt @Aspiring_Advocate, \"wird die Kombination der Runen mit herzförmigen Rubinen einen Schlupftrank erzeugen, der Freundschaft und Liebe fördern kann!\"

Aufgeregt von der Aussicht auf eine neue Entdeckung, Sie alle Lächeln. \"In Ordnung\", sagt @gully, \"fangen wir an zu suchen!\"", "questWaffleUnlockText": "Schaltet Konfekt-Schlüpfelixire zum Kauf im Marktplatz frei", "questWaffleDropDessertPotion": "Konfekt-Schlüpfelixir", - "questWaffleRageDescription": "Ahornsumpf: Diese Leiste füllt sich, wenn Ihr Eure Dailies nicht erledigt. Wenn sie voll ist, wird die Schreckliche Waffel den Schadensfortschritt Eurer Party zurücksetzen!", - "questWaffleRageTitle": "Ahornmorast", - "questWaffleBoss": "Schreckliche Waffel" + "questWaffleRageDescription": "Ahornsumpf: Diese Leiste füllt sich, wenn Ihr Eure Tagesaufgaben nicht erledigt. Wenn sie voll ist, wird die Fürchterliche Waffel den Schadensfortschritt Eurer Party zurücksetzen!", + "questWaffleRageTitle": "Ahornsumpf", + "questWaffleBoss": "Fürchterliche Waffel", + "questWaffleNotes": "\"April-Scherzkeks!\" entrüstet sich Lady Glaciate verunsichert. \"Du sagtest, Dein Wüsten-Scherz sei 'erledigt und komplett weggeräumt'!\"

\"Nun ja, das war er und ist er immer noch, meine Liebe\", antwortet der Scherzkeks verwirrt. \"Und ich bin der ehrlichste aller Scherzkekse. Ist etwas nicht in Ordnung?\"

\"Da ist ein gigantisches, zuckriges Monster, das sich Habit City nähert!\"

\"Hmm\", sinniert der Scherzkeks. \"Ich habe auf der Suche nach mystischen Reagenzien für meinen letzten Event einige Höhlen geplündert. Vielleicht habe ich da unerwünschte Aufmerksamkeit erweckt. Ist es die Saccharose-Schlange? Die Torten-Kröte? Ein Tiramisu Rex?\"

\"Nein! Es ist eine Art… fürchterliche Waffel!\"

\"Häh. Die ist mir neu! Vielleicht entsprang die all der Umgebungs-Schabernack-Energie.\" Er wendet sich an Dich und @beffymaroo mit einem schiefen Lächeln. \"Ich nehme nicht an, ihr wärt zu einer Heldentat bereit?\"", + "questWaffleText": "An die Waffe(l) gegen den Scherzkeks: Desaster-Frühstück!", + "questWaffleRageEffect": "`Fürchterliche Waffel setzt AHORNSUMPF ein!` Schmieriger saftiger Sirup lässt Deine Schläge und Sprüche stocken!" } diff --git a/website/common/locales/en/achievements.json b/website/common/locales/en/achievements.json index ee0ce864f7..699e9cb3b6 100644 --- a/website/common/locales/en/achievements.json +++ b/website/common/locales/en/achievements.json @@ -4,12 +4,15 @@ "onwards": "Onwards!", "levelup": "By accomplishing your real life goals, you leveled up and are now fully healed!", "reachedLevel": "You Reached Level <%= level %>", - "gettingStartedDesc": "Let’s create a task, complete it, then check out your rewards. You’ll earn 5 achievements and 100 gold once you’re done!", + "gettingStartedDesc": "Complete these onboarding tasks and you’ll earn 5 Achievements and 100 Gold once you’re done!", "onboardingProgress": "<%= percentage %>% progress", + "yourProgress": "Your Progress", "letsGetStarted": "Let's get started!", "viewAchievements": "View Achievements", "earnedAchievement": "You earned an achievement!", - "onboardingCompleteDesc": "You earned 5 achievements and 100 gold for completing the list.", + "onboardingComplete": "You completed your onboarding tasks!", + "onboardingCompleteDesc": "You earned 5 Achievements and 100 Gold for completing the list.", + "onboardingCompleteDescSmall": "If you want even more, check out Achievements and start collecting!", "showAllAchievements": "Show All <%= category %>", "hideAchievements": "Hide <%= category %>", "foundNewItems": "You found new items!", @@ -46,21 +49,21 @@ "achievementUndeadUndertaker": "Undead Undertaker", "achievementUndeadUndertakerText": "Has tamed all Zombie Mounts.", "achievementUndeadUndertakerModalText": "You tamed all the Zombie Mounts!", - "achievementCreatedTask": "Create a Task", + "achievementCreatedTask": "Create your first task", "achievementCreatedTaskText": "Created their first task.", "achievementCreatedTaskModalText": "Add a task for something you would like to accomplish this week", - "achievementCompletedTask": "Complete a Task", + "achievementCompletedTask": "Complete a task", "achievementCompletedTaskText": "Completed their first task.", "achievementCompletedTaskModalText": "Check off any of your tasks to earn rewards", "achievementHatchedPet": "Hatch a Pet", "achievementHatchedPetText": "Hatched their first pet.", - "achievementHatchedPetModalText": "Head over to your inventory and try combining a hatching potion and an egg", + "achievementHatchedPetModalText": "Head over to your inventory and try combining a hatching Potion and an Egg", "achievementFedPet": "Feed a Pet", "achievementFedPetText": "Fed their first pet.", - "achievementFedPetModalText": "There are many different types of food, but pets can be picky", - "achievementPurchasedEquipment": "Purchase Equipment", + "achievementFedPetModalText": "There are many different types of food, but Pets can be picky", + "achievementPurchasedEquipment": "Purchase a piece of Equipment", "achievementPurchasedEquipmentText": "Purchased their first piece of equipment.", - "achievementPurchasedEquipmentModalText": "Equipment is a way to customize your avatar and improve your stats", + "achievementPurchasedEquipmentModalText": "Equipment is a way to customize your avatar and improve your Stats", "achievementPrimedForPainting": "Primed for Painting", "achievementPrimedForPaintingText": "Has collected all White Pets.", "achievementPrimedForPaintingModalText": "You collected all the White Pets!", diff --git a/website/common/locales/en/loadingScreenTips.json b/website/common/locales/en/loadingScreenTips.json deleted file mode 100644 index 765ec2ca30..0000000000 --- a/website/common/locales/en/loadingScreenTips.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "tipTitle": "Tip #<%= tipNumber %>", - "tip1": "Check tasks on the go with the Habitica mobile apps.", - "tip2": "Click any equipment to see a preview, or equip it instantly by clicking the star in its upper-left corner!", - "tip3": "Use emoji to quickly differentiate between your tasks.", - "tip4": "Use the # sign before a task name to make it really big!", - "tip5": "It’s best to use skills that cause buffs in the morning so they last longer.", - "tip6": "Hover over a task and click the dots to access advanced task controls, such as the ability to push tasks to the top/bottom of your list.", - "tip7": "Some backgrounds connect perfectly if Party members use the same background. Ex: Mountain Lake, Pagodas, and Rolling Hills.", - "tip8": "Send a Message to someone by clicking their name in chat and then clicking the envelope icon at the top of their profile!", - "tip9": "Use the filters + search bar in the Inventories, Shops, Guilds, and Challenges to quickly find what you want.", - "tip10": "You can win gems by competing in Challenges. New ones are added every day!", - "tip11": "Having more than four Party members increases accountability!", - "tip12": "Add checklists to your To-Dos to multiply your rewards!", - "tip13": "Click “Tags” on your task page to make an unwieldy task list very manageable!", - "tip14": "You can add headers or inspirational quotes to your list as Habits with no (+/-).", - "tip15": "Complete all the Masterclasser Quest-lines to learn about Habitica’s secret lore.", - "tip16": "Click the link to the Data Display Tool in the footer for valuable insights on your progress.", - "tip17": "Use the mobile apps to set reminders for your tasks.", - "tip18": "Habits that are just positive or just negative gradually “fade” and return to yellow.", - "tip19": "Boost your Intelligence Stat to gain more experience when you complete a task.", - "tip20": "Boost your Perception Stat to get more drops and gold.", - "tip21": "Boost your Strength Stat to do more boss damage or get critical hits.", - "tip22": "Boost your Constitution Stat to lessen the damage from incomplete Dailies.", - "tip23": "Reach level 100 to unlock the Orb of Rebirth for free and start a new adventure!", - "tip24": "Have a question? Ask in the Habitica Help Guild!", - "tip25": "The four seasonal Grand Galas start near the solstices and equinoxes.", - "tip26": "You can look for a Party or find Party members in the Party Wanted Guild!", - "tip27": "Did a Daily yesterday, but forgot to check it off? Don't worry! With Record Yesterday's Activity, you'll have a chance to record what you did before starting your new day.", - "tip28": "Set a Custom Day Start under User Icon > Settings to control when your day restarts.", - "tip29": "Complete all your Dailies to get a Perfect Day Buff that increases your Stats!", - "tip30": "You can invite people to Guilds, not just Parties.", - "tip31": "Check out the pre-made lists in the Library of Tasks and Challenges Guild for example tasks.", - "tip32": "Lots of Habitica’s code, art, and writing is made by volunteer contributors! Head to the Aspiring Legends Guild to help.", - "tip33": "Check out The Bulletin Board Guild for news about Guilds, Challenges, and other player-created events - and announce your own there!", - "tip34": "Occasionally re-evaluate your tasks to make sure they’re up-to-date!", - "tip35": "Users who are part of a Group Plan gain the ability to assign tasks to other users in that Group for extra task management and accountability." -} diff --git a/website/common/locales/fr/content.json b/website/common/locales/fr/content.json index bf24309c68..1107ed565d 100644 --- a/website/common/locales/fr/content.json +++ b/website/common/locales/fr/content.json @@ -355,5 +355,6 @@ "hatchingPotionAmber": "d'ambre", "hatchingPotionAurora": "Aurore", "hatchingPotionRuby": "Rubis", - "hatchingPotionBirchBark": "Écorce de bouleau" + "hatchingPotionBirchBark": "Écorce de bouleau", + "hatchingPotionDessert": "Confiserie" } diff --git a/website/common/locales/fr/questscontent.json b/website/common/locales/fr/questscontent.json index fabd9bc554..4dadb9f4f9 100644 --- a/website/common/locales/fr/questscontent.json +++ b/website/common/locales/fr/questscontent.json @@ -683,5 +683,14 @@ "questRubyCollectAquariusRunes": "Runes zodiacales du verseau", "questRubyCompletion": "Les objets nécessaires étant bien emballés, vous vous précipitez tous les trois à Habitiville et vous retrouvez dans le laboratoire de @beffymaroo. \"Excellent travail !\" dit @beffymaroo. \"Vous avez réuni les ingrédients de la potion !\"

@beffymaroo combine soigneusement les runes et les rubis pour créer une potion rouge brillante et en verse une partie sur deux œufs d'animaux de compagnie. En observant les résultats, vous remarquez que les deux animaux de compagnie semblent complètement désintéressés l'un par rapport à l'autre !

\"Ça n'a pas marché ?\" demande @gully. Mais avant de pouvoir répondre, vous vous rendez soudain compte que ce n'est pas la potion qui crée l'amitié et l'amour, mais plutôt l'expérience de travailler ensemble vers un but commun. Vous sortez de la quête en ayant gagné de nouveaux amis... et de nouveaux animaux de compagnie tape-à-l'œil !", "questRubyNotes": "Les sommets des volcans du Stoïkalm, normalement très animés, sont silencieux dans la neige. \"Je suppose que les randonneurs et les observateurs sont en hibernation ?\" vous disent @gully et @Aspiring_Advocate. \"Cela facilite notre recherche.\"

En atteignant le sommet, le vent froid se confond avec la vapeur qui s'échappe du cratère. \"Là !\" s'exclame @Aspiring_Advocate, montrant une source chaude. \"Quel meilleur endroit pour trouver des runes fraîches du Verseau et des runes passionnées de Vénus que là où la glace et le feu se rencontrent ?\"

Vous vous précipitez vers la source chaude. \"Selon mes recherches,\" dit @Aspiring_Advocate, \"combiner les runes avec des rubis en forme de coeur permettra de créer une potion d'éclosion qui pourra favoriser l'amitié et l'amour !\"

Excités par la perspective d'une nouvelle découverte, vous souriez tous. \"Très bien\", dit @gully, \"commençons à chercher !\"", - "questRubyText": "Rapport rubis" + "questRubyText": "Rapport rubis", + "questWaffleUnlockText": "Déverrouille l'achat de potion d'éclosion de confiserie au marché", + "questWaffleDropDessertPotion": "Potion d'éclosion de confiserie", + "questWaffleRageEffect": "`L'affreuse gaufre utilise BOURBIER D'ERABLE !` Un sirop de sève collante ralentit vos coups et vos sorts !", + "questWaffleRageDescription": "Bourbier d'érable : Cette barre se remplit quand vous n'effectuez pas vos quotidiennes. Lorsqu'elle est pleine, l'affreuse gaufre annulera l'attaque de l'équipe !", + "questWaffleRageTitle": "Bourbier d'érable", + "questWaffleBoss": "Affreuse gaufre", + "questWaffleCompletion": "Battue et beurrée mais triomphante, vous savourez la douce victoire alors que l'Affreuse Gaufre s'effondre dans une mare gluante.

\"Wow, vous avez vraiment écrémé ce monstre\", dit Lady Glaciate, impressionnée.

\"C'était pas de la tarte !\" rayonne le Poison d'avril.

\"Un peu la honte, cependant\", dit @beffymaroo. \"Ça avait l'air assez bon à manger.\"

\"Le Poison prend un ensemble de flacons de potion quelque part dans sa cape, les remplit avec les restes sirupeux de la Gaufre, et les mélange dans une pincée de poussière pétillante. Le liquide tourbillonne de couleurs... de nouvelles potions d'éclosion ! Il les jette dans vos bras. \"Toute cette aventure m'a donné de l'appétit. Qui veut se joindre à moi pour le petit déjeuner ?\"", + "questWaffleNotes": "Le \"Poison d'avril\" prend d'assaut Lady Glaciate. \"Vous avez dit que votre farce sur le thème du dessert était 'terminée et complètement nettoyée' !\"

\"Mais, c'était et c'est encore le cas, ma chère\", répond le Poison, perplexe. \"Et je suis le plus honnête des Poisons. Qu'est-ce qui ne va pas ? \"

\"Il y a un monstre géant sucré qui approche de Habitiville !\"

\"Hmm,\" dit le Poison. \"J'ai fait un raid dans quelques tanières pour les réactifs mystiques de mon dernier événement. J'ai peut-être attiré une attention non désirée. Est-ce le Serpent Saccharine ? La Torte-oise ? Le Tiramisu Rex ?\"

\"Non ! C'est une sorte de... d'Affreuse Gaufre !\"

\"Huh. C'est une nouvelle ! Peut-être qu'elle est née de toute l'énergie ambiante des bêtises.\" Il se tourne vers vous et @beffymaroo avec un sourire en coin. \"Je suppose que vous ne seriez pas disponible pour des actes héroïques ?\"", + "questWaffleText": "Gaufrer le poisson : Petit déjeuner désastreux !" } diff --git a/website/common/locales/ja/generic.json b/website/common/locales/ja/generic.json index c689f5bb57..f19686b50c 100644 --- a/website/common/locales/ja/generic.json +++ b/website/common/locales/ja/generic.json @@ -77,7 +77,7 @@ "add": "追加", "undo": "元に戻す", "continue": "続ける", - "accept": "承諾", + "accept": "承認", "reject": "拒否", "neverMind": "結構です", "buyMoreGems": "ジェムを買う", diff --git a/website/common/locales/ja/groups.json b/website/common/locales/ja/groups.json index 692db7827c..515e31832d 100644 --- a/website/common/locales/ja/groups.json +++ b/website/common/locales/ja/groups.json @@ -428,7 +428,7 @@ "reverseChat": "チャットの表示順を逆にする", "invites": "招待", "details": "詳細", - "participantDesc": "一旦すべてのメンバーが承諾するか拒否するとクエストが開始されます。'承諾する'をクリックした人だけがクエストに参加して報酬を受け取ることができます。", + "participantDesc": "一旦すべてのメンバーが承認するか拒否するとクエストが開始されます。「承認する」をクリックした人だけがクエストに参加して報酬を受け取ることができます。", "groupGems": "グループのジェム", "groupGemsDesc": "ギルドのジェムはチャレンジを作るために使うことができます!将来的に、より多くのギルドのジェムを追加することができるようになります。", "groupTaskBoard": "タスクボード", diff --git a/website/common/locales/ja/messages.json b/website/common/locales/ja/messages.json index 9b53205706..3307541ef4 100644 --- a/website/common/locales/ja/messages.json +++ b/website/common/locales/ja/messages.json @@ -53,7 +53,7 @@ "messageGroupChatAdminClearFlagCount": "フラグ数をクリアーできるのは管理者だけです!", "messageCannotFlagSystemMessages": "システムメッセージを報告することはできません。このメッセージに関してコミュニティガイドラインの違反を報告する必要がある場合は、スクリーンショットと説明をコミュニティー管理者(<%= communityManagerEmail %>)にメールで送ってください。", "messageGroupChatSpam": "おおっと!たくさんのメッセージを投稿しすぎたようです!少しだけ待ってから再度お試しください。キャンプ場では200個のメッセージまでしか一度に表示されませんので,Habiticaでは熟慮と吟味がなされた返信を奨励しています。あなたが言いかけたことを楽しみにしています。:)", - "messageCannotLeaveWhileQuesting": "あなたはクエストを実行中のため、このパーティーへの招待を承諾することができません。もしこのパーティーに加わりたいのであれば、まずパーティー画面から実行中のクエストを中止してください。中止したクエストの巻物は手元に戻ります。", + "messageCannotLeaveWhileQuesting": "あなたはクエストを実行中のため、このパーティーへの招待を承認できません。もしこのパーティーに加わりたい場合は、まずパーティー画面から実行中のクエストを中止してください。中止したクエストの巻物は手元に戻ります。", "messageUserOperationProtected": "「<%= operation %>」パスは、保護されたパスなので保存できません。", "messageUserOperationNotFound": "<%= operation %> の操作は見つかりません", "messageNotificationNotFound": "通知はありません。", diff --git a/website/common/locales/ja/subscriber.json b/website/common/locales/ja/subscriber.json index a2275a1380..6bffce7e30 100644 --- a/website/common/locales/ja/subscriber.json +++ b/website/common/locales/ja/subscriber.json @@ -18,7 +18,7 @@ "supportDevsText": "あなたの寄付が Habitica の繁栄を維持し、新機能開発の資金になります。あなたのご厚情に感謝します!", "exclusiveJackalopePet": "限定ペット", "exclusiveJackalopePetText": "寄付会員だけが利用可能なペット、「高貴な紫のジャッカロープ」を手に入れましょう!", - "giftSubscription": "だれかに寄付会員特典をプレゼントしますか?", + "giftSubscription": "だれかに寄付会員特典をプレゼントしますか?", "giftSubscriptionText1": "贈りたい相手のプロフィールを開いてください。ヘッダーに表示されているパーティーのアバター、またはチャット画面の名前をクリックするとプロフィール画面が開きます。", "giftSubscriptionText2": "相手のプロフィールの右上にあるプレゼント箱のアイコンをクリックしてください。", "giftSubscriptionText3": "「寄付」を選択し、あなたが代金を納める支払い方法を入力してください。", @@ -41,8 +41,8 @@ "manageSub": "寄付の管理", "cancelSub": "寄付の中止", "cancelSubInfoGoogle": "寄付を中止する場合や、すでに中止した寄付の終了日を確認する際には、Google Play ストア アプリの「アカウント」 > \"Subscriptions\" セクションへ進んでください。この画面ではあなたの寄付が中止されたかどうかを示すことはできません。", - "cancelSubInfoApple": "寄付を中止する場合や、すでに中止した寄付の終了日を確認する際には、Appleの公式な手順に従ってください。この画面ではあなたの寄付が中止されたかどうかを示すことはできません。", - "cancelSubInfoGroupPlan": "グループプランによって寄付がされているので、キャンセルすることができません。あなたがグループの一員でなくなると終了します。もしあなたがグループリーダーで、グループプランそのものをキャンセルしたい場合、グループメニューの支払い詳細たぶから行うことができます。", + "cancelSubInfoApple": "寄付をキャンセルする場合や、すでにキャンセルした寄付の終了日を確認する際には、Appleの公式な手順に従ってください。この画面ではあなたの寄付がキャンセルされたかどうかを表示することはできません。", + "cancelSubInfoGroupPlan": "グループプランによって無料の寄付会員特典が付与されているので、キャンセルすることはできません。あなたがグループプランのメンバーではなくなったときに終了します。もしあなたがグループリーダーで、グループプランをキャンセルしたい場合は、グループプランの「グループの請求」タブからキャンセルできます。", "canceledSubscription": "中止した寄付", "cancelingSubscription": "寄付の中止処理をしています", "adminSub": "管理者の寄付", @@ -232,5 +232,6 @@ "mysterySet202001": "伝説のキツネセット", "backgroundAlreadyOwned": "この背景はすでにもっています。", "mysticHourglassNeededNoSub": "このアイテムには神秘の砂時計が必要です。Habiticaの寄付会員になることで神秘の砂時計を手に入れることができます。", - "viewSubscriptions": "寄付を見る" + "viewSubscriptions": "寄付を見る", + "giftASubscription": "寄付会員特典を贈る" } diff --git a/website/common/locales/nl/quests.json b/website/common/locales/nl/quests.json index ff6225004b..23958dc0fd 100644 --- a/website/common/locales/nl/quests.json +++ b/website/common/locales/nl/quests.json @@ -136,5 +136,8 @@ "questAlreadyStartedFriendly": "De queeste is al begonnen, maar je kunt altijd de volgende pakken!", "questAlreadyStarted": "De queeste is al begonnen.", "questInvitationNotificationInfo": "Je bent uitgenodigd om deel te nemen aan een queeste", - "hatchingPotionQuests": "Magische Uitbroed Toverdrank Queeste" + "hatchingPotionQuests": "Magische Uitbroed Toverdrank Queeste", + "tavernBossTired": "<%= bossName%> probeert <%= rageName%> los te laten, maar is te moe.", + "chatQuestCancelled": "<%= gebruikersnaam %> heeft de gezelschapszoektocht geannuleerd <%= questName %>.", + "chatQuestAborted": "<%= gebruikersnaam %> heeft de gezelschapszoektocht afgebroken <%= questName %>." } diff --git a/website/common/locales/nl/questscontent.json b/website/common/locales/nl/questscontent.json index 735fe83d9e..c4cf44c219 100644 --- a/website/common/locales/nl/questscontent.json +++ b/website/common/locales/nl/questscontent.json @@ -231,7 +231,7 @@ "questGroupDilatoryDistress": "Dilatory Distress", "questDilatoryDistress1Text": "De Droefheid van Dralen, deel 1: Flessenpost", "questDilatoryDistress1Notes": "Er is een bericht in een fles gearriveerd uit de net herbouwde stad Dralen! Er staat: \"Beste Habiticanen, we hebben wederom jullie hulp nodig. Onze prinses is verdwenen en de stad wordt bestookt door onbekende waterige demonen! De bidsprinkhaankreeften proberen de aanvallers tegen te houden. Help ons alsjeblieft!\" Om de lange reis naar de verzonken stad te maken moet je onder water kunnen ademen. Gelukkig kunnen de alchemisten @Benga en @hazel dat voor elkaar maken! Nu alleen de juiste ingrediënten nog.", - "questDilatoryDistress1Completion": "Je trekt het gevinde harnas aan en zwemt zo snel mogelijk naar Dralen. Het is het zeemeervolk en hun bidsprinkhaankreeften gelukt om de monsters uit de stad te houden, maar ze zijn aan het verliezen. Het moment dat je bij de kasteelmuren bent valt het gruwelijke belegerende leger aan!", + "questDilatoryDistress1Completion": "Je trekt het gevinde harnas aan en zwemt zo snel mogelijk naar Dralen. Het is het zeemeervolk en hun bidsprinkhaankreeften gelukt om de monsters uit de stad te houden, maar ze zijn aan het verliezen. Het moment dat je bij de kasteelmuren bent valt het gruwelijke leger aan!", "questDilatoryDistress1CollectFireCoral": "Brandkoraal", "questDilatoryDistress1CollectBlueFins": "Blauwe vinnen", "questDilatoryDistress1DropArmor": "Gevind oceanisch harnas (harnas)", @@ -559,7 +559,7 @@ "questYarnDropYarnEgg": "Wol (Ei)", "questYarnUnlockText": "Ontgrendelt het kopen van Gareneieren op de Markt", "winterQuestsText": "Winter Quest Bundle", - "winterQuestsNotes": "Contains 'Trapper Santa', 'Find the Cub', and 'The Fowl Frost'. Available until December 31.", + "winterQuestsNotes": "Bevat 'Trapper Santa', 'Find the Cub' en 'The Fowl Frost'. Beschikbaar tot 31 januari. Let op dat Trapper Santa en Find the Cub stapelbare prestatie hebben, maar een zeldzaam huisdier en een rijdier geven dat maar één keer aan je stal kan worden toegevoegd.", "questPterodactylText": "The Pterror-dactyl", "questPterodactylNotes": "You're taking a stroll along the peaceful Stoïkalm Cliffs when an evil screech rends the air. You turn to find a hideous creature flying towards you and are overcome by a powerful terror. As you turn to flee, @Lilith of Alfheim grabs you. \"Don't panic! It's just a Pterror-dactyl.\"

@Procyon P nods. \"They nest nearby, but they're attracted to the scent of negative Habits and undone Dailies.\"

\"Don't worry,\" @Katy133 says. \"We just need to be extra productive to defeat it!\" You are filled with a renewed sense of purpose and turn to face your foe.", "questPterodactylCompletion": "With one last screech the Pterror-dactyl plummets over the side of the cliff. You run forward to watch it soar away over the distant steppes. \"Phew, I'm glad that's over,\" you say. \"Me too,\" replies @GeraldThePixel. \"But look! It's left some eggs behind for us.\" @Edge passes you three eggs, and you vow to raise them in tranquility, surrounded by positive Habits and blue Dailies.", @@ -568,7 +568,7 @@ "questPterodactylUnlockText": "Ontgrendelt het kopen van Pterodactyluseieren op de Markt", "questBadgerText": "Stop Badgering Me!", "questBadgerNotes": "Ah, winter in the Taskwoods. The softly falling snow, the branches sparkling with frost, the Flourishing Fairies… still not snoozing?

“Why are they still awake?” cries @LilithofAlfheim. “If they don't hibernate soon, they'll never have the energy for planting season.”

As you and @Willow the Witty hurry to investigate, a furry head pops up from the ground. Before you can yell, “It’s the Badgering Bother!” it’s back in its burrow—but not before snatching up the Fairies' “Hibernate” To-Dos and dropping a giant list of pesky tasks in their place!

“No wonder the fairies aren't resting, if they're constantly being badgered like that!” @plumilla says. Can you chase off this beast and save the Taskwood’s harvest this year?", - "questBadgerCompletion": "You finally drive away the the Badgering Bother and hurry into its burrow. At the end of a tunnel, you find its hoard of the faeries’ “Hibernate” To-Dos. The den is otherwise abandoned, except for three eggs that look ready to hatch.", + "questBadgerCompletion": "Je jaagt eindelijk de Badgering Bother weg en haast je zijn hol in. Aan het einde van een tunnel vind je de schat van de elven aan, slapende to-do punten. Het hol is verder verlaten, behalve drie eieren die klaar lijken om uit te komen.", "questBadgerBoss": "The Badgering Bother", "questBadgerDropBadgerEgg": "Das (Ei)", "questBadgerUnlockText": "Ontgrendelt het kopen van Bevereieren op de Markt", @@ -657,5 +657,13 @@ "questBronzeText": "Strijd van de Bronzen Kever", "mythicalMarvelsNotes": "Bevat 'De Eenhoornkoningin Overtuigen', 'De Vurige Griffioen' en 'Gevaar in de Diepten: Zeeslangen Slag'! Beschikbaar tot 28 Februari.", "mythicalMarvelsText": "Mytische Wonderen Queeste Bundel", - "evilSantaAddlNotes": "Wees er bewust van dat Trapper Santa en Find the Cub stapelbare questprestaties hebben, maar een zeldzaam huisdier en een mount geven die maar één keer aan je stal kan worden toegevoegd." + "evilSantaAddlNotes": "Wees er bewust van dat Trapper Santa en Find the Cub stapelbare questprestaties hebben, maar een zeldzaam huisdier en een mount geven die maar één keer aan je stal kan worden toegevoegd.", + "questRobotDropRobotEgg": "Robot (Ei)", + "questRobotCollectSprings": "Veerringen", + "questRobotCollectGears": "Tandwielen", + "questRobotCollectBolts": "Bouten", + "delightfulDinosText": "Verrukkelijke Dino's Queeste Bundel", + "rockingReptilesNotes": "Bevat 'The Insta-Gator', 'The Serpent of Distraction' en 'The Veloci-Rapper'. Beschikbaar tot 30 september.", + "rockingReptilesText": "Feestende Reptielen Queeste Bundel", + "questRobotUnlockText": "Ontgrendelt koopbare robot-eieren op de markt" } diff --git a/website/common/locales/pt_BR/groups.json b/website/common/locales/pt_BR/groups.json index 6cf1a31a73..9cfad47797 100644 --- a/website/common/locales/pt_BR/groups.json +++ b/website/common/locales/pt_BR/groups.json @@ -5,7 +5,7 @@ "innCheckIn": "Descansar na Pousada", "innText": "Você está descansando na Pousada! Durante o check-in, suas Diárias não lhe causarão dano no final do dia, mas elas ainda irão atualizar todos os dias. Fique avisado: se você estiver participando de uma Missão de Chefão, o chefe ainda irá causar dano pelas Diárias perdidas dos membros do seu Grupo, a menos que eles também estejam na Pousada! Além disso, seu próprio dano ao Chefão (ou itens coletados) não será aplicado até que você saia da Pousada.", "innTextBroken": "Você está descansando na Pousada, eu acho ... Enquanto estiver na Pousada, suas Diárias não vão te machucar no final do dia, mas elas ainda irão atualizar todos os dias ... Se você estiver participando de uma Missão de Chefão, o Chefão ainda irá causar dano pelas Diárias perdidas dos membros do seu Grupo, a menos que eles também estejam na Pousada... Além disso, seu próprio dano ao Chefão (ou itens coletados) não será aplicado até você sair da Pousada... estou tão cansado...", - "innCheckOutBanner": "Você está atualmente na Pousada. Suas Diárias não realizadas não te causarão dano e também não poderá ser feito progresso em Missões enquanto estiver na Pousada.", + "innCheckOutBanner": "Atualmente, você está na Pousada. Enquanto isso, suas Diárias não realizadas não te causarão dano e também não poderá progredir em Missões.", "innCheckOutBannerShort": "Você está descansando na Pousada.", "resumeDamage": "Reativar dano", "helpfulLinks": "Links úteis", diff --git a/website/common/locales/pt_BR/questscontent.json b/website/common/locales/pt_BR/questscontent.json index f49e236289..dd90592b63 100644 --- a/website/common/locales/pt_BR/questscontent.json +++ b/website/common/locales/pt_BR/questscontent.json @@ -684,5 +684,13 @@ "questRubyCompletion": "Com os itens necessários embalados com segurança, os três correm de volta para a Cidade dos Hábitos e se encontram no laboratório da @beffymaroo. \"Excelente trabalho!\", diz @beffymaroo. \"Vocês reuniram os ingredientes para a poção!\"

@beffymaroo combina cuidadosamente as runas e os rubis para criar uma brilhante poção vermelha e derrama parte dela em dois ovos de mascotes. Ao observar os resultados, vocês percebem que os dois mascotes parecem completamente desinteressados um pelo outro!

\"Não funcionou?\", pergunta @gully. Mas, antes que alguém pudesse responder, vocês percebem que não é a poção que cria amizade e amor, mas sim uma experiência de trabalhar juntos em direção a um objetivo comum. Por fim, você termina a missão tendo conquistado novos amigos... e alguns mascotes chamativos!", "questRubyNotes": "Os picos normalmente agitados dos vulcões de Stoïkalm permanecem silenciosos na neve. \"Eu posso supor que os caminhantes e observadores estão hibernando?\", diz @gully para você e @Aspiring_Advocate. \"Isso torna nossa busca mais fácil.\"

Ao chegar ao cume, o vento frio se funde com o vapor vindo da cratera. \"Ali!\", exclama @Aspiring_Advocate , apontando para uma fonte termal. \"Haveria lugar melhor para encontrar dervetidas runas de Aquário e apaixonadas runas de Vênus a não ser aqui, onde gelo e fogo se encontram?\"

Vocês três correm para a fonte termal. \"De acordo com minhas pesquisas\", diz @Aspiring_Advocate, \"combinar as runas com rubis em formato de irá criar uma poção para incubação que pode promover a amizade e o amor!\"

Animados com a perspectiva de uma nova descoberta, todos vocês sorriem. \"Certo.\", diz @gully, \"Então vamos começar a pesquisar!\"", "questRubyText": "Relacionamento de rubi", - "questWaffleText": "Tagarelando com o Tolo: café da manhã desastroso!" + "questWaffleText": "Tagarelando com o Tolo: café da manhã desastroso!", + "questWaffleUnlockText": "Desbloqueia Poções de Eclosão de Confecções para compra no Mercado", + "questWaffleDropDessertPotion": "Poção de Eclosão de Confecção", + "questWaffleRageEffect": "`Waffle Horrível usa XAROPE DE LAMA!` O Xarope viçosamente pegajoso retarda seus movimentos e feitiços!", + "questWaffleRageDescription": "Xarope de lama: essa barra é preenchida quando você não conclui suas Diárias. Quando cheia, o Waffle Horrível irá atrasar o progresso do ataque do grupo!", + "questWaffleRageTitle": "Xarope de lama", + "questWaffleBoss": "Waffle Horrível", + "questWaffleCompletion": "Maltratado e com manteiga, mas triunfante você saboreia a doce vitória enquanto o Waffle Horrível cai em uma poça de gosma pegajosa.

\"Uau, você realmente criou esse monstro\", diz a Dama Glaceada, impressionada.

\"Um pedaço de bolo!\", grita o Primeiro de Abril.

\"Que pena, no entanto\", diz @beffymaroo. \"Parecia bom o suficiente para comer.\"

O Tolo pega um conjunto de frascos de poções de algum lugar da capa dele, enche-os com os restos de xarope do Waffle e mistura uma pitada de pó brilhante. O líquido cintila em várias cores -- novas Poções de Eclosão! Ele os joga em seus braços. “Toda essa aventura me deu fome. Quem quer se juntar a mim no café da manhã?\"", + "questWaffleNotes": "\"Primeiro de Abril!\" causou uma enorme perturbação à Dama Glaceada. \"Você disse que sua brincadeira com tema de sobremesa estava 'acabada e completamente limpa'!\"

\"Porque realmente está, minha querida\", respondeu o Tolo, intrigado. \"E eu sou o mais honesto dos tolos. O que houve?\"

\"Há um monstro açucarado gigante se aproximando da Cidade dos Hábitos!\"

\"Hum\", reflete o Tolo. \"Eu fiz uma incursão a alguns covis pelos reagentes místicos para o meu último evento. Talvez eu tenha atraído alguma atenção indesejada. É a Serpente Sacarina? A Tortaruga? Tiramisù Rex?\"

\"Não! É algum tipo de... Waffle Horrível!\"

\"Oh. Essa e nova! Talvez isso tenha sido gerado a partir de toda a energia do ambiente das travessuras.\" Ele se vira para você e @beffymaroo com um sorriso torto. \"Suponho que você não esteja disponível para heroísmo?\"" } diff --git a/website/common/locales/ro/communityguidelines.json b/website/common/locales/ro/communityguidelines.json index c809f52254..4a4900d551 100644 --- a/website/common/locales/ro/communityguidelines.json +++ b/website/common/locales/ro/communityguidelines.json @@ -38,32 +38,32 @@ "commGuidePara035": "If the Guild in question has different kinds of sensitive issues, it is respectful to your fellow Habiticans to place your comment behind a warning (ex. \"Warning: references self-harm\"). These may be characterized as trigger warnings and/or content notes, and Guilds may have their own rules in addition to those given here. If possible, please use markdown to hide the potentially sensitive content below line breaks so that those who may wish to avoid reading it can scroll past it without seeing the content. Habitica staff and moderators may still remove this material at their discretion.", "commGuidePara036": "Additionally, the sensitive material should be topical -- bringing up self-harm in a Guild focused on fighting depression may make sense, but is probably less appropriate in a music Guild. If you see someone who is repeatedly violating this guideline, especially after several requests, please flag the posts and notify the moderators via the Moderator Contact Form.", "commGuidePara037": "No Guilds, Public or Private, should be created for the purpose of attacking any group or individual. Creating such a Guild is grounds for an instant ban. Fight bad habits, not your fellow adventurers!", - "commGuidePara038": "All Tavern Challenges and Public Guild Challenges must comply with these rules as well.", - "commGuideHeadingInfractionsEtc": "Infractions, Consequences, and Restoration", + "commGuidePara038": "Toate Provocările de la Tavernă și Provocările de Ghildă Publice trebuie să respecte, de asemenea, aceste reguli.", + "commGuideHeadingInfractionsEtc": "Infracțiuni, Consecințe și Restaurare", "commGuideHeadingInfractions": "Infracțiuni", "commGuidePara050": "Overwhelmingly, Habiticans assist each other, are respectful, and work to make the whole community fun and friendly. However, once in a blue moon, something that a Habitican does may violate one of the above guidelines. When this happens, the Mods will take whatever actions they deem necessary to keep Habitica safe and comfortable for everyone.", "commGuidePara051": "There are a variety of infractions, and they are dealt with depending on their severity. These are not comprehensive lists, and the Mods can make decisions on topics not covered here at their own discretion. The Mods will take context into account when evaluating infractions.", "commGuideHeadingSevereInfractions": "Infracțiuni severe", - "commGuidePara052": "Severe infractions greatly harm the safety of Habitica's community and users, and therefore have severe consequences as a result.", - "commGuidePara053": "The following are examples of some severe infractions. This is not a comprehensive list.", + "commGuidePara052": "Infracțiunile grave dăunează foarte mult siguranței comunității și utilizatorilor Habitica și, prin urmare, au consecințe severe.", + "commGuidePara053": "Următoarele sunt exemple ale unor infracțiuni severe. Aceasta nu este o listă cuprinzătoare.", "commGuideList05A": "Încălcarea Termenelor și Condițiilor", - "commGuideList05B": "Hate Speech/Images, Harassment/Stalking, Cyber-Bullying, Flaming, and Trolling", - "commGuideList05C": "Violation of Probation", - "commGuideList05D": "Impersonation of Staff or Moderators", + "commGuideList05B": "Discursul/Imaginile de Ură, Hărțuirea/Stalking-ul, Intimidarea Cibernetică, Provocarea și Trolling-ul", + "commGuideList05C": "Încălcarea Probațiunii", + "commGuideList05D": "Impersonarea Personalului sau a Moderatorilor", "commGuideList05E": "Infracțiuni moderate repetate", - "commGuideList05F": "Creation of a duplicate account to avoid consequences (for example, making a new account to chat after having chat privileges revoked)", - "commGuideList05G": "Intentional deception of Staff or Moderators in order to avoid consequences or to get another user in trouble", + "commGuideList05F": "Crearea unui cont duplicat pentru a evita consecințele (de exemplu, crearea unui cont nou pentru a vorbi după ce au fost revocate privilegiile de chat)", + "commGuideList05G": "Înșelăciune intenționată a Personalului sau a Moderatorilor pentru a evita consecințele sau pentru a face probleme unui alt utilizator", "commGuideHeadingModerateInfractions": "Infracțiuni moderate", "commGuidePara054": "Moderate infractions do not make our community unsafe, but they do make it unpleasant. These infractions will have moderate consequences. When in conjunction with multiple infractions, the consequences may grow more severe.", - "commGuidePara055": "The following are some examples of Moderate Infractions. This is not a comprehensive list.", + "commGuidePara055": "Următoarele sunt câteva exemple de Infracțiuni Moderate. Aceasta nu este o listă cuprinzătoare.", "commGuideList06A": "Ignoring, disrespecting or arguing with a Mod. This includes publicly complaining about moderators or other users, publicly glorifying or defending banned users, or debating whether or not a moderator action was appropriate. If you are concerned about one of the rules or the behaviour of the Mods, please contact the staff via email (admin@habitica.com).", "commGuideList06B": "Backseat Modding. To quickly clarify a relevant point: A friendly mention of the rules is fine. Backseat modding consists of telling, demanding, and/or strongly implying that someone must take an action that you describe to correct a mistake. You can alert someone to the fact that they have committed a transgression, but please do not demand an action -- for example, saying, \"Just so you know, profanity is discouraged in the Tavern, so you may want to delete that,\" would be better than saying, \"I'm going to have to ask you to delete that post.\"", - "commGuideList06C": "Intentionally flagging innocent posts.", - "commGuideList06D": "Repeatedly Violating Public Space Guidelines", - "commGuideList06E": "Repeatedly Committing Minor Infractions", + "commGuideList06C": "Semnalizarea intenționată a postărilor nevinovate.", + "commGuideList06D": "Încălcând în Mod Repetat Instrucțiunile Spațiul Public", + "commGuideList06E": "Săvârșirea Repetată a Infracțiunilor Minore", "commGuideHeadingMinorInfractions": "Infracțiuni Minore", - "commGuidePara056": "Minor Infractions, while discouraged, still have minor consequences. If they continue to occur, they can lead to more severe consequences over time.", - "commGuidePara057": "The following are some examples of Minor Infractions. This is not a comprehensive list.", + "commGuidePara056": "Infracțiunile Minore, deși sunt descurajate, au încă consecințe minore. Dacă continuă să apară, pot duce la consecințe mai severe în timp.", + "commGuidePara057": "Următoarele sunt câteva exemple de Infracțiuni Minore. Aceasta nu este o listă cuprinzătoare.", "commGuideList07A": "First-time violation of Public Space Guidelines", "commGuideList07B": "Any statements or actions that trigger a \"Please Don't\". When a Mod has to say \"Please don't do this\" to a user, it can count as a very minor infraction for that user. An example might be \"Please don't keep arguing in favor of this feature idea after we've told you several times that it isn't feasible.\" In many cases, the Please Don't will be the minor consequence as well, but if Mods have to say \"Please Don't\" to the same user enough times, the triggering Minor Infractions will start to count as Moderate Infractions.", "commGuidePara057A": "Some posts may be hidden because they contain sensitive information or might give people the wrong idea. Typically this does not count as an infraction, particularly not the first time it happens!", @@ -78,21 +78,21 @@ "commGuidePara060B": "If your account is banned (a severe consequence), you will not be able to log into Habitica and will receive an error message upon attempting to log in. If you wish to apologize or make a plea for reinstatement, please email the staff at admin@habitica.com with your UUID (which will be given in the error message). It is your responsibility to reach out if you desire reconsideration or reinstatement.", "commGuideHeadingSevereConsequences": "Examples of Severe Consequences", "commGuideList09A": "Account bans (see above)", - "commGuideList09C": "Permanently disabling (\"freezing\") progression through Contributor Tiers", - "commGuideHeadingModerateConsequences": "Examples of Moderate Consequences", - "commGuideList10A": "Restricted public and/or private chat privileges", + "commGuideList09C": "Dezactivarea permanentă („înghețarea”) progresiei prin Nivelurile de Contribuabili", + "commGuideHeadingModerateConsequences": "Exemple de Consecințe Moderate", + "commGuideList10A": "Privilegii restricționate de chat publice și/sau private", "commGuideList10A1": "If your actions result in revocation of your chat privileges, a Moderator or Staff member will PM you and/or post in the forum in which you were muted to notify you of the reason for your muting and the length of time for which you will be muted. At the end of that period, you will receive your chat privileges back, provided you are willing to correct the behavior for which you were muted and comply with the Community Guidelines.", - "commGuideList10C": "Restricted Guild/Challenge creation privileges", - "commGuideList10D": "Temporarily disabling (\"freezing\") progression through Contributor Tiers", - "commGuideList10E": "Demotion of Contributor Tiers", - "commGuideList10F": "Putting users on \"Probation\"", - "commGuideHeadingMinorConsequences": "Examples of Minor Consequences", - "commGuideList11A": "Reminders of Public Space Guidelines", + "commGuideList10C": "Privilegii restricționate de creare a Ghildelor/Provocărilor", + "commGuideList10D": "Dezactivarea temporară („înghețarea”) progresiei prin Niveluri de Contribuitori", + "commGuideList10E": "Revocarea Nivelurilor de Contribuitori", + "commGuideList10F": "Punerea utilizatorilor pe „Probațiune”", + "commGuideHeadingMinorConsequences": "Exemple de Consecințe Minore", + "commGuideList11A": "Memento-uri ale Instrucțiunilor Spațiului Public", "commGuideList11B": "Atenționări", "commGuideList11C": "Cereri", - "commGuideList11D": "Deletions (Mods/Staff may delete problematic content)", - "commGuideList11E": "Edits (Mods/Staff may edit problematic content)", - "commGuideHeadingRestoration": "Restoration", + "commGuideList11D": "Ștergeri (Moderatori/Personal pot șterge conținut problematic)", + "commGuideList11E": "Editările (Moderatori/Personalul pot șterge conținut problematic)", + "commGuideHeadingRestoration": "Restaurare", "commGuidePara061": "Habitica is a land devoted to self-improvement, and we believe in second chances. If you commit an infraction and receive a consequence, view it as a chance to evaluate your actions and strive to be a better member of the community.", "commGuidePara062": "The announcement, message, and/or email that you receive explaining the consequences of your actions is a good source of information. Cooperate with any restrictions which have been imposed, and endeavor to meet the requirements to have any penalties lifted.", "commGuidePara063": "If you do not understand your consequences, or the nature of your infraction, ask the Staff/Moderators for help so you can avoid committing infractions in the future. If you feel a particular decision was unfair, you can contact the staff to discuss it at admin@habitica.com.", @@ -110,13 +110,13 @@ "commGuidePara011b": "în GitHub/Wikia", "commGuidePara011c": "în Wikia", "commGuidePara011d": "pe GitHub", - "commGuidePara012": "If you have an issue or concern about a particular Mod, please send an email to our Staff (admin@habitica.com).", + "commGuidePara012": "Dacă aveți o problemă sau o îngrijorare cu privire la un anumit Mod, vă rugăm să trimiteți un email Personalului nostru (admin@habitica.com).", "commGuidePara013": "In a community as big as Habitica, users come and go, and sometimes a staff member or moderator needs to lay down their noble mantle and relax. The following are Staff and Moderators Emeritus. They no longer act with the power of a Staff member or Moderator, but we would still like to honor their work!", "commGuidePara014": "Emeritus Staff și Moderatori:", "commGuideHeadingFinal": "Secțiune Finală", "commGuidePara067": "So there you have it, brave Habitican -- the Community Guidelines! Wipe that sweat off of your brow and give yourself some XP for reading it all. If you have any questions or concerns about these Community Guidelines, please reach out to us via the Moderator Contact Form and we will be happy to help clarify things.", - "commGuidePara068": "Now go forth, brave adventurer, and slay some Dailies!", - "commGuideHeadingLinks": "Useful Links", + "commGuidePara068": "Acum mergeți mai departe, curajos aventurier și ucideți niște Cotidiene!", + "commGuideHeadingLinks": "Link-uri Utile", "commGuideLink01": "Habitica Help: Ask a Question: o Breaslă pentru întrebările puse de utilizatori!", "commGuideLink02": "Wiki: cea mai mare colecție de informații despre Habitica.", "commGuideLink03": "GitHub: pentru raportarea erorilor și pentru a ajuta la programare!", @@ -124,5 +124,5 @@ "commGuideLink05": "Trello Mobil: pentru solicitarea facilităților pentru smartphone.", "commGuideLink06": "Trello Artă: pentru trimiterea artei pixelate.", "commGuideLink07": "Trello Expediții: pentru trimiterea textelor pentru expediții.", - "commGuidePara069": "The following talented artists contributed to these illustrations:" + "commGuidePara069": "La aceste ilustrații au contribuit următorii artiști talentați:" } diff --git a/website/common/locales/ro/defaulttasks.json b/website/common/locales/ro/defaulttasks.json index fe9613aeb5..e82ffed52e 100644 --- a/website/common/locales/ro/defaulttasks.json +++ b/website/common/locales/ro/defaulttasks.json @@ -25,41 +25,41 @@ "defaultTag5": "Echipe", "defaultTag6": "Treburi", "defaultTag7": "Creativitate", - "schoolTodoNotes": "Tap to name the assignment and choose a due date!]", - "defaultHabitNotes": "Or delete from the edit screen", - "defaultHabitText": "Click here to edit this into a bad habit you'd like to quit", - "creativityTodoNotes": "Tap to specify the name of your project", - "creativityTodoText": "Finish creative project", - "creativityDailyNotes": "Tap to specify the name of your current project + set the schedule!", - "creativityDailyText": "Work on creative project", - "creativityHabit": "Study a master of the craft >> + Practiced a new creative technique", - "choresTodoNotes": "Tap to specify the cluttered area!", - "choresTodoText": "Organize closet >> Organize clutter", - "choresDailyNotes": "Tap to choose your schedule!", - "choresDailyText": "Wash dishes", - "choresHabit": "10 minutes cleaning", - "selfCareTodoNotes": "Tap to specify what you plan to do!", - "selfCareTodoText": "Engage in a fun activity", - "selfCareDailyNotes": "Tap to choose your schedule!", - "selfCareDailyText": "5 minutes of quiet breathing", - "selfCareHabit": "Take a short break", + "schoolTodoNotes": "Atingeți pentru a denumi sarcina și alegeți o dată scadentă!]", + "defaultHabitNotes": "Sau ștergeți din ecranul de editare", + "defaultHabitText": "Faceți click aici pentru a edita acest lucru într-un obicei prost la care doriți să renunțați", + "creativityTodoNotes": "Atingeți pentru a specifica numele proiectului", + "creativityTodoText": "Finalizează proiectul creativ", + "creativityDailyNotes": "Atingeți pentru a specifica numele proiectului dvs. curent + setați programul!", + "creativityDailyText": "Lucrați la un proiect creativ", + "creativityHabit": "Studiați un maestru al meșteșugului >> + Practicați o nouă tehnică creativă", + "choresTodoNotes": "Atingeți pentru a specifica zona dezordonată!", + "choresTodoText": "Organizare dulap >> Organizare dezordine", + "choresDailyNotes": "Atingeți pentru a alege programul!", + "choresDailyText": "Spălat vasele", + "choresHabit": "10 minute de curățare", + "selfCareTodoNotes": "Atingeți pentru a specifica ce intenționați să faceți!", + "selfCareTodoText": "Implicați-vă într-o activitate distractivă", + "selfCareDailyNotes": "Atingeți pentru a alege programul!", + "selfCareDailyText": "5 minute de respirație liniștită", + "selfCareHabit": "Faceți o pauză scurtă", "workHabitMail": "Process email", - "schoolTodoText": "Finish assignment for class", - "schoolDailyNotes": "Tap to choose your homework schedule!", - "schoolDailyText": "Finish homework", - "schoolHabit": "Study/Procrastinate", - "healthTodoNotes": "Tap to add checklists!", - "healthTodoText": "Schedule check-up >> Brainstorm a healthy change", - "healthDailyNotes": "Tap to make any changes!", - "healthDailyText": "Floss", - "healthHabit": "Eat Health/Junk Food", - "exerciseTodoNotes": "Tap to add a checklist!", - "exerciseTodoText": "Set up workout schedule", - "exerciseDailyNotes": "Tap to choose your schedule and specify exercises!", - "exerciseDailyText": "Stretching >> Daily workout routine", - "exerciseHabit": "10 min cardio >> + 10 minutes cardio", - "workTodoProjectNotes": "Tap to specify the name of your current project + set a due date!", - "workTodoProject": "Work project >> Complete work project", - "workDailyImportantTaskNotes": "Tap to specify your most important task", - "workDailyImportantTask": "Most important task >> Worked on today’s most important task" + "schoolTodoText": "Finalizează sarciniile pentru școală", + "schoolDailyNotes": "Atingeți pentru a alege programul pentru teme!", + "schoolDailyText": "Termină temele", + "schoolHabit": "Studiază/Procastinează", + "healthTodoNotes": "Atingeți pentru a adăuga liste de verificare!", + "healthTodoText": "Programează un control >> Găsește o schimbare sănătoasă", + "healthDailyNotes": "Atingeți pentru a face orice modificare!", + "healthDailyText": "Ață dentară", + "healthHabit": "Mănâncă Mâncare Sănătoasă/Nesănătoasă", + "exerciseTodoNotes": "Atingeți pentru a adăuga o listă de verificare!", + "exerciseTodoText": "Stabiliți programul de antrenament", + "exerciseDailyNotes": "Atingeți pentru a alege programul și a specifica exercițiile!", + "exerciseDailyText": "Întindere >> Rutina zilnica de antrenament", + "exerciseHabit": "10 min cardio >> + 10 minute cardio", + "workTodoProjectNotes": "Atingeți pentru a specifica numele proiectului curent + setați o dată scadentă!", + "workTodoProject": "Proiect de lucru >> Proiect de lucru complet", + "workDailyImportantTaskNotes": "Atingeți pentru a specifica cea mai importantă sarcină", + "workDailyImportantTask": "Cea mai importantă sarcină >> Am lucrat la cea mai importantă sarcină de astăzi" } diff --git a/website/common/locales/ro/faq.json b/website/common/locales/ro/faq.json index bf2b2ec92c..ad05ba9c50 100644 --- a/website/common/locales/ro/faq.json +++ b/website/common/locales/ro/faq.json @@ -10,7 +10,7 @@ "webFaqAnswer1": "* Good Habits (the ones with a :heavy_plus_sign:) are tasks that you can do many times a day, such as eating vegetables. Bad Habits (the ones with a :heavy_minus_sign:) are tasks that you should avoid, like biting nails. Habits with a :heavy_plus_sign: and a :heavy_minus_sign: have a good choice and a bad choice, like taking the stairs vs. taking the elevator. Good Habits award Experience and Gold. Bad Habits subtract Health.\n* Dailies are tasks that you have to do every day, like brushing your teeth or checking your email. You can adjust the days that a Daily is due by clicking the pencil item to edit it. If you skip a Daily that is due, your avatar will take damage overnight. Be careful not to add too many Dailies at once!\n* To-Dos are your To-Do list. Completing a To-Do earns you Gold and Experience. You never lose Health from To-Dos. You can add a due date to a To-Do by clicking the pencil icon to edit.", "faqQuestion2": "Care ar fi niște sarcini exemplu?", "iosFaqAnswer2": "Wiki-ul are patru liste de sarcini exemplu de folosit ca inspirație:\n

\n * [Exemple de obiceiuri](http://habitica.fandom.com/wiki/Sample_Habits)\n * [Exemple de sarcini zilnice](http://habitica.fandom.com/wiki/Sample_Dailies)\n * [Exemple de sarcini de făcut](http://habitica.fandom.com/wiki/Sample_To-Dos)\n * [Exemple de recompense particularizate](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)", - "androidFaqAnswer2": "The wiki has four lists of sample tasks to use as inspiration:\n

\n * [Sample Habits](http://habitica.fandom.com/wiki/Sample_Habits)\n * [Sample Dailies](http://habitica.fandom.com/wiki/Sample_Dailies)\n * [Sample To-Dos](http://habitica.fandom.com/wiki/Sample_To-Dos)\n * [Sample Custom Rewards](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)", + "androidFaqAnswer2": "Wiki are patru liste de exemple de sarcini pentru a fi folosite ca inspirație:\n

\n * [Exemple Obiceiuri](http://habitica.fandom.com/wiki/Sample_Habits)\n * [Exemple Cotidiene](http://habitica.fandom.com/wiki/Sample_Dailies)\n * [Exemple Sarcini](http://habitica.fandom.com/wiki/Sample_To-Dos)\n * [Exemple Recompense Personalizate](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)", "webFaqAnswer2": "Wiki-ul are patru liste de sarcini exemplu de folosit ca inspirație:\n * [Exemple de obiceiuri](http://habitica.fandom.com/wiki/Sample_Habits)\n * [Exemple de sarcini zilnice](http://habitica.fandom.com/wiki/Sample_Dailies)\n * [Exemple de sarcini de făcut](http://habitica.fandom.com/wiki/Sample_To-Dos)\n * [Exemple de recompense particularizate](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)", "faqQuestion3": "De ce își schimbă culorile sarcinile mele?", "iosFaqAnswer3": "Sarcinile tale își schimbă culoarea pe baza a cât de bine le realizezi! Fiecare nouă sarcină începe c o culoare galben neutru. Întreprinde sarcini zilnice sau obiceiuri pozitive mai frecvent și culoarea se va schimba mai mult înspre albastru. Ratează o sarcină zilnică, sau cedează în fața tentației unui obicei prost și sarcina culoarea se va schimba înspre roșu. Cu cât e mai roșie o sarcină, cu atât te va recompensa mai mult, dar dacă este vorba de o sarcină zilnică sau obicei prost, cu atât mai mult te va răni! Aceasta te va motiva să completezi sarcinile care îți pun probleme.", @@ -32,7 +32,7 @@ "iosFaqAnswer7": "At level 10, you can choose to become a Warrior, Mage, Rogue, or Healer. (All players start as Warriors by default.) Each Class has different equipment options, different Skills that they can cast after level 11, and different advantages. Warriors can easily damage Bosses, withstand more damage from their tasks, and help make their Party tougher. Mages can also easily damage Bosses, as well as level up quickly and restore Mana for their party. Rogues earn the most gold and find the most item drops, and they can help their Party do the same. Finally, Healers can heal themselves and their Party members.\n\n If you don't want to choose a Class immediately -- for example, if you are still working to buy all the gear of your current class -- you can click “Decide Later” and choose later under Menu > Choose Class.", "androidFaqAnswer7": "At level 10, you can choose to become a Warrior, Mage, Rogue, or Healer. (All players start as Warriors by default.) Each Class has different equipment options, different Skills that they can cast after level 11, and different advantages. Warriors can easily damage Bosses, withstand more damage from their tasks, and help make their Party tougher. Mages can also easily damage Bosses, as well as level up quickly and restore Mana for their party. Rogues earn the most gold and find the most item drops, and they can help their Party do the same. Finally, Healers can heal themselves and their Party members.\n\n If you don't want to choose a Class immediately -- for example, if you are still working to buy all the gear of your current class -- you can click “Opt Out” and choose later under Menu > Choose Class.", "webFaqAnswer7": "At level 10, you can choose to become a Warrior, Mage, Rogue, or Healer. (All players start as Warriors by default.) Each Class has different equipment options, different Skills that they can cast after level 11, and different advantages. Warriors can easily damage Bosses, withstand more damage from their tasks, and help make their party tougher. Mages can also easily damage Bosses, as well as level up quickly and restore Mana for their party. Rogues earn the most Gold and find the most item drops, and they can help their party do the same. Finally, Healers can heal themselves and their party members. If you don't want to choose a Class immediately -- for example, if you are still working to buy all the gear of your current class -- you can click \"Opt Out\" and re-enable it later under Settings.", - "faqQuestion8": "What is the blue Stat bar that appears in the Header after level 10?", + "faqQuestion8": "Ce este bara Status albastră care apare în Antet după nivelul 10?", "iosFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 under Menu > Use Skills. Unlike your health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete Good Habits, Dailies, and To-Dos, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.", "androidFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 under Menu > Skills. Unlike your health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete Good Habits, Dailies, and To-Dos, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.", "webFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 in the action bar at the bottom of the screen. Unlike your Health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete good Habits, Dailies, and To-Dos, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.", @@ -40,19 +40,19 @@ "iosFaqAnswer9": "First, you need to join or start a Party (see above). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Shop for Gold and Gems.\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", "androidFaqAnswer9": "First, you need to join or start a Party (see above). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Shop for Gold and Gems.\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", "webFaqAnswer9": "First, you need to join or start a Party by clicking \"Party\" in the navigation bar. Although you can battle monsters alone, we recommend playing in a group, because this will make quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating! Next, you need a Quest Scroll, which are stored under Inventory > Quests. There are four ways to get a scroll:\n * When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n * At level 15, you get a Quest-line, i.e., three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively.\n * You can buy Quests from the Quests Shop (Shops > Quests) for Gold and Gems.\n * When you check in to Habitica a certain number of times, you'll be rewarded with Quest Scrolls. You earn a Scroll during your 1st, 7th, 22nd, and 40th check-ins.\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading may be required to see the Boss's Health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", - "faqQuestion10": "What are Gems, and how do I get them?", + "faqQuestion10": "Ce sunt Nestematele și cum le primesc?", "iosFaqAnswer10": "Gems are purchased with real money by tapping on the Gem icon in the header. When people buy Gems, they are helping us to keep the site running. We're very grateful for their support!\n\n In addition to buying Gems directly, there are three other ways players can gain Gems:\n\n * Win a Challenge that has been set up by another player. Go to Social > Challenges to join some.\n * Subscribe and unlock the ability to buy a certain number of Gems per month.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.fandom.com/wiki/Contributing_to_Habitica).\n\n Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the app without them!", "androidFaqAnswer10": "Gems are purchased with real money by tapping on the Gem icon in the header. When people buy Gems, they are helping us to keep the site running. We're very grateful for their support!\n\n In addition to buying Gems directly, there are three other ways players can gain Gems:\n\n * Win a Challenge that has been set up by another player. Go to Social > Challenges to join some.\n * Subscribe and unlock the ability to buy a certain number of Gems per month.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.fandom.com/wiki/Contributing_to_Habitica).\n\n Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the app without them!", "webFaqAnswer10": "Gems are purchased with real money, although [subscribers](https://habitica.com/user/settings/subscription) can purchase them with Gold. When people subscribe or buy Gems, they are helping us to keep the site running. We're very grateful for their support! In addition to buying Gems directly or becoming a subscriber, there are two other ways players can gain Gems:\n* Win a Challenge that has been set up by another player. Go to Challenges > Discover Challenges to join some.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.fandom.com/wiki/Contributing_to_Habitica). Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the site without them!", "faqQuestion11": "Cum raportez un defect sau cer o funcționalitate?", - "iosFaqAnswer11": "You can report a bug, request a feature, or send feedback under Menu > About > Report a Bug and Menu > About > Send Feedback! We'll do everything we can to assist you.", - "androidFaqAnswer11": "You can report a bug, request a feature, or send feedback under About > Report a Bug and About > Send us Feedback! We'll do everything we can to assist you.", - "webFaqAnswer11": "To report a bug, go to [Help > Report a Bug](https://habitica.com/groups/guild/a29da26b-37de-4a71-b0c6-48e72a900dac) and read the points above the chat box. If you're unable to log in to Habitica, send your login details (not your password!) to [<%= techAssistanceEmail %>](<%= wikiTechAssistanceEmail %>). Don't worry, we'll get you fixed up soon! Feature requests are collected on Trello. Go to [Help > Request a Feature](https://trello.com/c/odmhIqyW/440-read-first-table-of-contents) and follow the instructions. Ta-da!", + "iosFaqAnswer11": "Puteți raporta o eroare, puteți solicita o caracteristică sau puteți trimite feedback sub Meniu> Despre > Raportați o eroare și Meniu > Despre > Trimiteți feedback! Vom face tot ce putem pentru a vă ajuta.", + "androidFaqAnswer11": "Puteți raporta o eroare, puteți solicita o caracteristică sau puteți trimite feedback sub Despre > Raportați o eroare și Despre > Trimiteți-ne feedback! Vom face tot ce putem pentru a vă ajuta.", + "webFaqAnswer11": "Pentru a raporta o eroare, accesați [Ajutor > Raportați o eroare](https://habitica.com/groups/guild/a29da26b-37de-4a71-b0c6-48e72a900dac) și citiți punctele de deasupra casetei de chat. Dacă nu vă puteți conecta la Habitica, trimiteți datele de autentificare (nu parola dvs.) la [<%= techAssistanceEmail %>](<%= wikiTechAssistanceEmail %>). Nu vă faceți griji, vă vom ajuta în curând! Cererile de caracteristici sunt colectate pe Trello. Accesați [Ajutor > Cere o facilitate](https://trello.com/c/odmhIqyW/440-read-first-table-of-contents) și urmați instrucțiunile. Ta-da!", "faqQuestion12": "Cum mă lupt cu un căpcăun șef?", "iosFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual.\n\n You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party.\n\n A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change.\n\n You can read more about [past World Bosses](http://habitica.fandom.com/wiki/World_Bosses) on the wiki.", "androidFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual.\n\n You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party.\n\n A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change.\n\n You can read more about [past World Bosses](http://habitica.fandom.com/wiki/World_Bosses) on the wiki.", "webFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual. You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party. A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change. You can read more about [past World Bosses](http://habitica.fandom.com/wiki/World_Bosses) on the wiki.", - "iosFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.", - "androidFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.", - "webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.fandom.com/wiki/FAQ), come ask in the [Habitica Help guild](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! We're happy to help." + "iosFaqStillNeedHelp": "Dacă aveți o întrebare care nu se află pe această listă sau pe [Întrebări frecvente Wiki](https://habitica.fandom.com/wiki/FAQ), veniți să întrebați în chat-ul Taclale la Cârciumă sub Meniu > Taclale la Cârciumă! Suntem fericiți să vă ajutăm.", + "androidFaqStillNeedHelp": "Dacă aveți o întrebare care nu se află pe această listă sau pe [Întrebări frecvente Wiki](https://habitica.fandom.com/wiki/FAQ), veniți să întrebați în chat-ul Taclale la Cârciumă sub Meniu > Taclale la Cârciumă! Suntem fericiți să vă ajutăm.", + "webFaqStillNeedHelp": "Dacă aveți o întrebare care nu se află pe această listă sau pe [Întrebări frecvente Wiki](https://habitica.fandom.com/wiki/FAQ), întrebați în [Ghilda Ajutor Habitica](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! Suntem fericiți să vă ajutăm." } diff --git a/website/common/locales/ro/generic.json b/website/common/locales/ro/generic.json index cefe16b936..4f590ae25b 100644 --- a/website/common/locales/ro/generic.json +++ b/website/common/locales/ro/generic.json @@ -296,5 +296,5 @@ "congratulations": "Congratulations!", "onboardingAchievs": "Onboarding Achievements", "options": "Options", - "finish": "Finish" + "finish": "Sfârșit" } diff --git a/website/common/locales/ro/maintenance.json b/website/common/locales/ro/maintenance.json index 4baeda60af..aaf7f00ada 100644 --- a/website/common/locales/ro/maintenance.json +++ b/website/common/locales/ro/maintenance.json @@ -9,25 +9,25 @@ "veteranPetAward": "La final vei primi un animal Veteran!", "maintenanceInfoTitle": "Informații despre Lucrări de Mentenanță la Habitica", "maintenanceInfoWhat": "Ce se întâmplă?", - "maintenanceInfoWhatText": "On May 21, Habitica will be down for maintenance for most of the day. You will not take any damage or have your account harmed during that weekend, even if you can’t log in to check off your Dailies in time! We will be working very hard to make the downtime as short as possible, and will be posting regular updates on our Twitter account. At the end of the downtime, to thank everyone for their patience, you will all receive a rare pet!", - "maintenanceInfoWhy": "Why is this happening?", - "maintenanceInfoWhyText": "For the past several months, we have been thoroughly revamping Habitica behind-the-scenes. Specifically, we have rewritten the API. While it may not look much different on the surface, it’s a whole new world underneath. This will allow us WAY more flexibility when we want to build features in the future, and lead to improved performance!", - "maintenanceInfoTechDetails": "Want more details on the technical side of the process? Visit The Forge, our dev blog.", + "maintenanceInfoWhatText": "Pe 21 mai, Habitica va fi în mentenață pentru cea mai mare parte a zilei. Nu veți lua nicio pagubă și contul tău nu va avea de suferit în acel weekend, chiar dacă nu vă puteți autentifica pentru a vă verifica Cotidienele la timp! Vom lucra foarte mult pentru ca timpul de oprire să fie cât mai scurt posibil și vom posta actualizări periodice pe contul nostru de Twitter. La sfârșitul perioadei de oprire, pentru a mulțumi tuturor pentru răbdarea lor, veți primi cu toții un companion rar!", + "maintenanceInfoWhy": "De ce se întâmplă asta?", + "maintenanceInfoWhyText": "În ultimele câteva luni, am reînnoit temeinic Habitica în culise. Mai exact, am rescris API-ul. Cu toate că s-ar putea să nu arate mult diferit la suprafață, este o lume cu totul nouă. Acest lucru ne va permite MULT mai multă flexibilitate atunci când dorim să construim funcții în viitor, care vor duce la performanțe îmbunătățite!", + "maintenanceInfoTechDetails": "Doriți mai multe detalii despre partea tehnică a procesului? Accesați Forja (The Forge), blogul nostru dev.", "maintenanceInfoMore": "Mai multe Informații", "maintenanceInfoAccountChanges": "Care sunt schimbările care vor apărea în contul meu după ce rescrierea este completă?", - "maintenanceInfoAccountChangesText": "At first, there won’t be any notable changes aside from performance improvements for features such as Challenges. If you notice any changes that shouldn’t be there, email us at <%= hrefTechAssistanceEmail %> and we will investigate them for you!", - "maintenanceInfoAddFeatures": "What kind of features will this allow Habitica to add?", - "maintenanceInfoAddFeaturesText": "Completing this rewrite will allow us to start building out improved chat and Guilds, plans for organizations and families, and additional productivity features like Monthlies and the ability to record yesterday’s activity! Those are all involved features on their own, so it will take time to build them, but until we were finished with this rewrite, there was no way we could start them.", - "maintenanceInfoHowLong": "How long will the maintenance take?", - "maintenanceInfoHowLongText": "We have to migrate tasks and data for all 1.3 million Habitica users -- not an easy task! We anticipate that it will take place between approximately 1pm Pacific Time (8pm UTC) and 10pm Pacific Time (5am UTC). Rest assured that we’re doing everything we can to make it go as quickly as possible! You can follow updates on our Twitter.", - "maintenanceInfoStatsAffected": "How will my Dailies, Streaks, Buffs, and Quests be affected?", - "maintenanceInfoStatsAffectedText1": "You will NOT take any damage or lose any streaks that weekend, but otherwise, your day will reset normally! Dailies that you checked will become unchecked, buffs will reset, etc. If you are in a Collection Quest, you will still find items. If you are in a Boss Battle, you will still deal damage to the Boss, but the Boss will not deal damage to you. (Even monsters need a break!)", - "maintenanceInfoStatsAffectedText2": "After a lot of thought, our team concluded that this was the most fair way to handle the fact that many users will not be able to check off their Dailies normally during the maintenance. We’re sorry for any inconvenience this causes!", - "maintenanceInfoSeeTasks": "What if I need to see my task list?", - "maintenanceInfoSeeTasksText": "If you know that you will need to see your task list on Saturday to remind yourself what you have to do, we recommend that before the maintenance begins, you take a screenshot of your tasks so that you can use it as a reference.", - "maintenanceInfoRarePet": "What kind of rare pet will I receive?", - "maintenanceInfoRarePetText": "To thank you for your patience during the downtime, everyone will get a rare Veteran Pet. If you’ve never received a Veteran Pet before, you will receive a Veteran Wolf. If you already have a Veteran Wolf, you will receive a Veteran Tiger. And if you already have a Veteran Wolf and a Veteran Tiger, you will receive a never-before-seen Veteran pet! After the migration is completed, it may take several hours for your pet to show up, but never fear, everyone will get one.", - "maintenanceInfoWho": "Who worked on this massive project?", - "maintenanceInfoWhoText": "We’re glad you asked! It was spearheaded by our amazing contributor paglias, with lots of help from Blade, TheHollidayInn, SabreCat, Victor Pudeyev, TheUnknown, and Alys.", - "maintenanceInfoTesting": "The new version was also tirelessly tested by a bunch of our amazing open-source volunteers. Thank you -- we couldn't have done this without you." + "maintenanceInfoAccountChangesText": "La început, nu va exista nicio modificare notabilă, în afară de îmbunătățirile de performanță pentru funcții precum Provocări. Dacă observați modificări care nu ar trebui să fie acolo, trimiteți-ne e-mail la <%= hrefTechAssistanceEmail %> și le vom investiga pentru dvs.!", + "maintenanceInfoAddFeatures": "Ce fel de caracteristici îi va permite acest lucru să adauge Habitica?", + "maintenanceInfoAddFeaturesText": "Completarea acestei rescrieri ne va permite să începem să creăm chat-ul și Ghildele îmbunătățite, planurile pentru organizații și familii și funcții suplimentare de productivitate, cum ar fi Sarcinile Lunare și capacitatea de a înregistra activitatea de ieri! Acestea sunt caracteristici implicate pe cont propriu, așa că va dura timp să le construim, dar până când nu terminam cu această rescriere, nu aveam cum să le pornim.", + "maintenanceInfoHowLong": "Cât va dura mentenanța?", + "maintenanceInfoHowLongText": "Trebuie să migrăm sarcini și date pentru toți 1,3 milioane de utilizatori Habitica - nu este o sarcină ușoară! Previzăm că va avea loc între aproximativ ora 13:00 Ora Pacificului (20:00 UTC) și 22:00 Ora Pacificului (05:00 UTC). Facem tot ce putem pentru a face să meargă cât mai repede posibil! Puteți urmări actualizări pe Twitter-ul nostru.", + "maintenanceInfoStatsAffected": "Cum vor fi afectate Cotidienele, Șirurile, Sporurile și Aventurile mele?", + "maintenanceInfoStatsAffectedText1": "NU veți lua niciun fel de daune și nu veți pierde niciun fel de șiruri în acel weekend, dar altfel, ziua dvs. se va reseta normal! Zilele pe care le-ați bifat se vor dezactiva, sporurile se vor reseta etc. Dacă sunteți într-o Aventură, veți găsi în continuare articole. Dacă vă aflați într-o luptă cu Căpcăunul, veți mai provoca daune Căpcăunului, dar Căpcăunul nu vă va dauna. (Chiar și monștrii au nevoie de o pauză!)", + "maintenanceInfoStatsAffectedText2": "După multe gânduri, echipa noastră a ajuns la concluzia că acesta a fost cel mai corect mod de a face față faptului că mulți utilizatori nu vor putea bifa Cotidienele în mod normal în timpul întreținerii. Ne pare rău pentru neplăcerile cauzate de acest lucru!", + "maintenanceInfoSeeTasks": "Ce se întâmplă dacă trebuie să-mi văd lista de sarcini?", + "maintenanceInfoSeeTasksText": "Dacă știți că va trebui să vedeți lista de sarcini Sâmbătă pentru a vă reaminti ce aveți de făcut, vă recomandăm ca înainte de începerea mentenanei, să faceți o captură de ecran a sarcinilor dvs., astfel încât să o puteți folosi ca o referință.", + "maintenanceInfoRarePet": "Ce fel de companion rar voi primi?", + "maintenanceInfoRarePetText": "Pentru a vă mulțumi pentru răbdarea dvs. în timpul perioadei de mentenanță, toată lumea va primi un Animal Veteran rar. Dacă nu ați mai primit niciodată un Companion Veteran, veți primi un Lup Veteran. Dacă aveți deja un Lup Veteran, veți primi un Tigru Veteran. Și dacă aveți deja un Lup Veteran și un Tigru Veteran, veți primi un companion Veteran nemaivăzut! După finalizarea migrării, s-ar putea să dureze câteva ore până cân companionul dvs. să apară, dar să nu vă temeți, toată lumea va primi unul.", + "maintenanceInfoWho": "Cine a lucrat la acest proiect masiv?", + "maintenanceInfoWhoText": "Ne bucurăm că ai întrebat! A fost condusă de uimitorii noștri contribuitori, cu mult ajutor de la Blade, TheHollidayInn, SabreCat, Victor Pudeyev, TheUnknown, și Alys.", + "maintenanceInfoTesting": "Noua versiune a fost, de asemenea, testată fără încetare de o mulțime de uimitori voluntari open-source. Mulțumim -- nu am fi putut face asta fără tine." } diff --git a/website/common/locales/ro/messages.json b/website/common/locales/ro/messages.json index 44fcf48787..58291ee5fc 100644 --- a/website/common/locales/ro/messages.json +++ b/website/common/locales/ro/messages.json @@ -9,31 +9,31 @@ "messageCannotFeedPet": "Nu poți hrăni acest companion.", "messageAlreadyMount": "Ai deja acest animal de călărit. Încearcă să hrănești alt companion.", "messageEvolve": "Ai îmblînzit <%= egg %>, hai să mergem la o plimbare!", - "messageLikesFood": "<%= egg %> really likes <%= foodText %>!", - "messageDontEnjoyFood": "<%= egg %> eats <%= foodText %> but doesn't seem to enjoy it.", + "messageLikesFood": "<%= egg %> chiar îi place <%= foodText %>!", + "messageDontEnjoyFood": "<%= egg %> mănâncă <%= foodText %> dar nu pare să îi placă.", "messageBought": "Ai cumpărat <%= itemText %>", "messageEquipped": " <%= itemText %> echipat.", - "messageUnEquipped": "<%= itemText %> unequipped.", + "messageUnEquipped": "<%= itemText %> dezechipat.", "messageMissingEggPotion": "Îți lipsește ori oul ori poțiunea necesară", "messageInvalidEggPotionCombo": "Nu poți ecloza ouă de companioni de expediție fără licori magice de eclozare! Încearcă un alt ou.", "messageAlreadyPet": "Deja ai acest companion. Încearcă o altă combinație pentru eclozare!", "messageHatched": "Oul tău a eclozat! Vizitează grajdul pentru a-ți lua noul companion.", "messageNotEnoughGold": "Nu ai destul aur", - "messageTwoHandedEquip": "Wielding <%= twoHandedText %> takes two hands, so <%= offHandedText %> has been unequipped.", - "messageTwoHandedUnequip": "Wielding <%= twoHandedText %> takes two hands, so it was unequipped when you armed yourself with <%= offHandedText %>.", - "messageDropFood": "You've found <%= dropText %>!", - "messageDropEgg": "You've found a <%= dropText %> Egg!", - "messageDropPotion": "You've found a <%= dropText %> Hatching Potion!", + "messageTwoHandedEquip": "Mânuirea <%= twoHandedText %> ia două mâini, deci <%= offHandedText %> a fost dezechipată.", + "messageTwoHandedUnequip": "Mânuirea <%= twoHandedText %> ia două mâini, deci a fost dezechipat când v-ați înarmat cu <%= offHandedText %>.", + "messageDropFood": "Ați găsit <%= dropText %>!", + "messageDropEgg": "Ați găsit un Ou de <%= dropText %>!", + "messageDropPotion": "Ați găsit o Poțiune de Eclozat <%= dropText %>!", "messageDropQuest": "Ai găsit o expediție!", "messageDropMysteryItem": "Deschizi cutia și găsești <%= dropText %>!", "messageFoundQuest": "Ai găsit aventura \"<%= questText %>\"!", "messageAlreadyPurchasedGear": "Ai cumpărat acest echipament în trecut, dar momentan nu-l deții. Poți să-l cumperi din nou în coloana de răsplăți pe pagina cu sarcini.", "messageAlreadyOwnGear": "Deja deții acest articol. Echipează-l la pagina de echipamente.", - "previousGearNotOwned": "You need to purchase a lower level gear before this one.", - "messageHealthAlreadyMax": "You already have maximum health.", - "messageHealthAlreadyMin": "Oh no! You have already run out of health so it's too late to buy a health potion, but don't worry - you can revive!", + "previousGearNotOwned": "Trebuie să achiziționați un echipament de nivel inferior înainte de acesta.", + "messageHealthAlreadyMax": "Aveți deja sănătate maximă.", + "messageHealthAlreadyMin": "Oh nu! Ați rămas deja fără sănătate, așa că este prea târziu pentru a cumpăra o poțiune de sănătate, dar nu vă faceți griji - puteți reînvia!", "armoireEquipment": "<%= image %> Ai găsit o piesă rară de echipament în șifonier: <%= dropText %>! Grozav!", - "armoireFood": "<%= image %> You rummage in the Armoire and find <%= dropText %>. What's that doing in here?", + "armoireFood": "<%= image %> Pășești în Șifonier și găsești <%= dropText %>. Ce face asta aici?", "armoireExp": "Te-ai luptat cu șifonierul și ai câștigat experiență. Na!", "messageInsufficientGems": "Nu ai destule nestemate!", "messageAuthPasswordMustMatch": ":password și :confirmPassword nu se potrivesc", @@ -51,19 +51,19 @@ "messageGroupChatFlagAlreadyReported": "Ai raportat deja acest mesaj", "messageGroupChatNotFound": "Mesajul nu a fost găsit!", "messageGroupChatAdminClearFlagCount": "Doar un administrator poate curăța numărul de atenționări!", - "messageCannotFlagSystemMessages": "You cannot report a system message. If you need to report a violation of the Community Guidelines related to this message, please email a screenshot and explanation to our Community Manager at <%= communityManagerEmail %>.", - "messageGroupChatSpam": "Whoops, looks like you're posting too many messages! Please wait a minute and try again. The Tavern chat only holds 200 messages at a time, so Habitica encourages posting longer, more thoughtful messages and consolidating replies. Can't wait to hear what you have to say. :)", - "messageCannotLeaveWhileQuesting": "You cannot accept this party invitation while you are in a quest. If you'd like to join this party, you must first abort your quest, which you can do from your party screen. You will be given back the quest scroll.", + "messageCannotFlagSystemMessages": "Nu puteți raporta un mesaj de sistem. Dacă doriți să raportați o încălcare a Ghidurilor Comunitare legate de acest mesaj, vă rugăm să trimiteți o captură de ecran și explicații Managerului nostru de Comunite la <%= communityManagerEmail %>.", + "messageGroupChatSpam": "Ups, pare că postezi prea multe mesaje! Vă rugăm să așteptați un minut și să încercați din nou. Chat-ul Taclale la Cârciumă conține doar 200 de mesaje simultan, așa că Habitica încurajează postarea de mesaje mai lungi, mai atent și consolidarea răspunsurilor. Abia aștept să aud ce ai de spus. :)", + "messageCannotLeaveWhileQuesting": "Nu puteți accepta această invitație de echipă în timp ce sunteți într-o aventură. Dacă doriți să vă alăturați acestei echipe, mai întâi trebuie să anulați aventura dvs., pe care o puteți face din ecranul echipei. Vi se va da înapoi sulul aventurii.", "messageUserOperationProtected": "calea `<%= operation %>` nu a fost salvată pentru că este protejată.", "messageUserOperationNotFound": "nu a fost găsită operațiunea <%= operation %>", - "messageNotificationNotFound": "Notification not found.", - "messageNotAbleToBuyInBulk": "This item cannot be purchased in quantities above 1.", - "notificationsRequired": "Notification ids are required.", - "unallocatedStatsPoints": "You have <%= points %> unallocated Stat Points", - "beginningOfConversation": "This is the beginning of your conversation with <%= userName %>.", - "messageDeletedUser": "Sorry, this user has deleted their account.", - "messageMissingDisplayName": "Missing display name.", - "canDeleteNow": "You can now delete the message if you wish.", - "reportedMessage": "You have reported this message to moderators.", - "beginningOfConversationReminder": "Remember to be kind, respectful, and follow the Community Guidelines!" + "messageNotificationNotFound": "Notificarea nu a fost găsită.", + "messageNotAbleToBuyInBulk": "Acest articol nu poate fi achiziționat în cantități peste 1.", + "notificationsRequired": "ID-urile de notificare sunt necesare.", + "unallocatedStatsPoints": "Aveți <%= points %> Puncte pentru Statistici nealocate", + "beginningOfConversation": "Acesta este începutul conversației cu <%= userName %>.", + "messageDeletedUser": "Ne pare rău, acest utilizator și-a șters contul.", + "messageMissingDisplayName": "Numele afișat lipsește.", + "canDeleteNow": "Acum puteți șterge mesajul dacă doriți.", + "reportedMessage": "Ați raportat acest mesaj moderatorilor.", + "beginningOfConversationReminder": "Nu uitați să fiți amabili, respectuosi și urmați Regulile Comunității!" } diff --git a/website/common/locales/ro/overview.json b/website/common/locales/ro/overview.json index b14e6e480e..c1803fda56 100644 --- a/website/common/locales/ro/overview.json +++ b/website/common/locales/ro/overview.json @@ -5,6 +5,6 @@ "step2": "Pasul 2: Câștigă puncte Făcând Lucruri în Viața Reală", "webStep2Text": "Acum, începe să abordezi obiectivele din listă! Pe măsură ce finalizezi sarcinile și le verifici în Habitica, vei câștiga [Experiență](http://habitica.fandom.com/wiki/Experience_Points), care te ajută să crească nivelul, și [Aur](http: // habitica. fandom.com/wiki/Gold_Points), care îți permite să cumperi Recompense. Dacă pici în mrejele obiceiurilor proaste sau nu îți faci Cotidianele, vei pierde [Sănătate](http://habitica.fandom.com/wiki/Health_Points). În acest sens, barele Habitica de Experiență și de Sănătate sunt un indicator distractiv al progresului tău către obiectivele tale. Vei începe să vezi că viața ta reală se îmbunătățește pe măsură ce personajul tău avansează în joc.", "step3": "Pasul 3: Personalizați și explorați Habitica", - "webStep3Text": "Once you're familiar with the basics, you can get even more out of Habitica with these nifty features:\n * Organize your Tasks with [tags](http://habitica.fandom.com/wiki/Tags) (edit a Task to add them).\n * Customize your [Avatar](http://habitica.fandom.com/wiki/Avatar) by clicking the user icon in the upper-right corner.\n * Buy your [Equipment](http://habitica.fandom.com/wiki/Equipment) under Rewards or from the [Shops](<%= shopUrl %>), and change it under [Inventory > Equipment](<%= equipUrl %>).\n * Connect with other users via the [Tavern](http://habitica.fandom.com/wiki/Tavern).\n * Hatch [Pets](http://habitica.fandom.com/wiki/Pets) by collecting [Eggs](http://habitica.fandom.com/wiki/Eggs) and [Hatching Potions](http://habitica.fandom.com/wiki/Hatching_Potions). [Feed](http://habitica.fandom.com/wiki/Food) them to create [Mounts](http://habitica.fandom.com/wiki/Mounts).\n * At level 10: Choose a particular [Class](http://habitica.fandom.com/wiki/Class_System) and then use Class-specific [skills](http://habitica.fandom.com/wiki/Skills) (levels 11 to 14).\n * Form a Party with your friends (by clicking [Party](<%= partyUrl %>) in the navigation bar) to stay accountable and earn a Quest scroll.\n * Defeat monsters and collect objects on [Quests](http://habitica.fandom.com/wiki/Quests) (you will be given a quest at level 15).", + "webStep3Text": "După ce vă familiarizați cu elementele de bază, puteți să vă extrageți și mai mult din Habitica cu aceste caracteristici extraordinare:\n * Organizați-vă sarcinile cu [tag-uri] (https://habitica.fandom.com/wiki/Tags) (editați o Sarcină pentru a le adăuga).\n * Personalizați-vă [Avatarul](https://habitica.fandom.com/wiki/Avatar) făcând clic pe pictograma utilizatorului din colțul din dreapta sus.\n * Cumpărați-vă [Echipamentul](https://habitica.fandom.com/wiki/Equipment) de sub Recompense sau de la [Magazine](<%= shopUrl %>), și schimbați-l în [Inventar> Echipament](<%= equipUrl %>).\n * Conectați-vă cu alți utilizatori prin [Taclale la cârciumă](https://habitica.fandom.com/wiki/Tavern).\n * Eclozați [Companioni](https://habitica.fandom.com/wiki/Pets) colectând [Ouă](https://habitica.fandom.com/wiki/Eggs) și [Poțiuni de Eclozat(https://habitica.fandom.com/wiki/Hatching_Potions). [Hrănește-i] (https://habitica.fandom.com/wiki/Food) pentru a crea [Animale de Călărit](https://habitica.fandom.com/wiki/Mounts).\n * La nivelul 10: Alegeți o anumită [Clasă](https://habitica.fandom.com/wiki/Class_System) și apoi utilizați [Abilități] specifice clasei (https://habitica.fandom.com/wiki/Skills) (nivelurile 11 - 14).\n * Formați o Echipă cu prietenii dvs. (făcând clic pe [Echipă](<%= partyUrl %>) în bara de navigare) pentru a rămâne responsabil și pentru a câștiga o Aventură.\n * Învingeți monștrii și colectați obiecte în [Aventuri](https://habitica.fandom.com/wiki/Quests) (vi se va da o misiune la nivelul 15).", "overviewQuestions": "Ai întrebări? Vezi [FAQ](<%= faqUrl %>)! Dacă întrebarea ta nu este menționată acolo, poți solicita ajutor suplimentar în [Ghilda de asistență Habitica](<%= helpGuildUrl %>).\n\nMult noroc cu sarcinile tale!" } diff --git a/website/common/locales/ro/settings.json b/website/common/locales/ro/settings.json index bc305e38df..68cf72bb2d 100644 --- a/website/common/locales/ro/settings.json +++ b/website/common/locales/ro/settings.json @@ -50,17 +50,17 @@ "sureChangeCustomDayStart": "Sigur dorești schimbarea orei de început a zilei?", "customDayStartHasChanged": "Ora de începere a zilei a fost modificată.", "nextCron": "Sarcinile tale zilnice se vor reseta prima dată când folosești Habitica după ora <%= time %>. Ai grijă să completezi sarcinile zilnice înainte de această oră!", - "customDayStartInfo1": "Habitica defaults to check and reset your Dailies at midnight in your own time zone each day. You can customize that time here.", + "customDayStartInfo1": "Habitica are setările prestabilite pentru a verifica și reseta Zilnicele la miezul nopții în propriul fus orar în fiecare zi. Puteți personaliza ora respectivă aici.", "misc": "Altele", "showHeader": "Arată antet", "changePass": "Schimbă parola", - "changeUsername": "Change Username", - "changeEmail": "Change Email Address", + "changeUsername": "Schimbă Numele", + "changeEmail": "Schimbă Adresa de Email", "newEmail": "New Email Address", "oldPass": "Parola veche", "newPass": "Parola nouă", "confirmPass": "Confirmă parola nouă", - "newUsername": "New Username", + "newUsername": "Nume de Utilizator Nou", "dangerZone": "Zona de pericol", "resetText1": "ATENȚIE! Aceasta îți va reseta multe setari ale contului. Este foarte nerecomandat dar totuși unii utilizatori găsesc aceasta resetare folositoare la început după ce s-au distrat cu site-ul pentru puțin timp.", "resetText2": "Vei pierde toate nivelurile, Aurul și punctele de Experiență. Toate sarcinile tale (cu excepția celor din provocări) vor fi șterse permanent și vei pierde toate datele de istoric. Vei pierde tot echipamentul și obiectele Misterioase de abonat pe care le deții (va trebui să fii în clasa corespunzătoare pentru a recumpăra echipamentele specifice clasei). Îți vei păstra clasa curentă, animalele de companie și de călărit. E posibil să preferi utilizarea Globului Renașterii, care este o opțiune mult mai sigură și care îți va păstra sarcinile și echipamentul.", @@ -94,64 +94,64 @@ "fillAll": "Te rog completează toate câmpurile", "invalidPasswordResetCode": "Codul de resetare a parolei este invalid sau expirat.", "passwordChangeSuccess": "Parola ți-a fost modificată cu succes la cea tocmai aleasă. Acum o poți utiliza pentru a-ți accesa contul.", - "passwordSuccess": "Password successfully changed", - "usernameSuccess": "Username successfully changed", - "displayNameSuccess": "Display name successfully changed", - "emailSuccess": "Email successfully changed", + "passwordSuccess": "Parolă schimbată cu succes", + "usernameSuccess": "Numele de utilizator a fost schimbat cu succes", + "displayNameSuccess": "Numele afișat a fost schimbat cu succes", + "emailSuccess": "Emailul a fost schimbat cu succes", "detachSocial": "De-înregistrează <%= network %>", "detachedSocial": "Ai eliminat cu succes autentificarea <%= network %> din cont", - "addedLocalAuth": "Successfully added local authentication", + "addedLocalAuth": "Adăugarea cu succes a autentificării locale", "data": "Data", "exportData": "Export Data", - "usernameOrEmail": "Username or Email", + "usernameOrEmail": "Nume de utilizator sau Email", "email": "Email", "registerWithSocial": "Înregistrează-te cu <%= network %>", "registeredWithSocial": "Înregistrat cu <%= network %>", "loginNameDescription": "Asta e ceea ce folosești pentru a te loga în Habitica. Pentru a schimba metoda, folosește formularul de mai jos. Dacă în loc de asta vrei să schimbi Numele Afișat care apare în dreptul avatarului și în mesajele din chat, mergi la Icon Utilizator > Profil și apasă pe butonul Editare.", "emailNotifications": "Email Notifications", "wonChallenge": "Ai câștigat o provocare!", - "newPM": "Received Private Message", + "newPM": "Mesaj privat primit", "newPMInfo": "Mesaj nou de la <%= name %>: <%= message %>", - "giftedGems": "Gifted Gems", + "giftedGems": "Nestemate Cadou", "giftedGemsInfo": "<%= name %> ți-a făcut cadou <%= amount %> Nestemate", "giftedGemsFull": "Salut <%= username %>, <%= sender %> ți-a trimis <%= gemAmount %> nestemate!", - "giftedSubscription": "Gifted Subscription", + "giftedSubscription": "Abonament Cadou", "giftedSubscriptionInfo": "<%= name %> ți-a făcut cadou o abonare de <%= months %> luni", "giftedSubscriptionFull": "Salut <%= username %>, <%= sender %> ți-a trimis <%= monthCount %> luni de abonare!", "giftedSubscriptionWinterPromo": "Salut <%= username %>, ai primit <%= monthCount %> luni de abonare ca parte din promoția noastră de dăruire de sărbători!", - "invitedParty": "You were invited to a Party", - "invitedGuild": "You were invited to a Guild", + "invitedParty": "Ai fost invitat într-o Echipă", + "invitedGuild": "Ai fost invitat într-o Ghildă", "importantAnnouncements": "Memento de intrare și completare a sarcinilor, și primire a premiilor", "weeklyRecaps": "Rezumate ale activității din contul tău în ultima săptămână (Notă: această opțiune este momentan dezactivată din cauza unor probleme legate de performanță, dar sperăm să avem opțiunea disponibilă din nou în curând, la și vom trimite din nou email-uri nu peste mult timp!)", "onboarding": "Ghid pentru setarea contului tău Habitica", - "majorUpdates": "Important announcements", - "questStarted": "Your Quest has Begun", - "invitedQuest": "Invited to Quest", - "kickedGroup": "Kicked from group", - "remindersToLogin": "Reminders to check in to Habitica", + "majorUpdates": "Anunțuri importante", + "questStarted": "Expediția Ta a Început", + "invitedQuest": "Invitat la Expediție", + "kickedGroup": "Înlăturat din grup", + "remindersToLogin": "Memento-uri pentru check-in în Habitica", "subscribeUsing": "Abonează-te folosind", - "unsubscribedSuccessfully": "Unsubscribed successfully!", + "unsubscribedSuccessfully": "Neabonat cu succes!", "unsubscribedTextUsers": "Te-ai dezabonat cu succes de la toate email-urile de la Habitica. Poți activa doar email-urile pe care vreu să le primești din Setări > > Notificări (necesită logare).", - "unsubscribedTextOthers": "You won't receive any other email from Habitica.", - "unsubscribeAllEmails": "Check to Unsubscribe from Emails", - "unsubscribeAllEmailsText": "By checking this box, I certify that I understand that by unsubscribing from all emails, Habitica will never be able to notify me via email about important changes to the site or my account.", + "unsubscribedTextOthers": "Nu veți primi niciun alt email de la Habitica.", + "unsubscribeAllEmails": "Bifați ca să vă dezabonați de la emailuri", + "unsubscribeAllEmailsText": "Bifând această casetă, certific faptul că înțeleg că prin dezabonarea de la toate emailurile, Habitica nu va putea niciodată să mă anunțe prin email despre modificări importante ale site-ului sau ale contului meu.", "unsubscribeAllPush": "Apasă pentru a te Dezabona de la toate Notificările Push", - "correctlyUnsubscribedEmailType": "Correctly unsubscribed from \"<%= emailType %>\" emails.", + "correctlyUnsubscribedEmailType": "Dezabonare corectă de la emailurile de la „<%= emailType %>”.", "subscriptionRateText": "$<%= price %> USD recurent la fiecare <%= months %> luni", "recurringText": "recurent", - "benefits": "Benefits", - "coupon": "Coupon", - "couponPlaceholder": "Enter Coupon Code", - "couponText": "We sometimes have events and give out coupon codes for special gear. (eg, those who stop by our Wondercon booth)", - "apply": "Apply", - "resubscribe": "Resubscribe", - "promoCode": "Promo Code", - "promoCodeApplied": "Promo Code Applied! Check your inventory", + "benefits": "Beneficii", + "coupon": "Cupon", + "couponPlaceholder": "Introdu Codul Cuponului", + "couponText": "Uneori avem evenimente și dăm coduri de cupon pentru echipamente speciale. (de exemplu, cei care se opresc la cabina noastră Wondercon)", + "apply": "Aplică", + "resubscribe": "Reabonare", + "promoCode": "Cod Promoțional", + "promoCodeApplied": "Cod Promoțional Aplicat! Verifică-ți inventarul", "promoPlaceholder": "Enter Promotion Code", - "displayInviteToPartyWhenPartyIs1": "Display Invite To Party button when party has 1 member.", + "displayInviteToPartyWhenPartyIs1": "Afișează butonul Invită În Echipă atunci când partidul are 1 membru.", "saveCustomDayStart": "Sarvează ora personală de început a zilei", "registration": "Înregistrare", - "addLocalAuth": "Add Email and Password Login", + "addLocalAuth": "Adăugați Email și Parolă de Logare", "generateCodes": "Generează coduri", "generate": "Generează", "getCodes": "Primește Coduri", @@ -191,27 +191,27 @@ "timezoneInfo": "Dacă acest fus orar este greșit, întâi te rugăm să dai refresh paginii folosind butonul de reload sau refresh, ca să te asiguri că Habitica deține cele mai recente informații. Dacă este în continuare greșit, ajustează fusul orar în PC-ul tău și apoi dă refresh paginii din nou.

Dacă folosești Habitica pe alte PC-uri sau dispozitive mobile, fusul orar trebuie să fie același pe toate. Dacă ale tale Cotidiene au fost resetate la momentul nepotrivit, repetă verificarea pe toate PC-urile și într-un broweser al dispozitivelor mobile deținute.", "push": "Push", "about": "Despre", - "setUsernameNotificationTitle": "Confirm your username!", + "setUsernameNotificationTitle": "Confirmă numele de utilizator!", "setUsernameNotificationBody": "We will be transitioning login names to unique, public usernames soon. This username will be used for invitations, @mentions in chat, and messaging.", - "usernameIssueSlur": "Usernames may not contain inappropriate language.", - "usernameIssueForbidden": "Usernames may not contain restricted words.", - "usernameIssueLength": "Usernames must be between 1 and 20 characters.", - "usernameIssueInvalidCharacters": "Usernames can only contain letters a to z, numbers 0 to 9, hyphens, or underscores.", - "currentUsername": "Current username:", - "displaynameIssueLength": "Display Names must be between 1 and 30 characters.", - "displaynameIssueSlur": "Display Names may not contain inappropriate language.", - "goToSettings": "Go to Settings", - "usernameVerifiedConfirmation": "Your username, <%= username %>, is confirmed!", - "usernameNotVerified": "Please confirm your username.", + "usernameIssueSlur": "Numele de utilizator nu poate conține un limbaj necorespunzător.", + "usernameIssueForbidden": "Numele de utilizator nu poate conține cuvinte restricționate.", + "usernameIssueLength": "Numele de utilizator trebuie să aibă între 1 și 20 de caractere.", + "usernameIssueInvalidCharacters": "Numele de utilizator poate conține doar litere de la a la z, numere de la 0 la 9, cratime sau underscores.", + "currentUsername": "Numele de utilizator curent:", + "displaynameIssueLength": "Numele Afișat trebuie să aibă între 1 și 30 de caractere.", + "displaynameIssueSlur": "Numele afișat nu poate să conțină un limbaj necorespunzător.", + "goToSettings": "Mergi la Setări", + "usernameVerifiedConfirmation": "Numele de utilizator, <%= username %>, este confirmat!", + "usernameNotVerified": "Confirmați numele de utilizator.", "changeUsernameDisclaimer": "Your username is used for invitations, @mentions in chat, and messaging. It must be 1 to 20 characters, containing only letters a to z, numbers 0 to 9, hyphens, or underscores, and cannot include any inappropriate terms.", - "verifyUsernameVeteranPet": "One of these Veteran Pets will be waiting for you after you've finished confirming!", - "onlyPrivateSpaces": "Only in private spaces", - "everywhere": "Everywhere", - "suggestMyUsername": "Suggest my username", - "mentioning": "Mentioning", - "buyGemsGoldCapBase": "Gem cap at <%= amount %>", - "subscriptionReminders": "Subscriptions Reminders", - "newPMNotificationTitle": "New Message from <%= name %>", - "chatExtensionDesc": "The Chat Extension for Habitica adds an intuitive chat box to all of habitica.com. It allows users to chat in the Tavern, their party, and any guilds they are in.", - "chatExtension": "Chrome Chat Extension and Firefox Chat Extension" + "verifyUsernameVeteranPet": "Unul dintre acești Companioni Veterani vă va aștepta după ce ați confirmat!", + "onlyPrivateSpaces": "Numai în spații private", + "everywhere": "Pretutindeni", + "suggestMyUsername": "Sugerează-mi numele de utilizator", + "mentioning": "Menționând", + "buyGemsGoldCapBase": "Limită Nestemată la <%= amount %>", + "subscriptionReminders": "Memento-uri Abonamente", + "newPMNotificationTitle": "Mesaj nou de la <%= name %>", + "chatExtensionDesc": "Extensia de chat pentru Habitica adaugă o casetă de chat intuitivă pentru toate habitica.com. Acesta permite utilizatorilor să discute în taverna, echipa lor și orice ghildă în care se află.", + "chatExtension": "Extensia de Chat pentru Chrome and Extensia de chat pentru Firefox" } diff --git a/website/common/locales/ru/quests.json b/website/common/locales/ru/quests.json index 0cc508ab9f..81802b4f00 100644 --- a/website/common/locales/ru/quests.json +++ b/website/common/locales/ru/quests.json @@ -138,5 +138,6 @@ "chatBossDefeated": "Вы победили <%= bossName %>! Участники квеста получают награду за победу.", "chatBossDontAttack": "<%= username %> атакует <%= bossName %> и наносит <%= userDamage %> урона. <%= bossName %> не атакует, потому что осознает тот факт, что имеются некоторые ошибки после техобслуживания, и не хочет никого несправедливо поранить. <%= bossName %> скоро продолжит буйство!", "questInvitationNotificationInfo": "Вы были приглашены принять участие в квесте", - "questAlreadyStarted": "Квест уже начился." + "questAlreadyStarted": "Квест уже начился.", + "questAlreadyStartedFriendly": "Квест уже начался, но вы всегда можете поучаствовать в следующем!" } diff --git a/website/common/locales/ru/questscontent.json b/website/common/locales/ru/questscontent.json index d567f67a9a..cf2316e87a 100644 --- a/website/common/locales/ru/questscontent.json +++ b/website/common/locales/ru/questscontent.json @@ -548,7 +548,7 @@ "questLostMasterclasser4Boss": "Aнти'циния", "questLostMasterclasser4RageTitle": "Разреженная пустота", "questLostMasterclasser4RageDescription": "Разрежение пустоты: этот индикатор заполняется, когда вы не успеваете выполнить ежедневные задания. Когда он заполнится, Анти'циния заберет ману команды!", - "questLostMasterclasser4RageEffect": "`Aнти'циния использовала РАЗРЕЖЕНИЕ ПУСТОТЫ!` В скрученном всплеске инверсии эфирного заклинания вы чувствуете, как ваша магия уходит в темноту!", + "questLostMasterclasser4RageEffect": "`Aнти'циния применяет РАЗРЕЖЕНИЕ ПУСТОТЫ!` В скрученном всплеске инверсии эфирного заклинания вы чувствуете, как ваша магия уходит в темноту!", "questLostMasterclasser4DropBackAccessory": "Эфирный плащ (аксессуар на спину)", "questLostMasterclasser4DropWeapon": "Эфирные кристаллы (двуручное оружие)", "questLostMasterclasser4DropMount": "Невидимый эфирный скакун", @@ -676,10 +676,19 @@ "questAmberNotes": "Вы сидите в таверне с @beffymaroo и @-Tyr-, и вдруг @Vikte врывается внутрь и принимается живо делиться слухами об ещё одном виде волшебного инкубационного эликсира в Трудоборе. Так как ежедневные дела уже сделаны, вы втроём соглашаетесь подсобить @Vikte в поисках. В конце концов, немного приключений только пойдут вам на пользу.

Спустя долгие часы блужданий по Трудобору, вы начинаете жалеть, что согласились на эту дурацкую авантюру. Вы, уже было, собирались отправиться домой, но вдруг сзади раздаётся визг! Гигантская ящерица, покрытая сверкающей янтарной чешуёй, обвивая дерево, схватила своими когтистыми лапами @Vikte. @beffymaroo хватается за рукоятку меча.

«Постой!» - крикнул @-Tyr-. «Это же Тререзина! Она не опасная, просто жутко приставучая!»", "questAmberText": "Янтарный альянс", "evilSantaAddlNotes": "Обратите внимание, что квесты «Санта-зверолов» и «Найти детеныша» имеют накопительные достижения, но в награду выдают редкого питомца и скакуна только один раз.", - "questRubyUnlockText": "Позволяет покупать на рынке рубиновые инкубатоционные эликсиры", - "questRubyDropRubyPotion": "Рубиновый инкубатоционный эликсир", + "questRubyUnlockText": "Позволяет покупать на рынке рубиновые инкубационные эликсиры", + "questRubyDropRubyPotion": "Рубиновый инкубационный эликсир", "questRubyCollectVenusRunes": "рун Венеры", "questRubyCollectAquariusRunes": "зодиакальных рун водолея", "questRubyText": "Рубиновый раствор", - "questRubyCollectRubyGems": "Рубины" + "questRubyCollectRubyGems": "Рубины", + "questWaffleUnlockText": "Позволяет покупать на рынке сладкие инкубационные эликсиры", + "questWaffleDropDessertPotion": "Сладкий инкубационный эликсир", + "questWaffleBoss": "Ужасная вафля", + "questWaffleText": "Развлекаемся с Апрельским шутом: Катастрофический завтрак!", + "questWaffleRageDescription": "Кленовая трясина: эта шкала заполняется, когда вы не выполняете свои ежедневные задания. Когда она заполнится, Ужасная вафля замедлит ваш урон!", + "questWaffleRageEffect": "`Ужасная вафля применяет КЛЕНОВУЮ ТРЯСИНУ!`Сочный липкий сироп замедляет ваши удары и заклинания!", + "questWaffleRageTitle": "Кленовая трясина", + "questWaffleCompletion": "Потрепанные и намасленные, но торжествующие, вы наслаждаетесь сладкой победой, когда Ужасная вафля стекает в лужу липкой слизи.

“Ого, вы правда разгромили этого монстра,” восхищенно говорит Ледяная леди.

“Раз плюнуть!” сияет Апрельский шут.

“Хотя, немного досадно,” говорит @beffymaroo. “Она выглядела достаточно хорошо, чтобы ее съесть.”

Апрельский шут достает из плаща несколько бутылок для эликсиров, наполняет их сиропом, оставшимся от Ужасной вафли, и смешивает его с щепоткой сверкающей пыли. В жидкости кружатся разные цвета -- новые инкубационные эликсиры! Он бросает их вам. “С этими приключениями я нагулял аппетит. Кто хочет позавтракать со мной?”", + "questWaffleNotes": "“Апрельский дурак!” бушует взволнованная Ледяная леди. “Ты сказал, что твоя шутка с десертами ‘завершена и все полностью вымыто’!”

“Ну конечно же, все так и есть, моя дорогая,” озадаченно отвечает ей Апрельский шут. “Я самый честный из шутов. Что случилось?”

“К городу Habit приближается огромный засахаренный монстр!”

“Хм,” размышляет Апрельский шут. “Я обследовал несколько берлог в поисках волшебных реактивов для моей недавней шутки. Может быть, я нечаянно привлек чье-то внимание? Это Сахарный змей? Торт-илла? Тирамису рекс?”

“Нет! Это похоже на... Ужасную вафлю!”

“Ха. Это что-то новенькое! Возможно, ее породила окружающая шутливая энергия.” Он поворачивается к вам и @beffymaroo, криво улыбаясь. “Я надеюсь, вы не против того, чтобы немного погеройствовать?”" } diff --git a/website/common/locales/sv/quests.json b/website/common/locales/sv/quests.json index 94db292de6..473f98c3e2 100644 --- a/website/common/locales/sv/quests.json +++ b/website/common/locales/sv/quests.json @@ -126,5 +126,12 @@ "bossHealth": "<%= currentHealth %> / <%= maxHealth %> Hälsa", "rageAttack": "Rage Attack:", "bossRage": "<%= currentRage %> / <%= maxRage %> Vrede", - "rageStrikes": "Rage Strikes" + "rageStrikes": "Rage Strikes", + "chatItemQuestFinish": "Alla föremål hittade! Sällskapet har fått deras belöningar.", + "chatFindItems": "<%= username %> hittade <%= items %>.", + "chatBossDamage": "<%= username %> attackerar <%= bossName %> för <%= userDamage %> skada. <%= bossName %> attackerar sällskapet <%= bossDamage %> skada.", + "chatQuestStarted": "Ditt uppdrag, <%= questName %>, har börjat.", + "questAlreadyStarted": "Uppdraget har redan börjat.", + "questInvitationNotificationInfo": "Du har blivit inbjuden till ett uppdrag", + "hatchingPotionQuests": "Magiska Kläckningsbrygd Uppdrag" } diff --git a/website/common/script/errors/apiErrorMessages.js b/website/common/script/errors/apiErrorMessages.js index e8a3edce8c..77991b3f9b 100644 --- a/website/common/script/errors/apiErrorMessages.js +++ b/website/common/script/errors/apiErrorMessages.js @@ -27,4 +27,6 @@ export default { missingSubKey: 'Missing "req.query.sub"', ipAddressBlocked: 'This IP address has been blocked from accessing Habitica. This may be due to a breach of our Terms of Service or technical issue originating at this IP address. For details or to ask to be unblocked, please email admin@habitica.com or ask your parent or guardian to email them. Include your Habitica @ Username or User Id in the email if you have one.', + + invalidPlatform: 'Invalid platform specified', }; diff --git a/website/server/controllers/api-v3/content.js b/website/server/controllers/api-v3/content.js index 6dbb6137f4..76152c4e40 100644 --- a/website/server/controllers/api-v3/content.js +++ b/website/server/controllers/api-v3/content.js @@ -1,6 +1,6 @@ import nconf from 'nconf'; import { langCodes } from '../../libs/i18n'; -import { CONTENT_CACHE_PATH, getLocalizedContent } from '../../libs/content'; +import { CONTENT_CACHE_PATH, getLocalizedContentResponse } from '../../libs/content'; const IS_PROD = nconf.get('IS_PROD'); @@ -72,7 +72,7 @@ api.getContent = { 'Content-Type': 'application/json', }); - const jsonResString = getLocalizedContent(language); + const jsonResString = getLocalizedContentResponse(language); res.status(200).send(jsonResString); } }, diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index e71e2b63f7..f411c9db1f 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -607,9 +607,11 @@ api.joinGroup = { let promises = [group.save(), user.save()]; - if (inviter) { - inviter = await User.findById(inviter).exec(); + // Load the inviter + if (inviter) inviter = await User.findById(inviter).exec(); + // Check the inviter again, could be a deleted account + if (inviter) { const data = { headerText: common.i18n.t('invitationAcceptedHeader', inviter.preferences.language), bodyText: common.i18n.t('invitationAcceptedBody', { diff --git a/website/server/controllers/api-v4/faq.js b/website/server/controllers/api-v4/faq.js new file mode 100644 index 0000000000..171e72edad --- /dev/null +++ b/website/server/controllers/api-v4/faq.js @@ -0,0 +1,77 @@ +import _ from 'lodash'; +import { query } from 'express-validator/check'; +import { langCodes } from '../../libs/i18n'; +import apiError from '../../libs/apiError'; +import common from '../../../common'; +import { localizeContentData } from '../../libs/content'; + +const { content } = common; +const { faq } = content; + +const api = {}; + +function _deleteProperties (obj, keysToDelete, platform) { + // if there is no description for specified platform, use 'web' description by default + if (obj[platform] === undefined) { + delete obj.ios; + delete obj.android; + return; + } + + keysToDelete.forEach(key => delete obj[key]); +} + +function _deleteOtherPlatformsAnswers (faqObject, platform) { + const faqCopy = _.cloneDeep(faqObject); + const keysToDelete = _.without(['web', 'ios', 'android'], platform); + + _deleteProperties(faqCopy.stillNeedHelp, keysToDelete, platform); + faqCopy.questions.forEach(question => { + _deleteProperties(question, keysToDelete, platform); + }); + + return faqCopy; +} + +/** + * @api {get} /api/v4/faq Get faq in json format + * @apiDescription Does not require authentication. + * @apiName FaqGet + * @apiGroup Content + * + * @apiParam (Query) {String="bg","cs","da","de", + * "en","en@pirate","en_GB", + * "es","es_419","fr","he","hu", + * "id","it","ja","nl","pl","pt","pt_BR", + * "ro","ru","sk","sr","sv", + * "uk","zh","zh_TW"} [language=en] Language code used for the items' + * strings. If the authenticated user makes + * the request, the content will return with + * the user's configured language. + * + * + * @apiSuccess {Object} data FAQ in a json format + */ +api.faq = { + method: 'GET', + url: '/faq', + middlewares: [ + query('platform') + .optional() + .isIn(['web', 'android', 'ios']).withMessage(apiError('invalidPlatform')), + ], + async handler (req, res) { + const validationErrors = req.validationErrors(); + if (validationErrors) throw validationErrors; + + const proposedLang = req.query.language && req.query.language.toString(); + const language = langCodes.includes(proposedLang) ? proposedLang : 'en'; + + const { platform } = req.query; + + const dataToLocalize = platform ? _deleteOtherPlatformsAnswers(faq, platform) : faq; + res.respond(200, localizeContentData(dataToLocalize, language)); + }, +}; + +export default api; diff --git a/website/server/libs/aws.js b/website/server/libs/aws.js deleted file mode 100644 index f18610c6b6..0000000000 --- a/website/server/libs/aws.js +++ /dev/null @@ -1,7 +0,0 @@ -import AWS from 'aws-sdk'; -import nconf from 'nconf'; - -export const S3 = new AWS.S3({ // eslint-disable-line import/prefer-default-export - accessKeyId: nconf.get('S3_ACCESS_KEY_ID'), - secretAccessKey: nconf.get('S3_SECRET_ACCESS_KEY'), -}); diff --git a/website/server/libs/chat.js b/website/server/libs/chat.js index 5ba4e4dbdc..7846893ffc 100644 --- a/website/server/libs/chat.js +++ b/website/server/libs/chat.js @@ -1,6 +1,6 @@ import { model as User } from '../models/user'; // eslint-disable-line import/no-cycle import { getUserInfo } from './email'; // eslint-disable-line import/no-cycle -import { sendNotification as sendPushNotification } from './pushNotifications'; +import { sendNotification as sendPushNotification } from './pushNotifications'; // eslint-disable-line import/no-cycle export async function getAuthorEmailFromMessage (message) { const authorId = message.uuid; @@ -30,6 +30,9 @@ export async function sendChatPushNotifications (user, group, message, mentions, if (mentions && mentions.includes(`@${member.auth.local.username}`) && member.preferences.pushNotifications.mentionParty !== false) { return; } + + if (!message.unformattedText) return; + sendPushNotification( member, { diff --git a/website/server/libs/content.js b/website/server/libs/content.js index 134d87f007..13d4f31b9f 100644 --- a/website/server/libs/content.js +++ b/website/server/libs/content.js @@ -14,8 +14,13 @@ function walkContent (obj, lang) { }); } -export function getLocalizedContent (langCode) { - const contentClone = _.cloneDeep(common.content); - walkContent(contentClone, langCode); - return `{"success": true, "data": ${JSON.stringify(contentClone)}}`; +export function localizeContentData (data, langCode) { + const dataClone = _.cloneDeep(data); + walkContent(dataClone, langCode); + return dataClone; +} + +export function getLocalizedContentResponse (langCode) { + const localizedContent = localizeContentData(common.content, langCode); + return `{"success": true, "data": ${JSON.stringify(localizedContent)}}`; } diff --git a/website/server/libs/inbox/index.js b/website/server/libs/inbox/index.js index db16cd02ff..cfd7d87bf7 100644 --- a/website/server/libs/inbox/index.js +++ b/website/server/libs/inbox/index.js @@ -1,6 +1,6 @@ import { mapInboxMessage, inboxModel as Inbox } from '../../models/message'; import { getUserInfo, sendTxn as sendTxnEmail } from '../email'; // eslint-disable-line import/no-cycle -import { sendNotification as sendPushNotification } from '../pushNotifications'; +import { sendNotification as sendPushNotification } from '../pushNotifications'; // eslint-disable-line import/no-cycle const PM_PER_PAGE = 10; @@ -14,7 +14,7 @@ export async function sentMessage (sender, receiver, message, translate) { ]); } - if (receiver.preferences.pushNotifications.newPM !== false) { + if (receiver.preferences.pushNotifications.newPM !== false && messageSent.unformattedText) { sendPushNotification( receiver, { diff --git a/website/server/libs/payments/gems.js b/website/server/libs/payments/gems.js index 4904881e72..d565180e42 100644 --- a/website/server/libs/payments/gems.js +++ b/website/server/libs/payments/gems.js @@ -3,7 +3,7 @@ import { // eslint-disable-line import/no-cycle getUserInfo, sendTxn as txnEmail, } from '../email'; -import { sendNotification as sendPushNotification } from '../pushNotifications'; +import { sendNotification as sendPushNotification } from '../pushNotifications'; // eslint-disable-line import/no-cycle import shared from '../../../common'; function getGiftMessage (data, byUsername, gemAmount, language) { diff --git a/website/server/libs/payments/subscriptions.js b/website/server/libs/payments/subscriptions.js index 62fbe75b64..fbf81b90fb 100644 --- a/website/server/libs/payments/subscriptions.js +++ b/website/server/libs/payments/subscriptions.js @@ -16,7 +16,7 @@ import { NotFound, } from '../errors'; import shared from '../../../common'; -import { sendNotification as sendPushNotification } from '../pushNotifications'; +import { sendNotification as sendPushNotification } from '../pushNotifications'; // eslint-disable-line import/no-cycle // @TODO: Abstract to shared/constant const JOINED_GROUP_PLAN = 'joined group plan'; diff --git a/website/server/libs/pushNotifications.js b/website/server/libs/pushNotifications.js index 6cc15d09fe..ebbad83b4a 100644 --- a/website/server/libs/pushNotifications.js +++ b/website/server/libs/pushNotifications.js @@ -3,6 +3,9 @@ import nconf from 'nconf'; import apn from 'apn'; import gcmLib from 'node-gcm'; // works with FCM notifications too import logger from './logger'; +import { // eslint-disable-line import/no-cycle + model as User, +} from '../models/user'; const FCM_API_KEY = nconf.get('PUSH_CONFIGS_FCM_SERVER_API_KEY'); const fcmSender = FCM_API_KEY ? new gcmLib.Sender(FCM_API_KEY) : undefined; @@ -18,7 +21,7 @@ const apnProvider = APN_ENABLED ? new apn.Provider({ }) : undefined; function removePushDevice (user, pushDevice) { - return user.update({ + return User.update({ _id: user._id }, { $pull: { pushDevices: { regId: pushDevice.regId } }, }).exec().catch(err => { logger.error(err, `Error removing pushDevice ${pushDevice.regId} for user ${user._id}`); @@ -80,10 +83,18 @@ export function sendNotification (user, details = {}) { // The regId is not valid anymore, remove it if (failed === 'NotRegistered') { removePushDevice(user, pushDevice); - logger.error(new Error('FCM error, invalid pushDevice'), { - response, regId: pushDevice.regId, userId: user._id, + logger.error(new Error('FCM error, unregistered pushDevice'), { + regId: pushDevice.regId, userId: user._id, }); } else { + // An invalid token was registered by mistake + // Remove it but log the error differently so that it can be distinguished + // from when failed === NotRegistered + // Blacklisted can happen in some rare cases, + // see https://stackoverflow.com/questions/42136122/why-does-firebase-push-token-return-blacklisted + if (failed === 'InvalidRegistration' || pushDevice.regId === 'BLACKLISTED') { + removePushDevice(user, pushDevice); + } logger.error(new Error('FCM error'), { response, regId: pushDevice.regId, userId: user._id, }); @@ -110,7 +121,7 @@ export function sendNotification (user, details = {}) { // Handle failed push notifications deliveries response.failed.forEach(failure => { if (failure.error) { // generic error - logger.error(new Error('APN error'), { + logger.error(new Error('Unhandled APN error'), { response, regId: pushDevice.regId, userId: user._id, }); } else { // rejected @@ -119,10 +130,16 @@ export function sendNotification (user, details = {}) { const { reason } = failure.response; if (reason === 'Unregistered') { removePushDevice(user, pushDevice); - logger.error(new Error('APN error, invalid pushDevice'), { - response, regId: pushDevice.regId, userId: user._id, + logger.error(new Error('APN error, unregistered pushDevice'), { + regId: pushDevice.regId, userId: user._id, }); } else { + if (reason === 'BadDeviceToken') { + // An invalid token was registered by mistake + // Remove it but log the error differently so that it can be distinguished + // from when reason === Unregistered + removePushDevice(user, pushDevice); + } logger.error(new Error('APN error'), { response, regId: pushDevice.regId, userId: user._id, }); diff --git a/website/server/models/challenge.js b/website/server/models/challenge.js index c73693922a..e550209884 100644 --- a/website/server/models/challenge.js +++ b/website/server/models/challenge.js @@ -11,7 +11,7 @@ import { // eslint-disable-line import/no-cycle import { removeFromArray } from '../libs/collectionManipulators'; import shared from '../../common'; import { sendTxn as txnEmail } from '../libs/email'; // eslint-disable-line import/no-cycle -import { sendNotification as sendPushNotification } from '../libs/pushNotifications'; +import { sendNotification as sendPushNotification } from '../libs/pushNotifications'; // eslint-disable-line import/no-cycle import { syncableAttrs, setNextDue } from '../libs/taskManager'; const { Schema } = mongoose; diff --git a/website/server/models/group.js b/website/server/models/group.js index a4e4d1b79d..7f0a4b5c18 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -28,7 +28,7 @@ import { } from '../libs/errors'; import baseModel from '../libs/baseModel'; import { sendTxn as sendTxnEmail } from '../libs/email'; // eslint-disable-line import/no-cycle -import { sendNotification as sendPushNotification } from '../libs/pushNotifications'; +import { sendNotification as sendPushNotification } from '../libs/pushNotifications'; // eslint-disable-line import/no-cycle import { syncableAttrs, } from '../libs/taskManager'; @@ -637,12 +637,15 @@ schema.methods.sendChat = function sendChat (options = {}) { return; } } - sendPushNotification(member, { - identifier: 'chatMention', - title: `${user.profile.name} mentioned you in ${this.name}`, - message: newChatMessage.unformattedText, - payload: { type: this.type }, - }); + + if (newChatMessage.unformattedText) { + sendPushNotification(member, { + identifier: 'chatMention', + title: `${user.profile.name} mentioned you in ${this.name}`, + message: newChatMessage.unformattedText, + payload: { type: this.type }, + }); + } }); } return newChatMessage; diff --git a/website/server/models/user/schema.js b/website/server/models/user/schema.js index 4db85dcc6b..b4d1d14633 100644 --- a/website/server/models/user/schema.js +++ b/website/server/models/user/schema.js @@ -162,6 +162,7 @@ export default new Schema({ text: String, // a markdown textarea to list their contributions + links contributions: String, + // user can own Critical Hammer of Bug-Crushing if this has a truthy value critical: String, },