Compare commits
29 Commits
v5.40.2
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27f526a45e | ||
|
|
e2d2a05315 | ||
|
|
be041f734d | ||
|
|
c430d2279c | ||
|
|
ef592cf35f | ||
|
|
f24cd10a79 | ||
|
|
2cd4e45016 | ||
|
|
8aaff7ae23 | ||
|
|
69a9fb89ef | ||
|
|
e8eeb76cab | ||
|
|
2029739a1b | ||
|
|
5cef106ea5 | ||
|
|
e096d7ac42 | ||
|
|
6db998e726 | ||
|
|
29c658b042 | ||
|
|
66710b8f38 | ||
|
|
c77db3d625 | ||
|
|
c947fa97d9 | ||
|
|
b2b9702797 | ||
|
|
e92503f032 | ||
|
|
8faa5b0582 | ||
|
|
95494c685b | ||
|
|
10978d46ab | ||
|
|
447eb6a0c4 | ||
|
|
3dec49b72c | ||
|
|
472d03f276 | ||
|
|
fd9a27c3ab | ||
|
|
a5c1423837 | ||
|
|
e9829b8b60 |
@@ -73,7 +73,7 @@ export default async function processUsers () {
|
||||
break;
|
||||
} else {
|
||||
query._id = {
|
||||
$gt: users[users.length - 1],
|
||||
$gt: users[users.length - 1]._id,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
103
package-lock.json
generated
@@ -1,18 +1,17 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"version": "5.40.2",
|
||||
"version": "5.41.4",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "habitica",
|
||||
"version": "5.40.2",
|
||||
"version": "5.41.4",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.22.10",
|
||||
"@babel/preset-env": "^7.22.10",
|
||||
"@babel/register": "^7.22.15",
|
||||
"@google-analytics/data": "^4.12.1",
|
||||
"@google-cloud/trace-agent": "^7.1.2",
|
||||
"@parse/node-apn": "^5.2.3",
|
||||
"@slack/webhook": "^6.1.0",
|
||||
@@ -1975,17 +1974,6 @@
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
|
||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
|
||||
},
|
||||
"node_modules/@google-analytics/data": {
|
||||
"version": "4.12.1",
|
||||
"resolved": "https://registry.npmjs.org/@google-analytics/data/-/data-4.12.1.tgz",
|
||||
"integrity": "sha512-LzyrkVrnVUTYTmdmHayOZoroc+YA9GHEUrkSSuiXSmMSNbesuWy/MoTXugC1V7+8PCGqb2eQ1UtVVv/2BCAQYA==",
|
||||
"dependencies": {
|
||||
"google-gax": "^4.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@google-cloud/common": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz",
|
||||
@@ -2329,6 +2317,7 @@
|
||||
"version": "1.10.8",
|
||||
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz",
|
||||
"integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@grpc/proto-loader": "^0.7.13",
|
||||
"@js-sdsl/ordered-map": "^4.4.2"
|
||||
@@ -2341,6 +2330,7 @@
|
||||
"version": "0.7.13",
|
||||
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz",
|
||||
"integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"lodash.camelcase": "^4.3.0",
|
||||
"long": "^5.0.0",
|
||||
@@ -2358,6 +2348,7 @@
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"color-convert": "^2.0.1"
|
||||
},
|
||||
@@ -2372,6 +2363,7 @@
|
||||
"version": "8.0.1",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
|
||||
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"string-width": "^4.2.0",
|
||||
"strip-ansi": "^6.0.1",
|
||||
@@ -2385,6 +2377,7 @@
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"color-name": "~1.1.4"
|
||||
},
|
||||
@@ -2395,12 +2388,14 @@
|
||||
"node_modules/@grpc/proto-loader/node_modules/color-name": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@grpc/proto-loader/node_modules/get-caller-file": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
|
||||
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": "6.* || 8.* || >= 10.*"
|
||||
}
|
||||
@@ -2409,6 +2404,7 @@
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"ansi-styles": "^4.0.0",
|
||||
"string-width": "^4.1.0",
|
||||
@@ -2425,6 +2421,7 @@
|
||||
"version": "5.0.8",
|
||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
|
||||
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
@@ -2433,6 +2430,7 @@
|
||||
"version": "17.7.2",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
|
||||
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"cliui": "^8.0.1",
|
||||
"escalade": "^3.1.1",
|
||||
@@ -2450,6 +2448,7 @@
|
||||
"version": "21.1.1",
|
||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
|
||||
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
@@ -2620,6 +2619,7 @@
|
||||
"version": "4.4.2",
|
||||
"resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
|
||||
"integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==",
|
||||
"optional": true,
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/js-sdsl"
|
||||
@@ -2932,27 +2932,32 @@
|
||||
"node_modules/@protobufjs/aspromise": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
|
||||
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
|
||||
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@protobufjs/base64": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
|
||||
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
|
||||
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@protobufjs/codegen": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
|
||||
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
|
||||
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@protobufjs/eventemitter": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
|
||||
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
|
||||
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@protobufjs/fetch": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
|
||||
"integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@protobufjs/aspromise": "^1.1.1",
|
||||
"@protobufjs/inquire": "^1.1.0"
|
||||
@@ -2961,27 +2966,32 @@
|
||||
"node_modules/@protobufjs/float": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
|
||||
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
|
||||
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@protobufjs/inquire": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
|
||||
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
|
||||
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@protobufjs/path": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
|
||||
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
|
||||
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@protobufjs/pool": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
|
||||
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
|
||||
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@protobufjs/utf8": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
|
||||
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
|
||||
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@sindresorhus/is": {
|
||||
"version": "4.6.0",
|
||||
@@ -3116,7 +3126,8 @@
|
||||
"node_modules/@types/caseless": {
|
||||
"version": "0.12.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz",
|
||||
"integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg=="
|
||||
"integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@types/connect": {
|
||||
"version": "3.4.38",
|
||||
@@ -3219,7 +3230,8 @@
|
||||
"node_modules/@types/long": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
|
||||
"integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
|
||||
"integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@types/mime": {
|
||||
"version": "1.3.5",
|
||||
@@ -3269,6 +3281,7 @@
|
||||
"version": "2.48.12",
|
||||
"resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz",
|
||||
"integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@types/caseless": "*",
|
||||
"@types/node": "*",
|
||||
@@ -3280,6 +3293,7 @@
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
|
||||
"integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.6",
|
||||
@@ -3319,7 +3333,8 @@
|
||||
"node_modules/@types/tough-cookie": {
|
||||
"version": "4.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
|
||||
"integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="
|
||||
"integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@types/triple-beam": {
|
||||
"version": "1.3.5",
|
||||
@@ -3529,6 +3544,7 @@
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
|
||||
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"event-target-shim": "^5.0.0"
|
||||
},
|
||||
@@ -6070,9 +6086,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"version": "1.1.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
@@ -9346,6 +9363,7 @@
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
|
||||
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
@@ -11431,9 +11449,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/glob/node_modules/brace-expansion": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0"
|
||||
}
|
||||
@@ -11597,6 +11616,7 @@
|
||||
"version": "4.3.3",
|
||||
"resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.3.tgz",
|
||||
"integrity": "sha512-f4F2Y9X4+mqsrJuLZsuTljYuQpcBnQsCt9ScvZpdM8jGjqrcxyJi5JUiqtq0jtpdHVPzyit0N7f5t07e+kH5EA==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@grpc/grpc-js": "~1.10.3",
|
||||
"@grpc/proto-loader": "^0.7.0",
|
||||
@@ -11619,6 +11639,7 @@
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
|
||||
"integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"debug": "^4.3.4"
|
||||
},
|
||||
@@ -11630,6 +11651,7 @@
|
||||
"version": "6.6.0",
|
||||
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.6.0.tgz",
|
||||
"integrity": "sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"extend": "^3.0.2",
|
||||
"https-proxy-agent": "^7.0.1",
|
||||
@@ -11645,6 +11667,7 @@
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz",
|
||||
"integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"gaxios": "^6.0.0",
|
||||
"json-bigint": "^1.0.0"
|
||||
@@ -11657,6 +11680,7 @@
|
||||
"version": "9.10.0",
|
||||
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.10.0.tgz",
|
||||
"integrity": "sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"base64-js": "^1.3.0",
|
||||
"ecdsa-sig-formatter": "^1.0.11",
|
||||
@@ -11673,6 +11697,7 @@
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
|
||||
"integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"gaxios": "^6.0.0",
|
||||
"jws": "^4.0.0"
|
||||
@@ -11685,6 +11710,7 @@
|
||||
"version": "7.0.4",
|
||||
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
|
||||
"integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"agent-base": "^7.0.2",
|
||||
"debug": "4"
|
||||
@@ -11698,6 +11724,7 @@
|
||||
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz",
|
||||
"integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==",
|
||||
"hasInstallScript": true,
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@protobufjs/aspromise": "^1.1.2",
|
||||
"@protobufjs/base64": "^1.1.2",
|
||||
@@ -11720,6 +11747,7 @@
|
||||
"version": "7.0.2",
|
||||
"resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
|
||||
"integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@types/request": "^2.48.8",
|
||||
"extend": "^3.0.2",
|
||||
@@ -11733,6 +11761,7 @@
|
||||
"version": "9.0.0",
|
||||
"resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
|
||||
"integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"http-proxy-agent": "^5.0.0",
|
||||
"https-proxy-agent": "^5.0.0",
|
||||
@@ -11748,6 +11777,7 @@
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
|
||||
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"debug": "4"
|
||||
},
|
||||
@@ -11759,6 +11789,7 @@
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
|
||||
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"agent-base": "6",
|
||||
"debug": "4"
|
||||
@@ -14237,7 +14268,8 @@
|
||||
"node_modules/lodash.camelcase": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
|
||||
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
|
||||
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/lodash.clonedeep": {
|
||||
"version": "4.5.0",
|
||||
@@ -16660,6 +16692,7 @@
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
|
||||
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
@@ -17882,6 +17915,7 @@
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz",
|
||||
"integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"protobufjs": "^7.2.5"
|
||||
},
|
||||
@@ -17894,6 +17928,7 @@
|
||||
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz",
|
||||
"integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==",
|
||||
"hasInstallScript": true,
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@protobufjs/aspromise": "^1.1.2",
|
||||
"@protobufjs/base64": "^1.1.2",
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "5.40.2",
|
||||
"version": "5.41.4",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.22.10",
|
||||
"@babel/preset-env": "^7.22.10",
|
||||
"@babel/register": "^7.22.15",
|
||||
"@google-analytics/data": "^4.12.1",
|
||||
"@google-cloud/trace-agent": "^7.1.2",
|
||||
"@parse/node-apn": "^5.2.3",
|
||||
"@slack/webhook": "^6.1.0",
|
||||
|
||||
@@ -150,7 +150,7 @@ describe('emails', () => {
|
||||
|
||||
sendTxn(mailingInfo, emailType);
|
||||
expect(got.post).to.be.called;
|
||||
expect(got.post).to.be.calledWith('undefined/job', sinon.match({
|
||||
expect(got.post).to.be.calledWith('http://example.com/job', sinon.match({
|
||||
json: {
|
||||
data: {
|
||||
emailType: sinon.match.same(emailType),
|
||||
@@ -234,7 +234,7 @@ describe('emails', () => {
|
||||
|
||||
sendTxn(mailingInfo, emailType);
|
||||
expect(got.post).to.be.called;
|
||||
expect(got.post).to.be.calledWith('undefined/job', sinon.match({
|
||||
expect(got.post).to.be.calledWith('http://example.com/job', sinon.match({
|
||||
json: {
|
||||
data: {
|
||||
emailType: sinon.match.same(emailType),
|
||||
@@ -254,7 +254,7 @@ describe('emails', () => {
|
||||
|
||||
sendTxn(mailingInfo, emailType, variables);
|
||||
expect(got.post).to.be.called;
|
||||
expect(got.post).to.be.calledWith('undefined/job', sinon.match({
|
||||
expect(got.post).to.be.calledWith('http://example.com/job', sinon.match({
|
||||
json: {
|
||||
data: {
|
||||
variables: sinon.match(value => value[0].name === 'BASE_URL', 'matches variables'),
|
||||
|
||||
@@ -47,6 +47,12 @@ describe('highlightMentions', () => {
|
||||
expect(result[0]).to.equal('[@user-dash](/profile/444): message [@user_underscore](/profile/555)');
|
||||
});
|
||||
|
||||
it('highlights users with case-insensitive matching', async () => {
|
||||
const text = '@USER: message @User2 @USER3';
|
||||
const result = await highlightMentions(text);
|
||||
expect(result[0]).to.equal('[@USER](/profile/111): message [@User2](/profile/222) [@USER3](/profile/333)');
|
||||
});
|
||||
|
||||
it('doesn\'t highlight nonexisting users', async () => {
|
||||
const text = '@nouser message';
|
||||
const result = await highlightMentions(text);
|
||||
|
||||
@@ -12,11 +12,33 @@ const { i18n } = common;
|
||||
describe('Apple Payments', () => {
|
||||
const subKey = 'basic_3mo';
|
||||
|
||||
let iapSetupStub;
|
||||
let iapValidateStub;
|
||||
let iapIsValidatedStub;
|
||||
let iapIsCanceledStub;
|
||||
let iapIsExpiredStub;
|
||||
let paymentBuySkuStub;
|
||||
let iapGetPurchaseDataStub;
|
||||
let validateGiftMessageStub;
|
||||
let paymentsCreateSubscritionStub;
|
||||
|
||||
beforeEach(() => {
|
||||
iapSetupStub = sinon.stub(iap, 'setup').resolves();
|
||||
iapValidateStub = sinon.stub(iap, 'validate').resolves({});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
iap.setup.restore();
|
||||
iap.validate.restore();
|
||||
iap.isValidated.restore();
|
||||
iap.isExpired.restore();
|
||||
iap.isCanceled.restore();
|
||||
iap.getPurchaseData.restore();
|
||||
});
|
||||
|
||||
describe('verifyPurchase', () => {
|
||||
let sku; let user; let token; let receipt; let
|
||||
headers;
|
||||
let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let paymentBuySkuStub; let
|
||||
iapGetPurchaseDataStub; let validateGiftMessageStub;
|
||||
|
||||
beforeEach(() => {
|
||||
token = 'testToken';
|
||||
@@ -25,13 +47,9 @@ describe('Apple Payments', () => {
|
||||
receipt = `{"token": "${token}", "productId": "${sku}"}`;
|
||||
headers = {};
|
||||
|
||||
iapSetupStub = sinon.stub(iap, 'setup')
|
||||
.resolves();
|
||||
iapValidateStub = sinon.stub(iap, 'validate')
|
||||
.resolves({});
|
||||
iapIsValidatedStub = sinon.stub(iap, 'isValidated').returns(true);
|
||||
sinon.stub(iap, 'isExpired').returns(false);
|
||||
sinon.stub(iap, 'isCanceled').returns(false);
|
||||
iapIsCanceledStub = sinon.stub(iap, 'isCanceled').returns(false);
|
||||
iapIsExpiredStub = sinon.stub(iap, 'isExpired').returns(false);
|
||||
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')
|
||||
.returns([{
|
||||
productId: 'com.habitrpg.ios.Habitica.21gems',
|
||||
@@ -42,12 +60,6 @@ describe('Apple Payments', () => {
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
iap.setup.restore();
|
||||
iap.validate.restore();
|
||||
iap.isValidated.restore();
|
||||
iap.isExpired.restore();
|
||||
iap.isCanceled.restore();
|
||||
iap.getPurchaseData.restore();
|
||||
payments.buySkuItem.restore();
|
||||
gems.validateGiftMessage.restore();
|
||||
});
|
||||
@@ -209,9 +221,6 @@ describe('Apple Payments', () => {
|
||||
describe('subscribe', () => {
|
||||
let sub; let sku; let user; let token; let receipt; let headers; let
|
||||
nextPaymentProcessing;
|
||||
let iapSetupStub; let iapValidateStub; let iapIsValidatedStub;
|
||||
let paymentsCreateSubscritionStub; let
|
||||
iapGetPurchaseDataStub;
|
||||
|
||||
beforeEach(() => {
|
||||
sub = common.content.subscriptionBlocks[subKey];
|
||||
@@ -223,12 +232,10 @@ describe('Apple Payments', () => {
|
||||
nextPaymentProcessing = moment.utc().add({ days: 2 });
|
||||
user = new User();
|
||||
|
||||
iapSetupStub = sinon.stub(iap, 'setup')
|
||||
.resolves();
|
||||
iapValidateStub = sinon.stub(iap, 'validate')
|
||||
.resolves({});
|
||||
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
||||
.returns(true);
|
||||
iapIsCanceledStub = sinon.stub(iap, 'isCanceled').returns(false);
|
||||
iapIsExpiredStub = sinon.stub(iap, 'isExpired').returns(false);
|
||||
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')
|
||||
.returns([{
|
||||
expirationDate: moment.utc().subtract({ day: 1 }).toDate(),
|
||||
@@ -250,10 +257,6 @@ describe('Apple Payments', () => {
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
iap.setup.restore();
|
||||
iap.validate.restore();
|
||||
iap.isValidated.restore();
|
||||
iap.getPurchaseData.restore();
|
||||
if (payments.createSubscription.restore) payments.createSubscription.restore();
|
||||
});
|
||||
|
||||
@@ -270,6 +273,29 @@ describe('Apple Payments', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('should throw an error if no active subscription is found', async () => {
|
||||
iap.isCanceled.restore();
|
||||
iapIsCanceledStub = sinon.stub(iap, 'isCanceled')
|
||||
.returns(true);
|
||||
|
||||
iap.getPurchaseData.restore();
|
||||
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')
|
||||
.returns([{
|
||||
expirationDate: moment.utc().add({ day: -2 }).toDate(),
|
||||
purchaseDate: new Date(),
|
||||
productId: 'subscription1month',
|
||||
transactionId: token,
|
||||
originalTransactionId: token,
|
||||
}]);
|
||||
|
||||
await expect(applePayments.subscribe(user, receipt, headers, nextPaymentProcessing))
|
||||
.to.eventually.be.rejected.and.to.eql({
|
||||
httpCode: 401,
|
||||
name: 'NotAuthorized',
|
||||
message: applePayments.constants.RESPONSE_NO_ITEM_PURCHASED,
|
||||
});
|
||||
});
|
||||
|
||||
const subOptions = [
|
||||
{
|
||||
sku: 'subscription1month',
|
||||
@@ -574,8 +600,7 @@ describe('Apple Payments', () => {
|
||||
describe('cancelSubscribe ', () => {
|
||||
let user; let token; let receipt; let headers; let customerId; let
|
||||
expirationDate;
|
||||
let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let iapGetPurchaseDataStub; let
|
||||
paymentCancelSubscriptionSpy;
|
||||
let paymentCancelSubscriptionSpy;
|
||||
|
||||
beforeEach(async () => {
|
||||
token = 'test-token';
|
||||
@@ -584,8 +609,7 @@ describe('Apple Payments', () => {
|
||||
customerId = 'test-customerId';
|
||||
expirationDate = moment.utc();
|
||||
|
||||
iapSetupStub = sinon.stub(iap, 'setup')
|
||||
.resolves();
|
||||
iapValidateStub.restore();
|
||||
iapValidateStub = sinon.stub(iap, 'validate')
|
||||
.resolves({
|
||||
expirationDate,
|
||||
@@ -593,8 +617,8 @@ describe('Apple Payments', () => {
|
||||
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')
|
||||
.returns([{ expirationDate: expirationDate.toDate() }]);
|
||||
iapIsValidatedStub = sinon.stub(iap, 'isValidated').returns(true);
|
||||
sinon.stub(iap, 'isCanceled').returns(false);
|
||||
sinon.stub(iap, 'isExpired').returns(true);
|
||||
iapIsCanceledStub = sinon.stub(iap, 'isCanceled').returns(false);
|
||||
iapIsExpiredStub = sinon.stub(iap, 'isExpired').returns(true);
|
||||
user = new User();
|
||||
user.profile.name = 'sender';
|
||||
user.purchased.plan.paymentMethod = applePayments.constants.PAYMENT_METHOD_APPLE;
|
||||
@@ -606,13 +630,7 @@ describe('Apple Payments', () => {
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
iap.setup.restore();
|
||||
iap.validate.restore();
|
||||
iap.isValidated.restore();
|
||||
iap.isExpired.restore();
|
||||
iap.isCanceled.restore();
|
||||
iap.getPurchaseData.restore();
|
||||
payments.cancelSubscription.restore();
|
||||
paymentCancelSubscriptionSpy.restore();
|
||||
});
|
||||
|
||||
it('should throw an error if we are missing a subscription', async () => {
|
||||
@@ -695,6 +713,8 @@ describe('Apple Payments', () => {
|
||||
expect(iapIsValidatedStub).to.be.calledWith({
|
||||
expirationDate,
|
||||
});
|
||||
expect(iapIsCanceledStub).to.be.calledOnce;
|
||||
expect(iapIsExpiredStub).to.be.calledOnce;
|
||||
expect(iapGetPurchaseDataStub).to.be.calledOnce;
|
||||
|
||||
expect(paymentCancelSubscriptionSpy).to.be.calledOnce;
|
||||
|
||||
@@ -11,12 +11,36 @@ const { i18n } = common;
|
||||
|
||||
describe('Google Payments', () => {
|
||||
const subKey = 'basic_3mo';
|
||||
let iapSetupStub;
|
||||
let iapValidateStub;
|
||||
let iapIsValidatedStub;
|
||||
let paymentBuySkuStub;
|
||||
let validateGiftMessageStub;
|
||||
|
||||
beforeEach(() => {
|
||||
iapSetupStub = sinon.stub(iap, 'setup')
|
||||
.resolves();
|
||||
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
||||
.returns(true);
|
||||
sinon.stub(iap, 'isCanceled').returns(false);
|
||||
sinon.stub(iap, 'isExpired').returns(false);
|
||||
paymentBuySkuStub = sinon.stub(payments, 'buySkuItem').resolves({});
|
||||
validateGiftMessageStub = sinon.stub(gems, 'validateGiftMessage');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
iap.setup.restore();
|
||||
iap.validate.restore();
|
||||
iap.isValidated.restore();
|
||||
iap.isCanceled.restore();
|
||||
iap.isExpired.restore();
|
||||
payments.buySkuItem.restore();
|
||||
gems.validateGiftMessage.restore();
|
||||
});
|
||||
|
||||
describe('verifyPurchase', () => {
|
||||
let sku; let user; let token; let receipt; let signature; let
|
||||
headers;
|
||||
let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let
|
||||
paymentBuySkuStub; let validateGiftMessageStub;
|
||||
|
||||
beforeEach(() => {
|
||||
sku = 'com.habitrpg.android.habitica.iap.21gems';
|
||||
@@ -25,21 +49,7 @@ describe('Google Payments', () => {
|
||||
signature = '';
|
||||
headers = {};
|
||||
|
||||
iapSetupStub = sinon.stub(iap, 'setup')
|
||||
.resolves();
|
||||
iapValidateStub = sinon.stub(iap, 'validate').resolves({ productId: sku });
|
||||
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
||||
.returns(true);
|
||||
paymentBuySkuStub = sinon.stub(payments, 'buySkuItem').resolves({});
|
||||
validateGiftMessageStub = sinon.stub(gems, 'validateGiftMessage');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
iap.setup.restore();
|
||||
iap.validate.restore();
|
||||
iap.isValidated.restore();
|
||||
payments.buySkuItem.restore();
|
||||
gems.validateGiftMessage.restore();
|
||||
});
|
||||
|
||||
it('should throw an error if receipt is invalid', async () => {
|
||||
@@ -160,8 +170,7 @@ describe('Google Payments', () => {
|
||||
describe('subscribe', () => {
|
||||
let sub; let sku; let user; let token; let receipt; let signature; let headers; let
|
||||
nextPaymentProcessing;
|
||||
let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let
|
||||
paymentsCreateSubscritionStub;
|
||||
let paymentsCreateSubscritionStub;
|
||||
|
||||
beforeEach(() => {
|
||||
sub = common.content.subscriptionBlocks[subKey];
|
||||
@@ -173,19 +182,12 @@ describe('Google Payments', () => {
|
||||
signature = '';
|
||||
nextPaymentProcessing = moment.utc().add({ days: 2 });
|
||||
|
||||
iapSetupStub = sinon.stub(iap, 'setup')
|
||||
.resolves();
|
||||
iapValidateStub = sinon.stub(iap, 'validate')
|
||||
.resolves({});
|
||||
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
||||
.returns(true);
|
||||
paymentsCreateSubscritionStub = sinon.stub(payments, 'createSubscription').resolves({});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
iap.setup.restore();
|
||||
iap.validate.restore();
|
||||
iap.isValidated.restore();
|
||||
payments.createSubscription.restore();
|
||||
});
|
||||
|
||||
@@ -243,7 +245,7 @@ describe('Google Payments', () => {
|
||||
describe('cancelSubscribe ', () => {
|
||||
let user; let token; let receipt; let signature; let headers; let customerId; let
|
||||
expirationDate;
|
||||
let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let iapGetPurchaseDataStub; let
|
||||
let iapGetPurchaseDataStub; let
|
||||
paymentCancelSubscriptionSpy;
|
||||
|
||||
beforeEach(async () => {
|
||||
@@ -253,17 +255,12 @@ describe('Google Payments', () => {
|
||||
signature = '';
|
||||
customerId = 'test-customerId';
|
||||
expirationDate = moment.utc();
|
||||
|
||||
iapSetupStub = sinon.stub(iap, 'setup')
|
||||
.resolves();
|
||||
iapValidateStub = sinon.stub(iap, 'validate')
|
||||
.resolves({
|
||||
expirationDate,
|
||||
});
|
||||
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')
|
||||
.returns([{ expirationDate: expirationDate.toDate(), autoRenewing: false }]);
|
||||
iapIsValidatedStub = sinon.stub(iap, 'isValidated')
|
||||
.returns(true);
|
||||
|
||||
user = new User();
|
||||
user.profile.name = 'sender';
|
||||
@@ -276,9 +273,6 @@ describe('Google Payments', () => {
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
iap.setup.restore();
|
||||
iap.validate.restore();
|
||||
iap.isValidated.restore();
|
||||
iap.getPurchaseData.restore();
|
||||
payments.cancelSubscription.restore();
|
||||
});
|
||||
@@ -308,6 +302,8 @@ describe('Google Payments', () => {
|
||||
});
|
||||
|
||||
it('should cancel a user subscription', async () => {
|
||||
iap.isCanceled.restore();
|
||||
iap.isCanceled = sinon.stub(iap, 'isCanceled').returns(true);
|
||||
await googlePayments.cancelSubscribe(user, headers);
|
||||
|
||||
expect(iapSetupStub).to.be.calledOnce;
|
||||
@@ -332,11 +328,20 @@ describe('Google Payments', () => {
|
||||
});
|
||||
|
||||
it('should cancel a user subscription with multiple inactive subscriptions', async () => {
|
||||
iap.isCanceled.restore();
|
||||
iap.isCanceled = sinon.stub(iap, 'isCanceled').returns(true);
|
||||
const laterDate = moment.utc().add(7, 'days');
|
||||
iap.getPurchaseData.restore();
|
||||
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')
|
||||
.returns([{ expirationDate, autoRenewing: false },
|
||||
{ expirationDate: laterDate, autoRenewing: false },
|
||||
.returns([{
|
||||
startTimeMillis: expirationDate.valueOf(),
|
||||
expirationDate,
|
||||
autoRenewing: false,
|
||||
}, {
|
||||
startTimeMillis: laterDate.valueOf(),
|
||||
expirationDate: laterDate,
|
||||
autoRenewing: false,
|
||||
},
|
||||
]);
|
||||
await googlePayments.cancelSubscribe(user, headers);
|
||||
|
||||
@@ -365,7 +370,12 @@ describe('Google Payments', () => {
|
||||
iap.getPurchaseData.restore();
|
||||
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')
|
||||
.returns([{ autoRenewing: true }]);
|
||||
await googlePayments.cancelSubscribe(user, headers);
|
||||
await expect(googlePayments.cancelSubscribe(user, headers))
|
||||
.to.eventually.be.rejected.and.to.eql({
|
||||
httpCode: 401,
|
||||
name: 'NotAuthorized',
|
||||
message: googlePayments.constants.RESPONSE_STILL_VALID,
|
||||
});
|
||||
|
||||
expect(iapSetupStub).to.be.calledOnce;
|
||||
expect(iapValidateStub).to.be.calledOnce;
|
||||
@@ -388,8 +398,12 @@ describe('Google Payments', () => {
|
||||
.returns([{ expirationDate, autoRenewing: false },
|
||||
{ autoRenewing: true },
|
||||
{ expirationDate, autoRenewing: false }]);
|
||||
await googlePayments.cancelSubscribe(user, headers);
|
||||
|
||||
await expect(googlePayments.cancelSubscribe(user, headers))
|
||||
.to.eventually.be.rejected.and.to.eql({
|
||||
httpCode: 401,
|
||||
name: 'NotAuthorized',
|
||||
message: googlePayments.constants.RESPONSE_STILL_VALID,
|
||||
});
|
||||
expect(iapSetupStub).to.be.calledOnce;
|
||||
expect(iapValidateStub).to.be.calledOnce;
|
||||
expect(iapValidateStub).to.be.calledWith(iap.GOOGLE, {
|
||||
|
||||
@@ -238,6 +238,18 @@ describe('POST /chat', () => {
|
||||
expect(groupMessages[0].id).to.exist;
|
||||
});
|
||||
|
||||
it('creates a chat with case-insensitive mentions', async () => {
|
||||
const originalUsername = member.auth.local.username;
|
||||
const uppercaseUsername = originalUsername.toUpperCase();
|
||||
const messageWithMentions = `hi @${uppercaseUsername}`;
|
||||
const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: messageWithMentions });
|
||||
const groupMessages = await user.get(`/groups/${groupWithChat._id}/chat`);
|
||||
|
||||
expect(newMessage.message.id).to.exist;
|
||||
expect(newMessage.message.text).to.include(`[@${uppercaseUsername}](/profile/${member._id})`);
|
||||
expect(groupMessages[0].id).to.exist;
|
||||
});
|
||||
|
||||
it('creates a chat with a max length of 3000 chars', async () => {
|
||||
const veryLongMessage = `
|
||||
123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789.
|
||||
|
||||
@@ -44,7 +44,7 @@ describe('POST /user/auth/local/login', () => {
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('accountSuspended', { communityManagerEmail: nconf.get('EMAILS_COMMUNITY_MANAGER_EMAIL'), userId: user._id }),
|
||||
message: t('accountSuspended', { communityManagerEmail: nconf.get('EMAILS_COMMUNITY_MANAGER_EMAIL'), userId: user._id, username: user.auth.local.username }),
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
62
website/client/package-lock.json
generated
@@ -23,7 +23,6 @@
|
||||
"eslint-config-habitrpg": "6.2.0",
|
||||
"eslint-plugin-mocha": "5.3.0",
|
||||
"eslint-plugin-vue": "7.20.0",
|
||||
"ga-gtag": "^1.2.0",
|
||||
"habitica-markdown": "^3.0.0",
|
||||
"hellojs": "^1.20.0",
|
||||
"intro.js": "^7.2.0",
|
||||
@@ -38,7 +37,7 @@
|
||||
"timers-browserify": "^2.0.12",
|
||||
"uuid": "^9.0.1",
|
||||
"validator": "^13.9.0",
|
||||
"vite": "^6.0.0",
|
||||
"vite": "^6.3.6",
|
||||
"vite-plugin-compression2": "^1.3.3",
|
||||
"vue": "^2.7.10",
|
||||
"vue-fragment": "^1.6.0",
|
||||
@@ -54,7 +53,7 @@
|
||||
"inspectpack": "^4.7.1",
|
||||
"jsdom": "^26.0.0",
|
||||
"mocha": "^11.1.0",
|
||||
"playwright": "^1.50.1",
|
||||
"playwright": "^1.56.1",
|
||||
"terser-webpack-plugin": "^5.3.10",
|
||||
"vitest": "^3.0.5",
|
||||
"webpack": "^5.94.0"
|
||||
@@ -5123,6 +5122,20 @@
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
|
||||
},
|
||||
"node_modules/fsevents": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/function-bind": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||
@@ -5161,11 +5174,6 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/ga-gtag": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ga-gtag/-/ga-gtag-1.2.0.tgz",
|
||||
"integrity": "sha512-j9gxutMdpGMdwaX1SzOG31Ddm+IGFjeNf+N3Z5g+BBpS8FSXOALlrM+ORIGc/QKszGJEDlw+6PfIsJZICsqsGQ=="
|
||||
},
|
||||
"node_modules/gensync": {
|
||||
"version": "1.0.0-beta.2",
|
||||
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
|
||||
@@ -7097,12 +7105,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/playwright": {
|
||||
"version": "1.53.0",
|
||||
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.0.tgz",
|
||||
"integrity": "sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==",
|
||||
"version": "1.56.1",
|
||||
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz",
|
||||
"integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"playwright-core": "1.53.0"
|
||||
"playwright-core": "1.56.1"
|
||||
},
|
||||
"bin": {
|
||||
"playwright": "cli.js"
|
||||
@@ -7115,10 +7124,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/playwright-core": {
|
||||
"version": "1.53.0",
|
||||
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.0.tgz",
|
||||
"integrity": "sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==",
|
||||
"version": "1.56.1",
|
||||
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz",
|
||||
"integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"playwright-core": "cli.js"
|
||||
},
|
||||
@@ -7126,6 +7136,21 @@
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/playwright/node_modules/fsevents": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
||||
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/popper.js": {
|
||||
"version": "1.16.1",
|
||||
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
|
||||
@@ -8528,9 +8553,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "6.3.5",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
|
||||
"integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
|
||||
"version": "6.3.6",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz",
|
||||
"integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "^0.25.0",
|
||||
"fdir": "^6.4.4",
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
"eslint-config-habitrpg": "6.2.0",
|
||||
"eslint-plugin-mocha": "5.3.0",
|
||||
"eslint-plugin-vue": "7.20.0",
|
||||
"ga-gtag": "^1.2.0",
|
||||
"habitica-markdown": "^3.0.0",
|
||||
"hellojs": "^1.20.0",
|
||||
"intro.js": "^7.2.0",
|
||||
@@ -42,7 +41,7 @@
|
||||
"timers-browserify": "^2.0.12",
|
||||
"uuid": "^9.0.1",
|
||||
"validator": "^13.9.0",
|
||||
"vite": "^6.0.0",
|
||||
"vite": "^6.3.6",
|
||||
"vite-plugin-compression2": "^1.3.3",
|
||||
"vue": "^2.7.10",
|
||||
"vue-fragment": "^1.6.0",
|
||||
@@ -58,7 +57,7 @@
|
||||
"inspectpack": "^4.7.1",
|
||||
"jsdom": "^26.0.0",
|
||||
"mocha": "^11.1.0",
|
||||
"playwright": "^1.50.1",
|
||||
"playwright": "^1.56.1",
|
||||
"terser-webpack-plugin": "^5.3.10",
|
||||
"vitest": "^3.0.5",
|
||||
"webpack": "^5.94.0"
|
||||
|
||||
@@ -203,6 +203,9 @@ export default {
|
||||
|
||||
return response;
|
||||
}, error => { // Set up Error interceptors
|
||||
if (!error.response) {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
if (error.response.status >= 400) {
|
||||
const isBanned = this.checkForBannedUser(error);
|
||||
if (isBanned === true) return null; // eslint-disable-line consistent-return
|
||||
|
||||
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 11 KiB |
9
website/client/src/assets/images/gifts_bg.svg
Normal file
@@ -0,0 +1,9 @@
|
||||
<svg width="378" height="176" viewBox="0 0 378 176" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0 0H378V174C378 175.105 377.105 176 376 176H1.99999C0.895423 176 0 175.105 0 174V0Z" fill="url(#paint0_linear_2257_239)"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_2257_239" x1="378" y1="0" x2="0" y2="0" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#925CF3"/>
|
||||
<stop offset="1" stop-color="#34B5C1"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 448 B |
37
website/client/src/assets/images/gifts_start.svg
Normal file
@@ -0,0 +1,37 @@
|
||||
<svg width="48" height="96" viewBox="0 0 48 96" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M-3.10104 12.0483C-2.82088 9.43721 -3.53422 6.57214 -5.6115 5.24584C-7.68877 3.91954 -9.89543 4.92709 -10.1422 6.808C-10.3891 8.68891 -9.06061 9.83066 -4.97737 13.9337C-3.81821 15.0985 -3.3812 14.6594 -3.10104 12.0483Z" stroke="#FFA624" stroke-width="4"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.34089 15.2054C4.45116 13.6561 7.27707 12.8443 9.45877 13.9889C11.6405 15.1334 11.8754 17.5575 10.3778 18.7127C8.88016 19.868 7.23193 19.2828 1.65411 17.781C0.0706697 17.3546 0.230624 16.7548 2.34089 15.2054Z" stroke="#FFBE5D" stroke-width="4"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.549002 12.0098C-3.61871 9.59194 -3.87667 15.8322 -2.20457 16.8023C-0.532473 17.7724 4.71671 14.4277 0.549002 12.0098Z" fill="#EE9109"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M-1.76917 16.0445L13.637 24.9825L9.18965 32.7229L-6.21656 23.785L-1.76917 16.0445Z" fill="#F8F9F9"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M-6.90457 13.0652L3.36623 19.0238L-1.08116 26.7643L-11.352 20.8057L-6.90457 13.0652Z" fill="#FFBE5D"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M-1.76917 16.0445L3.36623 19.0238L1.88377 21.604L-3.25163 18.6247L-1.76917 16.0445Z" fill="#FFA624"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M-6.21656 23.785L6.62195 31.2333L-3.75529 49.2944L-16.5938 41.8461L-6.21656 23.785Z" fill="#F8F9F9"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M-3.64886 25.2747L6.62195 31.2333L5.13948 33.8134L-5.13132 27.8548L-3.64886 25.2747Z" fill="#DDF3F3"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.401307 24.1842L10.6721 30.1428L9.18965 32.7229L-1.08116 26.7643L0.401307 24.1842Z" fill="#DDF3F3"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.7924 38.4607L17.9387 42.0519L21.31 40.5834L24.8838 41.4413L23.4225 38.0537L24.2762 34.4625L20.9049 35.9309L17.3311 35.0731L18.7924 38.4607Z" fill="white" fill-opacity="0.5"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M-3.93867 71.2331L-4.79238 74.8243L-1.42111 73.3559L2.15271 74.2137L0.691383 70.8261L1.54509 67.2349L-1.82618 68.7033L-5.4 67.8455L-3.93867 71.2331Z" fill="white" fill-opacity="0.5"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.8949 25.3807L35.0583 29.8802L37.9424 26.2452L42.4202 25.0761L38.8028 22.178L37.6393 17.6786L34.7552 21.3135L30.2775 22.4826L33.8949 25.3807Z" fill="white" fill-opacity="0.5"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.2596 71.999L40.579 68.1435L45.9507 88.2881L31.6312 92.1436L26.2596 71.999Z" fill="#F8F9F9"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.9401 75.8545L26.2589 71.9966L31.6273 92.1421L17.3084 96L11.9401 75.8545Z" fill="#DDF3F3"/>
|
||||
<rect width="2.96589" height="20.8485" transform="matrix(0.965611 -0.25999 0.257652 0.966238 23.3957 72.7701)" fill="#FFA624"/>
|
||||
<rect width="2.96589" height="20.8485" transform="matrix(0.965611 -0.25999 0.257652 0.966238 26.2596 71.999)" fill="#FFBE5D"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.9999 90.0369L30.8638 89.2658L31.6312 92.1436L28.7673 92.9147L27.9999 90.0369Z" fill="#EE9109"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.3957 72.7701L26.2596 71.999L27.0269 74.8768L24.163 75.6479L23.3957 72.7701Z" fill="#EE9109"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.9401 75.8545L23.3951 72.7682L24.162 75.6461L12.707 78.7325L11.9401 75.8545Z" fill="#C1E9E9"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.5443 93.1213L27.9999 90.0369L28.7673 92.9147L17.3117 95.9991L16.5443 93.1213Z" fill="#C1E9E9"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.1235 71.2279L40.579 68.1435L41.3464 71.0213L29.8908 74.1057L29.1235 71.2279Z" fill="#DDF3F3"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.7277 88.4947L45.1833 85.4103L45.9507 88.2881L34.4951 91.3725L33.7277 88.4947Z" fill="#DDF3F3"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M30.8638 89.2658L33.7277 88.4947L34.4951 91.3725L31.6312 92.1436L30.8638 89.2658Z" fill="#FFA624"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.2596 71.999L29.1235 71.2279L29.8908 74.1057L27.0269 74.8768L26.2596 71.999Z" fill="#FFA624"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.5224 56.3076C25.8087 53.7812 24.0792 51.3933 21.6588 50.9455C19.2383 50.4977 17.5679 52.2625 18.0403 54.0994C18.5126 55.9363 20.17 56.4948 25.4855 58.7621C26.9945 59.4057 27.236 58.834 26.5224 56.3076Z" stroke="#FFA624" stroke-width="4"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M32.745 57.1864C34.124 54.9555 36.4415 53.1391 38.8911 53.3791C41.3406 53.6191 42.4621 55.7782 41.5042 57.413C40.5463 59.0479 38.7999 59.1258 33.0684 59.8329C31.4413 60.0337 31.366 59.4173 32.745 57.1864Z" stroke="#FFBE5D" stroke-width="4"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.8923 54.898C25.1267 54.225 27.2139 60.108 29.1258 60.378C31.0378 60.648 34.6579 55.571 29.8923 54.898Z" fill="#EE9109"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.247 59.5115L46.8635 61.9994L45.6255 70.8503L28.0091 68.3625L29.247 59.5115Z" fill="#F8F9F9"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.6306 57.0236L29.247 59.5114L28.0091 68.3624L10.3927 65.8745L11.6306 57.0236Z" fill="#DDF3F3"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.3749 58.6822L35.1192 60.3408L33.8813 69.1917L22.137 67.5332L23.3749 58.6822Z" fill="#FFBE5D"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.3749 58.6822L29.247 59.5115L28.0091 68.3625L22.137 67.5332L23.3749 58.6822Z" fill="#FFA624"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.247 59.5115L35.1192 60.3408L34.7065 63.2911L28.8344 62.4618L29.247 59.5115Z" fill="#FFA624"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.3749 58.6822L29.247 59.5115L28.8344 62.4618L22.9622 61.6326L23.3749 58.6822Z" fill="#EE9109"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.8053 62.9241L22.5496 64.5827L22.137 67.533L10.3927 65.8745L10.8053 62.9241Z" fill="#C1E9E9"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M34.2939 66.2414L46.0382 67.9L45.6255 70.8503L33.8813 69.1917L34.2939 66.2414Z" fill="#DDF3F3"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.0 KiB |
@@ -30,12 +30,23 @@
|
||||
cursor: default;
|
||||
color: $gray-200;
|
||||
opacity: 1;
|
||||
box-shadow: none;
|
||||
background-color: $gray-700;
|
||||
background-color: transparent;
|
||||
border: 2px solid transparent;
|
||||
|
||||
box-shadow:
|
||||
0 1px 3px 0 rgba($black, 0.12),
|
||||
0 1px 2px 0 rgba($black, 0.24);
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-weight: 700;
|
||||
font-size: 14px;
|
||||
line-height: 24px;
|
||||
padding: 4px 12px;
|
||||
min-height: 32px;
|
||||
max-height: 32px;
|
||||
gap: 8px;
|
||||
border-radius: 4px;
|
||||
|
||||
.svg {
|
||||
color: $gray-300;
|
||||
color: $gray-200;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -123,6 +123,10 @@ h4 {
|
||||
background-color: $purple-300 !important;
|
||||
}
|
||||
|
||||
.bg-yellow-50 {
|
||||
background-color: $yellow-50 !important;
|
||||
}
|
||||
|
||||
.bg-white {
|
||||
background-color: $white !important;
|
||||
}
|
||||
|
||||
8
website/client/src/assets/svg/close-white.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g fill="#FFFFFF" fill-rule="nonzero">
|
||||
<polygon points="12.1973467 2 14 3.80265326 9.80187117 8 14 12.1973467 12.1973467 14 8 9.80187117 3.80265326 14 2 12.1973467 6.19812883 8 2 3.80265326 3.80265326 2 8 6.19812883"></polygon>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 504 B |
|
After Width: | Height: | Size: 5.4 KiB |
@@ -0,0 +1,29 @@
|
||||
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M58.1792 31.6843L46.8536 22.3769L23.918 28.6988L18.861 42.5218L44.341 58.5813L58.1792 31.6843Z" fill="#FF944C"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.6218 34.5148L46.1108 26.1328L36.2812 28.8422L46.6218 34.5148Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M30.2393 39.0304L26.4518 31.5515L36.2813 28.8422L30.2393 39.0304Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M46.6218 34.5148L36.2813 28.8422L30.2393 39.0304L46.6218 34.5148Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M53.8301 32.5279L46.1108 26.1328L46.6218 34.5148L53.8301 32.5279Z" fill="white"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M23.0309 41.0173L26.4518 31.5516L30.2393 39.0304L23.0309 41.0173Z" fill="#FA8537"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M53.8301 32.5279L46.6218 34.5148L43.0424 53.79L53.8301 32.5279Z" fill="#FA8537"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M23.0309 41.0173L30.2393 39.0304L43.0425 53.79L23.0309 41.0173Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.6218 34.5148L30.2393 39.0304L43.0425 53.79L46.6218 34.5148Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M50.555 4.15937L47.026 0.420004L38.7773 1.59601L36.4144 6.17539L44.5675 12.8919L50.555 4.15937Z" fill="#FFBE5D"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.414 4.62854L46.6034 1.6924L43.0682 2.1964L46.414 4.62854Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M40.5221 5.46854L39.5331 2.7004L43.0682 2.1964L40.5221 5.46854Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M46.414 4.62854L43.0683 2.1964L40.5221 5.46855L46.414 4.62854Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M49.0064 4.25894L46.6034 1.6924L46.414 4.62854L49.0064 4.25894Z" fill="white"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M37.9296 5.83815L39.5331 2.70041L40.5221 5.46855L37.9296 5.83815Z" fill="#FFA624"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M49.0064 4.25893L46.414 4.62853L44.3259 11.1688L49.0064 4.25893Z" fill="#FFA624"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M37.9297 5.83815L40.5221 5.46855L44.326 11.1688L37.9297 5.83815Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M46.414 4.62854L40.5221 5.46855L44.326 11.1688L46.414 4.62854Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.2986 16.7775L24.6513 8.36623L11.1016 3.94533L4.07056 9.19883L11.614 25.6769L27.2986 16.7775Z" fill="#FF6165"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M20.5864 14.3719L23.0573 10.0026L17.2502 8.10789L20.5864 14.3719Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M10.908 11.2141L11.4432 6.21322L17.2502 8.10789L10.908 11.2141Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M20.5864 14.3719L17.2502 8.10789L10.9081 11.2141L20.5864 14.3719Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M24.8449 15.7613L23.0573 10.0026L20.5864 14.3719L24.8449 15.7613Z" fill="white"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M6.64955 9.82464L11.4432 6.21321L10.908 11.2141L6.64955 9.82464Z" fill="#F23035"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M24.8449 15.7613L20.5864 14.3719L12.5221 22.8464L24.8449 15.7613Z" fill="#F23035"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M6.64959 9.82464L10.9081 11.2141L12.5221 22.8463L6.64959 9.82464Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M20.5864 14.3719L10.9081 11.2141L12.5221 22.8463L20.5864 14.3719Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
@@ -0,0 +1,29 @@
|
||||
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.82083 31.6843L17.1464 22.3769L40.082 28.6988L45.139 42.5218L19.659 58.5813L5.82083 31.6843Z" fill="#24CC8F"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.3782 34.5148L17.8892 26.1328L27.7188 28.8422L17.3782 34.5148Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M33.7607 39.0304L37.5482 31.5515L27.7187 28.8422L33.7607 39.0304Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17.3782 34.5148L27.7187 28.8422L33.7607 39.0304L17.3782 34.5148Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M10.1699 32.5279L17.8892 26.1328L17.3782 34.5148L10.1699 32.5279Z" fill="white"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M40.9691 41.0173L37.5482 31.5516L33.7607 39.0304L40.9691 41.0173Z" fill="#1CA372"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M10.1699 32.5279L17.3782 34.5148L20.9576 53.79L10.1699 32.5279Z" fill="#1CA372"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M40.9691 41.0173L33.7607 39.0304L20.9575 53.79L40.9691 41.0173Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.3782 34.5148L33.7607 39.0304L20.9575 53.79L17.3782 34.5148Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.445 4.15937L16.974 0.420004L25.2227 1.59601L27.5856 6.17539L19.4325 12.8919L13.445 4.15937Z" fill="#925CF3"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.586 4.62854L17.3966 1.6924L20.9318 2.1964L17.586 4.62854Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M23.4779 5.46854L24.4669 2.7004L20.9318 2.1964L23.4779 5.46854Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M17.586 4.62854L20.9317 2.1964L23.4779 5.46855L17.586 4.62854Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M14.9936 4.25894L17.3966 1.6924L17.586 4.62854L14.9936 4.25894Z" fill="white"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M26.0704 5.83815L24.4669 2.70041L23.4779 5.46855L26.0704 5.83815Z" fill="#4F2A93"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M14.9936 4.25893L17.586 4.62853L19.6741 11.1688L14.9936 4.25893Z" fill="#4F2A93"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M26.0703 5.83815L23.4779 5.46855L19.674 11.1688L26.0703 5.83815Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M17.586 4.62854L23.4779 5.46855L19.674 11.1688L17.586 4.62854Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M36.7014 16.7775L39.3487 8.36623L52.8984 3.94533L59.9294 9.19883L52.386 25.6769L36.7014 16.7775Z" fill="#50B5E9"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M43.4136 14.3719L40.9427 10.0026L46.7498 8.10789L43.4136 14.3719Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M53.092 11.2141L52.5568 6.21322L46.7498 8.10789L53.092 11.2141Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M43.4136 14.3719L46.7498 8.10789L53.0919 11.2141L43.4136 14.3719Z" fill="white"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M39.1551 15.7613L40.9427 10.0026L43.4136 14.3719L39.1551 15.7613Z" fill="white"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M57.3504 9.82464L52.5568 6.21321L53.092 11.2141L57.3504 9.82464Z" fill="#46A7D9"/>
|
||||
<path opacity="0.35" fill-rule="evenodd" clip-rule="evenodd" d="M39.1551 15.7613L43.4136 14.3719L51.4779 22.8464L39.1551 15.7613Z" fill="#46A7D9"/>
|
||||
<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M57.3504 9.82464L53.0919 11.2141L51.4779 22.8463L57.3504 9.82464Z" fill="white"/>
|
||||
<path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M43.4136 14.3719L53.0919 11.2141L51.4779 22.8463L43.4136 14.3719Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
@@ -117,7 +117,7 @@ export default {
|
||||
closeWithAction () {
|
||||
this.close();
|
||||
setTimeout(() => {
|
||||
this.$router.push({ name: 'achievements' });
|
||||
this.$router.push(`/profile/${this.$store.state.user.data._id}#achievements`);
|
||||
}, 200);
|
||||
},
|
||||
},
|
||||
|
||||
@@ -81,7 +81,7 @@ export default {
|
||||
watch: {
|
||||
userIdentifier () {
|
||||
this.isSearching = true;
|
||||
this.$store.dispatch('adminPanel:searchUsers', { userIdentifier: this.userIdentifier }).then(users => {
|
||||
this.$store.dispatch('admin:searchUsers', { userIdentifier: this.userIdentifier }).then(users => {
|
||||
this.isSearching = false;
|
||||
if (users.length === 1) {
|
||||
this.loadUser(users[0]._id);
|
||||
|
||||
@@ -5,6 +5,12 @@
|
||||
class="row"
|
||||
>
|
||||
<div class="form col-12">
|
||||
<button
|
||||
class="btn btn-danger mt-3 float-right"
|
||||
@click="confirmDeleteHero"
|
||||
>
|
||||
Begin Member deletion
|
||||
</button>
|
||||
<basic-details
|
||||
:user-id="hero._id"
|
||||
:auth="hero.auth"
|
||||
@@ -96,6 +102,53 @@
|
||||
:reset-counter="resetCounter"
|
||||
@clear-data="clearData"
|
||||
/>
|
||||
<b-modal
|
||||
id="delete-member-modal"
|
||||
title="Delete Member"
|
||||
ok-title="Delete"
|
||||
ok-variant="danger"
|
||||
cancel-title="Cancel"
|
||||
@ok="deleteHero"
|
||||
>
|
||||
<b-modal-body>
|
||||
<p>
|
||||
Are you sure you want to delete this member?
|
||||
</p>
|
||||
<p class="errorMessage">
|
||||
Please note: This action cannot be undone!
|
||||
</p>
|
||||
<div class="ml-4">
|
||||
<div class="form-check">
|
||||
<input
|
||||
id="deleteAccountCheck"
|
||||
v-model="deleteHabiticaAccount"
|
||||
class="form-check-input"
|
||||
type="checkbox"
|
||||
>
|
||||
<label
|
||||
class="form-check-label"
|
||||
for="deleteAccountCheck"
|
||||
>
|
||||
Delete Habitica account
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input
|
||||
id="deleteAmplitudeCheck"
|
||||
v-model="deleteAmplitudeData"
|
||||
class="form-check-input"
|
||||
type="checkbox"
|
||||
>
|
||||
<label
|
||||
class="form-check-label"
|
||||
for="deleteAmplitudeCheck"
|
||||
>
|
||||
Delete Amplitude data
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal-body>
|
||||
</b-modal>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -184,6 +237,8 @@ export default {
|
||||
hasParty: false,
|
||||
partyNotExistError: false,
|
||||
adminHasPrivForParty: true,
|
||||
deleteHabiticaAccount: true,
|
||||
deleteAmplitudeData: true,
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
@@ -249,6 +304,25 @@ export default {
|
||||
|
||||
this.resetCounter += 1; // tell child components to reinstantiate from scratch
|
||||
},
|
||||
confirmDeleteHero () {
|
||||
if (this.hero._id === this.user._id) {
|
||||
window.alert('You cannot delete your own account.');
|
||||
return;
|
||||
}
|
||||
this.$root.$emit('bv::show::modal', 'delete-member-modal');
|
||||
},
|
||||
deleteHero () {
|
||||
this.$store.dispatch('hall:deleteHero', {
|
||||
uuid: this.hero._id,
|
||||
deleteHabiticaAccount: this.deleteHabiticaAccount,
|
||||
deleteAmplitudeData: this.deleteAmplitudeData,
|
||||
}).then(() => {
|
||||
this.$root.$emit('bv::hide::modal', 'delete-member-modal');
|
||||
this.$router.push({ name: 'adminPanel' });
|
||||
}).catch(err => {
|
||||
window.alert(err);
|
||||
});
|
||||
},
|
||||
hasUnsavedChanges (...comparisons) {
|
||||
for (const index in comparisons) {
|
||||
if (index && comparisons[index]) {
|
||||
|
||||
@@ -37,7 +37,11 @@
|
||||
Party ID
|
||||
</label>
|
||||
<strong class="col-sm-9 col-form-label">
|
||||
{{ groupPartyData._id }}
|
||||
<router-link
|
||||
:to="{'name': 'groupAdminGroup', 'params': {'groupId': groupPartyData._id}}"
|
||||
>
|
||||
{{ groupPartyData._id }}
|
||||
</router-link>
|
||||
</strong>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
|
||||
@@ -15,6 +15,25 @@
|
||||
:class="{ 'open': expand }"
|
||||
>
|
||||
Subscription, Monthly Perks
|
||||
<span
|
||||
v-if="isSubscribed() && !isCancelled()"
|
||||
class="text-success float-right ml-3"
|
||||
>
|
||||
Active
|
||||
</span>
|
||||
<span
|
||||
v-else-if="isSubscribed() && isCancelled()"
|
||||
class="text-success float-right ml-3"
|
||||
>
|
||||
Active until {{ dateFormat(hero.purchased.plan.dateTerminated) }}
|
||||
</span>
|
||||
<span
|
||||
v-else-if="hero.purchased.plan.customerId && hero.purchased.plan.dateTerminated"
|
||||
class="text-warning float-right ml-3"
|
||||
>
|
||||
Inactive
|
||||
</span>
|
||||
|
||||
<b
|
||||
v-if="hasUnsavedChanges && !expand"
|
||||
class="text-warning float-right"
|
||||
@@ -46,7 +65,7 @@
|
||||
class="form-control"
|
||||
type="text"
|
||||
>
|
||||
<option value="groupPlan">
|
||||
<option value="Group Plan">
|
||||
Group Plan
|
||||
</option>
|
||||
<option value="Stripe">
|
||||
@@ -154,7 +173,11 @@
|
||||
>
|
||||
<div class="card-body">
|
||||
<h6 class="card-title">
|
||||
{{ group.name }}
|
||||
<router-link
|
||||
:to="{ name: 'groupAdminGroup', params: { groupId: group._id } }"
|
||||
>
|
||||
{{ group.name }}
|
||||
</router-link>
|
||||
<small class="float-right">{{ group._id }}</small>
|
||||
</h6>
|
||||
<p class="card-text">
|
||||
@@ -245,8 +268,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<small
|
||||
v-if="!hero.purchased.plan.dateTerminated
|
||||
&& hero.purchased.plan.planId"
|
||||
v-if="isSubscribed() && !isCancelled()"
|
||||
class="text-success"
|
||||
>
|
||||
The subscription does not have a termination date and is active.
|
||||
@@ -419,6 +441,79 @@
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<h2>Payment Details</h2>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="offset-sm-3 col-sm-9 mb-3">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-secondary btn-sm"
|
||||
@click="getSubscriptionPaymentDetails"
|
||||
>
|
||||
Get Subscription Payment Details
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="paymentDetails"
|
||||
>
|
||||
<div
|
||||
v-for="(value, key) in paymentDetails"
|
||||
:key="key"
|
||||
class="form-group row"
|
||||
>
|
||||
<label class="col-sm-3 col-form-label">
|
||||
{{ getHumanReadablePaymentDetails(key).label }}:
|
||||
<span
|
||||
:id="`${key}_tooltip`"
|
||||
v-b-tooltip.hover.right="getHumanReadablePaymentDetails(key).help"
|
||||
class="info-icon"
|
||||
>?</span>
|
||||
</label>
|
||||
<strong class="col-sm-9 col-form-label">
|
||||
<span v-if="value === true">Yes</span>
|
||||
<span v-else-if="value === false">No</span>
|
||||
<span
|
||||
v-else-if="value instanceof String && isDate(value)"
|
||||
v-b-tooltip.hover="value"
|
||||
>
|
||||
{{ formatDate(value) }}
|
||||
</span>
|
||||
<span v-else-if="value === null">---</span>
|
||||
<span v-else>{{ value }}</span>
|
||||
</strong>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="offset-sm-3 col-sm-9">
|
||||
<a
|
||||
v-if="hero.purchased.plan.paymentMethod === 'Google'"
|
||||
class="btn btn-primary btn-sm"
|
||||
target="_blank"
|
||||
:href="playOrdersUrl"
|
||||
>
|
||||
Play Console
|
||||
</a>
|
||||
<a
|
||||
v-else-if="hero.purchased.plan.paymentMethod === 'Paypal'"
|
||||
class="btn btn-primary btn-sm"
|
||||
target="_blank"
|
||||
:href="'https://www.paypal.com/billing/subscriptions/' + paymentDetails.customerId"
|
||||
>
|
||||
PayPal Dashboard
|
||||
</a>
|
||||
<a
|
||||
v-else-if="hero.purchased.plan.paymentMethod === 'Stripe'"
|
||||
class="btn btn-primary btn-sm"
|
||||
target="_blank"
|
||||
:href="'https://dashboard.stripe.com/customers/' + paymentDetails.customerId"
|
||||
>
|
||||
Stripe Dashboard
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="expand"
|
||||
@@ -474,17 +569,36 @@
|
||||
<style lang="scss" scoped>
|
||||
@import '@/assets/scss/colors.scss';
|
||||
|
||||
.input-group-append {
|
||||
width: auto;
|
||||
|
||||
.input-group-text {
|
||||
border-bottom-right-radius: 2px;
|
||||
border-top-right-radius: 2px;
|
||||
font-weight: 600;
|
||||
font-size: 0.8rem;
|
||||
color: $gray-200;
|
||||
.form-group {
|
||||
margin-bottom: 0.4rem;
|
||||
}
|
||||
|
||||
.input-group-append {
|
||||
width: auto;
|
||||
|
||||
.input-group-text {
|
||||
border-bottom-right-radius: 2px;
|
||||
border-top-right-radius: 2px;
|
||||
font-weight: 600;
|
||||
font-size: 0.8rem;
|
||||
color: $gray-200;
|
||||
}
|
||||
}
|
||||
|
||||
.info-icon {
|
||||
font-size: 0.8rem;
|
||||
color: $purple-400;
|
||||
cursor: pointer;
|
||||
margin-left: 0.2rem;
|
||||
background-color: $gray-500;
|
||||
padding: 0.1rem 0.3rem;
|
||||
border-radius: 0.2rem;
|
||||
}
|
||||
|
||||
.info-icon:hover {
|
||||
background-color: $purple-400;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
@@ -495,6 +609,55 @@ import subscriptionBlocks from '@/../../common/script/content/subscriptionBlocks
|
||||
import saveHero from '../mixins/saveHero';
|
||||
import LoadingSpinner from '@/components/ui/loadingSpinner';
|
||||
|
||||
const PLAY_CONSOLE_ORDERS_BASE_URL = import.meta.env.PLAY_CONSOLE_ORDERS_BASE_URL;
|
||||
|
||||
const humanReadablePaymentDetails = {
|
||||
customerId: {
|
||||
label: 'Customer ID',
|
||||
help: 'The unique identifier for the customer in the payment system.',
|
||||
},
|
||||
purchaseDate: {
|
||||
label: 'Purchase Date',
|
||||
help: 'The date when the subscription was purchased or renewed.',
|
||||
},
|
||||
originalPurchaseDate: {
|
||||
label: 'Original Purchase Date',
|
||||
help: 'The date when the subscription was first purchased.',
|
||||
},
|
||||
productId: {
|
||||
label: 'Product ID',
|
||||
help: 'The identifier for the product associated with the subscription.',
|
||||
},
|
||||
transactionId: {
|
||||
label: 'Transaction ID',
|
||||
help: 'The unique identifier for the last transaction in the payment system.',
|
||||
},
|
||||
isCanceled: {
|
||||
label: 'Is Canceled',
|
||||
help: 'Indicates whether the subscription has been canceled by the user or the system.',
|
||||
},
|
||||
isExpired: {
|
||||
label: 'Is Expired',
|
||||
help: 'Indicates whether the subscription has expired. A cancelled subscription may still be active until the end of the billing cycle.',
|
||||
},
|
||||
expirationDate: {
|
||||
label: 'Termination Date',
|
||||
help: 'The date when the subscription will expire or has expired.',
|
||||
},
|
||||
nextPaymentDate: {
|
||||
label: 'Next Payment Date',
|
||||
help: 'The date when the next payment is due. If the subscription is canceled or expired, this may be null.',
|
||||
},
|
||||
lastPaymentDate: {
|
||||
label: 'Last Payment Date',
|
||||
help: 'The date when the lastpayment was made for the subscription.',
|
||||
},
|
||||
failedPayments: {
|
||||
label: 'Failed Payments',
|
||||
help: 'Number of times the payment failed for this subscription.',
|
||||
},
|
||||
};
|
||||
|
||||
export default {
|
||||
components: {
|
||||
LoadingSpinner,
|
||||
@@ -520,6 +683,7 @@ export default {
|
||||
isConvertingToGroupPlan: false,
|
||||
groupPlanID: '',
|
||||
subscriptionBlocks,
|
||||
paymentDetails: null,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -553,6 +717,9 @@ export default {
|
||||
}
|
||||
return terminationDate;
|
||||
},
|
||||
playOrdersUrl () {
|
||||
return `${PLAY_CONSOLE_ORDERS_BASE_URL}${this.paymentDetails?.transactionId || ''}`;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
dateFormat (date) {
|
||||
@@ -583,6 +750,20 @@ export default {
|
||||
this.isConvertingToGroupPlan = true;
|
||||
this.hero.purchased.plan.owner = '';
|
||||
},
|
||||
getSubscriptionPaymentDetails () {
|
||||
this.$store.dispatch('admin:getSubscriptionPaymentDetails', { userIdentifier: this.hero._id })
|
||||
.then(details => {
|
||||
if (details) {
|
||||
this.paymentDetails = details;
|
||||
} else {
|
||||
alert('No payment details found.');
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error fetching subscription payment details:', error);
|
||||
alert(`Failed to fetch payment details: ${error.message || 'Unknown error'}`);
|
||||
});
|
||||
},
|
||||
saveClicked (e) {
|
||||
e.preventDefault();
|
||||
if (this.isConvertingToGroupPlan) {
|
||||
@@ -601,6 +782,31 @@ export default {
|
||||
this.$emit('changeUserIdentifier', id);
|
||||
}
|
||||
},
|
||||
getHumanReadablePaymentDetails (key) {
|
||||
return humanReadablePaymentDetails[key] || { label: key, help: '' };
|
||||
},
|
||||
isDate (date) {
|
||||
return moment(date).isValid();
|
||||
},
|
||||
formatDate (date) {
|
||||
return date ? moment(date).format('MM/DD/YYYY') : '---';
|
||||
},
|
||||
isSubscribed () {
|
||||
console.log(this.hero.purchased.plan.customerId, this.hero.purchased.plan.dateTerminated);
|
||||
return this.hero.purchased.plan
|
||||
&& this.hero.purchased.plan.customerId
|
||||
&& this.hero.purchased.plan.planId
|
||||
&& this.hero.purchased.plan.paymentMethod
|
||||
&& (
|
||||
!this.hero.purchased.plan.dateTerminated
|
||||
|| moment(this.hero.purchased.plan.dateTerminated).isAfter(moment())
|
||||
);
|
||||
},
|
||||
isCancelled () {
|
||||
return this.hero.purchased.plan
|
||||
&& this.hero.purchased.plan.dateTerminated
|
||||
&& this.hero.purchased.plan.dateTerminated !== '';
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -226,7 +226,7 @@ export default {
|
||||
}
|
||||
},
|
||||
async retrieveUserHistory () {
|
||||
const history = await this.$store.dispatch('adminPanel:getUserHistory', { userIdentifier: this.hero._id });
|
||||
const history = await this.$store.dispatch('admin:getUserHistory', { userIdentifier: this.hero._id });
|
||||
this.armoire = history.armoire;
|
||||
this.questInviteResponses = history.questInviteResponses;
|
||||
this.cron = history.cron;
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
>
|
||||
{{ $t('adminPanel') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
v-if="hasPermission(user, 'groupSupport')"
|
||||
class="nav-link"
|
||||
:to="{name: 'groupAdmin'}"
|
||||
>
|
||||
{{ $t('groupAdmin') }}
|
||||
</router-link>
|
||||
<router-link
|
||||
v-if="hasPermission(user, 'accessControl')"
|
||||
class="nav-link"
|
||||
|
||||
47
website/client/src/components/admin/formRow.vue
Normal file
@@ -0,0 +1,47 @@
|
||||
<template>
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-3 col-form-label"><slot name="label">{{ label }}</slot></label>
|
||||
<div class="col-sm-9">
|
||||
<slot>
|
||||
<textarea
|
||||
v-if="inputType === 'textarea'"
|
||||
:value="value"
|
||||
class="form-control"
|
||||
:rows="rows"
|
||||
@input="$emit('input', $event.target.value)"
|
||||
></textarea>
|
||||
<input
|
||||
v-else
|
||||
:value="value"
|
||||
class="form-control"
|
||||
:type="inputType"
|
||||
@input="$emit('input', $event.target.value)"
|
||||
>
|
||||
</slot>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
model: {
|
||||
prop: 'value',
|
||||
event: 'input',
|
||||
},
|
||||
props: {
|
||||
label: {
|
||||
type: String,
|
||||
},
|
||||
value: {
|
||||
type: [String, Boolean],
|
||||
},
|
||||
inputType: {
|
||||
type: String,
|
||||
default: 'text',
|
||||
},
|
||||
rows: {
|
||||
default: 3,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,45 @@
|
||||
<template>
|
||||
<form>
|
||||
<form-row
|
||||
v-model="group.name"
|
||||
:label="$t('groupName')"
|
||||
/>
|
||||
<form-row
|
||||
v-model="group.summary"
|
||||
:label="$t('guildSummary')"
|
||||
input-type="textarea"
|
||||
/>
|
||||
<form-row
|
||||
v-model="group.description"
|
||||
:label="$t('groupDescription')"
|
||||
input-type="textarea"
|
||||
rows="6"
|
||||
/>
|
||||
<form-row
|
||||
v-model="group.bannedWordsAllowed"
|
||||
:label="$t('bannedWordsAllowed')"
|
||||
input-type="checkbox"
|
||||
/>
|
||||
<form-row
|
||||
v-model="group.leaderOnly.challenges"
|
||||
:label="$t('leaderOnlyChallenges')"
|
||||
input-type="checkbox"
|
||||
/>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import formRow from '@/components/admin/formRow.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
formRow,
|
||||
},
|
||||
props: {
|
||||
group: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,69 @@
|
||||
<template>
|
||||
<div v-if="hasPermission(user, 'groupSupport')">
|
||||
<h2>{{ group.name }}</h2>
|
||||
<supportContainer
|
||||
:title="$t('groupData')"
|
||||
>
|
||||
<groupData
|
||||
:group="group"
|
||||
/>
|
||||
</supportContainer>
|
||||
<supportContainer
|
||||
:title="$t('groupPlanSubscription')"
|
||||
/>
|
||||
<supportContainer
|
||||
v-if="group.type === 'party'"
|
||||
:title="$t('questDetails')"
|
||||
/>
|
||||
<supportContainer
|
||||
:title="$t('members')"
|
||||
>
|
||||
<members
|
||||
:group="group"
|
||||
/>
|
||||
</supportContainer>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { userStateMixin } from '../../../../mixins/userState';
|
||||
import supportContainer from '../../supportContainer.vue';
|
||||
import groupData from './groupData.vue';
|
||||
import members from './members.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
supportContainer,
|
||||
groupData,
|
||||
members,
|
||||
},
|
||||
mixins: [userStateMixin],
|
||||
data () {
|
||||
return {
|
||||
groupId: '',
|
||||
group: {},
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
groupId () {
|
||||
this.loadGroup(this.groupId);
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
this.groupId = this.$route.params.groupId;
|
||||
},
|
||||
methods: {
|
||||
clearData () {
|
||||
this.group = {};
|
||||
},
|
||||
async loadGroup (groupId) {
|
||||
this.$emit('changeGroupId', groupId);
|
||||
this.group = await this.$store.dispatch('admin:getGroup', { groupId });
|
||||
},
|
||||
async updateGroup () {
|
||||
await this.$store.dispatch('admin:updateGroup', { group: this.group });
|
||||
this.$emit('groupSaved', this.group);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,29 @@
|
||||
<template>
|
||||
<form-row
|
||||
:label="$t('groupLeader')"
|
||||
>
|
||||
<strong class="col-form-label">
|
||||
<router-link
|
||||
:to="{'name': 'adminPanelUser', 'params': {'userIdentifier': group.leader }}"
|
||||
>
|
||||
{{ group.leader }}
|
||||
</router-link>
|
||||
</strong>
|
||||
</form-row>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import formRow from '@/components/admin/formRow.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
formRow,
|
||||
},
|
||||
props: {
|
||||
group: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
93
website/client/src/components/admin/groups/index.vue
Normal file
@@ -0,0 +1,93 @@
|
||||
<template>
|
||||
<div class="row standard-page col-12 d-flex justify-content-center">
|
||||
<div class="group-admin-content">
|
||||
<h1>{{ $t("groupAdmin") }}</h1>
|
||||
<form
|
||||
class="form-inline"
|
||||
@submit.prevent="loadGroup(groupID)"
|
||||
>
|
||||
<div class="input-group col pl-0 pr-0">
|
||||
<input
|
||||
v-model="groupID"
|
||||
class="form-control"
|
||||
type="text"
|
||||
placeholder="Group ID"
|
||||
>
|
||||
<div class="input-group-append">
|
||||
<button
|
||||
class="btn btn-primary"
|
||||
type="button"
|
||||
:disabled="!groupID"
|
||||
@click="loadGroup(groupID)"
|
||||
>
|
||||
Load
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<router-view
|
||||
class="mt-3"
|
||||
@changeGroupId="changeGroupId"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.uidField {
|
||||
min-width: 45ch;
|
||||
}
|
||||
|
||||
.input-group-append {
|
||||
width:auto;
|
||||
}
|
||||
|
||||
.group-admin-content {
|
||||
flex: 0 0 800px;
|
||||
max-width: 800px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import VueRouter from 'vue-router';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
const { isNavigationFailure, NavigationFailureType } = VueRouter;
|
||||
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
groupID: '',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({ user: 'user.data' }),
|
||||
},
|
||||
mounted () {
|
||||
this.$store.dispatch('common:setTitle', {
|
||||
section: this.$t('groupAdmin'),
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
changeGroupId (id) {
|
||||
this.groupID = id;
|
||||
},
|
||||
async loadGroup (groupId) {
|
||||
if (this.$router.currentRoute.name === 'groupAdminGroup') {
|
||||
await this.$router.push({
|
||||
name: 'groupAdmin',
|
||||
});
|
||||
}
|
||||
await this.$router.push({
|
||||
name: 'groupAdminGroup',
|
||||
params: { groupId },
|
||||
}).catch(failure => {
|
||||
if (isNavigationFailure(failure, NavigationFailureType.duplicated)) {
|
||||
this.$router.go();
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
53
website/client/src/components/admin/supportContainer.vue
Normal file
@@ -0,0 +1,53 @@
|
||||
<template>
|
||||
<div class="card mt-2">
|
||||
<div class="card-header">
|
||||
<h3
|
||||
class="mb-0 mt-0"
|
||||
:class="{'open': expand}"
|
||||
@click="expand = !expand"
|
||||
>
|
||||
<slot name="title">
|
||||
{{ title }}
|
||||
</slot>
|
||||
</h3>
|
||||
</div>
|
||||
<div
|
||||
v-if="expand"
|
||||
class="card-body"
|
||||
>
|
||||
<slot></slot>
|
||||
</div>
|
||||
<div
|
||||
v-if="expand && onSave"
|
||||
class="card-footer"
|
||||
>
|
||||
<button
|
||||
class="btn btn-primary mt-1"
|
||||
@click="onSave"
|
||||
>
|
||||
{{ $t('save') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
required: false,
|
||||
},
|
||||
onSave: {
|
||||
type: Function,
|
||||
required: false,
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
expand: false,
|
||||
};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -43,9 +43,11 @@ export default {
|
||||
const AUTH_SETTINGS = localStorage.getItem(LOCALSTORAGE_AUTH_KEY);
|
||||
const parseSettings = JSON.parse(AUTH_SETTINGS);
|
||||
const userId = parseSettings ? parseSettings.auth.apiId : '';
|
||||
const username = this.$store?.state?.user?.data?.auth?.local?.username || '';
|
||||
|
||||
return this.$t('accountSuspended', {
|
||||
userId,
|
||||
username,
|
||||
communityManagerEmail: COMMUNITY_MANAGER_EMAIL,
|
||||
});
|
||||
},
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
@update-challenge="updateChallenge"
|
||||
/>
|
||||
<close-challenge-modal
|
||||
:members="members"
|
||||
:challenge-id="challenge._id"
|
||||
:prize="challenge.prize"
|
||||
:flag-count="challenge.flagCount"
|
||||
@@ -72,32 +71,40 @@
|
||||
</div>
|
||||
<div class="col-12 col-md-6 text-right">
|
||||
<div
|
||||
class="box member-count"
|
||||
class="box member-count p-2"
|
||||
@click="showMemberModal()"
|
||||
>
|
||||
<div
|
||||
class="svg-icon member-icon"
|
||||
v-html="icons.memberIcon"
|
||||
></div>
|
||||
{{ challenge.memberCount }}
|
||||
<div
|
||||
v-once
|
||||
class="details"
|
||||
>
|
||||
{{ $t('participantsTitle') }}
|
||||
<div class="box-content">
|
||||
<div class="icon-number-row">
|
||||
<div
|
||||
class="svg-icon member-icon"
|
||||
v-html="icons.memberIcon"
|
||||
></div>
|
||||
<span class="number">{{ challenge.memberCount }}</span>
|
||||
</div>
|
||||
<div
|
||||
v-once
|
||||
class="details"
|
||||
>
|
||||
{{ $t('participantsTitle') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box">
|
||||
<div
|
||||
class="svg-icon gem-icon"
|
||||
v-html="icons.gemIcon"
|
||||
></div>
|
||||
{{ challenge.prize || 0 }}
|
||||
<div
|
||||
v-once
|
||||
class="details"
|
||||
>
|
||||
{{ $t('prize') }}
|
||||
<div class="box prize-count p-2">
|
||||
<div class="box-content">
|
||||
<div class="icon-number-row">
|
||||
<div
|
||||
class="svg-icon gem-icon"
|
||||
v-html="icons.gemIcon"
|
||||
></div>
|
||||
<span class="number">{{ challenge.prize || 0 }}</span>
|
||||
</div>
|
||||
<div
|
||||
v-once
|
||||
class="details"
|
||||
>
|
||||
{{ $t('prize') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -304,7 +311,6 @@
|
||||
|
||||
.box {
|
||||
display: inline-block;
|
||||
padding: 1em;
|
||||
border-radius: 2px;
|
||||
background-color: $white;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||
@@ -314,22 +320,88 @@
|
||||
text-align: center;
|
||||
font-size: 20px;
|
||||
vertical-align: bottom;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
&.member-count:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.box-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.icon-number-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 0.1em;
|
||||
|
||||
.number {
|
||||
font-size: 20px;
|
||||
font-weight: normal;
|
||||
margin-left: 0.2em;
|
||||
}
|
||||
}
|
||||
|
||||
.svg-icon {
|
||||
width: 30px;
|
||||
display: inline-block;
|
||||
margin-right: .2em;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.details {
|
||||
font-size: 12px;
|
||||
margin-top: 0.4em;
|
||||
color: $gray-200;
|
||||
width: 100%;
|
||||
padding: 0 4px;
|
||||
line-height: 1.15;
|
||||
word-break: break-word;
|
||||
max-height: 2.3em;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
&.member-count {
|
||||
.icon-number-row {
|
||||
.svg-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.number {
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
.details {
|
||||
font-size: 11px;
|
||||
line-height: 1.1;
|
||||
max-height: 2.2em;
|
||||
}
|
||||
}
|
||||
|
||||
&.prize-count {
|
||||
.icon-number-row {
|
||||
.svg-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.number {
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
.details {
|
||||
font-size: 11px;
|
||||
line-height: 1.1;
|
||||
max-height: 2.2em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -624,7 +696,6 @@ export default {
|
||||
this.members = [];
|
||||
},
|
||||
closeChallenge () {
|
||||
this.initialMembersLoad();
|
||||
this.$root.$emit('bv::show::modal', 'close-challenge-modal');
|
||||
},
|
||||
edit () {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
id="close-challenge-modal"
|
||||
:title="$t('endChallenge')"
|
||||
size="md"
|
||||
:hide-header="false"
|
||||
>
|
||||
<div
|
||||
slot="modal-header"
|
||||
@@ -15,6 +16,9 @@
|
||||
>
|
||||
{{ $t('endChallenge') }}
|
||||
</h2>
|
||||
<close-x
|
||||
@close="$root.$emit('bv::hide::modal', 'close-challenge-modal')"
|
||||
/>
|
||||
</div>
|
||||
<div class="row text-center">
|
||||
<span
|
||||
@@ -28,28 +32,67 @@
|
||||
class="col-12"
|
||||
>
|
||||
<div class="col-12">
|
||||
<div class="support-habitica">
|
||||
<!-- @TODO: Add challenge achievement badge here-->
|
||||
<div class="badge-section">
|
||||
<div
|
||||
class="gems-left"
|
||||
v-html="icons.gemsOrange"
|
||||
></div>
|
||||
<div
|
||||
class="challenge-badge"
|
||||
v-html="icons.endChallengeBadge"
|
||||
></div>
|
||||
<div
|
||||
class="gems-right"
|
||||
v-html="icons.gemsPurple"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<strong v-once>{{ $t('selectChallengeWinnersDescription') }}</strong>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<member-search-dropdown
|
||||
:text="winnerText"
|
||||
:members="members"
|
||||
:challenge-id="challengeId"
|
||||
@member-selected="selectMember"
|
||||
/>
|
||||
<div class="col-12 search-input-container">
|
||||
<div class="search-input-wrapper">
|
||||
<div
|
||||
class="search-icon"
|
||||
v-html="icons.search"
|
||||
></div>
|
||||
<input
|
||||
v-model="searchTerm"
|
||||
class="search-input"
|
||||
type="text"
|
||||
placeholder="@Username"
|
||||
@input="searchMembers"
|
||||
@focus="showResults = true"
|
||||
@blur="handleBlur"
|
||||
>
|
||||
<div
|
||||
v-if="showResults && filteredMembers.length > 0"
|
||||
class="search-results"
|
||||
>
|
||||
<div
|
||||
v-for="member in filteredMembers"
|
||||
:key="member._id"
|
||||
class="search-result-item"
|
||||
@mousedown="selectMember(member)"
|
||||
>
|
||||
{{ getMemberDisplayName(member) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<button
|
||||
v-once
|
||||
class="btn btn-primary"
|
||||
class="btn award-winner-btn"
|
||||
:class="{'has-winner': winner._id}"
|
||||
:disabled="!winner._id"
|
||||
@click="closeChallenge"
|
||||
>
|
||||
{{ $t('awardWinners') }}
|
||||
<span>{{ $t('awardWinners') }}</span>
|
||||
<div
|
||||
class="gem-icon"
|
||||
v-html="icons.gem"
|
||||
></div>
|
||||
<span>{{ prize }} {{ prize === 1 ? $t('gem') : $t('gems') }}</span>
|
||||
</button>
|
||||
</div>
|
||||
</span>
|
||||
@@ -60,14 +103,27 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<strong v-once>{{ $t('doYouWantedToDeleteChallenge') }}</strong>
|
||||
<strong
|
||||
v-once
|
||||
class="delete-challenge-text"
|
||||
>{{ $t('doYouWantedToDeleteChallenge') }}</strong>
|
||||
</div>
|
||||
<div
|
||||
v-once
|
||||
class="col-12 refund-text"
|
||||
>
|
||||
{{ $t('deleteChallengeRefundDescription') }}
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<button
|
||||
v-once
|
||||
class="btn btn-danger"
|
||||
class="btn btn-danger delete-challenge-btn"
|
||||
@click="deleteChallenge()"
|
||||
>
|
||||
<div
|
||||
class="svg-icon color delete-icon"
|
||||
v-html="icons.deleteIcon"
|
||||
></div>
|
||||
{{ $t('deleteChallenge') }}
|
||||
</button>
|
||||
</div>
|
||||
@@ -82,6 +138,7 @@
|
||||
|
||||
<style lang='scss'>
|
||||
@import '@/assets/scss/colors.scss';
|
||||
@import '@/assets/scss/button.scss';
|
||||
|
||||
#close-challenge-modal {
|
||||
h2 {
|
||||
@@ -94,26 +151,190 @@
|
||||
|
||||
.header-wrap {
|
||||
width: 100%;
|
||||
padding-top: 2em;
|
||||
padding-top: 32px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.support-habitica {
|
||||
background-image: url('@/assets/svg/for-css/support-habitica-gems.svg?raw');
|
||||
width: 325px;
|
||||
height: 89px;
|
||||
.modal-close {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 16px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.search-input-container {
|
||||
margin-top: 1em !important;
|
||||
}
|
||||
|
||||
.search-input-wrapper {
|
||||
position: relative;
|
||||
width: 384px;
|
||||
margin: 0 auto;
|
||||
|
||||
.search-icon {
|
||||
position: absolute;
|
||||
left: 12px;
|
||||
top: 50%;
|
||||
transform: translateY(-55%);
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
color: $gray-200;
|
||||
pointer-events: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.search-input {
|
||||
width: 100%;
|
||||
height: 32px;
|
||||
padding-left: 36px;
|
||||
padding-right: 12px;
|
||||
border: 1px solid $gray-400;
|
||||
border-radius: 4px;
|
||||
font-size: 14px;
|
||||
transition: border-color 0.2s ease, border-width 0.2s ease;
|
||||
|
||||
&:focus {
|
||||
outline: none;
|
||||
border: 2px solid $purple-400;
|
||||
}
|
||||
|
||||
&::placeholder {
|
||||
color: $gray-300;
|
||||
}
|
||||
}
|
||||
|
||||
.search-results {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: $white;
|
||||
border: 1px solid $gray-400;
|
||||
border-top: none;
|
||||
border-radius: 0 0 4px 4px;
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
z-index: 1000;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
|
||||
.search-result-item {
|
||||
padding: 8px 16px;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
text-align: left;
|
||||
|
||||
&:hover {
|
||||
background-color: $purple-600;
|
||||
color: $purple-300;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.delete-challenge-text {
|
||||
color: $maroon-50;
|
||||
}
|
||||
|
||||
.refund-text {
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-size: 14px;
|
||||
line-height: 24px;
|
||||
font-weight: 400;
|
||||
color: $gray-50;
|
||||
margin-top: 0.5em !important;
|
||||
}
|
||||
|
||||
.delete-challenge-btn {
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
line-height: 24px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
|
||||
.delete-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
display: inline-flex;
|
||||
}
|
||||
}
|
||||
|
||||
.award-winner-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
min-height: 32px;
|
||||
padding: 4px 12px;
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:not(:disabled) {
|
||||
background-color: $white;
|
||||
color: $gray-200;
|
||||
border: 1px solid $gray-400;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||
|
||||
&.has-winner {
|
||||
background-color: $purple-200;
|
||||
color: $white;
|
||||
border-color: $purple-200;
|
||||
}
|
||||
|
||||
&:hover:not(.has-winner) {
|
||||
background-color: $gray-700;
|
||||
}
|
||||
}
|
||||
|
||||
.gem-icon {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
color: $gems-color;
|
||||
}
|
||||
}
|
||||
|
||||
.badge-section {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 1.5rem;
|
||||
margin: -24px auto 0;
|
||||
padding: 0.5rem 0;
|
||||
|
||||
.gems-left, .gems-right {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.challenge-badge {
|
||||
width: 48px;
|
||||
height: 52px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.modal-footer, .modal-header {
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
.footer-wrap {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.col-12 {
|
||||
margin-top: 2em;
|
||||
margin-top: 1.5em;
|
||||
}
|
||||
|
||||
.col-12:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.or {
|
||||
@@ -123,21 +344,41 @@
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
font-weight: bold;
|
||||
color: $gray-100;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import memberSearchDropdown from '@/components/members/memberSearchDropdown';
|
||||
import debounce from 'lodash/debounce';
|
||||
import searchIcon from '@/assets/svg/for-css/search.svg?raw';
|
||||
import deleteIcon from '@/assets/svg/delete.svg?raw';
|
||||
import gemIcon from '@/assets/svg/gem.svg?raw';
|
||||
import endChallengeBadge from '@/assets/svg/for-css/end_challenge_badge.svg?raw';
|
||||
import gemsOrange from '@/assets/svg/for-css/orange100_red100_yellow100_gems.svg?raw';
|
||||
import gemsPurple from '@/assets/svg/for-css/purple200_green10_blue100_gems.svg?raw';
|
||||
import closeX from '@/components/ui/closeX';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
memberSearchDropdown,
|
||||
closeX,
|
||||
},
|
||||
props: ['challengeId', 'members', 'prize', 'flagCount'],
|
||||
props: ['challengeId', 'prize', 'flagCount'],
|
||||
data () {
|
||||
return {
|
||||
winner: {},
|
||||
searchTerm: '',
|
||||
showResults: false,
|
||||
filteredMembers: [],
|
||||
isSearching: false,
|
||||
icons: Object.freeze({
|
||||
search: searchIcon,
|
||||
deleteIcon,
|
||||
gem: gemIcon,
|
||||
endChallengeBadge,
|
||||
gemsOrange,
|
||||
gemsPurple,
|
||||
}),
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -149,9 +390,58 @@ export default {
|
||||
return this.flagCount > 0;
|
||||
},
|
||||
},
|
||||
created () {
|
||||
this.searchMembersDebounced = debounce(this.performSearch, 500);
|
||||
},
|
||||
methods: {
|
||||
searchMembers () {
|
||||
if (!this.searchTerm) {
|
||||
this.filteredMembers = [];
|
||||
this.isSearching = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this.isSearching = true;
|
||||
this.searchMembersDebounced();
|
||||
},
|
||||
async performSearch () {
|
||||
if (!this.searchTerm) {
|
||||
this.filteredMembers = [];
|
||||
this.isSearching = false;
|
||||
return;
|
||||
}
|
||||
|
||||
const searchTerm = this.searchTerm.replace('@', '');
|
||||
|
||||
try {
|
||||
const members = await this.$store.dispatch('members:getChallengeMembers', {
|
||||
challengeId: this.challengeId,
|
||||
searchTerm,
|
||||
includeAllPublicFields: true,
|
||||
});
|
||||
|
||||
this.filteredMembers = members.slice(0, 10);
|
||||
} catch (err) {
|
||||
this.filteredMembers = [];
|
||||
} finally {
|
||||
this.isSearching = false;
|
||||
}
|
||||
},
|
||||
getMemberDisplayName (member) {
|
||||
if (member.auth?.local?.username) {
|
||||
return `@${member.auth.local.username}`;
|
||||
}
|
||||
return member.profile?.name || '';
|
||||
},
|
||||
selectMember (member) {
|
||||
this.winner = member;
|
||||
this.searchTerm = this.getMemberDisplayName(member);
|
||||
this.showResults = false;
|
||||
},
|
||||
handleBlur () {
|
||||
setTimeout(() => {
|
||||
this.showResults = false;
|
||||
}, 200);
|
||||
},
|
||||
async closeChallenge () {
|
||||
this.challenge = await this.$store.dispatch('challenges:selectChallengeWinner', {
|
||||
|
||||
@@ -82,9 +82,7 @@
|
||||
<select-translated-array
|
||||
:items="[
|
||||
'groupParentChildren',
|
||||
'groupCouple',
|
||||
'groupFriends',
|
||||
'groupCoworkers',
|
||||
'groupManager',
|
||||
'groupTeacher'
|
||||
]"
|
||||
|
||||
@@ -1,37 +1,43 @@
|
||||
<template>
|
||||
<div
|
||||
class="notification d-flex flex-column justify-content-center text-center"
|
||||
class="notification d-flex justify-content-center align-items-center"
|
||||
>
|
||||
<strong
|
||||
v-once
|
||||
class="mx-auto mb-2"
|
||||
<img
|
||||
src="@/assets/images/gifts_start.svg"
|
||||
class="gift-start"
|
||||
alt=""
|
||||
>
|
||||
{{ $t('g1g1') }}
|
||||
</strong>
|
||||
<small
|
||||
v-once
|
||||
class="mx-4 mb-3"
|
||||
>
|
||||
{{ $t('g1g1Details') }}
|
||||
</small>
|
||||
<div
|
||||
class="btn-secondary mx-auto d-flex"
|
||||
@click="showSelectUser()"
|
||||
>
|
||||
<div
|
||||
<div class="content-wrapper d-flex flex-column justify-content-center text-center">
|
||||
<strong
|
||||
v-once
|
||||
class="m-auto"
|
||||
class="mx-auto mb-2"
|
||||
>
|
||||
{{ $t('g1g1') }}
|
||||
</strong>
|
||||
<small
|
||||
v-once
|
||||
class="mx-4 mb-3"
|
||||
>
|
||||
{{ $t('g1g1Details') }}
|
||||
</small>
|
||||
<button
|
||||
class="btn btn-secondary mx-auto"
|
||||
@click="showSelectUser()"
|
||||
>
|
||||
{{ $t('sendGift') }}
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
<img
|
||||
src="@/assets/images/gifts_start.svg"
|
||||
class="gift-end"
|
||||
alt=""
|
||||
>
|
||||
<div
|
||||
class="notification-remove"
|
||||
@click.stop="remove()"
|
||||
class="close-x"
|
||||
@click="remove()"
|
||||
>
|
||||
<div
|
||||
v-once
|
||||
class="svg-icon"
|
||||
class="svg-icon svg-close"
|
||||
v-html="icons.close"
|
||||
></div>
|
||||
</div>
|
||||
@@ -41,51 +47,89 @@
|
||||
<style lang='scss' scoped>
|
||||
@import '@/assets/scss/colors.scss';
|
||||
|
||||
small, strong {
|
||||
small {
|
||||
color: $white;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-size: 14px;
|
||||
line-height: 1.714;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
strong {
|
||||
color: $white;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-size: 14px;
|
||||
line-height: 1.714;
|
||||
}
|
||||
|
||||
.notification {
|
||||
background-image: url('@/assets/images/g1g1-notif.png');
|
||||
background-image: url('@/assets/images/gifts_bg.svg');
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
height: 10rem;
|
||||
padding: 3rem;
|
||||
padding: 0;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
white-space: normal;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.notification-remove {
|
||||
position: absolute;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
padding: 4px;
|
||||
right: 24px;
|
||||
top: 24px;
|
||||
|
||||
.svg-icon {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
.content-wrapper {
|
||||
flex: 1;
|
||||
padding: 2rem;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
width: 5.75rem;
|
||||
min-height: 1.5rem;
|
||||
border-radius: 2px;
|
||||
border-color: $white;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
.gift-start {
|
||||
height: 96px;
|
||||
width: auto;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.gift-end {
|
||||
height: 96px;
|
||||
width: auto;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 50%;
|
||||
transform: translateY(-50%) scaleX(-1);
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.close-x {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 16px;
|
||||
cursor: pointer;
|
||||
z-index: 2;
|
||||
|
||||
&:hover .svg-close {
|
||||
opacity: 0.75;
|
||||
}
|
||||
|
||||
.svg-close {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
opacity: 0.5;
|
||||
transition: opacity 0.2s ease;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import closeIcon from '@/assets/svg/close-teal.svg?raw';
|
||||
import { mapActions } from '@/libs/store';
|
||||
import closeIcon from '@/assets/svg/close-white.svg?raw';
|
||||
|
||||
export default {
|
||||
props: ['notification'],
|
||||
props: ['notification', 'eventKey'],
|
||||
data () {
|
||||
return {
|
||||
icons: Object.freeze({
|
||||
@@ -94,11 +138,11 @@ export default {
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
...mapActions({
|
||||
readNotification: 'notifications:readNotification',
|
||||
}),
|
||||
remove () {
|
||||
this.readNotification({ notificationId: this.notification.id });
|
||||
if (this.eventKey) {
|
||||
window.sessionStorage.setItem(`hide-g1g1-${this.eventKey}`, 'true');
|
||||
}
|
||||
this.$emit('notification-removed');
|
||||
},
|
||||
showSelectUser () {
|
||||
this.$root.$emit('bv::show::modal', 'select-user-modal');
|
||||
|
||||
@@ -71,7 +71,7 @@ export default {
|
||||
props: ['notification', 'canRemove'],
|
||||
methods: {
|
||||
action () {
|
||||
this.$router.push({ name: 'achievements' });
|
||||
this.$router.push(`/profile/${this.$store.state.user.data._id}#achievements`);
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -43,7 +43,7 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
action () {
|
||||
this.$router.push({ name: 'stats' });
|
||||
this.$router.push(`/profile/${this.$store.state.user.data._id}#stats`);
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -49,6 +49,12 @@
|
||||
v-if="showOnboardingGuide"
|
||||
:never-seen="hasSpecialBadge"
|
||||
/>
|
||||
<gift-one-get-one-notification
|
||||
v-if="shouldShowG1g1"
|
||||
:notification="g1g1Notification"
|
||||
:event-key="g1g1EventKey"
|
||||
@notification-removed="handleG1g1Removed"
|
||||
/>
|
||||
<component
|
||||
:is="notification.type"
|
||||
v-for="notification in notifications"
|
||||
@@ -114,6 +120,7 @@
|
||||
<script>
|
||||
import * as quests from '@/../../common/script/content/quests';
|
||||
import { hasCompletedOnboarding } from '@/../../common/script/libs/onboarding';
|
||||
import find from 'lodash/find';
|
||||
import { mapState, mapActions } from '@/libs/store';
|
||||
import notificationsIcon from '@/assets/svg/notifications.svg?raw';
|
||||
import MenuDropdown from '../ui/customMenuDropdown';
|
||||
@@ -151,6 +158,7 @@ export default {
|
||||
CARD_RECEIVED,
|
||||
CHALLENGE_INVITATION,
|
||||
GIFT_ONE_GET_ONE,
|
||||
GiftOneGetOneNotification: GIFT_ONE_GET_ONE,
|
||||
GROUP_TASK_ASSIGNED,
|
||||
GROUP_TASK_CLAIMED,
|
||||
GROUP_TASK_NEEDS_WORK,
|
||||
@@ -178,17 +186,14 @@ export default {
|
||||
hasSpecialBadge: false,
|
||||
quests,
|
||||
openStatus: undefined,
|
||||
g1g1Hidden: false,
|
||||
actionableNotifications: [
|
||||
'GUILD_INVITATION', 'PARTY_INVITATION', 'CHALLENGE_INVITATION',
|
||||
'QUEST_INVITATION',
|
||||
],
|
||||
// A list of notifications handled by this component,
|
||||
// listed in the order they should appear in the notifications panel.
|
||||
// NOTE: Those not listed here won't be shown in the notification panel!
|
||||
handledNotifications: [
|
||||
'NEW_STUFF',
|
||||
'ITEM_RECEIVED',
|
||||
'GIFT_ONE_GET_ONE',
|
||||
'GROUP_TASK_NEEDS_WORK',
|
||||
'GUILD_INVITATION',
|
||||
'PARTY_INVITATION',
|
||||
@@ -207,7 +212,10 @@ export default {
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({ user: 'user.data' }),
|
||||
...mapState({
|
||||
user: 'user.data',
|
||||
currentEventList: 'worldState.data.currentEventList',
|
||||
}),
|
||||
notificationsOrder () {
|
||||
// Returns a map of NOTIFICATION_TYPE -> POSITION
|
||||
const orderMap = {};
|
||||
@@ -286,9 +294,9 @@ export default {
|
||||
|
||||
return notifications;
|
||||
},
|
||||
// The total number of notification, shown inside the dropdown
|
||||
notificationsCount () {
|
||||
return this.notifications.length;
|
||||
const g1g1Count = this.shouldShowG1g1 ? 1 : 0;
|
||||
return this.notifications.length + g1g1Count;
|
||||
},
|
||||
hasUnseenNotifications () {
|
||||
return this.notifications.some(notification => (notification.seen === false));
|
||||
@@ -299,6 +307,30 @@ export default {
|
||||
showOnboardingGuide () {
|
||||
return !hasCompletedOnboarding(this.user);
|
||||
},
|
||||
currentG1g1Event () {
|
||||
return find(this.currentEventList, event => event.promo === 'g1g1');
|
||||
},
|
||||
g1g1EventKey () {
|
||||
if (!this.currentG1g1Event || !this.currentG1g1Event.start) return null;
|
||||
const startDate = new Date(this.currentG1g1Event.start);
|
||||
return `${startDate.getFullYear()}-${startDate.getMonth()}`;
|
||||
},
|
||||
shouldShowG1g1 () {
|
||||
if (!this.currentG1g1Event) return false;
|
||||
const eventKey = this.g1g1EventKey;
|
||||
if (eventKey && window.sessionStorage.getItem(`hide-g1g1-${eventKey}`) === 'true') {
|
||||
return false;
|
||||
}
|
||||
return !this.g1g1Hidden;
|
||||
},
|
||||
g1g1Notification () {
|
||||
return {
|
||||
type: 'GIFT_ONE_GET_ONE',
|
||||
id: `g1g1-event-${this.currentG1g1Event?.start || 'default'}`,
|
||||
data: {},
|
||||
seen: false,
|
||||
};
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
const onboardingPanelState = getLocalSetting(CONSTANTS.keyConstants.ONBOARDING_PANEL_STATE);
|
||||
@@ -364,6 +396,9 @@ export default {
|
||||
isActionable (notification) {
|
||||
return this.actionableNotifications.indexOf(notification.type) !== -1;
|
||||
},
|
||||
handleG1g1Removed () {
|
||||
this.g1g1Hidden = true;
|
||||
},
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
@@ -176,7 +176,12 @@ export default {
|
||||
}
|
||||
},
|
||||
showProfile (startingPage) {
|
||||
this.$router.push({ name: startingPage });
|
||||
const userId = this.$store.state.user.data._id;
|
||||
let path = `/profile/${userId}`;
|
||||
if (startingPage !== 'profile') {
|
||||
path += `#${startingPage}`;
|
||||
}
|
||||
this.$router.push(path);
|
||||
},
|
||||
toLearnMore () {
|
||||
this.$router.push({ name: 'subscription' });
|
||||
|
||||
@@ -454,17 +454,14 @@ export default {
|
||||
},
|
||||
isUserMentioned () {
|
||||
const message = this.msg;
|
||||
|
||||
if (message.highlight) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const { user } = this;
|
||||
const displayName = user.profile.name;
|
||||
const { username } = user.auth.local;
|
||||
const pattern = `@(${escapeRegExp(displayName)}|${escapeRegExp(username)})(\\b)`;
|
||||
message.highlight = new RegExp(pattern, 'i').test(message.text);
|
||||
|
||||
if (!username) return false;
|
||||
const usernamePattern = new RegExp(`@${escapeRegExp(username)}(?:\\b|(?=[^a-zA-Z0-9_]))`, 'i');
|
||||
message.highlight = usernamePattern.test(message.text);
|
||||
return message.highlight;
|
||||
},
|
||||
flagCountDescription () {
|
||||
|
||||
@@ -197,9 +197,7 @@
|
||||
<select-translated-array
|
||||
:items="[
|
||||
'groupParentChildren',
|
||||
'groupCouple',
|
||||
'groupFriends',
|
||||
'groupCoworkers',
|
||||
'groupManager',
|
||||
'groupTeacher'
|
||||
]"
|
||||
|
||||
@@ -12,14 +12,12 @@
|
||||
class="staff col-6 p-0"
|
||||
>
|
||||
<div class="d-flex">
|
||||
<router-link
|
||||
<div
|
||||
class="title"
|
||||
:to="{'name': 'userProfile', 'params': {'userId': user.uuid}}"
|
||||
>
|
||||
{{ user.name }}
|
||||
</router-link>
|
||||
</div>
|
||||
<div
|
||||
v-if="user.type === 'Staff'"
|
||||
class="svg-icon staff-icon ml-1"
|
||||
v-html="icons.tierStaff"
|
||||
></div>
|
||||
|
||||
@@ -851,7 +851,7 @@ export default {
|
||||
return;
|
||||
}
|
||||
if (this.genericPurchase) {
|
||||
this.makeGenericPurchase(this.item, 'buyModal', this.selectedAmountToBuy);
|
||||
await this.makeGenericPurchase(this.item, 'buyModal', this.selectedAmountToBuy);
|
||||
await this.purchased(this.item.text);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,9 +120,9 @@
|
||||
>
|
||||
<ul>
|
||||
<li>
|
||||
{{ $t('commGuideAKA', {habitName: 'heyeilatan', realName: 'Natalie'}) }}
|
||||
({{ $t('commGuideOnGitHub', {gitHubName: 'CuriousMagpie'}) }})
|
||||
- Web Developer
|
||||
{{ $t('commGuideAKA', {habitName: 'Viirus', realName: 'Phillip'}) }}
|
||||
({{ $t('commGuideOnGitHub', {gitHubName: 'phillipthelen'}) }})
|
||||
- Developer
|
||||
</li>
|
||||
<li>
|
||||
{{ $t('commGuideAKA', {habitName: 'redphoenix', realName: 'Vicky'}) }}
|
||||
@@ -133,10 +133,6 @@
|
||||
{{ $t('commGuideAKA', {habitName: 'Beffymaroo', realName: 'Beth'}) }}
|
||||
- Art, Community Management, Many Hats
|
||||
</li>
|
||||
<li>
|
||||
{{ $t('commGuideAKA', {habitName: 'SabreCat', realName: 'Sabe'}) }}
|
||||
- Web Developer
|
||||
</li>
|
||||
<li>
|
||||
{{ $t('commGuideAKA', {habitName: 'Apollo', realName: 'Tressley'}) }}
|
||||
- Designer
|
||||
@@ -146,8 +142,12 @@
|
||||
- Mobile Designer
|
||||
</li>
|
||||
<li>
|
||||
{{ $t('commGuideAKA', {habitName: 'Viirus', realName: 'Phillip'}) }}
|
||||
- Mobile Developer
|
||||
{{ $t('commGuideAKA', {habitName: 'SabreCat', realName: 'Kalista'}) }}
|
||||
- Web Developer
|
||||
</li>
|
||||
<li>
|
||||
{{ $t('commGuideAKA', {habitName: 'fizself', realName: 'Hafiz'}) }}
|
||||
- Developer
|
||||
</li>
|
||||
</ul>
|
||||
<p v-html="$t('commGuidePara013')"></p>
|
||||
@@ -156,7 +156,7 @@
|
||||
<em>
|
||||
Lemoness, lefnire, Slappybag, litenull, Shaner, Bobbyroberts99, wc8,
|
||||
Breadstrings, Megan, Blade, Daniel the Bard, deilann, shanaqui, Nakonana,
|
||||
Dewines, Alys, Fox_town, MaybeSteveRogers, and Cantras.
|
||||
Dewines, Alys, Fox_town, MaybeSteveRogers, Cantras, and heyeilatan.
|
||||
</em>
|
||||
</p>
|
||||
<h2 id="final">
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
</button>
|
||||
<button
|
||||
class="btn btn-secondary d-flex align-items-center justify-content-center"
|
||||
:class="{disabled: !canSave}"
|
||||
:class="{'btn-disabled': !canSave}"
|
||||
type="button"
|
||||
@click="submit()"
|
||||
>
|
||||
@@ -162,13 +162,13 @@
|
||||
>
|
||||
<div
|
||||
class="habit-option-icon svg-icon no-transition"
|
||||
:class="task.up ? '' : 'disabled'"
|
||||
:class="task.up ? '' : 'icon-disabled'"
|
||||
v-html="icons.positive"
|
||||
></div>
|
||||
</div>
|
||||
<div
|
||||
class="habit-option-label no-transition"
|
||||
:class="task.up ? cssClass('icon') : 'disabled'"
|
||||
:class="task.up ? cssClass('icon') : 'label-disabled'"
|
||||
>
|
||||
{{ $t('positive') }}
|
||||
</div>
|
||||
@@ -188,13 +188,13 @@
|
||||
>
|
||||
<div
|
||||
class="habit-option-icon no-transition svg-icon negative mx-auto"
|
||||
:class="task.down ? '' : 'disabled'"
|
||||
:class="task.down ? '' : 'icon-disabled'"
|
||||
v-html="icons.negative"
|
||||
></div>
|
||||
</div>
|
||||
<div
|
||||
class="habit-option-label no-transition"
|
||||
:class="task.down ? cssClass('icon') : 'disabled'"
|
||||
:class="task.down ? cssClass('icon') : 'label-disabled'"
|
||||
>
|
||||
{{ $t('negative') }}
|
||||
</div>
|
||||
@@ -592,7 +592,7 @@
|
||||
<button
|
||||
class="btn btn-primary btn-footer
|
||||
d-flex align-items-center justify-content-center"
|
||||
:class="{disabled: !canSave}"
|
||||
:class="{'btn-disabled': !canSave}"
|
||||
type="button"
|
||||
@click="submit()"
|
||||
>
|
||||
@@ -881,12 +881,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
.disabled {
|
||||
.btn-disabled {
|
||||
background-color: $white;
|
||||
border: 2px solid transparent;
|
||||
color: $gray-200;
|
||||
line-height: 1.714;
|
||||
box-shadow: 0px 1px 3px 0px rgba(26, 24, 29, 0.12), 0px 1px 2px 0px rgba(26, 24, 29, 0.24);
|
||||
cursor: not-allowed;
|
||||
opacity: 0.6;
|
||||
|
||||
&:focus {
|
||||
background-color: $white;
|
||||
@@ -948,7 +950,7 @@
|
||||
height: 10px;
|
||||
color: $white;
|
||||
|
||||
&.disabled {
|
||||
&.icon-disabled {
|
||||
color: $gray-200;
|
||||
}
|
||||
|
||||
@@ -962,7 +964,7 @@
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
|
||||
&.disabled {
|
||||
&.label-disabled {
|
||||
color: $gray-100;
|
||||
font-weight: normal;
|
||||
}
|
||||
@@ -1018,7 +1020,7 @@
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.disabled .input-group-text {
|
||||
.input-group-outer.disabled .input-group-text {
|
||||
color: $gray-200;
|
||||
}
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
.toggle-switch-inner:before {
|
||||
content: "";
|
||||
padding-left: 10px;
|
||||
background-color: $green-10;
|
||||
background-color: $green-50;
|
||||
}
|
||||
|
||||
.toggle-switch-inner:after {
|
||||
|
||||
@@ -1126,7 +1126,12 @@ export default {
|
||||
this.loadUser();
|
||||
this.oldTitle = this.$store.state.title;
|
||||
this.handleExternalLinks();
|
||||
this.selectPage(this.startingPage);
|
||||
// Check if there's a hash in the URL to determine the starting page
|
||||
let pageToSelect = this.startingPage;
|
||||
if (window.location.hash && (window.location.hash === '#stats' || window.location.hash === '#achievements')) {
|
||||
pageToSelect = window.location.hash.substring(1);
|
||||
}
|
||||
this.selectPage(pageToSelect);
|
||||
this.$root.$on('habitica:report-profile-result', () => {
|
||||
this.loadUser();
|
||||
});
|
||||
@@ -1211,10 +1216,15 @@ export default {
|
||||
},
|
||||
selectPage (page) {
|
||||
this.selectedPage = page || 'profile';
|
||||
window.history.replaceState(null, null, '');
|
||||
const profileUserId = this.userId || this.userLoggedIn._id;
|
||||
let newPath = `/profile/${profileUserId}`;
|
||||
if (page !== 'profile') {
|
||||
newPath += `#${page}`;
|
||||
}
|
||||
window.history.replaceState(null, null, newPath);
|
||||
this.$store.dispatch('common:setTitle', {
|
||||
section: this.$t('user'),
|
||||
subSection: this.$t(this.startingPage),
|
||||
subSection: this.$t(page),
|
||||
});
|
||||
},
|
||||
getNextIncentive () {
|
||||
|
||||
@@ -3,14 +3,10 @@ import isEqual from 'lodash/isEqual';
|
||||
import keys from 'lodash/keys';
|
||||
import pick from 'lodash/pick';
|
||||
import amplitude from 'amplitude-js';
|
||||
import { gtag, install } from 'ga-gtag';
|
||||
import Vue from 'vue';
|
||||
import getStore from '@/store';
|
||||
|
||||
const AMPLITUDE_KEY = import.meta.env.AMPLITUDE_KEY;
|
||||
const DEBUG_ENABLED = import.meta.env.DEBUG_ENABLED === 'true';
|
||||
const GA_ID = import.meta.env.GA_ID;
|
||||
const IS_PRODUCTION = import.meta.env.NODE_ENV === 'production';
|
||||
const REQUIRED_FIELDS = ['eventCategory', 'eventAction'];
|
||||
|
||||
let analyticsLoading = false;
|
||||
@@ -19,7 +15,7 @@ let analyticsReady = false;
|
||||
function _getConsentedUser () {
|
||||
const store = getStore();
|
||||
const user = store.state.user.data;
|
||||
if (!user?.preferences?.analyticsConsent || navigator.globalPrivacyControl) {
|
||||
if (!user?.preferences?.analyticsConsent) {
|
||||
return false;
|
||||
}
|
||||
return user;
|
||||
@@ -69,10 +65,6 @@ function _gatherUserStats (properties) {
|
||||
export function safeSetup (userId) {
|
||||
if (analyticsLoading || analyticsReady) return;
|
||||
analyticsLoading = true;
|
||||
install(GA_ID, {
|
||||
debug_mode: DEBUG_ENABLED || !IS_PRODUCTION,
|
||||
user_id: userId,
|
||||
});
|
||||
amplitude.getInstance().init(AMPLITUDE_KEY, userId);
|
||||
analyticsReady = true;
|
||||
analyticsLoading = false;
|
||||
@@ -90,7 +82,6 @@ export function track (properties, options = {}) {
|
||||
// Track events on the server by default
|
||||
if (trackOnClient === true) {
|
||||
amplitude.getInstance().logEvent(properties.eventAction, properties);
|
||||
gtag('event', properties.eventAction, properties);
|
||||
} else {
|
||||
const store = getStore();
|
||||
store.dispatch('analytics:trackEvent', properties);
|
||||
@@ -105,7 +96,6 @@ export function updateUser (properties = {}) {
|
||||
// Use nextTick to avoid blocking the UI
|
||||
Vue.nextTick(() => {
|
||||
_gatherUserStats(properties);
|
||||
gtag('set', 'user_properties', properties);
|
||||
forEach(properties, (value, key) => {
|
||||
const identify = new amplitude.Identify().set(key, value);
|
||||
amplitude.getInstance().identify(identify);
|
||||
|
||||
@@ -1,7 +1,16 @@
|
||||
import habiticaMarkdown from 'habitica-markdown/withMentions';
|
||||
import escapeRegExp from 'lodash/escapeRegExp';
|
||||
|
||||
export default function renderWithMentions (text, user) {
|
||||
if (!text) return null;
|
||||
const env = { userName: user.auth.local.username, displayName: user.profile.name };
|
||||
return habiticaMarkdown.render(String(text), env);
|
||||
const env = { userName: user.auth.local.username };
|
||||
let html = habiticaMarkdown.render(String(text), env);
|
||||
|
||||
if (user.auth.local.username) {
|
||||
const username = escapeRegExp(user.auth.local.username);
|
||||
const regex = new RegExp(`(<span class="at-text">@)(${username})(</span>)`, 'gi');
|
||||
html = html.replace(regex, (match, p1, p2, p3) => `${p1.replace('at-text', 'at-text at-highlight')}${p2}${p3}`);
|
||||
}
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
@@ -30,8 +30,8 @@ export default [
|
||||
uuid: '61b2c855-0a30-444c-bcc6-1cac876460b0',
|
||||
},
|
||||
{
|
||||
name: 'heyeilatan',
|
||||
name: 'fizself',
|
||||
type: 'Staff',
|
||||
uuid: 'f4e5c6da-0617-48bf-b3bd-9f97636774a8',
|
||||
uuid: 'e39ea3eb-28d2-48da-8568-7a5b0e64498e',
|
||||
},
|
||||
];
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
}
|
||||
|
||||
.settings-content {
|
||||
flex: 0 0 732px;
|
||||
flex: 0 0 751px;
|
||||
max-width: unset;
|
||||
|
||||
::v-deep {
|
||||
|
||||
@@ -33,6 +33,21 @@
|
||||
v-html="$t('privacySettingsOverview') + ' ' + $t('learnMorePrivacy')"
|
||||
>
|
||||
</p>
|
||||
<div
|
||||
v-if="gpcEnabled"
|
||||
class="mx-4 px-3 py-2 mb-4 gpc-alert d-flex align-items-center black bg-yellow-50"
|
||||
>
|
||||
<div
|
||||
class="svg svg-icon mr-2"
|
||||
v-html="icons.alert"
|
||||
>
|
||||
</div>
|
||||
<div
|
||||
class="gpc-message"
|
||||
v-html="gpcInfo"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="d-flex justify-content-center"
|
||||
>
|
||||
@@ -91,6 +106,29 @@
|
||||
line-height: 1.33;
|
||||
}
|
||||
|
||||
.gpc-alert {
|
||||
border-radius: 4px;
|
||||
line-height: 1.714;
|
||||
|
||||
.gpc-message {
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
::v-deep a {
|
||||
color: $black;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.svg-icon {
|
||||
width: 16px;
|
||||
opacity: 0.75;
|
||||
|
||||
::v-deep svg path {
|
||||
fill: $black;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.mb-28p {
|
||||
margin-bottom: 28px;
|
||||
}
|
||||
@@ -110,6 +148,7 @@ import ToggleSwitch from '@/components/ui/toggleSwitch.vue';
|
||||
import { GenericUserPreferencesMixin } from '@/pages/settings/components/genericUserPreferencesMixin';
|
||||
import { InlineSettingMixin } from '../components/inlineSettingMixin';
|
||||
import { mapState } from '@/libs/store';
|
||||
import alert from '@/assets/svg/for-css/alert.svg?raw';
|
||||
|
||||
export default {
|
||||
mixins: [
|
||||
@@ -120,14 +159,32 @@ export default {
|
||||
SaveCancelButtons,
|
||||
ToggleSwitch,
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
icons: Object.freeze({
|
||||
alert,
|
||||
}),
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
user: 'user.data',
|
||||
}),
|
||||
gpcEnabled () {
|
||||
return navigator.globalPrivacyControl;
|
||||
},
|
||||
gpcInfo () {
|
||||
const gpcUrl = 'https://globalprivacycontrol.org/';
|
||||
if (this.user.preferences.analyticsConsent) {
|
||||
return this.$t('gpcPlusAnalytics', { url: gpcUrl });
|
||||
}
|
||||
return this.$t('gpcWarning', { url: gpcUrl });
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
finalize () {
|
||||
this.setUserPreference('analyticsConsent');
|
||||
localStorage.setItem('analyticsConsent', this.user.preferences.analyticsConsent);
|
||||
this.mixinData.inlineSettingMixin.sharedState.inlineSettingUnsavedValues = false;
|
||||
},
|
||||
prefToggled () {
|
||||
@@ -135,7 +192,10 @@ export default {
|
||||
this.mixinData.inlineSettingMixin.sharedState.inlineSettingUnsavedValues = newVal;
|
||||
},
|
||||
resetControls () {
|
||||
this.user.preferences.analyticsConsent = !this.user.preferences.analyticsConsent;
|
||||
if (this.mixinData.inlineSettingMixin.sharedState.inlineSettingUnsavedValues) {
|
||||
this.user.preferences.analyticsConsent = !this.user.preferences.analyticsConsent;
|
||||
this.mixinData.inlineSettingMixin.sharedState.inlineSettingUnsavedValues = false;
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -263,11 +263,12 @@ export default {
|
||||
this.$store.dispatch('tasks:fetchUserTasks'),
|
||||
]).then(() => {
|
||||
this.$store.state.isUserLoaded = true;
|
||||
const analyticsConsent = localStorage.getItem('analyticsConsent');
|
||||
if (analyticsConsent !== null
|
||||
&& analyticsConsent !== this.user.preferences.analyticsConsent
|
||||
) {
|
||||
this.$store.dispatch('user:set', { 'preferences.analyticsConsent': analyticsConsent });
|
||||
let analyticsConsent = localStorage.getItem('analyticsConsent');
|
||||
if (analyticsConsent !== null) {
|
||||
analyticsConsent = analyticsConsent === 'true';
|
||||
if (analyticsConsent !== this.user.preferences.analyticsConsent) {
|
||||
this.$store.dispatch('user:set', { 'preferences.analyticsConsent': analyticsConsent });
|
||||
}
|
||||
}
|
||||
if (window && window['habitica-i18n']) {
|
||||
if (this.user.preferences.language === window['habitica-i18n'].language.code) {
|
||||
|
||||
@@ -24,6 +24,8 @@ const AdminContainerPage = () => import(/* webpackChunkName: "admin-panel" */'@/
|
||||
const AdminPanelPage = () => import(/* webpackChunkName: "admin-panel" */'@/components/admin/admin-panel');
|
||||
const AdminPanelUserPage = () => import(/* webpackChunkName: "admin-panel" */'@/components/admin/admin-panel/user-support');
|
||||
const AdminPanelSearchPage = () => import(/* webpackChunkName: "admin-panel" */'@/components/admin/admin-panel/search');
|
||||
const GroupAdminPage = () => import(/* webpackChunkName: "admin-panel" */'@/components/admin/groups');
|
||||
const GroupAdminGroupPage = () => import(/* webpackChunkName: "admin-panel" */'@/components/admin/groups/group-support');
|
||||
const BlockerPage = () => import(/* webpackChunkName: "admin-panel" */'@/components/admin/blocker');
|
||||
|
||||
// Tasks
|
||||
@@ -88,6 +90,9 @@ const router = new VueRouter({
|
||||
path: '/profile/:userId',
|
||||
props: true,
|
||||
},
|
||||
{ name: 'profile', path: '/user/profile' },
|
||||
{ name: 'stats', path: '/user/stats' },
|
||||
{ name: 'achievements', path: '/user/achievements' },
|
||||
{
|
||||
path: '/inventory',
|
||||
component: InventoryContainer,
|
||||
@@ -216,6 +221,28 @@ const router = new VueRouter({
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'groupAdmin',
|
||||
path: 'groups',
|
||||
component: GroupAdminPage,
|
||||
meta: {
|
||||
privilegeNeeded: [ // any one of these is enough to give access
|
||||
'groupSupport',
|
||||
],
|
||||
},
|
||||
children: [
|
||||
{
|
||||
name: 'groupAdminGroup',
|
||||
path: ':groupId',
|
||||
component: GroupAdminGroupPage,
|
||||
meta: {
|
||||
privilegeNeeded: [
|
||||
'groupsSupport',
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'blockers',
|
||||
path: 'blockers',
|
||||
@@ -345,6 +372,10 @@ router.beforeEach(async (to, from, next) => {
|
||||
if (to.params.startingPage !== undefined) {
|
||||
startingPage = to.params.startingPage;
|
||||
}
|
||||
// Check if there's a hash in the URL for stats or achievements
|
||||
if (to.hash === '#stats' || to.hash === '#achievements') {
|
||||
startingPage = to.hash.substring(1);
|
||||
}
|
||||
if (from.name === null) {
|
||||
store.state.postLoadModal = `profile/${to.params.userId}`;
|
||||
return next({ name: 'tasks' });
|
||||
@@ -365,10 +396,18 @@ router.beforeEach(async (to, from, next) => {
|
||||
}
|
||||
|
||||
if ((to.name === 'stats' || to.name === 'achievements' || to.name === 'profile') && from.name !== null) {
|
||||
const userId = store.state.user.data._id;
|
||||
let redirectPath = `/profile/${userId}`;
|
||||
if (to.name === 'stats') {
|
||||
redirectPath += '#stats';
|
||||
} else if (to.name === 'achievements') {
|
||||
redirectPath += '#achievements';
|
||||
}
|
||||
router.app.$emit('habitica:show-profile', {
|
||||
userId,
|
||||
startingPage: to.name,
|
||||
fromPath: from.path,
|
||||
toPath: to.path,
|
||||
toPath: redirectPath,
|
||||
});
|
||||
return null;
|
||||
}
|
||||
|
||||
31
website/client/src/store/actions/admin.js
Normal file
@@ -0,0 +1,31 @@
|
||||
import axios from 'axios';
|
||||
|
||||
export async function searchUsers (store, payload) {
|
||||
const url = `/api/v4/admin/search/${payload.userIdentifier}`;
|
||||
const response = await axios.get(url);
|
||||
return response.data.data;
|
||||
}
|
||||
|
||||
export async function getUserHistory (store, payload) {
|
||||
const url = `/api/v4/admin/user/${payload.userIdentifier}/history`;
|
||||
const response = await axios.get(url);
|
||||
return response.data.data;
|
||||
}
|
||||
|
||||
export async function getSubscriptionPaymentDetails (store, payload) {
|
||||
const url = `/api/v4/admin/user/${payload.userIdentifier}/subscription-payment-details`;
|
||||
const response = await axios.get(url);
|
||||
return response.data.data;
|
||||
}
|
||||
|
||||
export async function getGroup (store, payload) {
|
||||
const url = `/api/v4/admin/groups/${payload.groupId}`;
|
||||
const response = await axios.get(url);
|
||||
return response.data.data;
|
||||
}
|
||||
|
||||
export async function updateGroup (store, payload) {
|
||||
const url = `/api/v4/admin/groups/${payload.groupId || payload.group._id}`;
|
||||
const response = await axios.put(url, payload.group);
|
||||
return response.data.data;
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
import axios from 'axios';
|
||||
|
||||
export async function searchUsers (store, payload) {
|
||||
const url = `/api/v4/admin/search/${payload.userIdentifier}`;
|
||||
const response = await axios.get(url);
|
||||
return response.data.data;
|
||||
}
|
||||
|
||||
export async function getUserHistory (store, payload) {
|
||||
const url = `/api/v4/admin/user/${payload.userIdentifier}/history`;
|
||||
const response = await axios.get(url);
|
||||
return response.data.data;
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
import axios from 'axios';
|
||||
import { authAsCredentialsState, LOCALSTORAGE_AUTH_KEY } from '@/libs/auth';
|
||||
|
||||
const GA_ID = import.meta.env.GA_ID;
|
||||
|
||||
function saveLocalDataAuth (store, apiId, apiToken) {
|
||||
const credentialsObj = {
|
||||
auth: {
|
||||
@@ -123,9 +121,6 @@ export async function appleAuth (store, params) {
|
||||
export function logout (store, options = {}) {
|
||||
localStorage.clear();
|
||||
sessionStorage.clear();
|
||||
if (window.gtag) {
|
||||
window.gtag('config', GA_ID, { user_id: null });
|
||||
}
|
||||
const query = options.redirectToLogin === true ? '?redirectToLogin=true' : '';
|
||||
window.location.href = `/logout-server${query}`;
|
||||
}
|
||||
|
||||
@@ -38,3 +38,9 @@ export async function getHeroGroupPlans (store, payload) {
|
||||
const response = await axios.get(url);
|
||||
return response.data.data;
|
||||
}
|
||||
|
||||
export async function deleteHero (store, payload) {
|
||||
const url = `/api/v4/members/${payload.uuid}?deleteAccount=${payload.deleteHabiticaAccount}&deleteAmplitude=${payload.deleteAmplitudeData}`;
|
||||
const response = await axios.delete(url);
|
||||
return response.data.data;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { flattenAndNamespace } from '@/libs/store/helpers/internals';
|
||||
|
||||
import * as adminPanel from './adminPanel';
|
||||
import * as admin from './admin';
|
||||
import * as common from './common';
|
||||
import * as user from './user';
|
||||
import * as tasks from './tasks';
|
||||
@@ -26,7 +26,7 @@ import * as blockers from './blockers';
|
||||
// Example: fetch in user.js -> 'user:fetch'
|
||||
|
||||
const actions = flattenAndNamespace({
|
||||
adminPanel,
|
||||
admin,
|
||||
common,
|
||||
user,
|
||||
tasks,
|
||||
|
||||
@@ -12,12 +12,12 @@ describe('renderWithMentions', () => {
|
||||
expect(result).to.be.null;
|
||||
});
|
||||
|
||||
test('highlights displayname', () => {
|
||||
test('does not highlight displayname to prevent impersonation', () => {
|
||||
const text = 'hello @displayedUser with text after';
|
||||
|
||||
const result = renderMarkdown(text, user('user', 'displayedUser'));
|
||||
|
||||
expect(result).to.contain('<span class="at-text at-highlight">@displayedUser</span>');
|
||||
expect(result).to.contain('<span class="at-text">@displayedUser</span>');
|
||||
expect(result).to.not.contain('<span class="at-text at-highlight">@displayedUser</span>');
|
||||
});
|
||||
|
||||
test('highlights username', () => {
|
||||
@@ -56,7 +56,8 @@ describe('renderWithMentions', () => {
|
||||
|
||||
const result = renderMarkdown(plainText, user('use', 'mentions'));
|
||||
|
||||
expect(result).to.contain('<span class="at-text at-highlight">@mentions</span>');
|
||||
expect(result).to.contain('<span class="at-text">@mentions</span>');
|
||||
expect(result).to.not.contain('<span class="at-text at-highlight">@mentions</span>');
|
||||
expect(result).to.contain('<span class="at-text at-highlight">@use</span>');
|
||||
expect(result).to.contain('<span class="at-text">@mail</span>');
|
||||
expect(result).to.not.contain('<span class="at-text at-highlight">@mentions</span>.com');
|
||||
|
||||
@@ -26,7 +26,6 @@ const envVars = [
|
||||
'EMAILS_COMMUNITY_MANAGER_EMAIL',
|
||||
'EMAILS_TECH_ASSISTANCE_EMAIL',
|
||||
'EMAILS_PRESS_ENQUIRY_EMAIL',
|
||||
'GA_ID',
|
||||
'STRIPE_PUB_KEY',
|
||||
'GOOGLE_CLIENT_ID',
|
||||
'APPLE_AUTH_CLIENT_ID',
|
||||
@@ -36,7 +35,7 @@ const envVars = [
|
||||
'TIME_TRAVEL_ENABLED',
|
||||
'DEBUG_ENABLED',
|
||||
'CONTENT_SWITCHOVER_TIME_OFFSET',
|
||||
// TODO necessary? if yes how not to mess up with vue cli? 'NODE_ENV'
|
||||
'PLAY_CONSOLE_ORDERS_BASE_URL',
|
||||
];
|
||||
|
||||
const envObject = {};
|
||||
|
||||
@@ -108,5 +108,6 @@
|
||||
"resetFlagCount": "Markierungszähler zurücksetzen",
|
||||
"cannotClone": "Diese Herausforderung kann nicht dupliziert werden, weil einer oder mehrere Spieler sie als unangemessen gemeldet haben. Einer der Mitarbeiter wird dich in Kürze mit Anweisungen kontaktieren. Wenn mehr als 48 Stunden vergangen sind, und du nichts von ihnen gehört hast, schicke bitte eine Email an admin@habitica.com, um Unterstützung zu erhalten.",
|
||||
"resetFlags": "Markierungen zurücksetzen",
|
||||
"messageChallengeFlagOfficial": "Offizielle Herausforderungen können nicht gemeldet werden."
|
||||
"messageChallengeFlagOfficial": "Offizielle Herausforderungen können nicht gemeldet werden.",
|
||||
"deleteChallengeRefundDescription": "Wenn du diese Herausforderung löschst, bekommst du den Preis in Edelsteinen erstattet und die Aufgaben der Herausforderung verbleiben auf der Aufgabentafel der Teilnehmer."
|
||||
}
|
||||
|
||||
@@ -28,10 +28,10 @@
|
||||
"marketing1Lead1Title": "Mache dein Leben zum Spiel",
|
||||
"marketing1Lead1": "Habitica ist die perfekte App, für alle die Probleme mit ToDo-Listen haben. Wir verwenden bekannte Spiel-Mechaniken wie Belohnungen in Gold, XP und Gegenstände, die dir dabei helfen, dich produktiver zu fühlen und dein Erfolgserlebnis zu steigern, wenn du Aufgaben vollendest. Je besser Du Dich dabei anstellst, umso weiter kommst Du im Spiel.",
|
||||
"marketing1Lead2Title": "Rüsten dich mit Stil aus",
|
||||
"marketing1Lead2": "Sammele Schwerter, Rüstungen und vieles mehr mit Gold, welches du beim Vollenden von Aufgaben verdienst. Mit hunderten von Ausrüstungsstücken, die du sammeln und auswählen kannst, werden dir nie Kombinationen zum Ausprobieren ausgehen. Optimiere deine Statistik, deinen Style oder beides zusammen! ",
|
||||
"marketing1Lead2": "Sammele Schwerter, Rüstungen und vieles mehr mit dem Gold, das du beim Vollenden von Aufgaben verdienst. Mit hunderten von Stücken zum Sammeln, aus denen du auswählen kannst, werden dir die Kombinationen zum Ausprobieren nie ausgehen. Optimiere deine Werte, deinen Style oder beides! ",
|
||||
"marketing1Lead3Title": "Verdiene Belohnungen für deine Bemühungen",
|
||||
"marketing1Lead3": "Etwas zu haben, auf das man sich freuen kann, mag den Unterschied ausmachen, ob man eine Aufgabe erledigt oder ob sie einen wochenlang quält. Wenn das Leben keine Belohnung bietet ist Habitica für dich da! Du wirst für jede Aufgabe belohnt, aber Überraschungen gibt es an jeder Ecke - also mach weiter so! ",
|
||||
"marketing2Header": "Schließe dich mit Freunden zusammen",
|
||||
"marketing2Header": "Verbünde dich mit Freunden",
|
||||
"marketing2Lead1Title": "Soziale Produktivität",
|
||||
"marketing2Lead1": "Hole dir einen Motivationsschub, indem du mit anderen zusammenarbeitest, konkurrierst und interagierst! Habitica wurde entwickelt, um den effektivsten Teil eines jeden Selbstverbesserungsprogramms zu nutzen: soziale Verantwortung.",
|
||||
"marketing2Lead2Title": "Bekämpfe Monster in Quests",
|
||||
|
||||
@@ -2215,9 +2215,9 @@
|
||||
"armorSpecialWinter2021RogueText": "Efeu-Grünes Gewand",
|
||||
"weaponSpecialWinter2021HealerNotes": "Dirigiere deine Kämpfe mit unvorhersehbarem Schwung, wie ein Schneegestöber! Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2020-2021 Winterausrüstung.",
|
||||
"weaponSpecialWinter2021HealerText": "Flocken Flanken Rute",
|
||||
"weaponSpecialWinter2021MageNotes": "Diese mächtige Waffe ist nicht nur eine Phase! Konzentriere deine Kräfte, fokussiere den Verlauf eines Monates und studiere den Lauf von Zeit und Raum. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2020-2021 Winterausrüstung.",
|
||||
"weaponSpecialWinter2021MageNotes": "Diese mächtige Waffe ist definitiv mehr als nur eine Phase! Konzentriere deine Kräfte, fokussiere auf den Verlauf des Monates und studiere den Lauf von Zeit und Raum. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2020-2021 Winterausrüstung.",
|
||||
"weaponSpecialWinter2021MageText": "Magischer Mond-Phaser",
|
||||
"weaponSpecialWinter2021WarriorNotes": "Hiermit kannst Du die größten Frische an Land ziehen! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2020-2021 Winterausrüstung.",
|
||||
"weaponSpecialWinter2021WarriorNotes": "Hiermit kannst Du die größten Fische an Land ziehen! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2020-2021 Winterausrüstung.",
|
||||
"weaponSpecialWinter2021WarriorText": "Mächtige Angelrute",
|
||||
"weaponSpecialWinter2021RogueNotes": "Tarnung und Waffe in einem, die giftigen Früchte der Stechpalme helfen dir mit den schwierigsten Aufgaben umzugehen. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2020-2021 Winterausrüstung.",
|
||||
"weaponSpecialWinter2021RogueText": "Ilex-Beeren Morgenstern",
|
||||
@@ -3413,5 +3413,31 @@
|
||||
"headSpecialFall2025MageNotes": "Ätherisch und glühend - diese Maske bedeckt deinen Kopf, während du alle deine wichtigen Aufgaben abdeckst. Erhöht Wahrnehmung um <%= per %>. Limitierte Herbstausrüstung 2025.",
|
||||
"armorArmoireRedWaistcoatNotes": "Sieh elegant und umwerfend aus, während du deine Aufgaben bewältigst. In der Westentasche ist etwas geheimes versteckt — was denkst du, könnte es sein? Erhöht Ausdauer und Stärke um jeweils <%= attrs %>. Verzauberter Schrank: Rote Weste Set (Gegenstand 2 von 2)",
|
||||
"armorArmoireSoftOrangeSuitNotes": "Orange ist eine lebhafte Farbe. Zieh dies an, wenn du zu Bett gehst und in allen Abenteuern, denen du in deinen Träumen begegnest, wirst du sicher Erfolg haben. Erhöht Ausdauer und Stärke um jeweils <%= attrs %> . Verzauberter Schrank: Oranges Loungewear-Set (Gegenstand 2 von 3).",
|
||||
"headSpecialFall2025HealerNotes": "Markant und gehörnt - diese Maske bedeckt deinen Kopf, während du alle deine wichtigen Aufgaben abdeckst. Erhöht Intelligenz um <%= int %>. Limitierte Herbstausrüstung 2025."
|
||||
"headSpecialFall2025HealerNotes": "Markant und gehörnt - diese Maske bedeckt deinen Kopf, während du alle deine wichtigen Aufgaben abdeckst. Erhöht Intelligenz um <%= int %>. Limitierte Herbstausrüstung 2025.",
|
||||
"headArmoireRedNewsieHatText": "Rote Zeitungsjungenmütze",
|
||||
"headArmoireRedNewsieHatNotes": "Extra! Extra! Lesen Sie alles darüber: Diese Mütze ist bequem, modisch und praktisch. Erhöht die Wahrnehmung und Intelligenz um jeweils <%= attrs %>. Verzauberter Kleiderschrank: Rotes Weste-Set (Item 1 von 2)",
|
||||
"headArmoireFloppyOrangeHatText": "Orangener Schlapphut",
|
||||
"headArmoireFloppyOrangeHatNotes": "In diesen simplen Hut wurden zahlreiche Zauber eingearbeitet, die ihm eine auffällige orange Farbe verleihen. Erhöht alle Werte um jeweils <%= attrs %>. Verzauberter Kleiderschrank: Orangenes Loungewear-Set (Item 1 von 3).",
|
||||
"headArmoireBlackHairbowText": "Schwarze Haarschleife",
|
||||
"headArmoireBlackHairbowNotes": "Werde stark, klug und herzhaft, während du diese wunderschöne schwarze Haarschleife trägst! Erhöht Stärke, Intelligenz und Konstitution um jeweils <%= attrs %>. Verzauberter Kleiderschrank: Schwarzes Haarschleifen-Set (Item 1 von 2).",
|
||||
"headArmoireBlacksmithsGogglesText": "Schmiedebrille",
|
||||
"shieldSpecialFall2025RogueNotes": "Eine mächtige Waffe, mit der Sie Ihre To-Do's um die Hälfte reduzieren können. Erhöht Stärke um <%= str %>. Limitierte Ausgabe Herbst 2025 Ausrüstung.",
|
||||
"shieldSpecialFall2025HealerText": "Koboldschild",
|
||||
"shieldMystery202508Text": "Brillante Cyan-Klinge",
|
||||
"shieldMystery202508Notes": "Wenn Sie schon eine rotierende Klinge cool fanden, probieren Sie doch mal zwei! Bietet keinen Vorteil. August 2025 Abonnentengegenstand.",
|
||||
"shieldMystery202511Text": "Frostschild",
|
||||
"shieldMystery202511Notes": "Dieser robuste Schild aus eisigem Gestein schützt dich vor schlechten Gewohnheiten, ohne deine Hände zu vereisen. Verleiht keinen Vorteil. November 2025 Abonnentengegenstand.",
|
||||
"shieldArmoireSoftOrangePillowText": "Weiches orangenes Kissen",
|
||||
"backMystery202510Text": "Gleitende Ghulflügel",
|
||||
"backMystery202510Notes": "Fliege mit diesen riesigen Flügeln lautlos durch den heimgesuchten Himmel. Verleiht keinen Vorteil. Oktober 2025 Abonnentengegenstand.",
|
||||
"bodyMystery202509Notes": "Dieser Schal schützt dein Gesicht vor Wind und sieht auch noch verdammt cool aus. Bietet keinen Vorteil. September 2025 Abonnentengegenstand.",
|
||||
"eyewearMystery202510Text": "Gleitende Ghul-Augen",
|
||||
"eyewearMystery202510Notes": "Diese gruseligen Augen leuchten wie der Erntemond. Verleiht keinen Vorteil. Oktober 2025 Abonnentengegenstand.",
|
||||
"headArmoireBlacksmithsGogglesNotes": "Bei der Arbeit in einer Schmiede benötigen Sie einen bruchsicheren und hitzebeständigen Augenschutz. Erhöht die Wahrnehmung um <%= per %>. Verzauberter Schrank: Schmiedeset (Item 1 von 3).",
|
||||
"shieldSpecialFall2025WarriorText": "Sasquatch Schild",
|
||||
"shieldSpecialFall2025WarriorNotes": "Verschaffe dir etwas mehr Zeit zum Nachdenken und Planen, indem du dich vor deinen nächsten Tagesaufgaben abschirmst. Erhöht die Konstitution um <%= con %>. Limitierte Auflage Herbst 2025 Ausrüstung.",
|
||||
"shieldSpecialFall2025HealerNotes": "Verschaffe dir etwas mehr Zeit, um Vorräte zu sammeln, indem du dich vor deinen Aufgaben abschirmst. Erhöht die Konstitution um <%= con %>. Limitierte Ausgabe Herbst 2025 Ausrüstung.",
|
||||
"shieldArmoireSoftOrangePillowNotes": "Der vorbereitete Krieger packt für jede Expedition ein Kissen ein. Mach dich bereit, neue Verpflichtungen zu übernehmen ... sogar während du ein Nickerchen machst. Erhöht Intelligenz und Wahrnehmung um jeweils <%= attrs %>. Verzauberter Kleiderschrank: Orangenes Loungewear-Set (Gegenstand 3 von 3).",
|
||||
"bodyMystery202509Text": "Schal des windgepeitschten Wanderers",
|
||||
"armorSpecialFall2025RogueNotes": "Ein hartes und schmales Ziel in dieser saisonalen Rüstung ist am schwersten zu treffen. Erhöht die Wahrnehmung um <%= per %>. Limitierte Ausgabe Herbst 2025 Ausrüstung."
|
||||
}
|
||||
|
||||
@@ -241,5 +241,6 @@
|
||||
"titleCustomizations": "Individualisierungen",
|
||||
"targetUserNotExist": "Zielbenutzer: '<%= userName %>' existiert nicht.",
|
||||
"newMessage": "Neue Nachricht",
|
||||
"rememberToBeKind": "Bitte sei freundlich, respektvoll, und folge den <a href='/static/community-guidelines' target='_blank'>Community-Richtlinien</a>."
|
||||
"rememberToBeKind": "Bitte sei freundlich, respektvoll, und folge den <a href='/static/community-guidelines' target='_blank'>Community-Richtlinien</a>.",
|
||||
"gem": "Edelstein"
|
||||
}
|
||||
|
||||
@@ -365,12 +365,6 @@
|
||||
"groupUseDefault": "Wähle eine Antwort",
|
||||
"createGroup": "Erstelle eine Gruppe",
|
||||
"groupUse": "Was beschreibt den Zweck Deiner Gruppe am Besten?*",
|
||||
"groupParentChildren": "Eltern(teile), die Aufgaben für ihre Kinder erstellen",
|
||||
"groupCouple": "Ein Paar, das sich Aufgaben teilt",
|
||||
"groupFriends": "Freunde, die sich Aufgaben teilen",
|
||||
"groupCoworkers": "Arbeitskollegen, die sich Aufgaben teilen",
|
||||
"groupManager": "Ein Manager, der Aufgaben für seine Mitarbeiter erstellt",
|
||||
"groupTeacher": "Ein Lehrer, der Aufgaben für seine Schüler oder Studierenden erstellt",
|
||||
"nameStar": "Name*",
|
||||
"descriptionOptional": "Beschreibung",
|
||||
"descriptionOptionalText": "Füge eine Beschreibung hinzu",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"stable": "Haus- und Reittiere",
|
||||
"stable": "Haustiere und Reittiere",
|
||||
"pets": "Haustiere",
|
||||
"activePet": "Aktives Haustier",
|
||||
"noActivePet": "Kein aktives Haustier",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"settings": "Einstellungen",
|
||||
"language": "Sprache",
|
||||
"americanEnglishGovern": "Im Fall von Bedeutungsunterschieden gilt die englische Version.",
|
||||
"helpWithTranslation": "Hast du Interesse, bei der Übersetzung von Habitica helfen? Toll! Dann besuche doch die <a href=\"/groups/guild/7732f64c-33ee-4cce-873c-fc28f147a6f7\">Aspiring Linguists Guild</a>!",
|
||||
"helpWithTranslation": "Hast du Interesse, bei der Übersetzung von Habitica helfen? Toll! Dann besuche doch die <a href=\"https://translate.habitica.com\"> Habitica's Weblate Seite</a>!",
|
||||
"stickyHeader": "Kopfzeile anheften",
|
||||
"newTaskEdit": "Neue Aufgaben im Bearbeiten-Modus öffnen",
|
||||
"reverseChatOrder": "Zeige die Chat-Nachrichten in umgekehrter Reihenfolge",
|
||||
|
||||
@@ -3,5 +3,9 @@
|
||||
"siteBlockers": "Site Blockers",
|
||||
"newsroom": "Newsroom",
|
||||
"adminBlockerTypeDescription": "<b>IP-Address</b> - Block access for a specific IP-Address\n\nClient - Block access for a client based on the \"x-client\" header.\n\nE-Mail - Blocks e-mails from being used for signup.",
|
||||
"adminBlockerAreaDescription": "A blocker can either apply to the full site, completely blocking any access. Or it can apply to purchases, which still allows the site to be accessed."
|
||||
"adminBlockerAreaDescription": "A blocker can either apply to the full site, completely blocking any access. Or it can apply to purchases, which still allows the site to be accessed.",
|
||||
"groupAdmin": "Group Admin",
|
||||
"groupSupportDescription": "Manage groups and their members. You can search for groups by ID, or load your own group by leaving the field blank.",
|
||||
"groupData": "Group Data",
|
||||
"groupPlanSubscription": "Group Plan Subscription"
|
||||
}
|
||||
|
||||
@@ -69,6 +69,7 @@
|
||||
"awardWinners": "Award Winner",
|
||||
"doYouWantedToDeleteChallenge": "Do you want to delete this Challenge?",
|
||||
"deleteChallenge": "Delete Challenge",
|
||||
"deleteChallengeRefundDescription": "If you delete this Challenge, you will be refunded the Gem prize and the Challenge tasks will remain on the participants' task boards.",
|
||||
"challengeNamePlaceholder": "What is your Challenge name?",
|
||||
"challengeSummary": "Summary",
|
||||
"challengeSummaryPlaceholder": "Write a short description advertising your Challenge to other Habiticans. What is the main purpose of your Challenge and why should people join it? Try to include useful keywords in the description so that Habiticans can easily find it when they search!",
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
"passwordReset": "If we have your email or username on file, instructions for setting a new password have been sent to your email.",
|
||||
"invalidLoginCredentialsLong": "Your email, username, or password are incorrect. Please try again or use \"Forgot Password.\"",
|
||||
"invalidCredentials": "There is no account that uses those credentials.",
|
||||
"accountSuspended": "This account, User ID \"<%= userId %>\", has been blocked for breaking the Community Guidelines (https://habitica.com/static/community-guidelines) or Terms of Service (https://habitica.com/static/terms). For details or to ask to be unblocked, please email our Community Manager at <%= communityManagerEmail %> or ask your parent or guardian to email them. Please include your @Username in the email.",
|
||||
"accountSuspended": "Your account @<%= username %> has been blocked. For additional information, or to request an appeal, email admin@habitica.com with your Habitica username or User ID.",
|
||||
"accountSuspendedTitle": "Account has been suspended",
|
||||
"unsupportedNetwork": "This network is not currently supported.",
|
||||
"cantDetachSocial": "Account lacks another authentication method; can't detach this authentication method.",
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
"notEnoughGems": "Not enough Gems",
|
||||
"alreadyHave": "Whoops! You already have this item. No need to buy it again!",
|
||||
"delete": "Delete",
|
||||
"gem": "Gem",
|
||||
"gems": "Gems",
|
||||
"needMoreGems": "Need More Gems?",
|
||||
"needMoreGemsInfo": "Purchase Gems now, or become a subscriber to buy Gems with Gold, get monthly mystery items, enjoy increased drop caps and more!",
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
"needsTextPlaceholder": "Type your message here.",
|
||||
"messageCopiedToClipboard": "Message copied to clipboard.",
|
||||
"leaderOnlyChallenges": "Only group leader can create challenges",
|
||||
"sendGift": "Send a Gift",
|
||||
"sendGift": "Send Gift",
|
||||
"selectGift": "Select Gift",
|
||||
"selectSubscription": "Select Subscription",
|
||||
"sendGiftToWhom": "Who would you like to send a gift to?",
|
||||
@@ -358,12 +358,10 @@
|
||||
"createGroup": "Create a Group",
|
||||
"groupUse": "Which best describes the use of your Group?*",
|
||||
"groupUseDefault": "Choose an answer",
|
||||
"groupParentChildren": "Parent(s) setting up tasks for children",
|
||||
"groupCouple": "Couple sharing tasks",
|
||||
"groupFriends": "Friends sharing tasks",
|
||||
"groupCoworkers": "Coworkers sharing tasks",
|
||||
"groupManager": "Manager setting up tasks for employees",
|
||||
"groupTeacher": "Teacher setting up tasks for students",
|
||||
"groupParentChildren": "Using with my household",
|
||||
"groupFriends": "Using with friends",
|
||||
"groupManager": "Using for work",
|
||||
"groupTeacher": "Using for education",
|
||||
"gettingStarted": "Getting Started",
|
||||
"nameStar": "Name*",
|
||||
"nameStarText": "Add a title",
|
||||
|
||||
@@ -271,5 +271,7 @@
|
||||
"performanceAnalytics": "Performance and Analytics",
|
||||
"usedForSupport": "These are used to improve the user experience, performance, and services of our website and apps. This data is used by our support team when handling requests and bug reports.",
|
||||
"savePreferences": "Save Preferences",
|
||||
"habiticaPrivacyPolicy": "Habitica's Privacy Policy"
|
||||
"habiticaPrivacyPolicy": "Habitica's Privacy Policy",
|
||||
"gpcWarning": "<a href='<%= url %>' target='_blank'>GPC</a> is on. Turning on tracking below will override this and send data to our analytics partners.",
|
||||
"gpcPlusAnalytics": "<a href='<%= url %>' target='_blank'>GPC</a> is on. You have opted in to tracking and sending data to our analytics partners."
|
||||
}
|
||||
|
||||
@@ -901,13 +901,25 @@
|
||||
"backgrounds0420205": "SET 131: Released April 2025",
|
||||
"backgroundGardenWithFlowerBedsText": "Garden with Flower Beds",
|
||||
"backgroundGardenWithFlowerBedsNotes": "Enjoy the blooms of spring in a Garden with Flower Beds.",
|
||||
"backgrounds062025": "第 133 组:由2025 年 6 月发布",
|
||||
"backgroundSummerSeashoreText": "夏日海滨",
|
||||
"backgroundSummerSeashoreNotes": "在夏日海滨乘风破浪.",
|
||||
"backgrounds052025": "第 132 组:于2025 年 5 月发布",
|
||||
"backgroundTrailThroughAForestText": "穿越森林的小径",
|
||||
"backgroundTrailThroughAForestNotes": "沿着穿过森林的小径漫步。",
|
||||
"backgrounds062025": "SET 133: Released June 2025",
|
||||
"backgroundSummerSeashoreText": "Summer Seashore",
|
||||
"backgroundSummerSeashoreNotes": "Catch a wave at a Summer Seashore.",
|
||||
"backgrounds052025": "SET 132: Released May 2025",
|
||||
"backgroundTrailThroughAForestText": "Trail Through a Forest",
|
||||
"backgroundTrailThroughAForestNotes": "Wander down a Trail Through a Forest.",
|
||||
"backgrounds072025": "SET 134: Released July 2025",
|
||||
"backgroundSirensLairText": "Siren's Lair",
|
||||
"backgroundSirensLairNotes": "Dare to dive into a Siren’s Lair."
|
||||
"backgroundSirensLairNotes": "Dare to dive into a Siren’s Lair.",
|
||||
"backgrounds082025": "SET 135: Released August 2025",
|
||||
"backgroundSunnyStreetWithShopsText": "Sunny Street with Shops",
|
||||
"backgroundSunnyStreetWithShopsNotes": "Enjoy the sights and sounds of a Sunny Street with Shops.",
|
||||
"backgrounds092025": "SET 136: Released September 2025",
|
||||
"backgroundAutumnSwampText": "Autumn Swamp",
|
||||
"backgroundAutumnSwampNotes": "Take in the haunting vibes of an Autumn Swamp.",
|
||||
"backgrounds102025": "SET 137: Released October 2025",
|
||||
"backgroundInsideForestWitchsCottageText": "Forest Witch's Cottage",
|
||||
"backgroundInsideForestWitchsCottageNotes": "Weave spells inside a Forest Witch's Cottage.",
|
||||
"backgrounds112025": "SET 138: Released November 2025",
|
||||
"backgroundCastleKeepWithBannersText": "Castle Hall with Banners",
|
||||
"backgroundCastleKeepWithBannersNotes": "Sing tales of heroic deeds in a Castle Hall with Banners."
|
||||
}
|
||||
|
||||
@@ -357,8 +357,6 @@
|
||||
"editParty": "Edit Party",
|
||||
"leaveGuild": "Leave Group",
|
||||
"groupUseDefault": "Choose an answer",
|
||||
"groupParentChildren": "Parent(s) setting up tasks for children",
|
||||
"groupCouple": "Couple sharing tasks",
|
||||
"viewStatus": "Status",
|
||||
"chatTemporarilyUnavailable": "Chat is temporarily unavailable. Please try again later.",
|
||||
"newGroupsBullet01": "Interact with tasks directly from the shared task board",
|
||||
@@ -375,10 +373,6 @@
|
||||
"viewDetails": "View Details",
|
||||
"invitedToThisQuest": "You were invited to this Quest!",
|
||||
"createGroup": "Create a Group",
|
||||
"groupFriends": "Friends sharing tasks",
|
||||
"groupCoworkers": "Coworkers sharing tasks",
|
||||
"groupManager": "Manager setting up tasks for employees",
|
||||
"groupTeacher": "Teacher setting up tasks for students",
|
||||
"nameStar": "Name*",
|
||||
"newGroupsBullet05": "Shared tasks will degrade in color if left incomplete to help track progress",
|
||||
"newGroupsBullet06": "The task status view allows you to quickly see which assignee has completed a task",
|
||||
|
||||
@@ -108,5 +108,6 @@
|
||||
"resetFlags": "Reiniciar marcas",
|
||||
"cannotClose": "Este Desafío no puede cerrarse porque uno o más jugadores lo han marcado como inapropiado. Un miembro del Personal te contactará pronto con instrucciones. Si han pasado más de 48 horas y no has recibido noticias de ellos, envía un correo a admin@habitica.com para solicitar ayuda.",
|
||||
"cannotMakeChallenge": "No puedes crear un Desafío público porque tu cuenta no tiene privilegios de chat en este momento. Envía un mensaje a admin@habitica.com para obtener más información.",
|
||||
"messageChallengeFlagOfficial": "Los Desafíos Oficiales no se pueden notificar."
|
||||
"messageChallengeFlagOfficial": "Los Desafíos Oficiales no se pueden notificar.",
|
||||
"deleteChallengeRefundDescription": "Si cancelas este Desafío, recuperarás las Gemas de la recompensa y las tareas del Desafío permanecerán en los listados de tareas de los participantes."
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
"passwordReset": "Si tenemos constancia de tu correo electrónico o nombre de usuario, te hemos enviado un mensaje con las instrucciones a seguir para establecer una nueva contraseña.",
|
||||
"invalidLoginCredentialsLong": "Tu correo electrónico o contraseña son incorrectos. Por favor intenta de nuevo o pulsa sobre \"¿Has olvidado la contraseña?\"",
|
||||
"invalidCredentials": "No hay ninguna cuenta con esas credenciales.",
|
||||
"accountSuspended": "Esta cuenta, con ID de usuario \"<%= userId %>\", ha sido bloqueada por incumplir las [Normas de la Comunidad](https://habitica.com/static/community-guidelines) o los [Términos de Servicio](https://habitica.com/static/terms). Para más detalles o solicitar su desbloqueo, por favor, envía un correo electrónico a nuestro Community Manager en <%= communityManagerEmail %> o pídele a tu padre o tutor que lo haga. Por favor, incluye tu @NombreDeUsuario en el mismo.",
|
||||
"accountSuspended": "Tu cuenta @<%= username %> ha sido bloqueada. Para más información o para iniciar una apelación, por favor envía un email a admin@habitica.com indicando tu nombre de usuario en Habitica o tu ID de Usuario.",
|
||||
"accountSuspendedTitle": "Esta cuenta ha sido suspendida",
|
||||
"unsupportedNetwork": "La red no está en servicio.",
|
||||
"cantDetachSocial": "La cuenta carece de otro método de autenticación; no se puede separar de este método de autenticación.",
|
||||
|
||||
@@ -3389,7 +3389,7 @@
|
||||
"weaponSpecialFall2025MageNotes": "Una poderosa arma capaz de trazar una senda segura a través de los terrores del Bosque Negro. Aumenta la Inteligencia en <%= int %> y la Percepción en <%= per %>. Equipamiento de Edición Limitada Otoño 2025.",
|
||||
"weaponSpecialFall2025WarriorText": "Hacha de Bigfoot",
|
||||
"weaponSpecialFall2025HealerText": "Hacha Kobold",
|
||||
"weaponSpecialFall2025HealerNotes": "Una poderosa arma capaz de trazar una senda segura a través de los obstáculos del Bosque Negro. Aumenta la Fuerza en <%= str %>. Equipamiento de Edición Limitada Otoño 2025.",
|
||||
"weaponSpecialFall2025HealerNotes": "Una poderosa arma capaz de trazar una senda segura a través de los obstáculos del Bosque Negro. Aumenta la Inteligencia en <%= int %>. Equipamiento de Edición Limitada Otoño 2025.",
|
||||
"weaponSpecialFall2025MageText": "Hacha de Fantasma Enmascarado",
|
||||
"weaponMystery202511Text": "Espada Escarcha",
|
||||
"weaponMystery202511Notes": "El halo helado de esta espada te permitirá realizar con rapidez incluso las tareas rojas más oscuras. No otorga ningún beneficio. Artículo de Suscriptor Noviembre 2025.",
|
||||
|
||||
@@ -241,5 +241,6 @@
|
||||
"playerReportModalBody": "Solo deberías informar de un jugador que de alguna forma quebrantara las <%= firstLinkStart %>Normas de la Comunidad<%= linkEnd %> y/o <%= secondLinkStart %>los Terminos de Servicio<%= linkEnd %>. Enviar un informe falso es una clara violación de la Normas de la Comunidad de Habitica.",
|
||||
"newMessage": "Nuevo Mensaje",
|
||||
"targetUserNotExist": "Usuario objetivo: '<%= userName %>' no existe.",
|
||||
"rememberToBeKind": "Por favor recuerda ser bondadoso, respetuoso y seguir las <a href='/static/community-guidelines' target='_blank'>Normas de la Comunidad</a>."
|
||||
"rememberToBeKind": "Por favor recuerda ser bondadoso, respetuoso y seguir las <a href='/static/community-guidelines' target='_blank'>Normas de la Comunidad</a>.",
|
||||
"gem": "Gema"
|
||||
}
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
"optional": "Opcional",
|
||||
"needsTextPlaceholder": "Escribe tu mensaje aquí.",
|
||||
"leaderOnlyChallenges": "Sólo el Líder del Grupo puede crear desafíos",
|
||||
"sendGift": "Enviar un regalo",
|
||||
"sendGift": "Enviar regalo",
|
||||
"inviteFriends": "Invitar Amigos",
|
||||
"inviteByEmail": "Invita por correo electrónico",
|
||||
"inviteMembersHowTo": "Invita gente a través de un correo electrónico válido o el ID de usuario de 36 dígitos. Si el correo electrónico no ha sido registrado aún, le invitaremos a unirse a Habitica.",
|
||||
@@ -373,10 +373,6 @@
|
||||
"currentlyLookingForParty": "¡Estás buscando un Equipo!",
|
||||
"partyFinderDescription": "¿Quieres a unirte a un Equipo pero no conoces a otros jugadores? Haz saber a los líderes de Equipo que esperas una invitación.",
|
||||
"createGroup": "Crear un Grupo",
|
||||
"groupFriends": "Amigos compartiendo tareas",
|
||||
"groupCoworkers": "Compañeros de trabajo compartiendo tareas",
|
||||
"groupManager": "Gerente organizando tareas para empleados",
|
||||
"groupTeacher": "Profesor organizando tareas para estudiantes",
|
||||
"nameStar": "Nombre*",
|
||||
"nameStarText": "Añade un título",
|
||||
"chatTemporarilyUnavailable": "El chat no está disponible en este momento. Inténtalo de nuevo más tarde.",
|
||||
@@ -408,8 +404,6 @@
|
||||
"assignTo": "Asignar a",
|
||||
"lookForParty": "Buscar un Equipo",
|
||||
"groupUse": "¿Cuál de las siguientes opciones describe mejor a tu Grupo?*",
|
||||
"groupParentChildren": "Padres organizando tareas para niños",
|
||||
"groupCouple": "Pareja compartiendo tareas",
|
||||
"descriptionOptional": "Descripción",
|
||||
"descriptionOptionalText": "Añade una descripción",
|
||||
"nextPaymentMethod": "Siguiente: Pago",
|
||||
|
||||
@@ -271,5 +271,7 @@
|
||||
"privacySettingsOverview": "Habitica usa las cookies para analizar el rendimiento, gestionar solicitudes de soporte y brindarle la mejor experiencia de juego posible. Para eso, necesitamos pedirte los siguientes permisos. Puedes cambiar tus preferencias en cualquier momento desde los ajustes de tu cuenta.",
|
||||
"usedForSupport": "Estás se usan para mejorar la experiencia del usuario, el rendimiento, y los servicios de nuestra página web y nuestras aplicaciones. Estos datos se usan para ayudar a nuestro equipo de soporte cuando tienen que gestionar tanto solicitudes como informes de error.",
|
||||
"privacyOverview": "En el mundo en el que vivimos, parece que todas las compañías buscan obtener beneficios de los datos que recopilan acerca de nosotros. Esto nos dificulta la búsqueda de una aplicación que nos ayude a mejorar nuestros hábitos y estilo de vida. Habitica usa cookies que almacenan nuestros datos solo para analizar el rendimiento, gestionar solicitudes de soporte y brindarnos la mejor experiencia de juego posible. Aún así puedes cambiar tus preferencias en cualquier momento desde los ajustes de tu cuenta.",
|
||||
"acceptAllCookies": "Aceptar Todas las Cookies"
|
||||
"acceptAllCookies": "Aceptar Todas las Cookies",
|
||||
"gpcWarning": "<a href='<%= url %>' target='_blank'>GPC</a>está activado. Al activar el seguimiento de abajo, se anulará esto y se enviarán datos a nuestros socios analíticos.",
|
||||
"gpcPlusAnalytics": "<a href='<%= url %>' target='_blank'>GPC</a>está activado. Ha aceptado el seguimiento y envío de datos a nuestros socios analíticos."
|
||||
}
|
||||
|
||||
@@ -108,5 +108,6 @@
|
||||
"flaggedNotHidden": "Desafío marcado una vez, No esta oculto",
|
||||
"whyReportingChallenge": "Por qué estas reportando este Desafío?",
|
||||
"abuseFlagModalBodyChallenge": "Deberías solo reportar un Desafío que viola las <%= firstLinkStart %>Directrices de la Comunidad<%= linkEnd %> y/o los <%= secondLinkStart %>Términos de Servicio<%= linkEnd %>. Envíar un reporte falso es una violación a las Directrices de la Comunidad.",
|
||||
"resetFlags": "Reiniciar marcadores"
|
||||
"resetFlags": "Reiniciar marcadores",
|
||||
"deleteChallengeRefundDescription": "Si eliminas este Desafío, recuperarás las Gemas de la recompensa y las tareas del Desafío permanecerán en los listados de tareas de los participantes."
|
||||
}
|
||||
|
||||
@@ -108,5 +108,6 @@
|
||||
"cannotClone": "Ce Défi ne peut être dupliqué car un·e ou plusieurs joueu·r·se·s l'ont signalé comme inapproprié. Un·e membre de l'équipe va vous contacter sous peu avec des instructions. Si vous n'avez pas de nouvelles après 48 heures, merci d'envoyer un courriel à admin@habitica.com.",
|
||||
"resetFlags": "Réinitialiser les Signalements",
|
||||
"cannotMakeChallenge": "Vous ne pouvez pas créer de Défis publics car votre compte n'a pour le moment pas les accès aux discussions. Merci de contacter admin@habitica.com pour plus d'informations.",
|
||||
"messageChallengeFlagOfficial": "Les Défis Officiels ne peuvent pas être signalés."
|
||||
"messageChallengeFlagOfficial": "Les Défis Officiels ne peuvent pas être signalés.",
|
||||
"deleteChallengeRefundDescription": "Si vous supprimez ce Défi, les Gemmes investies vous seront restituées et les Tâches du Défis ne disparaîtront pas des Tâches des participant·e·s."
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
"passwordReset": "Si nous avons votre courriel ou votre identifiant dans nos fichiers, un nouveau mot de passe vous a été envoyé.",
|
||||
"invalidLoginCredentialsLong": "Votre email, identifiant ou mot de passe est incorrect. Merci de réessayer ou de faire \"Mot de passe oublié\".",
|
||||
"invalidCredentials": "Aucun compte n'utilise cet identifiant.",
|
||||
"accountSuspended": "Ce compte, identifiant “<%= userId %>”, a été bloqué pour avoir enfreint les règles de vie en communauté (https://habitica.com/static/community-guidelines) ou les conditions d’utilisation (https://habitica.com/static/terms). Pour plus d’informations, ou pour demander un déblocage, merci d’envoyer un courriel à notre gestionnaire de la communauté : <%= communityManagerEmail %>, ou demandez à un parent ou à un tuteur de leur envoyer un courriel. Merci d'y inclure votre @identifiant.",
|
||||
"accountSuspended": "Votre compte @<%= username %> a été bloqué. Pour plus d'informations ou pour faire appel de la décision, merci de nous contacter à admin@habitica.com en indiquant votre identifiant Habitica ou votre ID d'Utilisat·eur·rice.",
|
||||
"accountSuspendedTitle": "Le compte a été suspendu",
|
||||
"unsupportedNetwork": "Ce réseau n'est actuellement pas pris en charge.",
|
||||
"cantDetachSocial": "Votre compte n'a pas d'autre méthode d'authentification ; vous ne pouvez pas désaffecter cette méthode d'authentification.",
|
||||
|
||||
@@ -241,5 +241,6 @@
|
||||
"titleCustomizations": "Personnalisations",
|
||||
"rememberToBeKind": "N'oubliez pas d'être bienveillant·e, respectueu·x·se, et de suivre le <a href='/static/community-guidelines' target='_blank'>Guide de la Communauté</a>.",
|
||||
"newMessage": "Nouveau Message",
|
||||
"targetUserNotExist": "L'Utilisat·eur·rice '<%= userName %>' n'existe pas."
|
||||
"targetUserNotExist": "L'Utilisat·eur·rice '<%= userName %>' n'existe pas.",
|
||||
"gem": "Gemme"
|
||||
}
|
||||
|
||||
@@ -385,15 +385,9 @@
|
||||
"groupUse": "Qu'est ce qui décrit mieux l'usage de votre groupe ?*",
|
||||
"groupUseDefault": "Choisissez une réponse",
|
||||
"createGroup": "Créer un groupe",
|
||||
"groupParentChildren": "Parent(s) qui définissent des tâches pour les enfants",
|
||||
"descriptionOptionalText": "Ajouter une description",
|
||||
"nextPaymentMethod": "Suite : Paiement",
|
||||
"sendGiftLabel": "Voulez vous envoyer un message avec le cadeau ?",
|
||||
"groupCouple": "Couple qui partage ses tâches",
|
||||
"groupFriends": "Amis qui partagent leurs tâches",
|
||||
"groupCoworkers": "Collaborateurs qui partagent leurs tâches",
|
||||
"groupManager": "Responsable qui définit des tâches pour ses employés",
|
||||
"groupTeacher": "Enseignant qui définit des tâches pour les étudiants",
|
||||
"nameStar": "Nom*",
|
||||
"nameStarText": "Ajouter un titre",
|
||||
"descriptionOptional": "Description",
|
||||
|
||||
@@ -271,5 +271,7 @@
|
||||
"habiticaPrivacyPolicy": "Politique de Confidentialité d'Habitica",
|
||||
"privacyOverview": "Dans le monde actuel, on peut avoir l'impression que toutes les entreprises veulent exploiter nos données, ce qui peut rendre la recherche d'application pour améliorer ses habitudes compliquée. Habitica n'utilise les cookies que pour enregistrer des données permettant l'analyse de performance, répondre aux requêtes du support, et vous faire profiter de la meilleure expérience ludique possible. Vous pouvez changer vos préférences à tout moment dans les paramètres de votre compte.",
|
||||
"usedForSupport": "Sont utilisés pour améliorer l'expérience utilisat·eur·rice, les performances et les services pour notre site et nos applications. Ces données sont utilisées par l'équipe du support pour la résolution de requêtes et rapports de bug.",
|
||||
"privacySettingsOverview": "Habitica utilise les cookies pour enregistrer des données permettant l'analyse de performance, répondre aux requêtes du support, et vous faire profiter de la meilleure expérience ludique possible. Pour cela, nous devons vous demander quelques autorisations. Vous pouvez changer vos préférences à tout moment dans les paramètres de votre compte."
|
||||
"privacySettingsOverview": "Habitica utilise les cookies pour enregistrer des données permettant l'analyse de performance, répondre aux requêtes du support, et vous faire profiter de la meilleure expérience ludique possible. Pour cela, nous devons vous demander quelques autorisations. Vous pouvez changer vos préférences à tout moment dans les paramètres de votre compte.",
|
||||
"gpcWarning": "<a href='<%= url %>' target='_blank'>La GPC (Prise en charge du contrôle Global de la vie Privée)</a> est activée. Activer la traçabilité ci-dessous annulera la GPC et enverra des données à nos partenaires analytiques.",
|
||||
"gpcPlusAnalytics": "<a href='<%= url %>' target='_blank'>La GPC (Prise en charge du contrôle Global de la vie Privée)</a> est activée. Vous avez activé la traçabilité pour que vous données soient transférées à nos partenaires analytiques."
|
||||
}
|
||||
|
||||
@@ -1,154 +1,169 @@
|
||||
{
|
||||
"achievement": "Postignuće",
|
||||
"onwards": "Naprijed!",
|
||||
"levelup": "Postizanjem svojih životnih ciljeva, dostigao/la si viši level i sad si u potpunosti iscijeljen/a!",
|
||||
"reachedLevel": "Dostigao/la si level <%= level %>",
|
||||
"achievementLostMasterclasser": "Izvršitelj Pustolovina: Serija Majstora",
|
||||
"achievementLostMasterclasserText": "Izvršeno je svih šesnaest pustolovina u Seriji Majstorskih Pustolovina i otkriven misterij Nestalog Majstora!",
|
||||
"achievementBackToBasics": "Nazad na osnove",
|
||||
"foundNewItems": "Pronašao/la si nove predmete!",
|
||||
"hideAchievements": "Sakrij <%= kategorije%>",
|
||||
"showAllAchievements": "Prikaži sve <%= kategorije%>",
|
||||
"viewAchievements": "Pogledaj postignuća",
|
||||
"levelup": "Postizanjem svojih životnih ciljeva, dosegnuli ste viši razinu i sad ste u potpunosti iscijeljeni!",
|
||||
"reachedLevel": "Dostigli ste razinu <%= level %>",
|
||||
"achievementLostMasterclasser": "Ispunitelj Pustolovina: Serijal Majstorske Klase",
|
||||
"achievementLostMasterclasserText": "Završili su svih šesnaest potraga u serijalu Potraga Majstorske Klase i riješili misterij Izgubljenog Majstora Klase!",
|
||||
"achievementBackToBasics": "Natrag na Osnove",
|
||||
"foundNewItems": "Pronašli ste nove predmete!",
|
||||
"hideAchievements": "Sakrij <%= category%>",
|
||||
"showAllAchievements": "Prikaži sve <%= category%>",
|
||||
"viewAchievements": "Pogledaj Postignuća",
|
||||
"letsGetStarted": "Krenimo!",
|
||||
"yourProgress": "Tvoj napredak",
|
||||
"yourRewards": "Tvoje nagrade",
|
||||
"onboardingCompleteDescSmall": "Ako želiš još više, pogledaj Postignuća i počni skupljati!",
|
||||
"achievementAridAuthorityText": "Ukrotio/la je sve pustinjske životinje za jahanje.",
|
||||
"yourProgress": "Tvoj Napredak",
|
||||
"yourRewards": "Vaše Nagrade",
|
||||
"onboardingCompleteDescSmall": "Ako želite još više, provjerite Postignuća i počnite ih skupljati!",
|
||||
"achievementAridAuthorityText": "Pripitomili su sve Pustinjske jahaće životinje.",
|
||||
"onboardingProgress": "<%= percentage %>% napredak",
|
||||
"achievementAridAuthorityModalText": "Ukrotio/la si sve pustinjske životinje za jahanje!",
|
||||
"earnedAchievement": "Zaslužio/la si postignuće!",
|
||||
"achievementAridAuthorityModalText": "Pripitomili ste sve Pustinjske jahaće životinje!",
|
||||
"earnedAchievement": "Osvojili ste postignuće!",
|
||||
"gettingStartedDesc": "Dovršite ove početne zadatke i osvojit ćete <strong>5 postignuća</strong> i <strong class=\"gold-amount\">100 zlata</strong> kada završite!",
|
||||
"achievementLostMasterclasserModalText": "Završio/la si svih šesnaest pustolovina iz serije Masterclasser Quest i riješio/la misterij Nestalog majistora!",
|
||||
"achievementAllYourBaseModalText": "Ukrotio/la si sve bazne životinje za jahanje!",
|
||||
"achievementBackToBasicsModalText": "Skupio/la si sve osnovne ljubimce!",
|
||||
"achievementDustDevilText": "Sakupio/la je sve pustinjske ljubimce.",
|
||||
"achievementBackToBasicsText": "Prikupio/la je sve osnovne ljubimce.",
|
||||
"achievementLostMasterclasserModalText": "Završili ste svih šesnaest potraga u serijalu Potraga Majstorske Klase i riješili misterij Izgubljenog Majstora Klase!",
|
||||
"achievementAllYourBaseModalText": "Pripitomili ste sve Osnovne jahaće životinje!",
|
||||
"achievementBackToBasicsModalText": "Prikupili ste sve Osnovne ljubimce!",
|
||||
"achievementDustDevilText": "Prikupili su sve Pustinjske ljubimce.",
|
||||
"achievementBackToBasicsText": "Prikupili su sve Osnovne ljubimce.",
|
||||
"achievementMindOverMatter": "Um Nad Materijom",
|
||||
"achievementAllYourBaseText": "Ukrotio/la je sve bazne životinje za jahanje.",
|
||||
"achievementDustDevilModalText": "Skupio/la si sve pustinjske ljubimce!",
|
||||
"achievementAllYourBaseText": "Pripitomili su sve Osnovne jahaće životinje.",
|
||||
"achievementDustDevilModalText": "Prikupili ste sve Pustinjske ljubimce!",
|
||||
"achievementJustAddWater": "Samo Dodaj Vode",
|
||||
"onboardingComplete": "Dovršili ste svoje zadatke za početnike!",
|
||||
"foundNewItemsExplanation": "Završavanje zadataka ti daje priliku da nađeš predmete poput jaja, napitaka za izlijeganje, i hrane za kućne ljubimce.",
|
||||
"achievementDustDevil": "Pustinjski vrag",
|
||||
"onboardingCompleteDesc": "Zaslužio/la si <strong>5 postignuća</strong> i <strong class=\"gold-amount\">100 zlatnika </strong> za završene zadatke s liste.",
|
||||
"foundNewItemsExplanation": "Završavanje zadataka ti daje priliku da nađeš predmete poput jaja, napitaka za izlijeganje, i hrane za ljubimce.",
|
||||
"achievementDustDevil": "Pustinjski Vrag",
|
||||
"onboardingCompleteDesc": "Osvojili ste <strong>5 postignuća</strong> i <strong class=\"gold-amount\">100 zlatnika </strong> za završene zadatke s liste.",
|
||||
"achievementAridAuthority": "Suhi Autoritet",
|
||||
"achievementGroupsBeta2022": "Interaktivni Beta Ispitivač",
|
||||
"achievementGroupsBeta2022Text": "Vi i vaša grupa pružili ste neprocjenjive povratne informacije kako biste pomogli testiranju Habitice.",
|
||||
"achievementGroupsBeta2022ModalText": "Vi i vaše grupe pomogli ste Habitici testiranjem i pružanjem povratnih informacija!",
|
||||
"foundNewItemsCTA": "Krenite u svoj inventar i pokušajte kombinirati svoj novi napitak za izlijganje i jaje!",
|
||||
"achievementMindOverMatterText": "Završio/la je zadatke za kućne ljubimce u Kamenu, Sluzi i Pređi.",
|
||||
"achievementJustAddWaterModalText": "Završili ste zadatke kućnih ljubimaca hobotnice, morskog konjica, sipe, kita, kornjače, golobradne grane, morske zmije i dupina!",
|
||||
"achievementAllYourBase": "Sve Vaše Bazično",
|
||||
"achievementKickstarter2019Text": "Podržao projekt Pin Kickstarter 2019",
|
||||
"achievementPartyUp": "Udružio si se s članom družbe!",
|
||||
"achievementPartyOn": "Vaša družba je narasla na 4 člana!",
|
||||
"achievementMonsterMagus": "Čudovišni čarobnjak",
|
||||
"achievementUndeadUndertakerModalText": "Ukrotio/la sisve Zombie životinje za jahanje!",
|
||||
"foundNewItemsCTA": "Otiđi u svoj Inventar i pokušaj kombinirati svoj novi napitak za izlijeganje i jaje!",
|
||||
"achievementMindOverMatterText": "Završili su pustolovine za ljubimce Kamen, Sluz i Vuna.",
|
||||
"achievementJustAddWaterModalText": "Završili ste pustolovine za ljubimce Hobotnica, Morski konjic, Sipa, Kit, Kornjača, Gološkržnjak, Morska zmija i Dupin!",
|
||||
"achievementAllYourBase": "Sve Vaše Osnovno",
|
||||
"achievementKickstarter2019Text": "Podržali su Pin Kickstarter projekt iz 2019",
|
||||
"achievementPartyUp": "Udružili ste se s članom grupe!",
|
||||
"achievementPartyOn": "Vaša grupa se proširila na 4 člana!",
|
||||
"achievementMonsterMagus": "Čarobnjak Čudovišta",
|
||||
"achievementUndeadUndertakerModalText": "Pripitomili ste sve Zombi jahaće životinje!",
|
||||
"achievementUndeadUndertaker": "Neumorni Pogrebnik",
|
||||
"achievementCreatedTaskText": "Izradili su svoj prvi zadatak.",
|
||||
"achievementCreatedTaskModalText": "Dodajte zadatak za nešto što biste željeli postići ovaj tjedan",
|
||||
"achievementCompletedTaskText": "Izvršili su svoj prvi zadatak.",
|
||||
"achievementCompletedTaskModalText": "Označite bilo koji od svojih zadataka kako biste zaradili nagrade",
|
||||
"achievementCreatedTaskText": "Kreirali su svoj prvi zadatak.",
|
||||
"achievementCreatedTaskModalText": "Dodaj zadatak za nešto što želiš ostvariti ovaj tjedan",
|
||||
"achievementCompletedTaskText": "Završili su svoj prvi zadatak.",
|
||||
"achievementCompletedTaskModalText": "Označite svoje zadatke kako biste dobili nagrade",
|
||||
"achievementHatchedPetText": "Izlegli su svog prvog ljubimca.",
|
||||
"achievementHatchedPetModalText": "Prijeđite na svoj inventar i pokušajte kombinirati napitak za izleganje i jaje",
|
||||
"achievementFedPetText": "Nahranili svog prvog ljubimca.",
|
||||
"achievementFedPetModalText": "Postoji mnogo različitih vrsta hrane, ali kućni ljubimci mogu biti izbirljivi",
|
||||
"achievementPurchasedEquipmentModalText": "Oprema je način da prilagodite svog avatara i poboljšate svoju statistiku",
|
||||
"achievementPrimedForPaintingModalText": "Prikupio/la si sve Bijele ljubimce!",
|
||||
"achievementPearlyProModalText": "Ukrotio/la si sve bijele životinje za jahanje!",
|
||||
"achievementTickledPinkText": "Sakupio/la je sve Cotton Candy Roze Ljubimce.",
|
||||
"achievementTickledPinkModalText": "Sakupio/la si sve Cotton Candy Roze Ljubimce!",
|
||||
"achievementRosyOutlookText": "Ukrotio/la je sve Cotton Candy Roze životinje za jahanje.",
|
||||
"achievementBugBonanzaModalText": "Dovršio/la simisije za kućne ljubimce Bube, Leptira, Puža i Pauka!",
|
||||
"achievementBareNecessities": "Najpotrebnije",
|
||||
"achievementAllThatGlittersText": "Ukrotio/la je sve zlatne životinje za jahanje.",
|
||||
"achievementAllThatGlittersModalText": "Ukrotio/la si sve zlatne životinje za jahanje!",
|
||||
"achievementBoneCollectorModalText": "Sakupio/la sisve Kosturske Ljubimce!",
|
||||
"achievementRedLetterDay": "Dan crvenih slova",
|
||||
"achievementLegendaryBestiaryText": "Izlegao je sve standardne boje mitskih ljubimaca: zmaj, leteća svinja, grifon, morska zmija i jednorog!",
|
||||
"achievementSeasonalSpecialistText": "Završio/la je sve proljetne i zimske sezonske zadatke: Lov na jaja, Trapper Djed Božićnjak i Pronađi mladunče!",
|
||||
"achievementHatchedPetModalText": "Idi u svoj inventar i pokušaj kombinirati Napitak za izlijeganje i Jaje",
|
||||
"achievementFedPetText": "Nahranili su svog prvog ljubimca.",
|
||||
"achievementFedPetModalText": "Postoji mnogo različitih vrsta hrane, ali Ljubimci mogu biti izbirljivi",
|
||||
"achievementPurchasedEquipmentModalText": "Oprema je način da prilagodiš svog avatara i poboljšaš svoje Statistike",
|
||||
"achievementPrimedForPaintingModalText": "Prikupili ste sve Bijele ljubimce!",
|
||||
"achievementPearlyProModalText": "Pripitomili ste sve Bijele životinje za jahanje!",
|
||||
"achievementTickledPinkText": "Prikupili su sve Ljubimce Ružičaste boje Šećerne vune.",
|
||||
"achievementTickledPinkModalText": "Prikupili ste sve ljubimce Boje Roze vune!",
|
||||
"achievementRosyOutlookText": "Pripitomili su sve životinje za jahanje Boje Roze vune.",
|
||||
"achievementBugBonanzaModalText": "Završili ste pustolovine za ljubimce Buba, Leptir, Puž i Pauk!",
|
||||
"achievementBareNecessities": "Najosnovnije Stvari",
|
||||
"achievementAllThatGlittersText": "Pripitomili su sve Zlatne jahaće životinje.",
|
||||
"achievementAllThatGlittersModalText": "Pripitomili ste sve Zlatne jahaće životinje!",
|
||||
"achievementBoneCollectorModalText": "Prikupili ste sve Kosturske ljubimce!",
|
||||
"achievementRedLetterDay": "Dan Crvenih Slova",
|
||||
"achievementLegendaryBestiaryText": "Izlegli su sve standardne boje mitskih ljubimaca: Zmaja, Letećeg praščića, Grifona, Morske zmije i Jednoroga!",
|
||||
"achievementSeasonalSpecialistText": "Završili su sve sezonske pustolovine Proljeća i Zime: Potraga za jajima, Djed Zamkaš i Pronađi mladunče!",
|
||||
"achievementVioletsAreBlue": "Ljubičice su Plave",
|
||||
"achievementVioletsAreBlueText": "Sakupio/la je sve Cotton Candy Plave ljubimce.",
|
||||
"achievementVioletsAreBlueModalText": "Sakupio/la si sve Cotton Candy Plave ljubimce!",
|
||||
"achievementWildBlueYonderText": "Ukrotio/la je sve Cotton Candy Plave životinje za jahanje.",
|
||||
"achievementWildBlueYonderModalText": "Ukrotio/la si sve Cotton Candy Plave životinje za jahanje!",
|
||||
"achievementShadeOfItAllText": "Ukrotio/la je sve životinje za jahanje boje sjene.",
|
||||
"achievementZodiacZookeeperText": "Izlegao/la je sve standardne boje kućnih ljubimaca zodijaka: štakor, krava, zeko, zmija, konj, ovca, majmun, pijetao, vuk, tigar, leteće prase i zmaj!",
|
||||
"achievementPrimedForPainting": "Spremno za bojanje",
|
||||
"achievementRosyOutlookModalText": "Ukrotio/la si sve Cotton Candy Roze životinje za jahanje!",
|
||||
"achievementVioletsAreBlueText": "Prikupili su sve Ljubimce Plave boje Šećerne vune.",
|
||||
"achievementVioletsAreBlueModalText": "Prikupili ste sve Ljubimce Plave boje Šećerne vune!",
|
||||
"achievementWildBlueYonderText": "Pripitomili su sve jahače životinje Plave boje Šećerne vune.",
|
||||
"achievementWildBlueYonderModalText": "Pripitomili ste sve jahače životinje Plave boje Šećerne vune!",
|
||||
"achievementShadeOfItAllText": "Pripitomili su sve jahaće životinje Sjene.",
|
||||
"achievementZodiacZookeeperText": "Izlegli su sve standardne boje zodijačkih ljubimaca: Štakor, Krava, Zec, Zmija, Konj, Ovca, Majmun, Pijetao, Vuk, Tigar, Leteći praščić i Zmaj!",
|
||||
"achievementPrimedForPainting": "Temelj za Bojanje",
|
||||
"achievementRosyOutlookModalText": "Pripitomili ste sve životinje za jahanje Boje Roze vune!",
|
||||
"achievementPolarPro": "Polarni Profesionalac",
|
||||
"achievementPolarProText": "Izlegao je sve standardne boje polarnih ljubimaca: medvjeda, lisicu, pingvina, kita i vuka!",
|
||||
"achievementPolarProModalText": "Skupili ste sve Polarne Ljubimce!",
|
||||
"achievementPolarProText": "Izlegli su sve standardne boje Polarnih ljubimaca: Medvjed, Lisica, Pingvin, Kit i Vuk!",
|
||||
"achievementPolarProModalText": "Prikupili ste sve Polarne ljubimce!",
|
||||
"achievementWoodlandWizard": "Šumski Čarobnjak",
|
||||
"achievementWoodlandWizardText": "Izlegao/la je sve standardne boje šumskih stvorenja: jazavca, medvjeda, jelena, lisice, žabe, ježa, sove, puža, vjeverice i drvca!",
|
||||
"achievementWoodlandWizardModalText": "Skupili ste sve šumske ljubimce!",
|
||||
"achievementWoodlandWizardText": "Izlegli su sve standardne boje šumskih bića: Jazavac, Medvjed, Jelen, Lisica, Žaba, Jež, Sova, Puž, Vjeverica i Stablo!",
|
||||
"achievementWoodlandWizardModalText": "Prikupili ste sve Šumske ljubimce!",
|
||||
"achievementPlantParent": "Roditelj Biljke",
|
||||
"achievementPlantParentText": "Izlegao/la je sve standardne boje biljnih ljubimaca: Kaktus i Drvo!",
|
||||
"achievementPlantParentModalText": "Sakupili ste sve Biljne ljubimce!",
|
||||
"achievementPlantParentText": "Izlegli su sve standardne boje ljubimaca Biljaka: Kaktus i Stablo!",
|
||||
"achievementPlantParentModalText": "Prikupili ste sve Ljubimce Biljke!",
|
||||
"achievementReptacularRumble": "Reptilska Tutnjava",
|
||||
"achievementReptacularRumbleText": "Izlegao/la je sve standardne boje kućnih ljubimaca reptila: Aligator, Pterodaktil, Zmija, Triceratops, Kornjača, Tiranosaurus Rex i Velociraptor!",
|
||||
"achievementReptacularRumbleModalText": "Skupili ste sve kućne ljubimce reptile!",
|
||||
"achievementReptacularRumbleText": "Izlegli su sve standardne boje ljubimaca gmazova: Aligator, Pterodaktil, Zmija, Triceratops, Kornjača, Tiranosaur Rex i Velociraptor!",
|
||||
"achievementReptacularRumbleModalText": "Sakupili ste sve Reptilske ljubimce!",
|
||||
"achievementLegendaryBestiary": "Legendarni Ukrotitelj Zvijeri",
|
||||
"achievementUndeadUndertakerText": "Ukrotio/la je sve Zombie životinje za jahanje.",
|
||||
"achievementDomesticatedText": "Izlegao/la je sve standardne boje pripitomljenih kućnih ljubimaca: tvor, zamorac, pijetao, leteće prase, štakor, zeko, konj i krava!",
|
||||
"achievementTickledPink": "Zagolican do Rumenjenja",
|
||||
"achievementDomesticated": "IJA-IJA-O",
|
||||
"achievementBareNecessitiesModalText": "Završio/la si zadatke majmuna, ljenjivca i stabla!",
|
||||
"achievementHatchedPet": "Izleći ljubimca",
|
||||
"achievementMindOverMatterModalText": "Završili ste zadatke kućnih ljubimaca Kamen, Sluz i Pređa!",
|
||||
"achievementGoodAsGold": "Dobar kao Zlato",
|
||||
"achievementLegendaryBestiaryModalText": "Sakupili ste sve mitske ljubimce!",
|
||||
"achievementSkeletonCrewModalText": "Ukrotio/la si sve Kosturske životinje za jahanje!",
|
||||
"achievementUndeadUndertakerText": "Pripitomili su sve Zombi jahaće životinje.",
|
||||
"achievementDomesticatedText": "Izlegli su sve standardne boje pripitomljenih ljubimaca: Tvor, Zamorac, Pijetao, Leteći praščić, Štakor, Zec, Konj i Krava!",
|
||||
"achievementTickledPink": "Presretni",
|
||||
"achievementDomesticated": "IJA-IJA-JO",
|
||||
"achievementBareNecessitiesModalText": "Završili ste pustolovine za ljubimce Majmun, Lijenivac i Stablo!",
|
||||
"achievementHatchedPet": "Izlezi Ljubimca",
|
||||
"achievementMindOverMatterModalText": "Završili ste pustolovine za ljubimce Kamen, Sluz i Vuna!",
|
||||
"achievementGoodAsGold": "Dobar Kao Zlato",
|
||||
"achievementLegendaryBestiaryModalText": "Prikupili ste sve mitske ljubimce!",
|
||||
"achievementSkeletonCrewModalText": "Pripitomili ste sve Kosturske jahaće životinje!",
|
||||
"achievementSeeingRed": "Vidiš Crveno",
|
||||
"achievementFedPet": "Nahrani ljubimca",
|
||||
"achievementBugBonanza": "Tulum Kukaca",
|
||||
"achievementPearlyPro": "Biserni Profesionalac",
|
||||
"achievementFedPet": "Nahranite Ljubimca",
|
||||
"achievementBugBonanza": "Festival Kukaca",
|
||||
"achievementPearlyPro": "Biseran Profesionalac",
|
||||
"achievementWildBlueYonder": "Daleka Divlja Plava",
|
||||
"achievementRedLetterDayText": "Ukrotio/la je sve Crvene životinje za jahanje.",
|
||||
"achievementPurchasedEquipment": "Kupite dio opreme",
|
||||
"achievementSkeletonCrewText": "Ukrotio/la je sve Kosturske životinje za jahanje.",
|
||||
"achievementMonsterMagusModalText": "Sakupio/la si sve zombi ljubimce!",
|
||||
"achievementBugBonanzaText": "Dovršio/la je misije za kućne ljubimce Bube, Leptira, Puža i Pauka.",
|
||||
"achievementRedLetterDayText": "Pripitomili su sve Crvene jahaće životinje.",
|
||||
"achievementPurchasedEquipment": "Kupite komad Opreme",
|
||||
"achievementSkeletonCrewText": "Pripitomili su sve Kosturske jahaće životinje.",
|
||||
"achievementMonsterMagusModalText": "Prikupili ste sve Zombi ljubimce!",
|
||||
"achievementBugBonanzaText": "Završili su pustolovine za ljubimce Buba, Leptir, Puž i Pauk.",
|
||||
"achievementSkeletonCrew": "Kosturska Družina",
|
||||
"achievementFreshwaterFriends": "Slatkovodni prijatelji",
|
||||
"achievementMonsterMagusText": "Sakupio/la je sve zombi ljubimce.",
|
||||
"achievementFreshwaterFriendsModalText": "Završio/la sizadatke kućnih ljubimaca Axolotla, Žabe i Nilskog konja!",
|
||||
"achievementGoodAsGoldText": "Sakupio/la je sve zlatne ljubimce.",
|
||||
"achievementFreshwaterFriends": "Slatkovodni Prijatelji",
|
||||
"achievementMonsterMagusText": "Prikupili su sve Zombi ljubimce.",
|
||||
"achievementFreshwaterFriendsModalText": "Završili ste pustolovine za ljubimce Aksolotl, Žaba i Nilski konj!",
|
||||
"achievementGoodAsGoldText": "Prikupili su sve Zlatne ljubimce.",
|
||||
"achievementBoneCollector": "Sakupljač Kostiju",
|
||||
"achievementGoodAsGoldModalText": "Sakupio/la si sve zlatne ljubimce!",
|
||||
"achievementRosyOutlook": "Ružičasti Izgled",
|
||||
"achievementSeeingRedModalText": "Sakupio/la si sve Crvene ljubimce!",
|
||||
"achievementGoodAsGoldModalText": "Prikupili ste sve Zlatne ljubimce!",
|
||||
"achievementRosyOutlook": "Ružičasti Pogled",
|
||||
"achievementSeeingRedModalText": "Prikupili ste sve Crvene ljubimce!",
|
||||
"achievementKickstarter2019": "Pristalica Pin Kickstartera",
|
||||
"achievementAllThatGlitters": "Sve što Svjetluca",
|
||||
"achievementSeeingRedText": "Sakupio/la je sve Crvene ljubimce.",
|
||||
"achievementCreatedTask": "Kreirajte svoj prvi zadatak",
|
||||
"achievementFreshwaterFriendsText": "Završio/la je zadatke kućnih ljubimaca Axolotla, Žabe i Nilskog konja.",
|
||||
"achievementCompletedTask": "Izvršite zadatak",
|
||||
"achievementBoneCollectorText": "Sakupio/la je sve Kosturske Ljubimce.",
|
||||
"achievementPurchasedEquipmentText": "Kupili prvi komad opreme.",
|
||||
"achievementJustAddWaterText": "Završio/la je zadatke ljubimaca hobotnice, morskog konjica, sipe, kita, kornjače, golobrade, morske zmije i dupina.",
|
||||
"achievementPrimedForPaintingText": "Prikupio/la je sve Bijele ljubimce.",
|
||||
"achievementRedLetterDayModalText": "Ukrotio/la si sve Crvene životinje za jahanje!",
|
||||
"achievementPearlyProText": "Ukrotio/la je sve bijele životinje za jahanje.",
|
||||
"achievementSeasonalSpecialistModalText": "Završili ste sve sezonske misije!",
|
||||
"achievementBareNecessitiesText": "Završio/la je zadatke majmuna, ljenjivca i stabla.",
|
||||
"achievementAllThatGlitters": "Sve Što Svjetluca",
|
||||
"achievementSeeingRedText": "Prikupili su sve Crvene ljubimce.",
|
||||
"achievementCreatedTask": "Kreiraj svoj prvi zadatak",
|
||||
"achievementFreshwaterFriendsText": "Završili su pustolovine za ljubimce Aksolotl, Žaba i Nilski konj.",
|
||||
"achievementCompletedTask": "Završi zadatak",
|
||||
"achievementBoneCollectorText": "Prikupili su sve Kosturske ljubimce.",
|
||||
"achievementPurchasedEquipmentText": "Kupili su svoj prvi komad opreme.",
|
||||
"achievementJustAddWaterText": "Završili su pustolovine za ljubimce Hobotnica, Morski konjić, Sipa, Kit, Kornjača, Goloskržnjak, Morska zmija i Dupin.",
|
||||
"achievementPrimedForPaintingText": "Prikupili su sve Bijele ljubimce.",
|
||||
"achievementRedLetterDayModalText": "Pripitomili ste sve Crvene jahaće životinje!",
|
||||
"achievementPearlyProText": "Pripitomili su sve Bijele životinje za jahanje.",
|
||||
"achievementSeasonalSpecialistModalText": "Završili ste sve sezonske pustolovine!",
|
||||
"achievementBareNecessitiesText": "Završili su pustolovine za ljubimce Majmun, Lijenivac i Stablo.",
|
||||
"achievementDomesticatedModalText": "Prikupili ste sve pripitomljene ljubimce!",
|
||||
"achievementSeasonalSpecialist": "Sezonski Specijalist",
|
||||
"achievementBirdsOfAFeather": "Ptice istog Pera",
|
||||
"achievementBirdsOfAFeatherModalText": "Skupili ste sve leteće ljubimce!",
|
||||
"achievementBirdsOfAFeatherText": "Izlegao/la je sve standardne boje letećih ljubimaca: Leteću svinju, Sovu, Papigu, Pterodaktila, Grifona, Sokola, Pauna i Pijetla!",
|
||||
"achievementBoneToPick": "Nemirne Kosti",
|
||||
"achievementBoneToPickText": "Izlegao/la je sve klasične i Quest Kostur Ljubimce!",
|
||||
"achievementBoneToPickModalText": "Izlegao/la si sve klasične i Quest Kostur Ljubimce!",
|
||||
"achievementZodiacZookeeper": "Zodijak Čuvar Zoo-a",
|
||||
"achievementZodiacZookeeperModalText": "Prikupili ste sve zodijak ljubimce!",
|
||||
"achievementBirdsOfAFeather": "Ptice Istog Pera",
|
||||
"achievementBirdsOfAFeatherModalText": "Prikupili ste sve Leteće ljubimce!",
|
||||
"achievementBirdsOfAFeatherText": "Izlegli su sve standardne boje letećih ljubimaca: Leteći praščić, Sova, Papiga, Pterodaktil, Grifon, Sokol, Paun i Pijetao!",
|
||||
"achievementBoneToPick": "Nedovršena Posla",
|
||||
"achievementBoneToPickText": "Izlegli su sve Klasične i Kosturske ljubimce iz Pustolovina!",
|
||||
"achievementBoneToPickModalText": "Prikupili ste sve Klasične i Kosturske ljubimce iz Pustolovina!",
|
||||
"achievementZodiacZookeeper": "Zodijački čuvar Zoološkog vrta",
|
||||
"achievementZodiacZookeeperModalText": "Prikupili ste sve Zodijačke ljubimce!",
|
||||
"achievementShadyCustomer": "Sumnjiva Mušterija",
|
||||
"achievementShadyCustomerText": "Prikupio/la je sve ljubimce sjene.",
|
||||
"achievementShadyCustomerModalText": "Prikupio/la si sve ljubimce sjene!",
|
||||
"achievementShadeOfItAll": "Nijansa svega",
|
||||
"achievementShadeOfItAllModalText": "Ukrotio/la si sve životinje za jahanje boje sjene!",
|
||||
"achievementDinosaurDynasty": "Dinastija dinosaura",
|
||||
"achievementDinosaurDynastyText": "Izlegao/la je sve standardne boje ljubimaca ptica i dinosaura: sokol, sova, papiga, paun, pingvin, pijetao, pterodaktil, t-rex, triceratops i velociraptor!",
|
||||
"achievementDinosaurDynastyModalText": "Sakupio/la si sve ljubimce ptica i dinosaura!"
|
||||
"achievementShadyCustomerText": "Prikupili su sve ljubimce boje Sjene.",
|
||||
"achievementShadyCustomerModalText": "Prikupili ste sve ljubimce boje Sjene!",
|
||||
"achievementShadeOfItAll": "Nijansa Svega",
|
||||
"achievementShadeOfItAllModalText": "Pripitomili ste sve jahaće životinje Sjene!",
|
||||
"achievementDinosaurDynasty": "Dinastija Dinosaura",
|
||||
"achievementDinosaurDynastyText": "Izlegli su sve standardne boje ljubimaca ptica i dinosaura: Sokol, Sova, Papiga, Paun, Pingvin, Pijetao, Pterodaktil, T-Rex, Triceratops i Velociraptor!",
|
||||
"achievementDinosaurDynastyModalText": "Prikupili ste sve ljubimce Ptice i Dinosaure!",
|
||||
"achievementRoughRiderModalText": "Prikupili ste sve osnovne boje neudobnih ljubimaca i jahaćih životinja!",
|
||||
"achievementRodentRuler": "Vladar Glodavaca",
|
||||
"achievementRodentRulerModalText": "Prikupili ste sve ljubimce Glodavce!",
|
||||
"achievementRoughRider": "Neustrašivi Jahač",
|
||||
"achievementRoughRiderText": "Izlegli su sve osnovne boje neudobnih ljubimaca i jahaćih životinja: Kaktusa, Ježa i Stijene!",
|
||||
"achievementCatsModalText": "Prikupili ste sve ljubimce Mačke!",
|
||||
"achievementCats": "Gonič Mačaka",
|
||||
"achievementDuneBuddyModalText": "Prikupili ste sve ljubimce koji obitavaju u pustinji!",
|
||||
"achievementRodentRulerText": "Izlegli su sve standardne boje ljubimaca glodavaca: Zamorac, Štakor i Vjeverica!",
|
||||
"achievementCatsText": "Izlegli su sve standardne boje ljubimaca mačaka: Geparda, Lava, Sabljozubog tigra i Tigra!",
|
||||
"achievementBonelessBoss": "Bezkostni Šef",
|
||||
"achievementBonelessBossText": "Izlegli su sve standardne boje kućnih ljubimaca beskralješnjaka: Buba, Leptir, Sipa, Puž golać, Hobotnica, Puž i Pauk!",
|
||||
"achievementBonelessBossModalText": "Prikupili ste sve ljubimce Beskralješnjake!",
|
||||
"achievementDuneBuddy": "Pustinjski Prijatelj",
|
||||
"achievementDuneBuddyText": "Izlegli su sve standardne boje ljubimaca iz pustinje: Armadillo, Kaktus, Lisica, Žaba, Zmija i Pauk!"
|
||||
}
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
{
|
||||
"challenge": "Izazov",
|
||||
"challengeDetails": "Izazovi su zajednički događaji u kojima se igrači natječu i zarađuju nagrade ispunjavanjem skupinu povezanih zadataka.",
|
||||
"brokenChaLink": "Poveznica izazova je neispravna",
|
||||
"brokenTask": "Neispravna poveznica izazova: ovaj je zadatak bio dio izazova, ali je uklonjen. Što želiš učiniti?",
|
||||
"keepIt": "Zadrži ga",
|
||||
"removeIt": "Ukloni ga",
|
||||
"brokenChallenge": "Neispravna poveznica izazova: ovaj je zadatak bio dio izazova, ali je izazov (ili grupa) izbrisan/a. Što želiš učiti s osiroćenim zadacima?",
|
||||
"challengeCompleted": "Ovaj je izazov izvršen i pobjednik je <span class=\"badge\"><%- user %></span>! Što želiš učiniti s osiroćenim zadacima?",
|
||||
"unsubChallenge": "Neispravna poveznica izazova: ovaj je zadatak bio dio izazova, no ti si napustio/la izazov. Što želiš učiniti s osiroćenim zadacima?",
|
||||
"challengeDetails": "Izazovi su događaji u zajednici u kojima se igrači natječu i osvajaju nagrade izvršavajući grupu povezanih zadataka.",
|
||||
"brokenChaLink": "Neispravna poveznica Izazova",
|
||||
"brokenTask": "Neispravna poveznica Izazova: ovaj je zadatak bio dio izazova, ali je uklonjen iz njega. Što želite učiniti?",
|
||||
"keepIt": "Zadrži",
|
||||
"removeIt": "Ukloni",
|
||||
"brokenChallenge": "Neispravna poveznica Izazova: ovaj je zadatak bio dio izazova, ali je izazov (ili grupa) izbrisan/a. Što učiniti s tim osamljenim zadacima?",
|
||||
"challengeCompleted": "Ovaj je izazov završen, a pobjednik je bio <span class=\"badge\"><%- user %></span>! Što učiniti s tim osamljenim zadacima?",
|
||||
"unsubChallenge": "Neispravna poveznica Izazova: ovaj je zadatak bio dio izazova, ali ste se odjavili s izazova. Što učiniti s tim osamljenim zadacima?",
|
||||
"challenges": "Izazovi",
|
||||
"endDate": "Završava",
|
||||
"selectWinner": "Odaberi pobjednika i zatvori izazov:",
|
||||
"endChallenge": "Završi izazov",
|
||||
"filter": "Filtriraj",
|
||||
"endChallenge": "Završi Izazov",
|
||||
"filter": "Filtar",
|
||||
"groups": "Grupe",
|
||||
"category": "Kategorija",
|
||||
"membership": "Članstvo",
|
||||
"ownership": "U vlasništvu",
|
||||
"participating": "Sudjeluješ",
|
||||
"createChallenge": "Kreiraj izazov",
|
||||
"createChallengeAddTasks": "Dodaj Zadatke izazova",
|
||||
"ownership": "Vlasništvo",
|
||||
"participating": "Sudjeluje",
|
||||
"createChallenge": "Stvori Izazov",
|
||||
"createChallengeAddTasks": "Dodaj Zadatke Izazova",
|
||||
"createChallengeCloneTasks": "Kloniraj Zadatke Izazova",
|
||||
"challengeTag": "Ime oznake",
|
||||
"challengeTag": "Naziv Oznake",
|
||||
"prize": "Nagrada",
|
||||
"publicChallengesTitle": "Javni izazovi",
|
||||
"officialChallenge": "Službeni Izazov Habitice",
|
||||
"by": "napravio/la",
|
||||
"publicChallengesTitle": "Javni Izazovi",
|
||||
"officialChallenge": "Službeni Habitica Izazov",
|
||||
"by": "od",
|
||||
"participants": "<%= membercount %> Sudionici",
|
||||
"join": "Pridruži se",
|
||||
"challengeCreated": "Izazov je kreiran",
|
||||
"sureDelCha": "Jesi li siguran/na da želiš izbrisati ovaj izazov?",
|
||||
"challengeCreated": "Izazov stvoren",
|
||||
"sureDelCha": "Jeste li sigurni da želite izbrisati ovaj izazov?",
|
||||
"keepTasks": "Zadrži Zadatke",
|
||||
"owned": "Posjeduješ",
|
||||
"not_owned": "Ne posjeduješ",
|
||||
@@ -37,64 +37,77 @@
|
||||
"clone": "Kloniraj",
|
||||
"hurray": "Hura!",
|
||||
"noChallengeOwner": "bez vlasnika",
|
||||
"challengeMemberNotFound": "Korisnik nije pronađen među sudionicima izazova",
|
||||
"onlyGroupLeaderChal": "Samo vođa grupe može kreirati izazove",
|
||||
"tavChalsMinPrize": "Nagrada za Javne Izazove mora biti najmanje 1 Dragulj.",
|
||||
"cantAfford": "Ne možeš si priuštiti ovu nagradu. Kupi još dragulja ili smanji nagradu.",
|
||||
"challengeMemberNotFound": "Korisnik nije pronađen među članovima izazova",
|
||||
"onlyGroupLeaderChal": "Samo vođa grupe može stvarati izazove",
|
||||
"tavChalsMinPrize": "Nagrada mora biti najmanje 1 Dragulj za Javne Izazove.",
|
||||
"cantAfford": "Ne možete si priuštiti ovu nagradu. Kupite više dragulja ili smanjite iznos nagrade.",
|
||||
"challengeIdRequired": "\"challengeId\" mora biti važeći UUID.",
|
||||
"winnerIdRequired": "\"winnerId\" mora biti važeći UUID.",
|
||||
"challengeNotFound": "Izazov nije pronađen ili nemaš pristup.",
|
||||
"onlyLeaderDeleteChal": "Jedino vođa izazova ga može obrisati.",
|
||||
"onlyLeaderUpdateChal": "Jedino vođa izazova ga može ažurirati.",
|
||||
"winnerNotFound": "Pobjednik s id-em '<%= userId %> ' nije pronađen ili ne sudjeluje u izazovu.",
|
||||
"onlyChalLeaderEditTasks": "Zadatke koji pripadaju izazovu može urediti samo vođa.",
|
||||
"challengeNotFound": "Izazov nije pronađen ili nemate pristup.",
|
||||
"onlyLeaderDeleteChal": "Samo vođa izazova može ga izbrisati.",
|
||||
"onlyLeaderUpdateChal": "Samo vođa izazova može ga ažurirati.",
|
||||
"winnerNotFound": "Pobjednik s ID-om \"<%= userId %>\" nije pronađen ili nije dio izazova.",
|
||||
"onlyChalLeaderEditTasks": "Zadatke koji pripadaju izazovu može uređivati samo vođa.",
|
||||
"userAlreadyInChallenge": "Korisnik već sudjeluje u ovom izazovu.",
|
||||
"cantOnlyUnlinkChalTask": "Moguće je prekinuti vezu samo s neispravnim zadacima izazova.",
|
||||
"joinedChallenge": "Pridružio/la se Izazovu",
|
||||
"joinedChallengeText": "Ovaj korisnik se iskušava pridružujući se Izazovu!",
|
||||
"cantOnlyUnlinkChalTask": "Samo se zadaci neispravnih izazova mogu ukloniti s poveznice.",
|
||||
"joinedChallenge": "Pridružio se Izazovu",
|
||||
"joinedChallengeText": "Ovaj je korisnik stavio sam sebe na kušnju pridruživanjem Izazovu!",
|
||||
"myChallenges": "Moji Izazovi",
|
||||
"findChallenges": "Otkrij Izazove",
|
||||
"noChallengeTitle": "Nemaš Izazova.",
|
||||
"challengeDescription2": "Pronađi preporuke za Izazove na osnovi svojih interesa, pogledaj javne Izazove na Habitici ili kreiraj vlastite izazove.",
|
||||
"noChallengeMatchFilters": "Nismo uspjeli pronaći nijedan odgovarajući Izazov.",
|
||||
"createdBy": "Stvorio/la",
|
||||
"noChallengeTitle": "Nemaš nijedan Izazov.",
|
||||
"challengeDescription2": "Pronađi preporučene Izazove na temelju svojih interesa, pregledaj Habitica javne Izazove ili stvori vlastite Izazove.",
|
||||
"noChallengeMatchFilters": "Nismo mogli pronaći nijedan Izazov koji se podudara.",
|
||||
"createdBy": "Stvorili",
|
||||
"joinChallenge": "Pridruži se Izazovu",
|
||||
"leaveChallenge": "Napusti Izazov",
|
||||
"addTask": "Dodaj Zadatak",
|
||||
"editChallenge": "Uredi Izazov",
|
||||
"challengeDescription": "Opis Izazova",
|
||||
"selectChallengeWinnersDescription": "Odaberi pobjednika među sudionicima Izazova",
|
||||
"awardWinners": "Nagradi dobitnika",
|
||||
"awardWinners": "Nagradi Dobitnika",
|
||||
"doYouWantedToDeleteChallenge": "Želiš li izbrisati ovaj Izazov?",
|
||||
"deleteChallenge": "Izbriši Izazov",
|
||||
"challengeNamePlaceholder": "Koji je naziv tvog Izazova?",
|
||||
"challengeNamePlaceholder": "Kako se zove tvoj Izazov?",
|
||||
"challengeSummary": "Sažetak",
|
||||
"challengeSummaryPlaceholder": "Napiši kratki opis kojim oglašavaš svoj izazov drugim Habitičanima. Koja je glavna svrha tvog Izazova i zašto bi mu se ljudi trebali pridružiti? Pokušaj uključiti korisne ključne riječi u opis tako da ga Habitičani mogu lako pronaći kad pretražuju!",
|
||||
"challengeDescriptionPlaceholder": "Koristi ovaj odjeljak za ulaženje u detalje u vezi svega što sudionici Izazova trebaju znati o tvom Izazovu.",
|
||||
"challengeSummaryPlaceholder": "Napiši kratak opis kojim oglašavaš svoj Izazov drugim Habitičanima. Koja je glavna svrha tvog Izazova i zašto bi mu se ljudi trebali pridružiti? Pokušaj uključiti korisne ključne riječi u opis kako bi ga Habitičani lako pronašli prilikom pretraživanja!",
|
||||
"challengeDescriptionPlaceholder": "Koristi ovaj odjeljak za detaljnije objašnjenje svega što sudionici Izazova trebaju znati o tvom Izazovu.",
|
||||
"challengeGuild": "Dodaj u",
|
||||
"challengeMinimum": "Minimalno 1 dragulj za javne izazove (zaista pomaže u sprječavanju spama).",
|
||||
"challengeMinimum": "Minimum 1 Dragulj za javne Izazove (uistinu pomaže u sprječavanju spama).",
|
||||
"participantsTitle": "Sudionici",
|
||||
"shortName": "Skraćeno ime",
|
||||
"shortNamePlaceholder": "Koju će se kratku oznaku koristiti za identificiranje tvog Izazova?",
|
||||
"shortName": "Kratki Naziv",
|
||||
"shortNamePlaceholder": "Koja kratka oznaka bi trebala biti korištena za identifikaciju tvog Izazova?",
|
||||
"updateChallenge": "Ažuriraj Izazov",
|
||||
"haveNoChallenges": "Ova grupa nema Izazova",
|
||||
"loadMore": "Učitaj više",
|
||||
"exportChallengeCsv": "Izvezi Izazov",
|
||||
"editingChallenge": "Uređivanje Izazova",
|
||||
"nameRequired": "Potrebno je ime",
|
||||
"tagTooShort": "Ime oznake je prekratko",
|
||||
"summaryRequired": "Potreban je sažetak",
|
||||
"nameRequired": "Naziv je obavezan",
|
||||
"tagTooShort": "Naziv oznake je prekratak",
|
||||
"summaryRequired": "Sažetak je obavezan",
|
||||
"summaryTooLong": "Sažetak je predug",
|
||||
"descriptionRequired": "Potreban je opis",
|
||||
"locationRequired": "Potrebna je lokacija izazova (\"Dodaj u\")",
|
||||
"descriptionRequired": "Opis je obavezan",
|
||||
"locationRequired": "Obavezno je odrediti Lokaciju Izazova ('Dodaj u')",
|
||||
"categoiresRequired": "Potrebno je odabrati jednu ili više kategorija",
|
||||
"viewProgressOf": "Vidi napredak",
|
||||
"viewProgress": "Vidi napredak",
|
||||
"selectMember": "Odaberi člana",
|
||||
"confirmKeepChallengeTasks": "Želiš li zadržati zadatke izazova?",
|
||||
"selectParticipant": "Odaberi sudionika",
|
||||
"viewProgressOf": "Prikaži Napredak",
|
||||
"viewProgress": "Prikaži Napredak",
|
||||
"selectMember": "Odaberi Člana",
|
||||
"confirmKeepChallengeTasks": "Želiš li zadržati zadatke Izazova?",
|
||||
"selectParticipant": "Odaberi Sudionika",
|
||||
"filters": "Filteri",
|
||||
"yourReward": "Vaša Nagrada",
|
||||
"removeTasks": "Ukloni Zadatke",
|
||||
"wonChallengeDesc": "<%= challengeName %> odabrao vas je kao pobjednika! Vaša pobjeda je zabilježena u vašim postignućima."
|
||||
"wonChallengeDesc": "<%= challengeName %> su vas odabrali za pobjednika/pobjednicu! Vaša pobjeda zabilježena je u vašim Postignućima.",
|
||||
"messageChallengeFlagOfficial": "Službeni Izazovi ne mogu biti prijavljeni.",
|
||||
"flaggedNotHidden": "Izazov jednom prijavljen, nije skriven",
|
||||
"flaggedAndHidden": "Izazov prijavljen i skriven",
|
||||
"resetFlagCount": "Poništi Broj Prijava",
|
||||
"whyReportingChallengePlaceholder": "Razlog prijave",
|
||||
"whyReportingChallenge": "Zašto prijavljujete ovaj Izazov?",
|
||||
"messageChallengeFlagAlreadyReported": "Već ste prijavili ovaj Izazov.",
|
||||
"resetFlags": "Poništi Prijave",
|
||||
"cannotMakeChallenge": "Ne možete stvarati javne Izazove jer Vaš korisnički račun trenutačno nema privilegije za chat. Molimo kontaktirajte admin@habitica.com za više informacija.",
|
||||
"deleteChallengeRefundDescription": "Ako izbrišete ovaj Izazov, bit će Vam vraćena nagrada u Draguljima, a zadaci Izazova ostat će na popisima zadataka sudionika.",
|
||||
"cannotClone": "Ovaj Izazov ne može biti kloniran jer ga je jedan ili više igrača prijavilo kao neprikladan. Član osoblja će Vas uskoro kontaktirati s uputama. Ako je prošlo više od 48 sati, a niste dobili odgovor, pošaljite e-poruku na admin@habitica.com za pomoć.",
|
||||
"abuseFlagModalBodyChallenge": "Izazov biste trebali prijaviti samo ako krši <%= firstLinkStart %>Smjernice zajednice<%= linkEnd %> i/ili <%= secondLinkStart %>Uvjete pružanja usluge<%= linkEnd %>. Slanje lažne prijave predstavlja kršenje Habitica Smjernica zajednice.",
|
||||
"cannotClose": "Ovaj Izazov ne može biti zatvoren jer ga je jedan ili više igrača prijavilo kao neprikladan. Član osoblja će Vas uskoro kontaktirati s uputama. Ako je prošlo više od 48 sati, a niste dobili odgovor, pošaljite e-poruku na admin@habitica.com za pomoć."
|
||||
}
|
||||
|
||||
@@ -1,41 +1,41 @@
|
||||
{
|
||||
"communityGuidelinesWarning": "Molimo te da uzmeš u obzir da tvoje Ime za prikazivanje, profilna slika i opis trebaju biti u skladu s <a href='https://habitica.com/static/community-guidelines' target='_blank'>Uputama za zajednicu</a> (npr. bez vulgarnih izraza, tema za odrasle, uvreda, itd.). Ako imaš ikakvih pitanja u vezi toga je li nešto prikladno ili ne, slobodno pošalji e-mail na <%= hrefBlankCommunityManagerEmail %>!",
|
||||
"communityGuidelinesWarning": "Imajte na umu da Vaše Prikazno Ime, profilna fotografija i kratki opis moraju biti u skladu s <a href='https://habitica.com/static/community-guidelines' target='_blank'>Smjernicama Zajednice</a> (npr. bez prostota, tema za odrasle, uvreda, itd.). Ako imate bilo kakvih pitanja o tome je li nešto prikladno, slobodno pošaljite e-mail <%= hrefBlankCommunityManagerEmail %>!",
|
||||
"profile": "Profil",
|
||||
"avatar": "Prilagodi Avatar",
|
||||
"editAvatar": "Uredi avatara",
|
||||
"noDescription": "Ovaj Habitičan nije dodao/la opis.",
|
||||
"noPhoto": "Ovaj Habitičan nije dodao/la sliku.",
|
||||
"editAvatar": "Prilagodba Avatara",
|
||||
"noDescription": "Ovaj Habitičanin nije dodao opis.",
|
||||
"noPhoto": "Ovaj Habitičanin nije dodao sliku.",
|
||||
"other": "Ostalo",
|
||||
"fullName": "Puno Ime",
|
||||
"fullName": "Puno ime",
|
||||
"displayName": "Ime za prikazivanje",
|
||||
"changeDisplayName": "Promijeni ime za prikazivanje",
|
||||
"newDisplayName": "Novo ime za prikazivanje",
|
||||
"displayBlurbPlaceholder": "Možeš li nam se predstaviti?",
|
||||
"displayBlurbPlaceholder": "Molimo te da se predstaviš",
|
||||
"photoUrl": "URL fotografije",
|
||||
"imageUrl": "URL slike",
|
||||
"inventory": "Inventar",
|
||||
"social": "Društveno",
|
||||
"lvl": "lvl",
|
||||
"buffed": "Ojačan/a",
|
||||
"social": "Društvo",
|
||||
"lvl": "Raz",
|
||||
"buffed": "Ojačan",
|
||||
"bodyBody": "Tijelo",
|
||||
"size": "Veličina",
|
||||
"locked": "zaključano",
|
||||
"shirts": "Majice",
|
||||
"shirt": "Majica",
|
||||
"specialShirts": "Posebne majice",
|
||||
"specialShirts": "Posebne Majice",
|
||||
"skin": "Koža",
|
||||
"color": "Boja",
|
||||
"hair": "Kosa",
|
||||
"bangs": "Šiške",
|
||||
"glasses": "Naočale",
|
||||
"hairSet1": "Komplet frizura 1",
|
||||
"hairSet2": "Komplet frizura 2",
|
||||
"hairSet3": "Komplet frizura 3",
|
||||
"hairSet1": "Frizure Set 1",
|
||||
"hairSet2": "Frizure Set 2",
|
||||
"hairSet3": "Frizure Set 3",
|
||||
"beard": "Brada",
|
||||
"mustache": "Brkovi",
|
||||
"flower": "Cvijet",
|
||||
"accent": "Akcenti",
|
||||
"headband": "Obruč za kosu",
|
||||
"accent": "Naglasak",
|
||||
"headband": "Traka za glavu",
|
||||
"wheelchair": "Invalidska kolica",
|
||||
"extra": "Dodatno",
|
||||
"rainbowSkins": "Teme u duginim bojama",
|
||||
@@ -56,24 +56,24 @@
|
||||
"autoEquipBattleGear": "Automatski opremi novu opremu",
|
||||
"costume": "Kostim",
|
||||
"useCostume": "Koristi Kostim",
|
||||
"costumePopoverText": "Odaberi \"Koristi kostim\" kako bi opremio/la artikle za svog avatara bez utjecanja na Statistiku svoje Ratne Opreme! Ovo znači da svog avatara možeš obući kako god hoćeš, a da pritom i dalje imaš opremljenu najbolju Ratnu Opremu.",
|
||||
"autoEquipPopoverText": "Odaberi ovu opciju za automatsko opremanje komada opreme kad ga kupiš.",
|
||||
"costumeDisabled": "Uklonio/la si svoj kosim.",
|
||||
"gearAchievement": "Zaradio/la si Postignuće \"Ultimativna Oprema\" za nadograđivanje svoje opreme do najvišeg kompleta opreme za svoju klasu! Skupio/la si sljedeće potpune komplete:",
|
||||
"gearAchievementNotification": "Zaradio/la si Postignuće \"Ultimativna Oprema\" za nadograđivanje svoje opreme do najvišeg kompleta opreme za svoju klasu!",
|
||||
"moreGearAchievements": "Kako bi dobio/la više znački za Ultimativnu Opremu, promijeni klasu pod <a href='/user/settings/site' target='_blank'>Postavke > Stranica</a> i počni kupovati opremu svoje nove klase!",
|
||||
"armoireUnlocked": "Za više opreme, poviri u <strong>Začarani Ormar!</strong> Klikni na Začarani Ormar u stupcu Nagrada za nasumičnu priliku da dobiješ komad posebne Opreme! Ovo ti također može donijeti nasumični XP ili artikle hrane.",
|
||||
"costumePopoverText": "Odaberi \"Koristi kostim\" kako bi odjenuo svog avatara bez utjecaja na bonuse svoje ratne opreme! Ovo znači da svog avatara možeš obući kako god želiš, a da pritom i dalje na sebi imaš najbolju ratnu opremu.",
|
||||
"autoEquipPopoverText": "Odaberi ovu opciju za automatsko opremanje opreme kad ju kupiš.",
|
||||
"costumeDisabled": "Uklonili ste svoj kostim.",
|
||||
"gearAchievement": "Zaradili ste postignuće \"Ultimativna Oprema\" za nadograđivanje svoje opreme do najjačeg kompleta za svoju klasu! Postigli ste sljedeće potpune komplete:",
|
||||
"gearAchievementNotification": "Zaradili ste postignuće \"Ultimativna Oprema\" za nadograđivanje svoje opreme do najjačeg seta opreme za svoju klasu!",
|
||||
"moreGearAchievements": "Kako bi dobili više znački za Ultimativnu Opremu, promijeni klasu pod <a href='/user/settings/site' target='_blank'>Postavke > Stranica</a> i počni kupovati opremu svoje nove klase!",
|
||||
"armoireUnlocked": "Za više opreme baci pogled u <strong>Začarani Ormar!</strong> Klikni na Začarani Ormar u stupcu Nagrada za nasumičnu priliku da dobiješ dio posebne Opreme! Ovo ti također može donijeti nasumični XP ili artikle hrane.",
|
||||
"ultimGearName": "Ultimativna Oprema - <%= ultClass %>",
|
||||
"ultimGearText": "je maksimalno nadogradio/la komplet oružja i oklopa za klasu <%= ultClass %>.",
|
||||
"level": "Level",
|
||||
"levelUp": "Level gore!",
|
||||
"gainedLevel": "Dosegnuo/la si novi level!",
|
||||
"leveledUp": "Postizanjem svojih životnih ciljeva, dostigao/la si <strong>Level <%= level %>!</strong>",
|
||||
"ultimGearText": "su maksimalno nadogradili komplet oružja i oklopa za klasu <%= ultClass %>.",
|
||||
"level": "Razina",
|
||||
"levelUp": "Razina više!",
|
||||
"gainedLevel": "Dosegli ste višu razinu!",
|
||||
"leveledUp": "Postizanjem svojih životnih ciljeva, dostigli ste <strong>Razinu<%= level %>!</strong>",
|
||||
"huzzah": "Hura!",
|
||||
"mana": "Mana",
|
||||
"hp": "Zdravlje",
|
||||
"mp": "Mana",
|
||||
"xp": "Iskustvo",
|
||||
"mp": "MP",
|
||||
"xp": "XP",
|
||||
"health": "Zdravlje",
|
||||
"allocateStr": "Bodovi dodijeljeni Snazi:",
|
||||
"allocateStrPop": "Dodaj bod Snazi",
|
||||
@@ -83,17 +83,17 @@
|
||||
"allocatePerPop": "Dodaj bod Percepciji",
|
||||
"allocateInt": "Bodovi dodijeljeni Inteligenciji:",
|
||||
"allocateIntPop": "Dodaj bod Inteligenciji",
|
||||
"noMoreAllocate": "Sada kada ste dosegli razinu 100, više nećete dobiti nikakve Stat bodove. Možete nastaviti napredovati ili započeti novu avanturu na razini 1 pomoću <a href='https://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Kugle ponovnog rođenja</a>!",
|
||||
"noMoreAllocate": "Sada kada ste dosegli Razinu 100, nećete dobivati više Bodova Statistike. Možete nastaviti s podizanjem razine, ili započeti novu pustolovinu na Razini 1 koristeći <a href='/shops/market'>Kuglu Preporoda</a>!",
|
||||
"stats": "Statistika",
|
||||
"strength": "Snaga",
|
||||
"strText": "Snaga povećava šansu za nasumične \"kritične udarce\" i dodatne Zlatnike, Iskustvo i poklone koje možeš dobiti od njih. Također pomaže u nanošenju štete Bosovima čudovišta.",
|
||||
"constitution": "Konstitucija",
|
||||
"conText": "Konstitucija smanjuje štetu koju dobiješ od loših Navika i neizvršenih Svakodnevnih zadataka.",
|
||||
"perception": "Percepcija",
|
||||
"perText": "Percepcija povečava količinu Zlatnika koju zaradiš,a nakon što otključaš Tržnicu, povečava ti šansu da nađeš artikle prilikom obavljanja zadataka.",
|
||||
"perText": "Percepcija uvećava količinu Zlata koje zaradiš, a nakon što otključaš Tržnicu ti povećava šansu da pronađeš nove stvari prilikom rješavanja zadataka.",
|
||||
"intelligence": "Inteligencija",
|
||||
"intText": "Inteligencija povećava količinu Iskustva koju dobivaš, a nakon što otključaš Klase, ona određuje maksimalnu količinu dostupne Mane za sposobnosti Klase.",
|
||||
"levelBonus": "Bonus za Level",
|
||||
"levelBonus": "Bonus za Razinu",
|
||||
"allocatedPoints": "Raspodijeljeni bodovi",
|
||||
"allocated": "Raspodijeljeno",
|
||||
"buffs": "Ojačanja",
|
||||
@@ -108,12 +108,12 @@
|
||||
"mystery": "Tajna",
|
||||
"changeClass": "Promijeni klasu, refundiraj Statističke bodove",
|
||||
"lvl10ChangeClass": "Za promjenu Klase moraš biti barem na levelu 10.",
|
||||
"changeClassConfirmCost": "Jesi li siguran/na da želiš promijeniti svoju klasu za 3 Dragulja?",
|
||||
"changeClassConfirmCost": "Jesi li sigurni da želite promijeniti svoju klasu za 3 Dragulja?",
|
||||
"invalidClass": "Nepostojeća klasa. Molimo te da odabereš 'ratnik', 'lupež', 'čarobnjak' ili 'iscjelitelj'.",
|
||||
"levelPopover": "Svaki level ti nosi jedan bod kojeg možeš dodijeliti Statistici po vlastitom izboru. Možeš to učiniti ručno, ili omogućiti igri da odluči umjesto tebe koristeći jednu od mogućnosti Automatske Raspodjele.",
|
||||
"levelPopover": "Svaka razina donosi Vam jedan Bod koji možete dodijeliti Statu po svom izboru. To možete učiniti ručno ili dopustiti igri da odluči umjesto Vas koristeći jednu od opcija Automatskog dodjeljivanja.",
|
||||
"unallocated": "Neraspodijeljeni Statistički bodovi",
|
||||
"autoAllocation": "Automatska raspodjela",
|
||||
"autoAllocationPop": "Dodjeljuje Bodove tvojim Statistikama prema tvojim postavakama kad podigneš level.",
|
||||
"autoAllocationPop": "Dodjeljuje Bodove Statističkim podacima prema Vašim željama, kada pređete na višu razinu.",
|
||||
"evenAllocation": "Ravnomjerno raspodijeli Statističke bodove",
|
||||
"evenAllocationPop": "Dodjeljuje jednak broj Bodova svakoj Statistici.",
|
||||
"classAllocation": "Raspodijeli Bodove na osnovu Klase",
|
||||
@@ -122,41 +122,41 @@
|
||||
"taskAllocationPop": "Dodjeljuje Bodove na osnovu kategorija Snage, Inteligencije, Konstitucije i Percepcije koje su povezane sa zadacima koje obaviš.",
|
||||
"distributePoints": "Raspodjela nedodijeljenih Bodova",
|
||||
"distributePointsPop": "Dodjeljuje sve neraspodijeljene Statističke bodove prema odabranoj shemi dodjeljivanja.",
|
||||
"warriorText": "Ratnici postižu više \"kritičnih udaraca\" koji nasumično donose dodatno Zlatnika, Iskustva i šansi za dobivanje poklona prilikom izvršavanja zadatka. Također nanose veliku štetu u borbi protiv Bosova. Igraj ulogu Ratnika ako te motiviraju nepredvidive nagrade u stilu jackpota, ili ako želiš rasturiti na Pustolovinama potjere Bosa.",
|
||||
"wizardText": "Čarobnjaci brzo uče te dobivajući na Iskustvu i Levelima brže od ostalih klasa. Također dobivaju jako puno Mane za korištenje svojih posebnih vještina. Igraj Čarobnjaka ako uživaš u taktičkim igračim aspektima Habitice, ili ako ti podizanje levela i otključavanje naprednih mogućnosti daje jaku motivaciju!",
|
||||
"mageText": "Čarobnjaci brzo uče te dobivajući na Iskustvu i Levelima brže od ostalih klasa. Također dobivaju jako puno Mane za korištenje svojih posebnih vještina. Igraj ulogu Čarobnjaka ako uživaš u taktičkim igračim aspektima Habitice, ili ako ti podizanje levela i otključavanje naprednih mogućnosti daje jaku motivaciju!",
|
||||
"rogueText": "Lupeži vole akumulirati bogatstvo, dobivaju više Zlatnika od ostalih, također su bolji u nalaženju nasumičnih predmeta. Njihova poznata moć Tajnosti im daje sposobnost izbjegavanja posljedica neizvršenih Svakodnevnih zadataka. Igraj Lupeža ako te jako motiviraju Nagrade i Postignuća i ako stremiš ka sakupljanju plijena i znački!",
|
||||
"healerText": "Iscjelitelji su otporni na štetu i pružaju zaštitu sebi i drugima. Propušteni Svakodnevni zadaci i loše Navike ih ne uznemiravaju u tolikoj mjeri jer znaju kako nadoknaditi izgubljeno Zdravlje. Igraj Iscjelitelja ako ako uživaš u pomaganju drugim članovima svoje Družine, ili ako te inspirira pomisao na varanje Smrti pomoću marljivog rada.",
|
||||
"warriorText": "Ratnici postižu više i bolje \"kritične pogotke\", koji nasumično daju bonus Zlato, Iskustvo i veću šansu za pronalazak predmeta prilikom izvršavanja zadatka. Također nanose veliku štetu čudovištima-šefovima. Igrajte kao Ratnik ako Vas motiviraju nepredvidive nagrade poput jackpota ili ako želite zadavati jaku bol u Pustolovinama s šefovima!",
|
||||
"wizardText": "Čarobnjaci brzo uče, stječući Iskustvo i Razine brže od ostalih klasa. Također dobivaju puno Mane za korištenje posebnih sposobnosti. Igrajte kao Čarobnjak ako uživate u taktičkim aspektima igre u Habitici, ili ako ste snažno motivirani prelaskom na višu razinu i otključavanjem naprednih značajki!",
|
||||
"mageText": "Čarobnjaci brzo uče, stječući Iskustvo i Razine brže od ostalih klasa. Također dobivaju puno Mane za korištenje posebnih sposobnosti. Igrajte kao Čarobnjak ako uživate u taktičkim aspektima igre u Habitici, ili ako ste snažno motivirani prelaskom na višu razinu i otključavanjem naprednih značajki!",
|
||||
"rogueText": "Lupeži vole gomilati bogatstvo, stječući više Zlata nego itko drugi, i vješti su u pronalaženju nasumičnih predmeta. Njihova prepoznatljiva sposobnost Skrivanja omogućuje im da izbjegnu posljedice propuštenih Dnevnih zadataka. Igrajte kao Lupež ako Vas snažno motiviraju Nagrade i Postignuća, te ako težite plijenu i bedževima!",
|
||||
"healerText": "Iscjelitelji stoje nepokolebljivo protiv ozljeda i proširuju tu zaštitu na druge. Propušteni Dnevni zadaci i loše Navike ih ne uzrujavaju previše, a imaju načine da se oporave od neuspjeha. Igrajte kao Iscjelitelj ako uživate pomagati drugima u svojoj Grupi, ili ako Vas inspirira ideja da marljivim radom prevarite Smrt!",
|
||||
"optOutOfClasses": "Izaberi kasnije",
|
||||
"chooseClass": "Odaberi svoju Klasu",
|
||||
"chooseClassLearnMarkdown": "[Saznajte više o Habiticinom klasnom sustavu](https://habitica.fandom.com/wiki/Class_System)",
|
||||
"optOutOfClassesText": "Ne da ti se baviti klasama? Želiš odabrati kasnije? Onda odaberi kasnije - do tad ćeš biti Ratnik bez posebnih vještina. Možeš čitati o klasnom sustavu kasnije na wiki stranici Habitice i omogućiti klase bilo kada pod Ikona Korisnika > Postavke.",
|
||||
"chooseClassLearnMarkdown": "[Saznajte više o Habitica sustavu klasa](/static/faq#what-classes)",
|
||||
"optOutOfClassesText": "Niste spremni za odabir? Nema žurbe! Ako odustanete, možete pročitati o svakoj klasi u <a href='/static/faq#what-classes' target='_blank'>našim ČPP-ima</a> i posjetiti Postavke kako biste omogućili Sustav klasa kada budete spremni.",
|
||||
"selectClass": "Odaberi klasu <%= heroClass %>",
|
||||
"select": "Odaberi",
|
||||
"stealth": "Tajnost",
|
||||
"stealthNewDay": "Kada novi dan počne, izbjeći ćeš štetu od ovoliko propuštenih Svakodnevnih zadataka.",
|
||||
"stealthNewDay": "Kada novi dan počne, izbjeći ćeš štetu od ovoliko propuštenih Dnevnih zadataka.",
|
||||
"streaksFrozen": "Broj ponavljanja je zamrznut",
|
||||
"streaksFrozenText": "Broj ponavljanja neobavljenih Svakodnevnih zadataka se neće resetirati na kraju dana.",
|
||||
"streaksFrozenText": "Broj ponavljanja neobavljenih Dnevnih zadataka se neće resetirati na kraju dana.",
|
||||
"purchaseFor": "Kupi za <%= cost %> Dragulja?",
|
||||
"purchaseForHourglasses": "Kupi u zamjenu za <%= cost %> Pješčanih satova?",
|
||||
"notEnoughMana": "Nemaš dovoljno Mane.",
|
||||
"invalidTarget": "Ne možeš iskoristiti vještinu na tome.",
|
||||
"youCast": "Izveo/la si <%= spell %>.",
|
||||
"youCastTarget": "Izveo/la si <%= spell %> na <%= target %>.",
|
||||
"youCastParty": "Izveo/la si <%= spell %> za Družinu.",
|
||||
"youCast": "Izveli ste <%= spell %>.",
|
||||
"youCastTarget": "Izveli ste <%= spell %> na <%= target %>.",
|
||||
"youCastParty": "Izveli ste <%= spell %> za Grupu.",
|
||||
"critBonus": "Kritični udarac! Bonus: ",
|
||||
"gainedGold": "Dobio/la si nešto Zlatnika",
|
||||
"gainedMana": "Dobio/la si nešto Mane",
|
||||
"gainedHealth": "Dobio/la si nešto Zdravlja",
|
||||
"gainedExperience": "Dobio/la si nešto Iskustva",
|
||||
"lostGold": "Potrošio/la si nešto Zlatnika",
|
||||
"lostMana": "Potrošio/la si nešto Mane",
|
||||
"lostHealth": "Izgubio/la si nešto Zdravlja",
|
||||
"lostExperience": "Izgubio/la si nešto Iskustva",
|
||||
"gainedGold": "Dobili ste nešto Zlatnika",
|
||||
"gainedMana": "Dobili ste nešto Mane",
|
||||
"gainedHealth": "Dobili ste nešto Zdravlja",
|
||||
"gainedExperience": "Dobili ste nešto Iskustva",
|
||||
"lostGold": "Potrošili ste nešto Zlatnika",
|
||||
"lostMana": "Potrošili ste nešto Mane",
|
||||
"lostHealth": "Izgubili ste nešto Zdravlja",
|
||||
"lostExperience": "Izgubili ste nešto Iskustva",
|
||||
"equip": "Opremi",
|
||||
"unequip": "Ukloni",
|
||||
"animalSkins": "Životinjske kože",
|
||||
"str": "SNA",
|
||||
"animalSkins": "Životinjske Kože",
|
||||
"str": "SNG",
|
||||
"con": "KON",
|
||||
"per": "PER",
|
||||
"int": "INT",
|
||||
@@ -166,24 +166,30 @@
|
||||
"facialhair": "Na licu",
|
||||
"photo": "Slika",
|
||||
"info": "Informacije",
|
||||
"joined": "Pridružio/la se",
|
||||
"totalLogins": "Ukupno Prijava",
|
||||
"latestCheckin": "Posljednja Prijava",
|
||||
"joined": "Pridružili ste se",
|
||||
"totalLogins": "Ukupne prijave",
|
||||
"latestCheckin": "Posljednja prijava",
|
||||
"editProfile": "Uredi Profil",
|
||||
"challengesWon": "Dobiveni Izazovi",
|
||||
"questsCompleted": "Dovršene Pustolovine",
|
||||
"headAccess": "Dodaci za glavu",
|
||||
"backAccess": "Dodaci za leđa",
|
||||
"bodyAccess": "Dodaci za tijelo",
|
||||
"mainHand": "Dominantni",
|
||||
"offHand": "Pomoćni",
|
||||
"headAccess": "Dodaci za Glavu.",
|
||||
"backAccess": "Dodaci za Leđa.",
|
||||
"bodyAccess": "Dodaci za Tijelo.",
|
||||
"mainHand": "Primarna ruka",
|
||||
"offHand": "Sporedna ruka",
|
||||
"statPoints": "Statistički bodovi",
|
||||
"pts": "bodova",
|
||||
"purchasePetItemConfirm": "Ova bi kupnja premašila broj stavki koje su vam potrebne da biste izlegli sve moguće <%= itemText %> kućne ljubimce. Jeste li sigurni?",
|
||||
"chatCastSpellParty": "<%= username %> baca <%= spell%> za družbinu.",
|
||||
"pts": "bdv",
|
||||
"purchasePetItemConfirm": "Ova bi kupnja premašila broj stavki koje su vam potrebne da biste izlegli sve moguće <%= itemText %> ljubimce. Jeste li sigurni?",
|
||||
"chatCastSpellParty": "<%= username %> baca <%= spell%> za grupu.",
|
||||
"notEnoughGold": "Nema dovoljno zlata.",
|
||||
"chatCastSpellUser": "<%= username %> baca <%= spell%> na <%= target%>.",
|
||||
"purchaseForGold": "Kupnja za <%= cost %> Zlata?",
|
||||
"chatCastSpellPartyTimes": "<%= username %> koristi <%= spell %> za družinu <%= times %> puta.",
|
||||
"chatCastSpellUserTimes": "<%= username %> koristi <%= spell %> za <%= target %> <%= times %> puta."
|
||||
"chatCastSpellPartyTimes": "<%= username %> koristi <%= spell %> za grupu<%= times %> puta.",
|
||||
"chatCastSpellUserTimes": "<%= username %> koristi <%= spell %> za <%= target %> <%= times %> puta.",
|
||||
"nextReward": "Nagrada za slijedeću prijavu",
|
||||
"skins": "Kože",
|
||||
"titleFacialHair": "Dlake na Licu",
|
||||
"titleHaircolor": "Boja Kose",
|
||||
"titleHairbase": "Frizure",
|
||||
"customizations": "Prilagodbe"
|
||||
}
|
||||
|
||||
@@ -1,84 +1,93 @@
|
||||
{
|
||||
"tavernCommunityGuidelinesPlaceholder": "Prijateljski podsjetnik: ovo je chat namijenjen ljudima svih dobi, pa te molimo da sadržaj i jezik kojeg koristiš bude prikladan! Posavjetuj se sa Smjernicama za zajednicu u rubnoj traci ako imaš pitanja.",
|
||||
"lastUpdated": "Zadnje ažuriranje:",
|
||||
"commGuideHeadingWelcome": "Dobrodošao/la u Habiticu!",
|
||||
"commGuidePara001": "Pozdrav avanturiste! Dobrodošao/la u Habiticu, zemlju produktivnosti, zdravog života i ponekog podivljalog grifona. Imamo veselu zajednicu punu ljudi koji su spremni pomoći i koji se međusobno podržavaju na putu do samopoboljšanja. Kako bi se uklopio/la, potreban je samo pozitivan stav, pristojno ponašanje i shvaćanje da svatko ima drukčije vještine i ograničenja -- uključujući i tebe! Habitičani su strpljivi jedni s drugima i nastoje pomoći kad god mogu.",
|
||||
"commGuidePara002": "Kako bi svi bili sigurni, sretni i produktivni u zajednici, imamo nekoliko smjernica. Pažljivo smo ih osmislili kako bi bila što prijateljskija i lakša za čitati. Molimo te da odvojiš vrijeme da ih pročitaš prije nego što počneš čavrljati.",
|
||||
"commGuidePara003": "Ova se pravila odnose na sve društvene prostore koje koristimo, uključujući (ali ne nužno i ograničeno na) Trello, GitHub, Weblate i Habitica Wiki na Fandomu. Kako se zajednice mijenjaju i rastu, s vremena na vrijeme mogu se promijeniti i njihova pravila. Kada dođe do bitnih promjena pravila zajednice koja su ovdje navedena, o tome ćete čuti u Bailey najavi i/ili našim društvenim medijima!",
|
||||
"tavernCommunityGuidelinesPlaceholder": "Prijateljski podsjetnik: ovo je chat za sve uzraste, stoga molimo da sadržaj i jezik budu prikladni! Ako imate pitanja, pogledajte Smjernice Zajednice u bočnoj traci.",
|
||||
"lastUpdated": "Zadnje ažurirano:",
|
||||
"commGuideHeadingWelcome": "Dobrodošli u Habiticu!",
|
||||
"commGuidePara001": "Pozdrav, pustolovu! Dobrodošli u Habiticu, zemlju produktivnosti, zdravog življenja i povremenih razjarenih grifona.",
|
||||
"commGuidePara002": "Kako bismo pomogli svima da ostanu sigurni, sretni i produktivni, imamo nekoliko smjernica za Izazove, profile igrača, chat u Grupi i privatne poruke. Pažljivo smo izradili ove Smjernice kako bi bile što ugodnije i lakše za čitanje. Molimo Vas da ih odvojite vrijeme pročitati prije nego što započnete interakciju s drugim igračima.",
|
||||
"commGuidePara003": "Ova pravila se s vremena na vrijeme mogu prilagođavati. Kada dođe do značajnih promjena u ovdje navedenim pravilima zajednice, bit ćete obaviješteni putem Bailey najave i/ili naših društvenih mreža!",
|
||||
"commGuideHeadingInteractions": "Interakcije u Habitici",
|
||||
"commGuidePara015": "Habitica ima dvije vrste društvenih prostora: javne i privatne. Javni prostori uključuju Krčmu, javne Cehove, GitHub, Trello i Wiki stranicu. Privatni prostori su privatni Cehovi, chatovi u Družinama i privatne poruke. Sva imena za prikazivanje i @korisnickaimena se moraju pridržavati Smjernica za Javne Prostore. Kako bi promijenio/la svoje ime za prikazivanje i/ili @korisnickoime, na mobilnom uređaju otvori Izbornik > Postavke > Profil. Na webu, idi na Korisnik > Postavke.",
|
||||
"commGuidePara016": "Kada posjećuješ javne prostore Habitice, postoje neka opća pravila da bi svi bili sigurni i zadovoljni.",
|
||||
"commGuideList02A": "<strong>Poštujte jedni druge</strong>. Budite pristojni, ljubazni, prijateljski raspoloženi i uslužni. Zapamtite: Habitičani dolaze iz svih sredina i imali su vrlo različita iskustva. Ovo je dio onoga što Habiticu čini tako cool! Izgradnja zajednice znači poštivanje i slavljenje naših razlika, kao i naših sličnosti.",
|
||||
"commGuideList02C": "<strong>Nemojte objavljivati slike ili tekst koji su nasilni, prijeteći ili seksualno eksplicitni/sugestivni ili koji promiču diskriminaciju, netrpeljivost, rasizam, seksizam, mržnju, uznemiravanje ili nanošenje štete bilo kojem pojedincu ili grupi</strong>. Čak ni kao šala ili meme. To uključuje uvrede kao i izjave. Nemaju svi isti smisao za humor, pa nešto što smatrate šalom može povrijediti drugoga.",
|
||||
"commGuideList02D": "<strong>Neka rasprave budu prikladne za sve uzraste</strong>. To znači izbjegavanje tema za odrasle u javnim prostorima. Imamo mnogo mladih Habitičana koji koriste stranicu, a ljudi dolaze iz svih društvenih slojeva. Želimo da naša zajednica bude što ugodnija i inkluzivnija.",
|
||||
"commGuideList02E": "<strong>Izbjegavajte vulgarnost. To uključuje skraćene ili prikrivene vulgarnosti.</strong> Imamo ljude iz svih vjerskih i kulturnih sredina i želimo osigurati da se svi osjećaju ugodno na javnim mjestima. <strong>Ako vam član osoblja kaže da neki izraz nije dopušten na Habitici, čak i ako se radi o izrazu za koji niste znali da je problematičan, ta je odluka konačna.</strong> Osim toga, uvrede će se vrlo strogo tretirati, jer one također predstavljaju kršenje Uvjeta pružanja usluge.",
|
||||
"commGuideList02G": "<strong>Odmah ispunite svaki zahtjev Osoblja.</strong> To može uključivati, ali nije ograničeno na, zahtjev da ograničite svoje postove u određenom prostoru, uređivanje vašeg profila kako biste uklonili neprikladni sadržaj, traženje da svoju raspravu premjestite na prikladniji prostor itd. Nemojte se svađati s osobljem. Ako imate nedoumica ili komentara o postupcima osoblja, pošaljite e-mail na <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> kako biste kontaktirali našeg upravitelja zajednice.",
|
||||
"commGuideList02J": "<strong>Ne spamaj</strong>. Spamanje može uključiti, ali nije ograničeno na: objavljivanje istog komentara ili upita na više mjesta, objavljivanje poveznica bez objašnjenja ili konteksta, objavljivanje besmislenih poruka, objavljivanje više promotivih poruka o nekom Cehu, Družini ili Izazovu ili objavljivanje mnoštva poruka jednu za drugom. Moljenje za dragulje ili pretplatu u ikojem prostoru za chat ili putem Privatne poruke se također smatra spamom. Ako ćeš dobivati ikakve koristi od klikova na poveznicu, to trebaš pojasniti u tekstu svoje poruke ili će se to isto smatrati spamom.<br/><br/>Na moderatorima je da odluče je li nešto spam ili može dovesti do spama, čak i ako ti ne misliš da si spamao/la. Na primjer, oglašavanje nekog Ceha je prihvatljivo jednom ili dvaput, ali više objava u jednom danu bi se vjerojatno smatralo spamom, bez obzira koliko je taj Ceh koristan!",
|
||||
"commGuideList02K": "<strong>Izbjegavaj objavljivanje velikog zaglavnog teksta u javnim prostorima za chat, a posebice u Krčmi</strong>. Kao i VELIKA SLOVA, ono ostavlja dojam da vičeš i remeti ugodnu atmosferu.",
|
||||
"commGuideList02L": "<strong>Zaista ne potičemo razmjenu osobnih informacija u javnim prostorima za chat - pogotovo informacija koje se mogu koristiti za tvoju identifikaciju</strong>. Identificirajući podaci mogu uključivati, ali nisu ograničeni na: tvoju kućnu adresu, e-mail adresu, tvoj API token/lozinku. Ovo je za tvoju sigurnost! Osoblje ili moderatori mogu ukloniti takve objave po vlastitom nahođenju. Ako te se pita za osobne podatke u privatnom Cehu, Družini ili putem Privatne poruke, iskreno preporučamo da pristojno odbiješ i obavijestiš osoblje i moderatore tako da 1) zastavom označiš poruku ako se nalazi u Družini ili privatnom Cehu, ili 2) ispuniš <a href='http://contact.habitica.com/' target='_blank'>Obrazac za kontaktiranje Moderatora</a> i priložiš snimke zaslona.",
|
||||
"commGuidePara037": "<strong>Nijedan Ceh, bio javan ili privatan, se ne smije napraviti s ciljem napada na neku skupinu ili pojedinca</strong>. Stvaranje takvog Ceha je osnova za trenutnu zabranu pristupa. Bori se protiv loših navika, a ne svojih suputnika na ovoj pustolovini!",
|
||||
"commGuideHeadingInfractionsEtc": "Prekršaji, Posljedice i Obnova",
|
||||
"commGuideHeadingInfractions": "Prekršaji",
|
||||
"commGuidePara050": "Habitičani pretežito jedni drugima pomažu, poštuju se i surađuju kako bi cijela zajednica tvorila zabavno i prijateljski nastrojeno okružje. Ipak, jednom svake prestupne godine, nešto što neki Habitičan napravi može prekršiti poviše navedene smjernice. Kad se to dogodi, Moderatori će poduzeti sve što smatraju potrebnim da zadrže Habiticu sigurnim i ugodnim mjestom za sve.",
|
||||
"commGuidePara051": "<strong>Postoji nekoliko vrsta prekršaja i sa svima se postupa sukladno njihovom stupnju</strong>.Ovo nisu potpuni popisi i Moderatori mogu donositi odluke po vlastitom nahođenju po pitanju tema koje nisu ovdje spomenute. Moderatori će prilikom procjenjivanja prekršaja uzeti u obzir kontekst.",
|
||||
"commGuideHeadingSevereInfractions": "Teži prekršaji",
|
||||
"commGuidePara052": "Teži prekršaji znatno štete sigurnosti Habitičine zajednice i korisnika te stoga sa sobom u konačnici nose teže posljedice.",
|
||||
"commGuidePara053": "Slijede primjeri nekolicine težih prekršaja. Ovo nije sveobuhvatan popis.",
|
||||
"commGuideList05A": "Kršenje Uvjeta i Odredbi",
|
||||
"commGuideList05B": "Govor/slike mržnje, uznemiravanje/uhođenje, virtualno zlostavljanje, vrijeđanje i trolanje",
|
||||
"commGuideList05C": "Povreda probacije",
|
||||
"commGuideList05D": "Lažno predstavljanje sebe kao člana Osoblja ili Moderatora",
|
||||
"commGuideList05E": "Ponovljeni srednje teški prekršaji",
|
||||
"commGuideList05F": "Izrada dvojnog računa kako bi se izbjegle posljedice (na primjer, izrada novog računa kako bi išao/la na chat nakon što su ti oduzete povlastice chata)",
|
||||
"commGuideList05G": "Namjerna prevara Osoblja ili Moderatora kako bi se izbjegle posljedice ili kako bi se drugog korisnika uvalilo u nevolje",
|
||||
"commGuideHeadingModerateInfractions": "Srednje teški prekršaji",
|
||||
"commGuidePara054": "Srednje teški prekršaji ne čini našu zajednicu nesigurnom, ali je čine neugodnom. Ovi prekršaji će imati srednje teške posljedice. Kad se više prekršaja zbroji, posljedice mogu postati ozbiljnije.",
|
||||
"commGuidePara055": "Slijede primjeri nekolicine srednje teških prekršaja. Ovo nije sveobuhvatan popis.",
|
||||
"commGuideList06A": "Ignoriranje, nepoštivanje i svađanje s Moderatorom. Ovo uključuje javno prigovaranje na moderatore ili druge korisnike, javno slavljenje ili branjenje korisnika kojima je zabranjen pristup ili raspravljanje o tome je li neka reakcija moderatora bila prikladna. Ako te zabrinjava jedno od pravila ili ponašanje Moderatora, molimo te da kontaktiraš osoblje putem e-maila (<a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>).",
|
||||
"commGuideList06C": "Namjerno označavanje bezazlenih objava zastavom.",
|
||||
"commGuideList06E": "Uzastopno činjenje manjih prekršaja",
|
||||
"commGuideHeadingMinorInfractions": "Manji prekršaji",
|
||||
"commGuidePara056": "Manje prekršaje se ne podržava i isto imaju manje posljedice. Ako se nastave činiti, s vremenom mogu dovesti do težih posljedica.",
|
||||
"commGuidePara057": "Slijede primjeri nekolicine manjih prekršaja. Ovo nije sveobuhvatan popis.",
|
||||
"commGuideList07A": "Kršenje Smjernica za javne prostore po prvi put",
|
||||
"commGuideList07B": "Bilo kakve izjave ili postupci koji uzrokuju reakciju \"Molim te nemoj\". Kad Moderator treba reći \"Molim te nemoj to raditi\" nekom korisniku, to se može računati kao manji prekršaj za tog korisnika. Evo jednog primjera: \"Molimo te da se prestaneš zalagati za ideju za ovu mogućnost nakon što smo ti nekoliko puta rekli da nije moguća.\" U većini slučajeva, ovo \"Molim te nemoj\" će ujedno biti i manja posljedica, ali ako Moderator treba ovo ponoviti istom korisniku više puta, manji prekršaji će se početi brojati kao srednje teški prekršaji.",
|
||||
"commGuidePara057A": "Neke objave će možda biti skrivene jer sadrže osjetljive informacije ili bi mogle dati ljudima pogrešnu ideju. Ovo se obično ne računa kao prekršaj, pogotovo ne kad se prvi put dogodi!",
|
||||
"commGuidePara015": "Habitica ima nekoliko prostora gdje možete komunicirati s drugim igračima. Oni uključuju kontekste privatnog chata (privatne poruke i chat u Grupi), kao i značajku Traženje Grupe te Izazove.",
|
||||
"commGuidePara016": "Prilikom kretanja društvenim komponentama Habitice, postoji nekoliko općih pravila kako bi svi ostali sigurni i sretni.",
|
||||
"commGuideList02A": "<strong>Poštujte jedni druge</strong>. Budite pristojni, ljubazni, prijateljski nastrojeni i od pomoći. Zapamtite: Habiticanci dolaze iz svih sredina i imaju potpuno različita iskustva.",
|
||||
"commGuideList02C": "<strong>Ne objavljujte slike ili tekst koji su nasilni, prijeteći ili seksualno eksplicitni/sugestivni, ili koji promiču diskriminaciju, netrpeljivost, rasizam, seksizam, mržnju, uznemiravanje ili nanošenje štete bilo kojoj osobi ili grupi</strong>. Ni pod razno kao šalu ili meme. Ovo uključuje pogrdne izraze, kao i izjave. Nemaju svi isti smisao za humor, stoga nešto što smatrate šalom drugima može biti uvredljivo.",
|
||||
"commGuideList02D": "<strong>Budite svjesni da su Habitikanci svih dobi i porijekla</strong>. Izazovi i profili igrača ne smiju spominjati teme za odrasle, koristiti psovke ili poticati na sukob ili svađu.",
|
||||
"commGuideList02E": "<strong>Ako Vam član Osoblja kaže da je neki izraz zabranjen na Habitici, čak i ako niste znali da je problematičan, ta je odluka konačna.</strong> Uz to, pogrdni izrazi će se tretirati vrlo strogo jer su oni također kršenje Uvjeta korištenja.",
|
||||
"commGuideList02G": "<strong>Odmah se pridržavajte svakog zahtjeva Osoblja.</strong> To može uključivati, ali nije ograničeno na, traženje da ograničite svoje objave u određenom prostoru, uređivanje vašeg profila radi uklanjanja neprikladnog sadržaja itd. Nemojte se prepirati s Osobljem. Ako imate nedoumice ili komentare u vezi s postupcima Osoblja, pošaljite e-poruku na <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> kako biste kontaktirali našeg voditelja zajednice.",
|
||||
"commGuideList02J": "<strong>Nemojte slati neželjenu poštu</strong>. Slanje neželjene pošte može uključivati, ali nije ograničeno na: slanje više neželjenih privatnih poruka, slanje besmislenih poruka, slanje više promotivnih poruka o Grupi ili Izazovu ili uzastopno stvaranje više sličnih Izazova ili Izazova niske kvalitete. Osoblje ima diskrecijsko pravo odlučiti koje se poruke smatraju neželjenom poštom.",
|
||||
"commGuideList02K": "<strong>Nemojte slati poveznice bez objašnjenja ili konteksta</strong>. Ako klikanje igrača na poveznicu rezultira bilo kakvom koristi za Vas, to morate otkriti. Ovo se primjenjuje na poruke kao i na Izazove.",
|
||||
"commGuideList02L": "<strong>Izrazito ne potičemo razmjenu osobnih informacija—posebno informacija koje se mogu koristiti za Vašu identifikaciju</strong>. Informacije za identifikaciju mogu uključivati, ali nisu ograničene na: Vašu adresu, Vašu e-poštu te Vašu zaporku ili API Token. Ako se od Vas traže osobne informacije u chatu Grupe ili privatnoj poruci, izrazito preporučujemo da ne odgovorite i da upozorite Osoblje tako što ćete ili prijaviti poruku ili kontaktirati <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> s snimkama zaslona poruka ako je potreban dodatni kontekst.",
|
||||
"commGuidePara037": "<strong>Nijedna Grupa ne smije biti osnovana s ciljem napada na bilo koju grupu ili pojedinca</strong>. Borite se protiv loših navika, a ne protiv svojih kolega pustolova!",
|
||||
"commGuideHeadingInfractionsEtc": "Kršenja, Posljedice i Oporavak",
|
||||
"commGuideHeadingInfractions": "Kršenja",
|
||||
"commGuidePara050": "Pretežno, Habitikanci pomažu jedni drugima, puni su poštovanja i rade na tome da ovdašnja atmosfera bude zabavna i prijateljska. Međutim, jednom u sto godina, nešto što neki Habitikan učini može prekršiti jednu od gore navedenih Smjernica. Kada se to dogodi, Osoblje će poduzeti sve radnje koje smatra potrebnima kako bi Habitica ostala sigurna i ugodna za sve.",
|
||||
"commGuidePara051": "<strong>Postoji niz kršenja, a rješavaju se ovisno o njihovoj ozbiljnosti</strong>. Ovdje se ne radi o sveobuhvatnim popisima, a Osoblje može donositi odluke o temama koje ovdje nisu obrađene, prema vlastitom nahođenju. Osoblje će uzeti kontekst u obzir prilikom procjene kršenja.",
|
||||
"commGuideHeadingSevereInfractions": "Teška kršenja",
|
||||
"commGuidePara052": "Teška kršenja znatno narušavaju sigurnost Habiticine zajednice i korisnika te stoga rezultiraju ozbiljnim posljedicama.",
|
||||
"commGuidePara053": "Slijede primjeri nekih teških kršenja. Ovo nije sveobuhvatan popis.",
|
||||
"commGuideList05A": "Ostala kršenja Uvjeta i odredbi koja ovdje nisu navedena",
|
||||
"commGuideList05B": "Govor/Slike mržnje, Uznemiravanje/Uhođenje, Internetsko nasilje, Vrijeđanje i Provociranje",
|
||||
"commGuideList05C": "Kršenje uvjetne kazne",
|
||||
"commGuideList05D": "Lažno predstavljanje kao Osoblje - ovo uključuje tvrdnju da su prostori koje su kreirali igrači, a koji nisu povezani s Habiticom, službeni i/ili da ih moderira Habitica ili njezino Osoblje",
|
||||
"commGuideList05E": "Ponavljana umjerena kršenja",
|
||||
"commGuideList05F": "Stvaranje dupliciranog računa radi izbjegavanja posljedica",
|
||||
"commGuideList05G": "Namjerno obmanjivanje Osoblja s ciljem izbjegavanja posljedica ili dovođenja drugog korisnika u nevolju",
|
||||
"commGuideHeadingModerateInfractions": "Umjerena kršenja",
|
||||
"commGuidePara054": "Ova će kršenja imati umjerene posljedice. U kombinaciji s višestrukim kršenjima, posljedice mogu postati ozbiljnije.",
|
||||
"commGuidePara055": "Slijede neki primjeri Umjerenih kršenja. Ovo nije sveobuhvatan popis.",
|
||||
"commGuideList06A": "Ignoriranje, nepoštivanje ili prepiranje s Osobljem. Ako ste zabrinuti zbog jednog od pravila ili ponašanja osoblja, molimo Vas da nas kontaktirate na <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>.",
|
||||
"commGuideList06C": "Namjerno prijavljivanje neproblematičnih Izazova, profila ili poruka.",
|
||||
"commGuideList06E": "Ponavljano činjenje manjih kršenja",
|
||||
"commGuideHeadingMinorInfractions": "Manja kršenja",
|
||||
"commGuidePara056": "Manja kršenja, iako obeshrabrena, i dalje imaju blage posljedice. Ako se nastave događati, s vremenom mogu dovesti do ozbiljnijih posljedica. Manja kršenja obično su prva kršenja ovih Smjernica, ali mogu uključivati i druge okolnosti.",
|
||||
"commGuidePara057": "Slijede neki primjeri Manjih kršenja. Ovo nije sveobuhvatan popis.",
|
||||
"commGuideList07A": "Prvo kršenje Smjernica za javne prostore",
|
||||
"commGuideList07B": "Bilo kakve izjave ili radnje zbog kojih član Osoblja izda upozorenje \"Molimo Nemojte\". Kada se od Vas javno zatraži da nešto ne činite, to samo po sebi može biti posljedica. Ako Osoblje mora izdati mnogo takvih ispravaka istoj osobi, to se može smatrati težim kršenjem",
|
||||
"commGuidePara057A": "Neke objave mogu biti skrivene jer sadrže osjetljive informacije ili bi mogle ostaviti pogrešan dojam. To se obično ne računa kao kršenje, posebno ne prvi put da se dogodi!",
|
||||
"commGuideHeadingConsequences": "Posljedice",
|
||||
"commGuidePara059": "<strong>Isto tako, svi prekršaji imaju izravne posljedice.</strong> Neki primjeri posljedica su navedeni ispod.",
|
||||
"commGuideHeadingSevereConsequences": "Primjeri ozbiljnih posljedica",
|
||||
"commGuideList09A": "Zabrane računa (vidi poviše)",
|
||||
"commGuideList09C": "Trajno onemogućavanje (\"zamrzavanje\") napretka kroz Rangove Doprinositelja",
|
||||
"commGuidePara059": "<strong>Kršenja u zajednici imaju izravne posljedice.</strong> Neki primjeri posljedica navedeni su u nastavku.",
|
||||
"commGuideHeadingSevereConsequences": "Primjeri teških posljedica",
|
||||
"commGuideList09A": "Zabrane računa",
|
||||
"commGuideList09C": "Trajno zaustavljanje napredovanja kroz Razinu suradnika",
|
||||
"commGuideHeadingModerateConsequences": "Primjeri umjerenih posljedica",
|
||||
"commGuideList10D": "Privremeno onemogućavanje (\"zamrzavanje\") napretka kroz Rangove Doprinositelja",
|
||||
"commGuideHeadingMinorConsequences": "Primjeri blagih posljedica",
|
||||
"commGuideList11A": "Podsjetnici na Smjernice za javne prostore",
|
||||
"commGuideList10D": "Privremeno zaustavljanje napredovanja kroz Razinu suradnika",
|
||||
"commGuideHeadingMinorConsequences": "Primjeri manjih posljedica",
|
||||
"commGuideList11A": "Podsjetnici na Smjernice",
|
||||
"commGuideList11B": "Upozorenja",
|
||||
"commGuideList11C": "Zahtjevi",
|
||||
"commGuideList11D": "Brisanje (Moderatori/Osoblje mogu izbrisati problematičan sadržaj)",
|
||||
"commGuideList11E": "Uređivanje (Moderatori/Osoblje mogu uređivati problematičan sadržaj)",
|
||||
"commGuideList11D": "Brisanje problematičnog sadržaja od strane Osoblja",
|
||||
"commGuideList11E": "Uređivanje problematičnog sadržaja od strane Osoblja",
|
||||
"commGuideHeadingRestoration": "Obnova",
|
||||
"commGuidePara061": "Habitica je zemlja posvećena samopoboljšanju i mi vjerujemo u druge prilike. <strong>Ako počiniš prekršaj i pretrpiš posljedice, gledaj na to kao priliku za reevaluaciju svojih djela i teži biti bolji član zajednice</strong>.",
|
||||
"commGuidePara062": "Obavijest, poruka i/ili e-mail kojeg dobiješ s objašnjenjem posljedica tvojih postupaka je dobar izvor informacija. Prihvati sva ograničenja koja su ti nametnuta i nastoj udovoljiti zahtjevima za ukidanje kazni.",
|
||||
"commGuidePara063": "Ako ne razumiješ posljedice svojih postupaka ili narav svog prekršaja, obrati se Osoblju/Moderatorima za pomoć da bi izbjegao/la činjenje prekršaja u budućnosti. Ako misliš da je određena odluka bila nepoštena, možeš kontaktirati osoblje i raspraviti ovo s njima putem adrese <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>.",
|
||||
"commGuideHeadingMeet": "Upoznaj Osoblje i Moderatore!",
|
||||
"commGuidePara007": "Osoblje ima ljubičaste oznake s krunama. Njihova titula je \"Herojski\".",
|
||||
"commGuidePara009": "Trenutni članovi osoblja su (s lijeva na desno):",
|
||||
"commGuideAKA": "<%= habitName %> također poznat/a kao <%= realName %>",
|
||||
"commGuidePara061": "Habitica je posvećena samousavršavanju i vjerujemo u druge prilike. <strong>Ako počinite kršenje i snosite posljedicu, gledajte na to kao na priliku da procijenite svoje postupke i nastojite biti bolji član zajednice</strong>.",
|
||||
"commGuidePara062": "<strong>Ako želite postaviti pitanja o svom kršenju ili posljedicama, ispričati se ili zatražiti ponovno aktiviranje, molimo Vas da nas kontaktirate na <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> navodeći svoj Korisnički ID ili @korisničko ime</strong>. <strong>Vaša</strong> je odgovornost da se javite.",
|
||||
"commGuidePara063": "Ako ne razumijete svoje posljedice ili prirodu svog kršenja, ili ako imate druga pitanja povezana s tim problemom, možete se obratiti osoblju kako biste o tome razgovarali na <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>. Surađujte s nametnutim ograničenjima i nastojte ispuniti zahtjeve za ukidanje bilo kakvih kazni.",
|
||||
"commGuideHeadingMeet": "Upoznajte Osoblje",
|
||||
"commGuidePara007": "Osoblje Habitice održava aplikaciju i stranice operativnima te može djelovati kao moderatori chata. Imaju ljubičaste oznake s krunama. Njihov je naziv \"Herojski\".",
|
||||
"commGuidePara009": "Trenutni članovi Osoblja su (s lijeva na desno):",
|
||||
"commGuideAKA": "<%= habitName %> tj. <%= realName %>",
|
||||
"commGuideOnGitHub": "<%= gitHubName %> na GitHubu",
|
||||
"commGuidePara011b": "na GitHubu/Wiki stranici",
|
||||
"commGuidePara011c": "na Wiki stranici",
|
||||
"commGuidePara011b": "na GitHubu/Fandomu",
|
||||
"commGuidePara011c": "na Wikiju",
|
||||
"commGuidePara011d": "na GitHubu",
|
||||
"commGuidePara013": "U zajednici velikoj kao Habitica, korisnici dolaze i odlaze, i nekad član osoblja ili moderator mora odložiti svoj plemeniti plašt i opustiti se. Ovo su Počasni članovi Osoblja i Moderatori. Oni više ne posjeduju moć člana Osoblja ili Moderatora, ali i dalje želimo odlikovati njihov rad!",
|
||||
"commGuidePara014": "Počasni članovi Osoblja i Moderatori:",
|
||||
"commGuidePara013": "U zajednici velikoj poput Habitice, igrači dolaze i odlaze, a ponekad član osoblja ili moderator moraju odložiti svoj plemeniti plašt i opustiti se. Slijede bivši članovi osoblja i moderatori. Oni više ne djeluju s ovlastima člana Osoblja ili Moderatora, ali bismo i dalje željeli odati počast njihovom radu!",
|
||||
"commGuidePara014": "Bivše Osoblje i Moderatori:",
|
||||
"commGuideHeadingFinal": "Završni odjeljak",
|
||||
"commGuidePara067": "I to bi bilo to, hrabri Habitičane -- Smjernice za zajednicu! Obriši sad znoj s čela i nagradi se XP-om što si ih pročitao/la sve. Ako imaš ikakvih pitanja ili nedoumica u vezi ovih Smjernice za zajednicu, molimo te da nam se javiš putem <a href='http://contact.habitica.com/' target='_blank'>Obrasca za kontaktiranje Moderatora</a> i rado ćemo pomoći i pojasniti stvari.",
|
||||
"commGuidePara068": "Sad pođi naprijed, hrabri pustolovče, i navali na neke Svakodnevne zadatke!",
|
||||
"commGuidePara067": "I eto ga, hrabri Habitikanče -- Smjernice zajednice! Obriši taj znoj s čela i daj si nešto EXP jer si sve pročitao. Ako imate bilo kakvih pitanja ili nedoumica u vezi s ovim Smjernicama zajednice, molimo Vas da nam se obratite putem <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> i rado ćemo Vam pomoći da razjasnimo stvari.",
|
||||
"commGuidePara068": "Sada kreni, hrabri pustolove, i uništi neke Dnevne zadatke!",
|
||||
"commGuideHeadingLinks": "Korisne poveznice",
|
||||
"commGuideLink02": "<a href='http://habitica.wikia.com/wiki/Habitica_Wiki' target='_blank'>Wiki stranica</a>: najveća kolekcija informacija o Habitici.",
|
||||
"commGuideLink03": "<a href='https://github.com/HabitRPG/habitica' target='_blank'>GitHub</a>: za prijavljivanje grešaka ili pomaganje u kodiranju!",
|
||||
"commGuideLink04": "<a href='https://trello.com/b/EpoYEYod/' target='_blank'>Glavni Trello</a>: za predlaganje mogućnosti na stranici.",
|
||||
"commGuidePara069": "Sljedeći nadareni umjetnici su doprinijeli ovim ilustracijama:",
|
||||
"commGuideList01A": "Odredbe i uvjeti primjenjuju se na sve prostore, uključujući privatne cehove, chat u družinama i poruke.",
|
||||
"commGuideList02N": "<strong>Označi i prijavi postove koji krše ove Smjernice ili Uvjete pružanja usluge.</strong> Obradit ćemo ih što je prije moguće. Također možeš obavijestiti osoblje putem <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>, ali prijave su najbrži način da dobiješ pomoć.",
|
||||
"commGuideList02M": "Nemojte tražiti niti moliti za dragulje, pretplate ili članstvo u grupnim planovima. Ovo nije dopušteno u Krčmi, javnim ili privatnim prostorima za čavrljanje ili u PM-ovima. Ako primite poruke u kojima se traže plaćeni artikli, prijavite ih. Ponovljeno ili ozbiljno moljenje za dragulje ili pretplatu, osobito nakon upozorenja, može rezultirati zabranom računa."
|
||||
"commGuideLink02": "<a href='https://habitica.fandom.com/wiki/Habitica_Wiki' target='_blank'>Wiki</a>: najveća zbirka informacija o Habitici. Imajte na umu da je ovaj prostor neslužben, hostira ga Fandom i održavaju ga igrači.",
|
||||
"commGuideLink03": "<a href='https://github.com/HabitRPG/habitica' target='_blank'>GitHub</a>: za pomoć s kodom!",
|
||||
"commGuideLink04": "<a href='https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link' target='_blank'>Obrazac za povratne informacije</a>: za zahtjeve za značajke stranice i aplikacije.",
|
||||
"commGuidePara069": "Sljedeći talentirani umjetnici doprinijeli su ovim ilustracijama:",
|
||||
"commGuideList01A": "Naše Smjernice i Uvjeti korištenja primjenjuju se u Izazovima, Grupama, profilima igrača i privatnim porukama.",
|
||||
"commGuideList02N": "<strong>Prijavite sve što vidite, a što krši ove Smjernice ili naše Uvjete korištenja</strong>. Poruku možete prijaviti izravno ili obavijestiti osoblje putem adrese <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> za kršenja u profilima ili Izazovima. Riješit ćemo ih što je brže moguće. Možete nas kontaktirati na svom materinjem jeziku ako Vam je tako lakše: možda ćemo morati koristiti Google Prevoditelj, ali želimo da Vam bude ugodno kontaktirati nas ako imate problem.",
|
||||
"commGuideList02M": "<strong>Nemojte tražiti niti moliti za Dragulje, pretplate ili članstvo u Grupnim planovima</strong>. Ako vidite ili primite neželjene poruke u kojima se traže plaćene stavke, molimo Vas da ih prijavite. Višestruko traženje Dragulja ili pretplate, osobito nakon upozorenja, može rezultirati zabranom pristupa računu.",
|
||||
"commGuideList02H": "<strong>Sva Imena za prikaz i @korisnička imena moraju biti u skladu s Uvjetima korištenja</strong>. Za promjenu Imena za prikaz i/ili @korisničkog imena: na mobilnom uređaju idite na Izbornik > Postavke > Račun. Na webu idite na Postavke preko ikone korisnika u gornjoj navigaciji.",
|
||||
"commGuideList02I": "<strong>Nazivi Izazova trebaju biti prikladni za sve prostore, jer će se pojaviti u javnom profilu pobjednika</strong>. Imajte to na umu prilikom stvaranja Izazova jer ćemo biti prisiljeni urediti zapis u njihovom profilu u slučaju prijave.",
|
||||
"commGuideList02O": "<strong>Grupe mogu stvarati vlastita pravila za chat radi udobnosti i želja svojih članova</strong>. Međutim, administratori ne mogu provoditi pravila chata u tim privatnim prostorima osim ako ne dođe do kršenja Uvjeta korištenja, uključujući uznemiravanje. Ako netko u Vašoj Grupi stvara probleme, potičemo vođu Grupe da ga ukloni.",
|
||||
"commGuideList02P": "<strong>Ne potičemo slanje neželjenih privatnih poruka</strong>. Ako primite neželjenu poruku zbog koje Vam je neugodno ili koja krši ove Smjernice ili Uvjete korištenja, blokirajte pošiljatelja i prijavite je kako biste skrenuli pozornost Osoblju.",
|
||||
"commGuideList02Q": "<strong>Nemojte pokušavati zaobići blok</strong>. Ako Vas je netko blokirao u slanju privatnih poruka, nemojte ga kontaktirati negdje drugdje kako biste ga tražili da Vas deblokira.",
|
||||
"commGuideList05H": "Teški ili ponovljeni pokušaji prevare ili pritiskanja drugih igrača za predmete koji se plaćaju stvarnim novcem",
|
||||
"commGuideList09D": "Uklanjanje ili degradacija Razina suradnika",
|
||||
"commGuideList09E": "Trajno uklanjanje mogućnosti slanja privatnih poruka ili pojavljivanja u pretrazi članova Grupe",
|
||||
"commGuideList10G": "Privremeno onemogućavanje mogućnosti slanja privatnih poruka ili pojavljivanja u pretrazi članova Grupe"
|
||||
}
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
{
|
||||
"potionText": "Napitak za zdravlje",
|
||||
"potionNotes": "Vraća 15 bodova Zdravlja (odmah se primjenjuje)",
|
||||
"potionText": "Ljekoviti napitak",
|
||||
"potionNotes": "Obnavlja 15 zdravlja (trenutačna upotreba)",
|
||||
"armoireText": "Začarani Ormar",
|
||||
"armoireNotesFull": "Otvori Ormar kako bi nasumično dobio/la posebnu Opremu, Iskustvo ili hranu! Preostalo komada opreme:",
|
||||
"armoireLastItem": "Našao/la si zadnji komad rijetke Opreme u Začaranom Ormaru.",
|
||||
"armoireNotesEmpty": "Ormar će imati novu Opremu u prvom tjednu svakog mjeseca. Do tada, nastavi klikati za Iskustvo i hranu za Ljubimce!",
|
||||
"armoireNotesFull": "Otvorite Ormar kako biste nasumično dobili posebnu Opremu, Iskustvo ili hranu! Preostalih dijelova opreme:",
|
||||
"armoireLastItem": "Pronašli ste posljednji dio rijetke Opreme u Začaranom ormaru.",
|
||||
"armoireNotesEmpty": "Ormar će imati novu Opremu prvog tjedna svakog mjeseca. Dotad, nastavite klikati za Iskustvo i Hranu za ljubimce!",
|
||||
"dropEggWolfText": "Vuk",
|
||||
"dropEggWolfMountText": "Vuk",
|
||||
"dropEggWolfAdjective": "odani",
|
||||
"dropEggTigerCubText": "Mladunče tigra",
|
||||
"dropEggTigerCubText": "Mladunče Tigra",
|
||||
"dropEggTigerCubMountText": "Tigar",
|
||||
"dropEggTigerCubAdjective": "opaki",
|
||||
"dropEggPandaCubText": "Mladunče pande",
|
||||
"dropEggPandaCubText": "Mladunče Pande",
|
||||
"dropEggPandaCubMountText": "Panda",
|
||||
"dropEggPandaCubAdjective": "nježna",
|
||||
"dropEggLionCubText": "Mladunče lava",
|
||||
"dropEggLionCubText": "Mladunče Lava",
|
||||
"dropEggLionCubMountText": "Lav",
|
||||
"dropEggLionCubAdjective": "kraljevski",
|
||||
"dropEggFoxText": "Lisica",
|
||||
"dropEggFoxMountText": "Lisica",
|
||||
"dropEggFoxAdjective": "lukava",
|
||||
"dropEggFlyingPigText": "Leteći praščić",
|
||||
"dropEggFlyingPigMountText": "Leteći praščić",
|
||||
"dropEggFlyingPigText": "Leteći Praščić",
|
||||
"dropEggFlyingPigMountText": "Leteći Praščić",
|
||||
"dropEggFlyingPigAdjective": "ćudljivi",
|
||||
"dropEggDragonText": "Zmaj",
|
||||
"dropEggDragonMountText": "Zmaj",
|
||||
@@ -29,7 +29,7 @@
|
||||
"dropEggCactusText": "Kaktus",
|
||||
"dropEggCactusMountText": "Kaktus",
|
||||
"dropEggCactusAdjective": "bockavi",
|
||||
"dropEggBearCubText": "Mladunče medvjeda",
|
||||
"dropEggBearCubText": "Mladunče Medvjeda",
|
||||
"dropEggBearCubMountText": "Medvjed",
|
||||
"dropEggBearCubAdjective": "hrabri",
|
||||
"questEggGryphonText": "Grifon",
|
||||
@@ -42,7 +42,7 @@
|
||||
"questEggDeerMountText": "Jelen",
|
||||
"questEggDeerAdjective": "elegantni",
|
||||
"questEggEggText": "Jaje",
|
||||
"questEggEggMountText": "Košara s jajima",
|
||||
"questEggEggMountText": "Košara s Jajima",
|
||||
"questEggEggAdjective": "šarena",
|
||||
"questEggRatText": "Štakor",
|
||||
"questEggRatMountText": "Štakor",
|
||||
@@ -50,8 +50,8 @@
|
||||
"questEggOctopusText": "Hobotnica",
|
||||
"questEggOctopusMountText": "Hobotnica",
|
||||
"questEggOctopusAdjective": "ljigava",
|
||||
"questEggSeahorseText": "Morski konjić",
|
||||
"questEggSeahorseMountText": "Morski konjić",
|
||||
"questEggSeahorseText": "Morski Konjić",
|
||||
"questEggSeahorseMountText": "Morski Konjić",
|
||||
"questEggSeahorseAdjective": "nagradni",
|
||||
"questEggParrotText": "Papiga",
|
||||
"questEggParrotMountText": "Papiga",
|
||||
@@ -77,8 +77,8 @@
|
||||
"questEggBunnyText": "Kunić",
|
||||
"questEggBunnyMountText": "Kunić",
|
||||
"questEggBunnyAdjective": "mekani",
|
||||
"questEggSlimeText": "Sluz bijelog sljeza",
|
||||
"questEggSlimeMountText": "Sluz bijelog sljeza",
|
||||
"questEggSlimeText": "Sljezova Sluz",
|
||||
"questEggSlimeMountText": "Sljezova Sluz",
|
||||
"questEggSlimeAdjective": "slatka",
|
||||
"questEggSheepText": "Ovca",
|
||||
"questEggSheepMountText": "Ovca",
|
||||
@@ -89,8 +89,8 @@
|
||||
"questEggWhaleText": "Kit",
|
||||
"questEggWhaleMountText": "Kit",
|
||||
"questEggWhaleAdjective": "zapljuskujući",
|
||||
"questEggCheetahText": "La(žo)v",
|
||||
"questEggCheetahMountText": "La(žo)v",
|
||||
"questEggCheetahText": "Gepard",
|
||||
"questEggCheetahMountText": "Gepard",
|
||||
"questEggCheetahAdjective": "iskreni",
|
||||
"questEggHorseText": "Konj",
|
||||
"questEggHorseMountText": "Konj",
|
||||
@@ -104,8 +104,8 @@
|
||||
"questEggUnicornText": "Jednorog",
|
||||
"questEggUnicornMountText": "Krilati jednorog",
|
||||
"questEggUnicornAdjective": "čarobni",
|
||||
"questEggSabretoothText": "Sabljozubi tigar",
|
||||
"questEggSabretoothMountText": "Sabljozubi tigar",
|
||||
"questEggSabretoothText": "Sabljozubi Tigar",
|
||||
"questEggSabretoothMountText": "Sabljozubi Tigar",
|
||||
"questEggSabretoothAdjective": "bijesni",
|
||||
"questEggMonkeyText": "Majmun",
|
||||
"questEggMonkeyMountText": "Majmun",
|
||||
@@ -119,20 +119,20 @@
|
||||
"questEggTreelingText": "Drvce",
|
||||
"questEggTreelingMountText": "Drvce",
|
||||
"questEggTreelingAdjective": "lisnato",
|
||||
"questEggAxolotlText": "Daždevnjak",
|
||||
"questEggAxolotlMountText": "Daždevnjak",
|
||||
"questEggAxolotlText": "Aksolotl",
|
||||
"questEggAxolotlMountText": "Aksolotl",
|
||||
"questEggAxolotlAdjective": "maleni",
|
||||
"questEggTurtleText": "Morska kornjača",
|
||||
"questEggTurtleMountText": "Divovska morska kornjača",
|
||||
"questEggTurtleText": "Morska Kornjača",
|
||||
"questEggTurtleMountText": "Divovska Morska Kornjača",
|
||||
"questEggTurtleAdjective": "miroljubiva",
|
||||
"questEggArmadilloText": "Armadilo",
|
||||
"questEggArmadilloMountText": "Armadilo",
|
||||
"questEggArmadilloText": "Oklopnik",
|
||||
"questEggArmadilloMountText": "Oklopnik",
|
||||
"questEggArmadilloAdjective": "oklopljeni",
|
||||
"questEggCowText": "Krava",
|
||||
"questEggCowMountText": "Krava",
|
||||
"questEggCowAdjective": "mukajuća",
|
||||
"questEggBeetleText": "Buba",
|
||||
"questEggBeetleMountText": "Buba",
|
||||
"questEggBeetleText": "Kukac",
|
||||
"questEggBeetleMountText": "Kukac",
|
||||
"questEggBeetleAdjective": "nepobjediva",
|
||||
"questEggFerretText": "Lasica",
|
||||
"questEggFerretMountText": "Lasica",
|
||||
@@ -151,15 +151,15 @@
|
||||
"questEggPeacockAdjective": "šepureći",
|
||||
"questEggButterflyText": "Gusjenica",
|
||||
"questEggButterflyMountText": "Leptir",
|
||||
"questEggButterflyAdjective": "slatki/a",
|
||||
"questEggNudibranchText": "Puž golač",
|
||||
"questEggNudibranchMountText": "Puž golač",
|
||||
"questEggButterflyAdjective": "slatki",
|
||||
"questEggNudibranchText": "Gologranac",
|
||||
"questEggNudibranchMountText": "Gologranac",
|
||||
"questEggNudibranchAdjective": "okretni",
|
||||
"questEggHippoText": "Nilski konj",
|
||||
"questEggHippoMountText": "Nilski konj",
|
||||
"questEggHippoAdjective": "veseli",
|
||||
"questEggYarnText": "Predivo",
|
||||
"questEggYarnMountText": "Leteći tepih",
|
||||
"questEggYarnText": "Vuna",
|
||||
"questEggYarnMountText": "Leteći Tepih",
|
||||
"questEggYarnAdjective": "vuneni",
|
||||
"questEggPterodactylText": "Pterodaktil",
|
||||
"questEggPterodactylMountText": "Pterodaktil",
|
||||
@@ -170,9 +170,9 @@
|
||||
"questEggSquirrelText": "Vjeverica",
|
||||
"questEggSquirrelMountText": "Vjeverica",
|
||||
"questEggSquirrelAdjective": "kitnjastog repa",
|
||||
"questEggSeaSerpentText": "Morska zmija",
|
||||
"questEggSeaSerpentMountText": "Morska zmija",
|
||||
"questEggSeaSerpentAdjective": "svjetlucavi",
|
||||
"questEggSeaSerpentText": "Morska Zmija",
|
||||
"questEggSeaSerpentMountText": "Morska Zmija",
|
||||
"questEggSeaSerpentAdjective": "svjetlucava",
|
||||
"questEggKangarooText": "Klokan",
|
||||
"questEggKangarooMountText": "Klokan",
|
||||
"questEggKangarooAdjective": "pronicljivi",
|
||||
@@ -182,7 +182,7 @@
|
||||
"questEggVelociraptorText": "Velociraptor",
|
||||
"questEggVelociraptorMountText": "Velociraptor",
|
||||
"questEggVelociraptorAdjective": "oštroumni",
|
||||
"eggNotes": "Nađi napitak za izlijeganje, polij ga preko jaja i ono će se izleći u <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
|
||||
"eggNotes": "Pronađi napitak za valjenje koji ćeš izliti na ovo jaje, i ono će se izleći u <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
|
||||
"hatchingPotionBase": "Osnovni",
|
||||
"hatchingPotionWhite": "Bijeli",
|
||||
"hatchingPotionDesert": "Pustinjski",
|
||||
@@ -190,18 +190,18 @@
|
||||
"hatchingPotionShade": "Sjenoviti",
|
||||
"hatchingPotionSkeleton": "Kostur",
|
||||
"hatchingPotionZombie": "Zombi",
|
||||
"hatchingPotionCottonCandyPink": "Svijetlorozi",
|
||||
"hatchingPotionCottonCandyBlue": "Svijetloplavi",
|
||||
"hatchingPotionCottonCandyPink": "Ružičasta šećerna vuna",
|
||||
"hatchingPotionCottonCandyBlue": "Plava šećerna vuna",
|
||||
"hatchingPotionGolden": "Zlatni",
|
||||
"hatchingPotionSpooky": "Jezivi",
|
||||
"hatchingPotionPeppermint": "Pepermintski",
|
||||
"hatchingPotionPeppermint": "Paprenometvičin",
|
||||
"hatchingPotionFloral": "Cvjetni",
|
||||
"hatchingPotionAquatic": "Vodeni",
|
||||
"hatchingPotionEmber": "Vatreni",
|
||||
"hatchingPotionEmber": "Žarki",
|
||||
"hatchingPotionThunderstorm": "Olujni",
|
||||
"hatchingPotionGhost": "Dušni",
|
||||
"hatchingPotionRoyalPurple": "Kraljevsko ljubičasti",
|
||||
"hatchingPotionHolly": "Zimzeleni",
|
||||
"hatchingPotionRoyalPurple": "Kraljevskoljubičast",
|
||||
"hatchingPotionHolly": "Božikovin",
|
||||
"hatchingPotionCupid": "Ljubavni",
|
||||
"hatchingPotionShimmer": "Svjetlucavi",
|
||||
"hatchingPotionFairy": "Vilinski",
|
||||
@@ -211,119 +211,204 @@
|
||||
"hatchingPotionGlow": "Svijetleći",
|
||||
"hatchingPotionFrost": "Mrzli",
|
||||
"hatchingPotionIcySnow": "Ledeni snijeg",
|
||||
"hatchingPotionNotes": "Polij ovo na jaje i izleći će se <%= potText(locale) %> ljubimac.",
|
||||
"hatchingPotionNotes": "Izlij ovo na jaje, i ono će se izleći kao <%= potText(locale) %> Ljubimac.",
|
||||
"foodMeat": "Meso",
|
||||
"foodMeatThe": "meso",
|
||||
"foodMeatThe": "Meso",
|
||||
"foodMeatA": "Meso",
|
||||
"foodMilk": "Mlijeko",
|
||||
"foodMilkThe": "mlijeko",
|
||||
"foodMilkThe": "Mlijeko",
|
||||
"foodMilkA": "Mlijeko",
|
||||
"foodPotatoe": "Krumpir",
|
||||
"foodPotatoeThe": "krumpir",
|
||||
"foodPotatoeA": "krumpir",
|
||||
"foodPotatoeThe": "Krumpir",
|
||||
"foodPotatoeA": "Krumpir",
|
||||
"foodStrawberry": "Jagoda",
|
||||
"foodStrawberryThe": "jagodu",
|
||||
"foodStrawberryA": "jagodu",
|
||||
"foodStrawberryThe": "Jagodu",
|
||||
"foodStrawberryA": "Jagodu",
|
||||
"foodChocolate": "Čokolada",
|
||||
"foodChocolateThe": "čokoladu",
|
||||
"foodChocolateThe": "Čokoladu",
|
||||
"foodChocolateA": "Čokolada",
|
||||
"foodFish": "Riba",
|
||||
"foodFishThe": "ribu",
|
||||
"foodFishA": "ribu",
|
||||
"foodRottenMeat": "Pokvareno meso",
|
||||
"foodRottenMeatThe": "pokvareno meso",
|
||||
"foodRottenMeatA": "Pokvareno meso",
|
||||
"foodCottonCandyPink": "Roza šećerna vata",
|
||||
"foodCottonCandyPinkThe": "rozu šećernu vatu",
|
||||
"foodCottonCandyPinkA": "Roza šećerna vata",
|
||||
"foodCottonCandyBlue": "Plava šećerna vata",
|
||||
"foodCottonCandyBlueThe": "plavu šećernu vatu",
|
||||
"foodCottonCandyBlueA": "Plava šećerna vata",
|
||||
"foodFishThe": "Ribu",
|
||||
"foodFishA": "Ribu",
|
||||
"foodRottenMeat": "Pokvareno Meso",
|
||||
"foodRottenMeatThe": "Pokvareno Meso",
|
||||
"foodRottenMeatA": "Pokvareno Meso",
|
||||
"foodCottonCandyPink": "Ružičasta šećerna vuna",
|
||||
"foodCottonCandyPinkThe": "Ružičastu šećernu vuna",
|
||||
"foodCottonCandyPinkA": "Ružičastu šećernu vuna",
|
||||
"foodCottonCandyBlue": "Plava šećerna vuna",
|
||||
"foodCottonCandyBlueThe": "Plavu šećernu vunu",
|
||||
"foodCottonCandyBlueA": "Plavu šećernu vunu",
|
||||
"foodHoney": "Med",
|
||||
"foodHoneyThe": "med",
|
||||
"foodHoneyThe": "Med",
|
||||
"foodHoneyA": "Med",
|
||||
"foodCakeSkeleton": "Torta od kostiju",
|
||||
"foodCakeSkeletonThe": "tortu od kostiju",
|
||||
"foodCakeSkeletonA": "tortu od kostiju",
|
||||
"foodCakeBase": "Torta",
|
||||
"foodCakeBaseThe": "tortu",
|
||||
"foodCakeBaseA": "tortu",
|
||||
"foodCakeCottonCandyBlue": "Svijetloplava torta",
|
||||
"foodCakeCottonCandyBlueThe": "svijetloplavu tortu",
|
||||
"foodCakeCottonCandyBlueA": "svijetloplavu tortu",
|
||||
"foodCakeCottonCandyPink": "Svijetloroza torta",
|
||||
"foodCakeCottonCandyPinkThe": "svijetlorozu tortu",
|
||||
"foodCakeCottonCandyPinkA": "svijetlorozu tortu",
|
||||
"foodCakeShade": "Čokoladna torta",
|
||||
"foodCakeShadeThe": "čokoladnu tortu",
|
||||
"foodCakeShadeA": "čokoladnu tortu",
|
||||
"foodCakeWhite": "Kremasta torta",
|
||||
"foodCakeWhiteThe": "kremastu tortu",
|
||||
"foodCakeWhiteA": "kremastu tortu",
|
||||
"foodCakeSkeleton": "Goli Kostur Torta",
|
||||
"foodCakeSkeletonThe": "Gole Kostur Torte",
|
||||
"foodCakeSkeletonA": "Gole Kostur Torte",
|
||||
"foodCakeBase": "Bazična Torta",
|
||||
"foodCakeBaseThe": "Bazične Torte",
|
||||
"foodCakeBaseA": "Bazične Torte",
|
||||
"foodCakeCottonCandyBlue": "Slatkiš Plava Torta",
|
||||
"foodCakeCottonCandyBlueThe": "Slatkiš Plave Torte",
|
||||
"foodCakeCottonCandyBlueA": "Slatkiš Plave Torte",
|
||||
"foodCakeCottonCandyPink": "Slatkiš Roza Torta",
|
||||
"foodCakeCottonCandyPinkThe": "Slatkiš Roze Torte",
|
||||
"foodCakeCottonCandyPinkA": "Slatkiš Roze Torte",
|
||||
"foodCakeShade": "Čokoladna Torta",
|
||||
"foodCakeShadeThe": "Čokoladnu Tortu",
|
||||
"foodCakeShadeA": "Čokoladnu Tortu",
|
||||
"foodCakeWhite": "Krem Torta",
|
||||
"foodCakeWhiteThe": "Krem Tortu",
|
||||
"foodCakeWhiteA": "Krem Tortu",
|
||||
"foodCakeGolden": "Medenjak",
|
||||
"foodCakeGoldenThe": "medenjak",
|
||||
"foodCakeGoldenA": "medenjak",
|
||||
"foodCakeZombie": "Pokvarena torta",
|
||||
"foodCakeZombieThe": "pokvarenu tortu",
|
||||
"foodCakeZombieA": "pokvarenu tortu",
|
||||
"foodCakeDesert": "Pješčana torta",
|
||||
"foodCakeDesertThe": "pješčanu tortu",
|
||||
"foodCakeDesertA": "pješčanu tortu",
|
||||
"foodCakeRed": "Torta od jagoda",
|
||||
"foodCakeRedThe": "tortu od jagoda",
|
||||
"foodCakeRedA": "tortu od jagoda",
|
||||
"foodCandySkeleton": "Bombon od kostiju",
|
||||
"foodCandySkeletonThe": "bombon od kostiju",
|
||||
"foodCandySkeletonA": "Bombon od kostiju",
|
||||
"foodCandyBase": "Bombon",
|
||||
"foodCandyBaseThe": "bombon",
|
||||
"foodCandyBaseA": "Bombon",
|
||||
"foodCandyCottonCandyBlue": "Kiseli plavi bombon",
|
||||
"foodCandyCottonCandyBlueThe": "kiseli plavi bombon",
|
||||
"foodCandyCottonCandyBlueA": "Kiseli plavi bombon",
|
||||
"foodCandyCottonCandyPink": "Kiseli rozi bombon",
|
||||
"foodCandyCottonCandyPinkThe": "kiseli rozi bombon",
|
||||
"foodCandyCottonCandyPinkA": "Kiseli rozi bombon",
|
||||
"foodCandyShade": "Čokoladni bombon",
|
||||
"foodCandyShadeThe": "čokoladni bombon",
|
||||
"foodCandyShadeA": "Čokoladni bombon",
|
||||
"foodCandyWhite": "Bombon od vanilije",
|
||||
"foodCandyWhiteThe": "bombon od vanilije",
|
||||
"foodCandyWhiteA": "Bombon od vanilije",
|
||||
"foodCandyGolden": "Medeni bombon",
|
||||
"foodCandyGoldenThe": "medeni bombon",
|
||||
"foodCandyGoldenA": "Medeni bombon",
|
||||
"foodCandyZombie": "Pokvareni bombon",
|
||||
"foodCandyZombieThe": "pokvareni bombon",
|
||||
"foodCandyZombieA": "Pokvareni bombon",
|
||||
"foodCandyDesert": "Pješčani bombon",
|
||||
"foodCandyDesertThe": "pješčani bombon",
|
||||
"foodCandyDesertA": "Pješčani bombon",
|
||||
"foodCandyRed": "Bombon od cimeta",
|
||||
"foodCandyRedThe": "bombon od cimeta",
|
||||
"foodCandyRedA": "Bombon od cimeta",
|
||||
"foodCakeGoldenThe": "Medenjak",
|
||||
"foodCakeGoldenA": "Medenjak",
|
||||
"foodCakeZombie": "Trula Torta",
|
||||
"foodCakeZombieThe": "Trulu Tortu",
|
||||
"foodCakeZombieA": "Trulu Tortu",
|
||||
"foodCakeDesert": "Pješčana Torta",
|
||||
"foodCakeDesertThe": "Pješčanu Tortu",
|
||||
"foodCakeDesertA": "Pješčanu Tortu",
|
||||
"foodCakeRed": "Jagodna Torta",
|
||||
"foodCakeRedThe": "Jagodne Torte",
|
||||
"foodCakeRedA": "Jagodne Torte",
|
||||
"foodCandySkeleton": "Bombon-kostur",
|
||||
"foodCandySkeletonThe": "Bombon-kostur",
|
||||
"foodCandySkeletonA": "Bombon-kostur",
|
||||
"foodCandyBase": "Osnovni Bombon",
|
||||
"foodCandyBaseThe": "Osnovnog Bombona",
|
||||
"foodCandyBaseA": "Osnovnog Bombona",
|
||||
"foodCandyCottonCandyBlue": "Kiseli Plavi Bombon",
|
||||
"foodCandyCottonCandyBlueThe": "Kiseli Plavi Bombon",
|
||||
"foodCandyCottonCandyBlueA": "Kiseli Plavi Bombon",
|
||||
"foodCandyCottonCandyPink": "Kiseli Ružičasti Bombon",
|
||||
"foodCandyCottonCandyPinkThe": "Kiseli Ružičasti Bombon",
|
||||
"foodCandyCottonCandyPinkA": "Kiseli Ružičasti Bombon",
|
||||
"foodCandyShade": "Čokoladni Bombon",
|
||||
"foodCandyShadeThe": "Čokoladni Bombon",
|
||||
"foodCandyShadeA": "Čokoladni Bombon",
|
||||
"foodCandyWhite": "Bombon od Vanilije",
|
||||
"foodCandyWhiteThe": "Bombon od Vanilije",
|
||||
"foodCandyWhiteA": "Bombon od Vanilije",
|
||||
"foodCandyGolden": "Medeni Bombon",
|
||||
"foodCandyGoldenThe": "Medeni Bombon",
|
||||
"foodCandyGoldenA": "Medeni Bombon",
|
||||
"foodCandyZombie": "Truli Bombon",
|
||||
"foodCandyZombieThe": "Truli Bombon",
|
||||
"foodCandyZombieA": "Truli Bombon",
|
||||
"foodCandyDesert": "Pješčani Bombon",
|
||||
"foodCandyDesertThe": "Pješčani Bombon",
|
||||
"foodCandyDesertA": "Pješčani Bombon",
|
||||
"foodCandyRed": "Bombon od Cimeta",
|
||||
"foodCandyRedThe": "Bombon od Cimeta",
|
||||
"foodCandyRedA": "Bombon od Cimeta",
|
||||
"foodSaddleText": "Sedlo",
|
||||
"foodSaddleNotes": "Instantno pretvara jednog od tvojih ljubimaca u jahaću životinju.",
|
||||
"foodSaddleSellWarningNote": "Hej! Ovo je prilično koristan predmet! Znaš li kako koristiti Sedlo na svojim Ljubimcima?",
|
||||
"foodNotes": "Nahrani ovim ljubimca i možda izraste u snažnu jahaću životinju.",
|
||||
"foodSaddleNotes": "Odmah pretvara jednog od tvojih ljubimaca u jahaću životinju.",
|
||||
"foodSaddleSellWarningNote": "Hej! Ovo je baš koristan predmet! Znaš li kako se koristi sedlo za ljubimce?",
|
||||
"foodNotes": "Nahrani ovime ljubimca i možda će izrasti u snažnu jahaću životinju.",
|
||||
"questEggRobotAdjective": "futuristički",
|
||||
"hatchingPotionSilver": "Srebrni",
|
||||
"questEggDolphinText": "Dupin",
|
||||
"questEggRobotMountText": "Robot",
|
||||
"questEggRobotText": "Robot",
|
||||
"hatchingPotionSandSculpture": "Pješčana skulptura",
|
||||
"hatchingPotionSandSculpture": "Pješčana Skulptura",
|
||||
"hatchingPotionAurora": "Aurora",
|
||||
"hatchingPotionRoseQuartz": "Rozenkvarc",
|
||||
"hatchingPotionRoseQuartz": "Ružičasti Kvarc",
|
||||
"hatchingPotionAmber": "Jantarni",
|
||||
"hatchingPotionCelestial": "Nebeski",
|
||||
"hatchingPotionVeggie": "Vrtni",
|
||||
"hatchingPotionWatery": "Vodenast",
|
||||
"hatchingPotionDessert": "U boji poslastica",
|
||||
"hatchingPotionFluorite": "Fluorit boje",
|
||||
"hatchingPotionBirchBark": "U boji brezine kore",
|
||||
"hatchingPotionWatery": "Vodeni",
|
||||
"hatchingPotionDessert": "Slastičarski",
|
||||
"hatchingPotionFluorite": "Fluoritni",
|
||||
"hatchingPotionBirchBark": "Brezin",
|
||||
"hatchingPotionSunshine": "Sunčani",
|
||||
"questEggDolphinMountText": "Dupin",
|
||||
"hatchingPotionBronze": "Brončani",
|
||||
"hatchingPotionShadow": "U boji sjene",
|
||||
"hatchingPotionRuby": "Boje rubina"
|
||||
"hatchingPotionShadow": "Sjenovit",
|
||||
"hatchingPotionRuby": "Rubinski",
|
||||
"questEggRaccoonText": "Rakun",
|
||||
"questEggRaccoonMountText": "Rakun",
|
||||
"questEggRaccoonAdjective": "proždrljiv",
|
||||
"questEggDogText": "Štene",
|
||||
"questEggDogMountText": "Pas",
|
||||
"questEggGiraffeText": "Žirafa",
|
||||
"questEggGiraffeMountText": "Žirafa",
|
||||
"questEggGiraffeAdjective": "golema",
|
||||
"questEggChameleonText": "Kameleon",
|
||||
"questEggChameleonMountText": "Kameleon",
|
||||
"questEggChameleonAdjective": "kaotični",
|
||||
"questEggCrabText": "Rak",
|
||||
"questEggCrabMountText": "Rak",
|
||||
"questEggCrabAdjective": "petljajući",
|
||||
"questEggDolphinAdjective": "čio",
|
||||
"questEggAlpacaText": "Alpaka",
|
||||
"questEggAlpacaMountText": "Alpaka",
|
||||
"questEggAlpacaAdjective": "pretrpana",
|
||||
"questEggCatText": "Mačić",
|
||||
"questEggCatMountText": "Mačka",
|
||||
"questEggCatAdjective": "nestašna",
|
||||
"hatchingPotionVampire": "Vampirski",
|
||||
"hatchingPotionBlackPearl": "Crnobiserni",
|
||||
"hatchingPotionStainedGlass": "Vitrajni",
|
||||
"hatchingPotionAutumnLeaf": "Jesenjelistni",
|
||||
"questEggOtterText": "Vidra",
|
||||
"questEggOtterMountText": "Vidra",
|
||||
"hatchingPotionTurquoise": "Tirkiz",
|
||||
"hatchingPotionMossyStone": "Mahovinasti",
|
||||
"hatchingPotionPolkaDot": "Točkasti",
|
||||
"hatchingPotionMoonglow": "Mjesečev",
|
||||
"questEggOtterAdjective": "perfidna",
|
||||
"hatchingPotionSolarSystem": "Solarni",
|
||||
"questEggDogAdjective": "prijateljski",
|
||||
"questEggPlatypusText": "Kljunar",
|
||||
"questEggPlatypusMountText": "Kljunar",
|
||||
"questEggPlatypusAdjective": "perfekcionist",
|
||||
"hatchingPotionSunset": "Zalazni",
|
||||
"hatchingPotionWindup": "Mehanički",
|
||||
"hatchingPotionKoi": "Koi",
|
||||
"hatchingPotionBalloon": "Balunasti",
|
||||
"hatchingPotionGingerbread": "Medenjački",
|
||||
"hatchingPotionRoseGold": "Rozo Zlatni",
|
||||
"hatchingPotionJade": "Žadni",
|
||||
"hatchingPotionFungi": "Gljivičasti",
|
||||
"hatchingPotionCryptid": "Kriptidni",
|
||||
"hatchingPotionOpal": "Sedefast",
|
||||
"wackyPotionNotes": "Izlij ovo na jaje, i ono će se izleći kao Otkačeni <%= potText(locale) %> Ljubimac.",
|
||||
"wackyPotionAddlNotes": "Ne može se pretvoriti u Jahaću životinju niti koristiti na jajima ljubimaca za pustolovine.",
|
||||
"premiumPotionUnlimitedNotes": "Nije upotrebljivo na jajima ljubimaca pustolovine.",
|
||||
"hatchingPotionOnyx": "Oniksov",
|
||||
"hatchingPotionPorcelain": "Porcelanski",
|
||||
"hatchingPotionVirtualPet": "Virtualni ljubimac",
|
||||
"hatchingPotionPinkMarble": "Ružičastomramorni",
|
||||
"hatchingPotionTeaShop": "Čajdžinica",
|
||||
"foodPieGolden": "Pita sa zlatnom kremom od banane",
|
||||
"foodPieSkeletonThe": "Pite s koštanom srži",
|
||||
"foodPieBase": "Osnovna pita od jabuka",
|
||||
"foodPieBaseA": "Kriška osnovne pite od jabuka",
|
||||
"foodPieCottonCandyBlue": "Pita od borovnica",
|
||||
"foodPieCottonCandyPink": "Pita od ružičaste rabarbare",
|
||||
"foodPieCottonCandyBlueThe": "Pite od borovnica",
|
||||
"foodPieCottonCandyPinkThe": "Pite od ružičaste rabarbare",
|
||||
"foodPieCottonCandyBlueA": "Kriška pite od borovnica",
|
||||
"foodPieCottonCandyPinkA": "Kriška pite od ružičaste rabarbare",
|
||||
"foodPieShade": "Pita od tamne čokolade",
|
||||
"foodPieZombie": "Trula Pita",
|
||||
"foodPieDesertA": "Kriška pustinjske desertne pite",
|
||||
"foodPieZombieThe": "Trule Pite",
|
||||
"foodPieRedThe": "Pite od crvenih trešanja",
|
||||
"foodPieRedA": "Kriška pite od crvenih trešanja",
|
||||
"foodPieWhiteThe": "Pite s pudingom od vanilije",
|
||||
"foodPieBaseThe": "Osnovne pite od jabuka",
|
||||
"foodPieShadeA": "Kriška pite od tamne čokolade",
|
||||
"foodPieGoldenThe": "Pite sa zlatnom kremom od banane",
|
||||
"foodPieGoldenA": "Kriška pite sa zlatnom kremom od banane",
|
||||
"foodPieRed": "Pita od crvenih trešanja",
|
||||
"foodPieSkeleton": "Pita s koštanom srži",
|
||||
"foodPieWhite": "Pita s pudingom od vanilije",
|
||||
"foodPieWhiteA": "Kriška pite s pudingom od vanilije",
|
||||
"foodPieDesertThe": "Pustinjske desertne pite",
|
||||
"foodPieShadeThe": "Pite od tamne čokolade",
|
||||
"foodPieSkeletonA": "Kriška pite s koštanom srži",
|
||||
"foodPieZombieA": "Kriška Trule Pite",
|
||||
"foodPieDesert": "Pustinjska desertna pita"
|
||||
}
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
{
|
||||
"playerTiersDesc": "Obojana korisnička imena koja vidite u chatu predstavljaju doprinositeljski rang osobe. Što je viši rang, to je osoba više doprinjela Habitici svojim umjetničkim kreacijama, kodiranjem, u zajednici, ili na druge načine!",
|
||||
"tier1": "Rang 1 (Prijatelj)",
|
||||
"tier2": "Rang 2 (Prijatelj)",
|
||||
"tier3": "Rang 3 (Elita)",
|
||||
"tier4": "Rang 4 (Elita)",
|
||||
"tier5": "Rang 5 (Prvak)",
|
||||
"tier6": "Rang 6 (Prvak)",
|
||||
"tier7": "Rang 7 (Legendaran)",
|
||||
"tierModerator": "Moderator (Čuvar)",
|
||||
"tierStaff": "Osoblje (Heroj)",
|
||||
"tierNPC": "NIL",
|
||||
"playerTiersDesc": "Obojena korisnička imena koja vidite u četu predstavljaju razinu doprinositelja te osobe. Što je razina viša, to je osoba više doprinijela Habitici kroz umjetnost, kôd, zajednicu ili nešto drugo!",
|
||||
"tier1": "Razina 1 (Prijatelj)",
|
||||
"tier2": "Razina 2 (Prijatelj)",
|
||||
"tier3": "Razina 3 (Elita)",
|
||||
"tier4": "Razina 4 (Elita)",
|
||||
"tier5": "Razina 5 (Prvak)",
|
||||
"tier6": "Razina 6 (Prvak)",
|
||||
"tier7": "Razina 7 (Legendarni)",
|
||||
"tierModerator": "Moderator",
|
||||
"tierStaff": "Osoblje",
|
||||
"tierNPC": "NPC",
|
||||
"friend": "Prijatelj",
|
||||
"elite": "Elita",
|
||||
"champion": "Prvak",
|
||||
"legendary": "Legendarni",
|
||||
"moderator": "Moderator",
|
||||
"guardian": "Čuvar",
|
||||
"staff": "Osoblje",
|
||||
"staff": "Habitica Osoblje",
|
||||
"heroic": "Herojski",
|
||||
"modalContribAchievement": "Postignuće Doprinositelja!",
|
||||
"contribModal": "<%= name %>, pa ti si zakon! Dostigao/la si rang <%= level %> doprinositelja za pomaganje Habitici.",
|
||||
"contribLink": "Vidi koje si nagrade zaradio/la za svoj doprinos!",
|
||||
"contribModal": "<%= name %>, sjajna osobo! Sada si doprinositelj razine <%= level %> jer pomažeš Habitici.",
|
||||
"contribLink": "Pogledaj koje ste nagrade zaslužili za svoj doprinos!",
|
||||
"contribName": "Doprinositelj",
|
||||
"contribText": "Doprinio/la je Habitici, bilo kodiranjem, umjetnošću, glazbom, pisanjem ili na druge načine. Kako bi saznao/la više, pridruži se Cehu Aspiring Legends tj. Stremećih Legendi.",
|
||||
"kickstartName": "Kickstarter Podržatelj - Rang $<%= key %>",
|
||||
"kickstartText": "Podržao/la je projekt na Kickstarteru",
|
||||
"helped": "Pomogao/la je Habitici da raste",
|
||||
"contribText": "Doprinosili su Habitici, bilo putem kôda, umjetnosti, glazbe, pisanja ili drugim metodama.",
|
||||
"kickstartName": "Pomoćnik na Kickstarteru - $<%= key %> Razina",
|
||||
"kickstartText": "Podržali su Kickstarter Projekt",
|
||||
"helped": "Pomogli su Habitici da raste",
|
||||
"hall": "Dvorana Heroja",
|
||||
"contribLevel": "Rang Doprinositelja",
|
||||
"contribLevel": "Razina Doprinositelja",
|
||||
"hallContributors": "Dvorana Doprinositelja",
|
||||
"hallPatrons": "Dvorana Pokrovitelja",
|
||||
"noAdminAccess": "Nemaš administratorski pristup.",
|
||||
@@ -37,13 +37,13 @@
|
||||
"contributions": "Doprinositelji",
|
||||
"admin": "Administrator",
|
||||
"gamemaster": "Gospodar Igre (osoblje/moderator)",
|
||||
"backerTier": "Rang Podržatelja",
|
||||
"playerTiers": "Rangovi Igrača",
|
||||
"tier": "Rang",
|
||||
"conRewardsURL": "https://habitica.fandom.com/wiki/Contributor_Rewards",
|
||||
"surveysSingle": "Pomogao/la si da Habitica naraste popunjavanjem ankete, ili pomaganjem u procesu testiranja. Hvala!",
|
||||
"surveysMultiple": "Je pomogao/la Habitici da narase u <%= count %> navrata, ili ispunjavanje upitnika ili pomaganjem u procesu testiranja. Hvala!",
|
||||
"blurbHallPatrons": "Ovo je Dvorana Pokrovitelja u kojoj se odaje počast plemenitim pustolovima koji su podržali Habitičinu originalnu Kickstarer kampanju. Zahvaljujemo im se što su pomogli oživjeti Habiticu!",
|
||||
"blurbHallContributors": "Ovo je Dvorana suradnika, gdje se odaje počast suradnicima otvorenog koda za Habiticu. Bilo putem koda, umjetnosti, glazbe, pisanja ili čak samo pomoći, zaslužili su <a href='https://habitica.fandom.com/wiki/Contributor_Rewards' target='_blank'> dragulje, ekskluzivnu opremu</a > i <a href='https://habitica.fandom.com/wiki/Contributor_Titles' target='_blank'>prestižne titule</a>. I vi možete doprinijeti Habitici! <a href='https://habitica.fandom.com/wiki/Contributing_to_Habitica' target='_blank'> Saznajte više ovdje. </a>",
|
||||
"noPrivAccess": "Nemate potrebne privilegije."
|
||||
"backerTier": "Razina Podržatelja",
|
||||
"playerTiers": "Razine Igrača",
|
||||
"tier": "Razina",
|
||||
"conRewardsURL": "https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards",
|
||||
"surveysSingle": "Pomogli ste Habitici da raste, ispunjavanjem ankete ili pomaganjem u velikom testiranju. Hvala Vam!",
|
||||
"surveysMultiple": "Pomogli su Habitici da raste u <%= count %> navrata, ispunjavanjem ankete ili pomaganjem u velikom testiranju. Hvala Vam!",
|
||||
"blurbHallPatrons": "Ovo je Dvorana pokrovitelja, gdje odajemo počast plemenitim pustolovima koji su podržali originalni Kickstarter projekt Habitice. Zahvaljujemo im što su nam pomogli oživjeti Habiticu!",
|
||||
"blurbHallContributors": "Ovo je Dvorana doprinositelja, gdje se odaje počast open-source doprinositeljima Habitici. Bilo putem kôda, umjetnosti, glazbe, pisanja ili čak samo pomaganja, zaslužili su <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards' target='_blank'> Dragulje, ekskluzivnu Opremu</a> i <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tiers' target='_blank'>prestižne naslove</a>. I Vi možete doprinositi Habitici!<a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica' target='_blank'> Saznajte više ovdje.</a>",
|
||||
"noPrivAccess": "Nemate potrebne ovlasti."
|
||||
}
|
||||
|
||||