Compare commits

..

28 Commits

Author SHA1 Message Date
Kalista Payne 6b56a4689e fix(lint): various corrections 2026-05-19 16:03:01 -05:00
Kalista Payne 966bfde06f WIP(links): replace hrefs in string tokens 2026-05-19 15:39:27 -05:00
Kalista Payne 9d23693a45 fix(links): add noopener noreferrer 2026-05-19 15:39:27 -05:00
Kalista Payne b57fb94579 Fiz/daily date discrepancy (#15656)
* Refactor(tasks): Centralize daily task start date normalization

* fix datepicker server day shifts by zeroing time

---------

Co-authored-by: Hafiz <hafizbhamidi@gmail.com>
2026-05-19 15:38:53 -05:00
Phillip Thelen 42805a2792 Improve googles ability to index the site (#15619)
* Add sitemap

* Add robots.txt

* create special entrypoint file for FAQ
2026-05-19 15:37:05 -05:00
Kalista Payne d7e7668255 5.48.0 2026-05-19 15:11:31 -05:00
Weblate a4fda59a69 Translated using Weblate (French)
Currently translated at 99.6% (3595 of 3607 strings)

Translated using Weblate (French)

Currently translated at 99.6% (3594 of 3607 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.0% (854 of 871 strings)

Translated using Weblate (French)

Currently translated at 100.0% (155 of 155 strings)

Translated using Weblate (French)

Currently translated at 100.0% (296 of 296 strings)

Translated using Weblate (French)

Currently translated at 99.6% (3593 of 3607 strings)

Translated using Weblate (French)

Currently translated at 100.0% (952 of 952 strings)

Translated using Weblate (Ukrainian)

Currently translated at 52.4% (1892 of 3607 strings)

Translated using Weblate (Ukrainian)

Currently translated at 91.6% (798 of 871 strings)

Translated using Weblate (Ukrainian)

Currently translated at 91.6% (798 of 871 strings)

Translated using Weblate (French)

Currently translated at 99.1% (944 of 952 strings)

Translated using Weblate (Ukrainian)

Currently translated at 89.4% (779 of 871 strings)

Translated using Weblate (Ukrainian)

Currently translated at 88.4% (770 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (155 of 155 strings)

Translated using Weblate (Ukrainian)

Currently translated at 88.2% (769 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 99.3% (154 of 155 strings)

Translated using Weblate (French)

Currently translated at 100.0% (282 of 282 strings)

Translated using Weblate (Ukrainian)

Currently translated at 86.9% (757 of 871 strings)

Translated using Weblate (Ukrainian)

Currently translated at 85.8% (748 of 871 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (155 of 155 strings)

Translated using Weblate (German)

Currently translated at 90.0% (18 of 20 strings)

Translated using Weblate (German)

Currently translated at 95.2% (278 of 292 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Bulgarian)

Currently translated at 9.0% (23 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (952 of 952 strings)

Translated using Weblate (Bulgarian)

Currently translated at 58.1% (160 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (952 of 952 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (155 of 155 strings)

Translated using Weblate (Spanish)

Currently translated at 99.3% (154 of 155 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3607 of 3607 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (282 of 282 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (296 of 296 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (Spanish)

Currently translated at 99.7% (3597 of 3607 strings)

Translated using Weblate (Czech)

Currently translated at 86.1% (174 of 202 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (952 of 952 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (282 of 282 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (296 of 296 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (296 of 296 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (952 of 952 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (282 of 282 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (282 of 282 strings)

Translated using Weblate (Italian)

Currently translated at 85.8% (254 of 296 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (296 of 296 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (3607 of 3607 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Ukrainian)

Currently translated at 84.7% (738 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (952 of 952 strings)

Translated using Weblate (Italian)

Currently translated at 99.1% (944 of 952 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (952 of 952 strings)

Translated using Weblate (Dutch)

Currently translated at 79.2% (221 of 279 strings)

Translated using Weblate (German)

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (Dutch)

Currently translated at 80.0% (16 of 20 strings)

Translated using Weblate (German)

Currently translated at 100.0% (20 of 20 strings)

Translated using Weblate (Dutch)

Currently translated at 98.4% (129 of 131 strings)

Translated using Weblate (Dutch)

Currently translated at 86.9% (254 of 292 strings)

Translated using Weblate (German)

Currently translated at 95.2% (278 of 292 strings)

Translated using Weblate (Dutch)

Currently translated at 86.8% (384 of 442 strings)

Translated using Weblate (Dutch)

Currently translated at 72.1% (2604 of 3607 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (3607 of 3607 strings)

Translated using Weblate (German)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (German)

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (Dutch)

Currently translated at 79.5% (693 of 871 strings)

Translated using Weblate (German)

Currently translated at 97.8% (852 of 871 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (German)

Currently translated at 100.0% (413 of 413 strings)

Translated using Weblate (German)

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3607 of 3607 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.6% (3560 of 3607 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.4% (3552 of 3607 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3607 of 3607 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.5% (3553 of 3607 strings)

Translated using Weblate (Polish)

Currently translated at 34.3% (87 of 253 strings)

Translated using Weblate (Polish)

Currently translated at 33.5% (85 of 253 strings)

Translated using Weblate (Polish)

Currently translated at 33.5% (85 of 253 strings)

Translated using Weblate (French)

Currently translated at 99.5% (3590 of 3607 strings)

Translated using Weblate (French)

Currently translated at 99.0% (3573 of 3607 strings)

Translated using Weblate (French)

Currently translated at 99.0% (3571 of 3607 strings)

Translated using Weblate (Ukrainian)

Currently translated at 94.8% (240 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 78.3% (2783 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (167 of 167 strings)

Co-authored-by: ANGELO RICCIO <angeloriccio00.ar@gmail.com>
Co-authored-by: Amarin <amarin.nickel@posteo.de>
Co-authored-by: Antonio Lila Rusciano <antoniorusciano2005@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Dayra G.R <ale.ro.bless1501@gmail.com>
Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
Co-authored-by: Katarzyna Brudna <hisoillu6.06@gmail.com>
Co-authored-by: Lenka Pavlíčková <lenkapavlickova2@email.cz>
Co-authored-by: Magdalena Deshkova <magdalenadeshkova@gmail.com>
Co-authored-by: Mausam <mausam_b@protonmail.com>
Co-authored-by: Maya B <maya.bl@icloud.com>
Co-authored-by: Nazar Paruna <nazarparuna@gmail.com>
Co-authored-by: Riccardo DD <emvadraen@hotmail.com>
Co-authored-by: Serhii <serzh.photograf@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Stelio Passaris <habitica@stelio.net>
Co-authored-by: Sugo Gangotti <giacomo@ergonomia.it>
Co-authored-by: Summer_GUI <heyang94@163.com>
Co-authored-by: Val <3qes0hnzh@mozmail.com>
Co-authored-by: Vitaliy <italik.gr@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: kran fall <wisal50835@codoteam.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es/
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/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/character/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/it/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/content/de/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/bg/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/it/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
Translate-URL: https://translate.habitica.com/projects/habitica/front/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es_419/
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/uk/
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/groups/it/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/de/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/es/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/it/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/it/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/es/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/it/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/it/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
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/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/de/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/bg/
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/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/es/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/it/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/es/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/it/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/uk/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
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
2026-05-19 21:16:03 +02:00
Kalista Payne 3b9ffae625 fix(faq): pointer cursor 2026-05-12 16:48:49 -05:00
Kalista Payne dd413518f5 Fiz/summaries (#15653)
* dailies monthly weeks of month summary

update monthly day-of-week scheduling summary, add scheduling summary to task form, and add 5th week warning

* formatting

* scheduling warning and summary UI updates

* fix(svg): use extant icon

---------

Co-authored-by: Hafiz <hafizbhamidi@gmail.com>
2026-05-12 16:28:40 -05:00
Kalista Payne c581b88213 Summer 2026 Content (#15651)
* feat(content): June-August 2026

* fix(content): it's secretly a bright kite
2026-05-12 13:09:47 -05:00
Kalista Payne 0078d8f2b2 5.47.9 2026-05-12 11:38:53 -05:00
Weblate 54ea0aab18 Merge branch 'origin/develop' into Weblate. 2026-05-12 18:36:09 +02:00
Kalista Payne 24b2a5beb8 chore(git): update submodule 2026-05-12 11:34:50 -05:00
Kalista Payne fe9332dff4 fix(typo): missing word in Verdant Page item 2026-05-12 11:26:32 -05:00
Kalista Payne c6582e4c3c Squashed commit of the following:
commit 39e29846dd
Author: Kalista Payne <kalista@habitica.com>
Date:   Wed May 6 22:45:25 2026 -0500

    fix(lint): no-undef

commit 75bbb5a88a
Author: Kalista Payne <kalista@habitica.com>
Date:   Wed May 6 22:24:10 2026 -0500

    fix(paypal): cancel sub when payment skipped
2026-05-12 11:13:08 -05:00
Kalista Payne b4b7980eee Rate limit redux (#15650)
* Improve rate limit handling

* Improve rate limiter options

* Fix lint

* fixed url

---------

Co-authored-by: Phillip Thelen <phillip@thelen.space>
2026-05-12 11:11:00 -05:00
Weblate 6069fbd61f Translated using Weblate (French)
Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (French)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Ukrainian)

Currently translated at 74.3% (188 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (Serbian)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (Serbian)

Currently translated at 52.0% (143 of 275 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (Dutch)

Currently translated at 77.0% (215 of 279 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Dutch)

Currently translated at 99.2% (130 of 131 strings)

Translated using Weblate (Dutch)

Currently translated at 83.2% (243 of 292 strings)

Translated using Weblate (Dutch)

Currently translated at 86.8% (384 of 442 strings)

Translated using Weblate (Dutch)

Currently translated at 73.0% (2595 of 3551 strings)

Translated using Weblate (Dutch)

Currently translated at 98.9% (189 of 191 strings)

Translated using Weblate (Dutch)

Currently translated at 80.2% (699 of 871 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (413 of 413 strings)

Translated using Weblate (Serbian)

Currently translated at 32.3% (54 of 167 strings)

Translated using Weblate (Serbian)

Currently translated at 26.9% (45 of 167 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (German)

Currently translated at 99.6% (940 of 943 strings)

Translated using Weblate (German)

Currently translated at 99.6% (940 of 943 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (German)

Currently translated at 85.0% (17 of 20 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (Serbian)

Currently translated at 26.9% (45 of 167 strings)

Translated using Weblate (Bulgarian)

Currently translated at 54.6% (515 of 943 strings)

Translated using Weblate (Bulgarian)

Currently translated at 53.7% (507 of 943 strings)

Translated using Weblate (Bulgarian)

Currently translated at 53.4% (504 of 943 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Portuguese)

Currently translated at 98.0% (198 of 202 strings)

Translated using Weblate (Bulgarian)

Currently translated at 53.3% (503 of 943 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 96.4% (244 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 96.4% (244 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 91.3% (231 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 91.3% (231 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 86.1% (218 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 86.1% (218 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 85.7% (217 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 85.7% (217 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 84.9% (215 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 84.9% (215 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 84.5% (214 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 84.5% (214 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 84.1% (213 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 84.1% (213 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 83.7% (212 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 83.7% (212 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 83.3% (211 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 83.3% (211 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 82.6% (209 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 81.4% (206 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 81.4% (206 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 81.0% (205 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 81.0% (205 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 80.6% (204 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 80.6% (204 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 80.2% (203 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 80.2% (203 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 79.8% (202 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 79.8% (202 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 79.0% (200 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 79.0% (200 of 253 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (413 of 413 strings)

Co-authored-by: Antonio Lila Rusciano <antoniorusciano2005@gmail.com>
Co-authored-by: Carmen Ruiz Gomez <carmenruizgomez12@gmail.com>
Co-authored-by: Duggu Ghosh <duggu52d@gmail.com>
Co-authored-by: George <dyshlenko2@gmail.com>
Co-authored-by: Kris Fremen <me@krisfremen.com>
Co-authored-by: Lea Sophie Diekmann <dielea2012@gmail.com>
Co-authored-by: Mausam <mausam_b@protonmail.com>
Co-authored-by: Oscar Trente <vincent@lamblot.net>
Co-authored-by: Serhii <serzh.photograf@gmail.com>
Co-authored-by: Stelio Passaris <habitica@stelio.net>
Co-authored-by: Tanishq Saini <tanishqsaini005@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: elsaaa <elsachaton@lavache.com>
Co-authored-by: kran fall <wisal50835@codoteam.com>
Co-authored-by: Павел <goncharovps@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/bg/
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/challenge/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/character/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/character/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/content/es/
Translate-URL: https://translate.habitica.com/projects/habitica/content/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/death/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/front/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
Translate-URL: https://translate.habitica.com/projects/habitica/front/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/es/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/
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/rebirth/de/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/sr/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/en_GB/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Death
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Npc
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Rebirth
Translation: Habitica/Settings
Translation: Habitica/Spells
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2026-05-12 14:54:18 +02:00
Phillip Thelen 38a591bdd1 Trim group chat messages (#15646)
Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2026-05-07 12:31:43 -05:00
Kalista Payne 2736d8acf3 5.47.8 2026-05-06 15:36:06 -05:00
Kalista Payne 8fe13dbb23 Revert "Improve rate limit handling (#15649)"
This reverts commit 1482f6c225.
2026-05-06 15:35:56 -05:00
Kalista Payne 4581bb9315 5.47.7 2026-05-06 14:57:31 -05:00
Weblate 2999212379 Merge branch 'origin/develop' into Weblate. 2026-05-06 21:55:54 +02:00
Weblate d2bd246e6e Translated using Weblate (Russian)
Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (Russian)

Currently translated at 82.3% (2924 of 3551 strings)

Translated using Weblate (German)

Currently translated at 98.6% (3503 of 3551 strings)

Translated using Weblate (Russian)

Currently translated at 98.4% (188 of 191 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Russian)

Currently translated at 82.2% (2919 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (Russian)

Currently translated at 82.1% (2916 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Russian)

Currently translated at 75.4% (191 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (Russian)

Currently translated at 98.0% (198 of 202 strings)

Translated using Weblate (Russian)

Currently translated at 75.0% (190 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Russian)

Currently translated at 75.0% (190 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (58 of 58 strings)

Translated using Weblate (German)

Currently translated at 98.6% (3502 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (58 of 58 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (58 of 58 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (Italian)

Currently translated at 97.9% (3477 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (Italian)

Currently translated at 92.1% (3271 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 90.8% (3226 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 90.7% (3223 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 90.7% (3222 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 90.6% (3219 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 90.2% (3204 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 89.5% (3180 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 89.5% (3179 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 89.4% (3176 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 89.1% (3164 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 89.0% (3163 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 89.0% (3162 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 88.9% (3159 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 88.9% (3157 of 3551 strings)

Translated using Weblate (Portuguese)

Currently translated at 59.5% (2116 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 88.8% (3155 of 3551 strings)

Translated using Weblate (Portuguese)

Currently translated at 59.5% (2116 of 3551 strings)

Translated using Weblate (Portuguese)

Currently translated at 59.5% (2116 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 88.3% (3137 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 86.8% (3084 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 86.5% (3074 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 86.1% (3060 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (Italian)

Currently translated at 85.2% (3026 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 99.4% (866 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 99.3% (865 of 871 strings)

Translated using Weblate (Hebrew)

Currently translated at 92.4% (134 of 145 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 98.5% (858 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 95.5% (279 of 292 strings)

Translated using Weblate (Italian)

Currently translated at 87.3% (255 of 292 strings)

Translated using Weblate (Italian)

Currently translated at 83.9% (2982 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 83.8% (2978 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 83.8% (2978 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 83.8% (2978 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 95.7% (834 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (Italian)

Currently translated at 81.3% (2889 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 95.7% (834 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 95.1% (829 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 94.7% (825 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 94.1% (820 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 93.3% (813 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 91.7% (799 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Italian)

Currently translated at 90.9% (792 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 81.1% (2883 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 89.6% (781 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 89.6% (781 of 871 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.6% (278 of 279 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (20 of 20 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.5% (3500 of 3551 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (413 of 413 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (Italian)

Currently translated at 86.3% (252 of 292 strings)

Translated using Weblate (Italian)

Currently translated at 81.1% (2883 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (Italian)

Currently translated at 81.0% (2879 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 96.6% (427 of 442 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 75.0% (190 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 79.0% (200 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Italian)

Currently translated at 80.6% (2864 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Italian)

Currently translated at 77.4% (196 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 89.2% (777 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (413 of 413 strings)

Translated using Weblate (Italian)

Currently translated at 80.6% (2864 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 60.8% (154 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 85.8% (748 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (2 of 2 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (Italian)

Currently translated at 87.4% (244 of 279 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (20 of 20 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Italian)

Currently translated at 80.5% (2862 of 3551 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (Italian)

Currently translated at 37.5% (95 of 253 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Italian)

Currently translated at 96.3% (265 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 96.3% (265 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 96.3% (265 of 275 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (413 of 413 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (Czech)

Currently translated at 92.1% (105 of 114 strings)

Translated using Weblate (Czech)

Currently translated at 91.2% (104 of 114 strings)

Translated using Weblate (Czech)

Currently translated at 85.6% (173 of 202 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3551 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.6% (3503 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (413 of 413 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 90.7% (3222 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 90.5% (3216 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 90.4% (3212 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 87.2% (3099 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 87.2% (3097 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 87.1% (3096 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 85.9% (3051 of 3551 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.5% (246 of 247 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.4% (190 of 191 strings)

Translated using Weblate (Polish)

Currently translated at 70.0% (14 of 20 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (Polish)

Currently translated at 99.5% (939 of 943 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 84.7% (3008 of 3551 strings)

Translated using Weblate (Russian)

Currently translated at 99.6% (940 of 943 strings)

Translated using Weblate (Russian)

Currently translated at 99.6% (940 of 943 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 83.7% (2974 of 3551 strings)

Translated using Weblate (French)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Korean)

Currently translated at 49.0% (1740 of 3551 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.5% (3499 of 3551 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.4% (3497 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 80.7% (2868 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 79.8% (2835 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 79.2% (2815 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 77.4% (2749 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (413 of 413 strings)

Translated using Weblate (Japanese)

Currently translated at 99.6% (868 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (58 of 58 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 75.8% (2693 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (253 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (413 of 413 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (275 of 275 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 74.9% (2662 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.0% (248 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Korean)

Currently translated at 41.8% (106 of 253 strings)

Translated using Weblate (Korean)

Currently translated at 99.1% (113 of 114 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (Korean)

Currently translated at 95.0% (19 of 20 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (Japanese)

Currently translated at 97.8% (3475 of 3551 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Japanese)

Currently translated at 99.5% (246 of 247 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 73.8% (2621 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 93.5% (261 of 279 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (292 of 292 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.0% (248 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 73.8% (2621 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.0% (248 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 73.3% (2606 of 3551 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (145 of 145 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (20 of 20 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.0% (248 of 253 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (413 of 413 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (202 of 202 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (943 of 943 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (German)

Currently translated at 98.5% (3500 of 3551 strings)

Translated using Weblate (Ukrainian)

Currently translated at 66.0% (167 of 253 strings)

Translated using Weblate (Ukrainian)

Currently translated at 66.0% (167 of 253 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (247 of 247 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (20 of 20 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 55.0% (11 of 20 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 98.9% (90 of 91 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 99.0% (200 of 202 strings)

Translated using Weblate (Czech)

Currently translated at 84.5% (797 of 943 strings)

Translated using Weblate (Czech)

Currently translated at 59.2% (163 of 275 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (871 of 871 strings)

Translated using Weblate (Japanese)

Currently translated at 97.8% (3473 of 3551 strings)

Translated using Weblate (Japanese)

Currently translated at 90.0% (18 of 20 strings)

Translated using Weblate (Japanese)

Currently translated at 98.4% (435 of 442 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 97.2% (284 of 292 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.9% (862 of 871 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 97.3% (111 of 114 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 70.0% (14 of 20 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (442 of 442 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (191 of 191 strings)

Translated using Weblate (Ukrainian)

Currently translated at 59.6% (151 of 253 strings)

Translated using Weblate (Ukrainian)

Currently translated at 84.0% (732 of 871 strings)

Translated using Weblate (Czech)

Currently translated at 84.0% (793 of 943 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Ukrainian)

Currently translated at 53.2% (1890 of 3551 strings)

Co-authored-by: Aleksandr <aichernyaev@yandex.ru>
Co-authored-by: Andrea Brunato <andrea.brunato@live.com>
Co-authored-by: Antonio Lila Rusciano <antoniorusciano2005@gmail.com>
Co-authored-by: Antonio Rusciano <antoniorusciano2005@gmail.com>
Co-authored-by: Begümay Çınar <begumay@proton.me>
Co-authored-by: Daniel Costa Carvalho <danielcostacarvalho@gmail.com>
Co-authored-by: Dayra G.R <ale.ro.bless1501@gmail.com>
Co-authored-by: Deleted User <noreply+1630@weblate.org>
Co-authored-by: Igor <777igor93@gmail.com>
Co-authored-by: Illana Beatriz Rocha de Oliveira <dev.illanabeatriz@gmail.com>
Co-authored-by: Juhyung bang <juheng0912@gmail.com>
Co-authored-by: Karel <kcharlik@gmail.com>
Co-authored-by: Lenka Pavlíčková <lenkapavlickova2@email.cz>
Co-authored-by: Maria Morant <luisa.morant@yahoo.com>
Co-authored-by: Matej Boura <B.Matej@email.cz>
Co-authored-by: Omar Bertolla <scaram@icloud.com>
Co-authored-by: Sandra Marcial <sandramarcial80@gmail.com>
Co-authored-by: Sara Amit Cohen <saragirl93@gmail.com>
Co-authored-by: Serhii <serzh.photograf@gmail.com>
Co-authored-by: Sonia <sophishport@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Stelio Passaris <habitica@stelio.net>
Co-authored-by: Sugo Gangotti <giacomo@ergonomia.it>
Co-authored-by: Summer_GUI <heyang94@163.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Wera <weramimi05@gmail.com>
Co-authored-by: Zhi Hao Li <zhihaoli000@gmail.com>
Co-authored-by: qazplm <513121975@qq.com>
Co-authored-by: Павел <goncharovps@gmail.com>
Co-authored-by: いんこ <ayakabooker@gmail.com>
Co-authored-by: 김수빈 <kmsb0319@gmail.com>
Co-authored-by: ? <importantdata78@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/sv/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/it/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/it/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/character/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/character/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/character/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/character/it/
Translate-URL: https://translate.habitica.com/projects/habitica/character/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/it/
Translate-URL: https://translate.habitica.com/projects/habitica/content/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/content/it/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/content/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/death/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/death/it/
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/it/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/it/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/front/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/front/it/
Translate-URL: https://translate.habitica.com/projects/habitica/front/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/front/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/en_GB/
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/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
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/gear/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/it/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/en_GB/
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/groups/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/it/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/it/
Translate-URL: https://translate.habitica.com/projects/habitica/noscript/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/it/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/it/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/
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/questscontent/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/it/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/it/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/it/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/it/
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/tasks/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/he/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/it/
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/Defaulttasks
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Messages
Translation: Habitica/Noscript
Translation: Habitica/Npc
Translation: Habitica/Overview
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Rebirth
Translation: Habitica/Settings
Translation: Habitica/Spells
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2026-05-06 21:55:43 +02:00
Kalista Payne 1482f6c225 Improve rate limit handling (#15649)
* Improve rate limit handling

* fix(lint): blank lines

---------

Co-authored-by: Phillip Thelen <phillip@thelen.space>
2026-05-06 14:47:33 -05:00
Fiz 1178da3a26 fix(quests): stuck "you were invited" banner after accept/reject (#15647)
wrap the conditional group update and the user save in a single transaction so a failure                                                                                                              between them can't leave members[uid] and RSVPNeeded out of sync
2026-05-05 11:09:30 -05:00
Kalista Payne 819ed2b355 Task dropdown and keyboard navigation fixes (#15648)
* fix(css): kebab z, focus highlights

* fix(nav): better tab behavior
2026-04-30 17:00:21 -05:00
Kalista Payne a92999fc11 5.47.6 2026-04-10 11:49:43 -05:00
Kalista Payne 3489b88752 fix(auth): downgrade helmet 2026-04-10 11:42:27 -05:00
265 changed files with 7037 additions and 3791 deletions
+105 -7
View File
@@ -1,12 +1,12 @@
{
"name": "habitica",
"version": "5.47.5",
"version": "5.48.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "habitica",
"version": "5.47.5",
"version": "5.48.0",
"hasInstallScript": true,
"dependencies": {
"@babel/core": "^7.22.10",
@@ -35,6 +35,7 @@
"eslint-plugin-mocha": "^5.0.0",
"express": "^4.21.1",
"express-basic-auth": "^1.2.1",
"express-sitemap-xml": "^3.1.0",
"express-validator": "^5.2.0",
"firebase-admin": "^12.1.1",
"glob": "^8.1.0",
@@ -46,7 +47,7 @@
"gulp.spritesmith": "^6.13.0",
"habitica-markdown": "^4.1.0",
"heapdump": "^0.3.15",
"helmet": "^8.1.0",
"helmet": "^4.6.0",
"in-app-purchase": "^1.11.3",
"js2xmlparser": "^5.0.0",
"jsonwebtoken": "^9.0.2",
@@ -10140,6 +10141,30 @@
"basic-auth": "^2.0.1"
}
},
"node_modules/express-sitemap-xml": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/express-sitemap-xml/-/express-sitemap-xml-3.1.0.tgz",
"integrity": "sha512-rhm4ydngymgQlUyKor2kiY9Xf3wWWb/tbXYVMvidxyA83D1JjKOqYo23clhMvwJ+fk2ht11KtJwcaHnhhdo4PQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"p-memoize": "^4.0.1",
"xmlbuilder": "^15.1.1"
}
},
"node_modules/express-validator": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/express-validator/-/express-validator-5.3.1.tgz",
@@ -12798,11 +12823,12 @@
}
},
"node_modules/helmet": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz",
"integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==",
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/helmet/-/helmet-4.6.0.tgz",
"integrity": "sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg==",
"license": "MIT",
"engines": {
"node": ">=18.0.0"
"node": ">=10.0.0"
}
},
"node_modules/hex2dec": {
@@ -14861,6 +14887,18 @@
"node": ">=0.10.0"
}
},
"node_modules/map-age-cleaner": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
"integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
"license": "MIT",
"dependencies": {
"p-defer": "^1.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
@@ -17226,6 +17264,15 @@
"node": ">=8"
}
},
"node_modules/p-defer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
"integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/p-event": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz",
@@ -17305,6 +17352,32 @@
"node": ">=4"
}
},
"node_modules/p-memoize": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-4.0.4.tgz",
"integrity": "sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==",
"license": "MIT",
"dependencies": {
"map-age-cleaner": "^0.1.3",
"mimic-fn": "^3.0.0",
"p-settle": "^4.1.1"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/p-memoize?sponsor=1"
}
},
"node_modules/p-memoize/node_modules/mimic-fn": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz",
"integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/p-pipe": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz",
@@ -17325,6 +17398,31 @@
"node": ">=4"
}
},
"node_modules/p-reflect": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz",
"integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/p-settle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz",
"integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==",
"license": "MIT",
"dependencies": {
"p-limit": "^2.2.2",
"p-reflect": "^2.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-timeout": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
+3 -2
View File
@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "5.47.5",
"version": "5.48.0",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.22.10",
@@ -30,6 +30,7 @@
"eslint-plugin-mocha": "^5.0.0",
"express": "^4.21.1",
"express-basic-auth": "^1.2.1",
"express-sitemap-xml": "^3.1.0",
"express-validator": "^5.2.0",
"firebase-admin": "^12.1.1",
"glob": "^8.1.0",
@@ -41,7 +42,7 @@
"gulp.spritesmith": "^6.13.0",
"habitica-markdown": "^4.1.0",
"heapdump": "^0.3.15",
"helmet": "^8.1.0",
"helmet": "^4.6.0",
"in-app-purchase": "^1.11.3",
"js2xmlparser": "^5.0.0",
"jsonwebtoken": "^9.0.2",
+24 -12
View File
@@ -32,7 +32,8 @@ describe('rateLimiter middleware', () => {
it('is disabled when the env var is not defined', () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns(undefined);
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
attachRateLimiter(req, res, next);
expect(next).to.have.been.calledOnce;
@@ -43,7 +44,8 @@ describe('rateLimiter middleware', () => {
it('is disabled when the env var is an not "true"', () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('false');
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
attachRateLimiter(req, res, next);
expect(next).to.have.been.calledOnce;
@@ -55,7 +57,8 @@ describe('rateLimiter middleware', () => {
it('does not throw when there are available points', async () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
await attachRateLimiter(req, res, next);
expect(next).to.have.been.calledOnce;
@@ -77,7 +80,8 @@ describe('rateLimiter middleware', () => {
sandbox.stub(RateLimiterMemory.prototype, 'consume')
.returns(Promise.reject(new Error('Unknown error.')));
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
await attachRateLimiter(req, res, next);
expect(next).to.have.been.calledOnce;
@@ -92,7 +96,8 @@ describe('rateLimiter middleware', () => {
it('does not throw when LIVELINESS_PROBE_KEY is correct', async () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns('abc');
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
req.query.liveliness = 'abc';
await attachRateLimiter(req, res, next);
@@ -107,7 +112,8 @@ describe('rateLimiter middleware', () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns('abc');
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
req.query.liveliness = 'das';
await attachRateLimiter(req, res, next);
@@ -124,7 +130,8 @@ describe('rateLimiter middleware', () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns(undefined);
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
await attachRateLimiter(req, res, next);
@@ -140,7 +147,8 @@ describe('rateLimiter middleware', () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns('');
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
req.query.liveliness = '';
await attachRateLimiter(req, res, next);
@@ -156,7 +164,8 @@ describe('rateLimiter middleware', () => {
it('throws when there are no available points remaining', async () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
// call for 31 times
for (let i = 0; i < 31; i += 1) {
@@ -180,7 +189,8 @@ describe('rateLimiter middleware', () => {
it('uses the user id if supplied or the ip address', async () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
req.ip = 1;
await attachRateLimiter(req, res, next);
@@ -210,7 +220,8 @@ describe('rateLimiter middleware', () => {
it('applies increased cost for registration calls with and without user id', async () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
nconfGetStub.withArgs('RATE_LIMITER_REGISTRATION_COST').returns(3);
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
req.path = '/api/v4/user/auth/local/register';
req.ip = 1;
@@ -241,7 +252,8 @@ describe('rateLimiter middleware', () => {
it('applies increased cost for unauthenticated API calls', async () => {
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(10);
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
const attachRateLimiter = setupRateLimiter();
req.ip = 1;
await attachRateLimiter(req, res, next);
+54
View File
@@ -6,6 +6,8 @@ import {
SPAM_MESSAGE_LIMIT,
SPAM_MIN_EXEMPT_CONTRIB_LEVEL,
SPAM_WINDOW_LENGTH,
MAX_CHAT_COUNT,
MAX_SUBBED_GROUP_CHAT_COUNT,
INVITES_LIMIT,
model as Group,
} from '../../../../website/server/models/group';
@@ -18,6 +20,7 @@ import {
import * as email from '../../../../website/server/libs/email';
import { TAVERN_ID } from '../../../../website/common/script/constants';
import shared from '../../../../website/common';
import { chatModel as Chat } from '../../../../website/server/models/message';
describe('Group Model', () => {
let party; let questLeader; let participatingMember;
@@ -1356,6 +1359,29 @@ describe('Group Model', () => {
});
});
describe('#getEffectiveChatLimit', () => {
it('returns the correct chat limit', () => {
const group = new Group();
expect(group.getEffectiveChatLimit()).to.eql(MAX_CHAT_COUNT);
});
it('returns the passed limit if it is lower than the max', () => {
const group = new Group();
expect(group.getEffectiveChatLimit(10)).to.eql(10);
});
it('returns the max if the passed limit is higher', () => {
const group = new Group();
expect(group.getEffectiveChatLimit(MAX_CHAT_COUNT + 10)).to.eql(MAX_CHAT_COUNT);
});
it('returns the max for group plans', () => {
const group = new Group();
group.purchased.plan.customerId = '110002222333';
expect(group.getEffectiveChatLimit()).to.eql(MAX_SUBBED_GROUP_CHAT_COUNT);
});
});
describe('#sendChat', () => {
beforeEach(() => {
sandbox.spy(User, 'updateOne');
@@ -1462,6 +1488,34 @@ describe('Group Model', () => {
});
});
describe('#trimChat', () => {
it('Only checks last message when not enough messages to trim', async () => {
sandbox.spy(Chat, 'find');
sandbox.spy(Chat, 'deleteMany');
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
await party.trimChat();
expect(Chat.find).to.be.calledOnce;
expect(Chat.deleteMany).to.not.be.called;
expect(await Chat.countDocuments({ groupId: party._id })).to.eql(3);
});
it('Deletes messages over the limit', async () => {
sandbox.spy(Chat, 'find');
sandbox.spy(Chat, 'deleteMany');
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
await party.trimChat(1);
expect(Chat.find).to.be.calledOnce;
expect(Chat.deleteMany).to.be.calledOnce;
expect(await Chat.countDocuments({ groupId: party._id })).to.eql(1);
});
});
describe('#startQuest', () => {
context('Failure Conditions', () => {
it('throws an error if group is not a party', async () => {
@@ -91,6 +91,23 @@ describe('POST /groups/:groupId/quests/accept', () => {
expect(partyMembers[0].party.quest.RSVPNeeded).to.be.false;
});
it('heals stuck RSVPNeeded when group already has the user accepted', async () => {
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
await partyMembers[0].updateOne({ 'party.quest.RSVPNeeded': true });
await partyMembers[0].sync();
expect(partyMembers[0].party.quest.RSVPNeeded).to.be.true;
const res = await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
expect(res).to.exist;
await partyMembers[0].sync();
await questingGroup.sync();
expect(partyMembers[0].party.quest.RSVPNeeded).to.equal(false);
expect(questingGroup.quest.members[partyMembers[0]._id]).to.equal(true);
});
it('does not accept invite for a quest already underway', async () => {
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
@@ -100,6 +100,23 @@ describe('POST /groups/:groupId/quests/reject', () => {
expect(partyMembers[0].party.quest.RSVPNeeded).to.be.false;
});
it('heals stuck RSVPNeeded when group already has the user rejected', async () => {
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`);
await partyMembers[0].updateOne({ 'party.quest.RSVPNeeded': true });
await partyMembers[0].sync();
expect(partyMembers[0].party.quest.RSVPNeeded).to.be.true;
const res = await partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`);
expect(res).to.exist;
await partyMembers[0].sync();
await questingGroup.sync();
expect(partyMembers[0].party.quest.RSVPNeeded).to.equal(false);
expect(questingGroup.quest.members[partyMembers[0]._id]).to.equal(false);
});
it('return an error when a user rejects an invite already accepted', async () => {
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
+22
View File
@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Habitica - FAQ</title>
<meta name="description" content="Frequently Asked Questions about Habitica, the gamified task manager.">
<link href="https://fonts.googleapis.com/css?family=Roboto+Condensed:400,400i,700,700i|Roboto:400,400i,700,700i" rel="stylesheet">
<link rel="shortcut icon" sizes="48x48" href="/static/icons/favicon.ico">
<link rel="shortcut icon" sizes="192x192" href="/static/icons/favicon_192x192.png">
<link rel="mask-icon" href="/static/icons/favicon.ico">
<meta property="og:image" content="/static/emails/images/meta-image.png" />
<script type="module" src="/src/main.js"></script>
</head>
<body>
<div id="app"></div>
<script type="text/javascript" src="//cloudfront.loggly.com/js/loggly.tracker-latest.min.js" async></script>
<!-- Translations -->
<script type='text/javascript' src='/api/v4/i18n/core' vite-ignore></script>
</body>
</html>
@@ -695,6 +695,11 @@
width: 141px;
height: 147px;
}
.background_beach_with_volcano {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_beach_with_volcano.png');
width: 141px;
height: 147px;
}
.background_beehive {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_beehive.png');
width: 141px;
@@ -2346,6 +2351,11 @@
width: 141px;
height: 147px;
}
.background_tropical_coral_garden {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_tropical_coral_garden.png');
width: 141px;
height: 147px;
}
.background_tulip_garden {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_tulip_garden.png');
width: 141px;
@@ -2401,6 +2411,11 @@
width: 141px;
height: 147px;
}
.background_vegetable_garden {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_vegetable_garden.png');
width: 141px;
height: 147px;
}
.background_viking_ship {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_viking_ship.png');
width: 141px;
@@ -29880,6 +29895,11 @@
width: 114px;
height: 90px;
}
.broad_armor_armoire_kendoBogu {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_kendoBogu.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_lamplightersGreatcoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_lamplightersGreatcoat.png');
width: 114px;
@@ -30535,6 +30555,11 @@
width: 90px;
height: 90px;
}
.head_armoire_kendoMen {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_kendoMen.png');
width: 114px;
height: 90px;
}
.head_armoire_lamplightersTopHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_lamplightersTopHat.png');
width: 114px;
@@ -30920,6 +30945,11 @@
width: 114px;
height: 90px;
}
.shield_armoire_gardenHose {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_gardenHose.png');
width: 114px;
height: 90px;
}
.shield_armoire_gardenersSpade {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_gardenersSpade.png');
width: 114px;
@@ -31550,6 +31580,11 @@
width: 114px;
height: 90px;
}
.slim_armor_armoire_kendoBogu {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_kendoBogu.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_lamplightersGreatcoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_lamplightersGreatcoat.png');
width: 114px;
@@ -31930,6 +31965,11 @@
width: 114px;
height: 90px;
}
.weapon_armoire_brightRainbowKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_brightRainbowKite.png');
width: 114px;
height: 90px;
}
.weapon_armoire_buoyantBubbles {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_buoyantBubbles.png');
width: 114px;
@@ -32030,6 +32070,11 @@
width: 114px;
height: 90px;
}
.weapon_armoire_gardenRake {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_gardenRake.png');
width: 114px;
height: 90px;
}
.weapon_armoire_gardenersWateringCan {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_gardenersWateringCan.png');
width: 114px;
@@ -32125,6 +32170,11 @@
width: 114px;
height: 90px;
}
.weapon_armoire_kendoShinai {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_kendoShinai.png');
width: 114px;
height: 90px;
}
.weapon_armoire_lamplighter {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_lamplighter.png');
width: 114px;
@@ -32210,6 +32260,11 @@
width: 114px;
height: 90px;
}
.weapon_armoire_pastelRainbowKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_pastelRainbowKite.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;
@@ -34200,6 +34255,11 @@
width: 114px;
height: 90px;
}
.eyewear_mystery_202606 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_mystery_202606.png');
width: 117px;
height: 120px;
}
.head_mystery_202512 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202512.png');
width: 114px;
@@ -34220,11 +34280,31 @@
width: 114px;
height: 90px;
}
.head_mystery_202606 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202606.png');
width: 117px;
height: 120px;
}
.shield_mystery_202605 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202605.png');
width: 114px;
height: 90px;
}
.shield_mystery_202606 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202606.png');
width: 117px;
height: 120px;
}
.shield_mystery_202607 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202607.png');
width: 117px;
height: 120px;
}
.shield_mystery_202608 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202608.png');
width: 117px;
height: 120px;
}
.slim_armor_mystery_202512 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202512.png');
width: 114px;
@@ -34250,6 +34330,16 @@
width: 114px;
height: 90px;
}
.weapon_mystery_202607 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202607.png');
width: 117px;
height: 120px;
}
.weapon_mystery_202608 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202608.png');
width: 117px;
height: 120px;
}
.back_mystery_201402 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_201402.png');
width: 90px;
@@ -37715,6 +37805,26 @@
width: 114px;
height: 90px;
}
.broad_armor_special_summer2026Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2026Healer.png');
width: 114px;
height: 90px;
}
.broad_armor_special_summer2026Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2026Mage.png');
width: 114px;
height: 117px;
}
.broad_armor_special_summer2026Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2026Rogue.png');
width: 114px;
height: 117px;
}
.broad_armor_special_summer2026Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2026Warrior.png');
width: 114px;
height: 90px;
}
.broad_armor_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summerHealer.png');
width: 90px;
@@ -37965,6 +38075,26 @@
width: 114px;
height: 90px;
}
.head_special_summer2026Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2026Healer.png');
width: 114px;
height: 90px;
}
.head_special_summer2026Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2026Mage.png');
width: 114px;
height: 117px;
}
.head_special_summer2026Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2026Rogue.png');
width: 114px;
height: 117px;
}
.head_special_summer2026Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2026Warrior.png');
width: 114px;
height: 90px;
}
.head_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summerHealer.png');
width: 90px;
@@ -38155,6 +38285,21 @@
width: 114px;
height: 90px;
}
.shield_special_summer2026Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2026Healer.png');
width: 114px;
height: 90px;
}
.shield_special_summer2026Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2026Rogue.png');
width: 114px;
height: 117px;
}
.shield_special_summer2026Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2026Warrior.png');
width: 114px;
height: 90px;
}
.shield_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summerHealer.png');
width: 90px;
@@ -38395,6 +38540,26 @@
width: 114px;
height: 90px;
}
.slim_armor_special_summer2026Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2026Healer.png');
width: 114px;
height: 90px;
}
.slim_armor_special_summer2026Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2026Mage.png');
width: 114px;
height: 117px;
}
.slim_armor_special_summer2026Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2026Rogue.png');
width: 114px;
height: 117px;
}
.slim_armor_special_summer2026Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2026Warrior.png');
width: 114px;
height: 90px;
}
.slim_armor_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summerHealer.png');
width: 90px;
@@ -38635,6 +38800,26 @@
width: 114px;
height: 90px;
}
.weapon_special_summer2026Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2026Healer.png');
width: 114px;
height: 90px;
}
.weapon_special_summer2026Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2026Mage.png');
width: 114px;
height: 117px;
}
.weapon_special_summer2026Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2026Rogue.png');
width: 114px;
height: 117px;
}
.weapon_special_summer2026Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2026Warrior.png');
width: 114px;
height: 90px;
}
.weapon_special_summerHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summerHealer.png');
width: 90px;
+1
View File
@@ -42,6 +42,7 @@ ul {
font-weight: 400;
line-height: 1.75;
color: $purple-200;
cursor: pointer;
}
h4 {
+10 -1
View File
@@ -11,7 +11,7 @@
{{ $t('tavernDiscontinued') }}
</h1>
<p>{{ $t('tavernDiscontinuedDetail') }}</p>
<p v-html="$t('tavernDiscontinuedLinks')"></p>
<p v-html="$t('tavernDiscontinuedLinks', tavernLinks)"></p>
</div>
<div v-else>
<h1>
@@ -38,6 +38,15 @@
import { mapState } from '@/libs/store';
export default {
data () {
return {
tavernLinks: {
faqLink: '<a href="/static/faq/tavern-and-guilds">',
homeLink: '<a href="/">',
linkClose: '</a>',
},
};
},
computed: {
...mapState(['isUserLoggedIn']),
retiredChatPage () {
@@ -98,7 +98,7 @@
<div
v-once
class="opt-out-description"
v-html="$t('optOutOfClassesText')"
v-html="$t('optOutOfClassesText', optOutLinks)"
></div>
</div>
</div>
@@ -214,6 +214,10 @@ export default {
wizard: wizardIcon,
}),
selectedClass: 'warrior',
optOutLinks: {
linkOpen: '<a href="/static/faq#what-classes" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -14,6 +14,7 @@
<br>
<a
:href="$t('conRewardsURL')"
rel="noopener noreferrer"
target="_blank"
>{{ $t('contribLink') }}</a>
<br>
@@ -55,7 +55,7 @@
</button>
<h4
class="text-center"
v-html="$t('dyingOftenTips')"
v-html="$t('dyingOftenTips', tipLinks)"
></h4>
</div>
</div>
@@ -86,6 +86,10 @@ export default {
data () {
return {
maxHealth,
tipLinks: {
linkOpen: '<a href="/static/faq#prevent-damage" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -52,7 +52,7 @@
&& user.achievements.ultimateGearSets.rogue
&& user.achievements.ultimateGearSets.warrior"
>
<p v-html="$t('moreGearAchievements')"></p>
<p v-html="$t('moreGearAchievements', gearAchievementLinks)"></p>
<br>
</div>
<Sprite image-name="shop_armoire" />
@@ -95,6 +95,14 @@ export default {
achievementAvatar,
Sprite,
},
data () {
return {
gearAchievementLinks: {
linkOpen: '<a href="/user/settings/site" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
...mapState({ user: 'user.data' }),
},
@@ -491,6 +491,7 @@
v-if="hero.purchased.plan.paymentMethod === 'Google'"
class="btn btn-primary btn-sm"
target="_blank"
rel="noopener noreferrer"
:href="playOrdersUrl"
>
Play Console
@@ -499,6 +500,7 @@
v-else-if="hero.purchased.plan.paymentMethod === 'Paypal'"
class="btn btn-primary btn-sm"
target="_blank"
rel="noopener noreferrer"
:href="'https://www.paypal.com/billing/subscriptions/' + paymentDetails.customerId"
>
PayPal Dashboard
@@ -507,6 +509,7 @@
v-else-if="hero.purchased.plan.paymentMethod === 'Stripe'"
class="btn btn-primary btn-sm"
target="_blank"
rel="noopener noreferrer"
:href="'https://dashboard.stripe.com/customers/' + paymentDetails.customerId"
>
Stripe Dashboard
@@ -11,6 +11,7 @@
<li>
<a
href="https://itunes.apple.com/us/app/habitica/id994882113?ls=1&mt=8"
rel="noopener noreferrer"
target="_blank"
>{{ $t('mobileIOS') }}
</a>
@@ -18,6 +19,7 @@
<li>
<a
href="https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica"
rel="noopener noreferrer"
target="_blank"
>{{ $t('mobileAndroid') }}
</a>
@@ -52,6 +54,7 @@
<a
href="https://habitica.wordpress.com/"
target="_blank"
rel="noopener noreferrer"
>{{ $t('companyBlog') }}
</a>
</li>
@@ -71,6 +74,7 @@
<li>
<a
target="_blank"
rel="noopener noreferrer"
href="/static/community-guidelines"
>{{ $t('communityGuidelines') }}
</a>
@@ -84,6 +88,7 @@
<a
href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica"
target="_blank"
rel="noopener noreferrer"
>{{ $t('companyContribute') }}
</a>
</li>
@@ -91,6 +96,7 @@
<a
href="https://translate.habitica.com/"
target="_blank"
rel="noopener noreferrer"
>{{ $t('translateHabitica') }}
</a>
</li>
@@ -111,6 +117,7 @@
<a
href=""
target="_blank"
rel="noopener noreferrer"
@click.prevent="openBugReportModal()"
>
{{ $t('reportBug') }}
@@ -122,6 +129,7 @@
<a
href="mailto:admin@habitica.com?subject=Habitica Web Bug Report"
target="_blank"
rel="noopener noreferrer"
>
{{ $t('reportBug') }}
</a>
@@ -130,6 +138,7 @@
<a
href="https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link"
target="_blank"
rel="noopener noreferrer"
>{{ $t('requestFeature') }}
</a>
</li>
@@ -143,6 +152,7 @@
<a
href="/apidoc"
target="_blank"
rel="noopener noreferrer"
>{{ $t('APIv3') }}
</a>
</li>
@@ -150,6 +160,7 @@
<a
:href="getDataDisplayToolUrl"
target="_blank"
rel="noopener noreferrer"
>{{ $t('dataDisplayTool') }}
</a>
</li>
@@ -157,6 +168,7 @@
<a
href="https://habitica.fandom.com/wiki/Guidance_for_Blacksmiths"
target="_blank"
rel="noopener noreferrer"
>{{ $t('guidanceForBlacksmiths') }}
</a>
</li>
@@ -172,6 +184,7 @@
class="social-circle mr-2"
href="https://www.instagram.com/habitica/"
target="_blank"
rel="noopener noreferrer"
>
<div
class="social-icon svg-icon"
@@ -181,6 +194,7 @@
<a
href="https://www.instagram.com/habitica/"
target="_blank"
rel="noopener noreferrer"
>
{{ $t('communityInstagram') }}
</a>
@@ -190,6 +204,7 @@
class="social-circle mr-2"
href="https://bsky.app/profile/habitica.com"
target="_blank"
rel="noopener noreferrer"
>
<div
class="social-icon svg-icon"
@@ -199,6 +214,7 @@
<a
href="https://bsky.app/profile/habitica.com"
target="_blank"
rel="noopener noreferrer"
>
Bluesky
</a>
@@ -208,6 +224,7 @@
class="social-circle mr-2"
href="https://www.facebook.com/Habitica/"
target="_blank"
rel="noopener noreferrer"
>
<div
class="social-icon svg-icon"
@@ -217,6 +234,7 @@
<a
href="https://www.facebook.com/Habitica/"
target="_blank"
rel="noopener noreferrer"
>
{{ $t('communityFacebook') }}
</a>
@@ -226,6 +244,7 @@
class="social-circle mr-2"
href="http://blog.habitrpg.com/"
target="_blank"
rel="noopener noreferrer"
>
<div
class="social-icon svg-icon"
@@ -235,6 +254,7 @@
<a
href="http://blog.habitrpg.com/"
target="_blank"
rel="noopener noreferrer"
>
{{ $t('tumblr') }}
</a>
@@ -266,12 +286,14 @@
<span class="privacy-policy">
<a
target="_blank"
rel="noopener noreferrer"
href="/static/privacy"
>{{ $t('privacy') }}</a>
</span>
<span class="terms">
<a
target="_blank"
rel="noopener noreferrer"
href="/static/terms"
>{{ $t('terms') }}</a>
</span>
@@ -287,12 +309,14 @@
<div class="privacy-policy mx-auto mb-2">
<a
target="_blank"
rel="noopener noreferrer"
href="/static/privacy"
>{{ $t('privacy') }}</a>
</div>
<div class="mobile-terms mx-auto mb-2">
<a
target="_blank"
rel="noopener noreferrer"
href="/static/terms"
>{{ $t('terms') }}</a>
</div>
@@ -77,7 +77,7 @@
v-once
class="custom-control-label purple-600"
for="privacyTOS"
v-html="$t('acceptPrivacyTOS')"
v-html="$t('acceptPrivacyTOS', acceptLinks)"
></label>
</div>
<button
@@ -187,6 +187,11 @@ export default {
privacyAccepted: false,
usernameIssues: [],
needsEmailField: false,
acceptLinks: {
termsLink: '<a href="/static/terms" target="_blank" rel="noreferrer noopener">',
privacyLink: '<a href="/static/privacy" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -64,7 +64,7 @@
<p
v-once
class="w-50 mx-auto"
v-html="$t('visitCustomizationsShop')"
v-html="$t('visitCustomizationsShop', customizeLinks)"
></p>
</div>
<customize-banner
@@ -104,6 +104,10 @@ export default {
headAccessory: ['bearEars', 'cactusEars', 'foxEars', 'lionEars', 'pandaEars', 'pigEars', 'tigerEars', 'wolfEars'],
},
chairKeys: ['none', 'black', 'blue', 'green', 'pink', 'red', 'yellow', 'handleless_black', 'handleless_blue', 'handleless_green', 'handleless_pink', 'handleless_red', 'handleless_yellow'],
customizeLinks: {
linkOpen: '<a href="/shops/customizations">',
linkClose: '</a>',
},
};
},
computed: {
@@ -61,7 +61,7 @@
<p
v-once
class="w-50 mx-auto"
v-html="$t('visitCustomizationsShop')"
v-html="$t('visitCustomizationsShop', customizeLinks)"
></p>
</div>
</div>
@@ -95,6 +95,14 @@ export default {
props: [
'editing',
],
data () {
return {
customizeLinks: {
linkOpen: '<a href="/shops/customizations">',
linkClose: '</a>',
},
};
},
computed: {
hairSubMenuItems () {
const items = [
@@ -217,8 +217,8 @@ export default {
mixins: [notifications, userStateMixin],
data () {
const abuseFlagModalBody = {
firstLinkStart: '<a href="/static/community-guidelines" target="_blank">',
secondLinkStart: '<a href="/static/terms" target="_blank">',
firstLinkStart: '<a href="/static/community-guidelines" target="_blank" rel="noopener noreferrer">',
secondLinkStart: '<a href="/static/terms" target="_blank" rel="noopener noreferrer">',
linkEnd: '</a>',
};
@@ -208,8 +208,8 @@ export default {
mixins: [notifications, userStateMixin],
data () {
const abuseFlagModalBody = {
firstLinkStart: '<a href="/static/community-guidelines" target="_blank">',
secondLinkStart: '<a href="/static/terms" target="_blank">',
firstLinkStart: '<a href="/static/community-guidelines" target="_blank" rel="noopener noreferrer">',
secondLinkStart: '<a href="/static/terms" target="_blank" rel="noopener noreferrer">',
linkEnd: '</a>',
};
@@ -77,7 +77,7 @@
</ul>
<div
class="mx-auto"
v-html="$t('newGroupsVisitFAQ')"
v-html="$t('newGroupsVisitFAQ', faqLinks)"
></div>
<div
class="mx-auto"
@@ -193,6 +193,10 @@ export default {
close: closeIcon,
sparkles,
}),
faqLinks: {
linkOpen: '<a href="/static/faq#group-plans" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
methods: {
@@ -6,7 +6,7 @@
<div
v-once
class="col col-sm-12 col-xl-8"
v-html="$t('communityGuidelinesIntro')"
v-html="$t('communityGuidelinesIntro', guidelineLinks)"
></div>
<div class="col-md-auto col-md-12 col-xl-4">
<button
@@ -60,6 +60,14 @@
import { mapState } from '@/libs/store';
export default {
data () {
return {
guidelineLinks: {
linkOpen: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
...mapState({ user: 'user.data' }),
communityGuidelinesAccepted () {
@@ -74,7 +74,7 @@
class="no-quest-to-start"
>
<b>{{ $t('noQuestToStartTitle') }}</b> <br>
<span v-html="$t('noQuestToStart', { questShop: '/shops/quests' })"></span>
<span v-html="$t('noQuestToStart', questLinks)"></span>
</span>
</div>
</div>
@@ -369,6 +369,10 @@ export default {
shareUserIdShown: false,
quests,
sortBy: 'AZ',
questLinks: {
linkOpen: '<a href="/shops/quests">',
linkClose: '</a>',
},
};
},
computed: {
@@ -1,889 +0,0 @@
<template>
<div class="row">
<world-boss-info-modal />
<world-boss-rage-modal />
<div class="col-12 col-sm-8 clearfix standard-page">
<div class="row">
<div class="col-6 title-details">
<h1 v-once>
{{ $t('welcomeToTavern') }}
</h1>
</div>
</div>
<chat
:label="$t('tavernChat')"
:group="group"
:placeholder="$t('tavernCommunityGuidelinesPlaceholder')"
@fetchRecentMessages="fetchRecentMessages()"
/>
</div>
<div class="col-12 col-sm-4 sidebar">
<div class="section">
<div
class="grassy-meadow-backdrop"
:style="{'background-image': imageURLs.background}"
>
<div
class="daniel_front"
:style="{'background-image': imageURLs.npc}"
></div>
</div>
<div class="boss-section">
<div
v-if="group && group.quest && group.quest.active"
class="world-boss"
:style="{
background: questData.colors.dark,
'border-color': questData.colors.extralight,
'outline-color': questData.colors.light}"
>
<div
class="corner-decoration"
:style="{top: '-2px', right: '-2px'}"
></div>
<div
class="corner-decoration"
:style="{top: '-2px', left: '-2px'}"
></div>
<div
class="corner-decoration"
:style="{bottom: '-2px', right: '-2px'}"
></div>
<div
class="corner-decoration"
:style="{bottom: '-2px', left: '-2px'}"
></div>
<div class="text-center float-bar d-flex align-items-center">
<span class="diamond"></span>
<span
class="strong reduce"
:style="{background: questData.colors.dark}"
>{{ $t('worldBossEvent') }}</span>
<span class="diamond"></span>
</div>
<div class="boss-gradient pb-3 pt-3">
<p
class="text-center reduce"
:style="{color: questData.colors.extralight}"
>
{{ $t(`${questData.key}ArtCredit`) }}
</p>
<div
class="quest-boss"
:class="'background_' + questData.key"
>
<div
class="quest-boss"
:class="'quest_' + questData.key"
></div>
<div
class="quest-boss"
:class="'phobia_' + questData.key"
:style="{display: 'none'}"
></div>
</div>
</div>
<div class="p-3">
<div class="row d-flex align-items-center mb-2">
<div class="col-sm-6">
<strong class="float-left">{{ questData.boss.name() }}</strong>
</div>
<div class="col-sm-6">
<span class="d-flex float-right">
<div
class="svg-icon boss-icon"
v-html="icons.swordIcon"
></div>
<span
class="ml-1 reduce"
:style="{color: questData.colors.extralight}"
>{{ $t('pendingDamage', {damage: pendingDamage()}) }}</span>
</span>
</div>
</div>
<div class="grey-progress-bar mb-1">
<div
class="boss-health-bar"
:style="{width: (group.quest.progress.hp / questData.boss.hp) * 100 + '%'}"
></div>
</div>
<span class="d-flex align-items-center">
<div
class="svg-icon boss-icon"
v-html="icons.healthIcon"
></div>
<span
class="reduce ml-1 pt-1"
>{{ $t('bossHealth', {
currentHealth: bossCurrentHealth(),
maxHealth: questData.boss.hp.toLocaleString()}) }}</span>
</span>
<div class="mt-3 mb-2">
<strong class="mr-1">{{ $t('rageAttack') }}</strong>
<span>{{ questData.boss.rage.title() }}</span>
</div>
<div class="grey-progress-bar mb-1">
<div
class="boss-health-bar rage-bar"
:style="{
width: (group.quest.progress.rage / questData.boss.rage.value) * 100 + '%'}"
></div>
</div>
<span class="d-flex align-items-center">
<div
class="svg-icon boss-icon"
v-html="icons.rageIcon"
></div>
<span
class="reduce ml-1 pt-1"
>{{ $t('bossRage', {
currentRage: bossCurrentRage(),
maxRage: questData.boss.rage.value.toLocaleString()}) }}</span>
</span>
<div class="row d-flex align-items-center mb-2 mt-2">
<div class="col-sm-4 d-flex">
<strong class="mr-2">{{ $t('rageStrikes') }}</strong>
<div
v-b-tooltip.hover.top="questData.boss.rage.description()"
class="svg-icon boss-icon information-icon m-auto"
v-html="icons.informationIcon"
></div>
</div>
<div class="col-sm-8 d-flex align-items-center justify-content-center">
<div
class="m-auto"
@click="showWorldBossRage('seasonalShop')"
>
<img
v-if="!group.quest.extra.worldDmg.seasonalShop"
class="rage-strike"
src="@/assets/images/world-boss/rage_strike@2x.png"
>
<img
v-if="group.quest.extra.worldDmg.seasonalShop"
class="rage-strike-active"
src="@/assets/images/world-boss/rage_strike-seasonalShop@2x.png"
>
</div>
<div
class="m-auto"
@click="showWorldBossRage('market')"
>
<img
v-if="!group.quest.extra.worldDmg.market"
class="rage-strike"
src="@/assets/images/world-boss/rage_strike@2x.png"
>
<img
v-if="group.quest.extra.worldDmg.market"
class="rage-strike-active"
src="@/assets/images/world-boss/rage_strike-market@2x.png"
>
</div>
<div
class="m-auto"
@click="showWorldBossRage('quests')"
>
<img
v-if="!group.quest.extra.worldDmg.quests"
class="rage-strike"
src="@/assets/images/world-boss/rage_strike@2x.png"
>
<img
v-if="group.quest.extra.worldDmg.quests"
class="rage-strike-active"
src="@/assets/images/world-boss/rage_strike-quests@2x.png"
>
</div>
</div>
</div>
<div
class="boss-description p-3"
:style="{'border-color': questData.colors.extralight}"
@click="sections.worldBoss = !sections.worldBoss"
>
<strong class="float-left">{{ $t('worldBossDescription') }}</strong>
<div class="float-right">
<div
v-if="!sections.worldBoss"
class="toggle-down"
>
<div
class="svg-icon boss-icon"
v-html="icons.chevronIcon"
></div>
</div>
<div
v-if="sections.worldBoss"
class="toggle-up"
>
<div
class="svg-icon boss-icon reverse"
v-html="icons.chevronIcon"
></div>
</div>
</div>
</div>
<div
v-if="sections.worldBoss"
class="mt-3"
v-html="questData.notes()"
></div>
</div>
</div>
<!-- .text-center.mt-4.world-boss
-info-button(@click="showWorldBossInfo()") {{$t('whatIsWorldBoss') }}
-->
</div>
<div class="sleep px-4 py-3">
<strong v-once>{{ $t('sleepDescription') }}</strong>
<ul>
<li v-once>
{{ $t('sleepBullet1') }}
</li>
<li v-once>
{{ $t('sleepBullet2') }}
</li>
<li v-once>
{{ $t('sleepBullet3') }}
</li>
</ul>
<button
v-if="!user.preferences.sleep"
v-once
class="btn btn-secondary pause-button"
@click="toggleSleep()"
>
{{ $t('pauseDailies') }}
</button>
<button
v-if="user.preferences.sleep"
v-once
class="btn btn-secondary pause-button"
@click="toggleSleep()"
>
{{ $t('unpauseDailies') }}
</button>
</div>
</div>
<div class="px-4">
<sidebar-section :title="$t('staff')">
<div class="row">
<div
v-for="user in staff"
:key="user.uuid"
class="col-6 staff"
:class="{
staff: user.type === 'Staff',
moderator: user.type === 'Moderator'}"
>
<div>
<router-link
class="title"
:to="{'name': 'userProfile', 'params': {'userId': user.uuid}}"
>
{{ user.name }}
</router-link>
<div
v-if="user.type === 'Staff'"
class="svg-icon staff-icon"
v-html="icons.tierStaff"
></div>
</div>
</div>
</div>
</sidebar-section>
<sidebar-section :title="$t('helpfulLinks')">
<ul>
<li>
<a href="mailto:admin@habitica.com">
{{ $t('reportCommunityIssues') }}
</a>
</li>
<li>
<router-link
v-once
to="/static/community-guidelines"
>
{{ $t('communityGuidelines') }}
</router-link>
</li>
<li>
<router-link
to="/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601"
>
{{ $t('lookingForGroup') }}
</router-link>
</li>
<li>
<router-link
v-once
to="/static/faq"
>
{{ $t('faq') }}
</router-link>
</li>
<li>
<a
href
:style="glossary-link"
v-html="$t('glossary')"
></a>
</li>
<li>
<a
v-once
href="https://habitica.fandom.com/wiki/Habitica_Wiki"
target="_blank"
>{{ $t('wiki') }}</a>
</li>
<li>
<a
v-once
href="https://tools.habitica.com/"
target="_blank"
>{{ $t('dataDisplayTool') }}</a>
</li>
<li>
<a
href=""
target="_blank"
@click.prevent="openBugReportModal()"
>
{{ $t('reportBug') }}
</a>
</li>
<li>
<a
v-once
href="https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link"
target="_blank"
>{{ $t('requestFeature') }}</a>
</li>
<li>
<router-link
to="/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a"
>
{{ $t('askQuestionGuild') }}
</router-link>
</li>
</ul>
</sidebar-section>
<sidebar-section :title="$t('playerTiers')">
<div class="row">
<div class="col-12">
<p v-once>
{{ $t('playerTiersDesc') }}
</p>
<ul class="tier-list">
<li
v-once
class="tier1"
>
{{ $t('tier1') }}
<div
class="svg-icon tier1-icon"
v-html="icons.tier1"
></div>
</li>
<li
v-once
class="tier2"
>
{{ $t('tier2') }}
<div
class="svg-icon tier2-icon"
v-html="icons.tier2"
></div>
</li>
<li
v-once
class="tier3"
>
{{ $t('tier3') }}
<div
class="svg-icon tier3-icon"
v-html="icons.tier3"
></div>
</li>
<li
v-once
class="tier4"
>
{{ $t('tier4') }}
<div
class="svg-icon tier4-icon"
v-html="icons.tier4"
></div>
</li>
<li
v-once
class="tier5"
>
{{ $t('tier5') }}
<div
class="svg-icon tier5-icon"
v-html="icons.tier5"
></div>
</li>
<li
v-once
class="tier6"
>
{{ $t('tier6') }}
<div
class="svg-icon tier6-icon"
v-html="icons.tier6"
></div>
</li>
<li
v-once
class="tier7"
>
{{ $t('tier7') }}
<div
class="svg-icon tier7-icon"
v-html="icons.tier7"
></div>
</li>
<li
v-once
class="moderator"
>
{{ $t('tierModerator') }}
<div
class="svg-icon mod-icon"
v-html="icons.tierMod"
></div>
</li>
<li
v-once
class="staff"
>
{{ $t('tierStaff') }}
<div
class="svg-icon staff-icon"
v-html="icons.tierStaff"
></div>
</li>
<li
v-once
class="npc"
>
{{ $t('tierNPC') }}
<div
class="svg-icon npc-icon"
v-html="icons.tierNPC"
></div>
</li>
</ul>
</div>
</div>
</sidebar-section>
</div>
</div>
</div>
</template>
<style lang='scss' scoped>
@import '@/assets/scss/colors.scss';
h1 {
color: $purple-200;
}
.sidebar {
background-color: $gray-600;
padding: 0em;
}
.pause-button {
background-color: #ffb445 !important;
color: $white;
width: 100%;
}
.grassy-meadow-backdrop {
background-repeat: repeat-x;
width: 100%;
height: 246px;
}
.daniel_front {
height: 246px;
width: 471px;
background-repeat: no-repeat;
margin: 0 auto;
}
.svg-icon {
width: 10px;
display: inline-block;
margin-left: .5em;
}
.tier1-icon, .tier2-icon {
width: 11px;
}
.tier5-icon, .tier6-icon {
width: 8px;
}
.tier7-icon {
width: 12px;
}
.mod-icon {
width: 13px;
}
.npc-icon {
width: 8px;
}
.boss-icon {
width: 16px;
margin-top: .1em;
margin-left: 0;
}
.boss-icon-large {
width: 48px;
}
.staff {
margin-bottom: 1em;
.staff-icon {
width: 11px;
}
.title {
color: #6133b4;
font-weight: bold;
display: inline-block;
}
}
.tier-list {
list-style-type: none;
padding: 0;
width: 98%;
li {
border-radius: 2px;
background-color: #edecee;
border: solid 1px #c3c0c7;
text-align: center;
padding: 1em;
margin-bottom: 1em;
font-weight: bold;
}
.tier1 {
color: #c42870;
}
.tier2 {
color: #b01515;
}
.tier3 {
color: #d70e14;
}
.tier4 {
color: #c24d00;
}
.tier5 {
color: #9e650f;
}
.tier6 {
color: #2b8363;
}
.tier7 {
color: #167e87;
}
.tier8, .moderator {
color: #277eab;
}
.tier9, .staff {
color: #6133b4;
}
.npc {
color: $black;
}
}
.staff .title {
color: #6133b4;
}
.moderator .title {
color: #277eab;
}
.bailey .title {
color: $black;
}
.boss-section {
padding: 1.75em;
}
.world-boss {
color: $white;
border-style: solid;
border-width: 2px;
outline-style: solid;
outline-width: 2px;
margin: 2px;
position: relative;
}
.quest-boss {
margin: 1em auto;
}
.grey-progress-bar {
width: 100%;
height: 15px;
background-color: rgba(255, 255, 255, 0.24);
border-radius: 2px;
}
.boss-health-bar {
width: 80%;
height: 15px;
margin-bottom: .5em;
border-top-left-radius: 2px;
border-bottom-left-radius: 2px;
background-color: #f74e52;
}
.boss-health-bar.rage-bar {
background-color: #ff944c;
}
.boss-gradient {
background-image: linear-gradient(to bottom, #401f2a, #931f4d);
margin-top: -1.4em;
}
.boss-description {
border-top: 1px solid;
margin-left: -16px;
margin-right: -16px;
padding: .25em 0 0 .25em;
}
.float-bar {
position: relative;
top: -16px;
width: 162px;
height: 28px;
border-radius: 2px;
background-color: inherit;
margin: auto;
}
.corner-decoration {
position: absolute;
width: 6px;
height: 6px;
background-color: inherit;
border: inherit;
outline: inherit;
}
.reverse {
transform: rotate(180deg);
}
.diamond {
margin: auto;
display: inline-block;
width: 6px;
height: 6px;
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg);
background-color: #dc4069;
border: solid 2px #931f4d;
}
.reduce {
font-size: 12px;
}
.rage-strike {
max-width: 50px;
height: auto;
}
.rage-strike-active {
max-width: 75px;
height: auto;
cursor: pointer;
}
.world-boss-info-button {
width: 100%;
background-color: $gray-500;
border-radius: 2px;
font-size: 14px;
color: $blue-10;
padding: 1em;
cursor: pointer;
}
</style>
<script>
import find from 'lodash/find';
import { TAVERN_ID } from '@/../../common/script/constants';
import * as quests from '@/../../common/script/content/quests';
import { mapState } from '@/libs/store';
import { goToModForm } from '@/libs/modform';
import worldBossInfoModal from '../world-boss/worldBossInfoModal';
import worldBossRageModal from '../world-boss/worldBossRageModal';
import sidebarSection from '../sidebarSection';
import chat from './chat';
import challengeIcon from '@/assets/svg/challenge.svg?raw';
import chevronIcon from '@/assets/svg/chevron-red.svg?raw';
import gemIcon from '@/assets/svg/gem.svg?raw';
import healthIcon from '@/assets/svg/health.svg?raw';
import informationIconRed from '@/assets/svg/information-red.svg?raw';
import questBackground from '@/assets/svg/quest-background-border.svg?raw';
import rageIcon from '@/assets/svg/rage.svg?raw';
import swordIcon from '@/assets/svg/sword.svg?raw';
import tier1 from '@/assets/svg/tier-1.svg?raw';
import tier2 from '@/assets/svg/tier-2.svg?raw';
import tier3 from '@/assets/svg/tier-3.svg?raw';
import tier4 from '@/assets/svg/tier-4.svg?raw';
import tier5 from '@/assets/svg/tier-5.svg?raw';
import tier6 from '@/assets/svg/tier-6.svg?raw';
import tier7 from '@/assets/svg/tier-7.svg?raw';
import tierMod from '@/assets/svg/tier-mod.svg?raw';
import tierNPC from '@/assets/svg/tier-npc.svg?raw';
import tierStaff from '@/assets/svg/tier-staff.svg?raw';
import staffList from '../../libs/staffList';
import reportBug from '@/mixins/reportBug.js';
export default {
components: {
worldBossInfoModal,
worldBossRageModal,
sidebarSection,
chat,
},
mixins: [reportBug],
data () {
return {
groupId: TAVERN_ID,
icons: Object.freeze({
challengeIcon,
chevronIcon,
gem: gemIcon,
healthIcon,
informationIcon: informationIconRed,
questBackground,
rageIcon,
swordIcon,
tier1,
tier2,
tier3,
tier4,
tier5,
tier6,
tier7,
tierMod,
tierNPC,
tierStaff,
}),
group: {
chat: [],
},
sections: {
worldBoss: true,
},
staff: staffList,
};
},
computed: {
...mapState({
user: 'user.data',
currentEventList: 'worldState.data.currentEventList',
}),
questData () {
if (!this.group.quest) return {};
return quests.quests[this.group.quest.key];
},
imageURLs () {
const currentEvent = find(this.currentEventList, event => Boolean(event.season));
if (!currentEvent) {
return {
background: 'url(/static/npc/normal/tavern_background.png)',
npc: 'url(/static/npc/normal/tavern_npc.png)',
};
}
return {
background: `url(/static/npc/${currentEvent.season}/tavern_background.png)`,
npc: `url(/static/npc/${currentEvent.season}/tavern_npc.png)`,
};
},
},
async mounted () {
this.$store.dispatch('common:setTitle', {
subSection: this.$t('tavern'),
section: this.$t('guilds'),
});
this.group = await this.$store.dispatch('guilds:getGroup', { groupId: TAVERN_ID });
},
methods: {
modForm () {
goToModForm(this.user);
},
toggleSleep () {
this.$store.dispatch('user:sleep');
},
pendingDamage () {
if (!this.user.party.quest.progress.up) return 0;
return this.$options.filters.floor(this.user.party.quest.progress.up, 10);
// keep user's pending damage consistent with how it's displayed on the party page
},
bossCurrentHealth () {
if (!this.group.quest.progress.hp) return 0;
return Math.ceil(parseFloat(this.group.quest.progress.hp)).toLocaleString();
},
bossCurrentRage () {
if (!this.group.quest.progress.hp) return 0;
return Math.floor(parseFloat(this.group.quest.progress.rage)).toLocaleString();
},
showWorldBossInfo () {
this.$root.$emit('bv::show::modal', 'world-boss-info');
},
showWorldBossRage (npc) {
if (this.group.quest.extra.worldDmg[npc]) {
this.$store.state.rageModalOptions.npc = npc;
this.$root.$emit('bv::show::modal', 'world-boss-rage');
}
},
async fetchRecentMessages () {
this.group = await this.$store.dispatch('guilds:getGroup', { groupId: TAVERN_ID });
},
},
};
</script>
@@ -3,7 +3,7 @@
<div class="row standard-page">
<small
class="muted"
v-html="$t('blurbHallContributors')"
v-html="$t('blurbHallContributors', hallLinks)"
></small>
</div>
<div class="row standard-page">
@@ -68,6 +68,7 @@
<a
href="https://habitica.fandom.com/wiki/Contributor_Rewards"
target="_blank"
rel="noopener noreferrer"
>More details</a>
</small>
</div>
@@ -296,6 +297,7 @@
<div
v-markdown="hero.contributor.contributions"
target="_blank"
rel="noopener noreferrer"
></div>
</td>
</tr>
@@ -360,6 +362,12 @@ export default {
expandItems: false,
expandAuth: false,
expandTransactions: false,
hallLinks: {
linkRewards: '<a href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards" target="_blank" rel="noreferrer noopener">',
linkTiers: '<a href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tiers" target="_blank" rel="noreferrer noopener">',
linkContributing: '<a href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
async mounted () {
@@ -1,64 +0,0 @@
<template>
<base-banner
v-if="showChatWarning"
banner-id="chat-warning"
banner-class="chat-banner"
class="chat-banner"
height="3rem"
:class="{faq: faqPage}"
>
<div
slot="content"
class="w-100 text-center"
v-html="$t('chatSunsetWarning')"
>
</div>
</base-banner>
</template>
<style lang="scss">
@import '@/assets/scss/colors.scss';
.chat-banner {
width: 100%;
min-height: 48px;
padding: 8px;
color: $orange-1;
background-color: $orange-100;
line-height: 1.71;
a {
color: $orange-1;
text-decoration: underline;
&:hover {
color: $orange-1;
}
}
&.faq {
position: fixed;
top: 3.5rem;
}
}
</style>
<script>
import BaseBanner from './base';
export default {
components: {
BaseBanner,
},
computed: {
faqPage () {
return (this.$route.fullPath.indexOf('/faq')) !== -1;
},
showChatWarning () {
return false;
},
},
};
</script>
@@ -6,7 +6,7 @@
>
<p
class="mr-3 mb-0"
v-html="$t('privacyOverview') + ' ' + $t('learnMorePrivacy')"
v-html="$t('privacyOverview') + ' ' + $t('learnMorePrivacy', learnLinks)"
>
</p>
<div
@@ -89,6 +89,10 @@ export default {
data () {
return {
hidden: false,
learnLinks: {
linkOpen: '<a href="/static/privacy" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
mounted () {
@@ -310,6 +310,7 @@
<a
class="topbar-dropdown-item dropdown-item"
target="_blank"
rel="noopener noreferrer"
@click.prevent="openBugReportModal()"
>
{{ $t('reportBug') }}
@@ -317,6 +318,7 @@
<a
class="topbar-dropdown-item dropdown-item"
target="_blank"
rel="noopener noreferrer"
@click.prevent="openBugReportModal(true)"
>
{{ $t('askQuestion') }}
@@ -325,6 +327,7 @@
class="topbar-dropdown-item dropdown-item"
href="https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link"
target="_blank"
rel="noopener noreferrer"
>{{ $t('requestFeature') }}</a>
</div>
</li>
@@ -377,6 +380,7 @@
v-if="hasPermission(user, 'news')"
class="topbar-dropdown-item dropdown-item"
target="_blank"
rel="noopener noreferrer"
href="https://panel.habitica.com"
>
{{ $t('newsroom') }}
@@ -6,11 +6,7 @@
>
<div slot="content">
<div
v-html="$t('invitedToPartyBy', {
userId: notification.data.inviter,
userName: invitingUser.auth ? invitingUser.auth.local.username : null,
party: notification.data.name,
})"
v-html="$t('invitedToPartyBy', invitationInfo)"
>
</div>
<div class="notifications-buttons">
@@ -60,6 +56,10 @@ export default {
},
computed: {
...mapState({ user: 'user.data' }),
invitationInfo: {
usernameLink: `<a href="/profile/${this.notification.data.inviter}" target="_blank" rel="noreferrer noopener">@${this.invitingUser.auth ? this.invitingUser.auth.local.username : null}</a>`,
partyName: `<span class="notification-bold">${this.notification.data.name}</span>`,
},
},
async mounted () {
this.invitingUser = await this.$store.dispatch('members:fetchMember', {
@@ -139,8 +139,8 @@ export default {
mixins: [notifications, userStateMixin],
data () {
const abuseFlagModalBody = {
firstLinkStart: '<a href="/static/community-guidelines" target="_blank">',
secondLinkStart: '<a href="/static/terms" target="_blank">',
firstLinkStart: '<a href="/static/community-guidelines" target="_blank" rel="noopener noreferrer">',
secondLinkStart: '<a href="/static/terms" target="_blank" rel="noopener noreferrer">',
linkEnd: '</a>',
};
@@ -197,7 +197,7 @@ export default {
},
amazonPayments: {},
assistanceEmailObject: {
hrefTechAssistanceEmail: `<a href="mailto:${TECH_ASSISTANCE_EMAIL}">${TECH_ASSISTANCE_EMAIL}</a>`,
techAssistanceEmail: `<a href="mailto:${TECH_ASSISTANCE_EMAIL}">${TECH_ASSISTANCE_EMAIL}</a>`,
},
sendingInProgress: false,
userReceivingGems: null,
@@ -67,6 +67,7 @@
<a
href="/static/privacy"
target="_blank"
rel="noopener noreferrer"
>
{{ $t('habiticaPrivacyPolicy') }}
</a>
@@ -399,7 +399,7 @@
</div>
<div
v-if="!hasGroupPlan && !canCancelSubscription"
v-html="$t(`cancelSubInfo${user.purchased.plan.paymentMethod}`)"
v-html="$t(`cancelSubInfo${user.purchased.plan.paymentMethod}`, cancelLinks)"
>
</div>
</div>
@@ -1022,6 +1022,17 @@ export default {
return nextHourglassMonth;
},
cancelLinks () {
const links = {
linkClose: '</a>',
};
if (this.user.purchased.plan.paymentMethod === this.paymentMethods.GOOGLE) {
links.linkOpen = '<a href="https://play.google.com/store/account/subscriptions" target="_blank" rel="noopener noreferrer">';
} else if (this.user.purchased.plan.paymentMethod === this.paymentMethods.APPLE) {
links.linkOpen = '<a href="https://support.apple.com/en-us/HT202039" target="_blank" rel="noopener noreferrer">';
}
return links;
},
},
mounted () {
this.$store.dispatch('common:setTitle', {
@@ -18,7 +18,7 @@
</h2>
<p
class="text-center"
v-html="$t('usernameInfo')"
v-html="$t('usernameInfo', usernameLinks)"
></p>
<username-form />
<div class="scene_veteran_pets center-block"></div>
@@ -27,7 +27,7 @@
</div>
<div
class="small text-center tos-footer"
v-html="$t('usernameTOSRequirements')"
v-html="$t('usernameTOSRequirements', requirementsLinks)"
></div>
</b-modal>
</template>
@@ -94,6 +94,15 @@ export default {
icons: Object.freeze({
helloNametag,
}),
usernameLinks: {
linkOpen: '<a href="https://habitica.fandom.com/wiki/Player_Names" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
requirementsLinks: {
termsLink: '<a href="/static/terms" target="_blank" rel="noreferrer noopener">',
guidelinesLink: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
};
@@ -157,7 +157,7 @@
<div
class="contact mx-auto"
>
<p v-html="$t('contactAdmin')"></p>
<p v-html="$t('contactAdmin', { adminEmail })"></p>
</div>
</div>
</div>
@@ -368,6 +368,7 @@ export default {
pixel_border: 'url(/static/npc/normal/pixel_border.png)',
},
staff: staffList,
adminEmail: '<a href="mailto:admin@habitica.com" target="_blank" rel="noreferrer noopener">admin@habitica.com</a>',
};
},
};
@@ -33,8 +33,9 @@
class="drawer-help-text"
href="/static/faq#pet-foods"
target="_blank"
rel="noopener noreferrer"
>
<span>{{ $t('petLikeToEat') }}</span>
<span>{{ $t('petLikeToEat', eatLinks) }}</span>
</a>
</div>
</drawer-header-tabs>
@@ -114,6 +115,10 @@ export default {
},
],
selectedDrawerTab: this.defaultSelectedTab,
eatLinks: {
linkOpen: '<a href="/static/faq#pet-foods" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -162,6 +162,10 @@ export default {
searchTextThrottled: null,
unfilteredCategories: [],
viewOptions: {},
customizeLinks: {
linkOpen: '<a href="">',
linkClose: '</a>',
},
};
},
computed: {
@@ -264,21 +268,21 @@ export default {
const { $t } = this;
switch (identifier) {
case 'animalEars':
return $t('allCustomizationsOwned');
return $t('allCustomizationsOwned', this.customizeLinks);
case 'animalTails':
return $t('allCustomizationsOwned');
return $t('allCustomizationsOwned', this.customizeLinks);
case 'backgrounds':
return `${$t('allCustomizationsOwned')} ${$t('checkNextMonth')}`;
return `${$t('allCustomizationsOwned', this.customizeLinks)} ${$t('checkNextMonth')}`;
case 'facialHair':
return $t('allCustomizationsOwned');
return $t('allCustomizationsOwned', this.customizeLinks);
case 'color':
return `${$t('allCustomizationsOwned')} ${$t('checkNextSeason')}`;
return `${$t('allCustomizationsOwned', this.customizeLinks)} ${$t('checkNextSeason')}`;
case 'base':
return $t('allCustomizationsOwned');
return $t('allCustomizationsOwned', this.customizeLinks);
case 'shirt':
return $t('allCustomizationsOwned');
return $t('allCustomizationsOwned', this.customizeLinks);
case 'skin':
return `${$t('allCustomizationsOwned')} ${$t('checkNextSeason')}`;
return `${$t('allCustomizationsOwned', this.customizeLinks)} ${$t('checkNextSeason')}`;
default:
return `Unknown identifier ${identifier}`;
}
@@ -136,7 +136,7 @@
:item-margin="24"
:type="category.identifier"
:fold-button="false"
:no-items-label="$t('allEquipmentOwned')"
:no-items-label="$t('allEquipmentOwned', equipmentLinks)"
:click-handler="false"
>
<template
@@ -229,29 +229,25 @@ export default {
data () {
return {
viewOptions: {},
searchText: null,
searchTextThrottled: null,
icons: Object.freeze({
hourglass: svgHourglass,
}),
sortItemsBy: ['AZ', 'sortByNumber'],
selectedSortItemsBy: 'AZ',
selectedItemToBuy: null,
hidePinned: false,
backgroundUpdate: new Date(),
currentEvent: null,
imageURLs: {
background: '',
npc: '',
},
equipmentLinks: {
linkOpen: '<a href="/inventory/equipment">',
linkClose: '</a>',
},
};
},
computed: {
@@ -107,7 +107,7 @@
<div class="body-text">
<p v-html="$t('sunsetFaqPara12')"></p>
<p v-html="$t('sunsetFaqPara13')"></p>
<p v-html="$t('sunsetFaqPara14')"></p>
<p v-html="$t('sunsetFaqPara14', translationLinks)"></p>
<p v-html="$t('sunsetFaqPara15')"></p>
<p v-html="$t('sunsetFaqPara16')"></p>
<p v-html="$t('sunsetFaqPara17')"></p>
@@ -138,9 +138,9 @@
</div>
<div class="body-text">
<ul>
<li v-html="$t('sunsetFaqList8')"></li>
<li v-html="$t('sunsetFaqList9')"></li>
<li v-html="$t('sunsetFaqList10')"></li>
<li v-html="$t('sunsetFaqList8', faqLinks)"></li>
<li v-html="$t('sunsetFaqList9', beginnerLinks)"></li>
<li v-html="$t('sunsetFaqList10', { adminEmail })"></li>
</ul>
</div>
@@ -169,6 +169,23 @@ export default {
components: {
FaqSidebar,
},
data () {
return {
adminEmail: '<a href="mailto:admin@habitica.com" target="_blank" rel="noreferrer noopener">admin@habitica.com</a>',
translationLinks: {
linkOpen: '<a href="https://translate.habitica.com/projects/habitica/#information">',
linkClose: '</a>',
},
faqLinks: {
linkOpen: '<a href="https://habitica.com/static/faq">',
linkClose: '</a>',
},
beginnerLinks: {
linkOpen: '<a href="https://habitica.wordpress.com/beginning-adventurers-guide/">',
linkClose: '</a>',
},
};
},
mounted () {
this.$store.dispatch('common:setTitle', {
section: this.$t('sunsetFaqTitle'),
@@ -33,11 +33,11 @@ export default {
data () {
return {
localStorageTryFirst: {
linkStart: '<a href="/user/settings/site" target="_blank">',
linkStart: '<a href="/user/settings/site" target="_blank" rel="noopener noreferrer">',
linkEnd: '</a>',
},
localStorageTryNext: {
linkStart: '<a href="https://github.com/HabitRPG/habitica/issues/2760" target="_blank">',
linkStart: '<a href="https://github.com/HabitRPG/habitica/issues/2760" target="_blank" rel="noopener noreferrer">',
linkEnd: '</a>',
},
};
@@ -24,11 +24,11 @@
<ul>
<li><strong>{{ $t('commGuideList01A') }}</strong></li>
<li v-html="$t('commGuideList02C')"></li>
<li v-html="$t('commGuideList02N')"></li>
<li v-html="$t('commGuideList02N', { adminEmail })"></li>
<li v-html="$t('commGuideList02H')"></li>
<li v-html="$t('commGuideList02A')"></li>
<li v-html="$t('commGuideList02I')"></li>
<li v-html="$t('commGuideList02G')"></li>
<li v-html="$t('commGuideList02G', { adminEmail })"></li>
<li v-html="$t('commGuideList02D')"></li>
<li v-html="$t('commGuideList02E')"></li>
<li v-html="$t('commGuideList02O')"></li>
@@ -36,7 +36,7 @@
<li v-html="$t('commGuideList02P')"></li>
<li v-html="$t('commGuideList02Q')"></li>
<li v-html="$t('commGuideList02M')"></li>
<li v-html="$t('commGuideList02L')"></li>
<li v-html="$t('commGuideList02L', { adminEmail })"></li>
<li v-html="$t('commGuideList02J')"></li>
<li v-html="$t('commGuideList02K')"></li>
</ul>
@@ -69,7 +69,7 @@
<p v-html="$t('commGuidePara054')"></p>
<p v-html="$t('commGuidePara055')"></p>
<ul>
<li v-html="$t('commGuideList06A')"></li>
<li v-html="$t('commGuideList06A', { adminEmail })"></li>
<li v-html="$t('commGuideList06C')"></li>
<li v-html="$t('commGuideList06E')"></li>
</ul>
@@ -108,7 +108,7 @@
class="mb-3"
>
<p v-html="$t('commGuidePara061')"></p>
<p v-html="$t('commGuidePara063')"></p>
<p v-html="$t('commGuidePara063', { adminEmail })"></p>
<h2 id="meet-the-mods">
{{ $t('commGuideHeadingMeet') }}
</h2>
@@ -162,15 +162,15 @@
<h2 id="final">
{{ $t('commGuideHeadingFinal') }}
</h2>
<p v-html="$t('commGuidePara067')"></p>
<p v-html="$t('commGuidePara067', { adminEmail })"></p>
<p v-html="$t('commGuidePara068')"></p>
<h2 id="links">
{{ $t('commGuideHeadingLinks') }}
</h2>
<ul>
<li><a href="/static/faq">{{ $t('faq') }}</a></li>
<li v-html="$t('commGuideLink03')"></li>
<li v-html="$t('commGuideLink04')"></li>
<li v-html="$t('commGuideLink03', gitHubLinks)"></li>
<li v-html="$t('commGuideLink04', feedbackLinks)"></li>
</ul>
<p v-html="$t('commGuidePara069')"></p>
<ul>
@@ -187,3 +187,23 @@
</ul>
</div>
</template>
<script>
export default {
data () {
return {
adminEmail: '<a href="mailto:admin@habitica.com" target="_blank" rel="noreferrer noopener">admin@habitica.com</a>',
gitHubLinks: {
linkOpen: '<a href="https://github.com/HabitRPG/habitica" target="_blank">',
linkClose: '</a>',
},
feedbackLinks: {
linkOpen: '<a href="https://habitica.fandom.com/wiki/Habitica_Wiki" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
};
</script>
@@ -11,6 +11,7 @@
<br>
<a
target="_blank"
rel="noopener noreferrer"
@click.prevent="openBugReportModal()"
>
{{ $t('reportBug') }}
@@ -135,7 +135,7 @@
</h2>
<p
class="purple-600"
v-html="$t('checkGroupPlanFAQ')"
v-html="$t('checkGroupPlanFAQ', faqLinks)"
></p>
</div>
</div>
@@ -329,6 +329,10 @@ export default {
modalOption: '',
modalPage: 'account',
modalTitle: this.$t('register'),
faqLinks: {
linkOpen: '<a href="/static/faq#what-is-group-plan">',
linkClose: '</a>',
},
};
},
computed: {
@@ -47,6 +47,7 @@
class="nav-link"
href="https://habitica.wordpress.com/"
target="_blank"
rel="noopener noreferrer"
>{{ $t('companyBlog') }}</a>
</li>
<li class="nav-item">
@@ -54,6 +55,7 @@
class="nav-link"
href="https://blog.habitrpg.com/"
target="_blank"
rel="noopener noreferrer"
>{{ $t('tumblr') }}</a>
</li>
<router-link
@@ -6,7 +6,11 @@
<noscript class="banner">
{{ $t('jsDisabledHeadingFull') }}
<br />
<a href="https://www.enable-javascript.com/" target="_blank">{{ $t('jsDisabledLink') }}</a>
<a
href="https://www.enable-javascript.com/"
target="_blank"
rel="noopener noreferrer"
>{{ $t('jsDisabledLink') }}</a>
</noscript>
<privacy-banner
class="privacy-banner"
@@ -254,12 +258,14 @@
class="app svg-icon"
href="https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica"
target="_blank"
rel="noopener noreferrer"
v-html="icons.googlePlay"
></a>
<a
class="app svg-icon"
href="https://itunes.apple.com/us/app/habitica-gamified-task-manager/id994882113?mt=8"
target="_blank"
rel="noopener noreferrer"
v-html="icons.iosAppStore"
></a>
</div>
@@ -13,9 +13,10 @@
<hr>
</div>
<p>
<span v-html="$t('overviewQuestionsRevised')"></span>
<span v-html="$t('overviewQuestionsRevised', overviewLinks)"></span>
<a
target="_blank"
rel="noopener noreferrer"
@click.prevent="openBugReportModal(true)"
>
{{ $t('askQuestion') }}
@@ -57,6 +58,10 @@ export default {
shopUrl: '/shops/market',
},
},
overviewLinks: {
linkOpen: '<a href="/static/faq">',
linkClose: '</a>',
},
};
},
};
@@ -100,9 +100,11 @@
We use Google Analytics, a service which uses cookies to collect and analyze data about the use of the Services and report on activities and trends. This service may also collect data about the use of other websites, apps, and online services. You can <a
href="https://policies.google.com/technologies/partner-sites"
target="_blank"
rel="noopener noreferrer"
>learn about</a> Google's practices, and opt out of them, by downloading the <a
href="https://tools.google.com/dlpage/gaoptout"
target="_blank"
rel="noopener noreferrer"
>Google Analytics opt-out browser add-on</a>.
</p>
<h4>Controlling Cookies</h4>
@@ -687,6 +689,7 @@
<em>Opt - Out of the Sale of Personal Information or Use of Such Information for Targeted Advertising or Profiling</em>. We engage in common marketing and advertising practices to provide more relevant content and ads to users of our Site and Services. Certain of these practices may involve the selling of personal information, or the use of such information for targeted advertising or profiling, as those terms are defined in the Texas Data Privacy and Security Act (TDPSA) and the Nebraska Data Privacy Act. We do not sell personal information under the more commonly understood meaning of that wordi.e., providing personal information to third parties in exchange for money. Nor do we have actual knowledge of selling personal information of minors under the age of 16. To opt-out of the selling of your personal information, or use of that information for targeted advertising or profiling, please submit a request to <a href="mailto:privacy@habitica.com">privacy@habitica.com</a>. Note: We also treat Global Privacy Control browser signals as opt-out of sale/disclosure for targeted advertising or profiling requests. To opt-out via the Global Privacy Control, please follow the instructions available <a
href="https://globalprivacycontrol.org/"
target="_blank"
rel="noopener noreferrer"
>here</a>.
</p>
<p>
@@ -730,12 +733,15 @@
<strong>Right to lodge a complaint:</strong> Users that reside in the UK, EEA, or Switzerland have the right to seek information and assistance or lodge a complaint about our data collection and processing actions with the supervisory authority where they reside. Contact details for data protection authorities are available here. UK: <a
href="https://ico.org.uk/"
target="_blank"
rel="noopener noreferrer"
>https://ico.org.uk/</a> EEA: <a
href="https://edpb.europa.eu/about-edpb/board/members_en"
target="_blank"
rel="noopener noreferrer"
>https://edpb.europa.eu/about-edpb/board/members_en</a> Switzerland: <a
href="https//www.edoeb.admin.ch/edoeb/en/home/deredoeb/kontakt.html"
target="_blank"
rel="noopener noreferrer"
>https//www.edoeb.admin.ch/edoeb/en/home/deredoeb/kontakt.html</a>.
</p>
<p>
@@ -244,13 +244,11 @@
<script>
import AppFooter from '@/components/appFooter';
import ChatBanner from '@/components/header/banners/chatBanner';
import StaticHeader from './header.vue';
export default {
components: {
AppFooter,
ChatBanner,
StaticHeader,
},
computed: {
@@ -10,6 +10,7 @@
Our Service is provided by HabitRPG, Inc. ("HabitRPG"). By accepting these Terms of Service and our Privacy Policy located at: <a
href="https://habitica.com/static/privacy"
target="_blank"
rel="noopener noreferrer"
>https://habitica.com/static/privacy</a> (collectively, the "Agreement"), using our website, Habitica.com, or our other features or services (collectively, the Services), or otherwise manifesting your assent to the Agreement, you acknowledge that you have read, understood, and agree to be legally bound by the Agreement. If you do not agree to (or cannot comply with) the Agreement, you are not permitted to access or use the Service. By accepting or agreeing to this Agreement on behalf of a company or other legal entity, you represent and warrant that you have the authority to bind that company or other legal entity to the Agreement and, in such event, "you" and "your" will refer and apply to that company or other legal entity. You further represent and warrant that your assent to this Agreement constitutes an electronic signature as defined by the Electronic Signatures in Global and National Commerce Act (E-Sign) and the Uniform Electronic Transactions Act (UETA) and that you have formed, executed, entered into, and accepted the terms of and otherwise authenticated the Agreement and acknowledged and agreed that the Agreement is an electronic record for purposes of E- Sign, UETA, and the Uniform Computer Information Transactions Act and, as such, is completely valid, has legal effect, is enforceable, and is binding on, and non- refutable by, you and/or any entity on whose behalf you are acting.
</p>
<p class="strong">
@@ -164,6 +165,7 @@
FOR ANY CUSTOMER WHO PURCHASED PREMIUM IN APPLE INC.'s APP STORE ("APP STORE"), PLEASE CONTACT APPLE INC.'s SUPPORT TEAM: <a
href="https://reportaproblem.apple.com"
target="_blank"
rel="noopener noreferrer"
>https://reportaproblem.apple.com</a>. APPLE'S APP STORE DOES NOT ALLOW DEVELOPERS TO ISSUE REFUNDS FOR APP STORE PURCHASES MADE BY CUSTOMERS.
</p>
@@ -204,6 +206,7 @@
All disputes will be resolved before a neutral arbitrator selected jointly by the parties, whose decision will be final, except for a limited right of appeal under the FAA. The arbitration shall be commenced and conducted by JAMS pursuant to its then current Comprehensive Arbitration Rules and Procedures and in accordance with the Expedited Procedures in those rules, or, where appropriate, pursuant to JAMS' Streamlined Arbitration Rules and Procedures. All applicable JAMS rules and procedures are available at the JAMS website <a
href="https://www.jamsadr.com"
target="_blank"
rel="noopener noreferrer"
>www.jamsadr.com</a>. Each party will be responsible for paying any JAMS filing, administrative, and arbitrator fees in accordance with JAMS rules. Judgment on the arbitrator's award may be entered in any court having jurisdiction. This clause shall not preclude parties from seeking provisional remedies in aid of arbitration from a court of appropriate jurisdiction. The arbitration may be conducted in person, through the submission of documents, by phone, or online. If conducted in person, the arbitration shall take place in the United States county where you reside. The parties may litigate in court to compel arbitration, to stay a proceeding pending arbitration, or to confirm, modify, vacate, or enter judgment on the award entered by the arbitrator. The parties shall cooperate in good faith in the voluntary and informal exchange of all non-privileged documents and other information (including electronically stored information) relevant to the Dispute immediately after commencement of the arbitration. As set forth below, nothing in this Agreement will prevent us from seeking injunctive relief in any court of competent jurisdiction as necessary to protect our proprietary interests.
</p>
<p>
+5 -17
View File
@@ -13,6 +13,8 @@
}, `type_${task.type}`
]"
@click="castEnd($event, task)"
tabindex="0"
@keypress.enter="$emit('editTask', task)"
>
<div
class="d-flex"
@@ -98,9 +100,7 @@
<div
class="task-clickable-area pt-1 pl-75 pb-0"
:class="{ 'cursor-auto': !teamManagerAccess }"
tabindex="0"
@click="edit($event, task)"
@keypress.enter="edit($event, task)"
>
<div class="d-flex justify-content-between">
<h3
@@ -432,10 +432,6 @@
outline: none;
transition: none;
border: $purple-400 solid 1px;
:not(task-best-control-inner-habit) { // round icon
border-radius: 4px;
}
}
.control-bottom-box {
@@ -462,16 +458,13 @@
&:hover:not(.task-not-editable.task-not-scoreable),
&:focus-within:not(.task-not-editable.task-not-scoreable) {
box-shadow: 0 1px 8px 0 rgba($black, 0.12), 0 4px 4px 0 rgba($black, 0.16);
z-index: 11;
}
}
.task:not(.groupTask) {
&:hover,
&:focus-within {
.left-control, .right-control, .task-content {
border-color: $purple-400;
}
&:hover, &:focus {
border: none;
outline: 1px solid $purple-400;
}
}
@@ -522,11 +515,6 @@
&-user {
padding-right: 0px;
}
&:focus {
border-radius: 4px;
border: $purple-400 solid 1px;
}
}
.task-title + .task-dropdown ::v-deep .dropdown-menu {
@@ -412,6 +412,25 @@
</div>
</div>
</div>
<p
v-if="task.type === 'daily' && schedulingSummary"
class="scheduling-summary mt-2 mb-0"
>
{{ schedulingSummary }}
</p>
<div
v-if="task.type === 'daily' && schedulingWarning"
class="scheduling-warning mt-2"
>
<span
class="scheduling-warning-icon svg-icon color gray-50"
v-html="icons.alert"
></span>
<span
class="scheduling-warning-text"
v-html="schedulingWarning"
></span>
</div>
<div
v-if="!groupId"
class="tags-select option mt-3"
@@ -1109,6 +1128,42 @@
height: 1rem;
}
.scheduling-summary {
font-family: 'Roboto', sans-serif;
font-weight: 400;
font-style: normal;
font-size: 12px;
line-height: 16px;
color: $gray-50;
text-align: left;
}
.scheduling-warning {
display: flex;
align-items: flex-start;
font-family: 'Roboto', sans-serif;
font-weight: 400;
font-style: normal;
font-size: 12px;
line-height: 16px;
color: $gray-50;
}
.scheduling-warning-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
flex-shrink: 0;
margin-right: 6px;
margin-top: -1px;
}
.scheduling-warning-text {
flex: 1;
}
label {
display: inline-flex;
align-items: center;
@@ -1298,8 +1353,8 @@ export default {
],
calendarHighlights: { dates: [new Date()] },
spiLinkData: {
firstLink: '<a href="/static/privacy#section_1" target="_blank">',
secondLink: '<a href="/static/privacy" target="_blank">',
firstLink: '<a href="/static/privacy#section_1" target="_blank" rel="noopener noreferrer">',
secondLink: '<a href="/static/privacy" target="_blank" rel="noopener noreferrer">',
linkClose: '</a>',
},
};
@@ -1377,6 +1432,87 @@ export default {
}
return null;
},
schedulingSummary () {
if (!this.task || this.task.type !== 'daily') return '';
const { task } = this;
const everyXValue = +task.everyX;
let interval;
if (task.frequency === 'daily') {
interval = everyXValue === 1 ? this.$t('everyDay') : this.$t('everyXDays', { count: everyXValue });
} else if (task.frequency === 'weekly') {
interval = everyXValue === 1 ? this.$t('everyWeek') : this.$t('everyXWeeks', { count: everyXValue });
} else if (task.frequency === 'monthly') {
interval = everyXValue === 1 ? this.$t('everyMonth') : this.$t('everyXMonths', { count: everyXValue });
} else if (task.frequency === 'yearly') {
interval = everyXValue === 1 ? this.$t('everyYear') : this.$t('everyXYears', { count: everyXValue });
} else {
return '';
}
let details = '';
if (task.frequency === 'weekly') {
const dayNames = {
su: 'Sunday',
m: 'Monday',
t: 'Tuesday',
w: 'Wednesday',
th: 'Thursday',
f: 'Friday',
s: 'Saturday',
};
const activeDays = Object.keys(task.repeat || {}).filter(d => task.repeat[d]);
if (activeDays.length > 0) {
details = ` on ${activeDays.map(d => dayNames[d]).join(', ')}`;
}
} else if (task.frequency === 'monthly' && task.startDate) {
const dayOfMonth = moment(task.startDate).date();
if (task.weeksOfMonth && task.weeksOfMonth.length > 0) {
const weekNum = task.weeksOfMonth[0] + 1;
const weekStr = String(weekNum);
const lastDigit = weekStr.slice(-1);
let suffix = 'th';
if (lastDigit === '1' && weekStr !== '11') suffix = 'st';
if (lastDigit === '2' && weekStr !== '12') suffix = 'nd';
if (lastDigit === '3' && weekStr !== '13') suffix = 'rd';
const dayName = moment(task.startDate).format('dddd');
details = ` on the ${weekNum}${suffix} ${dayName} of the month`;
} else if (task.daysOfMonth && task.daysOfMonth.length > 0) {
const dom = task.daysOfMonth[0];
const domStr = String(dom);
const lastDigit = domStr.slice(-1);
let suffix = 'th';
if (lastDigit === '1' && domStr !== '11') suffix = 'st';
if (lastDigit === '2' && domStr !== '12') suffix = 'nd';
if (lastDigit === '3' && domStr !== '13') suffix = 'rd';
details = ` on the ${dom}${suffix}`;
} else {
const domStr = String(dayOfMonth);
const lastDigit = domStr.slice(-1);
let suffix = 'th';
if (lastDigit === '1' && domStr !== '11') suffix = 'st';
if (lastDigit === '2' && domStr !== '12') suffix = 'nd';
if (lastDigit === '3' && domStr !== '13') suffix = 'rd';
details = ` on the ${dayOfMonth}${suffix}`;
}
} else if (task.frequency === 'yearly' && task.startDate) {
details = ` on ${moment(task.startDate).format('MMMM Do')}`;
}
return `${this.$t('repeats')} ${interval}${details}`;
},
schedulingWarning () {
if (!this.task || this.task.type !== 'daily') return '';
const { task } = this;
if (task.frequency === 'monthly'
&& task.weeksOfMonth && task.weeksOfMonth.length > 0
&& task.weeksOfMonth[0] === 4
&& task.startDate) {
const dayName = moment(task.startDate).format('dddd');
return this.$t('fifthWeekWarning', { day: dayName });
}
return '';
},
repeatsOn: {
get () {
let repeatsOn = 'dayOfMonth';
@@ -222,14 +222,22 @@ export default {
return usernames;
},
summarySentence () {
let fifthWeekWarning = '';
if (this.task.type === 'daily' && this.task.frequency === 'monthly'
&& this.task.weeksOfMonth && this.task.weeksOfMonth.length > 0
&& this.task.weeksOfMonth[0] === 4) {
const activeDays = keys(pickBy(this.task.repeat, value => value === true));
const dayName = this.expandDayString[activeDays[0]];
fifthWeekWarning = ` ${this.$t('fifthWeekWarning', { day: dayName })}`;
}
if (this.task.type === 'daily' && moment().isBefore(this.task.startDate)) {
return `This is ${this.formattedDifficulty(this.task.priority)} task that will repeat
${this.formattedRepeatInterval(this.task.frequency, this.task.everyX)}${this.formattedDays(this.task.frequency, this.task.repeat, this.task.daysOfMonth, this.task.weeksOfMonth, this.task.startDate)}
starting on <strong>${moment(this.task.startDate).format('MM/DD/YYYY')}</strong>.`;
starting on <strong>${moment(this.task.startDate).format('MM/DD/YYYY')}</strong>.${fifthWeekWarning}`;
}
if (this.task.type === 'daily') {
return `This is ${this.formattedDifficulty(this.task.priority)} task that repeats
${this.formattedRepeatInterval(this.task.frequency, this.task.everyX)}${this.formattedDays(this.task.frequency, this.task.repeat, this.task.daysOfMonth, this.task.weeksOfMonth, this.task.startDate)}.`;
${this.formattedRepeatInterval(this.task.frequency, this.task.everyX)}${this.formattedDays(this.task.frequency, this.task.repeat, this.task.daysOfMonth, this.task.weeksOfMonth, this.task.startDate)}.${fifthWeekWarning}`;
}
if (this.task.date) {
return `This is ${this.formattedDifficulty(this.task.priority)} task that is due <strong>${moment(this.task.date).format('MM/DD/YYYY')}.`;
@@ -287,25 +295,14 @@ export default {
});
dayStringArray.push('</strong>');
} else if (weeksOfMonth.length > 0) {
switch (weeksOfMonth[0]) {
case 0:
dayStringArray.push('first');
break;
case 1:
dayStringArray.push('second');
break;
case 2:
dayStringArray.push('third');
break;
case 3:
dayStringArray.push('fourth');
break;
case 4:
dayStringArray.push('fifth');
break;
default:
break;
}
const weekNum = weeksOfMonth[0] + 1;
const weekNumStr = String(weekNum);
const lastDigit = weekNumStr.slice(-1);
let ordinalSuffix = 'th';
if (lastDigit === '1' && weekNumStr !== '11') ordinalSuffix = 'st';
if (lastDigit === '2' && weekNumStr !== '12') ordinalSuffix = 'nd';
if (lastDigit === '3' && weekNumStr !== '13') ordinalSuffix = 'rd';
dayStringArray.push(`${weekNum}${ordinalSuffix}`);
activeDays = keys(pickBy(repeat, value => value === true));
dayStringArray.push(` ${this.expandDayString[activeDays[0]]} of the month</strong>`);
}
@@ -343,9 +340,8 @@ export default {
if (numericX === 2) return '<strong>every other week</strong>';
return `<strong>every ${numericX} weeks</strong>`;
case 'monthly':
if (numericX === 1) return '<strong>every month</strong>';
if (numericX === 2) return '<strong>every other month</strong>';
return `<strong>every ${numericX} months</strong>`;
if (numericX === 1) return `<strong>${this.$t('everyMonth')}</strong>`;
return `<strong>${this.$t('everyXMonths', { count: numericX })}</strong>`;
case 'yearly':
if (numericX === 1) return '<strong>every year</strong>';
return `<strong>every ${everyX} years</strong>`;
@@ -68,8 +68,12 @@ export default {
},
methods: {
upDate (after) {
this.value = after;
this.$emit('update:date', after);
// zero out the time so the server doesn't shift the day across a DST boundary on save
const normalized = after
? new Date(after.getFullYear(), after.getMonth(), after.getDate())
: null;
this.value = normalized;
this.$emit('update:date', normalized);
},
setToday () {
this.upDate(moment().toDate());
@@ -377,7 +377,7 @@
<div class="">
<div
class="alert alert-info alert-sm"
v-html="$t('communityGuidelinesWarning', managerEmail)"
v-html="$t('communityGuidelinesWarning', communityGuidelineLinks)"
></div>
<!-- TODO use photo-upload instead: https://groups.google.com/forum/?fromgroups=#!topic/derbyjs/xMmADvxBOak-->
<div class="form-group">
@@ -1060,8 +1060,10 @@ export default {
blurb: '',
},
hero: {},
managerEmail: {
hrefBlankCommunityManagerEmail: `<a href="mailto:${COMMUNITY_MANAGER_EMAIL}">${COMMUNITY_MANAGER_EMAIL}</a>`,
communityGuidelineLinks: {
linkOpen: '<a href="https://habitica.com/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
adminEmail: `<a href="mailto:${COMMUNITY_MANAGER_EMAIL}" target="_blank" rel="noopener noreferrer">${COMMUNITY_MANAGER_EMAIL}</a>`,
},
selectedPage: 'profile',
achievements: {},
@@ -89,7 +89,7 @@
v-if="userLevel100Plus"
v-once
class="level-100-message"
v-html="$t('noMoreAllocate')"
v-html="$t('noMoreAllocate', allocateLinks)"
></div>
</div>
<div class="row allocation-boxes-row">
@@ -395,14 +395,12 @@ export default {
_skip: 'skip',
shield: this.$t('offHandCapitalized'),
},
allocateStatsList: {
str: { title: 'allocateStr', popover: 'strengthText', allocatepop: 'allocateStrPop' },
int: { title: 'allocateInt', popover: 'intText', allocatepop: 'allocateIntPop' },
con: { title: 'allocateCon', popover: 'conText', allocatepop: 'allocateConPop' },
per: { title: 'allocatePer', popover: 'perText', allocatepop: 'allocatePerPop' },
},
stats: {
str: {
title: 'strength',
@@ -422,6 +420,10 @@ export default {
},
},
content: Content,
allocateLinks: {
linkOpen: '<a href="/shops/market">',
linkClose: '</a>',
},
};
},
computed: {
@@ -248,7 +248,7 @@
v-if="userLevel100Plus"
v-once
>
{{ $t('noMoreAllocate') }}
{{ $t('noMoreAllocate', allocateLinks) }}
</p>
<p
v-if="user.stats.points || userLevel100Plus"
@@ -480,6 +480,10 @@ export default {
con: { title: 'allocateCon', popover: 'conText', allocatepop: 'allocateConPop' },
per: { title: 'allocatePer', popover: 'perText', allocatepop: 'allocatePerPop' },
},
allocateLinks: {
linkOpen: '<a href="/shops/market">',
linkClose: '</a>',
},
};
},
computed: {
@@ -47,6 +47,7 @@
class="footer-link"
href="https://habitica.fandom.com/wiki/World_Bosses"
target="_blank"
rel="noopener noreferrer"
>{{ $t('worldBossLink') }}</a>
</div>
</div>
+5 -1
View File
@@ -10,6 +10,10 @@ export default {
tour: {},
chapters: {},
loaded: false,
partyLinks: {
linkOpen: '<a href="/static/faq#parties">',
linkClose: '</a>',
},
};
},
watch: {
@@ -56,7 +60,7 @@ export default {
party: [[
{
orphan: true,
intro: this.$t('tourPartyPage'),
intro: this.$t('tourPartyPage', this.partyLinks),
final: true,
proceed: this.$t('tourSplendid'),
hideNavigation: true,
@@ -177,7 +177,7 @@
<div
v-once
class="guidelines flex-fill"
v-html="$t('communityGuidelinesIntro')"
v-html="$t('communityGuidelinesIntro', guidelineLinks)"
></div>
<button
class="btn btn-primary"
@@ -774,6 +774,10 @@ export default defineComponent({
messages: [],
messagesLoading: false,
MAX_MESSAGE_LENGTH: MAX_MESSAGE_LENGTH.toString(),
guidelineLinks: {
linkOpen: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -23,7 +23,7 @@
<div
class="kind-text"
v-html="$t('rememberToBeKind')"
v-html="$t('rememberToBeKind', kindLinks)"
></div>
</div>
</template>
@@ -62,6 +62,14 @@ import Avatar from '@/components/avatar.vue';
export default {
components: { Avatar },
data () {
return {
kindLinks: {
linkOpen: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
props: {
memberObj: null,
},
@@ -19,6 +19,7 @@
<router-link
to="/forgot-password"
target="_blank"
rel="noopener noreferrer"
>
{{ $t('forgotPassword') }}
</router-link>
@@ -34,7 +34,7 @@
class="dialog-disclaimer"
>
<span>{{ $t("americanEnglishGovern") }} </span>
<span v-html="$t('helpWithTranslation')"></span>
<span v-html="$t('helpWithTranslation', translateLinks)"></span>
</div>
<div class="input-area">
<div class="settings-label">
@@ -97,6 +97,10 @@ export default {
data () {
return {
selectedLanguage: '',
translateLinks: {
linkOpen: '<a href="https://translate.habitica.com" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -166,6 +166,10 @@ export default {
icons: Object.freeze({
alert,
}),
gpcLinks: {
linkOpen: '<a href="https://globalprivacycontrol.org/" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -176,11 +180,10 @@ export default {
return navigator.globalPrivacyControl;
},
gpcInfo () {
const gpcUrl = 'https://globalprivacycontrol.org/';
if (this.user.preferences.analyticsConsent) {
return this.$t('gpcPlusAnalytics', { url: gpcUrl });
return this.$t('gpcPlusAnalytics', this.gpcLinks);
}
return this.$t('gpcWarning', { url: gpcUrl });
return this.$t('gpcWarning', this.gpcLinks);
},
},
methods: {
@@ -8,7 +8,7 @@
<div
v-once
class="webhooks-info mb-3"
v-html="$t('webhooksInfo')"
v-html="$t('webhooksInfo', hookLinks)"
>
</div>
@@ -233,6 +233,10 @@ export default {
}),
webhooks: [], // view copy of state
unsaved: [],
hookLinks: {
linkOpen: '<a target="_blank" rel="noreferrer noopener" href="https://habitica.com/apidoc/#api-Webhook-AddWebhook">',
linkClose: '</a>',
},
};
},
mounted () {
-2
View File
@@ -123,7 +123,6 @@ import birthdayModal from '@/components/news/birthdayModal';
import AppMenu from '@/components/header/menu';
import AppHeader from '@/components/header/index';
import BirthdayBanner from '@/components/header/banners/birthdayBanner';
import ChatBanner from '@/components/header/banners/chatBanner';
import DamagePausedBanner from '@/components/header/banners/damagePaused';
import GemsPromoBanner from '@/components/header/banners/gemsPromo';
import GiftPromoBanner from '@/components/header/banners/giftPromo';
@@ -160,7 +159,6 @@ export default {
AppHeader,
AppFooter,
birthdayModal,
ChatBanner,
DamagePausedBanner,
GemsPromoBanner,
GiftPromoBanner,
+4
View File
@@ -121,6 +121,10 @@ export default defineConfig({
include: [/moment-recur/, /node_modules/]
},
rollupOptions: {
input: {
main: path.resolve(__dirname, 'index.html'),
faq: path.resolve(__dirname, 'index-faq.html'),
},
output: {
experimentalMinChunkSize: 20000
}
+16 -3
View File
@@ -213,7 +213,7 @@
"backgroundStormyRooftopsNotes": "Промъквайте се върху буреносни покриви.",
"backgroundWindyAutumnText": "Ветровита есен",
"backgroundWindyAutumnNotes": "Гонете листа през ветровита есен.",
"incentiveBackgrounds": "Комплект едноцветни фонове",
"incentiveBackgrounds": "Стандартни фонове",
"backgroundVioletText": "Виолетово",
"backgroundVioletNotes": "Енергичен виолетов фон.",
"backgroundBlueText": "Синьо",
@@ -494,7 +494,7 @@
"backgroundSnowglobeText": "Снежна топка",
"backgroundDesertWithSnowNotes": "Бъди свидетел на рядката и мълчалива красота на Снежната пустиня.",
"backgroundTeaPartyNotes": "Участвай в изискано Чаено парти.",
"backgroundButterflyGardenNotes": "Забавлявайте се с опрашителите в Градина на пеперудите",
"backgroundButterflyGardenNotes": "Купонясвайте с опрашители в градина за пеперуди",
"backgroundAnimalCloudsText": "Животински облаци",
"backgroundButterflyGardenText": "Градина на пеперудите",
"backgroundWinterNocturneText": "Зимен ноктюрн",
@@ -503,5 +503,18 @@
"hideLockedBackgrounds": "Скрий заключените фонове",
"backgroundSnowglobeNotes": "Разклати Снежната топка и заеми мястото си в микрокосмоса на снежния пейзаж.",
"backgroundAmongGiantFlowersText": "Сред гигантски цветя",
"backgroundAnimalCloudsNotes": "Използвай въображението си, за да намериш Животни в Облаците."
"backgroundAnimalCloudsNotes": "Използвай въображението си, за да намериш Животни в Облаците.",
"backgroundSucculentGardenNotes": "",
"backgroundSucculentGardenText": "Градина със сукуленти",
"backgroundHotAirBalloonText": "горещ въздух балон",
"backgroundHeatherFieldText": "пирен поле",
"backgroundRainyBarnyardText": "Дъждовен фермерски двор",
"backgroundRelaxationRiverText": "Релаксация Река",
"backgroundFlyingOverGlacierNotes": "",
"backgroundUnderwaterRuinsText": "Подводен Руини",
"backgroundBeachCabanaText": "Плаж Кабана",
"backgroundSaltLakeText": "Сол Езеро",
"backgroundWintryCastleText": "Зимен Замък",
"backgroundVikingShipText": "Викинг Кораб",
"backgroundCampingOutText": "Къмпинг Навън"
}
+2 -2
View File
@@ -4,7 +4,7 @@
"androidFaqStillNeedHelp": "Ако имате въпрос, който не намирате в този списък или в [ЧЗВ в уикито](http://habitica.fandom.com/wiki/FAQ), задайте го в кръчмата чрез Меню > Кръчма! Ще се радваме да помогнем.",
"webFaqStillNeedHelp": "Ако имате въпрос, който не намирате в този списък или в [ЧЗВ в уикито](http://habitica.fandom.com/wiki/FAQ), задайте го в [Помощната гилдия на Хабитика](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! Ще се радваме да помогнем.",
"webFaqAnswer28": "Да! Бутона \"Пауза на щетите\" може да се намери в Настройки. Той ще ви предпази от загуба на точки живот (HP) за пропуснати ежедневни задачи. Това е полезно, ако сте на ваканция, нуждаете се от почивка или по какъвто и да било друг повод, за който имате нужда от почивка. Ако участвате в мисия, вашето собствено неприключило напредване ще бъде спряно, но все още ще получавате щети от пропуснатите ежедневни задачи на членовете на вашата група.\n\nЗа да поставите на пауза конкретни ежедневни задачи, можете да редактирате графика им, за да се изпълняват на всеки 0 дни, докато не сте готови да ги стартирате отново.",
"webFaqAnswer32": "В Habitica има четири класа: Войн, Магьосник, Крадец и Лечител. Всички играчи започват като клас \"Войн\", докато достигнат ниво 10. След като достигнете ниво 10, ще получите възможността да изберете нов клас или да продължите като Войн.\n\nВсеки клас разполага с различни Екипировка и Умения. Ако не искате да изберете клас, можете да изберете \"Отказ\". Ако изберете да се откажете, винаги можете да активирате Класовата система от Настройки по-късно.",
"webFaqAnswer32": "Всички играчи започват като клас \"Войн\", докато достигнат ниво 10. След като достигнете ниво 10, ще получите възможността да изберете нов клас или да продължите като Войн.\n\nВсеки клас разполага с различни Екипировка и Умения. Ако не искате да изберете клас, можете да изберете \"Отказ\". Ако изберете да се откажете, винаги можете да активирате Класовата система от Настройки по-късно.\n\nАко искате да промените класа си след ниво 10, можете да го направите, като използвате Орбът на прераждането. Орбът на прераждането е достъпен в Пазара за 6 диаманта на ниво 50 или безплатен на ниво 100.\n\nСъщо така, можете да промените своя клас по всяко време от Настройки за 3 диаманта. Това няма да нулира нивото ви като Орбът на прераждането, но ще ви позволи да преразпределите точките на уменията, които сте събрали, като сте вдигнали нивото си, за да са релевантни с новия ви клас.",
"commonQuestions": "Чести въпроси",
"faqQuestion25": "Какви са различните видове задачи?",
"webFaqAnswer25": "Habitica използва три различни типа задачи, за да отговори на вашите нужди: Навици, Ежедневни и Задачи.\n\nНавиците могат да бъдат положителни или отрицателни и представляват нещо, което искате да проследявате няколко пъти на ден или според незададен график. Положителните навици ще ви наградят със злато и опит (Exp), докато отрицателните навици ще ви наказват със загуба на точки живот (HP).\n\nЕжедневните задачи са повтарящи се задачи, които искате да изпълнявате по-структурирано. Например веднъж на ден, три пъти на седмица или четири пъти на месец. Пропускането на ежедневни задачи води до загуба на HP, но колкото по-трудни са, толкова по-добри са наградите!\n\nЗадачите са еднократни задачи, за които получавате награди след като ги изпълните. Задачите могат да имат срок, но няма загуба на HP, ако го пропуснете.\n\nИзберете типа задача, който най-добре отговаря на това, което искате да постигнете!",
@@ -16,7 +16,7 @@
"faqQuestion29": "Как да възстановя загубени точки живот (HP)?",
"webFaqAnswer29": "Можете да възвърнете 15 HP, като закупите отвара от колоната си за Награди, за 25 злато. Освен това винаги ще възвърнете пълното си HP, когато качите ниво!",
"faqQuestion30": "Какво става, когато изчерпам HP?",
"webFaqAnswer30": "Ако вашите HP стигнат до нула, ще загубите едно ниво, цялото си злато и един случаен предмет, който може да бъде закупен отново.",
"webFaqAnswer30": "Ако вашето HP стигне до нула, ще загубите едно ниво, цялото си злато и един случаен предмет, който може да бъде закупен отново.",
"faqQuestion31": "Защо загубих HP при неотрицателна задача ?",
"webFaqAnswer31": "Ако завършите задача и загубите HP, когато не би трябвало, сте срещнали забавяне, докато сървърът синхронизира промените, направени на други платформи. Например, ако използвате злато, мана или загубите HP в мобилното приложение и след това завършите задача в уебсайта, сървърът просто потвърждава, че всичко е синхронизирано.",
"faqQuestion32": "Кога мога да си избера клас?",
+21 -2
View File
@@ -18,7 +18,7 @@
"resetAccPop": "Започнете отначало, премахвайки всички нива, злато, екипировка, история и задачи.",
"deleteAccount": "Изтриване на профила",
"deleteAccPop": "Изтрива и премахва Вашия профил в Хабитика.",
"feedback": "Ако искате да ни изпратите отзивите си, моля, въведете ги по-долу. Ще се радваме да научим какво Ви е харесало, или пък не, в Хабитика! Не говорите английски добре? Няма проблем! Пишете на който искате език.",
"feedback": "Ако искате да ни изпратите отзивите си, моля, въведете ги по-долу. Ще се радваме да чуем обратната ви връзка! Ще бде анонимно, освен ако не изберете да въведете контактите си. Не говорите английски добре? Няма проблем! Пишете ни на езика, който предпочитате.",
"dataExport": "Изнасяне на данни",
"saveData": "Ето няколко възможности за запазване на данните Ви.",
"habitHistory": "История на навиците",
@@ -157,5 +157,24 @@
"changeUsernameDisclaimer": "Потребителското ви име се ползва за покани, @споменавания в чата и съобщения, трябва да е от 1 до 20 символа, да съдържа само буквите от a до z, цифрите от 0 до 9, тирета или долни черти и не може да съдържа неприлични думи.",
"verifyUsernameVeteranPet": "Един от тези любимци-ветерани ще Ви чака след като приключите с потвърждението!",
"subscriptionReminders": "Абонаментни Напомняния",
"newPMNotificationTitle": "Ново съобщение от <%= name %>"
"newPMNotificationTitle": "Ново съобщение от <%= name %>",
"resetAccount": "Нулирай акаунт",
"generalSettings": "Общи настройки",
"taskSettings": "Настройки на Задачите",
"confirmCancelChanges": "Сигурни ли сте? Ще загубите незапазените промени.",
"account": "Акаунт",
"loginMethods": "Методи за Влизане",
"character": "Герой",
"siteLanguage": "Език на сайта",
"showLevelUpModal": "Когато вдигате ниво",
"showHatchPetModal": "Когато излюпвате Любимец",
"showRaisePetModal": "Когато отгледате Любимец до Оседлан Любимец",
"baileyAnnouncement": "Най-новите вести на Бейли",
"view": "Виж",
"feedbackPlaceholder": "Добавете обратна връзка",
"downloadCSV": "Изтеглете CSV",
"yourUserData": "Вашите Потребителски Данни",
"taskHistory": "История на Задачите",
"yourUserDataDisclaimer": "Тук можете да изтеглите копие на историята на задачите си или пълните си потребителски данни.",
"useridCopied": "Потребителският ID е копиран."
}
+2 -1
View File
@@ -164,5 +164,6 @@
"achievementRodentRulerModalText": "Nasbíral jsi všechny hlodavce!",
"achievementCatsText": "Vylíhly se všechny standardní barvy kočičích mazlíčků: gepard, lev, šavlozubý tygr a tygr!",
"achievementRodentRuler": "Vládce hlodavců",
"achievementCats": "Pasák koček"
"achievementCats": "Pasák koček",
"achievementDomesticated": "Hejá"
}
+62 -5
View File
@@ -117,7 +117,7 @@
"backgroundTavernNotes": "Navštiv krčmu města Habitica.",
"backgrounds102015": "Sada 17: zveřejněna v říjnu 2015",
"backgroundHarvestMoonText": "Měsíc při sklizni",
"backgroundHarvestMoonNotes": "Kdákání pod měsícem při sklizni.",
"backgroundHarvestMoonNotes": "Chechtej se pod sklizňovým měsícem.",
"backgroundSlimySwampText": "Slizká bažina",
"backgroundSlimySwampNotes": "Přebroď se slizkou bažinou.",
"backgroundSwarmingDarknessText": "Valící se temnota",
@@ -213,7 +213,7 @@
"backgroundStormyRooftopsNotes": "Propliž se přes bouřlivé střechy.",
"backgroundWindyAutumnText": "Větrný podzim",
"backgroundWindyAutumnNotes": "Hoň se za listy během větrného podzimu.",
"incentiveBackgrounds": "Prosté pozadí",
"incentiveBackgrounds": "Standardní pozadí",
"backgroundVioletText": "Fialová",
"backgroundVioletNotes": "Živá fialová tapeta.",
"backgroundBlueText": "Modrá",
@@ -736,7 +736,64 @@
"backgroundMaskMakersWorkshopNotes": "Vyzkoušej novou tvář v maskářově dílně.",
"backgroundCemeteryGateText": "Hřbitovní brána",
"backgroundCemeteryGateNotes": "Straš u hřbitovní brány.",
"backgroundAutumnBridgeText": "Podzimní most",
"backgroundAutumnBridgeNotes": "Obdivuj krásu podzimního mostu.",
"backgroundInsideACrystalText": "Uvnitř krystalu."
"backgroundAutumnBridgeText": "Most na podzim",
"backgroundAutumnBridgeNotes": "Obdivuj krásu mostu na podzim.",
"backgroundInsideACrystalText": "Uvnitř krystalu",
"backgrounds032023": "Sada 106: Zveřejněna v březnu 2023",
"backgroundOldTimeyBasketballCourtText": "Retro basketbalové hřiště",
"backgroundOldTimeyBasketballCourtNotes": "Zaházej si na koš na retro basketbalovém hřišti.",
"backgroundJungleWateringHoleText": "Napajedlo v džungli",
"backgroundJungleWateringHoleNotes": "Zastav se na doušek u džunglového napajedla.",
"backgroundMangroveForestText": "Mangrovový les",
"backgroundMangroveForestNotes": "Prozkoumej okraj mangrovového lesa.",
"backgrounds052023": "Sada 108: Zveřejněna v květnu 2023",
"backgroundInAPaintingText": "V obraze",
"backgroundFlyingOverHedgeMazeText": "Let nad labyrintem ze živého plotu",
"backgroundFlyingOverHedgeMazeNotes": "Žasněte při letu nad labyrintem ze živého plotu.",
"backgroundCretaceousForestText": "Křídový les",
"backgroundCretaceousForestNotes": "Vychutnejte si pradávnou zeleň křídového lesa.",
"backgroundLeafyTreeTunnelNotes": "Procházejte se tunelem z listnatých stromů.",
"backgroundSpringtimeShowerText": "Jarní přeháňka",
"backgroundSpringtimeShowerNotes": "Podívejte se na květnatou jarní přeháňku.",
"backgroundUnderWisteriaText": "Pod vistérií",
"backgrounds022023": "SADA 105: Vydáno v únoru 2023",
"backgroundInFrontOfFountainText": "Před Fontánou",
"backgroundInFrontOfFountainNotes": "Procházej se před Fontánou.",
"backgroundGoldenBirdcageText": "Zlatá klec",
"backgroundGoldenBirdcageNotes": "Schovej se v zlaté kleci.",
"backgroundFancyBedroomText": "Luxusní ložnice",
"backgroundFancyBedroomNotes": "Dopřej si luxus v luxusní ložnici.",
"backgrounds042023": "Sada 107: Zveřejněna v dubnu 2023",
"backgroundLeafyTreeTunnelText": "Tunel z listnatých stromů",
"backgroundUnderWisteriaNotes": "Odpočiňte si pod vistérií.",
"backgroundInAPaintingNotes": "Užijte si kreativní činnosti uvnitř obrazu.",
"backgrounds012023": "SADA 104: Vydáno v lednu 2023",
"backgroundRimeIceText": "Jinovatka",
"backgroundRimeIceNotes": "Pokochej se třpytivou jinovatkou.",
"backgroundSnowyTempleText": "Zasněžený chrám",
"backgroundSnowyTempleNotes": "Pokochej se klidným zasněženým chrámem.",
"backgroundWinterLakeWithSwansText": "Zimní jezero s labutěmi",
"backgroundWinterLakeWithSwansNotes": "Užij si přírodu u zimního jezera s labutěmi.",
"backgrounds122022": "SADA 103: Vydáno v prosinci 2022",
"backgroundBranchesOfAHolidayTreeText": "Větve svátečního stromku",
"backgroundBranchesOfAHolidayTreeNotes": "Dováděj na větvích svátečního stromku.",
"backgroundInsideACrystalNotes": "Vyhlédni z nitra krystalu.",
"backgroundSnowyVillageText": "Zasněžená vesnice",
"backgroundSnowyVillageNotes": "Pokochej se zasněženou vesnicí.",
"backgrounds062023": "Sada 109: Zveřejněna v červnu 2023",
"backgroundInAnAquariumText": "V akváriu",
"backgroundInAnAquariumNotes": "Zaplavejte si poklidně s rybkami v akváriu.",
"backgroundInsideAdventurersHideoutText": "V úkrytu dobrodruhů",
"backgroundInsideAdventurersHideoutNotes": "Naplánujte cestu v úkrytu dobrodruhů.",
"backgroundCraterLakeText": "Kráterové jezero",
"backgroundCraterLakeNotes": "Obdivujte nádherné kráterové jezero.",
"backgrounds072023": "Sada 110: Zveřejněna v červenci 2023",
"backgroundOnAPaddlewheelBoatText": "Na loďce s lopatkovým kolem",
"backgroundOnAPaddlewheelBoatNotes": "Projet se na loďce s lopatkovým kolem.",
"backgroundColorfulCoralText": "Barevný korál",
"backgroundColorfulCoralNotes": "Potopte se mezi barevné korály.",
"backgrounds082023": "Sada 111: zveřejněaa v srpnu 2023",
"backgroundBonsaiCollectionText": "Sbírka bonsají",
"backgroundBoardwalkIntoSunsetNotes": "Vydejte se po Stezce do západu slunce.",
"backgroundBoardwalkIntoSunsetText": "Stezka do západu slunce"
}
+3 -2
View File
@@ -54,7 +54,7 @@
"battleGear": "Bojová výzbroj",
"gear": "Výbava",
"autoEquipBattleGear": "Automaticky použít nové vybavení",
"costume": "Kostým",
"costume": "kostým",
"useCostume": "Použít kostým",
"costumePopoverText": "Vyber \"Použít kostým\", abys vybavil svého avatara, aniž bys nějak ovlivnil statistiky tvé bojové výzbroje! To znamená, že můžeš obléct svého avatara do jakéhokoliv vybavení chceš a stále mít tvojí nejlepší bojovou výzbroj na sobě.",
"autoEquipPopoverText": "Zvol tuto možnost pro automatické nasazení koupeného vybavení.",
@@ -184,5 +184,6 @@
"chatCastSpellUser": "<%= username %> použil/a <%= spell %> na <%= target %>.",
"purchasePetItemConfirm": "Tento nákup by překročil počet položek, které potřebujete k vylíhnutí všech možných <%= itemText %> domácích zvířátek. Jsi si jistá?",
"notEnoughGold": "Nedostatek zlaťáků.",
"chatCastSpellPartyTimes": "<%= username %> použil/a <%= spell %> pro skupinu <%= times %> times."
"chatCastSpellPartyTimes": "<%= username %> použil/a <%= spell %> pro skupinu <%= times %> times.",
"pointsAvailable": "Dostupné body"
}
+4 -2
View File
@@ -1,5 +1,5 @@
{
"stable": "Stáj",
"stable": "Mazlíčci a Mounty",
"pets": "Mazlíčci",
"activePet": "Aktivní mazlíček",
"noActivePet": "Bez aktivního mazlíčka",
@@ -109,5 +109,7 @@
"wackyPets": "Šílená zvířátka",
"invalidAmount": "Neplatný počet jídla,je vyžadováno pozitivní celé číslo",
"tooMuchFood": "Snažíš se dát svému zvířeti moc jídla, akce byla zrušena",
"notEnoughFood": "Nemáš dost jídla"
"notEnoughFood": "Nemáš dost jídla",
"veteranCactus": "Kaktus Veterán",
"veteranDragon": "Drak Veterán"
}
+21 -1
View File
@@ -160,5 +160,25 @@
"newPMNotificationTitle": "Nová zpráva od <%= name %>",
"displaynameIssueNewline": "Zobrazovaná jména nesmí obsahovat zpětné lomítko následované písmenem N.",
"resetAccount": "Resetovat účet",
"giftedSubscriptionWinterPromo": "Ahoj <%= username %>, získal/a jsi <%= monthCount %> měsíce/ů předplatného jako součást naší sváteční dárkové akce!"
"giftedSubscriptionWinterPromo": "Ahoj <%= username %>, získal/a jsi <%= monthCount %> měsíce/ů předplatného jako součást naší sváteční dárkové akce!",
"generalSettings": "Hlavní nastavení",
"siteData": "Údaje o webu",
"taskSettings": "Nastavení úkolu",
"confirmCancelChanges": "Jste si jistí? Neuložené změny přijdou vniveč.",
"account": "Účet",
"loginMethods": "Možnosti přihlášení",
"character": "Postava",
"siteLanguage": "Jazyk webu",
"showLevelUpModal": "Při dosažení vyšší úrovně",
"showHatchPetModal": "Při odchovu zvířátka",
"showRaisePetModal": "Jak z domácího mazlíčka vychovat jízdní zvíře",
"showStreakModal": "Při dosažení úspěchu v sérii",
"baileyAnnouncement": "Nejnovější oznámení společnosti Bailey",
"view": "Zobrazit",
"feedbackPlaceholder": "Vlož zpětnou vazbu",
"downloadCSV": "Stáhni si CSV",
"downloadAs": "Ulož jako",
"yourUserData": "Tvá uživatelská data",
"taskHistory": "Historie",
"yourUserDataDisclaimer": "Zde si lze stáhnout výpis historie úkolů nebo kompletní uživatelská data."
}
+7 -1
View File
@@ -935,5 +935,11 @@
"backgroundWaterfallWithRainbowText": "Wasserfall mit Regenbogen",
"backgroundWaterfallWithRainbowNotes": "Bewundere die atemberaubende Schönheit eines Wasserfalls mit Regenbogen.",
"backgrounds042026": "SET 143: Veröffentlicht im April 2026",
"backgrounds052026": "SET 144: Veröffentlicht im Mai 2026"
"backgrounds052026": "SET 144: Veröffentlicht im Mai 2026",
"backgroundRidingACometText": "Ein Kometenritt",
"backgroundRidingACometNotes": "Reise durch das All bei einem Kometenritt!",
"backgroundElvenCitadelText": "Elven Citadel",
"backgroundElvenCitadelNotes": "Unternehmen Sie die malerische Reise zu einer Elfenzitadelle.",
"backgroundOnAStrangePlanetNotes": "Wage dich dorthin, wo noch kein Habitican gewesen ist: Auf einem fremden Planeten.",
"backgroundOnAStrangePlanetText": "un eine strange planete"
}
+2 -1
View File
@@ -410,5 +410,6 @@
"questEggPlatypusText": "Schnabeltier",
"questEggPlatypusMountText": "Schnabeltier",
"questEggPlatypusAdjective": "ein Perfektionist",
"hatchingPotionOpal": "Opal"
"hatchingPotionOpal": "Opal",
"hatchingPotionAlien": "Außerirdischer"
}
+3 -1
View File
@@ -187,5 +187,7 @@
"minPasswordLengthLogin": "Dein Passwort ist mindestens 8 Zeichen lang.",
"enterValidEmail": "Bitte gib eine gültige E-Mail-Adresse ein.",
"whatToCallYou": "Wie sollen wir dich nennen?",
"acceptPrivacyTOS": "Du bestätigst, dass du mindestens 18 Jahre alt bist und dass du unsere <a href='/static/terms' target='_blank'>Nutzungsbedingungen</a> und <a href='/static/privacy' target='_blank'>Datenschutz-Bestimmungen</a> gelesen hast und akzeptierst"
"acceptPrivacyTOS": "Du bestätigst, dass du mindestens 18 Jahre alt bist und dass du unsere <a href='/static/terms' target='_blank'>Nutzungsbedingungen</a> und <a href='/static/privacy' target='_blank'>Datenschutz-Bestimmungen</a> gelesen hast und akzeptierst",
"emailAddress": "E-Mail_adresse",
"emailRequiredForSupport": "Wir benötigen eine E-Mail-Adresse für den Benutzersupport. Bitte geben Sie eine E-Mail-Adresse ein, um mit der Erstellung Ihres Kontos fortzufahren."
}
+6 -2
View File
@@ -3484,7 +3484,7 @@
"shieldSpecialWinter2026WarriorText": "Raureif Schild",
"shieldSpecialWinter2026WarriorNotes": "Stoppe eiskalt Hindernisse mit diesem praktischen, pieksigen Schild. Erhöht Ausdauer um %= con %>. Limitierte Ausgabe Winterausrüstung 2025-2026.",
"headMystery202602Text": "Kirschblüte Fuchsohren",
"headMystery202602Notes": " Diese Ohren schärfen dein Gehör so sehr, dass du im nahenden Frühling das Wachsen der Blütenknospen an den Zweigen der Bäume hören kannst. Gewährt keinen Attributbonus. Februar 2026 Abonnentengegenstand.",
"headMystery202602Notes": "Diese Ohren schärfen dein Gehör so sehr, dass du im nahenden Frühling das Wachsen der Blütenknospen an den Zweigen der Bäume hören kannst. Gewährt keinen Attributbonus. Februar 2026 Abonnentengegenstand.",
"headArmoireLoneCowpokeHatNotes": "Howdy Kumpel! Hasst dus auch so, wenn du draußen auf dem Schießstand bist, an Aufgaben arbeitest und dir die Sonne in die Augen scheint? Also, gute Sache, dass du dafür jetzt nen Hut hast. Erhöht deine Wahrnehmung um <%= per %>. Verzauberter Schrank: Einsamer Cowboy Set (Item 1 of 2)",
"shieldSpecialWinter2026HealerText": "Sternenexplosion",
"shieldArmoireDoubleBassNotes": "Bom doo bom brrrr brr brr brrrr! Versammle deine Party, um euch zu erden oder zu tanzen, während ihr euch Musik von dieser tiefen Double Bass anhört. Erhört Ausdauer und Stärke um jeweils <%= attrs %>. Verzauberter Schwank: Musikinstrumente Set 2 (Gegenstand 3 von 3)",
@@ -3497,5 +3497,9 @@
"backMystery202602Notes": "Diese flauschigen Schweife haben die Farbe der Kirschblüte, eine Erinnerung, dass der Frühling auf dem Weg ist. Gewährt keinen Autobusbonus. Februar 2026 Abonnentengegenstand.",
"backArmoireHarpsichordText": "Cembalo",
"weaponSpecialSpring2026HealerText": "Schneeglöckchen Stab",
"weaponSpecialSpring2026HealerNotes": "Eine Gelegenheit für einen Neuanfang liegt direkt vor dir, und mit diesem prächtigen Stab wirst du bereit sein! Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe Frühlingsausrüstung 2026."
"weaponSpecialSpring2026HealerNotes": "Eine Gelegenheit für einen Neuanfang liegt direkt vor dir, und mit diesem prächtigen Stab wirst du bereit sein! Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe Frühlingsausrüstung 2026.",
"armorSpecialSpring2026WarriorText": "Froschrüstung",
"armorSpecialSpring2026WarriorNotes": "Hüpf in Aktion, sobald der Schnee taut. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe Frühlingsausrüstung 2026.",
"armorSpecialSpring2026RogueText": "Birkenrinde Rüstung",
"armorSpecialSpring2026RogueNotes": "Trotze dem unvermeidlichen Frühlingsregen ebenso wie leichten Brisen. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe Frühlingsausrüstung 2026."
}
+3 -1
View File
@@ -243,5 +243,7 @@
"newMessage": "Neue Nachricht",
"rememberToBeKind": "Bitte sei freundlich, respektvoll, und folge den <a href='/static/community-guidelines' target='_blank'>Community-Richtlinien</a>.",
"gem": "Edelstein",
"confirmPurchase": "Kauf bestätigen"
"confirmPurchase": "Kauf bestätigen",
"avoidSPI": "vermeiden SPI",
"avoidSPIDetails": "Zu Ihrer Privatsphäre vermeiden Sie es, <%= firstLink %>sensible persönliche Informationen<%= linkClose %> (SPI) beim Verwenden von Habitica anzugeben. Ihre Kontodaten, einschließlich Aufgaben, werden auf unseren Servern gespeichert, sodass Sie von jedem Gerät aus darauf zugreifen können.<br><br>Um mehr zu erfahren, lesen Sie unsere <%= secondLink %>Datenschutzerklärung<%= linkClose %>."
}
+8 -7
View File
@@ -270,14 +270,14 @@
"winter2025StringLightsHealerSet": "Lichterketten Heiler Set",
"winter2025SnowRogueSet": "Schneeschurken Set",
"winter2025MooseWarriorSet": "Elchkrieger Set",
"winter2025AuroraMageSet": "Aurora Magier Set",
"spring2025PlumeriaHealerSet": "Plumeria Heiler Set",
"spring2025MantisMageSet": "Fangschrecken Magier Set",
"winter2025AuroraMageSet": "Aurora Set (Mage)",
"spring2025PlumeriaHealerSet": "Plumeria Set (Healer)",
"spring2025MantisMageSet": "Fangschrecken-Set (Magier)",
"spring2025SunshineWarriorSet": "Sonnenschein Krieger Set",
"spring2025CrystalPointRogueSet": "Kristallspitzen Schurken Set",
"summer2025ScallopWarriorSet": "Jakobsmuschel Krieger Set",
"summer2025SquidRogueSet": "Tintenfisch Schurken Set",
"summer2025SeaAngelHealerSet": "Ruderschnecken Heiler Set",
"summer2025ScallopWarriorSet": "Jakobsmuschel-Set (Krieger)",
"summer2025SquidRogueSet": "Tintenfisch-Set (Schurken)",
"summer2025SeaAngelHealerSet": "Ruderschnecken-Set (Heiler)",
"summer2025FairyWrasseMageSet": "Feenlippfisch Magier Set",
"fall2025SasquatchWarriorSet": "Sasquatch Krieger Set",
"fall2025SkeletonRogueSet": "Skelett Schurken Set",
@@ -289,5 +289,6 @@
"winter2026MidwinterCandleMageSet": "Mittwinterkerzen Magier Set",
"spring2026FrogWarriorSet": "Frosch Set (Krieger)",
"spring2026SnowdropHealerSet": "Schneeglöckchen Set (Heiler)",
"spring2026MaypoleMageSet": "Maibaum Set (Magier)"
"spring2026MaypoleMageSet": "Maibaum Set (Magier)",
"spring2026BranchRogueSet": "Fruling Ast Set (Schurke)"
}
+1 -1
View File
@@ -189,7 +189,7 @@
"questTRexUndeadBoss": "Skelettierter Tyrannosaurus",
"questTRexUndeadRageTitle": "Knöcherne Heilung",
"questTRexUndeadRageDescription": "Diese Leiste füllt sich, wenn Du Deine Tagesaufgaben nicht erfüllst. Wenn sie voll ist, heilt sich der skelettierte Tyrannosaurus um 30% seiner übrigen Lebenspunkte!",
"questTRexUndeadRageEffect": "'Der Skelettierte Tyrannosaurus benutzt KNÖCHERNE HEILUNG!'\n\nDas Monster lässt ein furchtbares Brüllen ertönen und einige seiner gesplitterten Knochen setzen sich wieder zusammen!",
"questTRexUndeadRageEffect": "Skeletal Tyrannosaur uses SKELETON HEALING!\n\nThe monster lets forth an unearthly roar, and some of its damaged bones knit back together!\n\nDas Monster lässt ein furchtbares Brüllen ertönen und einige seiner gesplitterten Knochen setzen sich wieder zusammen!",
"questTRexDropTRexEgg": "Tyrannosaurus (Ei)",
"questTRexUnlockText": "Schaltet den Kauf von Tyrannosauruseiern auf dem Marktplatz frei",
"questRockText": "Entkomme dem Höhlenungetüm",
+9 -2
View File
@@ -1,7 +1,7 @@
{
"rebirthNew": "Wiedergeburt: Ein neues Abenteuer erwartet Dich!",
"rebirthUnlock": "Du hast die Wiedergeburt freigeschaltet! Dieser besondere Gegenstand gestattet es Dir ein neues Spiel mit Level 1 zu beginnen, jedoch behältst Du Deine Aufgaben, Erfolge, Haustiere und mehr. Verwende den Gegenstand um Habitica neues Leben einzuhauchen wenn Du glaubst alles erreicht zu haben, oder um neue Features aus dem Blickwinkel eines Anfängers zu erleben!",
"rebirthAchievement": "Du hast ein neues Abenteuer begonnen! Das ist Deine <%= number %>. Wiedergeburt. Dein höchstes jemals erreichtes Level ist <%= level %>. Um diesen Erfolg zu stapeln, beginne Dein nächstes Abenteuer wenn Du ein noch höheres Level erreicht hast!",
"rebirthAchievement": "Du hast ube die Orb of Rebirth <strong><%+numer%<>/Strong> ohr und höchste Ebene ist <strong><%=",
"rebirthAchievement100": "Du hast ein neues Abenteuer begonnen! Das ist Deine <%= number %>. Wiedergeburt. Dein höchstes jemals erreichtes Level ist 100 oder mehr. Um diesen Erfolg zu stapeln, beginne Dein nächstes Abenteuer wenn Du mindestens Level 100 erreicht hast!",
"rebirthBegan": "Hat ein neues Abenteuer begonnen",
"rebirthText": "Hat <%= rebirths %> neue Abenteuer begonnen",
@@ -11,5 +11,12 @@
"rebirthPop": "Beginne sofort von vorn mit einem Charakter auf Level 1, aber behalte Erfolge, Sammelgegenstände und Ausrüstung. Deine Aufgaben und ihre Verläufe bleiben erhalten, werden aber auf gelb zurückgesetzt. Deine Strähnen verfallen, außer für Aufgaben, die von aktiven Herausforderungen oder Gruppenplänen stammen. Gold, Erfahrung, Mana und alle Effekte von Fähigkeiten werden entfernt. All das wird sofort in Kraft treten.",
"rebirthName": "Sphäre der Wiedergeburt",
"rebirthComplete": "Du wurdest wiedergeboren!",
"nextFreeRebirth": "<strong><%= days %> Tage</strong> bis zur <strong>KOSTENLOSEN</strong> Sphäre der Wiedergeburt"
"nextFreeRebirth": "<strong><%= days %> Tage</strong> bis zur <strong>KOSTENLOSEN</strong> Sphäre der Wiedergeburt",
"rebirthUnlockedNewItem": "Ort der Wiedergeburt Freigeschaltet",
"rebirthUnlockedOrb": "Ein neues Abenteuer ist verfügbar!",
"rebirthUnlockedDesc": "Nutze den Ort der Wiedergeburt um ein neues Leben in dein Habitica Abendteuer zu bekommen wenn du das Gefühl hast, alles erreicht zu haben. Du beginnst wieder bei Level 1 und es beginnt wieder von vorne.",
"rebirthNewAchievement": "Neue Auszeichnung",
"rebirthNewAdventure": "Ein neues Abenteuer beginnt nun!",
"rebirthStackInfo": "Diese Auszeichnung kann sich stapeln, jedes Mal, wenn du den Ort der Wiedergeburt nutzt.",
"rebirthAchievementPlural": "Du hast ube die Orb of Rebirth <strong><%+numer%<>/Strong> ohr und höchste Ebene ist <strong><%="
}
+4 -1
View File
@@ -274,5 +274,8 @@
"mysterySet202601": "Winter-Ägide set",
"subscriptionBillingFYI": "Abos verlängern sich automatisch, sofern du sie nicht mindestens 24 Stunden vor Ablauf des aktuellen Zeitraums kündigst. Du kannst dein Abo in den Einstellungen unter „Abonnement“ verwalten. Die Abbuchung von deinem Konto erfolgt innerhalb von 24 Stunden nach dem Verlängerungsdatum zum gleichen Preis wie bei der ersten Abbuchung.",
"subscriptionBillingFYIShort": "Abos verlängern sich automatisch, sofern du sie nicht mindestens 24 Stunden vor Ablauf des aktuellen Zeitraums kündigst. Die Abbuchung von deinem Konto erfolgt innerhalb von 24 Stunden nach dem Verlängerungsdatum zum gleichen Preis wie bei der ersten Abbuchung.",
"mysterySet202602": "Sakura Fuchs Set"
"mysterySet202602": "Sakura Fuchs Set",
"mysterySet202603": "Glyzinie Hexa Satze",
"mysterySet202604": "Kuhn Weltraumerkunder Set",
"mysterySet202605": "Nachtfall Nimbus Set"
}
@@ -1075,6 +1075,18 @@
"backgroundElvenCitadelText": "Elven Citadel",
"backgroundElvenCitadelNotes": "Take the scenic journey to an Elven Citadel.",
"backgrounds062026": "SET 145: Released June 2026",
"backgroundBeachWithVolcanoText": "Beach with Volcano",
"backgroundBeachWithVolcanoNotes": "Watch nature's wonder on a Beach with a Volcano.",
"backgrounds072026": "SET 146: Released July 2026",
"backgroundTropicalCoralGardenText": "Tropical Coral Garden",
"backgroundTropicalCoralGardenNotes": "Dive into a Tropical Coral Garden.",
"backgrounds082026": "SET 147: Released August 2026",
"backgroundVegetableGardenText": "Vegetable Garden",
"backgroundVegetableGardenNotes": "Plant tasty greens in a Vegetable Garden.",
"timeTravelBackgrounds": "Steampunk Backgrounds",
"backgroundAirshipText": "Airship",
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
+4 -4
View File
@@ -1,5 +1,5 @@
{
"communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the <a href='https://habitica.com/static/community-guidelines' target='_blank'>Community Guidelines</a> (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email <%= hrefBlankCommunityManagerEmail %>!",
"communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the <%= linkOpen %>Community Guidelines<%= linkClose %> (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email <%= adminEmail %>!",
"profile": "Profile",
"avatar": "Customize Avatar",
"editAvatar": "Customize Avatar",
@@ -65,7 +65,7 @@
"costumeDisabled": "You have disabled your costume.",
"gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:",
"gearAchievementNotification": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class!",
"moreGearAchievements": "To attain more Ultimate Gear badges, change classes on <a href='/user/settings/site' target='_blank'>the Settings &gt; Site page</a> and buy your new class's gear!",
"moreGearAchievements": "To attain more Ultimate Gear badges, change classes on <%= linkOpen %>the Settings &gt; Site page<%= linkClose %> and buy your new class's gear!",
"armoireUnlocked": "For more equipment, check out the <strong>Enchanted Armoire!</strong> Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.",
"ultimGearName": "Ultimate Gear - <%= ultClass %>",
"ultimGearText": "Has upgraded to the maximum weapon and armor set for the <%= ultClass %> class.",
@@ -87,7 +87,7 @@
"allocatePerPop": "Add a Point to Perception",
"allocateInt": "Points allocated to Intelligence:",
"allocateIntPop": "Add a Point to Intelligence",
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the <a href='/shops/market'>Orb of Rebirth</a>.",
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the <%= linkOpen %>Orb of Rebirth<%= linkClose %>.",
"stats": "Stats",
"strength": "Strength",
"strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.",
@@ -139,7 +139,7 @@
"optOutOfClasses": "Opt Out",
"chooseClass": "Choose your Class",
"chooseClassLearnMarkdown": "[Learn more about Habitica's class system](/static/faq#what-classes)",
"optOutOfClassesText": "Not ready to choose? There's no rush! If you opt out, you can read about each Class in <a href='/static/faq#what-classes' target='_blank'>our FAQ</a> and visit Settings to enable the Class System when you're ready.",
"optOutOfClassesText": "Not ready to choose? There's no rush! If you opt out, you can read about each Class in <%= linkOpen %>our FAQ<%= linkClose %> and visit Settings to enable the Class System when you're ready.",
"selectClass": "Select <%= heroClass %>",
"select": "Select",
"stealth": "Stealth",
@@ -12,11 +12,11 @@
"commGuideList01A": "Our Guidelines and Terms of Service apply in Challenges, Parties, player profiles, and private messages.",
"commGuideList02C": "<strong>Do not post images or text that are violent, threatening, or sexually explicit/suggestive, or that promote discrimination, bigotry, racism, sexism, hatred, harassment or harm against any individual or group</strong>. Not even as a joke or meme. This includes slurs as well as statements. Not everyone has the same sense of humor, and so something that you consider a joke may be hurtful to another.",
"commGuideList02N": "<strong>Report anything you see that breaks these Guidelines or our Terms of Service</strong>. You can report a message directly or notify staff via <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> for violations in profiles or Challenges. We will handle them as quickly as possible. You may contact us in your native language if that is easier for you: we may have to use Google Translate, but we want you to feel comfortable about contacting us if you have a problem.",
"commGuideList02N": "<strong>Report anything you see that breaks these Guidelines or our Terms of Service</strong>. You can report a message directly or notify staff via <%= adminEmail %> for violations in profiles or Challenges. We will handle them as quickly as possible. You may contact us in your native language if that is easier for you: we may have to use Google Translate, but we want you to feel comfortable about contacting us if you have a problem.",
"commGuideList02H": "<strong>All Display Names and @usernames must comply with the Terms of Service</strong>. To change your Display Name and/or @username: on mobile go to Menu > Settings > Account. On web, go to Settings from the user icon in the top navigation.",
"commGuideList02A": "<strong>Respect each other</strong>. Be courteous, kind, friendly, and helpful. Remember: Habiticans come from all backgrounds and have had wildly divergent experiences.",
"commGuideList02I": "<strong>Challenge names should be appropriate for all spaces, as they will appear in the winner's public profile</strong>. Keep this in mind when creating Challenges as we may be forced to edit the record on their profile if there is a report.",
"commGuideList02G": "<strong>Comply immediately with any Staff request.</strong> This could include, but is not limited to, requesting you limit your posts in a particular space, editing your profile to remove unsuitable content, etc. Do not argue with Staff. If you have concerns or comments about Staff actions, email <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> to contact our community manager.",
"commGuideList02G": "<strong>Comply immediately with any Staff request.</strong> This could include, but is not limited to, requesting you limit your posts in a particular space, editing your profile to remove unsuitable content, etc. Do not argue with Staff. If you have concerns or comments about Staff actions, email <%= adminEmail %> to contact our community manager.",
"commGuideList02D": "<strong>Be mindful that Habiticans are of all ages and backgrounds</strong>. Challenges and player profiles should not mention adult topics, use profanity, or promote contention or conflict.",
"commGuideList02E": "<strong>If a staff member tells you that a term is disallowed on Habitica, even if it is a term that you did not realize was problematic, that decision is final.</strong> Additionally, slurs will be dealt with very severely, as they are also a violation of the Terms of Service.",
"commGuideList02O": "<strong>Parties may create their own chat rules for members comfort and preferences</strong>. However, the admins cannot enforce chat rules in these private spaces unless there is a breach of the Terms of Service, including harassment. If someone in your Party is causing issues, we encourage the Party leader to remove them.",
@@ -24,7 +24,7 @@
"commGuideList02P": "<strong>We discourage the sending of unsolicited private messages</strong>. If you receive an unwanted message that makes you uncomfortable or that breaks these Guidelines or the Terms of Service, please block the sender and report it to bring it to Staff attention.",
"commGuideList02Q": "<strong>Do not try to get around a block</strong>. If someone has blocked you from sending them private messages, do not contact them elsewhere to ask them to unblock you.",
"commGuideList02M": "<strong>Do not ask or beg for Gems, subscriptions, or membership in Group Plans</strong>. If you see or receive unwanted messages asking for paid items, please report them. Repeated Gem or subscription begging, especially after a warning, may result in an account ban.",
"commGuideList02L": "<strong>We highly discourage the exchange of personal information--particularly information that can be used to identify you</strong>. Identifying information can include but is not limited to: your address, your email, and your password or API token. If you are asked for personal information in a Party chat or private message, we highly recommend that you do not respond, and alert the Staff by either reporting the message or contacting <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> with screenshots of the messages if more context is needed.",
"commGuideList02L": "<strong>We highly discourage the exchange of personal information--particularly information that can be used to identify you</strong>. Identifying information can include but is not limited to: your address, your email, and your password or API token. If you are asked for personal information in a Party chat or private message, we highly recommend that you do not respond, and alert the Staff by either reporting the message or contacting <%= adminEmail %> with screenshots of the messages if more context is needed.",
"commGuideList02J": "<strong>Do not spam</strong>. Spamming may include, but is not limited to: sending multiple unsolicited private messages, sending nonsensical messages, sending multiple promotional messages about a Party or Challenge, or creating multiple similar or low quality Challenges in a row. Staff has discretion to determine what messages are considered spamming.",
"commGuideList02K": "<strong>Do not send links without explanation or context</strong>. If players clicking on a link will result in any benefit to you, you need to disclose that. This applies in messages as well as Challenges.",
@@ -48,7 +48,7 @@
"commGuideHeadingModerateInfractions": "Moderate Infractions",
"commGuidePara054": "These infractions will have moderate consequences. When in conjunction with multiple infractions, the consequences may grow more severe.",
"commGuidePara055": "The following are some examples of Moderate Infractions. This is not a comprehensive list.",
"commGuideList06A": "Ignoring, disrespecting or arguing with Staff. If you are concerned about one of the rules or the behavior of the staff, please contact us at <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>.",
"commGuideList06A": "Ignoring, disrespecting or arguing with Staff. If you are concerned about one of the rules or the behavior of the staff, please contact us at <%= adminEmail %>.",
"commGuideList06C": "Intentionally flagging innocent Challenges, profiles, or messages.",
"commGuideList06E": "Repeatedly Committing Minor Infractions",
@@ -79,8 +79,7 @@
"commGuideHeadingRestoration": "Restoration",
"commGuidePara061": "Habitica is devoted to self-improvement, and we believe in second chances. <strong>If you commit an infraction and receive a consequence, view it as a chance to evaluate your actions and strive to be a better member of the community</strong>.",
"commGuidePara062": "<strong>If you wish to ask questions about your infraction or consequences, apologize, or make a plea for reinstatement, please contact us at <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> with your User ID or @username</strong>. It is <strong>your</strong> responsibility to reach out.",
"commGuidePara063": "If you do not understand your consequences or the nature of your infraction, or if you have other questions related to the matter, you can contact the staff to discuss it at <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>. Cooperate with any restrictions which have been imposed, and endeavor to meet the requirements to have any penalties lifted.",
"commGuidePara063": "If you do not understand your consequences or the nature of your infraction, or if you have other questions related to the matter, you can contact the staff to discuss it at <%= adminEmail %>. Cooperate with any restrictions which have been imposed, and endeavor to meet the requirements to have any penalties lifted.",
"commGuideHeadingMeet": "Meet the Staff",
"commGuidePara007": "The Habitica Staff keep the app and sites running and can act as chat moderators. They have purple tags marked with crowns. Their title is \"Heroic\".",
@@ -94,13 +93,12 @@
"commGuidePara014": "Staff and Moderators Emeritus:",
"commGuideHeadingFinal": "The Final Section",
"commGuidePara067": "So there you have it, brave Habitican -- the Community Guidelines! Wipe that sweat off of your brow and give yourself some EXP for reading it all. If you have any questions or concerns about these Community Guidelines, please reach out to us via <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> and we will be happy to help clarify things.",
"commGuidePara067": "So there you have it, brave Habitican -- the Community Guidelines! Wipe that sweat off of your brow and give yourself some EXP for reading it all. If you have any questions or concerns about these Community Guidelines, please reach out to us via <%= adminEmail %> and we will be happy to help clarify things.",
"commGuidePara068": "Now go forth, brave adventurer, and slay some Dailies!",
"commGuideHeadingLinks": "Useful Links",
"commGuideLink02": "<a href='https://habitica.fandom.com/wiki/Habitica_Wiki' target='_blank'>The Wiki</a>: the biggest collection of information about Habitica. Note that this space is unofficial, being hosted by Fandom and maintained by players.",
"commGuideLink03": "<a href='https://github.com/HabitRPG/habitica' target='_blank'>GitHub</a>: for helping with code!",
"commGuideLink04": "<a href='https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link' target='_blank'>The Feedback Form</a>: for site and app feature requests.",
"commGuideLink03": "<%= linkOpen %>GitHub<%= linkClose %>: for helping with code!",
"commGuideLink04": "<%= linkOpen %>The Feedback Form<%= linkClose %>: for site and app feature requests.",
"commGuidePara069": "The following talented artists contributed to these illustrations:"
}
+1 -1
View File
@@ -45,5 +45,5 @@
"surveysSingle": "Helped Habitica grow, either by filling out a survey or helping with a major testing effort. Thank you!",
"surveysMultiple": "Helped Habitica grow on <%= count %> occasions, either by filling out a survey or helping with a major testing effort. Thank you!",
"blurbHallPatrons": "This is the Hall of Patrons, where we honor the noble adventurers who backed Habitica's original Kickstarter. We thank them for helping us bring Habitica to life!",
"blurbHallContributors": "This is the Hall of Contributors, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards' target='_blank'>Gems, exclusive Equipment</a>, and <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tiers' target='_blank'>prestigious titles</a>. You can contribute to Habitica, too! <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica' target='_blank'>Find out more here.</a>"
"blurbHallContributors": "This is the Hall of Contributors, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned <%= linkRewards %>Gems, exclusive Equipment<%= linkClose %>, and <%= linkTiers %>prestigious titles<%= linkClose %>. You can contribute to Habitica, too! <%= linkContributing %>Find out more here<%= linkClose %>."
}
@@ -5,8 +5,8 @@
"800ed0": "Purple",
"915533": "Skin Tone 1",
"98461a": "Skin Tone 6",
"allCustomizationsOwned": "You own all of these items. You can try them on by <a href=''>customizing your avatar</a>.",
"allEquipmentOwned": "You own all of these items. You can find them in your <a href='/inventory/equipment'>Equipment</a>. Be sure to check back later for next month's options!",
"allCustomizationsOwned": "You own all of these items. You can try them on by <%= linkOpen %>customizing your avatar<%= linkClose %>.",
"allEquipmentOwned": "You own all of these items. You can find them in your <%= linkOpen %>Equipment<%= linkClose %>. Be sure to check back later for next month's options!",
"aurora": "Aurora",
"bear": "Bear",
"black": "Black",
@@ -154,7 +154,7 @@
"tropicalwater": "Tropical Water",
"TRUred": "Crimson",
"updo": "Updo",
"visitCustomizationsShop": "Head over to the <a href='/shops/customizations'>Customizations Shop</a> to browse the many ways you can customize your avatar!",
"visitCustomizationsShop": "Head over to the <%= linkOpen %>Customizations Shop<%= linkClose %> to browse the many ways you can customize your avatar!",
"wavyLong": "Wavy Long",
"wavyShort": "Wavy Short",
"white": "White",
+1 -1
View File
@@ -3,7 +3,7 @@
"dontDespair": "Don't despair!",
"deathPenaltyDetails": "You lost a Level, your Gold, and a piece of Equipment, but you can get them all back with hard work! Good luck--you'll do great.",
"refillHealthTryAgain": "Refill Health & Try Again",
"dyingOftenTips": "Is this happening often? <a href='/static/faq#prevent-damage' target='_blank'>Here are some tips!</a>",
"dyingOftenTips": "Is this happening often? <%= linkOpen %>Here are some tips!<%= linkClose %>",
"losingHealthWarning": "Careful - You're Losing Health!",
"losingHealthWarning2": "Don't let your Health drop to zero! If you do, you'll lose a level, your Gold, and a piece of equipment.",
"toRegainHealth": "To regain Health:",
+5 -5
View File
@@ -185,7 +185,7 @@
"sunsetFaqHeader8": "How does this affect Habitica contributors?",
"sunsetFaqPara12": "As an open-source project, we welcome and encourage many types of contributions. To show our appreciation we will be sending the Heroic gear set to everyone that has a contributor tier as of <strong>August 1, 2023</strong>. When Tavern and Guild services end, there will be some changes to contributions as well. You can read more about the plan for each type below.",
"sunsetFaqPara13": "<strong>Blacksmiths</strong><br />We still welcome open-source help through our GitHub and will continue awarding tiers for qualifying contributions. Blacksmith collaboration and discussion has largely taken place over GitHub and that will continue.",
"sunsetFaqPara14": "<strong>Linguists</strong><br />We continue to welcome help with translating the apps and website and will still be awarding contributor tiers for qualifying contributions. However, the method with which we accept translations will be changing. Wed like to focus our resources on supporting a set selection of languages across all platforms. To do this, we will be reducing the amount of languages available for translation. Previously unfinished languages will be archived in Github. We hope this change will make the cross platform Habitica experience more consistent. You can read our most up to date translation procedure guidelines on our <a href='https://translate.habitica.com/projects/habitica/#information'>translation website</a>.",
"sunsetFaqPara14": "<strong>Linguists</strong><br />We continue to welcome help with translating the apps and website and will still be awarding contributor tiers for qualifying contributions. However, the method with which we accept translations will be changing. Wed like to focus our resources on supporting a set selection of languages across all platforms. To do this, we will be reducing the amount of languages available for translation. Previously unfinished languages will be archived in Github. We hope this change will make the cross platform Habitica experience more consistent. You can read our most up to date translation procedure guidelines on our <%= linkOpen %>translation website<%= linkClose %>.",
"sunsetFaqPara15": "<strong>Challengers</strong><br />The team encourages you to continue creating high quality Challenges. We would like to explore new ways of promoting Challenge discoverability in and outside of the app.",
"sunsetFaqPara16": "<strong>Socialites</strong><br />This type of contribution will be ending with the Tavern and Guild discontinuation. We are extremely grateful for the work that our friendly and helpful players have done answering questions in our chat spaces.",
"sunsetFaqPara17": "<strong>Comrades</strong><br />Scripts and add-ons are helpful to a shrinking section of our user base as the mobile apps increasingly become the only way that most users access Habitica. Contributors wishing to create 3rd party tools to customize their Habitica experience can continue doing so, but we will no longer be awarding Comrade tiers as we focus on contributions that enhance Habitica in a way that is accessible to our player base as a whole.",
@@ -199,9 +199,9 @@
"sunsetFaqList7": "Currently many Challenges have tasks that require posts in Habiticas public chat spaces. Creators of those Challenges can adapt their tasks or move the chat requirement to posting on an outside service.",
"sunsetFaqHeader10": "Where will players go when they have questions about how to use Habitica?",
"sunsetFaqList8": "Our existing <a href='https://habitica.com/static/faq'>FAQ</a> is a great resource and can be found from the Help menu, or Support on mobile. We are in the process of creating a more comprehensive and improved FAQ to help guide players moving forward.",
"sunsetFaqList9": "This <a href='https://habitica.wordpress.com/beginning-adventurers-guide/'>blog post</a> also provides a handy guide for new players.",
"sunsetFaqList10": "Players are also encouraged to email <a href='mailto:admin@habitica.com'>admin@habitica.com</a> with any questions for which they cannot find answers in the above links.",
"sunsetFaqList8": "Our existing <%= linkOpen %>FAQ<%= linkClose %> is a great resource and can be found from the Help menu, or Support on mobile. We are in the process of creating a more comprehensive and improved FAQ to help guide players moving forward.",
"sunsetFaqList9": "This <%= linkOpen %>blog post<%= linkClose %> also provides a handy guide for new players.",
"sunsetFaqList10": "Players are also encouraged to email <%= adminEmail %> with any questions for which they cannot find answers in the above links.",
"sunsetFaqHeader11": "How does this affect Habiticas Community Guidelines and Terms of Service?",
"sunsetFaqPara20": "Habiticas Community Guidelines will be updated at the time Tavern and Guild service is discontinued. They will reflect that community rules for conduct are now in relation to player profiles, Challenges, and messages in private spaces. Our Terms of Service have always applied to both public and private spaces and do not require an immediate update in regard to this change.",
@@ -210,7 +210,7 @@
"sunsetFaqPara21": "Gems in the Guild Bank will be refunded to the leader of the Guild on August 8th when Guild Services end.",
"anotherQuestion": "Have another question?",
"contactAdmin": "Contact <a href='mailto:admin@habitica.com'>admin@habitica.com</a>",
"contactAdmin": "Contact <%= adminEmail %>",
"contentReleaseChanges": "Content Release Changes",
"contentFaqTitle": "Habitica Content Release Change FAQ",
+3 -3
View File
@@ -123,8 +123,8 @@
"emailTaken": "Email address is already used in an account.",
"newEmailRequired": "Missing new email address.",
"usernameTime": "It's time to set your username!",
"usernameInfo": "Login names are now unique usernames that will be visible beside your display name and used for invitations, chat @mentions, and messaging.<br><br>If you'd like to learn more about this change, <a href='https://habitica.fandom.com/wiki/Player_Names' target='_blank'>visit our wiki</a>.",
"usernameTOSRequirements": "Usernames must conform to our <a href='/static/terms' target='_blank'>Terms of Service</a> and <a href='/static/community-guidelines' target='_blank'>Community Guidelines</a>. If you didnt previously set a login name, your username was auto-generated.",
"usernameInfo": "Login names are now unique usernames that will be visible beside your display name and used for invitations, chat @mentions, and messaging.<br><br>If you'd like to learn more about this change, <%= linkOpen %>visit our wiki<%= linkClose %>.",
"usernameTOSRequirements": "Usernames must conform to our <%= termsLink %>Terms of Service<%= linkClose %> and <%= guidelinesLink %>Community Guidelines<%= linkClose %>. If you didnt previously set a login name, your username was auto-generated.",
"usernameTaken": "Username already taken.",
"passwordConfirmationMatch": "Password confirmation doesn't match password.",
"minPasswordLength": "Password must be 8 characters or more.",
@@ -187,7 +187,7 @@
"learnMore": "Learn More",
"translateHabitica": "Translate Habitica",
"whatToCallYou": "What should we call you?",
"acceptPrivacyTOS": "You confirm that you are at least 18 years old, and that you have read and agree to our <a href='/static/terms' target='_blank'>Terms of Service</a> and <a href='/static/privacy' target='_blank'>Privacy Policy</a>",
"acceptPrivacyTOS": "You confirm that you are at least 18 years old, and that you have read and agree to our <%= termsLink %>Terms of Service<%= linkClose %> and <%= privacyLink %>Privacy Policy<%= linkClose %>",
"emailAddress": "Email address",
"emailRequiredForSupport": "We require an email address for user support. Please enter an email address to continue creating your account."
}
+61 -1
View File
@@ -587,6 +587,15 @@
"weaponSpecialSpring2026MageText": "Maypole Parasol",
"weaponSpecialSpring2026MageNotes": "An opportunity to celebrate approaches, and with this pretty parasol pole, you will be ready! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Spring 2026 Gear.",
"weaponSpecialSummer2026WarriorText": "Gator Machete",
"weaponSpecialSummer2026WarriorNotes": "This flashy, fancy weapon fits right into your swampcore aesthetic. Increases Strength by <%= str %>. Limited Edition Summer 2026 Gear.",
"weaponSpecialSummer2026RogueText": "Tsunami Blade",
"weaponSpecialSummer2026RogueNotes": "This clever, curvy weapon fits right into your seacore aesthetic. Increases Strength by <%= str %>. Limited Edition Summer 2026 Gear.",
"weaponSpecialSummer2026HealerText": "Puffin Lance",
"weaponSpecialSummer2026HealerNotes": "This fine, feather-adorned weapon fits right into your islandcore aesthetic. Increases Intelligence by <%= int %>. Limited Edition Summer 2026 Gear.",
"weaponSpecialSummer2026MageText": "Tiger Shark Spear",
"weaponSpecialSummer2026MageNotes": "This dangerous, double-ended weapon fits right into your oceancore aesthetic. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Summer 2026 Gear.",
"weaponMystery201411Text": "Pitchfork of Feasting",
"weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.",
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
@@ -637,6 +646,10 @@
"weaponMystery202601Notes": "An icy bubble shield that grants magical protection from opposing elements. Confers no benefit. January 2026 Subscriber Item.",
"weaponMystery202603Text": "Wisteria Wizard Staff",
"weaponMystery202603Notes": "Cast spells to warm the spring air and encourage the blossoms to bud! Confers no benefit. March 2026 Subscriber Item.",
"weaponMystery202607Text": "Oceanmancer's Fishy Familiars",
"weaponMystery202607Notes": "These colorful companions will channel your aqueous abilities. Confers no benefit. July 2026 Subscriber Item.",
"weaponMystery202608Text": "Beaming Magenta Blade",
"weaponMystery202608Notes": "Bright, beautiful, dangerous to your undone Dailies. Confers no benefit. August 2026 Subscriber Item.",
"weaponMystery301404Text": "Steampunk Cane",
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
@@ -865,6 +878,14 @@
"weaponArmoireBambooFluteNotes": "Hwhoooo! Hu-whooooo! Gather your party for a meditation session or self-care nap while relaxing to tunes played on this bamboo flute. Increases Constitution and Intelligence by <%= attrs %> each. Enchanted Armoire: Musical Instrument Set 2 (Item 2 of 3)",
"weaponArmoirePrettyPinkParasolText": "Pretty Pink Parasol",
"weaponArmoirePrettyPinkParasolNotes": "Pretty and practical is the preeminent permutation. And for a particularly impressive presentation, give this parasol a spin! Increases all stats by <%= attrs %> each. Enchanted Armoire: Pretty in Pink Set (Item 1 of 2)",
"weaponArmoireBrightRainbowKiteText": "Rainbow Kite",
"weaponArmoireBrightRainbowKiteNotes": "This kites colors are bright and loud. Watching it soar high will make you proud! Increases all stats by <%= attrs %> each. Enchanted Armoire: Rainbow Kite Set (Item 1 of 2).",
"weaponArmoirePastelRainbowKiteText": "Pastel Rainbow Kite",
"weaponArmoirePastelRainbowKiteNotes": "This kites colors are muted and soft. It dances and spins as it soars aloft! Increases all stats by <%= attrs %> each. Enchanted Armoire: Rainbow Kite Set (Item 2 of 2).",
"weaponArmoireKendoShinaiText": "Kendo Shinai",
"weaponArmoireKendoShinaiNotes": "Light and soft, you can use this bamboo practice sword as you strive to improve yourself. Increases Strength by <%= str %>. Enchanted Armoire: Kendo Set (Item 3 of 3).",
"weaponArmoireGardenRakeText": "Garden Rake",
"weaponArmoireGardenRakeNotes": "Step 1: Rake all the fallen leaves into a giant pile. Step 2: Celebrate a job well done by jumping into the pile. Step 3: Repeat. Increases Constitution by <%= con %>. Enchanted Armoire: Gardener Set 2 (Item 1 of 2).",
"armor": "armor",
"armorCapitalized": "Armor",
@@ -1432,6 +1453,15 @@
"armorSpecialSpring2026MageText": "Maypole Dancer Outfit",
"armorSpecialSpring2026MageNotes": "Arrive ready to dance, picnic, and enjoy the warm weather spring brings. Increases Intelligence by <%= int %>. Limited Edition Spring 2026 Gear.",
"armorSpecialSummer2026WarriorText": "Gator Suit",
"armorSpecialSummer2026WarriorNotes": "Conceal yourself in this suit, but dont hide from your problems. Gather your gator grit and meet your tasks like the alligator you are. Increases Constitution by <%= con %>. Limited Edition Summer 2026 Gear.",
"armorSpecialSummer2026RogueText": "Tsunami Suit",
"armorSpecialSummer2026RogueNotes": "Cloak yourself in this tsunami suit, but dont hide from your problems. Summon a strong storm to have your back and meet your tasks like the adventurer you are. Increases Perception by <%= per %>. Limited Edition Summer 2026 Gear.",
"armorSpecialSummer2026HealerText": "Puffin Suit",
"armorSpecialSummer2026HealerNotes": "Fit yourself in this suit, but dont hide from your problems. Produce your puffin power and tackle your tasks like the puffin you are. Increases Constitution by <%= con %>. Limited Edition Summer 2026 Gear.",
"armorSpecialSummer2026MageText": "Tiger Shark Suit",
"armorSpecialSummer2026MageNotes": "Slide into this suit, but dont hide from your problems. Show your shark shine and swim right up to face those tasks like the shark you are. Increases Intelligence by <%= int %>. Limited Edition Summer 2026 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",
@@ -1826,6 +1856,8 @@
"armorArmoireSoftYellowSuitNotes": "Yellow is an energetic color. Wear this to bed, and you will wake up with the sun the next morning ready to tackle a day full of tasks. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Yellow Loungewear Set (Item 2 of 3).",
"armorArmoireHandstandOutfitText": "Handstand",
"armorArmoireHandstandOutfitNotes": "Things sure do look different when youre upside-down, dont they? If youre feeling stuck, its time for a fresh perspective! Increases Perception by <%= per %>. Enchanted Armoire: Handstand Set (Item 1 of 1).",
"armorArmoireKendoBoguText": "Kendo Bōgu",
"armorArmoireKendoBoguNotes": "This might be training armor, but it offers more than enough protection for your path ahead. Increases Constitution by <%= con %>. Enchanted Armoire: Kendo Set (Item 2 of 3).",
"headgear": "helm",
"headgearCapitalized": "Headgear",
@@ -2387,6 +2419,15 @@
"headSpecialSpring2026MageText": "Mayflower Crown",
"headSpecialSpring2026MageNotes": "Make a joyous statement with bright blooms encircling your head. Increases Perception by <%= per %>. Limited Edition Spring 2026 Gear.",
"headSpecialSummer2026WarriorText": "Gator Helm",
"headSpecialSummer2026WarriorNotes": "Go forth and be productive! If you get any pushback, just snap back and show your sharp teeth. Increases Strength by <%= str %>. Limited Edition Summer 2026 Gear.",
"headSpecialSummer2026RogueText": "Tsunami Helm",
"headSpecialSummer2026RogueNotes": "Go forth and be productive! If you lose your way, just follow the flow. Increases Perception by <%= per %>. Limited Edition Summer 2026 Gear.",
"headSpecialSummer2026HealerText": "Puffin Helm",
"headSpecialSummer2026HealerNotes": "Go forth and be productive! If you encounter complications, just gather them up in your colorful beak and take them somewhere else. Increases Intelligence by <%= int %>. Limited Edition Summer 2026 Gear.",
"headSpecialSummer2026MageText": "Tiger Shark Helm",
"headSpecialSummer2026MageNotes": "Go forth and be productive! If an obstacle dares to get in your way, just crush it with your mighty jaws. Increases Perception by <%= per %>. Limited Edition Summer 2026 Gear.",
"headSpecialGaymerxText": "Rainbow Warrior Helm",
"headSpecialGaymerxNotes": "In celebration of the GaymerX Conference, this special helmet is decorated with a radiant, colorful rainbow pattern! GaymerX is a game convention celebrating LGTBQ and gaming and is open to everyone.",
@@ -2578,6 +2619,8 @@
"headMystery202603Notes": "This jaunty hat not only enhances your magical ability, it also has a lovely spring scent! Confers no benefit. March 2026 Subscriber Item.",
"headMystery202604Text": "Audacious Astronaut Helmet",
"headMystery202604Notes": "In space, no one can hear you check off your To Dos. But the real reward is your sense of personal accomplishment! Confers no benefit. April 2026 Subscriber Item.",
"headMystery202606Text": "Holiday Hat",
"headMystery202606Notes": "Holidays are made for enjoying the sunshine - but dont get burned! Confers no benefit. June 2026 Subscriber Item.",
"headMystery301404Text": "Fancy Top Hat",
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
@@ -2812,6 +2855,8 @@
"headArmoireFloppyYellowHatNotes": "Many spells have been sewn into this simple hat, giving it a youthful yellow color. Increases all stats by <%= attrs %> each. Enchanted Armoire: Yellow Loungewear Set (Item 1 of 3).",
"headArmoireVerdantArmingCapText": "Verdant Page Arming Cap",
"headArmoireVerdantArmingCapNotes": "This comfy, cushioned coif makes you battle-ready and helps you withstand anything heavy that could come your way. Increases Perception and Constitution by <%= attrs %> each. Enchanted Armoire: Verdant Page Set (Item 1 of 2).",
"headArmoireKendoMenText": "Kendo Men",
"headArmoireKendoMenNotes": "You might be surprised by how well you can see through the grille as you follow the way of the sword. Increases Perception by <%= per %>. Enchanted Armoire: Kendo Set (Item 1 of 3).",
"offhand": "off-hand item",
"offHandCapitalized": "Off-Hand Item",
@@ -3136,6 +3181,11 @@
"shieldSpecialSpring2026HealerText": "Snowdrop Leaf",
"shieldSpecialSpring2026HealerNotes": "Create a light breeze with this fan as the days grow warmer. It doubles as a writing utensil in a pinch. Increases Constitution by <%= con %>. Limited Edition Spring 2026 Gear.",
"shieldSpecialSummer2026WarriorText": "Gator Shield",
"shieldSpecialSummer2026WarriorNotes": "Deflect oncoming challenges with this stylish, shiny shield. And when youve successfully cleared your list, crank up the music and have a party! Increases Constitution by <%= con %>. Limited Edition Summer 2026 Gear.",
"shieldSpecialSummer2026HealerText": "Puffin Potion",
"shieldSpecialSummer2026HealerNotes": "Keep your colony of fellow puffins healthy with this potion. It tastes great with fish! Increases Constitution by <%= con %>. Limited Edition Summer 2026 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",
@@ -3168,6 +3218,12 @@
"shieldMystery202511Notes": "This rugged shield of icy rock protects you from bad Habits but won't freeze your hands. Confers no benefit. November 2025 Subscriber Item.",
"shieldMystery202605Text": "Nightfall Shield",
"shieldMystery202605Notes": "Let the moons shining light protect you from dangers in the dark. Confers no benefit. May 2026 Subscriber Item.",
"shieldMystery202606Text": "Holiday Hammock",
"shieldMystery202606Notes": "Between tasks, hop in this hammock, relax, and enjoy the scenery! Confers no benefit. June 2026 Subscriber Item.",
"shieldMystery202607Text": "Oceanmancer's Briny Bubble",
"shieldMystery202607Notes": "Tumultuous waters bend to your mighty magical will. Confers no benefit. July 2026 Subscriber Item.",
"shieldMystery202608Text": "Brilliant Emerald Blade",
"shieldMystery202608Notes": "Slice and dice all your tasks into manageable pieces! Confers no benefit. August 2026 Subscriber Item.",
"shieldMystery301405Text": "Clock Shield",
"shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.",
@@ -3353,7 +3409,9 @@
"shieldArmoireSoftYellowPillowText": "Soft Yellow Pillow",
"shieldArmoireSoftYellowPillowNotes": "The experienced warrior packs a pillow for any expedition. Grow and shine as you consolidate all youve learned during past adventures… even while you nap. Increases Intelligence and Perception by <%= attrs %> each. Enchanted Armoire: Yellow Loungewear Set (Item 3 of 3).",
"shieldArmoireVerdantBannerText": "Verdant Page Banner",
"shieldArmoireVerdantBannerNotes": "Wave your banner high to signal friends its time to rally together! Intelligence by <%= int %>. Enchanted Armoire: Verdant Page Set (Item 2 of 2).",
"shieldArmoireVerdantBannerNotes": "Wave your banner high to signal friends its time to rally together! Increases Intelligence by <%= int %>. Enchanted Armoire: Verdant Page Set (Item 2 of 2).",
"shieldArmoireGardenHoseText": "Garden Hose",
"shieldArmoireGardenHoseNotes": "This magical hose never kinks and can infinitely stretch to reach every inch of your space. All your flowers, trees, shrubs, and thirsty pets can enjoy a drink from it. Increases Perception by <%= per %>. Enchanted Armoire: Gardener Set 2 (Item 2 of 2).",
"back": "Back Accessory",
"backBase0Text": "No Back Accessory",
@@ -3805,6 +3863,8 @@
"eyewearMystery202503Notes": "This piercing gaze will strike terror into any fighter who dares to challenge you! Confers no benefit. March 2025 Subscriber Item.",
"eyewearMystery202510Text": "Gliding Ghoul Eyes",
"eyewearMystery202510Notes": "These spooky eyes glow like the Harvest Moon. Confers no benefit. October 2025 Subscriber Item.",
"eyewearMystery202606Text": "Holiday Shades",
"eyewearMystery202606Notes": "Your eyes are shaded but your outlook is still sunny! Confers no benefit. June 2026 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.",
+1 -1
View File
@@ -242,7 +242,7 @@
"whyReportingPlayerPlaceholder": "Reason for report",
"playerReportModalBody": "You should only report a player who violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habiticas Community Guidelines.",
"targetUserNotExist": "Target User: '<%= userName %>' does not exist.",
"rememberToBeKind": "Please remember to be kind, respectful, and follow the <a href='/static/community-guidelines' target='_blank'>Community Guidelines</a>.",
"rememberToBeKind": "Please remember to be kind, respectful, and follow the <%= linkOpen %>Community Guidelines<%= linkClose %>.",
"confirmPurchase": "Confirm Purchase",
"avoidSPI": "Avoid SPI",
"avoidSPIDetails": "For your privacy, avoid including <%= firstLink %>sensitive personal information<%= linkClose %> (SPI) when using Habitica. Your account data, including tasks, is stored on our servers so you can access it from any device.<br><br>To learn more, review our <%= secondLink %>Privacy Policy<%= linkClose %>."
+5 -8
View File
@@ -12,7 +12,6 @@
"contributing": "Contributing",
"faq": "FAQ",
"tutorial": "Tutorial",
"glossary": "<a target='_blank' href='https://habitica.fandom.com/wiki/Glossary'>Glossary</a>",
"wiki": "Wiki",
"resources": "Resources",
"communityGuidelines": "Community Guidelines",
@@ -28,7 +27,7 @@
"invite": "Invite",
"leave": "Leave",
"invitedToParty": "You were invited to join the Party <span class=\"notification-bold\"><%= party %></span>",
"invitedToPartyBy": "<a href=\"/profile/<%= userId %>\" target=\"_blank\">@<%= userName %></a> has invited you to join the Party <span class=\"notification-bold\"><%= party %></span>",
"invitedToPartyBy": "<%= usernameLink %> has invited you to join the Party <%= partyName %>",
"invitedToPrivateGuild": "You were invited to join the private Group <span class=\"notification-bold\"><%= guild %></span>",
"invitedToPublicGuild": "You were invited to join the Group <span class=\"notification-bold-blue\"><%= guild %></span>",
"invitationAcceptedHeader": "Your Invitation has been Accepted",
@@ -138,7 +137,7 @@
"sendGiftLabel": "Would you like to send a gift message?",
"sendGiftMessagePlaceholder": "Add a gift message",
"sendGiftSubscription": "<%= months %> Month(s): $<%= price %> USD",
"gemGiftsAreOptional": "Please note that Habitica will never require you to gift gems to other players. Begging people for gems is a <strong>violation of the Community Guidelines</strong>, and all such instances should be reported to <%= hrefTechAssistanceEmail %>.",
"gemGiftsAreOptional": "Please note that Habitica will never require you to gift gems to other players. Begging people for gems is a <strong>violation of the Community Guidelines</strong>, and all such instances should be reported to <%= techAssistanceEmail %>.",
"giftMessageTooLong": "The maximum length for gift messages is <%= maxGiftMessageLength %>.",
"battleWithFriends": "Play Habitica with Others",
"questWithOthers": "Take on Quests with Others",
@@ -304,7 +303,6 @@
"playInPartyTitle": "Play Habitica in a Party!",
"playInPartyDescription": "Take on amazing Quests with friends or on your own. Battle monsters, create Challenges, and help yourself stay accountable through Parties.",
"wantToJoinPartyTitle": "Looking for a Party?",
"wantToJoinPartyDescription": "Give your username to a friend who already has a Party, or head to the <a href='/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'>Party Wanted Guild</a> to meet potential comrades!",
"lookForParty": "Look for a Party",
"currentlyLookingForParty": "Youre looking for a Party!",
"partyFinderDescription": "Want to join a Party with others but dont know any other players? Let Party leaders know youre looking for an invite!",
@@ -411,7 +409,7 @@
"newGroupsBullet10a": "<strong>Leave a task unassigned</strong> if any member can complete it",
"newGroupsBullet10b": "<strong>Assign a task to one member</strong> so only they can complete it",
"newGroupsBullet10c": "<strong>Assign a task to multiple members</strong> if they all need to complete it",
"newGroupsVisitFAQ": "Visit the <a href='/static/faq#group-plans' target='_blank'>FAQ</a> from the Help dropdown for more guidance.",
"newGroupsVisitFAQ": "Visit the <%= linkOpen %>FAQ<%= linkClose %> from the Help dropdown for more guidance.",
"newGroupsEnjoy": "We hope you enjoy the new Group Plans experience!",
"checkinsLabel": "Check-ins:",
"classLabel": "Class:",
@@ -423,10 +421,9 @@
"noOneLooking": "Theres no one looking for a Party right now.<br>You can check back later!",
"tavernDiscontinued": "The Tavern and Guilds have been discontinued",
"tavernDiscontinuedDetail": "Due to a number of factors, including changes in how our player base interacts with Habitica, the resources necessary to maintain these spaces became disproportionate to the number of people participating in them and unsustainable over the long term.",
"tavernDiscontinuedLinks": "Read more about the <a href='/static/faq/tavern-and-guilds'>Tavern and Guild Service Discontinuation</a> or head back to the <a href='/'>homepage</a>.",
"chatSunsetWarning": "⚠️ <strong>Habitica Guilds and Tavern chat will be discontinued on 8/8/2023.</strong> <a href='/static/faq/tavern-and-guilds'>Click here</a> to read more about this change.",
"tavernDiscontinuedLinks": "Read more about the <%= faqLink %>Tavern and Guild Service Discontinuation<%= linkClose %> or head back to the <%= homeLink %>homepage<%= linkClose %>.",
"interestedLearningMore": "Interested in Learning More?",
"checkGroupPlanFAQ": "Check out the <a href='/static/faq#what-is-group-plan'>Group Plans FAQ</a> to learn how to get the most out of your shared task experience.",
"checkGroupPlanFAQ": "Check out the <%= linkOpen %>Group Plans FAQ<%= linkClose %> to learn how to get the most out of your shared task experience.",
"groupPlanBillingFYI": "Group Plan subscriptions automatically renew unless you cancel at least 24 hours before the end of your current period. You can cancel from the Group Billing tab of your Group Plan. You will be charged within 24 hours before your subscription renews, based on the number of members in your Group Plan at that time. If you add members between payment periods, you'll see an additional prorated charge for their benefits at your next billing cycle.",
"groupPlanBillingFYIShort": "Group Plan subscriptions automatically renew unless you cancel at least 24 hours before the end of your current period. You will be charged within 24 hours before your subscription renews, based on the number of members in your Group Plan at that time. If you add members between payment periods, you'll see an additional prorated charge for their benefits at your next billing cycle.",
"chooseAnOption": "Choose an Option",
+42 -38
View File
@@ -209,44 +209,48 @@
"fall2023BogCreatureHealerSet": "Bog Creature (Healer)",
"winter2024SnowyOwlRogueSet": "Snowy Owl (Rogue)",
"winter2024FrozenHealerSet": "Frozen (Healer)",
"winter2024PeppermintBarkWarriorSet": "Peppermint Bark Set (Warrior)",
"winter2024NarwhalWizardMageSet": "Narwhal Wizard Set (Mage)",
"spring2024FluoriteWarriorSet": "Fluorite Set (Warrior)",
"spring2024HibiscusMageSet": "Hibiscus Set (Mage)",
"spring2024BluebirdHealerSet": "Bluebird Set (Healer)",
"spring2024MeltingSnowRogueSet": "Melting Snow Set (Rogue)",
"summer2024WhaleSharkWarriorSet": "Whale Shark Set (Warrior)",
"summer2024SeaAnemoneMageSet": "Sea Anemone Set (Mage)",
"summer2024SeaSnailHealerSet": "Sea Snail Set (Healer)",
"summer2024NudibranchRogueSet": "Nudibranch Set (Rogue)",
"fall2024FieryImpWarriorSet": "Fiery Imp Set (Warrior)",
"fall2024UnderworldSorcerorMageSet": "Underworld Sorceror Set (Mage)",
"fall2024SpaceInvaderHealerSet": "Space Invader Set (Healer)",
"fall2024BlackCatRogueSet": "Black Cat Set (Rogue)",
"winter2025MooseWarriorSet": "Moose Set (Warrior)",
"winter2025AuroraMageSet": "Aurora Set (Mage)",
"winter2025StringLightsHealerSet": "String Lights Set (Healer)",
"winter2025SnowRogueSet": "Snow Set (Rogue)",
"spring2025SunshineWarriorSet": "Sunshine Set (Warrior)",
"spring2025CrystalPointRogueSet": "Crystal Point Set (Rogue)",
"spring2025PlumeriaHealerSet": "Plumeria Set (Healer)",
"spring2025MantisMageSet": "Mantis Set (Mage)",
"summer2025ScallopWarriorSet": "Scallop Set (Warrior)",
"summer2025SquidRogueSet": "Squid Set (Rogue)",
"summer2025SeaAngelHealerSet": "Sea Angel Set (Healer)",
"summer2025FairyWrasseMageSet": "Fairy Wrasse Set (Mage)",
"fall2025SasquatchWarriorSet": "Sasquatch Set (Warrior)",
"fall2025SkeletonRogueSet": "Skeleton Set (Rogue)",
"fall2025KoboldHealerSet": "Kobold Set (Healer)",
"fall2025MaskedGhostMageSet": "Masked Ghost Set (Mage)",
"winter2026RimeReaperWarriorSet": "Rime Reaper Set (Warrior)",
"winter2026SkiRogueSet": "Ski Set (Rogue)",
"winter2026PolarBearHealerSet": "Polar Bear Set (Healer)",
"winter2026MidwinterCandleMageSet": "Midwinter Candle Set (Mage)",
"spring2026FrogWarriorSet": "Frog Set (Warrior)",
"spring2026BranchRogueSet": "Spring Branch Set (Rogue)",
"spring2026SnowdropHealerSet": "Snowdrop Set (Healer)",
"spring2026MaypoleMageSet": "Maypole Set (Mage)",
"winter2024PeppermintBarkWarriorSet": "Peppermint Bark (Warrior)",
"winter2024NarwhalWizardMageSet": "Narwhal Wizard (Mage)",
"spring2024FluoriteWarriorSet": "Fluorite (Warrior)",
"spring2024HibiscusMageSet": "Hibiscus (Mage)",
"spring2024BluebirdHealerSet": "Bluebird (Healer)",
"spring2024MeltingSnowRogueSet": "Melting Snow (Rogue)",
"summer2024WhaleSharkWarriorSet": "Whale Shark (Warrior)",
"summer2024SeaAnemoneMageSet": "Sea Anemone (Mage)",
"summer2024SeaSnailHealerSet": "Sea Snail (Healer)",
"summer2024NudibranchRogueSet": "Nudibranch (Rogue)",
"fall2024FieryImpWarriorSet": "Fiery Imp (Warrior)",
"fall2024UnderworldSorcerorMageSet": "Underworld Sorceror (Mage)",
"fall2024SpaceInvaderHealerSet": "Space Invader (Healer)",
"fall2024BlackCatRogueSet": "Black Cat (Rogue)",
"winter2025MooseWarriorSet": "Moose (Warrior)",
"winter2025AuroraMageSet": "Aurora (Mage)",
"winter2025StringLightsHealerSet": "String Lights (Healer)",
"winter2025SnowRogueSet": "Snow (Rogue)",
"spring2025SunshineWarriorSet": "Sunshine (Warrior)",
"spring2025CrystalPointRogueSet": "Crystal Point (Rogue)",
"spring2025PlumeriaHealerSet": "Plumeria (Healer)",
"spring2025MantisMageSet": "Mantis (Mage)",
"summer2025ScallopWarriorSet": "Scallop (Warrior)",
"summer2025SquidRogueSet": "Squid (Rogue)",
"summer2025SeaAngelHealerSet": "Sea Angel (Healer)",
"summer2025FairyWrasseMageSet": "Fairy Wrasse (Mage)",
"fall2025SasquatchWarriorSet": "Sasquatch (Warrior)",
"fall2025SkeletonRogueSet": "Skeleton (Rogue)",
"fall2025KoboldHealerSet": "Kobold (Healer)",
"fall2025MaskedGhostMageSet": "Masked Ghost (Mage)",
"winter2026RimeReaperWarriorSet": "Rime Reaper (Warrior)",
"winter2026SkiRogueSet": "Ski (Rogue)",
"winter2026PolarBearHealerSet": "Polar Bear (Healer)",
"winter2026MidwinterCandleMageSet": "Midwinter Candle (Mage)",
"spring2026FrogWarriorSet": "Frog (Warrior)",
"spring2026BranchRogueSet": "Spring Branch (Rogue)",
"spring2026SnowdropHealerSet": "Snowdrop (Healer)",
"spring2026MaypoleMageSet": "Maypole (Mage)",
"summer2026AlligatorWarriorSet": "Alligator (Warrior)",
"summer2026PuffinHealerSet": "Puffin (Healer)",
"summer2026TigerSharkMageSet": "Tiger Shark (Mage)",
"summer2026TsunamiRogueSet": "Tsunami (Rogue)",
"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",
+2 -2
View File
@@ -21,7 +21,7 @@
"pauseDailies": "Pause Damage",
"unpauseDailies": "Unpause Damage",
"staffAndModerators": "Staff and Moderators",
"communityGuidelinesIntro": "Habitica tries to create a welcoming environment for users of all ages and backgrounds, especially in spaces like Groups and Parties. If you have any questions, please consult our <a href='/static/community-guidelines' target='_blank'>Community Guidelines</a>.",
"communityGuidelinesIntro": "Habitica tries to create a welcoming environment for users of all ages and backgrounds, especially in spaces like Groups and Parties. If you have any questions, please consult our <%= linkOpen %>Community Guidelines<%= linkClose %>.",
"acceptCommunityGuidelines": "I agree to follow the Community Guidelines",
"worldBossEvent": "World Boss Event",
"worldBossDescription": "World Boss Description",
@@ -109,7 +109,7 @@
"toDo": "To Do",
"tourStatsPage": "This is your Stats page! Earn achievements by completing the listed tasks.",
"tourTavernPage": "Welcome to the Tavern, an all-ages chat room! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Pause Damage\". Come say hi!",
"tourPartyPage": "Welcome to your new Party! You can invite other players to your Party by username, email, or from a list of players looking for a Party to earn the exclusive Basi-List Quest Scroll.<br/><br/>Select <a href='/static/faq#parties'>FAQ</a> from the Help dropdown to learn more about how Parties work.",
"tourPartyPage": "Welcome to your new Party! You can invite other players to your Party by username, email, or from a list of players looking for a Party to earn the exclusive Basi-List Quest Scroll.<br/><br/>Select <%= linkOpen %>FAQ<%= linkClose %> from the Help dropdown to learn more about how Parties work.",
"tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win Gem prizes!",
"tourMarketPage": "Every time you complete a task, you'll have a random chance at receiving an Egg, a Hatching Potion, or a piece of Pet Food. You can also buy these items here.",
"tourHallPage": "Welcome to the Hall of Heroes, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned Gems, exclusive Equipment, and prestigious titles. You can contribute to Habitica, too!",
+1 -1
View File
@@ -10,5 +10,5 @@
"step3": "Step 3: Customize and Explore Habitica",
"webStep3Text": "Once you're familiar with the basics, you can get even more out of Habitica with these nifty features:\n * Organize your Tasks with [tags](https://habitica.fandom.com/wiki/Tags) (edit a Task to add them).\n * Customize your [Avatar](https://habitica.fandom.com/wiki/Avatar) by clicking the user icon in the upper-right corner.\n * Buy your [Equipment](https://habitica.fandom.com/wiki/Equipment) under Rewards or from the [Shops](<%= shopUrl %>), and change it under [Inventory > Equipment](<%= equipUrl %>).\n * Connect with other users via the [Looking for Party tool](https://habitica.com/looking-for-party).\n * Hatch [Pets](https://habitica.fandom.com/wiki/Pets) by collecting [Eggs](https://habitica.fandom.com/wiki/Eggs) and [Hatching Potions](https://habitica.fandom.com/wiki/Hatching_Potions). [Feed](https://habitica.fandom.com/wiki/Food) them to create [Mounts](https://habitica.fandom.com/wiki/Mounts).\n * At level 10: Choose a particular [Class](https://habitica.fandom.com/wiki/Class_System) and then use Class-specific [skills](https://habitica.fandom.com/wiki/Skills) (levels 11 to 14).\n * Form a Party with your friends (by clicking [Party](<%= partyUrl %>) in the navigation bar) to stay accountable and earn a Quest scroll.\n * Defeat monsters and collect objects on [Quests](https://habitica.fandom.com/wiki/Quests) (you will be given a quest at level 15).",
"overviewQuestionsRevised": "Have questions? Check out the <a href='/static/faq'>FAQ</a>! If your question isn't mentioned there, you can ask for further help using this form: "
"overviewQuestionsRevised": "Have questions? Check out the <%= linkOpen %>FAQ<%= linkClose %>! If your question isn't mentioned there, you can ask for further help using this form: "
}
+1 -3
View File
@@ -47,8 +47,6 @@
"food": "Pet Food and Saddles",
"noFoodAvailable": "You don't have any Pet Food.",
"noSaddlesAvailable": "You don't have any Saddles.",
"dropsExplanation": "Get these items faster with Gems if you don't want to wait for them to drop when completing a task. <a href=\"https://habitica.fandom.com/wiki/Drops\">Learn more about the drop system.</a>",
"dropsExplanationEggs": "Spend Gems to get eggs more quickly, if you don't want to wait for standard eggs to drop, or to repeat Quests to earn Quest eggs. <a href=\"https://habitica.fandom.com/wiki/Drops\">Learn more about the drop system.</a>",
"premiumPotionNoDropExplanation": "Magic Hatching Potions cannot be used on eggs received from Quests. The only way to get Magic Hatching Potions is by buying them below, not from random drops.",
"beastMasterProgress": "Beast Master Progress",
"beastAchievement": "You have earned the \"Beast Master\" Achievement for collecting all the pets!",
@@ -91,7 +89,7 @@
"welcomeStable": "Welcome to your Pets and Mounts!",
"welcomeStableText": "Welcome to the stable! Im Matt, the beastmaster. Every time you complete a task, you'll have a random chance at receiving an Egg or a Hatching Potion to hatch Pets. When you hatch a Pet, it will appear here! Click a Pet's image to add it to your Avatar. Feed them with the Pet Food you find and they'll grow into hardy Mounts.",
"petLikeToEat": "What does my Pet like to eat?",
"petLikeToEatText": "Pets will grow no matter what you feed them, but they'll grow faster if you feed them the one Pet Food that they like best. Experiment to find out the pattern, or see the answers here: <br/> <a href=\"/static/faq#pet-foods\" target=\"_blank\">https://habitica.com/static/faq#pet-foods</a>",
"petLikeToEatText": "Pets will grow no matter what you feed them, but they'll grow faster if you feed them the one Pet Food that they like best. Experiment to find out the pattern, or <%= linkOpen %>see the answers here<%= linkClose %>.",
"filterByStandard": "Standard",
"filterByMagicPotion": "Magic Potion",
"filterByQuest": "Quest",

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