Merge branch 'develop' into increment-component

This commit is contained in:
CuriousMagpie 2023-05-02 11:03:46 -04:00
commit 4a32a29bea
293 changed files with 6934 additions and 3560 deletions

View file

@ -86,5 +86,6 @@
"RATE_LIMITER_ENABLED": "false",
"REDIS_HOST": "aaabbbcccdddeeefff",
"REDIS_PORT": "1234",
"REDIS_PASSWORD": "12345678"
"REDIS_PASSWORD": "12345678",
"TRUSTED_DOMAINS": "https://localhost,https://habitica.com"
}

@ -1 +1 @@
Subproject commit 428d395f36c7c6424df55c8d94190ed5f849f1cd
Subproject commit 311cb010591a9de368a1ab5db7506d2d3efbb10b

441
package-lock.json generated
View file

@ -1,15 +1,15 @@
{
"name": "habitica",
"version": "4.265.0",
"version": "4.269.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
"integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
"requires": {
"@jridgewell/gen-mapping": "^0.1.0",
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
@ -27,20 +27,20 @@
"integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ=="
},
"@babel/core": {
"version": "7.20.12",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
"integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz",
"integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==",
"requires": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.20.7",
"@babel/helper-compilation-targets": "^7.20.7",
"@babel/helper-module-transforms": "^7.20.11",
"@babel/helpers": "^7.20.7",
"@babel/parser": "^7.20.7",
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.21.4",
"@babel/generator": "^7.21.4",
"@babel/helper-compilation-targets": "^7.21.4",
"@babel/helper-module-transforms": "^7.21.2",
"@babel/helpers": "^7.21.0",
"@babel/parser": "^7.21.4",
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.20.12",
"@babel/types": "^7.20.7",
"@babel/traverse": "^7.21.4",
"@babel/types": "^7.21.4",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@ -49,44 +49,54 @@
},
"dependencies": {
"@babel/code-frame": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
"integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz",
"integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==",
"requires": {
"@babel/highlight": "^7.18.6"
}
},
"@babel/compat-data": {
"version": "7.20.10",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz",
"integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg=="
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz",
"integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g=="
},
"@babel/generator": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
"integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz",
"integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==",
"requires": {
"@babel/types": "^7.20.7",
"@babel/types": "^7.21.4",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
}
},
"@babel/helper-compilation-targets": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
"integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz",
"integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==",
"requires": {
"@babel/compat-data": "^7.20.5",
"@babel/helper-validator-option": "^7.18.6",
"@babel/compat-data": "^7.21.4",
"@babel/helper-validator-option": "^7.21.0",
"browserslist": "^4.21.3",
"lru-cache": "^5.1.1",
"semver": "^6.3.0"
}
},
"@babel/helper-function-name": {
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
"integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
"requires": {
"@babel/template": "^7.20.7",
"@babel/types": "^7.21.0"
}
},
"@babel/helper-module-transforms": {
"version": "7.20.11",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
"integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
"version": "7.21.2",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
"integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
"requires": {
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-module-imports": "^7.18.6",
@ -94,8 +104,8 @@
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/helper-validator-identifier": "^7.19.1",
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.20.10",
"@babel/types": "^7.20.7"
"@babel/traverse": "^7.21.2",
"@babel/types": "^7.21.2"
}
},
"@babel/helper-validator-identifier": {
@ -103,6 +113,11 @@
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
},
"@babel/helper-validator-option": {
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
"integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ=="
},
"@babel/highlight": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
@ -114,9 +129,9 @@
}
},
"@babel/parser": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
"integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg=="
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz",
"integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw=="
},
"@babel/template": {
"version": "7.20.7",
@ -129,57 +144,50 @@
}
},
"@babel/traverse": {
"version": "7.20.12",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz",
"integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz",
"integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==",
"requires": {
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.20.7",
"@babel/code-frame": "^7.21.4",
"@babel/generator": "^7.21.4",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.19.0",
"@babel/helper-function-name": "^7.21.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7",
"@babel/parser": "^7.21.4",
"@babel/types": "^7.21.4",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
"integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz",
"integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==",
"requires": {
"@babel/helper-string-parser": "^7.19.4",
"@babel/helper-validator-identifier": "^7.19.1",
"to-fast-properties": "^2.0.0"
}
},
"@jridgewell/gen-mapping": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
"requires": {
"@jridgewell/set-array": "^1.0.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
}
"@jridgewell/resolve-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
},
"browserslist": {
"version": "4.21.4",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
"integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
"requires": {
"caniuse-lite": "^1.0.30001400",
"electron-to-chromium": "^1.4.251",
"node-releases": "^2.0.6",
"update-browserslist-db": "^1.0.9"
}
"@jridgewell/sourcemap-codec": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
},
"caniuse-lite": {
"version": "1.0.30001442",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz",
"integrity": "sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow=="
"@jridgewell/trace-mapping": {
"version": "0.3.18",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
"integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
"requires": {
"@jridgewell/resolve-uri": "3.1.0",
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
"chalk": {
"version": "2.4.2",
@ -191,11 +199,6 @@
"supports-color": "^5.3.0"
}
},
"json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
},
"lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@ -209,15 +212,6 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
},
"update-browserslist-db": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
"integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
"requires": {
"escalade": "^3.1.1",
"picocolors": "^1.0.0"
}
},
"yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@ -666,33 +660,43 @@
}
},
"@babel/helpers": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz",
"integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==",
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
"integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
"requires": {
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.20.7",
"@babel/types": "^7.20.7"
"@babel/traverse": "^7.21.0",
"@babel/types": "^7.21.0"
},
"dependencies": {
"@babel/code-frame": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
"integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz",
"integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==",
"requires": {
"@babel/highlight": "^7.18.6"
}
},
"@babel/generator": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
"integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz",
"integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==",
"requires": {
"@babel/types": "^7.20.7",
"@babel/types": "^7.21.4",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
}
},
"@babel/helper-function-name": {
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
"integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
"requires": {
"@babel/template": "^7.20.7",
"@babel/types": "^7.21.0"
}
},
"@babel/helper-validator-identifier": {
"version": "7.19.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
@ -709,9 +713,9 @@
}
},
"@babel/parser": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
"integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg=="
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz",
"integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw=="
},
"@babel/template": {
"version": "7.20.7",
@ -724,40 +728,49 @@
}
},
"@babel/traverse": {
"version": "7.20.12",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz",
"integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz",
"integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==",
"requires": {
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.20.7",
"@babel/code-frame": "^7.21.4",
"@babel/generator": "^7.21.4",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.19.0",
"@babel/helper-function-name": "^7.21.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7",
"@babel/parser": "^7.21.4",
"@babel/types": "^7.21.4",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
"integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz",
"integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==",
"requires": {
"@babel/helper-string-parser": "^7.19.4",
"@babel/helper-validator-identifier": "^7.19.1",
"to-fast-properties": "^2.0.0"
}
},
"@jridgewell/gen-mapping": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
"@jridgewell/resolve-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
},
"@jridgewell/sourcemap-codec": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
},
"@jridgewell/trace-mapping": {
"version": "0.3.18",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
"integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
"requires": {
"@jridgewell/set-array": "^1.0.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
"@jridgewell/resolve-uri": "3.1.0",
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
"chalk": {
@ -1487,9 +1500,9 @@
}
},
"@babel/register": {
"version": "7.18.9",
"resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz",
"integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==",
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/register/-/register-7.21.0.tgz",
"integrity": "sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==",
"requires": {
"clone-deep": "^4.0.1",
"find-cache-dir": "^2.0.0",
@ -1863,12 +1876,13 @@
}
},
"@jridgewell/gen-mapping": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
"integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
"integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
"requires": {
"@jridgewell/set-array": "^1.0.0",
"@jridgewell/sourcemap-codec": "^1.4.10"
"@jridgewell/set-array": "^1.0.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"@jridgewell/resolve-uri": {
@ -2153,9 +2167,9 @@
"integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw=="
},
"@sinonjs/commons": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
"integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
"integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
"dev": true,
"requires": {
"type-detect": "4.0.8"
@ -2168,17 +2182,39 @@
"dev": true,
"requires": {
"@sinonjs/commons": "^2.0.0"
},
"dependencies": {
"@sinonjs/commons": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
"integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
"dev": true,
"requires": {
"type-detect": "4.0.8"
}
}
}
},
"@sinonjs/samsam": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz",
"integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==",
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz",
"integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==",
"dev": true,
"requires": {
"@sinonjs/commons": "^2.0.0",
"lodash.get": "^4.4.2",
"type-detect": "^4.0.8"
},
"dependencies": {
"@sinonjs/commons": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
"integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
"dev": true,
"requires": {
"type-detect": "4.0.8"
}
}
}
},
"@sinonjs/text-encoding": {
@ -2949,13 +2985,13 @@
}
},
"apple-auth": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/apple-auth/-/apple-auth-1.0.7.tgz",
"integrity": "sha512-vfJqy4KtT5KHflxBSemc0mkWuy2GU2wHWaZ6xVWUjPmiXkJcLj5jB3IeCbDLF4wN+ZStjOQXZWfGwccBjclVlA==",
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/apple-auth/-/apple-auth-1.0.9.tgz",
"integrity": "sha512-nm3h/sXpwA6kyBWa1l8Sl3c8nusIQMnUklBL8eTUDb++LpF2k2GZ66OaDj5lba7Arw9JpHfuzewBF92mh9lNPQ==",
"requires": {
"axios": "^0.21.1",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1"
"jsonwebtoken": "^9.0.0"
},
"dependencies": {
"axios": {
@ -2965,6 +3001,44 @@
"requires": {
"follow-redirects": "^1.14.0"
}
},
"jsonwebtoken": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
"integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
"requires": {
"jws": "^3.2.2",
"lodash": "^4.17.21",
"ms": "^2.1.1",
"semver": "^7.3.8"
}
},
"jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
"integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
"requires": {
"buffer-equal-constant-time": "1.0.1",
"ecdsa-sig-formatter": "1.0.11",
"safe-buffer": "^5.0.1"
}
},
"jws": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
"integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
"requires": {
"jwa": "^1.4.1",
"safe-buffer": "^5.0.1"
}
},
"semver": {
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
"requires": {
"lru-cache": "^6.0.0"
}
}
}
},
@ -3272,9 +3346,9 @@
"integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
},
"axios": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz",
"integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==",
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.3.6.tgz",
"integrity": "sha512-PEcdkk7JcdPiMDkvM4K6ZBRYq9keuVJsToxm2zQIM70Qqo2WHTdJZMXcG9X+RmRp2VPNUQC8W1RAGbgt6b1yMg==",
"dev": true,
"requires": {
"follow-redirects": "^1.15.0",
@ -4042,12 +4116,12 @@
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
},
"body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"requires": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"content-type": "~1.0.5",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
@ -4055,11 +4129,16 @@
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"raw-body": "2.5.1",
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
"dependencies": {
"content-type": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@ -4096,6 +4175,17 @@
"requires": {
"side-channel": "^1.0.4"
}
},
"raw-body": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"requires": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
}
}
},
@ -11401,36 +11491,25 @@
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
},
"nise": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/nise/-/nise-5.1.3.tgz",
"integrity": "sha512-U597iWTTBBYIV72986jyU382/MMZ70ApWcRmkoF1AZ75bpqOtI3Gugv/6+0jLgoDOabmcSwYBkSSAWIp1eA5cg==",
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz",
"integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==",
"dev": true,
"requires": {
"@sinonjs/commons": "^2.0.0",
"@sinonjs/fake-timers": "^7.0.4",
"@sinonjs/fake-timers": "^10.0.2",
"@sinonjs/text-encoding": "^0.7.1",
"just-extend": "^4.0.2",
"path-to-regexp": "^1.7.0"
},
"dependencies": {
"@sinonjs/fake-timers": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz",
"integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==",
"@sinonjs/commons": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
"integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
"dev": true,
"requires": {
"@sinonjs/commons": "^1.7.0"
},
"dependencies": {
"@sinonjs/commons": {
"version": "1.8.6",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
"integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
"dev": true,
"requires": {
"type-detect": "4.0.8"
}
}
"type-detect": "4.0.8"
}
},
"isarray": {
@ -13632,16 +13711,16 @@
}
},
"sinon": {
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz",
"integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==",
"version": "15.0.4",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.4.tgz",
"integrity": "sha512-uzmfN6zx3GQaria1kwgWGeKiXSSbShBbue6Dcj0SI8fiCNFbiUDqKl57WFlY5lyhxZVUKmXvzgG2pilRQCBwWg==",
"dev": true,
"requires": {
"@sinonjs/commons": "^2.0.0",
"@sinonjs/fake-timers": "10.0.2",
"@sinonjs/samsam": "^7.0.1",
"diff": "^5.0.0",
"nise": "^5.1.2",
"@sinonjs/commons": "^3.0.0",
"@sinonjs/fake-timers": "^10.0.2",
"@sinonjs/samsam": "^8.0.0",
"diff": "^5.1.0",
"nise": "^5.1.4",
"supports-color": "^7.2.0"
},
"dependencies": {
@ -14997,9 +15076,9 @@
},
"dependencies": {
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
"requires": {
"minimist": "^1.2.0"
}
@ -16154,9 +16233,9 @@
}
},
"xml2js": {
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
"integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
"requires": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"

View file

@ -1,12 +1,12 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.265.0",
"version": "4.269.0",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.20.12",
"@babel/core": "^7.21.4",
"@babel/preset-env": "^7.20.2",
"@babel/register": "^7.18.9",
"@babel/register": "^7.21.0",
"@google-cloud/trace-agent": "^7.1.2",
"@parse/node-apn": "^5.1.3",
"@slack/webhook": "^6.1.0",
@ -14,9 +14,9 @@
"amazon-payments": "^0.2.9",
"amplitude": "^6.0.0",
"apidoc": "^0.54.0",
"apple-auth": "^1.0.7",
"apple-auth": "^1.0.9",
"bcrypt": "^5.1.0",
"body-parser": "^1.20.1",
"body-parser": "^1.20.2",
"bootstrap": "^4.6.0",
"compression": "^1.7.4",
"cookie-session": "^2.0.0",
@ -76,7 +76,7 @@
"vinyl-buffer": "^1.0.1",
"winston": "^3.8.2",
"winston-loggly-bulk": "^3.2.1",
"xml2js": "^0.4.23"
"xml2js": "^0.5.0"
},
"private": true,
"engines": {
@ -110,7 +110,7 @@
"apidoc": "gulp apidoc"
},
"devDependencies": {
"axios": "^1.2.2",
"axios": "^1.3.6",
"chai": "^4.3.7",
"chai-as-promised": "^7.1.1",
"chai-moment": "^0.1.0",
@ -122,7 +122,7 @@
"monk": "^7.3.4",
"require-again": "^2.0.0",
"run-rs": "^0.7.7",
"sinon": "^15.0.1",
"sinon": "^15.0.4",
"sinon-chai": "^3.7.0",
"sinon-stub-promise": "^4.0.0"
},

View file

@ -258,47 +258,6 @@ describe('POST /group/:groupId/join', () => {
await expect(user.get('/user')).to.eventually.have.nested.property('items.quests.basilist', 2);
});
it('deletes previous party where the user was the only member', async () => {
const userToInvite = await generateUser();
const oldParty = await userToInvite.post('/groups', { // add user to a party
name: 'Another Test Party',
type: 'party',
});
await expect(checkExistence('groups', oldParty._id)).to.eventually.equal(true);
await user.post(`/groups/${party._id}/invite`, {
uuids: [userToInvite._id],
});
await userToInvite.post(`/groups/${party._id}/join`);
await expect(user.get('/user')).to.eventually.have.nested.property('party._id', party._id);
await expect(checkExistence('groups', oldParty._id)).to.eventually.equal(false);
});
it('does not allow user to leave a party if a quest was active and they were the only member', async () => {
const userToInvite = await generateUser();
const oldParty = await userToInvite.post('/groups', { // add user to a party
name: 'Another Test Party',
type: 'party',
});
await userToInvite.update({
[`items.quests.${PET_QUEST}`]: 1,
});
await userToInvite.post(`/groups/${oldParty._id}/quests/invite/${PET_QUEST}`);
await expect(checkExistence('groups', oldParty._id)).to.eventually.equal(true);
await user.post(`/groups/${party._id}/invite`, {
uuids: [userToInvite._id],
});
await expect(userToInvite.post(`/groups/${party._id}/join`)).to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('messageCannotLeaveWhileQuesting'),
});
});
it('invites joining member to active quest', async () => {
await user.update({
[`items.quests.${PET_QUEST}`]: 1,

View file

@ -1,6 +1,7 @@
import { v4 as generateUUID } from 'uuid';
import nconf from 'nconf';
import {
createAndPopulateGroup,
generateUser,
generateGroup,
translate as t,
@ -581,20 +582,7 @@ describe('Post /groups/:groupId/invite', () => {
});
});
it('allow inviting a user to a party if they are partying solo', async () => {
const userToInvite = await generateUser();
await userToInvite.post('/groups', { // add user to a party
name: 'Another Test Party',
type: 'party',
});
await inviter.post(`/groups/${party._id}/invite`, {
uuids: [userToInvite._id],
});
expect((await userToInvite.get('/user')).invitations.parties[0].id).to.equal(party._id);
});
it('allow inviting a user to 2 different parties', async () => {
it('allows inviting a user to 2 different parties', async () => {
// Create another inviter
const inviter2 = await generateUser();
@ -635,29 +623,47 @@ describe('Post /groups/:groupId/invite', () => {
});
expect((await userToInvite.get('/user')).invitations.parties[0].id).to.equal(party._id);
});
});
describe('party size limits', () => {
let party, partyLeader;
beforeEach(async () => {
group = await createAndPopulateGroup({
groupDetails: {
name: 'Test Party',
type: 'party',
privacy: 'private',
},
// Generate party with 20 members
members: PARTY_LIMIT_MEMBERS - 10,
});
party = group.group;
partyLeader = group.groupLeader;
});
it('allows 30 members in a party', async () => {
const invitesToGenerate = [];
// Generate 29 users to invite (29 + leader = 30 members)
for (let i = 0; i < PARTY_LIMIT_MEMBERS - 1; i += 1) {
// Generate 10 new invites
for (let i = 1; i < 10; i += 1) {
invitesToGenerate.push(generateUser());
}
const generatedInvites = await Promise.all(invitesToGenerate);
// Invite users
expect(await inviter.post(`/groups/${party._id}/invite`, {
expect(await partyLeader.post(`/groups/${party._id}/invite`, {
uuids: generatedInvites.map(invite => invite._id),
})).to.be.an('array');
}).timeout(10000);
it('does not allow 30+ members in a party', async () => {
it('does not allow >30 members in a party', async () => {
const invitesToGenerate = [];
// Generate 30 users to invite (30 + leader = 31 members)
for (let i = 0; i < PARTY_LIMIT_MEMBERS; i += 1) {
// Generate 11 invites
for (let i = 1; i < 11; i += 1) {
invitesToGenerate.push(generateUser());
}
const generatedInvites = await Promise.all(invitesToGenerate);
// Invite users
await expect(inviter.post(`/groups/${party._id}/invite`, {
await expect(partyLeader.post(`/groups/${party._id}/invite`, {
uuids: generatedInvites.map(invite => invite._id),
}))
.to.eventually.be.rejected.and.eql({

View file

@ -53,7 +53,8 @@ function _requestMaker (user, method, additionalSets = {}) {
if (user && user._id && user.apiToken) {
request
.set('x-api-user', user._id)
.set('x-api-key', user.apiToken);
.set('x-api-key', user.apiToken)
.set('x-client', 'habitica-web');
}
if (!isEmpty(additionalSets)) {

View file

@ -1842,9 +1842,9 @@
}
},
"@babel/plugin-proposal-optional-chaining": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz",
"integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==",
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
"integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
"requires": {
"@babel/helper-plugin-utils": "^7.20.2",
"@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
@ -1870,9 +1870,9 @@
"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
},
"@babel/types": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
"integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
"version": "7.21.2",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz",
"integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
"requires": {
"@babel/helper-string-parser": "^7.19.4",
"@babel/helper-validator-identifier": "^7.19.1",
@ -13321,14 +13321,12 @@
"emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"optional": true
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"optional": true
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"is-fullwidth-code-point": {
"version": "3.0.0",
@ -13339,7 +13337,6 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
@ -13381,7 +13378,6 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
@ -13390,7 +13386,6 @@
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
@ -13401,7 +13396,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@ -16907,9 +16901,9 @@
}
},
"core-js": {
"version": "3.27.2",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.2.tgz",
"integrity": "sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w=="
"version": "3.30.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.1.tgz",
"integrity": "sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ=="
},
"core-js-compat": {
"version": "3.11.0",
@ -22019,9 +22013,9 @@
}
},
"jquery": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz",
"integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg=="
"version": "3.6.4",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz",
"integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ=="
},
"js-message": {
"version": "1.0.5",
@ -27801,9 +27795,9 @@
}
},
"smartbanner.js": {
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/smartbanner.js/-/smartbanner.js-1.19.1.tgz",
"integrity": "sha512-x3alFTlk6pLuqrm9PrYQv1E+86CrEIgPf/KJ+nP5342BmOWstbdR8OwD3TPmM56zHQm4MEr/eoqbEcfTKdvdKw=="
"version": "1.19.2",
"resolved": "https://registry.npmjs.org/smartbanner.js/-/smartbanner.js-1.19.2.tgz",
"integrity": "sha512-hwcGNp5Hza5PJHTmqP6H8q0XBYhloIQyJgdzv0ldz3HQSeEuKB2riVraQXdKuquE6ZU/0M0yubno53xJ/ZiQQg=="
},
"snapdragon": {
"version": "0.8.2",
@ -28175,9 +28169,9 @@
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
"stopword": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/stopword/-/stopword-2.0.7.tgz",
"integrity": "sha512-s+uLKAxrproCLrq0Wcd3JAIjlJLx6l80b2Rzt0u8+ra5SzGkHnNG8PS3DfGmYk2TrKePDVLL4SdKYwKpgSLc+w=="
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/stopword/-/stopword-2.0.8.tgz",
"integrity": "sha512-btlEC2vEuhCuvshz99hSGsY8GzaP5qzDPQm56j6rR/R38p8xdsOXgU5a6tIgvU/4hcCta1Vlo/2FVXA9m0f8XA=="
},
"store2": {
"version": "2.10.0",

View file

@ -32,7 +32,7 @@
"bootstrap": "^4.6.0",
"bootstrap-vue": "^2.23.1",
"chai": "^4.3.7",
"core-js": "^3.27.2",
"core-js": "^3.30.1",
"dompurify": "^2.4.3",
"eslint": "^6.8.0",
"eslint-config-habitrpg": "^6.2.0",
@ -42,14 +42,14 @@
"hellojs": "^1.20.0",
"inspectpack": "^4.7.1",
"intro.js": "^6.0.0",
"jquery": "^3.6.3",
"jquery": "^3.6.4",
"lodash": "^4.17.21",
"moment": "^2.29.4",
"nconf": "^0.12.0",
"sass": "^1.34.0",
"sass-loader": "^8.0.2",
"smartbanner.js": "^1.19.1",
"stopword": "^2.0.7",
"smartbanner.js": "^1.19.2",
"stopword": "^2.0.8",
"svg-inline-loader": "^0.8.2",
"svg-url-loader": "^7.1.1",
"svgo": "^1.3.2",
@ -66,6 +66,6 @@
"webpack": "^4.46.0"
},
"devDependencies": {
"@babel/plugin-proposal-optional-chaining": "^7.20.7"
"@babel/plugin-proposal-optional-chaining": "^7.21.0"
}
}

View file

@ -35,6 +35,7 @@
<sub-canceled-modal v-if="isUserLoaded" />
<bug-report-modal v-if="isUserLoaded" />
<bug-report-success-modal v-if="isUserLoaded" />
<external-link-modal />
<birthday-modal />
<snackbars />
<router-view v-if="!isUserLoggedIn || isStaticPage" />
@ -175,6 +176,7 @@ import amazonPaymentsModal from '@/components/payments/amazonModal';
import paymentsSuccessModal from '@/components/payments/successModal';
import subCancelModalConfirm from '@/components/payments/cancelModalConfirm';
import subCanceledModal from '@/components/payments/canceledModal';
import externalLinkModal from '@/components/externalLinkModal.vue';
import spellsMixin from '@/mixins/spells';
import {
@ -210,6 +212,7 @@ export default {
subCanceledModal,
bugReportModal,
bugReportSuccessModal,
externalLinkModal,
},
mixins: [notifications, spellsMixin],
data () {

View file

@ -1389,6 +1389,11 @@
width: 141px;
height: 147px;
}
.background_leafy_tree_tunnel {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_leafy_tree_tunnel.png');
width: 141px;
height: 147px;
}
.background_lighthouse_shore {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_lighthouse_shore.png');
width: 141px;
@ -1839,6 +1844,11 @@
width: 141px;
height: 147px;
}
.background_springtime_shower {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_springtime_shower.png');
width: 141px;
height: 147px;
}
.background_stable {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_stable.png');
width: 141px;
@ -2024,6 +2034,11 @@
width: 141px;
height: 147px;
}
.background_under_wisteria {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_under_wisteria.png');
width: 141px;
height: 147px;
}
.background_underwater_among_koi {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_underwater_among_koi.png');
width: 141px;
@ -3060,6 +3075,11 @@
width: 68px;
height: 68px;
}
.icon_background_leafy_tree_tunnel {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_leafy_tree_tunnel.png');
width: 68px;
height: 68px;
}
.icon_background_lighthouse_shore {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_lighthouse_shore.png');
width: 68px;
@ -3510,6 +3530,11 @@
width: 68px;
height: 68px;
}
.icon_background_springtime_shower {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_springtime_shower.png');
width: 68px;
height: 68px;
}
.icon_background_stable {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_stable.png');
width: 68px;
@ -3700,6 +3725,11 @@
width: 68px;
height: 68px;
}
.icon_background_under_wisteria {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_under_wisteria.png');
width: 68px;
height: 68px;
}
.icon_background_underwater_among_koi {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_underwater_among_koi.png');
width: 68px;
@ -18835,6 +18865,11 @@
width: 90px;
height: 90px;
}
.head_armoire_beaniePropellerHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_beaniePropellerHat.png');
width: 114px;
height: 90px;
}
.head_armoire_bigWig {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_bigWig.png');
width: 90px;
@ -20115,6 +20150,11 @@
width: 68px;
height: 68px;
}
.shop_head_armoire_beaniePropellerHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_beaniePropellerHat.png');
width: 68px;
height: 68px;
}
.shop_head_armoire_bigWig {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_bigWig.png');
width: 68px;
@ -27865,6 +27905,31 @@
width: 114px;
height: 90px;
}
.back_mystery_202305 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202305.png');
width: 114px;
height: 90px;
}
.headAccessory_mystery_202305 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_mystery_202305.png');
width: 114px;
height: 90px;
}
.shop_back_mystery_202305 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_back_mystery_202305.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_mystery_202305 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_mystery_202305.png');
width: 68px;
height: 68px;
}
.shop_set_mystery_202305 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202305.png');
width: 68px;
height: 68px;
}
.broad_armor_mystery_301404 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
width: 90px;
@ -58403,11 +58468,6 @@
width: 81px;
height: 99px;
}
.Pet-HatchingPotion-TeaShop {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-HatchingPotion-TeaShop.png');
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Amber {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Amber.png');
width: 68px;
@ -58653,6 +58713,11 @@
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_TeaShop {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_TeaShop.png');
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Thunderstorm {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Thunderstorm.png');
width: 68px;

View file

@ -24,9 +24,9 @@
}
}
.icon-16 {
width: 16px;
height: 16px;
.icon-10 {
width: 10px;
height: 10px;
}
.icon-12 {
@ -34,21 +34,26 @@
height: 12px;
}
.icon-16 {
width: 16px;
height: 16px;
}
.icon-24 {
width: 24px;
height: 24px;
}
.icon-32 {
width: 32px;
height: 32px;
}
.icon-48 {
width: 48px;
height: 48px;
}
.icon-10 {
width: 10px;
height: 10px;
}
.inline {
display: inline-block;
}

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="b" d="m10,6h6V0h-2v2.72C12.49.99,10.3,0,8,0,3.59,0,0,3.59,0,8s3.59,8,8,8c2.69,0,5.2-1.35,6.68-3.6l-1.67-1.1c-1.11,1.69-2.99,2.71-5.01,2.7-3.31,0-6-2.69-6-6s2.69-6,6-6c1.72,0,3.33.74,4.46,2h-2.46v2Z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 341 B

View file

@ -22,6 +22,10 @@
Account created:
<strong>{{ hero.auth.timestamps.created | formatDate }}</strong>
</div>
<div v-if="hero.flags.thirdPartyTools">
User has employed <strong>third party tools</strong>. Last known usage:
<strong>{{ hero.flags.thirdPartyTools | formatDate }}</strong>
</div>
<div v-if="cronError">
"lastCron" value:
<strong>{{ hero.lastCron | formatDate }}</strong>

View file

@ -213,7 +213,7 @@
</a>
<a
class="social-circle"
href="https://twitter.com/habitica"
href="https://twitter.com/habitica/"
target="_blank"
>
<div
@ -223,7 +223,7 @@
</a>
<a
class="social-circle"
href="https://www.facebook.com/Habitica"
href="https://www.facebook.com/Habitica/"
target="_blank"
>
<div

View file

@ -322,6 +322,7 @@ import omit from 'lodash/omit';
import { v4 as uuid } from 'uuid';
import { userStateMixin } from '../../mixins/userState';
import externalLinks from '../../mixins/externalLinks';
import memberSearchDropdown from '@/components/members/memberSearchDropdown';
import closeChallengeModal from './closeChallengeModal';
import Column from '../tasks/column';
@ -358,7 +359,7 @@ export default {
userLink,
groupLink,
},
mixins: [challengeMemberSearchMixin, userStateMixin],
mixins: [challengeMemberSearchMixin, externalLinks, userStateMixin],
props: ['challengeId'],
data () {
return {
@ -414,6 +415,10 @@ export default {
mounted () {
if (!this.searchId) this.searchId = this.challengeId;
if (!this.challenge._id) this.loadChallenge();
this.handleExternalLinks();
},
updated () {
this.handleExternalLinks();
},
async beforeRouteUpdate (to, from, next) {
this.searchId = to.params.challengeId;

View file

@ -120,6 +120,7 @@ import { mapState } from '@/libs/store';
import Sidebar from './sidebar';
import ChallengeItem from './challengeItem';
import challengeModal from './challengeModal';
import externalLinks from '@/mixins/externalLinks';
import challengeUtilities from '@/mixins/challengeUtilities';
import positiveIcon from '@/assets/svg/positive.svg';
@ -131,7 +132,7 @@ export default {
challengeModal,
MugenScroll,
},
mixins: [challengeUtilities],
mixins: [challengeUtilities, externalLinks],
data () {
return {
loading: true,
@ -177,6 +178,10 @@ export default {
section: this.$t('challenges'),
});
this.loadChallenges();
this.handleExternalLinks();
},
updated () {
this.handleExternalLinks();
},
methods: {
updateSearch (eventData) {

View file

@ -81,6 +81,8 @@ import challengeModal from './challengeModal';
import { mapState } from '@/libs/store';
import markdownDirective from '@/directives/markdown';
import externalLinks from '../../mixins/externalLinks';
import challengeItem from './challengeItem';
import challengeIcon from '@/assets/svg/challenge.svg';
@ -92,6 +94,7 @@ export default {
directives: {
markdown: markdownDirective,
},
mixins: [externalLinks],
props: ['group'],
data () {
return {
@ -118,6 +121,10 @@ export default {
},
mounted () {
this.loadChallenges();
this.handleExternalLinks();
},
updated () {
this.handleExternalLinks();
},
methods: {
async loadChallenges () {

View file

@ -145,6 +145,7 @@ import Sidebar from './sidebar';
import ChallengeItem from './challengeItem';
import challengeModal from './challengeModal';
import challengeUtilities from '@/mixins/challengeUtilities';
import externalLinks from '@/mixins/externalLinks';
import challengeIcon from '@/assets/svg/challenge.svg';
import positiveIcon from '@/assets/svg/positive.svg';
@ -156,7 +157,7 @@ export default {
challengeModal,
MugenScroll,
},
mixins: [challengeUtilities],
mixins: [challengeUtilities, externalLinks],
data () {
return {
icons: Object.freeze({
@ -203,6 +204,10 @@ export default {
section: this.$t('challenges'),
});
this.loadChallenges();
this.handleExternalLinks();
},
updated () {
this.handleExternalLinks();
},
methods: {
updateSearch (eventData) {

View file

@ -0,0 +1,209 @@
<template>
<b-modal
id="external-link-modal"
size="md"
>
<!-- HEADER -->
<div slot="modal-header">
<div
class="modal-close"
@click="close()"
>
<div
class="icon-close"
v-html="icons.close"
>
</div>
</div>
<div class="exclamation-container d-flex align-items-center justify-content-center">
<div
v-once
class="svg-icon svg-exclamation"
v-html="icons.exclamation"
></div>
</div>
<h2>
{{ $t('leaveHabitica') }}
</h2>
</div>
<!-- BODY -->
<div
class="row leave-warning-text"
v-html="$t('leaveHabiticaText')"
>
</div>
<div
class="skip-modal"
>
{{ $t('skipExternalLinkModal') }}
</div>
<!-- FOOTER -->
<div slot="modal-footer">
<button
v-once
class="btn btn-primary"
@click="proceed()"
>
{{ $t('continue') }}
</button>
<div
v-once
class="close-link justify-content-center"
@click="close()"
>
{{ $t('cancel') }}
</div>
</div>
</b-modal>
</template>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
#external-link-modal {
&.modal {
display: flex !important;
}
.modal-md {
max-width: 448px;
min-width: 330px;
margin: auto;
.modal-close {
position: absolute;
right: 12px;
top: 12px;
cursor: pointer;
.icon-close {
width: 16px;
height: 16px;
vertical-align: middle;
& svg {
fill: $yellow-1;
opacity: 0.75;
}
& :hover {
fill: $yellow-1;
opacity: 1;
}
}
}
.modal-content {
background: transparent;
}
.modal-header {
justify-content: center;
padding-top: 32px;
padding-bottom: 0px;
background: $yellow-100;
border-top-right-radius: 8px;
border-top-left-radius: 8px;
border-bottom: none;
.exclamation-container {
width: 64px;
height: 64px;
border-radius: 50%;
background: $yellow-1;
margin: 0 auto;
margin-bottom: 16px;
}
.svg-exclamation {
width: 8px;
color: $white;
}
h2 {
color: $yellow-1;
margin-bottom: 16px;
}
}
.modal-body {
padding: 16px 44px 20px 44px;
background: $white;
.leave-warning-text {
font-size: 0.875rem;
line-height: 1.71;
text-align: center;
margin-top:24px;
}
.skip-modal {
color: $gray-100;
font-size: 0.75rem;
text-align: center;
line-height: 1.33;
margin-top: 16px;
// padding-bottom: 24px;
}
}
.modal-footer {
background: $white;
border-bottom-right-radius: 8px;
border-bottom-left-radius: 8px;
justify-content: center;
border-top: none;
padding-top: 0;
}
.close-link {
color: $purple-300;
line-height: 1.71;
font-size: 0.875rem;
cursor: pointer;
margin-top:16px;
margin-bottom: 8px;
text-align: center;
&:hover {
text-decoration: underline;
}
}
}
}
</style>
<script>
import exclamationIcon from '@/assets/svg/exclamation.svg';
import closeIcon from '@/assets/svg/new-close.svg';
export default {
data () {
return {
icons: Object.freeze({
close: closeIcon,
exclamation: exclamationIcon,
}),
url: '',
};
},
mounted () {
this.$root.$on('habitica:external-link', url => {
this.url = url;
this.$root.$emit('bv::show::modal', 'external-link-modal');
});
},
beforeDestroy () {
this.$root.$off('habitica:external-link');
},
methods: {
close () {
this.$root.$emit('bv::hide::modal', 'external-link-modal');
},
proceed () {
window.open(this.url, '_blank').focus();
this.close();
},
},
};
</script>

View file

@ -87,6 +87,8 @@
<script>
import debounce from 'lodash/debounce';
import externalLinks from '../../mixins/externalLinks';
import autocomplete from '../chat/autoComplete';
import communityGuidelines from './communityGuidelines';
import chatMessage from '../chat/chatMessages';
@ -103,6 +105,7 @@ export default {
communityGuidelines,
chatMessage,
},
mixins: [externalLinks],
props: ['label', 'group', 'placeholder'],
data () {
return {
@ -132,6 +135,10 @@ export default {
},
mounted () {
this.textbox = this.$refs['user-entry'];
this.handleExternalLinks();
},
updated () {
this.handleExternalLinks();
},
methods: {
// https://medium.com/@_jh3y/how-to-where-s-the-caret-getting-the-xy-position-of-the-caret-a24ba372990a

View file

@ -11,9 +11,12 @@
<div class="quest_screen"></div>
<div class="row heading">
<div class="col-12 text-center pr-5 pl-5">
<h2 v-once>
<h1
v-once
class="mb-2"
>
{{ $t('playInPartyTitle') }}
</h2>
</h1>
<p
v-once
class="mb-4"
@ -22,67 +25,91 @@
</p>
<button
v-once
class="btn btn-primary"
class="btn btn-primary px-4 mb-2"
@click="createParty()"
>
{{ $t('createParty') }}
</button>
</div>
</div>
<close-x
@close="close()"
/>
</div>
<div class="row grey-row">
<div class="col-12 text-center">
<div class="col-12 text-center px-0">
<div class="join-party"></div>
<h2 v-once>
{{ $t('wantToJoinPartyTitle') }}
</h2>
<p v-html="$t('wantToJoinPartyDescription')"></p>
<div
class="form-group"
@click="copyUsername"
<h1
v-once
class="mb-2"
>
<div class="d-flex align-items-center">
<label
v-once
class="mr-3"
>{{ $t('username') }}</label>
<div class="flex-grow-1">
<div class="input-group-prepend input-group-text">
@
<div class="text">
{{ user.auth.local.username }}
</div>
<div
class="svg-icon copy-icon"
v-html="icons.copy"
></div>
<div
v-once
class="small"
>
{{ $t('copy') }}
</div>
</div>
{{ $t('wantToJoinPartyTitle') }}
</h1>
<p
v-once
class="mb-4"
v-html="$t('partyFinderDescription')"
>
</p>
<div
v-if="seeking"
>
<div
class="green-bar mb-3"
>
{{ $t('currentlyLookingForParty') }}
</div>
<div class="d-flex justify-content-center">
<div
class="red-link"
@click="seekParty()"
>
{{ $t('leave') }}
</div>
</div>
</div>
<button
v-else
class="btn btn-primary px-4 mt-2 mb-1"
@click="seekParty()"
>
{{ $t('lookForParty') }}
</button>
</div>
</div>
</b-modal>
</template>
<style>
#create-party-modal .modal-body {
padding: 0rem 0.75rem;
}
<style lang="scss">
#create-party-modal {
display: flex !important;
overflow-y: hidden;
#create-party-modal .modal-dialog {
width: 35.75rem;
}
@media (max-height: 770px) {
overflow-y: auto;
}
#create-party-modal .modal-header {
padding: 0;
border-bottom: 0px;
.modal-body {
padding: 0rem 0.75rem;
}
.modal-content {
border-radius: 8px;
}
.modal-dialog {
width: 566px;
margin: auto;
@media (max-height: 826px) {
margin-top: 56px;
}
}
.modal-header {
padding: 0;
border-bottom: 0px;
}
}
</style>
@ -107,15 +134,27 @@
cursor: pointer;
}
.green-bar {
height: 32px;
font-size: 14px;
font-weight: bold;
line-height: 1.71;
text-align: center;
color: $green-1;
background-color: $green-100;
border-radius: 2px;
padding: 4px 0px 4px 0px;
}
.grey-row {
background-color: $gray-700;
color: #4e4a57;
padding: 2em;
border-radius: 0px 0px 2px 2px;
border-radius: 0px 0px 8px 8px;
}
h2 {
color: $gray-100;
h1 {
color: $purple-300;
}
.header-wrap {
@ -132,10 +171,6 @@
border-radius: 2px 2px 0 0;
image-rendering: optimizequality;
}
h2 {
color: $purple-200;
}
}
.heading {
@ -182,6 +217,21 @@
margin: 0.75rem auto 0.75rem 0.25rem;
}
p {
line-height: 1.71;
}
.red-link {
cursor: pointer;
font-size: 14px;
line-height: 1.71;
text-align: center;
color: $maroon-50;
&:hover {
text-decoration: underline;
}
}
.small {
color: $gray-200;
margin: auto 0.5rem auto 0.25rem;
@ -192,21 +242,35 @@
import { mapState } from '@/libs/store';
import * as Analytics from '@/libs/analytics';
import notifications from '@/mixins/notifications';
import closeX from '../ui/closeX';
import copyIcon from '@/assets/svg/copy.svg';
export default {
components: {
closeX,
},
mixins: [notifications],
data () {
return {
icons: Object.freeze({
copy: copyIcon,
}),
seeking: false,
};
},
computed: {
...mapState({ user: 'user.data' }),
},
mounted () {
this.seeking = Boolean(this.user.party.seeking);
Analytics.track({
eventName: 'Start a Party button',
eventAction: 'Start a Party button',
eventCategory: 'behavior',
hitType: 'event',
}, { trackOnClient: true });
},
methods: {
async createParty () {
const group = {
@ -223,7 +287,10 @@ export default {
});
this.$root.$emit('bv::hide::modal', 'create-party-modal');
this.$router.push('/party');
await this.$router.push('/party');
},
close () {
this.$root.$emit('bv::hide::modal', 'create-party-modal');
},
copyUsername () {
if (navigator.clipboard) {
@ -238,6 +305,12 @@ export default {
}
this.text(this.$t('usernameCopied'));
},
seekParty () {
this.$store.dispatch('user:set', {
'party.seeking': !this.user.party.seeking ? new Date() : null,
});
this.seeking = !this.seeking;
},
},
};
</script>

View file

@ -542,7 +542,8 @@ export default {
await this.$store.dispatch('guilds:leave', data);
if (this.isParty) {
this.$router.push({ name: 'tasks' });
await this.$router.push({ name: 'tasks' });
window.location.reload(true);
}
},
upgradeGroup () {

View file

@ -4,12 +4,12 @@
<group-plan-creation-modal />
<div>
<div class="header">
<h1 class="text-center">
Need more for your Group?
<h1 v-once class="text-center">
{{ $t('groupPlanTitle') }}
</h1>
<div class="row">
<div class="col-8 offset-2 text-center">
<h2 class="sub-text">
<h2 v-once class="sub-text">
{{ $t('groupBenefitsDescription') }}
</h2>
</div>
@ -24,8 +24,8 @@
src="~@/assets/images/group-plans/group-14@3x.png"
>
<hr>
<h2>{{ $t('teamBasedTasks') }}</h2>
<p>Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!</p><!-- eslint-disable-line max-len -->
<h2 v-once> {{ $t('teamBasedTasks') }} </h2>
<p v-once> {{ $t('teamBasedTasksListDesc') }} </p>
</div>
</div>
<div class="col-4">
@ -35,8 +35,8 @@
src="~@/assets/images/group-plans/group-12@3x.png"
>
<hr>
<h2>Group Management Controls</h2>
<p>Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.</p><!-- eslint-disable-line max-len -->
<h2 v-once> {{ $t('groupManagementControls') }} </h2>
<p v-once> {{ $t('groupManagementControlsDesc') }} </p>
</div>
</div>
<div class="col-4">
@ -46,8 +46,8 @@
src="~@/assets/images/group-plans/group-13@3x.png"
>
<hr>
<h2>In-Game Benefits</h2>
<p>Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.</p><!-- eslint-disable-line max-len -->
<h2 v-once> {{ $t('inGameBenefits') }} </h2>
<p v-once> {{ $t('inGameBenefitsDesc') }} </p>
</div>
</div>
</div>

View file

@ -0,0 +1,351 @@
<template>
<div>
<div class="d-flex justify-content-center">
<div
v-if="seekers.length > 0"
class="fit-content mx-auto mt-4"
>
<div class="d-flex align-items-center">
<h1 v-once class="my-auto mr-auto"> {{ $t('findPartyMembers') }}</h1>
<div
class="btn btn-secondary btn-sync ml-auto my-auto pl-2 pr-3 d-flex"
@click="refreshList()"
>
<div class="svg-icon icon-16 color my-auto mr-2" v-html="icons.sync"></div>
<div class="ml-auto"> {{ $t('refreshList') }} </div>
</div>
</div>
<div class="d-flex flex-wrap seeker-list">
<div
v-for="(seeker, index) in seekers"
:key="seeker._id"
class="seeker"
>
<div class="d-flex">
<avatar
:member="seeker"
:hideClassBadge="true"
@click.native="showMemberModal(seeker._id)"
class="mr-3 mb-2"
/>
<div class="card-data">
<user-link
:user-id="seeker._id"
:name="seeker.profile.name"
:backer="seeker.backer"
:contributor="seeker.contributor"
/>
<div class="small-with-border pb-2 mb-2">
@{{ seeker.auth.local.username }} {{ $t('level') }} {{ seeker.stats.lvl }}
</div>
<div
class="d-flex"
>
<strong v-once> {{ $t('classLabel') }} </strong>
<span
class="svg-icon d-inline-block icon-16 my-auto mx-2"
v-html="icons[seeker.stats.class]"
>
</span>
<strong
:class="`${seeker.stats.class}-color`"
>
{{ $t(seeker.stats.class) }}
</strong>
</div>
<div>
<strong v-once class="mr-2"> {{ $t('checkinsLabel') }} </strong>
{{ seeker.loginIncentives }}
</div>
<div>
<strong v-once class="mr-2"> {{ $t('languageLabel') }} </strong>
{{ displayLanguage(seeker.preferences.language) }}
</div>
</div>
</div>
<strong
v-if="!seeker.invited"
@click="inviteUser(seeker._id, index)"
class="btn btn-primary w-100"
>
{{ $t('inviteToParty') }}
</strong>
<div
v-else
@click="rescindInvite(seeker._id, index)"
class="btn btn-success w-100"
v-html="$t('invitedToYourParty')"
>
</div>
</div>
<mugen-scroll
v-show="loading"
:handler="infiniteScrollTrigger"
:should-handle="!loading && canLoadMore"
:threshold="1"
/>
</div>
</div>
<div
v-if="seekers.length === 0 && !loading"
class="d-flex flex-column empty-state text-center my-5"
>
<div class="gray-circle mb-3 mx-auto d-flex">
<div
class="svg-icon icon-32 color m-auto"
v-html="icons.users"
>
</div>
</div>
<strong class="mb-1"> {{ $t('findMorePartyMembers') }} </strong>
<div v-html="$t('noOneLooking')"></div>
</div>
</div>
<h2
v-show="loading"
class="loading"
:class="seekers.length === 0 ? 'mt-3' : 'mt-0'"
>
{{ $t('loading') }}
</h2>
</div>
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
h1 {
color: $purple-300;
}
strong {
line-height: 1.71;
}
.avatar {
background-color: $gray-600;
}
.btn-success {
box-shadow: none;
color: $green-1;
font-weight: normal;
&:not(:disabled):not(.disabled):active {
color: $green-1;
}
}
.btn-sync {
min-width: 128px;
max-height: 32px;
.svg-icon {
color: $gray-200;
}
}
.card-data {
width: 267px;
}
.empty-state {
color: $gray-100;
line-height: 1.71;
}
.fit-content {
width: fit-content;
}
.gray-circle {
width: 64px;
height: 64px;
color: $gray-600;
background-color: $gray-200;
border-radius: 100px;
.icon-32 {
height: auto;
}
}
.loading {
text-align: center;
color: $purple-300;
}
.seeker-list {
max-width: 920px;
@media (max-width: 962px) {
max-width: 464px;
};
.seeker {
width: 448px;
margin-bottom: 24px;
padding: 8px;
border-radius: 4px;
box-shadow: 0 1px 3px 0 rgba(26, 24, 29, 0.12), 0 1px 2px 0 rgba(26, 24, 29, 0.24);
&:first-of-type {
margin-top: 24px;
}
@media (min-width: 963px) {
&:nth-child(2) {
margin-top: 24px;
}
&:nth-child(even) {
margin-left: 24px;
}
}
}
}
.small-with-border {
border-bottom: 1px solid $gray-500;
color: $gray-100;
font-size: 12px;
font-weight: normal;
line-height: 1.33;
}
.healer-color {
color: $yellow-10;
}
.rogue-color {
color: $purple-200;
}
.warrior-color {
color: $red-50;
}
.wizard-color {
color: $blue-10;
}
</style>
<script>
import debounce from 'lodash/debounce';
import MugenScroll from 'vue-mugen-scroll';
import Avatar from '../avatar';
import userLink from '../userLink';
import { mapState } from '@/libs/store';
import syncIcon from '@/assets/svg/sync-2.svg';
import usersIcon from '@/assets/svg/users.svg';
import warriorIcon from '@/assets/svg/warrior.svg';
import rogueIcon from '@/assets/svg/rogue.svg';
import healerIcon from '@/assets/svg/healer.svg';
import wizardIcon from '@/assets/svg/wizard.svg';
import * as Analytics from '@/libs/analytics';
export default {
components: {
Avatar,
MugenScroll,
userLink,
},
data () {
return {
canLoadMore: true,
loading: true,
page: 0,
party: {},
seekers: [],
icons: Object.freeze({
warrior: warriorIcon,
rogue: rogueIcon,
healer: healerIcon,
sync: syncIcon,
users: usersIcon,
wizard: wizardIcon,
}),
};
},
computed: {
...mapState({
availableLanguages: 'i18n.availableLanguages',
user: 'user.data',
}),
},
async mounted () {
try {
this.party = await this.$store.dispatch('guilds:getGroup', { groupId: this.user.party._id });
} catch {
this.$router.push('/');
}
if (!this.party._id || this.party.leader._id !== this.user._id) {
this.$router.push('/');
} else {
this.$store.dispatch('common:setTitle', {
section: this.$t('lookingForPartyTitle'),
});
this.seekers = await this.$store.dispatch('party:lookingForParty');
await Analytics.track({
hitType: 'event',
eventName: 'View Find Members',
eventAction: 'View Find Members',
eventCategory: 'behavior',
}, { trackOnClient: true });
this.canLoadMore = this.seekers.length === 30;
this.loading = false;
}
},
methods: {
displayLanguage (languageCode) {
const language = this.availableLanguages.find(lang => lang.code === languageCode);
if (language) {
return language.name;
}
return languageCode;
},
infiniteScrollTrigger () {
if (this.canLoadMore) {
this.loading = true;
}
this.loadMore();
},
async inviteUser (userId, index) {
await this.$store.dispatch('guilds:invite', {
invitationDetails: {
inviter: this.user.profile.name,
uuids: [userId],
},
groupId: this.party._id,
});
this.seekers[index].invited = true;
},
loadMore: debounce(async function loadMoreDebounce () {
this.page += 1;
const addlSeekers = await this.$store.dispatch('party:lookingForParty', { page: this.page });
this.seekers = this.seekers.concat(addlSeekers);
this.canLoadMore = this.seekers.length % 30 === 0;
this.loading = false;
}, 1000),
async refreshList () {
this.loading = true;
this.page = 0;
this.seekers = await this.$store.dispatch('party:lookingForParty');
this.canLoadMore = this.seekers.length === 30;
this.loading = false;
},
async rescindInvite (userId, index) {
await this.$store.dispatch('members:removeMember', {
memberId: userId,
groupId: this.party._id,
});
this.seekers[index].invited = false;
},
showMemberModal (userId) {
this.$router.push({ name: 'userProfile', params: { userId } });
},
},
};
</script>

View file

@ -2,7 +2,7 @@
<div class="sidebar px-4">
<div>
<div class="buttons-wrapper">
<div class="button-container button-with-menu-row">
<div class="button-container d-flex">
<button
v-if="!isMember"
class="btn btn-success btn-success"
@ -203,10 +203,6 @@ export default {
}
}
.button-with-menu-row {
display: flex;
}
.menuIcon {
width: 4px;
height: 1rem;

View file

@ -51,20 +51,20 @@
</div>
<div
v-else
class="no-party d-none d-md-flex justify-content-center text-center mr-4"
class="no-party d-none d-md-flex justify-content-center text-center mr-4"
>
<div class="align-self-center">
<h3>{{ $t('battleWithFriends') }}</h3>
<h3>{{ user.party._id ? $t('questWithOthers') : $t('battleWithFriends') }}</h3>
<span
class="small-text"
v-html="$t('inviteFriendsParty')"
v-html="user.party._id ? $t('inviteFriendsParty') : $t('startPartyDetail')"
></span>
<br>
<button
class="btn btn-primary"
@click="createOrInviteParty()"
>
{{ user.party._id ? $t('inviteFriends') : $t('startAParty') }}
{{ user.party._id ? $t('findPartyMembers') : $t('getStarted') }}
</button>
</div>
</div>
@ -234,7 +234,7 @@ export default {
},
createOrInviteParty () {
if (this.user.party._id) {
this.$root.$emit('inviteModal::inviteToGroup', this.user.party);
this.$router.push('/looking-for-party');
} else {
this.$root.$emit('bv::show::modal', 'create-party-modal');
}

View file

@ -148,7 +148,7 @@
</div>
</li>
<b-nav-item
v-if="user.party._id"
v-if="user.party._id && user._id !== partyLeaderId"
class="topbar-item"
:class="{'active': $route.path.startsWith('/party')}"
tag="li"
@ -156,6 +156,36 @@
>
{{ $t('party') }}
</b-nav-item>
<li
v-if="user.party._id && user._id === partyLeaderId"
class="topbar-item droppable"
:class="{'active': $route.path.startsWith('/party')}"
>
<div
class="chevron rotate"
@click="dropdownMobile($event)"
>
<div
v-once
class="chevron-icon-down"
v-html="icons.chevronDown"
></div>
</div>
<router-link
class="nav-link"
:to="{name: 'party'}"
>
{{ $t('party') }}
</router-link>
<div class="topbar-dropdown">
<router-link
class="topbar-dropdown-item dropdown-item"
:to="{name: 'lookingForParty'}"
>
{{ $t('lookingForPartyTitle') }}
</router-link>
</div>
</li>
<b-nav-item
v-if="!user.party._id"
class="topbar-item"
@ -768,6 +798,7 @@ export default {
return {
isUserDropdownOpen: false,
menuIsOpen: false,
partyLeaderId: null,
icons: Object.freeze({
gem: gemIcon,
gold: goldIcon,
@ -796,8 +827,9 @@ export default {
};
},
},
mounted () {
this.getUserGroupPlans();
async mounted () {
await this.getUserGroupPlans();
await this.getUserParty();
Array.from(document.getElementById('menu_collapse').getElementsByTagName('a')).forEach(link => {
link.addEventListener('click', this.closeMenu);
});
@ -805,6 +837,9 @@ export default {
link.addEventListener('mouseenter', this.dropdownDesktop);
link.addEventListener('mouseleave', this.dropdownDesktop);
});
this.$root.$on('update-party', () => {
this.getUserParty();
});
},
methods: {
modForm () {
@ -816,6 +851,12 @@ export default {
async getUserGroupPlans () {
await this.$store.dispatch('guilds:getGroupPlans');
},
async getUserParty () {
if (this.user.party._id) {
await this.$store.dispatch('party:getParty');
this.partyLeaderId = this.$store.state.party.data.leader._id;
}
},
openPartyModal () {
this.$root.$emit('bv::show::modal', 'create-party-modal');
},

View file

@ -34,11 +34,13 @@
<script>
import BaseNotification from './base';
import { mapState } from '@/libs/store';
import sync from '@/mixins/sync';
export default {
components: {
BaseNotification,
},
mixins: [sync],
props: {
notification: {
type: Object,
@ -73,6 +75,7 @@ export default {
}
await this.$store.dispatch('guilds:join', { groupId: group.id, type: 'party' });
this.sync();
this.$router.push('/party');
},
reject () {

View file

@ -139,6 +139,8 @@
import axios from 'axios';
import moment from 'moment';
import externalLinks from '../../mixins/externalLinks';
import renderWithMentions from '@/libs/renderWithMentions';
import { mapState } from '@/libs/store';
import userLink from '../userLink';
@ -150,6 +152,7 @@ export default {
components: {
userLink,
},
mixins: [externalLinks],
filters: {
timeAgo (value) {
return moment(value).fromNow();
@ -179,6 +182,10 @@ export default {
},
mounted () {
this.$emit('message-card-mounted');
this.handleExternalLinks();
},
updated () {
this.handleExternalLinks();
},
methods: {
report () {

View file

@ -179,7 +179,9 @@ export default {
let valid = true;
for (const stat of canRestore) {
if (this.restoreValues.stats[stat] === '') {
if (this.restoreValues.stats[stat] === ''
|| this.restoreValues.stats[stat] < 0
) {
this.restoreValues.stats[stat] = this.user.stats[stat];
valid = false;
}

View file

@ -17,6 +17,19 @@
class="faq-question"
>
<h2
v-once
v-if="index === 0"
>
{{ $t('general') }}
</h2>
<h2
v-once
v-if="entry.heading === 'party-with-friends'"
id="parties"
>
{{ $t('parties') }}
</h2>
<h3
v-once
v-b-toggle="entry.heading"
role="tab"
@ -24,7 +37,7 @@
@click="handleClick($event)"
>
{{ entry.question }}
</h2>
</h3>
<b-collapse
:id="entry.heading"
:visible="isVisible(entry.heading)"
@ -49,25 +62,36 @@
</template>
<style lang='scss' scoped>
.card-body {
margin-bottom: 1em;
h2 {
color: #34313a;
border-bottom: 1px solid #e1e0e3;
margin-top: 24px;
padding-bottom: 16px;
}
.faq-question h2 {
cursor: pointer;
}
.faq-question {
a {
text-decoration: none;
color: #4F2A93;
}
.faq-question .card-body {
padding: 0;
}
h3 {
font-size: 16px;
font-weight: normal;
line-height: 1.75;
cursor: pointer;
.static-wrapper .faq-question h2 {
margin: 0 0 16px 0;
}
&:hover {
text-decoration: underline;
}
}
.faq-question a {
text-decoration: none;
color: #4F2A93;
.card-body {
padding: 0;
font-size: 14px;
line-height: 1.71;
margin-bottom: 1em;
}
}
@media only screen and (max-width: 768px) {

View file

@ -198,10 +198,6 @@
color: $purple-200;
}
li, p {
font-size: 16px;
}
.media img {
margin: 1em;
}

View file

@ -355,6 +355,7 @@ import Task from './task';
import ClearCompletedTodos from './clearCompletedTodos';
import buyMixin from '@/mixins/buy';
import sync from '@/mixins/sync';
import externalLinks from '@/mixins/externalLinks';
import { mapState, mapActions, mapGetters } from '@/libs/store';
import shopItem from '../shops/shopItem';
import BuyQuestModal from '@/components/shops/quests/buyQuestModal.vue';
@ -384,7 +385,7 @@ export default {
shopItem,
draggable,
},
mixins: [buyMixin, notifications, sync],
mixins: [buyMixin, notifications, sync, externalLinks],
// @TODO Set default values for props
// allows for better control of props values
// allows for better control of where this component is called
@ -534,6 +535,10 @@ export default {
if (this.activeFilter.label !== 'complete2') return;
this.loadCompletedTodos();
});
this.handleExternalLinks();
},
updated () {
this.handleExternalLinks();
},
beforeDestroy () {
this.$root.$off('buyModal::boughtItem');

View file

@ -83,6 +83,7 @@
<script>
import moment from 'moment';
import { mapState } from '@/libs/store';
import externalLinks from '@/mixins/externalLinks';
import scoreTask from '@/mixins/scoreTask';
import sync from '@/mixins/sync';
import Task from './task';
@ -93,7 +94,7 @@ export default {
Task,
LoadingSpinner,
},
mixins: [scoreTask, sync],
mixins: [externalLinks, scoreTask, sync],
props: {
yesterDailies: {
type: Array,
@ -108,6 +109,9 @@ export default {
dueDate: moment().subtract(1, 'days'),
};
},
updated () {
this.handleExternalLinks();
},
computed: {
...mapState({ user: 'user.data' }),
tasksByType () {

View file

@ -0,0 +1,46 @@
<template>
<div
class="modal-close"
@click="$emit('close')"
>
<div
class="svg-icon svg-close color"
v-html="icons.close"
>
</div>
</div>
</template>
<style lang="scss" scoped>
.modal-close {
position: absolute;
right: 16px;
top: 16px;
cursor: pointer;
.svg-close {
width: 18px;
height: 18px;
vertical-align: middle;
opacity: 0.75;
&:hover {
opacity: 1;
}
}
}
</style>
<script>
import close from '@/assets/svg/close.svg';
export default {
data () {
return {
icons: Object.freeze({
close,
}),
};
},
};
</script>

View file

@ -2,13 +2,13 @@
<router-link
v-if="displayName"
v-b-tooltip.hover.top="tierTitle"
class="leader user-link"
class="leader user-link d-flex"
:to="{'name': 'userProfile', 'params': {'userId': id}}"
:class="levelStyle()"
>
{{ displayName }}
<div
class="svg-icon"
class="svg-icon icon-12"
v-html="tierIcon()"
></div>
</router-link>
@ -37,10 +37,15 @@
color: $gray-50;
}
&[class*="tier"] .svg-icon {
margin-top: 5px;
}
&.npc .svg-icon {
margin-top: 4px;
}
.svg-icon {
width: 10px;
display: inline-block;
margin-left: .5em;
margin-left: 6px;
&:empty {
display: none;

View file

@ -759,6 +759,7 @@ import challenge from '@/assets/svg/challenge.svg';
import member from '@/assets/svg/member-icon.svg';
import staff from '@/assets/svg/tier-staff.svg';
import error404 from '../404';
import externalLinks from '../../mixins/externalLinks';
import { userCustomStateMixin } from '../../mixins/userState';
// @TODO: EMAILS.COMMUNITY_MANAGER_EMAIL
const COMMUNITY_MANAGER_EMAIL = 'admin@habitica.com';
@ -772,7 +773,7 @@ export default {
profileStats,
error404,
},
mixins: [userCustomStateMixin('userLoggedIn')],
mixins: [externalLinks, userCustomStateMixin('userLoggedIn')],
props: ['userId', 'startingPage'],
data () {
return {
@ -862,8 +863,12 @@ export default {
mounted () {
this.loadUser();
this.oldTitle = this.$store.state.title;
this.handleExternalLinks();
this.selectPage(this.startingPage);
},
updated () {
this.handleExternalLinks();
},
beforeDestroy () {
if (this.oldTitle) {
this.$store.dispatch('common:setTitle', {

View file

@ -33,9 +33,15 @@ setUpLogging();
setupAnalytics(); // just create queues for analytics, no scripts loaded at this time
const store = getStore();
export default new Vue({
const vueInstance = new Vue({
el: '#app',
router,
store,
render: h => h(AppComponent),
});
export default vueInstance;
window.externalLink = url => {
vueInstance.$root.$emit('habitica:external-link', url);
};

View file

@ -0,0 +1,35 @@
import some from 'lodash/some';
export default {
methods: {
handleExternalLinks () {
const { TRUSTED_DOMAINS } = process.env;
const allLinks = document.getElementsByTagName('a');
for (let i = 0; i < allLinks.length; i += 1) {
const link = allLinks[i];
let domainIndex = link.href.indexOf('www');
if (domainIndex !== -1 && domainIndex < 9) {
domainIndex += 4;
} else {
domainIndex = link.href.indexOf('//') + 2;
}
if ((link.classList.value.indexOf('external-link') === -1)
&& domainIndex !== 1
&& !some(TRUSTED_DOMAINS.split(','), domain => link.href.indexOf(domain) === domainIndex)) {
link.classList.add('external-link');
link.addEventListener('click', e => {
if (e.ctrlKey || e.metaKey) {
return;
}
e.stopPropagation();
e.preventDefault();
window.externalLink(link.href);
});
}
}
},
},
};

View file

@ -72,13 +72,14 @@ const ItemsPage = () => import(/* webpackChunkName: "inventory" */'@/components/
const EquipmentPage = () => import(/* webpackChunkName: "inventory" */'@/components/inventory/equipment/index');
const StablePage = () => import(/* webpackChunkName: "inventory" */'@/components/inventory/stable/index');
// Guilds
// Guilds & Parties
const GuildIndex = () => import(/* webpackChunkName: "guilds" */ '@/components/groups/index');
const TavernPage = () => import(/* webpackChunkName: "guilds" */ '@/components/groups/tavern');
const MyGuilds = () => import(/* webpackChunkName: "guilds" */ '@/components/groups/myGuilds');
const GuildsDiscoveryPage = () => import(/* webpackChunkName: "guilds" */ '@/components/groups/discovery');
const GroupPage = () => import(/* webpackChunkName: "guilds" */ '@/components/groups/group');
const GroupPlansAppPage = () => import(/* webpackChunkName: "guilds" */ '@/components/groups/groupPlan');
const LookingForParty = () => import(/* webpackChunkName: "guilds" */ '@/components/groups/lookingForParty');
// Group Plans
const GroupPlanIndex = () => import(/* webpackChunkName: "group-plans" */ '@/components/group-plans/index');
@ -157,6 +158,7 @@ const router = new VueRouter({
],
},
{ name: 'party', path: '/party', component: GroupPage },
{ name: 'lookingForParty', path: '/looking-for-party', component: LookingForParty },
{ name: 'groupPlan', path: '/group-plans', component: GroupPlansAppPage },
{
name: 'groupPlanDetail',
@ -433,6 +435,10 @@ router.beforeEach(async (to, from, next) => {
}
}
if (to.name === 'party') {
router.app.$root.$emit('update-party');
}
// Redirect old guild urls
if (to.hash.indexOf('#/options/groups/guilds/') !== -1) {
const splits = to.hash.split('/');

View file

@ -1,3 +1,4 @@
import axios from 'axios';
import { loadAsyncResource } from '@/libs/asyncResource';
export function getMembers (store, forceLoad = false) {
@ -23,3 +24,14 @@ export function getParty (store, forceLoad = false) {
forceLoad,
});
}
export async function lookingForParty (store, payload) {
let response;
if (payload && payload.page) {
response = await axios.get(`api/v4/looking-for-party?page=${payload.page}`);
} else {
response = await axios.get('api/v4/looking-for-party');
}
return response.data.data;
}

View file

@ -27,6 +27,7 @@ const envVars = [
'APPLE_AUTH_CLIENT_ID',
'AMPLITUDE_KEY',
'LOGGLY_CLIENT_TOKEN',
'TRUSTED_DOMAINS',
// TODO necessary? if yes how not to mess up with vue cli? 'NODE_ENV'
];

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -144,5 +144,8 @@
"achievementPolarProModalText": "لقد جمعت كل الحيوانات الأليفة القطبية!",
"achievementBoneToPick": "جامع العظام",
"achievementBoneToPickText": "فقست جميع الحيوانات الأليفة الهيكلية المغامرة والكلاسيكية!",
"achievementBoneToPickModalText": "لقد جمعت كل الحيوانات الأليفة الهيكلية المغامرة والكلاسيكية!"
"achievementBoneToPickModalText": "لقد جمعت كل الحيوانات الأليفة الهيكلية المغامرة والكلاسيكية!",
"achievementPlantParent": "والد النبات",
"achievementPlantParentText": "فقست جميع الحيوانات الأليفة النباتية في الألوان القياسية: الصبار والتريلنج!",
"achievementPlantParentModalText": "لقد جمعت كل الحيوانات الأليفة النباتية!"
}

View file

@ -648,5 +648,19 @@
"backgroundHauntedPhotoText": "صورة مسكونة",
"backgroundHauntedPhotoNotes": "تجد نفسك محاصرًا في عالم أحادي اللون لصورة مسكونة.",
"backgroundUndeadHandsText": "أيدي الزومبي",
"backgroundUndeadHandsNotes": "حاول الهروب من براثن أيدي الزومبي."
"backgroundUndeadHandsNotes": "حاول الهروب من براثن أيدي الزومبي.",
"backgrounds022022": "المجموعة 93: صدرت في فبراير 2022",
"backgroundFrozenPolarWatersText": "المياه القطبية المجمدة",
"backgroundFrozenPolarWatersNotes": "استكشف المياه القطبية المجمدة.",
"backgroundWinterCanyonText": "وادي شتوي",
"backgroundWinterCanyonNotes": "اذهب في مغامرة في وادي شتوي!",
"backgroundIcePalaceText": "قصر الجليد",
"backgrounds012022": "المجموعة 92: صدرت في يناير 2022",
"backgroundSnowyFarmText": "مزرعة ثلجية",
"backgroundMeteorShowerText": "دش النيزك",
"backgroundMeteorShowerNotes": "شاهد العرض الليلي المبهر لدش النيزك.",
"backgroundPalmTreeWithFairyLightsText": "شجرة نخيل مع أضواء زخرفية",
"backgroundSnowyFarmNotes": "تأكد من أن الجميع آمنون ودافئون في مزرعتك الثلجية.",
"backgroundIcePalaceNotes": "احكم في قصر الجليد.",
"backgroundPalmTreeWithFairyLightsNotes": "قف بجانب شجرة نخيل ملفوفة بأضواء زخرفية."
}

View file

@ -1,5 +1,4 @@
{
"tavernCommunityGuidelinesPlaceholder": "Friendly reminder: this is an all-ages chat, so please keep content and language appropriate! Consult the Community Guidelines in the sidebar if you have questions.",
"lastUpdated": "آخر تحديث:",
"commGuideHeadingWelcome": "أهلاً وسهلاً بك في Habitica!",
@ -7,7 +6,7 @@
"commGuidePara002": "To help keep everyone safe, happy, and productive in the community, we do have some guidelines. We have carefully crafted them to make them as friendly and easy-to-read as possible. Please take the time to read them before you start chatting.",
"commGuidePara003": "تنطبق هذه القواعد على جميع المساحات الإجتماعية التي نستخدمها، بما في ذلك (ولكن لا تقتصر على) Trello، GitHub، Transifex و Wikia (أي الwiki). في بعض الأحيان، سوف تنشأ حالات غير متوقعة، مثل مصدراً جديداً من الصراع أو ظهور مستحضراً للأرواح الشرية. عندما يحدث ذلك، يجوز للمشرفين تعديل هذه المبادئ التوجيهية للحفاظ على سلامة المجتمع من التهديدات الجديدة. ولكن لا تخف: سيتم إعلامك عن طريق إعلان من الآنسة Bailey إذا تغيرت المبادئ التوجيهية.",
"commGuideHeadingInteractions": "التفاعل في Habitica",
"commGuidePara015": "Habitica has two kinds of social spaces: public, and private. Public spaces include the Tavern, Public Guilds, GitHub, Trello, and the Wiki. Private spaces are Private Guilds, Party chat, and Private Messages. All Display Names must comply with the public space guidelines. To change your Display Name, go on the website to User > Profile and click on the \"Edit\" button.",
"commGuidePara015": "يحتوي Habitica على نوعين من الفضاءات الاجتماعية: العامة والخاصة. تشمل الفضاءات العامة التي يمكن الوصول إليها الحانوت والمنتديات العامة و GitHub و Trello والويكي. الفضاءات الخاصة هي الأندية الخاصة والدردشة الجماعية والرسائل الخاصة. يجب على جميع أسماء العرض وأسماء المستخدمين @ اتباع إرشادات الفضاء العام. لتغيير اسم العرض و / أو اسم المستخدم @ ، انتقل إلى القائمة> الإعدادات> الملف الشخصي على الهاتف المحمول. على الويب ، انتقل إلى المستخدم> الإعدادات.",
"commGuidePara016": "عند التنقل ما بين الأماكن العامة في Habitica، هناك بعض القواعد العامة للحفاظ على سعادة وسلامة الجميع. ستكون هذه القواعد سهلة عليك أيها المغامر!",
"commGuideList02A": "<strong>Respect each other</strong>. Be courteous, kind, friendly, and helpful. Remember: Habiticans come from all backgrounds and have had wildly divergent experiences. This is part of what makes Habitica so cool! Building a community means respecting and celebrating our differences as well as our similarities. Here are some easy ways to respect each other:",
"commGuideList02B": "<strong>التزم بجميع <a href='/static/terms' target='_blank'>الشروط والأحكام</a></strong>.",

View file

@ -1,11 +1,11 @@
{
"frequentlyAskedQuestions": "الأسئلة الأكثر تكراراً",
"faqQuestion0": "أنا محتار. من أين استطيع أن احصل على نظرة عامة؟",
"iosFaqAnswer0": "First, you'll set up tasks that you want to do in your everyday life. Then, as you complete the tasks in real life and check them off, you'll earn experience and gold. Gold is used to buy equipment and some items, as well as custom rewards. Experience causes your character to level up and unlock content such as Pets, Skills, and Quests! You can customize your character under Menu > Customize Avatar.\n\n Some basic ways to interact: click the (+) in the upper-right-hand corner to add a new task. Tap on an existing task to edit it, and swipe left on a task to delete it. You can sort tasks using Tags in the upper-left-hand corner, and expand and contract checklists by clicking on the checklist bubble.",
"iosFaqAnswer0": "أولاً ، ستقوم بإعداد المهام التي تريد القيام بها في حياتك اليومية. ثم ، بمجرد الانتهاء من المهام في الحياة الحقيقية وتحققها ، ستكسب الخبرة والذهب. يتم استخدام الذهب لشراء المعدات وبعض العناصر ، بالإضافة إلى المكافآت المخصصة. يؤدي الخبرة إلى صعود شخصيتك وفتح محتوى مثل الحيوانات الأليفة والمهارات والمهام! يمكنك تخصيص شخصيتك في القائمة> تخصيص الصورة الرمزية.\n\n بعض الطرق الأساسية للتفاعل: انقر على (+) في الزاوية العلوية اليمنى لإضافة مهمة جديدة. انقر فوق المهمة الموجودة لتحريرها ، واسحب إلى اليسار على المهمة لحذفها. يمكنك فرز المهام باستخدام العلامات في الزاوية العلوية اليسرى ، وتوسيع وطي قوائم الاختيار عن طريق النقر على فقاعة قائمة الاختيارات.",
"androidFaqAnswer0": "First, you'll set up tasks that you want to do in your everyday life. Then, as you complete the tasks in real life and check them off, you'll earn experience and gold. Gold is used to buy equipment and some items, as well as custom rewards. Experience causes your character to level up and unlock content such as Pets, Skills, and Quests! You can customize your character under Menu > [Inventory >] Avatar.\n\n Some basic ways to interact: click the (+) in the lower-right-hand corner to add a new task. Tap on an existing task to edit it, and swipe left on a task to delete it. You can sort tasks using Tags in the upper-right-hand corner, and expand and contract checklists by clicking on the checklist count box.",
"webFaqAnswer0": "First, you'll set up tasks that you want to do in your everyday life. Then, as you complete the tasks in real life and check them off, you'll earn Experience and Gold. Gold is used to buy equipment and some items, as well as custom rewards. Experience causes your character to level up and unlock content such as pets, skills, and quests! For more detail, check out a step-by-step overview of the game at [Help -> Overview for New Users](https://habitica.com/static/overview).",
"faqQuestion1": "كيف أضيف مهماتي؟",
"iosFaqAnswer1": "Good Habits (the ones with a +) are tasks that you can do many times a day, such as eating vegetables. Bad Habits (the ones with a -) are tasks that you should avoid, like biting nails. Habits with a + and a - have a good choice and a bad choice, like taking the stairs vs. taking the elevator. Good Habits award experience and gold. Bad Habits subtract health.\n\n Dailies are tasks that you have to do every day, like brushing your teeth or checking your email. You can adjust the days that a Daily is due by tapping to edit it. If you skip a Daily that is due, your avatar will take damage overnight. Be careful not to add too many Dailies at once!\n\n To-Dos are your To-Do list. Completing a To-Do earns you gold and experience. You never lose health from To-Dos. You can add a due date to a To-Do by tapping to edit.",
"iosFaqAnswer1": "العادات الجيدة (تلك التي تحتوي على علامة \"+\") هي المهام التي يمكنك القيام بها عدة مرات في اليوم، مثل تناول الخضروات. العادات السيئة (تلك التي تحتوي على علامة \"-\") هي المهام التي يجب عليك تجنبها، مثل عض الأظافر. والعادات التي تحتوي على علامة \"+\" و \"-\" لديها خيار جيد وخيار سيئ، مثل استخدام الدرج بدلاً من المصعد.\n\nالعادات الجيدة تمنحك خبرة وذهب. والعادات السيئة تقلل من صحتك.\n\nالمهام اليومية هي المهام التي يجب عليك القيام بها كل يوم، مثل تنظيف أسنانك أو التحقق من بريدك الإلكتروني. يمكنك تعديل تواريخ المهام اليومية بالنقر لتحريرها. إذا تخطيت مهمة يومية محددة، فسيتلقى أفاتارك ضررًا خلال الليل. كن حذرًا من عدم إضافة العديد من المهام اليومية في وقت واحد!\n\nالمهام التي يجب القيام بها هي قائمة المهام الخاصة بك. إكمال المهام يمنحك الذهب والخبرة. لن تفقد أبدًا صحتك بسبب هذه المهام. يمكنك إضافة تاريخ استحقاق للمهام التي يجب القيام بها بالنقر لتحريرها.",
"androidFaqAnswer1": "Good Habits (the ones with a +) are tasks that you can do many times a day, such as eating vegetables. Bad Habits (the ones with a -) are tasks that you should avoid, like biting nails. Habits with a + and a - have a good choice and a bad choice, like taking the stairs vs. taking the elevator. Good Habits award experience and gold. Bad Habits subtract health.\n\n Dailies are tasks that you have to do every day, like brushing your teeth or checking your email. You can adjust the days that a Daily is due by tapping to edit it. If you skip a Daily that is due, your character will take damage overnight. Be careful not to add too many Dailies at once!\n\n To-Dos are your To-Do list. Completing a To-Do earns you gold and experience. You never lose health from To-Dos. You can add a due date to a To-Do by tapping to edit.",
"webFaqAnswer1": "* Good Habits (the ones with a :heavy_plus_sign:) are tasks that you can do many times a day, such as eating vegetables. Bad Habits (the ones with a :heavy_minus_sign:) are tasks that you should avoid, like biting nails. Habits with a :heavy_plus_sign: and a :heavy_minus_sign: have a good choice and a bad choice, like taking the stairs vs. taking the elevator. Good Habits award Experience and Gold. Bad Habits subtract Health.\n* Dailies are tasks that you have to do every day, like brushing your teeth or checking your email. You can adjust the days that a Daily is due by clicking the pencil item to edit it. If you skip a Daily that is due, your avatar will take damage overnight. Be careful not to add too many Dailies at once!\n* To-Dos are your To-Do list. Completing a To-Do earns you Gold and Experience. You never lose Health from To-Dos. You can add a due date to a To-Do by clicking the pencil icon to edit.",
"faqQuestion2": "ما هي أمثلة المهمات؟",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -1,11 +1,11 @@
{
"questEvilSantaText": "سانتا الموقع بالفخ",
"questEvilSantaNotes": "You hear agonized roars deep in the icefields. You follow the growls - punctuated by the sound of cackling - to a clearing in the woods, where you see a fully-grown polar bear. She's caged and shackled, fighting for her life. Dancing atop the cage is a malicious little imp wearing a castaway costume. Vanquish Trapper Santa, and save the beast!",
"questEvilSantaNotes": "تسمع زئيرًا متألمة في عمق حقول الجليد. تتبع النموات - المفصولة بصوت الضحك - إلى مساحة صافية في الغابة ، حيث ترى دبًا قطبيًا ناضجًا تمامًا. إنها مسجونة ومقيدة ، تحارب من أجل حياتها. يرقص فوق القفص عفريت صغيرة شريرة ترتدي زي الناجي. اهزم صياد سانتا وانقذ الوحش! <br> <br> <strong> ملاحظة </strong>: \"صياد سانتا\" يمنح إنجازًا قابلًا للتكديس للمهمة ولكنه يعطي جبلًا نادرًا يمكن إضافته إلى طاولة الخيل الخاصة بك مرة واحدة.",
"questEvilSantaCompletion": "Trapper Santa squeals in anger, and bounces off into the night. The grateful she-bear, through roars and growls, tries to tell you something. You take her back to the stables, where Matt Boch the Beast Master listens to her tale with a gasp of horror. She has a cub! He ran off into the icefields when mama bear was captured.",
"questEvilSantaBoss": "سانتا الموقع بالفخ",
"questEvilSantaDropBearCubPolarMount": "دب قطبي (مركب)",
"questEvilSanta2Text": "البحث عن الشبل",
"questEvilSanta2Notes": "When Trapper Santa captured the polar bear mount, her cub ran off into the icefields. You hear twig-snaps and snow crunch through the crystalline sound of the forest. Paw prints! You start racing to follow the trail. Find all the prints and broken twigs, and retrieve the cub!",
"questEvilSanta2Text": "ابحث عن الشبل",
"questEvilSanta2Notes": "عندما اعتقل صياد السانتا الدب القطبي، هرب صغيرها إلى حقول الجليد. تسمع صوت تكسر أغصان الشجر وصوت الثلج يتكسر بينما تجوب الغابة. آثار بصمات الكفوف! تبدأ بالجري لمتابعة الأثر. ابحث عن جميع الأثر والأغصان المكسورة واسترد الصغير!<br><br><strong>ملاحظة</strong>: تمنح \"البحث عن الصغير\" إنجازًا لمهمة يمكن تراكمه ولكن يمنح حيوانًا أليفًا نادرًا يمكن إضافته إلى مستودعك مرة واحدة فقط.",
"questEvilSanta2Completion": "You've found the cub! It will keep you company forever.",
"questEvilSanta2CollectTracks": "مسارات",
"questEvilSanta2CollectBranches": "أغصان مكسورة",

View file

@ -136,5 +136,8 @@
"cancelSubInfoGoogle": "الرجاء الانتقال إلى \"الحساب\"> قسم \"الاشتراكات\" في متجر Google Play لإلغاء اشتراكك أو لمعرفة تاريخ انتهاء إشتراكك إذا كنت قد ألغيته بالفعل. هذه الشاشة غير قادرة على إظهار ما إذا كان قد تم إلغاء اشتراكك.",
"organization": "منظمة",
"giftASubscription": "إهداء إشتراك",
"viewSubscriptions": "عرض الإشتراكات"
"viewSubscriptions": "عرض الإشتراكات",
"howManyGemsSend": "كم عدد الجواهر التي ترغب في إرسالها؟",
"howManyGemsPurchase": "كم عدد الأحجار الكريمة التي ترغب في شرائها؟",
"needToPurchaseGems": "هل تحتاج إلى شراء جواهر كهدية؟"
}

View file

@ -1,8 +1,8 @@
{
"achievement": "Achievement",
"onwards": "Onwards!",
"levelup": "By accomplishing your real life goals, you leveled up and are now fully healed!",
"reachedLevel": "You Reached Level <%= level %>",
"achievementLostMasterclasser": "Quest Completionist: Masterclasser Series",
"achievementLostMasterclasserText": "Completed all sixteen quests in the Masterclasser Quest Series and solved the mystery of the Lost Masterclasser!"
"achievement": "Дасягненьне",
"onwards": "Наперад!",
"levelup": "By accomplishing your real life goals, you leveled up and are now fully healed!",
"reachedLevel": "You Reached Level <%= level %>",
"achievementLostMasterclasser": "Quest Completionist: Masterclasser Series",
"achievementLostMasterclasserText": "Completed all sixteen quests in the Masterclasser Quest Series and solved the mystery of the Lost Masterclasser!"
}

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -340,5 +340,23 @@
"singleCompletion": "Single - Completes when any assigned user finishes",
"allAssignedCompletion": "All - Completes when all assigned users finish",
"pmReported": "Tak, fordi du rapporterede denne besked.",
"features": "Funktioner"
"features": "Funktioner",
"invitedToPartyBy": "<a href=\"/profile/<%- userId %>\" target=\"_blank\">@<%- userName %></a> har inviteret dig til holdet <span class=\"notification-bold\"><%- party %></span>",
"PMUserDoesNotReceiveMessages": "Denne bruger modtager ikke længere private beskeder",
"blockedToSendToThisUser": "Du kan ikke sende til denne spiller da du har blokeret denne spiller.",
"blockYourself": "Du kan ikke blokere dig selv",
"selectGift": "Vælg Gave",
"sendGiftToWhom": "Hvem vil du gerne sende en gave til?",
"PMDisabled": "Slå Private Beskeder fra",
"editGuild": "Rediger Klan",
"sendGiftTotal": "I alt:",
"usernameOrUserId": "Indtast @brugernavn eller Bruger ID",
"sendGiftLabel": "Vil du gerne sende en gavebesked?",
"giftMessageTooLong": "Maximum længe for gavebeskeden er <%= maxGiftMessageLength %>.",
"userWithUsernameOrUserIdNotFound": "Brugernavn eller Bruger ID findes ikke.",
"editParty": "Rediger Hold",
"leaveGuild": "Forlad Klan",
"joinGuild": "Tilslut Klan",
"PMUnblockUserToSendMessages": "Fjern denne brugers blokering for at sende og modtage beskeder.",
"selectSubscription": "Vælg Abonnement"
}

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -867,6 +867,14 @@
"backgroundMangroveForestText": "Mangrove Forest",
"backgroundMangroveForestNotes": "Explore the edge of the Mangrove Forest.",
"backgrounds042023": "SET 107: Released April 2023",
"backgroundLeafyTreeTunnelText": "Leafy Tree Tunnel",
"backgroundLeafyTreeTunnelNotes": "Wander through a Leafy Tree Tunnel.",
"backgroundSpringtimeShowerText": "Springtime Shower",
"backgroundSpringtimeShowerNotes": "See a Flowery Springtime Shower.",
"backgroundUnderWisteriaText": "Under Wisteria",
"backgroundUnderWisteriaNotes": "Relax Under Wisteria.",
"timeTravelBackgrounds": "Steampunk Backgrounds",
"backgroundAirshipText": "Airship",
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",

View file

@ -311,6 +311,7 @@
"hatchingPotionVirtualPet": "Virtual Pet",
"hatchingPotionPorcelain": "Porcelain",
"hatchingPotionPinkMarble": "Pink Marble",
"hatchingPotionTeaShop": "Tea Shop",
"hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> pet.",
"premiumPotionAddlNotes": "Not usable on quest pet eggs. Available for purchase until <%= date(locale) %>.",

View file

@ -1,5 +1,6 @@
{
"frequentlyAskedQuestions": "Frequently Asked Questions",
"general": "General",
"faqQuestion0": "I'm confused. Where do I get an overview?",
"iosFaqAnswer0": "First, you'll set up tasks that you want to do in your everyday life. Then, as you complete the tasks in real life and check them off, you'll earn experience and gold. Gold is used to buy equipment and some items, as well as custom rewards. Experience causes your character to level up and unlock content such as Pets, Skills, and Quests! You can customize your character under Menu > Customize Avatar.\n\n Some basic ways to interact: click the (+) in the upper-right-hand corner to add a new task. Tap on an existing task to edit it, and swipe left on a task to delete it. You can sort tasks using Tags in the upper-left-hand corner, and expand and contract checklists by clicking on the checklist bubble.",
@ -26,10 +27,10 @@
"androidFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you tap a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your Party and one of your Party mates did not complete all their Dailies, the Boss will attack you.\n\n The main way to heal is to gain a level, which restores all your health. You can also buy a Health Potion with gold from the Rewards tab on the Tasks page. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. If you are in a Party with a Healer, they can heal you as well.",
"webFaqAnswer4": "There are several things that can cause you to take damage. First, if you left Dailies incomplete overnight and didn't check them off in the screen that popped up the next morning, those unfinished Dailies will damage you. Second, if you click a bad Habit, it will damage you. Finally, if you are in a Boss Battle with your party and one of your party mates did not complete all their Dailies, the Boss will attack you. The main way to heal is to gain a level, which restores all your Health. You can also buy a Health Potion with Gold from the Rewards column. Plus, at level 10 or above, you can choose to become a Healer, and then you will learn healing skills. Other Healers can heal you as well if you are in a Party with them. Learn more by clicking \"Party\" in the navigation bar.",
"faqQuestion5": "How do I play Habitica with my friends?",
"faqQuestion5": "Can I play Habitica with others?",
"iosFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on Quests, battle monsters, and cast skills to support each other.\n\nIf you want to start your own Party, go to Menu > [Party](https://habitica.com/party) and tap \"Create New Party\". Then scroll down and tap \"Invite a Member\" to invite your friends by entering their @username. If you want to join someone elses Party, just give them your @username and they can invite you!\n\nYou and your friends can also join Guilds, which are public chat rooms that bring people together based on shared interests! There are a lot of helpful and fun communities, be sure to check them out.\n\nIf youre feeling more competitive, you and your friends can create or join Challenges to take on a set of tasks. There are all sorts of public Challenges available that span a wide array of interests and goals. Some public Challenges will even award Gem prizes if youre selected as the winner.",
"androidFaqAnswer5": "The best way is to invite them to a Party with you! Parties can go on quests, battle monsters, and cast skills to support each other. Go to the [website](https://habitica.com/) to create one if you don't already have a Party. You can also join guilds together (Social > Guilds). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many guilds as you'd like, but only one party.\n\n For more detailed info, check out the wiki pages on [Parties](https://habitica.fandom.com/wiki/Party) and [Guilds](https://habitica.fandom.com/wiki/Guilds).",
"webFaqAnswer5": "The best way is to invite them to a Party with you by clicking \"Party\" in the navigation bar! Parties can go on quests, battle monsters, and cast skills to support each other. You can also join Guilds together (click on \"Guilds\" in the navigation bar). Guilds are chat rooms focusing on a shared interest or the pursuit of a common goal, and can be public or private. You can join as many Guilds as you'd like, but only one Party. For more detailed info, check out the wiki pages on [Parties](https://habitica.fandom.com/wiki/Party) and [Guilds](https://habitica.fandom.com/wiki/Guilds).",
"webFaqAnswer5": "Yes, with Parties! You can start your own Party or join an existing one. Partying with other Habitica players is a great way to take on Quests, receive buffs from Party members skills, and boost your motivation with additional accountability.",
"faqQuestion6": "How do I get a Pet or Mount?",
"iosFaqAnswer6": "Every time you complete a task, you'll have a random chance at receiving an Egg, a Hatching Potion, or a piece of Pet Food. They will be stored in Menu > Items.\n\nTo hatch a Pet, you'll need an Egg and a Hatching Potion. Tap on the Egg to determine the species you want to hatch, and select \"Hatch Egg.\" Then choose a Hatching Potion to determine its color! Go to Menu > Pets and click your new Pet to equip it to your Avatar. \n\n You can also grow your Pets into Mounts by feeding them under Menu > Pets. Tap on a Pet, and select \"Feed Pet\"! You'll have to feed a Pet many times before it becomes a Mount, but if you can figure out its favorite food, it will grow more quickly. Use trial and error, or [see the spoilers here](https://habitica.fandom.com/wiki/Food#Food_Preferences). Once you have a Mount, go to Menu > Mounts and tap on it to equip it to your Avatar.\n\nYou can also get Eggs for Quest Pets by completing certain Quests (to learn more about Quests, see [How do I fight monsters and go on Quests](https://habitica.com/static/faq/9)).",
@ -46,10 +47,10 @@
"androidFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 under Menu > Skills. Unlike your health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete Good Habits, Dailies, and To Do's, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.",
"webFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 in the action bar at the bottom of the screen. Unlike your Health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete good Habits, Dailies, and To Do's, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.",
"faqQuestion9": "How do I fight monsters and go on Quests?",
"iosFaqAnswer9": "First, you need to join or start a Party (see [How to play Habitica with my friends](https://habitica.com/static/faq/5)). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Shop for Gold and Gems.\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.",
"androidFaqAnswer9": "First, you need to join or start a Party (see above). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Shop for Gold and Gems.\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.",
"webFaqAnswer9": "First, you need to join or start a Party by clicking \"Party\" in the navigation bar. Although you can battle monsters alone, we recommend playing in a group, because this will make quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating! Next, you need a Quest Scroll, which are stored under Inventory > Quests. There are four ways to get a scroll:\n * When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n * At level 15, you get a Quest-line, i.e., three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively.\n * You can buy Quests from the Quests Shop (Shops > Quests) for Gold and Gems.\n * When you check in to Habitica a certain number of times, you'll be rewarded with Quest Scrolls. You earn a Scroll during your 1st, 7th, 22nd, and 40th check-ins.\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading may be required to see the Boss's Health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.",
"faqQuestion9": "How do I take on Quests?",
"iosFaqAnswer9": "First, you need to join or start a Party by selecting \"Party\" in the navigation. Although you can take on Quests alone, we recommend playing with others to make the Quest faster and boost your motivation with extra accountability.\n\nOnce youre in a Party, you can invite Party members to any Quest scrolls in your Inventory. After everyone accepts, the Quest will begin. To progress, complete your tasks as you normally would! Youll either build up damage against a monster if youre taking on a Boss Quest, or have a chance to find items if youre taking on a Collection Quest. All pending progress is applied the next day.\n\nWhen your Party members do enough damage or collect all items, the Quest ends and everyone will receive their rewards!",
"androidFaqAnswer9": "First, you need to join or start a Party by selecting \"Party\" in the navigation. Although you can take on Quests alone, we recommend playing with others to make the Quest faster and boost your motivation with extra accountability.\n\nOnce youre in a Party, you can invite Party members to any Quest scrolls in your Inventory. After everyone accepts, the Quest will begin. To progress, complete your tasks as you normally would! Youll either build up damage against a monster if youre taking on a Boss Quest, or have a chance to find items if youre taking on a Collection Quest. All pending progress is applied the next day.\n\nWhen your Party members do enough damage or collect all items, the Quest ends and everyone will receive their rewards!",
"webFaqAnswer9": "First, you need to join or start a Party by selecting \"Party\" in the navigation. Although you can take on Quests alone, we recommend playing with others to make the Quest faster and boost your motivation with extra accountability.\n\nOnce youre in a Party, you can invite Party members to any Quest scrolls in your Inventory. After everyone accepts, the Quest will begin. To progress, complete your tasks as you normally would! Youll either build up damage against a monster if youre taking on a Boss Quest, or have a chance to find items if youre taking on a Collection Quest. All pending progress is applied the next day.\n\nWhen your Party members do enough damage or collect all items, the Quest ends and everyone will receive their rewards!",
"faqQuestion10": "What are Gems, and how do I get them?",
"iosFaqAnswer10": "Gems are purchased with real money from Menu > Purchase Gems. When you buy Gems, you are helping us to keep Habitica running. Were very grateful for every bit of support!\n\n In addition to buying Gems directly, there are three other ways players can gain Gems:\n\n * Win a Challenge that has been set up by another player. Go to Menu > Challenges to join some.\n * Subscribe and unlock the ability to buy a certain number of Gems per month.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](https://habitica.fandom.com/wiki/Contributing_to_Habitica).\n\n Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the app without them!",
@ -71,6 +72,63 @@
"androidFaqAnswer13": "## How do Group Plans work?\n\nA [Group Plan](/group-plans) gives your Party or Guild access to a shared task board thats similar to your personal task board! Its a shared Habitica experience where tasks can be created and checked off by anyone in the group.\n\nThere are also features available like member roles, status view, and task assigning that give you a more controlled experience. [Visit our wiki](https://habitica.fandom.com/wiki/Group_Plans) to learn more about our Group Plans features!\n\n## Who benefits from a Group Plan?\n\nGroup Plans work best when you have a small team of people who want to collaborate together. We recommend 2-5 members.\n\nGroup Plans are great for families, whether its a parent and child or you and a partner. Shared goals, chores, or responsibilities are easy to keep track of on one board.\n\nGroup Plans can also be useful for teams of colleagues that have shared goals, or managers that want to introduce their employees to gamification.\n\n## Quick tips for using Groups\n\nHere are some quick tips to get you started with your new Group. Well provide more details in the following sections:\n\n* Make a member a manager to give them the ability to create and edit tasks\n* Leave tasks unassigned if anyone can complete it and it only needs done once\n* Assign a task to one person to make sure no one else can complete their task\n* Assign a task to multiple people if they all need to complete it\n* Toggle the ability to display shared tasks on your personal board to not miss anything\n* You get rewarded for the tasks you complete, even multi-assigned\n* Task completion rewards arent shared or split between Team members\n* Use task color on the team board to judge the average completion rate of tasks\n* Regularly review the tasks on your Team Board to make sure they are still relevant\n* Missing a Daily wont damage you or your team, but the task will degrade in color\n\n## How can others in the group create tasks?\n\nOnly the group leader and managers can create tasks. If youd like a group member to be able to create tasks, then you should promote them to be a manager by going to the Group Information tab, viewing the member list, and clicking the dot icon by their name.\n\n## How does assigning a task work?\n\nGroup Plans give you the unique ability to assign tasks to other group members. Assigning a task is great for delegating. If you assign a task to someone, then other members are prevented from completing it.\n\nYou can also assign a task to multiple people if it needs to be completed by more than one member. For example, if everyone has to brush their teeth, create a task and assign it to each group member. They will all be able to check it off and get their individual rewards for doing so. The main task will show as complete once everyone checks it off.\n\n## How do unassigned tasks work?\n\nUnassigned tasks can be completed by anyone in the group, so leave a task unassigned to allow any member to complete it. For example, taking out the trash. Whoever takes out the trash can check off the unassigned task and it will show as completed for everyone.\n\n## How does the synchronized day reset work?\n\nShared tasks will reset at the same time for everyone to keep the shared task board in sync. This time is visible on the shared task board and is determined by the group leaders day start time. Because shared tasks reset automatically, you will not get a chance to complete yesterdays uncompleted shared Dailies when you check in the next morning.\n\nShared Dailies will not do damage if they are missed, however they will degrade in color to help visualize progress. We dont want the shared experience to be a negative one!\n\n## How do I use my Group on the mobile apps?\n\nWhile the mobile apps dont fully support all Group Plans functionality yet, you can still complete shared tasks from the iOS and Android app by copying the tasks onto your personal task board. You can switch this preference on from Settings in the mobile apps or from the group task board on the browser version. Now open and assigned shared tasks will display on your personal task board across all platforms.\n\n## Whats the difference between a Groups shared tasks and Challenges?\n\nGroup Plan shared task boards are more dynamic than Challenges, in that they can constantly be updated and interacted with. Challenges are great if you have one set of tasks to send out to many people.\n\nGroup Plans are also a paid feature, while Challenges are available free to everyone.\n\nYou cannot assign specific tasks in Challenges, and Challenges do not have a shared day reset. In general, Challenges offer less control and direct interaction.",
"webFaqAnswer13": "## How do Group Plans work?\n\nA [Group Plan](/group-plans) gives your Party or Guild access to a shared task board thats similar to your personal task board! Its a shared Habitica experience where tasks can be created and checked off by anyone in the group.\n\nThere are also features available like member roles, status view, and task assigning that give you a more controlled experience. [Visit our wiki](https://habitica.fandom.com/wiki/Group_Plans) to learn more about our Group Plans features!\n\n## Who benefits from a Group Plan?\n\nGroup Plans work best when you have a small team of people who want to collaborate together. We recommend 2-5 members.\n\nGroup Plans are great for families, whether its a parent and child or you and a partner. Shared goals, chores, or responsibilities are easy to keep track of on one board.\n\nGroup Plans can also be useful for teams of colleagues that have shared goals, or managers that want to introduce their employees to gamification.\n\n## Quick tips for using Groups\n\nHere are some quick tips to get you started with your new Group. Well provide more details in the following sections:\n\n* Make a member a manager to give them the ability to create and edit tasks\n* Leave tasks unassigned if anyone can complete it and it only needs done once\n* Assign a task to one person to make sure no one else can complete their task\n* Assign a task to multiple people if they all need to complete it\n* Toggle the ability to display shared tasks on your personal board to not miss anything\n* You get rewarded for the tasks you complete, even multi-assigned\n* Task completion rewards arent shared or split between Team members\n* Use task color on the team board to judge the average completion rate of tasks\n* Regularly review the tasks on your Team Board to make sure they are still relevant\n* Missing a Daily wont damage you or your team, but the task will degrade in color\n\n## How can others in the group create tasks?\n\nOnly the group leader and managers can create tasks. If youd like a group member to be able to create tasks, then you should promote them to be a manager by going to the Group Information tab, viewing the member list, and clicking the dot icon by their name.\n\n## How does assigning a task work?\n\nGroup Plans give you the unique ability to assign tasks to other group members. Assigning a task is great for delegating. If you assign a task to someone, then other members are prevented from completing it.\n\nYou can also assign a task to multiple people if it needs to be completed by more than one member. For example, if everyone has to brush their teeth, create a task and assign it to each group member. They will all be able to check it off and get their individual rewards for doing so. The main task will show as complete once everyone checks it off.\n\n## How do unassigned tasks work?\n\nUnassigned tasks can be completed by anyone in the group, so leave a task unassigned to allow any member to complete it. For example, taking out the trash. Whoever takes out the trash can check off the unassigned task and it will show as completed for everyone.\n\n## How does the synchronized day reset work?\n\nShared tasks will reset at the same time for everyone to keep the shared task board in sync. This time is visible on the shared task board and is determined by the group leaders day start time. Because shared tasks reset automatically, you will not get a chance to complete yesterdays uncompleted shared Dailies when you check in the next morning.\n\nShared Dailies will not do damage if they are missed, however they will degrade in color to help visualize progress. We dont want the shared experience to be a negative one!\n\n## How do I use my Group on the mobile apps?\n\nWhile the mobile apps dont fully support all Group Plans functionality yet, you can still complete shared tasks from the iOS and Android app by copying the tasks onto your personal task board. You can switch this preference on from Settings in the mobile apps or from the group task board on the browser version. Now open and assigned shared tasks will display on your personal task board across all platforms.\n\n## Whats the difference between a Groups shared tasks and Challenges?\n\nGroup Plan shared task boards are more dynamic than Challenges, in that they can constantly be updated and interacted with. Challenges are great if you have one set of tasks to send out to many people.\n\nGroup Plans are also a paid feature, while Challenges are available free to everyone.\n\nYou cannot assign specific tasks in Challenges, and Challenges do not have a shared day reset. In general, Challenges offer less control and direct interaction.",
"parties": "Parties",
"faqQuestion14": "How do I find a Party when I'm not in one?",
"iosFaqAnswer14": "If you want to experience Habitica with others but dont know other players, searching for a Party is your best option! If you already know other players that have a Party, you can share your @username with them to be invited. Alternatively, you can create a new Party and invite them with their @username or email address.\n\nTo create or search for a Party, select “Party” in the navigation then choose the option that works for you.",
"androidFaqAnswer14": "If you want to experience Habitica with others but dont know other players, searching for a Party is your best option! If you already know other players that have a Party, you can share your @username with them to be invited. Alternatively, you can create a new Party and invite them with their @username or email address.\n\nTo create or search for a Party, select “Party” in the navigation then choose the option that works for you.",
"webFaqAnswer14": "If you want to experience Habitica with others but dont know other players, searching for a Party is your best option! If you already know other players that have a Party, you can share your @username with them to be invited. Alternatively, you can create a new Party and invite them with their @username or email address.\n\nTo create or search for a Party, select “Party” in the navigation then choose the option that works for you.",
"faqQuestion15": "How does searching for a Party work?",
"iosFaqAnswer15": "After selecting “Look for a Party” in the Party pop-up, youll be added to a list of players that want to join a Party. Party leaders can view this list and send invitations. Once you receive an invitation, you can accept it from your notifications to join the Party of your choosing!\n\nYou may get multiple invitations to different Parties. However, you can only be a member of one Party at a time.",
"androidFaqAnswer15": "After selecting “Look for a Party” in the Party pop-up, youll be added to a list of players that want to join a Party. Party leaders can view this list and send invitations. Once you receive an invitation, you can accept it from your notifications to join the Party of your choosing!\n\nYou may get multiple invitations to different Parties. However, you can only be a member of one Party at a time.",
"webFaqAnswer15": "After selecting “Look for a Party” in the Party pop-up, youll be added to a list of players that want to join a Party. Party leaders can view this list and send invitations. Once you receive an invitation, you can accept it from your notifications to join the Party of your choosing!\n\nYou may get multiple invitations to different Parties. However, you can only be a member of one Party at a time.",
"faqQuestion16": "How long can I search for a Party after joining the list?",
"iosFaqAnswer16": "You will remain in the list until you accept an invite to a Party or dont login for 7 days, whichever comes first.",
"androidFaqAnswer16": "You will remain in the list until you accept an invite to a Party or dont login for 7 days, whichever comes first.",
"webFaqAnswer16": "You will remain in the list until you accept an invite to a Party or dont login for 7 days, whichever comes first.",
"faqQuestion17": "Can I stop searching for a Party?",
"iosFaqAnswer17": "You can leave the list at any time. To stop searching for Party on the website, select the “Party” link in the navigation then click “Leave” in the pop-up.",
"androidFaqAnswer17": "You can leave the list at any time. To stop searching for Party on the website, select the “Party” link in the navigation then click “Leave” in the pop-up.",
"webFaqAnswer17": "You can leave the list at any time. To stop searching for Party on the website, select the “Party” link in the navigation then click “Leave” in the pop-up.",
"faqQuestion18": "I have a Party, how do I find more members?",
"iosFaqAnswer18": "If you are using Habiticas website, select “Find Members” from the Party dropdown. This will display a list of Habitica players that are actively looking for a Party and can be invited to join.\n\nYou'll see some information, such as language, class, level, and how many days they have used Habitica to help find a good fit for your Party. If youd like to chat with someone before sending an invite, you can view their Profile and send a message.",
"androidFaqAnswer18": "If you are using Habiticas website, select “Find Members” from the Party dropdown. This will display a list of Habitica players that are actively looking for a Party and can be invited to join.\n\nYou'll see some information, such as language, class, level, and how many days they have used Habitica to help find a good fit for your Party. If youd like to chat with someone before sending an invite, you can view their Profile and send a message.",
"webFaqAnswer18": "If you are using Habiticas website, select “Find Members” from the Party dropdown. This will display a list of Habitica players that are actively looking for a Party and can be invited to join.\n\nYou'll see some information, such as language, class, level, and how many days they have used Habitica to help find a good fit for your Party. If youd like to chat with someone before sending an invite, you can view their Profile and send a message.",
"faqQuestion19": "How many members can I invite to my Party?",
"iosFaqAnswer19": "Parties have a maximum limit of 30 members and a minimum of 1 member. Pending invites count towards the member count. For example, 29 members and 1 pending invite would count as 30 members. To clear a pending invite, the invited player must accept or decline, or the Party leader must cancel the invite.",
"androidFaqAnswer19": "Parties have a maximum limit of 30 members and a minimum of 1 member. Pending invites count towards the member count. For example, 29 members and 1 pending invite would count as 30 members. To clear a pending invite, the invited player must accept or decline, or the Party leader must cancel the invite.",
"webFaqAnswer19": "Parties have a maximum limit of 30 members and a minimum of 1 member. Pending invites count towards the member count. For example, 29 members and 1 pending invite would count as 30 members. To clear a pending invite, the invited player must accept or decline, or the Party leader must cancel the invite.",
"faqQuestion20": "Can I invite someone I already know?",
"iosFaqAnswer20": "Yes! If you already have a Habitica players username or email address, you can invite them to join your Party. Heres how to send an invite on the different platforms:\n\n## On Habiticas website\n\nNavigate to your Party and click “Invite to Party” on the right-hand side of the page.\n\n## On iOS and Android\n\nTap “Party” from the Menu. Scroll to the Members section and tap “Invite a Member”.",
"androidFaqAnswer20": "Yes! If you already have a Habitica players username or email address, you can invite them to join your Party. Heres how to send an invite on the different platforms:\n\n## On Habiticas website\n\nNavigate to your Party and click “Invite to Party” on the right-hand side of the page.\n\n## On iOS and Android\n\nTap “Party” from the Menu. Scroll to the Members section and tap “Invite a Member”.",
"webFaqAnswer20": "Yes! If you already have a Habitica players username or email address, you can invite them to join your Party. Heres how to send an invite on the different platforms:\n\n## On Habiticas website\n\nNavigate to your Party and click “Invite to Party” on the right-hand side of the page.\n\n## On iOS and Android\n\nTap “Party” from the Menu. Scroll to the Members section and tap “Invite a Member”.",
"faqQuestion21": "How do I cancel a pending invitation to my Party?",
"iosFaqAnswer21": "To cancel a pending invitation on Habiticas website:\n\n1. Click on Member list when viewing your Party\n\n2. Click the “Invites” tab\n\n3. Click the three dots beside the users invite you wish to cancel\n\n4. Choose “Cancel Invite”\n\n\n\nYoull be able to cancel a pending invitation from the mobile apps soon as well!",
"androidFaqAnswer21": "To cancel a pending invitation on Habiticas website:\n\n1. Click on Member list when viewing your Party\n\n2. Click the “Invites” tab\n\n3. Click the three dots beside the users invite you wish to cancel\n\n4. Choose “Cancel Invite”\n\n\n\nYoull be able to cancel a pending invitation from the mobile apps soon as well!",
"webFaqAnswer21": "To cancel a pending invitation on Habiticas website:\n\n1. Click on Member list when viewing your Party\n\n2. Click the “Invites” tab\n\n3. Click the three dots beside the users invite you wish to cancel\n\n4. Choose “Cancel Invite”\n\n\n\nYoull be able to cancel a pending invitation from the mobile apps soon as well!",
"faqQuestion22": "How do I stop unwanted invitations?",
"iosFaqAnswer22": "Once you join a Party youll stop receiving any more invitations. If you want to prevent invites and future communications from a specific player, view their profile and click the Block button.\n\nIf you encounter a situation where you believe another player has broken our Community Guidelines in their name, profile, or a message they sent, please report any messages or reach out to us at admin@habitica.com.",
"androidFaqAnswer22": "Once you join a Party youll stop receiving any more invitations. If you want to prevent invites and future communications from a specific player, view their profile and click the Block button.\n\nIf you encounter a situation where you believe another player has broken our Community Guidelines in their name, profile, or a message they sent, please report any messages or reach out to us at admin@habitica.com.",
"webFaqAnswer22": "Once you join a Party youll stop receiving any more invitations. If you want to prevent invites and future communications from a specific player, view their profile and click the Block button.\n\nIf you encounter a situation where you believe another player has broken our Community Guidelines in their name, profile, or a message they sent, please report any messages or reach out to us at admin@habitica.com.",
"faqQuestion23": "How do I filter the list of members searching for a Party?",
"iosFaqAnswer23": "At the moment there is no way to filter the list of members searching for a Party. However, we have plans to introduce filters in the future, such as class, level, and language.",
"androidFaqAnswer23": "At the moment there is no way to filter the list of members searching for a Party. However, we have plans to introduce filters in the future, such as class, level, and language.",
"webFaqAnswer23": "At the moment there is no way to filter the list of members searching for a Party. However, we have plans to introduce filters in the future, such as class, level, and language.",
"faqQuestion24": "How do I search for a Party on Android or iOS?",
"iosFaqAnswer24": "Were working on adding the ability to search for a Party and find Party members on mobile soon! Keep an eye out for Android version 4.2 and iOS version 3.8.",
"androidFaqAnswer24": "Were working on adding the ability to search for a Party and find Party members on mobile soon! Keep an eye out for Android version 4.2 and iOS version 3.8.",
"webFaqAnswer24": "Were working on adding the ability to search for a Party and find Party members on mobile soon! Keep an eye out for Android version 4.2 and iOS version 3.8.",
"iosFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.",
"androidFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.",
"webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), come ask in the [Habitica Help guild](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! We're happy to help."

View file

@ -177,7 +177,7 @@
"joinToday": "Join Habitica Today",
"featuredIn": "Featured in",
"signup": "Sign Up",
"getStarted": "Get Started!",
"getStarted": "Get Started",
"mobileApps": "Mobile Apps",
"learnMore": "Learn More",
"translateHabitica": "Translate Habitica"

View file

@ -2230,6 +2230,8 @@
"headArmoireFancyPirateHatNotes": "Be protected from the sun and any seagulls flying overhead as you drink tea on the deck of your ship. Increases Perception by <%= per %>. Enchanted Armoire: Fancy Pirate Set (Item 2 of 3).",
"headArmoireTeaHatText": "Tea Party Hat",
"headArmoireTeaHatNotes": "This elegant hat is both fancy and functional. Increases Perception by <%= per %>. Enchanted Armoire: Tea Party Set (Item 2 of 3).",
"headArmoireBeaniePropellerHatText": "Beanie Propeller Hat",
"headArmoireBeaniePropellerHatNotes": "This isnt the time to keep your feet on the ground! Spin this little propeller and rise as high as your ambitions will take you. Increases all stats by <%= attrs %>. Enchanted Armoire: Independent Item.",
"offhand": "off-hand item",
"offHandCapitalized": "Off-Hand Item",
@ -2715,6 +2717,8 @@
"backMystery202301Notes": "These fluffy tails contain ethereal power and also a high level of charm! Confers no benefit. January 2023 Subscriber Item.",
"backMystery202302Text": "Trickster Tabby Tail",
"backMystery202302Notes": "Anytime you wear this tail it's sure to be a frabjous day! Callooh! Callay! Confers no benefit. February 2023 Subscriber Item.",
"backMystery202305Text": "Eventide Wings",
"backMystery202305Notes": "Catch the sparkle of the evening star and soar to strange realms on these wings. Confers no benefit. May 2023 Subscriber Item.",
"backSpecialWonderconRedText": "Mighty Cape",
"backSpecialWonderconRedNotes": "Swishes with strength and beauty. Confers no benefit. Special Edition Convention Item.",
@ -2926,6 +2930,8 @@
"headAccessoryMystery202212Notes": "Magnify your warmth and friendship to new heights with this ornate golden tiara. Confers no benefit. December 2022 Subscriber Item.",
"headAccessoryMystery202302Text": "Trickster Tabby Ears",
"headAccessoryMystery202302Notes": "The purr-fect accessory to set off your enchanting grin. Confers no benefit. February 2023 Subscriber Item.",
"headAccessoryMystery202305Text": "Eventide Horns",
"headAccessoryMystery202305Notes": "These horns glow with reflected moonlight. Confers no benefit. May 2023 Subscriber Item.",
"headAccessoryMystery301405Text": "Headwear Goggles",
"headAccessoryMystery301405Notes": "\"Goggles are for your eyes,\" they said. \"Nobody wants goggles that you can only wear on your head,\" they said. Hah! You sure showed them! Confers no benefit. August 3015 Subscriber Item.",

View file

@ -212,5 +212,9 @@
"contactForm": "Contact the Moderation Team",
"loadEarlierMessages": "Load Earlier Messages",
"askQuestion": "Ask a Question",
"emptyReportBugMessage": "Report Bug Message missing"
"emptyReportBugMessage": "Report Bug Message missing",
"refreshList": "Refresh List",
"leaveHabitica": "You are about to leave Habitica.com",
"leaveHabiticaText": "Habitica is not responsible for the content of any linked website that is not owned or operated by HabitRPG.<br>Please note that these websites' practices may differ from Habiticas community guidelines.",
"skipExternalLinkModal": "Hold CTRL (Windows) or Command (Mac) when clicking a link to skip this modal."
}

View file

@ -138,7 +138,9 @@
"sendGiftSubscription": "<%= months %> Month(s): $<%= price %> USD",
"gemGiftsAreOptional": "Please note that Habitica will never require you to gift gems to other players. Begging people for gems is a <strong>violation of the Community Guidelines</strong>, and all such instances should be reported to <%= hrefTechAssistanceEmail %>.",
"giftMessageTooLong": "The maximum length for gift messages is <%= maxGiftMessageLength %>.",
"battleWithFriends": "Battle Monsters With Friends",
"battleWithFriends": "Play Habitica with Others",
"questWithOthers": "Take on Quests with Others",
"startPartyDetail": "Start your own Party or join an existing one <br/>to take on Quests and boost your motivation!",
"startAParty": "Start a Party",
"partyUpName": "Party Up",
"partyOnName": "Party On",
@ -174,6 +176,7 @@
"usernamesMustBeAnArray": "Username invites must be an array.",
"canOnlyInviteMaxInvites": "You can only invite \"<%= maxInvites %>\" at a time",
"partyExceedsMembersLimit": "Party size is limited to <%= maxMembersParty %> members",
"partyExceedsInvitesLimit": "A Party may only have up to <%= maxInvites %> pending invitations.",
"onlyCreatorOrAdminCanDeleteChat": "Not authorized to delete this message!",
"onlyGroupLeaderCanEditTasks": "Not authorized to manage tasks!",
"onlyGroupTasksCanBeAssigned": "Only group tasks can be assigned",
@ -289,17 +292,20 @@
"noGuildsParagraph2": "Click the Discover tab to see recommended Guilds based on your interests, browse Habitica's public Guilds, or create your own Guild.",
"noGuildsMatchFilters": "We couldn't find any matching Guilds.",
"privateDescription": "A private Guild will not be displayed in Habitica's Guild directory. New members can be added by invitation only.",
"removeInvite": "Remove Invitation",
"removeInvite": "Cancel Invite",
"removeMember": "Remove Member",
"sendMessage": "Send Message",
"promoteToLeader": "Transfer Ownership",
"inviteFriendsParty": "Inviting friends to your Party will grant you an exclusive <br/> Quest Scroll to battle the Basi-List together!",
"inviteFriendsParty": "Invite another player to your Party<br/> and receive the exclusive Basi-List Quest Scroll.",
"createParty": "Create a Party",
"inviteMembersNow": "Would you like to invite members now?",
"playInPartyTitle": "Play Habitica in a Party!",
"playInPartyDescription": "Take on amazing quests with friends or on your own. Battle monsters, create Challenges, and help yourself stay accountable through Parties.",
"wantToJoinPartyTitle": "Want to join a Party?",
"playInPartyDescription": "Take on amazing Quests with friends or on your own. Battle monsters, create Challenges, and help yourself stay accountable through Parties.",
"wantToJoinPartyTitle": "Looking for a Party?",
"wantToJoinPartyDescription": "Give your username to a friend who already has a Party, or head to the <a href='/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'>Party Wanted Guild</a> to meet potential comrades!",
"lookForParty": "Look for a Party",
"currentlyLookingForParty": "Youre looking for a Party!",
"partyFinderDescription": "Want to join a Party with others but dont know any other players? Let Party leaders know youre looking for an invite!",
"copy": "Copy",
"questOwnerRewards": "Quest Owner Rewards",
"updateParty": "Update Party",
@ -403,5 +409,13 @@
"newGroupsBullet10b": "<strong>Assign a task to one member</strong> so only they can complete it",
"newGroupsBullet10c": "<strong>Assign a task to multiple members</strong> if they all need to complete it",
"newGroupsVisitFAQ": "Visit the <a href='/static/faq#group-plans' target='_blank'>FAQ</a> from the Help dropdown for more guidance.",
"newGroupsEnjoy": "We hope you enjoy the new Group Plans experience!"
"newGroupsEnjoy": "We hope you enjoy the new Group Plans experience!",
"checkinsLabel": "Check-ins:",
"classLabel": "Class:",
"languageLabel": "Language:",
"invitedToYourParty": "<strong>Invited to Your Party!</strong>&nbsp;&nbsp;Click to Undo",
"lookingForPartyTitle": "Find Members",
"findMorePartyMembers": "Find More Members",
"findPartyMembers": "Find Party Members",
"noOneLooking": "Theres no one looking for a Party right now.<br>You can check back later!"
}

View file

@ -109,7 +109,7 @@
"toDo": "To Do",
"tourStatsPage": "This is your Stats page! Earn achievements by completing the listed tasks.",
"tourTavernPage": "Welcome to the Tavern, an all-ages chat room! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Pause Damage\". Come say hi!",
"tourPartyPage": "Your Party will help you stay accountable. Invite friends to unlock a Quest Scroll!",
"tourPartyPage": "Welcome to your new Party! You can invite other players to your Party by username, email, or from a list of players looking for a Party to earn the exclusive Basi-List Quest Scroll.<br/><br/>Select <a href='/static/faq#parties'>FAQ</a> from the Help dropdown to learn more about how Parties work.",
"tourGuildsPage": "Guilds are common-interest chat groups created by the players, for the players. Browse through the list and join the Guilds that interest you. Be sure to check out the popular Habitica Help: Ask a Question guild, where anyone can ask questions about Habitica!",
"tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win Gem prizes!",
"tourMarketPage": "Every time you complete a task, you'll have a random chance at receiving an Egg, a Hatching Potion, or a piece of Pet Food. You can also buy these items here.",

View file

@ -149,6 +149,7 @@
"mysterySet202302": "Trickster Tabby Set",
"mysterySet202303": "Mane Character Set",
"mysterySet202304": "Tiptop Teapot Set",
"mysterySet202305": "Eventide Dragon Set",
"mysterySet301404": "Steampunk Standard Set",
"mysterySet301405": "Steampunk Accessories Set",
"mysterySet301703": "Peacock Steampunk Set",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Squadron members git an exclusive Jackalope Steed, as well as full subscr'ption benefits, includin' special monthly equipment sets an' th' ability t' buy sapphires wit' gold.",
"inspireYourParty": "Inspire yer crew, gamify life togeth'r.",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -144,5 +144,8 @@
"achievementPolarPro": "Experto Polar",
"achievementPolarProModalText": "¡Has coleccionado todas las mascotas Polares!",
"achievementBoneToPickModalText": "¡Has coleccionado todas las mascotas clásicas y de misiones esqueléticas!",
"achievementPolarProText": "¡Ha eclosionado todos los colores estándar para mascotas Polares: Osos, Zorros, Pinguinos, Ballenas y Lobos!"
"achievementPolarProText": "¡Ha eclosionado todos los colores estándar para mascotas Polares: Osos, Zorros, Pinguinos, Ballenas y Lobos!",
"achievementPlantParent": "Progenitor de las Plantas",
"achievementPlantParentText": "¡Ha eclosionado todos los colores estándar para las mascotas Planta: Cáctus y Esqueje de árbol!",
"achievementPlantParentModalText": "¡Has coleccionado todas las Mascotas Planta!"
}

View file

@ -675,7 +675,7 @@
"backgroundOrangeGroveText": "Naranjal",
"backgroundOrangeGroveNotes": "Deambula por un naranjal fragante.",
"backgrounds022022": "93.ª serie: publicada en febrero de 2022",
"backgrounds032022": "94.ª serie: publiccada en marzo de 2022",
"backgrounds032022": "94.ª serie: publicada en marzo de 2022",
"backgroundBrickWallWithIvyText": "Pared de Ladrillo con Hiedra",
"backgroundBrickWallWithIvyNotes": "Admira una Pared de Ladrillo con Hiedra.",
"backgrounds042022": "95ª. serie: publicada en abril de 2022",
@ -762,5 +762,10 @@
"backgrounds112022": "102ª serie: publicada en noviembre del 2022",
"backgroundAmongGiantMushroomsText": "Entre setas gigantes",
"backgroundAmongGiantMushroomsNotes": "Maravillate con las setas gigantes.",
"backgroundSnowyVillageNotes": "Admira un pueblo nevado."
"backgroundSnowyVillageNotes": "Admira un pueblo nevado.",
"backgroundOldTimeyBasketballCourtNotes": "Echa unas canastas en una cancha de baloncesto antigua.",
"backgroundMangroveForestText": "Bosque de Manglares",
"backgroundMangroveForestNotes": "Explora las lindes del Bosque de Manglares.",
"backgrounds032023": "106.ª serie: publicada en marzo de 2023",
"backgroundOldTimeyBasketballCourtText": "Cancha de Baloncesto Antigua"
}

View file

@ -17,42 +17,42 @@
"commGuideList02G": "<strong>Cumple inmediatamente con cualquier solicitud de un mod</strong>. Esto podría incluir, entre otras cosas, que te pida limitar tus publicaciones en un espacio en particular, editar tu perfil para eliminar contenido inadecuado, pedirte que traslades un debate a un espacio más adecuado, etc. No discutas con la Administración. Si tienes alguna preocupación o comentario sobre la moderación, envía un email a <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> para contactar con nuestro community manager.",
"commGuideList02J": "<strong>No mandes correo no deseados</strong>. Esto puede incluir, entre otros: publicar el mismo comentario o consulta en varios lugares, <strong>publicar enlaces sin explicación ni contexto</strong>, publicar mensajes sin sentido, publicar varios mensajes promocionales sobre un Gremio, Grupo o Desafío, o publicar muchos mensajes seguidos. Si te beneficias de que la gente haga clic en un enlace, debes explicarlo en el texto del mensaje o también se considerará correo no deseado. Los mods pueden decidir qué constituye correo no deseado a su discreción.",
"commGuideList02K": "<strong>Evita publicar encabezados grandes en los espacios públicos, especialmente en la Taberna</strong>. Al igual que TODO EN MAYÚSCULA, se lee como si estuvieras gritando, e interfiere con un ambiente cómodo.",
"commGuideList02L": "<strong>Desaconsejamos encarecidamente el intercambio de información personal, en particular, información que pueda utilizarse para identificarte, en espacios públicos</strong>. La información identificadora puede incluir, entre otros: tu dirección personal, tu dirección de correo electrónico y tu token de API/contraseña. ¡Esto es por tu seguridad! El personal o los moderadores pueden eliminar tales publicaciones a su discreción. Si se te solicita información personal en un Gremio, Equipo o MP, recomendamos encarecidamente que lo rechaces educadamente y avises al personal y a los moderadores de alguna de las siguientes maneras: 1) marcando el mensaje, o 2) enviando un correo a <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> e incluyendo capturas de pantalla.",
"commGuideList02L": "<strong>Desaconsejamos encarecidamente el intercambio de información personal, en particular, información que pueda utilizarse para identificarte, en espacios públicos</strong>. La información identificadora puede incluir, entre otros: tu dirección personal, tu dirección de correo electrónico y tu token de API/contraseña. ¡Esto es por tu seguridad! El personal puede eliminar tales publicaciones a su discreción. Si se te solicita información personal en un Gremio, Equipo o MP, recomendamos encarecidamente que lo rechaces educadamente y avises al personal de cualquiera de las siguientes maneras: 1) marcando el mensaje, o 2) enviando un correo a <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> e incluyendo capturas de pantalla.",
"commGuidePara019": "<strong>En espacios privados</strong>, los usuarios tienen más libertada para debatir los temas que deseen, pero aun así no deben violar los Términos y Condiciones, incluyendo colgar insultos o cualquier contenido discriminatorio, violento o amenazante. Tened en cuenta que, dado que los nombres de los Desafíos aparecen en el perfil público del ganador, TODOS los desafíos deben obedecer las Normas de Espacios Públicos, incluso si aparecen en espacios privados.",
"commGuidePara020": "<strong>Mensajes privados (PMs)</strong> tienen algunas reglas adicionales. Si alguien te ha bloqueado, no contactes con él a través de otro medio para pedir que te desbloquee. Tampoco envíes mensajes privados pidiendo ayuda (ya que las respuestas públicas a dudas o preguntas pueden ser de utilidad para toda la comunidad). Por último, no envíes mensajes privados mendigando contenido de pago de ningún tipo.",
"commGuidePara020A": "<strong>Si ves una publicación o un mensaje directo que crees que supone una violación de las Normas de Espacios Públicos, o si ves una publicación o un mensaje directo que te preocupa o incomoda, puedes llamar la atención de los Moderadores y del Personal sobre esa publicación haciendo click en el icono de la bandera roja para reportarlo</strong>. Un miembro del Personal o un Moderador responderá a la situación lo más pronto posible. Por favor, ten en cuenta que reportar intencionadamente publicaciones inocentes es una infracción de estas Normas (mira debajo en \"Infracciones\"). También puedes contactar a los Moderadores enviando un correo electrónico a <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>. Es preferible hacer esto si hay varias publicaciones problemáticas de la misma persona en distintos Gremios, o si la situación necesita explicación. Puedes contactarnos en tu idioma nativo si te resulta más fácil: es posible que tengamos que usar el Traductor de Google, pero queremos que te sientas cómodo contactando con nosotros si tienes un problema.",
"commGuidePara020A": "<strong>Si ves una publicación o un mensaje directo que crees que supone una violación de las Normas de Espacios Públicos, o si ves una publicación o un mensaje directo que te preocupa o incomoda, puedes llamar la atención del Personal sobre esa publicación haciendo click en el icono de la bandera roja para reportarlo</strong>. Un miembro del Personal responderá a la situación lo más pronto posible. Por favor, ten en cuenta que reportar intencionadamente publicaciones inocentes es una infracción de estas Normas (mira debajo en \"Infracciones\"). También puedes contactar al Personal enviando un correo electrónico a <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>. Es preferible hacer esto si hay varias publicaciones problemáticas de la misma persona en distintos Gremios, o si la situación necesita explicación. Puedes contactarnos en tu idioma nativo si te resulta más fácil: es posible que tengamos que usar el Traductor de Google, pero queremos que te sientas cómodo contactando con nosotros si tienes un problema.",
"commGuidePara021": "Además, algunos espacios públicos de Habitica tienen normas adicionales.",
"commGuideHeadingTavern": "La Taberna",
"commGuidePara022": "La Taberna es el lugar principal para que los Habiticanos socialicen. Daniel el tabernero mantiene el lugar limpio y ordenado, y, con gusto, Lemoness hará aparecer limonada mientras tú te sientas y charlas. Tan solo ten en cuenta…",
"commGuidePara023": "<strong>La conversación tiende a girar en torno a charlas casuales y consejos sobre productividad o cómo mejorar a vida</strong>. Debido a que la sala de chat de la Taberna solo puede contener 200 mensajes, <strong>no es un lugar apropiado para conversaciones prolongadas sobre algunos temas, especialmente los más delicados</strong> (por ejemplo: política, religión, depresión, si se debe vetar o no la caza de trasgos, etc.). Estas conversaciones deben llevarse a un Gremio de temática aplicable. Un Mod puede dirigirte a un Gremio adecuado, pero en última instancia es tu responsabilidad buscar y publicar en el lugar apropiado.",
"commGuidePara023": "<strong>La conversación tiende a girar en torno a charlas casuales y consejos sobre productividad o cómo mejorar a vida</strong>. Debido a que la sala de chat de la Taberna solo puede contener 200 mensajes, <strong>no es un lugar apropiado para conversaciones prolongadas sobre algunos temas, especialmente los más delicados o polémicos</strong> (por ejemplo: política, religión, depresión, si se debe vetar o no la caza de trasgos, etc.). Estas conversaciones deben llevarse a un Gremio de temática aplicable. El Personal puede dirigirte a un Gremio adecuado, pero en última instancia es tu responsabilidad buscar y publicar en el lugar apropiado.",
"commGuidePara024": "<strong>No converses sobre nada adictivo en la Taberna</strong>. Mucha gente usa Habitica para intentar dejar sus Malos Hábitos. ¡Escuchar a otros hablar de sustancias adictivas/ilegales puede hacer más difícil su propósito! Respeta a tus compañeros de la Taberna, y ten en cuenta esto. Incluye, pero no exclusivamente: fumar, alcohol, pornografía, juegos de apuesta, y uso/abuso de drogas.",
"commGuidePara027": "<strong>Cuando un moderador te indica que lleves una conversación a otro lugar, si no hay un Gremio relacionado, es posible que te sugiera utilizar el Rincón Trasero</strong>. El \"Back Corner Guild\" es un espacio público gratuito para debatir sobre temas potencialmente delicados que solo debería usarse cuando un moderador lo dirija. Es monitoreado cuidadosamente por el equipo de moderación. No es un lugar para discusiones generales o conversaciones, y un mod te dirigirá allí solo cuando sea apropiado.",
"commGuideHeadingPublicGuilds": "Gremios Públicos",
"commGuidePara029": "<strong>Los Gremios Públicos se parecen mucho a la Taberna, con la excepción de que en lugar de centrarse en conversaciones generales, tienen un tema central</strong>. La sala de chat de los Gremios Públicos deben enfocarse en estos temas. Por ejemplo, los miembros del gremio de \"Wordsmiths Guild\" podrían enfadarse si la conversación se centra repentinamente en la jardinería en lugar de en la escritura, y un gremio de Fanáticos del Dragón podría no mostrar interés en descifrar runas antiguas. Algunos Gremios se muestran más permisivos con este tema que otros, pero en general, <strong>¡trata de no salirte del tema</strong>!",
"commGuidePara031": "En algunos Gremios públicos se tratan temas delicados como la depresión, la religión, la política, etc. Esto no supone un problema siempre que las conversaciones no infrinjan los Términos y Condiciones ni las Normas de Espacios Públicos, y siempre que lo que se hable sea relevante.",
"commGuidePara033": "<strong>Los Gremios Públicos NO pueden contener contenidos para 18+. Si planean debatir regularmente contenido sensible, deberían decirlo en la descripción del Gremio</strong>. Esto sirve para mantener Habitica segura y cómoda para todos.",
"commGuidePara035": "<strong>Si en el Gremio en cuestión se tratan cuestiones delicadas de cualquier tipo, es respetuoso para con tus compañeros Habiticanos publicar tu comentario a continuación de una advertencia (por ejemplo: \"Advertencia: referencias a autolesión\")</strong>. Estas pueden presentarse como mensajes de advertencia y/o notas sobre el contenido, y los Gremios pueden tener sus propias reglas además de las que se dan aquí. Si es posible, utiliza <a href='https://habitica.fandom.com/es/wiki/Gu%C3%ADa_de_Markdown' target='_blank'>lenguaje de marcado</a> para ocultar el contenido potencialmente sensible bajo varios saltos de línea, de modo que aquellos que deseen evitar leerlo puedan pasarlo por alto sin ver el contenido. En cualquier caso, el personal de Habitica y los moderadores pueden decidir eliminar este material a su discreción.",
"commGuidePara035": "<strong>Si en el Gremio en cuestión se tratan cuestiones delicadas de cualquier tipo, es respetuoso para con tus compañeros Habiticanos incluir una advertencia (por ejemplo: \"Advertencia: referencias a autolesión\")</strong>. Estas pueden presentarse como mensajes de advertencia y/o notas sobre el contenido, y los Gremios pueden tener sus propias reglas además de las que se dan aquí. En cualquier caso, el personal de Habitica puede decidir eliminar este material a su discreción.",
"commGuidePara036": "Además, el material sensible debe estar relacionado la temática del Gremio: sacar el tema de la autolesión en un Gremio centrado en la lucha contra la depresión puede tener sentido, pero probablemente sea menos apropiado en un Gremio musical. Si ves que alguien infringe reiteradamente esta directriz, especialmente después de haberle llamado la atención, te rogamos que reportes la publicación.",
"commGuidePara037": "<strong>Ningún Gremio, ni Público ni Privado, debe ser creado con el propósito de atacar a un grupo o individuo</strong>. La creación de un Gremio así es razón para ser expulsado inmediatamente. ¡Lucha contra los malos hábitos, no contra tus compañeros de aventura!",
"commGuidePara038": "<strong>Todos los Retos de Taberna y los Retos de los Gremios Públicos deben ceñirse a estas reglas asímismo</strong>.",
"commGuideHeadingInfractionsEtc": "Infracciones, Consecuencias y Restauración",
"commGuideHeadingInfractions": "Infracciones",
"commGuidePara050": "Una mayoría abrumadora de Habiticanos se ayudan entre sí, son respetuosos, y procuran que la comunidad entera sea divertida y amistosa. Sin embargo, muy raramente, algo de lo que hace un Habiticano puede violar una de los normas anteriores. Cuando esto sucede, los Moderadores tomarán cualquier acción que crean necesaria para asegurar que Habitica es un lugar seguro y cómodo para todos.",
"commGuidePara051": "<strong>Hay varios tipos de infracciones, y se tratan dependiendo de su gravedad</strong>. Estas no son listas exhaustivas, y los Mods pueden tomar decisiones en temas no registrados aquí bajo su discreción. Los Mods tendrán en cuenta el contexto al evaluar las infracciones.",
"commGuidePara050": "Una mayoría abrumadora de Habiticanos se ayudan entre sí, son respetuosos, y procuran que la comunidad entera sea divertida y amistosa. Sin embargo, muy raramente, algo de lo que hace un Habiticano puede violar una de los normas anteriores. Cuando esto sucede, el Personal tomará cualquier acción que crea necesaria para asegurar que Habitica es un lugar seguro y cómodo para todos.",
"commGuidePara051": "<strong>Hay varios tipos de infracciones, y se tratan dependiendo de su gravedad</strong>. Estas no son listas exhaustivas, y los Mods pueden tomar decisiones en temas no registrados aquí bajo su discreción. El Personal tendrá en cuenta el contexto al evaluar las infracciones.",
"commGuideHeadingSevereInfractions": "Infracciones graves",
"commGuidePara052": "Infracciones graves dañan enormemente la seguridad de la comunidad y usuarios de Habitica, y por lo tanto llevan consecuencias graves como resultado.",
"commGuidePara053": "Los siguientes son algunos ejemplos de infracciones graves. Esta no es una lista completa.",
"commGuideList05A": "Violación de los Términos y Condiciones",
"commGuideList05B": "Discursos de odio/imágenes , acoso, cyber-bullying , mensaje abusivos/repetitivos y trolear",
"commGuideList05C": "Violación de Libertad Condicional",
"commGuideList05D": "Suplantar al Personal o a los Moderadores - esto incluye hacer pasar como reales espacios no afiliados oficialmente a Habitica o moderados por sus administradores ni personal",
"commGuideList05D": "Suplantar al Personal - esto incluye hacer pasar como reales espacios no afiliados oficialmente a Habitica o moderados por su Personal",
"commGuideList05E": "Infracciones moderadas repetidas",
"commGuideList05F": "Creación de una cuenta duplicada para evitar consecuencias (por ejemplo, crear una cuenta para hablar por chat después de que los privilegios de chat hayan sido revocados)",
"commGuideList05G": "Engaño intencionado al Personal o a los Moderadores para evitar consecuencias o para meter en problemas a otro usuario",
"commGuideList05G": "Engaño intencionado al Personal para evitar consecuencias o para meter en problemas a otro usuario",
"commGuideHeadingModerateInfractions": "Infracciones moderadas",
"commGuidePara054": "Infracciones moderadas no hacen a nuestra comunidad insegura, pero la hacen desagradable. Estas infracciones tendrán consecuencias moderadas. En relación con infracciones múltiples, las consecuencias pueden ser más graves.",
"commGuidePara055": "Los siguientes son algunos ejemplos de infracciones moderadas. Esto no es una lista completa.",
"commGuideList06A": "Ignorar, faltar al respeto o discutir con un Moderador. Esto incluye protestar públicamente acerca de moderadores u otros usuarios, glorificar o defender públicamente a usuarios vetados, o debatir si las medidas tomadas por un moderador son apropiadas o no. Si estás preocupado por alguna norma o el comportamiento de los Mods, por favor, contacta el personal por correo (<a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>).",
"commGuideList06A": "<strong>Ignorar, faltar al respeto o discutir con el Personal. Esto incluye protestar públicamente acerca del personal u otros usuarios, glorificar o defender públicamente a usuarios vetados, o debatir si las medidas tomadas por el personal son apropiadas o no. Si estás preocupado por alguna norma o el comportamiento del Personal, por favor, contacta con nosotros por correo electrónico (<a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>).",
"commGuideList06B": "Modificación en segundo plano. Vamos a aclarar rápidamente un punto relevante: Una mención amistosa de las normas está bien. La modificación en segundo plano consiste en decir, demandar, y/o insinuar con insistencia que alguien debe hacer algo que tú describes para corregir un error. Puedes alertar a otras personas sobre el hecho de que han cometido una transgresión, pero, por favor, no exijas una actuación; como por ejemplo, decir: \"Debes saber que se desaconseja blasfemar en la Taberna, por lo que es posible que quieras eliminar eso\", sería mejor opción que decir: \"voy a tener que pedirte que borres ese mensaje.\"",
"commGuideList06C": "Marcar intencionadamente publicaciones inocentes.",
"commGuideList06D": "Violar repetidamente de las Normas de Espacios Públicos",
@ -61,12 +61,12 @@
"commGuidePara056": "Las Infracciones menores, si bien son desaconsejadas, tienen consecuencias menores. Si continúan ocurriendo, con el tiempo pueden conducir a consecuencias más severas.",
"commGuidePara057": "Los siguientes son algunos ejemplos de infracciones menores. Esta no es una lista completa.",
"commGuideList07A": "Primera Violación de las Normas de Espacios Públicos",
"commGuideList07B": "Cualquier declaración o acción que provoque un \"Por favor, no...\". Cuando se te pida que no hagas algo públicamente, este hecho en sí mismo puede ser una consecuencia. Si los moderadores teiene que emitir varias de estas correcciones a la misma persona, podrán contar como una infracción más grave",
"commGuideList07B": "Cualquier declaración o acción que provoque un \"Por favor, no...\" por parte del Personal. Cuando se te pida que no hagas algo públicamente, este hecho en sí mismo puede ser una consecuencia. Si el Personal tiene que emitir varias de estas correcciones a la misma persona, podrán contar como una infracción más grave",
"commGuidePara057A": "Algunas publicaciones pueden estar ocultas porque contienen información sensible o pueden dar a las personas una idea equivocada. Por lo general, esto no cuenta como una infracción, ¡sobre todo no si es la primera vez que ocurre!",
"commGuideHeadingConsequences": "Consecuencias",
"commGuidePara058": "En Habitica -- así como en la vida real -- cada acción tiene su consecuencia, si se trata de ponerse en forma por correr, tener caries por comer demasiado asúcar, o sobresaliendo en una clase por estudiar.",
"commGuidePara059": "<strong>Del mismo modo, cada infracción tiene consecuencias directas.</strong> Algunos ejemplos se resumen abajo.",
"commGuidePara060": "<strong>Si su infracción tiene una consecuencia moderada o severa, habrá una publicación de los miembros del personal o de los moderadores en el foro en el que ha ocurrido la infracción que explicará</strong>:",
"commGuidePara060": "<strong>Si su infracción tiene una consecuencia moderada o severa y es adecuado a las circunstancias, habrá una publicación de los miembros del personal en el foro en el que ha ocurrido la infracción que explicará</strong>:",
"commGuideList08A": "En qué consistió tu infracción",
"commGuideList08B": "cuál es su consecuencia",
"commGuideList08C": "qué hacer para corregir la situación y restablecer tu status, si es posible.",
@ -77,7 +77,7 @@
"commGuideList09C": "Desabilitando permanentemente (\"congelando\") progreso por Niveles de Colaboradores",
"commGuideHeadingModerateConsequences": "Ejemplos de Consecuencias Moderadas",
"commGuideList10A": "Privilegios restringidos en las salas de chat públicas y/o privadas",
"commGuideList10A1": "Si sus acciones resultan en la revocación de sus privilegios de la sala chat, un Moderador o Miembro del personal te enviará un PM y/o publicará en el foro en el que te silenciaron para notificarte el motivo por el que se te ha silenciado y el período de tiempo durante el cual estarás silenciado y/o la acción requerida para que ser restituído. Serás restituido si cumples educadamente con las acciones requeridas y te comprometes a cumplir con las Normas de la Comunidad y los Términos de Servicio (ToS)",
"commGuideList10A1": "Si sus acciones resultan en la revocación de sus privilegios de la sala chat deberás enviar un correco electrónico a you must email <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>. Tus privilegios podrán restituirse si el Personal decide que cumples educadamente con las acciones requeridas y te comprometes a cumplir con las Normas de la Comunidad y los Términos de Servicio (ToS)",
"commGuideList10C": "Privilegios restringidos en la creación de Gremios/Desafíos",
"commGuideList10D": "Desabilitando temporalmente (\"congelando\") progreso por Niveles de Colaboradores",
"commGuideList10E": "Descenso de Nivel de Contribuyente",
@ -86,15 +86,15 @@
"commGuideList11A": "Recordatorios de las Normas de Espacios Públicos",
"commGuideList11B": "Advertencias",
"commGuideList11C": "Peticiones",
"commGuideList11D": "Eliminación (Puede que los Moderadores/Personal borren contenido controvertido)",
"commGuideList11E": "Ediciones (Puede que los Moderadores/Personal editen contenido controvertido)",
"commGuideList11D": "Eliminación (Puede que el Personal borre contenido controvertido)",
"commGuideList11E": "Ediciones (Puede que el Personal edite contenido controvertido)",
"commGuideHeadingRestoration": "Restauración",
"commGuidePara061": "Habitica es una tierra dedicada a la superación personal, y creemos en las segundas oportunidades. <strong>Si cometes una infracción y sufres las consecuencia, visualízala como una oportunidad para evaluar tus acciones y para esforzarte por ser un mejor miembro de la comunidad</strong>.",
"commGuidePara062": "El anuncio, mensaje y/o correo electrónico que recibes explicando las consecuencias de tus acciones es una buena fuente de información. Coopera con cualquier restricción que se te haya impuesto y trata de cumplir con los requisitos para que se eliminen las sanciones.",
"commGuidePara063": "Si no comprendes las consecuencias o la naturaleza de tus infracciones, pregunta al Personal/Moderador para que te ayuden y así evitar cometer infracciones en el futuro. Si sientes que una decision en particular ha sido injusta, puedes ponerte en contacto con el personal para debatirlo en <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>.",
"commGuideHeadingMeet": "¡Conoce al Personal y a los Moderadores!",
"commGuidePara063": "Si no comprendes las consecuencias o la naturaleza de tus infracciones, pregunta al Personal para que te ayude y así evitar cometer infracciones en el futuro. Si sientes que una decisión en particular ha sido injusta, puedes ponerte en contacto con el personal para debatirlo en <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>.",
"commGuideHeadingMeet": "¡Conoce al Personal!",
"commGuidePara006": "Habitica cuenta con algunos paladines errantes incansables que unen sus fuerzas a los miembros del personal para mantener la comunidad en calma, contenta y libre de trolls. Cada uno cuenta con un dominio específico, pero a veces se les llama a servir en otras esferas sociales.",
"commGuidePara007": "El personal de Habitica tiene etiquetas violetas marcadas con coronas. Su titulo es \"Heroico\".",
"commGuidePara007": "El Personal de Habitica se ocupa de que la app y las páginas funcionen bien, y además cumple la función de moderación del chat. Tiene etiquetas violetas marcadas con coronas. Su titulo es \"Heroico\".",
"commGuidePara008": "Los moderadores tienen etiquetas azul oscuro acompañadas de una estrella. Su título es \"Guardián\".",
"commGuidePara009": "Los actuales miembros del personal son (de izquierda a derecha):",
"commGuideAKA": "<%= habitName %> también conocido como <%= realName %>",

View file

@ -372,5 +372,6 @@
"hatchingPotionSolarSystem": "Sistema solar",
"hatchingPotionOnyx": "Ónice",
"hatchingPotionVirtualPet": "Mascota virtual",
"hatchingPotionPorcelain": "Porcelana"
"hatchingPotionPorcelain": "Porcelana",
"hatchingPotionPinkMarble": "Mármol Rosa"
}

View file

@ -1632,7 +1632,7 @@
"headAccessorySpecialSpring2015MageText": "Orejas de Conejito Azul",
"headAccessorySpecialSpring2015MageNotes": "Estas orejas escuchan atentamente, en el caso de que algún mago esté revelando algún secreto. No confieren ningún beneficio. Equipamiento de edición limitada de primavera 2015.",
"headAccessorySpecialSpring2015HealerText": "Orejas de Gatito Verdes",
"headAccessorySpecialSpring2015HealerNotes": "Estas adorables orejas harán que los demás se pongan verdes de envidia. No otorga ningún beneficio. Equipamiento de Verano Edición Limitada del 2015.",
"headAccessorySpecialSpring2015HealerNotes": "Estas adorables orejas harán que los demás se pongan verdes de envidia. No otorga ningún beneficio. Equipamiento de edición limitada de verano 2015.",
"headAccessorySpecialSpring2016RogueText": "Orejas de Perro Verdes",
"headAccessorySpecialSpring2016RogueNotes": "¡Con éstas podrás mantener a astutos magos en la mira aunque se vuelvan invisibles! No otorgan ningún beneficio. Equipamiento de edición limitada de primavera 2016.",
"headAccessorySpecialSpring2016WarriorText": "Orejas de Ratón Rojas",
@ -1640,46 +1640,46 @@
"headAccessorySpecialSpring2016MageText": "Orejas de Gato Amarillas",
"headAccessorySpecialSpring2016MageNotes": "Estas puntiagudas orejas pueden detectar el insignificante zumbido del Mana ambiente, o las silenciosas pisadas de un Pícaro. No otorga ningún beneficio. Equipamiento de edición limitada de primavera 2016.",
"headAccessorySpecialSpring2016HealerText": "Orejas de Conejito Moradas",
"headAccessorySpecialSpring2016HealerNotes": "Altas como banderas en una batalla, permiten a otros ver dónde conseguir ayuda. No confieren ningún beneficio. Equipamiento de Edición Limitada de Primavera 2016.",
"headAccessorySpecialSpring2016HealerNotes": "Altas como banderas en una batalla, permiten a otros ver dónde conseguir ayuda. No otorga ningún beneficio. Equipamiento de edición limitada de primavera 2016.",
"headAccessorySpecialSpring2017RogueText": "Orejas de Conejito Rojas",
"headAccessorySpecialSpring2017RogueNotes": "No se te escapará ningún sonido gracias a estas orejas. No proporciona ningún beneficio. Equipo de Edición Limitada Primavera 2017.",
"headAccessorySpecialSpring2017RogueNotes": "No se te escapará ningún sonido gracias a estas orejas. No otorga ningún beneficio. Equipamiento de edición limitada de primavera 2017.",
"headAccessorySpecialSpring2017WarriorText": "Orejas de Gatito Azul",
"headAccessorySpecialSpring2017WarriorNotes": "¡Estas orejas pueden oír el sonido de una bolsa de golosinas gatunas abriéndose incluso en el ardor de la batalla! No proporciona ningún beneficio. Equipo de Edición Limitada Primavera 2017.",
"headAccessorySpecialSpring2017WarriorNotes": "¡Estas orejas pueden oír el sonido de una bolsa de golosinas gatunas abriéndose incluso en el ardor de la batalla! No otorga ningún beneficio. Equipamiento de edición limitada de primavera 2017.",
"headAccessorySpecialSpring2017MageText": "Orejas de Perro Verde Mar",
"headAccessorySpecialSpring2017MageNotes": "¡Puedes oír la magia del aire! No proporciona ningún beneficio. Equipo de Edición Limitada Primavera 2017.",
"headAccessorySpecialSpring2017MageNotes": "¡Puedes oír la magia del aire! No otorga ningún beneficio. Equipamiento de edición limitada de primavera 2017.",
"headAccessorySpecialSpring2017HealerText": "Orejas de Ratón Moradas",
"headAccessorySpecialSpring2017HealerNotes": "Estas orejas te permitirán escuchar secretos. No proporcionan ningún beneficio. Equipamiento de Edición Limitada Primavera 2017.",
"headAccessoryBearEarsText": "Orejas de oso",
"headAccessorySpecialSpring2017HealerNotes": "Estas orejas te permitirán escuchar secretos. No otorga ningún beneficio. Equipamiento de edición limitada de primavera 2017.",
"headAccessoryBearEarsText": "Orejas de Oso",
"headAccessoryBearEarsNotes": "¡Estas orejas te hacen parecer un oso valiente! No otorga ningún beneficio.",
"headAccessoryCactusEarsText": "Orejas de cactus",
"headAccessoryCactusEarsText": "Orejas de Cactus",
"headAccessoryCactusEarsNotes": "¡Estas orejas te hacen parecer un cactus espinoso! No otorga ningún beneficio.",
"headAccessoryFoxEarsText": "Orejas de Zorro",
"headAccessoryFoxEarsNotes": "Con estas orejas, parecerás un astuto zorro. No aportan ningún beneficio.",
"headAccessoryFoxEarsNotes": "Con estas orejas, parecerás un astuto zorro. No otorga ningún beneficio.",
"headAccessoryLionEarsText": "Orejas de Leon",
"headAccessoryLionEarsNotes": "Con estas orejas, parecerás un majestuoso león. No aportan ningún beneficio.",
"headAccessoryLionEarsNotes": "Con estas orejas, parecerás un majestuoso león. No otorga ningún beneficio.",
"headAccessoryPandaEarsText": "Orejas de Panda",
"headAccessoryPandaEarsNotes": "Con estas orejas, parecerás un amable panda. No aportan ningún beneficio.",
"headAccessoryPandaEarsNotes": "Con estas orejas, parecerás un amable panda. No otorga ningún beneficio.",
"headAccessoryPigEarsText": "Orejas de Cerdo",
"headAccessoryPigEarsNotes": "Con estas orejas, parecerás un caprichoso porcino. No aportan ningún beneficio.",
"headAccessoryPigEarsNotes": "Con estas orejas, parecerás un caprichoso porcino. No otorga ningún beneficio.",
"headAccessoryTigerEarsText": "Orejas de Tigre",
"headAccessoryTigerEarsNotes": "Con estas orejas, parecerás un feroz tigre. No aportan ningún beneficio.",
"headAccessoryTigerEarsNotes": "Con estas orejas, parecerás un feroz tigre. No otorga ningún beneficio.",
"headAccessoryWolfEarsText": "Orejas de Lobo",
"headAccessoryWolfEarsNotes": "Con estas orejas, parecerás un leal lobo. No aportan ningún beneficio.",
"headAccessoryBlackHeadbandText": "Diadema negra",
"headAccessoryWolfEarsNotes": "Con estas orejas, parecerás un leal lobo. No otorga ningún beneficio.",
"headAccessoryBlackHeadbandText": "Diadema Negra",
"headAccessoryBlackHeadbandNotes": "Una diadema negra sencilla. No otorga ningún beneficio.",
"headAccessoryBlueHeadbandText": "Diadema azul",
"headAccessoryBlueHeadbandText": "Diadema Azul",
"headAccessoryBlueHeadbandNotes": "Una diadema azul sencilla. No otorga ningún beneficio.",
"headAccessoryGreenHeadbandText": "Diadema verde",
"headAccessoryGreenHeadbandText": "Diadema Verde",
"headAccessoryGreenHeadbandNotes": "Una diadema verde sencilla. No otorga ningún beneficio.",
"headAccessoryPinkHeadbandText": "Diadema rosa",
"headAccessoryPinkHeadbandText": "Diadema Rosa",
"headAccessoryPinkHeadbandNotes": "Una diadema rosa sencilla. No otorga ningún beneficio.",
"headAccessoryRedHeadbandText": "Diadema roja",
"headAccessoryRedHeadbandText": "Diadema Roja",
"headAccessoryRedHeadbandNotes": "Una diadema roja sencilla. No otorga ningún beneficio.",
"headAccessoryWhiteHeadbandText": "Diadema blanca",
"headAccessoryWhiteHeadbandText": "Diadema Blanca",
"headAccessoryWhiteHeadbandNotes": "Una diadema blanca sencilla. No otorga ningún beneficio.",
"headAccessoryYellowHeadbandText": "Diadema amarilla",
"headAccessoryYellowHeadbandText": "Diadema Amarilla",
"headAccessoryYellowHeadbandNotes": "Una diadema amarilla sencilla. No otorga ningún beneficio.",
"headAccessoryMystery201403Text": "Astas del caminante del bosque",
"headAccessoryMystery201403Text": "Astas del Caminante del Bosque",
"headAccessoryMystery201403Notes": "Estos cuernos brillan con musgo y líquenes. No otorga ningún beneficio. Artículo de suscriptor. Marzo 2014.",
"headAccessoryMystery201404Text": "Antenas de mariposa crepuscular",
"headAccessoryMystery201404Notes": "¡Esta antena ayuda a su portador a sentir distracciones peligrosas! No confiere beneficio. Artículo de Suscriptor Abril 2014.",
@ -1705,38 +1705,38 @@
"eyewearCapitalized": "Gafas",
"eyewearBase0Text": "Sin Gafas",
"eyewearBase0Notes": "Sin Gafas.",
"eyewearSpecialBlackTopFrameText": "Gafas simples negras",
"eyewearSpecialBlackTopFrameNotes": "Gafas con un marco negro sobre las lentes. No confieren beneficios.",
"eyewearSpecialBlueTopFrameText": "Gafas simples azules",
"eyewearSpecialBlueTopFrameNotes": "Gafas con un marco azul sobre las lentes. No confieren beneficios.",
"eyewearSpecialGreenTopFrameText": "Gafas simples verdes",
"eyewearSpecialGreenTopFrameNotes": "Gafas con un marco verde sobre las lentes. No confieren beneficios.",
"eyewearSpecialPinkTopFrameText": "Gafas simples rosas",
"eyewearSpecialPinkTopFrameNotes": "Gafas con un marco rosa sobre las lentes. No confieren beneficios.",
"eyewearSpecialRedTopFrameText": "Gafas simples rojas",
"eyewearSpecialRedTopFrameNotes": "Gafas con un marco rojo sobre las lentes. No confieren beneficios.",
"eyewearSpecialWhiteTopFrameText": "Gafas simples blancas",
"eyewearSpecialWhiteTopFrameNotes": "Gafas con un marco blanco sobre las lentes. No confieren beneficios.",
"eyewearSpecialYellowTopFrameText": "Gafas simples amarillas",
"eyewearSpecialYellowTopFrameNotes": "Gafas con un marco amarillo sobre las lentes. No confieren beneficios.",
"eyewearSpecialBlackTopFrameText": "Gafas Simples Negras",
"eyewearSpecialBlackTopFrameNotes": "Gafas con un marco negro sobre las lentes. No otorga ningún beneficio.",
"eyewearSpecialBlueTopFrameText": "Gafas Simples Azules",
"eyewearSpecialBlueTopFrameNotes": "Gafas con un marco azul sobre las lentes. No otorga ningún beneficio.",
"eyewearSpecialGreenTopFrameText": "Gafas Simples Verdes",
"eyewearSpecialGreenTopFrameNotes": "Gafas con un marco verde sobre las lentes. No otorga ningún beneficio.",
"eyewearSpecialPinkTopFrameText": "Gafas Simples Rosas",
"eyewearSpecialPinkTopFrameNotes": "Gafas con un marco rosa sobre las lentes. No otorga ningún beneficio.",
"eyewearSpecialRedTopFrameText": "Gafas Simples Rojas",
"eyewearSpecialRedTopFrameNotes": "Gafas con un marco rojo sobre las lentes. No otorga ningún beneficio.",
"eyewearSpecialWhiteTopFrameText": "Gafas Simples Blancas",
"eyewearSpecialWhiteTopFrameNotes": "Gafas con un marco blanco sobre las lentes. No otorga ningún beneficio.",
"eyewearSpecialYellowTopFrameText": "Gafas Simples Amarillas",
"eyewearSpecialYellowTopFrameNotes": "Gafas con un marco amarillo sobre las lentes. No otorga ningún beneficio.",
"eyewearSpecialAetherMaskText": "Máscara Etérea",
"eyewearSpecialAetherMaskNotes": "Esta máscara tiene un misterioso pasado. Aumenta la inteligencia en <%= int %>.",
"eyewearSpecialAetherMaskNotes": "Esta máscara tiene un misterioso pasado. Aumenta la Inteligencia en <%= int %>.",
"eyewearSpecialSummerRogueText": "Parche Picaresco",
"eyewearSpecialSummerRogueNotes": "¡No hace falta ser un diablillo para apreciar lo distinguido que es! No otorga ningún beneficio. Equipo de Verano 2014 Edición Limitada.",
"eyewearSpecialSummerRogueNotes": "¡No hace falta ser un diablillo para apreciar lo distinguido que es! No otorga ningún beneficio. Equipamiento de edición limitada de verano 2014.",
"eyewearSpecialSummerWarriorText": "Parche Apuesto",
"eyewearSpecialSummerWarriorNotes": "¡No hace falta ser un diablillo para apreciar lo distinguido que es esto! No otorga ningún beneficio. Equipamiento de Verano 2014 Edición Limitada.",
"eyewearSpecialSummerWarriorNotes": "¡No hace falta ser un diablillo para apreciar lo distinguido que es esto! No otorga ningún beneficio. Equipamiento de edición limitada de verano 2014.",
"eyewearSpecialWonderconRedText": "Máscara Poderosa",
"eyewearSpecialWonderconRedNotes": "¡Qué accesorio tan poderoso para el rostro! No otorga ningún beneficio. Artículo de Congreso Edición Especial.",
"eyewearSpecialWonderconRedNotes": "¡Qué accesorio tan poderoso para el rostro! No otorga ningún beneficio. Artículo de edición especial de convención.",
"eyewearSpecialWonderconBlackText": "Máscara Sigilosa",
"eyewearSpecialWonderconBlackNotes": "Tus motivos son indudablemente legítimos. No otorga ningún beneficio. Artículo de Congreso Edición Especial.",
"eyewearMystery201503Text": "Gafas de aguamarina",
"eyewearSpecialWonderconBlackNotes": "Tus motivos son indudablemente legítimos. No otorga ningún beneficio. Artículo de edición especial de convención.",
"eyewearMystery201503Text": "Gafas de Aguamarina",
"eyewearMystery201503Notes": "¡Cuidado no te metas estas gemas brillantes en un ojo! No otorga ningún beneficio. Artículo de suscriptor marzo 2015.",
"eyewearMystery201506Text": "Gafas de buceo neón",
"eyewearMystery201506Notes": "Con estas gafas neón para bucear, se ve debajo del agua. No aportan ningún beneficio. Artículo del suscriptor de junio del 2015.",
"eyewearMystery201507Text": "Gafas de sol guays",
"eyewearMystery201507Notes": "Con estas gafas de sol, molarás aunque el tiempo no mole. No aportan ningún beneficio. Artículo del suscriptor de julio del 2015.",
"eyewearMystery201701Text": "Gafas de sol atemporales",
"eyewearMystery201701Notes": "¡Estas gafas de sol protegerán tus ojos de los rayos más dañinos y te verás elegante sin importar en qué momento del tiempo te encuentres! No proporciona ventajas. Artículo de Suscriptor de enero de 2017.",
"eyewearMystery201506Text": "Gafas de Buceo Neón",
"eyewearMystery201506Notes": "Con estas gafas neón para bucear, se ve debajo del agua. No otorga ningún beneficio. Artículo del suscriptor de junio del 2015.",
"eyewearMystery201507Text": "Gafas de Sol Guays",
"eyewearMystery201507Notes": "Con estas gafas de sol, molarás aunque el tiempo no mole. No otorga ningún beneficio. Artículo del suscriptor de julio del 2015.",
"eyewearMystery201701Text": "Gafas de Sol Atemporales",
"eyewearMystery201701Notes": "¡Estas gafas de sol protegerán tus ojos de los rayos más dañinos y te verás elegante sin importar en qué momento del tiempo te encuentres! No otorga ningún beneficio. Artículo de Suscriptor de enero de 2017.",
"eyewearMystery301404Text": "Gafas Protectoras para los ojos",
"eyewearMystery301404Notes": "No hay ningún accesorio facial tan sofisticado como unos buenos anteojos - excepto a lo mejor, un monóculo. No otorga ningún beneficio. Artículo de Suscriptor de Abril del 2015.",
"eyewearMystery301405Text": "Monóculo",
@ -1819,7 +1819,7 @@
"weaponMystery201911Text": "Bastón de cristal encantado",
"weaponArmoireFloridFanNotes": "Te encariñan los pliegues de seda cuando no están en uso. Incrementa la Constitución en <%= con %>. Armario Encantado: Objeto Independiente.",
"weaponArmoireFloridFanText": "Abanico Florido",
"eyewearMystery201907Notes": "¡Luce asombroso mientras proteges tus ojos de los dañinos rayos UV! No confiere beneficios. Equipamiento de suscripción de julio del 2019.",
"eyewearMystery201907Notes": "¡Luce asombroso mientras proteges tus ojos de los dañinos rayos UV! No otorga ningún beneficio. Equipamiento de suscripción de julio del 2019.",
"weaponSpecialWinter2020WarriorNotes": "¡Atrás, ardillas! ¡No os llevaréis ni un poco de esto! ... Pero si todas vosotras queréis pasar el rato y tomar chocolate caliente, está guay. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de invierno 2019-2020.",
"weaponSpecialWinter2020RogueText": "Varilla de Linterna",
"shieldSpecialPiDayText": "Escudo Pi",
@ -2361,7 +2361,7 @@
"backMystery202009Notes": "¡Deja que estas enormes alas te lleven a nuevas alturas! No otorga ningún beneficio. Artículo de suscriptor de septiembre 2020.",
"bodyMystery202107Text": "Exuberante flamenco flotante",
"eyewearMystery202108Notes": "Mira con ellos fijamente a tus enemigos (¡o a tus tareas más poderosas!) y no tendrán ninguna oportunidad. No otorga ningún beneficio. Artículo de suscriptor de agosto 2021.",
"eyewearMystery201907Text": "Gafas de sol azucaradas",
"eyewearMystery201907Text": "Gafas de Sol Azucaradas",
"headAccessoryMystery202009Notes": "Estos plumosos apéndices te ayudarán a encontrar tu camino incluso en la oscuridad de la noche. No otorga ningún beneficio. Artículo de suscriptor de septiembre 2020.",
"shieldArmoireBouncyBubblesNotes": "¡Completa tu relajante baño con estas exuberantes burbujas! Aumenta la fuerza en <%= str %>. Armario Encantado: conjunto de baño de burbujas (artículo 4 de 4).",
"bodyArmoireClownsBowtieNotes": "Una buena pajarita no es ninguna broma, incluso para un payaso. Aumenta la fuerza, inteligencia, constitución y percepción en <%= attrs %> cada uno. Armario Encantado: conjunto de payaso (artículo 5 de 5).",
@ -2375,12 +2375,12 @@
"headAccessoryMystery201906Notes": "Cuenta la leyenda, que estas pequeñas orejas permiten a los tritones a escuchar las llamadas y canciones de todos los habitantes de las profundidades. No otorga ningún beneficio. Artículo de suscriptor de junio 2019.",
"bodyMystery202008Text": "Manto de buhoráculo",
"eyewearSpecialKS2019Notes": "Audaces como un grifo... hmm, los hipogrifos no llevan viseras. Eso te recuerda que... báh, a quién intentas engañar, ¡las llevas porque molan! No otorga ningún beneficio.",
"eyewearSpecialKS2019Text": "Visor de hipogrifo legendario",
"eyewearSpecialKS2019Text": "Visor de Hipogrifo Legendario",
"shieldArmoireBagpipesNotes": "Los más envidiosos dirán que estás planeas despertar a los muertos con tus gaitas, ¡pero tú sabes que lo haces para llevar tu grupo al éxito! Aumenta la fuerza en <%= str %>. Armario Encantado: conjunto de gaitero (artículo 3 de 3).",
"backMystery202009Text": "Maravillosas alas de polilla",
"backMystery202005Text": "Maravillosas alas de wyverno",
"headAccessoryMystery202105Text": "Cuernos de dragón nebular",
"eyewearSpecialGreenHalfMoonText": "Gafas de medialuna verdes",
"eyewearSpecialGreenHalfMoonText": "Gafas de Medialuna Verdes",
"eyewearSpecialYellowHalfMoonNotes": "Gafas de montura amarilla y lentes de luna creciente. No otorga ningún beneficio.",
"shieldArmoirePiratesCompanionText": "Compañero pirata",
"backMystery202109Notes": "Deslízate suavemente por el aire del crepúsculo sin hacer ruido. No otorga ningún beneficio. Artículo de suscriptor de septiembre 2021.",
@ -2389,7 +2389,7 @@
"bodyMystery202003Text": "Espaldares espinosos",
"shieldArmoireHeraldsMessageScrollText": "Pergamino de anuncios heráldico",
"shieldArmoireBlueMoonSaiText": "Sai de brillo lunar",
"eyewearSpecialFall2019RogueText": "Media-máscara de blancohueso",
"eyewearSpecialFall2019RogueText": "Media-Máscara de Blancohueso",
"shieldArmoireBlueCottonCandyFoodNotes": "Una dulce golosina para las mascotas más golosas. ¿A cuál le gustará más? Aumenta la constitución en <%= con %>. Armario Encantado: conjunto de comida para mascotas (artículo 9 de 10).",
"shieldArmoireSoftPinkPillowText": "Almohada rosa pálido",
"shieldArmoireHobbyHorseText": "Caballo de juguete",
@ -2403,7 +2403,7 @@
"shieldArmoireMilkFoodNotes": "Existen muchos refranes sobre los beneficios para la salud de la leche, pero a las mascotas únicamente les gusta por su cremoso sabor. Aumenta la constitución y la fuerza en <%= attrs %> cada uno. Armario Encantado: conjunto de comida para mascotas (artículo 10 de 10)",
"shieldArmoireDarkAutumnFlameText": "Llama oscura otoñal",
"shieldArmoirePotatoFoodNotes": "Las patatas son el alimento básico de muchas dietas, pero algo algunas mascotas viven exclusivamente de ello... Aumenta la percepción en <%= per %>. Armario Encantado: conjunto de comida para mascotas (artículo 3 de 10).",
"eyewearSpecialBlackHalfMoonText": "Gafas de medialuna negras",
"eyewearSpecialBlackHalfMoonText": "Gafas de Medialuna Negras",
"shieldArmoireHoneyFoodNotes": "¡Cuidado con las patas pegajosas cuando hayas alimentado a tus mascotas con esta miel! Algunas mascotas anhelan esta dulzura natural; ¿puedes adivinar cuáles? Aumenta la percepción y la inteligencia en <%= attrs %> cada uno. Armario Encantado: conjunto de comida para mascotas (artículo 6 de 10).",
"bodyArmoireLifeguardWhistleNotes": "¡Llama al orden a ese hábito que no se está comportando!¡Debe cumplir las normas! Aumenta la inteligencia en <%= int %>. Armario Encantado: conjunto de socorrista (artículo 3 de 3).",
"headAccessoryMystery202109Text": "Antenas de lepidóptero lunar",
@ -2414,7 +2414,7 @@
"shieldArmoirePinkCottonCandyFoodNotes": "Una golosina para las mascotas más golosas. Pero, ¿a cuál le gustará más?. Aumenta la inteligencia en <%= int %>. Armario Encantado: conjunto de comida para mascotas (artículo 4 de 10).",
"backMystery202105Text": "Alas de dragón nebular",
"backMystery202109Text": "Alas de lepidóptero lunar",
"eyewearSpecialWhiteHalfMoonText": "Gafas de medialuna blancas",
"eyewearSpecialWhiteHalfMoonText": "Gafas de Medialuna Blancas",
"shieldArmoireRottenMeatFoodNotes": "¡Tápate la nariz! Puede que a ti te resulte repugnante este trozo de carne podrida, ¡pero a algunas de tus mascotas les parece el plato perfecto! Aumenta la constitución en <%= con %>. Armario Encantado: conjunto de comida para mascotas (artículo 2 de 10).",
"bodyMystery202002Notes": "Para cuando tu corazón esté caliente pero las brisas de febrero son gélidas. No otorga ningún beneficio. Artículo de suscriptor de febrero 2020.",
"shieldArmoireChocolateFoodText": "Chocolate decorativo",
@ -2426,7 +2426,7 @@
"shieldArmoireMortarAndPestleText": "Maja y mortero",
"bodyArmoireLifeguardWhistleText": "Silbato de socorrista",
"backMystery202005Notes": "A pesar de estar llenas de agujeros, estas alas siguen pudiendo llevarte donde necesites. No otorga ningún beneficio. Artículo de suscriptor de mayo 2020.",
"eyewearSpecialBlueHalfMoonText": "Gafas de medialuna azules",
"eyewearSpecialBlueHalfMoonText": "Gafas de Medialuna Azules",
"headAccessoryMystery202004Text": "Poderosas antenas de mariposa monarca",
"backMystery202001Notes": "¡Estas esponjosas colas contienen poder celestial y también un alto nivel de adorabilidad! No otorga ningún beneficio. Artículo de suscriptor de enero 2020.",
"eyewearSpecialPinkHalfMoonNotes": "Gafas de montura rosa y lentes de luna creciente. No otorga ningún beneficio.",
@ -2437,17 +2437,17 @@
"backMystery201905Notes": "Vuela a parajes jamás visto con estas iridiscentes alas. No otorga ningún beneficio. Artículo de suscriptor de mayo 2019.",
"headAccessoryMystery202102Text": "Tiara encantadora",
"eyewearSpecialGreenHalfMoonNotes": "Gafas de montura verde y lentes de luna creciente. No otorga ningún beneficio.",
"eyewearSpecialPinkHalfMoonText": "Gafas de medialuna rosa",
"eyewearSpecialPinkHalfMoonText": "Gafas de Medialuna Rosa",
"shieldArmoireMedievalLaundryText": "Ropa sucia",
"shieldArmoireBlueCottonCandyFoodText": "Algodón de azúcar azul decorativo",
"backMystery202004Text": "Poderosas alas de monarca",
"eyewearSpecialYellowHalfMoonText": "Gafas de medialuna amarillas",
"eyewearSpecialYellowHalfMoonText": "Gafas de Medialuna Amarillas",
"shieldArmoireHobbyHorseNotes": "¡Cabalga tu hermoso caballo de juguete raudo hacia tus recompensas! Aumenta la percepción y la constitución en <%= attrs %> cada uno. Armario Encantado: conjunto de caballero de papel (artículo 2 de 3).",
"bodyMystery202002Text": "Bufanda de cariñito estilosa",
"headAccessoryMystery201906Text": "Orejas de tritón",
"shieldArmoireMilkFoodText": "Leche decorativa",
"shieldArmoireBouncyBubblesText": "Burbujas saltarinas",
"eyewearSpecialRedHalfMoonText": "Gafas de medialuna rojas",
"eyewearSpecialRedHalfMoonText": "Gafas de Medialuna Rojas",
"shieldArmoireBaseballGloveText": "Guante de béisbol",
"shieldArmoireStrawberryFoodNotes": "¡Una deliciosa y fresta fresa para alimentar a tus mascotas! ¿Sabes a cuáles les gustan más las fresas? Aumenta la fuerza en <%= str %>. Armario Encantado: conjunto de comida para mascotas (artículo 1 de 10).",
"shieldArmoireMedievalLaundryNotes": "Va a ser difícil aclarar esto, pero ya sabes que puedes hacer cualquier cosa. Aumenta la percepción en <%= per %>. Armario Encantado: conjunto de lavanderos medievales (artículo 6 de 6).",
@ -2471,7 +2471,7 @@
"shieldArmoireClownsBalloonsNotes": "Ten cuidado: reemplazar estos globos si se te explotan te saldría un poco caro... ¡por la inflación! Aumenta la percepción en <%= per %>. Armario Encantado: conjunto de payaso (artículo 4 de 5).",
"shieldArmoireRottenMeatFoodText": "Carne podrida decorativa",
"headAccessoryMystery201905Text": "Temibles cuernos de dragón",
"eyewearSpecialFall2019HealerText": "Rostro negro",
"eyewearSpecialFall2019HealerText": "Rostro Negro",
"shieldArmoireHeraldsMessageScrollNotes": "¿Qué emocionantes noticias contiene este pergamino? ¿Podría tratarse de una nueva mascota o de una buena racha cumpliendo hábitos? Aumenta la percepción en <%= per %>. Armario Encantado: conjunto de heraldo (artículo 4 de 4)",
"backSpecialNamingDay2020Notes": "¡Feliz día del nombramiento! Mueve esta fiera cola pixelada mientras celebras el bautizo de Habitica. No otorga ningún beneficio.",
"bodyMystery202107Notes": "¡Este fiel compañero nunca te defraudará y siempre mantendrá tu espíritu en alto! No otorga ningún beneficio. Artículo de suscriptor de julio 2021.",

View file

@ -188,7 +188,7 @@
"fall2020WraithWarriorSet": "Espectro (Guerrero)",
"royalPurpleJackolantern": "Calabaza de Halloween púrpura real",
"novemberYYYY": "Noviembre <%= year %>",
"g1g1Limitations": "Este es un evento por tiempo limitado que comienza el 17 de Diciembre a las 8:00 AM ET (13:00 UTC) y termina el 7 de Enero a las 8:00 PM ET (1:00 UTC). Esta promoción sólo es válida cuando se hace un regalo a otro Habiticano. Si tu o el receptor de tu regalo ya tenéis una suscripción, la suscripción regalada añadirá meses de crédito que sólo se usarán cuando la suscripción actual sea cancelada o expire.",
"g1g1Limitations": "Este es un evento por tiempo limitado que comienza el 15 de Diciembre a las 8:00 AM ET (13:00 UTC) y termina el 8 de Enero a las 11:59 PM ET (9 de Enero a las 04:59 UTC). Esta promoción sólo es válida cuando se hace un regalo a otro Habiticano. Si tu o el receptor de tu regalo ya tenéis una suscripción, la suscripción regalada añadirá meses de crédito que sólo se usarán cuando la suscripción actual sea cancelada o expire.",
"limitations": "Limitaciones",
"g1g1HowItWorks": "Escribe el nombre de usuario de la cuenta a la que quieres hacerle el regalo. Desde ahí, selecciona la duración de la suscripción que quieres regalar y realiza el pago. Tu cuenta será automaticamente recompensada con el mismo nivel de suscripción que acabas de regalar.",
"howItWorks": "Cómo funciona",
@ -235,5 +235,24 @@
"gemSaleLimitations": "Esta promoción solo aplica durante el tiempo limitado del evento. Este evento empieza el <%= eventStartOrdinal %> de <%= eventStartMonth %> a las 8:00 AM EDT (12:00 UTC) y acabará el <%= eventEndOrdinal %> de <%= eventStartMonth %> a las 8:00 PM EDT (00:00 UTC). Esta promoción solo está disponible cuando se compran Gemas para uno mismo.",
"gemSaleHow": "Entre el <%= eventStartOrdinal %> y <%= eventEndOrdinal %> de <%= eventStartMonth %>, simplemente compra cualquier paquete de Gemas como normalmente, y se abonará en tu cuenta el número promocional de Gemas. ¡Más Gemas para gastar, compartir o guardar para futuras entregas!",
"fall2022KappaRogueSet": "Kapa (Pícaro)",
"fall2022WatcherHealerSet": "Mirador (Sanador)"
"fall2022WatcherHealerSet": "Mirador (Sanador)",
"winter2023WalrusWarriorSet": "Morsa (Guerrero)",
"winter2023CardinalHealerSet": "Cardenal (Sanador)",
"spring2023CaterpillarRogueSet": "Oruga (Pícaro)",
"spring2023HummingbirdWarriorSet": "Colibrí (Guerrero)",
"spring2023LilyHealerSet": "Lirio (Sanador)",
"spring2023MoonstoneMageSet": "Piedra Luna (Mago)",
"celebrateAnniversary": "¡Celebra el 10.º Cumpleaños de Habitica con los siguientes regalos y objetos exclusivos!",
"celebrateBirthday": "¡Celebra el 10.º Cumpleaños de Habitica con regalos y objetos exclusivos!",
"limitedEdition": "Equipamiento de edición limitada",
"anniversaryGryphatricePrice": "Consíguelo hoy por <strong>$9.99</strong> o <strong>60 gemas</strong>",
"dayFive": "Día 5",
"dateStartFebruary": "8 de febrero",
"anniversaryLimitedDates": "Del 30 de enero al 8 de febrero",
"limitedEvent": "Evento limitado",
"dayOne": "Día 1",
"dayTen": "Día 10",
"twentyGems": "20 Gemas",
"birthdaySet": "Conjunto de Cumpleaños",
"winter2023RibbonRogueSet": "Lazo (Pícaro)"
}

View file

@ -199,14 +199,14 @@
"transaction_gift_send": "<b>Regalado</b> a",
"transaction_create_challenge": "Desafío <b>creado</b>",
"transaction_create_guild": "Gremio <b>creado</b>",
"transaction_change_class": "Clase cambiada",
"transaction_change_class": "Cambio de <b>Clase</b>",
"transaction_rebirth": "Orbe de Renacimiento usado",
"transaction_release_pets": "Mascotas soltadas",
"transaction_reroll": "Poción de Fortalecimiento usada",
"hourglassTransactions": "Transacciones de Relojes de Arena",
"transaction_gift_receive": "<b>Recibido</b> de",
"transaction_debug": "Depuración",
"transaction_contribution": "A través de contribuciones",
"transaction_contribution": "Cambio de <b>Rango</b>",
"transaction_spend": "<b>Gastado</b> en",
"transaction_release_mounts": "Monturas sueltas",
"transaction_subscription_perks": "Beneficio de la <b>suscripción</b>",
@ -223,5 +223,7 @@
"passwordIssueLength": "Las contraseñas deben tener una longitud entre 8 y 64 caracteres.",
"amount": "Cantidad",
"action": "Acción",
"note": "Nota"
"note": "Nota",
"timestamp": "Registro de hora",
"remainingBalance": "Saldo Restante"
}

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -144,5 +144,8 @@
"achievementBoneToPickModalText": "Vous avez collecté tous les familiers squelette classiques et de quête !",
"achievementPolarPro": "Pro polaire",
"achievementPolarProText": "A fait éclore toutes les couleurs standard de familiers polaires : Ours, renard, pingouin, baleine et loup !",
"achievementPolarProModalText": "Vous avez collecté tous les familiers polaires !"
"achievementPolarProModalText": "Vous avez collecté tous les familiers polaires !",
"achievementPlantParent": "Protecteur des plantes",
"achievementPlantParentText": "A fait éclore toutes les couleurs standards de familiers plantes : Cactus et arbustes !",
"achievementPlantParentModalText": "Vous avec collecté tous les familiers plantes !"
}

View file

@ -373,5 +373,6 @@
"hatchingPotionOnyx": "onyx",
"hatchingPotionVirtualPet": "Familier virtuel",
"hatchingPotionPorcelain": "porcelaine",
"hatchingPotionPinkMarble": "bille rose"
"hatchingPotionPinkMarble": "bille rose",
"hatchingPotionTeaShop": "Salon de thé"
}

View file

@ -66,7 +66,7 @@
"pkQuestion1": "Qu'est-ce qui a inspiré Habitica ? Comment cela a-t-il commencé ?",
"pkAnswer1": "Si vous avez déjà passé du temps à améliorer un personnage dans un jeu, vous vous êtes sans doute déjà demandé à quel point votre vie serait épanouie si vous consacriez autant d'effort à améliorer votre propre vie, plutôt que celle de votre avatar. Nous avons commencé à construire Habitica pour répondre à cette question.<br /> Habitica a été officiellement lancé en 2013 sur Kickstarter, et l'idée a vraiment pris. Depuis, cela est devenu un immense projet, soutenu par d'extraordinaires volontaires open-source et des contributeurs et contributrices généreuses.",
"pkQuestion2": "Pourquoi Habitica fonctionne ?",
"pkAnswer2": "Acquérir de nouvelles habitudes est difficile parce que la plupart des gens ont vraiment besoin de cette récompense immédiate. Par exemple, utiliser du fil dentaire peut s'avérer compliqué même si notre dentiste nous dit que c'est efficace sur la durée, parce que sur l'instant, cela peut faire mal aux gencives.<br />L'aspect \"jeu\" d'Habitica ajoute une gratification immédiate à vos objectifs quotidiens en récompensant une tâche difficile avec de l'expérience, de l'or... et parfois un prix aléatoire, comme un œuf de dragon ! Cela aide chacun à rester motivé même lorsque la tâche elle-même n'a pas une récompense intrinsèque, et nous avons pu voir des personnes complètement changer leur vie de cette façon. Vous pouvez lire des témoignages de ces succès ici : https://habitversary.tumblr.com",
"pkAnswer2": "Acquérir de nouvelles habitudes est difficile parce que la plupart des gens ont vraiment besoin de cette récompense immédiate. Par exemple, utiliser du fil dentaire peut s'avérer compliqué même si notre dentiste nous dit que c'est efficace sur la durée, parce que sur l'instant, cela peut faire mal aux gencives.<br />L'aspect \"jeu\" d'Habitica ajoute une gratification immédiate à vos objectifs quotidiens en récompensant une tâche difficile avec de l'expérience, de l'or... et parfois un prix aléatoire, comme un œuf de dragon ! Cela aide chacun à rester motivé même lorsque la tâche elle-même n'a pas une récompense intrinsèque, et nous avons pu voir des personnes complètement changer leur vie de cette façon.",
"pkQuestion3": "Pourquoi avoir ajouté des fonctionnalités sociales ?",
"pkAnswer3": "La pression sociale est un énorme facteur de motivation pour beaucoup de personnes, donc nous savions que nous voulions avoir une communauté forte qui se tiendrait mutuellement responsable de ses objectifs et qui encouragerait ses succès. Heureusement, une des choses que les jeux vidéos multijoueurs font le mieux est de favoriser un sentiment de communauté parmi leurs utilisateurs ! La structure de la communauté Habitica vient de ces types de jeux ; vous pouvez former une petite équipe d'amis proches, mais vous pouvez également rejoindre un plus grand groupe d'intérêt commun connu sous le nom de guilde. Bien que certains utilisateurs choisissent de jouer en solo, la plupart décident de former un réseau de soutien qui encourage la responsabilité sociale à travers des fonctionnalités telles que les quêtes, où les membres du groupe mettent en commun leur productivité pour affronter des monstres ensemble.",
"pkQuestion4": "Pourquoi ne pas accomplir vos tâches diminue la santé de votre avatar ?",

View file

@ -2816,5 +2816,37 @@
"shieldArmoireBasketballText": "Balle de basket",
"shieldArmoireBasketballNotes": "Waow ! Quand vous tirez avec cette balle magique, vous ne ferez que des paniers. Augmente la constitution et la force de <%= attrs %> chacune. Armoire enchantée : ensemble de basket (objet 2 de 2).",
"armorArmoireBasketballUniformText": "Uniforme de basket",
"armorArmoireBasketballUniformNotes": "Vous vous demandez ce qui est écrit à l'arrière de cet uniforme ? Votre numéro porte-bonheur, bien sûr ! Augmente la perception de <%= per %>. Armoire enchantée : ensemble de basket (objet 1 de 2)."
"armorArmoireBasketballUniformNotes": "Vous vous demandez ce qui est écrit à l'arrière de cet uniforme ? Votre numéro porte-bonheur, bien sûr ! Augmente la perception de <%= per %>. Armoire enchantée : ensemble de basket (objet 1 de 2).",
"weaponSpecialSpring2023RogueText": "Feuille grignotée",
"weaponSpecialSpring2023RogueNotes": "Tranchez ! Coupez ! Mangez ! Prenez des forces pour votre prochaine métamorphose. Augmente la force de <%= str %>. Équipement en édition limitée du printemps 2023.",
"weaponSpecialSpring2023WarriorText": "Feuille de colibri",
"weaponSpecialSpring2023WarriorNotes": "En garde ! Éloignez les ennemis de vos fleurs avec cette feuille ! Augmente la force de <%= str %>. Équipement en édition limitée du printemps 2023.",
"weaponSpecialSpring2023MageText": "Magie de pierre de lune",
"weaponSpecialSpring2023HealerNotes": "Avec une bouffée d'air et une étincelle, vous déployez une nouvelle croissance, de la joie et de la couleur. Augmente l'intelligence de <%= int %>. Équipement en édition limitée du printemps 2023.",
"headSpecialSpring2023RogueText": "Cagoule de chenille",
"headSpecialSpring2023RogueNotes": "Ne manquez pas de rentrer ces antennes tentantes lorsque les oiseaux chassent au-dessus de votre tête ! Augmente la perception de <%= per %>. Équipement en édition limitée du printemps 2023.",
"headSpecialSpring2023MageNotes": "Vous voudrez porter ces lunettes de nuit pour pouvoir clairement à la lumière de la lune. Augmente la perception de <%= per %>. Équipement en édition limitée du printemps 2023.",
"shieldSpecialSpring2023WarriorText": "Bouquet de fleurs",
"shieldSpecialSpring2023HealerNotes": "Un accent pour une visite de guérison, ou une partie d'un rituel pour assister à une danse de printemps ! Augmente la constitution de <%= con %>. Équipement en édition limitée du printemps 2023.",
"shieldSpecialSpring2023WarriorNotes": "Rassemblez les plus belles fleurs du printemps dans ce bouquet aux couleurs vives. Augmente la constitution de <%= con %>. Équipement en édition limitée du printemps 2023.",
"weaponSpecialSpring2023MageNotes": "Plus ça brille fort, plus la puissance est élevée. Augmente l'intelligence de <%= int %>. Équipement en édition limitée du printemps 2023.",
"weaponSpecialSpring2023HealerText": "Pollen de lys",
"armorSpecialSpring2023RogueText": "Cape de chenille",
"armorSpecialSpring2023RogueNotes": "Vous n'avez peut-être que quatre membres pour travailler, mais vous pouvez grimper et ramper avec le plus grand des vers blancs. Augmente la perception de <%= per %>. Équipement en édition limitée du printemps 2023.",
"armorSpecialSpring2023WarriorText": "Armure de colibri",
"armorSpecialSpring2023WarriorNotes": "Le bourdonnement que vous entendez est celui de vos ailes qui battent plus vite que vous ne pouvez l'imaginer. Augmente la constitution de <%= con %>. Équipement en édition limitée du printemps 2023.",
"armorSpecialSpring2023MageText": "Costume de pierre de lune",
"armorSpecialSpring2023MageNotes": "Cet élégant costume de printemps magnifie la magie de pierre de lune. Augmente l'intelligence de <%= int %>. Équipement en édition limitée du printemps 2023.",
"armorSpecialSpring2023HealerText": "Robe de feuille de lys",
"armorSpecialSpring2023HealerNotes": "Un bouquet de gloire verdoyante qui déclenchera l'envie de toute l'équipe. Augmente la constitution de <%= con %>. Équipement en édition limitée du printemps 2023.",
"headSpecialSpring2023WarriorText": "Casque de colibri",
"headSpecialSpring2023WarriorNotes": "Couvrez votre visage de plumes iridescentes quand vous volez au combat. Augmente la force de <%= str %>. Équipement en édition limitée du printemps 2023.",
"headSpecialSpring2023MageText": "Visière de pierre de lune",
"headSpecialSpring2023HealerText": "Fleur de lys",
"headSpecialSpring2023HealerNotes": "Cet écrin brillant et coloré partage la même palette de couleurs que l'orbe de la résurrection ! Tout un symbole ! Augmente l'intelligence de <%= int %>. Équipement en édition limitée du printemps 2023.",
"shieldSpecialSpring2023HealerText": "Corsage de lys",
"armorMystery202304Notes": "Avec une bonne poignée et un bon bec verseur ! Ne confère aucun bonus. Équipement d'abonnement d'avril 2023.",
"armorMystery202304Text": "Armure théière",
"headMystery202304Text": "Casque théière",
"headMystery202304Notes": "Portez ce casque pour votre pro-thé-ction. Ne confère aucun bonus. Équipement d'abonnement d'avril 2023."
}

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Liste de tâches pour l'équipe",
"teamBasedTasksListDesc": "Créez une liste des tâches partagées facile à voir pour le groupe. Assignez des tâches aux autres membres du groupe, ou laissez les définir leurs propres tâches pour rendre clair qui travaille sur quoi !",
"groupManagementControls": "Contrôles de gestion de groupe",
"groupManagementControlsDesc": "Utilisez l'approbation des tâches pour vérifier qu'une tâche a été effectivement réalisée, ajoutez des gestionnaires de groupes pour partager les responsabilités, et profiter d'une discussion de groupe privée pour tous les membres de l'équipe.",
"groupManagementControlsDesc": "Regardez l'état d'une tâche pour vérifier si elle a été réalisée, ajoutez des gestionnaires de groupes pour partager les responsabilités, et profiter d'une discussion de groupe privée pour tous les membres de l'équipe.",
"inGameBenefits": "Bénéfices dans le jeu",
"inGameBenefitsDesc": "Les membres du groupe reçoivent une monture Jackalope exclusive, ainsi que tous les bénéfices d'un abonnement complet, incluant l'équipement mensuel spécial et la capacité d'acheter des gemmes pour de l'or.",
"inspireYourParty": "Inspirez votre équipe, ludifiez votre vie tous ensemble.",
@ -417,5 +417,6 @@
"groupTeacher": "Enseignant qui définit des tâches pour les étudiants",
"nameStar": "Nom*",
"nameStarText": "Ajouter un titre",
"descriptionOptional": "Description"
"descriptionOptional": "Description",
"invitedToPartyBy": "<a href=\"/profile/<%- userId %>\" target=\"_blank\">@<%- userName %></a> vous a invité à rejoindre l'équipe <span class=\"notification-bold\"><%- party %></span>"
}

View file

@ -269,5 +269,9 @@
"dayTen": "Jour 10",
"partyRobes": "Tenue de soirée",
"twentyGems": "20 Gemmes",
"birthdaySet": "Ensemble d'Anniversaire"
"birthdaySet": "Ensemble d'Anniversaire",
"spring2023CaterpillarRogueSet": "Chenille (Voleur)",
"spring2023HummingbirdWarriorSet": "Colibri (Guerrier)",
"spring2023MoonstoneMageSet": "Pierre de lune (Mage)",
"spring2023LilyHealerSet": "Lys (Guérisseur)"
}

View file

@ -226,5 +226,6 @@
"amount": "Montant",
"action": "Action",
"note": "Note",
"remainingBalance": "Crédit restant"
"remainingBalance": "Crédit restant",
"thirdPartyTools": "Trouvez des applications tierces, des extensions, et plein d'autres utilitaires que vous pourriez utiliser sur votre compte sur le <a href='https://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Wiki d'Habitica</a>."
}

View file

@ -223,5 +223,6 @@
"continueGiftSubBenefits": "Vous voulez faire perdurer vos avantages ? Vous pouvez commencer un nouvel abonnement avant que votre abonnement cadeau se termine pour conserver vos avantages.",
"subscriptionCreditConversion": "Commencer un nouvel abonnement convertira vos mois restants en crédit qui seront utilisés à l'annulation de votre abonnement récurrent.",
"mysterySet202302": "Ensemble de chat-tigré rusé",
"mysterySet202303": "Ensemble du perso principal"
"mysterySet202303": "Ensemble du perso principal",
"mysterySet202304": "Ensemble de théière tip-top"
}

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -108,5 +108,6 @@
"onboardingComplete": "Chuir tú do thascanna ar bord i gcrích!",
"earnedAchievement": "Ghnóthaigh tú éacht!",
"viewAchievements": "Féach ar Éachtaí",
"letsGetStarted": "Ar aghaidh linn!"
"letsGetStarted": "Ar aghaidh linn!",
"achievementMindOverMatter": "Aigne Thar Ábhar"
}

View file

@ -1,6 +1,6 @@
{
"lostAllHealth": "You ran out of Health!",
"dontDespair": "Don't despair!",
"dontDespair": "Ná éadóchas!",
"deathPenaltyDetails": "You lost a Level, your Gold, and a piece of Equipment, but you can get them all back with hard work! Good luck--you'll do great.",
"refillHealthTryAgain": "Refill Health & Try Again",
"dyingOftenTips": "Is this happening often? <a href='http://habitica.wikia.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>Here are some tips!</a>",
@ -14,4 +14,4 @@
"lowHealthTips4": "If a Daily isn't due on a certain day, you can disable it by clicking the pencil icon.",
"goodLuck": "Good luck!",
"cannotRevive": "Cannot revive if not dead"
}
}

View file

@ -10,10 +10,11 @@
"defaultReward2Text": "Reward yourself",
"defaultReward2Notes": "Watch TV, play a game, eat a treat, it's up to you!",
"defaultTag1": "Work",
"defaultTag2": "Exercise",
"defaultTag2": "Aclaíocht",
"defaultTag3": "Health + Wellness",
"defaultTag4": "School",
"defaultTag4": "Scoil",
"defaultTag5": "Teams",
"defaultTag6": "Chores",
"defaultTag7": "Creativity"
"defaultTag7": "Cruthaitheacht",
"workHabitMail": "Ríomhphost a phróiseáil"
}

View file

@ -1741,5 +1741,11 @@
"eyewearArmoirePlagueDoctorMaskNotes": "An authentic mask worn by the doctors who battle the Plague of Procrastination. Increases Constitution and Intelligence by <%= attrs %> each. Enchanted Armoire: Plague Doctor Set (Item 2 of 3).",
"eyewearArmoireGoofyGlassesText": "Goofy Glasses",
"eyewearArmoireGoofyGlassesNotes": "Perfect for going incognito or just making your partymates giggle. Increases Perception by <%= per %>. Enchanted Armoire: Independent Item.",
"twoHandedItem": "Two-handed item."
"twoHandedItem": "Two-handed item.",
"eyewearArmoireTragedyMaskText": "Traigéide Masc",
"eyewearArmoireComedyMaskText": "masc coiméide",
"armorArmoirePirateOutfitText": "feisteas foghlaí mara",
"eyewearArmoireClownsNoseText": "srón bobaide",
"armorArmoireBlueMoonShozokuText": "Cathéide Ghorm Gealach",
"armorArmoireJadeArmorText": "Cathéide Séad"
}

View file

@ -3,8 +3,8 @@
"stringNotFound": "Teaghrán '<%= string %>' Ní bhfuarthas an.",
"habitica": "Habitica",
"onward": "Onward!",
"done": "Done",
"gotIt": "Got it!",
"done": "Déanta",
"gotIt": "Fuair sé!",
"titleTimeTravelers": "Time Travelers",
"titleSeasonalShop": "Seasonal Shop",
"saveEdits": "Save Edits",

View file

@ -312,7 +312,7 @@
"teamBasedTasksList": "Team-Based Task List",
"teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!",
"groupManagementControls": "Group Management Controls",
"groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"groupManagementControlsDesc": "View task status to verify that a task that was completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.",
"inGameBenefits": "In-Game Benefits",
"inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.",
"inspireYourParty": "Inspire your party, gamify life together.",

View file

@ -1,8 +1,8 @@
{
"noItemsAvailableForType": "You have no <%= type %>.",
"foodItemType": "Food",
"eggsItemType": "Eggs",
"hatchingPotionsItemType": "Hatching Potions",
"specialItemType": "Special items",
"lockedItem": "Locked Item"
"noItemsAvailableForType": "You have no <%= type %>.",
"foodItemType": "Food",
"eggsItemType": "Uibheacha",
"hatchingPotionsItemType": "Hatching Potions",
"specialItemType": "Special items",
"lockedItem": "Locked Item"
}

View file

@ -1,3 +1,3 @@
{
"merch" : "Merchandise"
"merch": "Earraí"
}

Some files were not shown because too many files have changed in this diff Show more