Compare commits

...

99 Commits

Author SHA1 Message Date
SabreCat
294cc63fef 4.236.1 2022-07-12 10:05:09 -05:00
SabreCat
9a879d566e fix(content): correct availability range for Seafoam 2022-07-12 10:05:02 -05:00
SabreCat
1655e2e03a 4.236.0 2022-07-06 14:32:58 -05:00
Natalie L
0d444a9d6a chore(content): prebuild July Enchanted Armoire and Backgrounds (#14108) 2022-07-06 14:30:40 -05:00
SabreCat
f4d9c6271b 4.235.1 2022-07-05 14:34:17 -05:00
Natalie L
0e458683fd chore(content): add splashySkins for Summer Gala event (#14107)
* chore(content): add splashySkins for Summer Gala event

* fix(content): use date string, not Boolean, for range start

Co-authored-by: SabreCat <sabe@habitica.com>
2022-07-05 14:33:50 -05:00
SabreCat
695a5cc24d 4.235.0 2022-06-29 14:04:28 -05:00
Natalie L
dcced2debb chore(content): July 2022 Mystery Items (#14095)
* merge upstream/release into release

* chore(content): Added July 2022 Mystery Items
2022-06-29 14:02:46 -05:00
SabreCat
88af9c13a8 4.234.2 2022-06-27 16:35:20 -05:00
SabreCat
d5926ef7f1 fix(auth): null string validation error on unique email conflict 2022-06-27 16:35:13 -05:00
SabreCat
e9222e4f7c fix(strings): revise text because left-handedness confuses people 2022-06-27 16:11:23 -05:00
SabreCat
cd0278c6b3 fix(strings): cherry-pick update by @CuriousMagpie 2022-06-24 15:44:48 -05:00
SabreCat
59a1a2783c 4.234.1 2022-06-21 13:50:22 -05:00
Natalie L
517fbc3c8e fix(strings): error and omissions corrected (#14085)
* build(deps): bump @storybook/addons in /website/client (#14066)

Bumps [@storybook/addons](https://github.com/storybookjs/storybook/tree/HEAD/lib/addons) from 6.5.8 to 6.5.9.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v6.5.9/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v6.5.9/lib/addons)

---
updated-dependencies:
- dependency-name: "@storybook/addons"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump jpeg-js from 0.4.3 to 0.4.4 (#14071)

Bumps [jpeg-js](https://github.com/eugeneware/jpeg-js) from 0.4.3 to 0.4.4.
- [Release notes](https://github.com/eugeneware/jpeg-js/releases)
- [Commits](https://github.com/eugeneware/jpeg-js/compare/v0.4.3...v0.4.4)

---
updated-dependencies:
- dependency-name: jpeg-js
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(string): questVice1Notes html changed to a mobile-device friendly format

* fix(strings): updated limited.json with "dateEnd" & "monthYYYY" months & put in chronological order

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-21 13:48:26 -05:00
SabreCat
b042d4b899 4.234.0 2022-06-21 09:33:22 -05:00
Natalie L
f0c25dab05 2022 Summer Gala Content (#14067)
* merge upstream/release into origin/release

* Revert "merge upstream/release into origin/release"

This reverts commit 902ed08cc3.

* Summer Splash 2022 Content

* added magic hatching potions

* updated events for testing

* fix whitespace

* various corrections

* fix(gear): mage set, healer set, event start date

* update: habitica-images

* fix(events): include normal/empty season data outside of gala

* fix(string): missing attribute and event verbiage for warrior item

Co-authored-by: SabreCat <sabe@habitica.com>
2022-06-21 09:29:53 -05:00
SabreCat
170146f91e 4.233.3 2022-06-16 14:08:50 -05:00
SabreCat
239821a321 Merge branch 'sabrecat/teams-hotfixes' into release 2022-06-16 14:08:41 -05:00
SabreCat
d0dd16c797 Merge branch 'develop' into release 2022-06-16 13:35:33 -05:00
Weblate
8c3517caab Merge branch 'origin/develop' into Weblate. 2022-06-16 20:34:16 +02:00
Weblate
4c2c1c29a3 Translated using Weblate (Dutch)
Currently translated at 96.5% (729 of 755 strings)

Translated using Weblate (Filipino)

Currently translated at 43.7% (1136 of 2597 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (211 of 211 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (704 of 704 strings)

Translated using Weblate (Italian)

Currently translated at 99.0% (209 of 211 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.5% (2542 of 2607 strings)

Translated using Weblate (Portuguese)

Currently translated at 91.0% (641 of 704 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (198 of 198 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.7% (215 of 220 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.0% (212 of 214 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Romanian)

Currently translated at 73.8% (520 of 704 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (704 of 704 strings)

Translated using Weblate (Portuguese)

Currently translated at 90.7% (639 of 704 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.0% (133 of 137 strings)

Translated using Weblate (German)

Currently translated at 100.0% (220 of 220 strings)

Translated using Weblate (German)

Currently translated at 100.0% (111 of 111 strings)

Translated using Weblate (German)

Currently translated at 100.0% (704 of 704 strings)

Translated using Weblate (German)

Currently translated at 100.0% (214 of 214 strings)

Translated using Weblate (German)

Currently translated at 99.0% (697 of 704 strings)

Translated using Weblate (German)

Currently translated at 99.0% (697 of 704 strings)

Translated using Weblate (German)

Currently translated at 99.0% (697 of 704 strings)

Translated using Weblate (German)

Currently translated at 99.0% (697 of 704 strings)

Translated using Weblate (Croatian)

Currently translated at 59.4% (66 of 111 strings)

Translated using Weblate (Croatian)

Currently translated at 39.6% (44 of 111 strings)

Translated using Weblate (Filipino)

Currently translated at 43.5% (1131 of 2597 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Filipino)

Currently translated at 43.3% (1126 of 2597 strings)

Translated using Weblate (Catalan)

Currently translated at 91.4% (193 of 211 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (137 of 137 strings)

Translated using Weblate (Spanish)

Currently translated at 99.0% (209 of 211 strings)

Translated using Weblate (Spanish)

Currently translated at 97.8% (134 of 137 strings)

Translated using Weblate (German)

Currently translated at 100.0% (365 of 365 strings)

Translated using Weblate (German)

Currently translated at 100.0% (365 of 365 strings)

Translated using Weblate (Spanish)

Currently translated at 99.4% (751 of 755 strings)

Translated using Weblate (German)

Currently translated at 100.0% (127 of 127 strings)

Translated using Weblate (German)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Spanish)

Currently translated at 97.0% (133 of 137 strings)

Translated using Weblate (German)

Currently translated at 100.0% (137 of 137 strings)

Translated using Weblate (German)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (German)

Currently translated at 99.2% (136 of 137 strings)

Translated using Weblate (German)

Currently translated at 100.0% (2607 of 2607 strings)

Translated using Weblate (German)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Filipino)

Currently translated at 43.2% (1122 of 2597 strings)

Translated using Weblate (Filipino)

Currently translated at 43.2% (1122 of 2597 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (199 of 199 strings)

Translated using Weblate (Dutch)

Currently translated at 90.4% (2359 of 2607 strings)

Translated using Weblate (French)

Currently translated at 99.8% (2604 of 2607 strings)

Translated using Weblate (Dutch)

Currently translated at 96.5% (729 of 755 strings)

Translated using Weblate (Dutch)

Currently translated at 96.5% (729 of 755 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (137 of 137 strings)

Translated using Weblate (Ukrainian)

Currently translated at 98.8% (178 of 180 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (137 of 137 strings)

Translated using Weblate (Arabic)

Currently translated at 87.5% (113 of 129 strings)

Translated using Weblate (Arabic)

Currently translated at 87.5% (113 of 129 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (2607 of 2607 strings)

Translated using Weblate (Italian)

Currently translated at 99.8% (2604 of 2607 strings)

Translated using Weblate (Spanish)

Currently translated at 98.2% (2562 of 2607 strings)

Translated using Weblate (Filipino)

Currently translated at 43.2% (1122 of 2597 strings)

Translated using Weblate (Filipino)

Currently translated at 43.1% (1121 of 2597 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (137 of 137 strings)

Translated using Weblate (French)

Currently translated at 100.0% (137 of 137 strings)

Translated using Weblate (Italian)

Currently translated at 98.5% (135 of 137 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (German)

Currently translated at 100.0% (220 of 220 strings)

Translated using Weblate (German)

Currently translated at 100.0% (214 of 214 strings)

Translated using Weblate (German)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (German)

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (German)

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (German)

Currently translated at 100.0% (2597 of 2597 strings)

Translated using Weblate (French)

Currently translated at 100.0% (199 of 199 strings)

Translated using Weblate (French)

Currently translated at 100.0% (2597 of 2597 strings)

Translated using Weblate (Filipino)

Currently translated at 43.1% (1120 of 2597 strings)

Translated using Weblate (Filipino)

Currently translated at 95.9% (358 of 373 strings)

Translated using Weblate (German)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (German)

Currently translated at 100.0% (129 of 129 strings)

Translated using Weblate (German)

Currently translated at 100.0% (2597 of 2597 strings)

Translated using Weblate (German)

Currently translated at 100.0% (127 of 127 strings)

Translated using Weblate (German)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (German)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (German)

Currently translated at 100.0% (199 of 199 strings)

Translated using Weblate (German)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (German)

Currently translated at 99.8% (2593 of 2597 strings)

Translated using Weblate (Filipino)

Currently translated at 42.9% (1116 of 2597 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Spanish)

Currently translated at 98.5% (132 of 134 strings)

Co-authored-by: Benoit Hetru <me+hbtc@gahanka.net>
Co-authored-by: CaveMobster <cavemobster@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Daniela Fernberg <martina_kloster@web.de>
Co-authored-by: Fharid Solis <cfharidsq@gmail.com>
Co-authored-by: Hexe des Windes (she/her) <krausanna1@gmail.com>
Co-authored-by: Ike Osenberg <ike.osenberg@gmail.com>
Co-authored-by: JoanZeppeli <x17501668978@163.com>
Co-authored-by: Lucifer <selmanreyhan@gmail.com>
Co-authored-by: Madeline Perray <maperray@gmail.com>
Co-authored-by: Mara S. (Dolichotis) <marascherzer@gmail.com>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Nazar Paruna <nazarparuna@gmail.com>
Co-authored-by: Quim Martínez Lara <quimml60@gmail.com>
Co-authored-by: Sandra Marcial <sandramarcial80@gmail.com>
Co-authored-by: Sara López <sarayupy@gmail.com>
Co-authored-by: Simon Fischer <simon.pascal.fischer@gmail.com>
Co-authored-by: Tobias Welti <tobias.welti@gmail.com>
Co-authored-by: Vince Vilan <vincemorel.vilan.889@my.csun.edu>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: William Madgin <wmadgin.cnf@gmail.com>
Co-authored-by: xioxi <potentiallytyler@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/it/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/it/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ro/
Translate-URL: https://translate.habitica.com/projects/habitica/character/de/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/de/
Translate-URL: https://translate.habitica.com/projects/habitica/content/fil/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/de/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/es/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/death/de/
Translate-URL: https://translate.habitica.com/projects/habitica/front/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fil/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/it/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/de/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/de/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/de/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ar/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/de/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/hr/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ca/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/it/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/hr/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Death
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Npc
Translation: Habitica/Pets
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2022-06-16 20:33:41 +02:00
SabreCat
fb086bb654 4.233.2 2022-06-16 13:31:16 -05:00
SabreCat
db6310f8ab Merge branch 'sabrecat/privately-naughty' into develop 2022-06-16 13:30:57 -05:00
SabreCat
08288db1ef chore(words): allow mild oaths and troublesome streamer as discussed 2022-06-16 13:30:34 -05:00
SabreCat
4a3a7db52a Merge develop 2022-06-16 13:25:56 -05:00
SabreCat
0f8ed2c06a Merge branch 'release' into develop 2022-06-14 14:38:29 -05:00
SabreCat
0ceb0fd844 4.233.1 2022-06-14 14:34:31 -05:00
SabreCat
285fcbd71f fix(content): add event field for countdown 2022-06-14 14:34:25 -05:00
CuriousMagpie
36d82a1d39 June 2022 Pet Quest Bundle 2022-06-14 14:33:53 -05:00
dependabot[bot]
3dd3639964 build(deps): bump @babel/core from 7.18.2 to 7.18.5 (#14064)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.2 to 7.18.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.5/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-13 17:21:23 -04:00
dependabot[bot]
5b20961908 build(deps): bump @storybook/addons in /website/client (#14062)
Bumps [@storybook/addons](https://github.com/storybookjs/storybook/tree/HEAD/lib/addons) from 6.5.7 to 6.5.8.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v6.5.8/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v6.5.8/lib/addons)

---
updated-dependencies:
- dependency-name: "@storybook/addons"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-13 16:44:20 -04:00
dependabot[bot]
f4fd5e221e build(deps): bump @storybook/addon-links in /website/client (#14061)
Bumps [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/addons/links) from 6.5.7 to 6.5.8.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v6.5.8/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v6.5.8/addons/links)

---
updated-dependencies:
- dependency-name: "@storybook/addon-links"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-13 16:44:07 -04:00
dependabot[bot]
4be863de99 build(deps): bump @storybook/addon-actions in /website/client (#14060)
Bumps [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/addons/actions) from 6.5.7 to 6.5.8.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v6.5.8/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v6.5.8/addons/actions)

---
updated-dependencies:
- dependency-name: "@storybook/addon-actions"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-13 16:43:52 -04:00
dependabot[bot]
905d749e7b build(deps): bump jwks-rsa from 2.1.3 to 2.1.4 (#14057)
Bumps [jwks-rsa](https://github.com/auth0/node-jwks-rsa) from 2.1.3 to 2.1.4.
- [Release notes](https://github.com/auth0/node-jwks-rsa/releases)
- [Changelog](https://github.com/auth0/node-jwks-rsa/blob/master/CHANGELOG.md)
- [Commits](https://github.com/auth0/node-jwks-rsa/compare/v2.1.3...v2.1.4)

---
updated-dependencies:
- dependency-name: jwks-rsa
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-13 16:41:36 -04:00
Phillip Thelen
65d2eac4c3 Correctly handle google accounts with multiple subscriptions (#13982) 2022-06-10 14:07:36 -05:00
sau226
a0884b5d24 Remove QR code feature (#14038) 2022-06-10 14:06:25 -05:00
sau226
4d10c53216 Further transition from HTTP to HTTPS (#14039) 2022-06-10 14:02:58 -05:00
Jennifer Aldover
4da6467486 update apidoc exportUserAvatarHtml description (#14040) 2022-06-10 13:59:17 -05:00
dependabot[bot]
bb37adb97b build(deps): bump core-js from 3.22.7 to 3.22.8 in /website/client (#14046)
Bumps [core-js](https://github.com/zloirock/core-js) from 3.22.7 to 3.22.8.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.22.7...v3.22.8)

---
updated-dependencies:
- dependency-name: core-js
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-10 13:50:07 -04:00
SabreCat
02fef2d0d9 fix(test): add missing helper to v4 2022-06-09 15:50:43 -05:00
SabreCat
d668fd8920 fix(tests): missed alt test suite versions 2022-06-09 15:22:23 -05:00
SabreCat
85c7c7ea57 fix(tests): create test teams properly, adjust expectations 2022-06-09 15:06:51 -05:00
SabreCat
0b1907fe07 fix(group-plans): shared completion, URL exploit 2022-06-08 16:46:22 -05:00
SabreCat
87944c45c3 Merge branch 'release' into develop 2022-06-08 14:55:59 -05:00
SabreCat
86068f42d4 4.233.0 2022-06-07 15:04:38 -05:00
dependabot[bot]
2fe1ac75d2 build(deps): bump @storybook/addon-links in /website/client (#14048)
Bumps [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/addons/links) from 6.5.6 to 6.5.7.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v6.5.7/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v6.5.7/addons/links)

---
updated-dependencies:
- dependency-name: "@storybook/addon-links"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-06 16:35:34 -04:00
dependabot[bot]
c0be7c77d1 build(deps): bump @storybook/addons in /website/client (#14047)
Bumps [@storybook/addons](https://github.com/storybookjs/storybook/tree/HEAD/lib/addons) from 6.4.19 to 6.5.7.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v6.5.7/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v6.5.7/lib/addons)

---
updated-dependencies:
- dependency-name: "@storybook/addons"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-06 16:35:19 -04:00
dependabot[bot]
37ff1c2c5c build(deps): bump @storybook/addon-actions in /website/client (#14045)
Bumps [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/addons/actions) from 6.5.6 to 6.5.7.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v6.5.7/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v6.5.7/addons/actions)

---
updated-dependencies:
- dependency-name: "@storybook/addon-actions"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-06 16:34:57 -04:00
dependabot[bot]
1ccd0e8f70 build(deps): bump superagent from 7.1.3 to 7.1.6 (#14042)
Bumps [superagent](https://github.com/visionmedia/superagent) from 7.1.3 to 7.1.6.
- [Release notes](https://github.com/visionmedia/superagent/releases)
- [Changelog](https://github.com/visionmedia/superagent/blob/master/HISTORY.md)
- [Commits](https://github.com/visionmedia/superagent/compare/v7.1.3...v7.1.6)

---
updated-dependencies:
- dependency-name: superagent
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-06 16:34:20 -04:00
dependabot[bot]
82977e893b build(deps): bump gulp.spritesmith from 6.12.1 to 6.13.0 (#14041)
Bumps [gulp.spritesmith](https://github.com/twolfson/gulp.spritesmith) from 6.12.1 to 6.13.0.
- [Release notes](https://github.com/twolfson/gulp.spritesmith/releases)
- [Changelog](https://github.com/twolfson/gulp.spritesmith/blob/master/CHANGELOG.md)
- [Commits](https://github.com/twolfson/gulp.spritesmith/compare/6.12.1...6.13.0)

---
updated-dependencies:
- dependency-name: gulp.spritesmith
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-06 16:33:58 -04:00
dependabot[bot]
84046df884 build(deps): bump nconf from 0.11.3 to 0.12.0 in /website/client (#14006)
Bumps [nconf](https://github.com/flatiron/nconf) from 0.11.3 to 0.12.0.
- [Release notes](https://github.com/flatiron/nconf/releases)
- [Changelog](https://github.com/indexzero/nconf/blob/master/CHANGELOG.md)
- [Commits](https://github.com/flatiron/nconf/compare/v0.11.3...v0.12.0)

---
updated-dependencies:
- dependency-name: nconf
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-06 16:32:13 -04:00
dependabot[bot]
46cbd6cf0d build(deps): bump @babel/core from 7.17.10 to 7.18.2 (#14024)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.10 to 7.18.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.2/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-06 16:31:50 -04:00
SabreCat
2cb724e6b2 Merge branch 'release' into develop 2022-06-06 15:14:36 -05:00
SabreCat
d76d5f2cf1 Merge branch 'sabrecat/sanitize-redirect' into release 2022-06-06 15:03:30 -05:00
Natalie L
2d1bf74858 June 2022 Backgrounds and Enchanted Armoire (#14049) 2022-06-06 14:55:38 -05:00
SabreCat
986ba1b8ba chore(sprites): compile 2022-06-06 12:42:35 -05:00
SabreCat
d68cacdc1d Merge branch 'release' into develop 2022-06-06 12:37:49 -05:00
Emiel Popelier
c9671b5319 Styling Bugfix: 13772 (#13983) 2022-06-03 15:41:46 -05:00
SabreCat
6d2db6693c Merge branch 'develop' into release 2022-06-03 15:13:56 -05:00
SabreCat
cd9e3aeab3 Revert "build(deps): bump passport from 0.5.0 to 0.6.0 (#13987)"
This reverts commit dd978b664b.
2022-06-03 15:13:41 -05:00
Sabe Jones
341517083e Record local email for social users where possible (#14029)
* fix(auth): record local email for social users where possible

* fix(auth): Apple emails are junk, prefer Google

* fix(auth): correct placement of logic to save local email

* fix(auth): run full function in both workflows to avoid conflicts

Co-authored-by: SabreCat <sabe@habitica.com>
2022-06-03 15:06:40 -05:00
Natalie L
d726b88a86 Content: Beta Groups Testing Achievement (#14014)
* content: beta Groups testing achievement

* resolving merge conflict
2022-06-03 15:04:27 -05:00
SabreCat
afc7b1218a 4.232.2 2022-06-03 14:04:49 -05:00
SabreCat
2c311952c8 chore(packages): update locks 2022-06-03 14:04:45 -05:00
Weblate
85a85b7173 Merge branch 'origin/develop' into Weblate. 2022-06-03 20:54:11 +02:00
Weblate
556d1e49ce Translated using Weblate (Italian)
Currently translated at 100.0% (199 of 199 strings)

Translated using Weblate (Swedish)

Currently translated at 83.4% (630 of 755 strings)

Translated using Weblate (Swedish)

Currently translated at 95.4% (356 of 373 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Spanish)

Currently translated at 98.6% (2562 of 2597 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Swedish)

Currently translated at 84.6% (11 of 13 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.0% (197 of 203 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.5% (132 of 134 strings)

Translated using Weblate (Spanish)

Currently translated at 98.6% (2562 of 2597 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (2593 of 2597 strings)

Translated using Weblate (Filipino)

Currently translated at 43.3% (1125 of 2597 strings)

Translated using Weblate (Russian)

Currently translated at 99.2% (749 of 755 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.6% (2509 of 2597 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (2597 of 2597 strings)

Translated using Weblate (Spanish)

Currently translated at 98.8% (2562 of 2593 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (366 of 366 strings)

Translated using Weblate (Ukrainian)

Currently translated at 98.3% (177 of 180 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (212 of 212 strings)

Translated using Weblate (Spanish)

Currently translated at 98.8% (2562 of 2593 strings)

Translated using Weblate (Arabic)

Currently translated at 69.3% (77 of 111 strings)

Translated using Weblate (Arabic)

Currently translated at 87.3% (117 of 134 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.5% (198 of 203 strings)

Translated using Weblate (Spanish)

Currently translated at 98.8% (2562 of 2593 strings)

Translated using Weblate (Filipino)

Currently translated at 47.8% (1240 of 2593 strings)

Translated using Weblate (Hebrew)

Currently translated at 71.6% (96 of 134 strings)

Translated using Weblate (Spanish)

Currently translated at 98.8% (2562 of 2593 strings)

Translated using Weblate (Russian)

Currently translated at 99.2% (749 of 755 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (212 of 212 strings)

Translated using Weblate (Hungarian)

Currently translated at 51.4% (69 of 134 strings)

Translated using Weblate (Filipino)

Currently translated at 54.3% (1409 of 2593 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Japanese)

Currently translated at 99.5% (202 of 203 strings)

Translated using Weblate (Hebrew)

Currently translated at 84.0% (79 of 94 strings)

Translated using Weblate (Hebrew)

Currently translated at 22.7% (5 of 22 strings)

Translated using Weblate (Spanish)

Currently translated at 98.8% (2562 of 2593 strings)

Translated using Weblate (Hebrew)

Currently translated at 93.3% (14 of 15 strings)

Translated using Weblate (Hebrew)

Currently translated at 75.4% (570 of 755 strings)

Translated using Weblate (Hebrew)

Currently translated at 86.0% (321 of 373 strings)

Translated using Weblate (Hebrew)

Currently translated at 86.0% (321 of 373 strings)

Translated using Weblate (Hebrew)

Currently translated at 73.6% (137 of 186 strings)

Translated using Weblate (Hebrew)

Currently translated at 73.6% (137 of 186 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (98 of 98 strings)

Translated using Weblate (Hebrew)

Currently translated at 70.8% (95 of 134 strings)

Translated using Weblate (Spanish)

Currently translated at 98.8% (2562 of 2593 strings)

Translated using Weblate (Dutch)

Currently translated at 90.7% (2354 of 2593 strings)

Translated using Weblate (Dutch)

Currently translated at 90.6% (2351 of 2593 strings)

Translated using Weblate (Spanish)

Currently translated at 98.8% (2562 of 2593 strings)

Translated using Weblate (German)

Currently translated at 99.0% (201 of 203 strings)

Translated using Weblate (German)

Currently translated at 100.0% (366 of 366 strings)

Translated using Weblate (German)

Currently translated at 100.0% (2593 of 2593 strings)

Translated using Weblate (German)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (German)

Currently translated at 99.7% (2587 of 2593 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (German)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (German)

Currently translated at 99.2% (133 of 134 strings)

Translated using Weblate (Arabic)

Currently translated at 90.6% (194 of 214 strings)

Translated using Weblate (French)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Filipino)

Currently translated at 60.6% (1572 of 2593 strings)

Translated using Weblate (Russian)

Currently translated at 98.1% (2545 of 2593 strings)

Translated using Weblate (Spanish)

Currently translated at 98.8% (2562 of 2593 strings)

Translated using Weblate (Swedish)

Currently translated at 98.5% (132 of 134 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Russian)

Currently translated at 97.8% (2537 of 2593 strings)

Translated using Weblate (Russian)

Currently translated at 97.1% (206 of 212 strings)

Translated using Weblate (Russian)

Currently translated at 97.1% (206 of 212 strings)

Translated using Weblate (Russian)

Currently translated at 91.0% (193 of 212 strings)

Translated using Weblate (Russian)

Currently translated at 91.0% (193 of 212 strings)

Translated using Weblate (Russian)

Currently translated at 97.7% (2535 of 2593 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (180 of 180 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Russian)

Currently translated at 88.6% (188 of 212 strings)

Translated using Weblate (Russian)

Currently translated at 88.2% (187 of 212 strings)

Translated using Weblate (Russian)

Currently translated at 88.2% (187 of 212 strings)

Translated using Weblate (Filipino)

Currently translated at 62.7% (1628 of 2593 strings)

Translated using Weblate (Indonesian)

Currently translated at 64.5% (131 of 203 strings)

Translated using Weblate (Russian)

Currently translated at 97.7% (2534 of 2593 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (French)

Currently translated at 100.0% (203 of 203 strings)

Translated using Weblate (French)

Currently translated at 100.0% (366 of 366 strings)

Translated using Weblate (French)

Currently translated at 100.0% (2593 of 2593 strings)

Translated using Weblate (French)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (French)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (French)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Japanese)

Currently translated at 99.0% (201 of 203 strings)

Translated using Weblate (Spanish)

Currently translated at 98.8% (2562 of 2593 strings)

Translated using Weblate (Dutch)

Currently translated at 90.4% (2346 of 2593 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (127 of 127 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (212 of 212 strings)

Translated using Weblate (Filipino)

Currently translated at 65.0% (1688 of 2593 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (111 of 111 strings)

Translated using Weblate (Korean)

Currently translated at 58.1% (118 of 203 strings)

Translated using Weblate (Korean)

Currently translated at 81.9% (77 of 94 strings)

Translated using Weblate (Korean)

Currently translated at 88.5% (324 of 366 strings)

Translated using Weblate (Spanish)

Currently translated at 98.6% (2558 of 2593 strings)

Translated using Weblate (Filipino)

Currently translated at 68.3% (1773 of 2593 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (220 of 220 strings)

Translated using Weblate (Turkish)

Currently translated at 88.2% (323 of 366 strings)

Translated using Weblate (Turkish)

Currently translated at 95.5% (172 of 180 strings)

Translated using Weblate (Russian)

Currently translated at 99.4% (179 of 180 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Turkish)

Currently translated at 71.6% (91 of 127 strings)

Translated using Weblate (Turkish)

Currently translated at 88.5% (116 of 131 strings)

Translated using Weblate (Turkish)

Currently translated at 88.5% (116 of 131 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (203 of 203 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (366 of 366 strings)

Translated using Weblate (Russian)

Currently translated at 98.8% (178 of 180 strings)

Translated using Weblate (Russian)

Currently translated at 98.9% (747 of 755 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (127 of 127 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (373 of 373 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Spanish)

Currently translated at 98.6% (2558 of 2593 strings)

Translated using Weblate (Russian)

Currently translated at 98.5% (744 of 755 strings)

Translated using Weblate (Russian)

Currently translated at 98.5% (744 of 755 strings)

Translated using Weblate (Dutch)

Currently translated at 94.7% (715 of 755 strings)

Translated using Weblate (Dutch)

Currently translated at 93.7% (119 of 127 strings)

Translated using Weblate (Spanish)

Currently translated at 98.6% (2558 of 2593 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (214 of 214 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Dutch)

Currently translated at 93.7% (708 of 755 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (203 of 203 strings)

Translated using Weblate (Dutch)

Currently translated at 97.5% (198 of 203 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (129 of 129 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (220 of 220 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (366 of 366 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (180 of 180 strings)

Translated using Weblate (Dutch)

Currently translated at 96.4% (54 of 56 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (373 of 373 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (98 of 98 strings)

Translated using Weblate (Dutch)

Currently translated at 94.5% (659 of 697 strings)

Translated using Weblate (Dutch)

Currently translated at 99.2% (130 of 131 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Latin)

Currently translated at 53.1% (117 of 220 strings)

Translated using Weblate (Filipino)

Currently translated at 66.9% (1737 of 2593 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (203 of 203 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (203 of 203 strings)

Co-authored-by: Agoston Merkovics <agome10x@lis-student.se>
Co-authored-by: Andreway <watermelontvandreway2@gmail.com>
Co-authored-by: Anfasa Rabbany <lelcraft96@gmail.com>
Co-authored-by: Benoit Hetru <me+hbtc@gahanka.net>
Co-authored-by: Chap <chalda82+nogravatar@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Dmitry <basdim21@gmail.com>
Co-authored-by: Hexe des Windes (she/her) <krausanna1@gmail.com>
Co-authored-by: Ike Osenberg <ike.osenberg@gmail.com>
Co-authored-by: John Collins <munmedia9865@gmail.com>
Co-authored-by: Justin Cho <jcho93@umd.edu>
Co-authored-by: KanI <twinklingnerd@gmail.com>
Co-authored-by: Lucifer <selmanreyhan@gmail.com>
Co-authored-by: Madeline Perray <maperray@gmail.com>
Co-authored-by: Mazer Time <mazer.time@gmail.com>
Co-authored-by: Moa Davou <moa.davou99@gmail.com>
Co-authored-by: Nazar Paruna <nazarparuna@gmail.com>
Co-authored-by: Omer I.S <omeritzicschwartz@gmail.com>
Co-authored-by: Razi H <razi.haj@gmail.com>
Co-authored-by: Sandra Marcial <sandramarcial80@gmail.com>
Co-authored-by: Simon Coast <shimmumah@mailfence.com>
Co-authored-by: Teymur <timbl4@gmail.com>
Co-authored-by: Vince Vilan <vincemorel.vilan.889@my.csun.edu>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: YV <tiger_eye_9@hotmail.com>
Co-authored-by: Zarah Lundberg <sar_lun@hotmail.com>
Co-authored-by: blacksheep47 <1760906326@qq.com>
Co-authored-by: mattya 226 <worldworld1114@gmail.com>
Co-authored-by: Артём Вячеславович Холопов <holopow.art@yandex.ru>
Co-authored-by: Виктория Андриенко <hymera_555@mail.ru>
Co-authored-by: Естай <akseleu@yahoo.com>
Co-authored-by: そら <comi4work@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/he/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/it/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/it/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/he/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/character/he/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/content/he/
Translate-URL: https://translate.habitica.com/projects/habitica/content/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/content/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/content/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/death/he/
Translate-URL: https://translate.habitica.com/projects/habitica/death/id/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/front/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/front/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fil/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/it/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ar/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/de/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/la/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/ar/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/he/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ar/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/he/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/id/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/it/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/ar/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/he/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/nl/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Death
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Npc
Translation: Habitica/Overview
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Rebirth
Translation: Habitica/Settings
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2022-06-03 20:53:57 +02:00
dependabot[bot]
19c1484928 build(deps): bump amplitude-js from 8.17.0 to 8.18.4 in /website/client (#14034)
Bumps [amplitude-js](https://github.com/amplitude/amplitude-javascript) from 8.17.0 to 8.18.4.
- [Release notes](https://github.com/amplitude/amplitude-javascript/releases)
- [Changelog](https://github.com/amplitude/Amplitude-JavaScript/blob/main/CHANGELOG.md)
- [Commits](https://github.com/amplitude/amplitude-javascript/compare/v8.17.0...v8.18.4)

---
updated-dependencies:
- dependency-name: amplitude-js
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:34:35 -04:00
dependabot[bot]
9f135782ef build(deps): bump vue-router from 3.5.3 to 3.5.4 in /website/client (#14027)
Bumps [vue-router](https://github.com/vuejs/router) from 3.5.3 to 3.5.4.
- [Release notes](https://github.com/vuejs/router/releases)
- [Changelog](https://github.com/vuejs/router/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/router/commits)

---
updated-dependencies:
- dependency-name: vue-router
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:30:51 -04:00
dependabot[bot]
ad0907274b build(deps): bump @babel/preset-env from 7.17.10 to 7.18.2 (#14022)
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.17.10 to 7.18.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.2/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:30:05 -04:00
dependabot[bot]
9eb959840b build(deps): bump @storybook/addon-actions in /website/client (#14028)
Bumps [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/addons/actions) from 6.4.19 to 6.5.6.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v6.5.6/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v6.5.6/addons/actions)

---
updated-dependencies:
- dependency-name: "@storybook/addon-actions"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:26:24 -04:00
dependabot[bot]
7d11b22da0 build(deps): bump @storybook/addon-links in /website/client (#14025)
Bumps [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/addons/links) from 6.4.18 to 6.5.6.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v6.5.6/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v6.5.6/addons/links)

---
updated-dependencies:
- dependency-name: "@storybook/addon-links"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:26:00 -04:00
dependabot[bot]
f3495ba4e1 build(deps): bump jwks-rsa from 2.1.2 to 2.1.3 (#13985)
Bumps [jwks-rsa](https://github.com/auth0/node-jwks-rsa) from 2.1.2 to 2.1.3.
- [Release notes](https://github.com/auth0/node-jwks-rsa/releases)
- [Changelog](https://github.com/auth0/node-jwks-rsa/blob/master/CHANGELOG.md)
- [Commits](https://github.com/auth0/node-jwks-rsa/compare/v2.1.2...v2.1.3)

---
updated-dependencies:
- dependency-name: jwks-rsa
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:25:10 -04:00
dependabot[bot]
dd978b664b build(deps): bump passport from 0.5.0 to 0.6.0 (#13987)
Bumps [passport](https://github.com/jaredhanson/passport) from 0.5.0 to 0.6.0.
- [Release notes](https://github.com/jaredhanson/passport/releases)
- [Changelog](https://github.com/jaredhanson/passport/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jaredhanson/passport/compare/v0.5.0...v0.6.0)

---
updated-dependencies:
- dependency-name: passport
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:24:41 -04:00
dependabot[bot]
84011f36b2 build(deps): bump moment from 2.29.1 to 2.29.3 in /website/client (#13994)
Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.3.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.3)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:24:17 -04:00
dependabot[bot]
b9389f8430 build(deps): bump intro.js from 5.0.0 to 5.1.0 in /website/client (#13999)
Bumps [intro.js](https://github.com/usablica/intro.js) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/usablica/intro.js/releases)
- [Commits](https://github.com/usablica/intro.js/compare/v5.0.0...v5.1.0)

---
updated-dependencies:
- dependency-name: intro.js
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:23:55 -04:00
dependabot[bot]
266ea01bc8 build(deps): bump @vue/cli-plugin-eslint in /website/client (#14000)
Bumps [@vue/cli-plugin-eslint](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-eslint) from 4.5.15 to 4.5.17.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.5.17/packages/@vue/cli-plugin-eslint)

---
updated-dependencies:
- dependency-name: "@vue/cli-plugin-eslint"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:23:35 -04:00
dependabot[bot]
c170edae92 build(deps): bump bootstrap-vue from 2.21.2 to 2.22.0 in /website/client (#14002)
Bumps [bootstrap-vue](https://github.com/bootstrap-vue/bootstrap-vue) from 2.21.2 to 2.22.0.
- [Release notes](https://github.com/bootstrap-vue/bootstrap-vue/releases)
- [Changelog](https://github.com/bootstrap-vue/bootstrap-vue/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/bootstrap-vue/bootstrap-vue/compare/v2.21.2...v2.22.0)

---
updated-dependencies:
- dependency-name: bootstrap-vue
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:23:13 -04:00
dependabot[bot]
324076438c build(deps): bump core-js from 3.21.0 to 3.22.7 in /website/client (#14004)
Bumps [core-js](https://github.com/zloirock/core-js) from 3.21.0 to 3.22.7.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.21.0...v3.22.7)

---
updated-dependencies:
- dependency-name: core-js
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:22:30 -04:00
dependabot[bot]
77791e186f build(deps-dev): bump @babel/plugin-proposal-optional-chaining (#14009)
Bumps [@babel/plugin-proposal-optional-chaining](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-proposal-optional-chaining) from 7.16.7 to 7.17.12.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.12/packages/babel-plugin-proposal-optional-chaining)

---
updated-dependencies:
- dependency-name: "@babel/plugin-proposal-optional-chaining"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:19:40 -04:00
dependabot[bot]
b3a9e79f0d build(deps): bump smartbanner.js in /website/client (#14011)
Bumps [smartbanner.js](https://github.com/ain/smartbanner.js) from 1.17.0 to 1.19.0.
- [Release notes](https://github.com/ain/smartbanner.js/releases)
- [Commits](https://github.com/ain/smartbanner.js/compare/v1.17.0...v1.19.0)

---
updated-dependencies:
- dependency-name: smartbanner.js
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-03 14:18:56 -04:00
SabreCat
ce67f06bab fix(chat): test expectation, short circuit if no group 2022-06-02 16:43:14 -05:00
SabreCat
219bdc088b feat(chat): don't check for slurs in private chats 2022-06-02 16:16:40 -05:00
dependabot[bot]
ac972fb481 build(deps): bump eventsource from 1.1.0 to 1.1.1 in /website/client (#14031)
Bumps [eventsource](https://github.com/EventSource/eventsource) from 1.1.0 to 1.1.1.
- [Release notes](https://github.com/EventSource/eventsource/releases)
- [Changelog](https://github.com/EventSource/eventsource/blob/master/HISTORY.md)
- [Commits](https://github.com/EventSource/eventsource/compare/v1.1.0...v1.1.1)

---
updated-dependencies:
- dependency-name: eventsource
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-01 15:41:31 -04:00
SabreCat
5a0813fe7f fix(lint): line length 2022-05-31 15:34:44 -05:00
SabreCat
d3673349a9 Merge branch 'release' into develop 2022-05-31 13:58:07 -05:00
SabreCat
8125bea89f 4.232.1 2022-05-31 10:38:29 -05:00
SabreCat
e16c12fc7f Revert "Gifting Modal Redesign (#13964)"
This reverts commit 761d70ec55.
2022-05-31 10:38:14 -05:00
SabreCat
90e03653ce 4.232.0 2022-05-30 15:58:29 -05:00
Natalie L
dd5066ab72 2022-06 Subscriber Items (#14016)
* 2022-06 Subscriber Items

* chore(mystery): compile sprites, tidy up whitespace

Co-authored-by: SabreCat <sabe@habitica.com>
2022-05-30 15:56:50 -05:00
Tressley Cahill
ec0be8d91f Adjust z-index for notifications
Fixes #14015
2022-05-25 11:09:43 -04:00
SabreCat
331c64a83a Merge branch 'release' into develop 2022-05-24 09:38:40 -05:00
Natalie L
8040d14c28 code for reptacular rumble achievement (#13981) 2022-05-23 15:39:51 -05:00
SabreCat
5bcfdbe066 fix(login): catch double-slash exploit 2022-05-20 14:29:15 -05:00
dependabot[bot]
0e7f98ad14 build(deps): bump jwks-rsa from 2.1.1 to 2.1.2 (#13976)
Bumps [jwks-rsa](https://github.com/auth0/node-jwks-rsa) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/auth0/node-jwks-rsa/releases)
- [Changelog](https://github.com/auth0/node-jwks-rsa/blob/master/CHANGELOG.md)
- [Commits](https://github.com/auth0/node-jwks-rsa/compare/v2.1.1...v2.1.2)

---
updated-dependencies:
- dependency-name: jwks-rsa
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-19 15:43:21 -05:00
Vanathi G
9ba0bd7c06 Keys to kennel issue (#13978)
* Fix selection highlight in avatar editor

* Fix error message on using Keys to the Kennel
2022-05-19 15:37:15 -05:00
dependabot[bot]
5d78fce468 build(deps): bump glob from 8.0.1 to 8.0.3 (#13974)
Bumps [glob](https://github.com/isaacs/node-glob) from 8.0.1 to 8.0.3.
- [Release notes](https://github.com/isaacs/node-glob/releases)
- [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/node-glob/compare/v8.0.1...v8.0.3)

---
updated-dependencies:
- dependency-name: glob
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-19 15:33:41 -05:00
Sabe Jones
31385b3e7b fix(auth): take best guess when multiple accts with same email (#13980)
Co-authored-by: SabreCat <sabe@habitica.com>
2022-05-19 15:32:03 -05:00
Weblate
1f2c926a54 Translated using Weblate (Japanese)
Currently translated at 98.5% (200 of 203 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Latin)

Currently translated at 19.4% (35 of 180 strings)

Translated using Weblate (Latin)

Currently translated at 99.2% (130 of 131 strings)

Translated using Weblate (Latin)

Currently translated at 87.5% (7 of 8 strings)

Translated using Weblate (Latin)

Currently translated at 42.3% (47 of 111 strings)

Translated using Weblate (Latin)

Currently translated at 42.3% (47 of 111 strings)

Translated using Weblate (Latin)

Currently translated at 19.4% (35 of 180 strings)

Translated using Weblate (Latin)

Currently translated at 98.3% (60 of 61 strings)

Translated using Weblate (Italian)

Currently translated at 99.0% (201 of 203 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (366 of 366 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (366 of 366 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Japanese)

Currently translated at 99.7% (695 of 697 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 97.7% (128 of 131 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Croatian)

Currently translated at 12.6% (14 of 111 strings)

Co-authored-by: Altariel <altariel.habitica@gmail.com>
Co-authored-by: Simon Coast <shimmumah@mailfence.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: mattya 226 <worldworld1114@gmail.com>
Co-authored-by: xioxi <potentiallytyler@gmail.com>
Co-authored-by: そら <comi4work@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/la/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/front/la/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/it/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/la/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/la/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/hr/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/la/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/it/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Groups
Translation: Habitica/Inventory
Translation: Habitica/Messages
Translation: Habitica/Pets
Translation: Habitica/Questscontent
Translation: Habitica/Subscriber
2022-05-19 17:49:48 +02:00
SabreCat
980e35880f fix(login): sanitize redirect 2022-05-16 15:36:09 -05:00
230 changed files with 4408 additions and 4335 deletions

View File

@@ -119,7 +119,7 @@ function path(obj, path, def) {
* @param {String} path dot separated
* @param {*} def default value ( if result undefined )
* @returns {*}
* http://stackoverflow.com/a/16190716
* https://stackoverflow.com/a/16190716
* Usage: console.log(path(someObject, pathname));
*/
for(var i = 0,path = path.split('.'),len = path.length; i < len; i++){

View File

@@ -2,7 +2,7 @@
// TODO it might be better we just find() and save() all user objects using mongoose, and rely on our defined pre('save')
// and default values to "migrate" users. This way we can make sure those parts are working properly too
// @see http://stackoverflow.com/questions/14867697/mongoose-full-collection-scan
// @see https://stackoverflow.com/questions/14867697/mongoose-full-collection-scan
// Also, what do we think of a Mongoose Migration module? something like https://github.com/madhums/mongoose-migrate
// IMPORTANT NOTE: this migration was written when we were using version 3 of lodash.

View File

@@ -19,7 +19,7 @@ const Timer = require('./utils/timer');
const connectToDb = require('./utils/connect').connectToDb;
const closeDb = require('./utils/connect').closeDb;
const message = '`This party\'s collection quest has been made easier! For details, refer to http://habitica.fandom.com/wiki/User_blog:LadyAlys/Collection_Quests_are_Now_Easier`';
const message = '`This party\'s collection quest has been made easier! For details, refer to https://habitica.fandom.com/wiki/User_blog:LadyAlys/Collection_Quests_are_Now_Easier`';
const timer = new Timer();

View File

@@ -16,7 +16,7 @@ AWS.config.update({
const BUCKET_NAME = config.S3.bucket;
const s3 = new AWS.S3();
// Adapted from http://stackoverflow.com/a/22210077/2601552
// Adapted from https://stackoverflow.com/a/22210077/2601552
function uploadFile (buffer, fileName) {
return new Promise((resolve, reject) => {
s3.putObject({

View File

@@ -2,7 +2,7 @@
// For some reason people often to contact me to cancel their sub,
// rather than do it online. Even when I point them to
// the FAQ (http://goo.gl/1uoPGQ) they insist...
// the FAQ (https://habitica.fandom.com/wiki/FAQ) they insist...
db.users.update(
{ _id: '' },

1023
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,11 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.231.0",
"version": "4.236.1",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.17.10",
"@babel/preset-env": "^7.17.10",
"@babel/core": "^7.18.5",
"@babel/preset-env": "^7.18.2",
"@babel/register": "^7.17.7",
"@google-cloud/trace-agent": "^5.1.6",
"@parse/node-apn": "^5.1.3",
@@ -30,20 +30,20 @@
"express": "^4.18.1",
"express-basic-auth": "^1.2.1",
"express-validator": "^5.2.0",
"glob": "^8.0.1",
"glob": "^8.0.3",
"got": "^11.8.3",
"gulp": "^4.0.0",
"gulp-babel": "^8.0.0",
"gulp-imagemin": "^7.1.0",
"gulp-nodemon": "^2.5.0",
"gulp.spritesmith": "^6.12.1",
"gulp.spritesmith": "^6.13.0",
"habitica-markdown": "^3.0.0",
"helmet": "^4.6.0",
"image-size": "^1.0.1",
"in-app-purchase": "^1.11.3",
"js2xmlparser": "^4.0.2",
"jsonwebtoken": "^8.5.1",
"jwks-rsa": "^2.1.1",
"jwks-rsa": "^2.1.4",
"lodash": "^4.17.21",
"merge-stream": "^2.0.0",
"method-override": "^3.0.0",
@@ -68,7 +68,7 @@
"rimraf": "^3.0.2",
"short-uuid": "^4.2.0",
"stripe": "^8.222.0",
"superagent": "^7.1.3",
"superagent": "^7.1.6",
"universal-analytics": "^0.5.3",
"useragent": "^2.1.9",
"uuid": "^8.3.2",

View File

@@ -326,6 +326,36 @@ describe('Google Payments', () => {
});
});
it('should cancel a user subscription with multiple inactive subscriptions', async () => {
const laterDate = moment.utc().add(7, 'days');
iap.getPurchaseData.restore();
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')
.returns([{ expirationDate, autoRenewing: false },
{ expirationDate: laterDate, autoRenewing: false },
]);
await googlePayments.cancelSubscribe(user, headers);
expect(iapSetupStub).to.be.calledOnce;
expect(iapValidateStub).to.be.calledOnce;
expect(iapValidateStub).to.be.calledWith(iap.GOOGLE, {
data: receipt,
signature,
});
expect(iapIsValidatedStub).to.be.calledOnce;
expect(iapIsValidatedStub).to.be.calledWith({
expirationDate,
});
expect(iapGetPurchaseDataStub).to.be.calledOnce;
expect(paymentCancelSubscriptionSpy).to.be.calledOnce;
expect(paymentCancelSubscriptionSpy).to.be.calledWith({
user,
paymentMethod: googlePayments.constants.PAYMENT_METHOD_GOOGLE,
nextBill: laterDate.toDate(),
headers,
});
});
it('should not cancel a user subscription with autorenew', async () => {
iap.getPurchaseData.restore();
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')
@@ -346,5 +376,28 @@ describe('Google Payments', () => {
expect(paymentCancelSubscriptionSpy).to.not.be.called;
});
it('should not cancel a user subscription with multiple subscriptions with one autorenew', async () => {
iap.getPurchaseData.restore();
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')
.returns([{ expirationDate, autoRenewing: false },
{ autoRenewing: true },
{ expirationDate, autoRenewing: false }]);
await googlePayments.cancelSubscribe(user, headers);
expect(iapSetupStub).to.be.calledOnce;
expect(iapValidateStub).to.be.calledOnce;
expect(iapValidateStub).to.be.calledWith(iap.GOOGLE, {
data: receipt,
signature,
});
expect(iapIsValidatedStub).to.be.calledOnce;
expect(iapIsValidatedStub).to.be.calledWith({
expirationDate,
});
expect(iapGetPurchaseDataStub).to.be.calledOnce;
expect(paymentCancelSubscriptionSpy).to.not.be.called;
});
});
});

View File

@@ -402,7 +402,7 @@ describe('POST /chat', () => {
});
});
it('does not allow slurs in private groups', async () => {
it('allows slurs in private groups', async () => {
const { group, members } = await createAndPopulateGroup({
groupDetails: {
name: 'Party',
@@ -412,42 +412,9 @@ describe('POST /chat', () => {
members: 1,
});
await expect(members[0].post(`/groups/${group._id}/chat`, { message: testSlurMessage })).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
message: t('bannedSlurUsed'),
});
const message = await members[0].post(`/groups/${group._id}/chat`, { message: testSlurMessage });
// Email sent to mods
await sleep(0.5);
expect(email.sendTxn).to.be.calledThrice;
expect(email.sendTxn.args[2][1]).to.eql('slur-report-to-mods');
// Slack message to mods
expect(IncomingWebhook.prototype.send).to.be.calledOnce;
/* eslint-disable camelcase */
expect(IncomingWebhook.prototype.send).to.be.calledWith({
text: `${members[0].profile.name} (${members[0].id}) tried to post a slur`,
attachments: [{
fallback: 'Slur Message',
color: 'danger',
author_name: `@${members[0].auth.local.username} ${members[0].profile.name} (${members[0].auth.local.email}; ${members[0]._id})`,
title: 'Slur in Party - (private party)',
title_link: undefined,
text: testSlurMessage,
mrkdwn_in: [
'text',
],
}],
});
/* eslint-enable camelcase */
// Chat privileges are revoked
await expect(members[0].post(`/groups/${groupWithChat._id}/chat`, { message: testMessage })).to.eventually.be.rejected.and.eql({
code: 401,
error: 'NotAuthorized',
message: t('chatPrivilegesRevoked'),
});
expect(message.message.id).to.exist;
});
it('errors when slur is typed in mixed case', async () => {

View File

@@ -7,7 +7,7 @@ import {
describe('POST /group/:groupId/remove-manager', () => {
let leader; let nonLeader; let
groupToUpdate;
const groupName = 'Test Public Guild';
const groupName = 'Test Private Guild';
const groupType = 'guild';
let nonManager;
@@ -20,9 +20,10 @@ describe('POST /group/:groupId/remove-manager', () => {
groupDetails: {
name: groupName,
type: groupType,
privacy: 'public',
privacy: 'private',
},
members: 2,
upgradeToGroupPlan: true,
});
groupToUpdate = group;
@@ -83,7 +84,7 @@ describe('POST /group/:groupId/remove-manager', () => {
await nonLeader.sync();
expect(nonLeader.notifications.length).to.equal(0);
expect(nonLeader.notifications.length).to.equal(1); // user gets mystery items
expect(updatedGroup.managers[nonLeader._id]).to.not.exist;
});
});

View File

@@ -1,33 +0,0 @@
import superagent from 'superagent';
import nconf from 'nconf';
import {
generateUser,
translate as t,
} from '../../../../helpers/api-integration/v3';
const API_TEST_SERVER_PORT = nconf.get('PORT');
xdescribe('GET /qr-code/user/:memberId', () => {
let user;
before(async () => {
user = await generateUser();
});
it('validates req.params.memberId', async () => {
await expect(user.get('/qr-code/user/invalidUUID')).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
message: t('invalidReqParams'),
});
});
it('redirects to profile page', async () => {
const url = `http://localhost:${API_TEST_SERVER_PORT}/qr-code/user/${user._id}`;
const response = await superagent.get(url).end((err, res) => {
expect(err).to.be(undefined);
return res;
});
expect(response.status).to.eql(200);
expect(response.request.url).to.eql(`http://localhost:${API_TEST_SERVER_PORT}/static/front/#?memberId=${user._id}`);
});
});

View File

@@ -134,6 +134,7 @@ describe('GET /tasks/:id', () => {
type: 'guild',
},
members: 1,
upgradeToGroupPlan: true,
});
group = groupData.group;

View File

@@ -7,7 +7,11 @@ import {
describe('POST /tasks/clearCompletedTodos', () => {
it('deletes all completed todos except the ones from a challenge and group', async () => {
const user = await generateUser({ balance: 1 });
const guild = await generateGroup(user);
const guild = await generateGroup(
user,
{},
{ 'purchased.plan.customerId': 'group-unlimited' },
);
const challenge = await generateChallenge(user, guild);
await user.post(`/challenges/${challenge._id}/join`);

View File

@@ -19,6 +19,7 @@ describe('Groups DELETE /tasks/:id', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;
@@ -77,18 +78,18 @@ describe('Groups DELETE /tasks/:id', () => {
await user.sync();
await member2.sync();
expect(user.notifications.length).to.equal(2);
expect(user.notifications[1].type).to.equal('GROUP_TASK_APPROVAL');
expect(member2.notifications.length).to.equal(2);
expect(member2.notifications[1].type).to.equal('GROUP_TASK_APPROVAL');
expect(user.notifications.length).to.equal(3); // mystery items
expect(user.notifications[2].type).to.equal('GROUP_TASK_APPROVAL');
expect(member2.notifications.length).to.equal(3);
expect(member2.notifications[2].type).to.equal('GROUP_TASK_APPROVAL');
await member2.del(`/tasks/${task._id}`);
await user.sync();
await member2.sync();
expect(user.notifications.length).to.equal(1);
expect(member2.notifications.length).to.equal(1);
expect(user.notifications.length).to.equal(2);
expect(member2.notifications.length).to.equal(2);
});
it('deletes task from assigned user', async () => {

View File

@@ -18,6 +18,7 @@ describe('GET /approvals/group/:groupId', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;

View File

@@ -36,7 +36,7 @@ describe('GET /tasks/group/:groupId', () => {
before(async () => {
user = await generateUser();
group = await generateGroup(user);
group = await generateGroup(user, {}, { 'purchased.plan.customerId': 'group-unlimited' });
});
it('returns error when group is not found', async () => {

View File

@@ -19,6 +19,7 @@ describe('POST /tasks/:id/approve/:userId', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;
@@ -63,9 +64,9 @@ describe('POST /tasks/:id/approve/:userId', () => {
await member.sync();
expect(member.notifications.length).to.equal(2);
expect(member.notifications[1].type).to.equal('GROUP_TASK_APPROVED');
expect(member.notifications[1].data.message).to.equal(t('yourTaskHasBeenApproved', { taskText: task.text }));
expect(member.notifications.length).to.equal(3);
expect(member.notifications[2].type).to.equal('GROUP_TASK_APPROVED');
expect(member.notifications[2].data.message).to.equal(t('yourTaskHasBeenApproved', { taskText: task.text }));
memberTasks = await member.get('/tasks/user');
syncedTask = find(memberTasks, findAssignedTask);
@@ -89,9 +90,9 @@ describe('POST /tasks/:id/approve/:userId', () => {
await member2.post(`/tasks/${task._id}/approve/${member._id}`);
await member.sync();
expect(member.notifications.length).to.equal(2);
expect(member.notifications[1].type).to.equal('GROUP_TASK_APPROVED');
expect(member.notifications[1].data.message).to.equal(t('yourTaskHasBeenApproved', { taskText: task.text }));
expect(member.notifications.length).to.equal(3);
expect(member.notifications[2].type).to.equal('GROUP_TASK_APPROVED');
expect(member.notifications[2].data.message).to.equal(t('yourTaskHasBeenApproved', { taskText: task.text }));
memberTasks = await member.get('/tasks/user');
syncedTask = find(memberTasks, findAssignedTask);
@@ -113,18 +114,18 @@ describe('POST /tasks/:id/approve/:userId', () => {
await user.sync();
await member2.sync();
expect(user.notifications.length).to.equal(2);
expect(user.notifications[1].type).to.equal('GROUP_TASK_APPROVAL');
expect(member2.notifications.length).to.equal(1);
expect(member2.notifications[0].type).to.equal('GROUP_TASK_APPROVAL');
expect(user.notifications.length).to.equal(3);
expect(user.notifications[2].type).to.equal('GROUP_TASK_APPROVAL');
expect(member2.notifications.length).to.equal(2);
expect(member2.notifications[1].type).to.equal('GROUP_TASK_APPROVAL');
await member2.post(`/tasks/${task._id}/approve/${member._id}`);
await user.sync();
await member2.sync();
expect(user.notifications.length).to.equal(1);
expect(member2.notifications.length).to.equal(0);
expect(user.notifications.length).to.equal(2);
expect(member2.notifications.length).to.equal(1);
});
it('prevents double approval on a task', async () => {

View File

@@ -19,6 +19,7 @@ describe('POST /tasks/:id/needs-work/:userId', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;
@@ -72,7 +73,7 @@ describe('POST /tasks/:id/needs-work/:userId', () => {
expect(syncedTask.group.approval.requestedDate).to.equal(undefined);
// Check that the notification is correct
expect(member.notifications.length).to.equal(initialNotifications + 2);
expect(member.notifications.length).to.equal(initialNotifications + 3);
const notification = member.notifications[member.notifications.length - 1];
expect(notification.type).to.equal('GROUP_TASK_NEEDS_WORK');
@@ -121,7 +122,7 @@ describe('POST /tasks/:id/needs-work/:userId', () => {
expect(syncedTask.group.approval.requested).to.equal(false);
expect(syncedTask.group.approval.requestedDate).to.equal(undefined);
expect(member.notifications.length).to.equal(initialNotifications + 2);
expect(member.notifications.length).to.equal(initialNotifications + 3);
const notification = member.notifications[member.notifications.length - 1];
expect(notification.type).to.equal('GROUP_TASK_NEEDS_WORK');

View File

@@ -19,6 +19,7 @@ describe('POST /tasks/:id/score/:direction', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;
@@ -53,15 +54,15 @@ describe('POST /tasks/:id/score/:direction', () => {
await user.sync();
expect(user.notifications.length).to.equal(2);
expect(user.notifications[1].type).to.equal('GROUP_TASK_APPROVAL');
expect(user.notifications[1].data.message).to.equal(t('userHasRequestedTaskApproval', {
expect(user.notifications.length).to.equal(3);
expect(user.notifications[2].type).to.equal('GROUP_TASK_APPROVAL');
expect(user.notifications[2].data.message).to.equal(t('userHasRequestedTaskApproval', {
user: member.auth.local.username,
taskName: updatedTask.text,
taskId: updatedTask._id,
direction,
}, 'cs')); // This test only works if we have the notification translated
expect(user.notifications[1].data.groupId).to.equal(guild._id);
expect(user.notifications[2].data.groupId).to.equal(guild._id);
expect(updatedTask.group.approval.requested).to.equal(true);
expect(updatedTask.group.approval.requestedDate).to.be.a('string'); // date gets converted to a string as json doesn't have a Date type
@@ -80,25 +81,25 @@ describe('POST /tasks/:id/score/:direction', () => {
await user.sync();
await member2.sync();
expect(user.notifications.length).to.equal(2);
expect(user.notifications[1].type).to.equal('GROUP_TASK_APPROVAL');
expect(user.notifications[1].data.message).to.equal(t('userHasRequestedTaskApproval', {
expect(user.notifications.length).to.equal(3);
expect(user.notifications[2].type).to.equal('GROUP_TASK_APPROVAL');
expect(user.notifications[2].data.message).to.equal(t('userHasRequestedTaskApproval', {
user: member.auth.local.username,
taskName: updatedTask.text,
taskId: updatedTask._id,
direction,
}));
expect(user.notifications[1].data.groupId).to.equal(guild._id);
expect(user.notifications[2].data.groupId).to.equal(guild._id);
expect(member2.notifications.length).to.equal(1);
expect(member2.notifications[0].type).to.equal('GROUP_TASK_APPROVAL');
expect(member2.notifications[0].data.message).to.equal(t('userHasRequestedTaskApproval', {
expect(member2.notifications.length).to.equal(2);
expect(member2.notifications[1].type).to.equal('GROUP_TASK_APPROVAL');
expect(member2.notifications[1].data.message).to.equal(t('userHasRequestedTaskApproval', {
user: member.auth.local.username,
taskName: updatedTask.text,
taskId: updatedTask._id,
direction,
}));
expect(member2.notifications[0].data.groupId).to.equal(guild._id);
expect(member2.notifications[1].data.groupId).to.equal(guild._id);
});
it('errors when approval has already been requested', async () => {

View File

@@ -26,6 +26,7 @@ describe('POST /tasks/group/:groupid', () => {
privacy: 'private',
},
members: 1,
upgradeToGroupPlan: true,
});
guild = group;

View File

@@ -21,6 +21,7 @@ describe('POST /tasks/:taskId/assign/:memberId', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;
@@ -103,14 +104,14 @@ describe('POST /tasks/:taskId/assign/:memberId', () => {
await member2.sync();
const groupTask = await user.get(`/tasks/group/${guild._id}`);
expect(user.notifications.length).to.equal(2); // includes Guild Joined achievement
expect(user.notifications[1].type).to.equal('GROUP_TASK_CLAIMED');
expect(user.notifications[1].data.taskId).to.equal(groupTask[0]._id);
expect(user.notifications[1].data.groupId).to.equal(guild._id);
expect(member2.notifications.length).to.equal(1);
expect(member2.notifications[0].type).to.equal('GROUP_TASK_CLAIMED');
expect(member2.notifications[0].data.taskId).to.equal(groupTask[0]._id);
expect(member2.notifications[0].data.groupId).to.equal(guild._id);
expect(user.notifications.length).to.equal(3); // includes Guild Joined achievement
expect(user.notifications[2].type).to.equal('GROUP_TASK_CLAIMED');
expect(user.notifications[2].data.taskId).to.equal(groupTask[0]._id);
expect(user.notifications[2].data.groupId).to.equal(guild._id);
expect(member2.notifications.length).to.equal(2);
expect(member2.notifications[1].type).to.equal('GROUP_TASK_CLAIMED');
expect(member2.notifications[1].data.taskId).to.equal(groupTask[0]._id);
expect(member2.notifications[1].data.groupId).to.equal(guild._id);
});
it('assigns a task to a user', async () => {
@@ -130,9 +131,9 @@ describe('POST /tasks/:taskId/assign/:memberId', () => {
const groupTask = await user.get(`/tasks/group/${guild._id}`);
expect(member.notifications.length).to.equal(1);
expect(member.notifications[0].type).to.equal('GROUP_TASK_ASSIGNED');
expect(member.notifications[0].taskId).to.equal(groupTask._id);
expect(member.notifications.length).to.equal(2);
expect(member.notifications[1].type).to.equal('GROUP_TASK_ASSIGNED');
expect(member.notifications[1].taskId).to.equal(groupTask._id);
});
it('assigns a task to multiple users', async () => {

View File

@@ -9,7 +9,7 @@ describe('POST group-tasks/:taskId/move/to/:position', () => {
beforeEach(async () => {
user = await generateUser({ balance: 1 });
guild = await generateGroup(user, { type: 'guild' });
guild = await generateGroup(user, { type: 'guild' }, { 'purchased.plan.customerId': 'group-unlimited' });
});
it('can move task to new position', async () => {

View File

@@ -21,6 +21,7 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;
@@ -91,7 +92,7 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => {
await user.post(`/tasks/${task._id}/unassign/${member._id}`);
await member.sync();
expect(member.notifications.length).to.equal(0);
expect(member.notifications.length).to.equal(1); // mystery items
});
it('unassigns a user and only that user from a task', async () => {

View File

@@ -22,6 +22,7 @@ describe('PUT /tasks/:id', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;

View File

@@ -15,6 +15,7 @@ describe('DELETE group /tasks/:taskId/checklist/:itemId', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;

View File

@@ -15,6 +15,7 @@ describe('POST group /tasks/:taskId/checklist/', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;

View File

@@ -15,6 +15,7 @@ describe('PUT group /tasks/:taskId/checklist/:itemId', () => {
type: 'guild',
},
members: 2,
upgradeToGroupPlan: true,
});
guild = group;

View File

@@ -139,7 +139,7 @@ describe('POST /user/class/cast/:spellId', () => {
});
it('returns an error if a group task was targeted', async () => {
const { group, groupLeader } = await createAndPopulateGroup();
const { group, groupLeader } = await createAndPopulateGroup({ upgradeToGroupPlan: true });
const groupTask = await groupLeader.post(`/tasks/group/${group._id}`, {
text: 'todo group',
@@ -266,7 +266,7 @@ describe('POST /user/class/cast/:spellId', () => {
});
it('searing brightness does not affect challenge or group tasks', async () => {
const guild = await generateGroup(user);
const guild = await generateGroup(user, {}, { 'purchased.plan.customerId': 'group-unlimited' });
const challenge = await generateChallenge(user, guild);
await user.post(`/challenges/${challenge._id}/join`);
await user.post(`/tasks/challenge/${challenge._id}`, {

View File

@@ -88,7 +88,7 @@ describe('POST /user/reset', () => {
});
it('does not delete challenge or group tasks', async () => {
const guild = await generateGroup(user);
const guild = await generateGroup(user, {}, { 'purchased.plan.customerId': 'group-unlimited' });
const challenge = await generateChallenge(user, guild);
await user.post(`/challenges/${challenge._id}/join`);
await user.post(`/tasks/challenge/${challenge._id}`, {

View File

@@ -124,7 +124,7 @@ describe('POST /user/class/cast/:spellId', () => {
});
it('returns an error if a group task was targeted', async () => {
const { group, groupLeader } = await createAndPopulateGroup();
const { group, groupLeader } = await createAndPopulateGroup({ upgradeToGroupPlan: true });
const groupTask = await groupLeader.post(`/tasks/group/${group._id}`, {
text: 'todo group',
@@ -234,7 +234,7 @@ describe('POST /user/class/cast/:spellId', () => {
});
it('searing brightness does not affect challenge or group tasks', async () => {
const guild = await generateGroup(user);
const guild = await generateGroup(user, {}, { 'purchased.plan.customerId': 'group-unlimited' });
const challenge = await generateChallenge(user, guild);
await user.post(`/challenges/${challenge._id}/join`);
await user.post(`/tasks/challenge/${challenge._id}`, {

View File

@@ -88,7 +88,7 @@ describe('POST /user/reset', () => {
});
it('does not delete challenge or group tasks', async () => {
const guild = await generateGroup(user);
const guild = await generateGroup(user, {}, { 'purchased.plan.customerId': 'group-unlimited' });
const challenge = await generateChallenge(user, guild);
await user.post(`/challenges/${challenge._id}/join`);
await user.post(`/tasks/challenge/${challenge._id}`, {

View File

@@ -28,7 +28,7 @@ app.post('/webhooks/:id', (req, res) => {
});
// Helps close down server from within mocha test
// See http://stackoverflow.com/a/37054753/2601552
// See https://stackoverflow.com/a/37054753/2601552
const sockets = {};
server.on('connection', socket => {
const id = uuid();

View File

@@ -40,7 +40,6 @@ function _requestMaker (user, method, additionalSets = {}) {
|| route.indexOf('/paypal') === 0
|| route.indexOf('/amazon') === 0
|| route.indexOf('/stripe') === 0
|| route.indexOf('/qr-code') === 0
|| route.indexOf('/analytics') === 0
) {
url += `${route}`;

View File

@@ -5,6 +5,8 @@ import { v4 as generateUUID } from 'uuid';
import { ApiUser, ApiGroup, ApiChallenge } from '../api-classes';
import { requester } from '../requester';
import * as Tasks from '../../../../website/server/models/task';
import payments from '../../../../website/server/libs/payments/payments';
import { model as User } from '../../../../website/server/models/user';
// Creates a new user and returns it
// If you need the user to have specific requirements,
@@ -77,6 +79,26 @@ export async function generateGroup (leader, details = {}, update = {}) {
return apiGroup;
}
async function _upgradeToGroupPlan (groupLeader, group) {
const groupLeaderModel = await User.findById(groupLeader._id).exec();
// Create subscription
const paymentData = {
user: groupLeaderModel,
groupId: group._id,
sub: {
key: 'basic_3mo',
},
customerId: 'customer-id',
paymentMethod: 'Payment Method',
headers: {
'x-client': 'habitica-web',
'user-agent': '',
},
};
await payments.createSubscription(paymentData);
}
// This is generate group + the ability to create
// real users to populate it. The settings object
// takes in:
@@ -95,6 +117,7 @@ export async function generateGroup (leader, details = {}, update = {}) {
export async function createAndPopulateGroup (settings = {}) {
const numberOfMembers = settings.members || 0;
const numberOfInvites = settings.invites || 0;
const upgradeToGroupPlan = settings.upgradeToGroupPlan || false;
const { groupDetails } = settings;
const leaderDetails = settings.leaderDetails || { balance: 10 };
@@ -124,6 +147,10 @@ export async function createAndPopulateGroup (settings = {}) {
await Promise.all(invitees.map(invitee => invitee.sync()));
if (upgradeToGroupPlan) {
await _upgradeToGroupPlan(groupLeader, group);
}
return {
groupLeader,
group,

File diff suppressed because it is too large Load Diff

View File

@@ -13,26 +13,27 @@
"storybook:serve": "vue-cli-service storybook:serve -p 6006 -c config/storybook"
},
"dependencies": {
"@storybook/addon-actions": "6.4.19",
"@storybook/addon-actions": "6.5.8",
"@storybook/addon-knobs": "6.2.9",
"@storybook/addon-links": "6.4.18",
"@storybook/addon-links": "6.5.8",
"@storybook/addon-notes": "5.3.21",
"@storybook/addons": "6.4.19",
"@storybook/addons": "6.5.9",
"@storybook/vue": "6.3.13",
"@vue/cli-plugin-babel": "^4.5.15",
"@vue/cli-plugin-eslint": "^4.5.15",
"@vue/cli-plugin-eslint": "^4.5.17",
"@vue/cli-plugin-router": "^4.5.15",
"@vue/cli-plugin-unit-mocha": "^4.5.15",
"@vue/cli-service": "^4.5.15",
"@vue/test-utils": "1.0.0-beta.29",
"amplitude-js": "^8.17.0",
"amplitude-js": "^8.18.4",
"axios": "^0.25.0",
"axios-progress-bar": "^1.2.0",
"babel-eslint": "^10.1.0",
"bootstrap": "^4.6.0",
"bootstrap-vue": "^2.21.2",
"bootstrap-vue": "^2.22.0",
"chai": "^4.3.6",
"core-js": "^3.21.0",
"core-js": "^3.22.8",
"dompurify": "^2.3.8",
"eslint": "^6.8.0",
"eslint-config-habitrpg": "^6.2.0",
"eslint-plugin-mocha": "^5.3.0",
@@ -40,14 +41,14 @@
"habitica-markdown": "^3.0.0",
"hellojs": "^1.19.5",
"inspectpack": "^4.7.1",
"intro.js": "^5.0.0",
"intro.js": "^5.1.0",
"jquery": "^3.6.0",
"lodash": "^4.17.21",
"moment": "^2.29.1",
"nconf": "^0.11.3",
"moment": "^2.29.3",
"nconf": "^0.12.0",
"sass": "^1.34.0",
"sass-loader": "^8.0.2",
"smartbanner.js": "^1.17.0",
"smartbanner.js": "^1.19.0",
"svg-inline-loader": "^0.8.2",
"svg-url-loader": "^7.1.1",
"svgo": "^1.3.2",
@@ -57,13 +58,13 @@
"vue": "^2.6.14",
"vue-cli-plugin-storybook": "2.1.0",
"vue-mugen-scroll": "^0.2.6",
"vue-router": "^3.5.3",
"vue-router": "^3.5.4",
"vue-template-compiler": "^2.6.14",
"vuedraggable": "^2.24.3",
"vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#153d339e4dbebb73733658aeda1d5b7fcc55b0a0",
"webpack": "^4.46.0"
},
"devDependencies": {
"@babel/plugin-proposal-optional-chaining": "^7.16.7"
"@babel/plugin-proposal-optional-chaining": "^7.17.12"
}
}

View File

@@ -183,6 +183,11 @@
width: 48px;
height: 52px;
}
.achievement-groupsBeta20222x {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/achievement-groupsBeta20222x.png');
width: 67px;
height: 67px;
}
.achievement-guild2x {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/achievement-guild2x.png');
width: 48px;
@@ -600,6 +605,11 @@
width: 141px;
height: 147px;
}
.background_beach_with_dunes {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_beach_with_dunes.png');
width: 141px;
height: 147px;
}
.background_beehive {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_beehive.png');
width: 141px;
@@ -615,6 +625,11 @@
width: 141px;
height: 147px;
}
.background_bioluminescent_waves {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_bioluminescent_waves.png');
width: 141px;
height: 147px;
}
.background_birch_forest {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_birch_forest.png');
width: 141px;
@@ -1384,6 +1399,11 @@
width: 141px;
height: 147px;
}
.background_mountain_waterfall {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_mountain_waterfall.png');
width: 141px;
height: 147px;
}
.background_mystical_observatory {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_mystical_observatory.png');
width: 141px;
@@ -1554,6 +1574,11 @@
width: 141px;
height: 147px;
}
.background_sailboat_at_sunset {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_sailboat_at_sunset.png');
width: 141px;
height: 147px;
}
.background_salt_lake {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_salt_lake.png');
width: 141px;
@@ -1864,11 +1889,21 @@
width: 141px;
height: 147px;
}
.background_underwater_cave {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_underwater_cave.png');
width: 141px;
height: 147px;
}
.background_underwater_ruins {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_underwater_ruins.png');
width: 141px;
height: 147px;
}
.background_underwater_statues {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_underwater_statues.png');
width: 141px;
height: 147px;
}
.background_underwater_vents {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_underwater_vents.png');
width: 141px;
@@ -2111,6 +2146,11 @@
width: 68px;
height: 68px;
}
.icon_background_beach_with_dunes {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_beach_with_dunes.png');
width: 67px;
height: 69px;
}
.icon_background_beehive {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_beehive.png');
width: 68px;
@@ -2126,6 +2166,11 @@
width: 68px;
height: 68px;
}
.icon_background_bioluminescent_waves {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_bioluminescent_waves.png');
width: 68px;
height: 68px;
}
.icon_background_birch_forest {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_birch_forest.png');
width: 68px;
@@ -2900,6 +2945,11 @@
width: 68px;
height: 68px;
}
.icon_background_mountain_waterfall {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_mountain_waterfall.png');
width: 68px;
height: 68px;
}
.icon_background_mystical_observatory {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_mystical_observatory.png');
width: 68px;
@@ -3070,6 +3120,11 @@
width: 68px;
height: 68px;
}
.icon_background_sailboat_at_sunset {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_sailboat_at_sunset.png');
width: 68px;
height: 68px;
}
.icon_background_salt_lake {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_salt_lake.png');
width: 68px;
@@ -3385,11 +3440,21 @@
width: 68px;
height: 68px;
}
.icon_background_underwater_cave {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_underwater_cave.png');
width: 68px;
height: 68px;
}
.icon_background_underwater_ruins {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_underwater_ruins.png');
width: 68px;
height: 68px;
}
.icon_background_underwater_statues {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_underwater_statues.png');
width: 68px;
height: 68px;
}
.icon_background_underwater_vents {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_underwater_vents.png');
width: 68px;
@@ -18110,6 +18175,11 @@
width: 90px;
height: 90px;
}
.broad_armor_armoire_fancyPirateSuit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_fancyPirateSuit.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_farrierOutfit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_farrierOutfit.png');
width: 90px;
@@ -18555,6 +18625,11 @@
width: 90px;
height: 90px;
}
.head_armoire_fancyPirateHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_fancyPirateHat.png');
width: 114px;
height: 90px;
}
.head_armoire_fiddlersCap {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_fiddlersCap.png');
width: 114px;
@@ -19140,6 +19215,11 @@
width: 114px;
height: 87px;
}
.shield_armoire_treasureMap {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_treasureMap.png');
width: 114px;
height: 90px;
}
.shield_armoire_trustyUmbrella {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_trustyUmbrella.png');
width: 114px;
@@ -19290,6 +19370,11 @@
width: 68px;
height: 68px;
}
.shop_armor_armoire_fancyPirateSuit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_fancyPirateSuit.png');
width: 68px;
height: 68px;
}
.shop_armor_armoire_farrierOutfit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_farrierOutfit.png');
width: 68px;
@@ -19750,6 +19835,11 @@
width: 68px;
height: 68px;
}
.shop_head_armoire_fancyPirateHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_fancyPirateHat.png');
width: 68px;
height: 68px;
}
.shop_head_armoire_fiddlersCap {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_fiddlersCap.png');
width: 68px;
@@ -20335,6 +20425,11 @@
width: 68px;
height: 68px;
}
.shop_shield_armoire_treasureMap {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_treasureMap.png');
width: 68px;
height: 68px;
}
.shop_shield_armoire_trustyUmbrella {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_trustyUmbrella.png');
width: 68px;
@@ -20410,6 +20505,11 @@
width: 68px;
height: 68px;
}
.shop_weapon_armoire_blueKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_blueKite.png');
width: 68px;
height: 68px;
}
.shop_weapon_armoire_blueLongbow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_blueLongbow.png');
width: 68px;
@@ -20510,6 +20610,11 @@
width: 68px;
height: 68px;
}
.shop_weapon_armoire_greenKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_greenKite.png');
width: 68px;
height: 68px;
}
.shop_weapon_armoire_guardiansCrook {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_guardiansCrook.png');
width: 68px;
@@ -20625,11 +20730,21 @@
width: 68px;
height: 68px;
}
.shop_weapon_armoire_orangeKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_orangeKite.png');
width: 68px;
height: 68px;
}
.shop_weapon_armoire_paperCutter {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_paperCutter.png');
width: 68px;
height: 68px;
}
.shop_weapon_armoire_pinkKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_pinkKite.png');
width: 68px;
height: 68px;
}
.shop_weapon_armoire_pinkLongbow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_pinkLongbow.png');
width: 68px;
@@ -20770,6 +20885,11 @@
width: 68px;
height: 68px;
}
.shop_weapon_armoire_yellowKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_yellowKite.png');
width: 68px;
height: 68px;
}
.slim_armor_armoire_alchemistsRobe {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_alchemistsRobe.png');
width: 114px;
@@ -20900,6 +21020,11 @@
width: 90px;
height: 90px;
}
.slim_armor_armoire_fancyPirateSuit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_fancyPirateSuit.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_farrierOutfit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_farrierOutfit.png');
width: 90px;
@@ -21245,6 +21370,11 @@
width: 114px;
height: 90px;
}
.weapon_armoire_blueKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_blueKite.png');
width: 114px;
height: 90px;
}
.weapon_armoire_blueLongbow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_blueLongbow.png');
width: 90px;
@@ -21345,6 +21475,11 @@
width: 90px;
height: 90px;
}
.weapon_armoire_greenKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_greenKite.png');
width: 114px;
height: 90px;
}
.weapon_armoire_guardiansCrook {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_guardiansCrook.png');
width: 114px;
@@ -21460,11 +21595,21 @@
width: 90px;
height: 90px;
}
.weapon_armoire_orangeKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_orangeKite.png');
width: 114px;
height: 90px;
}
.weapon_armoire_paperCutter {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_paperCutter.png');
width: 114px;
height: 90px;
}
.weapon_armoire_pinkKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_pinkKite.png');
width: 114px;
height: 90px;
}
.weapon_armoire_pinkLongbow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_pinkLongbow.png');
width: 114px;
@@ -21605,6 +21750,11 @@
width: 90px;
height: 90px;
}
.weapon_armoire_yellowKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_yellowKite.png');
width: 114px;
height: 90px;
}
.armor_special_bardRobes {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/armor_special_bardRobes.png');
width: 90px;
@@ -26720,6 +26870,61 @@
width: 68px;
height: 68px;
}
.back_mystery_202206 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202206.png');
width: 114px;
height: 90px;
}
.head_mystery_202206 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202206.png');
width: 114px;
height: 90px;
}
.shop_back_mystery_202206 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_back_mystery_202206.png');
width: 68px;
height: 68px;
}
.shop_head_mystery_202206 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_mystery_202206.png');
width: 68px;
height: 68px;
}
.shop_set_mystery_202206 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202206.png');
width: 68px;
height: 68px;
}
.broad_armor_mystery_202207 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202207.png');
width: 117px;
height: 120px;
}
.head_mystery_202207 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202207.png');
width: 117px;
height: 120px;
}
.shop_armor_mystery_202207 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_mystery_202207.png');
width: 68px;
height: 68px;
}
.shop_head_mystery_202207 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_mystery_202207.png');
width: 68px;
height: 68px;
}
.shop_set_mystery_202207 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202207.png');
width: 68px;
height: 68px;
}
.slim_armor_mystery_202207 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202207.png');
width: 117px;
height: 120px;
}
.broad_armor_mystery_301404 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
width: 90px;
@@ -28775,6 +28980,26 @@
width: 117px;
height: 120px;
}
.broad_armor_special_summer2022Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2022Healer.png');
width: 117px;
height: 120px;
}
.broad_armor_special_summer2022Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2022Mage.png');
width: 124px;
height: 120px;
}
.broad_armor_special_summer2022Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2022Rogue.png');
width: 114px;
height: 90px;
}
.broad_armor_special_summer2022Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2022Warrior.png');
width: 117px;
height: 120px;
}
.broad_armor_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summerHealer.png');
width: 90px;
@@ -28945,6 +29170,26 @@
width: 117px;
height: 120px;
}
.head_special_summer2022Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2022Healer.png');
width: 117px;
height: 120px;
}
.head_special_summer2022Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2022Mage.png');
width: 117px;
height: 120px;
}
.head_special_summer2022Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2022Rogue.png');
width: 114px;
height: 90px;
}
.head_special_summer2022Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2022Warrior.png');
width: 117px;
height: 120px;
}
.head_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summerHealer.png');
width: 90px;
@@ -29075,6 +29320,21 @@
width: 114px;
height: 117px;
}
.shield_special_summer2022Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2022Healer.png');
width: 117px;
height: 120px;
}
.shield_special_summer2022Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2022Rogue.png');
width: 114px;
height: 90px;
}
.shield_special_summer2022Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2022Warrior.png');
width: 117px;
height: 120px;
}
.shield_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summerHealer.png');
width: 90px;
@@ -29230,6 +29490,26 @@
width: 68px;
height: 68px;
}
.shop_armor_special_summer2022Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_summer2022Healer.png');
width: 68px;
height: 68px;
}
.shop_armor_special_summer2022Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_summer2022Mage.png');
width: 68px;
height: 68px;
}
.shop_armor_special_summer2022Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_summer2022Rogue.png');
width: 68px;
height: 68px;
}
.shop_armor_special_summer2022Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_summer2022Warrior.png');
width: 68px;
height: 68px;
}
.shop_armor_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_summerHealer.png');
width: 68px;
@@ -29430,6 +29710,26 @@
width: 68px;
height: 68px;
}
.shop_head_special_summer2022Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_summer2022Healer.png');
width: 68px;
height: 68px;
}
.shop_head_special_summer2022Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_summer2022Mage.png');
width: 68px;
height: 68px;
}
.shop_head_special_summer2022Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_summer2022Rogue.png');
width: 68px;
height: 68px;
}
.shop_head_special_summer2022Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_summer2022Warrior.png');
width: 68px;
height: 68px;
}
.shop_head_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_summerHealer.png');
width: 68px;
@@ -29560,6 +29860,21 @@
width: 68px;
height: 68px;
}
.shop_shield_special_summer2022Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_summer2022Healer.png');
width: 68px;
height: 68px;
}
.shop_shield_special_summer2022Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_summer2022Rogue.png');
width: 68px;
height: 68px;
}
.shop_shield_special_summer2022Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_summer2022Warrior.png');
width: 68px;
height: 68px;
}
.shop_shield_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_summerHealer.png');
width: 68px;
@@ -29715,6 +30030,26 @@
width: 68px;
height: 68px;
}
.shop_weapon_special_summer2022Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_summer2022Healer.png');
width: 68px;
height: 68px;
}
.shop_weapon_special_summer2022Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_summer2022Mage.png');
width: 68px;
height: 68px;
}
.shop_weapon_special_summer2022Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_summer2022Rogue.png');
width: 68px;
height: 68px;
}
.shop_weapon_special_summer2022Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_summer2022Warrior.png');
width: 68px;
height: 68px;
}
.shop_weapon_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_summerHealer.png');
width: 68px;
@@ -29875,6 +30210,26 @@
width: 117px;
height: 120px;
}
.slim_armor_special_summer2022Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2022Healer.png');
width: 117px;
height: 120px;
}
.slim_armor_special_summer2022Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2022Mage.png');
width: 117px;
height: 120px;
}
.slim_armor_special_summer2022Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2022Rogue.png');
width: 114px;
height: 90px;
}
.slim_armor_special_summer2022Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2022Warrior.png');
width: 117px;
height: 120px;
}
.slim_armor_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summerHealer.png');
width: 90px;
@@ -30035,6 +30390,26 @@
width: 141px;
height: 147px;
}
.weapon_special_summer2022Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2022Healer.png');
width: 117px;
height: 120px;
}
.weapon_special_summer2022Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2022Mage.png');
width: 117px;
height: 120px;
}
.weapon_special_summer2022Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2022Rogue.png');
width: 114px;
height: 90px;
}
.weapon_special_summer2022Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2022Warrior.png');
width: 117px;
height: 120px;
}
.weapon_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summerHealer.png');
width: 90px;

View File

@@ -18,8 +18,10 @@ body {
// Restore the default styling for a elements without an href attribute
// that was changed in bootstrap 4.5.1
a:not([href]), a:not([href]):hover {
color: inherit;
text-decoration: none;
&:not([role=button]) {
color: inherit;
text-decoration: none;
}
}
a, a:not([href]):not([tabindex]) {

View File

@@ -1,27 +0,0 @@
<svg width="176" height="67" viewBox="0 0 176 67" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path fill="#77F4C7" d="M35.667 11.667 40 9.5l-4.333-2.167L33.5 3l-2.167 4.333L27 9.5l4.333 2.167L33.5 16z"/>
<path fill="#BDA8FF" d="M24.667 38.667 30 36l-5.333-2.667L22 28l-2.667 5.333L14 36l5.333 2.667L22 44z"/>
<path fill="#8EEDF6" d="M35.667 63.667 39 62l-3.333-1.667L34 57l-1.667 3.333L29 62l3.333 1.667L34 67z"/>
<path fill="#FFBE5D" d="M6.667 49.667 10 48l-3.333-1.667L5 43l-1.667 3.333L0 48l3.333 1.667L5 53z"/>
<path fill="#FFB6B8" d="M5.667 20.667 8 19.5l-2.333-1.167L4.5 16l-1.167 2.333L1 19.5l2.333 1.167L4.5 23z"/>
<g>
<path fill="#77F4C7" d="M140.333 11.667 136 9.5l4.333-2.167L142.5 3l2.167 4.333L149 9.5l-4.333 2.167L142.5 16z"/>
<path fill="#BDA8FF" d="M151.333 38.667 146 36l5.333-2.667L154 28l2.667 5.333L162 36l-5.333 2.667L154 44z"/>
<path fill="#8EEDF6" d="M140.333 63.667 137 62l3.333-1.667L142 57l1.667 3.333L147 62l-3.333 1.667L142 67z"/>
<path fill="#FFBE5D" d="M169.333 49.667 166 48l3.333-1.667L171 43l1.667 3.333L176 48l-3.333 1.667L171 53z"/>
<path fill="#FFB6B8" d="M170.333 20.667 168 19.5l2.333-1.167L171.5 16l1.167 2.333L175 19.5l-2.333 1.167L171.5 23z"/>
</g>
<g>
<path d="M81.117 13.904c-2.139-4.838-6.274-9.113-11.25-9.324-4.976-.211-7.828 3.779-6.367 7.309 1.461 3.53 4.94 4.177 16.227 7.202 3.204.858 3.528-.35 1.39-5.187z" stroke="#22AEB7" stroke-width="4"/>
<path d="M93.833 13.904c2.138-4.838 6.273-9.113 11.25-9.324 4.975-.211 7.828 3.779 6.367 7.309-1.462 3.53-4.94 4.177-16.227 7.202-3.205.858-3.528-.35-1.39-5.187z" stroke="#38C9C6" stroke-width="4"/>
<path d="M87.128 11c-9.738 0-3.907 11.145 0 11.145 3.908 0 9.74-11.145 0-11.145z" fill="#46DDDA"/>
<path fill="#6133B4" d="M62 33h52v34H62zM56 21h64v12H56z"/>
<path fill-opacity=".5" fill="#FFF" style="mix-blend-mode:soft-light" d="M32 30h26v34H32z" transform="translate(56 3)"/>
<path fill="#8EEDF6" d="M88 33h6v34h-6z"/>
<path fill="#3BCAD7" d="M82 33h6v34h-6zM76 21h12v12H76z"/>
<path fill="#8EEDF6" d="M88 21h12v12H88z"/>
<path fill-opacity=".2" fill="#000" style="mix-blend-mode:multiply" d="M6 30h26v6H6zM20 18h12v6H20zM0 24h20v6H0zM44 24h20v6H44zM32 18h12v6H32zM6 58h26v6H6zM32 30h26v6H32zM32 58h26v6H32z" transform="translate(56 3)"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Icon/Close</title>
<g id="Modals" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Shop-Modals" transform="translate(-183.000000, -655.000000)" fill="#878190" fill-rule="nonzero">
<g id="Icon/Close" transform="translate(183.000000, 655.000000)">
<polygon id="Mask" points="12.1973467 2 14 3.80265326 9.80187117 8 14 12.1973467 12.1973467 14 8 9.80187117 3.80265326 14 2 12.1973467 6.19812883 8 2 3.80265326 3.80265326 2 8 6.19812883"></polygon>
</g>
</g>
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
<g fill="none" fill-rule="evenodd" stroke="#A5A1AC" stroke-width="2">
<path d="M1 11L11 1M11 11L1 1"/>
</g>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 747 B

After

Width:  |  Height:  |  Size: 215 B

View File

@@ -34,7 +34,7 @@
</li>
<li>
<a
href="http://blog.habitrpg.com/"
href="https://blog.habitrpg.com/"
target="_blank"
>{{ $t('tumblr') }}</a>
</li>

View File

@@ -614,6 +614,7 @@ import axios from 'axios';
import hello from 'hellojs';
import debounce from 'lodash/debounce';
import isEmail from 'validator/lib/isEmail';
import DOMPurify from 'dompurify';
import { buildAppleAuthUrl } from '../../libs/auth';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
@@ -754,6 +755,12 @@ export default {
}
});
}, 500),
sanitizeRedirect (redirect) {
if (!redirect) return '/';
let sanitizedString = DOMPurify.sanitize(redirect).replace(/\\|\/\/|\./g, '');
sanitizedString = `/${sanitizedString}`;
return sanitizedString;
},
async register () {
// @TODO do not use alert
if (!this.email) {
@@ -785,19 +792,14 @@ export default {
passwordConfirm: this.passwordConfirm,
});
let redirectTo;
if (this.$route.query.redirectTo) {
redirectTo = this.$route.query.redirectTo;
} else {
redirectTo = '/';
}
const redirectTo = this.sanitizeRedirect(this.$route.query.redirectTo);
// @TODO do not reload entire page
// problem is that app.vue created hook should be called again
// after user is logged in / just signed up
// ALSO it's the only way to make sure language data
// is reloaded and correct for the logged in user
// Same situation in login and socialAuth functions
window.location.href = redirectTo;
},
async login () {
@@ -807,19 +809,8 @@ export default {
password: this.password,
});
let redirectTo;
const redirectTo = this.sanitizeRedirect(this.$route.query.redirectTo);
if (this.$route.query.redirectTo) {
redirectTo = this.$route.query.redirectTo;
} else {
redirectTo = '/';
}
// @TODO do not reload entire page
// problem is that app.vue created hook should be called again
// after user is logged in / just signed up
// ALSO it's the only way to make sure language data
// is reloaded and correct for the logged in user
window.location.href = redirectTo;
},
// @TODO: Abstract hello in to action or lib
@@ -842,19 +833,8 @@ export default {
auth,
});
let redirectTo;
const redirectTo = this.sanitizeRedirect(this.$route.query.redirectTo);
if (this.$route.query.redirectTo) {
redirectTo = this.$route.query.redirectTo;
} else {
redirectTo = '/';
}
// @TODO do not reload entire page
// problem is that app.vue created hook should be called again
// after user is logged in / just signed up
// ALSO it's the only way to make sure language data
// is reloaded and correct for the logged in user
window.location.href = redirectTo;
}
},

View File

@@ -225,6 +225,11 @@ export default {
this.group = await this.$store.dispatch('guilds:getGroup', {
groupId: this.searchId,
});
if (!this.group?.purchased?.active) {
if (this.group.type === 'guild') this.$router.push(`/groups/guild/${this.group._id}`);
if (this.group.type === 'party') this.$router.push('/party');
return;
}
this.$store.dispatch('common:setTitle', {
subSection: this.group.name,
section: this.$route.path.startsWith('/group-plans') ? this.$t('groupPlans') : this.$t('group'),

View File

@@ -3,7 +3,7 @@
<creator-intro />
<profileModal />
<report-flag-modal />
<send-gift-modal />
<send-gems-modal />
<select-user-modal />
<b-navbar
id="habitica-menu"
@@ -747,7 +747,7 @@ import creatorIntro from '../creatorIntro';
import notificationMenu from './notificationsDropdown';
import profileModal from '../userMenu/profileModal';
import reportFlagModal from '../chat/reportFlagModal';
import sendGiftModal from '@/components/payments/sendGiftModal';
import sendGemsModal from '@/components/payments/sendGemsModal';
import selectUserModal from '@/components/payments/selectUserModal';
import sync from '@/mixins/sync';
import userDropdown from './userDropdown';
@@ -759,7 +759,7 @@ export default {
notificationMenu,
profileModal,
reportFlagModal,
sendGiftModal,
sendGemsModal,
selectUserModal,
userDropdown,
},

View File

@@ -1,6 +1,5 @@
<template>
<div class="payments-column mx-auto mt-auto">
<h4>{{ $t('choosePaymentMethod') }}</h4>
<button
v-if="stripeAvailable"
class="btn btn-primary payment-button payment-item with-icon"
@@ -81,13 +80,6 @@
cursor: default !important;
}
}
h4 {
font-size: 0.875rem;
font-weight: bold;
text-align: center;
margin-bottom: 1rem;
}
</style>
<script>

View File

@@ -14,44 +14,15 @@
</div>
<h2
v-else
class="d-flex flex-column mx-auto align-items-center"
class="ml-2"
>
{{ $t('sendAGift') }}
{{ $t('sendGift') }}
</h2>
<div
v-if="currentEvent && currentEvent.promo === 'g1g1'"
class="g1g1-margin d-flex flex-column align-items-center"
>
<div
class="svg-big-gift"
v-once
v-html="icons.bigGift"
></div>
</div>
<div
v-else
class="d-flex flex-column align-items-center">
<div
class="svg-big-gift"
v-once
v-html="icons.bigGift"
></div>
</div>
<div class="d-flex flex-column align-items-center">
<div
v-if="currentEvent && currentEvent.promo === 'g1g1'"
class="g1g1-modal-close"
class="modal-close"
@click="close()"
>
<div
class="g1g1-svg-icon"
v-html="icons.close"
></div>
</div>
<div
v-else
class="modal-close"
@click="close()">
<div
class="svg-icon"
v-html="icons.close"
@@ -71,7 +42,6 @@
v-model="userSearchTerm"
class="form-control"
type="text"
ref="textBox"
:placeholder="$t('usernameOrUserId')"
:class="{
'input-valid': foundUser._id,
@@ -100,20 +70,15 @@
<div
v-else
>
{{ $t('next') }}
{{ $t('selectGift') }}
</div>
</button>
<div
v-if="currentEvent && currentEvent.promo ==='g1g1'"
class="g1g1-cancel d-flex justify-content-center"
v-html="$t('cancel')"
@click="close()"
<a
class="cancel-link mx-auto mt-3"
@click="close()"
>
{{ $t('cancel') }}
</div>
<div
v-else>
</div>
{{ $t('cancel') }}
</a>
</div>
</div>
</div>
@@ -145,16 +110,13 @@
@import '~@/assets/scss/mixins.scss';
#select-user-modal {
.modal-content {
width:448px;
}
.input-group {
margin-top: 0rem;
}
.modal-dialog {
width: 448px;
width: 29.5rem;
margin-top: 25vh;
}
.modal-footer {
@@ -164,16 +126,7 @@
margin: 0rem 0.25rem 0.25rem 0.25rem;
}
}
body.modal-open .modal {
display: flex !important;
height: 100%;
}
body.modal-open .modal .modal-dialog {
margin: auto;
}
}
}
</style>
<style lang="scss" scoped>
@@ -193,12 +146,12 @@
.g1g1 {
background-image: url('~@/assets/images/g1g1-send.png');
background-size: 446px 152px;
width: 446px;
background-size: 472px 152px;
width: 470px;
height: 152px;
margin: -16px 0px 0px -16px;
border-radius: 4.8px 4.8px 0px 0px;
padding: 24px;
margin: -1rem 0rem 0rem -1rem;
border-radius: 0.3rem 0.3rem 0rem 0rem;
padding: 1.5rem;
color: $white;
h1 {
@@ -216,16 +169,6 @@
}
}
.g1g1-margin {
margin-top: 24px;
}
.g1g1-cancel {
margin-top: 16px;
color: $blue-10;
cursor: pointer;
}
.g1g1-fine-print {
color: $gray-100;
background-color: $gray-700;
@@ -233,29 +176,6 @@
line-height: 1.33;
}
.g1g1-modal-close {
position: absolute;
width: 18px;
height: 18px;
padding: 4px;
right: 16px;
top: 16px;
cursor: pointer;
.g1g1-svg-icon {
width: 12px;
height: 12px;
& ::v-deep svg path {
fill: #FFFFFF;
}
}
}
.g1g1-modal-dialog {
margin-top: 10vh;
}
.input-error {
color: $red-50;
font-size: 90%;
@@ -272,18 +192,6 @@
border-color: $purple-500;
}
h2 {
font-size: 1.25rem;
line-height: 1.75rem;
color: $purple-300;
padding-top: 1rem;
}
.svg-big-gift {
width: 176px;
height: 64px;
}
.modal-close {
position: absolute;
width: 18px;
@@ -298,17 +206,14 @@
height: 12px;
}
}
</style>
<script>
// import { nextTick } from 'vue'; // may not need this? I don't know!
import debounce from 'lodash/debounce';
import find from 'lodash/find';
import isUUID from 'validator/lib/isUUID';
import { mapState } from '@/libs/store';
import closeIcon from '@/assets/svg/close.svg';
import bigGiftIcon from '@/assets/svg/big-gift.svg';
export default {
data () {
@@ -318,7 +223,6 @@ export default {
foundUser: {},
icons: Object.freeze({
close: closeIcon,
bigGift: bigGiftIcon,
}),
};
},
@@ -377,7 +281,7 @@ export default {
this.foundUser = result;
}, 500),
selectUser () {
this.$root.$emit('habitica::send-gift', this.foundUser);
this.$root.$emit('habitica::send-gems', this.foundUser);
this.close();
},
onHide () {

View File

@@ -1,634 +0,0 @@
<template>
<b-modal
id="send-gift"
:hide-footer="true"
:hide-header="true"
size="md"
@hide="onHide()"
>
<div>
<!-- header -->
<div
class="modal-close"
@click="close()"
>
<div
class="icon-close"
v-html="icons.closeIcon"
>
</div>
</div>
<div>
<h2 class="d-flex flex-column mx-auto align-items-center">
{{ $t('sendAGift') }}
</h2>
</div>
<!-- user avatar -->
<div
v-if="userReceivingGift"
class="modal-body"
>
<avatar
:member="userReceivingGift"
:hideClassBadge="true"
class="d-flex flex-column mx-auto align-items-center"
/>
<div class="avatar-spacer"></div>
<div class="d-flex flex-column mx-auto align-items-center display-name">
<!-- user display name and username -->
<user-link
:user-id="displayName"
:name="displayName"
:backer="userBacker"
:contributor="userContributor"
:class="display-name"
/>
</div>
<div class="d-flex flex-column mx-auto align-items-center user-name">
@{{ userName }}
</div>
</div>
<!-- menu area -->
<div class="row">
<div class="col-12 col-md-8 offset-md-2 text-center nav">
<div
class="nav-item"
:class="{active: selectedPage === 'subscription'}"
@click="selectPage('subscription')"
>
{{ $t('subscription') }}
</div>
<div
class="nav-item"
:class="{active: selectedPage !== 'subscription'}"
@click="selectPage('buyGems')"
>
{{ $t('gems') }}
</div>
</div>
</div>
<!-- subscriber block -->
<subscription-options
v-show="selectedPage === 'subscription'"
class="subscribe-option"
/>
<!-- gem block -->
<div
v-show="selectedPage === 'buyGems'"
>
<div class="gem-group">
<!-- buy gems with money -->
<label v-once>
{{ $t('howManyGemsPurchase') }}
</label>
<div class="d-flex flex-row align-items-center justify-content-center">
<div
class="gray-circle"
@click="gift.gems.amount <= 0 ? gift.gems.amount = 0 : gift.gems.amount--"
>
<div
class="icon-negative"
v-html="icons.negativeIcon"
></div>
</div>
<div class="input-group">
<div class="input-group-prepend input-group-icon align-items-center">
<div
class="icon-gem"
v-html="icons.gemIcon"
></div>
</div>
<input
id="gemsForm"
v-model.number="gift.gems.amount"
class="form-control"
min="0"
max="9999"
>
</div>
<div
class="gray-circle"
@click="gift.gems.amount++"
>
<div
class="icon-positive"
v-html="icons.positiveIcon"
></div>
</div>
</div>
<!-- the word "total" -->
<div class="buy-gem-total">
{{ $t('sendGiftTotal') }}
</div>
<!-- the actual dollar amount -->
<div class="buy-gem-amount">
<span>
{{formatter.format(totalGems)}}
</span>
</div>
<!-- change to sending own gems page -->
<div
:class="{active: selectedPage === 'ownGems'}"
@click="selectPage('ownGems')"
class="gem-state-change"
>
{{ $t('wantToSendOwnGems') }}
</div>
</div>
<!-- paying for gems -->
<payments-buttons
class="payment-buttons"
:stripe-fn="() => redirectToStripe({gift, uuid: userReceivingGift._id, receiverName})"
:paypal-fn="() => openPaypalGift({
gift: gift, giftedTo: userReceivingGift._id, receiverName,
})"
:amazon-data="{type: 'single', gift, giftedTo: userReceivingGift._id, receiverName}"
/>
</div>
<!-- send gems from balance -->
<div
v-show="selectedPage === 'ownGems'"
>
<div class="gem-group">
<label v-once>
{{ $t('howManyGemsSend') }}
</label>
<div class="d-flex align-items-center justify-content-center">
<div
class="gray-circle"
@click="gift.gems.amount <= 0 ? gift.gems.amount = 0 : gift.gems.amount--"
>
<div
class="icon-negative"
v-html="icons.negativeIcon"
></div>
</div>
<div class="input-group">
<div class="input-group-prepend input-group-icon align-items-center">
<div
class="icon-gem"
v-html="icons.gemIcon"
></div>
</div>
<input
id="gemsForm"
v-model="gift.gems.amount"
class="form-control"
min="0"
:max="maxGems"
>
</div>
<div
class="gray-circle"
@click="gift.gems.amount < maxGems ? gift.gems.amount++ : gift.gems.amount = maxGems"
>
<div
class="icon-positive"
v-html="icons.positiveIcon"
></div>
</div>
</div>
<div class="align-items-middle">
<div class="d-flex justify-content-center align-items-middle">
<span class="balance-text">
{{ $t('yourBalance') }}
</span>
<span
class="icon-gem balance-gem-margin"
v-html="icons.gemIcon"
style="display: inline-block;"
></span>
<span
class="balance-gems">
{{ maxGems }}
</span>
</div>
</div>
<div class="d-flex flex-column justify-content-center align-items-middle mt-3">
<button
v-if="fromBal"
class="btn btn-primary mx-auto mt-2"
type="submit"
:disabled="sendingInProgress"
@click="sendGift()"
>
{{ $t("send") }}
</button>
</div>
<!-- change to buying gems page -->
<div
:class="{active: selectedPage === 'buyGems'}"
@click="selectPage('buyGems')"
class="gem-state-change"
>
{{ $t('needToPurchaseGems') }}
</div>
</div>
</div>
</div>
</b-modal>
</template>
<style lang="scss">
@import '~@/assets/scss/mixins.scss';
#send-gift {
.modal-dialog {
max-width: 448px;
}
.modal-content {
width: 448px;
border-radius: 8px;
box-shadow: 0 14px 28px 0 rgba(26, 24, 29, 0.24), 0 10px 10px 0 rgba(26, 24, 29, 0.28);
}
.modal-body{
padding: 0px;
}
.modal-close {
position: absolute;
width: 18px;
height: 18px;
padding: 4px;
right: 16px;
top: 16px;
cursor: pointer;
.icon-close {
width: 15px;
height: 15px;
& ::v-deep svg path {
fill: #878190;
}
}
}
#subscription-form .subscribe-option {
background: #F9F9F9;
}
}
</style>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
h2 {
color: $purple-300;
padding-top: 2rem;
}
.avatar-spacer {
height: 9px;
}
.display-name {
font-size: 0.875rem;
font-weight: bold;
line-height: 1.71;
margin: 0px 6px 0 20px;
}
.display-name a:hover{
text-decoration: none;
}
.user-name {
font-size: 0.75rem;
line-height: 1.33;
text-align: center;
color: $gray-100;
padding-bottom: 16px;
}
.row {
background-color: $gray-700;
margin: 0 0 0 0;
min-height: 32px;
}
.nav {
font-weight: bold;
font-size: 0.75rem;
min-height: 32px;
padding: 16px 0 0 0;
color: $purple-300;
justify-content: center;
}
.nav-item {
display: inline-block;
padding: 0px 8px 6px 8px;
}
.nav-item:hover, .nav-item.active {
color: $purple-300;
border-bottom: 2px solid $purple-400;
cursor: pointer;
}
.nav-item.inactive {
color: $purple-300;
border-bottom: 0px;
cursor: pointer;
}
.gem-group {
padding: 0 0 24px 0;
background-color: $gray-700;
margin: 0 0 0 0;
border-bottom-right-radius: 8px;
border-bottom-left-radius: 8px
}
label {
color: $gray-50;
font-size: 0.875rem;
font-weight: bold;
line-height: 1.71;
margin: 12px 0 16px 0;
width: 100%;
text-align: center;
}
.input-group {
width: 94px;
height: 32px;
margin: 0px 16px 0px 16px;
padding: 0;
border-radius: 2px;
border: solid 1px $gray-400;
background-color: $white;
}
.gray-circle {
border-radius: 100%;
border: solid 2px $gray-300;
width: 32px;
height: 32px;
cursor: pointer;
&:hover {
border-color: $purple-400;
}
}
.gray-circle:hover{
.icon-positive, .icon-negative {
& ::v-deep svg path {
fill: $purple-400;
}
}
}
.icon-gem {
width: 16px;
height: 16px;
}
.icon-positive, .icon-negative {
width: 10px;
height: 10px;
margin: 4px auto;
& ::v-deep svg path {
fill: $gray-300;
}
}
.buy-gem-total {
font-size: 0.875rem;
font-weight: bold;
line-height: 1.71;
padding-top: 24px;
text-align: center;
height: 28px;
}
.buy-gem-amount {
font-size: 1.25rem;
font-weight: bold;
line-height: 1.4;
margin: 16px 0 24px 0;
text-align: center;
height: 28px;
color: $green-10;
}
.balance-text {
font-size: 0.75rem;
font-weight: bold;
color: $gray-100;
line-height: 1.33;
margin: 12px 0px 0px 70px;
}
.balance-gem-margin {
margin: 8px 4px 0px 8px;
}
.balance-gems {
font-size: 0.75rem;
color: $gray-100;
line-height: 1.33;
margin: 12px 71px 0px 4px;
}
.gem-state-change {
color: $blue-10;
font-size: 0.875rem;
min-height: 24px;
margin: 16px 0 0;
text-align: center;
cursor: pointer;
}
.subscribe-option {
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
padding-bottom: 24px;
}
.payment-buttons {
padding: 24px 0;
}
</style>
<script>
// libs imports
import { mapState } from '@/libs/store';
// mixins imports
import paymentsMixin from '../../mixins/payments';
// component imports
import avatar from '../avatar';
import userLink from '../userLink';
import subscriptionOptions from '../settings/subscriptionOptions.vue';
import paymentsButtons from '@/components/payments/buttons/list';
// svg imports
import closeIcon from '@/assets/svg/close.svg';
import gemIcon from '@/assets/svg/gem.svg';
import positiveIcon from '@/assets/svg/positive.svg';
import negativeIcon from '@/assets/svg/negative.svg';
export default {
components: {
avatar,
subscriptionOptions,
paymentsButtons,
userLink,
},
mixins: [
paymentsMixin,
],
data () {
return {
subscription: {
key: '',
},
icons: Object.freeze({
closeIcon,
gemIcon,
positiveIcon,
negativeIcon,
}),
userReceivingGift: {
profile: '',
},
name: '',
display: '',
selectedPage: 'subscription',
gift: {
type: 'gems',
gems: {
amount: 0,
fromBalance: true,
},
},
sendingInProgress: false,
amazonPayments: {},
gemCost: 1,
};
},
methods: {
close () {
this.$root.$emit('bv::hide::modal', 'send-gift');
},
selectPage (page) {
this.selectedPage = page || 'subscription';
},
async sendGift () {
this.sendingInProgress = true;
await this.$store.dispatch('members:transferGems', {
toUserId: this.userReceivingGift._id,
gemAmount: this.gift.gems.amount,
});
this.close();
setTimeout(() => { // wait for the send gem modal to be closed
this.$root.$emit('habitica:payment-success', {
paymentMethod: 'balance',
paymentCompleted: true,
paymentType: 'gift-gems-balance',
gift: {
gems: {
amount: this.gift.gems.amount,
},
},
giftReceiver: this.receiverName,
});
}, 500);
},
onHide () {
this.sendingInProgress = false;
},
},
computed: {
...mapState({
userLoggedIn: 'user.data',
}),
userName () {
const userName = this.userReceivingGift.auth
&& this.userReceivingGift.auth.local
&& this.userReceivingGift.auth.local.username;
return userName;
},
displayName () {
const displayName = this.userReceivingGift.profile.name;
return displayName;
},
userBacker () {
const userBacker = this.userReceivingGift.backer;
return userBacker;
},
userContributor () {
const userContributor = this.userReceivingGift.contributor;
return userContributor;
},
tierIcon () {
if (this.isNPC) {
return this.icons.tierNPC;
}
return this.icons[`tier${this.level}`];
},
fromBal () {
return this.gift.type === 'gems' && this.gift.gems.fromBalance;
},
maxGems () {
const maxGems = this.fromBal ? this.userLoggedIn.balance * 4 : 9999;
return maxGems;
},
formatter () {
const formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2,
});
return formatter;
},
totalGems () {
const totalGems = this.gift.gems.amount * 0.25;
return totalGems;
},
receiverName () {
if (
this.userReceivingGift.auth
&& this.userReceivingGift.auth.local
&& this.userReceivingGift.auth.local.username
) {
return this.userReceivingGift.auth.local.username;
}
return this.userReceivingGift.profile.name;
},
},
watch: {
startingPage () {
this.selectedPage = this.startingPage;
},
},
mounted () {
this.$root.$on('habitica::send-gift', data => {
this.userReceivingGift = data;
if (this.$store.state.giftModalOptions.startingPage) {
this.selectedPage = this.$store.state.giftModalOptions.startingPage;
this.$store.state.giftModalOptions.startingPage = '';
this.selectPage(this.selectedPage);
} else {
this.selectPage(this.startingPage);
}
this.$root.$emit('bv::show::modal', 'send-gift');
});
},
};
</script>

View File

@@ -450,6 +450,10 @@
background-color: $white;
}
.subscribe-option {
border-bottom: 1px solid $gray-600;
}
.svg-amazon-pay {
width: 208px;
}

View File

@@ -89,9 +89,6 @@ export default {
try {
this.$store.dispatch('shops:releasePets', { user: this.user });
this.text(this.$t('releasePetsSuccess'));
// this.$router.push({name: 'stable'});
// Reload because achievement is set in user.save instead of common
window.location.reload(true);
} catch (err) {
window.alert(err.message); // eslint-disable-line no-alert
}
@@ -112,9 +109,6 @@ export default {
try {
this.$store.dispatch('shops:releaseMounts', { user: this.user });
this.text(this.$t('releaseMountsSuccess'));
// this.$router.push({name: 'stable'});
// Reload because achievement is set in user.save instead of common
window.location.reload(true);
} catch (err) {
window.alert(err.message); // eslint-disable-line no-alert
}
@@ -135,9 +129,6 @@ export default {
try {
this.$store.dispatch('shops:releaseBoth', { user: this.user });
this.text(this.$t('releaseBothSuccess'));
// this.$router.push({name: 'stable'});
// Reload because achievement is set in user.save instead of common
window.location.reload(true);
} catch (err) {
window.alert(err.message); // eslint-disable-line no-alert
}

View File

@@ -27,7 +27,7 @@
position: fixed;
right: 10px;
width: 350px;
z-index: 999;
z-index: 9999; // to keep it above modal overlays
top: var(--current-scrollY);

View File

@@ -18,7 +18,7 @@
</a>
<a
href="https://geo.itunes.apple.com/us/app/habitica/id994882113?mt=8"
style="display:inline-block;overflow:hidden;background:url(http://linkmaker.itunes.apple.com/images/badges/en-us/badge_appstore-lrg.svg#svgView) no-repeat;background-size:100%;width:152px;height:45px;margin-left:20px;image-rendering:auto"
style="display:inline-block;overflow:hidden;background:url(https://linkmaker.itunes.apple.com/images/badges/en-us/badge_appstore-lrg.svg#svgView) no-repeat;background-size:100%;width:152px;height:45px;margin-left:20px;image-rendering:auto"
></a>
</div>
</div>

View File

@@ -52,7 +52,7 @@
<li class="nav-item">
<a
class="nav-link"
href="http://blog.habitrpg.com/"
href="https://blog.habitrpg.com/"
target="_blank"
>{{ $t('tumblr') }}</a>
</li>

View File

@@ -6,7 +6,7 @@
<noscript class="banner">
{{ $t('jsDisabledHeadingFull') }}
<br />
<a href="http://www.enable-javascript.com/" target="_blank">{{ $t('jsDisabledLink') }}</a>
<a href="https://www.enable-javascript.com/" target="_blank">{{ $t('jsDisabledLink') }}</a>
</noscript>
<div
id="intro-signup"

View File

@@ -137,15 +137,15 @@
browser which allows you to refuse cookies. Further information about the procedure to follow in order to
disable cookies can be found on your Internet browser providers website via your help screen. You may
wish to refer to <a
href="http://www.allaboutcookies.org/manage-cookies/index.html"
href="https://www.allaboutcookies.org/manage-cookies/index.html"
target="_blank"
>
http://www.allaboutcookies.org/manage-cookies/index.html</a> for information on commonly used browsers.
https://www.allaboutcookies.org/manage-cookies/index.html</a> for information on commonly used browsers.
For more information about targeting and advertising cookies and how you can opt out, you can also visit
<a
href="http://optout.aboutads.info"
href="https://optout.aboutads.info"
target="_blank"
>http://optout.aboutads.info</a>. Please be aware
>https://optout.aboutads.info</a>. Please be aware
that if cookies are disabled, not all features of the Service may operate properly or as intended.
</p>
<h3>Third-Party Analytics Providers</h3>

View File

@@ -70,9 +70,9 @@
<p>WITHIN THIRTY (30) DAYS OF YOUR PREMIUM PAYMENT DATE AS SHOWN ON YOUR PAYMENT BILL, YOU CAN REQUEST A FULL REFUND BY CONTACTING US AT ADMIN@HABITICA.COM. AFTER THIRTY (30) DAYS OF YOUR PREMIUM PAYMENT DATE, ANY PAYMENT REFUND IS SOLELY SUBJECT TO OUR DISCRETION. THE REFUND SHALL BE YOUR SOLE AND EXCLUSIVE REMEDY.</p>
<p>
FOR ANY CUSTOMER WHO PURCHASED PREMIUM IN APPLE INC.'s APP STORE ("APP STORE"), PLEASE CONTACT APPLE INC.'s SUPPORT TEAM: <a
href="http://reportaproblem.apple.com"
href="https://reportaproblem.apple.com"
target="_blank"
>http://reportaproblem.apple.com</a>. APPLE'S APP STORE DOES NOT ALLOW DEVELOPERS TO ISSUE REFUND FOR APP STORE PURCHASES MADE BY CUSTOMERS.
>https://reportaproblem.apple.com</a>. APPLE'S APP STORE DOES NOT ALLOW DEVELOPERS TO ISSUE REFUND FOR APP STORE PURCHASES MADE BY CUSTOMERS.
</p>
<h2>Warranty Disclaimer</h2>
<p>THE SERVICE AND ANY CONTENT MADE AVAILABLE BY HABITRPG VIA THE SERVICE IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT ANY WARRANTIES OF ANY KIND, INCLUDING, WITHOUT LIMITATION, THAT THE SERVICE OR CONTENT WILL OPERATE ERROR-FREE OR THAT THE SERVICE OR CONTENT OR ITS SERVERS ARE FREE OF COMPUTER VIRUSES OR SIMILAR CONTAMINATION OR DESTRUCTIVE FEATURES.</p>

View File

@@ -1280,12 +1280,17 @@ export default {
createTag: 'tags:createTag',
}),
async syncTask () {
if (this.task && this.task.group && this.task.group.managerNotes) {
if (this.task?.group?.managerNotes) {
this.managerNotes = this.task.group.managerNotes;
}
if (this.groupId && this.task.group && this.task.group.approval) {
if (this.groupId && this.task.group?.approval) {
this.requiresApproval = this.task.group.approval.required;
}
if (this.task?.group?.sharedCompletion) {
this.sharedCompletion = this.task.group.sharedCompletion;
} else if (this.task.group) {
this.sharedCompletion = 'singleCompletion';
}
if (this.groupId) {
const members = await this.$store.dispatch('members:getGroupMembers', {
@@ -1306,9 +1311,6 @@ export default {
if (this.task.group && this.task.group.assignedUsers) {
this.assignedMembers = this.task.group.assignedUsers;
}
if (this.task.group) {
this.sharedCompletion = this.task.group.sharedCompletion || 'singleCompletion';
}
}
// @TODO: This whole component is mutating a prop

View File

@@ -969,8 +969,7 @@ export default {
axios.post(`/api/v4/user/block/${this.user._id}`);
},
openSendGemsModal () {
this.$store.state.giftModalOptions.startingPage = 'buyGems';
this.$root.$emit('habitica::send-gift', this.user);
this.$root.$emit('habitica::send-gems', this.user);
},
adminTurnOnShadowMuting () {
if (!this.hero.flags) {

View File

@@ -124,9 +124,6 @@ export default function () {
profileOptions: {
startingPage: '',
},
giftModalOptions: {
startingPage: '',
},
rageModalOptions: {
npc: '',
},

View File

@@ -1,4 +1,4 @@
HabitRPG's translations are managed at http://translate.habitica.com/
HabitRPG's translations are managed at https://translate.habitica.com/
The files in this folder are automatically pulled from there, with
exception of the original American-English strings which are managed
@@ -10,5 +10,5 @@ request that your changes be translated; changes are automatically
copied to the translation website on a regular basis.
If you want to help with translations, please first read [Guidance for
Linguists](http://habitica.fandom.com/wiki/Guidance_for_Linguists) and
Linguists](https://habitica.fandom.com/wiki/Guidance_for_Linguists) and
note especially its information about the [Translations Trello card](https://trello.com/c/SvTsLdRF/12-translations).

View File

@@ -178,10 +178,10 @@
"advocacy_causes": "Advocacy + Causes",
"entertainment": "Entertainment",
"finance": "Finance",
"health_fitness": "Health + Fitness",
"hobbies_occupations": "Hobbies + Occupations",
"health_fitness": "الصحة واللياقة البدنية",
"hobbies_occupations": "الهوايات والمهن",
"location_based": "Location-based",
"mental_health": "Mental Health + Self-Care",
"mental_health": "الصحة العقلية + العناية الذاتية",
"getting_organized": "Getting Organized",
"self_improvement": "Self-Improvement",
"spirituality": "Spirituality",
@@ -192,7 +192,7 @@
"emptyMessagesLine1": "You don't have any messages",
"emptyMessagesLine2": "Send a message to start a conversation!",
"userSentMessage": "<span class=\"notification-bold\"><%- user %></span> sent you a message",
"letsgo": "Let's Go!",
"letsgo": "لنذهب!",
"selected": "Selected",
"howManyToBuy": "How many would you like to buy?",
"contactForm": "Contact the Moderation Team"

View File

@@ -1,25 +1,25 @@
{
"unlockedReward": "You have received <%= reward %>",
"earnedRewardForDevotion": "You have earned <%= reward %> for being committed to improving your life.",
"nextRewardUnlocksIn": "Check-ins until your next prize: <%= numberOfCheckinsLeft %>",
"awesome": "Awesome!",
"countLeft": "Check-ins until next reward: <%= count %>",
"incentivesDescription": "When it comes to building habits, consistency is key. Each day you check-in you get closer to a prize.",
"checkinEarned": "Your Check-In Counter went up!",
"unlockedCheckInReward": "You unlocked a Check-In Prize!",
"checkinProgressTitle": "Progress until next",
"incentiveBackgroundsUnlockedWithCheckins": "Locked Plain Backgrounds will unlock with Daily Check-Ins.",
"oneOfAllPetEggs": "one of each standard Pet Egg",
"twoOfAllPetEggs": "two of each standard Pet Egg",
"threeOfAllPetEggs": "three of each standard Pet Egg",
"oneOfAllHatchingPotions": "one of each standard Hatching Potion",
"threeOfEachFood": "three of each standard Pet Food",
"fourOfEachFood": "four of each standard Pet Food",
"twoSaddles": "two Saddles",
"threeSaddles": "three Saddles",
"incentiveAchievement": "the Royally Loyal achievement",
"royallyLoyal": "Royally Loyal",
"royallyLoyalText": "This user has checked in over 500 times, and has earned every Check-In Prize!",
"checkInRewards": "Check-In Rewards",
"backloggedCheckInRewards": "You received Check-In Prizes! Visit your Inventory and Equipment to see what's new."
"unlockedReward": "You have received <%= reward %>",
"earnedRewardForDevotion": "You have earned <%= reward %> for being committed to improving your life.",
"nextRewardUnlocksIn": "Check-ins until your next prize: <%= numberOfCheckinsLeft %>",
"awesome": "Awesome!",
"countLeft": "Check-ins until next reward: <%= count %>",
"incentivesDescription": "When it comes to building habits, consistency is key. Each day you check-in you get closer to a prize.",
"checkinEarned": "Your Check-In Counter went up!",
"unlockedCheckInReward": "You unlocked a Check-In Prize!",
"checkinProgressTitle": "Progress until next",
"incentiveBackgroundsUnlockedWithCheckins": "Locked Plain Backgrounds will unlock with Daily Check-Ins.",
"oneOfAllPetEggs": "one of each standard Pet Egg",
"twoOfAllPetEggs": "two of each standard Pet Egg",
"threeOfAllPetEggs": "three of each standard Pet Egg",
"oneOfAllHatchingPotions": "one of each standard Hatching Potion",
"threeOfEachFood": "three of each standard Pet Food",
"fourOfEachFood": "four of each standard Pet Food",
"twoSaddles": "two Saddles",
"threeSaddles": "ثلاثة سروج",
"incentiveAchievement": "the Royally Loyal achievement",
"royallyLoyal": "Royally Loyal",
"royallyLoyalText": "This user has checked in over 500 times, and has earned every Check-In Prize!",
"checkInRewards": "Check-In Rewards",
"backloggedCheckInRewards": "You received Check-In Prizes! Visit your Inventory and Equipment to see what's new."
}

View File

@@ -1,12 +1,12 @@
{
"npc": "شخصية غير قابلة للعب",
"npcAchievementName": "<%= key %> NPC",
"npcAchievementText": "Backed the Kickstarter project at the maximum level!",
"welcomeTo": "Welcome to",
"welcomeBack": "Welcome back!",
"npcAchievementName": "<%= key %> شخصية غير قابلة للعب",
"npcAchievementText": "لقد دعمت مشروع Kickstarter بأقصى مستوى!",
"welcomeTo": "مرحبًا بكِ في",
"welcomeBack": "مرحباً بعودتك!",
"justin": "جستن",
"justinIntroMessage1": "Hello there! You must be new here. My name is <strong>Justin</strong>, and I'll be your guide in Habitica.",
"justinIntroMessage3": "Great! Now, what are you interested in working on throughout this journey?",
"justinIntroMessage1": "أهلاً بك! يبدو أنك جديد/ة هنا. اسمي <strong>جاستن</strong> ، وسأكون دليلك في Habitica.",
"justinIntroMessage3": "رائعة! الآن ، ما الذي تهتم بالعمل عليه طوال هذه المغامرة؟",
"justinIntroMessageUsername": "Before we begin, lets figure out what to call you. Below youll find a display name and username Ive generated for you. After youve picked a display name and username, well get started by creating an avatar!",
"justinIntroMessageAppearance": "So how would you like to look? Dont worry, you can change this later.",
"introTour": "Here we are! I've filled out some Tasks for you based on your interests, so you can get started right away. Click a Task to edit or add new Tasks to fit your routine!",

View File

@@ -1,8 +1,8 @@
{
"pets": "الحيوانات الأليفة",
"stable": "مستقر",
"stable": "الإسطبل",
"noActivePet": "لا يوجد حيوان أليف نشط",
"activePet": "أنشطة الحيوانات الأليفة",
"activePet": "الحيوان الأليف النشط",
"raisedPet": "لقد نمت <٪ = حيوان أليف٪>!",
"feedPet": "تغذية <٪ = text٪> إلى <٪ = name٪>؟",
"mountNotOwned": "أنت لاتملك هذه الكمية.",
@@ -32,7 +32,7 @@
"etherealLion": "الأسد السماوي",
"magicMounts": "جرعة سحرية متصاعدة",
"questMounts": "تنقيب جبال",
"mountsTamed": "ترويض الجبل",
"mountsTamed": "المراكيب المروضة",
"noSaddlesAvailable": "أنت لاتملك أي سروج.",
"noFoodAvailable": "أنت لاتملك أي أغذية للحيوانات الأليفة.",
"food": "أغذية الحيوانات الأليفة والسروج",
@@ -61,20 +61,21 @@
"veteranFox": "الثعلب المخضرم",
"veteranBear": "الدب المخضرم",
"veteranLion": "الأسد المخضرم",
"activeMount": "جبل نشط",
"mounts": "يتصاعد",
"activeMount": "مركوب نشط",
"mounts": "مركوب",
"wackyPets": "حيوانات أليف مضحكة",
"magicPets": "دواء سحري للحيوانات الأليفة",
"petsFound": "إنشاء حيوانات أليفة",
"keyToPets": "مفتاح بيوت الحيوانات",
"noActiveMount": "لا يوجد تثبيت نشط",
"noActiveMount": "لا يوجد مركوب نشط",
"questPets": "بحث الحيوانات",
"releasePetsConfirm": "هل أنت متأكد أنك تريد إطلاق سراح حيوانك الأليف القياسي؟",
"keyToMounts": "مفتاح بيت الحيوان",
"petsReleased": "أفرج عن الحيوانات الأليفة",
"keyToPetsDesc": "حرر جميع الحيوانات المسموح بها حتى تتمكن من جمعها مرة أخرى. (لا تتأثر بالحيوانات الأليفة والحيوانات الأليفة الغريبة.)",
"petName": "<%= potion(locale) %> <%= egg(locale) %>",
"keyToPetsDesc": "حرر جميع الحيوانات الأليفة القياسية حتى تتمكن من جمعها مرة أخرى. (لا تتأثر بالحيوانات الأليفة من المهام والحيوانات الأليفة الغريبة.)",
"petName": "<%= egg(locale) %> <%= potion(locale) %>",
"keyToMountsDesc": "حرر جميع العينات القياسية حتى تتمكن من جمعها مرة أخرى. (لا تتأثر عمليات تثبيت المهام وعمليات التثبيت النادرة.)",
"keyToBoth": "مفاتيح رئيسية لبيوت الكلاب",
"releasePetsSuccess": "تم إطلاق حيوانك الأليف القياسي!"
"releasePetsSuccess": "تم إطلاق حيوانك الأليف القياسي!",
"mountName": "<%= mount(locale) %> <%= potion(locale) %>"
}

View File

@@ -22,7 +22,7 @@
"checklist": "القائمة",
"newChecklistItem": "عنصر قائمة مراجعة جديد",
"expandChecklist": "Expand Checklist",
"collapseChecklist": "Collapse Checklist",
"collapseChecklist": "أغلق القائمة",
"text": "العنوان",
"notes": "الملاحظات",
"advancedSettings": "إعدادات متقدمة",
@@ -46,7 +46,7 @@
"days": "أيام",
"restoreStreak": "Adjust Streak",
"resetStreak": "Reset Streak",
"todo": "مهمة",
"todo": "المهمة",
"todos": "المهام",
"todosDesc": "تُنجَز المهام مرة واحدة فقط. أضف قوائم إلى المهام الخصة بك لتزيد قيمتها.",
"dueDate": "تاريخ الاستحقاق",
@@ -83,18 +83,18 @@
"fortifyName": "جرعة تحصين",
"fortifyPop": "إرجاع جميع المهام إلى القيمة المحايدة (اللون الأصفر)، وإسترجاع جميع نقاط الصحة المفقودة.",
"fortify": "تحصين",
"fortifyComplete": "Fortify complete!",
"fortifyComplete": "اكتمل التحصين!",
"deleteTask": "احذف هذه المهمة",
"sureDelete": "هل أنت متأكد من أنك تريد حذف هذه المهامة؟",
"streakCoins": "إضافي شرائطي!",
"taskToTop": "إلى الأعلى",
"taskToBottom": "إلى الأسفل",
"taskAliasAlreadyUsed": "Task alias already used on another task.",
"taskAliasAlreadyUsed": "تم استخدام الاسم المستعار لهذه المهمة بالفعل في مهمة أخرى.",
"taskNotFound": "Task not found.",
"invalidTaskType": "Task type must be one of \"habit\", \"daily\", \"todo\", \"reward\".",
"invalidTasksType": "Task type must be one of \"habits\", \"dailys\", \"todos\", \"rewards\".",
"invalidTaskType": "يجب أن يكون نوع المهمة واحدًا من \"العادة\" أو \"اليومية\" أو \"المهمة\" أو \"المكافأة\".",
"invalidTasksType": "يجب أن يكون نوع المهمة واحدًا من \"العادات\" أو \"اليوميات\" أو \"المهام\" أو \"المكافآت\".",
"invalidTasksTypeExtra": "يجب أن يكون نوع المهمة واحدًا من \"العادات\" أو \"اليوميات\" أو \"المهام\" أو \"المكافآت\" أو \"المهام التي تم إكمالها\".",
"cantDeleteChallengeTasks": "A task belonging to a challenge can't be deleted.",
"cantDeleteChallengeTasks": "لا يمكن حذف المهمة التي تنتمي إلى التحدي.",
"checklistOnlyDailyTodo": "Checklists are supported only on Dailies and To-Dos",
"checklistItemNotFound": "No checklist item was found with given id.",
"itemIdRequired": "\"itemId\" must be a valid UUID.",
@@ -127,5 +127,7 @@
"checkOffYesterDailies": "Check off any Dailies you did yesterday:",
"yesterDailiesCallToAction": "ابدأ يومي الجديد!",
"sessionOutdated": "Your session is outdated. Please refresh or sync.",
"errorTemporaryItem": "This item is temporary and cannot be pinned."
"errorTemporaryItem": "This item is temporary and cannot be pinned.",
"deleteTaskType": "احذف هذا/هذه <%= type %>",
"sureDeleteType": "هل انت متأكد انك تريد حذف هذا/هذه <%= type %> ؟"
}

View File

@@ -2,14 +2,14 @@
"settings": "Configuració",
"language": "Llengua",
"americanEnglishGovern": "En el cas que hi hagi discrepàncies amb les traduccions, la versió d'anglès americà serà la utilitzada.",
"helpWithTranslation": "T'agradaria ajudar amb la traducció d'Habitica? Genial! Visita <a href=\"/groups/guild/7732f64c-33ee-4cce-873c-fc28f147a6f7\">aquest</a> Gremi.",
"stickyHeader": "Sticky header",
"helpWithTranslation": "T'agradaria ajudar amb la traducció d'Habitica? Genial! Visita <a href=\"/groups/guild/7732f64c-33ee-4cce-873c-fc28f147a6f7\">the Aspiring Linguists Guild</a>!",
"stickyHeader": "Capçalera enganxosa",
"newTaskEdit": "Obrir noves tasques en mode edició",
"dailyDueDefaultView": "Set Dailies default to 'due' tab",
"dailyDueDefaultViewPop": "With this option set, the Dailies tasks will default to 'due' instead of 'all'",
"reverseChatOrder": "Show chat messages in reverse order",
"startAdvCollapsed": "Advanced Settings in tasks start collapsed",
"startAdvCollapsedPop": "With this option set, Advanced Settings will be hidden when you first open a task for editing.",
"dailyDueDefaultView": "Estableix Diaris per defecte a la pestanya \"vengut\".",
"dailyDueDefaultViewPop": "Amb aquesta opció establerta, les tasques diàries tindran el valor predeterminat \"de venciment\" en lloc de \"totes\".",
"reverseChatOrder": "Mostra els missatges de xat en ordre invers",
"startAdvCollapsed": "La configuració avançada de les tasques comença col·lapsada",
"startAdvCollapsedPop": "Amb aquesta opció establerta, la configuració avançada s'amagarà quan obriu una tasca per editar-la per primera vegada.",
"dontShowAgain": "No em mostris això de nou",
"suppressLevelUpModal": "No mostrar missatge emergent quan pugi de nivell",
"suppressHatchPetModal": "No mostrar missatge emergent quan eclosioni una mascota",
@@ -17,16 +17,16 @@
"suppressStreakModal": "No mostrar missatge emergent quan obtinguis una fita de ratxa",
"showTour": "Mostrar Tour",
"showBailey": "Mostra en Bailey",
"showBaileyPop": "Bring Bailey the Town Crier out of hiding so you can review past news.",
"showBaileyPop": "Treu a Bailey el pregoner de l'amagatall perquè puguis revisar les notícies anteriors.",
"fixVal": "Arreglar els valors del personatge",
"fixValPop": "Canvia manualment els valors de la teva vida, nivell, i monedes.",
"invalidLevel": "Invalid value: Level must be 1 or greater.",
"invalidLevel": "Valor no vàlid: el nivell ha de ser 1 o superior.",
"enableClass": "Activar el sistema d'oficis",
"enableClassPop": "Al principi, vas descartar utilitzar el sistema d'oficis. Voldries activar-lo ara?",
"resetAccPop": "Comença de nou, perdent tots els nivells, monedes, equipament, historial i tasques.",
"deleteAccount": "Eliminar compte",
"deleteAccPop": "Cancelar i eliminar el compte de Habitica",
"feedback": "If you'd like to give us feedback, please enter it below - we'd love to know what you liked or didn't like about Habitica! Don't speak English well? No problem! Use the language you prefer.",
"deleteAccPop": "Cancelar i eliminar el compte de Habitica.",
"feedback": "Si voleu fer-nos un comentari, introduïu-lo a continuació; ens agradaria saber què us ha agradat o què no d'Habica! No parles bé anglès? Cap problema! Utilitzeu l'idioma que preferiu.",
"qrCode": "Codi QR",
"dataExport": "Exportar informació",
"saveData": "Here are a few options for saving your data.",
@@ -42,7 +42,7 @@
"sureChangeCustomDayStartTime": "Are you sure you want to change your Custom Day Start time? Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before then!",
"customDayStartHasChanged": "Your custom day start has changed.",
"nextCron": "Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before this time!",
"customDayStartInfo1": "Habitica defaults to check and reset your Dailies at midnight in your own time zone each day. You can customize that time here.",
"customDayStartInfo1": "Habitica per defecte comprovarà i restablirà las vostras tareas a mitjanit a la vostra zona horària cada dia. Podeu personalitzar aquest temps aquí.",
"misc": "Varis",
"showHeader": "Mostra capçalera",
"changePass": "Canviar contrassenya",
@@ -55,7 +55,7 @@
"newUsername": "New Username",
"dangerZone": "Zona perillosa",
"resetText1": "WARNING! This resets many parts of your account. This is highly discouraged, but some people find it useful in the beginning after playing with the site for a short time.",
"resetText2": "You will lose all your levels, Gold, and Experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment but you will be able to buy it all back, including all limited edition equipment or subscriber Mystery items that you already own (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.",
"resetText2": "Perdràs tots els teus nivells, or i punts d'experiència. Totes les teves tasques (excepte les dels reptes) se suprimiran permanentment i perdràs totes les seves dades històriques. Perdràs tot el teu equip, però podràs tornar-lo a comprar tot, inclòs tots els equips d'edició limitada o els articles de misteri de subscriptors que ja tinguis (haureu d'estar a la classe correcta per tornar a comprar l'equip específic de la classe). Mantindràs la teva classe actual i les teves mascotes i montures. És possible que preferiu utilitzar un Orb of Rebirth, que és una opció molt més segura i que preservarà les vostres tasques i equips.",
"deleteLocalAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type your password into the text box below.",
"deleteSocialAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type \"<%= magicWord %>\" into the text box below.",
"API": "API",
@@ -71,7 +71,7 @@
"beeminderDesc": "Let Beeminder automatically monitor your Habitica To-Dos. You can commit to maintaining a target number of To-Dos completed per day or per week, or you can commit to gradually reducing your remaining number of uncompleted To-Dos. (By \"commit\" Beeminder means under threat of paying actual money! But you may also just like Beeminder's fancy graphs.)",
"chromeChatExtension": "Extensió de Chat per Chrome",
"chromeChatExtensionDesc": "The Chrome Chat Extension for Habitica adds an intuitive chat box to all of habitica.com. It allows users to chat in the Tavern, their party, and any guilds they are in.",
"otherExtensions": "<a target='blank' href='http://habitica.wikia.com/wiki/Extensions,_Add-Ons,_and_Customizations'>Other Extensions</a>",
"otherExtensions": "<a target='blank' href='https://habitica.wikia.com/wiki/Extensions,_Add-Ons,_and_Customizations'>Altres extensions</a>",
"otherDesc": "Find other apps, extensions, and tools on the Habitica wiki.",
"resetDo": "Fes-ho, reseteja el meu compte!",
"resetComplete": "Reset complete!",
@@ -103,7 +103,7 @@
"giftedSubscriptionInfo": "<%= name %> gifted you a <%= months %> month subscription",
"giftedSubscriptionFull": "Hello <%= username %>, <%= sender %> has sent you <%= monthCount %> months of subscription!",
"invitedParty": "Invited To Party",
"invitedGuild": "Invited To Guild",
"invitedGuild": "Et van convidar a un gremi",
"importantAnnouncements": "Reminders to check in to complete tasks and receive prizes",
"weeklyRecaps": "Summaries of your account activity in the past week (Note: this is currently disabled due to performance issues, but we hope to have this back up and sending e-mails again soon!)",
"onboarding": "Guidance with setting up your Habitica account",
@@ -122,7 +122,7 @@
"subscriptionRateText": "Recurring $<%= price %> USD every <%= months %> months",
"benefits": "Benefits",
"coupon": "Cupó",
"couponText": "We sometimes have events and give out coupon codes for special gear. (eg, those who stop by our Wondercon booth)",
"couponText": "De vegades tenim esdeveniments i donem codis de cupó per a equips especials. (per exemple, els que passen pel nostre estand de Wondercon)",
"apply": "Aplicar",
"promoCode": "Promo Code",
"promoCodeApplied": "Promo Code Applied! Check your inventory",
@@ -147,19 +147,19 @@
"pushDeviceAdded": "Push device added successfully",
"pushDeviceNotFound": "The user has no push device with this id.",
"pushDeviceRemoved": "Push device removed successfully.",
"buyGemsGoldCap": "Cap raised to <%= amount %>",
"buyGemsGoldCap": "S'ha augmentat el límit a <%= import %>",
"mysticHourglass": "<%= amount %> Mystic Hourglass",
"purchasedPlanExtraMonths": "You have <%= months %> months of extra subscription credit.",
"purchasedPlanExtraMonths": "Tens <%= months %> mesos de crèdit extra de subscripció addicional.",
"consecutiveSubscription": "Consecutive Subscription",
"consecutiveMonths": "Consecutive Months:",
"gemCapExtra": "Gem Cap Extra:",
"gemCapExtra": "Bonificació de gemma",
"mysticHourglasses": "Mystic Hourglasses:",
"mysticHourglassesTooltip": "Mystic Hourglasses",
"paypal": "PayPal",
"amazonPayments": "Amazon Payments",
"amazonPaymentsRecurring": "Ticking the checkbox below is necessary for your subscription to be created. It allows your Amazon account to be used for ongoing payments for <strong>this</strong> subscription. It will not cause your Amazon account to be automatically used for any future purchases.",
"timezone": "Time Zone",
"timezoneUTC": "Habitica uses the time zone set on your PC, which is: <strong><%= utc %></strong>",
"timezoneUTC": "Habitica utilitza la zona horària establerta al vostre ordinador, que és: <strong><%= utc %></strong>",
"timezoneInfo": "If that time zone is wrong, first reload this page using your browser's reload or refresh button to ensure that Habitica has the most recent information. If it is still wrong, adjust the time zone on your PC and then reload this page again.<br><br> <strong>If you use Habitica on other PCs or mobile devices, the time zone must be the same on them all.</strong> If your Dailies have been resetting at the wrong time, repeat this check on all other PCs and on a browser on your mobile devices.",
"push": "Push",
"about": "About",
@@ -175,6 +175,29 @@
"goToSettings": "Go to Settings",
"usernameVerifiedConfirmation": "Your username, <%= username %>, is confirmed!",
"usernameNotVerified": "Please confirm your username.",
"changeUsernameDisclaimer": "We will be transitioning login names to unique, public usernames soon. This username will be used for invitations, @mentions in chat, and messaging.",
"verifyUsernameVeteranPet": "One of these Veteran Pets will be waiting for you after you've finished confirming!"
"changeUsernameDisclaimer": "Aviat farem la transició dels noms d'inici de sessió a noms d'usuari únics i públics. Aquest nom d'usuari s'utilitzarà per a invitacions, @mencions al xat i missatgeria.",
"verifyUsernameVeteranPet": "One of these Veteran Pets will be waiting for you after you've finished confirming!",
"resetAccount": "Restableix el compte",
"dayStartAdjustment": "Ajust d'inici del dia",
"chatExtension": "<a target='blank' href='https://chrome.google.com/webstore/detail/habitrpg-chat-client/hidkdfgonpoaiannijofifhjidbnilbb'>Extensió de xat deChrome</a> i <a target='blank' href='https://addons.mozilla.org/en-US/firefox/addon/habitica-chat-client-2/'>Extensió de xat de Firefox</a>",
"chatExtensionDesc": "L'extensió de xat per a Habitica afegeix un quadre de xat intuïtiu a tot habitica.com. Permet als usuaris xatejar a la taverna, a la seva festa i a qualsevol gremi en què es trobin.",
"subscriptionReminders": "Recordatoris de subscripcions",
"everywhere": "A tot arreu",
"newPMNotificationTitle": "Nou missatge de <%= name %>",
"giftedSubscriptionWinterPromo": "Hola, <%= username %>, heu rebut <%= monthCount %> mesos de subscripció com a part de la nostra promoció de regals de vacances!",
"addPasswordAuth": "Afegeix contrasenya",
"bannedWordUsedInProfile": "El vostre nom visible o el text Sobre el contingut contenia un llenguatge inadequat.",
"displaynameIssueNewline": "Els noms visibles no poden contenir barres invertides seguides de la lletra N.",
"suggestMyUsername": "Suggereix el meu nom d'usuari",
"onlyPrivateSpaces": "Només en espais privats",
"bannedSlurUsedInProfile": "El vostre nom de visualització o el text Sobre la informació contenia un insult i els vostres privilegis de xat s'han revocat.",
"transactions": "Transaccions",
"gemTransactions": "Transaccions de gemmes",
"transaction_contribution": "A través de la contribució",
"transaction_gift_receive": "Rebut de",
"transaction_buy_money": "Comprat amb diners",
"transaction_buy_gold": "Comprat amb or",
"transaction_spend": "Gastat en",
"nextHourglassDescription": "Els subscriptors reben Mystic Hourglasses dins\nels tres primers dies del mes.",
"adjustment": "Ajust"
}

View File

@@ -128,6 +128,12 @@
"achievementZodiacZookeeperText": "Hat alle Standardfarben der Tierkreiszeichen-Tiere ausgebrütet: Ratte, Kalb, Kaninchen, Schlange, Fohlen, Schaf, Affe, Hahn, Wolf, Tiger, Fliegendes Ferkel, und Drache!",
"achievementZodiacZookeeperModalText": "Du hast alle Tierkreiszeichen-Tiere gesammelt!",
"achievementBirdsOfAFeather": "Fliegende Freunde",
"achievementBirdsOfAFeatherText": "Hat alle Standardfarben der fliegenden Haustiere ausgebrütet: Fliegendes Ferkel, Eule, Papagei, Pterodactylus, Greif, Falke, Pfau, und Hahn.",
"achievementBirdsOfAFeatherModalText": "Du hast alle fliegenden Haustiere gesammelt!"
"achievementBirdsOfAFeatherText": "Hat alle Standardfarben der fliegenden Haustiere ausgebrütet: Fliegendes Ferkel, Eule, Papagei, Pterodactylus, Greif, Falke, Pfau, und Hahn!",
"achievementBirdsOfAFeatherModalText": "Du hast alle fliegenden Haustiere gesammelt!",
"achievementReptacularRumbleModalText": "Du hast alle Reptilien-Haustiere gesammelt!",
"achievementReptacularRumbleText": "Hat alle Standardfarben der Reptilien-Haustiere ausgebrütet: Alligator, Pterodaktylus, Schlange, Triceratops, Schildkröte, Tyrannosaurus Rex, und Velociraptor!",
"achievementReptacularRumble": "Reptilisches Rumpeln",
"achievementGroupsBeta2022": "Interaktive Beta Testperson",
"achievementGroupsBeta2022Text": "Deine Gruppe und Du habt unschätzbar wertvolles Feedback beigesteuert, um Habitica beim Testen zu unterstützen.",
"achievementGroupsBeta2022ModalText": "Du hast mit Deinen Gruppen Habitica geholfen, indem ihr getestet und Feedback geschrieben habt!"
}

View File

@@ -1,5 +1,5 @@
{
"backgrounds": "Ambiente",
"backgrounds": "Hintergründe",
"background": "Hintergrund",
"backgroundShop": "Hintergrund-Shop",
"backgroundShopText": "Hintergrund-Shop",
@@ -224,7 +224,7 @@
"backgroundPurpleText": "Lila",
"backgroundPurpleNotes": "Ein lauschig-lilaner Hintergrund.",
"backgroundRedText": "Rot",
"backgroundRedNotes": "Ein rassig-roter Hintergrund.",
"backgroundRedNotes": "Ein reizender roter Hintergrund.",
"backgroundYellowText": "Gelb",
"backgroundYellowNotes": "Ein geschmackvoller gelber Hintergrund.",
"backgrounds122016": "Set 31: Veröffentlicht im Dezember 2016",
@@ -476,8 +476,8 @@
"backgroundPotionShopText": "Elixierladen",
"backgroundFlyingInAThunderstormNotes": "Wage Dich so nah an ein Ungestümes Ungewitter heran wie Du Dich traust.",
"backgroundFlyingInAThunderstormText": "Ungestümes Ungewitter",
"backgroundFarmersMarketNotes": "Kaufe die frischesten Lebensmittel auf dem Bauernmarkt.",
"backgroundFarmersMarketText": "Bauernmarkt",
"backgroundFarmersMarketNotes": "Kaufe die frischesten Lebensmittel auf dem Wochenmarkt.",
"backgroundFarmersMarketText": "Wochenmarkt",
"backgrounds112019": "Set 66: Veröffentlicht im November 2019",
"backgroundWinterNocturneNotes": "Entspanne Dich im Sternenlicht eines Winternachtstückes.",
"backgroundWinterNocturneText": "Winternachtstück",
@@ -518,7 +518,7 @@
"backgroundRainyBarnyardText": "Regnerischer Scheunenhof",
"backgroundHeatherFieldNotes": "Genieße den Duft eines Feldes voller Heidekraut.",
"backgroundHeatherFieldText": "Heidekrautfeld",
"backgroundAnimalCloudsNotes": "Trainiere Deine Vorstellungskraft, indem du Tierformen in den Wolken suchst.",
"backgroundAnimalCloudsNotes": "Trainiere Deine Vorstellungskraft, indem Du Tierformen in den Wolken suchst.",
"backgroundAnimalCloudsText": "Tierwolken",
"backgrounds042020": "Set 71: Veröffentlicht im April 2020",
"backgroundStrawberryPatchNotes": "Pflücke frische Köstlichkeiten von einem Erdbeerbeet.",
@@ -569,14 +569,14 @@
"backgroundRestingInTheInnText": "Pause im Gasthaus",
"backgroundMysticalObservatoryNotes": "Deine Bestimmung steht in den Sternen; vom Mystischen Observatorium aus kannst Du sie lesen.",
"backgroundMysticalObservatoryText": "Mystisches Observatorium",
"backgrounds112020": "SET 78: Veröffentlicht im November 2020",
"backgrounds112020": "Set 78: Veröffentlicht im November 2020",
"backgroundHolidayHearthNotes": "Entspanne, trockne und wärme Deine Glieder an einem Feierlichen Feuer.",
"backgroundHolidayHearthText": "Feierliches Feuer",
"backgroundInsideAnOrnamentNotes": "Lasse Deine Festtagsstimmung aus dem Inneren dieses Baumschmuckes erstrahlen.",
"backgroundInsideAnOrnamentText": "Im Baumschmuck",
"backgroundGingerbreadHouseNotes": "Genieße die Aussicht, den Geruch und (wenn Du Dich traust) den Geschmack eines riesigen Pfefferkuchenhauses.",
"backgroundGingerbreadHouseText": "Pfefferkuchenhaus",
"backgrounds122020": "SET 79: Veröffentlicht im Dezember 2020",
"backgrounds122020": "Set 79: Veröffentlicht im Dezember 2020",
"backgroundWintryCastleNotes": "Sei zeuge eines Winterlichen Schlosses im kalten Nebel.",
"backgroundWintryCastleText": "Winterliches Schloss",
"backgroundIcicleBridgeNotes": "Überqueren der Eiszapfenbrücke auf eigene Gefahr.",
@@ -618,7 +618,7 @@
"backgroundForestedLakeshoreNotes": "Mach Deine Party neidisch mit diesem Platz am bewaldeten Seeufer.",
"backgroundWaterMillNotes": "Sieh wie das Rad der Wassermühle seine Runden dreht.",
"backgroundForestedLakeshoreText": "Bewaldetes Seeufer",
"backgroundClotheslineNotes": "Häng mit der Kleidung ab, die an der Wäscheleine hängt.",
"backgroundClotheslineNotes": "Häng ab mit der Kleidung, die an der Wäscheleine hängt.",
"backgroundRagingRiverNotes": "Steh inmitten dem mächtigen Strom eines tosenden Flusses.",
"backgroundRagingRiverText": "Tosender Fluss",
"backgroundGhostShipNotes": "Zeige, dass die Sagen und Legenden wahr sind, indem Du das Geisterschiff betrittst.",
@@ -693,5 +693,19 @@
"backgroundFlowerShopNotes": "Genieße den süßen Duft eines Blumenladens.",
"backgroundSpringtimeLakeText": "Frühlingssee",
"backgroundSpringtimeLakeNotes": "Genieße die Aussicht an den Ufern eines Frühlingssees.",
"hideLockedBackgrounds": "Verstecke nicht erworbene Hintergründe"
"hideLockedBackgrounds": "Verstecke nicht erworbene Hintergründe",
"backgrounds052022": "SET 96: Veröffentlicht im Mai 2022",
"backgroundOnACastleWallText": "Auf einer Burgmauer",
"backgroundOnACastleWallNotes": "Aussicht von oben auf einer Burgmauer.",
"backgroundCastleGateText": "Burgtor",
"backgroundEnchantedMusicRoomText": "Verwunschenes Musikzimmer",
"backgroundEnchantedMusicRoomNotes": "Spiele in einem verwunschenen Musikzimmer.",
"backgroundCastleGateNotes": "Steh Wache am Burgtor.",
"backgrounds062022": "Set 97: Veröffentlicht im Juni 2022",
"backgroundBeachWithDunesText": "Strand mit Dünen",
"backgroundBeachWithDunesNotes": "Erkunde einen Strand mit Dünen.",
"backgroundMountainWaterfallText": "Wasserfall in den Bergen",
"backgroundMountainWaterfallNotes": "Bewundere einen Wasserfall in den Bergen.",
"backgroundSailboatAtSunsetText": "Segelboot bei Sonnenuntergang",
"backgroundSailboatAtSunsetNotes": "Geniesse ein Segelboot im Sonnenuntergang."
}

View File

@@ -85,7 +85,7 @@
"allocatePerPop": "Erhöhe Wahrnehmung um einen Punkt",
"allocateInt": "Zugewiesene Intelligenzpunkte:",
"allocateIntPop": "Erhöhe Intelligenz um einen Punkt",
"noMoreAllocate": "Jetzt, nach dem Erreichen von Level 100 wirst Du keine weiteren Attributpunkte erhalten. Du kannst weiterspielen, oder ein neues Abenteuer auf Level 1 anfangen, in dem Du die <a href='http://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Sphäre der Wiedergeburt</a> benutzt!",
"noMoreAllocate": "Jetzt, nach dem Erreichen von Level 100, wirst Du keine weiteren Attributpunkte erhalten. Du kannst weiterspielen, oder ein neues Abenteuer auf Level 1 anfangen, in dem Du die <a href='http://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Sphäre der Wiedergeburt</a> benutzt!",
"stats": "Attributwerte",
"achievs": "Erfolge",
"strength": "Stärke",
@@ -133,7 +133,7 @@
"optOutOfClasses": "Später entscheiden",
"chooseClass": "Wähle Deine Klasse",
"chooseClassLearnMarkdown": "[Erfahre mehr über Habiticas Klassensystem](https://habitica.fandom.com/de/wiki/Klassen)",
"optOutOfClassesText": "Keine Lust auf Klassen oder Du möchtest Dich später entscheiden? Brich jetzt ab und werde ein Krieger ohne Spezialfähigkeiten. Du kannst Dich im Wiki über das Klassensystem informieren und Deine Klasse jederzeit unter Benutzer Icon -> Statuswerte aktivieren.",
"optOutOfClassesText": "Keine Lust auf Klassen oder Du möchtest Dich später entscheiden? Brich jetzt ab und werde ein Krieger ohne Spezialfähigkeiten. Du kannst Dich im Wiki über das Klassensystem informieren und Deine Klasse jederzeit unter Benutzer Icon -> Statuswerte aktivieren.",
"selectClass": "Wähle <%= heroClass %>",
"select": "Auswählen",
"stealth": "Schleichen",

View File

@@ -6,7 +6,7 @@
"commGuidePara002": "Damit sich hier jeder sicher fühlen, glücklich und produktiv sein kann, gibt es ein paar Richtlinien. Wir haben uns große Mühe gegeben, sie möglichst nett und leicht verständlich zu formulieren. Bitte nimm Dir die Zeit, sie durchzulesen, bevor Du anfängst zu chatten.",
"commGuidePara003": "Diese Regeln gelten an allen sozialen Orten, die wir verwenden, bezogen (aber nicht unbedingt eingeschränkt) auf Trello, GitHub, Weblate und dem Habitica Wiki auf Fandom. Wenn Gemeinschaften wachsen und sich verändern, passen sich manchmal ihre Regeln von Zeit zu Zeit an. Wenn es wesentliche Änderungen dieser Richtlinien gibt, wirst Du dies durch eine Bailey-Ankündigung und/oder in unseren sozialen Medien hören!",
"commGuideHeadingInteractions": "Interaktionen in Habitica",
"commGuidePara015": "Habitica hat zwei Arten sozialer Orte: öffentliche und private. Öffentliche Orte sind das Gasthaus, öffentliche Gilden, GitHub, Trello und das Wiki. Private Orte sind private Gilden, der Gruppenchat und private Nachrichten. Alle Anzeigenamen und @Usernamen müssen den Community-Richtlinien für öffentliche Orte entsprechen. Um Deinen Anzeigenamen oder @Usernamen zu ändern, wähle in der mobilen App Menü > Einstellungen > Profil. Und wähle auf der Webseite Benutzer Icon > Profil und klicke auf den \"Bearbeiten\"-Knopf.",
"commGuidePara015": "Habitica hat zwei Arten sozialer Orte: öffentliche und private. Öffentliche Orte sind die Taverne, öffentliche Gilden, GitHub, Trello und das Wiki. Private Orte sind private Gilden, der Partychat und private Nachrichten. Alle Anzeigenamen und @Usernamen müssen den Community-Richtlinien für öffentliche Orte entsprechen. Um Deinen Anzeigenamen oder @Usernamen zu ändern, wähle in der mobilen App Menü > Einstellungen > Profil. Und wähle auf der Webseite Benutzer Icon > Profil und klicke auf den \"Bearbeiten\"-Knopf.",
"commGuidePara016": "Wenn Du Dich durch die öffentlichen Orte in Habitica bewegst, gibt es ein paar allgemeine Regeln, damit jeder sicher und glücklich ist.",
"commGuideList02A": "<strong>Respektiert einander</strong>. Sei höflich, freundlich und hilfsbereit. Vergiss nicht: Habiticaner kommen aus den verschiedensten Hintergründen und haben sehr unterschiedliche Erfahrungen gemacht. Das macht Habitica so eigenartig! Es ist wichtig, dass man beim Aufbauen einer Community seine Unterschiede und Ähnlichkeiten respektieren, aber natürlich auch feiern kann.",
"commGuideList02B": "<strong>Halte Dich an die <a href='/static/terms' target='_blank'>allgemeinen Geschäftsbedingungen</a></strong>, sowohl in öffentlichen als auch in privaten Umgebungen.",
@@ -124,7 +124,7 @@
"commGuideList01A": "Die Allgemeinen Geschäftsbedingungen gelten für alle Bereiche, einschließlich privater Gilden, Party-Chat und Nachrichten.",
"commGuideList01C": "Alle Diskussionen müssen für alle Altersgruppen angemessen und frei von Kraftausdrücken sein.",
"commGuideList01D": "Haltet euch bitte an die Anweisungen der Moderatoren.",
"commGuideList01E": "Fange in der Taverne keine Streitgespräche an und lassen Sie sich nicht darauf ein.",
"commGuideList01E": "Fange in der Taverne keine Streitgespräche an und lass Dich nicht auf solche ein.",
"commGuideList01F": "Kein Betteln um bezahlte Artikel, kein Spamming oder große Überschriften/Großbuchstaben.",
"commGuidePara017": "Hier ist die Kurzfassung, aber wir möchten Dich ermutigen, weiter unten mehr Details zu erfahren:",
"commGuideList02M": "Frage nicht nach Edelsteinen, Abonnements oder der Mitgliedschaft in Gruppenabonnements. Nachfragen dieser Art sind weder in der Taverne, noch in öffentlichen oder privaten Chaträumen und auch nicht in Privatnachrichten erlaubt. Wiederholte oder extreme Betteleien, vor allem nachdem bereits eine Warnung ausgesprochen wurde, können zu einer Sperrung des Accounts führen.",

View File

@@ -1,5 +1,5 @@
{
"playerTiersDesc": "Die farbigen Nutzernamen, die Du im Chat siehst, stehen für den Mitwirkenden-Rang der Person. Je höher der Rang, desto mehr hat die Person zu Habitica beigetragen, durch Kunst, Code, die Gemeinschaft oder anderes!",
"playerTiersDesc": "Die farbigen Benutzernamen, die Du im Chat siehst, stehen für den Mitwirkenden-Rang der Person. Je höher der Rang, desto mehr hat die Person zu Habitica beigetragen, durch Kunst, Code, die Gemeinschaft oder anderes!",
"tier1": "Rang 1 (Freund)",
"tier2": "Rang 2 (Freund)",
"tier3": "Rang 3 (Elite)",

View File

@@ -3,7 +3,7 @@
"dontDespair": "Nicht verzweifeln!",
"deathPenaltyDetails": "Du hast ein Level, Dein Gold und ein Stück Ausrüstung verloren, aber Du kannst alles durch harte Arbeit wieder zurückbekommen! Viel Glück -- Du schaffst das.",
"refillHealthTryAgain": "Lebenspunkte wiederherstellen & Nochmal versuchen",
"dyingOftenTips": "Passiert das öfters? <a href='http://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>Hier gibt es einige Tipps!</a>",
"dyingOftenTips": "Passiert das öfters? <a href='https://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>Hier gibt es einige Tipps!</a>",
"losingHealthWarning": "Vorsicht - Du verlierst Lebenspunkte!",
"losingHealthWarning2": "Lass Deine Lebenspunkte nicht auf null fallen! Sollte das passieren wirst Du ein Level, Dein Gold und einen Gegenstand Deiner Ausrüstung verlieren.",
"toRegainHealth": "Um Deine Lebenspunkte wiederherzustellen:",

View File

@@ -2284,7 +2284,7 @@
"armorSpecialBirthday2021Text": "Extravagante Festtageskleider",
"weaponMystery202102Notes": "Der rosa leuchtende Edelstein in diesem Zauberstab birgt die Gabe weit und breit Frohsinn und Freundschaft zu sähen! Gewährt keinen Attributbonus. Februar 2021 Abonnentengegenstand.",
"weaponMystery202102Text": "Charmanter Zauberstab",
"shieldArmoireSoftPinkPillowNotes": "Aufmerksame Kampfkünstler packen für jede Unternehmung ein Kissen ein. Dämpfe des Lebens Schicksalsschläge ... und liege bequemer, wenn du ein Nickerchen hältst. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Weichpinkes Wohlfühl-Set (Gegenstand 3 von 3).",
"shieldArmoireSoftPinkPillowNotes": "Aufmerksame Kampfkünstler packen für jede Unternehmung ein Kissen ein. Dämpfe des Lebens Schicksalsschläge ... und liege bequemer, wenn du ein Nickerchen hältst. Erhöht Stärke um <%= attrs %>. Verzauberter Schrank: Weichpinkes Wohlfühl-Set (Gegenstand 3 von 3).",
"shieldArmoireSoftPinkPillowText": "Weichpinkes Wurfkissen",
"headArmoirePinkFloppyHatNotes": "Viele Zauber wurden in diese einfache Mütze genäht, um diese perfekt-pinke Farbe zu erreichen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Weichpinkes Wohlfühl-Set (Gegenstand 1 von 3).",
"headArmoirePinkFloppyHatText": "Weichpinke Wohlfühlmütze",
@@ -2620,5 +2620,27 @@
"backMystery202205Text": "Dämmerungs-Flügel",
"headAccessoryMystery202205Notes": "Diese glänzenden Hörner sind so hell wie ein Sonnenuntergang in der Wüste. Gewährt keinen Attributbonus. Mai 2022 Abonnentengegenstand.",
"backMystery202205Notes": "Das mächtige Schlagen dieser gewaltigen Flügel hallt von den Dünen wider. Gewährt keinen Attributbonus. Mai 2022 Abonnentengegenstand.",
"headAccessoryMystery202205Text": "Dämmerungsschwingen Drachen Hörner"
"headAccessoryMystery202205Text": "Dämmerungsschwingen Drachen Hörner",
"weaponArmoireHuntingHornText": "Jagdhorn",
"weaponArmoireHuntingHornNotes": "Tuuut! Tuut! Tuut! Rufe deine Party für ein Abenteuer oder eine Quest zusammen, indem Du auf diesem Horn spielst. Erhöht Stärke um <%= str %> und Intelligenz um <%= int %>. Verzauberter Schrank: Musikinstrument Set 1 (Gegenstand 1 von 3)",
"headArmoireStrawRainHatText": "Stroh-Regenhut",
"shieldArmoireSnareDrumText": "Kleine Trommel",
"shieldArmoireSnareDrumNotes": "Rat-a-tat-ta! Rufe Deine Party für eine Parade oder einen Marsch zusammen, indem Du auf dieser Trommel spielst. Erhöht Ausdauer um <%= con %> und Intelligenz um <%= int %>. Musikinstrument Set 1 (Gegenstand 3 von 3)",
"shieldArmoireSpanishGuitarNotes": "Kling! Kling! Klooong! Rufe Deine Party für ein Konzert oder eine Feierlichkeit zusammen, indem Du auf dieser Gitarre spielst. Erhöht Wahrnehmung um <%= per %> und Intelligenz um <%= int %>. Verzauberter Schrank: Musikinstrument Set 1 (Gegenstand 2 von 3)",
"shieldArmoireSpanishGuitarText": "Spanische Gitarre",
"armorArmoireStrawRaincoatNotes": "Dieser gewebte Strohumhang wird Dich während Deiner Quest trocken halten und Deine Rüstung vor dem Rosten bewahren. Wage Dich jedoch nicht zu nah an Kerzen heran. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Stroh Regenmantel Set (Gegenstand 1 von 2).",
"headMystery202206Text": "Meereselfen-Diadem",
"backMystery202206Text": "Meereselfen-Flügel",
"backMystery202206Notes": "Wunderliche Flügel aus Wasser und Wellen! Verleiht keinen Vorteil. Juni 2022 Abonnentengegenstand.",
"headMystery202206Notes": "Die blaue Perle in diesem Diadem verleiht dir Wasserbändigungskräfte. Nutze sie weise! Verleiht keinen Vorteil. Juni 2022 Abonnentengegenstand.",
"weaponArmoireBlueKiteText": "Blauer Drachen",
"weaponArmoireBlueKiteNotes": "Hoch am Himmel fliegt der Drachen, welche Stunts kann er wohl machen? Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Kleiderschrank: Drachen Set (Gegenstand 1 von 5)",
"weaponArmoireGreenKiteText": "Grüner Drachen",
"weaponArmoireGreenKiteNotes": "Einen schöneren Drachen findet man kaum, in grün und gelb, es ist ein Traum. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Kleiderschrank: Drachen Set (Gegenstand 2 von 5)",
"weaponArmoireOrangeKiteText": "Oranger Drachen",
"weaponArmoireOrangeKiteNotes": "Mit Farben wie der Aufgang und Untergang der Sonne, hoch zu fliegen ist für diesen Drachen eine Wonne. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Kleiderschrank: Drachen Set (Gegenstand 3 von 5)",
"weaponArmoirePinkKiteText": "Pinker Drachen",
"weaponArmoirePinkKiteNotes": "Er steigt auf , schießt zu Boden, dreht sich flink, dein Drachen im leuchtenden Pink. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Kleiderschrank: Drachen Set (Gegenstand 4 von 5)",
"weaponArmoireYellowKiteText": "Gelber Drachen",
"weaponArmoireYellowKiteNotes": "Er saust am Himmel hin und her, das fällt dem heiteren Drachen nicht schwer. Erhöht alle Werte um jeweils <%= attrs %> . Verzauberter Kleiderschrank: Drachen Set (Gegenstand 5 von 5)"
}

View File

@@ -128,7 +128,7 @@
"birthdayCardAchievementText": "Viele fröhliche Wiedersehen! Hat <%= count %> Geburtstagsgrußkarten verschickt oder erhalten.",
"congratsCard": "Glückwunschkarte",
"congratsCardExplanation": "Ihr beide erhaltet den Gratulierender-Gefährte-Erfolg!",
"congratsCardNotes": "Sende eine Glückwunschkarte an ein Gruppenmitglied.",
"congratsCardNotes": "Sende eine Glückwunschkarte an ein Partymitglied.",
"congrats0": "Glückwunsch zu Deinem Erfolg!",
"congrats1": "Ich bin so stolz auf Dich!",
"congrats2": "Gut gemacht!",
@@ -138,7 +138,7 @@
"congratsCardAchievementText": "Es ist großartig, die Erfolge seiner Freunde zu feiern! Hat <%= count %> Glückwunschkarten verschickt oder erhalten.",
"getwellCard": "\"Gute Besserung\"-Karte",
"getwellCardExplanation": "Ihr beide erhaltet den Erfolg \"Mitfühlender Mitstreiter\"!",
"getwellCardNotes": "Sende einem Gruppenmitglied eine Gute-Besserung-Karte.",
"getwellCardNotes": "Sende einem Partymitglied eine Gute-Besserung-Karte.",
"getwell0": "Hoffentlich geht's Dir bald besser!",
"getwell1": "Achte auf Dich! <3",
"getwell2": "Ich bin in Gedanken bei Dir!",
@@ -147,7 +147,7 @@
"getwellCardAchievementText": "Besserungswünsche werden immer geschätzt. Hat <%= count %> Gute-Besserung-Karten verschickt oder erhalten.",
"goodluckCard": "Viel-Glück-Karte",
"goodluckCardExplanation": "Ihr erhaltet beide den Glücksbrief-Erfolg!",
"goodluckCardNotes": "Schicke eine Viel-Glück-Karte an ein Gruppenmitglied.",
"goodluckCardNotes": "Schicke eine Viel-Glück-Karte an ein Partymitglied.",
"goodluck0": "Möge das Glück immer mit Dir sein!",
"goodluck1": "Ich wünsche Dir ganz viel Glück!",
"goodluck2": "Ich hoffe, dass das Glück heute und jeden anderen Tag auf Deiner Seite ist!!",
@@ -213,5 +213,5 @@
"reportDescription": "Beschreibung",
"reportDescriptionText": "Füge hilfreiche Screenshots oder Fehlermeldungen der Javascript-Konsole ein.",
"reportDescriptionPlaceholder": "Beschreibe den Fehler hier im Detail",
"submitBugReport": "Sende eine Fehlermeldung"
"submitBugReport": "Sende die Fehlermeldung"
}

View File

@@ -190,7 +190,7 @@
"needsWork": "Benötigt Arbeit",
"viewRequests": "Anfragen anzeigen",
"groupSubscriptionPrice": "$9 monatlich + $3 pro Monat für jedes weitere Gruppenmitglied",
"groupBenefitsDescription": "Wir haben gerade die Betaversion der Gruppenpläne gestartet! Das Upgrade auf den Gruppenplan schaltet einige einzigartige Funktionen frei, welche die soziale Seite von Habitica verbessern.",
"groupBenefitsDescription": "Wir haben gerade die Betaversion der Gruppenpläne gestartet! Das Upgrade auf den Gruppenplan schaltet einige einzigartige Funktionen frei, welche die soziale Seite von Habitica verbessern.",
"teamBasedTasks": "Gruppenorientierte Aufgaben",
"cannotDeleteActiveGroup": "Du kannst keine Gruppe mit einem laufenden Abonnement löschen",
"groupTasksTitle": "Gruppen-Aufgabenliste",
@@ -365,7 +365,7 @@
"bannedWordsAllowedDetail": "Durch Auswahl dieser Option, wird das Verwenden verbotener Wörter in dieser Gilde zugelassen.",
"bannedWordsAllowed": "Verbotene Wörter zulassen",
"languageSettings": "Spracheinstellungen",
"cannotRemoveQuestOwner": "Du kannst die Person, welche die aktive Quest besitzt nicht entfernen. Breche erst die Quest ab.",
"cannotRemoveQuestOwner": "Du kannst die Person, welche die aktive Quest besitzt, nicht entfernen. Breche erst die Quest ab.",
"features": "Funktionen",
"giftMessageTooLong": "Die maximale Länge für Geschenk-Nachrichten ist <%= maxGiftMessageLength %>.",
"selectSubscription": "Wähle ein Abonnement",
@@ -378,5 +378,6 @@
"editParty": "Party bearbeiten",
"leaveGuild": "Gilde verlassen",
"viewDetails": "Details ansehen",
"upgradeToGroup": "Auf Gruppenplan upgraden"
"upgradeToGroup": "Auf Gruppenplan upgraden",
"sendGiftTotal": "Insgesamt:"
}

View File

@@ -49,7 +49,7 @@
"toAndFromCard": "An: <%= toName %>, Von: <%= fromName %>",
"nyeCard": "Neujahrskarte",
"nyeCardExplanation": "Dafür, dass ihr gemeinsam Neujahr gefeiert habt, erhaltet ihr beide die Auszeichnung \"Alte Bekannte\"!",
"nyeCardNotes": "Einem Gruppenmitglied eine Neujahrskarte schicken.",
"nyeCardNotes": "Einem Partymitglied eine Neujahrskarte schicken.",
"seasonalItems": "Saisonaler Artikel",
"nyeCardAchievementTitle": "Alte(r) Bekannte(r)",
"nyeCardAchievementText": "Fröhliches neues Jahr! Du hast <%= count %> Neujahrskarten verschickt oder erhalten.",
@@ -188,11 +188,11 @@
"septemberYYYY": "September <%= year %>",
"royalPurpleJackolantern": "Purpurne Kürbislaterne",
"novemberYYYY": "November <%= year %>",
"g1g1Limitations": "Dies ist eine zeitlich beschränkte Aktion, die am 16. Dezember um 13:00 Uhr (GMT) startet und am 6. Januar um 01:00 Nachts (GMT) endet. Dieses Angebot ist nur gültig, wenn Du einen anderen Habitikianer beschenkst. Wenn Du oder die beschenkte Person bereits ein Abo haben, wird dieses, sobald es abläuft oder gekündigt wird, um die Zeit des Geschenkes verlängert werden.",
"g1g1Limitations": "Dies ist eine zeitlich beschränkte Aktion, die am 16. Dezember um 13:00 Uhr (GMT) startet und am 6. Januar um 01:00 Nachts (GMT) endet. Dieses Angebot ist nur gültig, wenn Du einen anderen Habiticaner beschenkst. Wenn Du oder die beschenkte Person bereits ein Abo haben, wird dieses, sobald es abläuft oder gekündigt wird, um die Zeit des Geschenkes verlängert werden.",
"limitations": "Einschränkungen",
"g1g1HowItWorks": "Gebe den Account-Namen ein, welchem Du das Geschenk machen willst. Dann wähle die Länge des Abos, das du verschenken möchtest und schließe den Vorgang ab. Dein Account wird automatisch mit dem selben Abo belohnt, das Du gerade verschenkt hast.",
"g1g1HowItWorks": "Gebe den Benutzernamen ein, welchem Du das Geschenk machen willst. Dann wähle die Länge des Abos, das Du verschenken möchtest und schließe den Vorgang ab. Dein Account wird automatisch mit dem selben Abo belohnt, das Du gerade verschenkt hast.",
"howItWorks": "So funktioniert es",
"g1g1Returning": "Anlässlich der Saison bringen wir eine besonderes Angebot zurück. Wenn Du jetzt ein Abonnement verschenkst erhälltst Du im Gegenzug das selbe!",
"g1g1Returning": "Anlässlich der Saison bringen wir ein besonderes Angebot zurück. Wenn Du jetzt ein Abonnement verschenkst erhältst Du im Gegenzug das selbe!",
"g1g1Event": "\"Schenk' Eins, Bekomm' Eins\"- Aktion läuft jetzt!",
"g1g1": "Schenk' Eins, Bekomm' Eins",
"winter2021HollyIvyRogueSet": "Stechpalme und Efeu (Schurke)",

View File

@@ -97,7 +97,7 @@
"skillsTitle": "<%= classStr %> Fertigkeiten",
"toDo": "To-Do",
"tourStatsPage": "Auf dieser Seite kannst Du Deine Statuswerte im Auge behalten. Erreiche neue Erfolge indem Du die aufgelisteten Aufgaben erledigst.",
"tourTavernPage": "Willkommen in der Taverne, einem Gesprächsraum für alle Altersklassen! Falls Du krank bist oder verreist, kannst Du verhindern, dass Du Leben durch nicht erledigte Tagesaufgaben verlierst, indem Du auf \"Im Gasthaus erholen\" klickst. Komm herein und sag Hallo!",
"tourTavernPage": "Willkommen in der Taverne, einem Gesprächsraum für alle Altersklassen! Falls Du krank bist oder verreist, kannst Du verhindern, dass Du Leben durch nicht erledigte Tagesaufgaben verlierst, indem Du auf \"In der Taverne erholen\" klickst. Komm herein und sag Hallo!",
"tourPartyPage": "Deine Gruppe wird Dir dabei helfen weiterhin verantwortungsbewusst Deine Aufgaben zu erledigen. Lade Freunde ein um neue Quest-Schriftrollen freizuschalten!",
"tourGuildsPage": "Gilden sind Chatgruppen mit einem gemeinsamen Interesse. Sie sind von Spielern für Spieler erstellt worden. Durchforste die Liste und tritt den Gilden bei, die Dich interessieren. Schau Dir auch einmal die Habitica Help: Ask a Question Gilde an, in der jeder Fragen über Habitica stellen kann!",
"tourChallengesPage": "Herausforderungen sind themenbezogene Aufgabenlisten, welche von Benutzern erstellt wurden! Wenn Du an einer Herausforderung teilnimmst, werden die Aufgaben Deinem Konto hinzugefügt. Trete gegen andere Benutzer an, um Edelsteine zu gewinnen!",

View File

@@ -46,7 +46,7 @@
"noFood": "Du hast im Moment weder Futter noch magische Sättel.",
"dropsExplanation": "Erhalte diese Gegenstände schneller mit Edelsteinen, wenn Du nicht warten möchtest, bis Du sie als Beute für erfüllte Aufgaben erhältst. <a href=\"https://habitica.fandom.com/de/wiki/Beute\">Erfahre mehr über das Beutesystem.</a>",
"dropsExplanationEggs": "Du kannst Edelsteine für Eier ausgeben, wenn Du nicht warten willst, bis Du ein Standard-Ei als Beute erhältst, oder wenn Du eine Haustier-Quest nicht wiederholen willst, um weitere Quest-Eier zu erhalten. <a href=\"https://habitica.fandom.com/de/wiki/Beute\">Erfahre mehr über das Beute-System.</a>",
"premiumPotionNoDropExplanation": "Magische Schlüpftränke können nicht auf Eier, die Du durch Quests erhalten hast, angewendet werden. Magische Schlüpftränke können nur gekauft und nicht durch zufällige Beute erworben werden.",
"premiumPotionNoDropExplanation": "Magische Schlüpfelixiere können nicht auf Eier, die Du durch Quests erhalten hast, angewendet werden. Magische Schlüpfelixiere können nur gekauft und nicht durch zufällige Beute erworben werden.",
"beastMasterProgress": "\"Meister aller Bestien\" Fortschritt",
"beastAchievement": "Du hast den Erfolg \"Meister aller Bestien\" dafür erhalten, dass Du alle Haustiere gesammelt hast!",
"beastMasterName": "Meister aller Bestien",

View File

@@ -575,7 +575,7 @@
"questDysheartenerText": "Der Entmutiger",
"questDysheartenerNotes": "Es ist Valentinstag, die Sonne geht gerade auf, als plötzlich ein erschütternder Krach die Luft zerreißt. Ein kränkliches rosa Licht durchdringt die Gebäude, und Ziegel zerbrechen, als sich ein tiefer Riss auf Habit City's Hauptstraße auftut. Ein überirdisches Kreischen ertönt durch die Luft und lässt die Fenster zerspringen, während sich eine ungeschlachte Form aus der klaffenden Erde erhebt.<br><br>Mandibeln schnappen, der Panzer glitzert; Bein um Bein entfaltet sich in der Luft. Die Menge beginnt zu schreien, als die insektoide Kreatur aufsteht und sich als schrecklichste aller Kreaturen zu erkennen gibt: der furchterregende Entmutiger höchstselbst. Er heult erwartungsvoll und stürzt vor, um an den Hoffnungen hart arbeitender Habiticaner zu nagen. Mit jedem scharrenden Kratzen seiner stacheligen Vorderbeine fühlst Du, wie sich Dein Herz in der Brust vor Verzweiflung weiter zusammenzieht.<br><br>“Fasst Euch alle ein Herz!” ruft Lemoness. “Er denkt vielleicht, dass wir leichte Ziele sind, weil so viele von uns entmutigende Neujahrsvorsätze haben, aber er wird feststellen, dass Habiticaner wissen, wie man an seinen Zielen festhält!”<br><br>AnnDeLune hebt ihren Stab. “Lasst uns unsere Aufgaben angehen und dieses Monster erledigen!”",
"questDysheartenerCompletion": "<strong>Der Entmutiger wurde BESIEGT!</strong><br><br>Gemeinsam holen alle in Habitica zu einem letzten Schlag mit ihren Aufgaben aus, und der Entmutiger weicht mit einem bestürzten Kreischen zurück. “Stimmt etwas nicht, Entmutiger?” ruft AnnDeLune mit funkelnden Augen. “Fühlst Du Dich entmutigt?”<br><br>Glühend pinke Risse zeigen sich auf dem Panzer des Entmutigers, und er zerbricht mit einer verpuffenden rosa Rauchwolke. Eine Flut von köstlichen Süßigkeiten regnet auf alle hernieder, während sich im ganzen Land ein erneuertes Gefühl von Kraft und Entschlossenheit ausbreitet.<br><br>Die Menge jubelt wild, Umarmungen werden ausgetauscht, und die Haustiere kauen glücklich auf ihren verspäteten Valentinsleckerli. Plötzlich liegt Gesang in der Luft, ein fröhlicher Chor ertönt, und funkelnde Silhouetten ziehen über den Himmel.<br><br>Unser neu-gewonnener Optimismus hat eine Herde Hippogreifen angelockt! Die anmutigen Kreaturen setzen auf dem Boden auf, sträuben interessiert ihre Federn und tänzeln auf der Stelle. “Wie es aussieht, haben wir neue Freunde gefunden, die uns helfen, nicht zu verzagen, selbst wenn unsere Aufgaben noch so beängstigend sind”, sagt Lemoness. <br><br>Beffymaroo hat bereits ihre Arme voll mit gefiederten Plüschbällen. “Vielleicht helfen sie uns, die zerstörten Gebiete Habitica's wieder aufzubauen!”<br><br>Summend und singend ziehen die Hippogreifen voran, während alle Habiticaner zusammenarbeiten, um unsere geliebte Heimat wieder aufzubauen.",
"questDysheartenerCompletionChat": "`Der Entmutiger wurde BESIEGT!'`\n\nGemeinsam holen alle in Habitica zu einem letzten Schlag mit ihren Aufgaben aus, und der Entmutiger weicht mit einem bestürzten Kreischen zurück. “Stimmt etwas nicht, Entmutiger?” ruft AnnDeLune mit funkelnden Augen. “Fühlst Du Dich entmutigt?”\n\nGlühend pinke Risse zeigen sich auf dem Panzer des Entmutigers, und er zerbricht mit einer verpuffenden rosa Rauchwolke. Eine Flut von köstlichen Süßigkeiten regnet auf alle hernieder, während sich im ganzen Land ein erneuertes Gefühl von Kraft und Entschlossenheit ausbreitet.\n\nDie Menge jubelt wild, Umarmungen werden ausgetauscht, und die Haustiere kauen glücklich auf ihren verspäteten Valentinsleckerli. Plötzlich liegt Gesang in der Luft, ein fröhlicher Chor ertönt, und funkelnde Silhouetten ziehen über den Himmel.\n\nUnser neu-gewonnener Optimismus hat eine Herde Hippogreifen angelockt! Die anmutigen Kreaturen setzen auf dem Boden auf, sträuben interessiert ihre Federn und tänzeln auf der Stelle. “Wie es aussieht, haben wir neue Freunde gefunden, die uns helfen, nicht zu verzagen, selbst wenn unsere Aufgaben noch so beängstigend sind”, sagt Lemoness.\n\nBeffymaroo hat bereits ihre Arme voll mit gefiederten Plüschbällen. “Vielleicht helfen sie uns, die zerstörten Gebiete Habitica's wieder aufzubauen!”\n\nSummend und singend ziehen die Hippogreifen voran, während alle Habiticaner zusammenarbeiten, um unsere geliebte Heimat wieder aufzubauen.",
"questDysheartenerCompletionChat": "`Der Entmutiger wurde BESIEGT!'`\n\nGemeinsam holen alle in Habitica zu einem letzten Schlag mit ihren Aufgaben aus, und der Entmutiger weicht mit einem bestürzten Kreischen zurück. “Stimmt etwas nicht, Entmutiger?” ruft AnnDeLune mit funkelnden Augen. “Fühlst Du Dich entmutigt?”\n\nGlühend pinke Risse zeigen sich auf dem Panzer des Entmutigers, und er zerbricht mit einer verpuffenden rosa Rauchwolke. Eine Flut von köstlichen Süßigkeiten regnet auf alle hernieder, während sich im ganzen Land ein erneuertes Gefühl von Kraft und Entschlossenheit ausbreitet.\n\nDie Menge jubelt wild, Umarmungen werden ausgetauscht, und die Haustiere kauen glücklich auf ihren verspäteten Valentinsleckerli. Plötzlich liegt Gesang in der Luft, ein fröhlicher Chor ertönt, und funkelnde Silhouetten ziehen über den Himmel.\n\nUnser neu-gewonnener Optimismus hat eine Herde Hippogreifen angelockt! Die anmutigen Kreaturen setzen auf dem Boden auf, sträuben interessiert ihre Federn und tänzeln auf der Stelle. “Wie es aussieht, haben wir neue Freunde gefunden, die uns helfen, nicht zu verzagen, selbst wenn unsere Aufgaben noch so beängstigend sind”, sagt Lemoness.\n\nBeffymaroo hat bereits ihre Arme voll mit gefiederten Plüschbällen. “Vielleicht helfen sie uns, die zerstörten Gebiete Habitica's wieder aufzubauen!”\n\nSummend und singend ziehen die Hippogreifen voran, während alle Habiticaner zusammenarbeiten, um unsere geliebte Heimat wieder aufzubauen.",
"questDysheartenerBossRageTitle": "Niederschmetternder Herzschmerz",
"questDysheartenerBossRageDescription": "Die Anzeige für den Raserei-Angriff füllt sich, wenn Habiticaner ihre Tagesaufgaben nicht abhaken. Sobald sie gefüllt ist, wird der Entmutiger seine Niederschmetternde Herzschmerz-Attacke über einem von Habitica's Ladenbesitzern entfesseln, also strengt Euch an und erledigt Eure Aufgaben!",
"questDysheartenerBossRageSeasonal": "`Der Entmutiger entfesselt NIEDERSCHMETTERNDEN HERZSCHMERZ!`\n\nOh nein! Nachdem er sich an unseren unerledigten Tagesaufgaben gelabt hat, hat der Entmutiger genügend Stärke gesammelt, um seine Niederschmetternde Herzschmerz-Attacke einzusetzen. Mit einem schrillen Aufschrei treffen seine stacheligen Vorderbeine den Pavillon, unter dem der Jahreszeitenmarkt liegt! Die markerschütternde Explosion aus Magie lässt das Holz zersplittern, und die Jahreszeitenzauberin wird bei dem Anblick von Trauer überwältigt.\n\nRasch, lasst uns unsere Tagesaufgaben erledigen, damit das Biest kein weiteres Mal zuschlagen kann!",
@@ -667,7 +667,7 @@
"questRobotCollectGears": "Zahnräder",
"questRobotCollectBolts": "Schrauben",
"questRobotText": "Mysteriöse Mechanische Merkwürdigkeiten!",
"delightfulDinosNotes": "Enthält den \"Pterror-dactyl\", \"Trampelnden Triceratops\" und \"Ausgegrabenen Dinosaurier\". Verfügbar bis zum 30. November.",
"delightfulDinosNotes": "Enthält den \"Pterror-dactyl\", \"Trampelnden Triceratops\" und \"Ausgegrabenen Dinosaurier\". Verfügbar bis zum 31. Mai.",
"delightfulDinosText": "\"Dufte Dinos\" Quest-Paket",
"questAmberCompletion": "\"Trerezin?\" sagt @-Tyr- mit ruhiger Stimme. \"Würdest Du @Vikte loslassen? Ich glaube nicht, dass es ihm so hoch oben wohl ist.\"<br><br>Trerezins Haut wird hochrot und sie setzt @Vikte sanft auf dem Boden ab. \"Bitte entschuldigt! Es ist schon so lange her, dass ich Gäste hatte. Dabei habe ich meine guten Manieren vergessen!\" Sie gleitet vorwärts um euch standesgemäss zu begrüssen, bevor sie in ihrem Baumhaus verschwindet. Gleich darauf kehrt Sie zurück mit einem Arm voll Bernsteinfarbener Schlüpfelixiere als Dankeschön!<br><br>\"Magische Tränke!\" haucht @Vikte.<br><br>\"Ach, diese alten Dinger?\" Trerezins Zunge zittert während sie nachdenkt. \"Wie wär's damit: Ich gebe euch den ganzen Stapel, wenn ihr versprecht, mich ab und zu besuchen zu kommen...\"<br><br>So lasst ihr die Aufgabenwälder hinter euch, um allen über die neuen Schlüpfelixieren zu berichten und natürlich über eure neue Freundin!",
"questAmberNotes": "Du sitzt mit @beffymaroo und @-Tyr- in der Taverne als @Vikte zur Tür hereinplatzt und aufgeregt von Gerüchten über eine neue Art von Magischem Schlüpfelixier erzählt, die in den Aufgabenwälder versteckt seien. Da Deine Tagesaufgaben bereits erledigt sind, beschliesst ihr drei ohne zu zögern, @Vikte bei der Suche zu helfen. Was kann ein kleines Abenteuer schon schaden?<br><br>Nach stundenlangem Marsch durch die Aufgabenwälder fängst Du an, den spontanen Aufbruch zur Jagd zu bereuen. Ihr seid gerade am umkehren als ihr einen überraschten Ausruf hört. Ihr dreht euch um und erblickt eine riesige Echse mit glänzenden, bernsteinfarbenen Schuppen, die sich um einen Baum windet, @Vikte in ihren Krallen haltend. @beffymaroo greift nach ihrem Schwert.<br><br>\"Wartet!\" ruft @-Tyr-. \"Das ist Trerezin! Sie ist nicht gefährlich, nur gefährlich anhänglich!\"",

View File

@@ -204,5 +204,9 @@
"mysterySet202202": "Türkises Rattenschwänzchen Set",
"mysterySet202203": "Furchtlose Libelle-Set",
"mysterySet202204": "Virtuelles Abenteurer Set",
"mysterySet202205": "Dämmerungsschwingen Drachen Set"
"mysterySet202205": "Dämmerungsschwingen Drachen Set",
"howManyGemsSend": "Wie viele Edelsteine möchtest Du verschicken?",
"sendAGift": "Geschenk verschicken",
"howManyGemsPurchase": "Wie viele Edelsteine möchtest Du kaufen?",
"mysterySet202206": "Meereselfen-Set"
}

View File

@@ -132,5 +132,8 @@
"achievementBirdsOfAFeatherModalText": "You collected all the flying pets!",
"achievementReptacularRumble": "Reptacular Rumble",
"achievementReptacularRumbleText": "Has hatched all the standard colors of reptile pets: Alligator, Pterodactyl, Snake, Triceratops, Turtle, Tyrannosaurus Rex, and Velociraptor!",
"achievementReptacularRumbleModalText": "You collected all the reptile pets!"
"achievementReptacularRumbleModalText": "You collected all the reptile pets!",
"achievementGroupsBeta2022":"Interactive Beta Tester",
"achievementGroupsBeta2022Text":"You and your group provided invaluable feedback to help Habitica test.",
"achievementGroupsBeta2022ModalText":"You and your groups helped Habitica by testing and providing feedback!"
}

View File

@@ -787,6 +787,22 @@
"backgroundEnchantedMusicRoomText": "Enchanted Music Room",
"backgroundEnchantedMusicRoomNotes": "Play in an Enchanted Music Room.",
"backgrounds062022": "SET 97: Released June 2022",
"backgroundBeachWithDunesText": "Beach With Dunes",
"backgroundBeachWithDunesNotes": "Explore a beach with dunes.",
"backgroundMountainWaterfallText": "Mountain Waterfall",
"backgroundMountainWaterfallNotes": "Admire a mountain waterfall.",
"backgroundSailboatAtSunsetText": "Sailboat At Sunset",
"backgroundSailboatAtSunsetNotes": "Enjoy the beauty of a sailboat at sunset.",
"backgrounds072022": "SET 98: Released July 2022",
"backgroundBioluminescentWavesText": "Bioluminescent Waves",
"backgroundBioluminescentWavesNotes": "Admire the glow of Bioluminescent Waves.",
"backgroundUnderwaterCaveText": "Underwater Cave",
"backgroundUnderwaterCaveNotes": "Explore an Underwater Cave.",
"backgroundUnderwaterStatuesText": "Underwater Statue Garden",
"backgroundUnderwaterStatuesNotes": "Try not to blink in an Underwater Statue Garden.",
"timeTravelBackgrounds": "Steampunk Backgrounds",
"backgroundAirshipText": "Airship",
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",

View File

@@ -407,6 +407,7 @@
"weaponSpecialSummer2021HealerText": "Staff of Corn",
"weaponSpecialSummer2021HealerNotes": "Not to get corny, but this staff is a lifesaver. Increases Intelligence by <%= int %>. Limited Edition 2021 Summer Gear.",
"weaponSpecialFall2021RogueText": "Dripping Goo",
"weaponSpecialFall2021RogueNotes": "What on Earth did you get into? When people say Rogues have sticky fingers, this is not what they mean! Increases Strength by <%= str %>. Limited Edition 2021 Autumn Gear.",
"weaponSpecialFall2021WarriorText": "Horse Rider's Axe",
@@ -425,6 +426,15 @@
"weaponSpecialWinter2022HealerText": "Crystalline Ice Wand",
"weaponSpecialWinter2022HealerNotes": "Touch this solid-water implement to a friend's neck and they'll jump out of their chair! But they'll feel better afterward. Hopefully. Increases Intelligence by <%= int %>. Limited Edition 2021-2022 Winter Gear.",
"weaponSpecialSummer2022RogueText": "Crab Claw",
"weaponSpecialSummer2022RogueNotes": "If you're in a pinch, don't hesitate to show these fearsome claws! Increases Strength by <%= str %>. Limited Edition 2022 Summer Gear.",
"weaponSpecialSummer2022WarriorText": "Whirling Cyclone",
"weaponSpecialSummer2022WarriorNotes": "It spins! It redirects! And it brings the storm! Increases Strength by <%= str %>. Limited Edition 2022 Summer Gear.",
"weaponSpecialSummer2022MageText": "Manta Ray Staff",
"weaponSpecialSummer2022MageNotes": "Magically clear the waters ahead of you with one swirl of this staff. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2022 Summer Gear.",
"weaponSpecialSummer2022HealerText": "Beneficial Bubbles",
"weaponSpecialSummer2022HealerNotes": "These bubbles release healing magic into the water with a satisfying pop! Increases Intelligence by <%= int %>. Limited Edition 2022 Summer Gear.",
"headSpecialNye2021Text": "Preposterous Party Hat",
"headSpecialNye2021Notes": "You've received a Preposterous Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
@@ -630,6 +640,16 @@
"weaponArmoireGardenersWateringCanNotes": "You cant get far without water! Have an infinite supply on hand with this magic, refilling watering can. Increases Intelligence by <%= int %>. Enchanted Armoire: Gardener Set (Item 4 of 4).",
"weaponArmoireHuntingHornText": "Hunting Horn",
"weaponArmoireHuntingHornNotes": "Twooooo! Twoo! Twoo! Gather your party for an adventure or quest by playing this horn. Increases Strength by <%= str %> and Intelligence by <%= int %>. Enchanted Armoire: Musical Instrument Set 1 (Item 1 of 3)",
"weaponArmoireBlueKiteText":"Blue Kite",
"weaponArmoireBlueKiteNotes":"Sailing high up in the blue, what tricks can you make your kite do? Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 1 of 5)",
"weaponArmoireGreenKiteText":"Green Kite",
"weaponArmoireGreenKiteNotes":"A more stunning kite youve never seen, with its shades of yellow and green. Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 2 of 5)",
"weaponArmoireOrangeKiteText":"Orange Kite",
"weaponArmoireOrangeKiteNotes":"With colors like sunrise and sunset, lets see how high your kite can get! Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 3 of 5)",
"weaponArmoirePinkKiteText":"Pink Kite",
"weaponArmoirePinkKiteNotes":"Diving, twirling, soaring high, your kite stands out against the sky. Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 4 of 5)",
"weaponArmoireYellowKiteText":"Yellow Kite",
"weaponArmoireYellowKiteNotes":"Swooping and swerving to and fro, watch your cheerful kite go. Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 5 of 5)",
"armor": "armor",
"armorCapitalized": "Armor",
@@ -1048,6 +1068,15 @@
"armorSpecialSpring2022HealerText": "Peridot Armor",
"armorSpecialSpring2022HealerNotes": "Drive away fears and nightmares simply by wearing this green gem garment. Increases Constitution by <%= con %>. Limited Edition 2022 Spring Gear.",
"armorSpecialSummer2022RogueText": "Crab Armor",
"armorSpecialSummer2022RogueNotes": "Perfect for a casual scuttle down the beach. Increases Perception by <%= per %>. Limited Edition 2022 Summer Gear.",
"armorSpecialSummer2022WarriorText": "Waterspout Armor",
"armorSpecialSummer2022WarriorNotes": "Get ready for a watery battle as you surround yourself with this twirling, whirling column of air and mist. Increases Constitution by <%= con %>. Limited Edition 2022 Summer Gear.",
"armorSpecialSummer2022MageText": "Manta Ray Armor",
"armorSpecialSummer2022MageNotes": "When wearing this armor, you will glide easily through your work like the manta ray glides through water. Increases Intelligence by <%= int %>. Limited Edition 2022 Summer Gear.",
"armorSpecialSummer2022HealerText": "Angelfish Tail",
"armorSpecialSummer2022HealerNotes": "Use your colorful fins to scoot about the reef and help those in need of rest and healing. Increases Constitution by <%= con %>. Limited Edition 2022 Summer Gear.",
"armorMystery201402Text": "Messenger Robes",
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
"armorMystery201403Text": "Forest Walker Armor",
@@ -1154,8 +1183,10 @@
"armorMystery202110Notes": "Velvety moss makes you seem soft on the outside, but you're protected by solid stone. Confers no benefit. October 2021 Subscriber Item.",
"armorMystery202112Text": "Antarctic Undine Tail",
"armorMystery202112Notes": "Glide through icy seas and never get cold with this glimmering tail. Confers no benefit. December 2021 Subscriber Item.",
"armorMystery202204Text":"Virtual Adventurer Capsule",
"armorMystery202204Notes":"Looks like doing your tasks now requires pushing these mysterious buttons! What could they do? Confers no benefit. April 2022 Subscriber Item.",
"armorMystery202204Text": "Virtual Adventurer Capsule",
"armorMystery202204Notes": "Looks like doing your tasks now requires pushing these mysterious buttons! What could they do? Confers no benefit. April 2022 Subscriber Item.",
"armorMystery202207Text": "Jammin' Jelly Armor",
"armorMystery202207Notes": "This armor will have you looking glamorous and gelatinous. Confers no benefit. July 2022 Subscriber Item.",
"armorMystery301404Text": "Steampunk Suit",
"armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.",
"armorMystery301703Text": "Steampunk Peacock Gown",
@@ -1330,7 +1361,9 @@
"armorArmoireGardenersOverallsText": "Gardener's Overalls",
"armorArmoireGardenersOverallsNotes": "Dont be afraid to work down in the dirt when youre wearing these durable overalls. Increases Constitution by <%= con %>. Enchanted Armoire: Gardener Set (Item 1 of 4).",
"armorArmoireStrawRaincoatText": "Straw Raincoat",
"armorArmoireStrawRaincoatNotes":"This woven straw cape will keep you dry and your armor from rusting while on your quest. Just dont venture too near a candle! Increases Constitution by <%= con %>. Enchanted Armoire: Straw Raincoat Set (Item 1 of 2).",
"armorArmoireStrawRaincoatNotes": "This woven straw cape will keep you dry and your armor from rusting while on your quest. Just dont venture too near a candle! Increases Constitution by <%= con %>. Enchanted Armoire: Straw Raincoat Set (Item 1 of 2).",
"armorArmoireFancyPirateSuitText": "Fancy Pirate Jacket",
"armorArmoireFancyPirateSuitNotes": "Wear this fine jacket well as you organize your ships library or talk it through as a crew. Increases Constitution and Intelligence by <%= attrs %> each. Enchanted Armoire: Fancy Pirate Set (Item 1 of 3).",
"headgear": "helm",
"headgearCapitalized": "Headgear",
@@ -1718,6 +1751,15 @@
"headSpecialSummer2021HealerText": "Parrot Mask",
"headSpecialSummer2021HealerNotes": "Borrow the plumage of a parrot to help you in your daily battles! Increases Intelligence by <%= int %>. Limited Edition 2021 Summer Gear.",
"headSpecialSummer2022RogueText": "Crab Helm",
"headSpecialSummer2022RogueNotes": "No time to be crabby, we're out here shellebrating the summer's hottest crustacean puns. Increases Perception by <%= per %>. Limited Edition 2022 Summer Gear.",
"headSpecialSummer2022WarriorText": "Waterspout Helm",
"headSpecialSummer2022WarriorNotes": "Channel the power of water as you center yourself in this intense vortex. Increases Strength by <%= str %>. Limited Edition 2022 Summer Gear.",
"headSpecialSummer2022MageText": "Manta Ray Helm",
"headSpecialSummer2022MageNotes": "Keep your head protected as you dive into your tasks or into the deepest waters. Increases Perception by <%= per %>. Limited Edition 2022 Summer Gear.",
"headSpecialSummer2022HealerText": "Angelfish Ear Fins",
"headSpecialSummer2022HealerNotes": "Fish don't have ears, you say? Wait til you tell them the news. Increases Intelligence by <%= int %>. Limited Edition 2022 Summer Gear.",
"headSpecialFall2021RogueText": "You Have Been Engulfed",
"headSpecialFall2021RogueNotes": "Welp, you're stuck. Now you are doomed to roam dungeon corridors, collecting debris. DOOOOMED! Increases Perception by <%= per %>. Limited Edition 2021 Autumn Gear.",
"headSpecialFall2021WarriorText": "Headless Cravat",
@@ -1876,8 +1918,12 @@
"headMystery202111Notes": "A fine and fancy hat, with goggles that let you see through time. Pretty cool, right? Confers no benefit. November 2021 Subscriber Item.",
"headMystery202112Text": "Antarctic Undine Crown",
"headMystery202112Notes": "This frozen crown shimmers like the hidden depths of an iceberg. Confers no benefit. December 2021 Subscriber Item.",
"headMystery202202Text":"Turquoise Twintails",
"headMystery202202Notes":"You gotta have blue hair! Confers no benefit. February 2022 Subscriber Item.",
"headMystery202202Text": "Turquoise Twintails",
"headMystery202202Notes": "You gotta have blue hair! Confers no benefit. February 2022 Subscriber Item.",
"headMystery202206Text": "Sea Sprite Circlet",
"headMystery202206Notes": "The blue pearl in this circlet grants you waterbending powers. Use them wisely! Confers no benefit. June 2022 Subscriber Item.",
"headMystery202207Text": "Jammin' Jelly Helm",
"headMystery202207Notes": "Need a hand with your tasks? Will several dozen bioluminescent tentacles do? Confers no benefit. July 2022 Subscriber Item.",
"headMystery301404Text": "Fancy Top Hat",
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
"headMystery301405Text": "Basic Top Hat",
@@ -2051,6 +2097,8 @@
"headArmoireGardenersSunHatNotes": "The bright light of the day star wont shine in your eyes when you wear this wide-brimmed hat. Increases Perception by <%= per %>. Enchanted Armoire: Gardener Set (Item 2 of 4).",
"headArmoireStrawRainHatText": "Straw Rain Hat",
"headArmoireStrawRainHatNotes": "Youll be able to spot every obstacle in your path when you wear this water-resistant, conical hat. Increases Perception by <%= per %>. Enchanted Armoire: Straw Raincoat Set (Item 2 of 2).",
"headArmoireFancyPirateHatText": "Fancy Pirate Hat",
"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).",
"offhand": "off-hand item",
"offHandCapitalized": "Off-Hand Item",
@@ -2283,6 +2331,11 @@
"shieldSpecialSpring2022HealerText": "Peridot Shield",
"shieldSpecialSpring2022HealerNotes": "Formed by molten rock of the upper mantle, this shield can withstand any hit that comes its way. Increases Constitution by <%= con %>. Limited Edition 2022 Spring Gear.",
"shieldSpecialSummer2022WarriorText": "Feisty Shark",
"shieldSpecialSummer2022WarriorNotes": "It snaps! It bites! And it never, ever stops! Increases Constitution by <%= con %>. Limited Edition 2022 Summer Gear.",
"shieldSpecialSummer2022HealerText": "Remedial Ripples",
"shieldSpecialSummer2022HealerNotes": "Send out restorative magic in gentle ripples through the reef. Increases Constitution by <%= con %>. Limited Edition 2022 Summer Gear.",
"shieldMystery201601Text": "Resolution Slayer",
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
"shieldMystery201701Text": "Time-Freezer Shield",
@@ -2432,6 +2485,8 @@
"shieldArmoireSpanishGuitarNotes": "Tink! Tink! Thrummm! Gather your party for a concert or celebration by playing this guitar. Increases Perception by <%= per %> and Intelligence by <%= int %>. Enchanted Armoire: Musical Instrument Set 1 (Item 2 of 3)",
"shieldArmoireSnareDrumText": "Snare Drum",
"shieldArmoireSnareDrumNotes": "Rat-a-tat-tat! Gather your party for a parade or march into battle by playing this drum. Increases Constitution by <%= con %> and Intelligence by <%= int %>. Enchanted Armoire: Musical Instrument Set 1 (Item 3 of 3)",
"shieldArmoireTreasureMapText": "Treasure Map",
"shieldArmoireTreasureMapNotes": "X marks the spot! You never know what youll find when you follow this handy map to fabled treasures: gold, jewels, relics, or perhaps a petrified orange? Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Fancy Pirate Set (Item 3 of 3).",
"back": "Back Accessory",
"backBase0Text": "No Back Accessory",
@@ -2496,6 +2551,8 @@
"backMystery202203Notes": "Outrace all the other creatures of the sky with these shimmering wings. Confers no benefit. March 2022 Subscriber Item.",
"backMystery202205Text": "Dusk Wings",
"backMystery202205Notes": "The mighty flap of these vast wings can be heard echoing among the dunes. Confers no benefit. May 2022 Subscriber Item.",
"backMystery202206Text": "Sea Sprite Wings",
"backMystery202206Notes": "Whimsical wings made of water and waves! Confers no benefit. June 2022 Subscriber Item.",
"backSpecialWonderconRedText": "Mighty Cape",
"backSpecialWonderconRedNotes": "Swishes with strength and beauty. Confers no benefit. Special Edition Convention Item.",
@@ -2776,12 +2833,12 @@
"eyewearMystery202108Notes": "Stare down your enemies (or your biggest tasks!) with these and they don't stand a chance. Confers no benefit. August 2021 Subscriber Item.",
"eyewearMystery202201Text": "Midnight Merrymaker's Mask",
"eyewearMystery202201Notes": "Ring in the new year with an air of mystery in this stylish feathered mask. Confers no benefit. January 2022 Subscriber Item.",
"eyewearMystery202202Text":"Turquoise Eyes with Blush",
"eyewearMystery202202Notes":"Cheerful singing brings color to your cheeks. Confers no benefit. February 2022 Subscriber Item",
"eyewearMystery202204AText":"Virtual Face",
"eyewearMystery202204ANotes":"What's your mood today? Express yourself with these fun screens. Confers no benefit. April 2022 Subscriber Item.",
"eyewearMystery202204BText":"Virtual Face",
"eyewearMystery202204BNotes":"What's your mood today? Express yourself with these fun screens. Confers no benefit. April 2022 Subscriber Item.",
"eyewearMystery202202Text": "Turquoise Eyes with Blush",
"eyewearMystery202202Notes": "Cheerful singing brings color to your cheeks. Confers no benefit. February 2022 Subscriber Item",
"eyewearMystery202204AText": "Virtual Face",
"eyewearMystery202204ANotes": "What's your mood today? Express yourself with these fun screens. Confers no benefit. April 2022 Subscriber Item.",
"eyewearMystery202204BText": "Virtual Face",
"eyewearMystery202204BNotes": "What's your mood today? Express yourself with these fun screens. Confers no benefit. April 2022 Subscriber Item.",
"eyewearMystery301404Text": "Eyewear Goggles",
"eyewearMystery301404Notes": "No eyewear could be fancier than a pair of goggles - except, perhaps, for a monocle. Confers no benefit. April 3015 Subscriber Item.",
"eyewearMystery301405Text": "Monocle",

View File

@@ -129,7 +129,6 @@
"sendGiftHeading": "Send Gift to <%= name %>",
"sendGiftGemsBalance": "From <%= number %> Gems",
"sendGiftCost": "Total: $<%= cost %> USD",
"sendGiftTotal": "Total:",
"sendGiftFromBalance": "From Balance",
"sendGiftPurchase": "Purchase",
"sendGiftMessagePlaceholder": "Personal message (optional)",

View File

@@ -183,28 +183,36 @@
"spring2022RainstormWarriorSet": "Rainstorm (Warrior)",
"spring2022ForsythiaMageSet": "Forsythia (Mage)",
"spring2022PeridotHealerSet": "Peridot (Healer)",
"summer2022CrabRogueSet": "Crab (Rogue)",
"summer2022WaterspoutWarriorSet": "Waterspout (Warrior)",
"summer2022MantaRayMageSet": "Manta Ray (Mage)",
"summer2022AngelfishHealerSet": "Angelfish (Healer)",
"eventAvailability": "Available for purchase until <%= date(locale) %>.",
"eventAvailabilityReturning": "Available for purchase until <%= availableDate(locale) %>. This potion was last available in <%= previousDate(locale) %>.",
"dateEndMarch": "April 30",
"dateEndApril": "April 19",
"dateEndJanuary": "January 31",
"dateEndFebruary": "February 28",
"dateEndMarch": "March 31",
"dateEndApril": "April 30",
"dateEndMay": "May 31",
"dateEndJune": "June 14",
"augustYYYY": "August <%= year %>",
"septemberYYYY": "September <%= year %>",
"decemberYYYY": "December <%= year %>",
"dateEndJune": "June 30",
"dateEndJuly": "July 31",
"dateEndAugust": "August 31",
"dateEndSeptember": "September 30",
"dateEndOctober": "October 31",
"dateEndNovember": "November 30",
"dateEndDecember": "December 31",
"januaryYYYY": "January <%= year %>",
"februaryYYYY": "February <%= year %>",
"marchYYYY": "March <%= year %>",
"aprilYYYY": "April <%= year %>",
"mayYYYY": "May <%= year %>",
"juneYYYY": "June <%= year %>",
"julyYYYY":"July <%= year %>",
"augustYYYY": "August <%= year %>",
"septemberYYYY": "September <%= year %>",
"octoberYYYY": "October <%= year %>",
"novemberYYYY": "November <%= year %>",
"januaryYYYY": "January <%= year %>",
"dateEndJuly": "July 31",
"dateEndAugust": "August 31",
"dateEndSeptember": "September 21",
"dateEndOctober": "October 31",
"dateEndNovember": "November 30",
"dateEndJanuary": "January 31",
"dateEndFebruary": "February 28",
"decemberYYYY": "December <%= year %>",
"winterPromoGiftHeader": "GIFT A SUBSCRIPTION, GET ONE FREE!",
"winterPromoGiftDetails1": "Until January 6th only, when you gift somebody a subscription, you get the same subscription for yourself for free!",
"winterPromoGiftDetails2": "Please note that if you or your gift recipient already have a recurring subscription, the gifted subscription will only start after that subscription is cancelled or has expired. Thanks so much for your support! <3",

View File

@@ -72,7 +72,7 @@
"questGroupVice": "Vice the Shadow Wyrm",
"questVice1Text": "Vice, Part 1: Free Yourself of the Dragon's Influence",
"questVice1Notes": "<p>They say there lies a terrible evil in the caverns of Mt. Habitica. A monster whose presence twists the wills of the strong heroes of the land, turning them towards bad habits and laziness! The beast is a grand dragon of immense power and comprised of the shadows themselves: Vice, the treacherous Shadow Wyrm. Brave Habiteers, stand up and defeat this foul beast once and for all, but only if you believe you can stand against its immense power. </p><h3>Vice Part 1: </h3><p>How can you expect to fight the beast if it already has control over you? Don't fall victim to laziness and vice! Work hard to fight against the dragon's dark influence and dispel his hold on you!</p>",
"questVice1Notes": "They say there lies a terrible evil in the caverns of Mt. Habitica. A monster whose presence twists the wills of the strong heroes of the land, turning them towards bad habits and laziness! The beast is a grand dragon of immense power and comprised of the shadows themselves: Vice, the treacherous Shadow Wyrm. Brave Habiteers, stand up and defeat this foul beast once and for all, but only if you believe you can stand against its immense power.<br><br>How can you expect to fight the beast if it already has control over you? Don't fall victim to laziness and vice! Work hard to fight against the dragon's dark influence and dispel his hold on you!",
"questVice1Boss": "Vice's Shade",
"questVice1Completion": "With Vice's influence over you dispelled, you feel a surge of strength you didn't know you had return to you. Congratulations! But a more frightening foe awaits...",
"questVice1DropVice2Quest": "Vice Part 2 (Scroll)",
@@ -702,7 +702,7 @@
"cuddleBuddiesNotes": "Contains 'The Killer Bunny', 'The Nefarious Ferret', and 'The Guinea Pig Gang'. Available until March 31.",
"aquaticAmigosText": "Aquatic Amigos Quest Bundle",
"aquaticAmigosNotes": "Contains 'The Magical Axolotl', 'The Kraken of Inkomplete', and 'The Call of Octothulu'. Available until August 31.",
"aquaticAmigosNotes": "Contains 'The Magical Axolotl', 'The Kraken of Inkomplete', and 'The Call of Octothulu'. Available until June 30.",
"questSeaSerpentText": "Danger in the Depths: Sea Serpent Strike!",
"questSeaSerpentNotes": "Your streaks have you feeling lucky—its the perfect time for a trip to the seahorse racetrack. You board the submarine at Diligent Docks and settle in for the trip to Dilatory, but youve barely submerged when an impact rocks the sub, sending its occupants tumbling. “Whats going on?” @AriesFaries shouts.<br><br>You glance through a nearby porthole and are shocked by the wall of shimmering scales passing by it. “Sea serpent!” Captain @Witticaster calls through the intercom. “Brace yourselves, its coming round again!” As you grip the arms of your seat, your unfinished tasks flash before your eyes. Maybe if we work together and complete them, you think, we can drive this monster away!",

View File

@@ -28,7 +28,6 @@
"deleteAccount": "Delete Account",
"deleteAccPop": "Cancel and remove your Habitica account.",
"feedback": "If you'd like to give us feedback, please enter it below - we'd love to know what you liked or didn't like about Habitica! Don't speak English well? No problem! Use the language you prefer.",
"qrCode": "QR Code",
"dataExport": "Data Export",
"saveData": "Here are a few options for saving your data.",
"habitHistory": "Habit History",

View File

@@ -3,10 +3,6 @@
"subscriptions": "Subscriptions",
"viewSubscriptions": "View Subscriptions",
"sendGems": "Send Gems",
"howManyGemsPurchase": "How many Gems would you like to purchase?",
"howManyGemsSend":"How many Gems would you like to send?",
"needToPurchaseGems": "Need to purchase Gems as a gift?",
"wantToSendOwnGems": "Want to send your own Gems?",
"buyGemsGold": "Buy Gems with Gold",
"mustSubscribeToPurchaseGems": "Must subscribe to purchase gems with GP",
"reachedGoldToGemCapQuantity": "Your requested amount <%= quantity %> exceeds the amount you can buy for this month (<%= convCap %>). The full amount becomes available within the first three days of each month. Thanks for subscribing!",
@@ -138,6 +134,8 @@
"mysterySet202203": "Dauntless Dragonfly Set",
"mysterySet202204": "Virtual Adventurer Set",
"mysterySet202205": "Dusk-Winged Dragon Set",
"mysterySet202206": "Sea Sprite Set",
"mysterySet202207": "Jammin' Jelly Set",
"mysterySet301404": "Steampunk Standard Set",
"mysterySet301405": "Steampunk Accessories Set",
"mysterySet301703": "Peacock Steampunk Set",
@@ -200,6 +198,5 @@
"needToUpdateCard": "Need to update your card?",
"readyToResubscribe": "Are you ready to resubscribe?",
"cancelYourSubscription": "Cancel your subscription?",
"cancelSubAlternatives": "If you're having technical problems or Habitica doesn't seem to be working out for you, please consider <a href='mailto:admin@habitica.com'>contacting us</a>. We want to help you get the most from Habitica.",
"sendAGift": "Send Gift"
"cancelSubAlternatives": "If you're having technical problems or Habitica doesn't seem to be working out for you, please consider <a href='mailto:admin@habitica.com'>contacting us</a>. We want to help you get the most from Habitica."
}

View File

@@ -104,9 +104,27 @@
"achievementSeeingRedText": "Has collected all Red Pets.",
"achievementSeeingRed": "Seeing Red",
"achievementLegendaryBestiaryModalText": "You collected all the mythical pets!",
"achievementLegendaryBestiaryText": "Has hatched all the mythical pets: Dragon, Flying Pig, Gryphon, Sea Serpent, and Unicorn!",
"achievementLegendaryBestiaryText": "Has hatched all standard colours of mythical pets: Dragon, Flying Pig, Gryphon, Sea Serpent, and Unicorn!",
"achievementLegendaryBestiary": "Legendary Bestiary",
"achievementSeasonalSpecialistModalText": "You completed all the seasonal quests!",
"achievementSeasonalSpecialistText": "Has completed all the Spring and Winter seasonal quests: Egg Hunt, Trapper Santa, and Find the Cub!",
"achievementSeasonalSpecialist": "Seasonal Specialist"
"achievementSeasonalSpecialist": "Seasonal Specialist",
"achievementVioletsAreBlueText": "Has collected all Cotton Candy Blue Pets.",
"achievementVioletsAreBlueModalText": "You collected all the Cotton Candy Blue Pets!",
"achievementWildBlueYonderModalText": "You tamed all the Cotton Candy Blue Mounts!",
"achievementDomesticated": "E-I-E-I-O",
"achievementWildBlueYonderText": "Has tamed all Cotton Candy Blue Mounts.",
"achievementVioletsAreBlue": "Violets are Blue",
"achievementWildBlueYonder": "Wild Blue Yonder",
"achievementDomesticatedModalText": "You collected all the domesticated pets!",
"achievementDomesticatedText": "Has hatched all standard colours of domesticated pets: Ferret, Guinea Pig, Rooster, Flying Pig, Rat, Bunny, Horse and Cow!",
"achievementZodiacZookeeper": "Zodiac Zookeeper",
"achievementZodiacZookeeperModalText": "You collected all the zodiac pets!",
"achievementZodiacZookeeperText": "Has hatched all standard colours of zodiac pets: Rat, Cow, Bunny, Snake, Horse, Sheep, Monkey, Rooster, Wolf, Tiger, Flying Pig, and Dragon!",
"achievementShadyCustomer": "Shady Customer",
"achievementShadyCustomerText": "Has collected all Shade Pets.",
"achievementShadyCustomerModalText": "You colleted all the Shade Pets!",
"achievementShadeOfItAll": "The Shade of It All",
"achievementShadeOfItAllText": "Has tamed all Shade Mounts.",
"achievementShadeOfItAllModalText": "You tamed all the Shade Mounts!"
}

View File

@@ -127,7 +127,13 @@
"achievementZodiacZookeeper": "Cuidador del Zodiaco",
"achievementZodiacZookeeperText": "¡Ha eclosionado todas las mascotas del zodíaco de color básico: Rata, Vaca, Conejo, Serpiente, Caballo, Oveja, Mono, Gallo, Lobo, Tigre, Cerdo Volador y Dragón!",
"achievementZodiacZookeeperModalText": "¡Has conseguido todas las mascotas del zodíaco!",
"achievementBirdsOfAFeatherText": "Ha eclosionado todas las mascotas voladoras de color básico: Cerdo Volador, Búho, Loro, Pterodáctilo, Grifo, Halcón, Pavo Real y Gallo.",
"achievementBirdsOfAFeatherText": "¡Ha eclosionado todas las mascotas voladoras de color básico: Cerdo Volador, Búho, Loro, Pterodáctilo, Grifo, Halcón, Pavo Real y Gallo!",
"achievementBirdsOfAFeatherModalText": "¡Has conseguido todas las mascotas voladoras!",
"achievementBirdsOfAFeather": "Aves de Pluma"
"achievementBirdsOfAFeather": "Aves de Pluma",
"achievementReptacularRumbleModalText": "¡Has coleccionado todas las mascotas reptiles!",
"achievementReptacularRumbleText": "!Has incubado todos los colores estándar de las mascotas reptiles: caimán, pterodáctilo, serpiente, triceratops, tortuga, tiranosaurio rex y velociraptor!",
"achievementGroupsBeta2022": "Probador Beta interactivo",
"achievementGroupsBeta2022Text": "Tu y tu grupo brindaron comentarios increibles para ayudar a Habitica a realizar la prueba.",
"achievementGroupsBeta2022ModalText": "¡Usted y sus grupos ayudaron a Habitica probando y proporcionando comentarios!",
"achievementReptacularRumble": "Rumble reptacular"
}

View File

@@ -53,5 +53,6 @@
"surveysSingle": "Ayudó a Habitica a crecer, ya sea completando una encuesta o ayudando con un testeo masivo. ¡Gracias!",
"surveysMultiple": "Ayudó a Habitica a crecer en <%= count %> ocasiones, rellenando una encuesta o dedicando un gran esfuerzo a hacer pruebas . ¡Gracias!",
"blurbHallPatrons": "Este es el Salón de Patrocinadores, donde honramos a los nobles aventureros que colaboraron en el primer Kickstarter de Habitica. ¡Les damos las gracias por haber hecho posible Habitica!",
"blurbHallContributors": "Este es el Salón de los Colaboradores, donde se honra a quienes han colaborado en el código libre de Habitica. Con su labor de programación, arte, música, escritura o, simplemente, su ayuda, han obtenido <a href='https://habitica.fandom.com/es/wiki/Recompensas_de_Contribuidor' target='_blank'>gemas, objetos exclusivos</a> y <a href='https://habitica.fandom.com/es/wiki/T%C3%ADtulos_de_Contribuidor' target='_blank'>prestigiosos títulos</a>. ¡Tú también puedes colaborar con Habitica! <a href='https://habitica.fandom.com/es/wiki/Contribuir_a_Habitica' target='_blank'>Más información, aquí.</a>"
"blurbHallContributors": "Este es el Salón de los Colaboradores, donde se honra a quienes han colaborado en el código libre de Habitica. Con su labor de programación, arte, música, escritura o, simplemente, su ayuda, han obtenido <a href='https://habitica.fandom.com/es/wiki/Recompensas_de_Contribuidor' target='_blank'>gemas, objetos exclusivos</a> y <a href='https://habitica.fandom.com/es/wiki/T%C3%ADtulos_de_Contribuidor' target='_blank'>prestigiosos títulos</a>. ¡Tú también puedes colaborar con Habitica! <a href='https://habitica.fandom.com/es/wiki/Contribuir_a_Habitica' target='_blank'>Más información, aquí.</a>",
"noPrivAccess": "No tienes los privilegios requeridos."
}

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,7 @@
"questEvilSanta2CollectBranches": "Ramitas Rotas",
"questEvilSanta2DropBearCubPolarPet": "Oso polar (Mascota)",
"questGryphonText": "El Grifo Ardiente",
"questGryphonNotes": "El gran maestro de las bestias, <strong>baconsaurio</strong>, ha acudido a tu grupo en busca de ayuda. \n— ¡Por favor, aventureros, debéis ayudarme!¡Mi preciada grifo se ha liberado y está aterrorizando Villahábito! Si podéis detenerla, ¡podría recompensaros con algunos de sus huevos!",
"questGryphonNotes": "El gran maestro de las bestias, <strong>baconsaurio</strong>, ha acudido a tu grupo en busca de ayuda.\n— ¡Por favor, aventureros, debéis ayudarme!¡Mi preciada grifo se ha liberado y está aterrorizando Villahábito! Si podéis detenerla, ¡podría recompensaros con algunos de sus huevos!",
"questGryphonCompletion": "Derrotada, la poderosa bestia escabulle avergonzada con su amo.\n—¡Mis respeto!¡Buen trabajo, aventureros! — exclamó <strong>Baconsaurio</strong>—. Por favor, aceptad estos huevos del Grifo. ¡Estoy seguro de cuidaréis bien de estos pequeños!",
"questGryphonBoss": "Grifo Ardiente",
"questGryphonDropGryphonEgg": "Grifo (huevo)",
@@ -24,7 +24,7 @@
"questHedgehogUnlockText": "Desbloquea la compra de huevos de erizo en el Mercado",
"questGhostStagText": "El Espíritu de Primavera",
"questGhostStagNotes": "Ahh, la primavera. La época del año el la que el color, una vez más, empieza a llenar el paisaje. Atrás quedaron las colinas frías y nevadas del invierno. Donde alguna vez hubo escarcha, la vibrante vida vegetal ocupa su lugar. ¡Las sabrosas hojas verdes repletan los árboles, la hierba regresa a su vivo tono anterior, un arco iris de flores se eleva a lo largo de las llanuras, y una niebla mística blanca cubre la tierra!... Espera. ¿Niebla mística?\n\n—Oh, no —dijo aprensivamente el <strong>Inspector Caracal</strong>—, parece que algún tipo de espíritu es la causa de esta niebla. Oh, y está viniendo directamente hacia ti.",
"questGhostStagCompletion": "El espíritu, aparentemente ileso, baja su nariz hasta el suelo. Una calmante voz os rodea. \n—Pido perdón por mi conducta. Me acabo de despertar de mi letargo, y parece que mi sentido común aún no ha vuelto del todo. Por favor, tomad esto como prueba de mi arrepentimiento—. Un grupo de huevos se materializan en la hierba enfrente del espíritu. Sin mediar palabra, el espíritu corre hacia el bosque mientras las flores fallecen alrededor en su caminar.",
"questGhostStagCompletion": "El espíritu, aparentemente ileso, baja su nariz hasta el suelo. Una calmante voz os rodea.\n—Pido perdón por mi conducta. Me acabo de despertar de mi letargo, y parece que mi sentido común aún no ha vuelto del todo. Por favor, tomad esto como prueba de mi arrepentimiento—. Un grupo de huevos se materializan en la hierba enfrente del espíritu. Sin mediar palabra, el espíritu corre hacia el bosque mientras las flores fallecen alrededor en su caminar.",
"questGhostStagBoss": "Ciervo Fantasma",
"questGhostStagDropDeerEgg": "Ciervo (Huevo)",
"questGhostStagUnlockText": "Desbloquea la compra de huevos de ciervo en el Mercado",
@@ -744,5 +744,11 @@
"questOnyxCollectLeoRunes": "Runas de Leo",
"questOnyxCollectOnyxStones": "Piedras de Ónice",
"questOnyxDropOnyxPotion": "Poción de Eclosión de Ónice",
"questOnyxUnlockText": "Desbloquea la compra de Pociones de Eclosión de Ónice en el Mercado"
"questOnyxUnlockText": "Desbloquea la compra de Pociones de Eclosión de Ónice en el Mercado",
"questVirtualPetCompletion": "Al presionar cuidadosamente un botón, parece haber satisfecho las misteriosas necesidades de la mascota virtual, y finalmente se ha calmado y parece contento. llena de pociones emitiendo pitidos.<br><br>“El momento, April Fool”, dice @Beffymaroo con una sonrisa irónica. “Sospecho que este tipo grande que emite un pitido es un conocido tuyo.”<br><br>“Uh, sí,” dice el Loco, tímidamente. “¡Lo siento mucho y gracias a ambos por cuidar de Wotchimon! Toma estas pociones a modo de agradecimiento, pueden recuperar tus mascotas virtuales cuando quieras” asi que vale la pena intentarlo!",
"questVirtualPetNotes": "Es una tranquila y agradable mañana de primavera en Habitica, una semana después de un memorable Día de los Inocentes. Tú y @Beffymaroo están en los establos atendiendo a sus mascotas (aun que todavía están un poco confundidas por el tiempo que pasaron virtualmente!.<br><br>A lo lejos escuchas un estruendo y un pitido, suave al principio pero aumentando en volumen como si estuviera cada vez más cerca. Aparece una forma de huevo en el horizonte y, a medida que se acerca, con un pitido cada vez más fuerte, ¡ves que es una mascota virtual gigantesca!<br><br>“Oh, no”, exclama @Beffymaroo, “Creo que April Fool dejó asuntos pendientes con este tipo grande aquí, ¡parece querer atención!”<br><br>La mascota virtual emite un pitido enfadado, lanzando una rabieta virtual y gritando cada vez más cerca.",
"questVirtualPetBoss": "Wotchimon",
"questVirtualPetRageTitle": "El pitido",
"questVirtualPetRageEffect": "\"¡Wotchimon usa un pitido molesto!\" ¡Wotchimon emite un pitido molesto y su barra de felicidad desaparece repentinamente! Daño pendiente reducido.",
"questVirtualPetRageDescription": "Esta barra se llena cuando no completas tus Diarios. ¡Cuando esté lleno, Wotchimon eliminará algunos de los daños causados de tu grupo!"
}

View File

@@ -67,7 +67,7 @@
"APITokenWarning": "Si necesitas un nuevo API Token (e.g. si accidentalmente has compartido el tuyo), envía un email a <%= hrefTechAssistanceEmail %> con tu Número de Usuario y API Token actual. Una vez sea restablecido tu nuevo API Token, tendrás que volver a autorizar cualquier dispositivo cerrando la sesión pasada en la web y la aplicación móvil e ingresando el nuevo Token en cualquier dispositivo en el que uses Habitica.",
"thirdPartyApps": "Aplicaciones de terceros",
"dataToolDesc": "Una página que te muestra determinada información de tu cuenta de Habitica, como estadísticas sobre tus tareas, tu equipo o tus habilidades.",
"beeminder": "Beeminder",
"beeminder": "Recordatorio",
"beeminderDesc": "Deja que Beeminder haga un seguimiento de tus tareas pendientes. Tú puedes comprometerte a mantener un número de quehaceres completados por día o por semana, o puedes comprometerte a reducir gradualmente tu número de quehaceres sin completar. (Por \"comprometerte\" Beeminder quiere decir bajo amenaza de pagar dinero real, aunque puede que tan solo te gusten los gráficos sofisticados de Beeminder.)",
"chromeChatExtension": "Extensión de chat para Chrome",
"chromeChatExtensionDesc": "La Extensión de chat para Chrome de Habitica añade una caja de diálogo a todas las páginas de habitica.com. Permite a los usuarios chatear en la Taberna, su equipo y cualquier gremio al que pertenezcan.",
@@ -212,5 +212,8 @@
"transaction_subscription_perks": "Beneficio de la suscripción",
"addPasswordAuth": "Añadir contraseña",
"gemCap": "Límite de Gemas",
"nextHourglass": "Siguiente Reloj de Arena"
"nextHourglass": "Siguiente Reloj de Arena",
"dayStartAdjustment": "Ajuste de inicio de día",
"adjustment": "Ajuste",
"nextHourglassDescription": "Los suscriptores reciben gafas \"Mystic Hour\" dentro de\nlos tres primeros días del mes."
}

View File

@@ -70,7 +70,7 @@
"foundNewItemsCTA": "¡Ve a tu inventario e intenta combinar tu nueva poción de eclosión y un huevo!",
"foundNewItemsExplanation": "Completar tareas te da la oportunidad de encontrar artículos como Huevos, Pociones de Eclosión y Comida para Mascotas.",
"foundNewItems": "¡Encontraste nuevos artículos!",
"onboardingCompleteDescSmall": "¡Si quieres aún más, mira los Logros y comienza a coleccionar!",
"onboardingCompleteDescSmall": "¡Si quieres aún más, revisa los Logros y comienza a coleccionar!",
"onboardingComplete": "¡Completaste tus tareas de integración!",
"achievementRosyOutlookModalText": "¡Has domesticado todas las monturas de algodón de azúcar rosa!",
"achievementRosyOutlookText": "Ha domesticado todas las monturas de algodón de azúcar rosa.",
@@ -119,7 +119,7 @@
"achievementDomesticatedModalText": "¡Has eclosionado todas las mascotas domésticas!",
"achievementDomesticated": "I-A-I-A-O",
"achievementBirdsOfAFeather": "Aves de Pluma",
"achievementBirdsOfAFeatherText": "Has eclosionado todas las mascotas voladoras: Cerdo Volador, Búho, Loro, Pterodáctilo, Grifo, Halcón, Pavo Real y Gallo.",
"achievementBirdsOfAFeatherText": "¡Has eclosionado todas las mascotas voladoras: Cerdo Volador, Búho, Loro, Pterodáctilo, Grifo, Halcón, Pavo Real y Gallo!",
"achievementZodiacZookeeper": "Cuidador del Zodíaco",
"achievementZodiacZookeeperModalText": "¡Has conseguido todas las mascotas del zodíaco!",
"achievementBirdsOfAFeatherModalText": "¡Has conseguido todas las mascotas voladoras!",
@@ -129,5 +129,8 @@
"achievementShadyCustomerText": "Ha conseguido todas las mascotas sombrías.",
"achievementShadyCustomerModalText": "¡Has conseguido todas las mascotas sombrías!",
"achievementShadeOfItAllModalText": "¡Has domado todas las monturas sombrías!",
"achievementZodiacZookeeperText": "¡Has eclosionado todas las mascotas del zodíaco de color básico: Rata, Vaca, Conejo, Serpiente, Caballo, Oveja, Mono, Gallo, Lobo, Tigre, Cerdo Volador y Dragón!"
"achievementZodiacZookeeperText": "¡Has eclosionado todas las mascotas del zodíaco de color básico: Rata, Vaca, Conejo, Serpiente, Caballo, Oveja, Mono, Gallo, Lobo, Tigre, Cerdo Volador y Dragón!",
"achievementReptacularRumbleText": "¡Has eclosionado todos los colores estándar de las mascotas reptiles: Caimán, Pterodáctilo, Serpiente, Triceratops, Tortuga, Tiranosaurio, y Velociraptor!",
"achievementReptacularRumble": "Retumbado Reptacular",
"achievementReptacularRumbleModalText": "¡Coleccionaste todas las mascotas reptiles!"
}

View File

@@ -53,5 +53,6 @@
"surveysSingle": "Ayudó a Habitica a crecer, ya sea completando una encuesta o ayudando con pruebas a gran escala. ¡Gracias!",
"surveysMultiple": "Ayudó a Habitica a crecer en <%= count %> ocasiones, ya sea completando una encuesta o ayudando con pruebas a gran escala. ¡Gracias!",
"blurbHallPatrons": "Este es el Salón de Patrocinadores, donde honramos a los nobles aventureros que respaldaron el Kickstarter original de Habitica. ¡Les agradecemos por ayudarnos a dar vida a Habitica!",
"blurbHallContributors": "Éste es el Salón de Contribuidores, donde los contribuidores del código abierto de Habitica son honrados. Ya sea a través de código, arte, música, escritura o incluso su servicio a la comunidad, han ganado <a href='https://habitica.fandom.com/wiki/Contributor_Rewards' target='_blank'> gemas, equipamento exclusivo</a> y <a href='https://habitica.fandom.com/wiki/Contributor_Titles' target='_blank'> títulos prestigiosos</a>. ¡Tú también puedes contribuir a Habitica! <a href='https://habitica.fandom.com/wiki/Contributing_to_Habitica' target='_blank'> Encuentra más información aquí. </a>"
"blurbHallContributors": "Éste es el Salón de Contribuidores, donde los contribuidores del código abierto de Habitica son honrados. Ya sea a través de código, arte, música, escritura o incluso su servicio a la comunidad, han ganado <a href='https://habitica.fandom.com/wiki/Contributor_Rewards' target='_blank'> gemas, equipamento exclusivo</a> y <a href='https://habitica.fandom.com/wiki/Contributor_Titles' target='_blank'> títulos prestigiosos</a>. ¡Tú también puedes contribuir a Habitica! <a href='https://habitica.fandom.com/wiki/Contributing_to_Habitica' target='_blank'> Encuentra más información aquí. </a>",
"noPrivAccess": "No tiene los requisitos requeridos."
}

View File

@@ -1,9 +1,9 @@
{
"potionText": "Mahiwagang Langís na Pámpalusóg",
"potionNotes": "Mag-recover ng 15 Health (Instant Use)",
"armoireText": "Enchanted Armoire",
"armoireText": "Mahiwagang Kabán",
"armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:",
"armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.",
"armoireLastItem": "Natagpuán mo ang hulíng piraso ng mga bihirang Kagamitán sa Mahiwagang Kabán.",
"armoireNotesEmpty": "Naglalabas ng bagong Kagamitan ang Armoire sa bawat unang linggo kada buwan. Bago iyon, pumindot lang nang pumindot para sa Kasanayan at Pagkaing Pang-Alaga!",
"dropEggWolfText": "Wolf",
"dropEggWolfMountText": "Wolf",

File diff suppressed because it is too large Load Diff

View File

@@ -126,8 +126,14 @@
"achievementShadeOfItAllText": "A dompté tous les familiers d'ombre.",
"achievementZodiacZookeeper": "Le Zoo-diaque",
"achievementZodiacZookeeperModalText": "Vous avez collecté tous les familiers du zodiaque !",
"achievementZodiacZookeeperText": "A collecté tous les familiers du zodiaque de couleur basique : Rat, Vache, Lapin, Serpent, Cheval, Mouton, Singe, Coq, Loup, Tigre, Cochon volant et Dragon !",
"achievementBirdsOfAFeatherText": "A collecté tous les familiers volants de couleur basique : Cochon volant, Hibou, Perroquet, Pterodactyle, Griffon, Faucon, Paon et Coq.",
"achievementBirdsOfAFeather": "Oiseaux à une Plume",
"achievementBirdsOfAFeatherModalText": "Vous avez collecté tous les familiers volants !"
"achievementZodiacZookeeperText": "A fait éclore tous les familiers du zodiaque de couleur basique : Rat, Vache, Lapin, Serpent, Cheval, Mouton, Singe, Coq, Loup, Tigre, Cochon volant et Dragon !",
"achievementBirdsOfAFeatherText": "A fait éclore tous les familiers volants de couleur basique : Cochon volant, Hibou, Perroquet, Pterodactyle, Griffon, Faucon, Paon et Coq !",
"achievementBirdsOfAFeather": "Oiseaux à plume",
"achievementBirdsOfAFeatherModalText": "Vous avez collecté tous les familiers volants !",
"achievementReptacularRumble": "Étreinte reptilienne",
"achievementReptacularRumbleText": "A fait éclore toutes les couleurs standard de familiers reptiles : Alligator, Ptérodactyle, Serpent, Tricératops, Tortue, Tyrannosaure et Vélociraptor !",
"achievementReptacularRumbleModalText": "Vous avez collecté tous les familiers reptiles !",
"achievementGroupsBeta2022ModalText": "Vous et votre groupe avez aidé Habitica en testant et fournissant un retour de grande valeur !",
"achievementGroupsBeta2022": "Beta test interactif",
"achievementGroupsBeta2022Text": "Vous et votre groupe avez fourni un retour de grande valeur pour aider aux tests d'Habitica."
}

View File

@@ -693,5 +693,12 @@
"backgroundFlowerShopText": "Boutique de fleurs",
"backgroundSpringtimeLakeNotes": "Profitez de la vue sur les rives d'un lac printanier.",
"backgroundFlowerShopNotes": "Profitez de la douce senteur d'une boutique de fleurs.",
"backgroundSpringtimeLakeText": "Lac printanier"
"backgroundSpringtimeLakeText": "Lac printanier",
"backgroundOnACastleWallNotes": "Observez depuis le mur d'un château.",
"backgroundCastleGateText": "Entrée du château",
"backgroundCastleGateNotes": "Montez la garde à l'entrée du château.",
"backgroundEnchantedMusicRoomText": "Salle de musique enchantée",
"backgrounds052022": "Ensemble 96 : sorti en mai 2022",
"backgroundOnACastleWallText": "Sur le mur d'un château",
"backgroundEnchantedMusicRoomNotes": "Jouez dans une salle de musique enchantée."
}

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